X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fdepca.c;h=183497020bfcd3c461eaee74b2c808bb6f30cd0b;hb=c45d286e72dd72c0229dc9e2849743ba427fee84;hp=b1cbe99249c15afbfbd7ea4fe58fb505611e2f81;hpb=05668381140309088443bf5dc53add4104610fbb;p=powerpc.git diff --git a/drivers/net/depca.c b/drivers/net/depca.c index b1cbe99249..183497020b 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; @@ -518,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); @@ -591,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); @@ -610,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: @@ -657,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); @@ -682,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) { @@ -811,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; @@ -822,7 +822,7 @@ out1: out_priv: return status; } - + static int depca_open(struct net_device *dev) { @@ -924,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) { @@ -939,7 +939,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 +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; @@ -1044,7 +1044,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 +1052,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); @@ -1167,9 +1166,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); @@ -1252,24 +1251,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 +1317,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 +1334,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 +1356,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 +1378,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 +1432,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 +1449,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 +1476,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 +1490,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 +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); @@ -1541,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; @@ -1554,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: @@ -1591,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; @@ -1600,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: @@ -1650,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; @@ -1699,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). @@ -1804,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. */ @@ -2086,7 +2084,7 @@ static int __init depca_module_init (void) #endif err |= platform_driver_register (&depca_isa_driver); depca_platform_probe (); - + return err; }