|
|
1.1 ! root 1: /* tulip.c: A DEC 21040 ethernet driver for linux. */ ! 2: /* ! 3: NOTICE: this version works with kernels 1.1.82 and later only! ! 4: Written 1994,1995 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 SMC EtherPower PCI ethernet adapter. ! 10: It should work with most other DEC 21*40-based ethercards. ! 11: ! 12: The author may be reached as [email protected], or C/O ! 13: Center of Excellence in Space Data and Information Sciences ! 14: Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771 ! 15: */ ! 16: ! 17: static const char *version = "tulip.c:v0.05 1/20/95 [email protected]\n"; ! 18: ! 19: #include <linux/module.h> ! 20: ! 21: #include <linux/kernel.h> ! 22: #include <linux/sched.h> ! 23: #include <linux/string.h> ! 24: #include <linux/ptrace.h> ! 25: #include <linux/errno.h> ! 26: #include <linux/ioport.h> ! 27: #include <linux/malloc.h> ! 28: #include <linux/interrupt.h> ! 29: #include <linux/pci.h> ! 30: #include <linux/bios32.h> ! 31: #include <asm/bitops.h> ! 32: #include <asm/io.h> ! 33: #include <asm/dma.h> ! 34: ! 35: #include <linux/netdevice.h> ! 36: #include <linux/etherdevice.h> ! 37: #include <linux/skbuff.h> ! 38: ! 39: /* The total size is unusually large: The 21040 aligns each of its 16 ! 40: longword-wide registers on a quadword boundary. */ ! 41: #define TULIP_TOTAL_SIZE 0x80 ! 42: ! 43: #ifdef HAVE_DEVLIST ! 44: struct netdev_entry tulip_drv = ! 45: {"Tulip", tulip_pci_probe, TULIP_TOTAL_SIZE, NULL}; ! 46: #endif ! 47: ! 48: #define TULIP_DEBUG 1 ! 49: #ifdef TULIP_DEBUG ! 50: int tulip_debug = TULIP_DEBUG; ! 51: #else ! 52: int tulip_debug = 1; ! 53: #endif ! 54: ! 55: /* ! 56: Theory of Operation ! 57: ! 58: I. Board Compatibility ! 59: ! 60: This device driver is designed for the DECchip 21040 "Tulip", Digital's ! 61: single-chip ethernet controller for PCI, as used on the SMC EtherPower ! 62: ethernet adapter. ! 63: ! 64: II. Board-specific settings ! 65: ! 66: PCI bus devices are configured by the system at boot time, so no jumpers ! 67: need to be set on the board. The system BIOS should be set to assign the ! 68: PCI INTA signal to an otherwise unused system IRQ line. While it's ! 69: physically possible to shared PCI interrupt lines, the kernel doesn't ! 70: support it. ! 71: ! 72: III. Driver operation ! 73: ! 74: IIIa. Ring buffers ! 75: The Tulip can use either ring buffers or lists of Tx and Rx descriptors. ! 76: The current driver uses a statically allocated Rx ring of descriptors and ! 77: buffers, and a list of the Tx buffers. ! 78: ! 79: IIIC. Synchronization ! 80: The driver runs as two independent, single-threaded flows of control. One ! 81: is the send-packet routine, which enforces single-threaded use by the ! 82: dev->tbusy flag. The other thread is the interrupt handler, which is single ! 83: threaded by the hardware and other software. ! 84: ! 85: The send packet thread has partial control over the Tx ring and 'dev->tbusy' ! 86: flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next ! 87: queue slot is empty, it clears the tbusy flag when finished otherwise it sets ! 88: the 'tp->tx_full' flag. ! 89: ! 90: The interrupt handler has exclusive control over the Rx ring and records stats ! 91: from the Tx ring. (The Tx-done interrupt can't be selectively turned off, so ! 92: we can't avoid the interrupt overhead by having the Tx routine reap the Tx ! 93: stats.) After reaping the stats, it marks the queue entry as empty by setting ! 94: the 'base' to zero. Iff the 'tp->tx_full' flag is set, it clears both the ! 95: tx_full and tbusy flags. ! 96: ! 97: IV. Notes ! 98: ! 99: Thanks to Duke Kamstra of SMC for providing an EtherPower board. ! 100: ! 101: The DEC databook doesn't document which Rx filter settings accept broadcast ! 102: packets. Nor does it document how to configure the part to configure the ! 103: serial subsystem for normal (vs. loopback) operation or how to have it ! 104: autoswitch between internal 10baseT, SIA and AUI transceivers. ! 105: ! 106: The databook claims that CSR13, CSR14, and CSR15 should each be the last ! 107: register of the set CSR12-15 written. Hmmm, now how is that possible? ! 108: */ ! 109: ! 110: #define DEC_VENDOR_ID 0x1011 /* Hex 'D' :-> */ ! 111: #define DEC_21040_ID 0x0002 /* Change for 21140. */ ! 112: ! 113: /* Keep the ring sizes a power of two for efficiency. */ ! 114: #define TX_RING_SIZE 4 ! 115: #define RX_RING_SIZE 4 ! 116: #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ ! 117: ! 118: /* Offsets to the Command and Status Registers, "CSRs". All accesses ! 119: must be longword instructions and quadword aligned. */ ! 120: enum tulip_offsets { ! 121: CSR0=0, CSR1=0x08, CSR2=0x10, CSR3=0x18, CSR4=0x20, CSR5=0x28, ! 122: CSR6=0x30, CSR7=0x38, CSR8=0x40, CSR9=0x48, CSR10=0x50, CSR11=0x58, ! 123: CSR12=0x60, CSR13=0x68, CSR14=0x70, CSR15=0x78 }; ! 124: ! 125: /* The Tulip Rx and Tx buffer descriptors. */ ! 126: struct tulip_rx_desc { ! 127: int status; ! 128: int length; ! 129: char *buffer1, *buffer2; /* We use only buffer 1. */ ! 130: }; ! 131: ! 132: struct tulip_tx_desc { ! 133: int status; ! 134: int length; ! 135: char *buffer1, *buffer2; /* We use only buffer 1. */ ! 136: }; ! 137: ! 138: struct tulip_private { ! 139: char devname[8]; /* Used only for kernel debugging. */ ! 140: struct tulip_rx_desc rx_ring[RX_RING_SIZE]; ! 141: struct tulip_tx_desc tx_ring[TX_RING_SIZE]; ! 142: /* The saved address of a sent-in-place packet/buffer, for skfree(). */ ! 143: struct sk_buff* tx_skbuff[TX_RING_SIZE]; ! 144: long rx_buffs; /* Address of temporary Rx buffers. */ ! 145: struct enet_statistics stats; ! 146: int setup_frame[48]; /* Pseudo-Tx frame to init address table. */ ! 147: unsigned int cur_rx, cur_tx; /* The next free ring entry */ ! 148: unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ ! 149: unsigned int tx_full:1; ! 150: int pad0, pad1; /* Used for 8-byte alignment */ ! 151: }; ! 152: ! 153: static void tulip_probe1(int ioaddr, int irq); ! 154: static int tulip_open(struct device *dev); ! 155: static void tulip_init_ring(struct device *dev); ! 156: static int tulip_start_xmit(struct sk_buff *skb, struct device *dev); ! 157: static int tulip_rx(struct device *dev); ! 158: static void tulip_interrupt(int irq, struct pt_regs *regs); ! 159: static int tulip_close(struct device *dev); ! 160: static struct enet_statistics *tulip_get_stats(struct device *dev); ! 161: static void set_multicast_list(struct device *dev); ! 162: static int set_mac_address(struct device *dev, void *addr); ! 163: ! 164: ! 165: ! 166: #ifndef MODULE ! 167: /* This 21040 probe is unlike most other board probes. We can use memory ! 168: efficiently by allocating a large contiguous region and dividing it ! 169: ourselves. This is done by having the initialization occur before ! 170: the 'kmalloc()' memory management system is started. */ ! 171: ! 172: int dec21040_init(void) ! 173: { ! 174: ! 175: if (pcibios_present()) { ! 176: int pci_index; ! 177: for (pci_index = 0; pci_index < 8; pci_index++) { ! 178: unsigned char pci_bus, pci_device_fn, pci_irq_line; ! 179: unsigned long pci_ioaddr; ! 180: ! 181: if (pcibios_find_device (DEC_VENDOR_ID, DEC_21040_ID, pci_index, ! 182: &pci_bus, &pci_device_fn) != 0) ! 183: break; ! 184: pcibios_read_config_byte(pci_bus, pci_device_fn, ! 185: PCI_INTERRUPT_LINE, &pci_irq_line); ! 186: pcibios_read_config_dword(pci_bus, pci_device_fn, ! 187: PCI_BASE_ADDRESS_0, &pci_ioaddr); ! 188: /* Remove I/O space marker in bit 0. */ ! 189: pci_ioaddr &= ~3; ! 190: if (tulip_debug > 2) ! 191: printk("Found DEC PCI Tulip at I/O %#lx, IRQ %d.\n", ! 192: pci_ioaddr, pci_irq_line); ! 193: tulip_probe1(pci_ioaddr, pci_irq_line); ! 194: } ! 195: } ! 196: ! 197: return 0; ! 198: } ! 199: #endif ! 200: #ifdef MODULE ! 201: static int tulip_probe(struct device *dev) ! 202: { ! 203: printk("tulip: This driver does not yet install properly from module!\n"); ! 204: return -1; ! 205: } ! 206: #endif ! 207: ! 208: static void tulip_probe1(int ioaddr, int irq) ! 209: { ! 210: static int did_version = 0; /* Already printed version info. */ ! 211: struct device *dev; ! 212: struct tulip_private *tp; ! 213: int i; ! 214: ! 215: if (tulip_debug > 0 && did_version++ == 0) ! 216: printk(version); ! 217: ! 218: dev = init_etherdev(0, 0); ! 219: ! 220: printk("%s: DEC 21040 Tulip at %#3x,", dev->name, ioaddr); ! 221: ! 222: /* Stop the chip's Tx and Rx processes. */ ! 223: outl(inl(ioaddr + CSR6) & ~0x2002, ioaddr + CSR6); ! 224: /* Clear the missed-packet counter. */ ! 225: inl(ioaddr + CSR8) & 0xffff; ! 226: ! 227: /* The station address ROM is read byte serially. The register must ! 228: be polled, waiting for the value to be read bit serially from the ! 229: EEPROM. ! 230: */ ! 231: outl(0, ioaddr + CSR9); /* Reset the pointer with a dummy write. */ ! 232: for (i = 0; i < 6; i++) { ! 233: int value, boguscnt = 100000; ! 234: do ! 235: value = inl(ioaddr + CSR9); ! 236: while (value < 0 && --boguscnt > 0); ! 237: printk(" %2.2x", dev->dev_addr[i] = value); ! 238: } ! 239: printk(", IRQ %d\n", irq); ! 240: ! 241: /* We do a request_region() only to register /proc/ioports info. */ ! 242: request_region(ioaddr, TULIP_TOTAL_SIZE, "DEC Tulip Ethernet"); ! 243: ! 244: dev->base_addr = ioaddr; ! 245: dev->irq = irq; ! 246: ! 247: /* Make certain the data structures are quadword aligned. */ ! 248: tp = kmalloc(sizeof(*tp), GFP_KERNEL | GFP_DMA); ! 249: dev->priv = tp; ! 250: tp->rx_buffs = kmalloc(PKT_BUF_SZ*RX_RING_SIZE, GFP_KERNEL | GFP_DMA); ! 251: ! 252: /* The Tulip-specific entries in the device structure. */ ! 253: dev->open = &tulip_open; ! 254: dev->hard_start_xmit = &tulip_start_xmit; ! 255: dev->stop = &tulip_close; ! 256: dev->get_stats = &tulip_get_stats; ! 257: dev->set_multicast_list = &set_multicast_list; ! 258: dev->set_mac_address = &set_mac_address; ! 259: ! 260: return; ! 261: } ! 262: ! 263: ! 264: static int ! 265: tulip_open(struct device *dev) ! 266: { ! 267: struct tulip_private *tp = (struct tulip_private *)dev->priv; ! 268: int ioaddr = dev->base_addr; ! 269: ! 270: /* Reset the chip, holding bit 0 set at least 10 PCI cycles. */ ! 271: outl(0xfff80001, ioaddr + CSR0); ! 272: SLOW_DOWN_IO; ! 273: /* Deassert reset. Set 8 longword cache alignment, 8 longword burst. ! 274: Cache alignment bits 15:14 Burst length 13:8 ! 275: 0000 No alignment 0x00000000 unlimited 0800 8 longwords ! 276: 4000 8 longwords 0100 1 longword 1000 16 longwords ! 277: 8000 16 longwords 0200 2 longwords 2000 32 longwords ! 278: C000 32 longwords 0400 4 longwords ! 279: Wait the specified 50 PCI cycles after a reset by initializing ! 280: Tx and Rx queues and the address filter list. */ ! 281: outl(0xfff84800, ioaddr + CSR0); ! 282: ! 283: if (irq2dev_map[dev->irq] != NULL ! 284: || (irq2dev_map[dev->irq] = dev) == NULL ! 285: || dev->irq == 0 ! 286: || request_irq(dev->irq, &tulip_interrupt, 0, "DEC 21040 Tulip")) { ! 287: return -EAGAIN; ! 288: } ! 289: ! 290: if (tulip_debug > 1) ! 291: printk("%s: tulip_open() irq %d.\n", dev->name, dev->irq); ! 292: ! 293: tulip_init_ring(dev); ! 294: ! 295: /* Fill the whole address filter table with our physical address. */ ! 296: { ! 297: unsigned short *eaddrs = (unsigned short *)dev->dev_addr; ! 298: int *setup_frm = tp->setup_frame, i; ! 299: ! 300: /* You must add the broadcast address when doing perfect filtering! */ ! 301: *setup_frm++ = 0xffff; ! 302: *setup_frm++ = 0xffff; ! 303: *setup_frm++ = 0xffff; ! 304: /* Fill the rest of the accept table with our physical address. */ ! 305: for (i = 1; i < 16; i++) { ! 306: *setup_frm++ = eaddrs[0]; ! 307: *setup_frm++ = eaddrs[1]; ! 308: *setup_frm++ = eaddrs[2]; ! 309: } ! 310: /* Put the setup frame on the Tx list. */ ! 311: tp->tx_ring[0].length = 0x08000000 | 192; ! 312: tp->tx_ring[0].buffer1 = (char *)tp->setup_frame; ! 313: tp->tx_ring[0].buffer2 = 0; ! 314: tp->tx_ring[0].status = 0x80000000; ! 315: ! 316: tp->cur_tx++, tp->dirty_tx++; ! 317: } ! 318: ! 319: outl((int)tp->rx_ring, ioaddr + CSR3); ! 320: outl((int)tp->tx_ring, ioaddr + CSR4); ! 321: ! 322: /* Turn on the xcvr interface. */ ! 323: outl(0x00000000, ioaddr + CSR13); ! 324: outl(0x00000004, ioaddr + CSR13); ! 325: ! 326: /* Start the chip's Tx and Rx processes. */ ! 327: outl(0xfffe2002, ioaddr + CSR6); ! 328: ! 329: /* Trigger an immediate transmit demand to process the setup frame. */ ! 330: outl(0, ioaddr + CSR1); ! 331: ! 332: dev->tbusy = 0; ! 333: dev->interrupt = 0; ! 334: dev->start = 1; ! 335: ! 336: /* Enable interrupts by setting the interrupt mask. */ ! 337: outl(0xFFFFFFFF, ioaddr + CSR7); ! 338: ! 339: if (tulip_debug > 2) { ! 340: printk("%s: Done tulip_open(), CSR0 %8.8x, CSR13 %8.8x.\n", ! 341: dev->name, inl(ioaddr + CSR0), inl(ioaddr + CSR13)); ! 342: } ! 343: MOD_INC_USE_COUNT; ! 344: return 0; ! 345: } ! 346: ! 347: /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ ! 348: static void ! 349: tulip_init_ring(struct device *dev) ! 350: { ! 351: struct tulip_private *tp = (struct tulip_private *)dev->priv; ! 352: int i; ! 353: ! 354: tp->tx_full = 0; ! 355: tp->cur_rx = tp->cur_tx = 0; ! 356: tp->dirty_rx = tp->dirty_tx = 0; ! 357: ! 358: for (i = 0; i < RX_RING_SIZE; i++) { ! 359: tp->rx_ring[i].status = 0x80000000; /* Owned by Tulip chip */ ! 360: tp->rx_ring[i].length = PKT_BUF_SZ; ! 361: tp->rx_ring[i].buffer1 = (char *)(tp->rx_buffs + i*PKT_BUF_SZ); ! 362: tp->rx_ring[i].buffer2 = (char *)&tp->rx_ring[i+1]; ! 363: } ! 364: /* Mark the last entry as wrapping the ring. */ ! 365: tp->rx_ring[i-1].length = PKT_BUF_SZ | 0x02000000; ! 366: tp->rx_ring[i-1].buffer2 = (char *)&tp->rx_ring[0]; ! 367: ! 368: /* The Tx buffer descriptor is filled in as needed, but we ! 369: do need to clear the ownership bit. */ ! 370: for (i = 0; i < TX_RING_SIZE; i++) { ! 371: tp->tx_ring[i].status = 0x00000000; ! 372: } ! 373: } ! 374: ! 375: static int ! 376: tulip_start_xmit(struct sk_buff *skb, struct device *dev) ! 377: { ! 378: struct tulip_private *tp = (struct tulip_private *)dev->priv; ! 379: int ioaddr = dev->base_addr; ! 380: int entry; ! 381: ! 382: /* Transmitter timeout, serious problems. */ ! 383: if (dev->tbusy) { ! 384: int tickssofar = jiffies - dev->trans_start; ! 385: int i; ! 386: if (tickssofar < 20) ! 387: return 1; ! 388: printk("%s: transmit timed out, status %8.8x, SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n", ! 389: dev->name, inl(ioaddr + CSR5), inl(ioaddr + CSR12), ! 390: inl(ioaddr + CSR13), inl(ioaddr + CSR14), inl(ioaddr + CSR15)); ! 391: printk(" Rx ring %8.8x: ", (int)tp->rx_ring); ! 392: for (i = 0; i < RX_RING_SIZE; i++) ! 393: printk(" %8.8x", (unsigned int)tp->rx_ring[i].status); ! 394: printk("\n Tx ring %8.8x: ", (int)tp->tx_ring); ! 395: for (i = 0; i < TX_RING_SIZE; i++) ! 396: printk(" %8.8x", (unsigned int)tp->tx_ring[i].status); ! 397: printk("\n"); ! 398: ! 399: tp->stats.tx_errors++; ! 400: /* We should reinitialize the hardware here. */ ! 401: dev->tbusy=0; ! 402: dev->trans_start = jiffies; ! 403: return 0; ! 404: } ! 405: ! 406: if (skb == NULL || skb->len <= 0) { ! 407: printk("%s: Obsolete driver layer request made: skbuff==NULL.\n", ! 408: dev->name); ! 409: dev_tint(dev); ! 410: return 0; ! 411: } ! 412: ! 413: /* Block a timer-based transmit from overlapping. This could better be ! 414: done with atomic_swap(1, dev->tbusy), but set_bit() works as well. ! 415: If this ever occurs the queue layer is doing something evil! */ ! 416: if (set_bit(0, (void*)&dev->tbusy) != 0) { ! 417: printk("%s: Transmitter access conflict.\n", dev->name); ! 418: return 1; ! 419: } ! 420: ! 421: /* Caution: the write order is important here, set the base address ! 422: with the "ownership" bits last. */ ! 423: ! 424: /* Calculate the next Tx descriptor entry. */ ! 425: entry = tp->cur_tx % TX_RING_SIZE; ! 426: ! 427: tp->tx_full = 1; ! 428: tp->tx_skbuff[entry] = skb; ! 429: tp->tx_ring[entry].length = skb->len | ! 430: (entry == TX_RING_SIZE-1 ? 0xe2000000 : 0xe0000000); ! 431: tp->tx_ring[entry].buffer1 = skb->data; ! 432: tp->tx_ring[entry].buffer2 = 0; ! 433: tp->tx_ring[entry].status = 0x80000000; /* Pass ownership to the chip. */ ! 434: ! 435: tp->cur_tx++; ! 436: ! 437: /* Trigger an immediate transmit demand. */ ! 438: outl(0, ioaddr + CSR1); ! 439: ! 440: dev->trans_start = jiffies; ! 441: ! 442: return 0; ! 443: } ! 444: ! 445: /* The interrupt handler does all of the Rx thread work and cleans up ! 446: after the Tx thread. */ ! 447: static void tulip_interrupt(int irq, struct pt_regs *regs) ! 448: { ! 449: struct device *dev = (struct device *)(irq2dev_map[irq]); ! 450: struct tulip_private *lp; ! 451: int csr5, ioaddr, boguscnt=10; ! 452: ! 453: if (dev == NULL) { ! 454: printk ("tulip_interrupt(): irq %d for unknown device.\n", irq); ! 455: return; ! 456: } ! 457: ! 458: ioaddr = dev->base_addr; ! 459: lp = (struct tulip_private *)dev->priv; ! 460: if (dev->interrupt) ! 461: printk("%s: Re-entering the interrupt handler.\n", dev->name); ! 462: ! 463: dev->interrupt = 1; ! 464: ! 465: do { ! 466: csr5 = inl(ioaddr + CSR5); ! 467: /* Acknowledge all of the current interrupt sources ASAP. */ ! 468: outl(csr5 & 0x0001ffff, ioaddr + CSR5); ! 469: ! 470: if (tulip_debug > 4) ! 471: printk("%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n", ! 472: dev->name, csr5, inl(dev->base_addr + CSR5)); ! 473: ! 474: if ((csr5 & 0x00018000) == 0) ! 475: break; ! 476: ! 477: if (csr5 & 0x0040) /* Rx interrupt */ ! 478: tulip_rx(dev); ! 479: ! 480: if (csr5 & 0x0001) { /* Tx-done interrupt */ ! 481: int dirty_tx = lp->dirty_tx; ! 482: ! 483: while (dirty_tx < lp->cur_tx) { ! 484: int entry = dirty_tx % TX_RING_SIZE; ! 485: int status = lp->tx_ring[entry].status; ! 486: ! 487: if (status < 0) ! 488: break; /* It still hasn't been Txed */ ! 489: ! 490: if (status & 0x8000) { ! 491: /* There was an major error, log it. */ ! 492: lp->stats.tx_errors++; ! 493: if (status & 0x4104) lp->stats.tx_aborted_errors++; ! 494: if (status & 0x0C00) lp->stats.tx_carrier_errors++; ! 495: if (status & 0x0200) lp->stats.tx_window_errors++; ! 496: if (status & 0x0002) lp->stats.tx_fifo_errors++; ! 497: if (status & 0x0080) lp->stats.tx_heartbeat_errors++; ! 498: #ifdef ETHER_STATS ! 499: if (status & 0x0100) lp->stats.collisions16++; ! 500: #endif ! 501: } else { ! 502: #ifdef ETHER_STATS ! 503: if (status & 0x0001) lp->stats.tx_deferred++; ! 504: #endif ! 505: lp->stats.collisions += (status >> 3) & 15; ! 506: lp->stats.tx_packets++; ! 507: } ! 508: ! 509: /* Free the original skb. */ ! 510: dev_kfree_skb(lp->tx_skbuff[entry], FREE_WRITE); ! 511: dirty_tx++; ! 512: } ! 513: ! 514: #ifndef final_version ! 515: if (lp->cur_tx - dirty_tx >= TX_RING_SIZE) { ! 516: printk("out-of-sync dirty pointer, %d vs. %d, full=%d.\n", ! 517: dirty_tx, lp->cur_tx, lp->tx_full); ! 518: dirty_tx += TX_RING_SIZE; ! 519: } ! 520: #endif ! 521: ! 522: if (lp->tx_full && dev->tbusy ! 523: && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) { ! 524: /* The ring is no longer full, clear tbusy. */ ! 525: lp->tx_full = 0; ! 526: dev->tbusy = 0; ! 527: mark_bh(NET_BH); ! 528: } ! 529: ! 530: lp->dirty_tx = dirty_tx; ! 531: } ! 532: ! 533: /* Log errors. */ ! 534: if (csr5 & 0x8000) { /* Abnormal error summary bit. */ ! 535: if (csr5 & 0x0008) lp->stats.tx_errors++; /* Tx babble. */ ! 536: if (csr5 & 0x0100) { /* Missed a Rx frame. */ ! 537: lp->stats.rx_errors++; ! 538: lp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff; ! 539: } ! 540: if (csr5 & 0x0800) { ! 541: printk("%s: Something Wicked happened! %8.8x.\n", ! 542: dev->name, csr5); ! 543: /* Hmmmmm, it's not clear what to do here. */ ! 544: } ! 545: } ! 546: if (--boguscnt < 0) { ! 547: printk("%s: Too much work at interrupt, csr5=0x%8.8x.\n", ! 548: dev->name, csr5); ! 549: /* Clear all interrupt sources. */ ! 550: outl(0x0001ffff, ioaddr + CSR5); ! 551: break; ! 552: } ! 553: } while (1); ! 554: ! 555: if (tulip_debug > 3) ! 556: printk("%s: exiting interrupt, csr5=%#4.4x.\n", ! 557: dev->name, inl(ioaddr + CSR5)); ! 558: ! 559: /* Special code for testing *only*. */ ! 560: { ! 561: static int stopit = 10; ! 562: if (dev->start == 0 && --stopit < 0) { ! 563: printk("%s: Emergency stop, looping startup interrupt.\n", ! 564: dev->name); ! 565: free_irq(irq); ! 566: } ! 567: } ! 568: ! 569: dev->interrupt = 0; ! 570: return; ! 571: } ! 572: ! 573: static int ! 574: tulip_rx(struct device *dev) ! 575: { ! 576: struct tulip_private *lp = (struct tulip_private *)dev->priv; ! 577: int entry = lp->cur_rx % RX_RING_SIZE; ! 578: int i; ! 579: ! 580: if (tulip_debug > 4) ! 581: printk(" In tulip_rx().\n"); ! 582: /* If we own the next entry, it's a new packet. Send it up. */ ! 583: while (lp->rx_ring[entry].status >= 0) { ! 584: int status = lp->rx_ring[entry].status; ! 585: ! 586: if (tulip_debug > 4) ! 587: printk(" tulip_rx() status was %8.8x.\n", status); ! 588: if ((status & 0x0300) != 0x0300) { ! 589: printk("%s: Ethernet frame spanned multiple buffers, status %8.8x!\n", ! 590: dev->name, status); ! 591: } else if (status & 0x8000) { ! 592: /* There was a fatal error. */ ! 593: lp->stats.rx_errors++; /* end of a packet.*/ ! 594: if (status & 0x0890) lp->stats.rx_length_errors++; ! 595: if (status & 0x0004) lp->stats.rx_frame_errors++; ! 596: if (status & 0x0002) lp->stats.rx_crc_errors++; ! 597: if (status & 0x0001) lp->stats.rx_fifo_errors++; ! 598: } else { ! 599: /* Malloc up new buffer, compatible with net-2e. */ ! 600: short pkt_len = lp->rx_ring[entry].status >> 16; ! 601: struct sk_buff *skb; ! 602: ! 603: skb = dev_alloc_skb(pkt_len+2); ! 604: if (skb == NULL) { ! 605: printk("%s: Memory squeeze, deferring packet.\n", dev->name); ! 606: /* Check that at least two ring entries are free. ! 607: If not, free one and mark stats->rx_dropped++. */ ! 608: for (i=0; i < RX_RING_SIZE; i++) ! 609: if (lp->rx_ring[(entry+i) % RX_RING_SIZE].status < 0) ! 610: break; ! 611: ! 612: if (i > RX_RING_SIZE -2) { ! 613: lp->stats.rx_dropped++; ! 614: lp->rx_ring[entry].status = 0x80000000; ! 615: lp->cur_rx++; ! 616: } ! 617: break; ! 618: } ! 619: skb->dev = dev; ! 620: skb_reserve(skb,2); /* 16 byte align the data fields */ ! 621: memcpy(skb_put(skb,pkt_len), lp->rx_ring[entry].buffer1, pkt_len); ! 622: skb->protocol=eth_type_trans(skb,dev); ! 623: netif_rx(skb); ! 624: lp->stats.rx_packets++; ! 625: } ! 626: ! 627: lp->rx_ring[entry].status = 0x80000000; ! 628: entry = (++lp->cur_rx) % RX_RING_SIZE; ! 629: } ! 630: ! 631: return 0; ! 632: } ! 633: ! 634: static int ! 635: tulip_close(struct device *dev) ! 636: { ! 637: int ioaddr = dev->base_addr; ! 638: struct tulip_private *tp = (struct tulip_private *)dev->priv; ! 639: ! 640: dev->start = 0; ! 641: dev->tbusy = 1; ! 642: ! 643: if (tulip_debug > 1) ! 644: printk("%s: Shutting down ethercard, status was %2.2x.\n", ! 645: dev->name, inl(ioaddr + CSR5)); ! 646: ! 647: /* Disable interrupts by clearing the interrupt mask. */ ! 648: outl(0x00000000, ioaddr + CSR7); ! 649: /* Stop the chip's Tx and Rx processes. */ ! 650: outl(inl(ioaddr + CSR6) & ~0x2002, ioaddr + CSR6); ! 651: ! 652: tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff; ! 653: ! 654: free_irq(dev->irq); ! 655: irq2dev_map[dev->irq] = 0; ! 656: ! 657: MOD_DEC_USE_COUNT; ! 658: return 0; ! 659: } ! 660: ! 661: static struct enet_statistics * ! 662: tulip_get_stats(struct device *dev) ! 663: { ! 664: struct tulip_private *tp = (struct tulip_private *)dev->priv; ! 665: short ioaddr = dev->base_addr; ! 666: ! 667: tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff; ! 668: ! 669: return &tp->stats; ! 670: } ! 671: ! 672: /* ! 673: * Set or clear the multicast filter for this adaptor. ! 674: */ ! 675: ! 676: static void set_multicast_list(struct device *dev) ! 677: { ! 678: short ioaddr = dev->base_addr; ! 679: int csr6 = inl(ioaddr + CSR6) & ~0x00D5; ! 680: ! 681: if (dev->flags&IFF_PROMISC) ! 682: { /* Set promiscuous. */ ! 683: outl(csr6 | 0x00C0, ioaddr + CSR6); ! 684: /* Log any net taps. */ ! 685: printk("%s: Promiscuous mode enabled.\n", dev->name); ! 686: } ! 687: else if (dev->mc_count > 15 || (dev->flags&IFF_ALLMULTI)) ! 688: { ! 689: /* Too many to filter perfectly -- accept all multicasts. */ ! 690: outl(csr6 | 0x0080, ioaddr + CSR6); ! 691: } ! 692: else ! 693: { ! 694: struct tulip_private *tp = (struct tulip_private *)dev->priv; ! 695: struct dev_mc_list *dmi=dev->mc_list; ! 696: int *setup_frm = tp->setup_frame; ! 697: unsigned short *eaddrs; ! 698: int i; ! 699: ! 700: /* We have <= 15 addresses that we can use the wonderful ! 701: 16 address perfect filtering of the Tulip. Note that only ! 702: the low shortword of setup_frame[] is valid. */ ! 703: outl(csr6 | 0x0000, ioaddr + CSR6); ! 704: i=0; ! 705: while(dmi) ! 706: { ! 707: eaddrs=(unsigned short *)dmi->dmi_addr; ! 708: dmi=dmi->next; ! 709: i++; ! 710: *setup_frm++ = *eaddrs++; ! 711: *setup_frm++ = *eaddrs++; ! 712: *setup_frm++ = *eaddrs++; ! 713: } ! 714: /* Fill the rest of the table with our physical address. */ ! 715: eaddrs = (unsigned short *)dev->dev_addr; ! 716: do { ! 717: *setup_frm++ = eaddrs[0]; ! 718: *setup_frm++ = eaddrs[1]; ! 719: *setup_frm++ = eaddrs[2]; ! 720: } while (++i < 16); ! 721: ! 722: /* Now add this frame to the Tx list. */ ! 723: } ! 724: } ! 725: ! 726: static int ! 727: set_mac_address(struct device *dev, void *addr) ! 728: { ! 729: int i; ! 730: struct sockaddr *sa=(struct sockaddr *)addr; ! 731: if (dev->start) ! 732: return -EBUSY; ! 733: printk("%s: Setting MAC address to ", dev->name); ! 734: for (i = 0; i < 6; i++) ! 735: printk(" %2.2x", dev->dev_addr[i] = sa->sa_data[i]); ! 736: printk(".\n"); ! 737: return 0; ! 738: } ! 739: ! 740: #ifdef MODULE ! 741: static char devicename[9] = { 0, }; ! 742: static struct device dev_tulip = { ! 743: devicename, /* device name is inserted by linux/drivers/net/net_init.c */ ! 744: 0, 0, 0, 0, ! 745: 0, 0, ! 746: 0, 0, 0, NULL, tulip_probe ! 747: }; ! 748: ! 749: static int io = 0; ! 750: static int irq = 0; ! 751: ! 752: int init_module(void) ! 753: { ! 754: printk("tulip: Sorry, modularization is not completed\n"); ! 755: return -EIO; ! 756: #if 0 ! 757: if (io == 0) ! 758: printk("tulip: You should not use auto-probing with insmod!\n"); ! 759: dev_tulip.base_addr = io; ! 760: dev_tulip.irq = irq; ! 761: if (register_netdev(&dev_tulip) != 0) { ! 762: printk("tulip: register_netdev() returned non-zero.\n"); ! 763: return -EIO; ! 764: } ! 765: return 0; ! 766: #endif ! 767: } ! 768: ! 769: void ! 770: cleanup_module(void) ! 771: { ! 772: unregister_netdev(&dev_tulip); ! 773: } ! 774: #endif /* MODULE */ ! 775: ! 776: /* ! 777: * Local variables: ! 778: * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c tulip.c" ! 779: * c-indent-level: 4 ! 780: * tab-width: 4 ! 781: * End: ! 782: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.