Home | History | Annotate | Download | only in net
      1 /*
      2  * eepro100.c -- This is a driver for Intel Fast Ethernet Controllers
      3  * (ifec).
      4  *
      5  * Originally written for Etherboot by:
      6  *
      7  *   Copyright (C) AW Computer Systems.
      8  *   written by R.E.Wolff -- R.E.Wolff (at) BitWizard.nl
      9  *
     10  *   AW Computer Systems is contributing to the free software community
     11  *   by paying for this driver and then putting the result under GPL.
     12  *
     13  *   If you need a Linux device driver, please contact BitWizard for a
     14  *   quote.
     15  *
     16  * This program is free software; you can redistribute it and/or
     17  * modify it under the terms of the GNU General Public License as
     18  * published by the Free Software Foundation; either version 2, or (at
     19  * your option) any later version.
     20  *
     21  * This program is distributed in the hope that it will be useful, but
     22  * WITHOUT ANY WARRANTY; without even the implied warranty of
     23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     24  * General Public License for more details.
     25  *
     26  * You should have received a copy of the GNU General Public License
     27  * along with this program; if not, write to the Free Software
     28  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     29  *
     30  *
     31  *              date       version  by      what
     32  *  Written:    May 29 1997  V0.10  REW     Initial revision.
     33  * changes:     May 31 1997  V0.90  REW     Works!
     34  *              Jun 1  1997  V0.91  REW     Cleanup
     35  *              Jun 2  1997  V0.92  REW     Add some code documentation
     36  *              Jul 25 1997  V1.00  REW     Tested by AW to work in a PROM
     37  *                                          Cleanup for publication
     38  *              Dez 11 2004  V1.10  Kiszka  Add RX ring buffer support
     39  *              Jun    2008  v2.0   mdeck   Updated to gPXE. Changed much.
     40  *
     41  * Cleanups and fixes by Thomas Miletich<thomas.miletich (at) gmail.com>
     42  *
     43  * This is the etherboot intel etherexpress Pro/100B driver.
     44  *
     45  * It was written from scratch, with Donald Beckers eepro100.c kernel
     46  * driver as a guideline. Mostly the 82557 related definitions and the
     47  * lower level routines have been cut-and-pasted into this source.
     48  *
     49  * The driver was finished before Intel got the NDA out of the closet.
     50  *
     51  * Datasheet is now published and available from
     52  * ftp://download.intel.com/design/network/manuals/8255X_OpenSDM.pdf
     53  *    - Michael Brown
     54  * */
     55 
     56 FILE_LICENCE ( GPL2_OR_LATER );
     57 
     58 /*
     59  * General Theory of Operation
     60  *
     61  * Initialization
     62  *
     63  * ifec_pci_probe() is called by gPXE during initialization. Typical NIC
     64  * initialization is performed.  EEPROM data is read.
     65  *
     66  * Network Boot
     67  *
     68  * ifec_net_open() is called by gPXE before attempting to network boot from the
     69  * card.  Here, the Command Unit & Receive Unit are initialized.  The tx & rx
     70  * rings are setup.  The MAC address is programmed and the card is configured.
     71  *
     72  * Transmit
     73  *
     74  * ifec_net_transmit() enqueues a packet in the tx ring - active::tcbs[]  The tx
     75  * ring is composed of TCBs linked to each other into a ring.  A tx request
     76  * fills out the next available TCB with a pointer to the packet data.
     77  * The last enqueued tx is always at active::tcb_head.  Thus, a tx request fills
     78  * out the TCB following tcb_head.
     79  * active::tcb_tail points to the TCB we're awaiting completion of.
     80  * ifec_tx_process() checks tcb_tail, and once complete,
     81  * blindly increments tcb_tail to the next ring TCB.
     82  *
     83  * Receive
     84  *
     85  * priv::rfds[] is an array of Receive Frame Descriptors. The RFDs are linked
     86  * together to form a ring.
     87  * ifec_net_poll() calls ifec_rx_process(), which checks the next RFD for
     88  * data.  If we received a packet, we allocate a new io_buffer and copy the
     89  * packet data into it. If alloc_iob() fails, we don't touch the RFD and try
     90  * again on the next poll.
     91  */
     92 
     93 /*
     94  * Debugging levels:
     95  *	- DBG() is for any errors, i.e. failed alloc_iob(), malloc_dma(),
     96  *	  TX overflow, corrupted packets, ...
     97  *	- DBG2() is for successful events, like packet received,
     98  *	  packet transmitted, and other general notifications.
     99  *	- DBGP() prints the name of each called function on entry
    100  */
    101 
    102 #include <stdint.h>
    103 #include <byteswap.h>
    104 #include <errno.h>
    105 #include <stdio.h>
    106 #include <unistd.h>
    107 #include <gpxe/ethernet.h>
    108 #include <gpxe/if_ether.h>
    109 #include <gpxe/iobuf.h>
    110 #include <gpxe/malloc.h>
    111 #include <gpxe/pci.h>
    112 #include <gpxe/spi_bit.h>
    113 #include <gpxe/timer.h>
    114 #include <gpxe/nvs.h>
    115 #include <gpxe/threewire.h>
    116 #include <gpxe/netdevice.h>
    117 #include "eepro100.h"
    118 
    119 /****************************** Global data **********************************/
    120 
    121 /*
    122  * This is the default configuration command data. The values were copied from
    123  * the Linux kernel initialization for the eepro100.
    124  */
    125 static struct ifec_cfg ifec_cfg = {
    126 	.status  = 0,
    127 	.command = CmdConfigure | CmdSuspend,
    128 	.link    = 0,        /* Filled in later */
    129 	.byte = { 22,        /* How many bytes in this array */
    130 	          ( TX_FIFO << 4 ) | RX_FIFO,  /* Rx & Tx FIFO limits */
    131 	          0, 0,                        /* Adaptive Interframe Spacing */
    132 	          RX_DMA_COUNT,                /* Rx DMA max byte count */
    133 	          TX_DMA_COUNT + 0x80,         /* Tx DMA max byte count */
    134 	          0x32,      /* Many bits. */
    135 	          0x03,      /* Discard short receive & Underrun retries */
    136 	          1,         /* 1=Use MII  0=Use AUI */
    137 	          0,
    138 	          0x2E,      /* NSAI, Preamble length, & Loopback*/
    139 	          0,         /* Linear priority */
    140 	          0x60,      /* L PRI MODE & Interframe spacing */
    141 	          0, 0xf2,
    142 	          0x48,      /* Promiscuous, Broadcast disable, CRS & CDT */
    143 	          0, 0x40,
    144 	          0xf2,      /* Stripping, Padding, Receive CRC Transfer */
    145 	          0x80,      /* 0x40=Force full-duplex, 0x80=Allowfull-duplex*/
    146 	          0x3f,      /* Multiple IA */
    147 	          0x0D }     /* Multicast all */
    148 };
    149 
    150 static struct net_device_operations ifec_operations = {
    151 	.open     = ifec_net_open,
    152 	.close    = ifec_net_close,
    153 	.transmit = ifec_net_transmit,
    154 	.poll     = ifec_net_poll,
    155 	.irq      = ifec_net_irq
    156 };
    157 
    158 /******************* gPXE PCI Device Driver API functions ********************/
    159 
    160 /*
    161  * Initialize the PCI device.
    162  *
    163  * @v pci 		The device's associated pci_device structure.
    164  * @v id  		The PCI device + vendor id.
    165  * @ret rc		Returns zero if successfully initialized.
    166  *
    167  * This function is called very early on, while gPXE is initializing.
    168  * This is a gPXE PCI Device Driver API function.
    169  */
    170 static int ifec_pci_probe ( struct pci_device *pci,
    171                             const struct pci_device_id *id __unused )
    172 {
    173 	struct net_device *netdev;
    174 	struct ifec_private *priv;
    175 	int rc;
    176 
    177 	DBGP ( "ifec_pci_probe: " );
    178 
    179 	if ( pci->ioaddr == 0 )
    180 		return -EINVAL;
    181 
    182 	netdev = alloc_etherdev ( sizeof(*priv) );
    183 	if ( !netdev )
    184 		return -ENOMEM;
    185 
    186 	netdev_init ( netdev, &ifec_operations );
    187 	priv = netdev->priv;
    188 
    189 	pci_set_drvdata ( pci, netdev );
    190 	netdev->dev = &pci->dev;
    191 
    192 	/* enable bus master, etc */
    193 	adjust_pci_device( pci );
    194 
    195 	DBGP ( "pci " );
    196 
    197 	memset ( priv, 0, sizeof(*priv) );
    198 	priv->ioaddr = pci->ioaddr;
    199 
    200 	ifec_reset ( netdev );
    201 	DBGP ( "reset " );
    202 
    203 	ifec_init_eeprom ( netdev );
    204 
    205 	/* read MAC address */
    206 	nvs_read ( &priv->eeprom.nvs, EEPROM_ADDR_MAC_0, netdev->hw_addr,
    207 		   ETH_ALEN );
    208 	/* read mdio_register */
    209 	nvs_read ( &priv->eeprom.nvs, EEPROM_ADDR_MDIO_REGISTER,
    210 		   &priv->mdio_register, 2 );
    211 
    212 	ifec_link_update ( netdev );	/* Update link state */
    213 
    214 	if ( ( rc = register_netdev ( netdev ) ) != 0 )
    215 		goto error;
    216 
    217 	DBGP ( "ints\n" );
    218 
    219 	return 0;
    220 
    221 error:
    222 	ifec_reset     ( netdev );
    223 	netdev_nullify ( netdev );
    224 	netdev_put     ( netdev );
    225 
    226 	return rc;
    227 }
    228 
    229 /*
    230  * Remove a device from the PCI device list.
    231  *
    232  * @v pci		PCI device to remove.
    233  *
    234  * This is a PCI Device Driver API function.
    235  */
    236 static void ifec_pci_remove ( struct pci_device *pci )
    237 {
    238 	struct net_device *netdev = pci_get_drvdata ( pci );
    239 
    240 	DBGP ( "ifec_pci_remove\n" );
    241 
    242 	unregister_netdev ( netdev );
    243 	ifec_reset        ( netdev );
    244 	netdev_nullify    ( netdev );
    245 	netdev_put        ( netdev );
    246 }
    247 
    248 /****************** gPXE Network Device Driver API functions *****************/
    249 
    250 /*
    251  * Close a network device.
    252  *
    253  * @v netdev		Device to close.
    254  *
    255  * This is a gPXE Network Device Driver API function.
    256  */
    257 static void ifec_net_close ( struct net_device *netdev )
    258 {
    259 	struct ifec_private *priv = netdev->priv;
    260 	unsigned long ioaddr = priv->ioaddr;
    261 	unsigned short intr_status;
    262 
    263 	DBGP ( "ifec_net_close\n" );
    264 
    265 	/* disable interrupts */
    266 	ifec_net_irq ( netdev, 0 );
    267 
    268 	/* Ack & clear ints */
    269 	intr_status = inw ( ioaddr + SCBStatus );
    270 	outw ( intr_status, ioaddr + SCBStatus );
    271 	inw ( ioaddr + SCBStatus );
    272 
    273 	ifec_reset ( netdev );
    274 
    275 	/* Free any resources */
    276 	ifec_free ( netdev );
    277 }
    278 
    279 /* Interrupts to be masked */
    280 #define INTERRUPT_MASK	( SCBMaskEarlyRx | SCBMaskFlowCtl )
    281 
    282 /*
    283  * Enable or disable IRQ masking.
    284  *
    285  * @v netdev		Device to control.
    286  * @v enable		Zero to mask off IRQ, non-zero to enable IRQ.
    287  *
    288  * This is a gPXE Network Driver API function.
    289  */
    290 static void ifec_net_irq ( struct net_device *netdev, int enable )
    291 {
    292 	struct ifec_private *priv = netdev->priv;
    293 	unsigned long ioaddr = priv->ioaddr;
    294 
    295 	DBGP ( "ifec_net_irq\n" );
    296 
    297 	outw ( enable ? INTERRUPT_MASK : SCBMaskAll, ioaddr + SCBCmd );
    298 }
    299 
    300 /*
    301  * Opens a network device.
    302  *
    303  * @v netdev		Device to be opened.
    304  * @ret rc  		Non-zero if failed to open.
    305  *
    306  * This enables tx and rx on the device.
    307  * This is a gPXE Network Device Driver API function.
    308  */
    309 static int ifec_net_open ( struct net_device *netdev )
    310 {
    311 	struct ifec_private *priv = netdev->priv;
    312 	struct ifec_ias *ias = NULL;
    313 	struct ifec_cfg *cfg = NULL;
    314 	int i, options;
    315 	int rc = -ENOMEM;
    316 
    317 	DBGP ( "ifec_net_open: " );
    318 
    319 	/* Ensure interrupts are disabled. */
    320 	ifec_net_irq ( netdev, 0 );
    321 
    322 	/* Initialize Command Unit and Receive Unit base addresses. */
    323 	ifec_scb_cmd ( netdev, 0, RUAddrLoad );
    324 	ifec_scb_cmd ( netdev, virt_to_bus ( &priv->stats ), CUStatsAddr );
    325 	ifec_scb_cmd ( netdev, 0, CUCmdBase );
    326 
    327 	/* Initialize both rings */
    328 	if ( ( rc = ifec_rx_setup ( netdev ) ) != 0 )
    329 		goto error;
    330 	if ( ( rc = ifec_tx_setup ( netdev ) ) != 0 )
    331 		goto error;
    332 
    333 	/* Initialize MDIO */
    334 	options = 0x00; /* 0x40 = 10mbps half duplex, 0x00 = Autosense */
    335 	ifec_mdio_setup ( netdev, options );
    336 
    337 	/* Prepare MAC address w/ Individual Address Setup (ias) command.*/
    338 	ias = malloc_dma ( sizeof ( *ias ), CB_ALIGN );
    339 	if ( !ias ) {
    340 		rc = -ENOMEM;
    341 		goto error;
    342 	}
    343 	ias->command      = CmdIASetup;
    344 	ias->status       = 0;
    345 	memcpy ( ias->ia, netdev->ll_addr, ETH_ALEN );
    346 
    347 	/* Prepare operating parameters w/ a configure command. */
    348 	cfg = malloc_dma ( sizeof ( *cfg ), CB_ALIGN );
    349 	if ( !cfg ) {
    350 		rc = -ENOMEM;
    351 		goto error;
    352 	}
    353 	memcpy ( cfg, &ifec_cfg, sizeof ( *cfg ) );
    354 	cfg->link     = virt_to_bus ( priv->tcbs );
    355 	cfg->byte[19] = ( options & 0x10 ) ? 0xC0 : 0x80;
    356 	ias->link     = virt_to_bus ( cfg );
    357 
    358 	/* Issue the ias and configure commands. */
    359 	ifec_scb_cmd ( netdev, virt_to_bus ( ias ), CUStart );
    360 	ifec_scb_cmd_wait ( netdev );
    361 	priv->configured = 1;
    362 
    363 	/* Wait up to 10 ms for configuration to initiate */
    364 	for ( i = 10; i && !cfg->status; i-- )
    365 		mdelay ( 1 );
    366 	if ( ! cfg->status ) {
    367 		DBG ( "Failed to initiate!\n" );
    368 		goto error;
    369 	}
    370 	free_dma ( ias, sizeof ( *ias ) );
    371 	free_dma ( cfg, sizeof ( *cfg ) );
    372 	DBG2 ( "cfg " );
    373 
    374 	/* Enable rx by sending ring address to card */
    375 	if ( priv->rfds[0] != NULL ) {
    376 		ifec_scb_cmd ( netdev, virt_to_bus( priv->rfds[0] ), RUStart );
    377 		ifec_scb_cmd_wait ( netdev );
    378 	}
    379 	DBG2 ( "rx_start\n" );
    380 
    381 	return 0;
    382 
    383 error:
    384 	free_dma ( cfg, sizeof ( *cfg ) );
    385 	free_dma ( ias, sizeof ( *ias ) );
    386 	ifec_free ( netdev );
    387 	ifec_reset ( netdev );
    388 	return rc;
    389 }
    390 
    391 /*
    392  * This function allows a driver to process events during operation.
    393  *
    394  * @v netdev		Device being polled.
    395  *
    396  * This is called periodically by gPXE to let the driver check the status of
    397  * transmitted packets and to allow the driver to check for received packets.
    398  * This is a gPXE Network Device Driver API function.
    399  */
    400 static void ifec_net_poll ( struct net_device *netdev )
    401 {
    402 	struct ifec_private *priv = netdev->priv;
    403 	static int linkpoll = 0;
    404 	unsigned short intr_status;
    405 
    406 	DBGP ( "ifec_net_poll\n" );
    407 
    408 	/* acknowledge interrupts ASAP */
    409 	intr_status = inw ( priv->ioaddr + SCBStatus );
    410 	outw ( intr_status, priv->ioaddr + SCBStatus );
    411 	inw ( priv->ioaddr + SCBStatus );
    412 
    413 	DBG2 ( "poll - status: 0x%04X\n", intr_status );
    414 
    415 	if ( ++linkpoll > LINK_CHECK_PERIOD ) {
    416 		linkpoll = 0;
    417 		ifec_link_update ( netdev );	/* Update link state */
    418 	}
    419 
    420 	/* anything to do here? */
    421 	if ( ( intr_status & ( ~INTERRUPT_MASK ) ) == 0 )
    422 		return;
    423 
    424 	/* process received and transmitted packets */
    425 	ifec_tx_process ( netdev );
    426 	ifec_rx_process ( netdev );
    427 
    428 	ifec_check_ru_status ( netdev, intr_status );
    429 
    430 	return;
    431 }
    432 
    433 /*
    434  * This transmits a packet.
    435  *
    436  * @v netdev		Device to transmit from.
    437  * @v iobuf 		Data to transmit.
    438  * @ret rc  		Non-zero if failed to transmit.
    439  *
    440  * This is a gPXE Network Driver API function.
    441  */
    442 static int ifec_net_transmit ( struct net_device *netdev,
    443                                struct io_buffer *iobuf )
    444 {
    445 	struct ifec_private *priv = netdev->priv;
    446 	struct ifec_tcb *tcb = priv->tcb_head->next;
    447 	unsigned long ioaddr = priv->ioaddr;
    448 
    449 	DBGP ( "ifec_net_transmit\n" );
    450 
    451 	/* Wait for TCB to become available. */
    452 	if ( tcb->status || tcb->iob ) {
    453 		DBG ( "TX overflow\n" );
    454 		return -ENOBUFS;
    455 	}
    456 
    457 	DBG2 ( "transmitting packet (%d bytes). status = %hX, cmd=%hX\n",
    458 		iob_len ( iobuf ), tcb->status, inw ( ioaddr + SCBCmd ) );
    459 
    460 	tcb->command   = CmdSuspend | CmdTx | CmdTxFlex;
    461 	tcb->count     = 0x01208000;
    462 	tcb->tbd_addr0 = virt_to_bus ( iobuf->data );
    463 	tcb->tbd_size0 = 0x3FFF & iob_len ( iobuf );
    464 	tcb->iob = iobuf;
    465 
    466 	ifec_tx_wake ( netdev );
    467 
    468 	/* Append to end of ring. */
    469 	priv->tcb_head = tcb;
    470 
    471 	return 0;
    472 }
    473 
    474 /*************************** Local support functions *************************/
    475 
    476 /* Define what each GPIO Pin does */
    477 static const uint16_t ifec_ee_bits[] = {
    478 	[SPI_BIT_SCLK]	= EE_SHIFT_CLK,
    479 	[SPI_BIT_MOSI]	= EE_DATA_WRITE,
    480 	[SPI_BIT_MISO]	= EE_DATA_READ,
    481 	[SPI_BIT_SS(0)]	= EE_ENB,
    482 };
    483 
    484 /*
    485  * Read a single bit from the GPIO pins used for SPI.
    486  * should be called by SPI bitbash functions only
    487  *
    488  * @v basher		Bitbash device
    489  * @v bit_id		Line to be read
    490  */
    491 static int ifec_spi_read_bit ( struct bit_basher *basher,
    492 			       unsigned int bit_id )
    493 {
    494 	struct ifec_private *priv =
    495 		container_of ( basher, struct ifec_private, spi.basher );
    496 	unsigned long ee_addr = priv->ioaddr + CSREeprom;
    497 	unsigned int ret = 0;
    498 	uint16_t mask;
    499 
    500 	DBGP ( "ifec_spi_read_bit\n" );
    501 
    502 	mask = ifec_ee_bits[bit_id];
    503 	ret = inw (ee_addr);
    504 
    505 	return ( ret & mask ) ? 1 : 0;
    506 }
    507 
    508 /*
    509  * Write a single bit to the GPIO pins used for SPI.
    510  * should be called by SPI bitbash functions only
    511  *
    512  * @v basher		Bitbash device
    513  * @v bit_id		Line to write to
    514  * @v data		Value to write
    515  */
    516 static void ifec_spi_write_bit ( struct bit_basher *basher,
    517 				 unsigned int bit_id,
    518 				 unsigned long data )
    519 {
    520 	struct ifec_private *priv =
    521 		container_of ( basher, struct ifec_private, spi.basher );
    522 	unsigned long ee_addr = priv->ioaddr + CSREeprom;
    523 	short val;
    524 	uint16_t mask = ifec_ee_bits[bit_id];
    525 
    526 	DBGP ( "ifec_spi_write_bit\n" );
    527 
    528 	val = inw ( ee_addr );
    529 	val &= ~mask;
    530 	val |= data & mask;
    531 
    532 	outw ( val, ee_addr );
    533 }
    534 
    535 /* set function pointer to SPI read- and write-bit functions */
    536 static struct bit_basher_operations ifec_basher_ops = {
    537 	.read = ifec_spi_read_bit,
    538 	.write = ifec_spi_write_bit,
    539 };
    540 
    541 /*
    542  * Initialize the eeprom stuff
    543  *
    544  * @v netdev		Network device
    545  */
    546 static void ifec_init_eeprom ( struct net_device *netdev )
    547 {
    548 	struct ifec_private *priv = netdev->priv;
    549 
    550 	DBGP ( "ifec_init_eeprom\n" );
    551 
    552 	priv->spi.basher.op = &ifec_basher_ops;
    553 	priv->spi.bus.mode = SPI_MODE_THREEWIRE;
    554 	init_spi_bit_basher ( &priv->spi );
    555 
    556 	priv->eeprom.bus = &priv->spi.bus;
    557 
    558 	/* init as 93c46(93c14 compatible) first, to set the command len,
    559 	 * block size and word len. Needs to be set for address len detection.
    560 	 */
    561 	init_at93c46 ( &priv->eeprom, 16 );
    562 
    563 	/* detect address length, */
    564 	threewire_detect_address_len ( &priv->eeprom );
    565 
    566 	/* address len == 8 means 93c66 instead of 93c46 */
    567 	if ( priv->eeprom.address_len == 8 )
    568 		init_at93c66 ( &priv->eeprom, 16 );
    569 }
    570 
    571 /*
    572  * Check if the network cable is plugged in.
    573  *
    574  * @v netdev  		Network device to check.
    575  * @ret retval		greater 0 if linkup.
    576  */
    577 static int ifec_link_check ( struct net_device *netdev )
    578 {
    579 	struct ifec_private *priv = netdev->priv;
    580 	unsigned short mdio_register = priv->mdio_register;
    581 
    582 	DBGP ( "ifec_link_check\n" );
    583 
    584 	/* Read the status register once to discard stale data */
    585 	ifec_mdio_read ( netdev, mdio_register & 0x1f, 1 );
    586 	/* Check to see if network cable is plugged in. */
    587 	if ( ! ( ifec_mdio_read ( netdev, mdio_register & 0x1f, 1 )
    588 		  & ( 1 << 2 ) ) ) {
    589 		return 0;
    590 	}
    591 	return 1;
    592 }
    593 
    594 /*
    595  * Check network cable link, inform gPXE as appropriate.
    596  *
    597  * @v netdev  		Network device to check.
    598  */
    599 static void ifec_link_update ( struct net_device *netdev )
    600 {
    601 	DBGP ( "ifec_link_update\n" );
    602 
    603 	/* Update link state */
    604 	if ( ifec_link_check ( netdev ) )
    605 		netdev_link_up ( netdev );
    606 	else
    607 		netdev_link_down ( netdev );
    608 }
    609 
    610 /*
    611  * Support function: ifec_mdio_read
    612  *
    613  * This probably reads a register in the "physical media interface chip".
    614  * -- REW
    615  */
    616 static int ifec_mdio_read ( struct net_device *netdev, int phy_id,
    617                                                        int location )
    618 {
    619 	struct ifec_private *priv = netdev->priv;
    620 	unsigned long ioaddr = priv->ioaddr;
    621 	int val;
    622 	int boguscnt = 64*4;     /* <64 usec. to complete, typ 27 ticks */
    623 
    624 	DBGP ( "ifec_mdio_read\n" );
    625 
    626 	outl ( 0x08000000 | ( location << 16 ) | ( phy_id << 21 ),
    627 	       ioaddr + CSRCtrlMDI );
    628 	do {
    629 		udelay ( 16 );
    630 
    631 		val = inl ( ioaddr + CSRCtrlMDI );
    632 
    633 		if ( --boguscnt < 0 ) {
    634 			DBG ( " ifec_mdio_read() time out with val = %X.\n",
    635 			         val );
    636 			break;
    637 		}
    638 	} while (! ( val & 0x10000000 ) );
    639 	return val & 0xffff;
    640 }
    641 
    642 /*
    643  * Initializes MDIO.
    644  *
    645  * @v netdev 		Network device
    646  * @v options		MDIO options
    647  */
    648 static void ifec_mdio_setup ( struct net_device *netdev, int options )
    649 {
    650 	struct ifec_private *priv = netdev->priv;
    651 	unsigned short mdio_register = priv->mdio_register;
    652 
    653 	DBGP ( "ifec_mdio_setup\n" );
    654 
    655 	if (   ( (mdio_register>>8) & 0x3f ) == DP83840
    656 	    || ( (mdio_register>>8) & 0x3f ) == DP83840A ) {
    657 		int mdi_reg23 = ifec_mdio_read ( netdev, mdio_register
    658 						  & 0x1f, 23 ) | 0x0422;
    659 		if (CONGENB)
    660 			mdi_reg23 |= 0x0100;
    661 		DBG2 ( "DP83840 specific setup, setting register 23 to "
    662 		                                         "%hX.\n", mdi_reg23 );
    663 		ifec_mdio_write ( netdev, mdio_register & 0x1f, 23, mdi_reg23 );
    664 	}
    665 	DBG2 ( "dp83840 " );
    666 	if ( options != 0 ) {
    667 		ifec_mdio_write ( netdev, mdio_register & 0x1f, 0,
    668 		                           ( (options & 0x20) ? 0x2000 : 0 ) |
    669 		                           ( (options & 0x10) ? 0x0100 : 0 ) );
    670 		DBG2 ( "set mdio_register. " );
    671 	}
    672 }
    673 
    674 /*
    675  * Support function: ifec_mdio_write
    676  *
    677  * This probably writes to the "physical media interface chip".
    678  * -- REW
    679  */
    680 static int ifec_mdio_write ( struct net_device *netdev,
    681                              int phy_id, int location, int value )
    682 {
    683 	struct ifec_private *priv = netdev->priv;
    684 	unsigned long ioaddr = priv->ioaddr;
    685 	int val;
    686 	int boguscnt = 64*4;     /* <64 usec. to complete, typ 27 ticks */
    687 
    688 	DBGP ( "ifec_mdio_write\n" );
    689 
    690 	outl ( 0x04000000 | ( location << 16 ) | ( phy_id << 21 ) | value,
    691 	       ioaddr + CSRCtrlMDI );
    692 	do {
    693 		udelay ( 16 );
    694 
    695 		val = inl ( ioaddr + CSRCtrlMDI );
    696 		if ( --boguscnt < 0 ) {
    697 			DBG ( " ifec_mdio_write() time out with val = %X.\n",
    698 			      val );
    699 			break;
    700 		}
    701 	} while (! ( val & 0x10000000 ) );
    702 	return val & 0xffff;
    703 }
    704 
    705 /*
    706  * Resets the hardware.
    707  *
    708  * @v netdev		Network device
    709  */
    710 static void ifec_reset ( struct net_device *netdev )
    711 {
    712 	struct ifec_private *priv = netdev->priv;
    713 	unsigned long ioaddr = priv->ioaddr;
    714 
    715 	DBGP ( "ifec_reset\n" );
    716 
    717 	/* do partial reset first */
    718 	outl ( PortPartialReset, ioaddr + CSRPort );
    719 	inw ( ioaddr + SCBStatus );
    720 	udelay ( 20 );
    721 
    722 	/* full reset */
    723 	outl ( PortReset, ioaddr + CSRPort );
    724 	inw ( ioaddr + SCBStatus );
    725 	udelay ( 20 );
    726 
    727 	/* disable interrupts again */
    728 	ifec_net_irq ( netdev, 0 );
    729 }
    730 
    731 /*
    732  * free()s the tx/rx rings.
    733  *
    734  * @v netdev		Network device
    735  */
    736 static void ifec_free ( struct net_device *netdev )
    737 {
    738 	struct ifec_private *priv = netdev_priv ( netdev );
    739 	int i;
    740 
    741 	DBGP ( "ifec_free\n" );
    742 
    743 	/* free all allocated receive io_buffers */
    744 	for ( i = 0; i < RFD_COUNT; i++ ) {
    745 		free_iob ( priv->rx_iobs[i] );
    746 		priv->rx_iobs[i] = NULL;
    747 		priv->rfds[i] = NULL;
    748 	}
    749 
    750 	/* free TX ring buffer */
    751 	free_dma ( priv->tcbs, TX_RING_BYTES );
    752 
    753 	priv->tcbs = NULL;
    754 }
    755 
    756 /*
    757  * Initializes an RFD.
    758  *
    759  * @v rfd    		RFD struct to initialize
    760  * @v command		Command word
    761  * @v link   		Link value
    762  */
    763 static void ifec_rfd_init ( struct ifec_rfd *rfd, s16 command, u32 link )
    764 {
    765 	DBGP ( "ifec_rfd_init\n" );
    766 
    767 	rfd->status      = 0;
    768 	rfd->command     = command;
    769 	rfd->rx_buf_addr = 0xFFFFFFFF;
    770 	rfd->count       = 0;
    771 	rfd->size        = RFD_PACKET_LEN;
    772 	rfd->link        = link;
    773 }
    774 
    775 /*
    776  * Send address of new RFD to card
    777  *
    778  * @v netdev		Network device
    779  */
    780 static void ifec_reprime_ru ( struct net_device *netdev )
    781 {
    782 	struct ifec_private *priv = netdev->priv;
    783 	int cur_rx = priv->cur_rx;
    784 
    785 	DBGP ( "ifec_reprime_ru\n" );
    786 
    787 	if ( priv->rfds[cur_rx] != NULL ) {
    788 		ifec_scb_cmd ( netdev, virt_to_bus ( priv->rfds[cur_rx] ),
    789 			       RUStart );
    790 		ifec_scb_cmd_wait ( netdev );
    791 	}
    792 }
    793 
    794 /*
    795  * Check if reprime of RU needed
    796  *
    797  * @v netdev		Network device
    798  */
    799 static void ifec_check_ru_status ( struct net_device *netdev,
    800 				   unsigned short intr_status )
    801 {
    802 	struct ifec_private *priv = netdev->priv;
    803 
    804 	DBGP ( "ifec_check_ru_status\n" );
    805 
    806 	/*
    807 	* The chip may have suspended reception for various reasons.
    808 	* Check for that, and re-prime it should this be the case.
    809 	*/
    810 	switch ( ( intr_status >> 2 ) & 0xf ) {
    811 		case 0:  /* Idle */
    812 		case 4:  /* Ready */
    813 			break;
    814 		case 1:  /* Suspended */
    815 		case 2:  /* No resources (RFDs) */
    816 		case 9:  /* Suspended with no more RBDs */
    817 		case 10: /* No resources due to no RBDs */
    818 		case 12: /* Ready with no RBDs */
    819 			DBG ( "ifec_net_poll: RU reprimed.\n" );
    820 			ifec_reprime_ru ( netdev );
    821 			break;
    822 		default:
    823 			/* reserved values */
    824 			DBG ( "ifec_net_poll: RU state anomaly: %i\n",
    825 			      ( inw ( priv->ioaddr + SCBStatus ) >> 2 ) & 0xf );
    826 			break;
    827 	}
    828 }
    829 
    830 #define RFD_STATUS ( RFD_OK | RFDRxCol | RFDRxErr | RFDShort | \
    831 		     RFDDMAOverrun | RFDNoBufs | RFDCRCError )
    832 /*
    833  * Looks for received packets in the rx ring, reports success or error to
    834  * the core accordingly. Starts reallocation of rx ring.
    835  *
    836  * @v netdev		Network device
    837  */
    838 static void ifec_rx_process ( struct net_device *netdev )
    839 {
    840 	struct ifec_private *priv   = netdev->priv;
    841 	int cur_rx = priv->cur_rx;
    842 	struct io_buffer *iob = priv->rx_iobs[cur_rx];
    843 	struct ifec_rfd *rfd = priv->rfds[cur_rx];
    844 	unsigned int rx_len;
    845 	s16 status;
    846 
    847 	DBGP ( "ifec_rx_process\n" );
    848 
    849 	/* Process any received packets */
    850 	while ( iob && rfd && ( status = rfd->status ) ) {
    851 		rx_len = rfd->count & RFDMaskCount;
    852 
    853 		DBG2 ( "Got a packet: Len = %d, cur_rx = %d.\n", rx_len,
    854 		       cur_rx );
    855 		DBGIO_HD ( (void*)rfd->packet, 0x30 );
    856 
    857 		if ( ( status & RFD_STATUS ) != RFD_OK ) {
    858 			DBG ( "Corrupted packet received. "
    859 			      "Status = %#08hx\n", status );
    860 			netdev_rx_err ( netdev, iob, -EINVAL );
    861 		} else {
    862 			/* Hand off the packet to the network subsystem */
    863 			iob_put ( iob, rx_len );
    864 			DBG2 ( "Received packet: %p, len: %d\n", iob, rx_len );
    865 			netdev_rx ( netdev, iob );
    866 		}
    867 
    868 		/* make sure we don't reuse this RFD */
    869 		priv->rx_iobs[cur_rx] = NULL;
    870 		priv->rfds[cur_rx] = NULL;
    871 
    872 		/* Next RFD */
    873 		priv->cur_rx = ( cur_rx + 1 ) % RFD_COUNT;
    874 		cur_rx = priv->cur_rx;
    875 		iob = priv->rx_iobs[cur_rx];
    876 		rfd = priv->rfds[cur_rx];
    877 	}
    878 
    879 	ifec_refill_rx_ring ( netdev );
    880 }
    881 
    882 /*
    883  * Allocates io_buffer, set pointers in ifec_private structure accordingly,
    884  * reserves space for RFD header in io_buffer.
    885  *
    886  * @v netdev		Network device
    887  * @v cur		Descriptor number to work on
    888  * @v cmd		Value to set cmd field in RFD to
    889  * @v link		Pointer to ned RFD
    890  * @ret rc		0 on success, negative on failure
    891  */
    892 static int ifec_get_rx_desc ( struct net_device *netdev, int cur, int cmd,
    893 			      int link )
    894 {
    895 	struct ifec_private *priv = netdev->priv;
    896 	struct ifec_rfd *rfd  = priv->rfds[cur];
    897 
    898 	DBGP ( "ifec_get_rx_desc\n" );
    899 
    900 	priv->rx_iobs[cur] = alloc_iob ( sizeof ( *rfd ) );
    901 	if ( ! priv->rx_iobs[cur] ) {
    902 		DBG ( "alloc_iob failed. desc. nr: %d\n", cur );
    903 		priv->rfds[cur] = NULL;
    904 		return -ENOMEM;
    905 	}
    906 
    907 	/* Initialize new tail. */
    908 	priv->rfds[cur] = priv->rx_iobs[cur]->data;
    909 	ifec_rfd_init ( priv->rfds[cur], cmd, link );
    910 	iob_reserve ( priv->rx_iobs[cur], RFD_HEADER_LEN );
    911 
    912 	return 0;
    913 }
    914 
    915 /*
    916  * Allocate new descriptor entries and initialize them if needed
    917  *
    918  * @v netdev		Network device
    919  */
    920 static void ifec_refill_rx_ring ( struct net_device *netdev )
    921 {
    922 	struct ifec_private *priv = netdev->priv;
    923 	int i, cur_rx;
    924 	unsigned short intr_status;
    925 
    926 	DBGP ( "ifec_refill_rx_ring\n" );
    927 
    928 	for ( i = 0; i < RFD_COUNT; i++ ) {
    929 		cur_rx = ( priv->cur_rx + i ) % RFD_COUNT;
    930 		/* only refill if empty */
    931 		if ( priv->rfds[cur_rx] != NULL ||
    932 		     priv->rx_iobs[cur_rx] != NULL )
    933 			continue;
    934 
    935 		DBG2 ( "refilling RFD %d\n", cur_rx );
    936 
    937 		if ( ifec_get_rx_desc ( netdev, cur_rx,
    938 		     CmdSuspend | CmdEndOfList, 0 ) == 0 ) {
    939 			if ( i > 0 ) {
    940 				int prev_rx = ( ( ( cur_rx + RFD_COUNT ) - 1 )
    941 						% RFD_COUNT );
    942 				struct ifec_rfd *rfd = priv->rfds[prev_rx];
    943 
    944 				rfd->command = 0;
    945 				rfd->link = virt_to_bus ( priv->rfds[cur_rx] );
    946 			}
    947 		}
    948 	}
    949 
    950 	intr_status = inw ( priv->ioaddr + SCBStatus );
    951 	ifec_check_ru_status ( netdev, intr_status );
    952 }
    953 
    954 /*
    955  * Initial allocation & initialization of the rx ring.
    956  *
    957  * @v netdev  		Device of rx ring.
    958  * @ret rc    		Non-zero if error occured
    959  */
    960 static int ifec_rx_setup ( struct net_device *netdev )
    961 {
    962 	struct ifec_private *priv = netdev->priv;
    963 	int i;
    964 
    965 	DBGP ( "ifec_rx_setup\n" );
    966 
    967 	priv->cur_rx = 0;
    968 
    969 	/* init values for ifec_refill_rx_ring() */
    970 	for ( i = 0; i < RFD_COUNT; i++ ) {
    971 		priv->rfds[i] = NULL;
    972 		priv->rx_iobs[i] = NULL;
    973 	}
    974 	ifec_refill_rx_ring ( netdev );
    975 
    976 	return 0;
    977 }
    978 
    979 /*
    980  * Initiates a SCB command.
    981  *
    982  * @v netdev		Network device
    983  * @v ptr   		General pointer value for command.
    984  * @v cmd   		Command to issue.
    985  * @ret rc  		Non-zero if command not issued.
    986  */
    987 static int ifec_scb_cmd ( struct net_device *netdev, u32 ptr, u8 cmd )
    988 {
    989 	struct ifec_private *priv = netdev->priv;
    990 	unsigned long ioaddr = priv->ioaddr;
    991 	int rc;
    992 
    993 	DBGP ( "ifec_scb_cmd\n" );
    994 
    995 	rc = ifec_scb_cmd_wait ( netdev );	/* Wait until ready */
    996 	if ( !rc ) {
    997 		outl ( ptr, ioaddr + SCBPointer );
    998 		outb ( cmd, ioaddr + SCBCmd );		/* Issue command */
    999 	}
   1000 	return rc;
   1001 }
   1002 
   1003 /*
   1004  * Wait for command unit to accept a command.
   1005  *
   1006  * @v cmd_ioaddr	I/O address of command register.
   1007  * @ret rc      	Non-zero if command timed out.
   1008  */
   1009 static int ifec_scb_cmd_wait ( struct net_device *netdev )
   1010 {
   1011 	struct ifec_private *priv = netdev->priv;
   1012 	unsigned long cmd_ioaddr = priv->ioaddr + SCBCmd;
   1013 	int rc, wait = CU_CMD_TIMEOUT;
   1014 
   1015 	DBGP ( "ifec_scb_cmd_wait\n" );
   1016 
   1017 	for ( ; wait && ( rc = inb ( cmd_ioaddr ) ); wait-- )
   1018 		udelay ( 1 );
   1019 
   1020 	if ( !wait )
   1021 		DBG ( "ifec_scb_cmd_wait timeout!\n" );
   1022 	return rc;
   1023 }
   1024 
   1025 /*
   1026  * Check status of transmitted packets & perform tx completions.
   1027  *
   1028  * @v netdev    	Network device.
   1029  */
   1030 static void ifec_tx_process ( struct net_device *netdev )
   1031 {
   1032 	struct ifec_private *priv = netdev->priv;
   1033 	struct ifec_tcb *tcb = priv->tcb_tail;
   1034 	s16 status;
   1035 
   1036 	DBGP ( "ifec_tx_process\n" );
   1037 
   1038 	/* Check status of transmitted packets */
   1039 	while ( ( status = tcb->status ) && tcb->iob ) {
   1040 		if ( status & TCB_U ) {
   1041 			/* report error to gPXE */
   1042 			DBG ( "ifec_tx_process : tx error!\n " );
   1043 			netdev_tx_complete_err ( netdev, tcb->iob, -EINVAL );
   1044 		} else {
   1045 			/* report successful transmit */
   1046 			netdev_tx_complete ( netdev, tcb->iob );
   1047 		}
   1048 		DBG2 ( "tx completion\n" );
   1049 
   1050 		tcb->iob = NULL;
   1051 		tcb->status = 0;
   1052 
   1053 		priv->tcb_tail = tcb->next;	/* Next TCB */
   1054 		tcb = tcb->next;
   1055 	}
   1056 }
   1057 
   1058 /*
   1059  * Allocates & initialize tx resources.
   1060  *
   1061  * @v netdev    	Network device.
   1062  * @ret rc      	Non-zero if error occurred.
   1063  */
   1064 static int ifec_tx_setup ( struct net_device *netdev )
   1065 {
   1066 	struct ifec_private *priv = netdev->priv;
   1067 	struct ifec_tcb *tcb;
   1068 	int i;
   1069 
   1070 	DBGP ( "ifec_tx_setup\n" );
   1071 
   1072 	/* allocate tx ring */
   1073 	priv->tcbs = malloc_dma ( TX_RING_BYTES, CB_ALIGN );
   1074 	if ( !priv->tcbs ) {
   1075 		DBG ( "TX-ring allocation failed\n" );
   1076 		return -ENOMEM;
   1077 	}
   1078 
   1079 	tcb = priv->tcb_tail = priv->tcbs;
   1080 	priv->tx_curr = priv->tx_tail = 0;
   1081 	priv->tx_cnt = 0;
   1082 
   1083 	for ( i = 0; i < TCB_COUNT; i++, tcb++ ) {
   1084 		tcb->status    = 0;
   1085 		tcb->count     = 0x01208000;
   1086 		tcb->iob       = NULL;
   1087 		tcb->tbda_addr = virt_to_bus ( &tcb->tbd_addr0 );
   1088 		tcb->link      = virt_to_bus ( tcb + 1 );
   1089 		tcb->next      = tcb + 1;
   1090 	}
   1091 	/* We point tcb_head at the last TCB, so the first ifec_net_transmit()
   1092 	 * will use the first (head->next) TCB to transmit. */
   1093 	priv->tcb_head = --tcb;
   1094 	tcb->link = virt_to_bus ( priv->tcbs );
   1095 	tcb->next = priv->tcbs;
   1096 
   1097 	return 0;
   1098 }
   1099 
   1100 /*
   1101  * Wake up the Command Unit and issue a Resume/Start.
   1102  *
   1103  * @v netdev		Network device containing Command Unit
   1104  *
   1105  * The time between clearing the S bit and issuing Resume must be as short as
   1106  * possible to prevent a race condition. As noted in linux eepro100.c :
   1107  *   Note: Watch out for the potential race condition here: imagine
   1108  *	erasing the previous suspend
   1109  *		the chip processes the previous command
   1110  *		the chip processes the final command, and suspends
   1111  *	doing the CU_RESUME
   1112  *		the chip processes the next-yet-valid post-final-command.
   1113  *   So blindly sending a CU_RESUME is only safe if we do it immediately after
   1114  *   erasing the previous CmdSuspend, without the possibility of an intervening
   1115  *   delay.
   1116  */
   1117 void ifec_tx_wake ( struct net_device *netdev )
   1118 {
   1119 	struct ifec_private *priv = netdev->priv;
   1120 	unsigned long ioaddr = priv->ioaddr;
   1121 	struct ifec_tcb *tcb = priv->tcb_head->next;
   1122 
   1123 	DBGP ( "ifec_tx_wake\n" );
   1124 
   1125 	/* For the special case of the first transmit, we issue a START. The
   1126 	 * card won't RESUME after the configure command. */
   1127 	if ( priv->configured ) {
   1128 		priv->configured = 0;
   1129 		ifec_scb_cmd ( netdev, virt_to_bus ( tcb ), CUStart );
   1130 		ifec_scb_cmd_wait ( netdev );
   1131 		return;
   1132 	}
   1133 
   1134 	/* Resume if suspended. */
   1135 	switch ( ( inw ( ioaddr + SCBStatus ) >> 6 ) & 0x3 ) {
   1136 	case 0:  /* Idle - We should not reach this state. */
   1137 		DBG2 ( "ifec_tx_wake: tx idle!\n" );
   1138 		ifec_scb_cmd ( netdev, virt_to_bus ( tcb ), CUStart );
   1139 		ifec_scb_cmd_wait ( netdev );
   1140 		return;
   1141 	case 1:  /* Suspended */
   1142 		DBG2 ( "s" );
   1143 		break;
   1144 	default: /* Active */
   1145 		DBG2 ( "a" );
   1146 	}
   1147 	ifec_scb_cmd_wait ( netdev );
   1148 	outl ( 0, ioaddr + SCBPointer );
   1149 	priv->tcb_head->command &= ~CmdSuspend;
   1150 	/* Immediately issue Resume command */
   1151 	outb ( CUResume, ioaddr + SCBCmd );
   1152 	ifec_scb_cmd_wait ( netdev );
   1153 }
   1154 
   1155 /*********************************************************************/
   1156 
   1157 static struct pci_device_id ifec_nics[] = {
   1158 PCI_ROM(0x8086, 0x1029, "id1029",        "Intel EtherExpressPro100 ID1029", 0),
   1159 PCI_ROM(0x8086, 0x1030, "id1030",        "Intel EtherExpressPro100 ID1030", 0),
   1160 PCI_ROM(0x8086, 0x1031, "82801cam",      "Intel 82801CAM (ICH3) Chipset Ethernet Controller", 0),
   1161 PCI_ROM(0x8086, 0x1032, "eepro100-1032", "Intel PRO/100 VE Network Connection", 0),
   1162 PCI_ROM(0x8086, 0x1033, "eepro100-1033", "Intel PRO/100 VM Network Connection", 0),
   1163 PCI_ROM(0x8086, 0x1034, "eepro100-1034", "Intel PRO/100 VM Network Connection", 0),
   1164 PCI_ROM(0x8086, 0x1035, "eepro100-1035", "Intel 82801CAM (ICH3) Chipset Ethernet Controller", 0),
   1165 PCI_ROM(0x8086, 0x1036, "eepro100-1036", "Intel 82801CAM (ICH3) Chipset Ethernet Controller", 0),
   1166 PCI_ROM(0x8086, 0x1037, "eepro100-1037", "Intel 82801CAM (ICH3) Chipset Ethernet Controller", 0),
   1167 PCI_ROM(0x8086, 0x1038, "id1038",        "Intel PRO/100 VM Network Connection", 0),
   1168 PCI_ROM(0x8086, 0x1039, "82562et",       "Intel PRO100 VE 82562ET", 0),
   1169 PCI_ROM(0x8086, 0x103a, "id103a",        "Intel Corporation 82559 InBusiness 10/100", 0),
   1170 PCI_ROM(0x8086, 0x103b, "82562etb",      "Intel PRO100 VE 82562ETB", 0),
   1171 PCI_ROM(0x8086, 0x103c, "eepro100-103c", "Intel PRO/100 VM Network Connection", 0),
   1172 PCI_ROM(0x8086, 0x103d, "eepro100-103d", "Intel PRO/100 VE Network Connection", 0),
   1173 PCI_ROM(0x8086, 0x103e, "eepro100-103e", "Intel PRO/100 VM Network Connection", 0),
   1174 PCI_ROM(0x8086, 0x1051, "prove",         "Intel PRO/100 VE Network Connection", 0),
   1175 PCI_ROM(0x8086, 0x1059, "82551qm",       "Intel PRO/100 M Mobile Connection", 0),
   1176 PCI_ROM(0x8086, 0x1209, "82559er",       "Intel EtherExpressPro100 82559ER", 0),
   1177 PCI_ROM(0x8086, 0x1227, "82865",         "Intel 82865 EtherExpress PRO/100A", 0),
   1178 PCI_ROM(0x8086, 0x1228, "82556",         "Intel 82556 EtherExpress PRO/100 Smart", 0),
   1179 PCI_ROM(0x8086, 0x1229, "eepro100",      "Intel EtherExpressPro100", 0),
   1180 PCI_ROM(0x8086, 0x2449, "82562em",       "Intel EtherExpressPro100 82562EM", 0),
   1181 PCI_ROM(0x8086, 0x2459, "82562-1",       "Intel 82562 based Fast Ethernet Connection", 0),
   1182 PCI_ROM(0x8086, 0x245d, "82562-2",       "Intel 82562 based Fast Ethernet Connection", 0),
   1183 PCI_ROM(0x8086, 0x1050, "82562ez",       "Intel 82562EZ Network Connection", 0),
   1184 PCI_ROM(0x8086, 0x1051, "eepro100-1051", "Intel 82801EB/ER (ICH5/ICH5R) Chipset Ethernet Controller", 0),
   1185 PCI_ROM(0x8086, 0x1065, "82562-3",       "Intel 82562 based Fast Ethernet Connection", 0),
   1186 PCI_ROM(0x8086, 0x5200, "eepro100-5200", "Intel EtherExpress PRO/100 Intelligent Server", 0),
   1187 PCI_ROM(0x8086, 0x5201, "eepro100-5201", "Intel EtherExpress PRO/100 Intelligent Server", 0),
   1188 };
   1189 
   1190 /* Cards with device ids 0x1030 to 0x103F, 0x2449, 0x2459 or 0x245D might need
   1191  * a workaround for hardware bug on 10 mbit half duplex (see linux driver eepro100.c)
   1192  * 2003/03/17 gbaum */
   1193 
   1194 struct pci_driver ifec_driver __pci_driver = {
   1195 	.ids      = ifec_nics,
   1196 	.id_count = ( sizeof (ifec_nics) / sizeof (ifec_nics[0]) ),
   1197 	.probe    = ifec_pci_probe,
   1198 	.remove   = ifec_pci_remove
   1199 };
   1200 
   1201 /*
   1202  * Local variables:
   1203  *  c-basic-offset: 8
   1204  *  c-indent-level: 8
   1205  *  tab-width: 8
   1206  * End:
   1207  */
   1208