1 /* rhine.c:Fast Ethernet driver for Linux. */
2 /*
3 Adapted 09-jan-2000 by Paolo Marini (paolom@prisma-eng.it)
4
5 originally written by Donald Becker.
6
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.
11
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.
15
16 This driver is designed for the VIA VT86C100A Rhine-II PCI Fast Ethernet
17 controller.
18
19 */
20
21 static const char *version = "rhine.c v1.0.2 2004-10-29\n";
22
23 /* A few user-configurable values. */
24
25 // max time out delay time
26 #define W_MAX_TIMEOUT 0x0FFFU
27
28 /* Size of the in-memory receive ring. */
29 #define RX_BUF_LEN_IDX 3 /* 0==8K, 1==16K, 2==32K, 3==64K */
30 #define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX)
31
32 /* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */
33 #define TX_BUF_SIZE 1536
34 #define RX_BUF_SIZE 1536
35
36 /* PCI Tuning Parameters
37 Threshold is bytes transferred to chip before transmission starts. */
38 #define TX_FIFO_THRESH 256 /* In bytes, rounded down to 32 byte units. */
39
40 /* The following settings are log_2(bytes)-4: 0 == 16 bytes .. 6==1024. */
41 #define RX_FIFO_THRESH 4 /* Rx buffer level before first PCI xfer. */
42 #define RX_DMA_BURST 4 /* Maximum PCI burst, '4' is 256 bytes */
43 #define TX_DMA_BURST 4
44
45 /* Operational parameters that usually are not changed. */
46 /* Time in jiffies before concluding the transmitter is hung. */
47 #define TX_TIMEOUT ((2000*HZ)/1000)
48
49 #include "etherboot.h"
50 #include "nic.h"
51 #include <gpxe/pci.h>
52 #include <gpxe/ethernet.h>
53
54 /* define all ioaddr */
55
56 #define byPAR0 ioaddr
57 #define byRCR ioaddr + 6
58 #define byTCR ioaddr + 7
59 #define byCR0 ioaddr + 8
60 #define byCR1 ioaddr + 9
61 #define byISR0 ioaddr + 0x0c
62 #define byISR1 ioaddr + 0x0d
63 #define byIMR0 ioaddr + 0x0e
64 #define byIMR1 ioaddr + 0x0f
65 #define byMAR0 ioaddr + 0x10
66 #define byMAR1 ioaddr + 0x11
67 #define byMAR2 ioaddr + 0x12
68 #define byMAR3 ioaddr + 0x13
69 #define byMAR4 ioaddr + 0x14
70 #define byMAR5 ioaddr + 0x15
71 #define byMAR6 ioaddr + 0x16
72 #define byMAR7 ioaddr + 0x17
73 #define dwCurrentRxDescAddr ioaddr + 0x18
74 #define dwCurrentTxDescAddr ioaddr + 0x1c
75 #define dwCurrentRDSE0 ioaddr + 0x20
76 #define dwCurrentRDSE1 ioaddr + 0x24
77 #define dwCurrentRDSE2 ioaddr + 0x28
78 #define dwCurrentRDSE3 ioaddr + 0x2c
79 #define dwNextRDSE0 ioaddr + 0x30
80 #define dwNextRDSE1 ioaddr + 0x34
81 #define dwNextRDSE2 ioaddr + 0x38
82 #define dwNextRDSE3 ioaddr + 0x3c
83 #define dwCurrentTDSE0 ioaddr + 0x40
84 #define dwCurrentTDSE1 ioaddr + 0x44
85 #define dwCurrentTDSE2 ioaddr + 0x48
86 #define dwCurrentTDSE3 ioaddr + 0x4c
87 #define dwNextTDSE0 ioaddr + 0x50
88 #define dwNextTDSE1 ioaddr + 0x54
89 #define dwNextTDSE2 ioaddr + 0x58
90 #define dwNextTDSE3 ioaddr + 0x5c
91 #define dwCurrRxDMAPtr ioaddr + 0x60
92 #define dwCurrTxDMAPtr ioaddr + 0x64
93 #define byMPHY ioaddr + 0x6c
94 #define byMIISR ioaddr + 0x6d
95 #define byBCR0 ioaddr + 0x6e
96 #define byBCR1 ioaddr + 0x6f
97 #define byMIICR ioaddr + 0x70
98 #define byMIIAD ioaddr + 0x71
99 #define wMIIDATA ioaddr + 0x72
100 #define byEECSR ioaddr + 0x74
101 #define byTEST ioaddr + 0x75
102 #define byGPIO ioaddr + 0x76
103 #define byCFGA ioaddr + 0x78
104 #define byCFGB ioaddr + 0x79
105 #define byCFGC ioaddr + 0x7a
106 #define byCFGD ioaddr + 0x7b
107 #define wTallyCntMPA ioaddr + 0x7c
108 #define wTallyCntCRC ioaddr + 0x7d
109 #define bySTICKHW ioaddr + 0x83
110 #define byWOLcrClr ioaddr + 0xA4
111 #define byWOLcgClr ioaddr + 0xA7
112 #define byPwrcsrClr ioaddr + 0xAC
113
114 /*--------------------- Exioaddr Definitions -------------------------*/
115
116 /*
117 * Bits in the RCR register
118 */
119
120 #define RCR_RRFT2 0x80
121 #define RCR_RRFT1 0x40
122 #define RCR_RRFT0 0x20
123 #define RCR_PROM 0x10
124 #define RCR_AB 0x08
125 #define RCR_AM 0x04
126 #define RCR_AR 0x02
127 #define RCR_SEP 0x01
128
129 /*
130 * Bits in the TCR register
131 */
132
133 #define TCR_RTSF 0x80
134 #define TCR_RTFT1 0x40
135 #define TCR_RTFT0 0x20
136 #define TCR_OFSET 0x08
137 #define TCR_LB1 0x04 /* loopback[1] */
138 #define TCR_LB0 0x02 /* loopback[0] */
139
140 /*
141 * Bits in the CR0 register
142 */
143
144 #define CR0_RDMD 0x40 /* rx descriptor polling demand */
145 #define CR0_TDMD 0x20 /* tx descriptor polling demand */
146 #define CR0_TXON 0x10
147 #define CR0_RXON 0x08
148 #define CR0_STOP 0x04 /* stop NIC, default = 1 */
149 #define CR0_STRT 0x02 /* start NIC */
150 #define CR0_INIT 0x01 /* start init process */
151
152
153 /*
154 * Bits in the CR1 register
155 */
156
157 #define CR1_SFRST 0x80 /* software reset */
158 #define CR1_RDMD1 0x40 /* RDMD1 */
159 #define CR1_TDMD1 0x20 /* TDMD1 */
160 #define CR1_KEYPAG 0x10 /* turn on par/key */
161 #define CR1_DPOLL 0x08 /* disable rx/tx auto polling */
162 #define CR1_FDX 0x04 /* full duplex mode */
163 #define CR1_ETEN 0x02 /* early tx mode */
164 #define CR1_EREN 0x01 /* early rx mode */
165
166 /*
167 * Bits in the CR register
168 */
169
170 #define CR_RDMD 0x0040 /* rx descriptor polling demand */
171 #define CR_TDMD 0x0020 /* tx descriptor polling demand */
172 #define CR_TXON 0x0010
173 #define CR_RXON 0x0008
174 #define CR_STOP 0x0004 /* stop NIC, default = 1 */
175 #define CR_STRT 0x0002 /* start NIC */
176 #define CR_INIT 0x0001 /* start init process */
177 #define CR_SFRST 0x8000 /* software reset */
178 #define CR_RDMD1 0x4000 /* RDMD1 */
179 #define CR_TDMD1 0x2000 /* TDMD1 */
180 #define CR_KEYPAG 0x1000 /* turn on par/key */
181 #define CR_DPOLL 0x0800 /* disable rx/tx auto polling */
182 #define CR_FDX 0x0400 /* full duplex mode */
183 #define CR_ETEN 0x0200 /* early tx mode */
184 #define CR_EREN 0x0100 /* early rx mode */
185
186 /*
187 * Bits in the IMR0 register
188 */
189
190 #define IMR0_CNTM 0x80
191 #define IMR0_BEM 0x40
192 #define IMR0_RUM 0x20
193 #define IMR0_TUM 0x10
194 #define IMR0_TXEM 0x08
195 #define IMR0_RXEM 0x04
196 #define IMR0_PTXM 0x02
197 #define IMR0_PRXM 0x01
198
199 /* define imrshadow */
200
201 #define IMRShadow 0x5AFF
202
203 /*
204 * Bits in the IMR1 register
205 */
206
207 #define IMR1_INITM 0x80
208 #define IMR1_SRCM 0x40
209 #define IMR1_NBFM 0x10
210 #define IMR1_PRAIM 0x08
211 #define IMR1_RES0M 0x04
212 #define IMR1_ETM 0x02
213 #define IMR1_ERM 0x01
214
215 /*
216 * Bits in the ISR register
217 */
218
219 #define ISR_INITI 0x8000
220 #define ISR_SRCI 0x4000
221 #define ISR_ABTI 0x2000
222 #define ISR_NORBF 0x1000
223 #define ISR_PKTRA 0x0800
224 #define ISR_RES0 0x0400
225 #define ISR_ETI 0x0200
226 #define ISR_ERI 0x0100
227 #define ISR_CNT 0x0080
228 #define ISR_BE 0x0040
229 #define ISR_RU 0x0020
230 #define ISR_TU 0x0010
231 #define ISR_TXE 0x0008
232 #define ISR_RXE 0x0004
233 #define ISR_PTX 0x0002
234 #define ISR_PRX 0x0001
235
236 /*
237 * Bits in the ISR0 register
238 */
239
240 #define ISR0_CNT 0x80
241 #define ISR0_BE 0x40
242 #define ISR0_RU 0x20
243 #define ISR0_TU 0x10
244 #define ISR0_TXE 0x08
245 #define ISR0_RXE 0x04
246 #define ISR0_PTX 0x02
247 #define ISR0_PRX 0x01
248
249 /*
250 * Bits in the ISR1 register
251 */
252
253 #define ISR1_INITI 0x80
254 #define ISR1_SRCI 0x40
255 #define ISR1_NORBF 0x10
256 #define ISR1_PKTRA 0x08
257 #define ISR1_ETI 0x02
258 #define ISR1_ERI 0x01
259
260 /* ISR ABNORMAL CONDITION */
261
262 #define ISR_ABNORMAL ISR_BE+ISR_RU+ISR_TU+ISR_CNT+ISR_NORBF+ISR_PKTRA
263
264 /*
265 * Bits in the MIISR register
266 */
267
268 #define MIISR_MIIERR 0x08
269 #define MIISR_MRERR 0x04
270 #define MIISR_LNKFL 0x02
271 #define MIISR_SPEED 0x01
272
273 /*
274 * Bits in the MIICR register
275 */
276
277 #define MIICR_MAUTO 0x80
278 #define MIICR_RCMD 0x40
279 #define MIICR_WCMD 0x20
280 #define MIICR_MDPM 0x10
281 #define MIICR_MOUT 0x08
282 #define MIICR_MDO 0x04
283 #define MIICR_MDI 0x02
284 #define MIICR_MDC 0x01
285
286 /*
287 * Bits in the EECSR register
288 */
289
290 #define EECSR_EEPR 0x80 /* eeprom programed status, 73h means programed */
291 #define EECSR_EMBP 0x40 /* eeprom embeded programming */
292 #define EECSR_AUTOLD 0x20 /* eeprom content reload */
293 #define EECSR_DPM 0x10 /* eeprom direct programming */
294 #define EECSR_CS 0x08 /* eeprom CS pin */
295 #define EECSR_SK 0x04 /* eeprom SK pin */
296 #define EECSR_DI 0x02 /* eeprom DI pin */
297 #define EECSR_DO 0x01 /* eeprom DO pin */
298
299 /*
300 * Bits in the BCR0 register
301 */
302
303 #define BCR0_CRFT2 0x20
304 #define BCR0_CRFT1 0x10
305 #define BCR0_CRFT0 0x08
306 #define BCR0_DMAL2 0x04
307 #define BCR0_DMAL1 0x02
308 #define BCR0_DMAL0 0x01
309
310 /*
311 * Bits in the BCR1 register
312 */
313
314 #define BCR1_CTSF 0x20
315 #define BCR1_CTFT1 0x10
316 #define BCR1_CTFT0 0x08
317 #define BCR1_POT2 0x04
318 #define BCR1_POT1 0x02
319 #define BCR1_POT0 0x01
320
321 /*
322 * Bits in the CFGA register
323 */
324
325 #define CFGA_EELOAD 0x80 /* enable eeprom embeded and direct programming */
326 #define CFGA_JUMPER 0x40
327 #define CFGA_MTGPIO 0x08
328 #define CFGA_T10EN 0x02
329 #define CFGA_AUTO 0x01
330
331 /*
332 * Bits in the CFGB register
333 */
334
335 #define CFGB_PD 0x80
336 #define CFGB_POLEN 0x02
337 #define CFGB_LNKEN 0x01
338
339 /*
340 * Bits in the CFGC register
341 */
342
343 #define CFGC_M10TIO 0x80
344 #define CFGC_M10POL 0x40
345 #define CFGC_PHY1 0x20
346 #define CFGC_PHY0 0x10
347 #define CFGC_BTSEL 0x08
348 #define CFGC_BPS2 0x04 /* bootrom select[2] */
349 #define CFGC_BPS1 0x02 /* bootrom select[1] */
350 #define CFGC_BPS0 0x01 /* bootrom select[0] */
351
352 /*
353 * Bits in the CFGD register
354 */
355
356 #define CFGD_GPIOEN 0x80
357 #define CFGD_DIAG 0x40
358 #define CFGD_MAGIC 0x10
359 #define CFGD_RANDOM 0x08
360 #define CFGD_CFDX 0x04
361 #define CFGD_CEREN 0x02
362 #define CFGD_CETEN 0x01
363
364 /* Bits in RSR */
365 #define RSR_RERR 0x00000001
366 #define RSR_CRC 0x00000002
367 #define RSR_FAE 0x00000004
368 #define RSR_FOV 0x00000008
369 #define RSR_LONG 0x00000010
370 #define RSR_RUNT 0x00000020
371 #define RSR_SERR 0x00000040
372 #define RSR_BUFF 0x00000080
373 #define RSR_EDP 0x00000100
374 #define RSR_STP 0x00000200
375 #define RSR_CHN 0x00000400
376 #define RSR_PHY 0x00000800
377 #define RSR_BAR 0x00001000
378 #define RSR_MAR 0x00002000
379 #define RSR_RXOK 0x00008000
380 #define RSR_ABNORMAL RSR_RERR+RSR_LONG+RSR_RUNT
381
382 /* Bits in TSR */
383 #define TSR_NCR0 0x00000001
384 #define TSR_NCR1 0x00000002
385 #define TSR_NCR2 0x00000004
386 #define TSR_NCR3 0x00000008
387 #define TSR_COLS 0x00000010
388 #define TSR_CDH 0x00000080
389 #define TSR_ABT 0x00000100
390 #define TSR_OWC 0x00000200
391 #define TSR_CRS 0x00000400
392 #define TSR_UDF 0x00000800
393 #define TSR_TBUFF 0x00001000
394 #define TSR_SERR 0x00002000
395 #define TSR_JAB 0x00004000
396 #define TSR_TERR 0x00008000
397 #define TSR_ABNORMAL TSR_TERR+TSR_OWC+TSR_ABT+TSR_JAB+TSR_CRS
398 #define TSR_OWN_BIT 0x80000000
399
400 #define CB_DELAY_LOOP_WAIT 10 /* 10ms */
401 /* enabled mask value of irq */
402
403 #define W_IMR_MASK_VALUE 0x1BFF /* initial value of IMR */
404
405 /* Ethernet address filter type */
406 #define PKT_TYPE_DIRECTED 0x0001 /* obsolete, directed address is always accepted */
407 #define PKT_TYPE_MULTICAST 0x0002
408 #define PKT_TYPE_ALL_MULTICAST 0x0004
409 #define PKT_TYPE_BROADCAST 0x0008
410 #define PKT_TYPE_PROMISCUOUS 0x0020
411 #define PKT_TYPE_LONG 0x2000
412 #define PKT_TYPE_RUNT 0x4000
413 #define PKT_TYPE_ERROR 0x8000 /* accept error packets, e.g. CRC error */
414
415 /* Loopback mode */
416
417 #define NIC_LB_NONE 0x00
418 #define NIC_LB_INTERNAL 0x01
419 #define NIC_LB_PHY 0x02 /* MII or Internal-10BaseT loopback */
420
421 #define TX_RING_SIZE 2
422 #define RX_RING_SIZE 2
423 #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */
424
425 #define PCI_REG_MODE3 0x53
426 #define MODE3_MIION 0x04 /* in PCI_REG_MOD3 OF PCI space */
427
428 enum rhine_revs {
429 VT86C100A = 0x00,
430 VTunknown0 = 0x20,
431 VT6102 = 0x40,
432 VT8231 = 0x50, /* Integrated MAC */
433 VT8233 = 0x60, /* Integrated MAC */
434 VT8235 = 0x74, /* Integrated MAC */
435 VT8237 = 0x78, /* Integrated MAC */
436 VTunknown1 = 0x7C,
437 VT6105 = 0x80,
438 VT6105_B0 = 0x83,
439 VT6105L = 0x8A,
440 VT6107 = 0x8C,
441 VTunknown2 = 0x8E,
442 VT6105M = 0x90,
443 };
444
445 /* Transmit and receive descriptors definition */
446
447 struct rhine_tx_desc
448 {
449 union VTC_tx_status_tag
450 {
451 struct
452 {
453 unsigned long ncro:1;
454 unsigned long ncr1:1;
455 unsigned long ncr2:1;
456 unsigned long ncr3:1;
457 unsigned long cols:1;
458 unsigned long reserve_1:2;
459 unsigned long cdh:1;
460 unsigned long abt:1;
461 unsigned long owc:1;
462 unsigned long crs:1;
463 unsigned long udf:1;
464 unsigned long tbuff:1;
465 unsigned long serr:1;
466 unsigned long jab:1;
467 unsigned long terr:1;
468 unsigned long reserve_2:15;
469 unsigned long own_bit:1;
470 }
471 bits;
472 unsigned long lw;
473 }
474 tx_status;
475
476 union VTC_tx_ctrl_tag
477 {
478 struct
479 {
480 unsigned long tx_buf_size:11;
481 unsigned long extend_tx_buf_size:4;
482 unsigned long chn:1;
483 unsigned long crc:1;
484 unsigned long reserve_1:4;
485 unsigned long stp:1;
486 unsigned long edp:1;
487 unsigned long ic:1;
488 unsigned long reserve_2:8;
489 }
490 bits;
491 unsigned long lw;
492 }
493 tx_ctrl;
494
495 unsigned long buf_addr_1:32;
496 unsigned long buf_addr_2:32;
497
498 };
499
500 struct rhine_rx_desc
501 {
502 union VTC_rx_status_tag
503 {
504 struct
505 {
506 unsigned long rerr:1;
507 unsigned long crc_error:1;
508 unsigned long fae:1;
509 unsigned long fov:1;
510 unsigned long toolong:1;
511 unsigned long runt:1;
512 unsigned long serr:1;
513 unsigned long buff:1;
514 unsigned long edp:1;
515 unsigned long stp:1;
516 unsigned long chn:1;
517 unsigned long phy:1;
518 unsigned long bar:1;
519 unsigned long mar:1;
520 unsigned long reserve_1:1;
521 unsigned long rxok:1;
522 unsigned long frame_length:11;
523 unsigned long reverve_2:4;
524 unsigned long own_bit:1;
525 }
526 bits;
527 unsigned long lw;
528 }
529 rx_status;
530
531 union VTC_rx_ctrl_tag
532 {
533 struct
534 {
535 unsigned long rx_buf_size:11;
536 unsigned long extend_rx_buf_size:4;
537 unsigned long reserved_1:17;
538 }
539 bits;
540 unsigned long lw;
541 }
542 rx_ctrl;
543
544 unsigned long buf_addr_1:32;
545 unsigned long buf_addr_2:32;
546
547 };
548
549 struct {
550 char txbuf[TX_RING_SIZE * PKT_BUF_SZ + 32];
551 char rxbuf[RX_RING_SIZE * PKT_BUF_SZ + 32];
552 char txdesc[TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32];
553 char rxdesc[RX_RING_SIZE * sizeof (struct rhine_rx_desc) + 32];
554 } rhine_buffers __shared;
555
556 /* The I/O extent. */
557 #define rhine_TOTAL_SIZE 0x80
558
559 #ifdef HAVE_DEVLIST
560 struct netdev_entry rhine_drv =
561 { "rhine", rhine_probe, rhine_TOTAL_SIZE, NULL };
562 #endif
563
564 static int rhine_debug = 1;
565
566 /*
567 Theory of Operation
568
569 I. Board Compatibility
570
571 This driver is designed for the VIA 86c100A Rhine-II PCI Fast Ethernet
572 controller.
573
574 II. Board-specific settings
575
576 Boards with this chip are functional only in a bus-master PCI slot.
577
578 Many operational settings are loaded from the EEPROM to the Config word at
579 offset 0x78. This driver assumes that they are correct.
580 If this driver is compiled to use PCI memory space operations the EEPROM
581 must be configured to enable memory ops.
582
583 III. Driver operation
584
585 IIIa. Ring buffers
586
587 This driver uses two statically allocated fixed-size descriptor lists
588 formed into rings by a branch from the final descriptor to the beginning of
589 the list. The ring sizes are set at compile time by RX/TX_RING_SIZE.
590
591 IIIb/c. Transmit/Receive Structure
592
593 This driver attempts to use a zero-copy receive and transmit scheme.
594
595 Alas, all data buffers are required to start on a 32 bit boundary, so
596 the driver must often copy transmit packets into bounce buffers.
597
598 The driver allocates full frame size skbuffs for the Rx ring buffers at
599 open() time and passes the skb->data field to the chip as receive data
600 buffers. When an incoming frame is less than RX_COPYBREAK bytes long,
601 a fresh skbuff is allocated and the frame is copied to the new skbuff.
602 When the incoming frame is larger, the skbuff is passed directly up the
603 protocol stack. Buffers consumed this way are replaced by newly allocated
604 skbuffs in the last phase of netdev_rx().
605
606 The RX_COPYBREAK value is chosen to trade-off the memory wasted by
607 using a full-sized skbuff for small frames vs. the copying costs of larger
608 frames. New boards are typically used in generously configured machines
609 and the underfilled buffers have negligible impact compared to the benefit of
610 a single allocation size, so the default value of zero results in never
611 copying packets. When copying is done, the cost is usually mitigated by using
612 a combined copy/checksum routine. Copying also preloads the cache, which is
613 most useful with small frames.
614
615 Since the VIA chips are only able to transfer data to buffers on 32 bit
616 boundaries, the the IP header at offset 14 in an ethernet frame isn't
617 longword aligned for further processing. Copying these unaligned buffers
618 has the beneficial effect of 16-byte aligning the IP header.
619
620 IIId. Synchronization
621
622 The driver runs as two independent, single-threaded flows of control. One
623 is the send-packet routine, which enforces single-threaded use by the
624 dev->tbusy flag. The other thread is the interrupt handler, which is single
625 threaded by the hardware and interrupt handling software.
626
627 The send packet thread has partial control over the Tx ring and 'dev->tbusy'
628 flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next
629 queue slot is empty, it clears the tbusy flag when finished otherwise it sets
630 the 'lp->tx_full' flag.
631
632 The interrupt handler has exclusive control over the Rx ring and records stats
633 from the Tx ring. After reaping the stats, it marks the Tx queue entry as
634 empty by incrementing the dirty_tx mark. Iff the 'lp->tx_full' flag is set, it
635 clears both the tx_full and tbusy flags.
636
637 IV. Notes
638
639 IVb. References
640
641 Preliminary VT86C100A manual from http://www.via.com.tw/
642 http://cesdis.gsfc.nasa.gov/linux/misc/100mbps.html
643 http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html
644
645 IVc. Errata
646
647 The VT86C100A manual is not reliable information.
648 The chip does not handle unaligned transmit or receive buffers, resulting
649 in significant performance degradation for bounce buffer copies on transmit
650 and unaligned IP headers on receive.
651 The chip does not pad to minimum transmit length.
652
653 */
654
655 /* The rest of these values should never change. */
656 #define NUM_TX_DESC 2 /* Number of Tx descriptor registers. */
657
658 static struct rhine_private
659 {
660 char devname[8]; /* Used only for kernel debugging. */
661 const char *product_name;
662 struct rhine_rx_desc *rx_ring;
663 struct rhine_tx_desc *tx_ring;
664 char *rx_buffs[RX_RING_SIZE];
665 char *tx_buffs[TX_RING_SIZE];
666
667 /* temporary Rx buffers. */
668
669 int chip_id;
670 int chip_revision;
671 unsigned short ioaddr;
672 unsigned int cur_rx, cur_tx; /* The next free and used entries */
673 unsigned int dirty_rx, dirty_tx;
674 /* The saved address of a sent-in-place packet/buffer, for skfree(). */
675 struct sk_buff *tx_skbuff[TX_RING_SIZE];
676 unsigned char mc_filter[8]; /* Current multicast filter. */
677 char phys[4]; /* MII device addresses. */
678 unsigned int tx_full:1; /* The Tx queue is full. */
679 unsigned int full_duplex:1; /* Full-duplex operation requested. */
680 unsigned int default_port:4; /* Last dev->if_port value. */
681 unsigned int media2:4; /* Secondary monitored media port. */
682 unsigned int medialock:1; /* Don't sense media type. */
683 unsigned int mediasense:1; /* Media sensing in progress. */
684 }
685 rhine;
686
687 static void rhine_probe1 (struct nic *nic, struct pci_device *pci, int ioaddr,
688 int chip_id, int options);
689 static int QueryAuto (int);
690 static int ReadMII (int byMIIIndex, int);
691 static void WriteMII (char, char, char, int);
692 static void MIIDelay (void);
693 static void rhine_init_ring (struct nic *dev);
694 static void rhine_disable (struct nic *nic);
695 static void rhine_reset (struct nic *nic);
696 static int rhine_poll (struct nic *nic, int retreive);
697 static void rhine_transmit (struct nic *nic, const char *d, unsigned int t,
698 unsigned int s, const char *p);
699 static void reload_eeprom(int ioaddr);
700
701
reload_eeprom(int ioaddr)702 static void reload_eeprom(int ioaddr)
703 {
704 int i;
705 outb(0x20, byEECSR);
706 /* Typically 2 cycles to reload. */
707 for (i = 0; i < 150; i++)
708 if (! (inb(byEECSR) & 0x20))
709 break;
710 }
711 /* Initialize the Rx and Tx rings, along with various 'dev' bits. */
712 static void
rhine_init_ring(struct nic * nic)713 rhine_init_ring (struct nic *nic)
714 {
715 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
716 int i;
717
718 tp->tx_full = 0;
719 tp->cur_rx = tp->cur_tx = 0;
720 tp->dirty_rx = tp->dirty_tx = 0;
721
722 for (i = 0; i < RX_RING_SIZE; i++)
723 {
724
725 tp->rx_ring[i].rx_status.bits.own_bit = 1;
726 tp->rx_ring[i].rx_ctrl.bits.rx_buf_size = 1536;
727
728 tp->rx_ring[i].buf_addr_1 = virt_to_bus (tp->rx_buffs[i]);
729 tp->rx_ring[i].buf_addr_2 = virt_to_bus (&tp->rx_ring[i + 1]);
730 /* printf("[%d]buf1=%hX,buf2=%hX",i,tp->rx_ring[i].buf_addr_1,tp->rx_ring[i].buf_addr_2); */
731 }
732 /* Mark the last entry as wrapping the ring. */
733 /* tp->rx_ring[i-1].rx_ctrl.bits.rx_buf_size =1518; */
734 tp->rx_ring[i - 1].buf_addr_2 = virt_to_bus (&tp->rx_ring[0]);
735 /*printf("[%d]buf1=%hX,buf2=%hX",i-1,tp->rx_ring[i-1].buf_addr_1,tp->rx_ring[i-1].buf_addr_2); */
736
737 /* The Tx buffer descriptor is filled in as needed, but we
738 do need to clear the ownership bit. */
739
740 for (i = 0; i < TX_RING_SIZE; i++)
741 {
742
743 tp->tx_ring[i].tx_status.lw = 0;
744 tp->tx_ring[i].tx_ctrl.lw = 0x00e08000;
745 tp->tx_ring[i].buf_addr_1 = virt_to_bus (tp->tx_buffs[i]);
746 tp->tx_ring[i].buf_addr_2 = virt_to_bus (&tp->tx_ring[i + 1]);
747 /* printf("[%d]buf1=%hX,buf2=%hX",i,tp->tx_ring[i].buf_addr_1,tp->tx_ring[i].buf_addr_2); */
748 }
749
750 tp->tx_ring[i - 1].buf_addr_2 = virt_to_bus (&tp->tx_ring[0]);
751 /* printf("[%d]buf1=%hX,buf2=%hX",i,tp->tx_ring[i-1].buf_addr_1,tp->tx_ring[i-1].buf_addr_2); */
752 }
753
754 int
QueryAuto(int ioaddr)755 QueryAuto (int ioaddr)
756 {
757 int byMIIIndex;
758 int MIIReturn;
759
760 int advertising,mii_reg5;
761 int negociated;
762
763 byMIIIndex = 0x04;
764 MIIReturn = ReadMII (byMIIIndex, ioaddr);
765 advertising=MIIReturn;
766
767 byMIIIndex = 0x05;
768 MIIReturn = ReadMII (byMIIIndex, ioaddr);
769 mii_reg5=MIIReturn;
770
771 negociated=mii_reg5 & advertising;
772
773 if ( (negociated & 0x100) || (negociated & 0x1C0) == 0x40 )
774 return 1;
775 else
776 return 0;
777
778 }
779
780 int
ReadMII(int byMIIIndex,int ioaddr)781 ReadMII (int byMIIIndex, int ioaddr)
782 {
783 int ReturnMII;
784 char byMIIAdrbak;
785 char byMIICRbak;
786 char byMIItemp;
787 unsigned long ct;
788
789 byMIIAdrbak = inb (byMIIAD);
790 byMIICRbak = inb (byMIICR);
791 outb (byMIICRbak & 0x7f, byMIICR);
792 MIIDelay ();
793
794 outb (byMIIIndex, byMIIAD);
795 MIIDelay ();
796
797 outb (inb (byMIICR) | 0x40, byMIICR);
798
799 byMIItemp = inb (byMIICR);
800 byMIItemp = byMIItemp & 0x40;
801
802 ct = currticks();
803 while (byMIItemp != 0 && ct + 2*1000 < currticks())
804 {
805 byMIItemp = inb (byMIICR);
806 byMIItemp = byMIItemp & 0x40;
807 }
808 MIIDelay ();
809
810 ReturnMII = inw (wMIIDATA);
811
812 outb (byMIIAdrbak, byMIIAD);
813 outb (byMIICRbak, byMIICR);
814 MIIDelay ();
815
816 return (ReturnMII);
817
818 }
819
820 void
WriteMII(char byMIISetByte,char byMIISetBit,char byMIIOP,int ioaddr)821 WriteMII (char byMIISetByte, char byMIISetBit, char byMIIOP, int ioaddr)
822 {
823 int ReadMIItmp;
824 int MIIMask;
825 char byMIIAdrbak;
826 char byMIICRbak;
827 char byMIItemp;
828 unsigned long ct;
829
830
831 byMIIAdrbak = inb (byMIIAD);
832
833 byMIICRbak = inb (byMIICR);
834 outb (byMIICRbak & 0x7f, byMIICR);
835 MIIDelay ();
836 outb (byMIISetByte, byMIIAD);
837 MIIDelay ();
838
839 outb (inb (byMIICR) | 0x40, byMIICR);
840
841 byMIItemp = inb (byMIICR);
842 byMIItemp = byMIItemp & 0x40;
843
844 ct = currticks();
845 while (byMIItemp != 0 && ct + 2*1000 < currticks())
846 {
847 byMIItemp = inb (byMIICR);
848 byMIItemp = byMIItemp & 0x40;
849 }
850 MIIDelay ();
851
852 ReadMIItmp = inw (wMIIDATA);
853 MIIMask = 0x0001;
854 MIIMask = MIIMask << byMIISetBit;
855
856
857 if (byMIIOP == 0)
858 {
859 MIIMask = ~MIIMask;
860 ReadMIItmp = ReadMIItmp & MIIMask;
861 }
862 else
863 {
864 ReadMIItmp = ReadMIItmp | MIIMask;
865
866 }
867 outw (ReadMIItmp, wMIIDATA);
868 MIIDelay ();
869
870 outb (inb (byMIICR) | 0x20, byMIICR);
871 byMIItemp = inb (byMIICR);
872 byMIItemp = byMIItemp & 0x20;
873
874 ct = currticks();
875 while (byMIItemp != 0 && ct + 2*1000 < currticks())
876 {
877 byMIItemp = inb (byMIICR);
878 byMIItemp = byMIItemp & 0x20;
879 }
880 MIIDelay ();
881
882 outb (byMIIAdrbak & 0x7f, byMIIAD);
883 outb (byMIICRbak, byMIICR);
884 MIIDelay ();
885
886 }
887
888 void
MIIDelay(void)889 MIIDelay (void)
890 {
891 int i;
892 for (i = 0; i < 0x7fff; i++)
893 {
894 ( void ) inb (0x61);
895 ( void ) inb (0x61);
896 ( void ) inb (0x61);
897 ( void ) inb (0x61);
898 }
899 }
900
901 /* Offsets to the device registers. */
902 enum register_offsets {
903 StationAddr=0x00, RxConfig=0x06, TxConfig=0x07, ChipCmd=0x08,
904 IntrStatus=0x0C, IntrEnable=0x0E,
905 MulticastFilter0=0x10, MulticastFilter1=0x14,
906 RxRingPtr=0x18, TxRingPtr=0x1C, GFIFOTest=0x54,
907 MIIPhyAddr=0x6C, MIIStatus=0x6D, PCIBusConfig=0x6E,
908 MIICmd=0x70, MIIRegAddr=0x71, MIIData=0x72, MACRegEEcsr=0x74,
909 ConfigA=0x78, ConfigB=0x79, ConfigC=0x7A, ConfigD=0x7B,
910 RxMissed=0x7C, RxCRCErrs=0x7E, MiscCmd=0x81,
911 StickyHW=0x83, IntrStatus2=0x84, WOLcrClr=0xA4, WOLcgClr=0xA7,
912 PwrcsrClr=0xAC,
913 };
914
915 /* Bits in the interrupt status/mask registers. */
916 enum intr_status_bits {
917 IntrRxDone=0x0001, IntrRxErr=0x0004, IntrRxEmpty=0x0020,
918 IntrTxDone=0x0002, IntrTxError=0x0008, IntrTxUnderrun=0x0210,
919 IntrPCIErr=0x0040,
920 IntrStatsMax=0x0080, IntrRxEarly=0x0100,
921 IntrRxOverflow=0x0400, IntrRxDropped=0x0800, IntrRxNoBuf=0x1000,
922 IntrTxAborted=0x2000, IntrLinkChange=0x4000,
923 IntrRxWakeUp=0x8000,
924 IntrNormalSummary=0x0003, IntrAbnormalSummary=0xC260,
925 IntrTxDescRace=0x080000, /* mapped from IntrStatus2 */
926 IntrTxErrSummary=0x082218,
927 };
928 #define DEFAULT_INTR (IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | \
929 IntrRxDropped | IntrRxNoBuf)
930
931 /***************************************************************************
932 IRQ - PXE IRQ Handler
933 ***************************************************************************/
rhine_irq(struct nic * nic,irq_action_t action)934 void rhine_irq ( struct nic *nic, irq_action_t action ) {
935 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
936 /* Enable interrupts by setting the interrupt mask. */
937 unsigned int intr_status;
938
939 switch ( action ) {
940 case DISABLE :
941 case ENABLE :
942 intr_status = inw(nic->ioaddr + IntrStatus);
943 /* On Rhine-II, Bit 3 indicates Tx descriptor write-back race. */
944
945 /* added comment by guard */
946 /* For supporting VT6107, please use revision id to recognize different chips in driver */
947 // if (tp->chip_id == 0x3065)
948 if( tp->chip_revision < 0x80 && tp->chip_revision >=0x40 )
949 intr_status |= inb(nic->ioaddr + IntrStatus2) << 16;
950 intr_status = (intr_status & ~DEFAULT_INTR);
951 if ( action == ENABLE )
952 intr_status = intr_status | DEFAULT_INTR;
953 outw(intr_status, nic->ioaddr + IntrEnable);
954 break;
955 case FORCE :
956 outw(0x0010, nic->ioaddr + 0x84);
957 break;
958 }
959 }
960
961 static struct nic_operations rhine_operations;
962
963 static int
rhine_probe(struct nic * nic,struct pci_device * pci)964 rhine_probe ( struct nic *nic, struct pci_device *pci ) {
965
966 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
967
968 if (!pci->ioaddr)
969 return 0;
970
971 rhine_probe1 (nic, pci, pci->ioaddr, pci->device, -1);
972
973 adjust_pci_device ( pci );
974
975 rhine_reset (nic);
976
977 nic->nic_op = &rhine_operations;
978
979 nic->irqno = pci->irq;
980 nic->ioaddr = tp->ioaddr;
981
982 return 1;
983 }
984
set_rx_mode(struct nic * nic __unused)985 static void set_rx_mode(struct nic *nic __unused) {
986 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
987 unsigned char rx_mode;
988 int ioaddr = tp->ioaddr;
989
990 /* ! IFF_PROMISC */
991 outl(0xffffffff, byMAR0);
992 outl(0xffffffff, byMAR4);
993 rx_mode = 0x0C;
994
995 outb(0x60 /* thresh */ | rx_mode, byRCR );
996 }
997
998 static void
rhine_probe1(struct nic * nic,struct pci_device * pci,int ioaddr,int chip_id,int options)999 rhine_probe1 (struct nic *nic, struct pci_device *pci, int ioaddr, int chip_id, int options)
1000 {
1001 struct rhine_private *tp;
1002 static int did_version = 0; /* Already printed version info. */
1003 unsigned int i, ww;
1004 unsigned int timeout;
1005 int FDXFlag;
1006 int byMIIvalue, LineSpeed, MIICRbak;
1007 uint8_t revision_id;
1008 unsigned char mode3_reg;
1009
1010 if (rhine_debug > 0 && did_version++ == 0)
1011 printf ("%s",version);
1012
1013 // get revision id.
1014 pci_read_config_byte(pci, PCI_REVISION, &revision_id);
1015
1016 /* D-Link provided reset code (with comment additions) */
1017 if (revision_id >= 0x40) {
1018 unsigned char byOrgValue;
1019
1020 if(rhine_debug > 0)
1021 printf("Enabling Sticky Bit Workaround for Chip_id: 0x%hX\n"
1022 , chip_id);
1023 /* clear sticky bit before reset & read ethernet address */
1024 byOrgValue = inb(bySTICKHW);
1025 byOrgValue = byOrgValue & 0xFC;
1026 outb(byOrgValue, bySTICKHW);
1027
1028 /* (bits written are cleared?) */
1029 /* disable force PME-enable */
1030 outb(0x80, byWOLcgClr);
1031 /* disable power-event config bit */
1032 outb(0xFF, byWOLcrClr);
1033 /* clear power status (undocumented in vt6102 docs?) */
1034 outb(0xFF, byPwrcsrClr);
1035
1036 }
1037
1038 /* Reset the chip to erase previous misconfiguration. */
1039 outw(CR_SFRST, byCR0);
1040 // if vt3043 delay after reset
1041 if (revision_id <0x40) {
1042 udelay(10000);
1043 }
1044 // polling till software reset complete
1045 // W_MAX_TIMEOUT is the timeout period
1046 for(ww = 0; ww < W_MAX_TIMEOUT; ww++) {
1047 if ((inw(byCR0) & CR_SFRST) == 0)
1048 break;
1049 }
1050
1051 // issue AUTOLoad in EECSR to reload eeprom
1052 outb(0x20, byEECSR );
1053
1054 // if vt3065 delay after reset
1055 if (revision_id >=0x40) {
1056 // delay 8ms to let MAC stable
1057 mdelay(8);
1058 /*
1059 * for 3065D, EEPROM reloaded will cause bit 0 in MAC_REG_CFGA
1060 * turned on. it makes MAC receive magic packet
1061 * automatically. So, we turn it off. (D-Link)
1062 */
1063 outb(inb(byCFGA) & 0xFE, byCFGA);
1064 }
1065
1066 /* turn on bit2 in PCI configuration register 0x53 , only for 3065*/
1067 if (revision_id >= 0x40) {
1068 pci_read_config_byte(pci, PCI_REG_MODE3, &mode3_reg);
1069 pci_write_config_byte(pci, PCI_REG_MODE3, mode3_reg|MODE3_MIION);
1070 }
1071
1072
1073 /* back off algorithm ,disable the right-most 4-bit off CFGD*/
1074 outb(inb(byCFGD) & (~(CFGD_RANDOM | CFGD_CFDX | CFGD_CEREN | CFGD_CETEN)), byCFGD);
1075
1076 /* reload eeprom */
1077 reload_eeprom(ioaddr);
1078
1079 /* Perhaps this should be read from the EEPROM? */
1080 for (i = 0; i < ETH_ALEN; i++)
1081 nic->node_addr[i] = inb (byPAR0 + i);
1082
1083 DBG ( "IO address %#hX Ethernet Address: %s\n", ioaddr, eth_ntoa ( nic->node_addr ) );
1084
1085 /* restart MII auto-negotiation */
1086 WriteMII (0, 9, 1, ioaddr);
1087 printf ("Analyzing Media type,this may take several seconds... ");
1088 for (i = 0; i < 5; i++)
1089 {
1090 /* need to wait 1 millisecond - we will round it up to 50-100ms */
1091 timeout = currticks() + 2;
1092 for (timeout = currticks() + 2; currticks() < timeout;)
1093 /* nothing */;
1094 if (ReadMII (1, ioaddr) & 0x0020)
1095 break;
1096 }
1097 printf ("OK.\n");
1098
1099 #if 0
1100 /* JJM : for Debug */
1101 printf("MII : Address %hhX ",inb(ioaddr+0x6c));
1102 {
1103 unsigned char st1,st2,adv1,adv2,l1,l2;
1104
1105 st1=ReadMII(1,ioaddr)>>8;
1106 st2=ReadMII(1,ioaddr)&0xFF;
1107 adv1=ReadMII(4,ioaddr)>>8;
1108 adv2=ReadMII(4,ioaddr)&0xFF;
1109 l1=ReadMII(5,ioaddr)>>8;
1110 l2=ReadMII(5,ioaddr)&0xFF;
1111 printf(" status 0x%hhX%hhX, advertising 0x%hhX%hhX, link 0x%hhX%hhX\n", st1,st2,adv1,adv2,l1,l2);
1112 }
1113 #endif
1114
1115
1116 /* query MII to know LineSpeed,duplex mode */
1117 byMIIvalue = inb (ioaddr + 0x6d);
1118 LineSpeed = byMIIvalue & MIISR_SPEED;
1119 if (LineSpeed != 0) //JJM
1120 {
1121 printf ("Linespeed=10Mbs");
1122 }
1123 else
1124 {
1125 printf ("Linespeed=100Mbs");
1126 }
1127
1128 FDXFlag = QueryAuto (ioaddr);
1129 if (FDXFlag == 1)
1130 {
1131 printf (" Fullduplex\n");
1132 outw (CR_FDX, byCR0);
1133 }
1134 else
1135 {
1136 printf (" Halfduplex\n");
1137 }
1138
1139
1140 /* set MII 10 FULL ON, only apply in vt3043 */
1141 if(chip_id == 0x3043)
1142 WriteMII (0x17, 1, 1, ioaddr);
1143
1144 /* turn on MII link change */
1145 MIICRbak = inb (byMIICR);
1146 outb (MIICRbak & 0x7F, byMIICR);
1147 MIIDelay ();
1148 outb (0x41, byMIIAD);
1149 MIIDelay ();
1150
1151 /* while((inb(byMIIAD)&0x20)==0) ; */
1152 outb (MIICRbak | 0x80, byMIICR);
1153
1154 nic->priv_data = &rhine;
1155 tp = &rhine;
1156 tp->chip_id = chip_id;
1157 tp->ioaddr = ioaddr;
1158 tp->phys[0] = -1;
1159 tp->chip_revision = revision_id;
1160
1161 /* The lower four bits are the media type. */
1162 if (options > 0)
1163 {
1164 tp->full_duplex = (options & 16) ? 1 : 0;
1165 tp->default_port = options & 15;
1166 if (tp->default_port)
1167 tp->medialock = 1;
1168 }
1169 return;
1170 }
1171
1172 static void
rhine_disable(struct nic * nic)1173 rhine_disable ( struct nic *nic ) {
1174
1175 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
1176 int ioaddr = tp->ioaddr;
1177
1178 rhine_reset(nic);
1179
1180 printf ("rhine disable\n");
1181 /* Switch to loopback mode to avoid hardware races. */
1182 outb(0x60 | 0x01, byTCR);
1183 /* Stop the chip's Tx and Rx processes. */
1184 outw(CR_STOP, byCR0);
1185 }
1186
1187 /**************************************************************************
1188 ETH_RESET - Reset adapter
1189 ***************************************************************************/
1190 static void
rhine_reset(struct nic * nic)1191 rhine_reset (struct nic *nic)
1192 {
1193 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
1194 int ioaddr = tp->ioaddr;
1195 int i, j;
1196 int FDXFlag, CRbak;
1197 void *rx_ring_tmp;
1198 void *tx_ring_tmp;
1199 void *rx_bufs_tmp;
1200 void *tx_bufs_tmp;
1201 unsigned long rx_ring_tmp1;
1202 unsigned long tx_ring_tmp1;
1203 unsigned long rx_bufs_tmp1;
1204 unsigned long tx_bufs_tmp1;
1205
1206 /* printf ("rhine_reset\n"); */
1207 /* Soft reset the chip. */
1208 /*outb(CmdReset, ioaddr + ChipCmd); */
1209
1210 tx_bufs_tmp = rhine_buffers.txbuf;
1211 tx_ring_tmp = rhine_buffers.txdesc;
1212 rx_bufs_tmp = rhine_buffers.rxbuf;
1213 rx_ring_tmp = rhine_buffers.rxdesc;
1214
1215 /* tune RD TD 32 byte alignment */
1216 rx_ring_tmp1 = virt_to_bus ( rx_ring_tmp );
1217 j = (rx_ring_tmp1 + 32) & (~0x1f);
1218 /* printf ("txring[%d]", j); */
1219 tp->rx_ring = (struct rhine_rx_desc *) bus_to_virt (j);
1220
1221 tx_ring_tmp1 = virt_to_bus ( tx_ring_tmp );
1222 j = (tx_ring_tmp1 + 32) & (~0x1f);
1223 tp->tx_ring = (struct rhine_tx_desc *) bus_to_virt (j);
1224 /* printf ("rxring[%X]", j); */
1225
1226
1227 tx_bufs_tmp1 = virt_to_bus ( tx_bufs_tmp );
1228 j = (int) (tx_bufs_tmp1 + 32) & (~0x1f);
1229 tx_bufs_tmp = bus_to_virt (j);
1230 /* printf ("txb[%X]", j); */
1231
1232 rx_bufs_tmp1 = virt_to_bus ( rx_bufs_tmp );
1233 j = (int) (rx_bufs_tmp1 + 32) & (~0x1f);
1234 rx_bufs_tmp = bus_to_virt (j);
1235 /* printf ("rxb[%X][%X]", rx_bufs_tmp1, j); */
1236
1237 for (i = 0; i < RX_RING_SIZE; i++)
1238 {
1239 tp->rx_buffs[i] = (char *) rx_bufs_tmp;
1240 /* printf("r[%X]",tp->rx_buffs[i]); */
1241 rx_bufs_tmp += 1536;
1242 }
1243
1244 for (i = 0; i < TX_RING_SIZE; i++)
1245 {
1246 tp->tx_buffs[i] = (char *) tx_bufs_tmp;
1247 /* printf("t[%X]",tp->tx_buffs[i]); */
1248 tx_bufs_tmp += 1536;
1249 }
1250
1251 /* software reset */
1252 outb (CR1_SFRST, byCR1);
1253 MIIDelay ();
1254
1255 /* printf ("init ring"); */
1256 rhine_init_ring (nic);
1257 /*write TD RD Descriptor to MAC */
1258 outl (virt_to_bus (tp->rx_ring), dwCurrentRxDescAddr);
1259 outl (virt_to_bus (tp->tx_ring), dwCurrentTxDescAddr);
1260
1261 /* Setup Multicast */
1262 set_rx_mode(nic);
1263
1264 /* set TCR RCR threshold to store and forward*/
1265 outb (0x3e, byBCR0);
1266 outb (0x38, byBCR1);
1267 outb (0x2c, byRCR);
1268 outb (0x60, byTCR);
1269 /* Set Fulldupex */
1270 FDXFlag = QueryAuto (ioaddr);
1271 if (FDXFlag == 1)
1272 {
1273 outb (CFGD_CFDX, byCFGD);
1274 outw (CR_FDX, byCR0);
1275 }
1276
1277 /* KICK NIC to WORK */
1278 CRbak = inw (byCR0);
1279 CRbak = CRbak & 0xFFFB; /* not CR_STOP */
1280 outw ((CRbak | CR_STRT | CR_TXON | CR_RXON | CR_DPOLL), byCR0);
1281
1282 /* disable all known interrupt */
1283 outw (0, byIMR0);
1284 }
1285 /* Beware of PCI posted writes */
1286 #define IOSYNC do { inb(nic->ioaddr + StationAddr); } while (0)
1287
1288 static int
rhine_poll(struct nic * nic,int retreive)1289 rhine_poll (struct nic *nic, int retreive)
1290 {
1291 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
1292 int rxstatus, good = 0;;
1293
1294 if (tp->rx_ring[tp->cur_rx].rx_status.bits.own_bit == 0)
1295 {
1296 unsigned int intr_status;
1297 /* There is a packet ready */
1298 if(!retreive)
1299 return 1;
1300
1301 intr_status = inw(nic->ioaddr + IntrStatus);
1302 /* On Rhine-II, Bit 3 indicates Tx descriptor write-back race. */
1303 #if 0
1304 if (tp->chip_id == 0x3065)
1305 intr_status |= inb(nic->ioaddr + IntrStatus2) << 16;
1306 #endif
1307 /* Acknowledge all of the current interrupt sources ASAP. */
1308 if (intr_status & IntrTxDescRace)
1309 outb(0x08, nic->ioaddr + IntrStatus2);
1310 outw(intr_status & 0xffff, nic->ioaddr + IntrStatus);
1311 IOSYNC;
1312
1313 rxstatus = tp->rx_ring[tp->cur_rx].rx_status.lw;
1314 if ((rxstatus & 0x0300) != 0x0300)
1315 {
1316 printf("rhine_poll: bad status\n");
1317 }
1318 else if (rxstatus & (RSR_ABNORMAL))
1319 {
1320 printf ("rxerr[%X]\n", rxstatus);
1321 }
1322 else
1323 good = 1;
1324
1325 if (good)
1326 {
1327 nic->packetlen = tp->rx_ring[tp->cur_rx].rx_status.bits.frame_length;
1328 memcpy (nic->packet, tp->rx_buffs[tp->cur_rx], nic->packetlen);
1329 /* printf ("Packet RXed\n"); */
1330 }
1331 tp->rx_ring[tp->cur_rx].rx_status.bits.own_bit = 1;
1332 tp->cur_rx++;
1333 tp->cur_rx = tp->cur_rx % RX_RING_SIZE;
1334 }
1335 /* Acknowledge all of the current interrupt sources ASAP. */
1336 outw(DEFAULT_INTR & ~IntrRxDone, nic->ioaddr + IntrStatus);
1337
1338 IOSYNC;
1339
1340 return good;
1341 }
1342
1343 static void
rhine_transmit(struct nic * nic,const char * d,unsigned int t,unsigned int s,const char * p)1344 rhine_transmit (struct nic *nic,
1345 const char *d, unsigned int t, unsigned int s, const char *p)
1346 {
1347 struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
1348 int ioaddr = tp->ioaddr;
1349 int entry;
1350 unsigned char CR1bak;
1351 unsigned char CR0bak;
1352 unsigned int nstype;
1353 unsigned long ct;
1354
1355
1356 /*printf ("rhine_transmit\n"); */
1357 /* setup ethernet header */
1358
1359
1360 /* Calculate the next Tx descriptor entry. */
1361 entry = tp->cur_tx % TX_RING_SIZE;
1362
1363 memcpy (tp->tx_buffs[entry], d, ETH_ALEN); /* dst */
1364 memcpy (tp->tx_buffs[entry] + ETH_ALEN, nic->node_addr, ETH_ALEN); /* src */
1365
1366 nstype=htons(t);
1367 memcpy(tp->tx_buffs[entry] + 2 * ETH_ALEN, (char*)&nstype, 2);
1368
1369 memcpy (tp->tx_buffs[entry] + ETH_HLEN, p, s);
1370 s += ETH_HLEN;
1371 while (s < ETH_ZLEN)
1372 *((char *) tp->tx_buffs[entry] + (s++)) = 0;
1373
1374 tp->tx_ring[entry].tx_ctrl.bits.tx_buf_size = s;
1375
1376 tp->tx_ring[entry].tx_status.bits.own_bit = 1;
1377
1378
1379 CR1bak = inb (byCR1);
1380
1381 CR1bak = CR1bak | CR1_TDMD1;
1382 /*printf("tdsw=[%X]",tp->tx_ring[entry].tx_status.lw); */
1383 /*printf("tdcw=[%X]",tp->tx_ring[entry].tx_ctrl.lw); */
1384 /*printf("tdbuf1=[%X]",tp->tx_ring[entry].buf_addr_1); */
1385 /*printf("tdbuf2=[%X]",tp->tx_ring[entry].buf_addr_2); */
1386 /*printf("td1=[%X]",inl(dwCurrentTDSE0)); */
1387 /*printf("td2=[%X]",inl(dwCurrentTDSE1)); */
1388 /*printf("td3=[%X]",inl(dwCurrentTDSE2)); */
1389 /*printf("td4=[%X]",inl(dwCurrentTDSE3)); */
1390
1391 outb (CR1bak, byCR1);
1392 do
1393 {
1394 ct = currticks();
1395 /* Wait until transmit is finished or timeout*/
1396 while((tp->tx_ring[entry].tx_status.bits.own_bit !=0) &&
1397 ct + 10*1000 < currticks())
1398 ;
1399
1400 if(tp->tx_ring[entry].tx_status.bits.terr == 0)
1401 break;
1402
1403 if(tp->tx_ring[entry].tx_status.bits.abt == 1)
1404 {
1405 // turn on TX
1406 CR0bak = inb(byCR0);
1407 CR0bak = CR0bak|CR_TXON;
1408 outb(CR0bak,byCR0);
1409 }
1410 }while(0);
1411 tp->cur_tx++;
1412
1413 /*outw(IMRShadow,byIMR0); */
1414 /*dev_kfree_skb(tp->tx_skbuff[entry], FREE_WRITE); */
1415 /*tp->tx_skbuff[entry] = 0; */
1416 }
1417
1418 static struct nic_operations rhine_operations = {
1419 .connect = dummy_connect,
1420 .poll = rhine_poll,
1421 .transmit = rhine_transmit,
1422 .irq = rhine_irq,
1423
1424 };
1425
1426 static struct pci_device_id rhine_nics[] = {
1427 PCI_ROM(0x1106, 0x3065, "dlink-530tx", "VIA 6102", 0),
1428 PCI_ROM(0x1106, 0x3106, "via-rhine-6105", "VIA 6105", 0),
1429 PCI_ROM(0x1106, 0x3043, "dlink-530tx-old", "VIA 3043", 0), /* Rhine-I 86c100a */
1430 PCI_ROM(0x1106, 0x3053, "via6105m", "VIA 6105M", 0),
1431 PCI_ROM(0x1106, 0x6100, "via-rhine-old", "VIA 86C100A", 0), /* Rhine-II */
1432 };
1433
1434 PCI_DRIVER ( rhine_driver, rhine_nics, PCI_NO_CLASS );
1435
1436 DRIVER ( "VIA 86C100", nic_driver, pci_driver, rhine_driver,
1437 rhine_probe, rhine_disable );
1438
1439 /* EOF via-rhine.c */
1440
1441 /*
1442 * Local variables:
1443 * c-basic-offset: 8
1444 * c-indent-level: 8
1445 * tab-width: 8
1446 * End:
1447 */
1448