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