Home | History | Annotate | Download | only in net
      1 /* rhine.c:Fast Ethernet driver for Linux. */
      2 /*
      3 	Adapted 09-jan-2000 by Paolo Marini (paolom (at) 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 
    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
    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
    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
    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
    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
    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 ***************************************************************************/
    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
    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 
    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
    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
   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
   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
   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
   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