1/* 2 * Etherboot - BOOTP/TFTP Bootstrap Program 3 * 4 * w89c840.c -- This file implements the winbond-840 driver for etherboot. 5 * 6 */ 7 8/* 9 * Adapted by Igor V. Kovalenko 10 * -- <garrison@mail.ru> 11 * OR 12 * -- <iko@crec.mipt.ru> 13 * Initial adaptaion stage, including testing, completed 23 August 2000. 14 */ 15 16/* 17 * This program is free software; you can redistribute it and/or 18 * modify it under the terms of the GNU General Public License as 19 * published by the Free Software Foundation; either version 2, or (at 20 * your option) any later version. 21 * 22 * This program is distributed in the hope that it will be useful, but 23 * WITHOUT ANY WARRANTY; without even the implied warranty of 24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 25 * General Public License for more details. 26 * 27 * You should have received a copy of the GNU General Public License 28 * along with this program; if not, write to the Free Software 29 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 30 */ 31 32/* 33 * date version by what 34 * Written: Aug 20 2000 V0.10 iko Initial revision. 35 * changes: Aug 22 2000 V0.90 iko Works! 36 * Aug 23 2000 V0.91 iko Cleanup, posted to etherboot 37 * maintainer. 38 * Aug 26 2000 V0.92 iko Fixed Rx ring handling. 39 * First Linux Kernel (TM) 40 * successfully loaded using 41 * this driver. 42 * Jan 07 2001 V0.93 iko Transmitter timeouts are handled 43 * using timer2 routines. Proposed 44 * by Ken Yap to eliminate CPU speed 45 * dependency. 46 * 47 * This is the etherboot driver for cards based on Winbond W89c840F chip. 48 * 49 * It was written from skeleton source, with Donald Becker's winbond-840.c 50 * kernel driver as a guideline. Mostly the w89c840 related definitions 51 * and the lower level routines have been cut-and-pasted into this source. 52 * 53 * Frankly speaking, about 90% of the code was obtained using cut'n'paste 54 * sequence :) while the remainder appeared while brainstorming 55 * Linux Kernel 2.4.0-testX source code. Thanks, Donald and Linus! 56 * 57 * There was a demand for using this card in a rather large 58 * remote boot environment at MSKP OVTI Lab of 59 * Moscow Institute for Physics and Technology (MIPT) -- http://www.mipt.ru/ 60 * so you may count that for motivation. 61 * 62 */ 63 64/* 65 * If you want to see debugging output then define W89C840_DEBUG 66 */ 67 68/* 69#define W89C840_DEBUG 70*/ 71 72/* 73 * Keep using IO_OPS for Etherboot driver! 74 */ 75#define USE_IO_OPS 76 77#include "etherboot.h" 78#include "nic.h" 79#include "pci.h" 80#include "cards.h" 81#include "timer.h" 82 83static const char *w89c840_version = "diver Version 0.92 - August 27, 2000"; 84 85typedef unsigned char u8; 86typedef signed char s8; 87typedef unsigned short u16; 88typedef signed short s16; 89typedef unsigned int u32; 90typedef signed int s32; 91 92/* Linux support functions */ 93#define virt_to_bus(x) ((unsigned long)x) 94#define bus_to_virt(x) ((void *)x) 95 96#define virt_to_le32desc(addr) virt_to_bus(addr) 97#define le32desc_to_virt(addr) bus_to_virt(addr) 98 99/* 100#define cpu_to_le32(val) (val) 101#define le32_to_cpu(val) (val) 102*/ 103 104/* Operational parameters that are set at compile time. */ 105 106/* Keep the ring sizes a power of two for compile efficiency. 107 The compiler will convert <unsigned>'%'<2^N> into a bit mask. 108 Making the Tx ring too large decreases the effectiveness of channel 109 bonding and packet priority. 110 There are no ill effects from too-large receive rings. */ 111#define TX_RING_SIZE 2 112 113#define RX_RING_SIZE 2 114 115/* The presumed FIFO size for working around the Tx-FIFO-overflow bug. 116 To avoid overflowing we don't queue again until we have room for a 117 full-size packet. 118 */ 119#define TX_FIFO_SIZE (2048) 120#define TX_BUG_FIFO_LIMIT (TX_FIFO_SIZE-1514-16) 121 122/* Operational parameters that usually are not changed. */ 123/* Time in jiffies before concluding the transmitter is hung. */ 124#define TX_TIMEOUT (10*TICKS_PER_MS) 125 126#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ 127 128/* 129 * Used to be this much CPU loops on Celeron@400 (?), 130 * now using real timer and TX_TIMEOUT! 131 * #define TX_LOOP_COUNT 10000000 132 */ 133 134#if !defined(__OPTIMIZE__) 135#warning You must compile this file with the correct options! 136#warning See the last lines of the source file. 137#error You must compile this driver with "-O". 138#endif 139 140enum chip_capability_flags {CanHaveMII=1, HasBrokenTx=2}; 141 142#ifdef USE_IO_OPS 143#define W840_FLAGS (PCI_USES_IO | PCI_ADDR0 | PCI_USES_MASTER) 144#else 145#define W840_FLAGS (PCI_USES_MEM | PCI_ADDR1 | PCI_USES_MASTER) 146#endif 147 148static u32 driver_flags = CanHaveMII | HasBrokenTx; 149 150/* This driver was written to use PCI memory space, however some x86 systems 151 work only with I/O space accesses. Pass -DUSE_IO_OPS to use PCI I/O space 152 accesses instead of memory space. */ 153 154#ifdef USE_IO_OPS 155#undef readb 156#undef readw 157#undef readl 158#undef writeb 159#undef writew 160#undef writel 161#define readb inb 162#define readw inw 163#define readl inl 164#define writeb outb 165#define writew outw 166#define writel outl 167#endif 168 169/* Offsets to the Command and Status Registers, "CSRs". 170 While similar to the Tulip, these registers are longword aligned. 171 Note: It's not useful to define symbolic names for every register bit in 172 the device. The name can only partially document the semantics and make 173 the driver longer and more difficult to read. 174*/ 175enum w840_offsets { 176 PCIBusCfg=0x00, TxStartDemand=0x04, RxStartDemand=0x08, 177 RxRingPtr=0x0C, TxRingPtr=0x10, 178 IntrStatus=0x14, NetworkConfig=0x18, IntrEnable=0x1C, 179 RxMissed=0x20, EECtrl=0x24, MIICtrl=0x24, BootRom=0x28, GPTimer=0x2C, 180 CurRxDescAddr=0x30, CurRxBufAddr=0x34, /* Debug use */ 181 MulticastFilter0=0x38, MulticastFilter1=0x3C, StationAddr=0x40, 182 CurTxDescAddr=0x4C, CurTxBufAddr=0x50, 183}; 184 185/* Bits in the interrupt status/enable registers. */ 186/* The bits in the Intr Status/Enable registers, mostly interrupt sources. */ 187enum intr_status_bits { 188 NormalIntr=0x10000, AbnormalIntr=0x8000, 189 IntrPCIErr=0x2000, TimerInt=0x800, 190 IntrRxDied=0x100, RxNoBuf=0x80, IntrRxDone=0x40, 191 TxFIFOUnderflow=0x20, RxErrIntr=0x10, 192 TxIdle=0x04, IntrTxStopped=0x02, IntrTxDone=0x01, 193}; 194 195/* Bits in the NetworkConfig register. */ 196enum rx_mode_bits { 197 AcceptErr=0x80, AcceptRunt=0x40, 198 AcceptBroadcast=0x20, AcceptMulticast=0x10, 199 AcceptAllPhys=0x08, AcceptMyPhys=0x02, 200}; 201 202enum mii_reg_bits { 203 MDIO_ShiftClk=0x10000, MDIO_DataIn=0x80000, MDIO_DataOut=0x20000, 204 MDIO_EnbOutput=0x40000, MDIO_EnbIn = 0x00000, 205}; 206 207/* The Tulip Rx and Tx buffer descriptors. */ 208struct w840_rx_desc { 209 s32 status; 210 s32 length; 211 u32 buffer1; 212 u32 next_desc; 213}; 214 215struct w840_tx_desc { 216 s32 status; 217 s32 length; 218 u32 buffer1, buffer2; /* We use only buffer 1. */ 219}; 220 221/* Bits in network_desc.status */ 222enum desc_status_bits { 223 DescOwn=0x80000000, DescEndRing=0x02000000, DescUseLink=0x01000000, 224 DescWholePkt=0x60000000, DescStartPkt=0x20000000, DescEndPkt=0x40000000, 225 DescIntr=0x80000000, 226}; 227#define PRIV_ALIGN 15 /* Required alignment mask */ 228#define PRIV_ALIGN_BYTES 32 229 230static struct winbond_private 231{ 232 /* Descriptor rings first for alignment. */ 233 struct w840_rx_desc rx_ring[RX_RING_SIZE]; 234 struct w840_tx_desc tx_ring[TX_RING_SIZE]; 235 struct net_device *next_module; /* Link for devices of this type. */ 236 void *priv_addr; /* Unaligned address for kfree */ 237 const char *product_name; 238 /* Frequently used values: keep some adjacent for cache effect. */ 239 int chip_id, drv_flags; 240 struct pci_dev *pci_dev; 241 int csr6; 242 struct w840_rx_desc *rx_head_desc; 243 unsigned int cur_rx, dirty_rx; /* Producer/consumer ring indices */ 244 unsigned int rx_buf_sz; /* Based on MTU+slack. */ 245 unsigned int cur_tx, dirty_tx; 246 int tx_q_bytes; 247 unsigned int tx_full:1; /* The Tx queue is full. */ 248 /* These values are keep track of the transceiver/media in use. */ 249 unsigned int full_duplex:1; /* Full-duplex operation requested. */ 250 unsigned int duplex_lock:1; 251 unsigned int medialock:1; /* Do not sense media. */ 252 unsigned int default_port:4; /* Last dev->if_port value. */ 253 /* MII transceiver section. */ 254 int mii_cnt; /* MII device addresses. */ 255 u16 advertising; /* NWay media advertisement */ 256 unsigned char phys[2]; /* MII device addresses. */ 257} w840private __attribute__ ((aligned (PRIV_ALIGN_BYTES))); 258 259/* NIC specific static variables go here */ 260 261static int ioaddr; 262static unsigned short eeprom [0x40]; 263 264#ifdef USE_LOWMEM_BUFFER 265#define rx_packet ((char *)0x10000 - PKT_BUF_SZ * RX_RING_SIZE) 266#define tx_packet ((char *)0x10000 - PKT_BUF_SZ * RX_RING_SIZE - PKT_BUF_SZ * TX_RING_SIZE) 267#else 268static char rx_packet[PKT_BUF_SZ * RX_RING_SIZE]; 269static char tx_packet[PKT_BUF_SZ * TX_RING_SIZE]; 270#endif 271 272static int eeprom_read(long ioaddr, int location); 273static int mdio_read(int base_address, int phy_id, int location); 274static void mdio_write(int base_address, int phy_id, int location, int value); 275 276static void check_duplex(void); 277static void set_rx_mode(void); 278static void init_ring(void); 279 280/* 281static void wait_long_time(void) 282{ 283 printf("Paused - please read output above this line\n"); 284 sleep(3); 285} 286*/ 287 288#if defined W89C840_DEBUG 289static void decode_interrupt(u32 intr_status) 290{ 291 printf("Interrupt status: "); 292 293#define TRACE_INTR(_intr_) \ 294 if (intr_status & (_intr_)) { printf (" " #_intr_); } 295 296 TRACE_INTR(NormalIntr); 297 TRACE_INTR(AbnormalIntr); 298 TRACE_INTR(IntrPCIErr); 299 TRACE_INTR(TimerInt); 300 TRACE_INTR(IntrRxDied); 301 TRACE_INTR(RxNoBuf); 302 TRACE_INTR(IntrRxDone); 303 TRACE_INTR(TxFIFOUnderflow); 304 TRACE_INTR(RxErrIntr); 305 TRACE_INTR(TxIdle); 306 TRACE_INTR(IntrTxStopped); 307 TRACE_INTR(IntrTxDone); 308 309 printf("\n"); 310 /*sleep(1);*/ 311} 312#endif 313 314/************************************************************************** 315w89c840_reset - Reset adapter 316***************************************************************************/ 317static void w89c840_reset(struct nic *nic) 318{ 319 int i; 320 321 /* Reset the chip to erase previous misconfiguration. 322 No hold time required! */ 323 writel(0x00000001, ioaddr + PCIBusCfg); 324 325 init_ring(); 326 327 writel(virt_to_bus(w840private.rx_ring), ioaddr + RxRingPtr); 328 writel(virt_to_bus(w840private.tx_ring), ioaddr + TxRingPtr); 329 330 for (i = 0; i < ETH_ALEN; i++) 331 writeb(nic->node_addr[i], ioaddr + StationAddr + i); 332 333 /* Initialize other registers. */ 334 /* Configure the PCI bus bursts and FIFO thresholds. 335 486: Set 8 longword cache alignment, 8 longword burst. 336 586: Set 16 longword cache alignment, no burst limit. 337 Cache alignment bits 15:14 Burst length 13:8 338 0000 <not allowed> 0000 align to cache 0800 8 longwords 339 4000 8 longwords 0100 1 longword 1000 16 longwords 340 8000 16 longwords 0200 2 longwords 2000 32 longwords 341 C000 32 longwords 0400 4 longwords 342 Wait the specified 50 PCI cycles after a reset by initializing 343 Tx and Rx queues and the address filter list. */ 344 345 writel(0xE010, ioaddr + PCIBusCfg); 346 347 writel(0, ioaddr + RxStartDemand); 348 w840private.csr6 = 0x20022002; 349 check_duplex(); 350 set_rx_mode(); 351 352 /* Clear and Enable interrupts by setting the interrupt mask. */ 353 writel(0x1A0F5, ioaddr + IntrStatus); 354 writel(0x1A0F5, ioaddr + IntrEnable); 355 356#if defined(W89C840_DEBUG) 357 printf("winbond-840 : Done reset.\n"); 358#endif 359} 360 361static void handle_intr(u32 intr_stat) 362{ 363 if ((intr_stat & (NormalIntr|AbnormalIntr)) == 0) { 364 /* we are polling, do not return now */ 365 /*return 0;*/ 366 } else { 367 /* Acknowledge all of the current interrupt sources ASAP. */ 368 writel(intr_stat & 0x001ffff, ioaddr + IntrStatus); 369 } 370 371 if (intr_stat & AbnormalIntr) { 372 /* There was an abnormal interrupt */ 373 printf("\n-=- Abnormal interrupt.\n"); 374 375#if defined (W89C840_DEBUG) 376 decode_interrupt(intr_stat); 377#endif 378 379 if (intr_stat & RxNoBuf) { 380 /* There was an interrupt */ 381 printf("-=- <=> No receive buffers available.\n"); 382 writel(0, ioaddr + RxStartDemand); 383 } 384 } 385} 386 387/************************************************************************** 388w89c840_poll - Wait for a frame 389***************************************************************************/ 390static int w89c840_poll(struct nic *nic) 391{ 392 /* return true if there's an ethernet packet ready to read */ 393 /* nic->packet should contain data on return */ 394 /* nic->packetlen should contain length of data */ 395 int packet_received = 0; 396 397 u32 intr_status = readl(ioaddr + IntrStatus); 398 /* handle_intr(intr_status); */ /* -- handled later */ 399 400 do { 401 /* Code from netdev_rx(dev) */ 402 403 int entry = w840private.cur_rx % RX_RING_SIZE; 404 405 struct w840_rx_desc *desc = w840private.rx_head_desc; 406 s32 status = desc->status; 407 408 if (status & DescOwn) { 409 /* DescOwn bit is still set, we should wait for RX to complete */ 410 packet_received = 0; 411 break; 412 } 413 414 if ((status & 0x38008300) != 0x0300) { 415 if ((status & 0x38000300) != 0x0300) { 416 /* Ingore earlier buffers. */ 417 if ((status & 0xffff) != 0x7fff) { 418 printf("winbond-840 : Oversized Ethernet frame spanned " 419 "multiple buffers, entry %d status %X !\n", 420 w840private.cur_rx, status); 421 } 422 } else if (status & 0x8000) { 423 /* There was a fatal error. */ 424#if defined(W89C840_DEBUG) 425 printf("winbond-840 : Receive error, Rx status %X :", status); 426 if (status & 0x0890) { 427 printf(" RXLEN_ERROR"); 428 } 429 if (status & 0x004C) { 430 printf(", FRAME_ERROR"); 431 } 432 if (status & 0x0002) { 433 printf(", CRC_ERROR"); 434 } 435 printf("\n"); 436#endif 437 438 /* Simpy do a reset now... */ 439 w89c840_reset(nic); 440 441 packet_received = 0; 442 break; 443 } 444 } else { 445 /* Omit the four octet CRC from the length. */ 446 int pkt_len = ((status >> 16) & 0x7ff) - 4; 447 448#if defined(W89C840_DEBUG) 449 printf(" netdev_rx() normal Rx pkt ring %d length %d status %X\n", entry, pkt_len, status); 450#endif 451 452 nic->packetlen = pkt_len; 453 454 /* Check if the packet is long enough to accept without copying 455 to a minimally-sized skbuff. */ 456 457 memcpy(nic->packet, le32desc_to_virt(w840private.rx_ring[entry].buffer1), pkt_len); 458 packet_received = 1; 459 460 /* Release buffer to NIC */ 461 w840private.rx_ring[entry].status = DescOwn; 462 463#if defined(W89C840_DEBUG) 464 /* You will want this info for the initial debug. */ 465 printf(" Rx data %hhX:%hhX:%hhX:%hhX:%hhX:" 466 "%hhX %hhX:%hhX:%hhX:%hhX:%hhX:%hhX %hhX%hhX " 467 "%hhX.%hhX.%hhX.%hhX.\n", 468 nic->packet[0], nic->packet[1], nic->packet[2], nic->packet[3], 469 nic->packet[4], nic->packet[5], nic->packet[6], nic->packet[7], 470 nic->packet[8], nic->packet[9], nic->packet[10], 471 nic->packet[11], nic->packet[12], nic->packet[13], 472 nic->packet[14], nic->packet[15], nic->packet[16], 473 nic->packet[17]); 474#endif 475 476 } 477 478 entry = (++w840private.cur_rx) % RX_RING_SIZE; 479 w840private.rx_head_desc = &w840private.rx_ring[entry]; 480 } while (0); 481 482 if (intr_status & (AbnormalIntr | TxFIFOUnderflow | IntrPCIErr |TimerInt | IntrTxStopped)) { 483 handle_intr(intr_status); 484 } 485 486 return packet_received; 487} 488 489/************************************************************************** 490w89c840_transmit - Transmit a frame 491***************************************************************************/ 492 493static void w89c840_transmit( 494 struct nic *nic, 495 const char *d, /* Destination */ 496 unsigned int t, /* Type */ 497 unsigned int s, /* size */ 498 const char *p) /* Packet */ 499{ 500 /* send the packet to destination */ 501 unsigned entry; 502 int transmit_status; 503 504 /* Caution: the write order is important here, set the field 505 with the "ownership" bits last. */ 506 507 /* Fill in our transmit buffer */ 508 entry = w840private.cur_tx % TX_RING_SIZE; 509 510 memcpy (tx_packet, d, ETH_ALEN); /* dst */ 511 memcpy (tx_packet + ETH_ALEN, nic->node_addr, ETH_ALEN);/* src */ 512 513 *((char *) tx_packet + 12) = t >> 8; /* type */ 514 *((char *) tx_packet + 13) = t; 515 516 memcpy (tx_packet + ETH_HLEN, p, s); 517 s += ETH_HLEN; 518 519 while (s < ETH_ZLEN) 520 *((char *) tx_packet + ETH_HLEN + (s++)) = 0; 521 522 w840private.tx_ring[entry].buffer1 = virt_to_le32desc(tx_packet); 523 524 w840private.tx_ring[entry].length = (DescWholePkt | s); 525 if (entry >= TX_RING_SIZE-1) /* Wrap ring */ 526 w840private.tx_ring[entry].length |= (DescIntr | DescEndRing); 527 w840private.tx_ring[entry].status = (DescOwn); 528 w840private.cur_tx++; 529 530 w840private.tx_q_bytes += s; 531 writel(0, ioaddr + TxStartDemand); 532 533 /* Work around horrible bug in the chip by marking the queue as full 534 when we do not have FIFO room for a maximum sized packet. */ 535 536 if ((w840private.drv_flags & HasBrokenTx) && w840private.tx_q_bytes > TX_BUG_FIFO_LIMIT) { 537 /* Actually this is left to help finding error tails later in debugging... 538 * See Linux kernel driver in winbond-840.c for details. 539 */ 540 w840private.tx_full = 1; 541 } 542 543#if defined(W89C840_DEBUG) 544 printf("winbond-840 : Transmit frame # %d size %d queued in slot %d.\n", w840private.cur_tx, s, entry); 545#endif 546 547 /* Now wait for TX to complete. */ 548 transmit_status = w840private.tx_ring[entry].status; 549 550 load_timer2(TX_TIMEOUT); 551 552 { 553 u32 intr_stat = 0; 554 555 while (1) { 556 557 intr_stat = readl(ioaddr + IntrStatus); 558#if defined(W89C840_DEBUG) 559 decode_interrupt(intr_stat); 560#endif 561 562 if (intr_stat & (NormalIntr | IntrTxDone)) { 563 564 while ( (transmit_status & DescOwn) && timer2_running()) { 565 566 transmit_status = w840private.tx_ring[entry].status; 567 } 568 569 writel(intr_stat & 0x0001ffff, ioaddr + IntrStatus); 570 break; 571 } 572 } 573 } 574 575 if ((transmit_status & DescOwn) == 0) { 576 577#if defined(W89C840_DEBUG) 578 printf("winbond-840 : transmission complete after %d wait loop iterations, status %X\n", 579 TX_LOOP_COUNT - transmit_loop_counter, w840private.tx_ring[entry].status); 580#endif 581 582 return; 583 } 584 585 /* Transmit timed out... */ 586 587 printf("winbond-840 : transmission TIMEOUT : status %X\n", w840private.tx_ring[entry].status); 588 589 return; 590} 591 592/************************************************************************** 593w89c840_disable - Turn off ethernet interface 594***************************************************************************/ 595static void w89c840_disable(struct nic *nic) 596{ 597 /* Don't know what to do to disable the board. Is this needed at all? */ 598 /* Yes, a live NIC can corrupt the loaded memory later [Ken] */ 599 /* Stop the chip's Tx and Rx processes. */ 600 writel(w840private.csr6 &= ~0x20FA, ioaddr + NetworkConfig); 601} 602 603/************************************************************************** 604w89c840_probe - Look for an adapter, this routine's visible to the outside 605***************************************************************************/ 606struct nic *w89c840_probe(struct nic *nic, unsigned short *probe_addrs, struct pci_device *p) 607{ 608 u16 sum = 0; 609 int i, j, to; 610 unsigned short value; 611 int options; 612 int promisc; 613 614 if (probe_addrs == 0 || probe_addrs[0] == 0) 615 return 0; 616 617 ioaddr = probe_addrs[0]; /* Mask the bit that says "this is an io addr" */ 618 619#if defined(W89C840_DEBUG) 620 printf("winbond-840: PCI bus %hhX device function %hhX: I/O address: %hX\n", p->bus, p->devfn, ioaddr); 621#endif 622 623 ioaddr = ioaddr & ~3; /* Mask the bit that says "this is an io addr" */ 624 625 /* if probe_addrs is 0, then routine can use a hardwired default */ 626 627 /* From Matt Hortman <mbhortman@acpthinclient.com> */ 628 if (p->vendor == PCI_VENDOR_ID_WINBOND2 629 && p->dev_id == PCI_DEVICE_ID_WINBOND2_89C840) { 630 631 /* detected "Winbond W89c840 Fast Ethernet PCI NIC" */ 632 633 } else if ( p->vendor == PCI_VENDOR_ID_COMPEX 634 && p->dev_id == PCI_DEVICE_ID_COMPEX_RL100ATX) { 635 636 /* detected "Compex RL100ATX Fast Ethernet PCI NIC" */ 637 638 } else { 639 /* Gee, guess what? They missed again. */ 640 printf("device ID : %X - is not a Compex RL100ATX NIC.\n", p->dev_id); 641 return 0; 642 } 643 644 printf(" %s\n", w89c840_version); 645 646 adjust_pci_device(p); 647 648 /* Ok. Got one. Read the eeprom. */ 649 for (j = 0, i = 0; i < 0x40; i++) { 650 value = eeprom_read(ioaddr, i); 651 eeprom[i] = value; 652 sum += value; 653 } 654 655 for (i=0;i<ETH_ALEN;i++) { 656 nic->node_addr[i] = (eeprom[i/2] >> (8*(i&1))) & 0xff; 657 } 658 printf ("Ethernet addr: %!\n", nic->node_addr); 659 660#if defined(W89C840_DEBUG) 661 printf("winbond-840: EEPROM checksum %hX, got eeprom", sum); 662#endif 663 664 /* Reset the chip to erase previous misconfiguration. 665 No hold time required! */ 666 writel(0x00000001, ioaddr + PCIBusCfg); 667 668 if (driver_flags & CanHaveMII) { 669 int phy, phy_idx = 0; 670 for (phy = 1; phy < 32 && phy_idx < 4; phy++) { 671 int mii_status = mdio_read(ioaddr, phy, 1); 672 if (mii_status != 0xffff && mii_status != 0x0000) { 673 w840private.phys[phy_idx++] = phy; 674 w840private.advertising = mdio_read(ioaddr, phy, 4); 675 676#if defined(W89C840_DEBUG) 677 printf("winbond-840 : MII PHY found at address %d, status " 678 "%X advertising %hX.\n", phy, mii_status, w840private.advertising); 679#endif 680 681 } 682 } 683 684 w840private.mii_cnt = phy_idx; 685 686 if (phy_idx == 0) { 687 printf("winbond-840 : MII PHY not found -- this device may not operate correctly.\n"); 688 } 689 } 690 691 /* point to NIC specific routines */ 692 nic->reset = w89c840_reset; 693 nic->poll = w89c840_poll; 694 nic->transmit = w89c840_transmit; 695 nic->disable = w89c840_disable; 696 697 w89c840_reset(nic); 698 699 return nic; 700} 701 702/* Read the EEPROM and MII Management Data I/O (MDIO) interfaces. These are 703 often serial bit streams generated by the host processor. 704 The example below is for the common 93c46 EEPROM, 64 16 bit words. */ 705 706/* Delay between EEPROM clock transitions. 707 No extra delay is needed with 33Mhz PCI, but future 66Mhz access may need 708 a delay. Note that pre-2.0.34 kernels had a cache-alignment bug that 709 made udelay() unreliable. 710 The old method of using an ISA access as a delay, __SLOW_DOWN_IO__, is 711 depricated. 712*/ 713#define eeprom_delay(ee_addr) readl(ee_addr) 714 715enum EEPROM_Ctrl_Bits { 716 EE_ShiftClk=0x02, EE_Write0=0x801, EE_Write1=0x805, 717 EE_ChipSelect=0x801, EE_DataIn=0x08, 718}; 719 720/* The EEPROM commands include the alway-set leading bit. */ 721enum EEPROM_Cmds { 722 EE_WriteCmd=(5 << 6), EE_ReadCmd=(6 << 6), EE_EraseCmd=(7 << 6), 723}; 724 725static int eeprom_read(long addr, int location) 726{ 727 int i; 728 int retval = 0; 729 int ee_addr = addr + EECtrl; 730 int read_cmd = location | EE_ReadCmd; 731 writel(EE_ChipSelect, ee_addr); 732 733 /* Shift the read command bits out. */ 734 for (i = 10; i >= 0; i--) { 735 short dataval = (read_cmd & (1 << i)) ? EE_Write1 : EE_Write0; 736 writel(dataval, ee_addr); 737 eeprom_delay(ee_addr); 738 writel(dataval | EE_ShiftClk, ee_addr); 739 eeprom_delay(ee_addr); 740 } 741 writel(EE_ChipSelect, ee_addr); 742 743 for (i = 16; i > 0; i--) { 744 writel(EE_ChipSelect | EE_ShiftClk, ee_addr); 745 eeprom_delay(ee_addr); 746 retval = (retval << 1) | ((readl(ee_addr) & EE_DataIn) ? 1 : 0); 747 writel(EE_ChipSelect, ee_addr); 748 eeprom_delay(ee_addr); 749 } 750 751 /* Terminate the EEPROM access. */ 752 writel(0, ee_addr); 753 return retval; 754} 755 756/* MII transceiver control section. 757 Read and write the MII registers using software-generated serial 758 MDIO protocol. See the MII specifications or DP83840A data sheet 759 for details. 760 761 The maximum data clock rate is 2.5 Mhz. The minimum timing is usually 762 met by back-to-back 33Mhz PCI cycles. */ 763#define mdio_delay(mdio_addr) readl(mdio_addr) 764 765/* Set iff a MII transceiver on any interface requires mdio preamble. 766 This only set with older tranceivers, so the extra 767 code size of a per-interface flag is not worthwhile. */ 768static char mii_preamble_required = 1; 769 770#define MDIO_WRITE0 (MDIO_EnbOutput) 771#define MDIO_WRITE1 (MDIO_DataOut | MDIO_EnbOutput) 772 773/* Generate the preamble required for initial synchronization and 774 a few older transceivers. */ 775static void mdio_sync(long mdio_addr) 776{ 777 int bits = 32; 778 779 /* Establish sync by sending at least 32 logic ones. */ 780 while (--bits >= 0) { 781 writel(MDIO_WRITE1, mdio_addr); 782 mdio_delay(mdio_addr); 783 writel(MDIO_WRITE1 | MDIO_ShiftClk, mdio_addr); 784 mdio_delay(mdio_addr); 785 } 786} 787 788static int mdio_read(int base_address, int phy_id, int location) 789{ 790 long mdio_addr = base_address + MIICtrl; 791 int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location; 792 int i, retval = 0; 793 794 if (mii_preamble_required) 795 mdio_sync(mdio_addr); 796 797 /* Shift the read command bits out. */ 798 for (i = 15; i >= 0; i--) { 799 int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; 800 801 writel(dataval, mdio_addr); 802 mdio_delay(mdio_addr); 803 writel(dataval | MDIO_ShiftClk, mdio_addr); 804 mdio_delay(mdio_addr); 805 } 806 /* Read the two transition, 16 data, and wire-idle bits. */ 807 for (i = 20; i > 0; i--) { 808 writel(MDIO_EnbIn, mdio_addr); 809 mdio_delay(mdio_addr); 810 retval = (retval << 1) | ((readl(mdio_addr) & MDIO_DataIn) ? 1 : 0); 811 writel(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr); 812 mdio_delay(mdio_addr); 813 } 814 return (retval>>1) & 0xffff; 815} 816 817static void mdio_write(int base_address, int phy_id, int location, int value) 818{ 819 long mdio_addr = base_address + MIICtrl; 820 int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (location<<18) | value; 821 int i; 822 823 if (location == 4 && phy_id == w840private.phys[0]) 824 w840private.advertising = value; 825 826 if (mii_preamble_required) 827 mdio_sync(mdio_addr); 828 829 /* Shift the command bits out. */ 830 for (i = 31; i >= 0; i--) { 831 int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; 832 833 writel(dataval, mdio_addr); 834 mdio_delay(mdio_addr); 835 writel(dataval | MDIO_ShiftClk, mdio_addr); 836 mdio_delay(mdio_addr); 837 } 838 /* Clear out extra bits. */ 839 for (i = 2; i > 0; i--) { 840 writel(MDIO_EnbIn, mdio_addr); 841 mdio_delay(mdio_addr); 842 writel(MDIO_EnbIn | MDIO_ShiftClk, mdio_addr); 843 mdio_delay(mdio_addr); 844 } 845 return; 846} 847 848static void check_duplex(void) 849{ 850 int mii_reg5 = mdio_read(ioaddr, w840private.phys[0], 5); 851 int negotiated = mii_reg5 & w840private.advertising; 852 int duplex; 853 854 if (w840private.duplex_lock || mii_reg5 == 0xffff) 855 return; 856 857 duplex = (negotiated & 0x0100) || (negotiated & 0x01C0) == 0x0040; 858 if (w840private.full_duplex != duplex) { 859 w840private.full_duplex = duplex; 860 861#if defined(W89C840_DEBUG) 862 printf("winbond-840 : Setting %s-duplex based on MII # %d negotiated capability %X\n", 863 duplex ? "full" : "half", w840private.phys[0], negotiated); 864#endif 865 866 w840private.csr6 &= ~0x200; 867 w840private.csr6 |= duplex ? 0x200 : 0; 868 } 869} 870 871static void set_rx_mode(void) 872{ 873 u32 mc_filter[2]; /* Multicast hash filter */ 874 u32 rx_mode; 875 876 /* Accept all multicasts from now on. */ 877 memset(mc_filter, 0xff, sizeof(mc_filter)); 878 879/* 880 * Actually, should work OK with multicast enabled. -- iko 881 */ 882/* 883 * rx_mode = AcceptBroadcast | AcceptMyPhys | AcceptMulticast; 884 */ 885 rx_mode = AcceptBroadcast | AcceptMyPhys; 886 887 writel(mc_filter[0], ioaddr + MulticastFilter0); 888 writel(mc_filter[1], ioaddr + MulticastFilter1); 889 w840private.csr6 &= ~0x00F8; 890 w840private.csr6 |= rx_mode; 891 writel(w840private.csr6, ioaddr + NetworkConfig); 892 893#if defined(W89C840_DEBUG) 894 printf("winbond-840 : Done setting RX mode.\n"); 895#endif 896} 897 898/* Initialize the Rx and Tx rings, along with various 'dev' bits. */ 899static void init_ring(void) 900{ 901 int i; 902 char * p; 903 904 w840private.tx_full = 0; 905 w840private.tx_q_bytes = w840private.cur_rx = w840private.cur_tx = 0; 906 w840private.dirty_rx = w840private.dirty_tx = 0; 907 908 w840private.rx_buf_sz = PKT_BUF_SZ; 909 w840private.rx_head_desc = &w840private.rx_ring[0]; 910 911 /* Initial all Rx descriptors. Fill in the Rx buffers. */ 912 913 p = &rx_packet[0]; 914 915 for (i = 0; i < RX_RING_SIZE; i++) { 916 w840private.rx_ring[i].length = w840private.rx_buf_sz; 917 w840private.rx_ring[i].status = 0; 918 w840private.rx_ring[i].next_desc = virt_to_le32desc(&w840private.rx_ring[i+1]); 919 920 w840private.rx_ring[i].buffer1 = virt_to_le32desc(p + (PKT_BUF_SZ * i)); 921 w840private.rx_ring[i].status = DescOwn | DescIntr; 922 } 923 924 /* Mark the last entry as wrapping the ring. */ 925 w840private.rx_ring[i-1].length |= DescEndRing; 926 w840private.rx_ring[i-1].next_desc = virt_to_le32desc(&w840private.rx_ring[0]); 927 928 w840private.dirty_rx = (unsigned int)(i - RX_RING_SIZE); 929 930 for (i = 0; i < TX_RING_SIZE; i++) { 931 w840private.tx_ring[i].status = 0; 932 } 933 return; 934} 935