On 02/06/14 12:52, Joerg Goltermann wrote: > Hi, > > On 06.02.2014 10:26, Marc Peters wrote: >> Hi List, >> >> we have a couple of Supermicro boxes with Supmicro X10SLM+-LN4F Boards. >> These are featuring the Intel i210AT Chipsets. Are there any plans or >> patches to get them working? Downloaded today's snapshot but they aren't >> getting configured either. >> >> Is anyone working on it (and have a patch for me to test ;))? > > > yesterday I got my I210 cards for testing and this is the first > version of a patch. The card can be used but I did rare testing > on it. > > I can't find an unknown ethernet device in your attached > dmesg, maybe this device is attached on an unsupported > pci bridge?
These are the cards: ppb2 at pci0 dev 28 function 2 "Intel 8 Series PCIE" rev 0xd5: msi pci3 at ppb2 bus 3 "Intel I210" rev 0x03 at pci3 dev 0 function 0 not configured ppb3 at pci0 dev 28 function 3 "Intel 8 Series PCIE" rev 0xd5: msi pci4 at ppb3 bus 4 "Intel I210" rev 0x03 at pci4 dev 0 function 0 not configured ppb4 at pci0 dev 28 function 6 "Intel 8 Series PCIE" rev 0xd5: msi pci5 at ppb4 bus 5 "Intel I210" rev 0x03 at pci5 dev 0 function 0 not configured ppb5 at pci0 dev 28 function 7 "Intel 8 Series PCIE" rev 0xd5: msi pci6 at ppb5 bus 6 "Intel I210" rev 0x03 at pci6 dev 0 function 0 not configured It's a quad core onboard. I will give your patch a try, thanks. > > > > It would be really cool if we can get do the split of the em > driver in e1000 and igb to get closer to the original Intel code. > Which will make further updates easier and support a lot of > new features like multiple queues .... > > > > > 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 10:49:24 -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); > @@ -2846,7 +2868,6 @@ em_rxeof(struct em_softc *sc) > "(nrx %d, filled %d)", i, sc->rx_ndescs, > sc->last_rx_desc_filled); > } > - > m_cluncount(m, 1); > sc->rx_ndescs--; > > @@ -2859,7 +2880,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; > @@ -3123,10 +3146,10 @@ em_fill_descriptors(u_int64_t address, u > /* Let us first check the address...*/ > u_int32_t safe_terminator; > if (length <= 4) { > - desc_array->descriptor[0].address = address; > - desc_array->descriptor[0].length = length; > - desc_array->elements = 1; > - return desc_array->elements; > + desc_array->descriptor[0].address = address; > + desc_array->descriptor[0].length = length; > + desc_array->elements = 1; > + return desc_array->elements; > } > safe_terminator = (u_int32_t)((((u_int32_t)address & 0x7) + > (length & 0xF)) & 0xF); > /* if it does not fall between 0x1 to 0x4 and 0x9 to 0xC then > return */ > @@ -3135,10 +3158,10 @@ em_fill_descriptors(u_int64_t address, u > safe_terminator < 9) || > (safe_terminator > 0xC && > safe_terminator <= 0xF)) { > - desc_array->descriptor[0].address = address; > - desc_array->descriptor[0].length = length; > - desc_array->elements = 1; > - return desc_array->elements; > + desc_array->descriptor[0].address = address; > + desc_array->descriptor[0].length = length; > + desc_array->elements = 1; > + return desc_array->elements; > } > > desc_array->descriptor[0].address = address; > Index: if_em.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/if_em.h,v > retrieving revision 1.50 > diff -u -p -r1.50 if_em.h > --- if_em.h 7 Aug 2013 01:06:34 -0000 1.50 > +++ if_em.h 6 Feb 2014 10:49:24 -0000 > @@ -95,7 +95,8 @@ POSSIBILITY OF SUCH DAMAGE. > * (num_tx_desc * sizeof(struct em_tx_desc)) % 128 == 0 > */ > #define EM_MAX_TXD_82543 256 > -#define EM_MAX_TXD 512 > +#define EM_MAX_TXD 2048 > + > > /* > * EM_RXD - Maximum number of receive Descriptors > @@ -111,7 +112,7 @@ POSSIBILITY OF SUCH DAMAGE. > * (num_tx_desc * sizeof(struct em_tx_desc)) % 128 == 0 > */ > #define EM_MAX_RXD_82543 256 > -#define EM_MAX_RXD 256 > +#define EM_MAX_RXD 2048 > > /* > * MAX_INTS_PER_SEC (ITR - Interrupt Throttle Register) > 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 10:49:24 -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 10:49:24 -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