|
|
1.1 ! root 1: /* epic100.c: A SMC 83c170 EPIC/100 Fast Ethernet driver for Linux. */ ! 2: /* ! 3: Written 1997-1998 by Donald Becker. ! 4: ! 5: This software may be used and distributed according to the terms ! 6: of the GNU Public License, incorporated herein by reference. ! 7: All other rights reserved. ! 8: ! 9: This driver is for the SMC83c170/175 "EPIC" series, as used on the ! 10: SMC EtherPower II 9432 PCI adapter, and several CardBus cards. ! 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: Support and updates available at ! 17: http://cesdis.gsfc.nasa.gov/linux/drivers/epic100.html ! 18: */ ! 19: ! 20: static const char *version = ! 21: "epic100.c:v1.03 8/7/98 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/epic100.html\n"; ! 22: ! 23: /* A few user-configurable values. */ ! 24: ! 25: /* Keep the ring sizes a power of two for efficiency. ! 26: Making the Tx ring too large decreases the effectiveness of channel ! 27: bonding and packet priority. ! 28: There are no ill effects from too-large receive rings. */ ! 29: #define TX_RING_SIZE 16 ! 30: #define RX_RING_SIZE 32 ! 31: ! 32: /* Set the copy breakpoint for the copy-only-tiny-frames scheme. ! 33: Setting to > 1518 effectively disables this feature. */ ! 34: static int rx_copybreak = 200; ! 35: ! 36: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ ! 37: static int max_interrupt_work = 10; ! 38: ! 39: /* Operational parameters that usually are not changed. */ ! 40: /* Time in jiffies before concluding the transmitter is hung. */ ! 41: #define TX_TIMEOUT ((2000*HZ)/1000) ! 42: ! 43: #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ ! 44: ! 45: /* Bytes transferred to chip before transmission starts. */ ! 46: #define TX_FIFO_THRESH 256 /* Rounded down to 4 byte units. */ ! 47: #define RX_FIFO_THRESH 1 /* 0-3, 0==32, 64,96, or 3==128 bytes */ ! 48: ! 49: #include <linux/config.h> ! 50: #include <linux/version.h> /* Evil, but neccessary */ ! 51: #ifdef MODULE ! 52: #ifdef MODVERSIONS ! 53: #include <linux/modversions.h> ! 54: #endif ! 55: #include <linux/module.h> ! 56: #else ! 57: #define MOD_INC_USE_COUNT ! 58: #define MOD_DEC_USE_COUNT ! 59: #endif ! 60: ! 61: #include <linux/kernel.h> ! 62: #include <linux/sched.h> ! 63: #include <linux/string.h> ! 64: #include <linux/timer.h> ! 65: #include <linux/ptrace.h> ! 66: #include <linux/errno.h> ! 67: #include <linux/ioport.h> ! 68: #include <linux/malloc.h> ! 69: #include <linux/interrupt.h> ! 70: #include <linux/pci.h> ! 71: #if LINUX_VERSION_CODE >= 0x20155 ! 72: #define PCI_SUPPORT_VER2 ! 73: #else ! 74: #include <linux/bios32.h> ! 75: #endif ! 76: #include <linux/delay.h> ! 77: ! 78: #include <asm/processor.h> /* Processor type for cache alignment. */ ! 79: #include <asm/bitops.h> ! 80: #include <asm/io.h> ! 81: #include <asm/dma.h> ! 82: ! 83: #include <linux/netdevice.h> ! 84: #include <linux/etherdevice.h> ! 85: #include <linux/skbuff.h> ! 86: ! 87: /* Kernel compatibility defines, common to David Hind's PCMCIA package. ! 88: This is only in the support-all-kernels source code. */ ! 89: ! 90: #if ! defined (LINUX_VERSION_CODE) || LINUX_VERSION_CODE < 0x20000 ! 91: #warning This driver version is only for kernel versions 2.0.0 and later. ! 92: #endif ! 93: ! 94: #define RUN_AT(x) (jiffies + (x)) ! 95: ! 96: #if defined(MODULE) && (LINUX_VERSION_CODE >= 0x20115) ! 97: MODULE_AUTHOR("Donald Becker <[email protected]>"); ! 98: MODULE_DESCRIPTION("SMC 83c170 EPIC series Ethernet driver"); ! 99: MODULE_PARM(debug, "i"); ! 100: MODULE_PARM(options, "1-" __MODULE_STRING(8) "i"); ! 101: MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i"); ! 102: MODULE_PARM(rx_copybreak, "i"); ! 103: MODULE_PARM(max_interrupt_work, "i"); ! 104: #endif ! 105: #if LINUX_VERSION_CODE < 0x20123 ! 106: #define test_and_set_bit(val, addr) set_bit(val, addr) ! 107: #endif ! 108: #if LINUX_VERSION_CODE <= 0x20139 ! 109: #define net_device_stats enet_statistics ! 110: #define NETSTATS_VER2 ! 111: #endif ! 112: #if LINUX_VERSION_CODE < 0x20159 ! 113: #define DEV_FREE_SKB(skb) dev_kfree_skb(skb, FREE_WRITE); ! 114: #else /* Grrr, unneeded incompatible change. */ ! 115: #define DEV_FREE_SKB(skb) dev_kfree_skb(skb); ! 116: #endif ! 117: ! 118: /* The I/O extent. */ ! 119: #define EPIC_TOTAL_SIZE 0x100 ! 120: ! 121: static int epic_debug = 1; ! 122: ! 123: /* ! 124: Theory of Operation ! 125: ! 126: I. Board Compatibility ! 127: ! 128: This device driver is designed for the SMC "EPCI/100", the SMC ! 129: single-chip Ethernet controllers for PCI. This chip is used on ! 130: the SMC EtherPower II boards. ! 131: ! 132: ! 133: II. Board-specific settings ! 134: ! 135: PCI bus devices are configured by the system at boot time, so no jumpers ! 136: need to be set on the board. The system BIOS will assign the ! 137: PCI INTA signal to a (preferably otherwise unused) system IRQ line. ! 138: Note: Kernel versions earlier than 1.3.73 do not support shared PCI ! 139: interrupt lines. ! 140: ! 141: III. Driver operation ! 142: ! 143: IIIa. Ring buffers ! 144: ! 145: IVb. References ! 146: ! 147: http://www.smc.com/components/catalog/smc83c170.html ! 148: http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html ! 149: http://www.national.com/pf/DP/DP83840.html ! 150: ! 151: IVc. Errata ! 152: ! 153: */ ! 154: ! 155: /* The rest of these values should never change. */ ! 156: ! 157: static struct device *epic_probe1(int pci_bus, int pci_devfn, ! 158: struct device *dev, int card_idx); ! 159: ! 160: enum pci_flags_bit { ! 161: PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, ! 162: PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3, ! 163: }; ! 164: struct chip_info { ! 165: const char *name; ! 166: u16 vendor_id, device_id, device_id_mask, pci_flags; ! 167: int io_size, min_latency; ! 168: struct device *(*probe1)(int pci_bus, int pci_devfn, struct device *dev, ! 169: int chip_idx); ! 170: } chip_tbl[] = { ! 171: {"SMSC EPIC/100", 0x10B8, 0x0005, 0x7fff, ! 172: PCI_USES_IO|PCI_USES_MASTER|PCI_ADDR0, EPIC_TOTAL_SIZE, 32, epic_probe1}, ! 173: {0,}, ! 174: }; ! 175: ! 176: /* Offsets to registers, using the (ugh) SMC names. */ ! 177: enum epic_registers { ! 178: COMMAND=0, INTSTAT=4, INTMASK=8, GENCTL=0x0C, NVCTL=0x10, EECTL=0x14, ! 179: PCIBurstCnt=0x18, ! 180: TEST1=0x1C, CRCCNT=0x20, ALICNT=0x24, MPCNT=0x28, /* Rx error counters. */ ! 181: MIICtrl=0x30, MIIData=0x34, MIICfg=0x38, ! 182: LAN0=64, /* MAC address. */ ! 183: MC0=80, /* Multicast filter table. */ ! 184: RxCtrl=96, TxCtrl=112, TxSTAT=0x74, ! 185: PRxCDAR=0x84, RxSTAT=0xA4, EarlyRx=0xB0, PTxCDAR=0xC4, TxThresh=0xDC, ! 186: }; ! 187: ! 188: /* Interrupt register bits, using my own meaningful names. */ ! 189: enum IntrStatus { ! 190: TxIdle=0x40000, RxIdle=0x20000, IntrSummary=0x010000, ! 191: PCIBusErr170=0x7000, PCIBusErr175=0x1000, PhyEvent175=0x8000, ! 192: RxStarted=0x0800, RxEarlyWarn=0x0400, CntFull=0x0200, TxUnderrun=0x0100, ! 193: TxEmpty=0x0080, TxDone=0x0020, RxError=0x0010, ! 194: RxOverflow=0x0008, RxFull=0x0004, RxHeader=0x0002, RxDone=0x0001, ! 195: }; ! 196: ! 197: /* The EPIC100 Rx and Tx buffer descriptors. */ ! 198: ! 199: struct epic_tx_desc { ! 200: s16 status; ! 201: u16 txlength; ! 202: u32 bufaddr; ! 203: u16 buflength; ! 204: u16 control; ! 205: u32 next; ! 206: }; ! 207: ! 208: struct epic_rx_desc { ! 209: s16 status; ! 210: u16 rxlength; ! 211: u32 bufaddr; ! 212: u32 buflength; ! 213: u32 next; ! 214: }; ! 215: ! 216: struct epic_private { ! 217: char devname[8]; /* Used only for kernel debugging. */ ! 218: const char *product_name; ! 219: struct device *next_module; ! 220: ! 221: /* Rx and Rx rings here so that they remain paragraph aligned. */ ! 222: struct epic_rx_desc rx_ring[RX_RING_SIZE]; ! 223: struct epic_tx_desc tx_ring[TX_RING_SIZE]; ! 224: /* The saved address of a sent-in-place packet/buffer, for skfree(). */ ! 225: struct sk_buff* tx_skbuff[TX_RING_SIZE]; ! 226: /* The addresses of receive-in-place skbuffs. */ ! 227: struct sk_buff* rx_skbuff[RX_RING_SIZE]; ! 228: ! 229: /* Ring pointers. */ ! 230: unsigned int cur_rx, cur_tx; /* The next free ring entry */ ! 231: unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ ! 232: ! 233: u8 pci_bus, pci_dev_fn; /* PCI bus location. */ ! 234: u16 chip_id; ! 235: ! 236: struct net_device_stats stats; ! 237: struct timer_list timer; /* Media selection timer. */ ! 238: unsigned char mc_filter[8]; ! 239: signed char phys[4]; /* MII device addresses. */ ! 240: unsigned int tx_full:1; /* The Tx queue is full. */ ! 241: unsigned int full_duplex:1; /* Current duplex setting. */ ! 242: unsigned int force_fd:1; /* Full-duplex operation requested. */ ! 243: unsigned int default_port:4; /* Last dev->if_port value. */ ! 244: unsigned int media2:4; /* Secondary monitored media port. */ ! 245: unsigned int medialock:1; /* Don't sense media type. */ ! 246: unsigned int mediasense:1; /* Media sensing in progress. */ ! 247: int pad0, pad1; /* Used for 8-byte alignment */ ! 248: }; ! 249: ! 250: /* Used to pass the full-duplex flag, etc. */ ! 251: #define MAX_UNITS 8 ! 252: static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; ! 253: static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; ! 254: ! 255: static int epic_open(struct device *dev); ! 256: static int read_eeprom(long ioaddr, int location); ! 257: static int mdio_read(long ioaddr, int phy_id, int location); ! 258: static void mdio_write(long ioaddr, int phy_id, int location, int value); ! 259: static void epic_restart(struct device *dev); ! 260: static void epic_timer(unsigned long data); ! 261: static void epic_tx_timeout(struct device *dev); ! 262: static void epic_init_ring(struct device *dev); ! 263: static int epic_start_xmit(struct sk_buff *skb, struct device *dev); ! 264: static int epic_rx(struct device *dev); ! 265: static void epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs); ! 266: static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd); ! 267: static int epic_close(struct device *dev); ! 268: static struct net_device_stats *epic_get_stats(struct device *dev); ! 269: static void set_rx_mode(struct device *dev); ! 270: ! 271: ! 272: /* A list of all installed EPIC devices, for removing the driver module. */ ! 273: static struct device *root_epic_dev = NULL; ! 274: ! 275: #ifndef CARDBUS ! 276: int epic100_probe(struct device *dev) ! 277: { ! 278: int cards_found = 0; ! 279: int chip_idx; ! 280: u16 pci_command, new_command; ! 281: unsigned char pci_bus, pci_device_fn; ! 282: ! 283: #ifdef PCI_SUPPORT_VER2 ! 284: struct pci_dev *pcidev = NULL; ! 285: while ((pcidev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pcidev)) ! 286: != NULL) { ! 287: long pci_ioaddr = pcidev->base_address[0] & ~3; ! 288: int vendor = pcidev->vendor; ! 289: int device = pcidev->device; ! 290: ! 291: for (chip_idx = 0; chip_tbl[chip_idx].vendor_id; chip_idx++) ! 292: if (vendor == chip_tbl[chip_idx].vendor_id ! 293: && (device & chip_tbl[chip_idx].device_id_mask) == ! 294: chip_tbl[chip_idx].device_id) ! 295: break; ! 296: if (chip_tbl[chip_idx].vendor_id == 0 /* Compiled out! */ ! 297: || check_region(pci_ioaddr, chip_tbl[chip_idx].io_size)) ! 298: continue; ! 299: pci_bus = pcidev->bus->number; ! 300: pci_device_fn = pcidev->devfn; ! 301: #else ! 302: int pci_index; ! 303: ! 304: if ( ! pcibios_present()) ! 305: return -ENODEV; ! 306: ! 307: for (pci_index = 0; pci_index < 0xff; pci_index++) { ! 308: u16 vendor, device; ! 309: u32 pci_ioaddr; ! 310: ! 311: if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, ! 312: pci_index, &pci_bus, &pci_device_fn) ! 313: != PCIBIOS_SUCCESSFUL) ! 314: break; ! 315: pcibios_read_config_word(pci_bus, pci_device_fn, ! 316: PCI_VENDOR_ID, &vendor); ! 317: pcibios_read_config_word(pci_bus, pci_device_fn, ! 318: PCI_DEVICE_ID, &device); ! 319: ! 320: for (chip_idx = 0; chip_tbl[chip_idx].vendor_id; chip_idx++) ! 321: if (vendor == chip_tbl[chip_idx].vendor_id ! 322: && (device & chip_tbl[chip_idx].device_id_mask) == ! 323: chip_tbl[chip_idx].device_id) ! 324: break; ! 325: if (chip_tbl[chip_idx].vendor_id == 0) /* Compiled out! */ ! 326: continue; ! 327: ! 328: pcibios_read_config_dword(pci_bus, pci_device_fn, ! 329: PCI_BASE_ADDRESS_0, &pci_ioaddr); ! 330: /* Remove I/O space marker in bit 0. */ ! 331: pci_ioaddr &= ~3; ! 332: ! 333: if (check_region(pci_ioaddr, chip_tbl[chip_idx].io_size)) ! 334: continue; ! 335: #endif ! 336: ! 337: /* EPIC-specific code: Soft-reset the chip ere setting as master. */ ! 338: outl(0x0001, pci_ioaddr + GENCTL); ! 339: ! 340: /* Activate the card: fix for brain-damaged Win98 BIOSes. */ ! 341: pcibios_read_config_word(pci_bus, pci_device_fn, ! 342: PCI_COMMAND, &pci_command); ! 343: new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO; ! 344: if (pci_command != new_command) { ! 345: printk(KERN_INFO " The PCI BIOS has not enabled Ethernet" ! 346: " device %4.4x-%4.4x." ! 347: " Updating PCI command %4.4x->%4.4x.\n", ! 348: vendor, device, pci_command, new_command); ! 349: pcibios_write_config_word(pci_bus, pci_device_fn, ! 350: PCI_COMMAND, new_command); ! 351: } ! 352: ! 353: dev = chip_tbl[chip_idx].probe1(pci_bus, pci_device_fn, ! 354: dev, cards_found); ! 355: ! 356: /* Check the latency timer. */ ! 357: if (dev) { ! 358: u8 pci_latency; ! 359: pcibios_read_config_byte(pci_bus, pci_device_fn, ! 360: PCI_LATENCY_TIMER, &pci_latency); ! 361: if (pci_latency < chip_tbl[chip_idx].min_latency) { ! 362: printk(KERN_INFO " PCI latency timer (CFLT) value of %d is " ! 363: "unreasonably low, setting to %d.\n", pci_latency, ! 364: chip_tbl[chip_idx].min_latency); ! 365: pcibios_write_config_byte(pci_bus, pci_device_fn, ! 366: PCI_LATENCY_TIMER, ! 367: chip_tbl[chip_idx].min_latency); ! 368: } ! 369: dev = 0; ! 370: cards_found++; ! 371: } ! 372: } ! 373: ! 374: return cards_found ? 0 : -ENODEV; ! 375: } ! 376: #endif /* not CARDBUS */ ! 377: ! 378: static struct device *epic_probe1(int bus, int devfn, struct device *dev, ! 379: int card_idx) ! 380: { ! 381: static int did_version = 0; /* Already printed version info. */ ! 382: struct epic_private *ep; ! 383: int i, option = 0, duplex = 0; ! 384: u16 chip_id; ! 385: u32 ioaddr; ! 386: ! 387: if (epic_debug > 0 && did_version++ == 0) ! 388: printk(KERN_INFO "%s", version); ! 389: ! 390: if (dev && dev->mem_start) { ! 391: option = dev->mem_start; ! 392: duplex = (dev->mem_start & 16) ? 1 : 0; ! 393: } else if (card_idx >= 0 && card_idx < MAX_UNITS) { ! 394: if (options[card_idx] >= 0) ! 395: option = options[card_idx]; ! 396: if (full_duplex[card_idx] >= 0) ! 397: duplex = full_duplex[card_idx]; ! 398: } ! 399: ! 400: dev = init_etherdev(dev, 0); ! 401: ! 402: { /* Grrrr, badly consider interface change. */ ! 403: #if defined(PCI_SUPPORT_VER2) ! 404: struct pci_dev *pdev = pci_find_slot(bus, devfn); ! 405: ioaddr = pdev->base_address[0] & ~3; ! 406: dev->irq = pdev->irq; ! 407: chip_id = pdev->device; ! 408: #else ! 409: u8 irq; ! 410: u32 ioaddr0; ! 411: pcibios_read_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, &ioaddr0); ! 412: pcibios_read_config_byte(bus, devfn, PCI_INTERRUPT_LINE, &irq); ! 413: pcibios_read_config_word(bus, devfn, PCI_DEVICE_ID, &chip_id); ! 414: ioaddr = ioaddr0 & ~3; ! 415: dev->irq = irq; ! 416: #endif ! 417: } ! 418: ! 419: dev->base_addr = ioaddr; ! 420: printk(KERN_INFO "%s: SMC EPIC/100 (chip ID %4.4x) at %#3x, IRQ %d, ", ! 421: dev->name, chip_id, ioaddr, dev->irq); ! 422: ! 423: /* Bring the chip out of low-power mode. */ ! 424: outl(0x4200, ioaddr + GENCTL); ! 425: /* Magic?! If we don't set this bit the MII interface won't work. */ ! 426: outl(0x0008, ioaddr + TEST1); ! 427: ! 428: /* Turn on the MII transceiver. */ ! 429: outl(0x12, ioaddr + MIICfg); ! 430: if (chip_id == 6) ! 431: outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL); ! 432: outl(0x0200, ioaddr + GENCTL); ! 433: ! 434: /* This could also be read from the EEPROM. */ ! 435: for (i = 0; i < 3; i++) ! 436: ((u16 *)dev->dev_addr)[i] = inw(ioaddr + LAN0 + i*4); ! 437: ! 438: for (i = 0; i < 5; i++) ! 439: printk("%2.2x:", dev->dev_addr[i]); ! 440: printk("%2.2x.\n", dev->dev_addr[i]); ! 441: ! 442: if (epic_debug > 1) { ! 443: printk(KERN_DEBUG "%s: EEPROM contents\n", dev->name); ! 444: for (i = 0; i < 64; i++) ! 445: printk(" %4.4x%s", read_eeprom(ioaddr, i), ! 446: i % 16 == 15 ? "\n" : ""); ! 447: } ! 448: ! 449: /* We do a request_region() to register /proc/ioports info. */ ! 450: request_region(ioaddr, EPIC_TOTAL_SIZE, "SMC EPIC/100"); ! 451: ! 452: /* The data structures must be quadword aligned. */ ! 453: ep = kmalloc(sizeof(*ep), GFP_KERNEL | GFP_DMA); ! 454: memset(ep, 0, sizeof(*ep)); ! 455: dev->priv = ep; ! 456: ! 457: ep->next_module = root_epic_dev; ! 458: root_epic_dev = dev; ! 459: ! 460: ep->pci_bus = bus; ! 461: ep->pci_dev_fn = devfn; ! 462: ep->chip_id = chip_id; ! 463: ! 464: /* Find the connected MII xcvrs. ! 465: Doing this in open() would allow detecting external xcvrs later, but ! 466: takes too much time. */ ! 467: { ! 468: int phy, phy_idx; ! 469: for (phy = 1, phy_idx = 0; phy < 32 && phy_idx < sizeof(ep->phys); ! 470: phy++) { ! 471: int mii_status = mdio_read(ioaddr, phy, 1); ! 472: if (mii_status != 0xffff && mii_status != 0x0000) { ! 473: ep->phys[phy_idx++] = phy; ! 474: printk(KERN_INFO "%s: MII transceiver #%d control " ! 475: "%4.4x status %4.4x.\n" ! 476: KERN_INFO "%s: Autonegotiation advertising %4.4x " ! 477: "link partner %4.4x.\n", ! 478: dev->name, phy, mdio_read(ioaddr, phy, 0), mii_status, ! 479: dev->name, mdio_read(ioaddr, phy, 4), ! 480: mdio_read(ioaddr, phy, 5)); ! 481: } ! 482: } ! 483: if (phy_idx == 0) { ! 484: printk(KERN_WARNING "%s: ***WARNING***: No MII transceiver found!\n", ! 485: dev->name); ! 486: /* Use the known PHY address of the EPII. */ ! 487: ep->phys[0] = 3; ! 488: } ! 489: } ! 490: ! 491: /* Turn off the MII xcvr (175 only!), leave the chip in low-power mode. */ ! 492: if (ep->chip_id == 6) ! 493: outl(inl(ioaddr + NVCTL) & ~0x483C, ioaddr + NVCTL); ! 494: outl(0x0008, ioaddr + GENCTL); ! 495: ! 496: /* The lower four bits are the media type. */ ! 497: ep->force_fd = duplex; ! 498: ep->default_port = option; ! 499: if (ep->default_port) ! 500: ep->medialock = 1; ! 501: ! 502: /* The Epic-specific entries in the device structure. */ ! 503: dev->open = &epic_open; ! 504: dev->hard_start_xmit = &epic_start_xmit; ! 505: dev->stop = &epic_close; ! 506: dev->get_stats = &epic_get_stats; ! 507: dev->set_multicast_list = &set_rx_mode; ! 508: dev->do_ioctl = &mii_ioctl; ! 509: ! 510: return dev; ! 511: } ! 512: ! 513: /* Serial EEPROM section. */ ! 514: ! 515: /* EEPROM_Ctrl bits. */ ! 516: #define EE_SHIFT_CLK 0x04 /* EEPROM shift clock. */ ! 517: #define EE_CS 0x02 /* EEPROM chip select. */ ! 518: #define EE_DATA_WRITE 0x08 /* EEPROM chip data in. */ ! 519: #define EE_WRITE_0 0x01 ! 520: #define EE_WRITE_1 0x09 ! 521: #define EE_DATA_READ 0x10 /* EEPROM chip data out. */ ! 522: #define EE_ENB (0x0001 | EE_CS) ! 523: ! 524: /* Delay between EEPROM clock transitions. ! 525: No extra delay is needed with 33Mhz PCI, but 66Mhz is untested. ! 526: */ ! 527: ! 528: #ifdef _LINUX_DELAY_H ! 529: #define eeprom_delay(nanosec) udelay(1) ! 530: #else ! 531: #define eeprom_delay(nanosec) do { ; } while (0) ! 532: #endif ! 533: ! 534: /* The EEPROM commands include the alway-set leading bit. */ ! 535: #define EE_WRITE_CMD (5 << 6) ! 536: #define EE_READ64_CMD (6 << 6) ! 537: #define EE_READ256_CMD (6 << 8) ! 538: #define EE_ERASE_CMD (7 << 6) ! 539: ! 540: static int read_eeprom(long ioaddr, int location) ! 541: { ! 542: int i; ! 543: int retval = 0; ! 544: long ee_addr = ioaddr + EECTL; ! 545: int read_cmd = location | ! 546: (inl(ee_addr) & 0x40) ? EE_READ64_CMD : EE_READ256_CMD; ! 547: ! 548: printk("EEctrl is %x.\n", inl(ee_addr)); ! 549: outl(EE_ENB & ~EE_CS, ee_addr); ! 550: outl(EE_ENB, ee_addr); ! 551: ! 552: /* Shift the read command bits out. */ ! 553: for (i = 12; i >= 0; i--) { ! 554: short dataval = (read_cmd & (1 << i)) ? EE_WRITE_1 : EE_WRITE_0; ! 555: outl(EE_ENB | dataval, ee_addr); ! 556: eeprom_delay(100); ! 557: outl(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); ! 558: eeprom_delay(150); ! 559: } ! 560: outl(EE_ENB, ee_addr); ! 561: ! 562: for (i = 16; i > 0; i--) { ! 563: outl(EE_ENB | EE_SHIFT_CLK, ee_addr); ! 564: eeprom_delay(100); ! 565: retval = (retval << 1) | ((inl(ee_addr) & EE_DATA_READ) ? 1 : 0); ! 566: outl(EE_ENB, ee_addr); ! 567: eeprom_delay(100); ! 568: } ! 569: ! 570: /* Terminate the EEPROM access. */ ! 571: outl(EE_ENB & ~EE_CS, ee_addr); ! 572: return retval; ! 573: } ! 574: ! 575: #define MII_READOP 1 ! 576: #define MII_WRITEOP 2 ! 577: static int mdio_read(long ioaddr, int phy_id, int location) ! 578: { ! 579: int i; ! 580: ! 581: outl((phy_id << 9) | (location << 4) | MII_READOP, ioaddr + MIICtrl); ! 582: /* Typical operation takes < 50 ticks. */ ! 583: for (i = 4000; i > 0; i--) ! 584: if ((inl(ioaddr + MIICtrl) & MII_READOP) == 0) ! 585: return inw(ioaddr + MIIData); ! 586: return 0xffff; ! 587: } ! 588: ! 589: static void mdio_write(long ioaddr, int phy_id, int location, int value) ! 590: { ! 591: int i; ! 592: ! 593: outw(value, ioaddr + MIIData); ! 594: outl((phy_id << 9) | (location << 4) | MII_WRITEOP, ioaddr + MIICtrl); ! 595: for (i = 10000; i > 0; i--) { ! 596: if ((inl(ioaddr + MIICtrl) & MII_WRITEOP) == 0) ! 597: break; ! 598: } ! 599: return; ! 600: } ! 601: ! 602: ! 603: static int ! 604: epic_open(struct device *dev) ! 605: { ! 606: struct epic_private *ep = (struct epic_private *)dev->priv; ! 607: long ioaddr = dev->base_addr; ! 608: int i; ! 609: int mii_reg5; ! 610: ep->full_duplex = ep->force_fd; ! 611: ! 612: /* Soft reset the chip. */ ! 613: outl(0x4001, ioaddr + GENCTL); ! 614: ! 615: if (request_irq(dev->irq, &epic_interrupt, SA_SHIRQ, "SMC EPIC/100", dev)) ! 616: return -EAGAIN; ! 617: ! 618: MOD_INC_USE_COUNT; ! 619: ! 620: epic_init_ring(dev); ! 621: ! 622: outl(0x4000, ioaddr + GENCTL); ! 623: /* This next magic! line by Ken Yamaguchi.. ?? */ ! 624: outl(0x0008, ioaddr + TEST1); ! 625: ! 626: /* Pull the chip out of low-power mode, enable interrupts, and set for ! 627: PCI read multiple. The MIIcfg setting and strange write order are ! 628: required by the details of which bits are reset and the transceiver ! 629: wiring on the Ositech CardBus card. ! 630: */ ! 631: outl(0x12, ioaddr + MIICfg); ! 632: if (ep->chip_id == 6) ! 633: outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL); ! 634: ! 635: #if defined(__powerpc__) || defined(__sparc__) /* Big endian */ ! 636: outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); ! 637: #else ! 638: outl(0x0412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); ! 639: #endif ! 640: ! 641: for (i = 0; i < 3; i++) ! 642: outl(((u16*)dev->dev_addr)[i], ioaddr + LAN0 + i*4); ! 643: ! 644: outl(TX_FIFO_THRESH, ioaddr + TxThresh); ! 645: ! 646: mii_reg5 = mdio_read(ioaddr, ep->phys[0], 5); ! 647: if (mii_reg5 != 0xffff) { ! 648: if ((mii_reg5 & 0x0100) || (mii_reg5 & 0x01C0) == 0x0040) ! 649: ep->full_duplex = 1; ! 650: else if (! (mii_reg5 & 0x4000)) ! 651: mdio_write(ioaddr, ep->phys[0], 0, 0x1200); ! 652: if (epic_debug > 1) ! 653: printk(KERN_INFO "%s: Setting %s-duplex based on MII xcvr %d" ! 654: " register read of %4.4x.\n", dev->name, ! 655: ep->full_duplex ? "full" : "half", ep->phys[0], mii_reg5); ! 656: } ! 657: ! 658: outl(ep->full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl); ! 659: outl(virt_to_bus(ep->rx_ring), ioaddr + PRxCDAR); ! 660: outl(virt_to_bus(ep->tx_ring), ioaddr + PTxCDAR); ! 661: ! 662: /* Start the chip's Rx process. */ ! 663: set_rx_mode(dev); ! 664: outl(0x000A, ioaddr + COMMAND); ! 665: ! 666: dev->tbusy = 0; ! 667: dev->interrupt = 0; ! 668: dev->start = 1; ! 669: ! 670: /* Enable interrupts by setting the interrupt mask. */ ! 671: outl((ep->chip_id == 6 ? PCIBusErr175 : PCIBusErr170) ! 672: | CntFull | TxUnderrun | TxDone ! 673: | RxError | RxOverflow | RxFull | RxHeader | RxDone, ! 674: ioaddr + INTMASK); ! 675: ! 676: if (epic_debug > 1) ! 677: printk(KERN_DEBUG "%s: epic_open() ioaddr %lx IRQ %d status %4.4x " ! 678: "%s-duplex.\n", ! 679: dev->name, ioaddr, dev->irq, inl(ioaddr + GENCTL), ! 680: ep->full_duplex ? "full" : "half"); ! 681: ! 682: /* Set the timer to switch to check for link beat and perhaps switch ! 683: to an alternate media type. */ ! 684: init_timer(&ep->timer); ! 685: ep->timer.expires = RUN_AT((24*HZ)/10); /* 2.4 sec. */ ! 686: ep->timer.data = (unsigned long)dev; ! 687: ep->timer.function = &epic_timer; /* timer handler */ ! 688: add_timer(&ep->timer); ! 689: ! 690: return 0; ! 691: } ! 692: ! 693: /* Reset the chip to recover from a PCI transaction error. ! 694: This may occur at interrupt time. */ ! 695: static void epic_pause(struct device *dev) ! 696: { ! 697: long ioaddr = dev->base_addr; ! 698: struct epic_private *ep = (struct epic_private *)dev->priv; ! 699: ! 700: /* Disable interrupts by clearing the interrupt mask. */ ! 701: outl(0x00000000, ioaddr + INTMASK); ! 702: /* Stop the chip's Tx and Rx DMA processes. */ ! 703: outw(0x0061, ioaddr + COMMAND); ! 704: ! 705: /* Update the error counts. */ ! 706: if (inw(ioaddr + COMMAND) != 0xffff) { ! 707: ep->stats.rx_missed_errors += inb(ioaddr + MPCNT); ! 708: ep->stats.rx_frame_errors += inb(ioaddr + ALICNT); ! 709: ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT); ! 710: } ! 711: ! 712: /* Remove the packets on the Rx queue. */ ! 713: epic_rx(dev); ! 714: } ! 715: ! 716: static void epic_restart(struct device *dev) ! 717: { ! 718: long ioaddr = dev->base_addr; ! 719: struct epic_private *ep = (struct epic_private *)dev->priv; ! 720: int i; ! 721: ! 722: printk(KERN_DEBUG "%s: Restarting the EPIC chip, Rx %d/%d Tx %d/%d.\n", ! 723: dev->name, ep->cur_rx, ep->dirty_rx, ep->dirty_tx, ep->cur_tx); ! 724: /* Soft reset the chip. */ ! 725: outl(0x0001, ioaddr + GENCTL); ! 726: ! 727: udelay(1); ! 728: /* Duplicate code from epic_open(). */ ! 729: outl(0x0008, ioaddr + TEST1); ! 730: ! 731: #if defined(__powerpc__) /* Big endian */ ! 732: outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); ! 733: #else ! 734: outl(0x0412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); ! 735: #endif ! 736: outl(0x12, ioaddr + MIICfg); ! 737: if (ep->chip_id == 6) ! 738: outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL); ! 739: ! 740: for (i = 0; i < 3; i++) ! 741: outl(((u16*)dev->dev_addr)[i], ioaddr + LAN0 + i*4); ! 742: ! 743: outl(TX_FIFO_THRESH, ioaddr + TxThresh); ! 744: outl(ep->full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl); ! 745: outl(virt_to_bus(&ep->rx_ring[ep->cur_rx%RX_RING_SIZE]), ioaddr + PRxCDAR); ! 746: outl(virt_to_bus(&ep->tx_ring[ep->dirty_tx%TX_RING_SIZE]), ! 747: ioaddr + PTxCDAR); ! 748: ! 749: /* Start the chip's Rx process. */ ! 750: set_rx_mode(dev); ! 751: outl(0x000A, ioaddr + COMMAND); ! 752: ! 753: /* Enable interrupts by setting the interrupt mask. */ ! 754: outl((ep->chip_id == 6 ? PCIBusErr175 : PCIBusErr170) ! 755: | CntFull | TxUnderrun | TxDone ! 756: | RxError | RxOverflow | RxFull | RxHeader | RxDone, ! 757: ioaddr + INTMASK); ! 758: printk(KERN_DEBUG "%s: epic_restart() done, cmd status %4.4x, ctl %4.4x" ! 759: " interrupt %4.4x.\n", ! 760: dev->name, inl(ioaddr + COMMAND), inl(ioaddr + GENCTL), ! 761: inl(ioaddr + INTSTAT)); ! 762: return; ! 763: } ! 764: ! 765: static void epic_timer(unsigned long data) ! 766: { ! 767: struct device *dev = (struct device *)data; ! 768: struct epic_private *ep = (struct epic_private *)dev->priv; ! 769: long ioaddr = dev->base_addr; ! 770: int next_tick = 0; ! 771: int mii_reg5 = mdio_read(ioaddr, ep->phys[0], 5); ! 772: ! 773: if (epic_debug > 3) { ! 774: printk(KERN_DEBUG "%s: Media selection tick, Tx status %8.8x.\n", ! 775: dev->name, inl(ioaddr + TxSTAT)); ! 776: printk(KERN_DEBUG "%s: Other registers are IntMask %4.4x " ! 777: "IntStatus %4.4x RxStatus %4.4x.\n", ! 778: dev->name, inl(ioaddr + INTMASK), inl(ioaddr + INTSTAT), ! 779: inl(ioaddr + RxSTAT)); ! 780: } ! 781: if (! ep->force_fd && mii_reg5 != 0xffff) { ! 782: int duplex = (mii_reg5&0x0100) || (mii_reg5 & 0x01C0) == 0x0040; ! 783: if (ep->full_duplex != duplex) { ! 784: ep->full_duplex = duplex; ! 785: printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d link" ! 786: " partner capability of %4.4x.\n", dev->name, ! 787: ep->full_duplex ? "full" : "half", ep->phys[0], mii_reg5); ! 788: outl(ep->full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl); ! 789: } ! 790: next_tick = 60*HZ; ! 791: } ! 792: ! 793: if (next_tick) { ! 794: ep->timer.expires = RUN_AT(next_tick); ! 795: add_timer(&ep->timer); ! 796: } ! 797: } ! 798: ! 799: static void epic_tx_timeout(struct device *dev) ! 800: { ! 801: struct epic_private *ep = (struct epic_private *)dev->priv; ! 802: long ioaddr = dev->base_addr; ! 803: ! 804: if (epic_debug > 0) { ! 805: printk(KERN_WARNING "%s: Transmit timeout using MII device, " ! 806: "Tx status %4.4x.\n", ! 807: dev->name, inw(ioaddr + TxSTAT)); ! 808: if (epic_debug > 1) { ! 809: printk(KERN_DEBUG "%s: Tx indices: dirty_tx %d, cur_tx %d.\n", ! 810: dev->name, ep->dirty_tx, ep->cur_tx); ! 811: } ! 812: } ! 813: if (inw(ioaddr + TxSTAT) & 0x10) { /* Tx FIFO underflow. */ ! 814: ep->stats.tx_fifo_errors++; ! 815: /* Restart the transmit process. */ ! 816: outl(0x0080, ioaddr + COMMAND); ! 817: } ! 818: ! 819: /* Perhaps stop and restart the chip's Tx processes . */ ! 820: /* Trigger a transmit demand. */ ! 821: outl(0x0004, dev->base_addr + COMMAND); ! 822: ! 823: dev->trans_start = jiffies; ! 824: ep->stats.tx_errors++; ! 825: return; ! 826: } ! 827: ! 828: /* Initialize the Rx and Tx rings, along with various 'dev' bits. */ ! 829: static void ! 830: epic_init_ring(struct device *dev) ! 831: { ! 832: struct epic_private *ep = (struct epic_private *)dev->priv; ! 833: int i; ! 834: ! 835: ep->tx_full = 0; ! 836: ep->cur_rx = ep->cur_tx = 0; ! 837: ep->dirty_rx = ep->dirty_tx = 0; ! 838: ! 839: for (i = 0; i < RX_RING_SIZE; i++) { ! 840: ep->rx_ring[i].status = 0x8000; /* Owned by Epic chip */ ! 841: ep->rx_ring[i].buflength = PKT_BUF_SZ; ! 842: { ! 843: /* Note the receive buffer must be longword aligned. ! 844: dev_alloc_skb() provides 16 byte alignment. But do *not* ! 845: use skb_reserve() to align the IP header! */ ! 846: struct sk_buff *skb; ! 847: skb = dev_alloc_skb(PKT_BUF_SZ); ! 848: ep->rx_skbuff[i] = skb; ! 849: if (skb == NULL) ! 850: break; /* Bad news! */ ! 851: skb->dev = dev; /* Mark as being used by this device. */ ! 852: skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ ! 853: ep->rx_ring[i].bufaddr = virt_to_bus(skb->tail); ! 854: } ! 855: ep->rx_ring[i].next = virt_to_bus(&ep->rx_ring[i+1]); ! 856: } ! 857: /* Mark the last entry as wrapping the ring. */ ! 858: ep->rx_ring[i-1].next = virt_to_bus(&ep->rx_ring[0]); ! 859: ! 860: /* The Tx buffer descriptor is filled in as needed, but we ! 861: do need to clear the ownership bit. */ ! 862: for (i = 0; i < TX_RING_SIZE; i++) { ! 863: ep->tx_skbuff[i] = 0; ! 864: ep->tx_ring[i].status = 0x0000; ! 865: ep->tx_ring[i].next = virt_to_bus(&ep->tx_ring[i+1]); ! 866: } ! 867: ep->tx_ring[i-1].next = virt_to_bus(&ep->tx_ring[0]); ! 868: } ! 869: ! 870: static int ! 871: epic_start_xmit(struct sk_buff *skb, struct device *dev) ! 872: { ! 873: struct epic_private *ep = (struct epic_private *)dev->priv; ! 874: int entry; ! 875: u32 flag; ! 876: ! 877: /* Block a timer-based transmit from overlapping. This could better be ! 878: done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */ ! 879: if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) { ! 880: if (jiffies - dev->trans_start < TX_TIMEOUT) ! 881: return 1; ! 882: epic_tx_timeout(dev); ! 883: return 1; ! 884: } ! 885: ! 886: /* Caution: the write order is important here, set the base address ! 887: with the "ownership" bits last. */ ! 888: ! 889: /* Calculate the next Tx descriptor entry. */ ! 890: entry = ep->cur_tx % TX_RING_SIZE; ! 891: ! 892: ep->tx_skbuff[entry] = skb; ! 893: ep->tx_ring[entry].txlength = (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN); ! 894: ep->tx_ring[entry].bufaddr = virt_to_bus(skb->data); ! 895: ep->tx_ring[entry].buflength = skb->len; ! 896: ! 897: if (ep->cur_tx - ep->dirty_tx < TX_RING_SIZE/2) {/* Typical path */ ! 898: flag = 0x10; /* No interrupt */ ! 899: clear_bit(0, (void*)&dev->tbusy); ! 900: } else if (ep->cur_tx - ep->dirty_tx == TX_RING_SIZE/2) { ! 901: flag = 0x14; /* Tx-done intr. */ ! 902: clear_bit(0, (void*)&dev->tbusy); ! 903: } else if (ep->cur_tx - ep->dirty_tx < TX_RING_SIZE - 2) { ! 904: flag = 0x10; /* No Tx-done intr. */ ! 905: clear_bit(0, (void*)&dev->tbusy); ! 906: } else { ! 907: /* Leave room for two additional entries. */ ! 908: flag = 0x14; /* Tx-done intr. */ ! 909: ep->tx_full = 1; ! 910: } ! 911: ! 912: ep->tx_ring[entry].control = flag; ! 913: ep->tx_ring[entry].status = 0x8000; /* Pass ownership to the chip. */ ! 914: ep->cur_tx++; ! 915: /* Trigger an immediate transmit demand. */ ! 916: outl(0x0004, dev->base_addr + COMMAND); ! 917: ! 918: dev->trans_start = jiffies; ! 919: if (epic_debug > 4) ! 920: printk(KERN_DEBUG "%s: Queued Tx packet size %d to slot %d, " ! 921: "flag %2.2x Tx status %8.8x.\n", ! 922: dev->name, (int)skb->len, entry, flag, ! 923: inl(dev->base_addr + TxSTAT)); ! 924: ! 925: return 0; ! 926: } ! 927: ! 928: /* The interrupt handler does all of the Rx thread work and cleans up ! 929: after the Tx thread. */ ! 930: static void epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs) ! 931: { ! 932: struct device *dev = (struct device *)dev_instance; ! 933: struct epic_private *ep; ! 934: int status, ioaddr, boguscnt = max_interrupt_work; ! 935: ! 936: ioaddr = dev->base_addr; ! 937: ep = (struct epic_private *)dev->priv; ! 938: ! 939: #if defined(__i386__) ! 940: /* A lock to prevent simultaneous entry bug on Intel SMP machines. */ ! 941: if (test_and_set_bit(0, (void*)&dev->interrupt)) { ! 942: printk(KERN_ERR"%s: SMP simultaneous entry of an interrupt handler.\n", ! 943: dev->name); ! 944: dev->interrupt = 0; /* Avoid halting machine. */ ! 945: return; ! 946: } ! 947: #else ! 948: if (dev->interrupt) { ! 949: printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name); ! 950: return; ! 951: } ! 952: dev->interrupt = 1; ! 953: #endif ! 954: ! 955: do { ! 956: status = inl(ioaddr + INTSTAT); ! 957: /* Acknowledge all of the current interrupt sources ASAP. */ ! 958: outl(status & 0x00007fff, ioaddr + INTSTAT); ! 959: ! 960: if (epic_debug > 4) ! 961: printk("%s: interrupt interrupt=%#8.8x new intstat=%#8.8x.\n", ! 962: dev->name, status, inl(ioaddr + INTSTAT)); ! 963: ! 964: if ((status & IntrSummary) == 0) ! 965: break; ! 966: ! 967: if (status & (RxDone | RxStarted | RxEarlyWarn)) ! 968: epic_rx(dev); ! 969: ! 970: if (status & (TxEmpty | TxDone)) { ! 971: int dirty_tx; ! 972: ! 973: for (dirty_tx = ep->dirty_tx; dirty_tx < ep->cur_tx; dirty_tx++) { ! 974: int entry = dirty_tx % TX_RING_SIZE; ! 975: int txstatus = ep->tx_ring[entry].status; ! 976: ! 977: if (txstatus < 0) ! 978: break; /* It still hasn't been Txed */ ! 979: ! 980: if ( ! (txstatus & 0x0001)) { ! 981: /* There was an major error, log it. */ ! 982: #ifndef final_version ! 983: if (epic_debug > 1) ! 984: printk("%s: Transmit error, Tx status %8.8x.\n", ! 985: dev->name, txstatus); ! 986: #endif ! 987: ep->stats.tx_errors++; ! 988: if (txstatus & 0x1050) ep->stats.tx_aborted_errors++; ! 989: if (txstatus & 0x0008) ep->stats.tx_carrier_errors++; ! 990: if (txstatus & 0x0040) ep->stats.tx_window_errors++; ! 991: if (txstatus & 0x0010) ep->stats.tx_fifo_errors++; ! 992: #ifdef ETHER_STATS ! 993: if (txstatus & 0x1000) ep->stats.collisions16++; ! 994: #endif ! 995: } else { ! 996: #ifdef ETHER_STATS ! 997: if ((txstatus & 0x0002) != 0) ep->stats.tx_deferred++; ! 998: #endif ! 999: ep->stats.collisions += (txstatus >> 8) & 15; ! 1000: ep->stats.tx_packets++; ! 1001: } ! 1002: ! 1003: /* Free the original skb. */ ! 1004: DEV_FREE_SKB(ep->tx_skbuff[entry]); ! 1005: ep->tx_skbuff[entry] = 0; ! 1006: } ! 1007: ! 1008: #ifndef final_version ! 1009: if (ep->cur_tx - dirty_tx > TX_RING_SIZE) { ! 1010: printk("%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n", ! 1011: dev->name, dirty_tx, ep->cur_tx, ep->tx_full); ! 1012: dirty_tx += TX_RING_SIZE; ! 1013: } ! 1014: #endif ! 1015: ! 1016: if (ep->tx_full && dev->tbusy ! 1017: && dirty_tx > ep->cur_tx - TX_RING_SIZE + 2) { ! 1018: /* The ring is no longer full, clear tbusy. */ ! 1019: ep->tx_full = 0; ! 1020: clear_bit(0, (void*)&dev->tbusy); ! 1021: mark_bh(NET_BH); ! 1022: } ! 1023: ! 1024: ep->dirty_tx = dirty_tx; ! 1025: } ! 1026: ! 1027: /* Check uncommon events all at once. */ ! 1028: if (status & (CntFull | TxUnderrun | RxOverflow | ! 1029: PCIBusErr170 | PCIBusErr175)) { ! 1030: if (status == 0xffffffff) /* Chip failed or removed (CardBus). */ ! 1031: break; ! 1032: /* Always update the error counts to avoid overhead later. */ ! 1033: ep->stats.rx_missed_errors += inb(ioaddr + MPCNT); ! 1034: ep->stats.rx_frame_errors += inb(ioaddr + ALICNT); ! 1035: ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT); ! 1036: ! 1037: if (status & TxUnderrun) { /* Tx FIFO underflow. */ ! 1038: ep->stats.tx_fifo_errors++; ! 1039: outl(1536, ioaddr + TxThresh); ! 1040: /* Restart the transmit process. */ ! 1041: outl(0x0080, ioaddr + COMMAND); ! 1042: } ! 1043: if (status & RxOverflow) { /* Missed a Rx frame. */ ! 1044: ep->stats.rx_errors++; ! 1045: } ! 1046: if (status & PCIBusErr170) { ! 1047: printk(KERN_ERR "%s: PCI Bus Error! EPIC status %4.4x.\n", ! 1048: dev->name, status); ! 1049: epic_pause(dev); ! 1050: epic_restart(dev); ! 1051: } ! 1052: /* Clear all error sources. */ ! 1053: outl(status & 0x7f18, ioaddr + INTSTAT); ! 1054: } ! 1055: if (--boguscnt < 0) { ! 1056: printk(KERN_ERR "%s: Too much work at interrupt, " ! 1057: "IntrStatus=0x%8.8x.\n", ! 1058: dev->name, status); ! 1059: /* Clear all interrupt sources. */ ! 1060: outl(0x0001ffff, ioaddr + INTSTAT); ! 1061: break; ! 1062: } ! 1063: } while (1); ! 1064: ! 1065: if (epic_debug > 3) ! 1066: printk(KERN_DEBUG "%s: exiting interrupt, intr_status=%#4.4x.\n", ! 1067: dev->name, inl(ioaddr + INTSTAT)); ! 1068: ! 1069: #if defined(__i386__) ! 1070: clear_bit(0, (void*)&dev->interrupt); ! 1071: #else ! 1072: dev->interrupt = 0; ! 1073: #endif ! 1074: return; ! 1075: } ! 1076: ! 1077: static int epic_rx(struct device *dev) ! 1078: { ! 1079: struct epic_private *ep = (struct epic_private *)dev->priv; ! 1080: int entry = ep->cur_rx % RX_RING_SIZE; ! 1081: int work_done = 0; ! 1082: ! 1083: if (epic_debug > 4) ! 1084: printk(KERN_DEBUG " In epic_rx(), entry %d %8.8x.\n", entry, ! 1085: ep->rx_ring[entry].status); ! 1086: /* If we own the next entry, it's a new packet. Send it up. */ ! 1087: while (ep->rx_ring[entry].status >= 0 && ep->rx_skbuff[entry]) { ! 1088: int status = ep->rx_ring[entry].status; ! 1089: ! 1090: if (epic_debug > 4) ! 1091: printk(KERN_DEBUG " epic_rx() status was %8.8x.\n", status); ! 1092: if (status & 0x2006) { ! 1093: if (status & 0x2000) { ! 1094: printk(KERN_WARNING "%s: Oversized Ethernet frame spanned " ! 1095: "multiple buffers, status %4.4x!\n", dev->name, status); ! 1096: ep->stats.rx_length_errors++; ! 1097: } else if (status & 0x0006) ! 1098: /* Rx Frame errors are counted in hardware. */ ! 1099: ep->stats.rx_errors++; ! 1100: } else { ! 1101: /* Malloc up new buffer, compatible with net-2e. */ ! 1102: /* Omit the four octet CRC from the length. */ ! 1103: short pkt_len = ep->rx_ring[entry].rxlength - 4; ! 1104: struct sk_buff *skb; ! 1105: ! 1106: /* Check if the packet is long enough to accept without copying ! 1107: to a minimally-sized skbuff. */ ! 1108: if (pkt_len < rx_copybreak ! 1109: && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { ! 1110: skb->dev = dev; ! 1111: skb_reserve(skb, 2); /* 16 byte align the IP header */ ! 1112: #if 1 /* USE_IP_COPYSUM */ ! 1113: eth_copy_and_sum(skb, bus_to_virt(ep->rx_ring[entry].bufaddr), ! 1114: pkt_len, 0); ! 1115: skb_put(skb, pkt_len); ! 1116: #else ! 1117: memcpy(skb_put(skb, pkt_len), ! 1118: bus_to_virt(ep->rx_ring[entry].bufaddr), pkt_len); ! 1119: #endif ! 1120: } else { ! 1121: skb_put(skb = ep->rx_skbuff[entry], pkt_len); ! 1122: ep->rx_skbuff[entry] = NULL; ! 1123: } ! 1124: skb->protocol = eth_type_trans(skb, dev); ! 1125: netif_rx(skb); ! 1126: ep->stats.rx_packets++; ! 1127: } ! 1128: work_done++; ! 1129: entry = (++ep->cur_rx) % RX_RING_SIZE; ! 1130: } ! 1131: ! 1132: /* Refill the Rx ring buffers. */ ! 1133: for (; ep->cur_rx - ep->dirty_rx > 0; ep->dirty_rx++) { ! 1134: entry = ep->dirty_rx % RX_RING_SIZE; ! 1135: if (ep->rx_skbuff[entry] == NULL) { ! 1136: struct sk_buff *skb; ! 1137: skb = ep->rx_skbuff[entry] = dev_alloc_skb(PKT_BUF_SZ); ! 1138: if (skb == NULL) ! 1139: break; ! 1140: skb->dev = dev; /* Mark as being used by this device. */ ! 1141: skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ ! 1142: ep->rx_ring[entry].bufaddr = virt_to_bus(skb->tail); ! 1143: work_done++; ! 1144: } ! 1145: ep->rx_ring[entry].status = 0x8000; ! 1146: } ! 1147: return work_done; ! 1148: } ! 1149: ! 1150: static int epic_close(struct device *dev) ! 1151: { ! 1152: long ioaddr = dev->base_addr; ! 1153: struct epic_private *ep = (struct epic_private *)dev->priv; ! 1154: int i; ! 1155: ! 1156: dev->start = 0; ! 1157: dev->tbusy = 1; ! 1158: ! 1159: if (epic_debug > 1) ! 1160: printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n", ! 1161: dev->name, inl(ioaddr + INTSTAT)); ! 1162: ! 1163: /* Disable interrupts by clearing the interrupt mask. */ ! 1164: outl(0x00000000, ioaddr + INTMASK); ! 1165: /* Stop the chip's Tx and Rx DMA processes. */ ! 1166: outw(0x0061, ioaddr + COMMAND); ! 1167: ! 1168: /* Update the error counts. */ ! 1169: ep->stats.rx_missed_errors += inb(ioaddr + MPCNT); ! 1170: ep->stats.rx_frame_errors += inb(ioaddr + ALICNT); ! 1171: ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT); ! 1172: ! 1173: del_timer(&ep->timer); ! 1174: ! 1175: free_irq(dev->irq, dev); ! 1176: ! 1177: /* Free all the skbuffs in the Rx queue. */ ! 1178: for (i = 0; i < RX_RING_SIZE; i++) { ! 1179: struct sk_buff *skb = ep->rx_skbuff[i]; ! 1180: ep->rx_skbuff[i] = 0; ! 1181: ep->rx_ring[i].status = 0; /* Not owned by Epic chip. */ ! 1182: ep->rx_ring[i].buflength = 0; ! 1183: ep->rx_ring[i].bufaddr = 0xBADF00D0; /* An invalid address. */ ! 1184: if (skb) { ! 1185: #if LINUX_VERSION_CODE < 0x20100 ! 1186: skb->free = 1; ! 1187: #endif ! 1188: DEV_FREE_SKB(skb); ! 1189: } ! 1190: } ! 1191: for (i = 0; i < TX_RING_SIZE; i++) { ! 1192: if (ep->tx_skbuff[i]) ! 1193: DEV_FREE_SKB(ep->tx_skbuff[i]); ! 1194: ep->tx_skbuff[i] = 0; ! 1195: } ! 1196: ! 1197: ! 1198: /* Green! Leave the chip in low-power mode. */ ! 1199: outl(0x0008, ioaddr + GENCTL); ! 1200: ! 1201: MOD_DEC_USE_COUNT; ! 1202: ! 1203: return 0; ! 1204: } ! 1205: ! 1206: static struct net_device_stats *epic_get_stats(struct device *dev) ! 1207: { ! 1208: struct epic_private *ep = (struct epic_private *)dev->priv; ! 1209: long ioaddr = dev->base_addr; ! 1210: ! 1211: if (dev->start) { ! 1212: /* Update the error counts. */ ! 1213: ep->stats.rx_missed_errors += inb(ioaddr + MPCNT); ! 1214: ep->stats.rx_frame_errors += inb(ioaddr + ALICNT); ! 1215: ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT); ! 1216: } ! 1217: ! 1218: return &ep->stats; ! 1219: } ! 1220: ! 1221: /* Set or clear the multicast filter for this adaptor. ! 1222: Note that we only use exclusion around actually queueing the ! 1223: new frame, not around filling ep->setup_frame. This is non-deterministic ! 1224: when re-entered but still correct. */ ! 1225: ! 1226: /* The little-endian AUTODIN II ethernet CRC calculation. ! 1227: N.B. Do not use for bulk data, use a table-based routine instead. ! 1228: This is common code and should be moved to net/core/crc.c */ ! 1229: static unsigned const ethernet_polynomial_le = 0xedb88320U; ! 1230: static inline unsigned ether_crc_le(int length, unsigned char *data) ! 1231: { ! 1232: unsigned int crc = 0xffffffff; /* Initial value. */ ! 1233: while(--length >= 0) { ! 1234: unsigned char current_octet = *data++; ! 1235: int bit; ! 1236: for (bit = 8; --bit >= 0; current_octet >>= 1) { ! 1237: if ((crc ^ current_octet) & 1) { ! 1238: crc >>= 1; ! 1239: crc ^= ethernet_polynomial_le; ! 1240: } else ! 1241: crc >>= 1; ! 1242: } ! 1243: } ! 1244: return crc; ! 1245: } ! 1246: ! 1247: ! 1248: static void set_rx_mode(struct device *dev) ! 1249: { ! 1250: long ioaddr = dev->base_addr; ! 1251: struct epic_private *ep = (struct epic_private *)dev->priv; ! 1252: unsigned char mc_filter[8]; /* Multicast hash filter */ ! 1253: int i; ! 1254: ! 1255: if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ ! 1256: outl(0x002C, ioaddr + RxCtrl); ! 1257: /* Unconditionally log net taps. */ ! 1258: printk(KERN_INFO "%s: Promiscuous mode enabled.\n", dev->name); ! 1259: memset(mc_filter, 0xff, sizeof(mc_filter)); ! 1260: } else if ((dev->mc_count > 0) || (dev->flags & IFF_ALLMULTI)) { ! 1261: /* There is apparently a chip bug, so the multicast filter ! 1262: is never enabled. */ ! 1263: /* Too many to filter perfectly -- accept all multicasts. */ ! 1264: memset(mc_filter, 0xff, sizeof(mc_filter)); ! 1265: outl(0x000C, ioaddr + RxCtrl); ! 1266: } else if (dev->mc_count == 0) { ! 1267: outl(0x0004, ioaddr + RxCtrl); ! 1268: return; ! 1269: } else { /* Never executed, for now. */ ! 1270: struct dev_mc_list *mclist; ! 1271: ! 1272: memset(mc_filter, 0, sizeof(mc_filter)); ! 1273: for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; ! 1274: i++, mclist = mclist->next) ! 1275: set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f, ! 1276: mc_filter); ! 1277: } ! 1278: /* ToDo: perhaps we need to stop the Tx and Rx process here? */ ! 1279: if (memcmp(mc_filter, ep->mc_filter, sizeof(mc_filter))) { ! 1280: for (i = 0; i < 4; i++) ! 1281: outw(((u16 *)mc_filter)[i], ioaddr + MC0 + i*4); ! 1282: memcpy(ep->mc_filter, mc_filter, sizeof(mc_filter)); ! 1283: } ! 1284: return; ! 1285: } ! 1286: ! 1287: static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd) ! 1288: { ! 1289: long ioaddr = dev->base_addr; ! 1290: u16 *data = (u16 *)&rq->ifr_data; ! 1291: ! 1292: switch(cmd) { ! 1293: case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ ! 1294: data[0] = ((struct epic_private *)dev->priv)->phys[0] & 0x1f; ! 1295: /* Fall Through */ ! 1296: case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ ! 1297: if (! dev->start) { ! 1298: outl(0x0200, ioaddr + GENCTL); ! 1299: outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL); ! 1300: } ! 1301: data[3] = mdio_read(ioaddr, data[0] & 0x1f, data[1] & 0x1f); ! 1302: if (! dev->start) { ! 1303: #ifdef notdef ! 1304: outl(0x0008, ioaddr + GENCTL); ! 1305: outl((inl(ioaddr + NVCTL) & ~0x483C) | 0x0000, ioaddr + NVCTL); ! 1306: #endif ! 1307: } ! 1308: return 0; ! 1309: case SIOCDEVPRIVATE+2: /* Write the specified MII register */ ! 1310: if (!suser()) ! 1311: return -EPERM; ! 1312: if (! dev->start) { ! 1313: outl(0x0200, ioaddr + GENCTL); ! 1314: outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL); ! 1315: } ! 1316: mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]); ! 1317: if (! dev->start) { ! 1318: #ifdef notdef ! 1319: outl(0x0008, ioaddr + GENCTL); ! 1320: outl((inl(ioaddr + NVCTL) & ~0x483C) | 0x0000, ioaddr + NVCTL); ! 1321: #endif ! 1322: } ! 1323: return 0; ! 1324: default: ! 1325: return -EOPNOTSUPP; ! 1326: } ! 1327: } ! 1328: ! 1329: ! 1330: #ifdef CARDBUS ! 1331: ! 1332: #include <pcmcia/driver_ops.h> ! 1333: ! 1334: static dev_node_t *epic_attach(dev_locator_t *loc) ! 1335: { ! 1336: struct device *dev; ! 1337: u16 dev_id; ! 1338: u32 io; ! 1339: u8 bus, devfn, irq; ! 1340: ! 1341: if (loc->bus != LOC_PCI) return NULL; ! 1342: bus = loc->b.pci.bus; devfn = loc->b.pci.devfn; ! 1343: printk(KERN_INFO "epic_attach(bus %d, function %d)\n", bus, devfn); ! 1344: pcibios_read_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, &io); ! 1345: pcibios_read_config_byte(bus, devfn, PCI_INTERRUPT_LINE, &irq); ! 1346: pcibios_read_config_word(bus, devfn, PCI_DEVICE_ID, &dev_id); ! 1347: io &= ~3; ! 1348: dev = epic_probe1(bus, devfn, NULL, -1); ! 1349: if (dev) { ! 1350: dev_node_t *node = kmalloc(sizeof(dev_node_t), GFP_KERNEL); ! 1351: strcpy(node->dev_name, dev->name); ! 1352: node->major = node->minor = 0; ! 1353: node->next = NULL; ! 1354: MOD_INC_USE_COUNT; ! 1355: return node; ! 1356: } ! 1357: return NULL; ! 1358: } ! 1359: ! 1360: static void epic_suspend(dev_node_t *node) ! 1361: { ! 1362: struct device **devp, **next; ! 1363: printk(KERN_INFO "epic_suspend(%s)\n", node->dev_name); ! 1364: for (devp = &root_epic_dev; *devp; devp = next) { ! 1365: next = &((struct epic_private *)(*devp)->priv)->next_module; ! 1366: if (strcmp((*devp)->name, node->dev_name) == 0) break; ! 1367: } ! 1368: if (*devp) { ! 1369: long ioaddr = (*devp)->base_addr; ! 1370: epic_pause(*devp); ! 1371: /* Put the chip into low-power mode. */ ! 1372: outl(0x0008, ioaddr + GENCTL); ! 1373: } ! 1374: } ! 1375: static void epic_resume(dev_node_t *node) ! 1376: { ! 1377: struct device **devp, **next; ! 1378: printk(KERN_INFO "epic_resume(%s)\n", node->dev_name); ! 1379: for (devp = &root_epic_dev; *devp; devp = next) { ! 1380: next = &((struct epic_private *)(*devp)->priv)->next_module; ! 1381: if (strcmp((*devp)->name, node->dev_name) == 0) break; ! 1382: } ! 1383: if (*devp) { ! 1384: epic_restart(*devp); ! 1385: } ! 1386: } ! 1387: static void epic_detach(dev_node_t *node) ! 1388: { ! 1389: struct device **devp, **next; ! 1390: printk(KERN_INFO "epic_detach(%s)\n", node->dev_name); ! 1391: for (devp = &root_epic_dev; *devp; devp = next) { ! 1392: next = &((struct epic_private *)(*devp)->priv)->next_module; ! 1393: if (strcmp((*devp)->name, node->dev_name) == 0) break; ! 1394: } ! 1395: if (*devp) { ! 1396: unregister_netdev(*devp); ! 1397: kfree(*devp); ! 1398: *devp = *next; ! 1399: kfree(node); ! 1400: MOD_DEC_USE_COUNT; ! 1401: } ! 1402: } ! 1403: ! 1404: struct driver_operations epic_ops = { ! 1405: "epic_cb", epic_attach, epic_suspend, epic_resume, epic_detach ! 1406: }; ! 1407: ! 1408: #endif /* Cardbus support */ ! 1409: ! 1410: ! 1411: #ifdef MODULE ! 1412: ! 1413: /* An additional parameter that may be passed in... */ ! 1414: static int debug = -1; ! 1415: ! 1416: int ! 1417: init_module(void) ! 1418: { ! 1419: if (debug >= 0) ! 1420: epic_debug = debug; ! 1421: ! 1422: #ifdef CARDBUS ! 1423: register_driver(&epic_ops); ! 1424: return 0; ! 1425: #else ! 1426: return epic100_probe(0); ! 1427: #endif ! 1428: } ! 1429: ! 1430: void ! 1431: cleanup_module(void) ! 1432: { ! 1433: struct device *next_dev; ! 1434: ! 1435: #ifdef CARDBUS ! 1436: unregister_driver(&epic_ops); ! 1437: #endif ! 1438: ! 1439: /* No need to check MOD_IN_USE, as sys_delete_module() checks. */ ! 1440: while (root_epic_dev) { ! 1441: next_dev = ((struct epic_private *)root_epic_dev->priv)->next_module; ! 1442: unregister_netdev(root_epic_dev); ! 1443: release_region(root_epic_dev->base_addr, EPIC_TOTAL_SIZE); ! 1444: kfree(root_epic_dev); ! 1445: root_epic_dev = next_dev; ! 1446: } ! 1447: } ! 1448: ! 1449: #endif /* MODULE */ ! 1450: ! 1451: /* ! 1452: * Local variables: ! 1453: * compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c epic100.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`" ! 1454: * cardbus-compile-command: "gcc -DCARDBUS -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c epic100.c -o epic_cb.o -I/usr/src/pcmcia-cs-3.0.5/include/" ! 1455: * c-indent-level: 4 ! 1456: * c-basic-offset: 4 ! 1457: * tab-width: 4 ! 1458: * End: ! 1459: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.