|
|
1.1 ! root 1: ! 2: /* epic100.c: A SMC 83c170 EPIC/100 fast ethernet driver for Etherboot */ ! 3: ! 4: FILE_LICENCE ( GPL2_OR_LATER ); ! 5: ! 6: /* 05/06/2003 timlegge Fixed relocation and implemented Multicast */ ! 7: #define LINUX_OUT_MACROS ! 8: ! 9: #include "etherboot.h" ! 10: #include <ipxe/pci.h> ! 11: #include <ipxe/ethernet.h> ! 12: #include "nic.h" ! 13: #include <ipxe/console.h> ! 14: #include "epic100.h" ! 15: ! 16: /* Condensed operations for readability */ ! 17: #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr)) ! 18: #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr)) ! 19: ! 20: #define TX_RING_SIZE 2 /* use at least 2 buffers for TX */ ! 21: #define RX_RING_SIZE 2 ! 22: ! 23: #define PKT_BUF_SZ 1536 /* Size of each temporary Tx/Rx buffer.*/ ! 24: ! 25: /* ! 26: #define DEBUG_RX ! 27: #define DEBUG_TX ! 28: #define DEBUG_EEPROM ! 29: */ ! 30: ! 31: #define EPIC_DEBUG 0 /* debug level */ ! 32: ! 33: /* The EPIC100 Rx and Tx buffer descriptors. */ ! 34: struct epic_rx_desc { ! 35: unsigned long status; ! 36: unsigned long bufaddr; ! 37: unsigned long buflength; ! 38: unsigned long next; ! 39: }; ! 40: /* description of the tx descriptors control bits commonly used */ ! 41: #define TD_STDFLAGS TD_LASTDESC ! 42: ! 43: struct epic_tx_desc { ! 44: unsigned long status; ! 45: unsigned long bufaddr; ! 46: unsigned long buflength; ! 47: unsigned long next; ! 48: }; ! 49: ! 50: #define delay(nanosec) do { int _i = 3; while (--_i > 0) \ ! 51: { __SLOW_DOWN_IO; }} while (0) ! 52: ! 53: static void epic100_open(void); ! 54: static void epic100_init_ring(void); ! 55: static void epic100_disable(struct nic *nic); ! 56: static int epic100_poll(struct nic *nic, int retrieve); ! 57: static void epic100_transmit(struct nic *nic, const char *destaddr, ! 58: unsigned int type, unsigned int len, const char *data); ! 59: #ifdef DEBUG_EEPROM ! 60: static int read_eeprom(int location); ! 61: #endif ! 62: static int mii_read(int phy_id, int location); ! 63: static void epic100_irq(struct nic *nic, irq_action_t action); ! 64: ! 65: static struct nic_operations epic100_operations; ! 66: ! 67: static int ioaddr; ! 68: ! 69: static int command; ! 70: static int intstat; ! 71: static int intmask; ! 72: static int genctl ; ! 73: static int eectl ; ! 74: static int test ; ! 75: static int mmctl ; ! 76: static int mmdata ; ! 77: static int lan0 ; ! 78: static int mc0 ; ! 79: static int rxcon ; ! 80: static int txcon ; ! 81: static int prcdar ; ! 82: static int ptcdar ; ! 83: static int eththr ; ! 84: ! 85: static unsigned int cur_rx, cur_tx; /* The next free ring entry */ ! 86: #ifdef DEBUG_EEPROM ! 87: static unsigned short eeprom[64]; ! 88: #endif ! 89: static signed char phys[4]; /* MII device addresses. */ ! 90: struct { ! 91: struct epic_rx_desc rx_ring[RX_RING_SIZE] ! 92: __attribute__ ((aligned(4))); ! 93: struct epic_tx_desc tx_ring[TX_RING_SIZE] ! 94: __attribute__ ((aligned(4))); ! 95: unsigned char rx_packet[PKT_BUF_SZ * RX_RING_SIZE]; ! 96: unsigned char tx_packet[PKT_BUF_SZ * TX_RING_SIZE]; ! 97: } epic100_bufs __shared; ! 98: #define rx_ring epic100_bufs.rx_ring ! 99: #define tx_ring epic100_bufs.tx_ring ! 100: #define rx_packet epic100_bufs.rx_packet ! 101: #define tx_packet epic100_bufs.tx_packet ! 102: ! 103: /***********************************************************************/ ! 104: /* Externally visible functions */ ! 105: /***********************************************************************/ ! 106: ! 107: ! 108: static int ! 109: epic100_probe ( struct nic *nic, struct pci_device *pci ) { ! 110: ! 111: int i; ! 112: unsigned short* ap; ! 113: unsigned int phy, phy_idx; ! 114: ! 115: if (pci->ioaddr == 0) ! 116: return 0; ! 117: ! 118: /* Ideally we would detect all network cards in slot order. That would ! 119: be best done a central PCI probe dispatch, which wouldn't work ! 120: well with the current structure. So instead we detect just the ! 121: Epic cards in slot order. */ ! 122: ! 123: ioaddr = pci->ioaddr; ! 124: ! 125: nic->irqno = 0; ! 126: nic->ioaddr = pci->ioaddr & ~3; ! 127: ! 128: /* compute all used static epic100 registers address */ ! 129: command = ioaddr + COMMAND; /* Control Register */ ! 130: intstat = ioaddr + INTSTAT; /* Interrupt Status */ ! 131: intmask = ioaddr + INTMASK; /* Interrupt Mask */ ! 132: genctl = ioaddr + GENCTL; /* General Control */ ! 133: eectl = ioaddr + EECTL; /* EEPROM Control */ ! 134: test = ioaddr + TEST; /* Test register (clocks) */ ! 135: mmctl = ioaddr + MMCTL; /* MII Management Interface Control */ ! 136: mmdata = ioaddr + MMDATA; /* MII Management Interface Data */ ! 137: lan0 = ioaddr + LAN0; /* MAC address. (0x40-0x48) */ ! 138: mc0 = ioaddr + MC0; /* Multicast Control */ ! 139: rxcon = ioaddr + RXCON; /* Receive Control */ ! 140: txcon = ioaddr + TXCON; /* Transmit Control */ ! 141: prcdar = ioaddr + PRCDAR; /* PCI Receive Current Descr Address */ ! 142: ptcdar = ioaddr + PTCDAR; /* PCI Transmit Current Descr Address */ ! 143: eththr = ioaddr + ETHTHR; /* Early Transmit Threshold */ ! 144: ! 145: /* Reset the chip & bring it out of low-power mode. */ ! 146: outl(GC_SOFT_RESET, genctl); ! 147: ! 148: /* Disable ALL interrupts by setting the interrupt mask. */ ! 149: outl(INTR_DISABLE, intmask); ! 150: ! 151: /* ! 152: * set the internal clocks: ! 153: * Application Note 7.15 says: ! 154: * In order to set the CLOCK TEST bit in the TEST register, ! 155: * perform the following: ! 156: * ! 157: * Write 0x0008 to the test register at least sixteen ! 158: * consecutive times. ! 159: * ! 160: * The CLOCK TEST bit is Write-Only. Writing it several times ! 161: * consecutively insures a successful write to the bit... ! 162: */ ! 163: ! 164: for (i = 0; i < 16; i++) { ! 165: outl(0x00000008, test); ! 166: } ! 167: ! 168: #ifdef DEBUG_EEPROM ! 169: { ! 170: unsigned short sum = 0; ! 171: unsigned short value; ! 172: for (i = 0; i < 64; i++) { ! 173: value = read_eeprom(i); ! 174: eeprom[i] = value; ! 175: sum += value; ! 176: } ! 177: } ! 178: ! 179: #if (EPIC_DEBUG > 1) ! 180: printf("EEPROM contents\n"); ! 181: for (i = 0; i < 64; i++) { ! 182: printf(" %hhX%s", eeprom[i], i % 16 == 15 ? "\n" : ""); ! 183: } ! 184: #endif ! 185: #endif ! 186: ! 187: /* This could also be read from the EEPROM. */ ! 188: ap = (unsigned short*)nic->node_addr; ! 189: for (i = 0; i < 3; i++) ! 190: *ap++ = inw(lan0 + i*4); ! 191: ! 192: DBG ( " I/O %4.4x %s ", ioaddr, eth_ntoa ( nic->node_addr ) ); ! 193: ! 194: /* Find the connected MII xcvrs. */ ! 195: for (phy = 0, phy_idx = 0; phy < 32 && phy_idx < sizeof(phys); phy++) { ! 196: int mii_status = mii_read(phy, 0); ! 197: ! 198: if (mii_status != 0xffff && mii_status != 0x0000) { ! 199: phys[phy_idx++] = phy; ! 200: #if (EPIC_DEBUG > 1) ! 201: printf("MII transceiver found at address %d.\n", phy); ! 202: #endif ! 203: } ! 204: } ! 205: if (phy_idx == 0) { ! 206: #if (EPIC_DEBUG > 1) ! 207: printf("***WARNING***: No MII transceiver found!\n"); ! 208: #endif ! 209: /* Use the known PHY address of the EPII. */ ! 210: phys[0] = 3; ! 211: } ! 212: ! 213: epic100_open(); ! 214: nic->nic_op = &epic100_operations; ! 215: ! 216: return 1; ! 217: } ! 218: ! 219: static void set_rx_mode(void) ! 220: { ! 221: unsigned char mc_filter[8]; ! 222: int i; ! 223: memset(mc_filter, 0xff, sizeof(mc_filter)); ! 224: outl(0x0C, rxcon); ! 225: for(i = 0; i < 4; i++) ! 226: outw(((unsigned short *)mc_filter)[i], mc0 + i*4); ! 227: return; ! 228: } ! 229: ! 230: static void ! 231: epic100_open(void) ! 232: { ! 233: int mii_reg5; ! 234: unsigned long tmp; ! 235: ! 236: epic100_init_ring(); ! 237: ! 238: /* Pull the chip out of low-power mode, and set for PCI read multiple. */ ! 239: outl(GC_RX_FIFO_THR_64 | GC_MRC_READ_MULT | GC_ONE_COPY, genctl); ! 240: ! 241: outl(TX_FIFO_THRESH, eththr); ! 242: ! 243: tmp = TC_EARLY_TX_ENABLE | TX_SLOT_TIME; ! 244: ! 245: mii_reg5 = mii_read(phys[0], 5); ! 246: if (mii_reg5 != 0xffff && (mii_reg5 & 0x0100)) { ! 247: printf(" full-duplex mode"); ! 248: tmp |= TC_LM_FULL_DPX; ! 249: } else ! 250: tmp |= TC_LM_NORMAL; ! 251: ! 252: outl(tmp, txcon); ! 253: ! 254: /* Give adress of RX and TX ring to the chip */ ! 255: outl(virt_to_le32desc(&rx_ring), prcdar); ! 256: outl(virt_to_le32desc(&tx_ring), ptcdar); ! 257: ! 258: /* Start the chip's Rx process: receive unicast and broadcast */ ! 259: set_rx_mode(); ! 260: outl(CR_START_RX | CR_QUEUE_RX, command); ! 261: ! 262: putchar('\n'); ! 263: } ! 264: ! 265: /* Initialize the Rx and Tx rings. */ ! 266: static void ! 267: epic100_init_ring(void) ! 268: { ! 269: int i; ! 270: ! 271: cur_rx = cur_tx = 0; ! 272: ! 273: for (i = 0; i < RX_RING_SIZE; i++) { ! 274: rx_ring[i].status = cpu_to_le32(RRING_OWN); /* Owned by Epic chip */ ! 275: rx_ring[i].buflength = cpu_to_le32(PKT_BUF_SZ); ! 276: rx_ring[i].bufaddr = virt_to_bus(&rx_packet[i * PKT_BUF_SZ]); ! 277: rx_ring[i].next = virt_to_le32desc(&rx_ring[i + 1]) ; ! 278: } ! 279: /* Mark the last entry as wrapping the ring. */ ! 280: rx_ring[i-1].next = virt_to_le32desc(&rx_ring[0]); ! 281: ! 282: /* ! 283: *The Tx buffer descriptor is filled in as needed, ! 284: * but we do need to clear the ownership bit. ! 285: */ ! 286: ! 287: for (i = 0; i < TX_RING_SIZE; i++) { ! 288: tx_ring[i].status = 0x0000; /* Owned by CPU */ ! 289: tx_ring[i].buflength = 0x0000 | cpu_to_le32(TD_STDFLAGS << 16); ! 290: tx_ring[i].bufaddr = virt_to_bus(&tx_packet[i * PKT_BUF_SZ]); ! 291: tx_ring[i].next = virt_to_le32desc(&tx_ring[i + 1]); ! 292: } ! 293: tx_ring[i-1].next = virt_to_le32desc(&tx_ring[0]); ! 294: } ! 295: ! 296: /* function: epic100_transmit ! 297: * This transmits a packet. ! 298: * ! 299: * Arguments: char d[6]: destination ethernet address. ! 300: * unsigned short t: ethernet protocol type. ! 301: * unsigned short s: size of the data-part of the packet. ! 302: * char *p: the data for the packet. ! 303: * returns: void. ! 304: */ ! 305: static void ! 306: epic100_transmit(struct nic *nic, const char *destaddr, unsigned int type, ! 307: unsigned int len, const char *data) ! 308: { ! 309: unsigned short nstype; ! 310: unsigned char *txp; ! 311: int entry; ! 312: unsigned long ct; ! 313: ! 314: /* Calculate the next Tx descriptor entry. */ ! 315: entry = cur_tx % TX_RING_SIZE; ! 316: ! 317: if ((tx_ring[entry].status & TRING_OWN) == TRING_OWN) { ! 318: printf("eth_transmit: Unable to transmit. status=%4.4lx. Resetting...\n", ! 319: tx_ring[entry].status); ! 320: ! 321: epic100_open(); ! 322: return; ! 323: } ! 324: ! 325: txp = tx_packet + (entry * PKT_BUF_SZ); ! 326: ! 327: memcpy(txp, destaddr, ETH_ALEN); ! 328: memcpy(txp + ETH_ALEN, nic->node_addr, ETH_ALEN); ! 329: nstype = htons(type); ! 330: memcpy(txp + 12, (char*)&nstype, 2); ! 331: memcpy(txp + ETH_HLEN, data, len); ! 332: ! 333: len += ETH_HLEN; ! 334: len &= 0x0FFF; ! 335: while(len < ETH_ZLEN) ! 336: txp[len++] = '\0'; ! 337: /* ! 338: * Caution: the write order is important here, ! 339: * set the base address with the "ownership" ! 340: * bits last. ! 341: */ ! 342: ! 343: tx_ring[entry].buflength |= cpu_to_le32(len); ! 344: tx_ring[entry].status = cpu_to_le32(len << 16) | ! 345: cpu_to_le32(TRING_OWN); /* Pass ownership to the chip. */ ! 346: ! 347: cur_tx++; ! 348: ! 349: /* Trigger an immediate transmit demand. */ ! 350: outl(CR_QUEUE_TX, command); ! 351: ! 352: ct = currticks(); ! 353: /* timeout 10 ms for transmit */ ! 354: while ((le32_to_cpu(tx_ring[entry].status) & (TRING_OWN)) && ! 355: ct + 10*1000 < currticks()) ! 356: /* Wait */; ! 357: ! 358: if ((le32_to_cpu(tx_ring[entry].status) & TRING_OWN) != 0) ! 359: printf("Oops, transmitter timeout, status=%4.4lX\n", ! 360: tx_ring[entry].status); ! 361: } ! 362: ! 363: /* function: epic100_poll / eth_poll ! 364: * This receives a packet from the network. ! 365: * ! 366: * Arguments: none ! 367: * ! 368: * returns: 1 if a packet was received. ! 369: * 0 if no pacet was received. ! 370: * side effects: ! 371: * returns the packet in the array nic->packet. ! 372: * returns the length of the packet in nic->packetlen. ! 373: */ ! 374: ! 375: static int ! 376: epic100_poll(struct nic *nic, int retrieve) ! 377: { ! 378: int entry; ! 379: int retcode; ! 380: int status; ! 381: entry = cur_rx % RX_RING_SIZE; ! 382: ! 383: if ((rx_ring[entry].status & cpu_to_le32(RRING_OWN)) == RRING_OWN) ! 384: return (0); ! 385: ! 386: if ( ! retrieve ) return 1; ! 387: ! 388: status = le32_to_cpu(rx_ring[entry].status); ! 389: /* We own the next entry, it's a new packet. Send it up. */ ! 390: ! 391: #if (EPIC_DEBUG > 4) ! 392: printf("epic_poll: entry %d status %hX\n", entry, status); ! 393: #endif ! 394: ! 395: cur_rx++; ! 396: if (status & 0x2000) { ! 397: printf("epic_poll: Giant packet\n"); ! 398: retcode = 0; ! 399: } else if (status & 0x0006) { ! 400: /* Rx Frame errors are counted in hardware. */ ! 401: printf("epic_poll: Frame received with errors\n"); ! 402: retcode = 0; ! 403: } else { ! 404: /* Omit the four octet CRC from the length. */ ! 405: nic->packetlen = le32_to_cpu((rx_ring[entry].buflength))- 4; ! 406: memcpy(nic->packet, &rx_packet[entry * PKT_BUF_SZ], nic->packetlen); ! 407: retcode = 1; ! 408: } ! 409: ! 410: /* Clear all error sources. */ ! 411: outl(status & INTR_CLEARERRS, intstat); ! 412: ! 413: /* Give the descriptor back to the chip */ ! 414: rx_ring[entry].status = RRING_OWN; ! 415: ! 416: /* Restart Receiver */ ! 417: outl(CR_START_RX | CR_QUEUE_RX, command); ! 418: ! 419: return retcode; ! 420: } ! 421: ! 422: ! 423: static void epic100_disable ( struct nic *nic __unused ) { ! 424: /* Soft reset the chip. */ ! 425: outl(GC_SOFT_RESET, genctl); ! 426: } ! 427: ! 428: static void epic100_irq(struct nic *nic __unused, irq_action_t action __unused) ! 429: { ! 430: switch ( action ) { ! 431: case DISABLE : ! 432: break; ! 433: case ENABLE : ! 434: break; ! 435: case FORCE : ! 436: break; ! 437: } ! 438: } ! 439: ! 440: #ifdef DEBUG_EEPROM ! 441: /* Serial EEPROM section. */ ! 442: ! 443: /* EEPROM_Ctrl bits. */ ! 444: #define EE_SHIFT_CLK 0x04 /* EEPROM shift clock. */ ! 445: #define EE_CS 0x02 /* EEPROM chip select. */ ! 446: #define EE_DATA_WRITE 0x08 /* EEPROM chip data in. */ ! 447: #define EE_WRITE_0 0x01 ! 448: #define EE_WRITE_1 0x09 ! 449: #define EE_DATA_READ 0x10 /* EEPROM chip data out. */ ! 450: #define EE_ENB (0x0001 | EE_CS) ! 451: ! 452: /* The EEPROM commands include the alway-set leading bit. */ ! 453: #define EE_WRITE_CMD (5 << 6) ! 454: #define EE_READ_CMD (6 << 6) ! 455: #define EE_ERASE_CMD (7 << 6) ! 456: ! 457: #define eeprom_delay(n) delay(n) ! 458: ! 459: static int ! 460: read_eeprom(int location) ! 461: { ! 462: int i; ! 463: int retval = 0; ! 464: int read_cmd = location | EE_READ_CMD; ! 465: ! 466: outl(EE_ENB & ~EE_CS, eectl); ! 467: outl(EE_ENB, eectl); ! 468: ! 469: /* Shift the read command bits out. */ ! 470: for (i = 10; i >= 0; i--) { ! 471: short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; ! 472: outl(EE_ENB | dataval, eectl); ! 473: eeprom_delay(100); ! 474: outl(EE_ENB | dataval | EE_SHIFT_CLK, eectl); ! 475: eeprom_delay(150); ! 476: outl(EE_ENB | dataval, eectl); /* Finish EEPROM a clock tick. */ ! 477: eeprom_delay(250); ! 478: } ! 479: outl(EE_ENB, eectl); ! 480: ! 481: for (i = 16; i > 0; i--) { ! 482: outl(EE_ENB | EE_SHIFT_CLK, eectl); ! 483: eeprom_delay(100); ! 484: retval = (retval << 1) | ((inl(eectl) & EE_DATA_READ) ? 1 : 0); ! 485: outl(EE_ENB, eectl); ! 486: eeprom_delay(100); ! 487: } ! 488: ! 489: /* Terminate the EEPROM access. */ ! 490: outl(EE_ENB & ~EE_CS, eectl); ! 491: return retval; ! 492: } ! 493: #endif ! 494: ! 495: ! 496: #define MII_READOP 1 ! 497: #define MII_WRITEOP 2 ! 498: ! 499: static int ! 500: mii_read(int phy_id, int location) ! 501: { ! 502: int i; ! 503: ! 504: outl((phy_id << 9) | (location << 4) | MII_READOP, mmctl); ! 505: /* Typical operation takes < 50 ticks. */ ! 506: ! 507: for (i = 4000; i > 0; i--) ! 508: if ((inl(mmctl) & MII_READOP) == 0) ! 509: break; ! 510: return inw(mmdata); ! 511: } ! 512: ! 513: static struct nic_operations epic100_operations = { ! 514: .connect = dummy_connect, ! 515: .poll = epic100_poll, ! 516: .transmit = epic100_transmit, ! 517: .irq = epic100_irq, ! 518: ! 519: }; ! 520: ! 521: static struct pci_device_id epic100_nics[] = { ! 522: PCI_ROM(0x10b8, 0x0005, "epic100", "SMC EtherPowerII", 0), /* SMC 83c170 EPIC/100 */ ! 523: PCI_ROM(0x10b8, 0x0006, "smc-83c175", "SMC EPIC/C 83c175", 0), ! 524: }; ! 525: ! 526: PCI_DRIVER ( epic100_driver, epic100_nics, PCI_NO_CLASS ); ! 527: ! 528: DRIVER ( "EPIC100", nic_driver, pci_driver, epic100_driver, ! 529: epic100_probe, epic100_disable ); ! 530: ! 531: /* ! 532: * Local variables: ! 533: * c-basic-offset: 8 ! 534: * c-indent-level: 8 ! 535: * tab-width: 8 ! 536: * End: ! 537: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.