diff options
Diffstat (limited to 'drivers/net/sb1000.c')
| -rw-r--r-- | drivers/net/sb1000.c | 205 |
1 files changed, 101 insertions, 104 deletions
diff --git a/drivers/net/sb1000.c b/drivers/net/sb1000.c index d6388e1533f..66c2f1a0196 100644 --- a/drivers/net/sb1000.c +++ b/drivers/net/sb1000.c @@ -28,7 +28,7 @@ Small changes to make it work with 2.1.x kernels. Hopefully, nothing major will change before official release of Linux 2.2. - + Merged with 2.2 - Alan Cox */ @@ -36,12 +36,12 @@ static char version[] = "sb1000.c:v1.1.2 6/01/98 (fventuri@mediaone.net)\n"; #include <linux/module.h> #include <linux/kernel.h> +#include <linux/sched.h> #include <linux/string.h> #include <linux/interrupt.h> #include <linux/errno.h> #include <linux/if_cablemodem.h> /* for SIOGCM/SIOSCM stuff */ #include <linux/in.h> -#include <linux/slab.h> #include <linux/ioport.h> #include <linux/netdevice.h> #include <linux/if_arp.h> @@ -51,6 +51,7 @@ static char version[] = "sb1000.c:v1.1.2 6/01/98 (fventuri@mediaone.net)\n"; #include <linux/pnp.h> #include <linux/init.h> #include <linux/bitops.h> +#include <linux/gfp.h> #include <asm/io.h> #include <asm/processor.h> @@ -59,7 +60,7 @@ static char version[] = "sb1000.c:v1.1.2 6/01/98 (fventuri@mediaone.net)\n"; #ifdef SB1000_DEBUG static int sb1000_debug = SB1000_DEBUG; #else -static int sb1000_debug = 1; +static const int sb1000_debug = 1; #endif static const int SB1000_IO_EXTENT = 8; @@ -76,45 +77,44 @@ struct sb1000_private { unsigned char rx_session_id[NPIDS]; unsigned char rx_frame_id[NPIDS]; unsigned char rx_pkt_type[NPIDS]; - struct net_device_stats stats; }; /* prototypes for Linux interface */ extern int sb1000_probe(struct net_device *dev); static int sb1000_open(struct net_device *dev); static int sb1000_dev_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd); -static int sb1000_start_xmit(struct sk_buff *skb, struct net_device *dev); -static irqreturn_t sb1000_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static struct net_device_stats *sb1000_stats(struct net_device *dev); +static netdev_tx_t sb1000_start_xmit(struct sk_buff *skb, + struct net_device *dev); +static irqreturn_t sb1000_interrupt(int irq, void *dev_id); static int sb1000_close(struct net_device *dev); /* SB1000 hardware routines to be used during open/configuration phases */ -static inline int card_wait_for_busy_clear(const int ioaddr[], +static int card_wait_for_busy_clear(const int ioaddr[], const char* name); -static inline int card_wait_for_ready(const int ioaddr[], const char* name, +static int card_wait_for_ready(const int ioaddr[], const char* name, unsigned char in[]); -static inline int card_send_command(const int ioaddr[], const char* name, +static int card_send_command(const int ioaddr[], const char* name, const unsigned char out[], unsigned char in[]); /* SB1000 hardware routines to be used during frame rx interrupt */ -static inline int sb1000_wait_for_ready(const int ioaddr[], const char* name); -static inline int sb1000_wait_for_ready_clear(const int ioaddr[], +static int sb1000_wait_for_ready(const int ioaddr[], const char* name); +static int sb1000_wait_for_ready_clear(const int ioaddr[], const char* name); -static inline void sb1000_send_command(const int ioaddr[], const char* name, +static void sb1000_send_command(const int ioaddr[], const char* name, const unsigned char out[]); -static inline void sb1000_read_status(const int ioaddr[], unsigned char in[]); -static inline void sb1000_issue_read_command(const int ioaddr[], +static void sb1000_read_status(const int ioaddr[], unsigned char in[]); +static void sb1000_issue_read_command(const int ioaddr[], const char* name); /* SB1000 commands for open/configuration */ -static inline int sb1000_reset(const int ioaddr[], const char* name); -static inline int sb1000_check_CRC(const int ioaddr[], const char* name); +static int sb1000_reset(const int ioaddr[], const char* name); +static int sb1000_check_CRC(const int ioaddr[], const char* name); static inline int sb1000_start_get_set_command(const int ioaddr[], const char* name); -static inline int sb1000_end_get_set_command(const int ioaddr[], +static int sb1000_end_get_set_command(const int ioaddr[], const char* name); -static inline int sb1000_activate(const int ioaddr[], const char* name); +static int sb1000_activate(const int ioaddr[], const char* name); static int sb1000_get_firmware_version(const int ioaddr[], const char* name, unsigned char version[], int do_end); static int sb1000_get_frequency(const int ioaddr[], const char* name, @@ -127,8 +127,8 @@ static int sb1000_set_PIDs(const int ioaddr[], const char* name, const short PID[]); /* SB1000 commands for frame rx interrupt */ -static inline int sb1000_rx(struct net_device *dev); -static inline void sb1000_error_dpc(struct net_device *dev); +static int sb1000_rx(struct net_device *dev); +static void sb1000_error_dpc(struct net_device *dev); static const struct pnp_device_id sb1000_pnp_ids[] = { { "GIC1000", 0 }, @@ -136,6 +136,16 @@ static const struct pnp_device_id sb1000_pnp_ids[] = { }; MODULE_DEVICE_TABLE(pnp, sb1000_pnp_ids); +static const struct net_device_ops sb1000_netdev_ops = { + .ndo_open = sb1000_open, + .ndo_start_xmit = sb1000_start_xmit, + .ndo_do_ioctl = sb1000_dev_ioctl, + .ndo_stop = sb1000_close, + .ndo_change_mtu = eth_change_mtu, + .ndo_set_mac_address = eth_mac_addr, + .ndo_validate_addr = eth_validate_addr, +}; + static int sb1000_probe_one(struct pnp_dev *pdev, const struct pnp_device_id *id) { @@ -143,7 +153,7 @@ sb1000_probe_one(struct pnp_dev *pdev, const struct pnp_device_id *id) unsigned short ioaddr[2], irq; unsigned int serial_number; int error = -ENODEV; - + if (pnp_device_attach(pdev) < 0) return -ENODEV; if (pnp_activate_dev(pdev) < 0) @@ -153,12 +163,12 @@ sb1000_probe_one(struct pnp_dev *pdev, const struct pnp_device_id *id) goto out_disable; if (!pnp_irq_valid(pdev, 0)) goto out_disable; - + serial_number = pdev->card->serial; - + ioaddr[0] = pnp_port_start(pdev, 0); ioaddr[1] = pnp_port_start(pdev, 0); - + irq = pnp_irq(pdev, 0); if (!request_region(ioaddr[0], 16, "sb1000")) @@ -172,7 +182,7 @@ sb1000_probe_one(struct pnp_dev *pdev, const struct pnp_device_id *id) goto out_release_regions; } - + dev->base_addr = ioaddr[0]; /* mem_start holds the second I/O address */ dev->mem_start = ioaddr[1]; @@ -189,18 +199,12 @@ sb1000_probe_one(struct pnp_dev *pdev, const struct pnp_device_id *id) */ dev->flags = IFF_POINTOPOINT|IFF_NOARP; - SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); if (sb1000_debug > 0) printk(KERN_NOTICE "%s", version); - /* The SB1000-specific entries in the device structure. */ - dev->open = sb1000_open; - dev->do_ioctl = sb1000_dev_ioctl; - dev->hard_start_xmit = sb1000_start_xmit; - dev->stop = sb1000_close; - dev->get_stats = sb1000_stats; + dev->netdev_ops = &sb1000_netdev_ops; /* hardware address is 0:0:serial_number */ dev->dev_addr[2] = serial_number >> 24 & 0xff; @@ -246,7 +250,7 @@ static struct pnp_driver sb1000_driver = { .remove = sb1000_remove_one, }; - + /* * SB1000 hardware routines to be used during open/configuration phases */ @@ -254,7 +258,7 @@ static struct pnp_driver sb1000_driver = { static const int TimeOutJiffies = (875 * HZ) / 100; /* Card Wait For Busy Clear (cannot be used during an interrupt) */ -static inline int +static int card_wait_for_busy_clear(const int ioaddr[], const char* name) { unsigned char a; @@ -278,7 +282,7 @@ card_wait_for_busy_clear(const int ioaddr[], const char* name) } /* Card Wait For Ready (cannot be used during an interrupt) */ -static inline int +static int card_wait_for_ready(const int ioaddr[], const char* name, unsigned char in[]) { unsigned char a; @@ -309,7 +313,7 @@ card_wait_for_ready(const int ioaddr[], const char* name, unsigned char in[]) } /* Card Send Command (cannot be used during an interrupt) */ -static inline int +static int card_send_command(const int ioaddr[], const char* name, const unsigned char out[], unsigned char in[]) { @@ -351,14 +355,14 @@ card_send_command(const int ioaddr[], const char* name, return 0; } - + /* * SB1000 hardware routines to be used during frame rx interrupt */ static const int Sb1000TimeOutJiffies = 7 * HZ; /* Card Wait For Ready (to be used during frame rx) */ -static inline int +static int sb1000_wait_for_ready(const int ioaddr[], const char* name) { unsigned long timeout; @@ -384,7 +388,7 @@ sb1000_wait_for_ready(const int ioaddr[], const char* name) } /* Card Wait For Ready Clear (to be used during frame rx) */ -static inline int +static int sb1000_wait_for_ready_clear(const int ioaddr[], const char* name) { unsigned long timeout; @@ -409,7 +413,7 @@ sb1000_wait_for_ready_clear(const int ioaddr[], const char* name) } /* Card Send Command (to be used during frame rx) */ -static inline void +static void sb1000_send_command(const int ioaddr[], const char* name, const unsigned char out[]) { @@ -422,11 +426,10 @@ sb1000_send_command(const int ioaddr[], const char* name, if (sb1000_debug > 3) printk(KERN_DEBUG "%s: sb1000_send_command out: %02x%02x%02x%02x" "%02x%02x\n", name, out[0], out[1], out[2], out[3], out[4], out[5]); - return; } /* Card Read Status (to be used during frame rx) */ -static inline void +static void sb1000_read_status(const int ioaddr[], unsigned char in[]) { in[1] = inb(ioaddr[0] + 1); @@ -434,32 +437,31 @@ sb1000_read_status(const int ioaddr[], unsigned char in[]) in[3] = inb(ioaddr[0] + 3); in[4] = inb(ioaddr[0] + 4); in[0] = inb(ioaddr[0] + 5); - return; } /* Issue Read Command (to be used during frame rx) */ -static inline void +static void sb1000_issue_read_command(const int ioaddr[], const char* name) { - const unsigned char Command0[6] = {0x20, 0x00, 0x00, 0x01, 0x00, 0x00}; + static const unsigned char Command0[6] = {0x20, 0x00, 0x00, 0x01, 0x00, 0x00}; sb1000_wait_for_ready_clear(ioaddr, name); outb(0xa0, ioaddr[0] + 6); sb1000_send_command(ioaddr, name, Command0); - return; } - + /* * SB1000 commands for open/configuration */ /* reset SB1000 card */ -static inline int +static int sb1000_reset(const int ioaddr[], const char* name) { + static const unsigned char Command0[6] = {0x80, 0x16, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; int port, status; - const unsigned char Command0[6] = {0x80, 0x16, 0x00, 0x00, 0x00, 0x00}; port = ioaddr[1] + 6; outb(0x4, port); @@ -483,12 +485,13 @@ sb1000_reset(const int ioaddr[], const char* name) } /* check SB1000 firmware CRC */ -static inline int +static int sb1000_check_CRC(const int ioaddr[], const char* name) { + static const unsigned char Command0[6] = {0x80, 0x1f, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; int crc, status; - const unsigned char Command0[6] = {0x80, 0x1f, 0x00, 0x00, 0x00, 0x00}; /* check CRC */ if ((status = card_send_command(ioaddr, name, Command0, st))) @@ -502,32 +505,35 @@ sb1000_check_CRC(const int ioaddr[], const char* name) static inline int sb1000_start_get_set_command(const int ioaddr[], const char* name) { + static const unsigned char Command0[6] = {0x80, 0x1b, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; - const unsigned char Command0[6] = {0x80, 0x1b, 0x00, 0x00, 0x00, 0x00}; return card_send_command(ioaddr, name, Command0, st); } -static inline int +static int sb1000_end_get_set_command(const int ioaddr[], const char* name) { + static const unsigned char Command0[6] = {0x80, 0x1b, 0x02, 0x00, 0x00, 0x00}; + static const unsigned char Command1[6] = {0x20, 0x00, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; int status; - const unsigned char Command0[6] = {0x80, 0x1b, 0x02, 0x00, 0x00, 0x00}; - const unsigned char Command1[6] = {0x20, 0x00, 0x00, 0x00, 0x00, 0x00}; if ((status = card_send_command(ioaddr, name, Command0, st))) return status; return card_send_command(ioaddr, name, Command1, st); } -static inline int +static int sb1000_activate(const int ioaddr[], const char* name) { + static const unsigned char Command0[6] = {0x80, 0x11, 0x00, 0x00, 0x00, 0x00}; + static const unsigned char Command1[6] = {0x80, 0x16, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; int status; - const unsigned char Command0[6] = {0x80, 0x11, 0x00, 0x00, 0x00, 0x00}; - const unsigned char Command1[6] = {0x80, 0x16, 0x00, 0x00, 0x00, 0x00}; ssleep(1); if ((status = card_send_command(ioaddr, name, Command0, st))) @@ -548,9 +554,10 @@ static int sb1000_get_firmware_version(const int ioaddr[], const char* name, unsigned char version[], int do_end) { + static const unsigned char Command0[6] = {0x80, 0x23, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; int status; - const unsigned char Command0[6] = {0x80, 0x23, 0x00, 0x00, 0x00, 0x00}; if ((status = sb1000_start_get_set_command(ioaddr, name))) return status; @@ -570,9 +577,10 @@ sb1000_get_firmware_version(const int ioaddr[], const char* name, static int sb1000_get_frequency(const int ioaddr[], const char* name, int* frequency) { + static const unsigned char Command0[6] = {0x80, 0x44, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; int status; - const unsigned char Command0[6] = {0x80, 0x44, 0x00, 0x00, 0x00, 0x00}; udelay(1000); if ((status = sb1000_start_get_set_command(ioaddr, name))) @@ -617,12 +625,13 @@ sb1000_set_frequency(const int ioaddr[], const char* name, int frequency) static int sb1000_get_PIDs(const int ioaddr[], const char* name, short PID[]) { + static const unsigned char Command0[6] = {0x80, 0x40, 0x00, 0x00, 0x00, 0x00}; + static const unsigned char Command1[6] = {0x80, 0x41, 0x00, 0x00, 0x00, 0x00}; + static const unsigned char Command2[6] = {0x80, 0x42, 0x00, 0x00, 0x00, 0x00}; + static const unsigned char Command3[6] = {0x80, 0x43, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; int status; - const unsigned char Command0[6] = {0x80, 0x40, 0x00, 0x00, 0x00, 0x00}; - const unsigned char Command1[6] = {0x80, 0x41, 0x00, 0x00, 0x00, 0x00}; - const unsigned char Command2[6] = {0x80, 0x42, 0x00, 0x00, 0x00, 0x00}; - const unsigned char Command3[6] = {0x80, 0x43, 0x00, 0x00, 0x00, 0x00}; udelay(1000); if ((status = sb1000_start_get_set_command(ioaddr, name))) @@ -651,6 +660,8 @@ sb1000_get_PIDs(const int ioaddr[], const char* name, short PID[]) static int sb1000_set_PIDs(const int ioaddr[], const char* name, const short PID[]) { + static const unsigned char Command4[6] = {0x80, 0x2e, 0x00, 0x00, 0x00, 0x00}; + unsigned char st[7]; short p; int status; @@ -658,7 +669,6 @@ sb1000_set_PIDs(const int ioaddr[], const char* name, const short PID[]) unsigned char Command1[6] = {0x80, 0x32, 0x00, 0x00, 0x00, 0x00}; unsigned char Command2[6] = {0x80, 0x33, 0x00, 0x00, 0x00, 0x00}; unsigned char Command3[6] = {0x80, 0x34, 0x00, 0x00, 0x00, 0x00}; - const unsigned char Command4[6] = {0x80, 0x2e, 0x00, 0x00, 0x00, 0x00}; udelay(1000); if ((status = sb1000_start_get_set_command(ioaddr, name))) @@ -697,8 +707,8 @@ sb1000_set_PIDs(const int ioaddr[], const char* name, const short PID[]) return sb1000_end_get_set_command(ioaddr, name); } - -static inline void + +static void sb1000_print_status_buffer(const char* name, unsigned char st[], unsigned char buffer[], int size) { @@ -720,7 +730,6 @@ sb1000_print_status_buffer(const char* name, unsigned char st[], printk("\n"); } } - return; } /* @@ -729,7 +738,7 @@ sb1000_print_status_buffer(const char* name, unsigned char st[], /* receive a single frame and assemble datagram * (this is the heart of the interrupt routine) */ -static inline int +static int sb1000_rx(struct net_device *dev) { @@ -740,7 +749,7 @@ sb1000_rx(struct net_device *dev) unsigned int skbsize; struct sk_buff *skb; struct sb1000_private *lp = netdev_priv(dev); - struct net_device_stats *stats = &lp->stats; + struct net_device_stats *stats = &dev->stats; /* SB1000 frame constants */ const int FrameSize = FRAMESIZE; @@ -834,7 +843,7 @@ printk("cm0: IP identification: %02x%02x fragment offset: %02x%02x\n", buffer[3 goto dropped_frame; } skb->dev = dev; - skb->mac.raw = skb->data; + skb_reset_mac_header(skb); skb->protocol = (unsigned short) buffer[NewDatagramHeaderSkip + 16]; insw(ioaddr, skb_put(skb, NewDatagramDataSize), NewDatagramDataSize / 2); @@ -864,7 +873,6 @@ printk("cm0: IP identification: %02x%02x fragment offset: %02x%02x\n", buffer[3 /* datagram completed: send to upper level */ skb_trim(skb, dlen); netif_rx(skb); - dev->last_rx = jiffies; stats->rx_bytes+=dlen; stats->rx_packets++; lp->rx_skb[ns] = NULL; @@ -892,14 +900,15 @@ dropped_frame: return -1; } -static inline void +static void sb1000_error_dpc(struct net_device *dev) { + static const unsigned char Command0[6] = {0x80, 0x26, 0x00, 0x00, 0x00, 0x00}; + char *name; unsigned char st[5]; int ioaddr[2]; struct sb1000_private *lp = netdev_priv(dev); - const unsigned char Command0[6] = {0x80, 0x26, 0x00, 0x00, 0x00, 0x00}; const int ErrorDpcCounterInitialize = 200; ioaddr[0] = dev->base_addr; @@ -913,10 +922,9 @@ sb1000_error_dpc(struct net_device *dev) sb1000_read_status(ioaddr, st); if (st[1] & 0x10) lp->rx_error_dpc_count = ErrorDpcCounterInitialize; - return; } - + /* * Linux interface functions */ @@ -953,14 +961,14 @@ sb1000_open(struct net_device *dev) lp->rx_error_count = 0; lp->rx_error_dpc_count = 0; lp->rx_session_id[0] = 0x50; - lp->rx_session_id[0] = 0x48; - lp->rx_session_id[0] = 0x44; - lp->rx_session_id[0] = 0x42; + lp->rx_session_id[1] = 0x48; + lp->rx_session_id[2] = 0x44; + lp->rx_session_id[3] = 0x42; lp->rx_frame_id[0] = 0; lp->rx_frame_id[1] = 0; lp->rx_frame_id[2] = 0; lp->rx_frame_id[3] = 0; - if (request_irq(dev->irq, &sb1000_interrupt, 0, "sb1000", dev)) { + if (request_irq(dev->irq, sb1000_interrupt, 0, "sb1000", dev)) { return -EAGAIN; } @@ -1003,11 +1011,11 @@ static int sb1000_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) switch (cmd) { case SIOCGCMSTATS: /* get statistics */ - stats[0] = lp->stats.rx_bytes; + stats[0] = dev->stats.rx_bytes; stats[1] = lp->rx_frames; - stats[2] = lp->stats.rx_packets; - stats[3] = lp->stats.rx_errors; - stats[4] = lp->stats.rx_dropped; + stats[2] = dev->stats.rx_packets; + stats[3] = dev->stats.rx_errors; + stats[4] = dev->stats.rx_dropped; if(copy_to_user(ifr->ifr_data, stats, sizeof(stats))) return -EFAULT; status = 0; @@ -1069,34 +1077,29 @@ static int sb1000_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) } /* transmit function: do nothing since SB1000 can't send anything out */ -static int +static netdev_tx_t sb1000_start_xmit(struct sk_buff *skb, struct net_device *dev) { printk(KERN_WARNING "%s: trying to transmit!!!\n", dev->name); /* sb1000 can't xmit datagrams */ dev_kfree_skb(skb); - return 0; + return NETDEV_TX_OK; } /* SB1000 interrupt handler. */ -static irqreturn_t sb1000_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sb1000_interrupt(int irq, void *dev_id) { + static const unsigned char Command0[6] = {0x80, 0x2c, 0x00, 0x00, 0x00, 0x00}; + static const unsigned char Command1[6] = {0x80, 0x2e, 0x00, 0x00, 0x00, 0x00}; + char *name; unsigned char st; int ioaddr[2]; - struct net_device *dev = (struct net_device *) dev_id; + struct net_device *dev = dev_id; struct sb1000_private *lp = netdev_priv(dev); - const unsigned char Command0[6] = {0x80, 0x2c, 0x00, 0x00, 0x00, 0x00}; - const unsigned char Command1[6] = {0x80, 0x2e, 0x00, 0x00, 0x00, 0x00}; const int MaxRxErrorCount = 6; - if (dev == NULL) { - printk(KERN_ERR "sb1000_interrupt(): irq %d for unknown device.\n", - irq); - return IRQ_NONE; - } - ioaddr[0] = dev->base_addr; /* mem_start holds the second I/O address */ ioaddr[1] = dev->mem_start; @@ -1139,12 +1142,6 @@ static irqreturn_t sb1000_interrupt(int irq, void *dev_id, struct pt_regs *regs) return IRQ_HANDLED; } -static struct net_device_stats *sb1000_stats(struct net_device *dev) -{ - struct sb1000_private *lp = netdev_priv(dev); - return &lp->stats; -} - static int sb1000_close(struct net_device *dev) { int i; @@ -1155,7 +1152,7 @@ static int sb1000_close(struct net_device *dev) printk(KERN_DEBUG "%s: Shutting down sb1000.\n", dev->name); netif_stop_queue(dev); - + ioaddr[0] = dev->base_addr; /* mem_start holds the second I/O address */ ioaddr[1] = dev->mem_start; |
