use the override options if specified
[AROS.git] / arch / all-pc / boot / grub / netboot / via-rhine.c
blob070edb84056603058f9f979d6f162d5aad7e4e76
1 /* rhine.c:Fast Ethernet driver for Linux. */
2 /*
3 Adapted 09-jan-2000 by Paolo Marini (paolom@prisma-eng.it)
5 originally written by Donald Becker.
7 This software may be used and distributed according to the terms
8 of the GNU Public License (GPL), incorporated herein by reference.
9 Drivers derived from this code also fall under the GPL and must retain
10 this authorship and copyright notice.
12 Under no circumstances are the authors responsible for
13 the proper functioning of this software, nor do the authors assume any
14 responsibility for damages incurred with its use.
16 This driver is designed for the VIA VT86C100A Rhine-II PCI Fast Ethernet
17 controller.
21 static const char *version = "rhine.c v1.0.0 2000-01-07\n";
23 /* A few user-configurable values. */
25 /* Size of the in-memory receive ring. */
26 #define RX_BUF_LEN_IDX 3 /* 0==8K, 1==16K, 2==32K, 3==64K */
27 #define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX)
29 /* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */
30 #define TX_BUF_SIZE 1536
31 #define RX_BUF_SIZE 1536
33 /* PCI Tuning Parameters
34 Threshold is bytes transferred to chip before transmission starts. */
35 #define TX_FIFO_THRESH 256 /* In bytes, rounded down to 32 byte units. */
37 /* The following settings are log_2(bytes)-4: 0 == 16 bytes .. 6==1024. */
38 #define RX_FIFO_THRESH 4 /* Rx buffer level before first PCI xfer. */
39 #define RX_DMA_BURST 4 /* Maximum PCI burst, '4' is 256 bytes */
40 #define TX_DMA_BURST 4
42 /* Operational parameters that usually are not changed. */
43 /* Time in jiffies before concluding the transmitter is hung. */
44 #define TX_TIMEOUT ((2000*HZ)/1000)
46 #include "etherboot.h"
47 #include "nic.h"
48 #include "pci.h"
49 #include "cards.h"
51 /* define all ioaddr */
53 #define byPAR0 ioaddr
54 #define byRCR ioaddr + 6
55 #define byTCR ioaddr + 7
56 #define byCR0 ioaddr + 8
57 #define byCR1 ioaddr + 9
58 #define byISR0 ioaddr + 0x0c
59 #define byISR1 ioaddr + 0x0d
60 #define byIMR0 ioaddr + 0x0e
61 #define byIMR1 ioaddr + 0x0f
62 #define byMAR0 ioaddr + 0x10
63 #define byMAR1 ioaddr + 0x11
64 #define byMAR2 ioaddr + 0x12
65 #define byMAR3 ioaddr + 0x13
66 #define byMAR4 ioaddr + 0x14
67 #define byMAR5 ioaddr + 0x15
68 #define byMAR6 ioaddr + 0x16
69 #define byMAR7 ioaddr + 0x17
70 #define dwCurrentRxDescAddr ioaddr + 0x18
71 #define dwCurrentTxDescAddr ioaddr + 0x1c
72 #define dwCurrentRDSE0 ioaddr + 0x20
73 #define dwCurrentRDSE1 ioaddr + 0x24
74 #define dwCurrentRDSE2 ioaddr + 0x28
75 #define dwCurrentRDSE3 ioaddr + 0x2c
76 #define dwNextRDSE0 ioaddr + 0x30
77 #define dwNextRDSE1 ioaddr + 0x34
78 #define dwNextRDSE2 ioaddr + 0x38
79 #define dwNextRDSE3 ioaddr + 0x3c
80 #define dwCurrentTDSE0 ioaddr + 0x40
81 #define dwCurrentTDSE1 ioaddr + 0x44
82 #define dwCurrentTDSE2 ioaddr + 0x48
83 #define dwCurrentTDSE3 ioaddr + 0x4c
84 #define dwNextTDSE0 ioaddr + 0x50
85 #define dwNextTDSE1 ioaddr + 0x54
86 #define dwNextTDSE2 ioaddr + 0x58
87 #define dwNextTDSE3 ioaddr + 0x5c
88 #define dwCurrRxDMAPtr ioaddr + 0x60
89 #define dwCurrTxDMAPtr ioaddr + 0x64
90 #define byMPHY ioaddr + 0x6c
91 #define byMIISR ioaddr + 0x6d
92 #define byBCR0 ioaddr + 0x6e
93 #define byBCR1 ioaddr + 0x6f
94 #define byMIICR ioaddr + 0x70
95 #define byMIIAD ioaddr + 0x71
96 #define wMIIDATA ioaddr + 0x72
97 #define byEECSR ioaddr + 0x74
98 #define byTEST ioaddr + 0x75
99 #define byGPIO ioaddr + 0x76
100 #define byCFGA ioaddr + 0x78
101 #define byCFGB ioaddr + 0x79
102 #define byCFGC ioaddr + 0x7a
103 #define byCFGD ioaddr + 0x7b
104 #define wTallyCntMPA ioaddr + 0x7c
105 #define wTallyCntCRC ioaddr + 0x7d
106 /*--------------------- Exioaddr Definitions -------------------------*/
109 * Bits in the RCR register
112 #define RCR_RRFT2 0x80
113 #define RCR_RRFT1 0x40
114 #define RCR_RRFT0 0x20
115 #define RCR_PROM 0x10
116 #define RCR_AB 0x08
117 #define RCR_AM 0x04
118 #define RCR_AR 0x02
119 #define RCR_SEP 0x01
122 * Bits in the TCR register
125 #define TCR_RTSF 0x80
126 #define TCR_RTFT1 0x40
127 #define TCR_RTFT0 0x20
128 #define TCR_OFSET 0x08
129 #define TCR_LB1 0x04 /* loopback[1] */
130 #define TCR_LB0 0x02 /* loopback[0] */
133 * Bits in the CR0 register
136 #define CR0_RDMD 0x40 /* rx descriptor polling demand */
137 #define CR0_TDMD 0x20 /* tx descriptor polling demand */
138 #define CR0_TXON 0x10
139 #define CR0_RXON 0x08
140 #define CR0_STOP 0x04 /* stop NIC, default = 1 */
141 #define CR0_STRT 0x02 /* start NIC */
142 #define CR0_INIT 0x01 /* start init process */
146 * Bits in the CR1 register
149 #define CR1_SFRST 0x80 /* software reset */
150 #define CR1_RDMD1 0x40 /* RDMD1 */
151 #define CR1_TDMD1 0x20 /* TDMD1 */
152 #define CR1_KEYPAG 0x10 /* turn on par/key */
153 #define CR1_DPOLL 0x08 /* disable rx/tx auto polling */
154 #define CR1_FDX 0x04 /* full duplex mode */
155 #define CR1_ETEN 0x02 /* early tx mode */
156 #define CR1_EREN 0x01 /* early rx mode */
159 * Bits in the CR register
162 #define CR_RDMD 0x0040 /* rx descriptor polling demand */
163 #define CR_TDMD 0x0020 /* tx descriptor polling demand */
164 #define CR_TXON 0x0010
165 #define CR_RXON 0x0008
166 #define CR_STOP 0x0004 /* stop NIC, default = 1 */
167 #define CR_STRT 0x0002 /* start NIC */
168 #define CR_INIT 0x0001 /* start init process */
169 #define CR_SFRST 0x8000 /* software reset */
170 #define CR_RDMD1 0x4000 /* RDMD1 */
171 #define CR_TDMD1 0x2000 /* TDMD1 */
172 #define CR_KEYPAG 0x1000 /* turn on par/key */
173 #define CR_DPOLL 0x0800 /* disable rx/tx auto polling */
174 #define CR_FDX 0x0400 /* full duplex mode */
175 #define CR_ETEN 0x0200 /* early tx mode */
176 #define CR_EREN 0x0100 /* early rx mode */
179 * Bits in the IMR0 register
182 #define IMR0_CNTM 0x80
183 #define IMR0_BEM 0x40
184 #define IMR0_RUM 0x20
185 #define IMR0_TUM 0x10
186 #define IMR0_TXEM 0x08
187 #define IMR0_RXEM 0x04
188 #define IMR0_PTXM 0x02
189 #define IMR0_PRXM 0x01
191 /* define imrshadow */
193 #define IMRShadow 0x5AFF
196 * Bits in the IMR1 register
199 #define IMR1_INITM 0x80
200 #define IMR1_SRCM 0x40
201 #define IMR1_NBFM 0x10
202 #define IMR1_PRAIM 0x08
203 #define IMR1_RES0M 0x04
204 #define IMR1_ETM 0x02
205 #define IMR1_ERM 0x01
208 * Bits in the ISR register
211 #define ISR_INITI 0x8000
212 #define ISR_SRCI 0x4000
213 #define ISR_ABTI 0x2000
214 #define ISR_NORBF 0x1000
215 #define ISR_PKTRA 0x0800
216 #define ISR_RES0 0x0400
217 #define ISR_ETI 0x0200
218 #define ISR_ERI 0x0100
219 #define ISR_CNT 0x0080
220 #define ISR_BE 0x0040
221 #define ISR_RU 0x0020
222 #define ISR_TU 0x0010
223 #define ISR_TXE 0x0008
224 #define ISR_RXE 0x0004
225 #define ISR_PTX 0x0002
226 #define ISR_PRX 0x0001
229 * Bits in the ISR0 register
232 #define ISR0_CNT 0x80
233 #define ISR0_BE 0x40
234 #define ISR0_RU 0x20
235 #define ISR0_TU 0x10
236 #define ISR0_TXE 0x08
237 #define ISR0_RXE 0x04
238 #define ISR0_PTX 0x02
239 #define ISR0_PRX 0x01
242 * Bits in the ISR1 register
245 #define ISR1_INITI 0x80
246 #define ISR1_SRCI 0x40
247 #define ISR1_NORBF 0x10
248 #define ISR1_PKTRA 0x08
249 #define ISR1_ETI 0x02
250 #define ISR1_ERI 0x01
252 /* ISR ABNORMAL CONDITION */
254 #define ISR_ABNORMAL ISR_BE+ISR_RU+ISR_TU+ISR_CNT+ISR_NORBF+ISR_PKTRA
257 * Bits in the MIISR register
260 #define MIISR_MIIERR 0x08
261 #define MIISR_MRERR 0x04
262 #define MIISR_LNKFL 0x02
263 #define MIISR_SPEED 0x01
266 * Bits in the MIICR register
269 #define MIICR_MAUTO 0x80
270 #define MIICR_RCMD 0x40
271 #define MIICR_WCMD 0x20
272 #define MIICR_MDPM 0x10
273 #define MIICR_MOUT 0x08
274 #define MIICR_MDO 0x04
275 #define MIICR_MDI 0x02
276 #define MIICR_MDC 0x01
279 * Bits in the EECSR register
282 #define EECSR_EEPR 0x80 /* eeprom programed status, 73h means programed */
283 #define EECSR_EMBP 0x40 /* eeprom embeded programming */
284 #define EECSR_AUTOLD 0x20 /* eeprom content reload */
285 #define EECSR_DPM 0x10 /* eeprom direct programming */
286 #define EECSR_CS 0x08 /* eeprom CS pin */
287 #define EECSR_SK 0x04 /* eeprom SK pin */
288 #define EECSR_DI 0x02 /* eeprom DI pin */
289 #define EECSR_DO 0x01 /* eeprom DO pin */
292 * Bits in the BCR0 register
295 #define BCR0_CRFT2 0x20
296 #define BCR0_CRFT1 0x10
297 #define BCR0_CRFT0 0x08
298 #define BCR0_DMAL2 0x04
299 #define BCR0_DMAL1 0x02
300 #define BCR0_DMAL0 0x01
303 * Bits in the BCR1 register
306 #define BCR1_CTSF 0x20
307 #define BCR1_CTFT1 0x10
308 #define BCR1_CTFT0 0x08
309 #define BCR1_POT2 0x04
310 #define BCR1_POT1 0x02
311 #define BCR1_POT0 0x01
314 * Bits in the CFGA register
317 #define CFGA_EELOAD 0x80 /* enable eeprom embeded and direct programming */
318 #define CFGA_JUMPER 0x40
319 #define CFGA_MTGPIO 0x08
320 #define CFGA_T10EN 0x02
321 #define CFGA_AUTO 0x01
324 * Bits in the CFGB register
327 #define CFGB_PD 0x80
328 #define CFGB_POLEN 0x02
329 #define CFGB_LNKEN 0x01
332 * Bits in the CFGC register
335 #define CFGC_M10TIO 0x80
336 #define CFGC_M10POL 0x40
337 #define CFGC_PHY1 0x20
338 #define CFGC_PHY0 0x10
339 #define CFGC_BTSEL 0x08
340 #define CFGC_BPS2 0x04 /* bootrom select[2] */
341 #define CFGC_BPS1 0x02 /* bootrom select[1] */
342 #define CFGC_BPS0 0x01 /* bootrom select[0] */
345 * Bits in the CFGD register
348 #define CFGD_GPIOEN 0x80
349 #define CFGD_DIAG 0x40
350 #define CFGD_MAGIC 0x10
351 #define CFGD_CFDX 0x04
352 #define CFGD_CEREN 0x02
353 #define CFGD_CETEN 0x01
355 /* Bits in RSR */
356 #define RSR_RERR 0x00000001
357 #define RSR_CRC 0x00000002
358 #define RSR_FAE 0x00000004
359 #define RSR_FOV 0x00000008
360 #define RSR_LONG 0x00000010
361 #define RSR_RUNT 0x00000020
362 #define RSR_SERR 0x00000040
363 #define RSR_BUFF 0x00000080
364 #define RSR_EDP 0x00000100
365 #define RSR_STP 0x00000200
366 #define RSR_CHN 0x00000400
367 #define RSR_PHY 0x00000800
368 #define RSR_BAR 0x00001000
369 #define RSR_MAR 0x00002000
370 #define RSR_RXOK 0x00008000
371 #define RSR_ABNORMAL RSR_RERR+RSR_LONG+RSR_RUNT
373 /* Bits in TSR */
374 #define TSR_NCR0 0x00000001
375 #define TSR_NCR1 0x00000002
376 #define TSR_NCR2 0x00000004
377 #define TSR_NCR3 0x00000008
378 #define TSR_COLS 0x00000010
379 #define TSR_CDH 0x00000080
380 #define TSR_ABT 0x00000100
381 #define TSR_OWC 0x00000200
382 #define TSR_CRS 0x00000400
383 #define TSR_UDF 0x00000800
384 #define TSR_TBUFF 0x00001000
385 #define TSR_SERR 0x00002000
386 #define TSR_JAB 0x00004000
387 #define TSR_TERR 0x00008000
388 #define TSR_ABNORMAL TSR_TERR+TSR_OWC+TSR_ABT+TSR_JAB+TSR_CRS
389 #define TSR_OWN_BIT 0x80000000
391 #define CB_DELAY_LOOP_WAIT 10 /* 10ms */
392 /* enabled mask value of irq */
394 #define W_IMR_MASK_VALUE 0x1BFF /* initial value of IMR */
396 /* Ethernet address filter type */
397 #define PKT_TYPE_DIRECTED 0x0001 /* obsolete, directed address is always accepted */
398 #define PKT_TYPE_MULTICAST 0x0002
399 #define PKT_TYPE_ALL_MULTICAST 0x0004
400 #define PKT_TYPE_BROADCAST 0x0008
401 #define PKT_TYPE_PROMISCUOUS 0x0020
402 #define PKT_TYPE_LONG 0x2000
403 #define PKT_TYPE_RUNT 0x4000
404 #define PKT_TYPE_ERROR 0x8000 /* accept error packets, e.g. CRC error */
406 /* Loopback mode */
408 #define NIC_LB_NONE 0x00
409 #define NIC_LB_INTERNAL 0x01
410 #define NIC_LB_PHY 0x02 /* MII or Internal-10BaseT loopback */
412 #define TX_RING_SIZE 2
413 #define RX_RING_SIZE 2
414 #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */
416 /* Transmit and receive descriptors definition */
418 struct rhine_tx_desc
420 union VTC_tx_status_tag
422 struct
424 unsigned long ncro:1;
425 unsigned long ncr1:1;
426 unsigned long ncr2:1;
427 unsigned long ncr3:1;
428 unsigned long cols:1;
429 unsigned long reserve_1:2;
430 unsigned long cdh:1;
431 unsigned long abt:1;
432 unsigned long owc:1;
433 unsigned long crs:1;
434 unsigned long udf:1;
435 unsigned long tbuff:1;
436 unsigned long serr:1;
437 unsigned long jab:1;
438 unsigned long terr:1;
439 unsigned long reserve_2:15;
440 unsigned long own_bit:1;
442 bits;
443 unsigned long lw;
445 tx_status;
447 union VTC_tx_ctrl_tag
449 struct
451 unsigned long tx_buf_size:11;
452 unsigned long extend_tx_buf_size:4;
453 unsigned long chn:1;
454 unsigned long crc:1;
455 unsigned long reserve_1:4;
456 unsigned long stp:1;
457 unsigned long edp:1;
458 unsigned long ic:1;
459 unsigned long reserve_2:8;
461 bits;
462 unsigned long lw;
464 tx_ctrl;
466 unsigned long buf_addr_1:32;
467 unsigned long buf_addr_2:32;
471 struct rhine_rx_desc
473 union VTC_rx_status_tag
475 struct
477 unsigned long rerr:1;
478 unsigned long crc_error:1;
479 unsigned long fae:1;
480 unsigned long fov:1;
481 unsigned long toolong:1;
482 unsigned long runt:1;
483 unsigned long serr:1;
484 unsigned long buff:1;
485 unsigned long edp:1;
486 unsigned long stp:1;
487 unsigned long chn:1;
488 unsigned long phy:1;
489 unsigned long bar:1;
490 unsigned long mar:1;
491 unsigned long reserve_1:1;
492 unsigned long rxok:1;
493 unsigned long frame_length:11;
494 unsigned long reverve_2:4;
495 unsigned long own_bit:1;
497 bits;
498 unsigned long lw;
500 rx_status;
502 union VTC_rx_ctrl_tag
504 struct
506 unsigned long rx_buf_size:11;
507 unsigned long extend_rx_buf_size:4;
508 unsigned long reserved_1:17;
510 bits;
511 unsigned long lw;
513 rx_ctrl;
515 unsigned long buf_addr_1:32;
516 unsigned long buf_addr_2:32;
521 /* The I/O extent. */
522 #define rhine_TOTAL_SIZE 0x80
524 #ifdef HAVE_DEVLIST
525 struct netdev_entry rhine_drv =
526 { "rhine", rhine_probe, rhine_TOTAL_SIZE, NULL };
527 #endif
529 static int rhine_debug = 1;
532 Theory of Operation
534 I. Board Compatibility
536 This driver is designed for the VIA 86c100A Rhine-II PCI Fast Ethernet
537 controller.
539 II. Board-specific settings
541 Boards with this chip are functional only in a bus-master PCI slot.
543 Many operational settings are loaded from the EEPROM to the Config word at
544 offset 0x78. This driver assumes that they are correct.
545 If this driver is compiled to use PCI memory space operations the EEPROM
546 must be configured to enable memory ops.
548 III. Driver operation
550 IIIa. Ring buffers
552 This driver uses two statically allocated fixed-size descriptor lists
553 formed into rings by a branch from the final descriptor to the beginning of
554 the list. The ring sizes are set at compile time by RX/TX_RING_SIZE.
556 IIIb/c. Transmit/Receive Structure
558 This driver attempts to use a zero-copy receive and transmit scheme.
560 Alas, all data buffers are required to start on a 32 bit boundary, so
561 the driver must often copy transmit packets into bounce buffers.
563 The driver allocates full frame size skbuffs for the Rx ring buffers at
564 open() time and passes the skb->data field to the chip as receive data
565 buffers. When an incoming frame is less than RX_COPYBREAK bytes long,
566 a fresh skbuff is allocated and the frame is copied to the new skbuff.
567 When the incoming frame is larger, the skbuff is passed directly up the
568 protocol stack. Buffers consumed this way are replaced by newly allocated
569 skbuffs in the last phase of netdev_rx().
571 The RX_COPYBREAK value is chosen to trade-off the memory wasted by
572 using a full-sized skbuff for small frames vs. the copying costs of larger
573 frames. New boards are typically used in generously configured machines
574 and the underfilled buffers have negligible impact compared to the benefit of
575 a single allocation size, so the default value of zero results in never
576 copying packets. When copying is done, the cost is usually mitigated by using
577 a combined copy/checksum routine. Copying also preloads the cache, which is
578 most useful with small frames.
580 Since the VIA chips are only able to transfer data to buffers on 32 bit
581 boundaries, the the IP header at offset 14 in an ethernet frame isn't
582 longword aligned for further processing. Copying these unaligned buffers
583 has the beneficial effect of 16-byte aligning the IP header.
585 IIId. Synchronization
587 The driver runs as two independent, single-threaded flows of control. One
588 is the send-packet routine, which enforces single-threaded use by the
589 dev->tbusy flag. The other thread is the interrupt handler, which is single
590 threaded by the hardware and interrupt handling software.
592 The send packet thread has partial control over the Tx ring and 'dev->tbusy'
593 flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next
594 queue slot is empty, it clears the tbusy flag when finished otherwise it sets
595 the 'lp->tx_full' flag.
597 The interrupt handler has exclusive control over the Rx ring and records stats
598 from the Tx ring. After reaping the stats, it marks the Tx queue entry as
599 empty by incrementing the dirty_tx mark. Iff the 'lp->tx_full' flag is set, it
600 clears both the tx_full and tbusy flags.
602 IV. Notes
604 IVb. References
606 Preliminary VT86C100A manual from http://www.via.com.tw/
607 http://cesdis.gsfc.nasa.gov/linux/misc/100mbps.html
608 http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html
610 IVc. Errata
612 The VT86C100A manual is not reliable information.
613 The chip does not handle unaligned transmit or receive buffers, resulting
614 in significant performance degradation for bounce buffer copies on transmit
615 and unaligned IP headers on receive.
616 The chip does not pad to minimum transmit length.
620 #define PCI_VENDOR_ID_FET 0x1106
621 #define PCI_DEVICE_ID_FET_3043 0x3043
623 /* The rest of these values should never change. */
624 #define NUM_TX_DESC 2 /* Number of Tx descriptor registers. */
626 static struct rhine_private
628 char devname[8]; /* Used only for kernel debugging. */
629 const char *product_name;
630 struct rhine_rx_desc *rx_ring;
631 struct rhine_tx_desc *tx_ring;
632 char *rx_buffs[RX_RING_SIZE];
633 char *tx_buffs[TX_RING_SIZE];
635 /* temporary Rx buffers. */
637 int chip_id;
638 int chip_revision;
639 unsigned short ioaddr;
640 unsigned int cur_rx, cur_tx; /* The next free and used entries */
641 unsigned int dirty_rx, dirty_tx;
642 /* The saved address of a sent-in-place packet/buffer, for skfree(). */
643 struct sk_buff *tx_skbuff[TX_RING_SIZE];
644 unsigned char mc_filter[8]; /* Current multicast filter. */
645 char phys[4]; /* MII device addresses. */
646 unsigned int tx_full:1; /* The Tx queue is full. */
647 unsigned int full_duplex:1; /* Full-duplex operation requested. */
648 unsigned int default_port:4; /* Last dev->if_port value. */
649 unsigned int media2:4; /* Secondary monitored media port. */
650 unsigned int medialock:1; /* Don't sense media type. */
651 unsigned int mediasense:1; /* Media sensing in progress. */
653 rhine;
655 static struct nic *rhine_probe1 (struct nic *dev, int ioaddr,
656 int chip_id, int options);
657 static int QueryAuto (int);
658 static int ReadMII (int byMIIIndex, int);
659 static void WriteMII (char, char, char, int);
660 static void MIIDelay (void);
661 static void rhine_init_ring (struct nic *dev);
662 static void rhine_disable (struct nic *nic);
663 static void rhine_reset (struct nic *nic);
664 static int rhine_poll (struct nic *nic);
665 static void rhine_transmit (struct nic *nic, const char *d, unsigned int t,
666 unsigned int s, const char *p);
668 /* Linux support functions */
669 #define virt_to_bus(x) ((unsigned long)x)
670 #define bus_to_virt(x) ((void *)x)
672 /* Initialize the Rx and Tx rings, along with various 'dev' bits. */
673 static void
674 rhine_init_ring (struct nic *nic)
676 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
677 int i;
679 tp->tx_full = 0;
680 tp->cur_rx = tp->cur_tx = 0;
681 tp->dirty_rx = tp->dirty_tx = 0;
683 for (i = 0; i < RX_RING_SIZE; i++)
686 tp->rx_ring[i].rx_status.bits.own_bit = 1;
687 tp->rx_ring[i].rx_ctrl.bits.rx_buf_size = 1536;
689 tp->rx_ring[i].buf_addr_1 = virt_to_bus (tp->rx_buffs[i]);
690 tp->rx_ring[i].buf_addr_2 = virt_to_bus (&tp->rx_ring[i + 1]);
691 /* printf("[%d]buf1=%hX,buf2=%hX",i,tp->rx_ring[i].buf_addr_1,tp->rx_ring[i].buf_addr_2); */
693 /* Mark the last entry as wrapping the ring. */
694 /* tp->rx_ring[i-1].rx_ctrl.bits.rx_buf_size =1518; */
695 tp->rx_ring[i - 1].buf_addr_2 = virt_to_bus (&tp->rx_ring[0]);
696 /*printf("[%d]buf1=%hX,buf2=%hX",i-1,tp->rx_ring[i-1].buf_addr_1,tp->rx_ring[i-1].buf_addr_2); */
698 /* The Tx buffer descriptor is filled in as needed, but we
699 do need to clear the ownership bit. */
701 for (i = 0; i < TX_RING_SIZE; i++)
704 tp->tx_ring[i].tx_status.lw = 0;
705 tp->tx_ring[i].tx_ctrl.lw = 0x00e08000;
706 tp->tx_ring[i].buf_addr_1 = virt_to_bus (tp->tx_buffs[i]);
707 tp->tx_ring[i].buf_addr_2 = virt_to_bus (&tp->tx_ring[i + 1]);
708 /* printf("[%d]buf1=%hX,buf2=%hX",i,tp->tx_ring[i].buf_addr_1,tp->tx_ring[i].buf_addr_2); */
711 tp->tx_ring[i - 1].buf_addr_2 = virt_to_bus (&tp->tx_ring[0]);
712 /* printf("[%d]buf1=%hX,buf2=%hX",i,tp->tx_ring[i-1].buf_addr_1,tp->tx_ring[i-1].buf_addr_2); */
716 QueryAuto (int ioaddr)
718 int byMIIIndex;
719 int MIIReturn;
721 int advertising,mii_reg5;
722 int negociated;
724 byMIIIndex = 0x04;
725 MIIReturn = ReadMII (byMIIIndex, ioaddr);
726 advertising=MIIReturn;
728 byMIIIndex = 0x05;
729 MIIReturn = ReadMII (byMIIIndex, ioaddr);
730 mii_reg5=MIIReturn;
732 negociated=mii_reg5 & advertising;
734 if ( (negociated & 0x100) || (negociated & 0x1C0) == 0x40 )
735 return 1;
736 else
737 return 0;
742 ReadMII (int byMIIIndex, int ioaddr)
744 int ReturnMII;
745 char byMIIAdrbak;
746 char byMIICRbak;
747 char byMIItemp;
749 byMIIAdrbak = inb (byMIIAD);
750 byMIICRbak = inb (byMIICR);
751 outb (byMIICRbak & 0x7f, byMIICR);
752 MIIDelay ();
754 outb (byMIIIndex, byMIIAD);
755 MIIDelay ();
757 outb (inb (byMIICR) | 0x40, byMIICR);
759 byMIItemp = inb (byMIICR);
760 byMIItemp = byMIItemp & 0x40;
762 while (byMIItemp != 0)
764 byMIItemp = inb (byMIICR);
765 byMIItemp = byMIItemp & 0x40;
767 MIIDelay ();
769 ReturnMII = inw (wMIIDATA);
771 outb (byMIIAdrbak, byMIIAD);
772 outb (byMIICRbak, byMIICR);
773 MIIDelay ();
775 return (ReturnMII);
779 void
780 WriteMII (char byMIISetByte, char byMIISetBit, char byMIIOP, int ioaddr)
782 int ReadMIItmp;
783 int MIIMask;
784 char byMIIAdrbak;
785 char byMIICRbak;
786 char byMIItemp;
789 byMIIAdrbak = inb (byMIIAD);
791 byMIICRbak = inb (byMIICR);
792 outb (byMIICRbak & 0x7f, byMIICR);
793 MIIDelay ();
794 outb (byMIISetByte, byMIIAD);
795 MIIDelay ();
797 outb (inb (byMIICR) | 0x40, byMIICR);
799 byMIItemp = inb (byMIICR);
800 byMIItemp = byMIItemp & 0x40;
802 while (byMIItemp != 0)
804 byMIItemp = inb (byMIICR);
805 byMIItemp = byMIItemp & 0x40;
807 MIIDelay ();
809 ReadMIItmp = inw (wMIIDATA);
810 MIIMask = 0x0001;
811 MIIMask = MIIMask << byMIISetBit;
814 if (byMIIOP == 0)
816 MIIMask = ~MIIMask;
817 ReadMIItmp = ReadMIItmp & MIIMask;
819 else
821 ReadMIItmp = ReadMIItmp | MIIMask;
824 outw (ReadMIItmp, wMIIDATA);
825 MIIDelay ();
827 outb (inb (byMIICR) | 0x20, byMIICR);
828 byMIItemp = inb (byMIICR);
829 byMIItemp = byMIItemp & 0x20;
831 while (byMIItemp != 0)
833 byMIItemp = inb (byMIICR);
834 byMIItemp = byMIItemp & 0x20;
836 MIIDelay ();
838 outb (byMIIAdrbak & 0x7f, byMIIAD);
839 outb (byMIICRbak, byMIICR);
840 MIIDelay ();
844 void
845 MIIDelay (void)
847 int i;
848 for (i = 0; i < 0x7fff; i++)
850 inb (0x61);
851 inb (0x61);
852 inb (0x61);
853 inb (0x61);
857 struct nic *
858 rhine_probe (struct nic *nic, unsigned short *probeaddrs,
859 struct pci_device *pci)
861 if (!pci->ioaddr)
862 return NULL;
863 nic = rhine_probe1 (nic, pci->ioaddr, 0, -1);
865 if (nic)
866 adjust_pci_device(pci);
867 nic->poll = rhine_poll;
868 nic->transmit = rhine_transmit;
869 nic->reset = rhine_reset;
870 nic->disable = rhine_disable;
871 rhine_reset (nic);
873 return nic;
876 static struct nic *
877 rhine_probe1 (struct nic *nic, int ioaddr, int chip_id, int options)
879 struct rhine_private *tp;
880 static int did_version = 0; /* Already printed version info. */
881 int i;
882 unsigned int timeout;
883 int FDXFlag;
884 int byMIIvalue, LineSpeed, MIICRbak;
886 if (rhine_debug > 0 && did_version++ == 0)
887 printf (version);
888 /* Perhaps this should be read from the EEPROM? */
889 for (i = 0; i < ETH_ALEN; i++)
890 nic->node_addr[i] = inb (byPAR0 + i);
891 printf ("IO address %hX Ethernet Address: %!\n", ioaddr, nic->node_addr);
893 /* restart MII auto-negotiation */
894 WriteMII (0, 9, 1, ioaddr);
895 printf ("Analyzing Media type,this will take several seconds........");
896 for (i = 0; i < 5; i++)
898 /* need to wait 1 millisecond - we will round it up to 50-100ms */
899 timeout = currticks() + 2;
900 for (timeout = currticks() + 2; currticks() < timeout;)
901 /* nothing */;
902 if (ReadMII (1, ioaddr) & 0x0020)
903 break;
905 printf ("OK\n");
907 #if 0
908 /* JJM : for Debug */
909 printf("MII : Address %hhX ",inb(ioaddr+0x6c));
911 unsigned char st1,st2,adv1,adv2,l1,l2;
913 st1=ReadMII(1,ioaddr)>>8;
914 st2=ReadMII(1,ioaddr)&0xFF;
915 adv1=ReadMII(4,ioaddr)>>8;
916 adv2=ReadMII(4,ioaddr)&0xFF;
917 l1=ReadMII(5,ioaddr)>>8;
918 l2=ReadMII(5,ioaddr)&0xFF;
919 printf(" status 0x%hhX%hhX, advertising 0x%hhX%hhX, link 0x%hhX%hhX\n", st1,st2,adv1,adv2,l1,l2);
921 #endif
923 /* query MII to know LineSpeed,duplex mode */
924 byMIIvalue = inb (ioaddr + 0x6d);
925 LineSpeed = byMIIvalue & MIISR_SPEED;
926 if (LineSpeed != 0) //JJM
928 printf ("Linespeed=10Mbs");
930 else
932 printf ("Linespeed=100Mbs");
935 FDXFlag = QueryAuto (ioaddr);
936 if (FDXFlag == 1)
938 printf (" Fullduplex\n");
939 outw (CR_FDX, byCR0);
941 else
943 printf (" Halfduplex\n");
947 /* set MII 10 FULL ON */
948 WriteMII (17, 1, 1, ioaddr);
950 /* turn on MII link change */
951 MIICRbak = inb (byMIICR);
952 outb (MIICRbak & 0x7F, byMIICR);
953 MIIDelay ();
954 outb (0x41, byMIIAD);
955 MIIDelay ();
957 /* while((inb(byMIIAD)&0x20)==0) ; */
958 outb (MIICRbak | 0x80, byMIICR);
960 nic->priv_data = &rhine;
961 tp = &rhine;
962 tp->chip_id = chip_id;
963 tp->ioaddr = ioaddr;
964 tp->phys[0] = -1;
966 /* The lower four bits are the media type. */
967 if (options > 0)
969 tp->full_duplex = (options & 16) ? 1 : 0;
970 tp->default_port = options & 15;
971 if (tp->default_port)
972 tp->medialock = 1;
974 return nic;
977 static void
978 rhine_disable (struct nic *nic)
980 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
981 int ioaddr = tp->ioaddr;
983 printf ("rhine disable\n");
984 /* Switch to loopback mode to avoid hardware races. */
985 writeb(0x60 | 0x01, byTCR);
986 /* Stop the chip's Tx and Rx processes. */
987 writew(CR_STOP, byCR0);
990 /**************************************************************************
991 ETH_RESET - Reset adapter
992 ***************************************************************************/
993 static void
994 rhine_reset (struct nic *nic)
996 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
997 int ioaddr = tp->ioaddr;
998 int i, j;
999 int FDXFlag, CRbak;
1000 int rx_ring_tmp, rx_ring_tmp1;
1001 int tx_ring_tmp, tx_ring_tmp1;
1002 int rx_bufs_tmp, rx_bufs_tmp1;
1003 int tx_bufs_tmp, tx_bufs_tmp1;
1005 #ifdef USE_LOWMEM_BUFFER
1006 #define buf1 (0x10000 - (RX_RING_SIZE * PKT_BUF_SZ + 32))
1007 #define buf2 (buf1 - (RX_RING_SIZE * PKT_BUF_SZ + 32))
1008 #define desc1 (buf2 - (TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32))
1009 #define desc2 (desc1 - (TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32))
1010 #else
1011 static char buf1[RX_RING_SIZE * PKT_BUF_SZ + 32];
1012 static char buf2[RX_RING_SIZE * PKT_BUF_SZ + 32];
1013 static char desc1[TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32];
1014 static char desc2[TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32];
1015 #endif
1017 /* printf ("rhine_reset\n"); */
1018 /* Soft reset the chip. */
1019 /*outb(CmdReset, ioaddr + ChipCmd); */
1021 tx_bufs_tmp = (int) buf1;
1022 tx_ring_tmp = (int) desc1;
1023 rx_bufs_tmp = (int) buf2;
1024 rx_ring_tmp = (int) desc2;
1026 /* tune RD TD 32 byte alignment */
1027 rx_ring_tmp1 = (int) virt_to_bus ((char *) rx_ring_tmp);
1028 j = (rx_ring_tmp1 + 32) & (~0x1f);
1029 /* printf ("txring[%d]", j); */
1030 tp->rx_ring = (struct rhine_rx_desc *) bus_to_virt (j);
1032 tx_ring_tmp1 = (int) virt_to_bus ((char *) tx_ring_tmp);
1033 j = (tx_ring_tmp1 + 32) & (~0x1f);
1034 tp->tx_ring = (struct rhine_tx_desc *) bus_to_virt (j);
1035 /* printf ("rxring[%X]", j); */
1038 tx_bufs_tmp1 = (int) virt_to_bus ((char *) tx_bufs_tmp);
1039 j = (int) (tx_bufs_tmp1 + 32) & (~0x1f);
1040 tx_bufs_tmp = (int) bus_to_virt (j);
1041 /* printf ("txb[%X]", j); */
1043 rx_bufs_tmp1 = (int) virt_to_bus ((char *) rx_bufs_tmp);
1044 j = (int) (rx_bufs_tmp1 + 32) & (~0x1f);
1045 rx_bufs_tmp = (int) bus_to_virt (j);
1046 /* printf ("rxb[%X][%X]", rx_bufs_tmp1, j); */
1048 for (i = 0; i < RX_RING_SIZE; i++)
1050 tp->rx_buffs[i] = (char *) rx_bufs_tmp;
1051 /* printf("r[%X]",tp->rx_buffs[i]); */
1052 rx_bufs_tmp += 1536;
1055 for (i = 0; i < TX_RING_SIZE; i++)
1057 tp->tx_buffs[i] = (char *) tx_bufs_tmp;
1058 /* printf("t[%X]",tp->tx_buffs[i]); */
1059 tx_bufs_tmp += 1536;
1062 /* software reset */
1063 outb (CR1_SFRST, byCR1);
1064 MIIDelay ();
1066 /* printf ("init ring"); */
1067 rhine_init_ring (nic);
1068 /*write TD RD Descriptor to MAC */
1069 outl (virt_to_bus (tp->rx_ring), dwCurrentRxDescAddr);
1070 outl (virt_to_bus (tp->tx_ring), dwCurrentTxDescAddr);
1072 /* close IMR */
1073 outw (0x0000, byIMR0);
1075 /* set TCR RCR threshold */
1076 outb (0x06, byBCR0);
1077 outb (0x00, byBCR1);
1078 outb (0x2c, byRCR);
1079 outb (0x60, byTCR);
1080 /* Set Fulldupex */
1081 FDXFlag = QueryAuto (ioaddr);
1082 if (FDXFlag == 1)
1084 outb (CFGD_CFDX, byCFGD);
1085 outw (CR_FDX, byCR0);
1088 /* KICK NIC to WORK */
1089 CRbak = inw (byCR0);
1090 CRbak = CRbak & 0xFFFB; /* not CR_STOP */
1091 outw ((CRbak | CR_STRT | CR_TXON | CR_RXON | CR_DPOLL), byCR0);
1093 /*set IMR to work */
1094 outw (IMRShadow, byIMR0);
1097 static int
1098 rhine_poll (struct nic *nic)
1100 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
1101 int rxstatus, good = 0;;
1103 if (tp->rx_ring[tp->cur_rx].rx_status.bits.own_bit == 0)
1105 rxstatus = tp->rx_ring[tp->cur_rx].rx_status.lw;
1106 if ((rxstatus & 0x0300) != 0x0300)
1108 printf("rhine_poll: bad status\n");
1110 else if (rxstatus & (RSR_ABNORMAL))
1112 printf ("rxerr[%X]\n", rxstatus);
1114 else
1115 good = 1;
1117 if (good)
1119 nic->packetlen = tp->rx_ring[tp->cur_rx].rx_status.bits.frame_length;
1120 memcpy (nic->packet, tp->rx_buffs[tp->cur_rx], nic->packetlen);
1121 /* printf ("Packet RXed\n"); */
1123 tp->rx_ring[tp->cur_rx].rx_status.bits.own_bit = 1;
1124 tp->cur_rx++;
1125 tp->cur_rx = tp->cur_rx % RX_RING_SIZE;
1127 return good;
1130 static void
1131 rhine_transmit (struct nic *nic,
1132 const char *d, unsigned int t, unsigned int s, const char *p)
1134 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
1135 int ioaddr = tp->ioaddr;
1136 int entry;
1137 unsigned char CR1bak;
1139 /*printf ("rhine_transmit\n"); */
1140 /* setup ethernet header */
1143 /* Calculate the next Tx descriptor entry. */
1144 entry = tp->cur_tx % TX_RING_SIZE;
1146 memcpy (tp->tx_buffs[entry], d, ETH_ALEN); /* dst */
1147 memcpy (tp->tx_buffs[entry] + ETH_ALEN, nic->node_addr, ETH_ALEN); /* src */
1148 *((char *) tp->tx_buffs[entry] + 12) = t >> 8; /* type */
1149 *((char *) tp->tx_buffs[entry] + 13) = t;
1150 memcpy (tp->tx_buffs[entry] + ETH_HLEN, p, s);
1151 s += ETH_HLEN;
1152 while (s < ETH_ZLEN)
1153 *((char *) tp->tx_buffs[entry] + ETH_HLEN + (s++)) = 0;
1155 tp->tx_ring[entry].tx_ctrl.bits.tx_buf_size = ETH_HLEN + s;
1157 tp->tx_ring[entry].tx_status.bits.own_bit = 1;
1160 CR1bak = inb (byCR1);
1162 CR1bak = CR1bak | CR1_TDMD1;
1163 /*printf("tdsw=[%X]",tp->tx_ring[entry].tx_status.lw); */
1164 /*printf("tdcw=[%X]",tp->tx_ring[entry].tx_ctrl.lw); */
1165 /*printf("tdbuf1=[%X]",tp->tx_ring[entry].buf_addr_1); */
1166 /*printf("tdbuf2=[%X]",tp->tx_ring[entry].buf_addr_2); */
1167 /*printf("td1=[%X]",inl(dwCurrentTDSE0)); */
1168 /*printf("td2=[%X]",inl(dwCurrentTDSE1)); */
1169 /*printf("td3=[%X]",inl(dwCurrentTDSE2)); */
1170 /*printf("td4=[%X]",inl(dwCurrentTDSE3)); */
1172 outb (CR1bak, byCR1);
1173 tp->cur_tx++;
1175 /*outw(IMRShadow,byIMR0); */
1176 /*dev_kfree_skb(tp->tx_skbuff[entry], FREE_WRITE); */
1177 /*tp->tx_skbuff[entry] = 0; */
1180 /* EOF via-rhine.c */