|
|
1.1 ! root 1: /* ns820.c: A Linux Gigabit Ethernet driver for the NatSemi DP83820 series. */ ! 2: /* ! 3: Written/copyright 1999-2003 by Donald Becker. ! 4: Copyright 2002-2003 by Scyld Computing Corporation. ! 5: ! 6: This software may be used and distributed according to the terms of ! 7: the GNU General Public License (GPL), incorporated herein by reference. ! 8: Drivers based on or derived from this code fall under the GPL and must ! 9: retain the authorship, copyright and license notice. This file is not ! 10: a complete program and may only be used when the entire operating ! 11: system is licensed under the GPL. License for under other terms may be ! 12: available. Contact the original author for details. ! 13: ! 14: The original author may be reached as [email protected], or at ! 15: Scyld Computing Corporation ! 16: 914 Bay Ridge Road, Suite 220 ! 17: Annapolis MD 21403 ! 18: ! 19: Support information and updates available at ! 20: http://www.scyld.com/network/natsemi.html ! 21: The information and support mailing lists are based at ! 22: http://www.scyld.com/mailman/listinfo/ ! 23: */ ! 24: ! 25: /* These identify the driver base version and may not be removed. */ ! 26: static const char version1[] = ! 27: "ns820.c:v1.03a 8/09/2003 Written by Donald Becker <[email protected]>\n"; ! 28: static const char version2[] = ! 29: " http://www.scyld.com/network/natsemi.html\n"; ! 30: /* Updated to recommendations in pci-skeleton v2.13. */ ! 31: ! 32: /* Automatically extracted configuration info: ! 33: probe-func: ns820_probe ! 34: config-in: tristate 'National Semiconductor DP8382x series PCI Ethernet support' CONFIG_NATSEMI820 ! 35: ! 36: c-help-name: National Semiconductor DP8382x series PCI Ethernet support ! 37: c-help-symbol: CONFIG_NATSEMI820 ! 38: c-help: This driver is for the National Semiconductor DP83820 Gigabit Ethernet ! 39: c-help: adapter series. ! 40: c-help: More specific information and updates are available from ! 41: c-help: http://www.scyld.com/network/natsemi.html ! 42: */ ! 43: ! 44: /* The user-configurable values. ! 45: These may be modified when a driver module is loaded.*/ ! 46: ! 47: /* Message enable level: 0..31 = no..all messages. See NETIF_MSG docs. */ ! 48: static int debug = 2; ! 49: ! 50: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ ! 51: static int max_interrupt_work = 20; ! 52: ! 53: /* Maximum number of multicast addresses to filter (vs. rx-all-multicast). ! 54: This chip uses a 2048 element hash table based on the Ethernet CRC. ! 55: Previous natsemi chips had unreliable multicast filter circuitry. ! 56: To work around an observed problem set this value to '0', ! 57: which will immediately switch to Rx-all-multicast. ! 58: */ ! 59: static int multicast_filter_limit = 100; ! 60: ! 61: /* Set the copy breakpoint for the copy-only-tiny-frames scheme. ! 62: Setting to > 1518 effectively disables this feature. ! 63: This chip can only receive into aligned buffers, so architectures such ! 64: as the Alpha AXP might benefit from a copy-align. ! 65: */ ! 66: static int rx_copybreak = 0; ! 67: ! 68: /* Used to pass the media type, etc. ! 69: Both 'options[]' and 'full_duplex[]' should exist for driver ! 70: interoperability, however setting full_duplex[] is deprecated. ! 71: The media type is usually passed in 'options[]'. ! 72: The default is autonegotation for speed and duplex. ! 73: This should rarely be overridden. ! 74: Use option values 0x10/0x20 for 10Mbps, 0x100,0x200 for 100Mbps. ! 75: Use option values 0x10 and 0x100 for forcing half duplex fixed speed. ! 76: Use option values 0x20 and 0x200 for forcing full duplex operation. ! 77: Use 0x1000 or 0x2000 for gigabit. ! 78: */ ! 79: #define MAX_UNITS 8 /* More are supported, limit only on options */ ! 80: static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; ! 81: static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; ! 82: ! 83: /* Operational parameters that are set at compile time. */ ! 84: ! 85: /* Keep the ring sizes a power of two for compile efficiency. ! 86: Understand the implications before changing these settings! ! 87: The compiler will convert <unsigned>'%'<2^N> into a bit mask. ! 88: Making the Tx ring too large decreases the effectiveness of channel ! 89: bonding and packet priority, confuses the system network buffer limits, ! 90: and wastes memory. ! 91: Too-large receive rings waste memory and confound network buffer limits. ! 92: */ ! 93: #define TX_RING_SIZE 16 ! 94: #define TX_QUEUE_LEN 10 /* Limit ring entries actually used, min 4. */ ! 95: #define RX_RING_SIZE 64 ! 96: ! 97: /* Operational parameters that usually are not changed. */ ! 98: /* Time in jiffies before concluding the transmitter is hung. ! 99: Re-autonegotiation may take up to 3 seconds. ! 100: */ ! 101: #define TX_TIMEOUT (6*HZ) ! 102: ! 103: /* Allocation size of Rx buffers with normal sized Ethernet frames. ! 104: Do not change this value without good reason. This is not a limit, ! 105: but a way to keep a consistent allocation size among drivers. ! 106: */ ! 107: #define PKT_BUF_SZ 1536 ! 108: ! 109: #ifndef __KERNEL__ ! 110: #define __KERNEL__ ! 111: #endif ! 112: #if !defined(__OPTIMIZE__) ! 113: #warning You must compile this file with the correct options! ! 114: #warning See the last lines of the source file. ! 115: #error You must compile this driver with "-O". ! 116: #endif ! 117: ! 118: /* Include files, designed to support most kernel versions 2.0.0 and later. */ ! 119: #include <linux/config.h> ! 120: #if defined(CONFIG_SMP) && ! defined(__SMP__) ! 121: #define __SMP__ ! 122: #endif ! 123: #if defined(MODULE) && defined(CONFIG_MODVERSIONS) && ! defined(MODVERSIONS) ! 124: #define MODVERSIONS ! 125: #endif ! 126: ! 127: #include <linux/version.h> ! 128: #if defined(MODVERSIONS) ! 129: #include <linux/modversions.h> ! 130: #endif ! 131: #include <linux/module.h> ! 132: ! 133: #include <linux/kernel.h> ! 134: #include <linux/string.h> ! 135: #include <linux/timer.h> ! 136: #include <linux/errno.h> ! 137: #include <linux/ioport.h> ! 138: #if LINUX_VERSION_CODE >= 0x20400 ! 139: #include <linux/slab.h> ! 140: #else ! 141: #include <linux/malloc.h> ! 142: #endif ! 143: #include <linux/interrupt.h> ! 144: #include <linux/pci.h> ! 145: #include <linux/netdevice.h> ! 146: #include <linux/etherdevice.h> ! 147: #include <linux/skbuff.h> ! 148: #include <asm/processor.h> /* Processor type for cache alignment. */ ! 149: #include <asm/bitops.h> ! 150: #include <asm/io.h> ! 151: ! 152: #ifdef INLINE_PCISCAN ! 153: #include "k_compat.h" ! 154: #else ! 155: #include "pci-scan.h" ! 156: #include "kern_compat.h" ! 157: #endif ! 158: ! 159: #if (LINUX_VERSION_CODE >= 0x20100) && defined(MODULE) ! 160: char kernel_version[] = UTS_RELEASE; ! 161: #endif ! 162: ! 163: MODULE_AUTHOR("Donald Becker <[email protected]>"); ! 164: MODULE_DESCRIPTION("National Semiconductor DP83820 series PCI Ethernet driver"); ! 165: MODULE_LICENSE("GPL"); ! 166: MODULE_PARM(debug, "i"); ! 167: MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i"); ! 168: MODULE_PARM(max_interrupt_work, "i"); ! 169: MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i"); ! 170: MODULE_PARM(rx_copybreak, "i"); ! 171: MODULE_PARM(multicast_filter_limit, "i"); ! 172: MODULE_PARM_DESC(debug, "Driver message level (0-31)"); ! 173: MODULE_PARM_DESC(options, "Force transceiver type or fixed speed+duplex"); ! 174: MODULE_PARM_DESC(max_interrupt_work, ! 175: "Driver maximum events handled per interrupt"); ! 176: MODULE_PARM_DESC(full_duplex, ! 177: "Non-zero to force full duplex, non-negotiated link " ! 178: "(deprecated)."); ! 179: MODULE_PARM_DESC(rx_copybreak, ! 180: "Breakpoint in bytes for copy-only-tiny-frames"); ! 181: MODULE_PARM_DESC(multicast_filter_limit, ! 182: "Multicast addresses before switching to Rx-all-multicast"); ! 183: ! 184: /* ! 185: Theory of Operation ! 186: ! 187: I. Board Compatibility ! 188: ! 189: This driver is designed for National Semiconductor DP83820 10/100/1000 ! 190: Ethernet NIC. It is superficially similar to the 810 series "natsemi.c" ! 191: driver, however the register layout, descriptor layout and element ! 192: length of the new chip series is different. ! 193: ! 194: II. Board-specific settings ! 195: ! 196: This driver requires the PCI interrupt line to be configured. ! 197: It honors the EEPROM-set values. ! 198: ! 199: III. Driver operation ! 200: ! 201: IIIa. Ring buffers ! 202: ! 203: This driver uses two statically allocated fixed-size descriptor lists ! 204: formed into rings by a branch from the final descriptor to the beginning of ! 205: the list. The ring sizes are set at compile time by RX/TX_RING_SIZE. ! 206: The NatSemi design uses a 'next descriptor' pointer that the driver forms ! 207: into a list, thus rings can be arbitrarily sized. Before changing the ! 208: ring sizes you should understand the flow and cache effects of the ! 209: full/available/empty hysteresis. ! 210: ! 211: IIIb/c. Transmit/Receive Structure ! 212: ! 213: This driver uses a zero-copy receive and transmit scheme. ! 214: The driver allocates full frame size skbuffs for the Rx ring buffers at ! 215: open() time and passes the skb->data field to the chip as receive data ! 216: buffers. When an incoming frame is less than RX_COPYBREAK bytes long, ! 217: a fresh skbuff is allocated and the frame is copied to the new skbuff. ! 218: When the incoming frame is larger, the skbuff is passed directly up the ! 219: protocol stack. Buffers consumed this way are replaced by newly allocated ! 220: skbuffs in a later phase of receives. ! 221: ! 222: The RX_COPYBREAK value is chosen to trade-off the memory wasted by ! 223: using a full-sized skbuff for small frames vs. the copying costs of larger ! 224: frames. New boards are typically used in generously configured machines ! 225: and the underfilled buffers have negligible impact compared to the benefit of ! 226: a single allocation size, so the default value of zero results in never ! 227: copying packets. When copying is done, the cost is usually mitigated by using ! 228: a combined copy/checksum routine. Copying also preloads the cache, which is ! 229: most useful with small frames. ! 230: ! 231: A subtle aspect of the operation is that unaligned buffers are not permitted ! 232: by the hardware. Thus the IP header at offset 14 in an ethernet frame isn't ! 233: longword aligned for further processing. On copies frames are put into the ! 234: skbuff at an offset of "+2", 16-byte aligning the IP header. ! 235: ! 236: IIId. Synchronization ! 237: ! 238: The driver runs as two independent, single-threaded flows of control. One ! 239: is the send-packet routine, which enforces single-threaded use by the ! 240: dev->tbusy flag. The other thread is the interrupt handler, which is single ! 241: threaded by the hardware and interrupt handling software. ! 242: ! 243: The send packet thread has partial control over the Tx ring and 'dev->tbusy' ! 244: flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next ! 245: queue slot is empty, it clears the tbusy flag when finished otherwise it sets ! 246: the 'lp->tx_full' flag. ! 247: ! 248: The interrupt handler has exclusive control over the Rx ring and records stats ! 249: from the Tx ring. After reaping the stats, it marks the Tx queue entry as ! 250: empty by incrementing the dirty_tx mark. Iff the 'lp->tx_full' flag is set, it ! 251: clears both the tx_full and tbusy flags. ! 252: ! 253: IV. Notes ! 254: ! 255: The NatSemi 820 series PCI gigabit chips are very common on low-cost NICs. ! 256: The '821 appears to be the same as '820 chip, only with pins for the upper ! 257: 32 bits marked "N/C". ! 258: ! 259: IVb. References ! 260: ! 261: http://www.scyld.com/expert/100mbps.html ! 262: http://www.scyld.com/expert/NWay.html ! 263: The NatSemi dp83820 datasheet is available: search www.natsemi.com ! 264: ! 265: IVc. Errata ! 266: ! 267: None characterised. ! 268: ! 269: */ ! 270: ! 271: ! 272: ! 273: static void *ns820_probe1(struct pci_dev *pdev, void *init_dev, ! 274: long ioaddr, int irq, int chip_idx, int find_cnt); ! 275: static int power_event(void *dev_instance, int event); ! 276: enum chip_capability_flags {FDXActiveLow=1, InvertGbXcvrPwr=2, }; ! 277: #ifdef USE_IO_OPS ! 278: #define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_IO | PCI_ADDR0) ! 279: #else ! 280: #define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_MEM | PCI_ADDR1) ! 281: #endif ! 282: ! 283: static struct pci_id_info pci_id_tbl[] = { ! 284: { "D-Link DGE-500T (DP83820)", ! 285: { 0x0022100B, 0xffffffff, 0x49001186, 0xffffffff, }, ! 286: PCI_IOTYPE, 256, FDXActiveLow}, ! 287: {"NatSemi DP83820", { 0x0022100B, 0xffffffff }, ! 288: PCI_IOTYPE, 256, 0}, ! 289: {0,}, /* 0 terminated list. */ ! 290: }; ! 291: ! 292: struct drv_id_info ns820_drv_id = { ! 293: "ns820", PCI_HOTSWAP, PCI_CLASS_NETWORK_ETHERNET<<8, pci_id_tbl, ! 294: ns820_probe1, power_event }; ! 295: ! 296: /* Offsets to the device registers. ! 297: Unlike software-only systems, device drivers interact with complex hardware. ! 298: It's not useful to define symbolic names for every register bit in the ! 299: device. Please do not change these names without good reason. ! 300: */ ! 301: enum register_offsets { ! 302: ChipCmd=0x00, ChipConfig=0x04, EECtrl=0x08, PCIBusCfg=0x0C, ! 303: IntrStatus=0x10, IntrMask=0x14, IntrEnable=0x18, IntrHoldoff=0x1C, ! 304: TxRingPtr=0x20, TxRingPtrHi=0x24, TxConfig=0x28, ! 305: RxRingPtr=0x30, RxRingPtrHi=0x34, RxConfig=0x38, ! 306: WOLCmd=0x40, PauseCmd=0x44, RxFilterAddr=0x48, RxFilterData=0x4C, ! 307: BootRomAddr=0x50, BootRomData=0x54, ChipRevReg=0x58, ! 308: StatsCtrl=0x5C, RxPktErrs=0x60, RxMissed=0x68, RxCRCErrs=0x64, ! 309: }; ! 310: ! 311: /* Bits in ChipCmd. */ ! 312: enum ChipCmdBits { ! 313: ChipReset=0x100, SoftIntr=0x80, RxReset=0x20, TxReset=0x10, ! 314: RxOff=0x08, RxOn=0x04, TxOff=0x02, TxOn=0x01, ! 315: }; ! 316: ! 317: /* Bits in ChipConfig. */ ! 318: enum ChipConfigBits { ! 319: CfgLinkGood=0x80000000, CfgFDX=0x10000000, ! 320: CfgXcrReset=0x0400, CfgXcrOff=0x0200, ! 321: }; ! 322: ! 323: /* Bits in the interrupt status/mask registers. */ ! 324: enum intr_status_bits { ! 325: IntrRxDone=0x0001, IntrRxIntr=0x0002, IntrRxErr=0x0004, IntrRxEarly=0x0008, ! 326: IntrRxIdle=0x0010, IntrRxOverrun=0x0020, ! 327: IntrTxDone=0x0040, IntrTxIntr=0x0080, IntrTxErr=0x0100, ! 328: IntrTxIdle=0x0200, IntrTxUnderrun=0x0400, ! 329: StatsMax=0x0800, IntrDrv=0x1000, WOLPkt=0x2000, LinkChange=0x4000, ! 330: RxStatusOverrun=0x10000, ! 331: RxResetDone=0x00200000, TxResetDone=0x00400000, ! 332: IntrPCIErr=0x001E0000, ! 333: IntrNormalSummary=0x0251, IntrAbnormalSummary=0xED20, ! 334: }; ! 335: ! 336: /* Bits in the RxMode register. */ ! 337: enum rx_mode_bits { ! 338: AcceptErr=0x20, AcceptRunt=0x10, ! 339: AcceptBroadcast=0xC0000000, ! 340: AcceptMulticast=0x00200000, AcceptAllMulticast=0x20000000, ! 341: AcceptAllPhys=0x10000000, AcceptMyPhys=0x08000000, ! 342: }; ! 343: ! 344: /* The Rx and Tx buffer descriptors. */ ! 345: /* Note that using only 32 bit fields simplifies conversion to big-endian ! 346: architectures. */ ! 347: struct netdev_desc { ! 348: #if ADDRLEN == 64 ! 349: u64 next_desc; ! 350: u64 buf_addr; ! 351: #endif ! 352: u32 next_desc; ! 353: u32 buf_addr; ! 354: s32 cmd_status; ! 355: u32 vlan_status; ! 356: }; ! 357: ! 358: /* Bits in network_desc.status */ ! 359: enum desc_status_bits { ! 360: DescOwn=0x80000000, DescMore=0x40000000, DescIntr=0x20000000, ! 361: DescNoCRC=0x10000000, ! 362: DescPktOK=0x08000000, RxTooLong=0x00400000, ! 363: }; ! 364: ! 365: #define PRIV_ALIGN 15 /* Required alignment mask */ ! 366: struct netdev_private { ! 367: /* Descriptor rings first for alignment. */ ! 368: struct netdev_desc rx_ring[RX_RING_SIZE]; ! 369: struct netdev_desc tx_ring[TX_RING_SIZE]; ! 370: struct net_device *next_module; /* Link for devices of this type. */ ! 371: void *priv_addr; /* Unaligned address for kfree */ ! 372: const char *product_name; ! 373: /* The addresses of receive-in-place skbuffs. */ ! 374: struct sk_buff* rx_skbuff[RX_RING_SIZE]; ! 375: /* The saved address of a sent-in-place packet/buffer, for later free(). */ ! 376: struct sk_buff* tx_skbuff[TX_RING_SIZE]; ! 377: struct net_device_stats stats; ! 378: struct timer_list timer; /* Media monitoring timer. */ ! 379: /* Frequently used values: keep some adjacent for cache effect. */ ! 380: int msg_level; ! 381: int chip_id, drv_flags; ! 382: struct pci_dev *pci_dev; ! 383: long in_interrupt; /* Word-long for SMP locks. */ ! 384: int max_interrupt_work; ! 385: int intr_enable; ! 386: unsigned int restore_intr_enable:1; /* Set if temporarily masked. */ ! 387: unsigned int rx_q_empty:1; /* Set out-of-skbuffs. */ ! 388: ! 389: struct netdev_desc *rx_head_desc; ! 390: unsigned int cur_rx, dirty_rx; /* Producer/consumer ring indices */ ! 391: unsigned int rx_buf_sz; /* Based on MTU+slack. */ ! 392: int rx_copybreak; ! 393: ! 394: unsigned int cur_tx, dirty_tx; ! 395: unsigned int tx_full:1; /* The Tx queue is full. */ ! 396: /* These values keep track of the transceiver/media in use. */ ! 397: unsigned int full_duplex:1; /* Full-duplex operation requested. */ ! 398: unsigned int duplex_lock:1; ! 399: unsigned int medialock:1; /* Do not sense media. */ ! 400: unsigned int default_port; /* Last dev->if_port value. */ ! 401: /* Rx filter. */ ! 402: u32 cur_rx_mode; ! 403: u32 rx_filter[16]; ! 404: int multicast_filter_limit; ! 405: /* FIFO and PCI burst thresholds. */ ! 406: int tx_config, rx_config; ! 407: /* MII transceiver section. */ ! 408: u16 advertising; /* NWay media advertisement */ ! 409: }; ! 410: ! 411: static int eeprom_read(long ioaddr, int location); ! 412: static void mdio_sync(long mdio_addr); ! 413: static int mdio_read(struct net_device *dev, int phy_id, int location); ! 414: static void mdio_write(struct net_device *dev, int phy_id, int location, int value); ! 415: static int netdev_open(struct net_device *dev); ! 416: static void check_duplex(struct net_device *dev); ! 417: static void netdev_timer(unsigned long data); ! 418: static void tx_timeout(struct net_device *dev); ! 419: static int rx_ring_fill(struct net_device *dev); ! 420: static void init_ring(struct net_device *dev); ! 421: static int start_tx(struct sk_buff *skb, struct net_device *dev); ! 422: static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); ! 423: static void netdev_error(struct net_device *dev, int intr_status); ! 424: static int netdev_rx(struct net_device *dev); ! 425: static void netdev_error(struct net_device *dev, int intr_status); ! 426: static void set_rx_mode(struct net_device *dev); ! 427: static struct net_device_stats *get_stats(struct net_device *dev); ! 428: static int mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); ! 429: static int netdev_close(struct net_device *dev); ! 430: ! 431: ! 432: ! 433: /* A list of our installed devices, for removing the driver module. */ ! 434: static struct net_device *root_net_dev = NULL; ! 435: ! 436: #ifndef MODULE ! 437: int ns820_probe(struct net_device *dev) ! 438: { ! 439: if (pci_drv_register(&ns820_drv_id, dev) < 0) ! 440: return -ENODEV; ! 441: printk(KERN_INFO "%s" KERN_INFO "%s", version1, version2); ! 442: return 0; ! 443: } ! 444: #endif ! 445: ! 446: static void *ns820_probe1(struct pci_dev *pdev, void *init_dev, ! 447: long ioaddr, int irq, int chip_idx, int card_idx) ! 448: { ! 449: struct net_device *dev; ! 450: struct netdev_private *np; ! 451: void *priv_mem; ! 452: int i, option = card_idx < MAX_UNITS ? options[card_idx] : 0; ! 453: ! 454: dev = init_etherdev(init_dev, 0); ! 455: if (!dev) ! 456: return NULL; ! 457: ! 458: /* Perhaps NETIF_MSG_PROBE */ ! 459: printk(KERN_INFO "%s: %s at 0x%lx, ", ! 460: dev->name, pci_id_tbl[chip_idx].name, ioaddr); ! 461: ! 462: for (i = 0; i < 3; i++) ! 463: ((u16 *)dev->dev_addr)[i] = le16_to_cpu(eeprom_read(ioaddr, 12 - i)); ! 464: for (i = 0; i < 5; i++) ! 465: printk("%2.2x:", dev->dev_addr[i]); ! 466: printk("%2.2x, IRQ %d.\n", dev->dev_addr[i], irq); ! 467: ! 468: /* Reset the chip to erase previous misconfiguration. */ ! 469: writel(ChipReset, ioaddr + ChipCmd); ! 470: /* Power up Xcvr. */ ! 471: writel(~CfgXcrOff & readl(ioaddr + ChipConfig), ioaddr + ChipConfig); ! 472: ! 473: /* Make certain elements e.g. descriptor lists are aligned. */ ! 474: priv_mem = kmalloc(sizeof(*np) + PRIV_ALIGN, GFP_KERNEL); ! 475: /* Check for the very unlikely case of no memory. */ ! 476: if (priv_mem == NULL) ! 477: return NULL; ! 478: ! 479: dev->base_addr = ioaddr; ! 480: dev->irq = irq; ! 481: ! 482: dev->priv = np = (void *)(((long)priv_mem + PRIV_ALIGN) & ~PRIV_ALIGN); ! 483: memset(np, 0, sizeof(*np)); ! 484: np->priv_addr = priv_mem; ! 485: ! 486: np->next_module = root_net_dev; ! 487: root_net_dev = dev; ! 488: ! 489: np->pci_dev = pdev; ! 490: np->chip_id = chip_idx; ! 491: np->drv_flags = pci_id_tbl[chip_idx].drv_flags; ! 492: np->msg_level = (1 << debug) - 1; ! 493: np->rx_copybreak = rx_copybreak; ! 494: np->max_interrupt_work = max_interrupt_work; ! 495: np->multicast_filter_limit = multicast_filter_limit; ! 496: ! 497: if (dev->mem_start) ! 498: option = dev->mem_start; ! 499: ! 500: /* The lower four bits are the media type. */ ! 501: if (option > 0) { ! 502: if (option & 0x220) ! 503: np->full_duplex = 1; ! 504: np->default_port = option & 0x33ff; ! 505: if (np->default_port & 0x330) ! 506: np->medialock = 1; ! 507: } ! 508: if (card_idx < MAX_UNITS && full_duplex[card_idx] > 0) ! 509: np->full_duplex = 1; ! 510: ! 511: if (np->full_duplex) { ! 512: if (np->msg_level & NETIF_MSG_PROBE) ! 513: printk(KERN_INFO "%s: Set to forced full duplex, autonegotiation" ! 514: " disabled.\n", dev->name); ! 515: np->duplex_lock = 1; ! 516: } ! 517: ! 518: /* The chip-specific entries in the device structure. */ ! 519: dev->open = &netdev_open; ! 520: dev->hard_start_xmit = &start_tx; ! 521: dev->stop = &netdev_close; ! 522: dev->get_stats = &get_stats; ! 523: dev->set_multicast_list = &set_rx_mode; ! 524: dev->do_ioctl = &mii_ioctl; ! 525: ! 526: /* Allow forcing the media type. */ ! 527: if (option > 0) { ! 528: if (option & 0x220) ! 529: np->full_duplex = 1; ! 530: np->default_port = option & 0x3ff; ! 531: if (np->default_port & 0x330) { ! 532: np->medialock = 1; ! 533: if (np->msg_level & NETIF_MSG_PROBE) ! 534: printk(KERN_INFO " Forcing %dMbs %s-duplex operation.\n", ! 535: (option & 0x300 ? 100 : 10), ! 536: (np->full_duplex ? "full" : "half")); ! 537: mdio_write(dev, 1, 0, ! 538: ((option & 0x300) ? 0x2000 : 0) | /* 100mbps? */ ! 539: (np->full_duplex ? 0x0100 : 0)); /* Full duplex? */ ! 540: } ! 541: } ! 542: ! 543: return dev; ! 544: } ! 545: ! 546: ! 547: /* Read the EEPROM and MII Management Data I/O (MDIO) interfaces. ! 548: The EEPROM code is for the common 93c06/46 EEPROMs with 6 bit addresses. ! 549: Update to the code in other drivers for 8/10 bit addresses. ! 550: */ ! 551: ! 552: /* Delay between EEPROM clock transitions. ! 553: This "delay" forces out buffered PCI writes, which is sufficient to meet ! 554: the timing requirements of most EEPROMs. ! 555: */ ! 556: #define eeprom_delay(ee_addr) readl(ee_addr) ! 557: ! 558: enum EEPROM_Ctrl_Bits { ! 559: EE_ShiftClk=0x04, EE_DataIn=0x01, EE_ChipSelect=0x08, EE_DataOut=0x02, ! 560: }; ! 561: #define EE_Write0 (EE_ChipSelect) ! 562: #define EE_Write1 (EE_ChipSelect | EE_DataIn) ! 563: ! 564: /* The EEPROM commands include the 01 preamble. */ ! 565: enum EEPROM_Cmds { ! 566: EE_WriteCmd=5, EE_ReadCmd=6, EE_EraseCmd=7, ! 567: }; ! 568: ! 569: static int eeprom_read(long addr, int location) ! 570: { ! 571: long eeprom_addr = addr + EECtrl; ! 572: int read_cmd = (EE_ReadCmd << 6) | location; ! 573: int retval = 0; ! 574: int i; ! 575: ! 576: writel(EE_Write0, eeprom_addr); ! 577: ! 578: /* Shift the read command bits out. */ ! 579: for (i = 10; i >= 0; i--) { ! 580: int dataval = (read_cmd & (1 << i)) ? EE_Write1 : EE_Write0; ! 581: writel(dataval, eeprom_addr); ! 582: eeprom_delay(eeprom_addr); ! 583: writel(dataval | EE_ShiftClk, eeprom_addr); ! 584: eeprom_delay(eeprom_addr); ! 585: } ! 586: writel(EE_ChipSelect, eeprom_addr); ! 587: eeprom_delay(eeprom_addr); ! 588: ! 589: for (i = 15; i >= 0; i--) { ! 590: writel(EE_ChipSelect | EE_ShiftClk, eeprom_addr); ! 591: eeprom_delay(eeprom_addr); ! 592: retval |= (readl(eeprom_addr) & EE_DataOut) ? 1 << i : 0; ! 593: writel(EE_ChipSelect, eeprom_addr); ! 594: eeprom_delay(eeprom_addr); ! 595: } ! 596: ! 597: /* Terminate the EEPROM access. */ ! 598: writel(EE_Write0, eeprom_addr); ! 599: writel(0, eeprom_addr); ! 600: return retval; ! 601: } ! 602: ! 603: /* MII transceiver control section. ! 604: Read and write MII registers using software-generated serial MDIO ! 605: protocol. See the MII specifications or DP83840A data sheet for details. ! 606: ! 607: The maximum data clock rate is 2.5 Mhz. To meet minimum timing we ! 608: must flush writes to the PCI bus with a PCI read. */ ! 609: #define mdio_delay(mdio_addr) readl(mdio_addr) ! 610: ! 611: /* Set iff a MII transceiver on any interface requires mdio preamble. ! 612: This only set with older tranceivers, so the extra ! 613: code size of a per-interface flag is not worthwhile. */ ! 614: static char mii_preamble_required = 0; ! 615: ! 616: enum mii_reg_bits { ! 617: MDIO_ShiftClk=0x0040, MDIO_Data=0x0010, MDIO_EnbOutput=0x0020, ! 618: }; ! 619: #define MDIO_EnbIn (0) ! 620: #define MDIO_WRITE0 (MDIO_EnbOutput) ! 621: #define MDIO_WRITE1 (MDIO_Data | MDIO_EnbOutput) ! 622: ! 623: /* Generate the preamble required for initial synchronization and ! 624: a few older transceivers. */ ! 625: static void mdio_sync(long mdio_addr) ! 626: { ! 627: int bits = 32; ! 628: ! 629: /* Establish sync by sending at least 32 logic ones. */ ! 630: while (--bits >= 0) { ! 631: writel(MDIO_WRITE1, mdio_addr); ! 632: mdio_delay(mdio_addr); ! 633: writel(MDIO_WRITE1 | MDIO_ShiftClk, mdio_addr); ! 634: mdio_delay(mdio_addr); ! 635: } ! 636: } ! 637: ! 638: static int mdio_read(struct net_device *dev, int phy_id, int location) ! 639: { ! 640: long mdio_addr = dev->base_addr + EECtrl; ! 641: int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location; ! 642: int i, retval = 0; ! 643: ! 644: if (mii_preamble_required) ! 645: mdio_sync(mdio_addr); ! 646: ! 647: /* Shift the read command bits out. */ ! 648: for (i = 15; i >= 0; i--) { ! 649: int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; ! 650: ! 651: writel(dataval, mdio_addr); ! 652: mdio_delay(mdio_addr); ! 653: writel(dataval | MDIO_ShiftClk, mdio_addr); ! 654: mdio_delay(mdio_addr); ! 655: } ! 656: /* Read the two transition, 16 data, and wire-idle bits. */ ! 657: for (i = 19; i > 0; i--) { ! 658: writel(MDIO_EnbIn, mdio_addr); ! 659: mdio_delay(mdio_addr); ! 660: retval = (retval << 1) | ((readl(mdio_addr) & MDIO_Data) ? 1 : 0); ! 661: writel(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr); ! 662: mdio_delay(mdio_addr); ! 663: } ! 664: return (retval>>1) & 0xffff; ! 665: } ! 666: ! 667: static void mdio_write(struct net_device *dev, int phy_id, int location, int value) ! 668: { ! 669: long mdio_addr = dev->base_addr + EECtrl; ! 670: int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (location<<18) | value; ! 671: int i; ! 672: ! 673: if (mii_preamble_required) ! 674: mdio_sync(mdio_addr); ! 675: ! 676: /* Shift the command bits out. */ ! 677: for (i = 31; i >= 0; i--) { ! 678: int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; ! 679: ! 680: writel(dataval, mdio_addr); ! 681: mdio_delay(mdio_addr); ! 682: writel(dataval | MDIO_ShiftClk, mdio_addr); ! 683: mdio_delay(mdio_addr); ! 684: } ! 685: /* Clear out extra bits. */ ! 686: for (i = 2; i > 0; i--) { ! 687: writel(MDIO_EnbIn, mdio_addr); ! 688: mdio_delay(mdio_addr); ! 689: writel(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr); ! 690: mdio_delay(mdio_addr); ! 691: } ! 692: return; ! 693: } ! 694: ! 695: static int netdev_open(struct net_device *dev) ! 696: { ! 697: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 698: long ioaddr = dev->base_addr; ! 699: int i; ! 700: u32 intr_status = readl(ioaddr + IntrStatus); ! 701: ! 702: /* We have not yet encountered a case where we need to reset the chip. */ ! 703: ! 704: MOD_INC_USE_COUNT; ! 705: ! 706: if (request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev)) { ! 707: MOD_DEC_USE_COUNT; ! 708: return -EAGAIN; ! 709: } ! 710: ! 711: /* Power up Xcvr. */ ! 712: writel((~CfgXcrOff & readl(ioaddr + ChipConfig)) | 0x00400000, ! 713: ioaddr + ChipConfig); ! 714: if (np->msg_level & NETIF_MSG_IFUP) ! 715: printk(KERN_DEBUG "%s: netdev_open() irq %d intr_status %8.8x.\n", ! 716: dev->name, dev->irq, intr_status); ! 717: ! 718: init_ring(dev); ! 719: ! 720: #if defined(ADDR_64BITS) && defined(__alpha__) ! 721: writel(virt_to_bus(np->rx_ring) >> 32, ioaddr + RxRingPtrHi); ! 722: writel(virt_to_bus(np->tx_ring) >> 32, ioaddr + TxRingPtrHi); ! 723: #else ! 724: writel(0, ioaddr + RxRingPtrHi); ! 725: writel(0, ioaddr + TxRingPtrHi); ! 726: #endif ! 727: writel(virt_to_bus(np->rx_ring), ioaddr + RxRingPtr); ! 728: writel(virt_to_bus(np->tx_ring), ioaddr + TxRingPtr); ! 729: ! 730: for (i = 0; i < 6; i += 2) { ! 731: writel(i, ioaddr + RxFilterAddr); ! 732: writel(dev->dev_addr[i] + (dev->dev_addr[i+1] << 8), ! 733: ioaddr + RxFilterData); ! 734: } ! 735: ! 736: /* Initialize other registers. */ ! 737: /* Configure the PCI bus bursts and FIFO thresholds. */ ! 738: /* Configure for standard, in-spec Ethernet. */ ! 739: ! 740: if (np->full_duplex || ! 741: ((readl(ioaddr + ChipConfig) & CfgFDX) == 0) ^ ! 742: ((np->drv_flags & FDXActiveLow) != 0)) { ! 743: np->tx_config = 0xD0801002; ! 744: np->rx_config = 0x10000020; ! 745: } else { ! 746: np->tx_config = 0x10801002; ! 747: np->rx_config = 0x0020; ! 748: } ! 749: if (dev->mtu > 1500) ! 750: np->rx_config |= 0x08000000; ! 751: writel(np->tx_config, ioaddr + TxConfig); ! 752: writel(np->rx_config, ioaddr + RxConfig); ! 753: if (np->msg_level & NETIF_MSG_IFUP) ! 754: printk(KERN_DEBUG "%s: Setting TxConfig to %8.8x.\n", ! 755: dev->name, (int)readl(ioaddr + TxConfig)); ! 756: ! 757: if (dev->if_port == 0) ! 758: dev->if_port = np->default_port; ! 759: ! 760: np->in_interrupt = 0; ! 761: ! 762: check_duplex(dev); ! 763: set_rx_mode(dev); ! 764: netif_start_tx_queue(dev); ! 765: ! 766: /* Enable interrupts by setting the interrupt mask. */ ! 767: np->intr_enable = IntrNormalSummary | IntrAbnormalSummary | 0x1f; ! 768: writel(np->intr_enable, ioaddr + IntrMask); ! 769: writel(1, ioaddr + IntrEnable); ! 770: ! 771: writel(RxOn | TxOn, ioaddr + ChipCmd); ! 772: writel(4, ioaddr + StatsCtrl); /* Clear Stats */ ! 773: ! 774: if (np->msg_level & NETIF_MSG_IFUP) ! 775: printk(KERN_DEBUG "%s: Done netdev_open(), status: %x.\n", ! 776: dev->name, (int)readl(ioaddr + ChipCmd)); ! 777: ! 778: /* Set the timer to check for link beat. */ ! 779: init_timer(&np->timer); ! 780: np->timer.expires = jiffies + 3*HZ; ! 781: np->timer.data = (unsigned long)dev; ! 782: np->timer.function = &netdev_timer; /* timer handler */ ! 783: add_timer(&np->timer); ! 784: ! 785: return 0; ! 786: } ! 787: ! 788: static void check_duplex(struct net_device *dev) ! 789: { ! 790: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 791: long ioaddr = dev->base_addr; ! 792: int duplex; ! 793: ! 794: if (np->duplex_lock) ! 795: return; ! 796: duplex = readl(ioaddr + ChipConfig) & CfgFDX ? 1 : 0; ! 797: if (np->full_duplex != duplex) { ! 798: np->full_duplex = duplex; ! 799: if (np->msg_level & NETIF_MSG_LINK) ! 800: printk(KERN_INFO "%s: Setting %s-duplex based on negotiated link" ! 801: " capability.\n", dev->name, ! 802: duplex ? "full" : "half"); ! 803: if (duplex) { ! 804: np->rx_config |= 0x10000000; ! 805: np->tx_config |= 0xC0000000; ! 806: } else { ! 807: np->rx_config &= ~0x10000000; ! 808: np->tx_config &= ~0xC0000000; ! 809: } ! 810: writel(np->tx_config, ioaddr + TxConfig); ! 811: writel(np->rx_config, ioaddr + RxConfig); ! 812: if (np->msg_level & NETIF_MSG_LINK) ! 813: printk(KERN_DEBUG "%s: Setting TxConfig to %8.8x (%8.8x).\n", ! 814: dev->name, np->tx_config, (int)readl(ioaddr + TxConfig)); ! 815: } ! 816: } ! 817: ! 818: static void netdev_timer(unsigned long data) ! 819: { ! 820: struct net_device *dev = (struct net_device *)data; ! 821: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 822: long ioaddr = dev->base_addr; ! 823: int next_tick = 10*HZ; ! 824: ! 825: if (np->msg_level & NETIF_MSG_TIMER) ! 826: printk(KERN_DEBUG "%s: Driver monitor timer tick, status %8.8x.\n", ! 827: dev->name, (int)readl(ioaddr + ChipConfig)); ! 828: if (np->rx_q_empty) { ! 829: /* Trigger an interrupt to refill. */ ! 830: writel(SoftIntr, ioaddr + ChipCmd); ! 831: } ! 832: if (netif_queue_paused(dev) && ! 833: np->cur_tx - np->dirty_tx > 1 && ! 834: (jiffies - dev->trans_start) > TX_TIMEOUT) { ! 835: tx_timeout(dev); ! 836: } ! 837: check_duplex(dev); ! 838: np->timer.expires = jiffies + next_tick; ! 839: add_timer(&np->timer); ! 840: } ! 841: ! 842: static void tx_timeout(struct net_device *dev) ! 843: { ! 844: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 845: long ioaddr = dev->base_addr; ! 846: ! 847: printk(KERN_WARNING "%s: Transmit timed out, status %8.8x," ! 848: " resetting...\n", dev->name, (int)readl(ioaddr + TxRingPtr)); ! 849: ! 850: if (np->msg_level & NETIF_MSG_TX_ERR) { ! 851: int i; ! 852: printk(KERN_DEBUG " Rx ring %p: ", np->rx_ring); ! 853: for (i = 0; i < RX_RING_SIZE; i++) ! 854: printk(" %8.8x", (unsigned int)np->rx_ring[i].cmd_status); ! 855: printk("\n"KERN_DEBUG" Tx ring %p: ", np->tx_ring); ! 856: for (i = 0; i < TX_RING_SIZE; i++) ! 857: printk(" %4.4x", np->tx_ring[i].cmd_status); ! 858: printk("\n"); ! 859: } ! 860: ! 861: /* Perhaps we should reinitialize the hardware here. */ ! 862: dev->if_port = 0; ! 863: /* Stop and restart the chip's Tx processes . */ ! 864: ! 865: /* Trigger an immediate transmit demand. */ ! 866: ! 867: dev->trans_start = jiffies; ! 868: np->stats.tx_errors++; ! 869: return; ! 870: } ! 871: ! 872: /* Refill the Rx ring buffers, returning non-zero if not full. */ ! 873: static int rx_ring_fill(struct net_device *dev) ! 874: { ! 875: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 876: unsigned int entry; ! 877: ! 878: for (; np->cur_rx - np->dirty_rx > 0; np->dirty_rx++) { ! 879: entry = np->dirty_rx % RX_RING_SIZE; ! 880: if (np->rx_skbuff[entry] == NULL) { ! 881: struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz); ! 882: np->rx_skbuff[entry] = skb; ! 883: if (skb == NULL) ! 884: return 1; /* Better luck next time. */ ! 885: skb->dev = dev; /* Mark as being used by this device. */ ! 886: np->rx_ring[entry].buf_addr = virt_to_bus(skb->tail); ! 887: } ! 888: np->rx_ring[entry].cmd_status = cpu_to_le32(DescIntr | np->rx_buf_sz); ! 889: } ! 890: return 0; ! 891: } ! 892: ! 893: /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ ! 894: static void init_ring(struct net_device *dev) ! 895: { ! 896: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 897: int i; ! 898: ! 899: np->tx_full = 0; ! 900: np->cur_rx = np->cur_tx = 0; ! 901: np->dirty_rx = np->dirty_tx = 0; ! 902: ! 903: /* MAX(PKT_BUF_SZ, dev->mtu + 8); */ ! 904: /* I know you _want_ to change this without understanding it. Don't. */ ! 905: np->rx_buf_sz = (dev->mtu <= 1532 ? PKT_BUF_SZ : dev->mtu + 8); ! 906: np->rx_head_desc = &np->rx_ring[0]; ! 907: ! 908: /* Initialize all Rx descriptors. */ ! 909: for (i = 0; i < RX_RING_SIZE; i++) { ! 910: np->rx_ring[i].next_desc = virt_to_bus(&np->rx_ring[i+1]); ! 911: np->rx_ring[i].cmd_status = cpu_to_le32(DescOwn); ! 912: np->rx_skbuff[i] = 0; ! 913: } ! 914: /* Mark the last entry as wrapping the ring. */ ! 915: np->rx_ring[i-1].next_desc = virt_to_bus(&np->rx_ring[0]); ! 916: ! 917: for (i = 0; i < TX_RING_SIZE; i++) { ! 918: np->tx_skbuff[i] = 0; ! 919: np->tx_ring[i].next_desc = virt_to_bus(&np->tx_ring[i+1]); ! 920: np->tx_ring[i].cmd_status = 0; ! 921: } ! 922: np->tx_ring[i-1].next_desc = virt_to_bus(&np->tx_ring[0]); ! 923: ! 924: /* Fill in the Rx buffers. ! 925: Allocation failure just leaves a "negative" np->dirty_rx. */ ! 926: np->dirty_rx = (unsigned int)(0 - RX_RING_SIZE); ! 927: rx_ring_fill(dev); ! 928: ! 929: return; ! 930: } ! 931: ! 932: static int start_tx(struct sk_buff *skb, struct net_device *dev) ! 933: { ! 934: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 935: unsigned int entry; ! 936: ! 937: /* Block a timer-based transmit from overlapping. This happens when ! 938: packets are presumed lost, and we use this check the Tx status. */ ! 939: if (netif_pause_tx_queue(dev) != 0) { ! 940: /* This watchdog code is redundant with the media monitor timer. */ ! 941: if (jiffies - dev->trans_start > TX_TIMEOUT) ! 942: tx_timeout(dev); ! 943: return 1; ! 944: } ! 945: ! 946: /* Note: Ordering is important here, set the field with the ! 947: "ownership" bit last, and only then increment cur_tx. ! 948: No spinlock is needed for either Tx or Rx. ! 949: */ ! 950: ! 951: /* Calculate the next Tx descriptor entry. */ ! 952: entry = np->cur_tx % TX_RING_SIZE; ! 953: ! 954: np->tx_skbuff[entry] = skb; ! 955: ! 956: np->tx_ring[entry].buf_addr = virt_to_bus(skb->data); ! 957: np->tx_ring[entry].cmd_status = cpu_to_le32(DescOwn|DescIntr | skb->len); ! 958: np->cur_tx++; ! 959: ! 960: /* StrongARM: Explicitly cache flush np->tx_ring and skb->data,skb->len. */ ! 961: ! 962: if (np->cur_tx - np->dirty_tx >= TX_QUEUE_LEN - 1) { ! 963: np->tx_full = 1; ! 964: /* Check for a just-cleared queue. */ ! 965: if (np->cur_tx - (volatile unsigned int)np->dirty_tx ! 966: < TX_QUEUE_LEN - 4) { ! 967: np->tx_full = 0; ! 968: netif_unpause_tx_queue(dev); ! 969: } else ! 970: netif_stop_tx_queue(dev); ! 971: } else ! 972: netif_unpause_tx_queue(dev); /* Typical path */ ! 973: /* Wake the potentially-idle transmit channel. */ ! 974: writel(TxOn, dev->base_addr + ChipCmd); ! 975: ! 976: dev->trans_start = jiffies; ! 977: ! 978: if (np->msg_level & NETIF_MSG_TX_QUEUED) { ! 979: printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n", ! 980: dev->name, np->cur_tx, entry); ! 981: } ! 982: return 0; ! 983: } ! 984: ! 985: /* The interrupt handler does all of the Rx thread work and cleans up ! 986: after the Tx thread. */ ! 987: static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) ! 988: { ! 989: struct net_device *dev = (struct net_device *)dev_instance; ! 990: struct netdev_private *np; ! 991: long ioaddr; ! 992: int boguscnt; ! 993: ! 994: #ifndef final_version /* Can never occur. */ ! 995: if (dev == NULL) { ! 996: printk (KERN_ERR "Netdev interrupt handler(): IRQ %d for unknown " ! 997: "device.\n", irq); ! 998: return; ! 999: } ! 1000: #endif ! 1001: ! 1002: ioaddr = dev->base_addr; ! 1003: np = (struct netdev_private *)dev->priv; ! 1004: boguscnt = np->max_interrupt_work; ! 1005: ! 1006: #if defined(__i386__) && LINUX_VERSION_CODE < 0x020300 ! 1007: /* A lock to prevent simultaneous entry bug on Intel SMP machines. */ ! 1008: if (test_and_set_bit(0, (void*)&dev->interrupt)) { ! 1009: printk(KERN_ERR"%s: SMP simultaneous entry of an interrupt handler.\n", ! 1010: dev->name); ! 1011: dev->interrupt = 0; /* Avoid halting machine. */ ! 1012: return; ! 1013: } ! 1014: #endif ! 1015: ! 1016: do { ! 1017: u32 intr_status = readl(ioaddr + IntrStatus); ! 1018: ! 1019: if (np->msg_level & NETIF_MSG_INTR) ! 1020: printk(KERN_DEBUG "%s: Interrupt, status %8.8x.\n", ! 1021: dev->name, intr_status); ! 1022: ! 1023: if (intr_status == 0 || intr_status == 0xffffffff) ! 1024: break; ! 1025: ! 1026: /* Acknowledge all of the current interrupt sources ASAP. ! 1027: Nominally the read above accomplishes this, but... */ ! 1028: writel(intr_status & 0x001ffff, ioaddr + IntrStatus); ! 1029: ! 1030: if (intr_status & (IntrRxDone | IntrRxIntr)) { ! 1031: netdev_rx(dev); ! 1032: np->rx_q_empty = rx_ring_fill(dev); ! 1033: } ! 1034: ! 1035: if (intr_status & (IntrRxIdle | IntrDrv)) { ! 1036: unsigned int old_dirty_rx = np->dirty_rx; ! 1037: if (rx_ring_fill(dev) == 0) ! 1038: np->rx_q_empty = 0; ! 1039: /* Restart Rx engine iff we did add a buffer. */ ! 1040: if (np->dirty_rx != old_dirty_rx) ! 1041: writel(RxOn, dev->base_addr + ChipCmd); ! 1042: } ! 1043: ! 1044: for (; np->cur_tx - np->dirty_tx > 0; np->dirty_tx++) { ! 1045: int entry = np->dirty_tx % TX_RING_SIZE; ! 1046: if (np->msg_level & NETIF_MSG_INTR) ! 1047: printk(KERN_DEBUG "%s: Tx entry %d @%p status %8.8x.\n", ! 1048: dev->name, entry, &np->tx_ring[entry], ! 1049: np->tx_ring[entry].cmd_status); ! 1050: if (np->tx_ring[entry].cmd_status & cpu_to_le32(DescOwn)) ! 1051: break; ! 1052: if (np->tx_ring[entry].cmd_status & cpu_to_le32(0x08000000)) { ! 1053: if (np->msg_level & NETIF_MSG_TX_DONE) ! 1054: printk(KERN_DEBUG "%s: Transmit done, Tx status %8.8x.\n", ! 1055: dev->name, np->tx_ring[entry].cmd_status); ! 1056: np->stats.tx_packets++; ! 1057: #if LINUX_VERSION_CODE > 0x20127 ! 1058: np->stats.tx_bytes += np->tx_skbuff[entry]->len; ! 1059: #endif ! 1060: } else { /* Various Tx errors */ ! 1061: int tx_status = le32_to_cpu(np->tx_ring[entry].cmd_status); ! 1062: if (tx_status & 0x04010000) np->stats.tx_aborted_errors++; ! 1063: if (tx_status & 0x02000000) np->stats.tx_fifo_errors++; ! 1064: if (tx_status & 0x01000000) np->stats.tx_carrier_errors++; ! 1065: if (tx_status & 0x00200000) np->stats.tx_window_errors++; ! 1066: if (np->msg_level & NETIF_MSG_TX_ERR) ! 1067: printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n", ! 1068: dev->name, tx_status); ! 1069: np->stats.tx_errors++; ! 1070: } ! 1071: /* Free the original skb. */ ! 1072: dev_free_skb_irq(np->tx_skbuff[entry]); ! 1073: np->tx_skbuff[entry] = 0; ! 1074: } ! 1075: /* Note the 4 slot hysteresis to mark the queue non-full. */ ! 1076: if (np->tx_full ! 1077: && np->cur_tx - np->dirty_tx < TX_QUEUE_LEN - 4) { ! 1078: /* The ring is no longer full, allow new TX entries. */ ! 1079: np->tx_full = 0; ! 1080: netif_resume_tx_queue(dev); ! 1081: } ! 1082: ! 1083: /* Abnormal error summary/uncommon events handlers. */ ! 1084: if (intr_status & IntrAbnormalSummary) ! 1085: netdev_error(dev, intr_status); ! 1086: ! 1087: if (--boguscnt < 0) { ! 1088: printk(KERN_WARNING "%s: Too much work at interrupt, " ! 1089: "status=0x%4.4x.\n", ! 1090: dev->name, intr_status); ! 1091: np->restore_intr_enable = 1; ! 1092: break; ! 1093: } ! 1094: } while (1); ! 1095: ! 1096: if (np->msg_level & NETIF_MSG_INTR) ! 1097: printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n", ! 1098: dev->name, (int)readl(ioaddr + IntrStatus)); ! 1099: ! 1100: #if defined(__i386__) && LINUX_VERSION_CODE < 0x020300 ! 1101: clear_bit(0, (void*)&dev->interrupt); ! 1102: #endif ! 1103: return; ! 1104: } ! 1105: ! 1106: /* This routine is logically part of the interrupt handler, but separated ! 1107: for clarity and better register allocation. */ ! 1108: static int netdev_rx(struct net_device *dev) ! 1109: { ! 1110: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 1111: int entry = np->cur_rx % RX_RING_SIZE; ! 1112: int boguscnt = np->dirty_rx + RX_RING_SIZE - np->cur_rx; ! 1113: s32 desc_status = le32_to_cpu(np->rx_head_desc->cmd_status); ! 1114: ! 1115: /* If the driver owns the next entry it's a new packet. Send it up. */ ! 1116: while (desc_status < 0) { /* e.g. & DescOwn */ ! 1117: if (np->msg_level & NETIF_MSG_RX_STATUS) ! 1118: printk(KERN_DEBUG " In netdev_rx() entry %d status was %8.8x.\n", ! 1119: entry, desc_status); ! 1120: if (--boguscnt < 0) ! 1121: break; ! 1122: if ((desc_status & (DescMore|DescPktOK|RxTooLong)) != DescPktOK) { ! 1123: if (desc_status & DescMore) { ! 1124: printk(KERN_WARNING "%s: Oversized(?) Ethernet frame spanned " ! 1125: "multiple buffers, entry %#x status %x.\n", ! 1126: dev->name, np->cur_rx, desc_status); ! 1127: np->stats.rx_length_errors++; ! 1128: } else { ! 1129: /* There was a error. */ ! 1130: if (np->msg_level & NETIF_MSG_RX_ERR) ! 1131: printk(KERN_DEBUG " netdev_rx() Rx error was %8.8x.\n", ! 1132: desc_status); ! 1133: np->stats.rx_errors++; ! 1134: if (desc_status & 0x06000000) np->stats.rx_over_errors++; ! 1135: if (desc_status & 0x00600000) np->stats.rx_length_errors++; ! 1136: if (desc_status & 0x00140000) np->stats.rx_frame_errors++; ! 1137: if (desc_status & 0x00080000) np->stats.rx_crc_errors++; ! 1138: } ! 1139: } else { ! 1140: struct sk_buff *skb; ! 1141: int pkt_len = (desc_status & 0x0fff) - 4; /* Omit CRC size. */ ! 1142: /* Check if the packet is long enough to accept without copying ! 1143: to a minimally-sized skbuff. */ ! 1144: if (pkt_len < np->rx_copybreak ! 1145: && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { ! 1146: skb->dev = dev; ! 1147: skb_reserve(skb, 2); /* 16 byte align the IP header */ ! 1148: #if HAS_IP_COPYSUM ! 1149: eth_copy_and_sum(skb, np->rx_skbuff[entry]->tail, pkt_len, 0); ! 1150: skb_put(skb, pkt_len); ! 1151: #else ! 1152: memcpy(skb_put(skb, pkt_len), np->rx_skbuff[entry]->tail, ! 1153: pkt_len); ! 1154: #endif ! 1155: } else { ! 1156: skb_put(skb = np->rx_skbuff[entry], pkt_len); ! 1157: np->rx_skbuff[entry] = NULL; ! 1158: } ! 1159: #ifndef final_version /* Remove after testing. */ ! 1160: /* You will want this info for the initial debug. */ ! 1161: if (np->msg_level & NETIF_MSG_PKTDATA) ! 1162: printk(KERN_DEBUG " Rx data %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:" ! 1163: "%2.2x %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x %2.2x%2.2x " ! 1164: "%d.%d.%d.%d.\n", ! 1165: skb->data[0], skb->data[1], skb->data[2], skb->data[3], ! 1166: skb->data[4], skb->data[5], skb->data[6], skb->data[7], ! 1167: skb->data[8], skb->data[9], skb->data[10], ! 1168: skb->data[11], skb->data[12], skb->data[13], ! 1169: skb->data[14], skb->data[15], skb->data[16], ! 1170: skb->data[17]); ! 1171: #endif ! 1172: skb->protocol = eth_type_trans(skb, dev); ! 1173: /* W/ hardware checksum: skb->ip_summed = CHECKSUM_UNNECESSARY; */ ! 1174: netif_rx(skb); ! 1175: dev->last_rx = jiffies; ! 1176: np->stats.rx_packets++; ! 1177: #if LINUX_VERSION_CODE > 0x20127 ! 1178: np->stats.rx_bytes += pkt_len; ! 1179: #endif ! 1180: } ! 1181: entry = (++np->cur_rx) % RX_RING_SIZE; ! 1182: np->rx_head_desc = &np->rx_ring[entry]; ! 1183: desc_status = le32_to_cpu(np->rx_head_desc->cmd_status); ! 1184: } ! 1185: ! 1186: /* Refill is now done in the main interrupt loop. */ ! 1187: return 0; ! 1188: } ! 1189: ! 1190: static void netdev_error(struct net_device *dev, int intr_status) ! 1191: { ! 1192: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 1193: long ioaddr = dev->base_addr; ! 1194: ! 1195: if (intr_status & LinkChange) { ! 1196: int chip_config = readl(ioaddr + ChipConfig); ! 1197: if (np->msg_level & NETIF_MSG_LINK) ! 1198: printk(KERN_NOTICE "%s: Link changed: Autonegotiation advertising" ! 1199: " %4.4x partner %4.4x.\n", dev->name, ! 1200: (int)readl(ioaddr + 0x90), (int)readl(ioaddr + 0x94)); ! 1201: if (chip_config & CfgLinkGood) ! 1202: netif_link_up(dev); ! 1203: else ! 1204: netif_link_down(dev); ! 1205: check_duplex(dev); ! 1206: } ! 1207: if (intr_status & StatsMax) { ! 1208: get_stats(dev); ! 1209: } ! 1210: if (intr_status & IntrTxUnderrun) { ! 1211: /* Increase the Tx threshold, 32 byte units. */ ! 1212: if ((np->tx_config & 0x3f) < 62) ! 1213: np->tx_config += 2; /* +64 bytes */ ! 1214: writel(np->tx_config, ioaddr + TxConfig); ! 1215: } ! 1216: if (intr_status & WOLPkt) { ! 1217: int wol_status = readl(ioaddr + WOLCmd); ! 1218: printk(KERN_NOTICE "%s: Link wake-up event %8.8x", ! 1219: dev->name, wol_status); ! 1220: } ! 1221: if (intr_status & (RxStatusOverrun | IntrRxOverrun)) { ! 1222: if (np->msg_level & NETIF_MSG_DRV) ! 1223: printk(KERN_ERR "%s: Rx overflow! ns820 %8.8x.\n", ! 1224: dev->name, intr_status); ! 1225: np->stats.rx_fifo_errors++; ! 1226: } ! 1227: if (intr_status & ~(LinkChange|StatsMax|RxResetDone|TxResetDone| ! 1228: RxStatusOverrun|0xA7ff)) { ! 1229: if (np->msg_level & NETIF_MSG_DRV) ! 1230: printk(KERN_ERR "%s: Something Wicked happened! ns820 %8.8x.\n", ! 1231: dev->name, intr_status); ! 1232: } ! 1233: /* Hmmmmm, it's not clear how to recover from PCI faults. */ ! 1234: if (intr_status & IntrPCIErr) { ! 1235: np->stats.tx_fifo_errors++; ! 1236: np->stats.rx_fifo_errors++; ! 1237: } ! 1238: } ! 1239: ! 1240: static struct net_device_stats *get_stats(struct net_device *dev) ! 1241: { ! 1242: long ioaddr = dev->base_addr; ! 1243: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 1244: int crc_errs = readl(ioaddr + RxCRCErrs); ! 1245: ! 1246: if (crc_errs != 0xffffffff) { ! 1247: /* We need not lock this segment of code for SMP. ! 1248: There is no atomic-add vulnerability for most CPUs, ! 1249: and statistics are non-critical. */ ! 1250: /* The chip only need report frame silently dropped. */ ! 1251: np->stats.rx_crc_errors += crc_errs; ! 1252: np->stats.rx_missed_errors += readl(ioaddr + RxMissed); ! 1253: } ! 1254: ! 1255: return &np->stats; ! 1256: } ! 1257: ! 1258: /* The little-endian AUTODIN II ethernet CRC calculations. ! 1259: A big-endian version is also available. ! 1260: This is slow but compact code. Do not use this routine for bulk data, ! 1261: use a table-based routine instead. ! 1262: This is common code and should be moved to net/core/crc.c. ! 1263: Chips may use the upper or lower CRC bits, and may reverse and/or invert ! 1264: them. Select the endian-ness that results in minimal calculations. ! 1265: */ ! 1266: static unsigned const ethernet_polynomial_le = 0xedb88320U; ! 1267: static inline unsigned ether_crc_le(int length, unsigned char *data) ! 1268: { ! 1269: unsigned int crc = 0xffffffff; /* Initial value. */ ! 1270: while(--length >= 0) { ! 1271: unsigned char current_octet = *data++; ! 1272: int bit; ! 1273: for (bit = 8; --bit >= 0; current_octet >>= 1) { ! 1274: if ((crc ^ current_octet) & 1) { ! 1275: crc >>= 1; ! 1276: crc ^= ethernet_polynomial_le; ! 1277: } else ! 1278: crc >>= 1; ! 1279: } ! 1280: } ! 1281: return crc; ! 1282: } ! 1283: ! 1284: static void set_rx_mode(struct net_device *dev) ! 1285: { ! 1286: long ioaddr = dev->base_addr; ! 1287: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 1288: u8 mc_filter[64]; /* Multicast hash filter */ ! 1289: u32 rx_mode; ! 1290: ! 1291: if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ ! 1292: /* Unconditionally log net taps. */ ! 1293: printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name); ! 1294: rx_mode = AcceptBroadcast | AcceptAllMulticast | AcceptAllPhys ! 1295: | AcceptMyPhys; ! 1296: } else if ((dev->mc_count > np->multicast_filter_limit) ! 1297: || (dev->flags & IFF_ALLMULTI)) { ! 1298: rx_mode = AcceptBroadcast | AcceptAllMulticast | AcceptMyPhys; ! 1299: } else { ! 1300: struct dev_mc_list *mclist; ! 1301: int i; ! 1302: memset(mc_filter, 0, sizeof(mc_filter)); ! 1303: for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; ! 1304: i++, mclist = mclist->next) { ! 1305: set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x7ff, ! 1306: mc_filter); ! 1307: } ! 1308: rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys; ! 1309: for (i = 0; i < 64; i += 2) { ! 1310: writel(rx_mode + 0x200 + i, ioaddr + RxFilterAddr); ! 1311: writel((mc_filter[i+1]<<8) + mc_filter[i], ioaddr + RxFilterData); ! 1312: } ! 1313: } ! 1314: writel(rx_mode, ioaddr + RxFilterAddr); ! 1315: np->cur_rx_mode = rx_mode; ! 1316: } ! 1317: ! 1318: static int mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ! 1319: { ! 1320: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 1321: u16 *data = (u16 *)&rq->ifr_data; ! 1322: u32 *data32 = (void *)&rq->ifr_data; ! 1323: ! 1324: switch(cmd) { ! 1325: case 0x8947: case 0x89F0: ! 1326: /* SIOCGMIIPHY: Get the address of the PHY in use. */ ! 1327: data[0] = 1; ! 1328: /* Fall Through */ ! 1329: case 0x8948: case 0x89F1: ! 1330: /* SIOCGMIIREG: Read the specified MII register. */ ! 1331: data[3] = mdio_read(dev, data[0] & 0x1f, data[1] & 0x1f); ! 1332: return 0; ! 1333: case 0x8949: case 0x89F2: ! 1334: /* SIOCSMIIREG: Write the specified MII register */ ! 1335: if (!capable(CAP_NET_ADMIN)) ! 1336: return -EPERM; ! 1337: if (data[0] == 1) { ! 1338: u16 miireg = data[1] & 0x1f; ! 1339: u16 value = data[2]; ! 1340: switch (miireg) { ! 1341: case 0: ! 1342: /* Check for autonegotiation on or reset. */ ! 1343: np->duplex_lock = (value & 0x9000) ? 0 : 1; ! 1344: if (np->duplex_lock) ! 1345: np->full_duplex = (value & 0x0100) ? 1 : 0; ! 1346: break; ! 1347: case 4: np->advertising = value; break; ! 1348: } ! 1349: } ! 1350: mdio_write(dev, data[0] & 0x1f, data[1] & 0x1f, data[2]); ! 1351: return 0; ! 1352: case SIOCGPARAMS: ! 1353: data32[0] = np->msg_level; ! 1354: data32[1] = np->multicast_filter_limit; ! 1355: data32[2] = np->max_interrupt_work; ! 1356: data32[3] = np->rx_copybreak; ! 1357: return 0; ! 1358: case SIOCSPARAMS: ! 1359: if (!capable(CAP_NET_ADMIN)) ! 1360: return -EPERM; ! 1361: np->msg_level = data32[0]; ! 1362: np->multicast_filter_limit = data32[1]; ! 1363: np->max_interrupt_work = data32[2]; ! 1364: np->rx_copybreak = data32[3]; ! 1365: return 0; ! 1366: default: ! 1367: return -EOPNOTSUPP; ! 1368: } ! 1369: } ! 1370: ! 1371: static int netdev_close(struct net_device *dev) ! 1372: { ! 1373: long ioaddr = dev->base_addr; ! 1374: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 1375: int i; ! 1376: ! 1377: netif_stop_tx_queue(dev); ! 1378: ! 1379: if (np->msg_level & NETIF_MSG_IFDOWN) { ! 1380: printk(KERN_DEBUG "%s: Shutting down ethercard, status was %4.4x " ! 1381: "Int %2.2x.\n", ! 1382: dev->name, (int)readl(ioaddr + ChipCmd), ! 1383: (int)readl(ioaddr + IntrStatus)); ! 1384: printk(KERN_DEBUG "%s: Queue pointers were Tx %d / %d, Rx %d / %d.\n", ! 1385: dev->name, np->cur_tx, np->dirty_tx, np->cur_rx, np->dirty_rx); ! 1386: } ! 1387: ! 1388: /* We don't want the timer to re-start anything. */ ! 1389: del_timer(&np->timer); ! 1390: ! 1391: /* Disable interrupts using the mask. */ ! 1392: writel(0, ioaddr + IntrMask); ! 1393: writel(0, ioaddr + IntrEnable); ! 1394: writel(2, ioaddr + StatsCtrl); /* Freeze Stats */ ! 1395: ! 1396: /* Stop the chip's Tx and Rx processes. */ ! 1397: writel(RxOff | TxOff, ioaddr + ChipCmd); ! 1398: ! 1399: get_stats(dev); ! 1400: ! 1401: #ifdef __i386__ ! 1402: if (np->msg_level & NETIF_MSG_IFDOWN) { ! 1403: printk("\n"KERN_DEBUG" Tx ring at %8.8x:\n", ! 1404: (int)virt_to_bus(np->tx_ring)); ! 1405: for (i = 0; i < TX_RING_SIZE; i++) ! 1406: printk(" #%d desc. %8.8x %8.8x.\n", ! 1407: i, np->tx_ring[i].cmd_status, (u32)np->tx_ring[i].buf_addr); ! 1408: printk("\n"KERN_DEBUG " Rx ring %8.8x:\n", ! 1409: (int)virt_to_bus(np->rx_ring)); ! 1410: for (i = 0; i < RX_RING_SIZE; i++) { ! 1411: printk(KERN_DEBUG " #%d desc. %8.8x %8.8x\n", ! 1412: i, np->rx_ring[i].cmd_status, (u32)np->rx_ring[i].buf_addr); ! 1413: } ! 1414: } ! 1415: #endif /* __i386__ debugging only */ ! 1416: ! 1417: free_irq(dev->irq, dev); ! 1418: ! 1419: /* Free all the skbuffs in the Rx queue. */ ! 1420: for (i = 0; i < RX_RING_SIZE; i++) { ! 1421: np->rx_ring[i].cmd_status = 0; ! 1422: np->rx_ring[i].buf_addr = 0xBADF00D0; /* An invalid address. */ ! 1423: if (np->rx_skbuff[i]) { ! 1424: #if LINUX_VERSION_CODE < 0x20100 ! 1425: np->rx_skbuff[i]->free = 1; ! 1426: #endif ! 1427: dev_free_skb(np->rx_skbuff[i]); ! 1428: } ! 1429: np->rx_skbuff[i] = 0; ! 1430: } ! 1431: for (i = 0; i < TX_RING_SIZE; i++) { ! 1432: if (np->tx_skbuff[i]) ! 1433: dev_free_skb(np->tx_skbuff[i]); ! 1434: np->tx_skbuff[i] = 0; ! 1435: } ! 1436: ! 1437: /* Power down Xcvr. */ ! 1438: writel(CfgXcrOff | readl(ioaddr + ChipConfig), ioaddr + ChipConfig); ! 1439: ! 1440: MOD_DEC_USE_COUNT; ! 1441: ! 1442: return 0; ! 1443: } ! 1444: ! 1445: static int power_event(void *dev_instance, int event) ! 1446: { ! 1447: struct net_device *dev = dev_instance; ! 1448: struct netdev_private *np = (struct netdev_private *)dev->priv; ! 1449: long ioaddr = dev->base_addr; ! 1450: ! 1451: if (np->msg_level & NETIF_MSG_LINK) ! 1452: printk(KERN_DEBUG "%s: Handling power event %d.\n", dev->name, event); ! 1453: switch(event) { ! 1454: case DRV_ATTACH: ! 1455: MOD_INC_USE_COUNT; ! 1456: break; ! 1457: case DRV_SUSPEND: ! 1458: /* Disable interrupts, freeze stats, stop Tx and Rx. */ ! 1459: writel(0, ioaddr + IntrEnable); ! 1460: writel(2, ioaddr + StatsCtrl); ! 1461: writel(RxOff | TxOff, ioaddr + ChipCmd); ! 1462: writel(CfgXcrOff | readl(ioaddr + ChipConfig), ioaddr + ChipConfig); ! 1463: break; ! 1464: case DRV_RESUME: ! 1465: /* This is incomplete: the open() actions should be repeated. */ ! 1466: writel(~CfgXcrOff & readl(ioaddr + ChipConfig), ioaddr + ChipConfig); ! 1467: set_rx_mode(dev); ! 1468: writel(np->intr_enable, ioaddr + IntrEnable); ! 1469: writel(1, ioaddr + IntrEnable); ! 1470: writel(RxOn | TxOn, ioaddr + ChipCmd); ! 1471: break; ! 1472: case DRV_DETACH: { ! 1473: struct net_device **devp, **next; ! 1474: if (dev->flags & IFF_UP) { ! 1475: /* Some, but not all, kernel versions close automatically. */ ! 1476: dev_close(dev); ! 1477: dev->flags &= ~(IFF_UP|IFF_RUNNING); ! 1478: } ! 1479: unregister_netdev(dev); ! 1480: release_region(dev->base_addr, pci_id_tbl[np->chip_id].io_size); ! 1481: for (devp = &root_net_dev; *devp; devp = next) { ! 1482: next = &((struct netdev_private *)(*devp)->priv)->next_module; ! 1483: if (*devp == dev) { ! 1484: *devp = *next; ! 1485: break; ! 1486: } ! 1487: } ! 1488: if (np->priv_addr) ! 1489: kfree(np->priv_addr); ! 1490: kfree(dev); ! 1491: MOD_DEC_USE_COUNT; ! 1492: break; ! 1493: } ! 1494: } ! 1495: ! 1496: return 0; ! 1497: } ! 1498: ! 1499: ! 1500: #ifdef MODULE ! 1501: int init_module(void) ! 1502: { ! 1503: /* Emit version even if no cards detected. */ ! 1504: printk(KERN_INFO "%s" KERN_INFO "%s", version1, version2); ! 1505: #ifdef CARDBUS ! 1506: register_driver(ðerdev_ops); ! 1507: return 0; ! 1508: #else ! 1509: return pci_drv_register(&ns820_drv_id, NULL); ! 1510: #endif ! 1511: } ! 1512: ! 1513: void cleanup_module(void) ! 1514: { ! 1515: struct net_device *next_dev; ! 1516: ! 1517: #ifdef CARDBUS ! 1518: unregister_driver(ðerdev_ops); ! 1519: #else ! 1520: pci_drv_unregister(&ns820_drv_id); ! 1521: #endif ! 1522: ! 1523: /* No need to check MOD_IN_USE, as sys_delete_module() checks. */ ! 1524: while (root_net_dev) { ! 1525: struct netdev_private *np = (void *)(root_net_dev->priv); ! 1526: unregister_netdev(root_net_dev); ! 1527: iounmap((char *)root_net_dev->base_addr); ! 1528: next_dev = np->next_module; ! 1529: if (np->priv_addr) ! 1530: kfree(np->priv_addr); ! 1531: kfree(root_net_dev); ! 1532: root_net_dev = next_dev; ! 1533: } ! 1534: } ! 1535: ! 1536: #endif /* MODULE */ ! 1537: ! 1538: /* ! 1539: * Local variables: ! 1540: * compile-command: "make KERNVER=`uname -r` ns820.o" ! 1541: * compile-cmd: "gcc -DMODULE -Wall -Wstrict-prototypes -O6 -c ns820.c" ! 1542: * simple-compile-command: "gcc -DMODULE -O6 -c ns820.c" ! 1543: * c-indent-level: 4 ! 1544: * c-basic-offset: 4 ! 1545: * tab-width: 4 ! 1546: * End: ! 1547: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.