aboutsummaryrefslogtreecommitdiffstats
path: root/gpxe/src/drivers/net/e1000/e1000.c
diff options
context:
space:
mode:
Diffstat (limited to 'gpxe/src/drivers/net/e1000/e1000.c')
-rw-r--r--gpxe/src/drivers/net/e1000/e1000.c392
1 files changed, 231 insertions, 161 deletions
diff --git a/gpxe/src/drivers/net/e1000/e1000.c b/gpxe/src/drivers/net/e1000/e1000.c
index c1a4a52d..8e8c697f 100644
--- a/gpxe/src/drivers/net/e1000/e1000.c
+++ b/gpxe/src/drivers/net/e1000/e1000.c
@@ -41,6 +41,8 @@
*******************************************************************************/
+FILE_LICENCE ( GPL2_ONLY );
+
#include "e1000.h"
/**
@@ -71,6 +73,7 @@ e1000_get_hw_control ( struct e1000_adapter *adapter )
break;
case e1000_82571:
case e1000_82572:
+ case e1000_82576:
case e1000_80003es2lan:
case e1000_ich8lan:
ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);
@@ -90,8 +93,7 @@ e1000_get_hw_control ( struct e1000_adapter *adapter )
static void
e1000_irq_enable ( struct e1000_adapter *adapter )
{
- E1000_WRITE_REG ( &adapter->hw, IMS, E1000_IMS_RXDMT0 |
- E1000_IMS_RXSEQ );
+ E1000_WRITE_REG ( &adapter->hw, IMS, IMS_ENABLE_MASK );
E1000_WRITE_FLUSH ( &adapter->hw );
}
@@ -108,18 +110,6 @@ e1000_irq_disable ( struct e1000_adapter *adapter )
}
/**
- * e1000_irq_force - trigger interrupt
- *
- * @v adapter e1000 private structure
- **/
-static void
-e1000_irq_force ( struct e1000_adapter *adapter )
-{
- E1000_WRITE_REG ( &adapter->hw, ICS, E1000_ICS_RXDMT0 );
- E1000_WRITE_FLUSH ( &adapter->hw );
-}
-
-/**
* e1000_sw_init - Initialize general software structures (struct e1000_adapter)
*
* @v adapter e1000 private structure
@@ -251,6 +241,7 @@ e1000_configure_tx ( struct e1000_adapter *adapter )
{
struct e1000_hw *hw = &adapter->hw;
uint32_t tctl;
+ uint32_t txdctl;
DBG ( "e1000_configure_tx\n" );
@@ -269,6 +260,12 @@ e1000_configure_tx ( struct e1000_adapter *adapter )
adapter->tx_tail = 0;
adapter->tx_fill_ctr = 0;
+ if (hw->mac_type == e1000_82576) {
+ txdctl = E1000_READ_REG ( hw, TXDCTL );
+ txdctl |= E1000_TXDCTL_QUEUE_ENABLE;
+ E1000_WRITE_REG ( hw, TXDCTL, txdctl );
+ }
+
/* Setup Transmit Descriptor Settings for eop descriptor */
tctl = E1000_TCTL_PSP | E1000_TCTL_EN |
(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT) |
@@ -280,6 +277,65 @@ e1000_configure_tx ( struct e1000_adapter *adapter )
E1000_WRITE_FLUSH ( hw );
}
+static void
+e1000_free_rx_resources ( struct e1000_adapter *adapter )
+{
+ int i;
+
+ DBG ( "e1000_free_rx_resources\n" );
+
+ free_dma ( adapter->rx_base, adapter->rx_ring_size );
+
+ for ( i = 0; i < NUM_RX_DESC; i++ ) {
+ free_iob ( adapter->rx_iobuf[i] );
+ }
+}
+
+/**
+ * e1000_refill_rx_ring - allocate Rx io_buffers
+ *
+ * @v adapter e1000 private structure
+ *
+ * @ret rc Returns 0 on success, negative on failure
+ **/
+int e1000_refill_rx_ring ( struct e1000_adapter *adapter )
+{
+ int i, rx_curr;
+ int rc = 0;
+ struct e1000_rx_desc *rx_curr_desc;
+ struct e1000_hw *hw = &adapter->hw;
+ struct io_buffer *iob;
+
+ DBG ("e1000_refill_rx_ring\n");
+
+ for ( i = 0; i < NUM_RX_DESC; i++ ) {
+ rx_curr = ( ( adapter->rx_curr + i ) % NUM_RX_DESC );
+ rx_curr_desc = adapter->rx_base + rx_curr;
+
+ if ( rx_curr_desc->status & E1000_RXD_STAT_DD )
+ continue;
+
+ if ( adapter->rx_iobuf[rx_curr] != NULL )
+ continue;
+
+ DBG2 ( "Refilling rx desc %d\n", rx_curr );
+
+ iob = alloc_iob ( MAXIMUM_ETHERNET_VLAN_SIZE );
+ adapter->rx_iobuf[rx_curr] = iob;
+
+ if ( ! iob ) {
+ DBG ( "alloc_iob failed\n" );
+ rc = -ENOMEM;
+ break;
+ } else {
+ rx_curr_desc->buffer_addr = virt_to_bus ( iob->data );
+
+ E1000_WRITE_REG ( hw, RDT, rx_curr );
+ }
+ }
+ return rc;
+}
+
/**
* e1000_setup_rx_resources - allocate Rx resources (Descriptors)
*
@@ -290,8 +346,7 @@ e1000_configure_tx ( struct e1000_adapter *adapter )
static int
e1000_setup_rx_resources ( struct e1000_adapter *adapter )
{
- int i, j;
- struct e1000_rx_desc *rx_curr_desc;
+ int i, rc = 0;
DBG ( "e1000_setup_rx_resources\n" );
@@ -301,50 +356,23 @@ e1000_setup_rx_resources ( struct e1000_adapter *adapter )
adapter->rx_base =
malloc_dma ( adapter->rx_ring_size, adapter->rx_ring_size );
-
+
if ( ! adapter->rx_base ) {
return -ENOMEM;
}
memset ( adapter->rx_base, 0, adapter->rx_ring_size );
for ( i = 0; i < NUM_RX_DESC; i++ ) {
-
- adapter->rx_iobuf[i] = alloc_iob ( MAXIMUM_ETHERNET_VLAN_SIZE );
-
- /* If unable to allocate all iobufs, free any that
- * were successfully allocated, and return an error
- */
- if ( ! adapter->rx_iobuf[i] ) {
- for ( j = 0; j < i; j++ ) {
- free_iob ( adapter->rx_iobuf[j] );
- }
- return -ENOMEM;
- }
-
- rx_curr_desc = ( void * ) ( adapter->rx_base ) +
- ( i * sizeof ( *adapter->rx_base ) );
-
- rx_curr_desc->buffer_addr = virt_to_bus ( adapter->rx_iobuf[i]->data );
-
- DBG ( "i = %d rx_curr_desc->buffer_addr = %#16llx\n",
- i, rx_curr_desc->buffer_addr );
-
- }
- return 0;
-}
-
-static void
-e1000_free_rx_resources ( struct e1000_adapter *adapter )
-{
- int i;
-
- DBG ( "e1000_free_rx_resources\n" );
+ /* let e1000_refill_rx_ring() io_buffer allocations */
+ adapter->rx_iobuf[i] = NULL;
+ }
- free_dma ( adapter->rx_base, adapter->rx_ring_size );
+ /* allocate io_buffers */
+ rc = e1000_refill_rx_ring ( adapter );
+ if ( rc < 0 )
+ e1000_free_rx_resources ( adapter );
- for ( i = 0; i < NUM_RX_DESC; i++ ) {
- free_iob ( adapter->rx_iobuf[i] );
- }
+ return rc;
}
/**
@@ -357,13 +385,15 @@ static void
e1000_configure_rx ( struct e1000_adapter *adapter )
{
struct e1000_hw *hw = &adapter->hw;
- uint32_t rctl;
+ uint32_t rctl, rxdctl, mrqc, rxcsum;
DBG ( "e1000_configure_rx\n" );
/* disable receives while setting up the descriptors */
rctl = E1000_READ_REG ( hw, RCTL );
E1000_WRITE_REG ( hw, RCTL, rctl & ~E1000_RCTL_EN );
+ E1000_WRITE_FLUSH ( hw );
+ mdelay(10);
adapter->rx_curr = 0;
@@ -375,16 +405,57 @@ e1000_configure_rx ( struct e1000_adapter *adapter )
E1000_WRITE_REG ( hw, RDLEN, adapter->rx_ring_size );
E1000_WRITE_REG ( hw, RDH, 0 );
- E1000_WRITE_REG ( hw, RDT, NUM_RX_DESC - 1 );
-
- /* Enable Receives */
- rctl = ( E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 |
- E1000_RCTL_MPE
- );
+ if (hw->mac_type == e1000_82576)
+ E1000_WRITE_REG ( hw, RDT, 0 );
+ else
+ E1000_WRITE_REG ( hw, RDT, NUM_RX_DESC - 1 );
+
+ /* This doesn't seem to be necessary for correct operation,
+ * but it seems as well to be implicit
+ */
+ if (hw->mac_type == e1000_82576) {
+ rxdctl = E1000_READ_REG ( hw, RXDCTL );
+ rxdctl |= E1000_RXDCTL_QUEUE_ENABLE;
+ rxdctl &= 0xFFF00000;
+ rxdctl |= IGB_RX_PTHRESH;
+ rxdctl |= IGB_RX_HTHRESH << 8;
+ rxdctl |= IGB_RX_WTHRESH << 16;
+ E1000_WRITE_REG ( hw, RXDCTL, rxdctl );
+ E1000_WRITE_FLUSH ( hw );
+
+ rxcsum = E1000_READ_REG(hw, RXCSUM);
+ rxcsum &= ~( E1000_RXCSUM_TUOFL | E1000_RXCSUM_IPPCSE );
+ E1000_WRITE_REG ( hw, RXCSUM, 0 );
+
+ /* The initial value for MRQC disables multiple receive
+ * queues, however this setting is not recommended.
+ * - IntelĀ® 82576 Gigabit Ethernet Controller Datasheet r2.41
+ * Section 8.10.9 Multiple Queues Command Register - MRQC
+ */
+ mrqc = E1000_MRQC_ENABLE_VMDQ;
+ E1000_WRITE_REG ( hw, MRQC, mrqc );
+ }
+ /* Enable Receives */
+ rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 |
+ E1000_RCTL_MPE;
E1000_WRITE_REG ( hw, RCTL, rctl );
E1000_WRITE_FLUSH ( hw );
+ /* On the 82576, RDT([0]) must not be "bumped" before
+ * the enable bit of RXDCTL([0]) is set.
+ * - IntelĀ® 82576 Gigabit Ethernet Controller Datasheet r2.41
+ * Section 4.5.9 receive Initialization
+ *
+ * By observation I have found to occur when the enable bit of
+ * RCTL is set. The datasheet recommends polling for this bit,
+ * however as I see no evidence of this in the Linux igb driver
+ * I have omitted that step.
+ * - Simon Horman, May 2009
+ */
+ if (hw->mac_type == e1000_82576)
+ E1000_WRITE_REG ( hw, RDT, NUM_RX_DESC - 1 );
+
DBG ( "RDBAL: %#08x\n", E1000_READ_REG ( hw, RDBAL ) );
DBG ( "RDLEN: %d\n", E1000_READ_REG ( hw, RDLEN ) );
DBG ( "RCTL: %#08x\n", E1000_READ_REG ( hw, RCTL ) );
@@ -431,6 +502,9 @@ e1000_reset ( struct e1000_adapter *adapter )
case e1000_82573:
pba = E1000_PBA_20K;
break;
+ case e1000_82576:
+ pba = E1000_PBA_64K;
+ break;
case e1000_ich8lan:
pba = E1000_PBA_8K;
case e1000_undefined:
@@ -444,6 +518,7 @@ e1000_reset ( struct e1000_adapter *adapter )
/* Set the FC high water mark to 90% of the FIFO size.
* Required to clear last 3 LSB */
fc_high_water_mark = ((pba * 9216)/10) & 0xFFF8;
+
/* We can't use 90% on small FIFOs because the remainder
* would be less than 1 full frame. In this case, we size
* it to allow at least a full frame above the high water
@@ -451,9 +526,20 @@ e1000_reset ( struct e1000_adapter *adapter )
if (pba < E1000_PBA_16K)
fc_high_water_mark = (pba * 1024) - 1600;
- adapter->hw.fc_high_water = fc_high_water_mark;
- adapter->hw.fc_low_water = fc_high_water_mark - 8;
- if (adapter->hw.mac_type == e1000_80003es2lan)
+ /* This actually applies to < e1000_82575, one revision less than
+ * e1000_82576, but e1000_82575 isn't currently defined in the code */
+ if (adapter->hw.mac_type < e1000_82576) {
+ /* 8-byte granularity */
+ adapter->hw.fc_high_water = fc_high_water_mark & 0xFFF8;
+ adapter->hw.fc_low_water = adapter->hw.fc_high_water - 8;
+ } else {
+ /* 16-byte granularity */
+ adapter->hw.fc_high_water = fc_high_water_mark & 0xFFF0;
+ adapter->hw.fc_low_water = adapter->hw.fc_high_water - 16;
+ }
+
+ if (adapter->hw.mac_type == e1000_80003es2lan ||
+ adapter->hw.mac_type == e1000_82576)
adapter->hw.fc_pause_time = 0xFFFF;
else
adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME;
@@ -586,6 +672,7 @@ e1000_transmit ( struct net_device *netdev, struct io_buffer *iobuf )
/* Write new tail to NIC, making packet available for transmit
*/
+ wmb();
E1000_WRITE_REG ( hw, TDT, adapter->tx_tail );
return 0;
@@ -607,12 +694,10 @@ e1000_poll ( struct net_device *netdev )
uint32_t rx_status;
uint32_t rx_len;
uint32_t rx_err;
- struct io_buffer *rx_iob;
struct e1000_tx_desc *tx_curr_desc;
struct e1000_rx_desc *rx_curr_desc;
uint32_t i;
- uint64_t tmp_buffer_addr;
-
+
DBGP ( "e1000_poll\n" );
/* Acknowledge interrupts */
@@ -672,46 +757,37 @@ e1000_poll ( struct net_device *netdev )
if ( ! ( rx_status & E1000_RXD_STAT_DD ) )
break;
+ if ( adapter->rx_iobuf[i] == NULL )
+ break;
+
DBG ( "RCTL = %#08x\n", E1000_READ_REG ( &adapter->hw, RCTL ) );
rx_len = rx_curr_desc->length;
DBG ( "Received packet, rx_curr: %d rx_status: %#08x rx_len: %d\n",
i, rx_status, rx_len );
-
+
rx_err = rx_curr_desc->errors;
-
+
+ iob_put ( adapter->rx_iobuf[i], rx_len );
+
if ( rx_err & E1000_RXD_ERR_FRAME_ERR_MASK ) {
- netdev_rx_err ( netdev, NULL, -EINVAL );
+ netdev_rx_err ( netdev, adapter->rx_iobuf[i], -EINVAL );
DBG ( "e1000_poll: Corrupted packet received!"
" rx_err: %#08x\n", rx_err );
} else {
-
- /* If unable allocate space for this packet,
- * try again next poll
- */
- rx_iob = alloc_iob ( rx_len );
- if ( ! rx_iob )
- break;
-
- memcpy ( iob_put ( rx_iob, rx_len ),
- adapter->rx_iobuf[i]->data, rx_len );
-
- /* Add this packet to the receive queue.
- */
- netdev_rx ( netdev, rx_iob );
+ /* Add this packet to the receive queue. */
+ netdev_rx ( netdev, adapter->rx_iobuf[i] );
}
+ adapter->rx_iobuf[i] = NULL;
- tmp_buffer_addr = rx_curr_desc->buffer_addr;
memset ( rx_curr_desc, 0, sizeof ( *rx_curr_desc ) );
- rx_curr_desc->buffer_addr = tmp_buffer_addr;
-
- E1000_WRITE_REG ( hw, RDT, adapter->rx_curr );
adapter->rx_curr = ( adapter->rx_curr + 1 ) % NUM_RX_DESC;
}
-}
+ e1000_refill_rx_ring(adapter);
+}
/**
* e1000_irq - enable or Disable interrupts
@@ -725,18 +801,11 @@ e1000_irq ( struct net_device *netdev, int enable )
struct e1000_adapter *adapter = netdev_priv(netdev);
DBG ( "e1000_irq\n" );
-
- switch ( enable ) {
- case 0 :
- e1000_irq_disable ( adapter );
- break;
- case 1 :
+
+ if ( enable )
e1000_irq_enable ( adapter );
- break;
- case 2 :
- e1000_irq_force ( adapter );
- break;
- }
+ else
+ e1000_irq_disable ( adapter );
}
static struct net_device_operations e1000_operations;
@@ -850,7 +919,7 @@ e1000_probe ( struct pci_device *pdev,
if ( e1000_read_mac_addr ( &adapter->hw ) )
DBG ( "EEPROM Read Error\n" );
- memcpy ( netdev->ll_addr, adapter->hw.mac_addr, ETH_ALEN );
+ memcpy ( netdev->hw_addr, adapter->hw.mac_addr, ETH_ALEN );
/* print bus type/speed/width info */
{
@@ -1039,68 +1108,69 @@ e1000_io_write ( struct e1000_hw *hw __unused, unsigned long port, uint32_t val
}
static struct pci_device_id e1000_nics[] = {
- PCI_ROM(0x8086, 0x1000, "e1000-0x1000", "e1000-0x1000"),
- PCI_ROM(0x8086, 0x1001, "e1000-0x1001", "e1000-0x1001"),
- PCI_ROM(0x8086, 0x1004, "e1000-0x1004", "e1000-0x1004"),
- PCI_ROM(0x8086, 0x1008, "e1000-0x1008", "e1000-0x1008"),
- PCI_ROM(0x8086, 0x1009, "e1000-0x1009", "e1000-0x1009"),
- PCI_ROM(0x8086, 0x100c, "e1000-0x100c", "e1000-0x100c"),
- PCI_ROM(0x8086, 0x100d, "e1000-0x100d", "e1000-0x100d"),
- PCI_ROM(0x8086, 0x100e, "e1000-0x100e", "e1000-0x100e"),
- PCI_ROM(0x8086, 0x100f, "e1000-0x100f", "e1000-0x100f"),
- PCI_ROM(0x8086, 0x1010, "e1000-0x1010", "e1000-0x1010"),
- PCI_ROM(0x8086, 0x1011, "e1000-0x1011", "e1000-0x1011"),
- PCI_ROM(0x8086, 0x1012, "e1000-0x1012", "e1000-0x1012"),
- PCI_ROM(0x8086, 0x1013, "e1000-0x1013", "e1000-0x1013"),
- PCI_ROM(0x8086, 0x1014, "e1000-0x1014", "e1000-0x1014"),
- PCI_ROM(0x8086, 0x1015, "e1000-0x1015", "e1000-0x1015"),
- PCI_ROM(0x8086, 0x1016, "e1000-0x1016", "e1000-0x1016"),
- PCI_ROM(0x8086, 0x1017, "e1000-0x1017", "e1000-0x1017"),
- PCI_ROM(0x8086, 0x1018, "e1000-0x1018", "e1000-0x1018"),
- PCI_ROM(0x8086, 0x1019, "e1000-0x1019", "e1000-0x1019"),
- PCI_ROM(0x8086, 0x101a, "e1000-0x101a", "e1000-0x101a"),
- PCI_ROM(0x8086, 0x101d, "e1000-0x101d", "e1000-0x101d"),
- PCI_ROM(0x8086, 0x101e, "e1000-0x101e", "e1000-0x101e"),
- PCI_ROM(0x8086, 0x1026, "e1000-0x1026", "e1000-0x1026"),
- PCI_ROM(0x8086, 0x1027, "e1000-0x1027", "e1000-0x1027"),
- PCI_ROM(0x8086, 0x1028, "e1000-0x1028", "e1000-0x1028"),
- PCI_ROM(0x8086, 0x1049, "e1000-0x1049", "e1000-0x1049"),
- PCI_ROM(0x8086, 0x104a, "e1000-0x104a", "e1000-0x104a"),
- PCI_ROM(0x8086, 0x104b, "e1000-0x104b", "e1000-0x104b"),
- PCI_ROM(0x8086, 0x104c, "e1000-0x104c", "e1000-0x104c"),
- PCI_ROM(0x8086, 0x104d, "e1000-0x104d", "e1000-0x104d"),
- PCI_ROM(0x8086, 0x105e, "e1000-0x105e", "e1000-0x105e"),
- PCI_ROM(0x8086, 0x105f, "e1000-0x105f", "e1000-0x105f"),
- PCI_ROM(0x8086, 0x1060, "e1000-0x1060", "e1000-0x1060"),
- PCI_ROM(0x8086, 0x1075, "e1000-0x1075", "e1000-0x1075"),
- PCI_ROM(0x8086, 0x1076, "e1000-0x1076", "e1000-0x1076"),
- PCI_ROM(0x8086, 0x1077, "e1000-0x1077", "e1000-0x1077"),
- PCI_ROM(0x8086, 0x1078, "e1000-0x1078", "e1000-0x1078"),
- PCI_ROM(0x8086, 0x1079, "e1000-0x1079", "e1000-0x1079"),
- PCI_ROM(0x8086, 0x107a, "e1000-0x107a", "e1000-0x107a"),
- PCI_ROM(0x8086, 0x107b, "e1000-0x107b", "e1000-0x107b"),
- PCI_ROM(0x8086, 0x107c, "e1000-0x107c", "e1000-0x107c"),
- PCI_ROM(0x8086, 0x107d, "e1000-0x107d", "e1000-0x107d"),
- PCI_ROM(0x8086, 0x107e, "e1000-0x107e", "e1000-0x107e"),
- PCI_ROM(0x8086, 0x107f, "e1000-0x107f", "e1000-0x107f"),
- PCI_ROM(0x8086, 0x108a, "e1000-0x108a", "e1000-0x108a"),
- PCI_ROM(0x8086, 0x108b, "e1000-0x108b", "e1000-0x108b"),
- PCI_ROM(0x8086, 0x108c, "e1000-0x108c", "e1000-0x108c"),
- PCI_ROM(0x8086, 0x1096, "e1000-0x1096", "e1000-0x1096"),
- PCI_ROM(0x8086, 0x1098, "e1000-0x1098", "e1000-0x1098"),
- PCI_ROM(0x8086, 0x1099, "e1000-0x1099", "e1000-0x1099"),
- PCI_ROM(0x8086, 0x109a, "e1000-0x109a", "e1000-0x109a"),
- PCI_ROM(0x8086, 0x10a4, "e1000-0x10a4", "e1000-0x10a4"),
- PCI_ROM(0x8086, 0x10a5, "e1000-0x10a5", "e1000-0x10a5"),
- PCI_ROM(0x8086, 0x10b5, "e1000-0x10b5", "e1000-0x10b5"),
- PCI_ROM(0x8086, 0x10b9, "e1000-0x10b9", "e1000-0x10b9"),
- PCI_ROM(0x8086, 0x10ba, "e1000-0x10ba", "e1000-0x10ba"),
- PCI_ROM(0x8086, 0x10bb, "e1000-0x10bb", "e1000-0x10bb"),
- PCI_ROM(0x8086, 0x10bc, "e1000-0x10bc", "e1000-0x10bc"),
- PCI_ROM(0x8086, 0x10c4, "e1000-0x10c4", "e1000-0x10c4"),
- PCI_ROM(0x8086, 0x10c5, "e1000-0x10c5", "e1000-0x10c5"),
- PCI_ROM(0x8086, 0x10d9, "e1000-0x10d9", "e1000-0x10d9"),
- PCI_ROM(0x8086, 0x10da, "e1000-0x10da", "e1000-0x10da"),
+ PCI_ROM(0x8086, 0x1000, "e1000-0x1000", "e1000-0x1000", 0),
+ PCI_ROM(0x8086, 0x1001, "e1000-0x1001", "e1000-0x1001", 0),
+ PCI_ROM(0x8086, 0x1004, "e1000-0x1004", "e1000-0x1004", 0),
+ PCI_ROM(0x8086, 0x1008, "e1000-0x1008", "e1000-0x1008", 0),
+ PCI_ROM(0x8086, 0x1009, "e1000-0x1009", "e1000-0x1009", 0),
+ PCI_ROM(0x8086, 0x100c, "e1000-0x100c", "e1000-0x100c", 0),
+ PCI_ROM(0x8086, 0x100d, "e1000-0x100d", "e1000-0x100d", 0),
+ PCI_ROM(0x8086, 0x100e, "e1000-0x100e", "e1000-0x100e", 0),
+ PCI_ROM(0x8086, 0x100f, "e1000-0x100f", "e1000-0x100f", 0),
+ PCI_ROM(0x8086, 0x1010, "e1000-0x1010", "e1000-0x1010", 0),
+ PCI_ROM(0x8086, 0x1011, "e1000-0x1011", "e1000-0x1011", 0),
+ PCI_ROM(0x8086, 0x1012, "e1000-0x1012", "e1000-0x1012", 0),
+ PCI_ROM(0x8086, 0x1013, "e1000-0x1013", "e1000-0x1013", 0),
+ PCI_ROM(0x8086, 0x1014, "e1000-0x1014", "e1000-0x1014", 0),
+ PCI_ROM(0x8086, 0x1015, "e1000-0x1015", "e1000-0x1015", 0),
+ PCI_ROM(0x8086, 0x1016, "e1000-0x1016", "e1000-0x1016", 0),
+ PCI_ROM(0x8086, 0x1017, "e1000-0x1017", "e1000-0x1017", 0),
+ PCI_ROM(0x8086, 0x1018, "e1000-0x1018", "e1000-0x1018", 0),
+ PCI_ROM(0x8086, 0x1019, "e1000-0x1019", "e1000-0x1019", 0),
+ PCI_ROM(0x8086, 0x101a, "e1000-0x101a", "e1000-0x101a", 0),
+ PCI_ROM(0x8086, 0x101d, "e1000-0x101d", "e1000-0x101d", 0),
+ PCI_ROM(0x8086, 0x101e, "e1000-0x101e", "e1000-0x101e", 0),
+ PCI_ROM(0x8086, 0x1026, "e1000-0x1026", "e1000-0x1026", 0),
+ PCI_ROM(0x8086, 0x1027, "e1000-0x1027", "e1000-0x1027", 0),
+ PCI_ROM(0x8086, 0x1028, "e1000-0x1028", "e1000-0x1028", 0),
+ PCI_ROM(0x8086, 0x1049, "e1000-0x1049", "e1000-0x1049", 0),
+ PCI_ROM(0x8086, 0x104a, "e1000-0x104a", "e1000-0x104a", 0),
+ PCI_ROM(0x8086, 0x104b, "e1000-0x104b", "e1000-0x104b", 0),
+ PCI_ROM(0x8086, 0x104c, "e1000-0x104c", "e1000-0x104c", 0),
+ PCI_ROM(0x8086, 0x104d, "e1000-0x104d", "e1000-0x104d", 0),
+ PCI_ROM(0x8086, 0x105e, "e1000-0x105e", "e1000-0x105e", 0),
+ PCI_ROM(0x8086, 0x105f, "e1000-0x105f", "e1000-0x105f", 0),
+ PCI_ROM(0x8086, 0x1060, "e1000-0x1060", "e1000-0x1060", 0),
+ PCI_ROM(0x8086, 0x1075, "e1000-0x1075", "e1000-0x1075", 0),
+ PCI_ROM(0x8086, 0x1076, "e1000-0x1076", "e1000-0x1076", 0),
+ PCI_ROM(0x8086, 0x1077, "e1000-0x1077", "e1000-0x1077", 0),
+ PCI_ROM(0x8086, 0x1078, "e1000-0x1078", "e1000-0x1078", 0),
+ PCI_ROM(0x8086, 0x1079, "e1000-0x1079", "e1000-0x1079", 0),
+ PCI_ROM(0x8086, 0x107a, "e1000-0x107a", "e1000-0x107a", 0),
+ PCI_ROM(0x8086, 0x107b, "e1000-0x107b", "e1000-0x107b", 0),
+ PCI_ROM(0x8086, 0x107c, "e1000-0x107c", "e1000-0x107c", 0),
+ PCI_ROM(0x8086, 0x107d, "e1000-0x107d", "e1000-0x107d", 0),
+ PCI_ROM(0x8086, 0x107e, "e1000-0x107e", "e1000-0x107e", 0),
+ PCI_ROM(0x8086, 0x107f, "e1000-0x107f", "e1000-0x107f", 0),
+ PCI_ROM(0x8086, 0x108a, "e1000-0x108a", "e1000-0x108a", 0),
+ PCI_ROM(0x8086, 0x108b, "e1000-0x108b", "e1000-0x108b", 0),
+ PCI_ROM(0x8086, 0x108c, "e1000-0x108c", "e1000-0x108c", 0),
+ PCI_ROM(0x8086, 0x1096, "e1000-0x1096", "e1000-0x1096", 0),
+ PCI_ROM(0x8086, 0x1098, "e1000-0x1098", "e1000-0x1098", 0),
+ PCI_ROM(0x8086, 0x1099, "e1000-0x1099", "e1000-0x1099", 0),
+ PCI_ROM(0x8086, 0x109a, "e1000-0x109a", "e1000-0x109a", 0),
+ PCI_ROM(0x8086, 0x10a4, "e1000-0x10a4", "e1000-0x10a4", 0),
+ PCI_ROM(0x8086, 0x10a5, "e1000-0x10a5", "e1000-0x10a5", 0),
+ PCI_ROM(0x8086, 0x10b5, "e1000-0x10b5", "e1000-0x10b5", 0),
+ PCI_ROM(0x8086, 0x10b9, "e1000-0x10b9", "e1000-0x10b9", 0),
+ PCI_ROM(0x8086, 0x10ba, "e1000-0x10ba", "e1000-0x10ba", 0),
+ PCI_ROM(0x8086, 0x10bb, "e1000-0x10bb", "e1000-0x10bb", 0),
+ PCI_ROM(0x8086, 0x10bc, "e1000-0x10bc", "e1000-0x10bc", 0),
+ PCI_ROM(0x8086, 0x10c4, "e1000-0x10c4", "e1000-0x10c4", 0),
+ PCI_ROM(0x8086, 0x10c5, "e1000-0x10c5", "e1000-0x10c5", 0),
+ PCI_ROM(0x8086, 0x10c9, "e1000-0x10c9", "e1000-0x10c9", 0),
+ PCI_ROM(0x8086, 0x10d9, "e1000-0x10d9", "e1000-0x10d9", 0),
+ PCI_ROM(0x8086, 0x10da, "e1000-0x10da", "e1000-0x10da", 0),
};
struct pci_driver e1000_driver __pci_driver = {