1 /* 2 ns8382x.c: A U-Boot driver for the NatSemi DP8382[01]. 3 ported by: Mark A. Rakes (mark_rakes@vivato.net) 4 5 Adapted from: 6 1. an Etherboot driver for DP8381[56] written by: 7 Copyright (C) 2001 Entity Cyber, Inc. 8 9 This development of this Etherboot driver was funded by 10 Sicom Systems: http://www.sicompos.com/ 11 12 Author: Marty Connor (mdc@thinguin.org) 13 Adapted from a Linux driver which was written by Donald Becker 14 15 This software may be used and distributed according to the terms 16 of the GNU Public License (GPL), incorporated herein by reference. 17 18 2. A Linux driver by Donald Becker, ns820.c: 19 Written/copyright 1999-2002 by Donald Becker. 20 21 This software may be used and distributed according to the terms of 22 the GNU General Public License (GPL), incorporated herein by reference. 23 Drivers based on or derived from this code fall under the GPL and must 24 retain the authorship, copyright and license notice. This file is not 25 a complete program and may only be used when the entire operating 26 system is licensed under the GPL. License for under other terms may be 27 available. Contact the original author for details. 28 29 The original author may be reached as becker@scyld.com, or at 30 Scyld Computing Corporation 31 410 Severn Ave., Suite 210 32 Annapolis MD 21403 33 34 Support information and updates available at 35 http://www.scyld.com/network/netsemi.html 36 37 Datasheets available from: 38 http://www.national.com/pf/DP/DP83820.html 39 http://www.national.com/pf/DP/DP83821.html 40 */ 41 42 /* Revision History 43 * October 2002 mar 1.0 44 * Initial U-Boot Release. 45 * Tested with Netgear GA622T (83820) 46 * and SMC9452TX (83821) 47 * NOTE: custom boards with these chips may (likely) require 48 * a programmed EEPROM device (if present) in order to work 49 * correctly. 50 */ 51 52 /* Includes */ 53 #include <common.h> 54 #include <malloc.h> 55 #include <net.h> 56 #include <asm/io.h> 57 #include <pci.h> 58 59 /* defines */ 60 #define DSIZE 0x00000FFF 61 #define ETH_ALEN 6 62 #define CRC_SIZE 4 63 #define TOUT_LOOP 500000 64 #define TX_BUF_SIZE 1536 65 #define RX_BUF_SIZE 1536 66 #define NUM_RX_DESC 4 /* Number of Rx descriptor registers. */ 67 68 enum register_offsets { 69 ChipCmd = 0x00, 70 ChipConfig = 0x04, 71 EECtrl = 0x08, 72 IntrMask = 0x14, 73 IntrEnable = 0x18, 74 TxRingPtr = 0x20, 75 TxRingPtrHi = 0x24, 76 TxConfig = 0x28, 77 RxRingPtr = 0x30, 78 RxRingPtrHi = 0x34, 79 RxConfig = 0x38, 80 PriQueue = 0x3C, 81 RxFilterAddr = 0x48, 82 RxFilterData = 0x4C, 83 ClkRun = 0xCC, 84 PCIPM = 0x44, 85 }; 86 87 enum ChipCmdBits { 88 ChipReset = 0x100, 89 RxReset = 0x20, 90 TxReset = 0x10, 91 RxOff = 0x08, 92 RxOn = 0x04, 93 TxOff = 0x02, 94 TxOn = 0x01 95 }; 96 97 enum ChipConfigBits { 98 LinkSts = 0x80000000, 99 GigSpeed = 0x40000000, 100 HundSpeed = 0x20000000, 101 FullDuplex = 0x10000000, 102 TBIEn = 0x01000000, 103 Mode1000 = 0x00400000, 104 T64En = 0x00004000, 105 D64En = 0x00001000, 106 M64En = 0x00000800, 107 PhyRst = 0x00000400, 108 PhyDis = 0x00000200, 109 ExtStEn = 0x00000100, 110 BEMode = 0x00000001, 111 }; 112 #define SpeedStatus_Polarity ( GigSpeed | HundSpeed | FullDuplex) 113 114 enum TxConfig_bits { 115 TxDrthMask = 0x000000ff, 116 TxFlthMask = 0x0000ff00, 117 TxMxdmaMask = 0x00700000, 118 TxMxdma_8 = 0x00100000, 119 TxMxdma_16 = 0x00200000, 120 TxMxdma_32 = 0x00300000, 121 TxMxdma_64 = 0x00400000, 122 TxMxdma_128 = 0x00500000, 123 TxMxdma_256 = 0x00600000, 124 TxMxdma_512 = 0x00700000, 125 TxMxdma_1024 = 0x00000000, 126 TxCollRetry = 0x00800000, 127 TxAutoPad = 0x10000000, 128 TxMacLoop = 0x20000000, 129 TxHeartIgn = 0x40000000, 130 TxCarrierIgn = 0x80000000 131 }; 132 133 enum RxConfig_bits { 134 RxDrthMask = 0x0000003e, 135 RxMxdmaMask = 0x00700000, 136 RxMxdma_8 = 0x00100000, 137 RxMxdma_16 = 0x00200000, 138 RxMxdma_32 = 0x00300000, 139 RxMxdma_64 = 0x00400000, 140 RxMxdma_128 = 0x00500000, 141 RxMxdma_256 = 0x00600000, 142 RxMxdma_512 = 0x00700000, 143 RxMxdma_1024 = 0x00000000, 144 RxAcceptLenErr = 0x04000000, 145 RxAcceptLong = 0x08000000, 146 RxAcceptTx = 0x10000000, 147 RxStripCRC = 0x20000000, 148 RxAcceptRunt = 0x40000000, 149 RxAcceptErr = 0x80000000, 150 }; 151 152 /* Bits in the RxMode register. */ 153 enum rx_mode_bits { 154 RxFilterEnable = 0x80000000, 155 AcceptAllBroadcast = 0x40000000, 156 AcceptAllMulticast = 0x20000000, 157 AcceptAllUnicast = 0x10000000, 158 AcceptPerfectMatch = 0x08000000, 159 }; 160 161 typedef struct _BufferDesc { 162 u32 link; 163 u32 bufptr; 164 vu_long cmdsts; 165 u32 extsts; /*not used here */ 166 } BufferDesc; 167 168 /* Bits in network_desc.status */ 169 enum desc_status_bits { 170 DescOwn = 0x80000000, DescMore = 0x40000000, DescIntr = 0x20000000, 171 DescNoCRC = 0x10000000, DescPktOK = 0x08000000, 172 DescSizeMask = 0xfff, 173 174 DescTxAbort = 0x04000000, DescTxFIFO = 0x02000000, 175 DescTxCarrier = 0x01000000, DescTxDefer = 0x00800000, 176 DescTxExcDefer = 0x00400000, DescTxOOWCol = 0x00200000, 177 DescTxExcColl = 0x00100000, DescTxCollCount = 0x000f0000, 178 179 DescRxAbort = 0x04000000, DescRxOver = 0x02000000, 180 DescRxDest = 0x01800000, DescRxLong = 0x00400000, 181 DescRxRunt = 0x00200000, DescRxInvalid = 0x00100000, 182 DescRxCRC = 0x00080000, DescRxAlign = 0x00040000, 183 DescRxLoop = 0x00020000, DesRxColl = 0x00010000, 184 }; 185 186 /* Bits in MEAR */ 187 enum mii_reg_bits { 188 MDIO_ShiftClk = 0x0040, 189 MDIO_EnbOutput = 0x0020, 190 MDIO_Data = 0x0010, 191 }; 192 193 /* PHY Register offsets. */ 194 enum phy_reg_offsets { 195 BMCR = 0x00, 196 BMSR = 0x01, 197 PHYIDR1 = 0x02, 198 PHYIDR2 = 0x03, 199 ANAR = 0x04, 200 KTCR = 0x09, 201 }; 202 203 /* basic mode control register bits */ 204 enum bmcr_bits { 205 Bmcr_Reset = 0x8000, 206 Bmcr_Loop = 0x4000, 207 Bmcr_Speed0 = 0x2000, 208 Bmcr_AutoNegEn = 0x1000, /*if set ignores Duplex, Speed[01] */ 209 Bmcr_RstAutoNeg = 0x0200, 210 Bmcr_Duplex = 0x0100, 211 Bmcr_Speed1 = 0x0040, 212 Bmcr_Force10H = 0x0000, 213 Bmcr_Force10F = 0x0100, 214 Bmcr_Force100H = 0x2000, 215 Bmcr_Force100F = 0x2100, 216 Bmcr_Force1000H = 0x0040, 217 Bmcr_Force1000F = 0x0140, 218 }; 219 220 /* auto negotiation advertisement register */ 221 enum anar_bits { 222 anar_adv_100F = 0x0100, 223 anar_adv_100H = 0x0080, 224 anar_adv_10F = 0x0040, 225 anar_adv_10H = 0x0020, 226 anar_ieee_8023 = 0x0001, 227 }; 228 229 /* 1K-base T control register */ 230 enum ktcr_bits { 231 ktcr_adv_1000H = 0x0100, 232 ktcr_adv_1000F = 0x0200, 233 }; 234 235 /* Globals */ 236 static u32 SavedClkRun; 237 static unsigned int cur_rx; 238 static unsigned int rx_config; 239 static unsigned int tx_config; 240 241 /* Note: transmit and receive buffers and descriptors must be 242 long long word aligned */ 243 static BufferDesc txd __attribute__ ((aligned(8))); 244 static BufferDesc rxd[NUM_RX_DESC] __attribute__ ((aligned(8))); 245 static unsigned char txb[TX_BUF_SIZE] __attribute__ ((aligned(8))); 246 static unsigned char rxb[NUM_RX_DESC * RX_BUF_SIZE] 247 __attribute__ ((aligned(8))); 248 249 /* Function Prototypes */ 250 static int mdio_read(struct eth_device *dev, int phy_id, int addr); 251 static void mdio_write(struct eth_device *dev, int phy_id, int addr, int value); 252 static void mdio_sync(struct eth_device *dev, u32 offset); 253 static int ns8382x_init(struct eth_device *dev, bd_t * bis); 254 static void ns8382x_reset(struct eth_device *dev); 255 static void ns8382x_init_rxfilter(struct eth_device *dev); 256 static void ns8382x_init_txd(struct eth_device *dev); 257 static void ns8382x_init_rxd(struct eth_device *dev); 258 static void ns8382x_set_rx_mode(struct eth_device *dev); 259 static void ns8382x_check_duplex(struct eth_device *dev); 260 static int ns8382x_send(struct eth_device *dev, volatile void *packet, 261 int length); 262 static int ns8382x_poll(struct eth_device *dev); 263 static void ns8382x_disable(struct eth_device *dev); 264 265 static struct pci_device_id supported[] = { 266 {PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_83820}, 267 {} 268 }; 269 270 #define bus_to_phys(a) pci_mem_to_phys((pci_dev_t)dev->priv, a) 271 #define phys_to_bus(a) pci_phys_to_mem((pci_dev_t)dev->priv, a) 272 273 static inline int 274 INW(struct eth_device *dev, u_long addr) 275 { 276 return le16_to_cpu(*(vu_short *) (addr + dev->iobase)); 277 } 278 279 static int 280 INL(struct eth_device *dev, u_long addr) 281 { 282 return le32_to_cpu(*(vu_long *) (addr + dev->iobase)); 283 } 284 285 static inline void 286 OUTW(struct eth_device *dev, int command, u_long addr) 287 { 288 *(vu_short *) ((addr + dev->iobase)) = cpu_to_le16(command); 289 } 290 291 static inline void 292 OUTL(struct eth_device *dev, int command, u_long addr) 293 { 294 *(vu_long *) ((addr + dev->iobase)) = cpu_to_le32(command); 295 } 296 297 /* Function: ns8382x_initialize 298 * Description: Retrieves the MAC address of the card, and sets up some 299 * globals required by other routines, and initializes the NIC, making it 300 * ready to send and receive packets. 301 * Side effects: initializes ns8382xs, ready to recieve packets. 302 * Returns: int: number of cards found 303 */ 304 305 int 306 ns8382x_initialize(bd_t * bis) 307 { 308 pci_dev_t devno; 309 int card_number = 0; 310 struct eth_device *dev; 311 u32 iobase, status; 312 int i, idx = 0; 313 u32 phyAddress; 314 u32 tmp; 315 u32 chip_config; 316 317 while (1) { /* Find PCI device(s) */ 318 if ((devno = pci_find_devices(supported, idx++)) < 0) 319 break; 320 321 pci_read_config_dword(devno, PCI_BASE_ADDRESS_1, &iobase); 322 iobase &= ~0x3; /* 1: unused and 0:I/O Space Indicator */ 323 324 #ifdef NS8382X_DEBUG 325 printf("ns8382x: NatSemi dp8382x @ 0x%x\n", iobase); 326 #endif 327 328 pci_write_config_dword(devno, PCI_COMMAND, 329 PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); 330 331 /* Check if I/O accesses and Bus Mastering are enabled. */ 332 pci_read_config_dword(devno, PCI_COMMAND, &status); 333 if (!(status & PCI_COMMAND_MEMORY)) { 334 printf("Error: Can not enable MEM access.\n"); 335 continue; 336 } else if (!(status & PCI_COMMAND_MASTER)) { 337 printf("Error: Can not enable Bus Mastering.\n"); 338 continue; 339 } 340 341 dev = (struct eth_device *) malloc(sizeof *dev); 342 343 sprintf(dev->name, "dp8382x#%d", card_number); 344 dev->iobase = bus_to_phys(iobase); 345 dev->priv = (void *) devno; 346 dev->init = ns8382x_init; 347 dev->halt = ns8382x_disable; 348 dev->send = ns8382x_send; 349 dev->recv = ns8382x_poll; 350 351 /* ns8382x has a non-standard PM control register 352 * in PCI config space. Some boards apparently need 353 * to be brought to D0 in this manner. */ 354 pci_read_config_dword(devno, PCIPM, &tmp); 355 if (tmp & (0x03 | 0x100)) { /* D0 state, disable PME assertion */ 356 u32 newtmp = tmp & ~(0x03 | 0x100); 357 pci_write_config_dword(devno, PCIPM, newtmp); 358 } 359 360 /* get MAC address */ 361 for (i = 0; i < 3; i++) { 362 u32 data; 363 char *mac = (char *)&dev->enetaddr[i * 2]; 364 365 OUTL(dev, i * 2, RxFilterAddr); 366 data = INL(dev, RxFilterData); 367 *mac++ = data; 368 *mac++ = data >> 8; 369 } 370 /* get PHY address, can't be zero */ 371 for (phyAddress = 1; phyAddress < 32; phyAddress++) { 372 u32 rev, phy1; 373 374 phy1 = mdio_read(dev, phyAddress, PHYIDR1); 375 if (phy1 == 0x2000) { /*check for 83861/91 */ 376 rev = mdio_read(dev, phyAddress, PHYIDR2); 377 if ((rev & ~(0x000f)) == 0x00005c50 || 378 (rev & ~(0x000f)) == 0x00005c60) { 379 #ifdef NS8382X_DEBUG 380 printf("phy rev is %x\n", rev); 381 printf("phy address is %x\n", 382 phyAddress); 383 #endif 384 break; 385 } 386 } 387 } 388 389 /* set phy to autonegotiate && advertise everything */ 390 mdio_write(dev, phyAddress, KTCR, 391 (ktcr_adv_1000H | ktcr_adv_1000F)); 392 mdio_write(dev, phyAddress, ANAR, 393 (anar_adv_100F | anar_adv_100H | anar_adv_10H | 394 anar_adv_10F | anar_ieee_8023)); 395 mdio_write(dev, phyAddress, BMCR, 0x0); /*restore */ 396 mdio_write(dev, phyAddress, BMCR, 397 (Bmcr_AutoNegEn | Bmcr_RstAutoNeg)); 398 /* Reset the chip to erase any previous misconfiguration. */ 399 OUTL(dev, (ChipReset), ChipCmd); 400 401 chip_config = INL(dev, ChipConfig); 402 /* reset the phy */ 403 OUTL(dev, (chip_config | PhyRst), ChipConfig); 404 /* power up and initialize transceiver */ 405 OUTL(dev, (chip_config & ~(PhyDis)), ChipConfig); 406 407 mdio_sync(dev, EECtrl); 408 #ifdef NS8382X_DEBUG 409 { 410 u32 chpcfg = 411 INL(dev, ChipConfig) ^ SpeedStatus_Polarity; 412 413 printf("%s: Transceiver 10%s %s duplex.\n", dev->name, 414 (chpcfg & GigSpeed) ? "00" : (chpcfg & HundSpeed) 415 ? "0" : "", 416 chpcfg & FullDuplex ? "full" : "half"); 417 printf("%s: %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, 418 dev->enetaddr[0], dev->enetaddr[1], 419 dev->enetaddr[2], dev->enetaddr[3], 420 dev->enetaddr[4], dev->enetaddr[5]); 421 } 422 #endif 423 /* Disable PME: 424 * The PME bit is initialized from the EEPROM contents. 425 * PCI cards probably have PME disabled, but motherboard 426 * implementations may have PME set to enable WakeOnLan. 427 * With PME set the chip will scan incoming packets but 428 * nothing will be written to memory. */ 429 SavedClkRun = INL(dev, ClkRun); 430 OUTL(dev, SavedClkRun & ~0x100, ClkRun); 431 432 eth_register(dev); 433 434 card_number++; 435 436 pci_write_config_byte(devno, PCI_LATENCY_TIMER, 0x60); 437 438 udelay(10 * 1000); 439 } 440 return card_number; 441 } 442 443 /* MII transceiver control section. 444 Read and write MII registers using software-generated serial MDIO 445 protocol. See the MII specifications or DP83840A data sheet for details. 446 447 The maximum data clock rate is 2.5 Mhz. To meet minimum timing we 448 must flush writes to the PCI bus with a PCI read. */ 449 #define mdio_delay(mdio_addr) INL(dev, mdio_addr) 450 451 #define MDIO_EnbIn (0) 452 #define MDIO_WRITE0 (MDIO_EnbOutput) 453 #define MDIO_WRITE1 (MDIO_Data | MDIO_EnbOutput) 454 455 /* Generate the preamble required for initial synchronization and 456 a few older transceivers. */ 457 static void 458 mdio_sync(struct eth_device *dev, u32 offset) 459 { 460 int bits = 32; 461 462 /* Establish sync by sending at least 32 logic ones. */ 463 while (--bits >= 0) { 464 OUTL(dev, MDIO_WRITE1, offset); 465 mdio_delay(offset); 466 OUTL(dev, MDIO_WRITE1 | MDIO_ShiftClk, offset); 467 mdio_delay(offset); 468 } 469 } 470 471 static int 472 mdio_read(struct eth_device *dev, int phy_id, int addr) 473 { 474 int mii_cmd = (0xf6 << 10) | (phy_id << 5) | addr; 475 int i, retval = 0; 476 477 /* Shift the read command bits out. */ 478 for (i = 15; i >= 0; i--) { 479 int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; 480 481 OUTL(dev, dataval, EECtrl); 482 mdio_delay(EECtrl); 483 OUTL(dev, dataval | MDIO_ShiftClk, EECtrl); 484 mdio_delay(EECtrl); 485 } 486 /* Read the two transition, 16 data, and wire-idle bits. */ 487 for (i = 19; i > 0; i--) { 488 OUTL(dev, MDIO_EnbIn, EECtrl); 489 mdio_delay(EECtrl); 490 retval = 491 (retval << 1) | ((INL(dev, EECtrl) & MDIO_Data) ? 1 : 0); 492 OUTL(dev, MDIO_EnbIn | MDIO_ShiftClk, EECtrl); 493 mdio_delay(EECtrl); 494 } 495 return (retval >> 1) & 0xffff; 496 } 497 498 static void 499 mdio_write(struct eth_device *dev, int phy_id, int addr, int value) 500 { 501 int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (addr << 18) | value; 502 int i; 503 504 /* Shift the command bits out. */ 505 for (i = 31; i >= 0; i--) { 506 int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; 507 508 OUTL(dev, dataval, EECtrl); 509 mdio_delay(EECtrl); 510 OUTL(dev, dataval | MDIO_ShiftClk, EECtrl); 511 mdio_delay(EECtrl); 512 } 513 /* Clear out extra bits. */ 514 for (i = 2; i > 0; i--) { 515 OUTL(dev, MDIO_EnbIn, EECtrl); 516 mdio_delay(EECtrl); 517 OUTL(dev, MDIO_EnbIn | MDIO_ShiftClk, EECtrl); 518 mdio_delay(EECtrl); 519 } 520 return; 521 } 522 523 /* Function: ns8382x_init 524 * Description: resets the ethernet controller chip and configures 525 * registers and data structures required for sending and receiving packets. 526 * Arguments: struct eth_device *dev: NIC data structure 527 * returns: int. 528 */ 529 530 static int 531 ns8382x_init(struct eth_device *dev, bd_t * bis) 532 { 533 u32 config; 534 535 ns8382x_reset(dev); 536 537 /* Disable PME: 538 * The PME bit is initialized from the EEPROM contents. 539 * PCI cards probably have PME disabled, but motherboard 540 * implementations may have PME set to enable WakeOnLan. 541 * With PME set the chip will scan incoming packets but 542 * nothing will be written to memory. */ 543 OUTL(dev, SavedClkRun & ~0x100, ClkRun); 544 545 ns8382x_init_rxfilter(dev); 546 ns8382x_init_txd(dev); 547 ns8382x_init_rxd(dev); 548 549 /*set up ChipConfig */ 550 config = INL(dev, ChipConfig); 551 /*turn off 64 bit ops && Ten-bit interface 552 * && big-endian mode && extended status */ 553 config &= ~(TBIEn | Mode1000 | T64En | D64En | M64En | BEMode | PhyDis | ExtStEn); 554 OUTL(dev, config, ChipConfig); 555 556 /* Configure the PCI bus bursts and FIFO thresholds. */ 557 tx_config = TxCarrierIgn | TxHeartIgn | TxAutoPad 558 | TxCollRetry | TxMxdma_1024 | (0x1002); 559 rx_config = RxMxdma_1024 | 0x20; 560 #ifdef NS8382X_DEBUG 561 printf("%s: Setting TxConfig Register %#08X\n", dev->name, tx_config); 562 printf("%s: Setting RxConfig Register %#08X\n", dev->name, rx_config); 563 #endif 564 OUTL(dev, tx_config, TxConfig); 565 OUTL(dev, rx_config, RxConfig); 566 567 /*turn off priority queueing */ 568 OUTL(dev, 0x0, PriQueue); 569 570 ns8382x_check_duplex(dev); 571 ns8382x_set_rx_mode(dev); 572 573 OUTL(dev, (RxOn | TxOn), ChipCmd); 574 return 1; 575 } 576 577 /* Function: ns8382x_reset 578 * Description: soft resets the controller chip 579 * Arguments: struct eth_device *dev: NIC data structure 580 * Returns: void. 581 */ 582 static void 583 ns8382x_reset(struct eth_device *dev) 584 { 585 OUTL(dev, ChipReset, ChipCmd); 586 while (INL(dev, ChipCmd)) 587 /*wait until done */ ; 588 OUTL(dev, 0, IntrMask); 589 OUTL(dev, 0, IntrEnable); 590 } 591 592 /* Function: ns8382x_init_rxfilter 593 * Description: sets receive filter address to our MAC address 594 * Arguments: struct eth_device *dev: NIC data structure 595 * returns: void. 596 */ 597 598 static void 599 ns8382x_init_rxfilter(struct eth_device *dev) 600 { 601 int i; 602 603 for (i = 0; i < ETH_ALEN; i += 2) { 604 OUTL(dev, i, RxFilterAddr); 605 OUTW(dev, dev->enetaddr[i] + (dev->enetaddr[i + 1] << 8), 606 RxFilterData); 607 } 608 } 609 610 /* Function: ns8382x_init_txd 611 * Description: initializes the Tx descriptor 612 * Arguments: struct eth_device *dev: NIC data structure 613 * returns: void. 614 */ 615 616 static void 617 ns8382x_init_txd(struct eth_device *dev) 618 { 619 txd.link = (u32) 0; 620 txd.bufptr = cpu_to_le32((u32) & txb[0]); 621 txd.cmdsts = (u32) 0; 622 txd.extsts = (u32) 0; 623 624 OUTL(dev, 0x0, TxRingPtrHi); 625 OUTL(dev, phys_to_bus((u32)&txd), TxRingPtr); 626 #ifdef NS8382X_DEBUG 627 printf("ns8382x_init_txd: TX descriptor register loaded with: %#08X (&txd: %p)\n", 628 INL(dev, TxRingPtr), &txd); 629 #endif 630 } 631 632 /* Function: ns8382x_init_rxd 633 * Description: initializes the Rx descriptor ring 634 * Arguments: struct eth_device *dev: NIC data structure 635 * Returns: void. 636 */ 637 638 static void 639 ns8382x_init_rxd(struct eth_device *dev) 640 { 641 int i; 642 643 OUTL(dev, 0x0, RxRingPtrHi); 644 645 cur_rx = 0; 646 for (i = 0; i < NUM_RX_DESC; i++) { 647 rxd[i].link = 648 cpu_to_le32((i + 1 < 649 NUM_RX_DESC) ? (u32) & rxd[i + 650 1] : (u32) & 651 rxd[0]); 652 rxd[i].extsts = cpu_to_le32((u32) 0x0); 653 rxd[i].cmdsts = cpu_to_le32((u32) RX_BUF_SIZE); 654 rxd[i].bufptr = cpu_to_le32((u32) & rxb[i * RX_BUF_SIZE]); 655 #ifdef NS8382X_DEBUG 656 printf 657 ("ns8382x_init_rxd: rxd[%d]=%p link=%X cmdsts=%X bufptr=%X\n", 658 i, &rxd[i], le32_to_cpu(rxd[i].link), 659 le32_to_cpu(rxd[i].cmdsts), le32_to_cpu(rxd[i].bufptr)); 660 #endif 661 } 662 OUTL(dev, phys_to_bus((u32) & rxd), RxRingPtr); 663 664 #ifdef NS8382X_DEBUG 665 printf("ns8382x_init_rxd: RX descriptor register loaded with: %X\n", 666 INL(dev, RxRingPtr)); 667 #endif 668 } 669 670 /* Function: ns8382x_set_rx_mode 671 * Description: 672 * sets the receive mode to accept all broadcast packets and packets 673 * with our MAC address, and reject all multicast packets. 674 * Arguments: struct eth_device *dev: NIC data structure 675 * Returns: void. 676 */ 677 678 static void 679 ns8382x_set_rx_mode(struct eth_device *dev) 680 { 681 u32 rx_mode = 0x0; 682 /*spec says RxFilterEnable has to be 0 for rest of 683 * this stuff to be properly configured. Linux driver 684 * seems to support this*/ 685 /* OUTL(dev, rx_mode, RxFilterAddr);*/ 686 rx_mode = (RxFilterEnable | AcceptAllBroadcast | AcceptPerfectMatch); 687 OUTL(dev, rx_mode, RxFilterAddr); 688 printf("ns8382x_set_rx_mode: set to %X\n", rx_mode); 689 /*now we turn RxFilterEnable back on */ 690 /*rx_mode |= RxFilterEnable; 691 OUTL(dev, rx_mode, RxFilterAddr);*/ 692 } 693 694 static void 695 ns8382x_check_duplex(struct eth_device *dev) 696 { 697 int gig = 0; 698 int hun = 0; 699 int duplex = 0; 700 int config = (INL(dev, ChipConfig) ^ SpeedStatus_Polarity); 701 702 duplex = (config & FullDuplex) ? 1 : 0; 703 gig = (config & GigSpeed) ? 1 : 0; 704 hun = (config & HundSpeed) ? 1 : 0; 705 #ifdef NS8382X_DEBUG 706 printf("%s: Setting 10%s %s-duplex based on negotiated link" 707 " capability.\n", dev->name, (gig) ? "00" : (hun) ? "0" : "", 708 duplex ? "full" : "half"); 709 #endif 710 if (duplex) { 711 rx_config |= RxAcceptTx; 712 tx_config |= (TxCarrierIgn | TxHeartIgn); 713 } else { 714 rx_config &= ~RxAcceptTx; 715 tx_config &= ~(TxCarrierIgn | TxHeartIgn); 716 } 717 #ifdef NS8382X_DEBUG 718 printf("%s: Resetting TxConfig Register %#08X\n", dev->name, tx_config); 719 printf("%s: Resetting RxConfig Register %#08X\n", dev->name, rx_config); 720 #endif 721 OUTL(dev, tx_config, TxConfig); 722 OUTL(dev, rx_config, RxConfig); 723 724 /*if speed is 10 or 100, remove MODE1000, 725 * if it's 1000, then set it */ 726 config = INL(dev, ChipConfig); 727 if (gig) 728 config |= Mode1000; 729 else 730 config &= ~Mode1000; 731 732 #ifdef NS8382X_DEBUG 733 printf("%s: %setting Mode1000\n", dev->name, (gig) ? "S" : "Uns"); 734 #endif 735 OUTL(dev, config, ChipConfig); 736 } 737 738 /* Function: ns8382x_send 739 * Description: transmits a packet and waits for completion or timeout. 740 * Returns: void. */ 741 static int 742 ns8382x_send(struct eth_device *dev, volatile void *packet, int length) 743 { 744 u32 i, status = 0; 745 vu_long tx_stat = 0; 746 747 /* Stop the transmitter */ 748 OUTL(dev, TxOff, ChipCmd); 749 #ifdef NS8382X_DEBUG 750 printf("ns8382x_send: sending %d bytes\n", (int)length); 751 #endif 752 753 /* set the transmit buffer descriptor and enable Transmit State Machine */ 754 txd.link = cpu_to_le32(0x0); 755 txd.bufptr = cpu_to_le32(phys_to_bus((u32)packet)); 756 txd.extsts = cpu_to_le32(0x0); 757 txd.cmdsts = cpu_to_le32(DescOwn | length); 758 759 /* load Transmit Descriptor Register */ 760 OUTL(dev, phys_to_bus((u32) & txd), TxRingPtr); 761 #ifdef NS8382X_DEBUG 762 printf("ns8382x_send: TX descriptor register loaded with: %#08X\n", 763 INL(dev, TxRingPtr)); 764 printf("\ttxd.link:%X\tbufp:%X\texsts:%X\tcmdsts:%X\n", 765 le32_to_cpu(txd.link), le32_to_cpu(txd.bufptr), 766 le32_to_cpu(txd.extsts), le32_to_cpu(txd.cmdsts)); 767 #endif 768 /* restart the transmitter */ 769 OUTL(dev, TxOn, ChipCmd); 770 771 for (i = 0; (tx_stat = le32_to_cpu(txd.cmdsts)) & DescOwn; i++) { 772 if (i >= TOUT_LOOP) { 773 printf ("%s: tx error buffer not ready: txd.cmdsts %#lX\n", 774 dev->name, tx_stat); 775 goto Done; 776 } 777 } 778 779 if (!(tx_stat & DescPktOK)) { 780 printf("ns8382x_send: Transmit error, Tx status %lX.\n", tx_stat); 781 goto Done; 782 } 783 #ifdef NS8382X_DEBUG 784 printf("ns8382x_send: tx_stat: %#08X\n", tx_stat); 785 #endif 786 787 status = 1; 788 Done: 789 return status; 790 } 791 792 /* Function: ns8382x_poll 793 * Description: checks for a received packet and returns it if found. 794 * Arguments: struct eth_device *dev: NIC data structure 795 * Returns: 1 if packet was received. 796 * 0 if no packet was received. 797 * Side effects: 798 * Returns (copies) the packet to the array dev->packet. 799 * Returns the length of the packet. 800 */ 801 802 static int 803 ns8382x_poll(struct eth_device *dev) 804 { 805 int retstat = 0; 806 int length = 0; 807 vu_long rx_status = le32_to_cpu(rxd[cur_rx].cmdsts); 808 809 if (!(rx_status & (u32) DescOwn)) 810 return retstat; 811 #ifdef NS8382X_DEBUG 812 printf("ns8382x_poll: got a packet: cur_rx:%u, status:%lx\n", 813 cur_rx, rx_status); 814 #endif 815 length = (rx_status & DSIZE) - CRC_SIZE; 816 817 if ((rx_status & (DescMore | DescPktOK | DescRxLong)) != DescPktOK) { 818 /* corrupted packet received */ 819 printf("ns8382x_poll: Corrupted packet, status:%lx\n", rx_status); 820 retstat = 0; 821 } else { 822 /* give packet to higher level routine */ 823 NetReceive((rxb + cur_rx * RX_BUF_SIZE), length); 824 retstat = 1; 825 } 826 827 /* return the descriptor and buffer to receive ring */ 828 rxd[cur_rx].cmdsts = cpu_to_le32(RX_BUF_SIZE); 829 rxd[cur_rx].bufptr = cpu_to_le32((u32) & rxb[cur_rx * RX_BUF_SIZE]); 830 831 if (++cur_rx == NUM_RX_DESC) 832 cur_rx = 0; 833 834 /* re-enable the potentially idle receive state machine */ 835 OUTL(dev, RxOn, ChipCmd); 836 837 return retstat; 838 } 839 840 /* Function: ns8382x_disable 841 * Description: Turns off interrupts and stops Tx and Rx engines 842 * Arguments: struct eth_device *dev: NIC data structure 843 * Returns: void. 844 */ 845 846 static void 847 ns8382x_disable(struct eth_device *dev) 848 { 849 /* Disable interrupts using the mask. */ 850 OUTL(dev, 0, IntrMask); 851 OUTL(dev, 0, IntrEnable); 852 853 /* Stop the chip's Tx and Rx processes. */ 854 OUTL(dev, (RxOff | TxOff), ChipCmd); 855 856 /* Restore PME enable bit */ 857 OUTL(dev, SavedClkRun, ClkRun); 858 } 859