1 /************************************************************************** 2 * 3 * sundance.c -- Etherboot device driver for the Sundance ST201 "Alta". 4 * Written 2002-2002 by Timothy Legge <tlegge (at) rogers.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 * 20 * Portions of this code based on: 21 * sundance.c: A Linux device driver for the Sundance ST201 "Alta" 22 * Written 1999-2002 by Donald Becker 23 * 24 * tulip.c: Tulip and Clone Etherboot Driver 25 * By Marty Conner 26 * Copyright (C) 2001 Entity Cyber, Inc. 27 * 28 * Linux Driver Version LK1.09a, 10-Jul-2003 (2.4.25) 29 * 30 * REVISION HISTORY: 31 * ================ 32 * v1.1 01-01-2003 timlegge Initial implementation 33 * v1.7 04-10-2003 timlegge Transfers Linux Kernel (30 sec) 34 * v1.8 04-13-2003 timlegge Fix multiple transmission bug 35 * v1.9 08-19-2003 timlegge Support Multicast 36 * v1.10 01-17-2004 timlegge Initial driver output cleanup 37 * v1.11 03-21-2004 timlegge Remove unused variables 38 * v1.12 03-21-2004 timlegge Remove excess MII defines 39 * v1.13 03-24-2004 timlegge Update to Linux 2.4.25 driver 40 * 41 ****************************************************************************/ 42 43 FILE_LICENCE ( GPL2_OR_LATER ); 44 45 /* to get some global routines like printf */ 46 #include "etherboot.h" 47 /* to get the interface to the body of the program */ 48 #include "nic.h" 49 /* to get the PCI support functions, if this is a PCI NIC */ 50 #include <gpxe/pci.h> 51 #include "mii.h" 52 53 #define drv_version "v1.12" 54 #define drv_date "2004-03-21" 55 56 #define HZ 100 57 58 /* Condensed operations for readability. */ 59 #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr)) 60 #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr)) 61 62 /* Set the mtu */ 63 static int mtu = 1514; 64 65 /* Maximum number of multicast addresses to filter (vs. rx-all-multicast). 66 The sundance uses a 64 element hash table based on the Ethernet CRC. */ 67 // static int multicast_filter_limit = 32; 68 69 /* Set the copy breakpoint for the copy-only-tiny-frames scheme. 70 Setting to > 1518 effectively disables this feature. 71 This chip can receive into any byte alignment buffers, so word-oriented 72 archs do not need a copy-align of the IP header. */ 73 static int rx_copybreak = 0; 74 static int flowctrl = 1; 75 76 /* Allow forcing the media type */ 77 /* media[] specifies the media type the NIC operates at. 78 autosense Autosensing active media. 79 10mbps_hd 10Mbps half duplex. 80 10mbps_fd 10Mbps full duplex. 81 100mbps_hd 100Mbps half duplex. 82 100mbps_fd 100Mbps full duplex. 83 */ 84 static char media[] = "autosense"; 85 86 /* Operational parameters that are set at compile time. */ 87 88 /* As Etherboot uses a Polling driver we can keep the number of rings 89 to the minimum number required. In general that is 1 transmit and 4 receive receive rings. However some cards require that 90 there be a minimum of 2 rings */ 91 #define TX_RING_SIZE 2 92 #define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */ 93 #define RX_RING_SIZE 4 94 95 96 /* Operational parameters that usually are not changed. */ 97 /* Time in jiffies before concluding the transmitter is hung. */ 98 #define TX_TIME_OUT (4*HZ) 99 #define PKT_BUF_SZ 1536 100 101 /* Offsets to the device registers. 102 Unlike software-only systems, device drivers interact with complex hardware. 103 It's not useful to define symbolic names for every register bit in the 104 device. The name can only partially document the semantics and make 105 the driver longer and more difficult to read. 106 In general, only the important configuration values or bits changed 107 multiple times should be defined symbolically. 108 */ 109 enum alta_offsets { 110 DMACtrl = 0x00, 111 TxListPtr = 0x04, 112 TxDMABurstThresh = 0x08, 113 TxDMAUrgentThresh = 0x09, 114 TxDMAPollPeriod = 0x0a, 115 RxDMAStatus = 0x0c, 116 RxListPtr = 0x10, 117 DebugCtrl0 = 0x1a, 118 DebugCtrl1 = 0x1c, 119 RxDMABurstThresh = 0x14, 120 RxDMAUrgentThresh = 0x15, 121 RxDMAPollPeriod = 0x16, 122 LEDCtrl = 0x1a, 123 ASICCtrl = 0x30, 124 EEData = 0x34, 125 EECtrl = 0x36, 126 TxStartThresh = 0x3c, 127 RxEarlyThresh = 0x3e, 128 FlashAddr = 0x40, 129 FlashData = 0x44, 130 TxStatus = 0x46, 131 TxFrameId = 0x47, 132 DownCounter = 0x18, 133 IntrClear = 0x4a, 134 IntrEnable = 0x4c, 135 IntrStatus = 0x4e, 136 MACCtrl0 = 0x50, 137 MACCtrl1 = 0x52, 138 StationAddr = 0x54, 139 MaxFrameSize = 0x5A, 140 RxMode = 0x5c, 141 MIICtrl = 0x5e, 142 MulticastFilter0 = 0x60, 143 MulticastFilter1 = 0x64, 144 RxOctetsLow = 0x68, 145 RxOctetsHigh = 0x6a, 146 TxOctetsLow = 0x6c, 147 TxOctetsHigh = 0x6e, 148 TxFramesOK = 0x70, 149 RxFramesOK = 0x72, 150 StatsCarrierError = 0x74, 151 StatsLateColl = 0x75, 152 StatsMultiColl = 0x76, 153 StatsOneColl = 0x77, 154 StatsTxDefer = 0x78, 155 RxMissed = 0x79, 156 StatsTxXSDefer = 0x7a, 157 StatsTxAbort = 0x7b, 158 StatsBcastTx = 0x7c, 159 StatsBcastRx = 0x7d, 160 StatsMcastTx = 0x7e, 161 StatsMcastRx = 0x7f, 162 /* Aliased and bogus values! */ 163 RxStatus = 0x0c, 164 }; 165 enum ASICCtrl_HiWord_bit { 166 GlobalReset = 0x0001, 167 RxReset = 0x0002, 168 TxReset = 0x0004, 169 DMAReset = 0x0008, 170 FIFOReset = 0x0010, 171 NetworkReset = 0x0020, 172 HostReset = 0x0040, 173 ResetBusy = 0x0400, 174 }; 175 176 /* Bits in the interrupt status/mask registers. */ 177 enum intr_status_bits { 178 IntrSummary = 0x0001, IntrPCIErr = 0x0002, IntrMACCtrl = 0x0008, 179 IntrTxDone = 0x0004, IntrRxDone = 0x0010, IntrRxStart = 0x0020, 180 IntrDrvRqst = 0x0040, 181 StatsMax = 0x0080, LinkChange = 0x0100, 182 IntrTxDMADone = 0x0200, IntrRxDMADone = 0x0400, 183 }; 184 185 /* Bits in the RxMode register. */ 186 enum rx_mode_bits { 187 AcceptAllIPMulti = 0x20, AcceptMultiHash = 0x10, AcceptAll = 0x08, 188 AcceptBroadcast = 0x04, AcceptMulticast = 0x02, AcceptMyPhys = 189 0x01, 190 }; 191 /* Bits in MACCtrl. */ 192 enum mac_ctrl0_bits { 193 EnbFullDuplex = 0x20, EnbRcvLargeFrame = 0x40, 194 EnbFlowCtrl = 0x100, EnbPassRxCRC = 0x200, 195 }; 196 enum mac_ctrl1_bits { 197 StatsEnable = 0x0020, StatsDisable = 0x0040, StatsEnabled = 0x0080, 198 TxEnable = 0x0100, TxDisable = 0x0200, TxEnabled = 0x0400, 199 RxEnable = 0x0800, RxDisable = 0x1000, RxEnabled = 0x2000, 200 }; 201 202 /* The Rx and Tx buffer descriptors. 203 Using only 32 bit fields simplifies software endian correction. 204 This structure must be aligned, and should avoid spanning cache lines. 205 */ 206 struct netdev_desc { 207 u32 next_desc; 208 u32 status; 209 u32 addr; 210 u32 length; 211 }; 212 213 /* Bits in netdev_desc.status */ 214 enum desc_status_bits { 215 DescOwn = 0x8000, 216 DescEndPacket = 0x4000, 217 DescEndRing = 0x2000, 218 LastFrag = 0x80000000, 219 DescIntrOnTx = 0x8000, 220 DescIntrOnDMADone = 0x80000000, 221 DisableAlign = 0x00000001, 222 }; 223 224 /********************************************** 225 * Descriptor Ring and Buffer defination 226 ***********************************************/ 227 /* Define the TX Descriptor */ 228 static struct netdev_desc tx_ring[TX_RING_SIZE]; 229 230 /* Define the RX Descriptor */ 231 static struct netdev_desc rx_ring[RX_RING_SIZE]; 232 233 /* Create a static buffer of size PKT_BUF_SZ for each RX and TX descriptor. 234 All descriptors point to a part of this buffer */ 235 struct { 236 unsigned char txb[PKT_BUF_SZ * TX_RING_SIZE]; 237 unsigned char rxb[RX_RING_SIZE * PKT_BUF_SZ]; 238 } rx_tx_buf __shared; 239 #define rxb rx_tx_buf.rxb 240 #define txb rx_tx_buf.txb 241 242 /* FIXME: Move BASE to the private structure */ 243 static u32 BASE; 244 #define EEPROM_SIZE 128 245 246 enum pci_id_flags_bits { 247 PCI_USES_IO = 1, PCI_USES_MEM = 2, PCI_USES_MASTER = 4, 248 PCI_ADDR0 = 0 << 4, PCI_ADDR1 = 1 << 4, PCI_ADDR2 = 249 2 << 4, PCI_ADDR3 = 3 << 4, 250 }; 251 252 enum chip_capability_flags { CanHaveMII = 1, KendinPktDropBug = 2, }; 253 #define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_IO | PCI_ADDR0) 254 255 #define MII_CNT 4 256 static struct sundance_private { 257 const char *nic_name; 258 /* Frequently used values */ 259 260 unsigned int cur_rx; /* Producer/consumer ring indicies */ 261 unsigned int mtu; 262 263 /* These values keep track of the tranceiver/media in use */ 264 unsigned int flowctrl:1; 265 unsigned int an_enable:1; 266 267 unsigned int speed; 268 269 /* MII tranceiver section */ 270 struct mii_if_info mii_if; 271 int mii_preamble_required; 272 unsigned char phys[MII_CNT]; 273 unsigned char pci_rev_id; 274 } sdx; 275 276 static struct sundance_private *sdc; 277 278 /* Station Address location within the EEPROM */ 279 #define EEPROM_SA_OFFSET 0x10 280 #define DEFAULT_INTR (IntrRxDMADone | IntrPCIErr | \ 281 IntrDrvRqst | IntrTxDone | StatsMax | \ 282 LinkChange) 283 284 static int eeprom_read(long ioaddr, int location); 285 static int mdio_read(struct nic *nic, int phy_id, unsigned int location); 286 static void mdio_write(struct nic *nic, int phy_id, unsigned int location, 287 int value); 288 static void set_rx_mode(struct nic *nic); 289 290 static void check_duplex(struct nic *nic) 291 { 292 int mii_lpa = mdio_read(nic, sdc->phys[0], MII_LPA); 293 int negotiated = mii_lpa & sdc->mii_if.advertising; 294 int duplex; 295 296 /* Force media */ 297 if (!sdc->an_enable || mii_lpa == 0xffff) { 298 if (sdc->mii_if.full_duplex) 299 outw(inw(BASE + MACCtrl0) | EnbFullDuplex, 300 BASE + MACCtrl0); 301 return; 302 } 303 304 /* Autonegotiation */ 305 duplex = (negotiated & 0x0100) || (negotiated & 0x01C0) == 0x0040; 306 if (sdc->mii_if.full_duplex != duplex) { 307 sdc->mii_if.full_duplex = duplex; 308 DBG ("%s: Setting %s-duplex based on MII #%d " 309 "negotiated capability %4.4x.\n", sdc->nic_name, 310 duplex ? "full" : "half", sdc->phys[0], 311 negotiated ); 312 outw(inw(BASE + MACCtrl0) | duplex ? 0x20 : 0, 313 BASE + MACCtrl0); 314 } 315 } 316 317 318 /************************************************************************** 319 * init_ring - setup the tx and rx descriptors 320 *************************************************************************/ 321 static void init_ring(struct nic *nic __unused) 322 { 323 int i; 324 325 sdc->cur_rx = 0; 326 327 /* Initialize all the Rx descriptors */ 328 for (i = 0; i < RX_RING_SIZE; i++) { 329 rx_ring[i].next_desc = virt_to_le32desc(&rx_ring[i + 1]); 330 rx_ring[i].status = 0; 331 rx_ring[i].length = 0; 332 rx_ring[i].addr = 0; 333 } 334 335 /* Mark the last entry as wrapping the ring */ 336 rx_ring[i - 1].next_desc = virt_to_le32desc(&rx_ring[0]); 337 338 for (i = 0; i < RX_RING_SIZE; i++) { 339 rx_ring[i].addr = virt_to_le32desc(&rxb[i * PKT_BUF_SZ]); 340 rx_ring[i].length = cpu_to_le32(PKT_BUF_SZ | LastFrag); 341 } 342 343 /* We only use one transmit buffer, but two 344 * descriptors so transmit engines have somewhere 345 * to point should they feel the need */ 346 tx_ring[0].status = 0x00000000; 347 tx_ring[0].addr = virt_to_bus(&txb[0]); 348 tx_ring[0].next_desc = 0; /* virt_to_bus(&tx_ring[1]); */ 349 350 /* This descriptor is never used */ 351 tx_ring[1].status = 0x00000000; 352 tx_ring[1].addr = 0; /*virt_to_bus(&txb[0]); */ 353 tx_ring[1].next_desc = 0; 354 355 /* Mark the last entry as wrapping the ring, 356 * though this should never happen */ 357 tx_ring[1].length = cpu_to_le32(LastFrag | PKT_BUF_SZ); 358 } 359 360 /************************************************************************** 361 * RESET - Reset Adapter 362 * ***********************************************************************/ 363 static void sundance_reset(struct nic *nic) 364 { 365 int i; 366 367 init_ring(nic); 368 369 outl(virt_to_le32desc(&rx_ring[0]), BASE + RxListPtr); 370 /* The Tx List Pointer is written as packets are queued */ 371 372 /* Initialize other registers. */ 373 /* __set_mac_addr(dev); */ 374 { 375 u16 addr16; 376 377 addr16 = (nic->node_addr[0] | (nic->node_addr[1] << 8)); 378 outw(addr16, BASE + StationAddr); 379 addr16 = (nic->node_addr[2] | (nic->node_addr[3] << 8)); 380 outw(addr16, BASE + StationAddr + 2); 381 addr16 = (nic->node_addr[4] | (nic->node_addr[5] << 8)); 382 outw(addr16, BASE + StationAddr + 4); 383 } 384 385 outw(sdc->mtu + 14, BASE + MaxFrameSize); 386 if (sdc->mtu > 2047) /* this will never happen with default options */ 387 outl(inl(BASE + ASICCtrl) | 0x0c, BASE + ASICCtrl); 388 389 set_rx_mode(nic); 390 391 outw(0, BASE + DownCounter); 392 /* Set the chip to poll every N*30nsec */ 393 outb(100, BASE + RxDMAPollPeriod); 394 395 /* Fix DFE-580TX packet drop issue */ 396 if (sdc->pci_rev_id >= 0x14) 397 writeb(0x01, BASE + DebugCtrl1); 398 399 outw(RxEnable | TxEnable, BASE + MACCtrl1); 400 401 /* Construct a perfect filter frame with the mac address as first match 402 * and broadcast for all others */ 403 for (i = 0; i < 192; i++) 404 txb[i] = 0xFF; 405 406 txb[0] = nic->node_addr[0]; 407 txb[1] = nic->node_addr[1]; 408 txb[2] = nic->node_addr[2]; 409 txb[3] = nic->node_addr[3]; 410 txb[4] = nic->node_addr[4]; 411 txb[5] = nic->node_addr[5]; 412 413 DBG ( "%s: Done sundance_reset, status: Rx %hX Tx %hX " 414 "MAC Control %hX, %hX %hX\n", 415 sdc->nic_name, (int) inl(BASE + RxStatus), 416 (int) inw(BASE + TxStatus), (int) inl(BASE + MACCtrl0), 417 (int) inw(BASE + MACCtrl1), (int) inw(BASE + MACCtrl0) ); 418 } 419 420 /************************************************************************** 421 IRQ - Wait for a frame 422 ***************************************************************************/ 423 static void sundance_irq ( struct nic *nic, irq_action_t action ) { 424 unsigned int intr_status; 425 426 switch ( action ) { 427 case DISABLE : 428 case ENABLE : 429 intr_status = inw(nic->ioaddr + IntrStatus); 430 intr_status = intr_status & ~DEFAULT_INTR; 431 if ( action == ENABLE ) 432 intr_status = intr_status | DEFAULT_INTR; 433 outw(intr_status, nic->ioaddr + IntrEnable); 434 break; 435 case FORCE : 436 outw(0x0200, BASE + ASICCtrl); 437 break; 438 } 439 } 440 /************************************************************************** 441 POLL - Wait for a frame 442 ***************************************************************************/ 443 static int sundance_poll(struct nic *nic, int retreive) 444 { 445 /* return true if there's an ethernet packet ready to read */ 446 /* nic->packet should contain data on return */ 447 /* nic->packetlen should contain length of data */ 448 int entry = sdc->cur_rx % RX_RING_SIZE; 449 u32 frame_status = le32_to_cpu(rx_ring[entry].status); 450 int intr_status; 451 int pkt_len = 0; 452 453 if (!(frame_status & DescOwn)) 454 return 0; 455 456 /* There is a packet ready */ 457 if(!retreive) 458 return 1; 459 460 intr_status = inw(nic->ioaddr + IntrStatus); 461 outw(intr_status, nic->ioaddr + IntrStatus); 462 463 pkt_len = frame_status & 0x1fff; 464 465 if (frame_status & 0x001f4000) { 466 DBG ( "Polling frame_status error\n" ); /* Do we really care about this */ 467 } else { 468 if (pkt_len < rx_copybreak) { 469 /* FIXME: What should happen Will this ever occur */ 470 printf("Poll Error: pkt_len < rx_copybreak"); 471 } else { 472 nic->packetlen = pkt_len; 473 memcpy(nic->packet, rxb + 474 (sdc->cur_rx * PKT_BUF_SZ), nic->packetlen); 475 476 } 477 } 478 rx_ring[entry].length = cpu_to_le32(PKT_BUF_SZ | LastFrag); 479 rx_ring[entry].status = 0; 480 entry++; 481 sdc->cur_rx = entry % RX_RING_SIZE; 482 outw(DEFAULT_INTR & ~(IntrRxDone|IntrRxDMADone), 483 nic->ioaddr + IntrStatus); 484 return 1; 485 } 486 487 /************************************************************************** 488 TRANSMIT - Transmit a frame 489 ***************************************************************************/ 490 static void sundance_transmit(struct nic *nic, const char *d, /* Destination */ 491 unsigned int t, /* Type */ 492 unsigned int s, /* size */ 493 const char *p) 494 { /* Packet */ 495 u16 nstype; 496 u32 to; 497 498 /* Disable the Tx */ 499 outw(TxDisable, BASE + MACCtrl1); 500 501 memcpy(txb, d, ETH_ALEN); 502 memcpy(txb + ETH_ALEN, nic->node_addr, ETH_ALEN); 503 nstype = htons((u16) t); 504 memcpy(txb + 2 * ETH_ALEN, (u8 *) & nstype, 2); 505 memcpy(txb + ETH_HLEN, p, s); 506 507 s += ETH_HLEN; 508 s &= 0x0FFF; 509 while (s < ETH_ZLEN) 510 txb[s++] = '\0'; 511 512 /* Setup the transmit descriptor */ 513 tx_ring[0].length = cpu_to_le32(s | LastFrag); 514 tx_ring[0].status = cpu_to_le32(0x00000001); 515 516 /* Point to transmit descriptor */ 517 outl(virt_to_le32desc(&tx_ring[0]), BASE + TxListPtr); 518 519 /* Enable Tx */ 520 outw(TxEnable, BASE + MACCtrl1); 521 /* Trigger an immediate send */ 522 outw(0, BASE + TxStatus); 523 524 to = currticks() + TX_TIME_OUT; 525 while (!(tx_ring[0].status & 0x00010000) && (currticks() < to)); /* wait */ 526 527 if (currticks() >= to) { 528 printf("TX Time Out"); 529 } 530 /* Disable Tx */ 531 outw(TxDisable, BASE + MACCtrl1); 532 533 } 534 535 /************************************************************************** 536 DISABLE - Turn off ethernet interface 537 ***************************************************************************/ 538 static void sundance_disable ( struct nic *nic __unused ) { 539 /* put the card in its initial state */ 540 /* This function serves 3 purposes. 541 * This disables DMA and interrupts so we don't receive 542 * unexpected packets or interrupts from the card after 543 * etherboot has finished. 544 * This frees resources so etherboot may use 545 * this driver on another interface 546 * This allows etherboot to reinitialize the interface 547 * if something is something goes wrong. 548 */ 549 outw(0x0000, BASE + IntrEnable); 550 /* Stop the Chipchips Tx and Rx Status */ 551 outw(TxDisable | RxDisable | StatsDisable, BASE + MACCtrl1); 552 } 553 554 static struct nic_operations sundance_operations = { 555 .connect = dummy_connect, 556 .poll = sundance_poll, 557 .transmit = sundance_transmit, 558 .irq = sundance_irq, 559 560 }; 561 562 /************************************************************************** 563 PROBE - Look for an adapter, this routine's visible to the outside 564 ***************************************************************************/ 565 static int sundance_probe ( struct nic *nic, struct pci_device *pci ) { 566 567 u8 ee_data[EEPROM_SIZE]; 568 u16 mii_ctl; 569 int i; 570 int speed; 571 572 if (pci->ioaddr == 0) 573 return 0; 574 575 /* BASE is used throughout to address the card */ 576 BASE = pci->ioaddr; 577 printf(" sundance.c: Found %s Vendor=0x%hX Device=0x%hX\n", 578 pci->driver_name, pci->vendor, pci->device); 579 580 /* Get the MAC Address by reading the EEPROM */ 581 for (i = 0; i < 3; i++) { 582 ((u16 *) ee_data)[i] = 583 le16_to_cpu(eeprom_read(BASE, i + EEPROM_SA_OFFSET)); 584 } 585 /* Update the nic structure with the MAC Address */ 586 for (i = 0; i < ETH_ALEN; i++) { 587 nic->node_addr[i] = ee_data[i]; 588 } 589 590 /* Set the card as PCI Bus Master */ 591 adjust_pci_device(pci); 592 593 // sdc->mii_if.dev = pci; 594 // sdc->mii_if.phy_id_mask = 0x1f; 595 // sdc->mii_if.reg_num_mask = 0x1f; 596 597 /* point to private storage */ 598 sdc = &sdx; 599 600 sdc->nic_name = pci->driver_name; 601 sdc->mtu = mtu; 602 603 pci_read_config_byte(pci, PCI_REVISION_ID, &sdc->pci_rev_id); 604 605 DBG ( "Device revision id: %hx\n", sdc->pci_rev_id ); 606 607 /* Print out some hardware info */ 608 DBG ( "%s: %s at ioaddr %hX, ", pci->driver_name, nic->node_addr, (unsigned int) BASE); 609 610 sdc->mii_preamble_required = 0; 611 if (1) { 612 int phy, phy_idx = 0; 613 sdc->phys[0] = 1; /* Default Setting */ 614 sdc->mii_preamble_required++; 615 for (phy = 1; phy < 32 && phy_idx < MII_CNT; phy++) { 616 int mii_status = mdio_read(nic, phy, MII_BMSR); 617 if (mii_status != 0xffff && mii_status != 0x0000) { 618 sdc->phys[phy_idx++] = phy; 619 sdc->mii_if.advertising = 620 mdio_read(nic, phy, MII_ADVERTISE); 621 if ((mii_status & 0x0040) == 0) 622 sdc->mii_preamble_required++; 623 DBG 624 ( "%s: MII PHY found at address %d, status " "%hX advertising %hX\n", sdc->nic_name, phy, mii_status, sdc->mii_if.advertising ); 625 } 626 } 627 sdc->mii_preamble_required--; 628 if (phy_idx == 0) 629 printf("%s: No MII transceiver found!\n", 630 sdc->nic_name); 631 sdc->mii_if.phy_id = sdc->phys[0]; 632 } 633 634 /* Parse override configuration */ 635 sdc->an_enable = 1; 636 if (strcasecmp(media, "autosense") != 0) { 637 sdc->an_enable = 0; 638 if (strcasecmp(media, "100mbps_fd") == 0 || 639 strcasecmp(media, "4") == 0) { 640 sdc->speed = 100; 641 sdc->mii_if.full_duplex = 1; 642 } else if (strcasecmp(media, "100mbps_hd") == 0 643 || strcasecmp(media, "3") == 0) { 644 sdc->speed = 100; 645 sdc->mii_if.full_duplex = 0; 646 } else if (strcasecmp(media, "10mbps_fd") == 0 || 647 strcasecmp(media, "2") == 0) { 648 sdc->speed = 10; 649 sdc->mii_if.full_duplex = 1; 650 } else if (strcasecmp(media, "10mbps_hd") == 0 || 651 strcasecmp(media, "1") == 0) { 652 sdc->speed = 10; 653 sdc->mii_if.full_duplex = 0; 654 } else { 655 sdc->an_enable = 1; 656 } 657 } 658 if (flowctrl == 1) 659 sdc->flowctrl = 1; 660 661 /* Fibre PHY? */ 662 if (inl(BASE + ASICCtrl) & 0x80) { 663 /* Default 100Mbps Full */ 664 if (sdc->an_enable) { 665 sdc->speed = 100; 666 sdc->mii_if.full_duplex = 1; 667 sdc->an_enable = 0; 668 } 669 } 670 671 /* The Linux driver uses flow control and resets the link here. This means the 672 mii section from above would need to be re done I believe. Since it serves 673 no real purpose leave it out. */ 674 675 /* Force media type */ 676 if (!sdc->an_enable) { 677 mii_ctl = 0; 678 mii_ctl |= (sdc->speed == 100) ? BMCR_SPEED100 : 0; 679 mii_ctl |= (sdc->mii_if.full_duplex) ? BMCR_FULLDPLX : 0; 680 mdio_write(nic, sdc->phys[0], MII_BMCR, mii_ctl); 681 printf("Override speed=%d, %s duplex\n", 682 sdc->speed, 683 sdc->mii_if.full_duplex ? "Full" : "Half"); 684 } 685 686 /* Reset the chip to erase previous misconfiguration */ 687 DBG ( "ASIC Control is %#x\n", inl(BASE + ASICCtrl) ); 688 outw(0x007f, BASE + ASICCtrl + 2); 689 690 /* 691 * wait for reset to complete 692 * this is heavily inspired by the linux sundance driver 693 * according to the linux driver it can take up to 1ms for the reset 694 * to complete 695 */ 696 i = 0; 697 while(inl(BASE + ASICCtrl) & (ResetBusy << 16)) { 698 if(i++ >= 10) { 699 DBG("sundance: NIC reset did not complete.\n"); 700 break; 701 } 702 udelay(100); 703 } 704 705 DBG ( "ASIC Control is now %#x.\n", inl(BASE + ASICCtrl) ); 706 707 sundance_reset(nic); 708 if (sdc->an_enable) { 709 u16 mii_advertise, mii_lpa; 710 mii_advertise = 711 mdio_read(nic, sdc->phys[0], MII_ADVERTISE); 712 mii_lpa = mdio_read(nic, sdc->phys[0], MII_LPA); 713 mii_advertise &= mii_lpa; 714 if (mii_advertise & ADVERTISE_100FULL) 715 sdc->speed = 100; 716 else if (mii_advertise & ADVERTISE_100HALF) 717 sdc->speed = 100; 718 else if (mii_advertise & ADVERTISE_10FULL) 719 sdc->speed = 10; 720 else if (mii_advertise & ADVERTISE_10HALF) 721 sdc->speed = 10; 722 } else { 723 mii_ctl = mdio_read(nic, sdc->phys[0], MII_BMCR); 724 speed = (mii_ctl & BMCR_SPEED100) ? 100 : 10; 725 sdc->speed = speed; 726 printf("%s: Link changed: %dMbps ,", sdc->nic_name, speed); 727 printf("%s duplex.\n", (mii_ctl & BMCR_FULLDPLX) ? 728 "full" : "half"); 729 } 730 check_duplex(nic); 731 if (sdc->flowctrl && sdc->mii_if.full_duplex) { 732 outw(inw(BASE + MulticastFilter1 + 2) | 0x0200, 733 BASE + MulticastFilter1 + 2); 734 outw(inw(BASE + MACCtrl0) | EnbFlowCtrl, BASE + MACCtrl0); 735 } 736 printf("%dMbps, %s-Duplex\n", sdc->speed, 737 sdc->mii_if.full_duplex ? "Full" : "Half"); 738 739 /* point to NIC specific routines */ 740 nic->nic_op = &sundance_operations; 741 742 nic->irqno = pci->irq; 743 nic->ioaddr = BASE; 744 745 return 1; 746 } 747 748 749 /* Read the EEPROM and MII Management Data I/O (MDIO) interfaces. */ 750 static int eeprom_read(long ioaddr, int location) 751 { 752 int boguscnt = 10000; /* Typical 1900 ticks */ 753 outw(0x0200 | (location & 0xff), ioaddr + EECtrl); 754 do { 755 if (!(inw(ioaddr + EECtrl) & 0x8000)) { 756 return inw(ioaddr + EEData); 757 } 758 } 759 while (--boguscnt > 0); 760 return 0; 761 } 762 763 /* MII transceiver control section. 764 Read and write the MII registers using software-generated serial 765 MDIO protocol. See the MII specifications or DP83840A data sheet 766 for details. 767 768 The maximum data clock rate is 2.5 Mhz. 769 The timing is decoupled from the processor clock by flushing the write 770 from the CPU write buffer with a following read, and using PCI 771 transaction time. */ 772 773 #define mdio_in(mdio_addr) inb(mdio_addr) 774 #define mdio_out(value, mdio_addr) outb(value, mdio_addr) 775 #define mdio_delay(mdio_addr) inb(mdio_addr) 776 777 enum mii_reg_bits { 778 MDIO_ShiftClk = 0x0001, MDIO_Data = 0x0002, MDIO_EnbOutput = 779 0x0004, 780 }; 781 #define MDIO_EnbIn (0) 782 #define MDIO_WRITE0 (MDIO_EnbOutput) 783 #define MDIO_WRITE1 (MDIO_Data | MDIO_EnbOutput) 784 785 /* Generate the preamble required for initial synchronization and 786 a few older transceivers. */ 787 static void mdio_sync(long mdio_addr) 788 { 789 int bits = 32; 790 791 /* Establish sync by sending at least 32 logic ones. */ 792 while (--bits >= 0) { 793 mdio_out(MDIO_WRITE1, mdio_addr); 794 mdio_delay(mdio_addr); 795 mdio_out(MDIO_WRITE1 | MDIO_ShiftClk, mdio_addr); 796 mdio_delay(mdio_addr); 797 } 798 } 799 800 static int 801 mdio_read(struct nic *nic __unused, int phy_id, unsigned int location) 802 { 803 long mdio_addr = BASE + MIICtrl; 804 int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location; 805 int i, retval = 0; 806 807 if (sdc->mii_preamble_required) 808 mdio_sync(mdio_addr); 809 810 /* Shift the read command bits out. */ 811 for (i = 15; i >= 0; i--) { 812 int dataval = 813 (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; 814 815 mdio_out(dataval, mdio_addr); 816 mdio_delay(mdio_addr); 817 mdio_out(dataval | MDIO_ShiftClk, mdio_addr); 818 mdio_delay(mdio_addr); 819 } 820 /* Read the two transition, 16 data, and wire-idle bits. */ 821 for (i = 19; i > 0; i--) { 822 mdio_out(MDIO_EnbIn, mdio_addr); 823 mdio_delay(mdio_addr); 824 retval = (retval << 1) | ((mdio_in(mdio_addr) & MDIO_Data) 825 ? 1 : 0); 826 mdio_out(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr); 827 mdio_delay(mdio_addr); 828 } 829 return (retval >> 1) & 0xffff; 830 } 831 832 static void 833 mdio_write(struct nic *nic __unused, int phy_id, 834 unsigned int location, int value) 835 { 836 long mdio_addr = BASE + MIICtrl; 837 int mii_cmd = 838 (0x5002 << 16) | (phy_id << 23) | (location << 18) | value; 839 int i; 840 841 if (sdc->mii_preamble_required) 842 mdio_sync(mdio_addr); 843 844 /* Shift the command bits out. */ 845 for (i = 31; i >= 0; i--) { 846 int dataval = 847 (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; 848 mdio_out(dataval, mdio_addr); 849 mdio_delay(mdio_addr); 850 mdio_out(dataval | MDIO_ShiftClk, mdio_addr); 851 mdio_delay(mdio_addr); 852 } 853 /* Clear out extra bits. */ 854 for (i = 2; i > 0; i--) { 855 mdio_out(MDIO_EnbIn, mdio_addr); 856 mdio_delay(mdio_addr); 857 mdio_out(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr); 858 mdio_delay(mdio_addr); 859 } 860 return; 861 } 862 863 static void set_rx_mode(struct nic *nic __unused) 864 { 865 int i; 866 u16 mc_filter[4]; /* Multicast hash filter */ 867 u32 rx_mode; 868 869 memset(mc_filter, 0xff, sizeof(mc_filter)); 870 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys; 871 872 if (sdc->mii_if.full_duplex && sdc->flowctrl) 873 mc_filter[3] |= 0x0200; 874 for (i = 0; i < 4; i++) 875 outw(mc_filter[i], BASE + MulticastFilter0 + i * 2); 876 outb(rx_mode, BASE + RxMode); 877 return; 878 } 879 880 static struct pci_device_id sundance_nics[] = { 881 PCI_ROM(0x13f0, 0x0201, "sundance", "ST201 Sundance 'Alta' based Adaptor", 0), 882 PCI_ROM(0x1186, 0x1002, "dfe530txs", "D-Link DFE530TXS (Sundance ST201 Alta)", 0), 883 PCI_ROM(0x13f0, 0x0200, "ip100a", "IC+ IP100A", 0), 884 }; 885 886 PCI_DRIVER ( sundance_driver, sundance_nics, PCI_NO_CLASS ); 887 888 DRIVER ( "SUNDANCE/PCI", nic_driver, pci_driver, sundance_driver, 889 sundance_probe, sundance_disable ); 890 891 /* 892 * Local variables: 893 * c-basic-offset: 8 894 * c-indent-level: 8 895 * tab-width: 8 896 * End: 897 */ 898