|
|
1.1 ! root 1: /* drivers/net/eepro100.c: An Intel i82557-559 Ethernet driver for Linux. */ ! 2: /* ! 3: NOTICE: this version of the driver is supposed to work with 2.2 kernels. ! 4: Written 1996-1999 by Donald Becker. ! 5: ! 6: This software may be used and distributed according to the terms ! 7: of the GNU Public License, incorporated herein by reference. ! 8: ! 9: This driver is for the Intel EtherExpress Pro100 (Speedo3) design. ! 10: It should work with all i82557/558/559 boards. ! 11: ! 12: To use as a module, use the compile-command at the end of the file. ! 13: ! 14: The author may be reached as [email protected], or C/O ! 15: Center of Excellence in Space Data and Information Sciences ! 16: Code 930.5, NASA Goddard Space Flight Center, Greenbelt MD 20771 ! 17: For updates see ! 18: http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.html ! 19: For installation instructions ! 20: http://cesdis.gsfc.nasa.gov/linux/misc/modules.html ! 21: There is a Majordomo mailing list based at ! 22: [email protected] ! 23: ! 24: The driver also contains updates by different kernel developers. ! 25: This driver clone is maintained by Andrey V. Savochkin <[email protected]>. ! 26: Please use this email address and linux-kernel mailing list for bug reports. ! 27: ! 28: Modification history: ! 29: 2000 Mar 24 Dragan Stancevic <[email protected]> ! 30: Disabled FC and ER, to avoid lockups when when we get FCP interrupts. ! 31: 2000 May 27 Andrey Moruga <[email protected]> ! 32: Code duplication for 82559ER support was removed. ! 33: Accurate handling of all supported chips was implemented. ! 34: Some fixes in 2.3 clone of the driver were ported. ! 35: 2000 May 30 Dragan Stancevic <[email protected]> and ! 36: Andrey Moruga <[email protected]> ! 37: Honor PortReset timing specification. ! 38: 2000 Jul 25 Dragan Stancevic <[email protected]> ! 39: Changed to MMIO, resized FIFOs, resized rings, changed ISR timeout ! 40: Problem reported by: ! 41: Marc MERLIN <[email protected]> ! 42: 2000 Nov 15 Dragan Stancevic <[email protected]> ! 43: Changed command completion time and added debug info as to which ! 44: CMD timed out. Problem reported by: ! 45: "Ulrich Windl" <[email protected]> ! 46: */ ! 47: ! 48: #define USE_IO ! 49: static const char *version = ! 50: "eepro100.c:v1.09j-t 9/29/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.html\n" ! 51: "eepro100.c: $Revision: 1.1 $ 2000/05/31 Modified by Andrey V. Savochkin <[email protected]> and others\n" ! 52: "eepro100.c: VA Linux custom, Dragan Stancevic <[email protected]> 2000/11/15\n"; ! 53: ! 54: /* A few user-configurable values that apply to all boards. ! 55: First set is undocumented and spelled per Intel recommendations. */ ! 56: ! 57: static int congenb = 0; /* Enable congestion control in the DP83840. */ ! 58: static int txfifo = 0; /* Tx FIFO threshold in 4 byte units, 0-15 */ ! 59: static int rxfifo = 0xF; /* Rx FIFO threshold, default 32 bytes. */ ! 60: /* Tx/Rx DMA burst length, 0-127, 0 == no preemption, tx==128 -> disabled. */ ! 61: static int txdmacount = 128; ! 62: static int rxdmacount = 0; ! 63: ! 64: /* Set the copy breakpoint for the copy-only-tiny-buffer Rx method. ! 65: Lower values use more memory, but are faster. */ ! 66: #if defined(__alpha__) || defined(__sparc__) ! 67: /* force copying of all packets to avoid unaligned accesses on Alpha */ ! 68: static int rx_copybreak = 1518; ! 69: #else ! 70: static int rx_copybreak = 200; ! 71: #endif ! 72: ! 73: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ ! 74: static int max_interrupt_work = 200; ! 75: ! 76: /* Maximum number of multicast addresses to filter (vs. rx-all-multicast) */ ! 77: static int multicast_filter_limit = 64; ! 78: ! 79: /* 'options' is used to pass a transceiver override or full-duplex flag ! 80: e.g. "options=16" for FD, "options=32" for 100mbps-only. */ ! 81: static int full_duplex[] = {-1, -1, -1, -1, -1, -1, -1, -1}; ! 82: static int options[] = {-1, -1, -1, -1, -1, -1, -1, -1}; ! 83: #ifdef MODULE ! 84: static int debug = -1; /* The debug level */ ! 85: #endif ! 86: ! 87: /* A few values that may be tweaked. */ ! 88: /* The ring sizes should be a power of two for efficiency. */ ! 89: #define TX_RING_SIZE 64 ! 90: #define RX_RING_SIZE 64 ! 91: /* How much slots multicast filter setup may take. ! 92: Do not descrease without changing set_rx_mode() implementaion. */ ! 93: #define TX_MULTICAST_SIZE 2 ! 94: #define TX_MULTICAST_RESERV (TX_MULTICAST_SIZE*2) ! 95: /* Actual number of TX packets queued, must be ! 96: <= TX_RING_SIZE-TX_MULTICAST_RESERV. */ ! 97: #define TX_QUEUE_LIMIT (TX_RING_SIZE-TX_MULTICAST_RESERV) ! 98: /* Hysteresis marking queue as no longer full. */ ! 99: #define TX_QUEUE_UNFULL (TX_QUEUE_LIMIT-4) ! 100: ! 101: /* Operational parameters that usually are not changed. */ ! 102: ! 103: /* Time in jiffies before concluding the transmitter is hung. */ ! 104: #define TX_TIMEOUT (2*HZ) ! 105: /* Size of an pre-allocated Rx buffer: <Ethernet MTU> + slack.*/ ! 106: #define PKT_BUF_SZ 1536 ! 107: ! 108: #if !defined(__OPTIMIZE__) || !defined(__KERNEL__) ! 109: #warning You must compile this file with the correct options! ! 110: #warning See the last lines of the source file. ! 111: #error You must compile this driver with "-O". ! 112: #endif ! 113: ! 114: #include <linux/version.h> ! 115: #include <linux/module.h> ! 116: #if defined(MODVERSIONS) ! 117: #include <linux/modversions.h> ! 118: #endif ! 119: ! 120: #include <linux/kernel.h> ! 121: #include <linux/string.h> ! 122: #include <linux/timer.h> ! 123: #include <linux/errno.h> ! 124: #include <linux/ioport.h> ! 125: #include <linux/malloc.h> ! 126: #include <linux/interrupt.h> ! 127: #include <linux/pci.h> ! 128: #include <linux/compatmac.h> ! 129: #include <asm/spinlock.h> ! 130: #include <asm/processor.h> ! 131: #include <asm/bitops.h> ! 132: #include <asm/io.h> ! 133: /* #include <asm/unaligned.h> */ ! 134: /* #include <asm/byteorder.h> */ ! 135: #define __LITTLE_ENDIAN ! 136: #include <asm/hardirq.h> ! 137: ! 138: #include <linux/netdevice.h> ! 139: #include <linux/etherdevice.h> ! 140: #include <linux/skbuff.h> ! 141: #include <linux/delay.h> ! 142: ! 143: #if defined(MODULE) && (LINUX_VERSION_CODE > 0x20115) ! 144: MODULE_AUTHOR("Maintainer: Andrey V. Savochkin <[email protected]>"); ! 145: MODULE_DESCRIPTION("Intel i82557/i82558 PCI EtherExpressPro driver"); ! 146: MODULE_PARM(debug, "i"); ! 147: MODULE_PARM(options, "1-" __MODULE_STRING(8) "i"); ! 148: MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i"); ! 149: MODULE_PARM(congenb, "i"); ! 150: MODULE_PARM(txfifo, "i"); ! 151: MODULE_PARM(rxfifo, "i"); ! 152: MODULE_PARM(txdmacount, "i"); ! 153: MODULE_PARM(rxdmacount, "i"); ! 154: MODULE_PARM(rx_copybreak, "i"); ! 155: MODULE_PARM(max_interrupt_work, "i"); ! 156: MODULE_PARM(multicast_filter_limit, "i"); ! 157: #endif ! 158: ! 159: #if (LINUX_VERSION_CODE >= 0x20100) ! 160: static char kernel_version[] = UTS_RELEASE; ! 161: #endif ! 162: ! 163: #if LINUX_VERSION_CODE < 0x20123 ! 164: #define hard_smp_processor_id() smp_processor_id() ! 165: #define test_and_set_bit(val, addr) set_bit(val, addr) ! 166: #define le16_to_cpu(val) (val) ! 167: #define le32_to_cpu(val) (val) ! 168: #define cpu_to_le32(val) (val) ! 169: #define cpu_to_le16(val) (val) ! 170: #endif ! 171: #if LINUX_VERSION_CODE <= 0x20139 ! 172: #define net_device_stats enet_statistics ! 173: #else ! 174: #define NETSTATS_VER2 ! 175: #endif ! 176: #if LINUX_VERSION_CODE < 0x20155 ! 177: /* Grrrr, the PCI code changed, but did not consider CardBus... */ ! 178: #include <linux/bios32.h> ! 179: #define PCI_SUPPORT_VER1 ! 180: #else ! 181: #define PCI_SUPPORT_VER2 ! 182: #endif ! 183: #if LINUX_VERSION_CODE < 0x20159 ! 184: #define dev_free_skb(skb) dev_kfree_skb(skb, FREE_WRITE); ! 185: #else ! 186: #define dev_free_skb(skb) dev_kfree_skb(skb); ! 187: #endif ! 188: #if ! defined(CAP_NET_ADMIN) ! 189: #define capable(CAP_XXX) (suser()) ! 190: #endif ! 191: ! 192: #define RUN_AT(x) (jiffies + (x)) ! 193: /* Condensed bus+endian portability operations. */ ! 194: #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr)) ! 195: #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr)) ! 196: ! 197: #define net_device device ! 198: #define pci_base_address(p, n) (p)->base_address[n] ! 199: ! 200: #define netif_wake_queue(dev) do { \ ! 201: clear_bit(0, (void*)&dev->tbusy); \ ! 202: mark_bh(NET_BH); \ ! 203: } while(0) ! 204: #define netif_start_queue(dev) clear_bit(0, (void*)&dev->tbusy) ! 205: #define netif_stop_queue(dev) set_bit(0, (void*)&dev->tbusy) ! 206: #ifndef PCI_DEVICE_ID_INTEL_82559ER ! 207: #define PCI_DEVICE_ID_INTEL_82559ER 0x1209 ! 208: #endif ! 209: #ifndef PCI_DEVICE_ID_INTEL_ID1029 ! 210: #define PCI_DEVICE_ID_INTEL_ID1029 0x1029 ! 211: #endif ! 212: #ifndef PCI_DEVICE_ID_INTEL_ID1030 ! 213: #define PCI_DEVICE_ID_INTEL_ID1030 0x1030 ! 214: #endif ! 215: #ifndef PCI_DEVICE_ID_INTEL_ID2449 ! 216: #define PCI_DEVICE_ID_INTEL_ID2449 0x2449 ! 217: #endif ! 218: ! 219: /* The total I/O port extent of the board. ! 220: The registers beyond 0x18 only exist on the i82558. */ ! 221: #define SPEEDO3_TOTAL_SIZE 0x20 ! 222: ! 223: int speedo_debug = 1; ! 224: ! 225: /* ! 226: Theory of Operation ! 227: ! 228: I. Board Compatibility ! 229: ! 230: This device driver is designed for the Intel i82557 "Speedo3" chip, Intel's ! 231: single-chip fast Ethernet controller for PCI, as used on the Intel ! 232: EtherExpress Pro 100 adapter. ! 233: ! 234: II. Board-specific settings ! 235: ! 236: PCI bus devices are configured by the system at boot time, so no jumpers ! 237: need to be set on the board. The system BIOS should be set to assign the ! 238: PCI INTA signal to an otherwise unused system IRQ line. While it's ! 239: possible to share PCI interrupt lines, it negatively impacts performance and ! 240: only recent kernels support it. ! 241: ! 242: III. Driver operation ! 243: ! 244: IIIA. General ! 245: The Speedo3 is very similar to other Intel network chips, that is to say ! 246: "apparently designed on a different planet". This chips retains the complex ! 247: Rx and Tx descriptors and multiple buffers pointers as previous chips, but ! 248: also has simplified Tx and Rx buffer modes. This driver uses the "flexible" ! 249: Tx mode, but in a simplified lower-overhead manner: it associates only a ! 250: single buffer descriptor with each frame descriptor. ! 251: ! 252: Despite the extra space overhead in each receive skbuff, the driver must use ! 253: the simplified Rx buffer mode to assure that only a single data buffer is ! 254: associated with each RxFD. The driver implements this by reserving space ! 255: for the Rx descriptor at the head of each Rx skbuff. ! 256: ! 257: The Speedo-3 has receive and command unit base addresses that are added to ! 258: almost all descriptor pointers. The driver sets these to zero, so that all ! 259: pointer fields are absolute addresses. ! 260: ! 261: The System Control Block (SCB) of some previous Intel chips exists on the ! 262: chip in both PCI I/O and memory space. This driver uses the I/O space ! 263: registers, but might switch to memory mapped mode to better support non-x86 ! 264: processors. ! 265: ! 266: IIIB. Transmit structure ! 267: ! 268: The driver must use the complex Tx command+descriptor mode in order to ! 269: have a indirect pointer to the skbuff data section. Each Tx command block ! 270: (TxCB) is associated with two immediately appended Tx Buffer Descriptor ! 271: (TxBD). A fixed ring of these TxCB+TxBD pairs are kept as part of the ! 272: speedo_private data structure for each adapter instance. ! 273: ! 274: The newer i82558 explicitly supports this structure, and can read the two ! 275: TxBDs in the same PCI burst as the TxCB. ! 276: ! 277: This ring structure is used for all normal transmit packets, but the ! 278: transmit packet descriptors aren't long enough for most non-Tx commands such ! 279: as CmdConfigure. This is complicated by the possibility that the chip has ! 280: already loaded the link address in the previous descriptor. So for these ! 281: commands we convert the next free descriptor on the ring to a NoOp, and point ! 282: that descriptor's link to the complex command. ! 283: ! 284: An additional complexity of these non-transmit commands are that they may be ! 285: added asynchronous to the normal transmit queue, so we disable interrupts ! 286: whenever the Tx descriptor ring is manipulated. ! 287: ! 288: A notable aspect of these special configure commands is that they do ! 289: work with the normal Tx ring entry scavenge method. The Tx ring scavenge ! 290: is done at interrupt time using the 'dirty_tx' index, and checking for the ! 291: command-complete bit. While the setup frames may have the NoOp command on the ! 292: Tx ring marked as complete, but not have completed the setup command, this ! 293: is not a problem. The tx_ring entry can be still safely reused, as the ! 294: tx_skbuff[] entry is always empty for config_cmd and mc_setup frames. ! 295: ! 296: Commands may have bits set e.g. CmdSuspend in the command word to either ! 297: suspend or stop the transmit/command unit. This driver always flags the last ! 298: command with CmdSuspend, erases the CmdSuspend in the previous command, and ! 299: then issues a CU_RESUME. ! 300: Note: Watch out for the potential race condition here: imagine ! 301: erasing the previous suspend ! 302: the chip processes the previous command ! 303: the chip processes the final command, and suspends ! 304: doing the CU_RESUME ! 305: the chip processes the next-yet-valid post-final-command. ! 306: So blindly sending a CU_RESUME is only safe if we do it immediately after ! 307: after erasing the previous CmdSuspend, without the possibility of an ! 308: intervening delay. Thus the resume command is always within the ! 309: interrupts-disabled region. This is a timing dependence, but handling this ! 310: condition in a timing-independent way would considerably complicate the code. ! 311: ! 312: Note: In previous generation Intel chips, restarting the command unit was a ! 313: notoriously slow process. This is presumably no longer true. ! 314: ! 315: IIIC. Receive structure ! 316: ! 317: Because of the bus-master support on the Speedo3 this driver uses the new ! 318: SKBUFF_RX_COPYBREAK scheme, rather than a fixed intermediate receive buffer. ! 319: This scheme allocates full-sized skbuffs as receive buffers. The value ! 320: SKBUFF_RX_COPYBREAK is used as the copying breakpoint: it is chosen to ! 321: trade-off the memory wasted by passing the full-sized skbuff to the queue ! 322: layer for all frames vs. the copying cost of copying a frame to a ! 323: correctly-sized skbuff. ! 324: ! 325: For small frames the copying cost is negligible (esp. considering that we ! 326: are pre-loading the cache with immediately useful header information), so we ! 327: allocate a new, minimally-sized skbuff. For large frames the copying cost ! 328: is non-trivial, and the larger copy might flush the cache of useful data, so ! 329: we pass up the skbuff the packet was received into. ! 330: ! 331: IV. Notes ! 332: ! 333: Thanks to Steve Williams of Intel for arranging the non-disclosure agreement ! 334: that stated that I could disclose the information. But I still resent ! 335: having to sign an Intel NDA when I'm helping Intel sell their own product! ! 336: ! 337: */ ! 338: ! 339: /* This table drives the PCI probe routines. */ ! 340: static struct net_device *speedo_found1(struct pci_dev *pdev, int pci_bus, ! 341: int pci_devfn, long ioaddr, ! 342: int chip_idx, int card_idx); ! 343: ! 344: #ifdef USE_IO ! 345: #define SPEEDO_IOTYPE PCI_USES_MASTER|PCI_USES_IO|PCI_ADDR1 ! 346: #define SPEEDO_SIZE 32 ! 347: #else ! 348: #define SPEEDO_IOTYPE PCI_USES_MASTER|PCI_USES_MEM|PCI_ADDR0 ! 349: #define SPEEDO_SIZE 0x1000 ! 350: #endif ! 351: ! 352: enum pci_flags_bit { ! 353: PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, ! 354: PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3, ! 355: }; ! 356: struct pci_id_info { ! 357: const char *name; ! 358: u16 vendor_id, device_id; ! 359: int pci_index; ! 360: } static pci_tbl[] = { ! 361: { "Intel PCI EtherExpress Pro100 82557", ! 362: PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82557, ! 363: 0 ! 364: }, ! 365: { "Intel PCI EtherExpress Pro100 82559ER", ! 366: PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82559ER, ! 367: 0 ! 368: }, ! 369: { "Intel PCI EtherExpress Pro100 ID1029", ! 370: PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ID1029, ! 371: 0 ! 372: }, ! 373: { "Intel Corporation 82559 InBusiness 10/100", ! 374: PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ID1030, ! 375: 0 ! 376: }, ! 377: { "Intel PCI EtherExpress Pro100 82562EM", ! 378: PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ID2449, ! 379: 0 ! 380: }, ! 381: {0,} /* 0 terminated list. */ ! 382: }; ! 383: ! 384: static inline unsigned int io_inw(unsigned long port) ! 385: { ! 386: return inw(port); ! 387: } ! 388: static inline void io_outw(unsigned int val, unsigned long port) ! 389: { ! 390: outw(val, port); ! 391: } ! 392: ! 393: #ifndef USE_IO ! 394: #undef inb ! 395: #undef inw ! 396: #undef inl ! 397: #undef outb ! 398: #undef outw ! 399: #undef outl ! 400: #define inb readb ! 401: #define inw readw ! 402: #define inl readl ! 403: #define outb writeb ! 404: #define outw writew ! 405: #define outl writel ! 406: #endif ! 407: ! 408: /* How to wait for the command unit to accept a command. ! 409: Typically this takes 0 ticks. */ ! 410: static inline void wait_for_cmd_done(long cmd_ioaddr) ! 411: { ! 412: int wait = 20000; ! 413: char cmd_reg1, cmd_reg2; ! 414: do ; ! 415: while((cmd_reg1 = inb(cmd_ioaddr)) && (--wait >= 0)); ! 416: ! 417: /* Last chance to change your mind --Dragan*/ ! 418: if (wait < 0){ ! 419: cmd_reg2 = inb(cmd_ioaddr); ! 420: if(cmd_reg2){ ! 421: printk(KERN_ALERT "eepro100: cmd_wait for(%#2.2x) timedout with(%#2.2x)!\n", ! 422: cmd_reg1, cmd_reg2); ! 423: ! 424: } ! 425: } ! 426: ! 427: } ! 428: ! 429: /* Offsets to the various registers. ! 430: All accesses need not be longword aligned. */ ! 431: enum speedo_offsets { ! 432: SCBStatus = 0, SCBCmd = 2, /* Rx/Command Unit command and status. */ ! 433: SCBPointer = 4, /* General purpose pointer. */ ! 434: SCBPort = 8, /* Misc. commands and operands. */ ! 435: SCBflash = 12, SCBeeprom = 14, /* EEPROM and flash memory control. */ ! 436: SCBCtrlMDI = 16, /* MDI interface control. */ ! 437: SCBEarlyRx = 20, /* Early receive byte count. */ ! 438: }; ! 439: /* Commands that can be put in a command list entry. */ ! 440: enum commands { ! 441: CmdNOp = 0, CmdIASetup = 0x10000, CmdConfigure = 0x20000, ! 442: CmdMulticastList = 0x30000, CmdTx = 0x40000, CmdTDR = 0x50000, ! 443: CmdDump = 0x60000, CmdDiagnose = 0x70000, ! 444: CmdSuspend = 0x40000000, /* Suspend after completion. */ ! 445: CmdIntr = 0x20000000, /* Interrupt after completion. */ ! 446: CmdTxFlex = 0x00080000, /* Use "Flexible mode" for CmdTx command. */ ! 447: }; ! 448: /* Clear CmdSuspend (1<<30) avoiding interference with the card access to the ! 449: status bits. Previous driver versions used separate 16 bit fields for ! 450: commands and statuses. --SAW ! 451: */ ! 452: #if defined(__LITTLE_ENDIAN) ! 453: #define clear_suspend(cmd) ((__u16 *)&(cmd)->cmd_status)[1] &= ~0x4000 ! 454: #elif defined(__BIG_ENDIAN) ! 455: #define clear_suspend(cmd) ((__u16 *)&(cmd)->cmd_status)[1] &= ~0x0040 ! 456: #else ! 457: #error Unsupported byteorder ! 458: #endif ! 459: ! 460: enum SCBCmdBits { ! 461: SCBMaskCmdDone=0x8000, SCBMaskRxDone=0x4000, SCBMaskCmdIdle=0x2000, ! 462: SCBMaskRxSuspend=0x1000, SCBMaskEarlyRx=0x0800, SCBMaskFlowCtl=0x0400, ! 463: SCBTriggerIntr=0x0200, SCBMaskAll=0x0100, ! 464: /* The rest are Rx and Tx commands. */ ! 465: CUStart=0x0010, CUResume=0x0020, CUStatsAddr=0x0040, CUShowStats=0x0050, ! 466: CUCmdBase=0x0060, /* CU Base address (set to zero) . */ ! 467: CUDumpStats=0x0070, /* Dump then reset stats counters. */ ! 468: RxStart=0x0001, RxResume=0x0002, RxAbort=0x0004, RxAddrLoad=0x0006, ! 469: RxResumeNoResources=0x0007, ! 470: }; ! 471: ! 472: enum SCBPort_cmds { ! 473: PortReset=0, PortSelfTest=1, PortPartialReset=2, PortDump=3, ! 474: }; ! 475: ! 476: /* The Speedo3 Rx and Tx frame/buffer descriptors. */ ! 477: struct descriptor { /* A generic descriptor. */ ! 478: s32 cmd_status; /* All command and status fields. */ ! 479: u32 link; /* struct descriptor * */ ! 480: unsigned char params[0]; ! 481: }; ! 482: ! 483: /* The Speedo3 Rx and Tx buffer descriptors. */ ! 484: struct RxFD { /* Receive frame descriptor. */ ! 485: s32 status; ! 486: u32 link; /* struct RxFD * */ ! 487: u32 rx_buf_addr; /* void * */ ! 488: u32 count; ! 489: }; ! 490: ! 491: /* Selected elements of the Tx/RxFD.status word. */ ! 492: enum RxFD_bits { ! 493: RxComplete=0x8000, RxOK=0x2000, ! 494: RxErrCRC=0x0800, RxErrAlign=0x0400, RxErrTooBig=0x0200, RxErrSymbol=0x0010, ! 495: RxEth2Type=0x0020, RxNoMatch=0x0004, RxNoIAMatch=0x0002, ! 496: TxUnderrun=0x1000, StatusComplete=0x8000, ! 497: }; ! 498: ! 499: struct TxFD { /* Transmit frame descriptor set. */ ! 500: s32 status; ! 501: u32 link; /* void * */ ! 502: u32 tx_desc_addr; /* Always points to the tx_buf_addr element. */ ! 503: s32 count; /* # of TBD (=1), Tx start thresh., etc. */ ! 504: /* This constitutes two "TBD" entries -- we only use one. */ ! 505: u32 tx_buf_addr0; /* void *, frame to be transmitted. */ ! 506: s32 tx_buf_size0; /* Length of Tx frame. */ ! 507: u32 tx_buf_addr1; /* void *, frame to be transmitted. */ ! 508: s32 tx_buf_size1; /* Length of Tx frame. */ ! 509: }; ! 510: ! 511: /* Multicast filter setting block. --SAW */ ! 512: struct speedo_mc_block { ! 513: struct speedo_mc_block *next; ! 514: unsigned int tx; ! 515: struct descriptor frame __attribute__ ((__aligned__(16))); ! 516: }; ! 517: ! 518: /* Elements of the dump_statistics block. This block must be lword aligned. */ ! 519: struct speedo_stats { ! 520: u32 tx_good_frames; ! 521: u32 tx_coll16_errs; ! 522: u32 tx_late_colls; ! 523: u32 tx_underruns; ! 524: u32 tx_lost_carrier; ! 525: u32 tx_deferred; ! 526: u32 tx_one_colls; ! 527: u32 tx_multi_colls; ! 528: u32 tx_total_colls; ! 529: u32 rx_good_frames; ! 530: u32 rx_crc_errs; ! 531: u32 rx_align_errs; ! 532: u32 rx_resource_errs; ! 533: u32 rx_overrun_errs; ! 534: u32 rx_colls_errs; ! 535: u32 rx_runt_errs; ! 536: u32 done_marker; ! 537: }; ! 538: ! 539: enum Rx_ring_state_bits { ! 540: RrNoMem=1, RrPostponed=2, RrNoResources=4, RrOOMReported=8, ! 541: }; ! 542: ! 543: /* Do not change the position (alignment) of the first few elements! ! 544: The later elements are grouped for cache locality. */ ! 545: struct speedo_private { ! 546: struct TxFD tx_ring[TX_RING_SIZE]; /* Commands (usually CmdTxPacket). */ ! 547: struct RxFD *rx_ringp[RX_RING_SIZE]; /* Rx descriptor, used as ring. */ ! 548: /* The addresses of a Tx/Rx-in-place packets/buffers. */ ! 549: struct sk_buff* tx_skbuff[TX_RING_SIZE]; ! 550: struct sk_buff* rx_skbuff[RX_RING_SIZE]; ! 551: struct descriptor *last_cmd; /* Last command sent. */ ! 552: unsigned int cur_tx, dirty_tx; /* The ring entries to be free()ed. */ ! 553: spinlock_t lock; /* Group with Tx control cache line. */ ! 554: u32 tx_threshold; /* The value for txdesc.count. */ ! 555: struct RxFD *last_rxf; /* Last command sent. */ ! 556: unsigned int cur_rx, dirty_rx; /* The next free ring entry */ ! 557: long last_rx_time; /* Last Rx, in jiffies, to handle Rx hang. */ ! 558: const char *product_name; ! 559: struct net_device *next_module; ! 560: void *priv_addr; /* Unaligned address for kfree */ ! 561: struct enet_statistics stats; ! 562: struct speedo_stats lstats; ! 563: int chip_id; ! 564: unsigned char pci_bus, pci_devfn, acpi_pwr; ! 565: struct timer_list timer; /* Media selection timer. */ ! 566: struct speedo_mc_block *mc_setup_head;/* Multicast setup frame list head. */ ! 567: struct speedo_mc_block *mc_setup_tail;/* Multicast setup frame list tail. */ ! 568: int in_interrupt; /* Word-aligned dev->interrupt */ ! 569: char rx_mode; /* Current PROMISC/ALLMULTI setting. */ ! 570: unsigned int tx_full:1; /* The Tx queue is full. */ ! 571: unsigned int full_duplex:1; /* Full-duplex operation requested. */ ! 572: unsigned int flow_ctrl:1; /* Use 802.3x flow control. */ ! 573: unsigned int rx_bug:1; /* Work around receiver hang errata. */ ! 574: unsigned int rx_bug10:1; /* Receiver might hang at 10mbps. */ ! 575: unsigned int rx_bug100:1; /* Receiver might hang at 100mbps. */ ! 576: unsigned char default_port:8; /* Last dev->if_port value. */ ! 577: unsigned char rx_ring_state; /* RX ring status flags. */ ! 578: unsigned short phy[2]; /* PHY media interfaces available. */ ! 579: unsigned short advertising; /* Current PHY advertised caps. */ ! 580: unsigned short partner; /* Link partner caps. */ ! 581: }; ! 582: ! 583: /* The parameters for a CmdConfigure operation. ! 584: There are so many options that it would be difficult to document each bit. ! 585: We mostly use the default or recommended settings. */ ! 586: const char i82557_config_cmd[22] = { ! 587: 22, 0x08, 0, 0, 0, 0, 0x32, 0x03, 1, /* 1=Use MII 0=Use AUI */ ! 588: 0, 0x2E, 0, 0x60, 0, ! 589: 0xf2, 0x48, 0, 0x40, 0xf2, 0x80, /* 0x40=Force full-duplex */ ! 590: 0x3f, 0x05, }; ! 591: const char i82558_config_cmd[22] = { ! 592: 22, 0x08, 0, 1, 0, 0, 0x22, 0x03, 1, /* 1=Use MII 0=Use AUI */ ! 593: 0, 0x2E, 0, 0x60, 0x08, 0x88, ! 594: 0x68, 0, 0x40, 0xf2, 0x84, /* Disable FC */ ! 595: 0x31, 0x05, }; ! 596: ! 597: /* PHY media interface chips. */ ! 598: static const char *phys[] = { ! 599: "None", "i82553-A/B", "i82553-C", "i82503", ! 600: "DP83840", "80c240", "80c24", "i82555", ! 601: "unknown-8", "unknown-9", "DP83840A", "unknown-11", ! 602: "unknown-12", "unknown-13", "unknown-14", "unknown-15", }; ! 603: enum phy_chips { NonSuchPhy=0, I82553AB, I82553C, I82503, DP83840, S80C240, ! 604: S80C24, I82555, DP83840A=10, }; ! 605: static const char is_mii[] = { 0, 1, 1, 0, 1, 1, 0, 1 }; ! 606: #define EE_READ_CMD (6) ! 607: ! 608: static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len); ! 609: static int mdio_read(long ioaddr, int phy_id, int location); ! 610: static int mdio_write(long ioaddr, int phy_id, int location, int value); ! 611: static int speedo_open(struct net_device *dev); ! 612: static void speedo_resume(struct net_device *dev); ! 613: static void speedo_timer(unsigned long data); ! 614: static void speedo_init_rx_ring(struct net_device *dev); ! 615: static void speedo_tx_timeout(struct net_device *dev); ! 616: static int speedo_start_xmit(struct sk_buff *skb, struct net_device *dev); ! 617: static void speedo_refill_rx_buffers(struct net_device *dev, int force); ! 618: static int speedo_rx(struct net_device *dev); ! 619: static void speedo_tx_buffer_gc(struct net_device *dev); ! 620: static void speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs); ! 621: static int speedo_close(struct net_device *dev); ! 622: static struct enet_statistics *speedo_get_stats(struct net_device *dev); ! 623: static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); ! 624: static void set_rx_mode(struct net_device *dev); ! 625: static void speedo_show_state(struct net_device *dev); ! 626: ! 627: ! 628: ! 629: #ifdef honor_default_port ! 630: /* Optional driver feature to allow forcing the transceiver setting. ! 631: Not recommended. */ ! 632: static int mii_ctrl[8] = { 0x3300, 0x3100, 0x0000, 0x0100, ! 633: 0x2000, 0x2100, 0x0400, 0x3100}; ! 634: #endif ! 635: ! 636: /* A list of all installed Speedo devices, for removing the driver module. */ ! 637: static struct net_device *root_speedo_dev = NULL; ! 638: ! 639: int eepro100_init(void) ! 640: { ! 641: int cards_found = 0; ! 642: int chip_idx; ! 643: struct pci_dev *pdev; ! 644: struct pci_dev rdev; pdev = &rdev; ! 645: ! 646: if (! pcibios_present()) ! 647: return cards_found; ! 648: ! 649: for (chip_idx = 0; pci_tbl[chip_idx].name; chip_idx++) { ! 650: for (; pci_tbl[chip_idx].pci_index < 8; pci_tbl[chip_idx].pci_index++) { ! 651: unsigned char pci_bus, pci_device_fn, pci_latency; ! 652: unsigned long pciaddr; ! 653: long ioaddr; ! 654: int irq; ! 655: ! 656: u16 pci_command, new_command; ! 657: ! 658: if (pcibios_find_device(pci_tbl[chip_idx].vendor_id, ! 659: pci_tbl[chip_idx].device_id, ! 660: pci_tbl[chip_idx].pci_index, &pci_bus, ! 661: &pci_device_fn)) ! 662: break; ! 663: { ! 664: #if defined(PCI_SUPPORT_VER2) ! 665: pdev = pci_find_slot(pci_bus, pci_device_fn); ! 666: #ifdef USE_IO ! 667: pciaddr = pci_base_address(pdev, 1); /* Use [0] to mem-map */ ! 668: #else ! 669: pciaddr = pci_base_address(pdev, 0); ! 670: #endif ! 671: irq = pdev->irq; ! 672: #else ! 673: u32 pci_ioaddr; ! 674: u8 pci_irq_line; ! 675: #ifdef USE_IO ! 676: pcibios_read_config_dword(pci_bus, pci_device_fn, ! 677: PCI_BASE_ADDRESS_1, &pci_ioaddr); ! 678: #else ! 679: pcibios_read_config_dword(pci_bus, pci_device_fn, ! 680: PCI_BASE_ADDRESS_0, &pci_ioaddr); ! 681: #endif ! 682: pcibios_read_config_byte(pci_bus, pci_device_fn, ! 683: PCI_INTERRUPT_LINE, &pci_irq_line); ! 684: pciaddr = pci_ioaddr; ! 685: irq = pci_irq_line; ! 686: pdev->irq = irq; ! 687: #endif ! 688: } ! 689: /* Remove I/O space marker in bit 0. */ ! 690: if (pciaddr & 1) { ! 691: ioaddr = pciaddr & ~3UL; ! 692: if (check_region(ioaddr, 32)) ! 693: continue; ! 694: } else { ! 695: #ifdef __sparc__ ! 696: /* ioremap is hosed in 2.2.x on Sparc. */ ! 697: ioaddr = pciaddr & ~0xfUL; ! 698: #else ! 699: if ((ioaddr = (long)ioremap(pciaddr & ~0xfUL, 0x1000)) == 0) { ! 700: printk(KERN_INFO "Failed to map PCI address %#lx.\n", ! 701: pciaddr); ! 702: continue; ! 703: } ! 704: #endif ! 705: } ! 706: if (speedo_debug > 2) ! 707: printk("Found Intel i82557 PCI Speedo at I/O %#lx, IRQ %d.\n", ! 708: ioaddr, irq); ! 709: ! 710: /* Get and check the bus-master and latency values. */ ! 711: pcibios_read_config_word(pci_bus, pci_device_fn, ! 712: PCI_COMMAND, &pci_command); ! 713: new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO; ! 714: if (pci_command != new_command) { ! 715: printk(KERN_INFO " The PCI BIOS has not enabled this" ! 716: " device! Updating PCI command %4.4x->%4.4x.\n", ! 717: pci_command, new_command); ! 718: pcibios_write_config_word(pci_bus, pci_device_fn, ! 719: PCI_COMMAND, new_command); ! 720: } ! 721: pcibios_read_config_byte(pci_bus, pci_device_fn, ! 722: PCI_LATENCY_TIMER, &pci_latency); ! 723: if (pci_latency < 32) { ! 724: printk(" PCI latency timer (CFLT) is unreasonably low at %d." ! 725: " Setting to 32 clocks.\n", pci_latency); ! 726: pcibios_write_config_byte(pci_bus, pci_device_fn, ! 727: PCI_LATENCY_TIMER, 32); ! 728: } else if (speedo_debug > 1) ! 729: printk(" PCI latency timer (CFLT) is %#x.\n", pci_latency); ! 730: ! 731: if (speedo_found1(pdev, pci_bus, pci_device_fn, ioaddr, chip_idx, cards_found)) ! 732: cards_found++; ! 733: } ! 734: } ! 735: ! 736: return cards_found; ! 737: } ! 738: ! 739: static struct net_device *speedo_found1(struct pci_dev *pdev, int pci_bus, ! 740: int pci_devfn, long ioaddr, ! 741: int chip_idx, int card_idx) ! 742: { ! 743: struct net_device *dev; ! 744: struct speedo_private *sp; ! 745: const char *product; ! 746: int i, option; ! 747: u16 eeprom[0x100]; ! 748: int acpi_idle_state = 0; ! 749: #ifndef MODULE ! 750: static int did_version = 0; /* Already printed version info. */ ! 751: if (speedo_debug > 0 && did_version++ == 0) ! 752: printk(version); ! 753: #endif ! 754: ! 755: dev = init_etherdev(NULL, sizeof(struct speedo_private)); ! 756: ! 757: if (dev->mem_start > 0) ! 758: option = dev->mem_start; ! 759: else if (card_idx >= 0 && options[card_idx] >= 0) ! 760: option = options[card_idx]; ! 761: else ! 762: option = 0; ! 763: ! 764: /* Read the station address EEPROM before doing the reset. ! 765: Nominally his should even be done before accepting the device, but ! 766: then we wouldn't have a device name with which to report the error. ! 767: The size test is for 6 bit vs. 8 bit address serial EEPROMs. ! 768: */ ! 769: { ! 770: unsigned long iobase; ! 771: int read_cmd, ee_size; ! 772: u16 sum; ! 773: int j; ! 774: ! 775: /* Use IO only to avoid postponed writes and satisfy EEPROM timing ! 776: requirements. */ ! 777: #if defined(PCI_SUPPORT_VER2) ! 778: iobase = pci_base_address(pdev, 1) & ~3UL; ! 779: #else ! 780: { ! 781: u32 pci_ioaddr; ! 782: pcibios_read_config_dword(pci_bus, pci_devfn, ! 783: PCI_BASE_ADDRESS_1, &pci_ioaddr); ! 784: iobase = pci_ioaddr & ~3UL; ! 785: } ! 786: #endif ! 787: if ((do_eeprom_cmd(iobase, EE_READ_CMD << 24, 27) & 0xffe0000) ! 788: == 0xffe0000) { ! 789: ee_size = 0x100; ! 790: read_cmd = EE_READ_CMD << 24; ! 791: } else { ! 792: ee_size = 0x40; ! 793: read_cmd = EE_READ_CMD << 22; ! 794: } ! 795: ! 796: for (j = 0, i = 0, sum = 0; i < ee_size; i++) { ! 797: u16 value = do_eeprom_cmd(iobase, read_cmd | (i << 16), 27); ! 798: eeprom[i] = value; ! 799: sum += value; ! 800: if (i < 3) { ! 801: dev->dev_addr[j++] = value; ! 802: dev->dev_addr[j++] = value >> 8; ! 803: } ! 804: } ! 805: if (sum != 0xBABA) ! 806: printk(KERN_WARNING "%s: Invalid EEPROM checksum %#4.4x, " ! 807: "check settings before activating this device!\n", ! 808: dev->name, sum); ! 809: /* Don't unregister_netdev(dev); as the EEPro may actually be ! 810: usable, especially if the MAC address is set later. ! 811: On the other hand, it may be unusable if MDI data is corrupted. */ ! 812: } ! 813: ! 814: /* Reset the chip: stop Tx and Rx processes and clear counters. ! 815: This takes less than 10usec and will easily finish before the next ! 816: action. */ ! 817: outl(PortReset, ioaddr + SCBPort); ! 818: inl(ioaddr + SCBPort); ! 819: /* Honor PortReset timing. */ ! 820: udelay(10); ! 821: ! 822: if (eeprom[3] & 0x0100) ! 823: product = "OEM i82557/i82558 10/100 Ethernet"; ! 824: else ! 825: product = pci_tbl[chip_idx].name; ! 826: ! 827: printk(KERN_INFO "%s: %s, ", dev->name, product); ! 828: ! 829: for (i = 0; i < 5; i++) ! 830: printk("%2.2X:", dev->dev_addr[i]); ! 831: printk("%2.2X, ", dev->dev_addr[i]); ! 832: #ifdef USE_IO ! 833: printk("I/O at %#3lx, ", ioaddr); ! 834: #endif ! 835: printk("IRQ %d.\n", pdev->irq); ! 836: ! 837: #if 1 || defined(kernel_bloat) ! 838: /* OK, this is pure kernel bloat. I don't like it when other drivers ! 839: waste non-pageable kernel space to emit similar messages, but I need ! 840: them for bug reports. */ ! 841: { ! 842: const char *connectors[] = {" RJ45", " BNC", " AUI", " MII"}; ! 843: /* The self-test results must be paragraph aligned. */ ! 844: s32 str[6], *volatile self_test_results; ! 845: int boguscnt = 16000; /* Timeout for set-test. */ ! 846: if ((eeprom[3] & 0x03) != 0x03) ! 847: printk(KERN_INFO " Receiver lock-up bug exists -- enabling" ! 848: " work-around.\n"); ! 849: printk(KERN_INFO " Board assembly %4.4x%2.2x-%3.3d, Physical" ! 850: " connectors present:", ! 851: eeprom[8], eeprom[9]>>8, eeprom[9] & 0xff); ! 852: for (i = 0; i < 4; i++) ! 853: if (eeprom[5] & (1<<i)) ! 854: printk(connectors[i]); ! 855: printk("\n"KERN_INFO" Primary interface chip %s PHY #%d.\n", ! 856: phys[(eeprom[6]>>8)&15], eeprom[6] & 0x1f); ! 857: if (eeprom[7] & 0x0700) ! 858: printk(KERN_INFO " Secondary interface chip %s.\n", ! 859: phys[(eeprom[7]>>8)&7]); ! 860: if (((eeprom[6]>>8) & 0x3f) == DP83840 ! 861: || ((eeprom[6]>>8) & 0x3f) == DP83840A) { ! 862: int mdi_reg23 = mdio_read(ioaddr, eeprom[6] & 0x1f, 23) | 0x0422; ! 863: if (congenb) ! 864: mdi_reg23 |= 0x0100; ! 865: printk(KERN_INFO" DP83840 specific setup, setting register 23 to %4.4x.\n", ! 866: mdi_reg23); ! 867: mdio_write(ioaddr, eeprom[6] & 0x1f, 23, mdi_reg23); ! 868: } ! 869: if ((option >= 0) && (option & 0x70)) { ! 870: printk(KERN_INFO " Forcing %dMbs %s-duplex operation.\n", ! 871: (option & 0x20 ? 100 : 10), ! 872: (option & 0x10 ? "full" : "half")); ! 873: mdio_write(ioaddr, eeprom[6] & 0x1f, 0, ! 874: ((option & 0x20) ? 0x2000 : 0) | /* 100mbps? */ ! 875: ((option & 0x10) ? 0x0100 : 0)); /* Full duplex? */ ! 876: } ! 877: ! 878: /* Perform a system self-test. */ ! 879: self_test_results = (s32*) ((((long) str) + 15) & ~0xf); ! 880: self_test_results[0] = 0; ! 881: self_test_results[1] = -1; ! 882: outl(virt_to_bus(self_test_results) | PortSelfTest, ioaddr + SCBPort); ! 883: do { ! 884: udelay(10); ! 885: } while (self_test_results[1] == -1 && --boguscnt >= 0); ! 886: ! 887: if (boguscnt < 0) { /* Test optimized out. */ ! 888: printk(KERN_ERR "Self test failed, status %8.8x:\n" ! 889: KERN_ERR " Failure to initialize the i82557.\n" ! 890: KERN_ERR " Verify that the card is a bus-master" ! 891: " capable slot.\n", ! 892: self_test_results[1]); ! 893: } else ! 894: printk(KERN_INFO " General self-test: %s.\n" ! 895: KERN_INFO " Serial sub-system self-test: %s.\n" ! 896: KERN_INFO " Internal registers self-test: %s.\n" ! 897: KERN_INFO " ROM checksum self-test: %s (%#8.8x).\n", ! 898: self_test_results[1] & 0x1000 ? "failed" : "passed", ! 899: self_test_results[1] & 0x0020 ? "failed" : "passed", ! 900: self_test_results[1] & 0x0008 ? "failed" : "passed", ! 901: self_test_results[1] & 0x0004 ? "failed" : "passed", ! 902: self_test_results[0]); ! 903: } ! 904: #endif /* kernel_bloat */ ! 905: ! 906: outl(PortReset, ioaddr + SCBPort); ! 907: inl(ioaddr + SCBPort); ! 908: /* Honor PortReset timing. */ ! 909: udelay(10); ! 910: ! 911: /* We do a request_region() only to register /proc/ioports info. */ ! 912: request_region(ioaddr, SPEEDO3_TOTAL_SIZE, "Intel Speedo3 Ethernet"); ! 913: ! 914: dev->base_addr = ioaddr; ! 915: dev->irq = pdev->irq; ! 916: ! 917: sp = dev->priv; ! 918: if (dev->priv == NULL) { ! 919: void *mem = kmalloc(sizeof(*sp), GFP_KERNEL); ! 920: dev->priv = sp = mem; /* Cache align here if kmalloc does not. */ ! 921: sp->priv_addr = mem; ! 922: } ! 923: memset(sp, 0, sizeof(*sp)); ! 924: sp->next_module = root_speedo_dev; ! 925: root_speedo_dev = dev; ! 926: ! 927: sp->pci_bus = pci_bus; ! 928: sp->pci_devfn = pci_devfn; ! 929: sp->chip_id = chip_idx; ! 930: sp->acpi_pwr = acpi_idle_state; ! 931: ! 932: sp->full_duplex = option >= 0 && (option & 0x10) ? 1 : 0; ! 933: if (card_idx >= 0) { ! 934: if (full_duplex[card_idx] >= 0) ! 935: sp->full_duplex = full_duplex[card_idx]; ! 936: } ! 937: sp->default_port = option >= 0 ? (option & 0x0f) : 0; ! 938: ! 939: sp->phy[0] = eeprom[6]; ! 940: sp->phy[1] = eeprom[7]; ! 941: sp->rx_bug = (eeprom[3] & 0x03) == 3 ? 0 : 1; ! 942: ! 943: if (sp->rx_bug) ! 944: printk(KERN_INFO " Receiver lock-up workaround activated.\n"); ! 945: ! 946: /* The Speedo-specific entries in the device structure. */ ! 947: dev->open = &speedo_open; ! 948: dev->hard_start_xmit = &speedo_start_xmit; ! 949: #if defined(HAS_NETIF_QUEUE) ! 950: dev->tx_timeout = &speedo_tx_timeout; ! 951: dev->watchdog_timeo = TX_TIMEOUT; ! 952: #endif ! 953: dev->stop = &speedo_close; ! 954: dev->get_stats = &speedo_get_stats; ! 955: dev->set_multicast_list = &set_rx_mode; ! 956: dev->do_ioctl = &speedo_ioctl; ! 957: ! 958: return dev; ! 959: } ! 960: ! 961: /* Serial EEPROM section. ! 962: A "bit" grungy, but we work our way through bit-by-bit :->. */ ! 963: /* EEPROM_Ctrl bits. */ ! 964: #define EE_SHIFT_CLK 0x01 /* EEPROM shift clock. */ ! 965: #define EE_CS 0x02 /* EEPROM chip select. */ ! 966: #define EE_DATA_WRITE 0x04 /* EEPROM chip data in. */ ! 967: #define EE_DATA_READ 0x08 /* EEPROM chip data out. */ ! 968: #define EE_ENB (0x4800 | EE_CS) ! 969: #define EE_WRITE_0 0x4802 ! 970: #define EE_WRITE_1 0x4806 ! 971: #define EE_OFFSET SCBeeprom ! 972: ! 973: /* The fixes for the code were kindly provided by Dragan Stancevic ! 974: <[email protected]> to strictly follow Intel specifications of EEPROM ! 975: access timing. ! 976: The publicly available sheet 64486302 (sec. 3.1) specifies 1us access ! 977: interval for serial EEPROM. However, it looks like that there is an ! 978: additional requirement dictating larger udelay's in the code below. ! 979: 2000/05/24 SAW */ ! 980: static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len) ! 981: { ! 982: unsigned retval = 0; ! 983: long ee_addr = ioaddr + SCBeeprom; ! 984: ! 985: io_outw(EE_ENB, ee_addr); udelay(2); ! 986: io_outw(EE_ENB | EE_SHIFT_CLK, ee_addr); udelay(2); ! 987: ! 988: /* Shift the command bits out. */ ! 989: do { ! 990: short dataval = (cmd & (1 << cmd_len)) ? EE_WRITE_1 : EE_WRITE_0; ! 991: io_outw(dataval, ee_addr); udelay(2); ! 992: io_outw(dataval | EE_SHIFT_CLK, ee_addr); udelay(2); ! 993: retval = (retval << 1) | ((io_inw(ee_addr) & EE_DATA_READ) ? 1 : 0); ! 994: } while (--cmd_len >= 0); ! 995: io_outw(EE_ENB, ee_addr); udelay(2); ! 996: ! 997: /* Terminate the EEPROM access. */ ! 998: io_outw(EE_ENB & ~EE_CS, ee_addr); ! 999: return retval; ! 1000: } ! 1001: ! 1002: static int mdio_read(long ioaddr, int phy_id, int location) ! 1003: { ! 1004: int val, boguscnt = 64*10; /* <64 usec. to complete, typ 27 ticks */ ! 1005: outl(0x08000000 | (location<<16) | (phy_id<<21), ioaddr + SCBCtrlMDI); ! 1006: do { ! 1007: val = inl(ioaddr + SCBCtrlMDI); ! 1008: if (--boguscnt < 0) { ! 1009: printk(KERN_ERR " mdio_read() timed out with val = %8.8x.\n", val); ! 1010: break; ! 1011: } ! 1012: } while (! (val & 0x10000000)); ! 1013: return val & 0xffff; ! 1014: } ! 1015: ! 1016: static int mdio_write(long ioaddr, int phy_id, int location, int value) ! 1017: { ! 1018: int val, boguscnt = 64*10; /* <64 usec. to complete, typ 27 ticks */ ! 1019: outl(0x04000000 | (location<<16) | (phy_id<<21) | value, ! 1020: ioaddr + SCBCtrlMDI); ! 1021: do { ! 1022: val = inl(ioaddr + SCBCtrlMDI); ! 1023: if (--boguscnt < 0) { ! 1024: printk(KERN_ERR" mdio_write() timed out with val = %8.8x.\n", val); ! 1025: break; ! 1026: } ! 1027: } while (! (val & 0x10000000)); ! 1028: return val & 0xffff; ! 1029: } ! 1030: ! 1031: ! 1032: static int ! 1033: speedo_open(struct net_device *dev) ! 1034: { ! 1035: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1036: long ioaddr = dev->base_addr; ! 1037: ! 1038: if (speedo_debug > 1) ! 1039: printk(KERN_DEBUG "%s: speedo_open() irq %d.\n", dev->name, dev->irq); ! 1040: ! 1041: MOD_INC_USE_COUNT; ! 1042: ! 1043: /* Set up the Tx queue early.. */ ! 1044: sp->cur_tx = 0; ! 1045: sp->dirty_tx = 0; ! 1046: sp->last_cmd = 0; ! 1047: sp->tx_full = 0; ! 1048: sp->lock = (spinlock_t) SPIN_LOCK_UNLOCKED; ! 1049: sp->in_interrupt = 0; ! 1050: ! 1051: /* .. we can safely take handler calls during init. */ ! 1052: if (request_irq(dev->irq, &speedo_interrupt, SA_SHIRQ, dev->name, dev)) { ! 1053: MOD_DEC_USE_COUNT; ! 1054: return -EAGAIN; ! 1055: } ! 1056: ! 1057: dev->if_port = sp->default_port; ! 1058: ! 1059: #ifdef oh_no_you_dont_unless_you_honour_the_options_passed_in_to_us ! 1060: /* Retrigger negotiation to reset previous errors. */ ! 1061: if ((sp->phy[0] & 0x8000) == 0) { ! 1062: int phy_addr = sp->phy[0] & 0x1f ; ! 1063: /* Use 0x3300 for restarting NWay, other values to force xcvr: ! 1064: 0x0000 10-HD ! 1065: 0x0100 10-FD ! 1066: 0x2000 100-HD ! 1067: 0x2100 100-FD ! 1068: */ ! 1069: #ifdef honor_default_port ! 1070: mdio_write(ioaddr, phy_addr, 0, mii_ctrl[dev->default_port & 7]); ! 1071: #else ! 1072: mdio_write(ioaddr, phy_addr, 0, 0x3300); ! 1073: #endif ! 1074: } ! 1075: #endif ! 1076: ! 1077: speedo_init_rx_ring(dev); ! 1078: ! 1079: /* Fire up the hardware. */ ! 1080: outw(SCBMaskAll, ioaddr + SCBCmd); ! 1081: speedo_resume(dev); ! 1082: ! 1083: dev->interrupt = 0; ! 1084: dev->start = 1; ! 1085: netif_start_queue(dev); ! 1086: ! 1087: /* Setup the chip and configure the multicast list. */ ! 1088: sp->mc_setup_head = NULL; ! 1089: sp->mc_setup_tail = NULL; ! 1090: sp->flow_ctrl = sp->partner = 0; ! 1091: sp->rx_mode = -1; /* Invalid -> always reset the mode. */ ! 1092: set_rx_mode(dev); ! 1093: if ((sp->phy[0] & 0x8000) == 0) ! 1094: sp->advertising = mdio_read(ioaddr, sp->phy[0] & 0x1f, 4); ! 1095: ! 1096: if (speedo_debug > 2) { ! 1097: printk(KERN_DEBUG "%s: Done speedo_open(), status %8.8x.\n", ! 1098: dev->name, inw(ioaddr + SCBStatus)); ! 1099: } ! 1100: ! 1101: /* Set the timer. The timer serves a dual purpose: ! 1102: 1) to monitor the media interface (e.g. link beat) and perhaps switch ! 1103: to an alternate media type ! 1104: 2) to monitor Rx activity, and restart the Rx process if the receiver ! 1105: hangs. */ ! 1106: init_timer(&sp->timer); ! 1107: sp->timer.expires = RUN_AT((24*HZ)/10); /* 2.4 sec. */ ! 1108: sp->timer.data = (unsigned long)dev; ! 1109: sp->timer.function = &speedo_timer; /* timer handler */ ! 1110: add_timer(&sp->timer); ! 1111: ! 1112: /* No need to wait for the command unit to accept here. */ ! 1113: if ((sp->phy[0] & 0x8000) == 0) ! 1114: mdio_read(ioaddr, sp->phy[0] & 0x1f, 0); ! 1115: ! 1116: return 0; ! 1117: } ! 1118: ! 1119: /* Start the chip hardware after a full reset. */ ! 1120: static void speedo_resume(struct net_device *dev) ! 1121: { ! 1122: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1123: long ioaddr = dev->base_addr; ! 1124: ! 1125: /* Start with a Tx threshold of 256 (0x..20.... 8 byte units). */ ! 1126: sp->tx_threshold = 0x01208000; ! 1127: ! 1128: /* Set the segment registers to '0'. */ ! 1129: wait_for_cmd_done(ioaddr + SCBCmd); ! 1130: outl(0, ioaddr + SCBPointer); ! 1131: /* impose a delay to avoid a bug */ ! 1132: inl(ioaddr + SCBPointer); ! 1133: udelay(10); ! 1134: outb(RxAddrLoad, ioaddr + SCBCmd); ! 1135: wait_for_cmd_done(ioaddr + SCBCmd); ! 1136: outb(CUCmdBase, ioaddr + SCBCmd); ! 1137: wait_for_cmd_done(ioaddr + SCBCmd); ! 1138: ! 1139: /* Load the statistics block and rx ring addresses. */ ! 1140: outl(virt_to_bus(&sp->lstats), ioaddr + SCBPointer); ! 1141: outb(CUStatsAddr, ioaddr + SCBCmd); ! 1142: sp->lstats.done_marker = 0; ! 1143: wait_for_cmd_done(ioaddr + SCBCmd); ! 1144: ! 1145: if (sp->rx_ringp[sp->cur_rx % RX_RING_SIZE] == NULL) { ! 1146: if (speedo_debug > 2) ! 1147: printk(KERN_DEBUG "%s: NULL cur_rx in speedo_resume().\n", ! 1148: dev->name); ! 1149: } else { ! 1150: outl(virt_to_bus(sp->rx_ringp[sp->cur_rx % RX_RING_SIZE]), ! 1151: ioaddr + SCBPointer); ! 1152: outb(RxStart, ioaddr + SCBCmd); ! 1153: wait_for_cmd_done(ioaddr + SCBCmd); ! 1154: } ! 1155: ! 1156: outb(CUDumpStats, ioaddr + SCBCmd); ! 1157: ! 1158: /* Fill the first command with our physical address. */ ! 1159: { ! 1160: struct descriptor *ias_cmd; ! 1161: ! 1162: ias_cmd = ! 1163: (struct descriptor *)&sp->tx_ring[sp->cur_tx++ % TX_RING_SIZE]; ! 1164: /* Avoid a bug(?!) here by marking the command already completed. */ ! 1165: ias_cmd->cmd_status = cpu_to_le32((CmdSuspend | CmdIASetup) | 0xa000); ! 1166: ias_cmd->link = ! 1167: virt_to_le32desc(&sp->tx_ring[sp->cur_tx % TX_RING_SIZE]); ! 1168: memcpy(ias_cmd->params, dev->dev_addr, 6); ! 1169: sp->last_cmd = ias_cmd; ! 1170: } ! 1171: ! 1172: /* Start the chip's Tx process and unmask interrupts. */ ! 1173: wait_for_cmd_done(ioaddr + SCBCmd); ! 1174: outl(virt_to_bus(&sp->tx_ring[sp->dirty_tx % TX_RING_SIZE]), ! 1175: ioaddr + SCBPointer); ! 1176: /* We are not ACK-ing FCP and ER in the interrupt handler yet so they should ! 1177: remain masked --Dragan */ ! 1178: outw(CUStart | SCBMaskEarlyRx | SCBMaskFlowCtl, ioaddr + SCBCmd); ! 1179: } ! 1180: ! 1181: /* Media monitoring and control. */ ! 1182: static void speedo_timer(unsigned long data) ! 1183: { ! 1184: struct net_device *dev = (struct net_device *)data; ! 1185: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1186: long ioaddr = dev->base_addr; ! 1187: int phy_num = sp->phy[0] & 0x1f; ! 1188: ! 1189: /* We have MII and lost link beat. */ ! 1190: if ((sp->phy[0] & 0x8000) == 0) { ! 1191: int partner = mdio_read(ioaddr, phy_num, 5); ! 1192: if (partner != sp->partner) { ! 1193: int flow_ctrl = sp->advertising & partner & 0x0400 ? 1 : 0; ! 1194: if (speedo_debug > 2) { ! 1195: printk(KERN_DEBUG "%s: Link status change.\n", dev->name); ! 1196: printk(KERN_DEBUG "%s: Old partner %x, new %x, adv %x.\n", ! 1197: dev->name, sp->partner, partner, sp->advertising); ! 1198: } ! 1199: sp->partner = partner; ! 1200: if (flow_ctrl != sp->flow_ctrl) { ! 1201: sp->flow_ctrl = flow_ctrl; ! 1202: sp->rx_mode = -1; /* Trigger a reload. */ ! 1203: } ! 1204: /* Clear sticky bit. */ ! 1205: mdio_read(ioaddr, phy_num, 1); ! 1206: /* If link beat has returned... */ ! 1207: if (mdio_read(ioaddr, phy_num, 1) & 0x0004) ! 1208: dev->flags |= IFF_RUNNING; ! 1209: else ! 1210: dev->flags &= ~IFF_RUNNING; ! 1211: } ! 1212: } ! 1213: if (speedo_debug > 3) { ! 1214: printk(KERN_DEBUG "%s: Media control tick, status %4.4x.\n", ! 1215: dev->name, inw(ioaddr + SCBStatus)); ! 1216: } ! 1217: if (sp->rx_mode < 0 || ! 1218: (sp->rx_bug && jiffies - sp->last_rx_time > 2*HZ)) { ! 1219: /* We haven't received a packet in a Long Time. We might have been ! 1220: bitten by the receiver hang bug. This can be cleared by sending ! 1221: a set multicast list command. */ ! 1222: if (speedo_debug > 2) ! 1223: printk(KERN_DEBUG "%s: Sending a multicast list set command" ! 1224: " from a timer routine.\n", dev->name); ! 1225: set_rx_mode(dev); ! 1226: } ! 1227: /* We must continue to monitor the media. */ ! 1228: sp->timer.expires = RUN_AT(2*HZ); /* 2.0 sec. */ ! 1229: add_timer(&sp->timer); ! 1230: } ! 1231: ! 1232: static void speedo_show_state(struct net_device *dev) ! 1233: { ! 1234: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1235: #if 0 ! 1236: long ioaddr = dev->base_addr; ! 1237: int phy_num = sp->phy[0] & 0x1f; ! 1238: #endif ! 1239: int i; ! 1240: ! 1241: /* Print a few items for debugging. */ ! 1242: if (speedo_debug > 0) { ! 1243: int i; ! 1244: printk(KERN_DEBUG "%s: Tx ring dump, Tx queue %u / %u:\n", dev->name, ! 1245: sp->cur_tx, sp->dirty_tx); ! 1246: for (i = 0; i < TX_RING_SIZE; i++) ! 1247: printk(KERN_DEBUG "%s: %c%c%2d %8.8x.\n", dev->name, ! 1248: i == sp->dirty_tx % TX_RING_SIZE ? '*' : ' ', ! 1249: i == sp->cur_tx % TX_RING_SIZE ? '=' : ' ', ! 1250: i, sp->tx_ring[i].status); ! 1251: } ! 1252: printk(KERN_DEBUG "%s: Printing Rx ring" ! 1253: " (next to receive into %u, dirty index %u).\n", ! 1254: dev->name, sp->cur_rx, sp->dirty_rx); ! 1255: ! 1256: for (i = 0; i < RX_RING_SIZE; i++) ! 1257: printk(KERN_DEBUG "%s: %c%c%c%2d %8.8x.\n", dev->name, ! 1258: sp->rx_ringp[i] == sp->last_rxf ? 'l' : ' ', ! 1259: i == sp->dirty_rx % RX_RING_SIZE ? '*' : ' ', ! 1260: i == sp->cur_rx % RX_RING_SIZE ? '=' : ' ', ! 1261: i, (sp->rx_ringp[i] != NULL) ? ! 1262: (unsigned)sp->rx_ringp[i]->status : 0); ! 1263: ! 1264: #if 0 ! 1265: for (i = 0; i < 16; i++) { ! 1266: /* FIXME: what does it mean? --SAW */ ! 1267: if (i == 6) i = 21; ! 1268: printk(KERN_DEBUG "%s: PHY index %d register %d is %4.4x.\n", ! 1269: dev->name, phy_num, i, mdio_read(ioaddr, phy_num, i)); ! 1270: } ! 1271: #endif ! 1272: ! 1273: } ! 1274: ! 1275: /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ ! 1276: static void ! 1277: speedo_init_rx_ring(struct net_device *dev) ! 1278: { ! 1279: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1280: struct RxFD *rxf, *last_rxf = NULL; ! 1281: int i; ! 1282: ! 1283: sp->cur_rx = 0; ! 1284: ! 1285: for (i = 0; i < RX_RING_SIZE; i++) { ! 1286: struct sk_buff *skb; ! 1287: skb = dev_alloc_skb(PKT_BUF_SZ + sizeof(struct RxFD)); ! 1288: sp->rx_skbuff[i] = skb; ! 1289: if (skb == NULL) ! 1290: break; /* OK. Just initially short of Rx bufs. */ ! 1291: skb->dev = dev; /* Mark as being used by this device. */ ! 1292: rxf = (struct RxFD *)skb->tail; ! 1293: sp->rx_ringp[i] = rxf; ! 1294: skb_reserve(skb, sizeof(struct RxFD)); ! 1295: if (last_rxf) ! 1296: last_rxf->link = virt_to_le32desc(rxf); ! 1297: last_rxf = rxf; ! 1298: rxf->status = cpu_to_le32(0x00000001); /* '1' is flag value only. */ ! 1299: rxf->link = 0; /* None yet. */ ! 1300: /* This field unused by i82557. */ ! 1301: rxf->rx_buf_addr = 0xffffffff; ! 1302: rxf->count = cpu_to_le32(PKT_BUF_SZ << 16); ! 1303: } ! 1304: sp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); ! 1305: /* Mark the last entry as end-of-list. */ ! 1306: last_rxf->status = cpu_to_le32(0xC0000002); /* '2' is flag value only. */ ! 1307: sp->last_rxf = last_rxf; ! 1308: } ! 1309: ! 1310: static void speedo_purge_tx(struct net_device *dev) ! 1311: { ! 1312: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1313: int entry; ! 1314: ! 1315: while ((int)(sp->cur_tx - sp->dirty_tx) > 0) { ! 1316: entry = sp->dirty_tx % TX_RING_SIZE; ! 1317: if (sp->tx_skbuff[entry]) { ! 1318: sp->stats.tx_errors++; ! 1319: dev_free_skb(sp->tx_skbuff[entry]); ! 1320: sp->tx_skbuff[entry] = 0; ! 1321: } ! 1322: sp->dirty_tx++; ! 1323: } ! 1324: while (sp->mc_setup_head != NULL) { ! 1325: struct speedo_mc_block *t; ! 1326: if (speedo_debug > 1) ! 1327: printk(KERN_DEBUG "%s: freeing mc frame.\n", dev->name); ! 1328: t = sp->mc_setup_head->next; ! 1329: kfree(sp->mc_setup_head); ! 1330: sp->mc_setup_head = t; ! 1331: } ! 1332: sp->mc_setup_tail = NULL; ! 1333: sp->tx_full = 0; ! 1334: netif_wake_queue(dev); ! 1335: } ! 1336: ! 1337: static void reset_mii(struct net_device *dev) ! 1338: { ! 1339: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1340: long ioaddr = dev->base_addr; ! 1341: /* Reset the MII transceiver, suggested by Fred Young @ scalable.com. */ ! 1342: if ((sp->phy[0] & 0x8000) == 0) { ! 1343: int phy_addr = sp->phy[0] & 0x1f; ! 1344: int advertising = mdio_read(ioaddr, phy_addr, 4); ! 1345: int mii_bmcr = mdio_read(ioaddr, phy_addr, 0); ! 1346: mdio_write(ioaddr, phy_addr, 0, 0x0400); ! 1347: mdio_write(ioaddr, phy_addr, 1, 0x0000); ! 1348: mdio_write(ioaddr, phy_addr, 4, 0x0000); ! 1349: mdio_write(ioaddr, phy_addr, 0, 0x8000); ! 1350: #ifdef honor_default_port ! 1351: mdio_write(ioaddr, phy_addr, 0, mii_ctrl[dev->default_port & 7]); ! 1352: #else ! 1353: mdio_read(ioaddr, phy_addr, 0); ! 1354: mdio_write(ioaddr, phy_addr, 0, mii_bmcr); ! 1355: mdio_write(ioaddr, phy_addr, 4, advertising); ! 1356: #endif ! 1357: } ! 1358: } ! 1359: ! 1360: static void speedo_tx_timeout(struct net_device *dev) ! 1361: { ! 1362: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1363: long ioaddr = dev->base_addr; ! 1364: int status = inw(ioaddr + SCBStatus); ! 1365: unsigned long flags; ! 1366: ! 1367: printk(KERN_WARNING "%s: Transmit timed out: status %4.4x " ! 1368: " %4.4x at %d/%d command %8.8x.\n", ! 1369: dev->name, status, inw(ioaddr + SCBCmd), ! 1370: sp->dirty_tx, sp->cur_tx, ! 1371: sp->tx_ring[sp->dirty_tx % TX_RING_SIZE].status); ! 1372: ! 1373: /* Trigger a stats dump to give time before the reset. */ ! 1374: speedo_get_stats(dev); ! 1375: ! 1376: speedo_show_state(dev); ! 1377: #if 0 ! 1378: if ((status & 0x00C0) != 0x0080 ! 1379: && (status & 0x003C) == 0x0010) { ! 1380: /* Only the command unit has stopped. */ ! 1381: printk(KERN_WARNING "%s: Trying to restart the transmitter...\n", ! 1382: dev->name); ! 1383: outl(virt_to_bus(&sp->tx_ring[sp->dirty_tx % TX_RING_SIZE]), ! 1384: ioaddr + SCBPointer); ! 1385: outw(CUStart, ioaddr + SCBCmd); ! 1386: reset_mii(dev); ! 1387: } else { ! 1388: #else ! 1389: { ! 1390: #endif ! 1391: start_bh_atomic(); ! 1392: /* Ensure that timer routine doesn't run! */ ! 1393: del_timer(&sp->timer); ! 1394: end_bh_atomic(); ! 1395: /* Reset the Tx and Rx units. */ ! 1396: outl(PortReset, ioaddr + SCBPort); ! 1397: /* We may get spurious interrupts here. But I don't think that they ! 1398: may do much harm. 1999/12/09 SAW */ ! 1399: udelay(10); ! 1400: /* Disable interrupts. */ ! 1401: outw(SCBMaskAll, ioaddr + SCBCmd); ! 1402: synchronize_irq(); ! 1403: speedo_tx_buffer_gc(dev); ! 1404: /* Free as much as possible. ! 1405: It helps to recover from a hang because of out-of-memory. ! 1406: It also simplifies speedo_resume() in case TX ring is full or ! 1407: close-to-be full. */ ! 1408: speedo_purge_tx(dev); ! 1409: speedo_refill_rx_buffers(dev, 1); ! 1410: spin_lock_irqsave(&sp->lock, flags); ! 1411: speedo_resume(dev); ! 1412: sp->rx_mode = -1; ! 1413: dev->trans_start = jiffies; ! 1414: spin_unlock_irqrestore(&sp->lock, flags); ! 1415: set_rx_mode(dev); /* it takes the spinlock itself --SAW */ ! 1416: /* Reset MII transceiver. Do it before starting the timer to serialize ! 1417: mdio_xxx operations. Yes, it's a paranoya :-) 2000/05/09 SAW */ ! 1418: reset_mii(dev); ! 1419: sp->timer.expires = RUN_AT(2*HZ); ! 1420: add_timer(&sp->timer); ! 1421: } ! 1422: return; ! 1423: } ! 1424: ! 1425: static int ! 1426: speedo_start_xmit(struct sk_buff *skb, struct net_device *dev) ! 1427: { ! 1428: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1429: long ioaddr = dev->base_addr; ! 1430: int entry; ! 1431: ! 1432: #if ! defined(HAS_NETIF_QUEUE) ! 1433: if (test_bit(0, (void*)&dev->tbusy) != 0) { ! 1434: int tickssofar = jiffies - dev->trans_start; ! 1435: if (tickssofar < TX_TIMEOUT - 2) ! 1436: return 1; ! 1437: if (tickssofar < TX_TIMEOUT) { ! 1438: /* Reap sent packets from the full Tx queue. */ ! 1439: unsigned long flags; ! 1440: /* Take a spinlock to make wait_for_cmd_done and sending the ! 1441: command atomic. --SAW */ ! 1442: spin_lock_irqsave(&sp->lock, flags); ! 1443: wait_for_cmd_done(ioaddr + SCBCmd); ! 1444: outw(SCBTriggerIntr, ioaddr + SCBCmd); ! 1445: spin_unlock_irqrestore(&sp->lock, flags); ! 1446: return 1; ! 1447: } ! 1448: speedo_tx_timeout(dev); ! 1449: return 1; ! 1450: } ! 1451: #endif ! 1452: ! 1453: { /* Prevent interrupts from changing the Tx ring from underneath us. */ ! 1454: unsigned long flags; ! 1455: ! 1456: spin_lock_irqsave(&sp->lock, flags); ! 1457: ! 1458: /* Check if there are enough space. */ ! 1459: if ((int)(sp->cur_tx - sp->dirty_tx) >= TX_QUEUE_LIMIT) { ! 1460: printk(KERN_ERR "%s: incorrect tbusy state, fixed.\n", dev->name); ! 1461: netif_stop_queue(dev); ! 1462: sp->tx_full = 1; ! 1463: spin_unlock_irqrestore(&sp->lock, flags); ! 1464: return 1; ! 1465: } ! 1466: ! 1467: /* Calculate the Tx descriptor entry. */ ! 1468: entry = sp->cur_tx++ % TX_RING_SIZE; ! 1469: ! 1470: sp->tx_skbuff[entry] = skb; ! 1471: sp->tx_ring[entry].status = ! 1472: cpu_to_le32(CmdSuspend | CmdTx | CmdTxFlex); ! 1473: if (!(entry & ((TX_RING_SIZE>>2)-1))) ! 1474: sp->tx_ring[entry].status |= cpu_to_le32(CmdIntr); ! 1475: sp->tx_ring[entry].link = ! 1476: virt_to_le32desc(&sp->tx_ring[sp->cur_tx % TX_RING_SIZE]); ! 1477: sp->tx_ring[entry].tx_desc_addr = ! 1478: virt_to_le32desc(&sp->tx_ring[entry].tx_buf_addr0); ! 1479: /* The data region is always in one buffer descriptor. */ ! 1480: sp->tx_ring[entry].count = cpu_to_le32(sp->tx_threshold); ! 1481: sp->tx_ring[entry].tx_buf_addr0 = virt_to_le32desc(skb->data); ! 1482: sp->tx_ring[entry].tx_buf_size0 = cpu_to_le32(skb->len); ! 1483: /* Trigger the command unit resume. */ ! 1484: wait_for_cmd_done(ioaddr + SCBCmd); ! 1485: clear_suspend(sp->last_cmd); ! 1486: /* We want the time window between clearing suspend flag on the previous ! 1487: command and resuming CU to be as small as possible. ! 1488: Interrupts in between are very undesired. --SAW */ ! 1489: outb(CUResume, ioaddr + SCBCmd); ! 1490: sp->last_cmd = (struct descriptor *)&sp->tx_ring[entry]; ! 1491: ! 1492: /* Leave room for set_rx_mode(). If there is no more space than reserved ! 1493: for multicast filter mark the ring as full. */ ! 1494: if ((int)(sp->cur_tx - sp->dirty_tx) >= TX_QUEUE_LIMIT) { ! 1495: netif_stop_queue(dev); ! 1496: sp->tx_full = 1; ! 1497: } ! 1498: ! 1499: spin_unlock_irqrestore(&sp->lock, flags); ! 1500: } ! 1501: ! 1502: dev->trans_start = jiffies; ! 1503: ! 1504: return 0; ! 1505: } ! 1506: ! 1507: static void speedo_tx_buffer_gc(struct net_device *dev) ! 1508: { ! 1509: unsigned int dirty_tx; ! 1510: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1511: ! 1512: dirty_tx = sp->dirty_tx; ! 1513: while ((int)(sp->cur_tx - dirty_tx) > 0) { ! 1514: int entry = dirty_tx % TX_RING_SIZE; ! 1515: int status = le32_to_cpu(sp->tx_ring[entry].status); ! 1516: ! 1517: if (speedo_debug > 5) ! 1518: printk(KERN_DEBUG " scavenge candidate %d status %4.4x.\n", ! 1519: entry, status); ! 1520: if ((status & StatusComplete) == 0) ! 1521: break; /* It still hasn't been processed. */ ! 1522: if (status & TxUnderrun) ! 1523: if (sp->tx_threshold < 0x01e08000) { ! 1524: if (speedo_debug > 2) ! 1525: printk(KERN_DEBUG "%s: TX underrun, threshold adjusted.\n", ! 1526: dev->name); ! 1527: sp->tx_threshold += 0x00040000; ! 1528: } ! 1529: /* Free the original skb. */ ! 1530: if (sp->tx_skbuff[entry]) { ! 1531: sp->stats.tx_packets++; /* Count only user packets. */ ! 1532: /* sp->stats.tx_bytes += sp->tx_skbuff[entry]->len; */ ! 1533: dev_free_skb(sp->tx_skbuff[entry]); ! 1534: sp->tx_skbuff[entry] = 0; ! 1535: } ! 1536: dirty_tx++; ! 1537: } ! 1538: ! 1539: if (speedo_debug && (int)(sp->cur_tx - dirty_tx) > TX_RING_SIZE) { ! 1540: printk(KERN_ERR "out-of-sync dirty pointer, %d vs. %d," ! 1541: " full=%d.\n", ! 1542: dirty_tx, sp->cur_tx, sp->tx_full); ! 1543: dirty_tx += TX_RING_SIZE; ! 1544: } ! 1545: ! 1546: while (sp->mc_setup_head != NULL ! 1547: && (int)(dirty_tx - sp->mc_setup_head->tx - 1) > 0) { ! 1548: struct speedo_mc_block *t; ! 1549: if (speedo_debug > 1) ! 1550: printk(KERN_DEBUG "%s: freeing mc frame.\n", dev->name); ! 1551: t = sp->mc_setup_head->next; ! 1552: kfree(sp->mc_setup_head); ! 1553: sp->mc_setup_head = t; ! 1554: } ! 1555: if (sp->mc_setup_head == NULL) ! 1556: sp->mc_setup_tail = NULL; ! 1557: ! 1558: sp->dirty_tx = dirty_tx; ! 1559: } ! 1560: ! 1561: /* The interrupt handler does all of the Rx thread work and cleans up ! 1562: after the Tx thread. */ ! 1563: static void speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs) ! 1564: { ! 1565: struct net_device *dev = (struct net_device *)dev_instance; ! 1566: struct speedo_private *sp; ! 1567: long ioaddr, boguscnt = max_interrupt_work; ! 1568: unsigned short status; ! 1569: ! 1570: #ifndef final_version ! 1571: if (dev == NULL) { ! 1572: printk(KERN_ERR "speedo_interrupt(): irq %d for unknown device.\n", irq); ! 1573: return; ! 1574: } ! 1575: #endif ! 1576: ! 1577: ioaddr = dev->base_addr; ! 1578: sp = (struct speedo_private *)dev->priv; ! 1579: ! 1580: #ifndef final_version ! 1581: /* A lock to prevent simultaneous entry on SMP machines. */ ! 1582: if (test_and_set_bit(0, (void*)&sp->in_interrupt)) { ! 1583: printk(KERN_ERR"%s: SMP simultaneous entry of an interrupt handler.\n", ! 1584: dev->name); ! 1585: sp->in_interrupt = 0; /* Avoid halting machine. */ ! 1586: return; ! 1587: } ! 1588: dev->interrupt = 1; ! 1589: #endif ! 1590: ! 1591: do { ! 1592: status = inw(ioaddr + SCBStatus); ! 1593: /* Acknowledge all of the current interrupt sources ASAP. */ ! 1594: /* Will change from 0xfc00 to 0xff00 when we start handling ! 1595: FCP and ER interrupts --Dragan */ ! 1596: outw(status & 0xfc00, ioaddr + SCBStatus); ! 1597: ! 1598: if (speedo_debug > 3) ! 1599: printk(KERN_DEBUG "%s: interrupt status=%#4.4x.\n", ! 1600: dev->name, status); ! 1601: ! 1602: if ((status & 0xfc00) == 0) ! 1603: break; ! 1604: ! 1605: /* Always check if all rx buffers are allocated. --SAW */ ! 1606: speedo_refill_rx_buffers(dev, 0); ! 1607: ! 1608: if ((status & 0x5000) || /* Packet received, or Rx error. */ ! 1609: (sp->rx_ring_state&(RrNoMem|RrPostponed)) == RrPostponed) ! 1610: /* Need to gather the postponed packet. */ ! 1611: speedo_rx(dev); ! 1612: ! 1613: if (status & 0x1000) { ! 1614: spin_lock(&sp->lock); ! 1615: if ((status & 0x003c) == 0x0028) { /* No more Rx buffers. */ ! 1616: struct RxFD *rxf; ! 1617: printk(KERN_WARNING "%s: card reports no RX buffers.\n", ! 1618: dev->name); ! 1619: rxf = sp->rx_ringp[sp->cur_rx % RX_RING_SIZE]; ! 1620: if (rxf == NULL) { ! 1621: if (speedo_debug > 2) ! 1622: printk(KERN_DEBUG ! 1623: "%s: NULL cur_rx in speedo_interrupt().\n", ! 1624: dev->name); ! 1625: sp->rx_ring_state |= RrNoMem|RrNoResources; ! 1626: } else if (rxf == sp->last_rxf) { ! 1627: if (speedo_debug > 2) ! 1628: printk(KERN_DEBUG ! 1629: "%s: cur_rx is last in speedo_interrupt().\n", ! 1630: dev->name); ! 1631: sp->rx_ring_state |= RrNoMem|RrNoResources; ! 1632: } else ! 1633: outb(RxResumeNoResources, ioaddr + SCBCmd); ! 1634: } else if ((status & 0x003c) == 0x0008) { /* No resources. */ ! 1635: struct RxFD *rxf; ! 1636: printk(KERN_WARNING "%s: card reports no resources.\n", ! 1637: dev->name); ! 1638: rxf = sp->rx_ringp[sp->cur_rx % RX_RING_SIZE]; ! 1639: if (rxf == NULL) { ! 1640: if (speedo_debug > 2) ! 1641: printk(KERN_DEBUG ! 1642: "%s: NULL cur_rx in speedo_interrupt().\n", ! 1643: dev->name); ! 1644: sp->rx_ring_state |= RrNoMem|RrNoResources; ! 1645: } else if (rxf == sp->last_rxf) { ! 1646: if (speedo_debug > 2) ! 1647: printk(KERN_DEBUG ! 1648: "%s: cur_rx is last in speedo_interrupt().\n", ! 1649: dev->name); ! 1650: sp->rx_ring_state |= RrNoMem|RrNoResources; ! 1651: } else { ! 1652: /* Restart the receiver. */ ! 1653: outl(virt_to_bus(sp->rx_ringp[sp->cur_rx % RX_RING_SIZE]), ! 1654: ioaddr + SCBPointer); ! 1655: outb(RxStart, ioaddr + SCBCmd); ! 1656: } ! 1657: } ! 1658: sp->stats.rx_errors++; ! 1659: spin_unlock(&sp->lock); ! 1660: } ! 1661: ! 1662: if ((sp->rx_ring_state&(RrNoMem|RrNoResources)) == RrNoResources) { ! 1663: printk(KERN_WARNING ! 1664: "%s: restart the receiver after a possible hang.\n", ! 1665: dev->name); ! 1666: spin_lock(&sp->lock); ! 1667: /* Restart the receiver. ! 1668: I'm not sure if it's always right to restart the receiver ! 1669: here but I don't know another way to prevent receiver hangs. ! 1670: 1999/12/25 SAW */ ! 1671: outl(virt_to_bus(sp->rx_ringp[sp->cur_rx % RX_RING_SIZE]), ! 1672: ioaddr + SCBPointer); ! 1673: outb(RxStart, ioaddr + SCBCmd); ! 1674: sp->rx_ring_state &= ~RrNoResources; ! 1675: spin_unlock(&sp->lock); ! 1676: } ! 1677: ! 1678: /* User interrupt, Command/Tx unit interrupt or CU not active. */ ! 1679: if (status & 0xA400) { ! 1680: spin_lock(&sp->lock); ! 1681: speedo_tx_buffer_gc(dev); ! 1682: if (sp->tx_full ! 1683: && (int)(sp->cur_tx - sp->dirty_tx) < TX_QUEUE_UNFULL) { ! 1684: /* The ring is no longer full. */ ! 1685: sp->tx_full = 0; ! 1686: netif_wake_queue(dev); /* Attention: under a spinlock. --SAW */ ! 1687: } ! 1688: spin_unlock(&sp->lock); ! 1689: } ! 1690: ! 1691: if (--boguscnt < 0) { ! 1692: printk(KERN_ERR "%s: Too much work at interrupt, status=0x%4.4x.\n", ! 1693: dev->name, status); ! 1694: /* Clear all interrupt sources. */ ! 1695: /* Will change from 0xfc00 to 0xff00 when we start handling ! 1696: FCP and ER interrupts --Dragan */ ! 1697: outl(0xfc00, ioaddr + SCBStatus); ! 1698: break; ! 1699: } ! 1700: } while (1); ! 1701: ! 1702: if (speedo_debug > 3) ! 1703: printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n", ! 1704: dev->name, inw(ioaddr + SCBStatus)); ! 1705: ! 1706: dev->interrupt = 0; ! 1707: clear_bit(0, (void*)&sp->in_interrupt); ! 1708: return; ! 1709: } ! 1710: ! 1711: static inline struct RxFD *speedo_rx_alloc(struct net_device *dev, int entry) ! 1712: { ! 1713: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1714: struct RxFD *rxf; ! 1715: struct sk_buff *skb; ! 1716: /* Get a fresh skbuff to replace the consumed one. */ ! 1717: skb = dev_alloc_skb(PKT_BUF_SZ + sizeof(struct RxFD)); ! 1718: sp->rx_skbuff[entry] = skb; ! 1719: if (skb == NULL) { ! 1720: sp->rx_ringp[entry] = NULL; ! 1721: return NULL; ! 1722: } ! 1723: rxf = sp->rx_ringp[entry] = (struct RxFD *)skb->tail; ! 1724: skb->dev = dev; ! 1725: skb_reserve(skb, sizeof(struct RxFD)); ! 1726: rxf->rx_buf_addr = virt_to_bus(skb->tail); ! 1727: return rxf; ! 1728: } ! 1729: ! 1730: static inline void speedo_rx_link(struct net_device *dev, int entry, ! 1731: struct RxFD *rxf) ! 1732: { ! 1733: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1734: rxf->status = cpu_to_le32(0xC0000001); /* '1' for driver use only. */ ! 1735: rxf->link = 0; /* None yet. */ ! 1736: rxf->count = cpu_to_le32(PKT_BUF_SZ << 16); ! 1737: sp->last_rxf->link = virt_to_le32desc(rxf); ! 1738: sp->last_rxf->status &= cpu_to_le32(~0xC0000000); ! 1739: sp->last_rxf = rxf; ! 1740: } ! 1741: ! 1742: static int speedo_refill_rx_buf(struct net_device *dev, int force) ! 1743: { ! 1744: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1745: int entry; ! 1746: struct RxFD *rxf; ! 1747: ! 1748: entry = sp->dirty_rx % RX_RING_SIZE; ! 1749: if (sp->rx_skbuff[entry] == NULL) { ! 1750: rxf = speedo_rx_alloc(dev, entry); ! 1751: if (rxf == NULL) { ! 1752: unsigned int forw; ! 1753: int forw_entry; ! 1754: if (speedo_debug > 2 || !(sp->rx_ring_state & RrOOMReported)) { ! 1755: printk(KERN_WARNING "%s: can't fill rx buffer (force %d)!\n", ! 1756: dev->name, force); ! 1757: speedo_show_state(dev); ! 1758: sp->rx_ring_state |= RrOOMReported; ! 1759: } ! 1760: if (!force) ! 1761: return -1; /* Better luck next time! */ ! 1762: /* Borrow an skb from one of next entries. */ ! 1763: for (forw = sp->dirty_rx + 1; forw != sp->cur_rx; forw++) ! 1764: if (sp->rx_skbuff[forw % RX_RING_SIZE] != NULL) ! 1765: break; ! 1766: if (forw == sp->cur_rx) ! 1767: return -1; ! 1768: forw_entry = forw % RX_RING_SIZE; ! 1769: sp->rx_skbuff[entry] = sp->rx_skbuff[forw_entry]; ! 1770: sp->rx_skbuff[forw_entry] = NULL; ! 1771: rxf = sp->rx_ringp[forw_entry]; ! 1772: sp->rx_ringp[forw_entry] = NULL; ! 1773: sp->rx_ringp[entry] = rxf; ! 1774: } ! 1775: } else { ! 1776: rxf = sp->rx_ringp[entry]; ! 1777: } ! 1778: speedo_rx_link(dev, entry, rxf); ! 1779: sp->dirty_rx++; ! 1780: sp->rx_ring_state &= ~(RrNoMem|RrOOMReported); /* Mark the progress. */ ! 1781: return 0; ! 1782: } ! 1783: ! 1784: static void speedo_refill_rx_buffers(struct net_device *dev, int force) ! 1785: { ! 1786: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1787: ! 1788: /* Refill the RX ring. */ ! 1789: while ((int)(sp->cur_rx - sp->dirty_rx) > 0 && ! 1790: speedo_refill_rx_buf(dev, force) != -1); ! 1791: } ! 1792: ! 1793: static int ! 1794: speedo_rx(struct net_device *dev) ! 1795: { ! 1796: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1797: int entry = sp->cur_rx % RX_RING_SIZE; ! 1798: int status; ! 1799: int rx_work_limit = sp->dirty_rx + RX_RING_SIZE - sp->cur_rx; ! 1800: int alloc_ok = 1; ! 1801: ! 1802: if (speedo_debug > 4) ! 1803: printk(KERN_DEBUG " In speedo_rx().\n"); ! 1804: /* If we own the next entry, it's a new packet. Send it up. */ ! 1805: while (sp->rx_ringp[entry] != NULL && ! 1806: (status = le32_to_cpu(sp->rx_ringp[entry]->status)) & RxComplete) { ! 1807: int pkt_len = le32_to_cpu(sp->rx_ringp[entry]->count) & 0x3fff; ! 1808: ! 1809: if (--rx_work_limit < 0) ! 1810: break; ! 1811: ! 1812: /* Check for a rare out-of-memory case: the current buffer is ! 1813: the last buffer allocated in the RX ring. --SAW */ ! 1814: if (sp->last_rxf == sp->rx_ringp[entry]) { ! 1815: /* Postpone the packet. It'll be reaped at an interrupt when this ! 1816: packet is no longer the last packet in the ring. */ ! 1817: if (speedo_debug > 2) ! 1818: printk(KERN_DEBUG "%s: RX packet postponed!\n", ! 1819: dev->name); ! 1820: sp->rx_ring_state |= RrPostponed; ! 1821: break; ! 1822: } ! 1823: ! 1824: if (speedo_debug > 4) ! 1825: printk(KERN_DEBUG " speedo_rx() status %8.8x len %d.\n", status, ! 1826: pkt_len); ! 1827: if ((status & (RxErrTooBig|RxOK|0x0f90)) != RxOK) { ! 1828: if (status & RxErrTooBig) ! 1829: printk(KERN_ERR "%s: Ethernet frame overran the Rx buffer, " ! 1830: "status %8.8x!\n", dev->name, status); ! 1831: else if (! (status & RxOK)) { ! 1832: /* There was a fatal error. This *should* be impossible. */ ! 1833: sp->stats.rx_errors++; ! 1834: printk(KERN_ERR "%s: Anomalous event in speedo_rx(), " ! 1835: "status %8.8x.\n", ! 1836: dev->name, status); ! 1837: } ! 1838: } else { ! 1839: struct sk_buff *skb; ! 1840: ! 1841: /* Check if the packet is long enough to just accept without ! 1842: copying to a properly sized skbuff. */ ! 1843: if (pkt_len < rx_copybreak ! 1844: && (skb = dev_alloc_skb(pkt_len + 2)) != 0) { ! 1845: skb->dev = dev; ! 1846: skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ ! 1847: /* 'skb_put()' points to the start of sk_buff data area. */ ! 1848: #if !defined(__alpha__) ! 1849: /* Packet is in one chunk -- we can copy + cksum. */ ! 1850: eth_copy_and_sum(skb, sp->rx_skbuff[entry]->tail, pkt_len, 0); ! 1851: skb_put(skb, pkt_len); ! 1852: #else ! 1853: memcpy(skb_put(skb, pkt_len), sp->rx_skbuff[entry]->tail, ! 1854: pkt_len); ! 1855: #endif ! 1856: } else { ! 1857: /* Pass up the already-filled skbuff. */ ! 1858: skb = sp->rx_skbuff[entry]; ! 1859: if (skb == NULL) { ! 1860: printk(KERN_ERR "%s: Inconsistent Rx descriptor chain.\n", ! 1861: dev->name); ! 1862: break; ! 1863: } ! 1864: sp->rx_skbuff[entry] = NULL; ! 1865: skb_put(skb, pkt_len); ! 1866: sp->rx_ringp[entry] = NULL; ! 1867: } ! 1868: skb->protocol = eth_type_trans(skb, dev); ! 1869: netif_rx(skb); ! 1870: sp->stats.rx_packets++; ! 1871: /* sp->stats.rx_bytes += pkt_len; */ ! 1872: } ! 1873: entry = (++sp->cur_rx) % RX_RING_SIZE; ! 1874: sp->rx_ring_state &= ~RrPostponed; ! 1875: /* Refill the recently taken buffers. ! 1876: Do it one-by-one to handle traffic bursts better. */ ! 1877: if (alloc_ok && speedo_refill_rx_buf(dev, 0) == -1) ! 1878: alloc_ok = 0; ! 1879: } ! 1880: ! 1881: /* Try hard to refill the recently taken buffers. */ ! 1882: speedo_refill_rx_buffers(dev, 1); ! 1883: ! 1884: sp->last_rx_time = jiffies; ! 1885: ! 1886: return 0; ! 1887: } ! 1888: ! 1889: static int ! 1890: speedo_close(struct net_device *dev) ! 1891: { ! 1892: long ioaddr = dev->base_addr; ! 1893: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1894: int i; ! 1895: ! 1896: dev->start = 0; ! 1897: netif_stop_queue(dev); ! 1898: ! 1899: if (speedo_debug > 1) ! 1900: printk(KERN_DEBUG "%s: Shutting down ethercard, status was %4.4x.\n", ! 1901: dev->name, inw(ioaddr + SCBStatus)); ! 1902: ! 1903: /* Shut off the media monitoring timer. */ ! 1904: start_bh_atomic(); ! 1905: del_timer(&sp->timer); ! 1906: end_bh_atomic(); ! 1907: ! 1908: /* Shutting down the chip nicely fails to disable flow control. So.. */ ! 1909: outl(PortPartialReset, ioaddr + SCBPort); ! 1910: ! 1911: free_irq(dev->irq, dev); ! 1912: ! 1913: /* Print a few items for debugging. */ ! 1914: if (speedo_debug > 3) ! 1915: speedo_show_state(dev); ! 1916: ! 1917: /* Free all the skbuffs in the Rx and Tx queues. */ ! 1918: for (i = 0; i < RX_RING_SIZE; i++) { ! 1919: struct sk_buff *skb = sp->rx_skbuff[i]; ! 1920: sp->rx_skbuff[i] = 0; ! 1921: /* Clear the Rx descriptors. */ ! 1922: if (skb) ! 1923: dev_free_skb(skb); ! 1924: } ! 1925: ! 1926: for (i = 0; i < TX_RING_SIZE; i++) { ! 1927: struct sk_buff *skb = sp->tx_skbuff[i]; ! 1928: sp->tx_skbuff[i] = 0; ! 1929: /* Clear the Tx descriptors. */ ! 1930: if (skb) ! 1931: dev_free_skb(skb); ! 1932: } ! 1933: ! 1934: /* Free multicast setting blocks. */ ! 1935: for (i = 0; sp->mc_setup_head != NULL; i++) { ! 1936: struct speedo_mc_block *t; ! 1937: t = sp->mc_setup_head->next; ! 1938: kfree(sp->mc_setup_head); ! 1939: sp->mc_setup_head = t; ! 1940: } ! 1941: sp->mc_setup_tail = NULL; ! 1942: if (speedo_debug > 0) ! 1943: printk(KERN_DEBUG "%s: %d multicast blocks dropped.\n", dev->name, i); ! 1944: ! 1945: MOD_DEC_USE_COUNT; ! 1946: ! 1947: return 0; ! 1948: } ! 1949: ! 1950: /* The Speedo-3 has an especially awkward and unusable method of getting ! 1951: statistics out of the chip. It takes an unpredictable length of time ! 1952: for the dump-stats command to complete. To avoid a busy-wait loop we ! 1953: update the stats with the previous dump results, and then trigger a ! 1954: new dump. ! 1955: ! 1956: These problems are mitigated by the current /proc implementation, which ! 1957: calls this routine first to judge the output length, and then to emit the ! 1958: output. ! 1959: ! 1960: Oh, and incoming frames are dropped while executing dump-stats! ! 1961: */ ! 1962: static struct enet_statistics * ! 1963: speedo_get_stats(struct net_device *dev) ! 1964: { ! 1965: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1966: long ioaddr = dev->base_addr; ! 1967: ! 1968: /* Update only if the previous dump finished. */ ! 1969: if (sp->lstats.done_marker == le32_to_cpu(0xA007)) { ! 1970: sp->stats.tx_aborted_errors += le32_to_cpu(sp->lstats.tx_coll16_errs); ! 1971: sp->stats.tx_window_errors += le32_to_cpu(sp->lstats.tx_late_colls); ! 1972: sp->stats.tx_fifo_errors += le32_to_cpu(sp->lstats.tx_underruns); ! 1973: sp->stats.tx_fifo_errors += le32_to_cpu(sp->lstats.tx_lost_carrier); ! 1974: /*sp->stats.tx_deferred += le32_to_cpu(sp->lstats.tx_deferred);*/ ! 1975: sp->stats.collisions += le32_to_cpu(sp->lstats.tx_total_colls); ! 1976: sp->stats.rx_crc_errors += le32_to_cpu(sp->lstats.rx_crc_errs); ! 1977: sp->stats.rx_frame_errors += le32_to_cpu(sp->lstats.rx_align_errs); ! 1978: sp->stats.rx_over_errors += le32_to_cpu(sp->lstats.rx_resource_errs); ! 1979: sp->stats.rx_fifo_errors += le32_to_cpu(sp->lstats.rx_overrun_errs); ! 1980: sp->stats.rx_length_errors += le32_to_cpu(sp->lstats.rx_runt_errs); ! 1981: sp->lstats.done_marker = 0x0000; ! 1982: if (dev->start) { ! 1983: unsigned long flags; ! 1984: /* Take a spinlock to make wait_for_cmd_done and sending the ! 1985: command atomic. --SAW */ ! 1986: spin_lock_irqsave(&sp->lock, flags); ! 1987: wait_for_cmd_done(ioaddr + SCBCmd); ! 1988: outb(CUDumpStats, ioaddr + SCBCmd); ! 1989: spin_unlock_irqrestore(&sp->lock, flags); ! 1990: } ! 1991: } ! 1992: return &sp->stats; ! 1993: } ! 1994: ! 1995: static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ! 1996: { ! 1997: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 1998: long ioaddr = dev->base_addr; ! 1999: u16 *data = (u16 *)&rq->ifr_data; ! 2000: int phy = sp->phy[0] & 0x1f; ! 2001: ! 2002: switch(cmd) { ! 2003: case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ ! 2004: data[0] = phy; ! 2005: case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ ! 2006: /* FIXME: these operations need to be serialized with MDIO ! 2007: access from the timeout handler. ! 2008: They are currently serialized only with MDIO access from the ! 2009: timer routine. 2000/05/09 SAW */ ! 2010: start_bh_atomic(); ! 2011: data[3] = mdio_read(ioaddr, data[0], data[1]); ! 2012: end_bh_atomic(); ! 2013: return 0; ! 2014: case SIOCDEVPRIVATE+2: /* Write the specified MII register */ ! 2015: if (!capable(CAP_NET_ADMIN)) ! 2016: return -EPERM; ! 2017: start_bh_atomic(); ! 2018: mdio_write(ioaddr, data[0], data[1], data[2]); ! 2019: end_bh_atomic(); ! 2020: return 0; ! 2021: default: ! 2022: return -EOPNOTSUPP; ! 2023: } ! 2024: } ! 2025: ! 2026: /* Set or clear the multicast filter for this adaptor. ! 2027: This is very ugly with Intel chips -- we usually have to execute an ! 2028: entire configuration command, plus process a multicast command. ! 2029: This is complicated. We must put a large configuration command and ! 2030: an arbitrarily-sized multicast command in the transmit list. ! 2031: To minimize the disruption -- the previous command might have already ! 2032: loaded the link -- we convert the current command block, normally a Tx ! 2033: command, into a no-op and link it to the new command. ! 2034: */ ! 2035: static void set_rx_mode(struct net_device *dev) ! 2036: { ! 2037: struct speedo_private *sp = (struct speedo_private *)dev->priv; ! 2038: long ioaddr = dev->base_addr; ! 2039: struct descriptor *last_cmd; ! 2040: char new_rx_mode; ! 2041: unsigned long flags; ! 2042: int entry, i; ! 2043: ! 2044: if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ ! 2045: new_rx_mode = 3; ! 2046: } else if ((dev->flags & IFF_ALLMULTI) || ! 2047: dev->mc_count > multicast_filter_limit) { ! 2048: new_rx_mode = 1; ! 2049: } else ! 2050: new_rx_mode = 0; ! 2051: ! 2052: if (speedo_debug > 3) ! 2053: printk(KERN_DEBUG "%s: set_rx_mode %d -> %d\n", dev->name, ! 2054: sp->rx_mode, new_rx_mode); ! 2055: ! 2056: if ((int)(sp->cur_tx - sp->dirty_tx) > TX_RING_SIZE - TX_MULTICAST_SIZE) { ! 2057: /* The Tx ring is full -- don't add anything! Hope the mode will be ! 2058: * set again later. */ ! 2059: sp->rx_mode = -1; ! 2060: return; ! 2061: } ! 2062: ! 2063: if (new_rx_mode != sp->rx_mode) { ! 2064: u8 *config_cmd_data; ! 2065: ! 2066: spin_lock_irqsave(&sp->lock, flags); ! 2067: entry = sp->cur_tx++ % TX_RING_SIZE; ! 2068: last_cmd = sp->last_cmd; ! 2069: sp->last_cmd = (struct descriptor *)&sp->tx_ring[entry]; ! 2070: ! 2071: sp->tx_skbuff[entry] = 0; /* Redundant. */ ! 2072: sp->tx_ring[entry].status = cpu_to_le32(CmdSuspend | CmdConfigure); ! 2073: sp->tx_ring[entry].link = ! 2074: virt_to_le32desc(&sp->tx_ring[(entry + 1) % TX_RING_SIZE]); ! 2075: config_cmd_data = (void *)&sp->tx_ring[entry].tx_desc_addr; ! 2076: /* Construct a full CmdConfig frame. */ ! 2077: memcpy(config_cmd_data, i82558_config_cmd, sizeof(i82558_config_cmd)); ! 2078: config_cmd_data[1] = (txfifo << 4) | rxfifo; ! 2079: config_cmd_data[4] = rxdmacount; ! 2080: config_cmd_data[5] = txdmacount + 0x80; ! 2081: config_cmd_data[15] |= (new_rx_mode & 2) ? 1 : 0; ! 2082: /* 0x80 doesn't disable FC 0x84 does. ! 2083: Disable Flow control since we are not ACK-ing any FC interrupts ! 2084: for now. --Dragan */ ! 2085: config_cmd_data[19] = 0x84; ! 2086: config_cmd_data[19] |= sp->full_duplex ? 0x40 : 0; ! 2087: config_cmd_data[21] = (new_rx_mode & 1) ? 0x0D : 0x05; ! 2088: if (sp->phy[0] & 0x8000) { /* Use the AUI port instead. */ ! 2089: config_cmd_data[15] |= 0x80; ! 2090: config_cmd_data[8] = 0; ! 2091: } ! 2092: /* Trigger the command unit resume. */ ! 2093: wait_for_cmd_done(ioaddr + SCBCmd); ! 2094: clear_suspend(last_cmd); ! 2095: outb(CUResume, ioaddr + SCBCmd); ! 2096: if ((int)(sp->cur_tx - sp->dirty_tx) >= TX_QUEUE_LIMIT) { ! 2097: netif_stop_queue(dev); ! 2098: sp->tx_full = 1; ! 2099: } ! 2100: spin_unlock_irqrestore(&sp->lock, flags); ! 2101: } ! 2102: ! 2103: if (new_rx_mode == 0 && dev->mc_count < 4) { ! 2104: /* The simple case of 0-3 multicast list entries occurs often, and ! 2105: fits within one tx_ring[] entry. */ ! 2106: struct dev_mc_list *mclist; ! 2107: u16 *setup_params, *eaddrs; ! 2108: ! 2109: spin_lock_irqsave(&sp->lock, flags); ! 2110: entry = sp->cur_tx++ % TX_RING_SIZE; ! 2111: last_cmd = sp->last_cmd; ! 2112: sp->last_cmd = (struct descriptor *)&sp->tx_ring[entry]; ! 2113: ! 2114: sp->tx_skbuff[entry] = 0; ! 2115: sp->tx_ring[entry].status = cpu_to_le32(CmdSuspend | CmdMulticastList); ! 2116: sp->tx_ring[entry].link = ! 2117: virt_to_le32desc(&sp->tx_ring[(entry + 1) % TX_RING_SIZE]); ! 2118: sp->tx_ring[entry].tx_desc_addr = 0; /* Really MC list count. */ ! 2119: setup_params = (u16 *)&sp->tx_ring[entry].tx_desc_addr; ! 2120: *setup_params++ = cpu_to_le16(dev->mc_count*6); ! 2121: /* Fill in the multicast addresses. */ ! 2122: for (i = 0, mclist = dev->mc_list; i < dev->mc_count; ! 2123: i++, mclist = mclist->next) { ! 2124: eaddrs = (u16 *)mclist->dmi_addr; ! 2125: *setup_params++ = *eaddrs++; ! 2126: *setup_params++ = *eaddrs++; ! 2127: *setup_params++ = *eaddrs++; ! 2128: } ! 2129: ! 2130: wait_for_cmd_done(ioaddr + SCBCmd); ! 2131: clear_suspend(last_cmd); ! 2132: /* Immediately trigger the command unit resume. */ ! 2133: outb(CUResume, ioaddr + SCBCmd); ! 2134: ! 2135: if ((int)(sp->cur_tx - sp->dirty_tx) >= TX_QUEUE_LIMIT) { ! 2136: netif_stop_queue(dev); ! 2137: sp->tx_full = 1; ! 2138: } ! 2139: spin_unlock_irqrestore(&sp->lock, flags); ! 2140: } else if (new_rx_mode == 0) { ! 2141: struct dev_mc_list *mclist; ! 2142: u16 *setup_params, *eaddrs; ! 2143: struct speedo_mc_block *mc_blk; ! 2144: struct descriptor *mc_setup_frm; ! 2145: int i; ! 2146: ! 2147: mc_blk = kmalloc(sizeof(*mc_blk) + 2 + multicast_filter_limit*6, ! 2148: GFP_ATOMIC); ! 2149: if (mc_blk == NULL) { ! 2150: printk(KERN_ERR "%s: Failed to allocate a setup frame.\n", ! 2151: dev->name); ! 2152: sp->rx_mode = -1; /* We failed, try again. */ ! 2153: return; ! 2154: } ! 2155: mc_blk->next = NULL; ! 2156: mc_setup_frm = &mc_blk->frame; ! 2157: ! 2158: /* Fill the setup frame. */ ! 2159: if (speedo_debug > 1) ! 2160: printk(KERN_DEBUG "%s: Constructing a setup frame at %p.\n", ! 2161: dev->name, mc_setup_frm); ! 2162: mc_setup_frm->cmd_status = ! 2163: cpu_to_le32(CmdSuspend | CmdIntr | CmdMulticastList); ! 2164: /* Link set below. */ ! 2165: setup_params = (u16 *)&mc_setup_frm->params; ! 2166: *setup_params++ = cpu_to_le16(dev->mc_count*6); ! 2167: /* Fill in the multicast addresses. */ ! 2168: for (i = 0, mclist = dev->mc_list; i < dev->mc_count; ! 2169: i++, mclist = mclist->next) { ! 2170: eaddrs = (u16 *)mclist->dmi_addr; ! 2171: *setup_params++ = *eaddrs++; ! 2172: *setup_params++ = *eaddrs++; ! 2173: *setup_params++ = *eaddrs++; ! 2174: } ! 2175: ! 2176: /* Disable interrupts while playing with the Tx Cmd list. */ ! 2177: spin_lock_irqsave(&sp->lock, flags); ! 2178: ! 2179: if (sp->mc_setup_tail) ! 2180: sp->mc_setup_tail->next = mc_blk; ! 2181: else ! 2182: sp->mc_setup_head = mc_blk; ! 2183: sp->mc_setup_tail = mc_blk; ! 2184: mc_blk->tx = sp->cur_tx; ! 2185: ! 2186: entry = sp->cur_tx++ % TX_RING_SIZE; ! 2187: last_cmd = sp->last_cmd; ! 2188: sp->last_cmd = mc_setup_frm; ! 2189: ! 2190: /* Change the command to a NoOp, pointing to the CmdMulti command. */ ! 2191: sp->tx_skbuff[entry] = 0; ! 2192: sp->tx_ring[entry].status = cpu_to_le32(CmdNOp); ! 2193: sp->tx_ring[entry].link = virt_to_le32desc(mc_setup_frm); ! 2194: ! 2195: /* Set the link in the setup frame. */ ! 2196: mc_setup_frm->link = ! 2197: virt_to_le32desc(&(sp->tx_ring[(entry+1) % TX_RING_SIZE])); ! 2198: ! 2199: wait_for_cmd_done(ioaddr + SCBCmd); ! 2200: clear_suspend(last_cmd); ! 2201: /* Immediately trigger the command unit resume. */ ! 2202: outb(CUResume, ioaddr + SCBCmd); ! 2203: ! 2204: if ((int)(sp->cur_tx - sp->dirty_tx) >= TX_QUEUE_LIMIT) { ! 2205: netif_stop_queue(dev); ! 2206: sp->tx_full = 1; ! 2207: } ! 2208: spin_unlock_irqrestore(&sp->lock, flags); ! 2209: ! 2210: if (speedo_debug > 5) ! 2211: printk(" CmdMCSetup frame length %d in entry %d.\n", ! 2212: dev->mc_count, entry); ! 2213: } ! 2214: ! 2215: sp->rx_mode = new_rx_mode; ! 2216: } ! 2217: ! 2218: #ifdef MODULE ! 2219: ! 2220: int init_module(void) ! 2221: { ! 2222: int cards_found; ! 2223: ! 2224: if (debug >= 0 && speedo_debug != debug) ! 2225: printk(KERN_INFO "eepro100.c: Debug level is %d.\n", debug); ! 2226: if (debug >= 0) ! 2227: speedo_debug = debug; ! 2228: /* Always emit the version message. */ ! 2229: if (speedo_debug) ! 2230: printk(KERN_INFO "%s", version); ! 2231: ! 2232: cards_found = eepro100_init(); ! 2233: if (cards_found <= 0) { ! 2234: printk(KERN_INFO "eepro100: No cards found, driver not installed.\n"); ! 2235: return -ENODEV; ! 2236: } ! 2237: return 0; ! 2238: } ! 2239: ! 2240: void ! 2241: cleanup_module(void) ! 2242: { ! 2243: struct net_device *next_dev; ! 2244: ! 2245: /* No need to check MOD_IN_USE, as sys_delete_module() checks. */ ! 2246: while (root_speedo_dev) { ! 2247: struct speedo_private *sp = (void *)root_speedo_dev->priv; ! 2248: unregister_netdev(root_speedo_dev); ! 2249: release_region(root_speedo_dev->base_addr, SPEEDO3_TOTAL_SIZE); ! 2250: #ifndef USE_IO ! 2251: iounmap((char *)root_speedo_dev->base_addr); ! 2252: #endif ! 2253: next_dev = sp->next_module; ! 2254: if (sp->priv_addr) ! 2255: kfree(sp->priv_addr); ! 2256: kfree(root_speedo_dev); ! 2257: root_speedo_dev = next_dev; ! 2258: } ! 2259: } ! 2260: ! 2261: #else /* not MODULE */ ! 2262: ! 2263: int eepro100_probe(void) ! 2264: { ! 2265: int cards_found = 0; ! 2266: ! 2267: cards_found = eepro100_init(); ! 2268: ! 2269: if (speedo_debug > 0 && cards_found) ! 2270: printk(version); ! 2271: ! 2272: return cards_found ? 0 : -ENODEV; ! 2273: } ! 2274: #endif /* MODULE */ ! 2275: ! 2276: /* ! 2277: * Local variables: ! 2278: * compile-command: "gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c eepro100.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`" ! 2279: * SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c eepro100.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`" ! 2280: * c-indent-level: 4 ! 2281: * c-basic-offset: 4 ! 2282: * tab-width: 4 ! 2283: * End: ! 2284: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.