Thanks Brad, here is an updated version:
Index: if_em.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_em.c,v
retrieving revision 1.275
diff -u -p -r1.275 if_em.c
--- if_em.c 28 Dec 2013 03:34:54 -0000 1.275
+++ if_em.c 6 Feb 2014 21:00:48 -0000
@@ -144,6 +144,13 @@ const struct pci_matchid em_devices[] =
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_NF },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_NF },
+ { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_82567V_3 },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IFE },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IFE_G },
@@ -408,6 +415,8 @@ em_attach(struct device *parent, struct
case em_82575:
case em_82580:
case em_i350:
+ case em_i210:
+ case em_i211:
case em_ich9lan:
case em_ich10lan:
case em_80003es2lan:
@@ -475,7 +484,8 @@ em_attach(struct device *parent, struct
}
if (sc->hw.mac_type == em_80003es2lan || sc->hw.mac_type == em_82575 ||
- sc->hw.mac_type == em_82580 || sc->hw.mac_type == em_i350) {
+ sc->hw.mac_type == em_82580 || sc->hw.mac_type == em_i350 ||
+ sc->hw.mac_type == em_i210 || sc->hw.mac_type == em_i211 ) {
uint32_t reg = EM_READ_REG(&sc->hw, E1000_STATUS);
sc->hw.bus_func = (reg & E1000_STATUS_FUNC_MASK) >>
E1000_STATUS_FUNC_SHIFT;
@@ -776,6 +786,10 @@ em_init(void *arg)
case em_i350:
pba = E1000_PBA_32K; /* 32K for Rx, 16K for Tx */
break;
+ case em_i210:
+ case em_i211:
+ pba = E1000_PBA_34K;
+ break;
case em_82573: /* 82573: Total Packet Buffer is 32K */
/* Jumbo frames not supported */
pba = E1000_PBA_12K; /* 12K for Rx, 20K for Tx */
@@ -1119,7 +1133,8 @@ em_encap(struct em_softc *sc, struct mbu
goto fail;
if (sc->hw.mac_type >= em_82543 && sc->hw.mac_type != em_82575 &&
- sc->hw.mac_type != em_82580 && sc->hw.mac_type != em_i350)
+ sc->hw.mac_type != em_82580 && sc->hw.mac_type != em_i350 &&
+ sc->hw.mac_type != em_i210 && sc->hw.mac_type != em_i211)
em_transmit_checksum_setup(sc, m_head, &txd_upper, &txd_lower);
else
txd_upper = txd_lower = 0;
@@ -1758,7 +1773,9 @@ em_hardware_init(struct em_softc *sc)
sc->hw.mac_type == em_82572 ||
sc->hw.mac_type == em_82575 ||
sc->hw.mac_type == em_82580 ||
- sc->hw.mac_type == em_i350)) {
+ sc->hw.mac_type == em_i350 ||
+ sc->hw.mac_type == em_i210 ||
+ sc->hw.mac_type == em_i211)) {
uint16_t phy_tmp = 0;
/* Speed up time to link by disabling smart power down */
@@ -1838,13 +1855,15 @@ em_setup_interface(struct em_softc *sc)
ifp->if_capabilities = IFCAP_VLAN_MTU;
#if NVLAN > 0
- if (sc->hw.mac_type != em_82575 && sc->hw.mac_type != em_82580 &&
- sc->hw.mac_type != em_i350)
+ if (sc->hw.mac_type >= em_82543 && sc->hw.mac_type != em_82580 &&
+ sc->hw.mac_type != em_i350 && sc->hw.mac_type != em_i210 &&
+ sc->hw.mac_type != em_i211)
ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
#endif
if (sc->hw.mac_type >= em_82543 && sc->hw.mac_type != em_82575 &&
- sc->hw.mac_type != em_82580 && sc->hw.mac_type != em_i350)
+ sc->hw.mac_type != em_82580 && sc->hw.mac_type != em_i350 &&
+ sc->hw.mac_type != em_i210 && sc->hw.mac_type != em_i211)
ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
/*
@@ -2199,7 +2218,8 @@ em_initialize_transmit_unit(struct em_so
sc->txd_cmd = E1000_TXD_CMD_IFCS;
if (sc->hw.mac_type == em_82575 || sc->hw.mac_type == em_82580 ||
- sc->hw.mac_type == em_i350) {
+ sc->hw.mac_type == em_i350 || sc->hw.mac_type == em_i210 ||
+ sc->hw.mac_type == em_i211) {
/* 82575/6 need to enable the TX queue and lack the IDE bit */
reg_tctl = E1000_READ_REG(&sc->hw, TXDCTL);
reg_tctl |= E1000_TXDCTL_QUEUE_ENABLE;
@@ -2624,7 +2644,8 @@ em_initialize_receive_unit(struct em_sof
* asked to or not. So ask for stripped CRC here and
* cope in rxeof
*/
- if (sc->hw.mac_type == em_i350)
+ if (sc->hw.mac_type == em_i350 || sc->hw.mac_type == em_i210 ||
+ sc->hw.mac_type == em_i211)
reg_rctl |= E1000_RCTL_SECRC;
switch (sc->rx_buffer_len) {
@@ -2661,7 +2682,8 @@ em_initialize_receive_unit(struct em_sof
E1000_WRITE_REG(&sc->hw, RDTR, 0x20);
if (sc->hw.mac_type == em_82575 || sc->hw.mac_type == em_82580 ||
- sc->hw.mac_type == em_i350) {
+ sc->hw.mac_type == em_i350 || sc->hw.mac_type == em_i210 ||
+ sc->hw.mac_type == em_i211) {
/* 82575/6 need to enable the RX queue */
uint32_t reg;
reg = E1000_READ_REG(&sc->hw, RXDCTL);
@@ -2859,7 +2881,9 @@ em_rxeof(struct em_softc *sc)
if (desc_len < ETHER_CRC_LEN) {
len = 0;
prev_len_adj = ETHER_CRC_LEN - desc_len;
- } else if (sc->hw.mac_type == em_i350)
+ } else if (sc->hw.mac_type == em_i350 ||
+ sc->hw.mac_type == em_i210 ||
+ sc->hw.mac_type == em_i211)
len = desc_len;
else
len = desc_len - ETHER_CRC_LEN;
Index: if_em_hw.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_em_hw.c,v
retrieving revision 1.75
diff -u -p -r1.75 if_em_hw.c
--- if_em_hw.c 27 Nov 2013 01:13:10 -0000 1.75
+++ if_em_hw.c 6 Feb 2014 21:00:48 -0000
@@ -261,6 +261,7 @@ em_set_phy_type(struct em_hw *hw)
break;
case I82580_I_PHY_ID:
case I350_I_PHY_ID:
+ case I210_I_PHY_ID:
hw->phy_type = em_phy_82580;
break;
case BME1000_E_PHY_ID:
@@ -527,6 +528,21 @@ em_set_mac_type(struct em_hw *hw)
hw->initialize_hw_bits_disable = 1;
hw->eee_enable = 1;
break;
+ case E1000_DEV_ID_I210_COPPER:
+ case E1000_DEV_ID_I210_FIBER:
+ case E1000_DEV_ID_I210_SERDES:
+ case E1000_DEV_ID_I210_SGMII:
+ case E1000_DEV_ID_I210_COPPER_NF:
+ case E1000_DEV_ID_I210_SERDES_NF:
+ hw->mac_type = em_i210;
+ hw->initialize_hw_bits_disable = 1;
+ hw->eee_enable = 1;
+ break;
+ case E1000_DEV_ID_I211_COPPER:
+ hw->mac_type = em_i211;
+ hw->initialize_hw_bits_disable = 1;
+ hw->eee_enable = 1;
+ break;
case E1000_DEV_ID_80003ES2LAN_COPPER_SPT:
case E1000_DEV_ID_80003ES2LAN_SERDES_SPT:
case E1000_DEV_ID_80003ES2LAN_COPPER_DPT:
@@ -5178,7 +5194,11 @@ em_match_gig_phy(struct em_hw *hw)
break;
case em_82580:
case em_i350:
- if (hw->phy_id == I82580_I_PHY_ID || hw->phy_id ==
I350_I_PHY_ID) {
+ case em_i210:
+ case em_i211:
+ if (hw->phy_id == I82580_I_PHY_ID ||
+ hw->phy_id == I350_I_PHY_ID ||
+ hw->phy_id == I210_I_PHY_ID) {
uint32_t mdic;
mdic = EM_READ_REG(hw, E1000_MDICNFG);
@@ -5455,6 +5475,8 @@ em_init_eeprom_params(struct em_hw *hw)
case em_82574:
case em_82575:
case em_82580:
+ case em_i210:
+ case em_i211:
case em_i350:
eeprom->type = em_eeprom_spi;
eeprom->opcode_bits = 8;
Index: if_em_hw.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_em_hw.h,v
retrieving revision 1.56
diff -u -p -r1.56 if_em_hw.h
--- if_em_hw.h 27 Nov 2013 01:13:10 -0000 1.56
+++ if_em_hw.h 6 Feb 2014 21:00:48 -0000
@@ -72,6 +72,8 @@ typedef enum {
em_82575,
em_82580,
em_i350,
+ em_i210,
+ em_i211,
em_80003es2lan,
em_ich8lan,
em_ich9lan,
@@ -570,6 +572,14 @@ int32_t em_check_phy_reset_block(struct
#define E1000_DEV_ID_I350_SERDES 0x1523
#define E1000_DEV_ID_I350_SGMII 0x1524
#define E1000_DEV_ID_82576_QUAD_CU_ET2 0x1526
+#define E1000_DEV_ID_I210_COPPER 0x1533
+#define E1000_DEV_ID_I210_FIBER 0x1536
+#define E1000_DEV_ID_I210_SERDES 0x1537
+#define E1000_DEV_ID_I210_SGMII 0x1538
+#define E1000_DEV_ID_I211_COPPER 0x1539
+#define E1000_DEV_ID_I210_COPPER_NF 0x157b
+#define E1000_DEV_ID_I210_SERDES_NF 0x157c
+#define E1000_DEV_ID_I210_SERDES_NF 0x157c
#define E1000_DEV_ID_I350_DA4 0x1546
#define E1000_DEV_ID_82574L 0x10D3
#define E1000_DEV_ID_EP80579_LAN_1 0x5040
@@ -3372,6 +3382,7 @@ struct em_host_command_info {
#define M88E1111_I_PHY_ID 0x01410CC0
#define L1LXT971A_PHY_ID 0x001378E0
#define GG82563_E_PHY_ID 0x01410CA0
+#define I210_I_PHY_ID 0x01410C00
#define BME1000_E_PHY_ID 0x01410CB0
#define BME1000_E_PHY_ID_R2 0x01410CB1
#define I82577_E_PHY_ID 0x01540050
--
OSN Online Service Nuernberg GmbH, Bucher Str. 78, 90408 Nuernberg
Tel: +49 911 39905-0 - Fax: +49 911 39905-55 - http://www.osn.de
HRB 15022 Nuernberg, USt-Id: DE189301263, GF: Joerg Goltermann