X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fnet%2Fdepca.c;h=5113eef755b98cbc5104d9e4a4aff493b6a5be67;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=03804cc38be084f3ecb30a05518e9ea130520ebf;hpb=76828883507a47dae78837ab5dec5a5b4513c667;p=linux-2.6.git diff --git a/drivers/net/depca.c b/drivers/net/depca.c index 03804cc38..5113eef75 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 @@ -235,7 +235,6 @@ ========================================================================= */ -#include #include #include #include @@ -412,7 +411,7 @@ static struct platform_driver depca_isa_driver = { .name = depca_string, }, }; - + /* ** Miscellaneous info... */ @@ -422,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; @@ -519,7 +518,7 @@ 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); @@ -592,7 +591,7 @@ static int __init depca_hw_init (struct net_device *dev, struct device *device) */ ioaddr = dev->base_addr; - + STOP_DEPCA; nicsr = inb(DEPCA_NICSR); @@ -611,7 +610,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: @@ -658,7 +657,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); @@ -683,7 +682,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) { @@ -812,7 +811,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; @@ -823,7 +822,7 @@ out1: out_priv: return status; } - + static int depca_open(struct net_device *dev) { @@ -925,8 +924,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) { @@ -938,12 +937,9 @@ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev) if (skb->len < 1) goto out; - if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - goto out; - } - + if (skb_padto(skb, ETH_ZLEN)) + goto out; + netif_stop_queue(dev); if (TX_BUFFS_AVAIL) { /* Fill in a Tx ring entry */ @@ -967,9 +963,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; @@ -1057,8 +1053,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); @@ -1171,9 +1167,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); @@ -1256,24 +1252,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 */ } /* @@ -1324,12 +1318,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; @@ -1341,7 +1335,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: @@ -1363,16 +1357,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 @@ -1385,12 +1379,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 @@ -1412,7 +1406,7 @@ static int __init depca_mca_probe(struct device *device) irq = 11; break; default: - printk("%s: mca_probe IRQ error. You should never get here (%d).\n", dev->name, where); + printk("%s: mca_probe IRQ error. You should never get here (%d).\n", mdev->name, where); return -EINVAL; } @@ -1439,7 +1433,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) @@ -1456,10 +1450,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: @@ -1483,7 +1477,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) @@ -1507,7 +1501,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); @@ -1545,7 +1539,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; @@ -1558,10 +1552,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: @@ -1595,7 +1589,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; @@ -1604,10 +1598,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: @@ -1654,7 +1648,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; @@ -1703,7 +1697,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). @@ -1808,7 +1802,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. */ @@ -2090,7 +2084,7 @@ static int __init depca_module_init (void) #endif err |= platform_driver_register (&depca_isa_driver); depca_platform_probe (); - + return err; }