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