X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=drivers%2Fnet%2Fdepca.c;h=fda1226d8ec164b652ff97965d910f2a128c430b;hb=babcda74e9d96bb58fd9c6c5112dbdbff169e695;hp=b1cbe99249c15afbfbd7ea4fe58fb505611e2f81;hpb=6ab3d5624e172c553004ecc862bfeac16d9d68b7;p=safe%2Fjmp%2Flinux-2.6 diff --git a/drivers/net/depca.c b/drivers/net/depca.c index b1cbe99..fda1226 100644 --- a/drivers/net/depca.c +++ b/drivers/net/depca.c @@ -4,9 +4,9 @@ Copyright 1994 David C. Davies - and + and United States Government - (as represented by the Director, National Security Agency). + (as represented by the Director, National Security Agency). Copyright 1995 Digital Equipment Corporation. @@ -61,7 +61,7 @@ Digital Equipment Corporation, 1989 8) "DEC EtherWORKS Turbo_(TP BNC) Ethernet Controller Owners Manual", Digital Equipment corporation, 1991, Pub. #EK-DE202-OM.001 - + Peter Bauer's depca.c (V0.5) was referred to when debugging V0.1 of this driver. @@ -135,20 +135,20 @@ [Alan Cox: Changed the code to allow command line irq/io assignments] [Dave Davies: Changed the code to allow command line mem/name assignments] - 6) run the net startup bits for your eth?? interface manually - (usually /etc/rc.inet[12] at boot time). + 6) run the net startup bits for your eth?? interface manually + (usually /etc/rc.inet[12] at boot time). 7) enjoy! Note that autoprobing is not allowed in loadable modules - the system is already up and running and you're messing with interrupts. - To unload a module, turn off the associated interface + To unload a module, turn off the associated interface 'ifconfig eth?? down' then 'rmmod depca'. To assign a base memory address for the shared memory when running as a loadable module, see 5 above. To include the adapter name (if you have no PROM but know the card name) also see 5 above. Note that this last - option will not work with kernel built-in depca's. + option will not work with kernel built-in depca's. The shared memory assignment for a loadable module makes sense to avoid the 'memory autoprobe' picking the wrong shared memory (for the case of @@ -157,7 +157,7 @@ ************************************************************************ Support for MCA EtherWORKS cards added 11-3-98. Verified to work with up to 2 DE212 cards in a system (although not - fully stress-tested). + fully stress-tested). Currently known bugs/limitations: @@ -176,7 +176,7 @@ ---------------- Version Date Description - + 0.1 25-jan-94 Initial writing. 0.2 27-jan-94 Added LANCE TX hardware buffer chaining. 0.3 1-feb-94 Added multiple DEPCA support. @@ -190,7 +190,7 @@ 0.351 30-apr-94 Added EISA support. Added DE422 recognition. 0.36 16-may-94 DE422 fix released. 0.37 22-jul-94 Added MODULE support - 0.38 15-aug-94 Added DBR ROM switch in depca_close(). + 0.38 15-aug-94 Added DBR ROM switch in depca_close(). Multi DEPCA bug fix. 0.38axp 15-sep-94 Special version for Alpha AXP Linux V1.0. 0.381 12-dec-94 Added DE101 recognition, fix multicast bug. @@ -198,17 +198,17 @@ 0.383 22-feb-95 Fix for conflict with VESA SCSI reported by 0.384 17-mar-95 Fix a ring full bug reported by - 0.385 3-apr-95 Fix a recognition bug reported by + 0.385 3-apr-95 Fix a recognition bug reported by 0.386 21-apr-95 Fix the last fix...sorry, must be galloping senility 0.40 25-May-95 Rewrite for portability & updated. ALPHA support from 0.41 26-Jun-95 Added verify_area() calls in depca_ioctl() from suggestion by - 0.42 27-Dec-95 Add 'mem' shared memory assignment for loadable + 0.42 27-Dec-95 Add 'mem' shared memory assignment for loadable modules. Add 'adapter_name' for loadable modules when no PROM. - Both above from a suggestion by + Both above from a suggestion by . Add new multicasting code. 0.421 22-Apr-96 Fix alloc_device() bug @@ -218,7 +218,7 @@ 0.44 1-Sep-97 Fix *_probe() to test check_region() first - bug reported by 0.45 3-Nov-98 Added support for MCA EtherWORKS (DE210/DE212) cards - by + by 0.451 5-Nov-98 Fixed mca stuff cuz I'm a dummy. 0.5 14-Nov-98 Re-spin for 2.1.x kernels. 0.51 27-Jun-99 Correct received packet length for CRC from @@ -411,7 +411,7 @@ static struct platform_driver depca_isa_driver = { .name = depca_string, }, }; - + /* ** Miscellaneous info... */ @@ -421,14 +421,14 @@ static struct platform_driver depca_isa_driver = { ** Memory Alignment. Each descriptor is 4 longwords long. To force a ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and ** DESC_ALIGN. DEPCA_ALIGN aligns the start address of the private memory area -** and hence the RX descriptor ring's first entry. +** and hence the RX descriptor ring's first entry. */ #define DEPCA_ALIGN4 ((u_long)4 - 1) /* 1 longword align */ #define DEPCA_ALIGN8 ((u_long)8 - 1) /* 2 longword (quadword) align */ #define DEPCA_ALIGN DEPCA_ALIGN8 /* Keep the LANCE happy... */ /* -** The DEPCA Rx and Tx ring descriptors. +** The DEPCA Rx and Tx ring descriptors. */ struct depca_rx_desc { volatile s32 base; @@ -485,7 +485,6 @@ struct depca_private { /* Kernel-only (not device) fields */ int rx_new, tx_new; /* The next free ring entry */ int rx_old, tx_old; /* The ring entries to be free()ed. */ - struct net_device_stats stats; spinlock_t lock; struct { /* Private stats counters */ u32 bins[DEPCA_PKT_STAT_SZ]; @@ -518,11 +517,10 @@ struct depca_private { */ static int depca_open(struct net_device *dev); static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev); -static irqreturn_t depca_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t depca_interrupt(int irq, void *dev_id); static int depca_close(struct net_device *dev); static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static void depca_tx_timeout(struct net_device *dev); -static struct net_device_stats *depca_get_stats(struct net_device *dev); static void set_multicast_list(struct net_device *dev); /* @@ -591,7 +589,7 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device) */ ioaddr = dev->base_addr; - + STOP_DEPCA; nicsr = inb(DEPCA_NICSR); @@ -610,7 +608,7 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device) printk ("%s: %s at 0x%04lx", device->bus_id, depca_signature[lp->adapter], ioaddr); - + switch (lp->depca_bus) { #ifdef CONFIG_MCA case DEPCA_BUS_MCA: @@ -634,14 +632,11 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device) printk(", h/w address "); status = get_hw_addr(dev); + printk("%pM", dev->dev_addr); if (status != 0) { printk(" which has an Ethernet PROM CRC error.\n"); return -ENXIO; } - for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet address */ - printk("%2.2x:", dev->dev_addr[i]); - } - printk("%2.2x", dev->dev_addr[i]); /* Set up the maximum amount of network RAM(kB) */ netRAM = ((lp->adapter != DEPCA) ? 64 : 48); @@ -657,7 +652,7 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device) if (lp->depca_bus != DEPCA_BUS_MCA) mem_start += 0x8000; } - + if ((mem_len = (NUM_RX_DESC * (sizeof(struct depca_rx_desc) + RX_BUFF_SZ) + NUM_TX_DESC * (sizeof(struct depca_tx_desc) + TX_BUFF_SZ) + sizeof(struct depca_init))) > (netRAM << 10)) { printk(",\n requests %dkB RAM: only %dkB is available!\n", (mem_len >> 10), netRAM); @@ -682,7 +677,7 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device) printk(KERN_ERR "depca: cannot request ISA memory, aborting\n"); goto out_priv; } - + status = -EIO; lp->sh_mem = ioremap(mem_start, mem_len); if (lp->sh_mem == NULL) { @@ -801,7 +796,6 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device) dev->open = &depca_open; dev->hard_start_xmit = &depca_start_xmit; dev->stop = &depca_close; - dev->get_stats = &depca_get_stats; dev->set_multicast_list = &set_multicast_list; dev->do_ioctl = &depca_ioctl; dev->tx_timeout = depca_tx_timeout; @@ -811,7 +805,7 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device) device->driver_data = dev; SET_NETDEV_DEV (dev, device); - + status = register_netdev(dev); if (status == 0) return 0; @@ -822,7 +816,7 @@ out1: out_priv: return status; } - + static int depca_open(struct net_device *dev) { @@ -924,8 +918,8 @@ static void depca_tx_timeout(struct net_device *dev) } -/* -** Writes a socket buffer to TX descriptor ring and starts transmission +/* +** Writes a socket buffer to TX descriptor ring and starts transmission */ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev) { @@ -939,7 +933,7 @@ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev) if (skb_padto(skb, ETH_ZLEN)) goto out; - + netif_stop_queue(dev); if (TX_BUFFS_AVAIL) { /* Fill in a Tx ring entry */ @@ -963,9 +957,9 @@ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev) } /* -** The DEPCA interrupt handler. +** The DEPCA interrupt handler. */ -static irqreturn_t depca_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t depca_interrupt(int irq, void *dev_id) { struct net_device *dev = dev_id; struct depca_private *lp; @@ -1026,15 +1020,15 @@ static int depca_rx(struct net_device *dev) } if (status & R_ENP) { /* Valid frame status */ if (status & R_ERR) { /* There was an error. */ - lp->stats.rx_errors++; /* Update the error stats. */ + dev->stats.rx_errors++; /* Update the error stats. */ if (status & R_FRAM) - lp->stats.rx_frame_errors++; + dev->stats.rx_frame_errors++; if (status & R_OFLO) - lp->stats.rx_over_errors++; + dev->stats.rx_over_errors++; if (status & R_CRC) - lp->stats.rx_crc_errors++; + dev->stats.rx_crc_errors++; if (status & R_BUFF) - lp->stats.rx_fifo_errors++; + dev->stats.rx_fifo_errors++; } else { short len, pkt_len = readw(&lp->rx_ring[entry].msg_length) - 4; struct sk_buff *skb; @@ -1044,7 +1038,6 @@ static int depca_rx(struct net_device *dev) unsigned char *buf; skb_reserve(skb, 2); /* 16 byte align the IP header */ buf = skb_put(skb, pkt_len); - skb->dev = dev; if (entry < lp->rx_old) { /* Wrapped buffer */ len = (lp->rxRingMask - lp->rx_old + 1) * RX_BUFF_SZ; memcpy_fromio(buf, lp->rx_buff[lp->rx_old], len); @@ -1053,8 +1046,8 @@ static int depca_rx(struct net_device *dev) memcpy_fromio(buf, lp->rx_buff[lp->rx_old], pkt_len); } - /* - ** Notify the upper protocol layers that there is another + /* + ** Notify the upper protocol layers that there is another ** packet to handle */ skb->protocol = eth_type_trans(skb, dev); @@ -1063,9 +1056,8 @@ static int depca_rx(struct net_device *dev) /* ** Update stats */ - dev->last_rx = jiffies; - lp->stats.rx_packets++; - lp->stats.rx_bytes += pkt_len; + dev->stats.rx_packets++; + dev->stats.rx_bytes += pkt_len; for (i = 1; i < DEPCA_PKT_STAT_SZ - 1; i++) { if (pkt_len < (i * DEPCA_PKT_BIN_SZ)) { lp->pktStats.bins[i]++; @@ -1088,7 +1080,7 @@ static int depca_rx(struct net_device *dev) } } else { printk("%s: Memory squeeze, deferring packet.\n", dev->name); - lp->stats.rx_dropped++; /* Really, deferred. */ + dev->stats.rx_dropped++; /* Really, deferred. */ break; } } @@ -1126,24 +1118,24 @@ static int depca_tx(struct net_device *dev) break; } else if (status & T_ERR) { /* An error occurred. */ status = readl(&lp->tx_ring[entry].misc); - lp->stats.tx_errors++; + dev->stats.tx_errors++; if (status & TMD3_RTRY) - lp->stats.tx_aborted_errors++; + dev->stats.tx_aborted_errors++; if (status & TMD3_LCAR) - lp->stats.tx_carrier_errors++; + dev->stats.tx_carrier_errors++; if (status & TMD3_LCOL) - lp->stats.tx_window_errors++; + dev->stats.tx_window_errors++; if (status & TMD3_UFLO) - lp->stats.tx_fifo_errors++; + dev->stats.tx_fifo_errors++; if (status & (TMD3_BUFF | TMD3_UFLO)) { /* Trigger an immediate send demand. */ outw(CSR0, DEPCA_ADDR); outw(INEA | TDMD, DEPCA_DATA); } } else if (status & (T_MORE | T_ONE)) { - lp->stats.collisions++; + dev->stats.collisions++; } else { - lp->stats.tx_packets++; + dev->stats.tx_packets++; } /* Update all the pointers */ @@ -1167,9 +1159,9 @@ static int depca_close(struct net_device *dev) printk("%s: Shutting down ethercard, status was %2.2x.\n", dev->name, inw(DEPCA_DATA)); } - /* + /* ** We stop the DEPCA here -- it occasionally polls - ** memory if we don't. + ** memory if we don't. */ outw(STOP, DEPCA_DATA); @@ -1235,15 +1227,6 @@ static int InitRestartDepca(struct net_device *dev) return status; } -static struct net_device_stats *depca_get_stats(struct net_device *dev) -{ - struct depca_private *lp = (struct depca_private *) dev->priv; - - /* Null body since there is no framing error counter */ - - return &lp->stats; -} - /* ** Set or clear the multicast filter for this adaptor. */ @@ -1252,24 +1235,22 @@ static void set_multicast_list(struct net_device *dev) struct depca_private *lp = (struct depca_private *) dev->priv; u_long ioaddr = dev->base_addr; - if (dev) { - netif_stop_queue(dev); - while (lp->tx_old != lp->tx_new); /* Wait for the ring to empty */ - - STOP_DEPCA; /* Temporarily stop the depca. */ - depca_init_ring(dev); /* Initialize the descriptor rings */ + netif_stop_queue(dev); + while (lp->tx_old != lp->tx_new); /* Wait for the ring to empty */ - if (dev->flags & IFF_PROMISC) { /* Set promiscuous mode */ - lp->init_block.mode |= PROM; - } else { - SetMulticastFilter(dev); - lp->init_block.mode &= ~PROM; /* Unset promiscuous mode */ - } + STOP_DEPCA; /* Temporarily stop the depca. */ + depca_init_ring(dev); /* Initialize the descriptor rings */ - LoadCSRs(dev); /* Reload CSR3 */ - InitRestartDepca(dev); /* Resume normal operation. */ - netif_start_queue(dev); /* Unlock the TX ring */ + if (dev->flags & IFF_PROMISC) { /* Set promiscuous mode */ + lp->init_block.mode |= PROM; + } else { + SetMulticastFilter(dev); + lp->init_block.mode &= ~PROM; /* Unset promiscuous mode */ } + + LoadCSRs(dev); /* Reload CSR3 */ + InitRestartDepca(dev); /* Resume normal operation. */ + netif_start_queue(dev); /* Unlock the TX ring */ } /* @@ -1320,12 +1301,12 @@ static void SetMulticastFilter(struct net_device *dev) static int __init depca_common_init (u_long ioaddr, struct net_device **devp) { int status = 0; - + if (!request_region (ioaddr, DEPCA_TOTAL_SIZE, depca_string)) { status = -EBUSY; goto out; } - + if (DevicePresent(ioaddr)) { status = -ENODEV; goto out_release; @@ -1337,7 +1318,7 @@ static int __init depca_common_init (u_long ioaddr, struct net_device **devp) } return 0; - + out_release: release_region (ioaddr, DEPCA_TOTAL_SIZE); out: @@ -1359,16 +1340,16 @@ static int __init depca_mca_probe(struct device *device) struct depca_private *lp; /* - ** Search for the adapter. If an address has been given, search + ** Search for the adapter. If an address has been given, search ** specifically for the card at that address. Otherwise find the ** first card in the system. */ - + pos[0] = mca_device_read_stored_pos(mdev, 2); pos[1] = mca_device_read_stored_pos(mdev, 3); /* - ** IO of card is handled by bits 1 and 2 of pos0. + ** IO of card is handled by bits 1 and 2 of pos0. ** ** bit2 bit1 IO ** 0 0 0x2c00 @@ -1381,12 +1362,12 @@ static int __init depca_mca_probe(struct device *device) /* ** Found the adapter we were looking for. Now start setting it up. - ** + ** ** First work on decoding the IRQ. It's stored in the lower 4 bits ** of pos1. Bits are as follows (from the ADF file): ** - ** Bits - ** 3 2 1 0 IRQ + ** Bits + ** 3 2 1 0 IRQ ** -------------------- ** 0 0 1 0 5 ** 0 0 0 1 9 @@ -1435,7 +1416,7 @@ static int __init depca_mca_probe(struct device *device) strncpy(mdev->name, depca_mca_adapter_name[mdev->index], sizeof(mdev->name)); mca_device_set_claim(mdev, 1); - + /* ** Get everything allocated and initialized... (almost just ** like the ISA and EISA probes) @@ -1452,10 +1433,10 @@ static int __init depca_mca_probe(struct device *device) lp->depca_bus = DEPCA_BUS_MCA; lp->adapter = depca_mca_adapter_type[mdev->index]; lp->mem_start = mem_start; - + if ((err = depca_hw_init(dev, device))) goto out_free; - + return 0; out_free: @@ -1479,7 +1460,7 @@ static void __init depca_platform_probe (void) for (i = 0; depca_io_ports[i].iobase; i++) { depca_io_ports[i].device = NULL; - + /* if an address has been specified on the command * line, use it (if valid) */ if (io && io != depca_io_ports[i].iobase) @@ -1493,8 +1474,9 @@ static void __init depca_platform_probe (void) depca_io_ports[i].device = pldev; if (platform_device_add(pldev)) { - platform_device_put(pldev); depca_io_ports[i].device = NULL; + pldev->dev.platform_data = NULL; + platform_device_put(pldev); continue; } @@ -1503,7 +1485,7 @@ static void __init depca_platform_probe (void) * no hardware at this address. Unregister it, as the * release fuction will take care of freeing the * allocated structure */ - + depca_io_ports[i].device = NULL; pldev->dev.platform_data = NULL; platform_device_unregister (pldev); @@ -1541,7 +1523,7 @@ static int __init depca_isa_probe (struct platform_device *device) goto out; adapter = depca_shmem_probe (&mem_start); - + if (adapter == unknown) { status = -ENODEV; goto out_free; @@ -1554,10 +1536,10 @@ static int __init depca_isa_probe (struct platform_device *device) lp->depca_bus = DEPCA_BUS_ISA; lp->adapter = adapter; lp->mem_start = mem_start; - + if ((status = depca_hw_init(dev, &device->dev))) goto out_free; - + return 0; out_free: @@ -1591,7 +1573,7 @@ static int __init depca_eisa_probe (struct device *device) * it's address with the ethernet prom)... As we don't parse * the EISA configuration structures (yet... :-), just rely on * the ISA probing to sort it out... */ - + depca_shmem_probe (&mem_start); dev->base_addr = ioaddr; @@ -1600,10 +1582,10 @@ static int __init depca_eisa_probe (struct device *device) lp->depca_bus = DEPCA_BUS_EISA; lp->adapter = edev->id.driver_data; lp->mem_start = mem_start; - + if ((status = depca_hw_init(dev, device))) goto out_free; - + return 0; out_free: @@ -1650,7 +1632,7 @@ static int __init DepcaSignature(char *name, u_long base_addr) * used, at least on x86. Instead, reserve a memory region a * board would certainly use. If it works, go ahead. If not, * run like hell... */ - + if (!request_mem_region (mem_addr, 16, depca_string)) return unknown; @@ -1699,7 +1681,7 @@ static int __init DepcaSignature(char *name, u_long base_addr) ** if the first address octet is a 0x08 - this minimises the chances of ** messing around with some other hardware, but it assumes that this DEPCA ** card initialized itself correctly. -** +** ** Search the Ethernet address ROM for the signature. Since the ROM address ** counter can start at an arbitrary point, the search must include the entire ** probe sequence length plus the (length_of_the_signature - 1). @@ -1804,7 +1786,7 @@ static int load_packet(struct net_device *dev, struct sk_buff *skb) entry = lp->tx_new; /* Ring around buffer number. */ end = (entry + (skb->len - 1) / TX_BUFF_SZ) & lp->txRingMask; if (!(readl(&lp->tx_ring[end].base) & T_OWN)) { /* Enough room? */ - /* + /* ** Caution: the write order is important here... don't set up the ** ownership rights until all the other information is in place. */ @@ -1895,11 +1877,7 @@ static void depca_dbg_open(struct net_device *dev) printk("...0x%8.8x\n", readl(&lp->tx_ring[i].base)); printk("Initialisation block at 0x%8.8lx(Phys)\n", lp->mem_start); printk(" mode: 0x%4.4x\n", p->mode); - printk(" physical address: "); - for (i = 0; i < ETH_ALEN - 1; i++) { - printk("%2.2x:", p->phys_addr[i]); - } - printk("%2.2x\n", p->phys_addr[i]); + printk(" physical address: %pM\n", p->phys_addr); printk(" multicast hash table: "); for (i = 0; i < (HASH_TABLE_LEN >> 3) - 1; i++) { printk("%2.2x:", p->mcast_table[i]); @@ -2086,7 +2064,7 @@ static int __init depca_module_init (void) #endif err |= platform_driver_register (&depca_isa_driver); depca_platform_probe (); - + return err; }