e1000: update base driver
authorIntel <intel.com>
Fri, 8 Nov 2013 02:00:00 +0000 (03:00 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Sun, 24 Nov 2013 00:31:34 +0000 (01:31 +0100)
The base driver supports more NICs:
    - i210 flashless
    - i217
    - i218
    - i354

The new features are not automatically used by the DPDK PMD.

Signed-off-by: Intel
24 files changed:
lib/librte_eal/common/include/rte_pci_dev_ids.h
lib/librte_pmd_e1000/e1000/e1000_80003es2lan.h
lib/librte_pmd_e1000/e1000/e1000_82571.c
lib/librte_pmd_e1000/e1000/e1000_82571.h
lib/librte_pmd_e1000/e1000/e1000_82575.c
lib/librte_pmd_e1000/e1000/e1000_82575.h
lib/librte_pmd_e1000/e1000/e1000_api.c
lib/librte_pmd_e1000/e1000/e1000_api.h
lib/librte_pmd_e1000/e1000/e1000_defines.h
lib/librte_pmd_e1000/e1000/e1000_hw.h
lib/librte_pmd_e1000/e1000/e1000_i210.c
lib/librte_pmd_e1000/e1000/e1000_i210.h
lib/librte_pmd_e1000/e1000/e1000_ich8lan.c
lib/librte_pmd_e1000/e1000/e1000_ich8lan.h
lib/librte_pmd_e1000/e1000/e1000_mac.c
lib/librte_pmd_e1000/e1000/e1000_manage.c
lib/librte_pmd_e1000/e1000/e1000_mbx.c
lib/librte_pmd_e1000/e1000/e1000_nvm.c
lib/librte_pmd_e1000/e1000/e1000_nvm.h
lib/librte_pmd_e1000/e1000/e1000_osdep.h
lib/librte_pmd_e1000/e1000/e1000_phy.c
lib/librte_pmd_e1000/e1000/e1000_phy.h
lib/librte_pmd_e1000/e1000/e1000_regs.h
lib/librte_pmd_e1000/e1000/e1000_vf.h

index e9c4594..61d3e6a 100644 (file)
 #define E1000_DEV_ID_PCH_D_HV_DC              0x10F0
 #define E1000_DEV_ID_PCH2_LV_LM               0x1502
 #define E1000_DEV_ID_PCH2_LV_V                0x1503
+#define E1000_DEV_ID_PCH_LPT_I217_LM          0x153A
+#define E1000_DEV_ID_PCH_LPT_I217_V           0x153B
+#define E1000_DEV_ID_PCH_LPTLP_I218_LM       0x155A
+#define E1000_DEV_ID_PCH_LPTLP_I218_V        0x1559
+#ifdef NAHUM6_LPTH_I218_HW
+#define E1000_DEV_ID_PCH_I218_LM2             0x15A0
+#define E1000_DEV_ID_PCH_I218_V2              0x15A1
+#endif /* NAHUM6_LPTH_I218_HW */
+#ifdef NAHUM6_WPT_HW
+#define E1000_DEV_ID_PCH_I218_LM3             0x15A2 /* Wildcat Point PCH */
+#define E1000_DEV_ID_PCH_I218_V3              0x15A3 /* Wildcat Point PCH */
+#endif /* NAHUM6_WPT_HW */
 
 /*
  * Tested (supported) on VM emulated HW.
@@ -279,7 +291,12 @@ RTE_PCI_DEV_ID_DECL_EM(PCI_VENDOR_ID_INTEL, E1000_DEV_ID_82574LA)
 #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_I210_COPPER_FLASHLESS      0x157B
+#define E1000_DEV_ID_I210_SERDES_FLASHLESS      0x157C
 #define E1000_DEV_ID_I211_COPPER                0x1539
+#define E1000_DEV_ID_I354_BACKPLANE_1GBPS       0x1F40
+#define E1000_DEV_ID_I354_SGMII                 0x1F41
+#define E1000_DEV_ID_I354_BACKPLANE_2_5GBPS     0x1F45
 #define E1000_DEV_ID_DH89XXCC_SGMII             0x0438
 #define E1000_DEV_ID_DH89XXCC_SERDES            0x043A
 #define E1000_DEV_ID_DH89XXCC_BACKPLANE         0x043C
index f02dd13..b187e8f 100644 (file)
@@ -71,7 +71,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define GG82563_MSCR_TX_CLK_MASK               0x0007
 #define GG82563_MSCR_TX_CLK_10MBPS_2_5         0x0004
 #define GG82563_MSCR_TX_CLK_100MBPS_25         0x0005
-#define GG82563_MSCR_TX_CLK_1000MBPS_2_5       0x0006
 #define GG82563_MSCR_TX_CLK_1000MBPS_25                0x0007
 
 #define GG82563_MSCR_ASSERT_CRS_ON_TX          0x0010 /* 1=Assert */
index 5eec577..9c6fb15 100644 (file)
@@ -1100,8 +1100,6 @@ STATIC s32 e1000_reset_hw_82571(struct e1000_hw *hw)
        default:
                break;
        }
-       if (ret_val)
-               DEBUGOUT("Cannot acquire MDIO ownership\n");
 
        ctrl = E1000_READ_REG(hw, E1000_CTRL);
 
@@ -1110,9 +1108,16 @@ STATIC s32 e1000_reset_hw_82571(struct e1000_hw *hw)
 
        /* Must release MDIO ownership and mutex after MAC reset. */
        switch (hw->mac.type) {
+       case e1000_82573:
+               /* Release mutex only if the hw semaphore is acquired */
+               if (!ret_val)
+                       e1000_put_hw_semaphore_82573(hw);
+               break;
        case e1000_82574:
        case e1000_82583:
-               e1000_put_hw_semaphore_82574(hw);
+               /* Release mutex only if the hw semaphore is acquired */
+               if (!ret_val)
+                       e1000_put_hw_semaphore_82574(hw);
                break;
        default:
                break;
index c6bbb83..6aa7a21 100644 (file)
@@ -49,11 +49,11 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_EIAC_82574       0x000DC /* Ext. Interrupt Auto Clear - RW */
 #define E1000_EIAC_MASK_82574  0x01F00000
 
+#define E1000_IVAR_INT_ALLOC_VALID     0x8
+
 /* Manageability Operation Mode mask */
 #define E1000_NVM_INIT_CTRL2_MNGM      0x6000
 
-#define E1000_RXCFGL   0x0B634 /* TimeSync Rx EtherType & Msg Type Reg - RW */
-
 #define E1000_BASE1000T_STATUS         10
 #define E1000_IDLE_ERROR_COUNT_MASK    0xFF
 #define E1000_RECEIVE_ERROR_COUNTER    21
index 9db988b..fd15b7b 100644 (file)
@@ -51,6 +51,7 @@ STATIC void e1000_release_phy_82575(struct e1000_hw *hw);
 STATIC s32  e1000_acquire_nvm_82575(struct e1000_hw *hw);
 STATIC void e1000_release_nvm_82575(struct e1000_hw *hw);
 STATIC s32  e1000_check_for_link_82575(struct e1000_hw *hw);
+STATIC s32  e1000_check_for_link_media_swap(struct e1000_hw *hw);
 STATIC s32  e1000_get_cfg_done_82575(struct e1000_hw *hw);
 STATIC s32  e1000_get_link_up_info_82575(struct e1000_hw *hw, u16 *speed,
                                         u16 *duplex);
@@ -143,6 +144,7 @@ STATIC bool e1000_sgmii_uses_mdio_82575(struct e1000_hw *hw)
                break;
        case e1000_82580:
        case e1000_i350:
+       case e1000_i354:
        case e1000_i210:
        case e1000_i211:
                reg = E1000_READ_REG(hw, E1000_MDICNFG);
@@ -206,6 +208,7 @@ STATIC s32 e1000_init_phy_params_82575(struct e1000_hw *hw)
                switch (hw->mac.type) {
                case e1000_82580:
                case e1000_i350:
+               case e1000_i354:
                        phy->ops.read_reg = e1000_read_phy_reg_82580;
                        phy->ops.write_reg = e1000_write_phy_reg_82580;
                        break;
@@ -225,6 +228,8 @@ STATIC s32 e1000_init_phy_params_82575(struct e1000_hw *hw)
 
        /* Verify phy id and set remaining function pointers */
        switch (phy->id) {
+       case M88E1543_E_PHY_ID:
+       case M88E1512_E_PHY_ID:
        case I347AT4_E_PHY_ID:
        case M88E1112_E_PHY_ID:
        case M88E1340M_E_PHY_ID:
@@ -237,9 +242,36 @@ STATIC s32 e1000_init_phy_params_82575(struct e1000_hw *hw)
                    phy->id == M88E1340M_E_PHY_ID)
                        phy->ops.get_cable_length =
                                         e1000_get_cable_length_m88_gen2;
+               else if (phy->id == M88E1543_E_PHY_ID ||
+                        phy->id == M88E1512_E_PHY_ID)
+                       phy->ops.get_cable_length =
+                                        e1000_get_cable_length_m88_gen2;
                else
                        phy->ops.get_cable_length = e1000_get_cable_length_m88;
                phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88;
+               /* Check if this PHY is confgured for media swap. */
+               if (phy->id == M88E1112_E_PHY_ID) {
+                       u16 data;
+
+                       ret_val = phy->ops.write_reg(hw,
+                                                    E1000_M88E1112_PAGE_ADDR,
+                                                    2);
+                       if (ret_val)
+                               goto out;
+
+                       ret_val = phy->ops.read_reg(hw,
+                                                   E1000_M88E1112_MAC_CTRL_1,
+                                                   &data);
+                       if (ret_val)
+                               goto out;
+
+                       data = (data & E1000_M88E1112_MAC_CTRL_1_MODE_MASK) >>
+                              E1000_M88E1112_MAC_CTRL_1_MODE_SHIFT;
+                       if (data == E1000_M88E1112_AUTO_COPPER_SGMII ||
+                           data == E1000_M88E1112_AUTO_COPPER_BASEX)
+                               hw->mac.ops.check_for_link =
+                                               e1000_check_for_link_media_swap;
+               }
                break;
        case IGP03E1000_E_PHY_ID:
        case IGP04E1000_E_PHY_ID:
@@ -387,11 +419,16 @@ STATIC s32 e1000_init_mac_params_82575(struct e1000_hw *hw)
                mac->rar_entry_count = E1000_RAR_ENTRIES_82576;
        if (mac->type == e1000_82580)
                mac->rar_entry_count = E1000_RAR_ENTRIES_82580;
-       if (mac->type == e1000_i350) {
+       if (mac->type == e1000_i350 || mac->type == e1000_i354)
                mac->rar_entry_count = E1000_RAR_ENTRIES_I350;
-               /* Enable EEE default settings for i350 */
+
+       /* Enable EEE default settings for EEE supported devices */
+       if (mac->type >= e1000_i350)
                dev_spec->eee_disable = false;
-       }
+
+       /* Allow a single clear of the SW semaphore on I210 and newer */
+       if (mac->type >= e1000_i210)
+               dev_spec->clear_semaphore_once = true;
 
        /* Set if part includes ASF firmware */
        mac->asf_firmware_present = true;
@@ -430,7 +467,7 @@ STATIC s32 e1000_init_mac_params_82575(struct e1000_hw *hw)
        mac->ops.config_collision_dist = e1000_config_collision_dist_82575;
        /* multicast address update */
        mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic;
-       if (mac->type == e1000_i350) {
+       if (hw->mac.type == e1000_i350 || mac->type == e1000_i354) {
                /* writing VFTA */
                mac->ops.write_vfta = e1000_write_vfta_i350;
                /* clearing VFTA */
@@ -616,6 +653,10 @@ STATIC s32 e1000_get_phy_id_82575(struct e1000_hw *hw)
 
        DEBUGFUNC("e1000_get_phy_id_82575");
 
+       /* some i354 devices need an extra read for phy id */
+       if (hw->mac.type == e1000_i354)
+               e1000_get_phy_id(hw);
+
        /*
         * For SGMII PHYs, we try the list of possible addresses until
         * we find one that works.  For non-SGMII PHYs
@@ -639,6 +680,7 @@ STATIC s32 e1000_get_phy_id_82575(struct e1000_hw *hw)
                        break;
                case e1000_82580:
                case e1000_i350:
+               case e1000_i354:
                case e1000_i210:
                case e1000_i211:
                        mdic = E1000_READ_REG(hw, E1000_MDICNFG);
@@ -1166,6 +1208,56 @@ STATIC s32 e1000_check_for_link_82575(struct e1000_hw *hw)
        return ret_val;
 }
 
+/**
+ *  e1000_check_for_link_media_swap - Check which M88E1112 interface linked
+ *  @hw: pointer to the HW structure
+ *
+ *  Poll the M88E1112 interfaces to see which interface achieved link.
+ */
+STATIC s32 e1000_check_for_link_media_swap(struct e1000_hw *hw)
+{
+       struct e1000_phy_info *phy = &hw->phy;
+       s32 ret_val;
+       u16 data;
+       u8 port = 0;
+
+       DEBUGFUNC("e1000_check_for_link_media_swap");
+
+       /* Check the copper medium. */
+       ret_val = phy->ops.write_reg(hw, E1000_M88E1112_PAGE_ADDR, 0);
+       if (ret_val)
+               return ret_val;
+
+       ret_val = phy->ops.read_reg(hw, E1000_M88E1112_STATUS, &data);
+       if (ret_val)
+               return ret_val;
+
+       if (data & E1000_M88E1112_STATUS_LINK)
+               port = E1000_MEDIA_PORT_COPPER;
+
+       /* Check the other medium. */
+       ret_val = phy->ops.write_reg(hw, E1000_M88E1112_PAGE_ADDR, 1);
+       if (ret_val)
+               return ret_val;
+
+       ret_val = phy->ops.read_reg(hw, E1000_M88E1112_STATUS, &data);
+       if (ret_val)
+               return ret_val;
+
+       if (data & E1000_M88E1112_STATUS_LINK)
+               port = E1000_MEDIA_PORT_OTHER;
+
+       /* Determine if a swap needs to happen. */
+       if (port && (hw->dev_spec._82575.media_port != port)) {
+               hw->dev_spec._82575.media_port = port;
+               hw->dev_spec._82575.media_changed = true;
+       } else {
+               ret_val = e1000_check_for_link_82575(hw);
+       }
+
+       return E1000_SUCCESS;
+}
+
 /**
  *  e1000_power_up_serdes_link_82575 - Power up the serdes link after shutdown
  *  @hw: pointer to the HW structure
@@ -1209,6 +1301,7 @@ static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw,
 {
        struct e1000_mac_info *mac = &hw->mac;
        u32 pcs;
+       u32 status;
 
        DEBUGFUNC("e1000_get_pcs_speed_and_duplex_82575");
 
@@ -1239,6 +1332,18 @@ static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw,
                else
                        *duplex = HALF_DUPLEX;
 
+               /* Check if it is an I354 2.5Gb backplane connection. */
+               if (mac->type == e1000_i354) {
+                       status = E1000_READ_REG(hw, E1000_STATUS);
+                       if ((status & E1000_STATUS_2P5_SKU) &&
+                           !(status & E1000_STATUS_2P5_SKU_OVER)) {
+                               *speed = SPEED_2500;
+                               *duplex = FULL_DUPLEX;
+                               DEBUGOUT("2500 Mbs, ");
+                               DEBUGOUT("Full Duplex\n");
+                       }
+               }
+
        } else {
                mac->serdes_has_link = false;
                *speed = 0;
@@ -1424,11 +1529,18 @@ STATIC s32 e1000_setup_copper_link_82575(struct e1000_hw *hw)
        ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
        E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
 
-       /* Clear Go Link Disconnect bit */
-       if (hw->mac.type >= e1000_82580) {
+       /* Clear Go Link Disconnect bit on supported devices */
+       switch (hw->mac.type) {
+       case e1000_82580:
+       case e1000_i350:
+       case e1000_i210:
+       case e1000_i211:
                phpm_reg = E1000_READ_REG(hw, E1000_82580_PHY_POWER_MGMT);
                phpm_reg &= ~E1000_82580_PM_GO_LINKD;
                E1000_WRITE_REG(hw, E1000_82580_PHY_POWER_MGMT, phpm_reg);
+               break;
+       default:
+               break;
        }
 
        ret_val = e1000_setup_serdes_link_82575(hw);
@@ -1448,12 +1560,19 @@ STATIC s32 e1000_setup_copper_link_82575(struct e1000_hw *hw)
        switch (hw->phy.type) {
        case e1000_phy_i210:
        case e1000_phy_m88:
-               if (hw->phy.id == I347AT4_E_PHY_ID ||
-                   hw->phy.id == M88E1112_E_PHY_ID ||
-                   hw->phy.id == M88E1340M_E_PHY_ID)
+               switch (hw->phy.id) {
+               case I347AT4_E_PHY_ID:
+               case M88E1112_E_PHY_ID:
+               case M88E1340M_E_PHY_ID:
+               case M88E1543_E_PHY_ID:
+               case M88E1512_E_PHY_ID:
+               case I210_I_PHY_ID:
                        ret_val = e1000_copper_link_setup_m88_gen2(hw);
-               else
+                       break;
+               default:
                        ret_val = e1000_copper_link_setup_m88(hw);
+                       break;
+               }
                break;
        case e1000_phy_igp_3:
                ret_val = e1000_copper_link_setup_igp(hw);
@@ -1628,140 +1747,70 @@ STATIC s32 e1000_setup_serdes_link_82575(struct e1000_hw *hw)
  **/
 STATIC s32 e1000_get_media_type_82575(struct e1000_hw *hw)
 {
-       u32 lan_id = 0;
-       s32 ret_val = E1000_ERR_CONFIG;
        struct e1000_dev_spec_82575 *dev_spec = &hw->dev_spec._82575;
+       s32 ret_val = E1000_SUCCESS;
        u32 ctrl_ext = 0;
-       u32 current_link_mode = 0;
-       u16 init_ctrl_wd_3 = 0;
-       u8 init_ctrl_wd_3_offset = 0;
-       u8 init_ctrl_wd_3_bit_offset = 0;
+       u32 link_mode = 0;
 
        /* Set internal phy as default */
        dev_spec->sgmii_active = false;
        dev_spec->module_plugged = false;
 
-       /*
-        * Check if NVM access method is attached already.
-        * If it is then Init Control Word #3 is considered
-        * otherwise runtime CSR register content is taken.
-        */
-
        /* Get CSR setting */
        ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
 
-       /* Get link mode setting */
-       if ((hw->nvm.ops.read) && (hw->nvm.ops.read != e1000_null_read_nvm)) {
-               /* Take link mode from EEPROM */
-
-               /*
-                * Get LAN port ID to derive its
-                * adequate Init Control Word #3
-                */
-               lan_id = ((E1000_READ_REG(hw, E1000_STATUS) &
-                     E1000_STATUS_LAN_ID_MASK) >> E1000_STATUS_LAN_ID_OFFSET);
-               /*
-                * Derive Init Control Word #3 offset
-                * and mask to pick up link mode setting.
-                */
-               if (hw->mac.type < e1000_82580) {
-                       init_ctrl_wd_3_offset = lan_id ?
-                          NVM_INIT_CONTROL3_PORT_A : NVM_INIT_CONTROL3_PORT_B;
-                       init_ctrl_wd_3_bit_offset = NVM_WORD24_LNK_MODE_OFFSET;
-               } else {
-                       init_ctrl_wd_3_offset =
-                                           NVM_82580_LAN_FUNC_OFFSET(lan_id) +
-                                           NVM_INIT_CONTROL3_PORT_A;
-                       init_ctrl_wd_3_bit_offset =
-                                             NVM_WORD24_82580_LNK_MODE_OFFSET;
-               }
-               /* Read Init Control Word #3*/
-               hw->nvm.ops.read(hw, init_ctrl_wd_3_offset, 1, &init_ctrl_wd_3);
-
-               /*
-                * Align link mode bits to
-                * their CTRL_EXT location.
-                */
-               current_link_mode = init_ctrl_wd_3;
-               current_link_mode <<= (E1000_CTRL_EXT_LINK_MODE_OFFSET -
-                                      init_ctrl_wd_3_bit_offset);
-               current_link_mode &= E1000_CTRL_EXT_LINK_MODE_MASK;
-
-               /*
-                * Switch to CSR for all but internal PHY.
-                */
-               if (current_link_mode != E1000_CTRL_EXT_LINK_MODE_GMII)
-                       /* Take link mode from CSR */
-                       current_link_mode = ctrl_ext &
-                                           E1000_CTRL_EXT_LINK_MODE_MASK;
-       } else {
-               /* Take link mode from CSR */
-               current_link_mode = ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK;
-       }
-
-       switch (current_link_mode) {
+       /* extract link mode setting */
+       link_mode = ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK;
 
+       switch (link_mode) {
        case E1000_CTRL_EXT_LINK_MODE_1000BASE_KX:
                hw->phy.media_type = e1000_media_type_internal_serdes;
-               current_link_mode = E1000_CTRL_EXT_LINK_MODE_1000BASE_KX;
                break;
        case E1000_CTRL_EXT_LINK_MODE_GMII:
                hw->phy.media_type = e1000_media_type_copper;
-               current_link_mode = E1000_CTRL_EXT_LINK_MODE_GMII;
                break;
        case E1000_CTRL_EXT_LINK_MODE_SGMII:
-       case E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES:
                /* Get phy control interface type set (MDIO vs. I2C)*/
                if (e1000_sgmii_uses_mdio_82575(hw)) {
                        hw->phy.media_type = e1000_media_type_copper;
                        dev_spec->sgmii_active = true;
-                       current_link_mode = E1000_CTRL_EXT_LINK_MODE_SGMII;
-               } else {
-                       ret_val = e1000_set_sfp_media_type_82575(hw);
-                       if (ret_val != E1000_SUCCESS)
-                               goto out;
-                       if (hw->phy.media_type ==
-                               e1000_media_type_internal_serdes) {
-                               /* Keep Link Mode as SGMII for 100BaseFX */
-                               if (!dev_spec->eth_flags.e100_base_fx) {
-                                       current_link_mode =
-                                        E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES;
-                               }
-                       } else if (hw->phy.media_type ==
-                               e1000_media_type_copper) {
-                               current_link_mode =
-                                              E1000_CTRL_EXT_LINK_MODE_SGMII;
+                       break;
+               }
+               /* fall through for I2C based SGMII */
+       case E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES:
+               /* read media type from SFP EEPROM */
+               ret_val = e1000_set_sfp_media_type_82575(hw);
+               if ((ret_val != E1000_SUCCESS) ||
+                   (hw->phy.media_type == e1000_media_type_unknown)) {
+                       /*
+                        * If media type was not identified then return media
+                        * type defined by the CTRL_EXT settings.
+                        */
+                       hw->phy.media_type = e1000_media_type_internal_serdes;
+
+                       if (link_mode == E1000_CTRL_EXT_LINK_MODE_SGMII) {
+                               hw->phy.media_type = e1000_media_type_copper;
+                               dev_spec->sgmii_active = true;
                        }
+
+                       break;
                }
-               break;
-       default:
-               DEBUGOUT("Link mode mask doesn't fit bit field size\n");
-               goto out;
-       }
-       /*
-        * Do not change current link mode setting
-        * if media type is fibre or has not been
-        * recognized.
-        */
-       if ((hw->phy.media_type != e1000_media_type_unknown) &&
-           (hw->phy.media_type != e1000_media_type_fiber)) {
-               /* Update link mode */
+
+               /* do not change link mode for 100BaseFX */
+               if (dev_spec->eth_flags.e100_base_fx)
+                       break;
+
+               /* change current link mode setting */
                ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK;
-               E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext |
-                               current_link_mode);
-       }
 
-       ret_val = E1000_SUCCESS;
-out:
-       /*
-        * If media type was not identified then return media type
-        * defined by the CTRL_EXT settings.
-        */
-       if (hw->phy.media_type == e1000_media_type_unknown) {
-               if (current_link_mode == E1000_CTRL_EXT_LINK_MODE_SGMII)
-                       hw->phy.media_type = e1000_media_type_copper;
+               if (hw->phy.media_type == e1000_media_type_copper)
+                       ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII;
                else
-                       hw->phy.media_type = e1000_media_type_internal_serdes;
+                       ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES;
+
+               E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
+
+               break;
        }
 
        return ret_val;
@@ -2191,42 +2240,33 @@ out:
  **/
 void e1000_vmdq_set_anti_spoofing_pf(struct e1000_hw *hw, bool enable, int pf)
 {
-       u32 dtxswc;
+       u32 reg_val, reg_offset;
 
        switch (hw->mac.type) {
        case e1000_82576:
-               dtxswc = E1000_READ_REG(hw, E1000_DTXSWC);
-               if (enable) {
-                       dtxswc |= (E1000_DTXSWC_MAC_SPOOF_MASK |
-                                  E1000_DTXSWC_VLAN_SPOOF_MASK);
-                       /* The PF can spoof - it has to in order to
-                        * support emulation mode NICs */
-                       dtxswc ^= (1 << pf | 1 << (pf +
-                                  E1000_DTXSWC_VLAN_SPOOF_SHIFT));
-               } else {
-                       dtxswc &= ~(E1000_DTXSWC_MAC_SPOOF_MASK |
-                                   E1000_DTXSWC_VLAN_SPOOF_MASK);
-               }
-               E1000_WRITE_REG(hw, E1000_DTXSWC, dtxswc);
+               reg_offset = E1000_DTXSWC;
                break;
        case e1000_i350:
-               dtxswc = E1000_READ_REG(hw, E1000_TXSWC);
-               if (enable) {
-                       dtxswc |= (E1000_DTXSWC_MAC_SPOOF_MASK |
-                                  E1000_DTXSWC_VLAN_SPOOF_MASK);
-                       /* The PF can spoof - it has to in order to
-                        * support emulation mode NICs
-                        */
-                       dtxswc ^= (1 << pf | 1 << (pf +
-                                  E1000_DTXSWC_VLAN_SPOOF_SHIFT));
-               } else {
-                       dtxswc &= ~(E1000_DTXSWC_MAC_SPOOF_MASK |
-                                   E1000_DTXSWC_VLAN_SPOOF_MASK);
-               }
-               E1000_WRITE_REG(hw, E1000_TXSWC, dtxswc);
-       default:
+       case e1000_i354:
+               reg_offset = E1000_TXSWC;
                break;
+       default:
+               return;
        }
+
+       reg_val = E1000_READ_REG(hw, reg_offset);
+       if (enable) {
+               reg_val |= (E1000_DTXSWC_MAC_SPOOF_MASK |
+                            E1000_DTXSWC_VLAN_SPOOF_MASK);
+               /* The PF can spoof - it has to in order to
+                * support emulation mode NICs
+                */
+               reg_val ^= (1 << pf | 1 << (pf + MAX_NUM_VFS));
+       } else {
+               reg_val &= ~(E1000_DTXSWC_MAC_SPOOF_MASK |
+                            E1000_DTXSWC_VLAN_SPOOF_MASK);
+       }
+       E1000_WRITE_REG(hw, reg_offset, reg_val);
 }
 
 /**
@@ -2250,6 +2290,7 @@ void e1000_vmdq_set_loopback_pf(struct e1000_hw *hw, bool enable)
                E1000_WRITE_REG(hw, E1000_DTXSWC, dtxswc);
                break;
        case e1000_i350:
+       case e1000_i354:
                dtxswc = E1000_READ_REG(hw, E1000_TXSWC);
                if (enable)
                        dtxswc |= E1000_DTXSWC_VMDQ_LOOPBACK_EN;
@@ -2395,6 +2436,10 @@ STATIC s32 e1000_reset_hw_82580(struct e1000_hw *hw)
 
        hw->dev_spec._82575.global_device_reset = false;
 
+       /* 82580 does not reliably do global_device_reset due to hw errata */
+       if (hw->mac.type == e1000_82580)
+               global_device_reset = false;
+
        /* Get current control state. */
        ctrl = E1000_READ_REG(hw, E1000_CTRL);
 
@@ -2442,10 +2487,6 @@ STATIC s32 e1000_reset_hw_82580(struct e1000_hw *hw)
                DEBUGOUT("Auto Read Done did not complete\n");
        }
 
-       /* If EEPROM is not present, run manual init scripts */
-       if (!(E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES))
-               e1000_reset_init_script_82575(hw);
-
        /* clear global device reset status bit */
        E1000_WRITE_REG(hw, E1000_STATUS, E1000_STAT_DEV_RST_SET);
 
@@ -2699,6 +2740,45 @@ out:
        return ret_val;
 }
 
+/**
+ *  __e1000_access_emi_reg - Read/write EMI register
+ *  @hw: pointer to the HW structure
+ *  @addr: EMI address to program
+ *  @data: pointer to value to read/write from/to the EMI address
+ *  @read: boolean flag to indicate read or write
+ **/
+STATIC s32 __e1000_access_emi_reg(struct e1000_hw *hw, u16 address,
+                                 u16 *data, bool read)
+{
+       s32 ret_val = E1000_SUCCESS;
+
+       DEBUGFUNC("__e1000_access_emi_reg");
+
+       ret_val = hw->phy.ops.write_reg(hw, E1000_EMIADD, address);
+       if (ret_val)
+               return ret_val;
+
+       if (read)
+               ret_val = hw->phy.ops.read_reg(hw, E1000_EMIDATA, data);
+       else
+               ret_val = hw->phy.ops.write_reg(hw, E1000_EMIDATA, *data);
+
+       return ret_val;
+}
+
+/**
+ *  e1000_read_emi_reg - Read Extended Management Interface register
+ *  @hw: pointer to the HW structure
+ *  @addr: EMI address to program
+ *  @data: value to be read from the EMI address
+ **/
+s32 e1000_read_emi_reg(struct e1000_hw *hw, u16 addr, u16 *data)
+{
+       DEBUGFUNC("e1000_read_emi_reg");
+
+       return __e1000_access_emi_reg(hw, addr, data, true);
+}
+
 /**
  *  e1000_set_eee_i350 - Enable/disable EEE support
  *  @hw: pointer to the HW structure
@@ -2744,6 +2824,114 @@ out:
        return ret_val;
 }
 
+/**
+ *  e1000_set_eee_i354 - Enable/disable EEE support
+ *  @hw: pointer to the HW structure
+ *
+ *  Enable/disable EEE legacy mode based on setting in dev_spec structure.
+ *
+ **/
+s32 e1000_set_eee_i354(struct e1000_hw *hw)
+{
+       struct e1000_phy_info *phy = &hw->phy;
+       s32 ret_val = E1000_SUCCESS;
+       u16 phy_data;
+
+       DEBUGFUNC("e1000_set_eee_i354");
+
+       if ((hw->phy.media_type != e1000_media_type_copper) ||
+           ((phy->id != M88E1543_E_PHY_ID) &&
+           (phy->id != M88E1512_E_PHY_ID)))
+               goto out;
+
+       if (!hw->dev_spec._82575.eee_disable) {
+               /* Switch to PHY page 18. */
+               ret_val = phy->ops.write_reg(hw, E1000_M88E1543_PAGE_ADDR, 18);
+               if (ret_val)
+                       goto out;
+
+               ret_val = phy->ops.read_reg(hw, E1000_M88E1543_EEE_CTRL_1,
+                                           &phy_data);
+               if (ret_val)
+                       goto out;
+
+               phy_data |= E1000_M88E1543_EEE_CTRL_1_MS;
+               ret_val = phy->ops.write_reg(hw, E1000_M88E1543_EEE_CTRL_1,
+                                            phy_data);
+               if (ret_val)
+                       goto out;
+
+               /* Return the PHY to page 0. */
+               ret_val = phy->ops.write_reg(hw, E1000_M88E1543_PAGE_ADDR, 0);
+               if (ret_val)
+                       goto out;
+
+               /* Turn on EEE advertisement. */
+               ret_val = e1000_read_xmdio_reg(hw, E1000_EEE_ADV_ADDR_I354,
+                                              E1000_EEE_ADV_DEV_I354,
+                                              &phy_data);
+               if (ret_val)
+                       goto out;
+
+               phy_data |= E1000_EEE_ADV_100_SUPPORTED |
+                           E1000_EEE_ADV_1000_SUPPORTED;
+               ret_val = e1000_write_xmdio_reg(hw, E1000_EEE_ADV_ADDR_I354,
+                                               E1000_EEE_ADV_DEV_I354,
+                                               phy_data);
+       } else {
+               /* Turn off EEE advertisement. */
+               ret_val = e1000_read_xmdio_reg(hw, E1000_EEE_ADV_ADDR_I354,
+                                              E1000_EEE_ADV_DEV_I354,
+                                              &phy_data);
+               if (ret_val)
+                       goto out;
+
+               phy_data &= ~(E1000_EEE_ADV_100_SUPPORTED |
+                             E1000_EEE_ADV_1000_SUPPORTED);
+               ret_val = e1000_write_xmdio_reg(hw, E1000_EEE_ADV_ADDR_I354,
+                                               E1000_EEE_ADV_DEV_I354,
+                                               phy_data);
+       }
+
+out:
+       return ret_val;
+}
+
+/**
+ *  e1000_get_eee_status_i354 - Get EEE status
+ *  @hw: pointer to the HW structure
+ *  @status: EEE status
+ *
+ *  Get EEE status by guessing based on whether Tx or Rx LPI indications have
+ *  been received.
+ **/
+s32 e1000_get_eee_status_i354(struct e1000_hw *hw, bool *status)
+{
+       struct e1000_phy_info *phy = &hw->phy;
+       s32 ret_val = E1000_SUCCESS;
+       u16 phy_data;
+
+       DEBUGFUNC("e1000_get_eee_status_i354");
+
+       /* Check if EEE is supported on this device. */
+       if ((hw->phy.media_type != e1000_media_type_copper) ||
+           ((phy->id != M88E1543_E_PHY_ID) &&
+           (phy->id != M88E1512_E_PHY_ID)))
+               goto out;
+
+       ret_val = e1000_read_xmdio_reg(hw, E1000_PCS_STATUS_ADDR_I354,
+                                      E1000_PCS_STATUS_DEV_I354,
+                                      &phy_data);
+       if (ret_val)
+               goto out;
+
+       *status = phy_data & (E1000_PCS_STATUS_TX_LPI_RCVD |
+                             E1000_PCS_STATUS_RX_LPI_RCVD) ? true : false;
+
+out:
+       return ret_val;
+}
+
 /* Due to a hw errata, if the host tries to  configure the VFTA register
  * while performing queries from the BMC or DMA, then the VFTA in some
  * cases won't be written.
index 4e104c9..2450e6a 100644 (file)
@@ -244,6 +244,8 @@ union e1000_adv_rx_desc {
 #define E1000_RXDADV_RSSTYPE_IPV6_UDP_EX 0x00000009
 
 /* RSS Packet Types as indicated in the receive descriptor */
+#define E1000_RXDADV_PKTTYPE_ILMASK    0x000000F0
+#define E1000_RXDADV_PKTTYPE_TLMASK    0x00000F00
 #define E1000_RXDADV_PKTTYPE_NONE      0x00000000
 #define E1000_RXDADV_PKTTYPE_IPV4      0x00000010 /* IPV4 hdr present */
 #define E1000_RXDADV_PKTTYPE_IPV4_EX   0x00000020 /* IPV4 hdr + extensions */
@@ -359,10 +361,13 @@ struct e1000_adv_tx_context_desc {
 #define E1000_DCA_RXCTRL_DESC_DCA_EN   (1 << 5) /* DCA Rx Desc enable */
 #define E1000_DCA_RXCTRL_HEAD_DCA_EN   (1 << 6) /* DCA Rx Desc header ena */
 #define E1000_DCA_RXCTRL_DATA_DCA_EN   (1 << 7) /* DCA Rx Desc payload ena */
+#define E1000_DCA_RXCTRL_DESC_RRO_EN   (1 << 9) /* DCA Rx Desc Relax Order */
 
 #define E1000_DCA_TXCTRL_CPUID_MASK    0x0000001F /* Tx CPUID Mask */
 #define E1000_DCA_TXCTRL_DESC_DCA_EN   (1 << 5) /* DCA Tx Desc enable */
+#define E1000_DCA_TXCTRL_DESC_RRO_EN   (1 << 9) /* Tx rd Desc Relax Order */
 #define E1000_DCA_TXCTRL_TX_WB_RO_EN   (1 << 11) /* Tx Desc writeback RO bit */
+#define E1000_DCA_TXCTRL_DATA_RRO_EN   (1 << 13) /* Tx rd data Relax Order */
 
 #define E1000_DCA_TXCTRL_CPUID_MASK_82576      0xFF000000 /* Tx CPUID Mask */
 #define E1000_DCA_RXCTRL_CPUID_MASK_82576      0xFF000000 /* Rx CPUID Mask */
@@ -487,7 +492,10 @@ void e1000_vfta_set_vf(struct e1000_hw *, u16, bool);
 void e1000_rlpml_set_vf(struct e1000_hw *, u16);
 s32 e1000_promisc_set_vf(struct e1000_hw *, enum e1000_promisc_type type);
 u16 e1000_rxpbs_adjust_82580(u32 data);
+s32 e1000_read_emi_reg(struct e1000_hw *hw, u16 addr, u16 *data);
 s32 e1000_set_eee_i350(struct e1000_hw *);
+s32 e1000_set_eee_i354(struct e1000_hw *);
+s32 e1000_get_eee_status_i354(struct e1000_hw *, bool *);
 
 /* I2C SDA and SCL timing parameters for standard mode */
 #define E1000_I2C_T_HD_STA     4
index 46364bd..efffab5 100644 (file)
@@ -288,6 +288,20 @@ s32 e1000_set_mac_type(struct e1000_hw *hw)
        case E1000_DEV_ID_PCH2_LV_V:
                mac->type = e1000_pch2lan;
                break;
+       case E1000_DEV_ID_PCH_LPT_I217_LM:
+       case E1000_DEV_ID_PCH_LPT_I217_V:
+       case E1000_DEV_ID_PCH_LPTLP_I218_LM:
+       case E1000_DEV_ID_PCH_LPTLP_I218_V:
+#ifdef NAHUM6_LPTH_I218_HW
+       case E1000_DEV_ID_PCH_I218_LM2:
+       case E1000_DEV_ID_PCH_I218_V2:
+#endif /* NAHUM6_LPTH_I218_HW */
+#ifdef NAHUM6_WPT_HW
+       case E1000_DEV_ID_PCH_I218_LM3:
+       case E1000_DEV_ID_PCH_I218_V3:
+#endif /* NAHUM6_WPT_HW */
+               mac->type = e1000_pch_lpt;
+               break;
        case E1000_DEV_ID_82575EB_COPPER:
        case E1000_DEV_ID_82575EB_FIBER_SERDES:
        case E1000_DEV_ID_82575GB_QUAD_COPPER:
@@ -322,6 +336,8 @@ s32 e1000_set_mac_type(struct e1000_hw *hw)
        case E1000_DEV_ID_I350_DA4:
                mac->type = e1000_i350;
                break;
+       case E1000_DEV_ID_I210_COPPER_FLASHLESS:
+       case E1000_DEV_ID_I210_SERDES_FLASHLESS:
        case E1000_DEV_ID_I210_COPPER:
        case E1000_DEV_ID_I210_COPPER_OEM1:
        case E1000_DEV_ID_I210_COPPER_IT:
@@ -331,8 +347,8 @@ s32 e1000_set_mac_type(struct e1000_hw *hw)
                mac->type = e1000_i210;
                break;
        case E1000_DEV_ID_I211_COPPER:
-       mac->type = e1000_i211;
-       break;
+               mac->type = e1000_i211;
+               break;
        case E1000_DEV_ID_82576_VF:
        case E1000_DEV_ID_82576_VF_HV:
                mac->type = e1000_vfadapt;
@@ -342,6 +358,11 @@ s32 e1000_set_mac_type(struct e1000_hw *hw)
                mac->type = e1000_vfadapt_i350;
                break;
 
+       case E1000_DEV_ID_I354_BACKPLANE_1GBPS:
+       case E1000_DEV_ID_I354_SGMII:
+       case E1000_DEV_ID_I354_BACKPLANE_2_5GBPS:
+               mac->type = e1000_i354;
+               break;
        default:
                /* Should never have loaded on this device */
                ret_val = -E1000_ERR_MAC_INIT;
@@ -430,12 +451,14 @@ s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device)
        case e1000_ich10lan:
        case e1000_pchlan:
        case e1000_pch2lan:
+       case e1000_pch_lpt:
                e1000_init_function_pointers_ich8lan(hw);
                break;
        case e1000_82575:
        case e1000_82576:
        case e1000_82580:
        case e1000_i350:
+       case e1000_i354:
                e1000_init_function_pointers_82575(hw);
                break;
        case e1000_i210:
@@ -875,11 +898,7 @@ bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)
 s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length,
                            u16 offset, u8 *sum)
 {
-       if (hw->mac.ops.mng_host_if_write)
-               return hw->mac.ops.mng_host_if_write(hw, buffer, length,
-                                                    offset, sum);
-
-       return E1000_NOT_IMPLEMENTED;
+       return e1000_mng_host_if_write_generic(hw, buffer, length, offset, sum);
 }
 
 /**
@@ -892,10 +911,7 @@ s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length,
 s32 e1000_mng_write_cmd_header(struct e1000_hw *hw,
                               struct e1000_host_mng_command_header *hdr)
 {
-       if (hw->mac.ops.mng_write_cmd_header)
-               return hw->mac.ops.mng_write_cmd_header(hw, hdr);
-
-       return E1000_NOT_IMPLEMENTED;
+       return e1000_mng_write_cmd_header_generic(hw, hdr);
 }
 
 /**
@@ -910,25 +926,7 @@ s32 e1000_mng_write_cmd_header(struct e1000_hw *hw,
  **/
 s32 e1000_mng_enable_host_if(struct e1000_hw *hw)
 {
-       if (hw->mac.ops.mng_enable_host_if)
-               return hw->mac.ops.mng_enable_host_if(hw);
-
-       return E1000_NOT_IMPLEMENTED;
-}
-
-/**
- *  e1000_wait_autoneg - Waits for autonegotiation completion
- *  @hw: pointer to the HW structure
- *
- *  Waits for autoneg to complete. Currently no func pointer exists and all
- *  implementations are handled in the generic version of this function.
- **/
-s32 e1000_wait_autoneg(struct e1000_hw *hw)
-{
-       if (hw->mac.ops.wait_autoneg)
-               return hw->mac.ops.wait_autoneg(hw);
-
-       return E1000_SUCCESS;
+       return e1000_mng_enable_host_if_generic(hw);
 }
 
 /**
@@ -1203,6 +1201,21 @@ s32 e1000_read_pba_length(struct e1000_hw *hw, u32 *pba_num_size)
        return e1000_read_pba_length_generic(hw, pba_num_size);
 }
 
+/**
+ *  e1000_read_pba_num - Read device part number
+ *  @hw: pointer to the HW structure
+ *  @pba_num: pointer to device part number
+ *
+ *  Reads the product board assembly (PBA) number from the EEPROM and stores
+ *  the value in pba_num.
+ *  Currently no func pointer exists and all implementations are handled in the
+ *  generic version of this function.
+ **/
+s32 e1000_read_pba_num(struct e1000_hw *hw, u32 *pba_num)
+{
+       return e1000_read_pba_num_generic(hw, pba_num);
+}
+
 /**
  *  e1000_validate_nvm_checksum - Verifies NVM (EEPROM) checksum
  *  @hw: pointer to the HW structure
index aafa35e..619a852 100644 (file)
@@ -96,6 +96,7 @@ s32 e1000_phy_commit(struct e1000_hw *hw);
 void e1000_power_up_phy(struct e1000_hw *hw);
 void e1000_power_down_phy(struct e1000_hw *hw);
 s32 e1000_read_mac_addr(struct e1000_hw *hw);
+s32 e1000_read_pba_num(struct e1000_hw *hw, u32 *part_num);
 s32 e1000_read_pba_string(struct e1000_hw *hw, u8 *pba_num, u32 pba_num_size);
 s32 e1000_read_pba_length(struct e1000_hw *hw, u32 *pba_num_size);
 void e1000_reload_nvm(struct e1000_hw *hw);
@@ -105,7 +106,6 @@ s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data);
 s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data);
 s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data);
 s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data);
-s32 e1000_wait_autoneg(struct e1000_hw *hw);
 s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active);
 s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active);
 bool e1000_check_mng_mode(struct e1000_hw *hw);
index 8f67050..febf304 100644 (file)
@@ -44,13 +44,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_WUC_PME_EN       0x00000002 /* PME Enable */
 #define E1000_WUC_PME_STATUS   0x00000004 /* PME Status */
 #define E1000_WUC_APMPME       0x00000008 /* Assert PME on APM Wakeup */
-#define E1000_WUC_LSCWE                0x00000010 /* Link Status wake up enable */
-#define E1000_WUC_PPROXYE      0x00000010 /* Protocol Proxy Enable */
-#define E1000_WUC_LSCWO                0x00000020 /* Link Status wake up override */
-#define E1000_WUC_SPM          0x80000000 /* Enable SPM */
 #define E1000_WUC_PHY_WAKE     0x00000100 /* if PHY supports wakeup */
-#define E1000_WUC_FLX6_PHY     0x4000 /* Flexible Filter 6 Enable */
-#define E1000_WUC_FLX7_PHY     0x8000 /* Flexible Filter 7 Enable */
 
 /* Wake Up Filter Control */
 #define E1000_WUFC_LNKC        0x00000001 /* Link Status Change Wakeup Enable */
@@ -60,41 +54,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_WUFC_BC  0x00000010 /* Broadcast Wakeup Enable */
 #define E1000_WUFC_ARP 0x00000020 /* ARP Request Packet Wakeup Enable */
 #define E1000_WUFC_IPV4        0x00000040 /* Directed IPv4 Packet Wakeup Enable */
-#define E1000_WUFC_IPV6        0x00000080 /* Directed IPv6 Packet Wakeup Enable */
-#define E1000_WUFC_IGNORE_TCO_PHY 0x00000800 /* Ignore WakeOn TCO packets */
-#define E1000_WUFC_FLX0_PHY    0x00001000 /* Flexible Filter 0 Enable */
-#define E1000_WUFC_FLX1_PHY    0x00002000 /* Flexible Filter 1 Enable */
-#define E1000_WUFC_FLX2_PHY    0x00004000 /* Flexible Filter 2 Enable */
-#define E1000_WUFC_FLX3_PHY    0x00008000 /* Flexible Filter 3 Enable */
-#define E1000_WUFC_FLX4_PHY    0x00000200 /* Flexible Filter 4 Enable */
-#define E1000_WUFC_FLX5_PHY    0x00000400 /* Flexible Filter 5 Enable */
-#define E1000_WUFC_IGNORE_TCO  0x00008000 /* Ignore WakeOn TCO packets */
 #define E1000_WUFC_FLX0                0x00010000 /* Flexible Filter 0 Enable */
-#define E1000_WUFC_FLX1                0x00020000 /* Flexible Filter 1 Enable */
-#define E1000_WUFC_FLX2                0x00040000 /* Flexible Filter 2 Enable */
-#define E1000_WUFC_FLX3                0x00080000 /* Flexible Filter 3 Enable */
-#define E1000_WUFC_FLX4                0x00100000 /* Flexible Filter 4 Enable */
-#define E1000_WUFC_FLX5                0x00200000 /* Flexible Filter 5 Enable */
-#define E1000_WUFC_FLX6                0x00400000 /* Flexible Filter 6 Enable */
-#define E1000_WUFC_FLX7                0x00800000 /* Flexible Filter 7 Enable */
-#define E1000_WUFC_FW_RST      0x80000000 /* Wake on FW Reset Enable */
-#define E1000_WUFC_ALL_FILTERS_PHY_4   0x0000F0FF /* wakeup filters mask */
-#define E1000_WUFC_FLX_OFFSET_PHY      12 /* Flexible Filters bits offset */
-#define E1000_WUFC_FLX_FILTERS_PHY_4   0x0000F000 /* 4 flexible filters mask */
-#define E1000_WUFC_ALL_FILTERS_PHY_6   0x0000F6FF /* 6 wakeup filters mask */
-#define E1000_WUFC_FLX_FILTERS_PHY_6   0x0000F600 /* 6 flexible filters mask */
-#define E1000_WUFC_ALL_FILTERS         0x000F00FF /* all wakeup filters mask */
-#define E1000_WUFC_ALL_FILTERS_6       0x003F00FF /* Mask all 6 wu filters */
-#define E1000_WUFC_ALL_FILTERS_8       0x00FF00FF /* Mask all 8 wu filters */
-#define E1000_WUFC_FLX_OFFSET          16 /* Flexible Filters bits offset */
-#define E1000_WUFC_FLX_FILTERS         0x000F0000 /* 4 flexible filters mask */
-#define E1000_WUFC_FLX_FILTERS_6       0x003F0000 /* 6 flexible filters mask */
-#define E1000_WUFC_FLX_FILTERS_8       0x00FF0000 /* 8 flexible filters mask */
-/*
- * For 82576 to utilize Extended filter masks in addition to
- * existing (filter) masks
- */
-#define E1000_WUFC_EXT_FLX_FILTERS     0x00300000 /* Ext. FLX filter mask */
 
 /* Wake Up Status */
 #define E1000_WUS_LNKC         E1000_WUFC_LNKC
@@ -102,74 +62,18 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_WUS_EX           E1000_WUFC_EX
 #define E1000_WUS_MC           E1000_WUFC_MC
 #define E1000_WUS_BC           E1000_WUFC_BC
-#define E1000_WUS_ARP          E1000_WUFC_ARP
-#define E1000_WUS_IPV4         E1000_WUFC_IPV4
-#define E1000_WUS_IPV6         E1000_WUFC_IPV6
-#define E1000_WUS_FLX0_PHY     E1000_WUFC_FLX0_PHY
-#define E1000_WUS_FLX1_PHY     E1000_WUFC_FLX1_PHY
-#define E1000_WUS_FLX2_PHY     E1000_WUFC_FLX2_PHY
-#define E1000_WUS_FLX3_PHY     E1000_WUFC_FLX3_PHY
-#define E1000_WUS_FLX_FILTERS_PHY_4    E1000_WUFC_FLX_FILTERS_PHY_4
-#define E1000_WUS_FLX0         E1000_WUFC_FLX0
-#define E1000_WUS_FLX1         E1000_WUFC_FLX1
-#define E1000_WUS_FLX2         E1000_WUFC_FLX2
-#define E1000_WUS_FLX3         E1000_WUFC_FLX3
-#define E1000_WUS_FLX4         E1000_WUFC_FLX4
-#define E1000_WUS_FLX5         E1000_WUFC_FLX5
-#define E1000_WUS_FLX6         E1000_WUFC_FLX6
-#define E1000_WUS_FLX7         E1000_WUFC_FLX7
-#define E1000_WUS_FLX4_PHY     E1000_WUFC_FLX4_PHY
-#define E1000_WUS_FLX5_PHY     E1000_WUFC_FLX5_PHY
-#define E1000_WUS_FLX6_PHY     0x0400
-#define E1000_WUS_FLX7_PHY     0x0800
-#define E1000_WUS_FLX_FILTERS  E1000_WUFC_FLX_FILTERS
-#define E1000_WUS_FLX_FILTERS_6                E1000_WUFC_FLX_FILTERS_6
-#define E1000_WUS_FLX_FILTERS_8                E1000_WUFC_FLX_FILTERS_8
-#define E1000_WUS_FLX_FILTERS_PHY_6    E1000_WUFC_FLX_FILTERS_PHY_6
-
-/* Wake Up Packet Length */
-#define E1000_WUPL_LENGTH_MASK 0x0FFF   /* Only the lower 12 bits are valid */
-
-/* Four Flexible Filters are supported */
-#define E1000_FLEXIBLE_FILTER_COUNT_MAX                4
-/* Six Flexible Filters are supported */
-#define E1000_FLEXIBLE_FILTER_COUNT_MAX_6      6
-/* Eight Flexible Filters are supported */
-#define E1000_FLEXIBLE_FILTER_COUNT_MAX_8      8
-/* Two Extended Flexible Filters are supported (82576) */
-#define E1000_EXT_FLEXIBLE_FILTER_COUNT_MAX    2
-#define E1000_FHFT_LENGTH_OFFSET       0xFC /* Length byte in FHFT */
-#define E1000_FHFT_LENGTH_MASK         0x0FF /* Length in lower byte */
-
-/* Each Flexible Filter is at most 128 (0x80) bytes in length */
-#define E1000_FLEXIBLE_FILTER_SIZE_MAX 128
-
-#define E1000_FFLT_SIZE                E1000_FLEXIBLE_FILTER_COUNT_MAX
-#define E1000_FFLT_SIZE_6      E1000_FLEXIBLE_FILTER_COUNT_MAX_6
-#define E1000_FFLT_SIZE_8      E1000_FLEXIBLE_FILTER_COUNT_MAX_8
-#define E1000_FFMT_SIZE                E1000_FLEXIBLE_FILTER_SIZE_MAX
-#define E1000_FFVT_SIZE                E1000_FLEXIBLE_FILTER_SIZE_MAX
 
 /* Extended Device Control */
-#define E1000_CTRL_EXT_GPI0_EN         0x00000001 /* Maps SDP4 to GPI0 */
-#define E1000_CTRL_EXT_GPI1_EN         0x00000002 /* Maps SDP5 to GPI1 */
-#define E1000_CTRL_EXT_PHYINT_EN       E1000_CTRL_EXT_GPI1_EN
-#define E1000_CTRL_EXT_GPI2_EN         0x00000004 /* Maps SDP6 to GPI2 */
-#define E1000_CTRL_EXT_GPI3_EN         0x00000008 /* Maps SDP7 to GPI3 */
-/* Reserved (bits 4,5) in >= 82575 */
+#define E1000_CTRL_EXT_LPCD            0x00000004 /* LCD Power Cycle Done */
 #define E1000_CTRL_EXT_SDP4_DATA       0x00000010 /* SW Definable Pin 4 data */
-#define E1000_CTRL_EXT_SDP5_DATA       0x00000020 /* SW Definable Pin 5 data */
-#define E1000_CTRL_EXT_PHY_INT         E1000_CTRL_EXT_SDP5_DATA
 #define E1000_CTRL_EXT_SDP6_DATA       0x00000040 /* SW Definable Pin 6 data */
 #define E1000_CTRL_EXT_SDP3_DATA       0x00000080 /* SW Definable Pin 3 data */
 /* SDP 4/5 (bits 8,9) are reserved in >= 82575 */
 #define E1000_CTRL_EXT_SDP4_DIR        0x00000100 /* Direction of SDP4 0=in 1=out */
-#define E1000_CTRL_EXT_SDP5_DIR        0x00000200 /* Direction of SDP5 0=in 1=out */
 #define E1000_CTRL_EXT_SDP6_DIR        0x00000400 /* Direction of SDP6 0=in 1=out */
 #define E1000_CTRL_EXT_SDP3_DIR        0x00000800 /* Direction of SDP3 0=in 1=out */
-#define E1000_CTRL_EXT_ASDCHK  0x00001000 /* Initiate an ASD sequence */
+#define E1000_CTRL_EXT_FORCE_SMBUS     0x00000800 /* Force SMBus mode */
 #define E1000_CTRL_EXT_EE_RST  0x00002000 /* Reinitialize from EEPROM */
-#define E1000_CTRL_EXT_IPS     0x00004000 /* Invert Power State */
 /* Physical Func Reset Done Indication */
 #define E1000_CTRL_EXT_PFRSTD  0x00004000
 #define E1000_CTRL_EXT_SPD_BYPS        0x00008000 /* Speed Select Bypass */
@@ -178,42 +82,22 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_CTRL_EXT_LINK_MODE_MASK  0x00C00000
 /* Offset of the link mode field in Ctrl Ext register */
 #define E1000_CTRL_EXT_LINK_MODE_OFFSET        22
-#define E1000_CTRL_EXT_LINK_MODE_82580_MASK    0x01C00000 /*82580 bit 24:22*/
 #define E1000_CTRL_EXT_LINK_MODE_1000BASE_KX   0x00400000
 #define E1000_CTRL_EXT_LINK_MODE_GMII  0x00000000
-#define E1000_CTRL_EXT_LINK_MODE_TBI   0x00C00000
-#define E1000_CTRL_EXT_LINK_MODE_KMRN  0x00000000
 #define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES   0x00C00000
-#define E1000_CTRL_EXT_LINK_MODE_PCIX_SERDES   0x00800000
 #define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000
 #define E1000_CTRL_EXT_EIAME           0x01000000
 #define E1000_CTRL_EXT_IRCA            0x00000001
-#define E1000_CTRL_EXT_WR_WMARK_MASK   0x03000000
-#define E1000_CTRL_EXT_WR_WMARK_256    0x00000000
-#define E1000_CTRL_EXT_WR_WMARK_320    0x01000000
-#define E1000_CTRL_EXT_WR_WMARK_384    0x02000000
-#define E1000_CTRL_EXT_WR_WMARK_448    0x03000000
-#define E1000_CTRL_EXT_CANC            0x04000000 /* Int delay cancellation */
 #define E1000_CTRL_EXT_DRV_LOAD                0x10000000 /* Drv loaded bit for FW */
-/* IAME enable bit (27) was removed in >= 82575 */
 #define E1000_CTRL_EXT_IAME            0x08000000 /* Int ACK Auto-mask */
-/* packet buffer parity error detection enabled */
-#define E1000_CRTL_EXT_PB_PAREN                0x01000000
-/* descriptor FIFO parity error detection enable */
-#define E1000_CTRL_EXT_DF_PAREN                0x02000000
-#define E1000_CTRL_EXT_GHOST_PAREN     0x40000000
 #define E1000_CTRL_EXT_PBA_CLR         0x80000000 /* PBA Clear */
 #define E1000_CTRL_EXT_LSECCK          0x00001000
 #define E1000_CTRL_EXT_PHYPDEN         0x00100000
 #define E1000_I2CCMD_REG_ADDR_SHIFT    16
-#define E1000_I2CCMD_REG_ADDR          0x00FF0000
 #define E1000_I2CCMD_PHY_ADDR_SHIFT    24
-#define E1000_I2CCMD_PHY_ADDR          0x07000000
 #define E1000_I2CCMD_OPCODE_READ       0x08000000
 #define E1000_I2CCMD_OPCODE_WRITE      0x00000000
-#define E1000_I2CCMD_RESET             0x10000000
 #define E1000_I2CCMD_READY             0x20000000
-#define E1000_I2CCMD_INTERRUPT_ENA     0x40000000
 #define E1000_I2CCMD_ERROR             0x80000000
 #define E1000_I2CCMD_SFP_DATA_ADDR(a)  (0x0000 + (a))
 #define E1000_I2CCMD_SFP_DIAG_ADDR(a)  (0x0100 + (a))
@@ -234,11 +118,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_RXD_STAT_TCPCS   0x20    /* TCP xsum calculated */
 #define E1000_RXD_STAT_IPCS    0x40    /* IP xsum calculated */
 #define E1000_RXD_STAT_PIF     0x80    /* passed in-exact filter */
-#define E1000_RXD_STAT_CRCV    0x100   /* Speculative CRC Valid */
 #define E1000_RXD_STAT_IPIDV   0x200   /* IP identification valid */
 #define E1000_RXD_STAT_UDPV    0x400   /* Valid UDP checksum */
 #define E1000_RXD_STAT_DYNINT  0x800   /* Pkt caused INT via DYNINT */
-#define E1000_RXD_STAT_ACK     0x8000  /* ACK Packet indication */
 #define E1000_RXD_ERR_CE       0x01    /* CRC Error */
 #define E1000_RXD_ERR_SE       0x02    /* Symbol Error */
 #define E1000_RXD_ERR_SEQ      0x04    /* Sequence Error */
@@ -247,10 +129,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_RXD_ERR_IPE      0x40    /* IP Checksum Error */
 #define E1000_RXD_ERR_RXE      0x80    /* Rx Data Error */
 #define E1000_RXD_SPC_VLAN_MASK        0x0FFF  /* VLAN ID is in lower 12 bits */
-#define E1000_RXD_SPC_PRI_MASK 0xE000  /* Priority is in upper 3 bits */
-#define E1000_RXD_SPC_PRI_SHIFT        13
-#define E1000_RXD_SPC_CFI_MASK 0x1000  /* CFI is bit 12 */
-#define E1000_RXD_SPC_CFI_SHIFT        12
 
 #define E1000_RXDEXT_STATERR_TST       0x00000100 /* Time Stamp taken */
 #define E1000_RXDEXT_STATERR_LB                0x00040000
@@ -262,13 +140,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_RXDEXT_STATERR_IPE       0x40000000
 #define E1000_RXDEXT_STATERR_RXE       0x80000000
 
-#define E1000_RXDEXT_LSECH             0x01000000
-#define E1000_RXDEXT_LSECE_MASK                0x60000000
-#define E1000_RXDEXT_LSECE_NO_ERROR    0x00000000
-#define E1000_RXDEXT_LSECE_NO_SA_MATCH 0x20000000
-#define E1000_RXDEXT_LSECE_REPLAY_DETECT 0x40000000
-#define E1000_RXDEXT_LSECE_BAD_SIG     0x60000000
-
 /* mask to determine if packets should be dropped due to frame errors */
 #define E1000_RXD_ERR_FRAME_ERR_MASK ( \
        E1000_RXD_ERR_CE  |             \
@@ -285,61 +156,28 @@ POSSIBILITY OF SUCH DAMAGE.
        E1000_RXDEXT_STATERR_CXE |      \
        E1000_RXDEXT_STATERR_RXE)
 
-/* Packet Types as indicated in the Adv/Ext receive descriptor. */
-#define E1000_RXD_PKTTYPE_MASK                 0x000F0000
-#define E1000_RXD_PKTTYPE_PTP                  0x000E0000
-
-#define E1000_MRQC_ENABLE_MASK                 0x00000007
+#if !defined(EXTERNAL_RELEASE) || defined(E1000E_MQ)
 #define E1000_MRQC_ENABLE_RSS_2Q               0x00000001
-#define E1000_MRQC_ENABLE_RSS_INT              0x00000004
+#endif /* !EXTERNAL_RELEASE || E1000E_MQ */
 #define E1000_MRQC_RSS_FIELD_MASK              0xFFFF0000
 #define E1000_MRQC_RSS_FIELD_IPV4_TCP          0x00010000
 #define E1000_MRQC_RSS_FIELD_IPV4              0x00020000
 #define E1000_MRQC_RSS_FIELD_IPV6_TCP_EX       0x00040000
-#define E1000_MRQC_RSS_FIELD_IPV6_EX           0x00080000
 #define E1000_MRQC_RSS_FIELD_IPV6              0x00100000
 #define E1000_MRQC_RSS_FIELD_IPV6_TCP          0x00200000
 
 #define E1000_RXDPS_HDRSTAT_HDRSP              0x00008000
-#define E1000_RXDPS_HDRSTAT_HDRLEN_MASK                0x000003FF
 
 /* Management Control */
 #define E1000_MANC_SMBUS_EN    0x00000001 /* SMBus Enabled - RO */
 #define E1000_MANC_ASF_EN      0x00000002 /* ASF Enabled - RO */
-#define E1000_MANC_R_ON_FORCE  0x00000004 /* Reset on Force TCO - RO */
-#define E1000_MANC_RMCP_EN     0x00000100 /* Enable RCMP 026Fh Filtering */
-#define E1000_MANC_0298_EN     0x00000200 /* Enable RCMP 0298h Filtering */
-#define E1000_MANC_IPV4_EN     0x00000400 /* Enable IPv4 */
-#define E1000_MANC_IPV6_EN     0x00000800 /* Enable IPv6 */
-#define E1000_MANC_SNAP_EN     0x00001000 /* Accept LLC/SNAP */
 #define E1000_MANC_ARP_EN      0x00002000 /* Enable ARP Request Filtering */
-/* Enable Neighbor Discovery Filtering */
-#define E1000_MANC_NEIGHBOR_EN 0x00004000
-#define E1000_MANC_ARP_RES_EN  0x00008000 /* Enable ARP response Filtering */
-#define E1000_MANC_TCO_RESET   0x00010000 /* TCO Reset Occurred */
 #define E1000_MANC_RCV_TCO_EN  0x00020000 /* Receive TCO Packets Enabled */
-#define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */
-#define E1000_MANC_RCV_ALL     0x00080000 /* Receive All Enabled */
 #define E1000_MANC_BLK_PHY_RST_ON_IDE  0x00040000 /* Block phy resets */
 /* Enable MAC address filtering */
 #define E1000_MANC_EN_MAC_ADDR_FILTER  0x00100000
 /* Enable MNG packets to host memory */
 #define E1000_MANC_EN_MNG2HOST         0x00200000
-/* Enable IP address filtering */
-#define E1000_MANC_EN_IP_ADDR_FILTER   0x00400000
-#define E1000_MANC_EN_XSUM_FILTER      0x00800000 /* Ena checksum filtering */
-#define E1000_MANC_BR_EN               0x01000000 /* Ena broadcast filtering */
-#define E1000_MANC_SMB_REQ             0x01000000 /* SMBus Request */
-#define E1000_MANC_SMB_GNT             0x02000000 /* SMBus Grant */
-#define E1000_MANC_SMB_CLK_IN          0x04000000 /* SMBus Clock In */
-#define E1000_MANC_SMB_DATA_IN         0x08000000 /* SMBus Data In */
-#define E1000_MANC_SMB_DATA_OUT                0x10000000 /* SMBus Data Out */
-#define E1000_MANC_SMB_CLK_OUT         0x20000000 /* SMBus Clock Out */
-#define E1000_MANC_MPROXYE             0x40000000 /* Mngment Proxy Enable */
-#define E1000_MANC_EN_BMC2OS           0x10000000 /* OS2BMC is enabld or not */
-
-#define E1000_MANC_SMB_DATA_OUT_SHIFT  28 /* SMBus Data Out Shift */
-#define E1000_MANC_SMB_CLK_OUT_SHIFT   29 /* SMBus Clock Out Shift */
 
 #define E1000_MANC2H_PORT_623          0x00000020 /* Port 0x26f */
 #define E1000_MANC2H_PORT_664          0x00000040 /* Port 0x298 */
@@ -355,19 +193,11 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_RCTL_LPE         0x00000020 /* long packet enable */
 #define E1000_RCTL_LBM_NO      0x00000000 /* no loopback mode */
 #define E1000_RCTL_LBM_MAC     0x00000040 /* MAC loopback mode */
-#define E1000_RCTL_LBM_SLP     0x00000080 /* serial link loopback mode */
 #define E1000_RCTL_LBM_TCVR    0x000000C0 /* tcvr loopback mode */
-#define E1000_RCTL_DTYP_MASK   0x00000C00 /* Descriptor type mask */
 #define E1000_RCTL_DTYP_PS     0x00000400 /* Packet Split descriptor */
 #define E1000_RCTL_RDMTS_HALF  0x00000000 /* Rx desc min thresh size */
-#define E1000_RCTL_RDMTS_QUAT  0x00000100 /* Rx desc min thresh size */
-#define E1000_RCTL_RDMTS_EIGTH 0x00000200 /* Rx desc min thresh size */
 #define E1000_RCTL_MO_SHIFT    12 /* multicast offset shift */
-#define E1000_RCTL_MO_0                0x00000000 /* multicast offset 11:0 */
-#define E1000_RCTL_MO_1                0x00001000 /* multicast offset 12:1 */
-#define E1000_RCTL_MO_2                0x00002000 /* multicast offset 13:2 */
 #define E1000_RCTL_MO_3                0x00003000 /* multicast offset 15:4 */
-#define E1000_RCTL_MDR         0x00004000 /* multicast desc ring 0 */
 #define E1000_RCTL_BAM         0x00008000 /* broadcast enable */
 /* these buffer sizes are valid if E1000_RCTL_BSEX is 0 */
 #define E1000_RCTL_SZ_2048     0x00000000 /* Rx buffer size 2048 */
@@ -385,11 +215,8 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_RCTL_PMCF                0x00800000 /* pass MAC control frames */
 #define E1000_RCTL_BSEX                0x02000000 /* Buffer size extension */
 #define E1000_RCTL_SECRC       0x04000000 /* Strip Ethernet CRC */
-#define E1000_RCTL_FLXBUF_MASK 0x78000000 /* Flexible buffer size */
-#define E1000_RCTL_FLXBUF_SHIFT        27 /* Flexible buffer shift */
 
-/*
- * Use byte values for the following shift parameters
+/* Use byte values for the following shift parameters
  * Usage:
  *     psrctl |= (((ROUNDUP(value0, 128) >> E1000_PSRCTL_BSIZE0_SHIFT) &
  *               E1000_PSRCTL_BSIZE0_MASK) |
@@ -424,16 +251,11 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_SWFW_PHY3_SM     0x40
 #define E1000_SWFW_SW_MNG_SM   0x400
 
-/* FACTPS Definitions */
-#define E1000_FACTPS_LFS       0x40000000  /* LAN Function Select */
 /* Device Control */
 #define E1000_CTRL_FD          0x00000001  /* Full duplex.0=half; 1=full */
-#define E1000_CTRL_BEM         0x00000002  /* Endian Mode.0=little,1=big */
 #define E1000_CTRL_PRIOR       0x00000004  /* Priority on PCI. 0=rx,1=fair */
 #define E1000_CTRL_GIO_MASTER_DISABLE 0x00000004 /*Blocks new Master reqs */
 #define E1000_CTRL_LRST                0x00000008  /* Link reset. 0=normal,1=reset */
-#define E1000_CTRL_TME         0x00000010  /* Test mode. 0=normal,1=test */
-#define E1000_CTRL_SLE         0x00000020  /* Serial Link on 0=dis,1=en */
 #define E1000_CTRL_ASDE                0x00000020  /* Auto-speed detect enable */
 #define E1000_CTRL_SLU         0x00000040  /* Set link up (Force Link) */
 #define E1000_CTRL_ILOS                0x00000080  /* Invert Loss-Of Signal */
@@ -441,50 +263,38 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_CTRL_SPD_10      0x00000000  /* Force 10Mb */
 #define E1000_CTRL_SPD_100     0x00000100  /* Force 100Mb */
 #define E1000_CTRL_SPD_1000    0x00000200  /* Force 1Gb */
-#define E1000_CTRL_BEM32       0x00000400  /* Big Endian 32 mode */
 #define E1000_CTRL_FRCSPD      0x00000800  /* Force Speed */
 #define E1000_CTRL_FRCDPX      0x00001000  /* Force Duplex */
-#define E1000_CTRL_D_UD_EN     0x00002000  /* Dock/Undock enable */
-/* Defined polarity of Dock/Undock indication in SDP[0] */
-#define E1000_CTRL_D_UD_POLARITY       0x00004000
-/* Reset both PHY ports, through PHYRST_N pin */
-#define E1000_CTRL_FORCE_PHY_RESET     0x00008000
-/* enable link status from external LINK_0 and LINK_1 pins */
-#define E1000_CTRL_EXT_LINK_EN         0x00010000
 #define E1000_CTRL_LANPHYPC_OVERRIDE   0x00010000 /* SW control of LANPHYPC */
 #define E1000_CTRL_LANPHYPC_VALUE      0x00020000 /* SW value of LANPHYPC */
+#define E1000_CTRL_MEHE                0x00080000 /* Memory Error Handling Enable */
 #define E1000_CTRL_SWDPIN0     0x00040000 /* SWDPIN 0 value */
 #define E1000_CTRL_SWDPIN1     0x00080000 /* SWDPIN 1 value */
 #define E1000_CTRL_SWDPIN2     0x00100000 /* SWDPIN 2 value */
 #define E1000_CTRL_ADVD3WUC    0x00100000 /* D3 WUC */
+#define E1000_CTRL_EN_PHY_PWR_MGMT     0x00200000 /* PHY PM enable */
 #define E1000_CTRL_SWDPIN3     0x00200000 /* SWDPIN 3 value */
 #define E1000_CTRL_SWDPIO0     0x00400000 /* SWDPIN 0 Input or output */
-#define E1000_CTRL_SWDPIO1     0x00800000 /* SWDPIN 1 input or output */
 #define E1000_CTRL_SWDPIO2     0x01000000 /* SWDPIN 2 input or output */
 #define E1000_CTRL_SWDPIO3     0x02000000 /* SWDPIN 3 input or output */
 #define E1000_CTRL_RST         0x04000000 /* Global reset */
 #define E1000_CTRL_RFCE                0x08000000 /* Receive Flow Control enable */
 #define E1000_CTRL_TFCE                0x10000000 /* Transmit flow control enable */
-#define E1000_CTRL_RTE         0x20000000 /* Routing tag enable */
 #define E1000_CTRL_VME         0x40000000 /* IEEE VLAN mode enable */
 #define E1000_CTRL_PHY_RST     0x80000000 /* PHY Reset */
-#define E1000_CTRL_SW2FW_INT   0x02000000 /* Initiate an interrupt to ME */
 #define E1000_CTRL_I2C_ENA     0x02000000 /* I2C enable */
 
-/*
- * Bit definitions for the Management Data IO (MDIO) and Management Data
- * Clock (MDC) pins in the Device Control Register.
- */
-#define E1000_CTRL_PHY_RESET_DIR       E1000_CTRL_SWDPIO0
-#define E1000_CTRL_PHY_RESET           E1000_CTRL_SWDPIN0
 #define E1000_CTRL_MDIO_DIR            E1000_CTRL_SWDPIO2
 #define E1000_CTRL_MDIO                        E1000_CTRL_SWDPIN2
 #define E1000_CTRL_MDC_DIR             E1000_CTRL_SWDPIO3
 #define E1000_CTRL_MDC                 E1000_CTRL_SWDPIN3
-#define E1000_CTRL_PHY_RESET_DIR4      E1000_CTRL_EXT_SDP4_DIR
-#define E1000_CTRL_PHY_RESET4          E1000_CTRL_EXT_SDP4_DATA
 
 #define E1000_CONNSW_ENRGSRC           0x4
+#define E1000_CONNSW_PHYSD             0x400
+#define E1000_CONNSW_PHY_PDN           0x800
+#define E1000_CONNSW_SERDESD           0x200
+#define E1000_CONNSW_AUTOSENSE_CONF    0x2
+#define E1000_CONNSW_AUTOSENSE_EN      0x1
 #define E1000_PCS_CFG_PCS_EN           8
 #define E1000_PCS_LCTL_FLV_LINK_UP     1
 #define E1000_PCS_LCTL_FSV_10          0
@@ -493,65 +303,39 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_PCS_LCTL_FDV_FULL                8
 #define E1000_PCS_LCTL_FSD             0x10
 #define E1000_PCS_LCTL_FORCE_LINK      0x20
-#define E1000_PCS_LCTL_LOW_LINK_LATCH  0x40
 #define E1000_PCS_LCTL_FORCE_FCTRL     0x80
 #define E1000_PCS_LCTL_AN_ENABLE       0x10000
 #define E1000_PCS_LCTL_AN_RESTART      0x20000
 #define E1000_PCS_LCTL_AN_TIMEOUT      0x40000
-#define E1000_PCS_LCTL_AN_SGMII_BYPASS 0x80000
-#define E1000_PCS_LCTL_AN_SGMII_TRIGGER        0x100000
-#define E1000_PCS_LCTL_FAST_LINK_TIMER 0x1000000
-#define E1000_PCS_LCTL_LINK_OK_FIX     0x2000000
-#define E1000_PCS_LCTL_CRS_ON_NI       0x4000000
 #define E1000_ENABLE_SERDES_LOOPBACK   0x0410
 
 #define E1000_PCS_LSTS_LINK_OK         1
-#define E1000_PCS_LSTS_SPEED_10                0
 #define E1000_PCS_LSTS_SPEED_100       2
 #define E1000_PCS_LSTS_SPEED_1000      4
 #define E1000_PCS_LSTS_DUPLEX_FULL     8
 #define E1000_PCS_LSTS_SYNK_OK         0x10
 #define E1000_PCS_LSTS_AN_COMPLETE     0x10000
-#define E1000_PCS_LSTS_AN_PAGE_RX      0x20000
-#define E1000_PCS_LSTS_AN_TIMED_OUT    0x40000
-#define E1000_PCS_LSTS_AN_REMOTE_FAULT 0x80000
-#define E1000_PCS_LSTS_AN_ERROR_RWS    0x100000
 
 /* Device Status */
 #define E1000_STATUS_FD                        0x00000001 /* Duplex 0=half 1=full */
 #define E1000_STATUS_LU                        0x00000002 /* Link up.0=no,1=link */
 #define E1000_STATUS_FUNC_MASK         0x0000000C /* PCI Function Mask */
 #define E1000_STATUS_FUNC_SHIFT                2
-#define E1000_STATUS_FUNC_0            0x00000000 /* Function 0 */
 #define E1000_STATUS_FUNC_1            0x00000004 /* Function 1 */
 #define E1000_STATUS_TXOFF             0x00000010 /* transmission paused */
-#define E1000_STATUS_TBIMODE           0x00000020 /* TBI mode */
-#define E1000_STATUS_SPEED_MASK                0x000000C0
+#define E1000_STATUS_SPEED_MASK        0x000000C0
 #define E1000_STATUS_SPEED_10          0x00000000 /* Speed 10Mb/s */
 #define E1000_STATUS_SPEED_100         0x00000040 /* Speed 100Mb/s */
 #define E1000_STATUS_SPEED_1000                0x00000080 /* Speed 1000Mb/s */
 #define E1000_STATUS_LAN_INIT_DONE     0x00000200 /* Lan Init Compltn by NVM */
-#define E1000_STATUS_ASDV              0x00000300 /* Auto speed detect value */
 #define E1000_STATUS_PHYRA             0x00000400 /* PHY Reset Asserted */
-/* Change in Dock/Undock state clear on write '0'. */
-#define E1000_STATUS_DOCK_CI           0x00000800
 #define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Master request status */
-#define E1000_STATUS_MTXCKOK           0x00000400 /* MTX clock running OK */
 #define E1000_STATUS_PCI66             0x00000800 /* In 66Mhz slot */
 #define E1000_STATUS_BUS64             0x00001000 /* In 64 bit slot */
+#define E1000_STATUS_2P5_SKU           0x00001000 /* Val of 2.5GBE SKU strap */
+#define E1000_STATUS_2P5_SKU_OVER      0x00002000 /* Val of 2.5GBE SKU Over */
 #define E1000_STATUS_PCIX_MODE         0x00002000 /* PCI-X mode */
 #define E1000_STATUS_PCIX_SPEED                0x0000C000 /* PCI-X bus speed */
-#define E1000_STATUS_BMC_SKU_0         0x00100000 /* BMC USB redirect disbld */
-#define E1000_STATUS_BMC_SKU_1         0x00200000 /* BMC SRAM disabled */
-#define E1000_STATUS_BMC_SKU_2         0x00400000 /* BMC SDRAM disabled */
-#define E1000_STATUS_BMC_CRYPTO                0x00800000 /* BMC crypto disabled */
-/* BMC external code execution disabled */
-#define E1000_STATUS_BMC_LITE          0x01000000
-#define E1000_STATUS_RGMII_ENABLE      0x02000000 /* RGMII disabled */
-#define E1000_STATUS_FUSE_8            0x04000000
-#define E1000_STATUS_FUSE_9            0x08000000
-#define E1000_STATUS_SERDES0_DIS       0x10000000 /* SERDES disbld on port 0 */
-#define E1000_STATUS_SERDES1_DIS       0x20000000 /* SERDES disbld on port 1 */
 
 /* Constants used to interpret the masked PCI-X bus speed. */
 #define E1000_STATUS_PCIX_SPEED_66     0x00000000 /* PCI-X bus spd 50-66MHz */
@@ -561,6 +345,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #define SPEED_10       10
 #define SPEED_100      100
 #define SPEED_1000     1000
+#define SPEED_2500     2500
 #define HALF_DUPLEX    1
 #define FULL_DUPLEX    2
 
@@ -582,8 +367,6 @@ POSSIBILITY OF SUCH DAMAGE.
        ADVERTISE_100_FULL)
 #define E1000_ALL_100_SPEED    (ADVERTISE_100_HALF | ADVERTISE_100_FULL)
 #define E1000_ALL_10_SPEED     (ADVERTISE_10_HALF | ADVERTISE_10_FULL)
-#define E1000_ALL_FULL_DUPLEX  ( \
-       ADVERTISE_10_FULL | ADVERTISE_100_FULL | ADVERTISE_1000_FULL)
 #define E1000_ALL_HALF_DUPLEX  (ADVERTISE_10_HALF | ADVERTISE_100_HALF)
 
 #define AUTONEG_ADVERTISE_SPEED_DEFAULT                E1000_ALL_SPEED_DUPLEX
@@ -591,51 +374,20 @@ POSSIBILITY OF SUCH DAMAGE.
 /* LED Control */
 #define E1000_PHY_LED0_MODE_MASK       0x00000007
 #define E1000_PHY_LED0_IVRT            0x00000008
-#define E1000_PHY_LED0_BLINK           0x00000010
 #define E1000_PHY_LED0_MASK            0x0000001F
 
 #define E1000_LEDCTL_LED0_MODE_MASK    0x0000000F
 #define E1000_LEDCTL_LED0_MODE_SHIFT   0
-#define E1000_LEDCTL_LED0_BLINK_RATE   0x00000020
 #define E1000_LEDCTL_LED0_IVRT         0x00000040
 #define E1000_LEDCTL_LED0_BLINK                0x00000080
-#define E1000_LEDCTL_LED1_MODE_MASK    0x00000F00
-#define E1000_LEDCTL_LED1_MODE_SHIFT   8
-#define E1000_LEDCTL_LED1_BLINK_RATE   0x00002000
-#define E1000_LEDCTL_LED1_IVRT         0x00004000
-#define E1000_LEDCTL_LED1_BLINK                0x00008000
-#define E1000_LEDCTL_LED2_MODE_MASK    0x000F0000
-#define E1000_LEDCTL_LED2_MODE_SHIFT   16
-#define E1000_LEDCTL_LED2_BLINK_RATE   0x00200000
-#define E1000_LEDCTL_LED2_IVRT         0x00400000
-#define E1000_LEDCTL_LED2_BLINK                0x00800000
-#define E1000_LEDCTL_LED3_MODE_MASK    0x0F000000
-#define E1000_LEDCTL_LED3_MODE_SHIFT   24
-#define E1000_LEDCTL_LED3_BLINK_RATE   0x20000000
-#define E1000_LEDCTL_LED3_IVRT         0x40000000
-#define E1000_LEDCTL_LED3_BLINK                0x80000000
-
-#define E1000_LEDCTL_MODE_LINK_10_1000 0x0
-#define E1000_LEDCTL_MODE_LINK_100_1000        0x1
+
 #define E1000_LEDCTL_MODE_LINK_UP      0x2
-#define E1000_LEDCTL_MODE_ACTIVITY     0x3
-#define E1000_LEDCTL_MODE_LINK_ACTIVITY        0x4
-#define E1000_LEDCTL_MODE_LINK_10      0x5
-#define E1000_LEDCTL_MODE_LINK_100     0x6
-#define E1000_LEDCTL_MODE_LINK_1000    0x7
-#define E1000_LEDCTL_MODE_PCIX_MODE    0x8
-#define E1000_LEDCTL_MODE_FULL_DUPLEX  0x9
-#define E1000_LEDCTL_MODE_COLLISION    0xA
-#define E1000_LEDCTL_MODE_BUS_SPEED    0xB
-#define E1000_LEDCTL_MODE_BUS_SIZE     0xC
-#define E1000_LEDCTL_MODE_PAUSED       0xD
 #define E1000_LEDCTL_MODE_LED_ON       0xE
 #define E1000_LEDCTL_MODE_LED_OFF      0xF
 
 /* Transmit Descriptor bit definitions */
 #define E1000_TXD_DTYP_D       0x00100000 /* Data Descriptor */
 #define E1000_TXD_DTYP_C       0x00000000 /* Context Descriptor */
-#define E1000_TXD_POPTS_SHIFT  8          /* POPTS shift */
 #define E1000_TXD_POPTS_IXSM   0x01       /* Insert IP checksum */
 #define E1000_TXD_POPTS_TXSM   0x02       /* Insert TCP/UDP checksum */
 #define E1000_TXD_CMD_EOP      0x01000000 /* End of Packet */
@@ -654,21 +406,14 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_TXD_CMD_IP       0x02000000 /* IP packet */
 #define E1000_TXD_CMD_TSE      0x04000000 /* TCP Seg enable */
 #define E1000_TXD_STAT_TC      0x00000004 /* Tx Underrun */
-/* Extended desc bits for Linksec and timesync */
-#define E1000_TXD_CMD_LINKSEC  0x10000000 /* Apply LinkSec on packet */
 #define E1000_TXD_EXTCMD_TSTAMP        0x00000010 /* IEEE1588 Timestamp packet */
 
 /* Transmit Control */
-#define E1000_TCTL_RST         0x00000001 /* software reset */
 #define E1000_TCTL_EN          0x00000002 /* enable Tx */
-#define E1000_TCTL_BCE         0x00000004 /* busy check enable */
 #define E1000_TCTL_PSP         0x00000008 /* pad short packets */
 #define E1000_TCTL_CT          0x00000ff0 /* collision threshold */
 #define E1000_TCTL_COLD                0x003ff000 /* collision distance */
-#define E1000_TCTL_SWXOFF      0x00400000 /* SW Xoff transmission */
-#define E1000_TCTL_PBE         0x00800000 /* Packet Burst Enable */
 #define E1000_TCTL_RTLC                0x01000000 /* Re-transmit on late collision */
-#define E1000_TCTL_NRTU                0x02000000 /* No Re-transmit on underrun */
 #define E1000_TCTL_MULR                0x10000000 /* Multiple request support */
 
 /* Transmit Arbitration Count */
@@ -676,29 +421,19 @@ POSSIBILITY OF SUCH DAMAGE.
 
 /* SerDes Control */
 #define E1000_SCTL_DISABLE_SERDES_LOOPBACK     0x0400
+#define E1000_SCTL_ENABLE_SERDES_LOOPBACK      0x0410
 
 /* Receive Checksum Control */
-#define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */
 #define E1000_RXCSUM_IPOFL     0x00000100 /* IPv4 checksum offload */
 #define E1000_RXCSUM_TUOFL     0x00000200 /* TCP / UDP checksum offload */
-#define E1000_RXCSUM_IPV6OFL   0x00000400 /* IPv6 checksum offload */
 #define E1000_RXCSUM_CRCOFL    0x00000800 /* CRC32 offload enable */
 #define E1000_RXCSUM_IPPCSE    0x00001000 /* IP payload checksum enable */
 #define E1000_RXCSUM_PCSD      0x00002000 /* packet checksum disabled */
 
 /* Header split receive */
-#define E1000_RFCTL_ISCSI_DIS          0x00000001
-#define E1000_RFCTL_ISCSI_DWC_MASK     0x0000003E
-#define E1000_RFCTL_ISCSI_DWC_SHIFT    1
 #define E1000_RFCTL_NFSW_DIS           0x00000040
 #define E1000_RFCTL_NFSR_DIS           0x00000080
-#define E1000_RFCTL_NFS_VER_MASK       0x00000300
-#define E1000_RFCTL_NFS_VER_SHIFT      8
-#define E1000_RFCTL_IPV6_DIS           0x00000400
-#define E1000_RFCTL_IPV6_XSUM_DIS      0x00000800
 #define E1000_RFCTL_ACK_DIS            0x00001000
-#define E1000_RFCTL_ACKD_DIS           0x00002000
-#define E1000_RFCTL_IPFRSP_DIS         0x00004000
 #define E1000_RFCTL_EXTEN              0x00008000
 #define E1000_RFCTL_IPV6_EX_DIS                0x00010000
 #define E1000_RFCTL_NEW_IPV6_EXT_DIS   0x00020000
@@ -716,8 +451,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define DEFAULT_82543_TIPG_IPGT_COPPER 8
 
 #define E1000_TIPG_IPGT_MASK           0x000003FF
-#define E1000_TIPG_IPGR1_MASK          0x000FFC00
-#define E1000_TIPG_IPGR2_MASK          0x3FF00000
 
 #define DEFAULT_82542_TIPG_IPGR1       2
 #define DEFAULT_82543_TIPG_IPGR1       8
@@ -745,7 +478,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK 0x0FFF0000
 #define E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT        16
 
-#define E1000_PHY_CTRL_SPD_EN                  0x00000001
 #define E1000_PHY_CTRL_D0A_LPLU                        0x00000002
 #define E1000_PHY_CTRL_NOND0A_LPLU             0x00000004
 #define E1000_PHY_CTRL_NOND0A_GBE_DISABLE      0x00000008
@@ -754,12 +486,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_KABGTXD_BGSQLBIAS                        0x00050000
 
 /* Low Power IDLE Control */
-#define E1000_LPIC_1000ENABLE          0x00010000
-#define E1000_LPIC_100ENABLE           0x00020000
 #define E1000_LPIC_LPIET_SHIFT         24      /* Low Power Idle Entry Time */
 
 /* PBA constants */
-#define E1000_PBA_6K           0x0006    /* 6KB */
 #define E1000_PBA_8K           0x0008    /* 8KB */
 #define E1000_PBA_10K          0x000A    /* 10KB */
 #define E1000_PBA_12K          0x000C    /* 12KB */
@@ -782,7 +511,12 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_PBA_RXA_MASK     0xFFFF
 
 #define E1000_PBS_16K          E1000_PBA_16K
-#define E1000_PBS_24K          E1000_PBA_24K
+
+/* Uncorrectable/correctable ECC Error counts and enable bits */
+#define E1000_PBECCSTS_CORR_ERR_CNT_MASK       0x000000FF
+#define E1000_PBECCSTS_UNCORR_ERR_CNT_MASK     0x0000FF00
+#define E1000_PBECCSTS_UNCORR_ERR_CNT_SHIFT    8
+#define E1000_PBECCSTS_ECC_ENABLE              0x00010000
 
 #define IFS_MAX                        80
 #define IFS_MIN                        40
@@ -793,7 +527,6 @@ POSSIBILITY OF SUCH DAMAGE.
 /* SW Semaphore Register */
 #define E1000_SWSM_SMBI                0x00000001 /* Driver Semaphore bit */
 #define E1000_SWSM_SWESMBI     0x00000002 /* FW Semaphore bit */
-#define E1000_SWSM_WMNG                0x00000004 /* Wake MNG Clock */
 #define E1000_SWSM_DRV_LOAD    0x00000008 /* Driver Loaded Bit */
 
 #define E1000_SWSM2_LOCK       0x00000002 /* Secondary driver semaphore bit */
@@ -807,34 +540,19 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_ICR_RXO          0x00000040 /* Rx overrun */
 #define E1000_ICR_RXT0         0x00000080 /* Rx timer intr (ring 0) */
 #define E1000_ICR_VMMB         0x00000100 /* VM MB event */
-#define E1000_ICR_MDAC         0x00000200 /* MDIO access complete */
 #define E1000_ICR_RXCFG                0x00000400 /* Rx /c/ ordered set */
 #define E1000_ICR_GPI_EN0      0x00000800 /* GP Int 0 */
 #define E1000_ICR_GPI_EN1      0x00001000 /* GP Int 1 */
 #define E1000_ICR_GPI_EN2      0x00002000 /* GP Int 2 */
 #define E1000_ICR_GPI_EN3      0x00004000 /* GP Int 3 */
 #define E1000_ICR_TXD_LOW      0x00008000
-#define E1000_ICR_SRPD         0x00010000
-#define E1000_ICR_ACK          0x00020000 /* Receive Ack frame */
 #define E1000_ICR_MNG          0x00040000 /* Manageability event */
-#define E1000_ICR_DOCK         0x00080000 /* Dock/Undock */
+#define E1000_ICR_ECCER                0x00400000 /* Uncorrectable ECC Error */
 #define E1000_ICR_TS           0x00080000 /* Time Sync Interrupt */
 #define E1000_ICR_DRSTA                0x40000000 /* Device Reset Asserted */
 /* If this bit asserted, the driver should claim the interrupt */
 #define E1000_ICR_INT_ASSERTED 0x80000000
-#define E1000_ICR_RXD_FIFO_PAR0        0x00100000 /* Q0 Rx desc FIFO parity error */
-#define E1000_ICR_TXD_FIFO_PAR0        0x00200000 /* Q0 Tx desc FIFO parity error */
-#define E1000_ICR_HOST_ARB_PAR 0x00400000 /* host arb read buffer parity err */
-#define E1000_ICR_PB_PAR       0x00800000 /* packet buffer parity error */
-#define E1000_ICR_RXD_FIFO_PAR1        0x01000000 /* Q1 Rx desc FIFO parity error */
-#define E1000_ICR_TXD_FIFO_PAR1        0x02000000 /* Q1 Tx desc FIFO parity error */
-#define E1000_ICR_ALL_PARITY   0x03F00000 /* all parity error bits */
-/* FW changed the status of DISSW bit in the FWSM */
-#define E1000_ICR_DSW          0x00000020
-/* LAN connected device generates an interrupt */
-#define E1000_ICR_PHYINT       0x00001000
 #define E1000_ICR_DOUTSYNC     0x10000000 /* NIC DMA out of sync */
-#define E1000_ICR_EPRST                0x00100000 /* ME hardware reset occurs */
 #define E1000_ICR_RXQ0         0x00100000 /* Rx Queue 0 Interrupt */
 #define E1000_ICR_RXQ1         0x00200000 /* Rx Queue 1 Interrupt */
 #define E1000_ICR_TXQ0         0x00400000 /* Tx Queue 0 Interrupt */
@@ -845,9 +563,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_ICR_THS          0x00800000 /* ICR.THS: Thermal Sensor Event*/
 #define E1000_ICR_MDDET                0x10000000 /* Malicious Driver Detect */
 
-#define E1000_ITR_MASK         0x000FFFFF /* ITR value bitfield */
-#define E1000_ITR_MULT         256 /* ITR mulitplier in nsec */
-
 /* PBA ECC Register */
 #define E1000_PBA_ECC_COUNTER_MASK     0xFFF00000 /* ECC counter mask */
 #define E1000_PBA_ECC_COUNTER_SHIFT    20 /* ECC counter shift value */
@@ -872,16 +587,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_TCPTIMER_COUNT_FINISH    0x00000400 /* Count finish */
 #define E1000_TCPTIMER_LOOP    0x00000800 /* Loop */
 
-/*
- * This defines the bits that are set in the Interrupt Mask
- * Set/Read Register.  Each bit is documented below:
- *   o RXDMT0 = Receive Descriptor Minimum Threshold hit (ring 0)
- *   o RXSEQ  = Receive Sequence Error
- */
-#define POLL_IMS_ENABLE_MASK ( \
-       E1000_IMS_RXDMT0 |    \
-       E1000_IMS_RXSEQ)
-
 /* This defines the bits that are set in the Interrupt Mask
  * Set/Read Register.  Each bit is documented below:
  *   o RXT0   = Receiver Timer Interrupt (ring 0)
@@ -906,35 +611,11 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_IMS_RXDMT0       E1000_ICR_RXDMT0  /* Rx desc min. threshold */
 #define E1000_IMS_RXO          E1000_ICR_RXO     /* Rx overrun */
 #define E1000_IMS_RXT0         E1000_ICR_RXT0    /* Rx timer intr */
-#define E1000_IMS_MDAC         E1000_ICR_MDAC    /* MDIO access complete */
-#define E1000_IMS_RXCFG                E1000_ICR_RXCFG   /* Rx /c/ ordered set */
-#define E1000_IMS_GPI_EN0      E1000_ICR_GPI_EN0 /* GP Int 0 */
-#define E1000_IMS_GPI_EN1      E1000_ICR_GPI_EN1 /* GP Int 1 */
-#define E1000_IMS_GPI_EN2      E1000_ICR_GPI_EN2 /* GP Int 2 */
-#define E1000_IMS_GPI_EN3      E1000_ICR_GPI_EN3 /* GP Int 3 */
 #define E1000_IMS_TXD_LOW      E1000_ICR_TXD_LOW
-#define E1000_IMS_SRPD         E1000_ICR_SRPD
-#define E1000_IMS_ACK          E1000_ICR_ACK     /* Receive Ack frame */
-#define E1000_IMS_MNG          E1000_ICR_MNG     /* Manageability event */
-#define E1000_IMS_DOCK         E1000_ICR_DOCK    /* Dock/Undock */
+#define E1000_IMS_ECCER                E1000_ICR_ECCER   /* Uncorrectable ECC Error */
 #define E1000_IMS_TS           E1000_ICR_TS      /* Time Sync Interrupt */
 #define E1000_IMS_DRSTA                E1000_ICR_DRSTA   /* Device Reset Asserted */
-/* Q0 Rx desc FIFO parity error */
-#define E1000_IMS_RXD_FIFO_PAR0        E1000_ICR_RXD_FIFO_PAR0
-/* Q0 Tx desc FIFO parity error */
-#define E1000_IMS_TXD_FIFO_PAR0        E1000_ICR_TXD_FIFO_PAR0
-/* host arb read buffer parity error */
-#define E1000_IMS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR
-/* packet buffer parity error */
-#define E1000_IMS_PB_PAR       E1000_ICR_PB_PAR
-/* Q1 Rx desc FIFO parity error */
-#define E1000_IMS_RXD_FIFO_PAR1        E1000_ICR_RXD_FIFO_PAR1
-/* Q1 Tx desc FIFO parity error */
-#define E1000_IMS_TXD_FIFO_PAR1        E1000_ICR_TXD_FIFO_PAR1
-#define E1000_IMS_DSW          E1000_ICR_DSW
-#define E1000_IMS_PHYINT       E1000_ICR_PHYINT
 #define E1000_IMS_DOUTSYNC     E1000_ICR_DOUTSYNC /* NIC DMA out of sync */
-#define E1000_IMS_EPRST                E1000_ICR_EPRST
 #define E1000_IMS_RXQ0         E1000_ICR_RXQ0 /* Rx Queue 0 Interrupt */
 #define E1000_IMS_RXQ1         E1000_ICR_RXQ1 /* Rx Queue 1 Interrupt */
 #define E1000_IMS_TXQ0         E1000_ICR_TXQ0 /* Tx Queue 0 Interrupt */
@@ -957,41 +638,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_EIMS_OTHER       E1000_EICR_OTHER   /* Interrupt Cause Active */
 
 /* Interrupt Cause Set */
-#define E1000_ICS_TXDW         E1000_ICR_TXDW      /* Tx desc written back */
-#define E1000_ICS_TXQE         E1000_ICR_TXQE      /* Transmit Queue empty */
 #define E1000_ICS_LSC          E1000_ICR_LSC       /* Link Status Change */
 #define E1000_ICS_RXSEQ                E1000_ICR_RXSEQ     /* Rx sequence error */
 #define E1000_ICS_RXDMT0       E1000_ICR_RXDMT0    /* Rx desc min. threshold */
-#define E1000_ICS_RXO          E1000_ICR_RXO       /* Rx overrun */
-#define E1000_ICS_RXT0         E1000_ICR_RXT0      /* Rx timer intr */
-#define E1000_ICS_MDAC         E1000_ICR_MDAC      /* MDIO access complete */
-#define E1000_ICS_RXCFG                E1000_ICR_RXCFG     /* Rx /c/ ordered set */
-#define E1000_ICS_GPI_EN0      E1000_ICR_GPI_EN0   /* GP Int 0 */
-#define E1000_ICS_GPI_EN1      E1000_ICR_GPI_EN1   /* GP Int 1 */
-#define E1000_ICS_GPI_EN2      E1000_ICR_GPI_EN2   /* GP Int 2 */
-#define E1000_ICS_GPI_EN3      E1000_ICR_GPI_EN3   /* GP Int 3 */
-#define E1000_ICS_TXD_LOW      E1000_ICR_TXD_LOW
-#define E1000_ICS_SRPD         E1000_ICR_SRPD
-#define E1000_ICS_ACK          E1000_ICR_ACK       /* Receive Ack frame */
-#define E1000_ICS_MNG          E1000_ICR_MNG       /* Manageability event */
-#define E1000_ICS_DOCK         E1000_ICR_DOCK      /* Dock/Undock */
-#define E1000_ICS_DRSTA                E1000_ICR_DRSTA     /* Device Reset Aserted */
-/* Q0 Rx desc FIFO parity error */
-#define E1000_ICS_RXD_FIFO_PAR0        E1000_ICR_RXD_FIFO_PAR0
-/* Q0 Tx desc FIFO parity error */
-#define E1000_ICS_TXD_FIFO_PAR0        E1000_ICR_TXD_FIFO_PAR0
-/* host arb read buffer parity error */
-#define E1000_ICS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR
-/* packet buffer parity error */
-#define E1000_ICS_PB_PAR       E1000_ICR_PB_PAR
-/* Q1 Rx desc FIFO parity error */
-#define E1000_ICS_RXD_FIFO_PAR1        E1000_ICR_RXD_FIFO_PAR1
-/* Q1 Tx desc FIFO parity error */
-#define E1000_ICS_TXD_FIFO_PAR1        E1000_ICR_TXD_FIFO_PAR1
-#define E1000_ICS_DSW          E1000_ICR_DSW
-#define E1000_ICS_DOUTSYNC     E1000_ICR_DOUTSYNC /* NIC DMA out of sync */
-#define E1000_ICS_PHYINT       E1000_ICR_PHYINT
-#define E1000_ICS_EPRST                E1000_ICR_EPRST
 
 /* Extended Interrupt Cause Set */
 #define E1000_EICS_RX_QUEUE0   E1000_EICR_RX_QUEUE0 /* Rx Queue 0 Interrupt */
@@ -1008,13 +657,13 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_EITR_ITR_INT_MASK        0x0000FFFF
 /* E1000_EITR_CNT_IGNR is only for 82576 and newer */
 #define E1000_EITR_CNT_IGNR    0x80000000 /* Don't reset counters on write */
+#define E1000_EITR_INTERVAL 0x00007FFC
 
 /* Transmit Descriptor Control */
 #define E1000_TXDCTL_PTHRESH   0x0000003F /* TXDCTL Prefetch Threshold */
 #define E1000_TXDCTL_HTHRESH   0x00003F00 /* TXDCTL Host Threshold */
 #define E1000_TXDCTL_WTHRESH   0x003F0000 /* TXDCTL Writeback Threshold */
 #define E1000_TXDCTL_GRAN      0x01000000 /* TXDCTL Granularity */
-#define E1000_TXDCTL_LWTHRESH  0xFE000000 /* TXDCTL Low Threshold */
 #define E1000_TXDCTL_FULL_TX_DESC_WB   0x01010000 /* GRAN=1, WTHRESH=1 */
 #define E1000_TXDCTL_MAX_TX_DESC_PREFETCH 0x0100001F /* GRAN=1, PTHRESH=31 */
 /* Enable the counting of descriptors still to be processed. */
@@ -1041,8 +690,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_RAL_MAC_ADDR_LEN 4
 #define E1000_RAH_MAC_ADDR_LEN 2
 #define E1000_RAH_QUEUE_MASK_82575     0x000C0000
-#define E1000_RAH_POOL_MASK    0x03FC0000
-#define E1000_RAH_POOL_SHIFT   18
 #define E1000_RAH_POOL_1       0x00040000
 
 /* Error Codes */
@@ -1082,30 +729,21 @@ POSSIBILITY OF SUCH DAMAGE.
 
 /* Flow Control */
 #define E1000_FCRTH_RTH                0x0000FFF8 /* Mask Bits[15:3] for RTH */
-#define E1000_FCRTH_XFCE       0x80000000 /* External Flow Control Enable */
 #define E1000_FCRTL_RTL                0x0000FFF8 /* Mask Bits[15:3] for RTL */
 #define E1000_FCRTL_XONE       0x80000000 /* Enable XON frame transmission */
 
 /* Transmit Configuration Word */
 #define E1000_TXCW_FD          0x00000020 /* TXCW full duplex */
-#define E1000_TXCW_HD          0x00000040 /* TXCW half duplex */
 #define E1000_TXCW_PAUSE       0x00000080 /* TXCW sym pause request */
 #define E1000_TXCW_ASM_DIR     0x00000100 /* TXCW astm pause direction */
 #define E1000_TXCW_PAUSE_MASK  0x00000180 /* TXCW pause request mask */
-#define E1000_TXCW_RF          0x00003000 /* TXCW remote fault */
-#define E1000_TXCW_NP          0x00008000 /* TXCW next page */
-#define E1000_TXCW_CW          0x0000ffff /* TxConfigWord mask */
-#define E1000_TXCW_TXC         0x40000000 /* Transmit Config control */
 #define E1000_TXCW_ANE         0x80000000 /* Auto-neg enable */
 
 /* Receive Configuration Word */
 #define E1000_RXCW_CW          0x0000ffff /* RxConfigWord mask */
-#define E1000_RXCW_NC          0x04000000 /* Receive config no carrier */
 #define E1000_RXCW_IV          0x08000000 /* Receive config invalid */
-#define E1000_RXCW_CC          0x10000000 /* Receive config change */
 #define E1000_RXCW_C           0x20000000 /* Receive config */
 #define E1000_RXCW_SYNCH       0x40000000 /* Receive config synch */
-#define E1000_RXCW_ANC         0x80000000 /* Auto-neg complete */
 
 #define E1000_TSYNCTXCTL_VALID         0x00000001 /* Tx timestamp valid */
 #define E1000_TSYNCTXCTL_ENABLED       0x00000010 /* enable Tx timestamping */
@@ -1175,6 +813,17 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_MDICNFG_PHY_MASK         0x03E00000
 #define E1000_MDICNFG_PHY_SHIFT                21
 
+#define E1000_MEDIA_PORT_COPPER                        1
+#define E1000_MEDIA_PORT_OTHER                 2
+#define E1000_M88E1112_AUTO_COPPER_SGMII       0x2
+#define E1000_M88E1112_AUTO_COPPER_BASEX       0x3
+#define E1000_M88E1112_STATUS_LINK             0x0004 /* Interface Link Bit */
+#define E1000_M88E1112_MAC_CTRL_1              0x10
+#define E1000_M88E1112_MAC_CTRL_1_MODE_MASK    0x0380 /* Mode Select */
+#define E1000_M88E1112_MAC_CTRL_1_MODE_SHIFT   7
+#define E1000_M88E1112_PAGE_ADDR               0x16
+#define E1000_M88E1112_STATUS                  0x01
+
 #define E1000_THSTAT_LOW_EVENT         0x20000000 /* Low thermal threshold */
 #define E1000_THSTAT_MID_EVENT         0x00200000 /* Mid thermal threshold */
 #define E1000_THSTAT_HIGH_EVENT                0x00002000 /* High thermal threshold */
@@ -1191,7 +840,21 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_EEER_EEE_NEG             0x20000000 /* EEE capability nego */
 #define E1000_EEER_RX_LPI_STATUS       0x40000000 /* Rx in LPI state */
 #define E1000_EEER_TX_LPI_STATUS       0x80000000 /* Tx in LPI state */
+#define E1000_EEE_LP_ADV_ADDR_I350     0x040F     /* EEE LP Advertisement */
+#define E1000_M88E1543_PAGE_ADDR       0x16       /* Page Offset Register */
+#define E1000_M88E1543_EEE_CTRL_1      0x0
+#define E1000_M88E1543_EEE_CTRL_1_MS   0x0001     /* EEE Master/Slave */
+#define E1000_EEE_ADV_DEV_I354         7
+#define E1000_EEE_ADV_ADDR_I354                60
+#define E1000_EEE_ADV_100_SUPPORTED    (1 << 1)   /* 100BaseTx EEE Supported */
+#define E1000_EEE_ADV_1000_SUPPORTED   (1 << 2)   /* 1000BaseT EEE Supported */
+#define E1000_PCS_STATUS_DEV_I354      3
+#define E1000_PCS_STATUS_ADDR_I354     1
+#define E1000_PCS_STATUS_RX_LPI_RCVD   0x0400
+#define E1000_PCS_STATUS_TX_LPI_RCVD   0x0800
 #define E1000_EEE_SU_LPI_CLK_STP       0x00800000 /* EEE LPI Clock Stop */
+#define E1000_EEE_LP_ADV_DEV_I210      7          /* EEE LP Adv Device */
+#define E1000_EEE_LP_ADV_ADDR_I210     61         /* EEE LP Adv Register */
 /* PCI Express Control */
 #define E1000_GCR_RXD_NO_SNOOP         0x00000001
 #define E1000_GCR_RXDSCW_NO_SNOOP      0x00000002
@@ -1211,6 +874,8 @@ POSSIBILITY OF SUCH DAMAGE.
                                 E1000_GCR_TXDSCW_NO_SNOOP | \
                                 E1000_GCR_TXDSCR_NO_SNOOP)
 
+#define E1000_MMDAC_FUNC_DATA  0x4000 /* Data, no post increment */
+
 /* mPHY address control and data registers */
 #define E1000_MPHY_ADDR_CTL            0x0024 /* Address Control Reg */
 #define E1000_MPHY_ADDR_CTL_OFFSET_MASK        0xFFFF0000
@@ -1335,10 +1000,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_EECD_CS          0x00000002 /* NVM Chip Select */
 #define E1000_EECD_DI          0x00000004 /* NVM Data In */
 #define E1000_EECD_DO          0x00000008 /* NVM Data Out */
-#define E1000_EECD_FWE_MASK    0x00000030
-#define E1000_EECD_FWE_DIS     0x00000010 /* Disable FLASH writes */
-#define E1000_EECD_FWE_EN      0x00000020 /* Enable FLASH writes */
-#define E1000_EECD_FWE_SHIFT   4
 #define E1000_EECD_REQ         0x00000040 /* NVM Access Request */
 #define E1000_EECD_GNT         0x00000080 /* NVM Access Grant */
 #define E1000_EECD_PRES                0x00000100 /* NVM Present */
@@ -1356,14 +1017,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_EECD_AUTO_RD             0x00000200  /* NVM Auto Read done */
 #define E1000_EECD_SIZE_EX_MASK                0x00007800  /* NVM Size */
 #define E1000_EECD_SIZE_EX_SHIFT       11
-#define E1000_EECD_NVADDS              0x00018000 /* NVM Address Size */
-#define E1000_EECD_SELSHAD             0x00020000 /* Select Shadow RAM */
-#define E1000_EECD_INITSRAM            0x00040000 /* Initialize Shadow RAM */
 #define E1000_EECD_FLUPD               0x00080000 /* Update FLASH */
 #define E1000_EECD_AUPDEN              0x00100000 /* Ena Auto FLASH update */
-#define E1000_EECD_SHADV               0x00200000 /* Shadow RAM Data Valid */
 #define E1000_EECD_SEC1VAL             0x00400000 /* Sector One Valid */
-#define E1000_EECD_SECVAL_SHIFT                22
 #define E1000_EECD_SEC1VAL_VALID_MASK  (E1000_EECD_AUTO_RD | E1000_EECD_PRES)
 #define E1000_EECD_FLUPD_I210          0x00800000 /* Update FLASH */
 #define E1000_EECD_FLUDONE_I210                0x04000000 /* Update FLASH done */
@@ -1377,8 +1033,12 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_I210_FIFO_SEL_BMC2OS_TX  0x06
 #define E1000_I210_FIFO_SEL_BMC2OS_RX  0x01
 
-#define E1000_NVM_SWDPIN0      0x0001 /* SWDPIN 0 NVM Value */
-#define E1000_NVM_LED_LOGIC    0x0020 /* Led Logic Word */
+#define E1000_I210_FLASH_SECTOR_SIZE   0x1000 /* 4KB FLASH sector unit size */
+/* Secure FLASH mode requires removing MSb */
+#define E1000_I210_FW_PTR_MASK         0x7FFF
+/* Firmware code revision field word offset*/
+#define E1000_I210_FW_VER_OFFSET       328
+
 #define E1000_NVM_RW_REG_DATA  16  /* Offset to data in NVM read/write regs */
 #define E1000_NVM_RW_REG_DONE  2   /* Offset to READ/WRITE done bit */
 #define E1000_NVM_RW_REG_START 1   /* Start operation */
@@ -1393,20 +1053,40 @@ POSSIBILITY OF SUCH DAMAGE.
 #define NVM_VERSION                    0x0005
 #define NVM_SERDES_AMPLITUDE           0x0006 /* SERDES output amplitude */
 #define NVM_PHY_CLASS_WORD             0x0007
+#define E1000_I210_NVM_FW_MODULE_PTR   0x0010
+#define E1000_I350_NVM_FW_MODULE_PTR   0x0051
 #define NVM_FUTURE_INIT_WORD1          0x0019
-#define NVM_FUTURE_INIT_WORD2          0x001A
 #define NVM_ETRACK_WORD                        0x0042
+#define NVM_ETRACK_HIWORD              0x0043
 #define NVM_COMB_VER_OFF               0x0083
 #define NVM_COMB_VER_PTR               0x003d
 
 /* NVM version defines */
 #define NVM_MAJOR_MASK                 0xF000
-#define NVM_MINOR_MASK                 0x000F
+#define NVM_MINOR_MASK                 0x0FF0
+#define NVM_IMAGE_ID_MASK              0x000F
 #define NVM_COMB_VER_MASK              0x00FF
 #define NVM_MAJOR_SHIFT                        12
+#define NVM_MINOR_SHIFT                        4
 #define NVM_COMB_VER_SHFT              8
 #define NVM_VER_INVALID                        0xFFFF
 #define NVM_ETRACK_SHIFT               16
+#define NVM_ETRACK_VALID               0x8000
+#define NVM_NEW_DEC_MASK               0x0F00
+#define NVM_HEX_CONV                   16
+#define NVM_HEX_TENS                   10
+
+/* FW version defines */
+/* Offset of "Loader patch ptr" in Firmware Header */
+#define E1000_I350_NVM_FW_LOADER_PATCH_PTR_OFFSET      0x01
+/* Patch generation hour & minutes */
+#define E1000_I350_NVM_FW_VER_WORD1_OFFSET             0x04
+/* Patch generation month & day */
+#define E1000_I350_NVM_FW_VER_WORD2_OFFSET             0x05
+/* Patch generation year */
+#define E1000_I350_NVM_FW_VER_WORD3_OFFSET             0x06
+/* Patch major & minor numbers */
+#define E1000_I350_NVM_FW_VER_WORD4_OFFSET             0x07
 
 #define NVM_MAC_ADDR                   0x0000
 #define NVM_SUB_DEV_ID                 0x000B
@@ -1421,15 +1101,12 @@ POSSIBILITY OF SUCH DAMAGE.
 #define NVM_COMPAT_VALID_CSUM          0x0001
 #define NVM_FUTURE_INIT_WORD1_VALID_CSUM       0x0040
 
-#define NVM_INIT_CONTROL1_REG          0x000A
 #define NVM_INIT_CONTROL2_REG          0x000F
-#define NVM_SWDEF_PINS_CTRL_PORT_1     0x0010
 #define NVM_INIT_CONTROL3_PORT_B       0x0014
 #define NVM_INIT_3GIO_3                        0x001A
 #define NVM_SWDEF_PINS_CTRL_PORT_0     0x0020
 #define NVM_INIT_CONTROL3_PORT_A       0x0024
 #define NVM_CFG                                0x0012
-#define NVM_FLASH_VERSION              0x0032
 #define NVM_ALT_MAC_ADDR_PTR           0x0037
 #define NVM_CHECKSUM_REG               0x003F
 #define NVM_COMPATIBILITY_REG_3                0x0003
@@ -1455,9 +1132,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #define NVM_WORD0F_PAUSE_MASK          0x3000
 #define NVM_WORD0F_PAUSE               0x1000
 #define NVM_WORD0F_ASM_DIR             0x2000
-#define NVM_WORD0F_ANE                 0x0800
 #define NVM_WORD0F_SWPDIO_EXT_MASK     0x00F0
-#define NVM_WORD0F_LPLU                        0x0001
 
 /* Mask bits for fields in Word 0x1a of the NVM */
 #define NVM_WORD1A_ASPM_MASK           0x000C
@@ -1471,7 +1146,7 @@ POSSIBILITY OF SUCH DAMAGE.
 /* For checksumming, the sum of all words in the NVM should equal 0xBABA. */
 #define NVM_SUM                                0xBABA
 
-#define NVM_MAC_ADDR_OFFSET            0
+/* PBA (printed board assembly) number words */
 #define NVM_PBA_OFFSET_0               8
 #define NVM_PBA_OFFSET_1               9
 #define NVM_PBA_PTR_GUARD              0xFAFA
@@ -1496,16 +1171,10 @@ POSSIBILITY OF SUCH DAMAGE.
 #define NVM_WRITE_OPCODE_SPI   0x02 /* NVM write opcode */
 #define NVM_A8_OPCODE_SPI      0x08 /* opcode bit-3 = address bit-8 */
 #define NVM_WREN_OPCODE_SPI    0x06 /* NVM set Write Enable latch */
-#define NVM_WRDI_OPCODE_SPI    0x04 /* NVM reset Write Enable latch */
 #define NVM_RDSR_OPCODE_SPI    0x05 /* NVM read Status register */
-#define NVM_WRSR_OPCODE_SPI    0x01 /* NVM write Status register */
 
 /* SPI NVM Status Register */
 #define NVM_STATUS_RDY_SPI     0x01
-#define NVM_STATUS_WEN_SPI     0x02
-#define NVM_STATUS_BP0_SPI     0x04
-#define NVM_STATUS_BP1_SPI     0x08
-#define NVM_STATUS_WPEN_SPI    0x80
 
 /* Word definitions for ID LED Settings */
 #define ID_LED_RESERVED_0000   0x0000
@@ -1551,6 +1220,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #define PCIE_LINK_SPEED_5000           0x02
 #define PCIE_DEVICE_CONTROL2_16ms      0x0005
 
+#ifndef ETH_ADDR_LEN
+#define ETH_ADDR_LEN                   6
+#endif
 
 #define PHY_REVISION_MASK              0xFFFFFFF0
 #define MAX_PHY_REG_ADDRESS            0x1F  /* 5 bit address bus (0-0x1F) */
@@ -1564,8 +1236,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #define M88E1000_I_PHY_ID      0x01410C30
 #define M88E1011_I_PHY_ID      0x01410C20
 #define IGP01E1000_I_PHY_ID    0x02A80380
-#define M88E1011_I_REV_4       0x04
 #define M88E1111_I_PHY_ID      0x01410CC0
+#define M88E1543_E_PHY_ID      0x01410EA0
+#define M88E1512_E_PHY_ID      0x01410DD0
 #define M88E1112_E_PHY_ID      0x01410C90
 #define I347AT4_E_PHY_ID       0x01410DC0
 #define M88E1340M_E_PHY_ID     0x01410DF0
@@ -1589,8 +1262,6 @@ POSSIBILITY OF SUCH DAMAGE.
 /* M88E1000 Specific Registers */
 #define M88E1000_PHY_SPEC_CTRL         0x10  /* PHY Specific Control Reg */
 #define M88E1000_PHY_SPEC_STATUS       0x11  /* PHY Specific Status Reg */
-#define M88E1000_INT_ENABLE            0x12  /* Interrupt Enable Reg */
-#define M88E1000_INT_STATUS            0x13  /* Interrupt Status Reg */
 #define M88E1000_EXT_PHY_SPEC_CTRL     0x14  /* Extended PHY Specific Cntrl */
 #define M88E1000_RX_ERR_CNTR           0x15  /* Receive Error Counter */
 
@@ -1601,11 +1272,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #define M88E1000_PHY_VCO_REG_BIT11     0x800 /* improved BER performance */
 
 /* M88E1000 PHY Specific Control Register */
-#define M88E1000_PSCR_JABBER_DISABLE   0x0001 /* 1=Jabber Function disabled */
 #define M88E1000_PSCR_POLARITY_REVERSAL        0x0002 /* 1=Polarity Reverse enabled */
-#define M88E1000_PSCR_SQE_TEST         0x0004 /* 1=SQE Test enabled */
-/* 1=CLK125 low, 0=CLK125 toggling */
-#define M88E1000_PSCR_CLK125_DISABLE   0x0010
 /* MDI Crossover Mode bits 6:5 Manual MDI configuration */
 #define M88E1000_PSCR_MDI_MANUAL_MODE  0x0000
 #define M88E1000_PSCR_MDIX_MANUAL_MODE 0x0020  /* Manual MDIX configuration */
@@ -1613,19 +1280,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #define M88E1000_PSCR_AUTO_X_1000T     0x0040
 /* Auto crossover enabled all speeds */
 #define M88E1000_PSCR_AUTO_X_MODE      0x0060
-/*
- * 1=Enable Extended 10BASE-T distance (Lower 10BASE-T Rx Threshold
- * 0=Normal 10BASE-T Rx Threshold
- */
-#define M88E1000_PSCR_EN_10BT_EXT_DIST 0x0080
-/* 1=5-bit interface in 100BASE-TX, 0=MII interface in 100BASE-TX */
-#define M88E1000_PSCR_MII_5BIT_ENABLE  0x0100
-#define M88E1000_PSCR_SCRAMBLER_DISABLE        0x0200 /* 1=Scrambler disable */
-#define M88E1000_PSCR_FORCE_LINK_GOOD  0x0400 /* 1=Force link good */
 #define M88E1000_PSCR_ASSERT_CRS_ON_TX 0x0800 /* 1=Assert CRS on Tx */
 
 /* M88E1000 PHY Specific Status Register */
-#define M88E1000_PSSR_JABBER           0x0001 /* 1=Jabber */
 #define M88E1000_PSSR_REV_POLARITY     0x0002 /* 1=Polarity reversed */
 #define M88E1000_PSSR_DOWNSHIFT                0x0020 /* 1=Downshifted */
 #define M88E1000_PSSR_MDIX             0x0040 /* 1=MDIX; 0=MDI */
@@ -1638,51 +1295,24 @@ POSSIBILITY OF SUCH DAMAGE.
 #define M88E1000_PSSR_CABLE_LENGTH     0x0380
 #define M88E1000_PSSR_LINK             0x0400 /* 1=Link up, 0=Link down */
 #define M88E1000_PSSR_SPD_DPLX_RESOLVED        0x0800 /* 1=Speed & Duplex resolved */
-#define M88E1000_PSSR_PAGE_RCVD                0x1000 /* 1=Page received */
 #define M88E1000_PSSR_DPLX             0x2000 /* 1=Duplex 0=Half Duplex */
 #define M88E1000_PSSR_SPEED            0xC000 /* Speed, bits 14:15 */
-#define M88E1000_PSSR_10MBS            0x0000 /* 00=10Mbs */
 #define M88E1000_PSSR_100MBS           0x4000 /* 01=100Mbs */
 #define M88E1000_PSSR_1000MBS          0x8000 /* 10=1000Mbs */
 
 #define M88E1000_PSSR_CABLE_LENGTH_SHIFT       7
 
-/* M88E1000 Extended PHY Specific Control Register */
-#define M88E1000_EPSCR_FIBER_LOOPBACK  0x4000 /* 1=Fiber loopback */
-/*
- * 1 = Lost lock detect enabled.
- * Will assert lost lock and bring
- * link down if idle not seen
- * within 1ms in 1000BASE-T
- */
-#define M88E1000_EPSCR_DOWN_NO_IDLE    0x8000
 /* Number of times we will attempt to autonegotiate before downshifting if we
  * are the master
  */
 #define M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK   0x0C00
 #define M88E1000_EPSCR_MASTER_DOWNSHIFT_1X     0x0000
-#define M88E1000_EPSCR_MASTER_DOWNSHIFT_2X     0x0400
-#define M88E1000_EPSCR_MASTER_DOWNSHIFT_3X     0x0800
-#define M88E1000_EPSCR_MASTER_DOWNSHIFT_4X     0x0C00
 /* Number of times we will attempt to autonegotiate before downshifting if we
  * are the slave
  */
 #define M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK    0x0300
-#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_DIS     0x0000
 #define M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X      0x0100
-#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_2X      0x0200
-#define M88E1000_EPSCR_SLAVE_DOWNSHIFT_3X      0x0300
-#define M88E1000_EPSCR_TX_CLK_2_5      0x0060 /* 2.5 MHz TX_CLK */
 #define M88E1000_EPSCR_TX_CLK_25       0x0070 /* 25  MHz TX_CLK */
-#define M88E1000_EPSCR_TX_CLK_0                0x0000 /* NO  TX_CLK */
-
-/* M88E1111 Specific Registers */
-#define M88E1111_PHY_PAGE_SELECT1      0x16  /* for registers 0-28 */
-#define M88E1111_PHY_PAGE_SELECT2      0x1D  /* for registers 30-31 */
-
-/* M88E1111 page select register mask */
-#define M88E1111_PHY_PAGE_SELECT_MASK1 0xFF
-#define M88E1111_PHY_PAGE_SELECT_MASK2 0x3F
 
 /* Intel I347AT4 Registers */
 #define I347AT4_PCDL           0x10 /* PHY Cable Diagnostics Length */
@@ -1713,14 +1343,7 @@ POSSIBILITY OF SUCH DAMAGE.
 
 /* M88EC018 Rev 2 specific DownShift settings */
 #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK  0x0E00
-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X    0x0000
-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X    0x0200
-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X    0x0400
-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X    0x0600
 #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X    0x0800
-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X    0x0A00
-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X    0x0C00
-#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X    0x0E00
 
 #define I82578_EPSCR_DOWNSHIFT_ENABLE          0x0020
 #define I82578_EPSCR_DOWNSHIFT_COUNTER_MASK    0x001C
@@ -1739,49 +1362,24 @@ POSSIBILITY OF SUCH DAMAGE.
 
 /* GG82563 Specific Registers */
 #define GG82563_PHY_SPEC_CTRL          GG82563_REG(0, 16) /* PHY Spec Cntrl */
-#define GG82563_PHY_SPEC_STATUS                GG82563_REG(0, 17) /* PHY Spec Status */
-#define GG82563_PHY_INT_ENABLE         GG82563_REG(0, 18) /* Interrupt Ena */
-#define GG82563_PHY_SPEC_STATUS_2      GG82563_REG(0, 19) /* PHY Spec Stat2 */
-#define GG82563_PHY_RX_ERR_CNTR                GG82563_REG(0, 21) /* Rx Err Counter */
 #define GG82563_PHY_PAGE_SELECT                GG82563_REG(0, 22) /* Page Select */
 #define GG82563_PHY_SPEC_CTRL_2                GG82563_REG(0, 26) /* PHY Spec Cntrl2 */
 #define GG82563_PHY_PAGE_SELECT_ALT    GG82563_REG(0, 29) /* Alt Page Select */
-/* Test Clock Control (use reg. 29 to select) */
-#define GG82563_PHY_TEST_CLK_CTRL      GG82563_REG(0, 30)
 
 /* MAC Specific Control Register */
 #define GG82563_PHY_MAC_SPEC_CTRL      GG82563_REG(2, 21)
-#define GG82563_PHY_MAC_SPEC_CTRL_2    GG82563_REG(2, 26) /* MAC Spec Ctrl 2 */
 
 #define GG82563_PHY_DSP_DISTANCE       GG82563_REG(5, 26) /* DSP Distance */
 
 /* Page 193 - Port Control Registers */
 /* Kumeran Mode Control */
 #define GG82563_PHY_KMRN_MODE_CTRL     GG82563_REG(193, 16)
-#define GG82563_PHY_PORT_RESET         GG82563_REG(193, 17) /* Port Reset */
-#define GG82563_PHY_REVISION_ID                GG82563_REG(193, 18) /* Revision ID */
-#define GG82563_PHY_DEVICE_ID          GG82563_REG(193, 19) /* Device ID */
 #define GG82563_PHY_PWR_MGMT_CTRL      GG82563_REG(193, 20) /* Pwr Mgt Ctrl */
-/* Rate Adaptation Control */
-#define GG82563_PHY_RATE_ADAPT_CTRL    GG82563_REG(193, 25)
 
 /* Page 194 - KMRN Registers */
-/* FIFO's Control/Status */
-#define GG82563_PHY_KMRN_FIFO_CTRL_STAT        GG82563_REG(194, 16)
-#define GG82563_PHY_KMRN_CTRL          GG82563_REG(194, 17) /* Control */
 #define GG82563_PHY_INBAND_CTRL                GG82563_REG(194, 18) /* Inband Ctrl */
-#define GG82563_PHY_KMRN_DIAGNOSTIC    GG82563_REG(194, 19) /* Diagnostic */
-#define GG82563_PHY_ACK_TIMEOUTS       GG82563_REG(194, 20) /* Ack Timeouts */
-#define GG82563_PHY_ADV_ABILITY                GG82563_REG(194, 21) /* Adver Ability */
-/* Link Partner Advertised Ability */
-#define GG82563_PHY_LINK_PARTNER_ADV_ABILITY   GG82563_REG(194, 23)
-#define GG82563_PHY_ADV_NEXT_PAGE      GG82563_REG(194, 24) /* Adver Next Pg */
-/* Link Partner Advertised Next page */
-#define GG82563_PHY_LINK_PARTNER_ADV_NEXT_PAGE GG82563_REG(194, 25)
-#define GG82563_PHY_KMRN_MISC          GG82563_REG(194, 26) /* Misc. */
 
 /* MDI Control */
-#define E1000_MDIC_DATA_MASK   0x0000FFFF
 #define E1000_MDIC_REG_MASK    0x001F0000
 #define E1000_MDIC_REG_SHIFT   16
 #define E1000_MDIC_PHY_MASK    0x03E00000
@@ -1789,7 +1387,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_MDIC_OP_WRITE    0x04000000
 #define E1000_MDIC_OP_READ     0x08000000
 #define E1000_MDIC_READY       0x10000000
-#define E1000_MDIC_INT_EN      0x20000000
 #define E1000_MDIC_ERROR       0x40000000
 #define E1000_MDIC_DEST                0x80000000
 
@@ -1890,4 +1487,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #ifndef E1000_UNUSEDARG
 #define E1000_UNUSEDARG
 #endif /* E1000_UNUSEDARG */
+#ifndef ERROR_REPORT
+#define ERROR_REPORT(fmt)      do { } while (0)
+#endif /* ERROR_REPORT */
 #endif /* _E1000_DEFINES_H_ */
index 5c42b8c..bc741c8 100644 (file)
@@ -128,6 +128,18 @@ struct e1000_hw;
 #define E1000_DEV_ID_PCH_D_HV_DC               0x10F0
 #define E1000_DEV_ID_PCH2_LV_LM                        0x1502
 #define E1000_DEV_ID_PCH2_LV_V                 0x1503
+#define E1000_DEV_ID_PCH_LPT_I217_LM           0x153A
+#define E1000_DEV_ID_PCH_LPT_I217_V            0x153B
+#define E1000_DEV_ID_PCH_LPTLP_I218_LM         0x155A
+#define E1000_DEV_ID_PCH_LPTLP_I218_V          0x1559
+#ifdef NAHUM6_LPTH_I218_HW
+#define E1000_DEV_ID_PCH_I218_LM2              0x15A0
+#define E1000_DEV_ID_PCH_I218_V2               0x15A1
+#endif /* NAHUM6_LPTH_I218_HW */
+#ifdef NAHUM6_WPT_HW
+#define E1000_DEV_ID_PCH_I218_LM3              0x15A2 /* Wildcat Point PCH */
+#define E1000_DEV_ID_PCH_I218_V3               0x15A3 /* Wildcat Point PCH */
+#endif /* NAHUM6_WPT_HW */
 #define E1000_DEV_ID_82576                     0x10C9
 #define E1000_DEV_ID_82576_FIBER               0x10E6
 #define E1000_DEV_ID_82576_SERDES              0x10E7
@@ -160,7 +172,12 @@ struct e1000_hw;
 #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_I210_COPPER_FLASHLESS     0x157B
+#define E1000_DEV_ID_I210_SERDES_FLASHLESS     0x157C
 #define E1000_DEV_ID_I211_COPPER               0x1539
+#define E1000_DEV_ID_I354_BACKPLANE_1GBPS      0x1F40
+#define E1000_DEV_ID_I354_SGMII                        0x1F41
+#define E1000_DEV_ID_I354_BACKPLANE_2_5GBPS    0x1F45
 #define E1000_DEV_ID_DH89XXCC_SGMII            0x0438
 #define E1000_DEV_ID_DH89XXCC_SERDES           0x043A
 #define E1000_DEV_ID_DH89XXCC_BACKPLANE                0x043C
@@ -207,10 +224,12 @@ enum e1000_mac_type {
        e1000_ich10lan,
        e1000_pchlan,
        e1000_pch2lan,
+       e1000_pch_lpt,
        e1000_82575,
        e1000_82576,
        e1000_82580,
        e1000_i350,
+       e1000_i354,
        e1000_i210,
        e1000_i211,
        e1000_vfadapt,
@@ -232,6 +251,7 @@ enum e1000_nvm_type {
        e1000_nvm_eeprom_spi,
        e1000_nvm_eeprom_microwire,
        e1000_nvm_flash_hw,
+       e1000_nvm_invm,
        e1000_nvm_flash_sw
 };
 
@@ -385,6 +405,10 @@ union e1000_rx_desc_extended {
 };
 
 #define MAX_PS_BUFFERS 4
+
+/* Number of packet split data buffers (not including the header buffer) */
+#define PS_PAGE_BUFFERS        (MAX_PS_BUFFERS - 1)
+
 /* Receive Descriptor - Packet Split */
 union e1000_rx_desc_packet_split {
        struct {
@@ -409,7 +433,8 @@ union e1000_rx_desc_packet_split {
                } middle;
                struct {
                        __le16 header_status;
-                       __le16 length[3];     /* length of buffers 1-3 */
+                       /* length of buffers 1-3 */
+                       __le16 length[PS_PAGE_BUFFERS];
                } upper;
                __le64 reserved;
        } wb; /* writeback */
@@ -681,11 +706,6 @@ struct e1000_mac_operations {
        void (*rar_set)(struct e1000_hw *, u8*, u32);
        s32  (*read_mac_addr)(struct e1000_hw *);
        s32  (*validate_mdi_setting)(struct e1000_hw *);
-       s32  (*mng_host_if_write)(struct e1000_hw *, u8*, u16, u16, u8*);
-       s32  (*mng_write_cmd_header)(struct e1000_hw *hw,
-                                    struct e1000_host_mng_command_header*);
-       s32  (*mng_enable_host_if)(struct e1000_hw *);
-       s32  (*wait_autoneg)(struct e1000_hw *);
        s32  (*acquire_swfw_sync)(struct e1000_hw *, u16);
        void (*release_swfw_sync)(struct e1000_hw *, u16);
 };
@@ -919,6 +939,15 @@ struct e1000_shadow_ram {
 
 #define E1000_SHADOW_RAM_WORDS         2048
 
+#if defined(NAHUM6LP_HW) && defined(ULP_SUPPORT)
+/* I218 PHY Ultra Low Power (ULP) states */
+enum e1000_ulp_state {
+       e1000_ulp_state_unknown,
+       e1000_ulp_state_off,
+       e1000_ulp_state_on,
+};
+
+#endif /* NAHUM6LP_HW && ULP_SUPPORT */
 struct e1000_dev_spec_ich8lan {
        bool kmrn_lock_loss_workaround_enabled;
        struct e1000_shadow_ram shadow_ram[E1000_SHADOW_RAM_WORDS];
@@ -927,6 +956,13 @@ struct e1000_dev_spec_ich8lan {
        bool nvm_k1_enabled;
        bool eee_disable;
        u16 eee_lp_ability;
+#if defined(NAHUM6LP_HW) && defined(ULP_SUPPORT)
+       enum e1000_ulp_state ulp_state;
+#endif /* NAHUM6LP_HW && ULP_SUPPORT */
+#ifdef C10_SUPPORT
+       u16 lat_enc;
+       u16 max_ltr_enc;
+#endif
 };
 
 struct e1000_dev_spec_82575 {
@@ -934,8 +970,11 @@ struct e1000_dev_spec_82575 {
        bool global_device_reset;
        bool eee_disable;
        bool module_plugged;
+       bool clear_semaphore_once;
        u32 mtu;
        struct sfp_e1000_flags eth_flags;
+       u8 media_port;
+       bool media_changed;
 };
 
 struct e1000_dev_spec_vf {
index d96d240..722877a 100644 (file)
@@ -37,13 +37,10 @@ POSSIBILITY OF SUCH DAMAGE.
 STATIC s32 e1000_acquire_nvm_i210(struct e1000_hw *hw);
 STATIC void e1000_release_nvm_i210(struct e1000_hw *hw);
 STATIC s32 e1000_get_hw_semaphore_i210(struct e1000_hw *hw);
-STATIC void e1000_put_hw_semaphore_i210(struct e1000_hw *hw);
 STATIC s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
                                u16 *data);
 STATIC s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw);
 STATIC s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data);
-STATIC s32 e1000_read_nvm_i211(struct e1000_hw *hw, u16 offset, u16 words,
-                              u16 *data);
 
 /**
  *  e1000_acquire_nvm_i210 - Request for access to EEPROM
@@ -104,13 +101,14 @@ s32 e1000_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
                }
 
                swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC);
-               if (!(swfw_sync & fwmask))
+               if (!(swfw_sync & (fwmask | swmask)))
                        break;
 
                /*
                 * Firmware currently using resource (fwmask)
+                * or other software thread using resource (swmask)
                 */
-               e1000_put_hw_semaphore_i210(hw);
+               e1000_put_hw_semaphore_generic(hw);
                msec_delay_irq(5);
                i++;
        }
@@ -124,7 +122,7 @@ s32 e1000_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
        swfw_sync |= swmask;
        E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync);
 
-       e1000_put_hw_semaphore_i210(hw);
+       e1000_put_hw_semaphore_generic(hw);
 
 out:
        return ret_val;
@@ -151,7 +149,7 @@ void e1000_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
        swfw_sync &= ~mask;
        E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync);
 
-       e1000_put_hw_semaphore_i210(hw);
+       e1000_put_hw_semaphore_generic(hw);
 }
 
 /**
@@ -163,12 +161,44 @@ void e1000_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
 STATIC s32 e1000_get_hw_semaphore_i210(struct e1000_hw *hw)
 {
        u32 swsm;
-       s32 ret_val = E1000_SUCCESS;
        s32 timeout = hw->nvm.word_size + 1;
        s32 i = 0;
 
        DEBUGFUNC("e1000_get_hw_semaphore_i210");
 
+       /* Get the SW semaphore */
+       while (i < timeout) {
+               swsm = E1000_READ_REG(hw, E1000_SWSM);
+               if (!(swsm & E1000_SWSM_SMBI))
+                       break;
+
+               usec_delay(50);
+               i++;
+       }
+
+       if (i == timeout) {
+               /* In rare circumstances, the SW semaphore may already be held
+                * unintentionally. Clear the semaphore once before giving up.
+                */
+               if (hw->dev_spec._82575.clear_semaphore_once) {
+                       hw->dev_spec._82575.clear_semaphore_once = false;
+                       e1000_put_hw_semaphore_generic(hw);
+                       for (i = 0; i < timeout; i++) {
+                               swsm = E1000_READ_REG(hw, E1000_SWSM);
+                               if (!(swsm & E1000_SWSM_SMBI))
+                                       break;
+
+                               usec_delay(50);
+                       }
+               }
+
+               /* If we do not have the semaphore here, we have to give up. */
+               if (i == timeout) {
+                       DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
+                       return -E1000_ERR_NVM;
+               }
+       }
+
        /* Get the FW semaphore. */
        for (i = 0; i < timeout; i++) {
                swsm = E1000_READ_REG(hw, E1000_SWSM);
@@ -185,31 +215,10 @@ STATIC s32 e1000_get_hw_semaphore_i210(struct e1000_hw *hw)
                /* Release semaphores */
                e1000_put_hw_semaphore_generic(hw);
                DEBUGOUT("Driver can't access the NVM\n");
-               ret_val = -E1000_ERR_NVM;
-               goto out;
+               return -E1000_ERR_NVM;
        }
 
-out:
-       return ret_val;
-}
-
-/**
- *  e1000_put_hw_semaphore_i210 - Release hardware semaphore
- *  @hw: pointer to the HW structure
- *
- *  Release hardware semaphore used to access the PHY or NVM
- **/
-STATIC void e1000_put_hw_semaphore_i210(struct e1000_hw *hw)
-{
-       u32 swsm;
-
-       DEBUGFUNC("e1000_put_hw_semaphore_i210");
-
-       swsm = E1000_READ_REG(hw, E1000_SWSM);
-
-       swsm &= ~E1000_SWSM_SWESMBI;
-
-       E1000_WRITE_REG(hw, E1000_SWSM, swsm);
+       return E1000_SUCCESS;
 }
 
 /**
@@ -355,60 +364,105 @@ out:
        return ret_val;
 }
 
-/**
- *  e1000_read_nvm_i211 - Read NVM wrapper function for I211
+/** e1000_read_invm_word_i210 - Reads OTP
+ *  @hw: pointer to the HW structure
+ *  @address: the word address (aka eeprom offset) to read
+ *  @data: pointer to the data read
+ *
+ *  Reads 16-bit words from the OTP. Return error when the word is not
+ *  stored in OTP.
+ **/
+STATIC s32 e1000_read_invm_word_i210(struct e1000_hw *hw, u8 address, u16 *data)
+{
+       s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND;
+       u32 invm_dword;
+       u16 i;
+       u8 record_type, word_address;
+
+       DEBUGFUNC("e1000_read_invm_word_i210");
+
+       for (i = 0; i < E1000_INVM_SIZE; i++) {
+               invm_dword = E1000_READ_REG(hw, E1000_INVM_DATA_REG(i));
+               /* Get record type */
+               record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
+               if (record_type == E1000_INVM_UNINITIALIZED_STRUCTURE)
+                       break;
+               if (record_type == E1000_INVM_CSR_AUTOLOAD_STRUCTURE)
+                       i += E1000_INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
+               if (record_type == E1000_INVM_RSA_KEY_SHA256_STRUCTURE)
+                       i += E1000_INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
+               if (record_type == E1000_INVM_WORD_AUTOLOAD_STRUCTURE) {
+                       word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
+                       if (word_address == address) {
+                               *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
+                               DEBUGOUT2("Read INVM Word 0x%02x = %x",
+                                         address, *data);
+                               status = E1000_SUCCESS;
+                               break;
+                       }
+               }
+       }
+       if (status != E1000_SUCCESS)
+               DEBUGOUT1("Requested word 0x%02x not found in OTP\n", address);
+       return status;
+}
+
+/** e1000_read_invm_i210 - Read invm wrapper function for I210/I211
  *  @hw: pointer to the HW structure
  *  @address: the word address (aka eeprom offset) to read
  *  @data: pointer to the data read
  *
  *  Wrapper function to return data formerly found in the NVM.
  **/
-STATIC s32 e1000_read_nvm_i211(struct e1000_hw *hw, u16 offset, u16 words,
-                              u16 *data)
+STATIC s32 e1000_read_invm_i210(struct e1000_hw *hw, u16 offset,
+                               u16 E1000_UNUSEDARG words, u16 *data)
 {
        s32 ret_val = E1000_SUCCESS;
+       UNREFERENCED_1PARAMETER(words);
 
-       DEBUGFUNC("e1000_read_nvm_i211");
+       DEBUGFUNC("e1000_read_invm_i210");
 
        /* Only the MAC addr is required to be present in the iNVM */
        switch (offset) {
        case NVM_MAC_ADDR:
-               ret_val = e1000_read_invm_i211(hw, (u8)offset, &data[0]);
-               ret_val |= e1000_read_invm_i211(hw, (u8)offset+1, &data[1]);
-               ret_val |= e1000_read_invm_i211(hw, (u8)offset+2, &data[2]);
+               ret_val = e1000_read_invm_word_i210(hw, (u8)offset, &data[0]);
+               ret_val |= e1000_read_invm_word_i210(hw, (u8)offset+1,
+                                                    &data[1]);
+               ret_val |= e1000_read_invm_word_i210(hw, (u8)offset+2,
+                                                    &data[2]);
                if (ret_val != E1000_SUCCESS)
                        DEBUGOUT("MAC Addr not found in iNVM\n");
                break;
        case NVM_INIT_CTRL_2:
-               ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
+               ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
                if (ret_val != E1000_SUCCESS) {
                        *data = NVM_INIT_CTRL_2_DEFAULT_I211;
                        ret_val = E1000_SUCCESS;
                }
                break;
        case NVM_INIT_CTRL_4:
-               ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
+               ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
                if (ret_val != E1000_SUCCESS) {
                        *data = NVM_INIT_CTRL_4_DEFAULT_I211;
                        ret_val = E1000_SUCCESS;
                }
                break;
        case NVM_LED_1_CFG:
-               ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
+               ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
                if (ret_val != E1000_SUCCESS) {
                        *data = NVM_LED_1_CFG_DEFAULT_I211;
                        ret_val = E1000_SUCCESS;
                }
                break;
        case NVM_LED_0_2_CFG:
-               ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
+               ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
                if (ret_val != E1000_SUCCESS) {
                        *data = NVM_LED_0_2_CFG_DEFAULT_I211;
                        ret_val = E1000_SUCCESS;
                }
                break;
        case NVM_ID_LED_SETTINGS:
-               ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
+               ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
                if (ret_val != E1000_SUCCESS) {
                        *data = ID_LED_RESERVED_FFFF;
                        ret_val = E1000_SUCCESS;
@@ -434,50 +488,6 @@ STATIC s32 e1000_read_nvm_i211(struct e1000_hw *hw, u16 offset, u16 words,
        return ret_val;
 }
 
-/**
- *  e1000_read_invm_i211 - Reads OTP
- *  @hw: pointer to the HW structure
- *  @address: the word address (aka eeprom offset) to read
- *  @data: pointer to the data read
- *
- *  Reads 16-bit words from the OTP. Return error when the word is not
- *  stored in OTP.
- **/
-s32 e1000_read_invm_i211(struct e1000_hw *hw, u8 address, u16 *data)
-{
-       s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND;
-       u32 invm_dword;
-       u16 i;
-       u8 record_type, word_address;
-
-       DEBUGFUNC("e1000_read_invm_i211");
-
-       for (i = 0; i < E1000_INVM_SIZE; i++) {
-               invm_dword = E1000_READ_REG(hw, E1000_INVM_DATA_REG(i));
-               /* Get record type */
-               record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
-               if (record_type == E1000_INVM_UNINITIALIZED_STRUCTURE)
-                       break;
-               if (record_type == E1000_INVM_CSR_AUTOLOAD_STRUCTURE)
-                       i += E1000_INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
-               if (record_type == E1000_INVM_RSA_KEY_SHA256_STRUCTURE)
-                       i += E1000_INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
-               if (record_type == E1000_INVM_WORD_AUTOLOAD_STRUCTURE) {
-                       word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
-                       if (word_address == address) {
-                               *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
-                               DEBUGOUT2("Read INVM Word 0x%02x = %x",
-                                         address, *data);
-                               status = E1000_SUCCESS;
-                               break;
-                       }
-               }
-       }
-       if (status != E1000_SUCCESS)
-               DEBUGOUT1("Requested word 0x%02x not found in OTP\n", address);
-       return status;
-}
-
 /**
  *  e1000_read_invm_version - Reads iNVM version and image type
  *  @hw: pointer to the HW structure
@@ -677,6 +687,26 @@ out:
        return ret_val;
 }
 
+/**
+ *  e1000_get_flash_presence_i210 - Check if flash device is detected.
+ *  @hw: pointer to the HW structure
+ *
+ **/
+bool e1000_get_flash_presence_i210(struct e1000_hw *hw)
+{
+       u32 eec = 0;
+       bool ret_val = false;
+
+       DEBUGFUNC("e1000_get_flash_presence_i210");
+
+       eec = E1000_READ_REG(hw, E1000_EECD);
+
+       if (eec & E1000_EECD_FLASH_DETECTED_I210)
+               ret_val = true;
+
+       return ret_val;
+}
+
 /**
  *  e1000_update_flash_i210 - Commit EEPROM to the flash
  *  @hw: pointer to the HW structure
@@ -736,7 +766,7 @@ s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw)
  *  e1000_init_nvm_params_i210 - Initialize i210 NVM function pointers
  *  @hw: pointer to the HW structure
  *
- *  Initialize the i210 NVM parameters and function pointers.
+ *  Initialize the i210/i211 NVM parameters and function pointers.
  **/
 STATIC s32 e1000_init_nvm_params_i210(struct e1000_hw *hw)
 {
@@ -746,41 +776,25 @@ STATIC s32 e1000_init_nvm_params_i210(struct e1000_hw *hw)
        DEBUGFUNC("e1000_init_nvm_params_i210");
 
        ret_val = e1000_init_nvm_params_82575(hw);
-
        nvm->ops.acquire = e1000_acquire_nvm_i210;
        nvm->ops.release = e1000_release_nvm_i210;
-       nvm->ops.read    = e1000_read_nvm_srrd_i210;
-       nvm->ops.write   = e1000_write_nvm_srwr_i210;
        nvm->ops.valid_led_default = e1000_valid_led_default_i210;
-       nvm->ops.validate = e1000_validate_nvm_checksum_i210;
-       nvm->ops.update   = e1000_update_nvm_checksum_i210;
-
+       if (e1000_get_flash_presence_i210(hw)) {
+               hw->nvm.type = e1000_nvm_flash_hw;
+               nvm->ops.read    = e1000_read_nvm_srrd_i210;
+               nvm->ops.write   = e1000_write_nvm_srwr_i210;
+               nvm->ops.validate = e1000_validate_nvm_checksum_i210;
+               nvm->ops.update   = e1000_update_nvm_checksum_i210;
+       } else {
+               hw->nvm.type = e1000_nvm_invm;
+               nvm->ops.read     = e1000_read_invm_i210;
+               nvm->ops.write    = e1000_null_write_nvm;
+               nvm->ops.validate = e1000_null_ops_generic;
+               nvm->ops.update   = e1000_null_ops_generic;
+       }
        return ret_val;
 }
 
-/**
- *  e1000_init_nvm_params_i211 - Initialize i211 NVM function pointers
- *  @hw: pointer to the HW structure
- *
- *  Initialize the NVM parameters and function pointers for i211.
- **/
-STATIC s32 e1000_init_nvm_params_i211(struct e1000_hw *hw)
-{
-       struct e1000_nvm_info *nvm = &hw->nvm;
-
-       DEBUGFUNC("e1000_init_nvm_params_i211");
-
-       nvm->ops.acquire  = e1000_acquire_nvm_i210;
-       nvm->ops.release  = e1000_release_nvm_i210;
-       nvm->ops.read     = e1000_read_nvm_i211;
-       nvm->ops.valid_led_default = e1000_valid_led_default_i210;
-       nvm->ops.write    = e1000_null_write_nvm;
-       nvm->ops.validate = e1000_null_ops_generic;
-       nvm->ops.update   = e1000_null_ops_generic;
-
-       return E1000_SUCCESS;
-}
-
 /**
  *  e1000_init_function_pointers_i210 - Init func ptrs.
  *  @hw: pointer to the HW structure
@@ -790,17 +804,8 @@ STATIC s32 e1000_init_nvm_params_i211(struct e1000_hw *hw)
 void e1000_init_function_pointers_i210(struct e1000_hw *hw)
 {
        e1000_init_function_pointers_82575(hw);
+       hw->nvm.ops.init_params = e1000_init_nvm_params_i210;
 
-       switch (hw->mac.type) {
-       case e1000_i210:
-               hw->nvm.ops.init_params = e1000_init_nvm_params_i210;
-               break;
-       case e1000_i211:
-               hw->nvm.ops.init_params = e1000_init_nvm_params_i211;
-               break;
-       default:
-               break;
-       }
        return;
 }
 
@@ -838,3 +843,74 @@ STATIC s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data)
 out:
        return ret_val;
 }
+
+/**
+ *  __e1000_access_xmdio_reg - Read/write XMDIO register
+ *  @hw: pointer to the HW structure
+ *  @address: XMDIO address to program
+ *  @dev_addr: device address to program
+ *  @data: pointer to value to read/write from/to the XMDIO address
+ *  @read: boolean flag to indicate read or write
+ **/
+STATIC s32 __e1000_access_xmdio_reg(struct e1000_hw *hw, u16 address,
+                                   u8 dev_addr, u16 *data, bool read)
+{
+       s32 ret_val = E1000_SUCCESS;
+
+       DEBUGFUNC("__e1000_access_xmdio_reg");
+
+       ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, dev_addr);
+       if (ret_val)
+               return ret_val;
+
+       ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAAD, address);
+       if (ret_val)
+               return ret_val;
+
+       ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, E1000_MMDAC_FUNC_DATA |
+                                                        dev_addr);
+       if (ret_val)
+               return ret_val;
+
+       if (read)
+               ret_val = hw->phy.ops.read_reg(hw, E1000_MMDAAD, data);
+       else
+               ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAAD, *data);
+       if (ret_val)
+               return ret_val;
+
+       /* Recalibrate the device back to 0 */
+       ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, 0);
+       if (ret_val)
+               return ret_val;
+
+       return ret_val;
+}
+
+/**
+ *  e1000_read_xmdio_reg - Read XMDIO register
+ *  @hw: pointer to the HW structure
+ *  @addr: XMDIO address to program
+ *  @dev_addr: device address to program
+ *  @data: value to be read from the EMI address
+ **/
+s32 e1000_read_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr, u16 *data)
+{
+       DEBUGFUNC("e1000_read_xmdio_reg");
+
+       return __e1000_access_xmdio_reg(hw, addr, dev_addr, data, true);
+}
+
+/**
+ *  e1000_write_xmdio_reg - Write XMDIO register
+ *  @hw: pointer to the HW structure
+ *  @addr: XMDIO address to program
+ *  @dev_addr: device address to program
+ *  @data: value to be written to the XMDIO address
+ **/
+s32 e1000_write_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr, u16 data)
+{
+       DEBUGFUNC("e1000_read_xmdio_reg");
+
+       return __e1000_access_xmdio_reg(hw, addr, dev_addr, &data, false);
+}
index ca1ab5c..44de54b 100644 (file)
@@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #ifndef _E1000_I210_H_
 #define _E1000_I210_H_
 
+bool e1000_get_flash_presence_i210(struct e1000_hw *hw);
 s32 e1000_update_flash_i210(struct e1000_hw *hw);
 s32 e1000_update_nvm_checksum_i210(struct e1000_hw *hw);
 s32 e1000_validate_nvm_checksum_i210(struct e1000_hw *hw);
@@ -41,11 +42,14 @@ s32 e1000_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset,
                              u16 words, u16 *data);
 s32 e1000_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset,
                             u16 words, u16 *data);
-s32 e1000_read_invm_i211(struct e1000_hw *hw, u8 address, u16 *data);
 s32 e1000_read_invm_version(struct e1000_hw *hw,
                            struct e1000_fw_version *invm_ver);
 s32 e1000_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 mask);
 void e1000_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask);
+s32 e1000_read_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr,
+                        u16 *data);
+s32 e1000_write_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr,
+                         u16 data);
 
 #define E1000_STM_OPCODE               0xDB00
 #define E1000_EEPROM_FLASH_SIZE_WORD   0x11
@@ -83,9 +87,9 @@ enum E1000_INVM_STRUCTURE_TYPE {
                                         (ID_LED_OFF1_OFF2))
 #define ID_LED_DEFAULT_I210_SERDES     ((ID_LED_DEF1_DEF2 << 8) | \
                                         (ID_LED_DEF1_DEF2 <<  4) | \
-                                        (ID_LED_DEF1_DEF2))
+                                        (ID_LED_OFF1_ON2))
 
-/* NVM offset defaults for Pearsonville device */
+/* NVM offset defaults for I211 devices */
 #define NVM_INIT_CTRL_2_DEFAULT_I211   0X7243
 #define NVM_INIT_CTRL_4_DEFAULT_I211   0x00C1
 #define NVM_LED_1_CFG_DEFAULT_I211     0x0184
index db26a5c..d382f77 100644 (file)
@@ -58,10 +58,25 @@ POSSIBILITY OF SUCH DAMAGE.
  * 82578DC Gigabit Network Connection
  * 82579LM Gigabit Network Connection
  * 82579V Gigabit Network Connection
+ * Ethernet Connection I217-LM
+ * Ethernet Connection I217-V
+ * Ethernet Connection I218-V
+ * Ethernet Connection I218-LM
+#ifdef NAHUM6_LPTH_I218_HW
+ * Ethernet Connection (2) I218-LM
+ * Ethernet Connection (2) I218-V
+#endif
+#ifdef NAHUM6_WPT_HW
+ * Ethernet Connection (3) I218-LM
+ * Ethernet Connection (3) I218-V
+#endif
  */
 
 #include "e1000_api.h"
 
+#if defined(NAHUM6LP_HW) && defined(ULP_IN_D0_SUPPORT)
+static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state);
+#endif /* NAHUM6LP_HW && ULP_SUPPORT */
 STATIC s32  e1000_acquire_swflag_ich8lan(struct e1000_hw *hw);
 STATIC void e1000_release_swflag_ich8lan(struct e1000_hw *hw);
 STATIC s32  e1000_acquire_nvm_ich8lan(struct e1000_hw *hw);
@@ -69,6 +84,13 @@ STATIC void e1000_release_nvm_ich8lan(struct e1000_hw *hw);
 STATIC bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw);
 STATIC bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw);
 STATIC void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index);
+STATIC void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index);
+STATIC s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw);
+#ifndef NO_NON_BLOCKING_PHY_MTA_UPDATE_SUPPORT
+STATIC void e1000_update_mc_addr_list_pch2lan(struct e1000_hw *hw,
+                                             u8 *mc_addr_list,
+                                             u32 mc_addr_count);
+#endif /* NO_NON_BLOCKING_PHY_MTA_UPDATE_SUPPORT */
 STATIC s32  e1000_check_reset_block_ich8lan(struct e1000_hw *hw);
 STATIC s32  e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw);
 STATIC s32  e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active);
@@ -90,6 +112,7 @@ STATIC s32  e1000_reset_hw_ich8lan(struct e1000_hw *hw);
 STATIC s32  e1000_init_hw_ich8lan(struct e1000_hw *hw);
 STATIC s32  e1000_setup_link_ich8lan(struct e1000_hw *hw);
 STATIC s32  e1000_setup_copper_link_ich8lan(struct e1000_hw *hw);
+STATIC s32  e1000_setup_copper_link_pch_lpt(struct e1000_hw *hw);
 STATIC s32  e1000_get_link_up_info_ich8lan(struct e1000_hw *hw,
                                           u16 *speed, u16 *duplex);
 STATIC s32  e1000_cleanup_led_ich8lan(struct e1000_hw *hw);
@@ -174,8 +197,9 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw)
 {
        u16 phy_reg = 0;
        u32 phy_id = 0;
-       s32 ret_val;
+       s32 ret_val = 0;
        u16 retry_count;
+       u32 mac_reg = 0;
 
        for (retry_count = 0; retry_count < 2; retry_count++) {
                ret_val = hw->phy.ops.read_reg_locked(hw, PHY_ID1, &phy_reg);
@@ -194,24 +218,84 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw)
 
        if (hw->phy.id) {
                if  (hw->phy.id == phy_id)
-                       return true;
+                       goto out;
        } else if (phy_id) {
                hw->phy.id = phy_id;
                hw->phy.revision = (u32)(phy_reg & ~PHY_REVISION_MASK);
-               return true;
+               goto out;
        }
 
-       /*
-        * In case the PHY needs to be in mdio slow mode,
+       /* In case the PHY needs to be in mdio slow mode,
         * set slow mode and try to get the PHY id again.
         */
-       hw->phy.ops.release(hw);
-       ret_val = e1000_set_mdio_slow_mode_hv(hw);
-       if (!ret_val)
-               ret_val = e1000_get_phy_id(hw);
-       hw->phy.ops.acquire(hw);
+       if (hw->mac.type < e1000_pch_lpt) {
+               hw->phy.ops.release(hw);
+               ret_val = e1000_set_mdio_slow_mode_hv(hw);
+               if (!ret_val)
+                       ret_val = e1000_get_phy_id(hw);
+               hw->phy.ops.acquire(hw);
+       }
 
-       return !ret_val;
+       if (ret_val)
+               return false;
+out:
+       if (hw->mac.type == e1000_pch_lpt) {
+               /* Unforce SMBus mode in PHY */
+               hw->phy.ops.read_reg_locked(hw, CV_SMB_CTRL, &phy_reg);
+               phy_reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
+               hw->phy.ops.write_reg_locked(hw, CV_SMB_CTRL, phy_reg);
+
+               /* Unforce SMBus mode in MAC */
+               mac_reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
+               mac_reg &= ~E1000_CTRL_EXT_FORCE_SMBUS;
+               E1000_WRITE_REG(hw, E1000_CTRL_EXT, mac_reg);
+       }
+
+       return true;
+}
+
+/**
+ *  e1000_toggle_lanphypc_pch_lpt - toggle the LANPHYPC pin value
+ *  @hw: pointer to the HW structure
+ *
+ *  Toggling the LANPHYPC pin value fully power-cycles the PHY and is
+ *  used to reset the PHY to a quiescent state when necessary.
+ **/
+void e1000_toggle_lanphypc_pch_lpt(struct e1000_hw *hw)
+{
+       u32 mac_reg;
+
+       DEBUGFUNC("e1000_toggle_lanphypc_pch_lpt");
+
+       /* Set Phy Config Counter to 50msec */
+       mac_reg = E1000_READ_REG(hw, E1000_FEXTNVM3);
+       mac_reg &= ~E1000_FEXTNVM3_PHY_CFG_COUNTER_MASK;
+       mac_reg |= E1000_FEXTNVM3_PHY_CFG_COUNTER_50MSEC;
+       E1000_WRITE_REG(hw, E1000_FEXTNVM3, mac_reg);
+
+       /* Toggle LANPHYPC Value bit */
+       mac_reg = E1000_READ_REG(hw, E1000_CTRL);
+       mac_reg |= E1000_CTRL_LANPHYPC_OVERRIDE;
+       mac_reg &= ~E1000_CTRL_LANPHYPC_VALUE;
+       E1000_WRITE_REG(hw, E1000_CTRL, mac_reg);
+       E1000_WRITE_FLUSH(hw);
+       usec_delay(10);
+       mac_reg &= ~E1000_CTRL_LANPHYPC_OVERRIDE;
+       E1000_WRITE_REG(hw, E1000_CTRL, mac_reg);
+       E1000_WRITE_FLUSH(hw);
+
+       if (hw->mac.type < e1000_pch_lpt) {
+               msec_delay(50);
+       } else {
+               u16 count = 20;
+
+               do {
+                       msec_delay(5);
+               } while (!(E1000_READ_REG(hw, E1000_CTRL_EXT) &
+                          E1000_CTRL_EXT_LPCD) && count--);
+
+               msec_delay(30);
+       }
 }
 
 /**
@@ -228,30 +312,50 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)
 
        DEBUGFUNC("e1000_init_phy_workarounds_pchlan");
 
+       /* Gate automatic PHY configuration by hardware on managed and
+        * non-managed 82579 and newer adapters.
+        */
+       e1000_gate_hw_phy_config_ich8lan(hw, true);
+
+#if defined(NAHUM6LP_HW) && defined(ULP_SUPPORT)
+       /* It is not possible to be certain of the current state of ULP
+        * so forcibly disable it.
+        */
+       hw->dev_spec.ich8lan.ulp_state = e1000_ulp_state_unknown;
+
+#endif /* NAHUM6LP_HW && ULP_SUPPORT */
        ret_val = hw->phy.ops.acquire(hw);
        if (ret_val) {
                DEBUGOUT("Failed to initialize PHY flow\n");
-               return ret_val;
+               goto out;
        }
 
-       /*
-        * The MAC-PHY interconnect may be in SMBus mode.  If the PHY is
+       /* The MAC-PHY interconnect may be in SMBus mode.  If the PHY is
         * inaccessible and resetting the PHY is not blocked, toggle the
         * LANPHYPC Value bit to force the interconnect to PCIe mode.
         */
        switch (hw->mac.type) {
-       case e1000_pch2lan:
-               /*
-                * Gate automatic PHY configuration by hardware on
-                * non-managed 82579
+       case e1000_pch_lpt:
+               if (e1000_phy_is_accessible_pchlan(hw))
+                       break;
+
+               /* Before toggling LANPHYPC, see if PHY is accessible by
+                * forcing MAC to SMBus mode first.
                 */
-               if ((hw->mac.type == e1000_pch2lan) &&
-                   !(fwsm & E1000_ICH_FWSM_FW_VALID))
-                       e1000_gate_hw_phy_config_ich8lan(hw, true);
+               mac_reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
+               mac_reg |= E1000_CTRL_EXT_FORCE_SMBUS;
+               E1000_WRITE_REG(hw, E1000_CTRL_EXT, mac_reg);
+
+               /* Wait 50 milliseconds for MAC to finish any retries
+                * that it might be trying to perform from previous
+                * attempts to acknowledge any phy read requests.
+                */
+                msec_delay(50);
 
-               if (e1000_phy_is_accessible_pchlan(hw)) {
+               /* fall-through */
+       case e1000_pch2lan:
+               if (e1000_phy_is_accessible_pchlan(hw))
                        break;
-               }
 
                /* fall-through */
        case e1000_pchlan:
@@ -261,43 +365,63 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)
 
                if (hw->phy.ops.check_reset_block(hw)) {
                        DEBUGOUT("Required LANPHYPC toggle blocked by ME\n");
+                       ret_val = -E1000_ERR_PHY;
                        break;
                }
 
-               DEBUGOUT("Toggling LANPHYPC\n");
+               /* Toggle LANPHYPC Value bit */
+               e1000_toggle_lanphypc_pch_lpt(hw);
+               if (hw->mac.type >= e1000_pch_lpt) {
+                       if (e1000_phy_is_accessible_pchlan(hw))
+                               break;
+
+                       /* Toggling LANPHYPC brings the PHY out of SMBus mode
+                        * so ensure that the MAC is also out of SMBus mode
+                        */
+                       mac_reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
+                       mac_reg &= ~E1000_CTRL_EXT_FORCE_SMBUS;
+                       E1000_WRITE_REG(hw, E1000_CTRL_EXT, mac_reg);
 
-               /* Set Phy Config Counter to 50msec */
-               mac_reg = E1000_READ_REG(hw, E1000_FEXTNVM3);
-               mac_reg &= ~E1000_FEXTNVM3_PHY_CFG_COUNTER_MASK;
-               mac_reg |= E1000_FEXTNVM3_PHY_CFG_COUNTER_50MSEC;
-               E1000_WRITE_REG(hw, E1000_FEXTNVM3, mac_reg);
+                       if (e1000_phy_is_accessible_pchlan(hw))
+                               break;
 
-               /* Toggle LANPHYPC Value bit */
-               mac_reg = E1000_READ_REG(hw, E1000_CTRL);
-               mac_reg |= E1000_CTRL_LANPHYPC_OVERRIDE;
-               mac_reg &= ~E1000_CTRL_LANPHYPC_VALUE;
-               E1000_WRITE_REG(hw, E1000_CTRL, mac_reg);
-               E1000_WRITE_FLUSH(hw);
-               usec_delay(10);
-               mac_reg &= ~E1000_CTRL_LANPHYPC_OVERRIDE;
-               E1000_WRITE_REG(hw, E1000_CTRL, mac_reg);
-               E1000_WRITE_FLUSH(hw);
-               msec_delay(50);
+                       ret_val = -E1000_ERR_PHY;
+               }
                break;
        default:
                break;
        }
 
        hw->phy.ops.release(hw);
+       if (!ret_val) {
 
-       /*
-        * Reset the PHY before any access to it.  Doing so, ensures
-        * that the PHY is in a known good state before we read/write
-        * PHY registers.  The generic reset is sufficient here,
-        * because we haven't determined the PHY type yet.
-        */
-       ret_val = e1000_phy_hw_reset_generic(hw);
+               /* Check to see if able to reset PHY.  Print error if not */
+               if (hw->phy.ops.check_reset_block(hw)) {
+                       ERROR_REPORT("Reset blocked by ME\n");
+                       goto out;
+               }
 
+               /* Reset the PHY before any access to it.  Doing so, ensures
+                * that the PHY is in a known good state before we read/write
+                * PHY registers.  The generic reset is sufficient here,
+                * because we haven't determined the PHY type yet.
+                */
+               ret_val = e1000_phy_hw_reset_generic(hw);
+               if (ret_val)
+                       goto out;
+
+               /* On a successful reset, possibly need to wait for the PHY
+                * to quiesce to an accessible state before returning control
+                * to the calling function.  If the PHY does not quiesce, then
+                * return E1000E_BLK_PHY_RESET, as this is the condition that
+                *  the PHY is in.
+                */
+               ret_val = hw->phy.ops.check_reset_block(hw);
+               if (ret_val)
+                       ERROR_REPORT("ME blocked access to PHY after reset\n");
+       }
+
+out:
        /* Ungate automatic PHY configuration on non-managed 82579 */
        if ((hw->mac.type == e1000_pch2lan) &&
            !(fwsm & E1000_ICH_FWSM_FW_VALID)) {
@@ -566,6 +690,9 @@ STATIC s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
 STATIC s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw)
 {
        struct e1000_mac_info *mac = &hw->mac;
+#if defined(QV_RELEASE) || !defined(NO_PCH_LPT_B0_SUPPORT)
+       u16 pci_cfg;
+#endif /* QV_RELEASE || !defined(NO_PCH_LPT_B0_SUPPORT) */
 
        DEBUGFUNC("e1000_init_mac_params_ich8lan");
 
@@ -633,7 +760,18 @@ STATIC s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw)
                mac->rar_entry_count = E1000_PCH2_RAR_ENTRIES;
                mac->ops.rar_set = e1000_rar_set_pch2lan;
                /* fall-through */
+       case e1000_pch_lpt:
+#ifndef NO_NON_BLOCKING_PHY_MTA_UPDATE_SUPPORT
+               /* multicast address update for pch2 */
+               mac->ops.update_mc_addr_list =
+                       e1000_update_mc_addr_list_pch2lan;
+#endif
        case e1000_pchlan:
+#if defined(QV_RELEASE) || !defined(NO_PCH_LPT_B0_SUPPORT)
+               /* save PCH revision_id */
+               e1000_read_pci_cfg(hw, E1000_PCI_REVISION_ID_REG, &pci_cfg);
+               hw->revision_id = (u8)(pci_cfg &= 0x000F);
+#endif /* QV_RELEASE || !defined(NO_PCH_LPT_B0_SUPPORT) */
                /* check management mode */
                mac->ops.check_mng_mode = e1000_check_mng_mode_pchlan;
                /* ID LED init */
@@ -650,15 +788,16 @@ STATIC s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw)
                break;
        }
 
+       if (mac->type == e1000_pch_lpt) {
+               mac->rar_entry_count = E1000_PCH_LPT_RAR_ENTRIES;
+               mac->ops.rar_set = e1000_rar_set_pch_lpt;
+               mac->ops.setup_physical_interface = e1000_setup_copper_link_pch_lpt;
+       }
+
        /* Enable PCS Lock-loss workaround for ICH8 */
        if (mac->type == e1000_ich8lan)
                e1000_set_kmrn_lock_loss_workaround_ich8lan(hw, true);
 
-       /* Gate automatic PHY configuration by hardware on managed 82579 */
-       if ((mac->type == e1000_pch2lan) &&
-           (E1000_READ_REG(hw, E1000_FWSM) & E1000_ICH_FWSM_FW_VALID))
-               e1000_gate_hw_phy_config_ich8lan(hw, true);
-
        return E1000_SUCCESS;
 }
 
@@ -715,7 +854,7 @@ s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data)
  *
  *  Assumes the SW/FW/HW Semaphore is already acquired.
  **/
-STATIC s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data)
+s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data)
 {
        DEBUGFUNC("e1000_read_emi_reg_locked");
 
@@ -729,18 +868,35 @@ STATIC s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data)
  *  Enable/disable EEE based on setting in dev_spec structure, the duplex of
  *  the link and the EEE capabilities of the link partner.  The LPI Control
  *  register bits will remain set only if/when link is up.
+ *
+ *  EEE LPI must not be asserted earlier than one second after link is up.
+ *  On 82579, EEE LPI should not be enabled until such time otherwise there
+ *  can be link issues with some switches.  Other devices can have EEE LPI
+ *  enabled immediately upon link up since they have a timer in hardware which
+ *  prevents LPI from being asserted too early.
  **/
-STATIC s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
+s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
 {
        struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
        s32 ret_val;
-       u16 lpi_ctrl;
+       u16 lpa, pcs_status, adv, adv_addr, lpi_ctrl, data;
 
        DEBUGFUNC("e1000_set_eee_pchlan");
 
-       if ((hw->phy.type != e1000_phy_82579) &&
-           (hw->phy.type != e1000_phy_i217))
+       switch (hw->phy.type) {
+       case e1000_phy_82579:
+               lpa = I82579_EEE_LP_ABILITY;
+               pcs_status = I82579_EEE_PCS_STATUS;
+               adv_addr = I82579_EEE_ADVERTISEMENT;
+               break;
+       case e1000_phy_i217:
+               lpa = I217_EEE_LP_ABILITY;
+               pcs_status = I217_EEE_PCS_STATUS;
+               adv_addr = I217_EEE_ADVERTISEMENT;
+               break;
+       default:
                return E1000_SUCCESS;
+       }
 
        ret_val = hw->phy.ops.acquire(hw);
        if (ret_val)
@@ -755,61 +911,543 @@ STATIC s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
 
        /* Enable EEE if not disabled by user */
        if (!dev_spec->eee_disable) {
-               u16 lpa, pcs_status, data;
-
                /* Save off link partner's EEE ability */
-               switch (hw->phy.type) {
-               case e1000_phy_82579:
-                       lpa = I82579_EEE_LP_ABILITY;
-                       pcs_status = I82579_EEE_PCS_STATUS;
-                       break;
-               case e1000_phy_i217:
-                       lpa = I217_EEE_LP_ABILITY;
-                       pcs_status = I217_EEE_PCS_STATUS;
-                       break;
-               default:
-                       ret_val = -E1000_ERR_PHY;
-                       goto release;
-               }
                ret_val = e1000_read_emi_reg_locked(hw, lpa,
                                                    &dev_spec->eee_lp_ability);
                if (ret_val)
                        goto release;
 
-               /*
-                * Enable EEE only for speeds in which the link partner is
-                * EEE capable.
+               /* Read EEE advertisement */
+               ret_val = e1000_read_emi_reg_locked(hw, adv_addr, &adv);
+               if (ret_val)
+                       goto release;
+
+               /* Enable EEE only for speeds in which the link partner is
+                * EEE capable and for which we advertise EEE.
                 */
-               if (dev_spec->eee_lp_ability & I82579_EEE_1000_SUPPORTED)
+               if (adv & dev_spec->eee_lp_ability & I82579_EEE_1000_SUPPORTED)
                        lpi_ctrl |= I82579_LPI_CTRL_1000_ENABLE;
 
-               if (dev_spec->eee_lp_ability & I82579_EEE_100_SUPPORTED) {
+               if (adv & dev_spec->eee_lp_ability & I82579_EEE_100_SUPPORTED) {
                        hw->phy.ops.read_reg_locked(hw, PHY_LP_ABILITY, &data);
                        if (data & NWAY_LPAR_100TX_FD_CAPS)
                                lpi_ctrl |= I82579_LPI_CTRL_100_ENABLE;
                        else
-                               /*
-                                * EEE is not supported in 100Half, so ignore
+                               /* EEE is not supported in 100Half, so ignore
                                 * partner's EEE in 100 ability if full-duplex
                                 * is not advertised.
                                 */
                                dev_spec->eee_lp_ability &=
                                    ~I82579_EEE_100_SUPPORTED;
                }
+       }
+
+       /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */
+       ret_val = e1000_read_emi_reg_locked(hw, pcs_status, &data);
+       if (ret_val)
+               goto release;
+
+       ret_val = hw->phy.ops.write_reg_locked(hw, I82579_LPI_CTRL, lpi_ctrl);
+release:
+       hw->phy.ops.release(hw);
+
+       return ret_val;
+}
+
+/**
+ *  e1000_k1_workaround_lpt_lp - K1 workaround on Lynxpoint-LP
+ *  @hw:   pointer to the HW structure
+ *  @link: link up bool flag
+ *
+ *  When K1 is enabled for 1Gbps, the MAC can miss 2 DMA completion indications
+ *  preventing further DMA write requests.  Workaround the issue by disabling
+ *  the de-assertion of the clock request when in 1Gpbs mode.
+ *  Also, set appropriate Tx re-transmission timeouts for 10 and 100Half link
+ *  speeds in order to avoid Tx hangs.
+ **/
+static s32 e1000_k1_workaround_lpt_lp(struct e1000_hw *hw, bool link)
+{
+       u32 fextnvm6 = E1000_READ_REG(hw, E1000_FEXTNVM6);
+       u32 status = E1000_READ_REG(hw, E1000_STATUS);
+       s32 ret_val = E1000_SUCCESS;
+       u16 reg;
+
+       if (link && (status & E1000_STATUS_SPEED_1000)) {
+               ret_val = hw->phy.ops.acquire(hw);
+               if (ret_val)
+                       return ret_val;
+
+               ret_val =
+                   e1000_read_kmrn_reg_locked(hw, E1000_KMRNCTRLSTA_K1_CONFIG,
+                                              &reg);
+               if (ret_val)
+                       goto release;
+
+               ret_val =
+                   e1000_write_kmrn_reg_locked(hw,
+                                               E1000_KMRNCTRLSTA_K1_CONFIG,
+                                               reg &
+                                               ~E1000_KMRNCTRLSTA_K1_ENABLE);
+               if (ret_val)
+                       goto release;
+
+               usec_delay(10);
+
+               E1000_WRITE_REG(hw, E1000_FEXTNVM6,
+                               fextnvm6 | E1000_FEXTNVM6_REQ_PLL_CLK);
+
+               ret_val =
+                   e1000_write_kmrn_reg_locked(hw,
+                                               E1000_KMRNCTRLSTA_K1_CONFIG,
+                                               reg);
+release:
+               hw->phy.ops.release(hw);
+       } else {
+               /* clear FEXTNVM6 bit 8 on link down or 10/100 */
+               fextnvm6 &= ~E1000_FEXTNVM6_REQ_PLL_CLK;
+
+               if (!link || ((status & E1000_STATUS_SPEED_100) &&
+                             (status & E1000_STATUS_FD)))
+                       goto update_fextnvm6;
+
+               ret_val = hw->phy.ops.read_reg(hw, I217_INBAND_CTRL, &reg);
+               if (ret_val)
+                       return ret_val;
+
+               /* Clear link status transmit timeout */
+               reg &= ~I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_MASK;
+
+               if (status & E1000_STATUS_SPEED_100) {
+                       /* Set inband Tx timeout to 5x10us for 100Half */
+                       reg |= 5 << I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT;
+
+                       /* Do not extend the K1 entry latency for 100Half */
+                       fextnvm6 &= ~E1000_FEXTNVM6_ENABLE_K1_ENTRY_CONDITION;
+               } else {
+                       /* Set inband Tx timeout to 50x10us for 10Full/Half */
+                       reg |= 50 <<
+                              I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT;
+
+                       /* Extend the K1 entry latency for 10 Mbps */
+                       fextnvm6 |= E1000_FEXTNVM6_ENABLE_K1_ENTRY_CONDITION;
+               }
+
+               ret_val = hw->phy.ops.write_reg(hw, I217_INBAND_CTRL, reg);
+               if (ret_val)
+                       return ret_val;
+
+update_fextnvm6:
+               E1000_WRITE_REG(hw, E1000_FEXTNVM6, fextnvm6);
+       }
+
+       return ret_val;
+}
+
+#ifdef C10_SUPPORT
+/**
+ * e1000_demote_ltr - Demote/Promote the LTR value
+ * @hw: pointer to the HW structure
+ * @demote: boolean value to control whether we are demoting or promoting
+ *    the LTR value (promoting allows deeper C-States).
+ * @link: boolean value stating whether we currently have link
+ *
+ * Configure the LTRV register with the proper LTR value
+ **/
+void e1000_demote_ltr(struct e1000_hw *hw, bool demote, bool link)
+{
+       u32 reg = link << (E1000_LTRV_REQ_SHIFT + E1000_LTRV_NOSNOOP_SHIFT) |
+                 link << E1000_LTRV_REQ_SHIFT | E1000_LTRV_SEND;
+
+       if ((hw->device_id != E1000_DEV_ID_PCH_I218_LM3) &&
+           (hw->device_id != E1000_DEV_ID_PCH_I218_V3))
+               return;
+
+       if (demote) {
+               reg |= hw->dev_spec.ich8lan.lat_enc |
+                      (hw->dev_spec.ich8lan.lat_enc <<
+                       E1000_LTRV_NOSNOOP_SHIFT);
+       } else {
+               reg |= hw->dev_spec.ich8lan.max_ltr_enc |
+                      (hw->dev_spec.ich8lan.max_ltr_enc <<
+                       E1000_LTRV_NOSNOOP_SHIFT);
+       }
+
+       E1000_WRITE_REG(hw, E1000_LTRV, reg);
+       return;
+}
+
+#endif /* C10_SUPPORT */
+#if defined(NAHUM6LP_HW) && defined(ULP_SUPPORT)
+/**
+ *  e1000_enable_ulp_lpt_lp - configure Ultra Low Power mode for LynxPoint-LP
+ *  @hw: pointer to the HW structure
+ *  @to_sx: boolean indicating a system power state transition to Sx
+ *
+ *  When link is down, configure ULP mode to significantly reduce the power
+ *  to the PHY.  If on a Manageability Engine (ME) enabled system, tell the
+ *  ME firmware to start the ULP configuration.  If not on an ME enabled
+ *  system, configure the ULP mode by software.
+ */
+s32 e1000_enable_ulp_lpt_lp(struct e1000_hw *hw, bool to_sx)
+{
+       u32 mac_reg;
+       s32 ret_val = E1000_SUCCESS;
+       u16 phy_reg;
+
+       if ((hw->mac.type < e1000_pch_lpt) ||
+           (hw->device_id == E1000_DEV_ID_PCH_LPT_I217_LM) ||
+           (hw->device_id == E1000_DEV_ID_PCH_LPT_I217_V) ||
+#ifdef NAHUM6_LPTH_I218_HW
+           (hw->device_id == E1000_DEV_ID_PCH_I218_LM2) ||
+           (hw->device_id == E1000_DEV_ID_PCH_I218_V2) ||
+#endif
+           (hw->dev_spec.ich8lan.ulp_state == e1000_ulp_state_on))
+               return 0;
+
+#ifdef ULP_IN_D0_SUPPORT
+       if (!to_sx) {
+               int i = 0;
+
+               /* Poll up to 5 seconds for Cable Disconnected indication */
+               while (!(E1000_READ_REG(hw, E1000_FEXT) &
+                        E1000_FEXT_PHY_CABLE_DISCONNECTED)) {
+                       /* Bail if link is re-acquired */
+                       if (E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU)
+                               return -E1000_ERR_PHY;
+
+                       if (i++ == 100)
+                               break;
+
+                       msec_delay(50);
+               }
+               DEBUGOUT2("CABLE_DISCONNECTED %s set after %dmsec\n",
+                         (E1000_READ_REG(hw, E1000_FEXT) &
+                          E1000_FEXT_PHY_CABLE_DISCONNECTED) ? "" : "not",
+                         i * 50);
+       }
+
+#endif /* ULP_IN_D0_SUPPORT */
+       if (E1000_READ_REG(hw, E1000_FWSM) & E1000_ICH_FWSM_FW_VALID) {
+               /* Request ME configure ULP mode in the PHY */
+               mac_reg = E1000_READ_REG(hw, E1000_H2ME);
+               mac_reg |= E1000_H2ME_ULP | E1000_H2ME_ENFORCE_SETTINGS;
+               E1000_WRITE_REG(hw, E1000_H2ME, mac_reg);
+
+               goto out;
+       }
+
+#ifndef ULP_IN_D0_SUPPORT
+       if (!to_sx) {
+               int i = 0;
+
+               /* Poll up to 5 seconds for Cable Disconnected indication */
+               while (!(E1000_READ_REG(hw, E1000_FEXT) &
+                        E1000_FEXT_PHY_CABLE_DISCONNECTED)) {
+                       /* Bail if link is re-acquired */
+                       if (E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU)
+                               return -E1000_ERR_PHY;
+
+                       if (i++ == 100)
+                               break;
+
+                       msec_delay(50);
+               }
+               DEBUGOUT("CABLE_DISCONNECTED %s set after %dmsec\n",
+                        (E1000_READ_REG(hw, E1000_FEXT) &
+                         E1000_FEXT_PHY_CABLE_DISCONNECTED) ? "" : "not",
+                        i * 50);
+       }
 
-               /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */
-               ret_val = e1000_read_emi_reg_locked(hw, pcs_status, &data);
+#endif /* !ULP_IN_D0_SUPPORT */
+       ret_val = hw->phy.ops.acquire(hw);
+       if (ret_val)
+               goto out;
+
+       /* Force SMBus mode in PHY */
+       ret_val = e1000_read_phy_reg_hv_locked(hw, CV_SMB_CTRL, &phy_reg);
+       if (ret_val)
+               goto release;
+       phy_reg |= CV_SMB_CTRL_FORCE_SMBUS;
+       e1000_write_phy_reg_hv_locked(hw, CV_SMB_CTRL, phy_reg);
+
+       /* Force SMBus mode in MAC */
+       mac_reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
+       mac_reg |= E1000_CTRL_EXT_FORCE_SMBUS;
+       E1000_WRITE_REG(hw, E1000_CTRL_EXT, mac_reg);
+
+#ifdef ULP_IN_D0_SUPPORT
+       if (!to_sx) {
+               /* Change the 'Link Status Change' interrupt to trigger
+                * on 'Cable Status Change'
+                */
+               ret_val = e1000_read_kmrn_reg_locked(hw,
+                                                    E1000_KMRNCTRLSTA_OP_MODES,
+                                                    &phy_reg);
                if (ret_val)
                        goto release;
+               phy_reg |= E1000_KMRNCTRLSTA_OP_MODES_LSC2CSC;
+               e1000_write_kmrn_reg_locked(hw, E1000_KMRNCTRLSTA_OP_MODES,
+                                           phy_reg);
        }
 
-       ret_val = hw->phy.ops.write_reg_locked(hw, I82579_LPI_CTRL, lpi_ctrl);
+#endif /* ULP_IN_D0_SUPPORT */
+       /* Set Inband ULP Exit, Reset to SMBus mode and
+        * Disable SMBus Release on PERST# in PHY
+        */
+       ret_val = e1000_read_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, &phy_reg);
+       if (ret_val)
+               goto release;
+       phy_reg |= (I218_ULP_CONFIG1_RESET_TO_SMBUS |
+                   I218_ULP_CONFIG1_DISABLE_SMB_PERST);
+       if (to_sx) {
+               if (E1000_READ_REG(hw, E1000_WUFC) & E1000_WUFC_LNKC)
+                       phy_reg |= I218_ULP_CONFIG1_WOL_HOST;
+
+               phy_reg |= I218_ULP_CONFIG1_STICKY_ULP;
+       } else {
+               phy_reg |= I218_ULP_CONFIG1_INBAND_EXIT;
+       }
+       e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
+
+       /* Set Disable SMBus Release on PERST# in MAC */
+       mac_reg = E1000_READ_REG(hw, E1000_FEXTNVM7);
+       mac_reg |= E1000_FEXTNVM7_DISABLE_SMB_PERST;
+       E1000_WRITE_REG(hw, E1000_FEXTNVM7, mac_reg);
+
+       /* Commit ULP changes in PHY by starting auto ULP configuration */
+       phy_reg |= I218_ULP_CONFIG1_START;
+       e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
+#ifdef ULP_IN_D0_SUPPORT
+
+       if (!to_sx) {
+               /* Disable Tx so that the MAC doesn't send any (buffered)
+                * packets to the PHY.
+                */
+               mac_reg = E1000_READ_REG(hw, E1000_TCTL);
+               mac_reg &= ~E1000_TCTL_EN;
+               E1000_WRITE_REG(hw, E1000_TCTL, mac_reg);
+       }
+#endif
 release:
        hw->phy.ops.release(hw);
+out:
+       if (ret_val)
+               DEBUGOUT1("Error in ULP enable flow: %d\n", ret_val);
+       else
+               hw->dev_spec.ich8lan.ulp_state = e1000_ulp_state_on;
 
        return ret_val;
 }
 
+/**
+ *  e1000_disable_ulp_lpt_lp - unconfigure Ultra Low Power mode for LynxPoint-LP
+ *  @hw: pointer to the HW structure
+ *  @force: boolean indicating whether or not to force disabling ULP
+ *
+ *  Un-configure ULP mode when link is up, the system is transitioned from
+ *  Sx or the driver is unloaded.  If on a Manageability Engine (ME) enabled
+ *  system, poll for an indication from ME that ULP has been un-configured.
+ *  If not on an ME enabled system, un-configure the ULP mode by software.
+ *
+ *  During nominal operation, this function is called when link is acquired
+ *  to disable ULP mode (force=false); otherwise, for example when unloading
+ *  the driver or during Sx->S0 transitions, this is called with force=true
+ *  to forcibly disable ULP.
+#ifdef ULP_IN_D0_SUPPORT
+
+ *  When the cable is plugged in while the device is in D0, a Cable Status
+ *  Change interrupt is generated which causes this function to be called
+ *  to partially disable ULP mode and restart autonegotiation.  This function
+ *  is then called again due to the resulting Link Status Change interrupt
+ *  to finish cleaning up after the ULP flow.
+#endif
+ */
+s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force)
+{
+       s32 ret_val = E1000_SUCCESS;
+       u32 mac_reg;
+       u16 phy_reg;
+       int i = 0;
+
+       if ((hw->mac.type < e1000_pch_lpt) ||
+           (hw->device_id == E1000_DEV_ID_PCH_LPT_I217_LM) ||
+           (hw->device_id == E1000_DEV_ID_PCH_LPT_I217_V) ||
+#ifdef NAHUM6_LPTH_I218_HW
+           (hw->device_id == E1000_DEV_ID_PCH_I218_LM2) ||
+           (hw->device_id == E1000_DEV_ID_PCH_I218_V2) ||
+#endif
+           (hw->dev_spec.ich8lan.ulp_state == e1000_ulp_state_off))
+               return 0;
+
+       if (E1000_READ_REG(hw, E1000_FWSM) & E1000_ICH_FWSM_FW_VALID) {
+               if (force) {
+                       /* Request ME un-configure ULP mode in the PHY */
+                       mac_reg = E1000_READ_REG(hw, E1000_H2ME);
+                       mac_reg &= ~E1000_H2ME_ULP;
+                       mac_reg |= E1000_H2ME_ENFORCE_SETTINGS;
+                       E1000_WRITE_REG(hw, E1000_H2ME, mac_reg);
+               }
+
+               /* Poll up to 100msec for ME to clear ULP_CFG_DONE */
+               while (E1000_READ_REG(hw, E1000_FWSM) &
+                      E1000_FWSM_ULP_CFG_DONE) {
+                       if (i++ == 10) {
+                               ret_val = -E1000_ERR_PHY;
+                               goto out;
+                       }
+
+                       msec_delay(10);
+               }
+               DEBUGOUT1("ULP_CONFIG_DONE cleared after %dmsec\n", i * 10);
+
+               if (force) {
+                       mac_reg = E1000_READ_REG(hw, E1000_H2ME);
+                       mac_reg &= ~E1000_H2ME_ENFORCE_SETTINGS;
+                       E1000_WRITE_REG(hw, E1000_H2ME, mac_reg);
+               } else {
+                       /* Clear H2ME.ULP after ME ULP configuration */
+                       mac_reg = E1000_READ_REG(hw, E1000_H2ME);
+                       mac_reg &= ~E1000_H2ME_ULP;
+                       E1000_WRITE_REG(hw, E1000_H2ME, mac_reg);
+#ifdef ULP_IN_D0_SUPPORT
+
+                       /* Restore link speed advertisements and restart
+                        * Auto-negotiation
+                        */
+                       ret_val = e1000_phy_setup_autoneg(hw);
+                       if (ret_val)
+                               goto out;
+
+                       ret_val = e1000_oem_bits_config_ich8lan(hw, true);
+#endif
+               }
+
+               goto out;
+       }
+
+       if (force)
+               /* Toggle LANPHYPC Value bit */
+               e1000_toggle_lanphypc_pch_lpt(hw);
+
+       ret_val = hw->phy.ops.acquire(hw);
+       if (ret_val)
+               goto out;
+
+#ifdef ULP_IN_D0_SUPPORT
+       /* Revert the change to the 'Link Status Change'
+        * interrupt to trigger on 'Cable Status Change'
+        */
+       ret_val = e1000_read_kmrn_reg_locked(hw, E1000_KMRNCTRLSTA_OP_MODES,
+                                            &phy_reg);
+       if (ret_val)
+               goto release;
+       phy_reg &= ~E1000_KMRNCTRLSTA_OP_MODES_LSC2CSC;
+       e1000_write_kmrn_reg_locked(hw, E1000_KMRNCTRLSTA_OP_MODES, phy_reg);
+
+#endif
+       /* Unforce SMBus mode in PHY */
+       ret_val = e1000_read_phy_reg_hv_locked(hw, CV_SMB_CTRL, &phy_reg);
+       if (ret_val) {
+               /* The MAC might be in PCIe mode, so temporarily force to
+                * SMBus mode in order to access the PHY.
+                */
+               mac_reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
+               mac_reg |= E1000_CTRL_EXT_FORCE_SMBUS;
+               E1000_WRITE_REG(hw, E1000_CTRL_EXT, mac_reg);
+
+               msec_delay(50);
+
+               ret_val = e1000_read_phy_reg_hv_locked(hw, CV_SMB_CTRL,
+                                                      &phy_reg);
+               if (ret_val)
+                       goto release;
+       }
+       phy_reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
+       e1000_write_phy_reg_hv_locked(hw, CV_SMB_CTRL, phy_reg);
+
+       /* Unforce SMBus mode in MAC */
+       mac_reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
+       mac_reg &= ~E1000_CTRL_EXT_FORCE_SMBUS;
+       E1000_WRITE_REG(hw, E1000_CTRL_EXT, mac_reg);
+
+       /* When ULP mode was previously entered, K1 was disabled by the
+        * hardware.  Re-Enable K1 in the PHY when exiting ULP.
+        */
+       ret_val = e1000_read_phy_reg_hv_locked(hw, HV_PM_CTRL, &phy_reg);
+       if (ret_val)
+               goto release;
+       phy_reg |= HV_PM_CTRL_K1_ENABLE;
+       e1000_write_phy_reg_hv_locked(hw, HV_PM_CTRL, phy_reg);
+
+       /* Clear ULP enabled configuration */
+       ret_val = e1000_read_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, &phy_reg);
+       if (ret_val)
+               goto release;
+#ifdef ULP_IN_D0_SUPPORT
+       /* CSC interrupt received due to ULP Indication */
+       if ((phy_reg & I218_ULP_CONFIG1_IND) || force) {
+#endif
+               phy_reg &= ~(I218_ULP_CONFIG1_IND |
+                            I218_ULP_CONFIG1_STICKY_ULP |
+                            I218_ULP_CONFIG1_RESET_TO_SMBUS |
+                            I218_ULP_CONFIG1_WOL_HOST |
+                            I218_ULP_CONFIG1_INBAND_EXIT |
+                            I218_ULP_CONFIG1_DISABLE_SMB_PERST);
+               e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
+
+               /* Commit ULP changes by starting auto ULP configuration */
+               phy_reg |= I218_ULP_CONFIG1_START;
+               e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
+
+               /* Clear Disable SMBus Release on PERST# in MAC */
+               mac_reg = E1000_READ_REG(hw, E1000_FEXTNVM7);
+               mac_reg &= ~E1000_FEXTNVM7_DISABLE_SMB_PERST;
+               E1000_WRITE_REG(hw, E1000_FEXTNVM7, mac_reg);
+
+#ifdef ULP_IN_D0_SUPPORT
+               if (!force) {
+                       hw->phy.ops.release(hw);
+
+                       if (hw->mac.autoneg)
+                               e1000_phy_setup_autoneg(hw);
+
+                       e1000_sw_lcd_config_ich8lan(hw);
+
+                       e1000_oem_bits_config_ich8lan(hw, true);
+
+                       /* Set ULP state to unknown and return non-zero to
+                        * indicate no link (yet) and re-enter on the next LSC
+                        * to finish disabling ULP flow.
+                        */
+                       hw->dev_spec.ich8lan.ulp_state =
+                           e1000_ulp_state_unknown;
+
+                       return 1;
+               }
+       }
+
+       /* Re-enable Tx */
+       mac_reg = E1000_READ_REG(hw, E1000_TCTL);
+       mac_reg |= E1000_TCTL_EN;
+       E1000_WRITE_REG(hw, E1000_TCTL, mac_reg);
+
+#endif
+release:
+       hw->phy.ops.release(hw);
+       if (force) {
+               hw->phy.ops.reset(hw);
+               msec_delay(50);
+       }
+out:
+       if (ret_val)
+               DEBUGOUT1("Error in ULP disable flow: %d\n", ret_val);
+       else
+               hw->dev_spec.ich8lan.ulp_state = e1000_ulp_state_off;
+
+       return ret_val;
+}
+
+#endif /* NAHUM6LP_HW && ULP_SUPPORT */
 /**
  *  e1000_check_for_copper_link_ich8lan - Check for link (Copper)
  *  @hw: pointer to the HW structure
@@ -822,7 +1460,11 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
 {
        struct e1000_mac_info *mac = &hw->mac;
        s32 ret_val;
+#if defined(NAHUM6LP_HW) && defined(ULP_IN_D0_SUPPORT)
+       bool link = false;
+#else
        bool link;
+#endif
        u16 phy_reg;
 
        DEBUGFUNC("e1000_check_for_copper_link_ich8lan");
@@ -835,14 +1477,33 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
        if (!mac->get_link_status)
                return E1000_SUCCESS;
 
-       /*
-        * First we want to see if the MII Status Register reports
-        * link.  If so, then we want to get the current speed/duplex
-        * of the PHY.
-        */
-       ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link);
-       if (ret_val)
-               return ret_val;
+#if defined(NAHUM6LP_HW) && defined(ULP_IN_D0_SUPPORT)
+       if ((hw->mac.type < e1000_pch_lpt) ||
+           (hw->device_id == E1000_DEV_ID_PCH_LPT_I217_LM) ||
+           (hw->device_id == E1000_DEV_ID_PCH_LPT_I217_V)) {
+#endif /* NAHUM6LP_HW && ULP_IN_D0_SUPPORT */
+               /* First we want to see if the MII Status Register reports
+                * link.  If so, then we want to get the current speed/duplex
+                * of the PHY.
+                */
+               ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link);
+               if (ret_val)
+                       return ret_val;
+#if defined(NAHUM6LP_HW) && defined(ULP_IN_D0_SUPPORT)
+       } else {
+               /* Check the MAC's STATUS register to determine link state
+                * since the PHY could be inaccessible while in ULP mode.
+                */
+               link = !!(E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU);
+               if (link)
+                       ret_val = e1000_disable_ulp_lpt_lp(hw, false);
+               else
+                       ret_val = e1000_enable_ulp_lpt_lp(hw, false);
+
+               if (ret_val)
+                       return ret_val;
+       }
+#endif /* NAHUM6LP_HW && ULP_IN_D0_SUPPORT */
 
        if (hw->mac.type == e1000_pchlan) {
                ret_val = e1000_k1_gig_workaround_hv(hw, link);
@@ -850,6 +1511,53 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
                        return ret_val;
        }
 
+       /* When connected at 10Mbps half-duplex, 82579 parts are excessively
+        * aggressive resulting in many collisions. To avoid this, increase
+        * the IPG and reduce Rx latency in the PHY.
+        */
+       if ((hw->mac.type == e1000_pch2lan) && link) {
+               u32 reg;
+               reg = E1000_READ_REG(hw, E1000_STATUS);
+               if (!(reg & (E1000_STATUS_FD | E1000_STATUS_SPEED_MASK))) {
+                       reg = E1000_READ_REG(hw, E1000_TIPG);
+                       reg &= ~E1000_TIPG_IPGT_MASK;
+                       reg |= 0xFF;
+                       E1000_WRITE_REG(hw, E1000_TIPG, reg);
+
+                       /* Reduce Rx latency in analog PHY */
+                       ret_val = hw->phy.ops.acquire(hw);
+                       if (ret_val)
+                               return ret_val;
+
+                       ret_val = e1000_write_emi_reg_locked(hw, I82579_RX_CONFIG, 0);
+
+                       hw->phy.ops.release(hw);
+
+                       if (ret_val)
+                               return ret_val;
+               }
+       }
+
+#if defined(NAHUM6LP_HW) && defined(NAHUM6_WPT_HW)
+       /* Work-around I218 hang issue */
+       if ((hw->device_id == E1000_DEV_ID_PCH_LPTLP_I218_LM) ||
+           (hw->device_id == E1000_DEV_ID_PCH_LPTLP_I218_V) ||
+           (hw->device_id == E1000_DEV_ID_PCH_I218_LM3) ||
+           (hw->device_id == E1000_DEV_ID_PCH_I218_V3)) {
+               ret_val = e1000_k1_workaround_lpt_lp(hw, link);
+               if (ret_val)
+                       return ret_val;
+       }
+#else
+       /* Work-around I218 hang issue */
+       if ((hw->device_id == E1000_DEV_ID_PCH_LPTLP_I218_LM) ||
+           (hw->device_id == E1000_DEV_ID_PCH_LPTLP_I218_V)) {
+               ret_val = e1000_k1_workaround_lpt_lp(hw, link);
+               if (ret_val)
+                       return ret_val;
+       }
+
+#endif /* defined(NAHUM6LP_HW) && defined(NAHUM6_WPT_HW) */
        /* Clear link partner's EEE ability */
        hw->dev_spec.ich8lan.eee_lp_ability = 0;
 
@@ -895,9 +1603,11 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
        e1000_check_downshift_generic(hw);
 
        /* Enable/Disable EEE after link up */
-       ret_val = e1000_set_eee_pchlan(hw);
-       if (ret_val)
-               return ret_val;
+       if (hw->phy.type > e1000_phy_82579) {
+               ret_val = e1000_set_eee_pchlan(hw);
+               if (ret_val)
+                       return ret_val;
+       }
 
        /* If we are forcing speed/duplex, then we simply return since
         * we have already determined whether we have link or not.
@@ -943,6 +1653,7 @@ void e1000_init_function_pointers_ich8lan(struct e1000_hw *hw)
                break;
        case e1000_pchlan:
        case e1000_pch2lan:
+       case e1000_pch_lpt:
                hw->phy.ops.init_params = e1000_init_phy_params_pchlan;
                break;
        default:
@@ -1147,7 +1858,10 @@ STATIC void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)
                return;
        }
 
-       if (index < hw->mac.rar_entry_count) {
+       /* RAR[1-6] are owned by manageability.  Skip those and program the
+        * next address into the SHRA register array.
+        */
+       if (index < (u32) (hw->mac.rar_entry_count - 6)) {
                s32 ret_val;
 
                ret_val = e1000_acquire_swflag_ich8lan(hw);
@@ -1174,6 +1888,130 @@ out:
        DEBUGOUT1("Failed to write receive address at index %d\n", index);
 }
 
+/**
+ *  e1000_rar_set_pch_lpt - Set receive address registers
+ *  @hw: pointer to the HW structure
+ *  @addr: pointer to the receive address
+ *  @index: receive address array register
+ *
+ *  Sets the receive address register array at index to the address passed
+ *  in by addr. For LPT, RAR[0] is the base address register that is to
+ *  contain the MAC address. SHRA[0-10] are the shared receive address
+ *  registers that are shared between the Host and manageability engine (ME).
+ **/
+STATIC void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)
+{
+       u32 rar_low, rar_high;
+       u32 wlock_mac;
+
+       DEBUGFUNC("e1000_rar_set_pch_lpt");
+
+       /* HW expects these in little endian so we reverse the byte order
+        * from network order (big endian) to little endian
+        */
+       rar_low = ((u32) addr[0] | ((u32) addr[1] << 8) |
+                  ((u32) addr[2] << 16) | ((u32) addr[3] << 24));
+
+       rar_high = ((u32) addr[4] | ((u32) addr[5] << 8));
+
+       /* If MAC address zero, no need to set the AV bit */
+       if (rar_low || rar_high)
+               rar_high |= E1000_RAH_AV;
+
+       if (index == 0) {
+               E1000_WRITE_REG(hw, E1000_RAL(index), rar_low);
+               E1000_WRITE_FLUSH(hw);
+               E1000_WRITE_REG(hw, E1000_RAH(index), rar_high);
+               E1000_WRITE_FLUSH(hw);
+               return;
+       }
+
+       /* The manageability engine (ME) can lock certain SHRAR registers that
+        * it is using - those registers are unavailable for use.
+        */
+       if (index < hw->mac.rar_entry_count) {
+               wlock_mac = E1000_READ_REG(hw, E1000_FWSM) &
+                           E1000_FWSM_WLOCK_MAC_MASK;
+               wlock_mac >>= E1000_FWSM_WLOCK_MAC_SHIFT;
+
+               /* Check if all SHRAR registers are locked */
+               if (wlock_mac == 1)
+                       goto out;
+
+               if ((wlock_mac == 0) || (index <= wlock_mac)) {
+                       s32 ret_val;
+
+                       ret_val = e1000_acquire_swflag_ich8lan(hw);
+
+                       if (ret_val)
+                               goto out;
+
+                       E1000_WRITE_REG(hw, E1000_SHRAL_PCH_LPT(index - 1),
+                                       rar_low);
+                       E1000_WRITE_FLUSH(hw);
+                       E1000_WRITE_REG(hw, E1000_SHRAH_PCH_LPT(index - 1),
+                                       rar_high);
+                       E1000_WRITE_FLUSH(hw);
+
+                       e1000_release_swflag_ich8lan(hw);
+
+                       /* verify the register updates */
+                       if ((E1000_READ_REG(hw, E1000_SHRAL_PCH_LPT(index - 1)) == rar_low) &&
+                           (E1000_READ_REG(hw, E1000_SHRAH_PCH_LPT(index - 1)) == rar_high))
+                               return;
+               }
+       }
+
+out:
+       DEBUGOUT1("Failed to write receive address at index %d\n", index);
+}
+
+#ifndef NO_NON_BLOCKING_PHY_MTA_UPDATE_SUPPORT
+/**
+ *  e1000_update_mc_addr_list_pch2lan - Update Multicast addresses
+ *  @hw: pointer to the HW structure
+ *  @mc_addr_list: array of multicast addresses to program
+ *  @mc_addr_count: number of multicast addresses to program
+ *
+ *  Updates entire Multicast Table Array of the PCH2 MAC and PHY.
+ *  The caller must have a packed mc_addr_list of multicast addresses.
+ **/
+STATIC void e1000_update_mc_addr_list_pch2lan(struct e1000_hw *hw,
+                                             u8 *mc_addr_list,
+                                             u32 mc_addr_count)
+{
+       u16 phy_reg = 0;
+       int i;
+       s32 ret_val;
+
+       DEBUGFUNC("e1000_update_mc_addr_list_pch2lan");
+
+       e1000_update_mc_addr_list_generic(hw, mc_addr_list, mc_addr_count);
+
+       ret_val = hw->phy.ops.acquire(hw);
+       if (ret_val)
+               return;
+
+       ret_val = e1000_enable_phy_wakeup_reg_access_bm(hw, &phy_reg);
+       if (ret_val)
+               goto release;
+
+       for (i = 0; i < hw->mac.mta_reg_count; i++) {
+               hw->phy.ops.write_reg_page(hw, BM_MTA(i),
+                                          (u16)(hw->mac.mta_shadow[i] &
+                                                0xFFFF));
+               hw->phy.ops.write_reg_page(hw, (BM_MTA(i) + 1),
+                                          (u16)((hw->mac.mta_shadow[i] >> 16) &
+                                                0xFFFF));
+       }
+
+       e1000_disable_phy_wakeup_reg_access_bm(hw, &phy_reg);
+
+release:
+       hw->phy.ops.release(hw);
+}
+
+#endif /* NO_NON_BLOCKING_PHY_MTA_UPDATE_SUPPORT */
 /**
  *  e1000_check_reset_block_ich8lan - Check if PHY reset is blocked
  *  @hw: pointer to the HW structure
@@ -1185,13 +2023,21 @@ out:
 STATIC s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw)
 {
        u32 fwsm;
+       bool blocked = false;
+       int i = 0;
 
        DEBUGFUNC("e1000_check_reset_block_ich8lan");
 
-       fwsm = E1000_READ_REG(hw, E1000_FWSM);
-
-       return (fwsm & E1000_ICH_FWSM_RSPCIPHY) ? E1000_SUCCESS
-                                               : E1000_BLK_PHY_RESET;
+       do {
+               fwsm = E1000_READ_REG(hw, E1000_FWSM);
+               if (!(fwsm & E1000_ICH_FWSM_RSPCIPHY)) {
+                       blocked = true;
+                       msec_delay(10);
+                       continue;
+               }
+               blocked = false;
+       } while (blocked && (i++ < 10));
+       return blocked ? E1000_BLK_PHY_RESET : E1000_SUCCESS;
 }
 
 /**
@@ -1270,6 +2116,7 @@ STATIC s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
                /* Fall-thru */
        case e1000_pchlan:
        case e1000_pch2lan:
+       case e1000_pch_lpt:
                sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M;
                break;
        default:
@@ -1690,8 +2537,8 @@ void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw)
        if (ret_val)
                goto release;
 
-       /* Copy both RAL/H (rar_entry_count) and SHRAL/H (+4) to PHY */
-       for (i = 0; i < (hw->mac.rar_entry_count + 4); i++) {
+       /* Copy both RAL/H (rar_entry_count) and SHRAL/H to PHY */
+       for (i = 0; i < (hw->mac.rar_entry_count); i++) {
                mac_reg = E1000_READ_REG(hw, E1000_RAL(i));
                hw->phy.ops.write_reg_page(hw, BM_RAR_L(i),
                                           (u16)(mac_reg & 0xFFFF));
@@ -1712,6 +2559,7 @@ release:
        hw->phy.ops.release(hw);
 }
 
+#ifndef CRC32_OS_SUPPORT
 static u32 e1000_calc_rx_da_crc(u8 mac[])
 {
        u32 poly = 0xEDB88320;  /* Polynomial for 802.3 CRC calculation */
@@ -1730,6 +2578,7 @@ static u32 e1000_calc_rx_da_crc(u8 mac[])
        return ~crc;
 }
 
+#endif /* CRC32_OS_SUPPORT */
 /**
  *  e1000_lv_jumbo_workaround_ich8lan - required for jumbo frame operation
  *  with 82579 PHY
@@ -1745,7 +2594,7 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
 
        DEBUGFUNC("e1000_lv_jumbo_workaround_ich8lan");
 
-       if (hw->mac.type != e1000_pch2lan)
+       if (hw->mac.type < e1000_pch2lan)
                return E1000_SUCCESS;
 
        /* disable Rx path while enabling/disabling workaround */
@@ -1759,7 +2608,7 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
                /* Write Rx addresses (rar_entry_count for RAL/H, and
                 * SHRAL/H) and initial CRC values to the MAC
                 */
-               for (i = 0; i < (hw->mac.rar_entry_count + 4); i++) {
+               for (i = 0; i < hw->mac.rar_entry_count; i++) {
                        u8 mac_addr[ETH_ADDR_LEN] = {0};
                        u32 addr_high, addr_low;
 
@@ -1774,8 +2623,13 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
                        mac_addr[4] = (addr_high & 0xFF);
                        mac_addr[5] = ((addr_high >> 8) & 0xFF);
 
+#ifndef CRC32_OS_SUPPORT
                        E1000_WRITE_REG(hw, E1000_PCH_RAICC(i),
                                        e1000_calc_rx_da_crc(mac_addr));
+#else /* CRC32_OS_SUPPORT */
+                       E1000_WRITE_REG(hw, E1000_PCH_RAICC(i),
+                                       E1000_CRC32(ETH_ADDR_LEN, mac_addr));
+#endif /* CRC32_OS_SUPPORT */
                }
 
                /* Write Rx addresses to the PHY */
@@ -2010,7 +2864,7 @@ STATIC void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate)
 
        DEBUGFUNC("e1000_gate_hw_phy_config_ich8lan");
 
-       if (hw->mac.type != e1000_pch2lan)
+       if (hw->mac.type < e1000_pch2lan)
                return;
 
        extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL);
@@ -2228,6 +3082,8 @@ STATIC s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
                ret_val = phy->ops.read_reg(hw,
                                            IGP01E1000_PHY_PORT_CONFIG,
                                            &data);
+               if (ret_val)
+                       return ret_val;
                data &= ~IGP01E1000_PSCFR_SMART_SPEED;
                ret_val = phy->ops.write_reg(hw,
                                             IGP01E1000_PHY_PORT_CONFIG,
@@ -2949,6 +3805,10 @@ STATIC s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw)
         * the checksum...a likely scenario.
         */
        switch (hw->mac.type) {
+       case e1000_pch_lpt:
+               word = NVM_COMPAT;
+               valid_csum_mask = NVM_COMPAT_VALID_CSUM;
+               break;
        default:
                word = NVM_FUTURE_INIT_WORD1;
                valid_csum_mask = NVM_FUTURE_INIT_WORD1_VALID_CSUM;
@@ -3611,6 +4471,17 @@ static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw)
                reg |= (E1000_RFCTL_IPV6_EX_DIS | E1000_RFCTL_NEW_IPV6_EXT_DIS);
        E1000_WRITE_REG(hw, E1000_RFCTL, reg);
 
+       /* Enable ECC on Lynxpoint */
+       if (hw->mac.type == e1000_pch_lpt) {
+               reg = E1000_READ_REG(hw, E1000_PBECCSTS);
+               reg |= E1000_PBECCSTS_ECC_ENABLE;
+               E1000_WRITE_REG(hw, E1000_PBECCSTS, reg);
+
+               reg = E1000_READ_REG(hw, E1000_CTRL);
+               reg |= E1000_CTRL_MEHE;
+               E1000_WRITE_REG(hw, E1000_CTRL, reg);
+       }
+
        return;
 }
 
@@ -3725,7 +4596,6 @@ STATIC s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
                break;
        case e1000_phy_82577:
        case e1000_phy_82579:
-       case e1000_phy_i217:
                ret_val = e1000_copper_link_setup_82577(hw);
                if (ret_val)
                        return ret_val;
@@ -3762,6 +4632,33 @@ STATIC s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
        return e1000_setup_copper_link_generic(hw);
 }
 
+/**
+ *  e1000_setup_copper_link_pch_lpt - Configure MAC/PHY interface
+ *  @hw: pointer to the HW structure
+ *
+ *  Calls the PHY specific link setup function and then calls the
+ *  generic setup_copper_link to finish configuring the link for
+ *  Lynxpoint PCH devices
+ **/
+STATIC s32 e1000_setup_copper_link_pch_lpt(struct e1000_hw *hw)
+{
+       u32 ctrl;
+       s32 ret_val;
+
+       DEBUGFUNC("e1000_setup_copper_link_pch_lpt");
+
+       ctrl = E1000_READ_REG(hw, E1000_CTRL);
+       ctrl |= E1000_CTRL_SLU;
+       ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
+       E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
+
+       ret_val = e1000_copper_link_setup_82577(hw);
+       if (ret_val)
+               return ret_val;
+
+       return e1000_setup_copper_link_generic(hw);
+}
+
 /**
  *  e1000_get_link_up_info_ich8lan - Get current link speed and duplex
  *  @hw: pointer to the HW structure
@@ -3972,9 +4869,8 @@ void e1000_gig_downshift_workaround_ich8lan(struct e1000_hw *hw)
        if (ret_val)
                return;
        reg_data &= ~E1000_KMRNCTRLSTA_DIAG_NELPBK;
-       ret_val = e1000_write_kmrn_reg_generic(hw,
-                                              E1000_KMRNCTRLSTA_DIAG_OFFSET,
-                                              reg_data);
+       e1000_write_kmrn_reg_generic(hw, E1000_KMRNCTRLSTA_DIAG_OFFSET,
+                                    reg_data);
 }
 
 /**
@@ -4003,7 +4899,27 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
        phy_ctrl |= E1000_PHY_CTRL_GBE_DISABLE;
 
        if (hw->phy.type == e1000_phy_i217) {
-               u16 phy_reg;
+               u16 phy_reg, device_id = hw->device_id;
+
+#ifdef NAHUM6_WPT_HW
+               if ((device_id == E1000_DEV_ID_PCH_LPTLP_I218_LM) ||
+                   (device_id == E1000_DEV_ID_PCH_LPTLP_I218_V) ||
+                   (device_id == E1000_DEV_ID_PCH_I218_LM3) ||
+                   (device_id == E1000_DEV_ID_PCH_I218_V3)) {
+                       u32 fextnvm6 = E1000_READ_REG(hw, E1000_FEXTNVM6);
+
+                       E1000_WRITE_REG(hw, E1000_FEXTNVM6,
+                                       fextnvm6 & ~E1000_FEXTNVM6_REQ_PLL_CLK);
+               }
+#else
+               if ((device_id == E1000_DEV_ID_PCH_LPTLP_I218_LM) ||
+                   (device_id == E1000_DEV_ID_PCH_LPTLP_I218_V)) {
+                       u32 fextnvm6 = E1000_READ_REG(hw, E1000_FEXTNVM6);
+
+                       E1000_WRITE_REG(hw, E1000_FEXTNVM6,
+                                       fextnvm6 & ~E1000_FEXTNVM6_REQ_PLL_CLK);
+               }
+#endif
 
                ret_val = hw->phy.ops.acquire(hw);
                if (ret_val)
@@ -4021,14 +4937,25 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
 
                        /* Disable LPLU if both link partners support 100BaseT
                         * EEE and 100Full is advertised on both ends of the
-                        * link.
+                        * link, and enable Auto Enable LPI since there will
+                        * be no driver to enable LPI while in Sx.
                         */
                        if ((eee_advert & I82579_EEE_100_SUPPORTED) &&
                            (dev_spec->eee_lp_ability &
                             I82579_EEE_100_SUPPORTED) &&
-                           (hw->phy.autoneg_advertised & ADVERTISE_100_FULL))
+                           (hw->phy.autoneg_advertised & ADVERTISE_100_FULL)) {
                                phy_ctrl &= ~(E1000_PHY_CTRL_D0A_LPLU |
                                              E1000_PHY_CTRL_NOND0A_LPLU);
+
+                               /* Set Auto Enable LPI after link up */
+                               hw->phy.ops.read_reg_locked(hw,
+                                                           I217_LPI_GPIO_CTRL,
+                                                           &phy_reg);
+                               phy_reg |= I217_LPI_GPIO_CTRL_AUTO_EN_LPI;
+                               hw->phy.ops.write_reg_locked(hw,
+                                                            I217_LPI_GPIO_CTRL,
+                                                            phy_reg);
+                       }
                }
 
                /* For i217 Intel Rapid Start Technology support,
@@ -4132,6 +5059,11 @@ void e1000_resume_workarounds_pchlan(struct e1000_hw *hw)
                        return;
                }
 
+               /* Clear Auto Enable LPI after link up */
+               hw->phy.ops.read_reg_locked(hw, I217_LPI_GPIO_CTRL, &phy_reg);
+               phy_reg &= ~I217_LPI_GPIO_CTRL_AUTO_EN_LPI;
+               hw->phy.ops.write_reg_locked(hw, I217_LPI_GPIO_CTRL, phy_reg);
+
                if (!(E1000_READ_REG(hw, E1000_FWSM) &
                    E1000_ICH_FWSM_FW_VALID)) {
                        /* Restore clear on SMB if no manageability engine
index df050dd..eb0580f 100644 (file)
@@ -58,12 +58,8 @@ POSSIBILITY OF SUCH DAMAGE.
 #define ICH_FLASH_SEG_SIZE_4K          4096
 #define ICH_FLASH_SEG_SIZE_8K          8192
 #define ICH_FLASH_SEG_SIZE_64K         65536
-#define ICH_FLASH_SECTOR_SIZE          4096
-
-#define ICH_FLASH_REG_MAPSIZE          0x00A0
 
 #define E1000_ICH_FWSM_RSPCIPHY        0x00000040 /* Reset PHY on PCI Reset */
-#define E1000_ICH_FWSM_DISSW           0x10000000 /* FW Disables SW Writes */
 /* FW established a valid mode */
 #define E1000_ICH_FWSM_FW_VALID        0x00008000
 #define E1000_ICH_FWSM_PCIM2PCI        0x01000000 /* ME PCIm-to-PCI active */
@@ -71,23 +67,24 @@ POSSIBILITY OF SUCH DAMAGE.
 
 #define E1000_ICH_MNG_IAMT_MODE                0x2
 
-#define E1000_FWSM_PROXY_MODE          0x00000008 /* FW is in proxy mode */
-#define E1000_FWSM_MEMC                        0x00000010 /* ME Messaging capable */
+#define E1000_FWSM_WLOCK_MAC_MASK      0x0380
+#define E1000_FWSM_WLOCK_MAC_SHIFT     7
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_SUPPORT))
+#define E1000_FWSM_ULP_CFG_DONE                0x00000400  /* Low power cfg done */
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_SUPPORT) */
 
 /* Shared Receive Address Registers */
-#define E1000_SHRAH_AV         0x80000000 /* Addr Valid bit */
-#define E1000_SHRAH_MAV                0x40000000 /* Multicast Addr Valid bit */
+#define E1000_SHRAL_PCH_LPT(_i)                (0x05408 + ((_i) * 8))
+#define E1000_SHRAH_PCH_LPT(_i)                (0x0540C + ((_i) * 8))
 
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_SUPPORT))
 #define E1000_H2ME             0x05B50    /* Host to ME */
-#define E1000_H2ME_LSECREQ     0x00000001 /* Linksec Request */
-#define E1000_H2ME_LSECA       0x00000002 /* Linksec Active */
-#define E1000_H2ME_LSECSF      0x00000004 /* Linksec Failed */
-#define E1000_H2ME_LSECD       0x00000008 /* Linksec Disabled */
-#define E1000_H2ME_SLCAPD      0x00000010 /* Start LCAPD */
-#define E1000_H2ME_IPV4_ARP_EN 0x00000020 /* Arp Offload enable bit */
-#define E1000_H2ME_IPV6_NS_EN  0x00000040 /* NS Offload enable bit */
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_SUPPORT) */
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_SUPPORT))
 #define E1000_H2ME_ULP         0x00000800 /* ULP Indication Bit */
+#define E1000_H2ME_ENFORCE_SETTINGS    0x00001000 /* Enforce Settings */
 
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_SUPPORT) */
 #define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \
                                 (ID_LED_OFF1_OFF2 <<  8) | \
                                 (ID_LED_OFF1_ON2  <<  4) | \
@@ -100,13 +97,14 @@ POSSIBILITY OF SUCH DAMAGE.
 
 #define E1000_ICH8_LAN_INIT_TIMEOUT    1500
 
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_SUPPORT))
 /* FEXT register bit definition */
 #define E1000_FEXT_PHY_CABLE_DISCONNECTED      0x00000004
 
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_SUPPORT) */
 #define E1000_FEXTNVM_SW_CONFIG                1
 #define E1000_FEXTNVM_SW_CONFIG_ICH8M  (1 << 27) /* different on ICH8M */
 
-#define E1000_FEXTNVM3 0x0003C  /* Future Extended NVM 3 - RW */
 #define E1000_FEXTNVM3_PHY_CFG_COUNTER_MASK    0x0C000000
 #define E1000_FEXTNVM3_PHY_CFG_COUNTER_50MSEC  0x08000000
 
@@ -114,23 +112,28 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_FEXTNVM4_BEACON_DURATION_8USEC   0x7
 #define E1000_FEXTNVM4_BEACON_DURATION_16USEC  0x3
 
+#define E1000_FEXTNVM6_REQ_PLL_CLK     0x00000100
+#define E1000_FEXTNVM6_ENABLE_K1_ENTRY_CONDITION       0x00000200
+
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_SUPPORT))
+#define E1000_FEXTNVM7_DISABLE_SMB_PERST       0x00000020
+
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_SUPPORT) */
 #define PCIE_ICH8_SNOOP_ALL    PCIE_NO_SNOOP_ALL
 
 #define E1000_ICH_RAR_ENTRIES  7
-#define E1000_PCH2_RAR_ENTRIES 5 /* RAR[0], SHRA[0-3] */
+#define E1000_PCH2_RAR_ENTRIES 11 /* RAR[0-6], SHRA[0-3] */
+#define E1000_PCH_LPT_RAR_ENTRIES      12 /* RAR[0], SHRA[0-10] */
 
 #define PHY_PAGE_SHIFT         5
 #define PHY_REG(page, reg)     (((page) << PHY_PAGE_SHIFT) | \
                                 ((reg) & MAX_PHY_REG_ADDRESS))
 #define IGP3_KMRN_DIAG PHY_REG(770, 19) /* KMRN Diagnostic */
 #define IGP3_VR_CTRL   PHY_REG(776, 18) /* Voltage Regulator Control */
-#define IGP3_CAPABILITY                PHY_REG(776, 19) /* Capability */
-#define IGP3_PM_CTRL           PHY_REG(769, 20) /* Power Management Control */
 
 #define IGP3_KMRN_DIAG_PCS_LOCK_LOSS           0x0002
 #define IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK   0x0300
 #define IGP3_VR_CTRL_MODE_SHUTDOWN             0x0200
-#define IGP3_PM_CTRL_FORCE_PWR_DOWN            0x0020
 
 /* PHY Wakeup Registers and defines */
 #define BM_PORT_GEN_CFG                PHY_REG(BM_PORT_CTRL_PAGE, 17)
@@ -143,19 +146,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define BM_RAR_H(_i)           (BM_PHY_REG(BM_WUC_PAGE, 18 + ((_i) << 2)))
 #define BM_RAR_CTRL(_i)                (BM_PHY_REG(BM_WUC_PAGE, 19 + ((_i) << 2)))
 #define BM_MTA(_i)             (BM_PHY_REG(BM_WUC_PAGE, 128 + ((_i) << 1)))
-#define BM_IPAV                        (BM_PHY_REG(BM_WUC_PAGE, 64))
-#define BM_IP4AT_L(_i)         (BM_PHY_REG(BM_WUC_PAGE, 82 + ((_i) * 2)))
-#define BM_IP4AT_H(_i)         (BM_PHY_REG(BM_WUC_PAGE, 83 + ((_i) * 2)))
-
-#define BM_SHRAL_LOWER(_i)     (BM_PHY_REG(BM_WUC_PAGE, 44 + ((_i) * 4)))
-#define BM_SHRAL_UPPER(_i)     (BM_PHY_REG(BM_WUC_PAGE, 45 + ((_i) * 4)))
-#define BM_SHRAH_LOWER(_i)     (BM_PHY_REG(BM_WUC_PAGE, 46 + ((_i) * 4)))
-#define BM_SHRAH_UPPER(_i)     (BM_PHY_REG(BM_WUC_PAGE, 47 + ((_i) * 4)))
-
-#define I217_SHRAL_LOWER(_i)   (BM_PHY_REG(BM_WUC_PAGE, 20 + ((_i) * 4)))
-#define I217_SHRAL_UPPER(_i)   (BM_PHY_REG(BM_WUC_PAGE, 21 + ((_i) * 4)))
-#define I217_SHRAH_LOWER(_i)   (BM_PHY_REG(BM_WUC_PAGE, 22 + ((_i) * 4)))
-#define I217_SHRAH_UPPER(_i)   (BM_PHY_REG(BM_WUC_PAGE, 23 + ((_i) * 4)))
 
 #define BM_RCTL_UPE            0x0001 /* Unicast Promiscuous Mode */
 #define BM_RCTL_MPE            0x0002 /* Multicast Promiscuous Mode */
@@ -188,15 +178,6 @@ POSSIBILITY OF SUCH DAMAGE.
 
 #define E1000_FCRTV_PCH        0x05F40 /* PCH Flow Control Refresh Timer Value */
 
-/*
- * For ICH, the name used for NVM word 17h is LED1 Config.
- * For PCH, the word was re-named to OEM Config.
- */
-#define E1000_NVM_LED1_CONFIG          0x17   /* NVM LED1/LPLU Config Word */
-#define E1000_NVM_LED1_CONFIG_LPLU_NONDOA 0x0400 /* NVM LPLU in non-D0a Bit */
-#define E1000_NVM_OEM_CONFIG           E1000_NVM_LED1_CONFIG
-#define E1000_NVM_OEM_CONFIG_LPLU_NONDOA E1000_NVM_LED1_CONFIG_LPLU_NONDOA
-
 #define E1000_NVM_K1_CONFIG    0x1B /* NVM K1 Config Word */
 #define E1000_NVM_K1_ENABLE    0x1  /* NVM Enable K1 bit */
 
@@ -204,6 +185,18 @@ POSSIBILITY OF SUCH DAMAGE.
 #define CV_SMB_CTRL            PHY_REG(769, 23)
 #define CV_SMB_CTRL_FORCE_SMBUS        0x0001
 
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_SUPPORT))
+/* I218 Ultra Low Power Configuration 1 Register */
+#define I218_ULP_CONFIG1               PHY_REG(779, 16)
+#define I218_ULP_CONFIG1_START         0x0001 /* Start auto ULP config */
+#define I218_ULP_CONFIG1_IND           0x0004 /* Pwr up from ULP indication */
+#define I218_ULP_CONFIG1_STICKY_ULP    0x0010 /* Set sticky ULP mode */
+#define I218_ULP_CONFIG1_INBAND_EXIT   0x0020 /* Inband on ULP exit */
+#define I218_ULP_CONFIG1_WOL_HOST      0x0040 /* WoL Host on ULP exit */
+#define I218_ULP_CONFIG1_RESET_TO_SMBUS        0x0100 /* Reset to SMBus mode */
+#define I218_ULP_CONFIG1_DISABLE_SMB_PERST     0x1000 /* Disable on PERST# */
+
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_SUPPORT) */
 /* SMBus Address Phy Register */
 #define HV_SMB_ADDR            PHY_REG(768, 26)
 #define HV_SMB_ADDR_MASK       0x007F
@@ -226,8 +219,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define HV_OEM_BITS_GBE_DIS    0x0040 /* Gigabit Disable */
 #define HV_OEM_BITS_RESTART_AN 0x0400 /* Restart Auto-negotiation */
 
-#define LCD_CFG_PHY_ADDR_BIT   0x0020 /* Phy addr bit from LCD Config word */
-
 /* KMRN Mode Control */
 #define HV_KMRN_MODE_CTRL      PHY_REG(769, 16)
 #define HV_KMRN_MDIO_SLOW      0x0400
@@ -240,11 +231,21 @@ POSSIBILITY OF SUCH DAMAGE.
 /* PHY Power Management Control */
 #define HV_PM_CTRL             PHY_REG(770, 17)
 #define HV_PM_CTRL_PLL_STOP_IN_K1_GIGA 0x100
-#define I217_MEM_PM_CFG                PHY_REG(772, 27) /* I217 PHY Mem PM Cfg Reg */
-#define I217_MEM_PM_CFG_TXF_SD 0x0020 /* Tx FIFO Memories Shutdown*/
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_SUPPORT))
+#define HV_PM_CTRL_K1_ENABLE           0x4000
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_SUPPORT) */
 
 #define SW_FLAG_TIMEOUT                1000 /* SW Semaphore flag timeout in ms */
 
+/* Inband Control */
+#define I217_INBAND_CTRL                               PHY_REG(770, 18)
+#define I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_MASK     0x3F00
+#define I217_INBAND_CTRL_LINK_STAT_TX_TIMEOUT_SHIFT    8
+
+/* Low Power Idle GPIO Control */
+#define I217_LPI_GPIO_CTRL                     PHY_REG(772, 18)
+#define I217_LPI_GPIO_CTRL_AUTO_EN_LPI         0x0800
+
 /* PHY Low Power Idle Control */
 #define I82579_LPI_CTRL                                PHY_REG(772, 20)
 #define I82579_LPI_CTRL_100_ENABLE             0x2000
@@ -252,6 +253,10 @@ POSSIBILITY OF SUCH DAMAGE.
 #define I82579_LPI_CTRL_ENABLE_MASK            0x6000
 #define I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT   0x80
 
+/* 82579 DFT Control */
+#define I82579_DFT_CTRL                        PHY_REG(769, 20)
+#define I82579_DFT_CTRL_GATE_PHY_RESET 0x0040 /* Gate PHY Reset on MAC Reset */
+
 /* Extended Management Interface (EMI) Registers */
 #define I82579_EMI_ADDR                0x10
 #define I82579_EMI_DATA                0x11
@@ -259,7 +264,8 @@ POSSIBILITY OF SUCH DAMAGE.
 #define I82579_MSE_THRESHOLD   0x084F /* 82579 Mean Square Error Threshold */
 #define I82577_MSE_THRESHOLD   0x0887 /* 82577 Mean Square Error Threshold */
 #define I82579_MSE_LINK_DOWN   0x2411 /* MSE count before dropping link */
-#define I82579_EEE_PCS_STATUS          0x182D  /* IEEE MMD Register 3.1 >> 8 */
+#define I82579_RX_CONFIG               0x3412 /* Receive configuration */
+#define I82579_EEE_PCS_STATUS          0x182E  /* IEEE MMD Register 3.1 >> 8 */
 #define I82579_EEE_CAPABILITY          0x0410 /* IEEE MMD Register 3.20 */
 #define I82579_EEE_ADVERTISEMENT       0x040E /* IEEE MMD Register 7.60 */
 #define I82579_EEE_LP_ABILITY          0x040F /* IEEE MMD Register 7.61 */
@@ -278,38 +284,17 @@ POSSIBILITY OF SUCH DAMAGE.
 #define I217_PROXY_CTRL_AUTO_DISABLE   0x0080
 #define I217_SxCTRL                    PHY_REG(BM_PORT_CTRL_PAGE, 28)
 #define I217_SxCTRL_ENABLE_LPI_RESET   0x1000
-#define I217_SxCTRL_ENABLE_SERDES      0x0020
 #define I217_CGFREG                    PHY_REG(772, 29)
 #define I217_CGFREG_ENABLE_MTA_RESET   0x0002
 #define I217_MEMPWR                    PHY_REG(772, 26)
 #define I217_MEMPWR_DISABLE_SMB_RELEASE        0x0010
 
-/*
- * Additional interrupts need to be handled for ICH family:
- *  DSW = The FW changed the status of the DISSW bit in FWSM
- *  PHYINT = The LAN connected device generates an interrupt
- *  EPRST = Manageability reset event
- */
-#define IMS_ICH_ENABLE_MASK (\
-       E1000_IMS_DSW   | \
-       E1000_IMS_PHYINT | \
-       E1000_IMS_EPRST)
-
-/* Additional interrupt register bit definitions */
-#define E1000_ICR_LSECPNC      0x00004000  /* PN threshold - client */
-#define E1000_IMS_LSECPNC      E1000_ICR_LSECPNC   /* PN threshold - client */
-#define E1000_ICS_LSECPNC      E1000_ICR_LSECPNC   /* PN threshold - client */
-
-/* Security Processing bit Indication */
-#define E1000_RXDEXT_LINKSEC_STATUS_LSECH      0x01000000
-#define E1000_RXDEXT_LINKSEC_ERROR_BIT_MASK    0x60000000
-#define E1000_RXDEXT_LINKSEC_ERROR_NO_SA_MATCH 0x20000000
-#define E1000_RXDEXT_LINKSEC_ERROR_REPLAY_ERROR        0x40000000
-#define E1000_RXDEXT_LINKSEC_ERROR_BAD_SIG     0x60000000
-
 /* Receive Address Initial CRC Calculation */
 #define E1000_PCH_RAICC(_n)    (0x05F50 + ((_n) * 4))
 
+#if defined(QV_RELEASE) || !defined(NO_PCH_LPT_B0_SUPPORT)
+#define E1000_PCI_REVISION_ID_REG      0x08
+#endif /* defined(QV_RELEASE) || !defined(NO_PCH_LPT_B0_SUPPORT) */
 void e1000_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw,
                                                 bool state);
 void e1000_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw);
@@ -320,4 +305,14 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable);
 void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw);
 s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable);
 s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data);
+s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data);
+s32 e1000_set_eee_pchlan(struct e1000_hw *hw);
+#if defined(NAHUM6LP_HW) && defined(ULP_SUPPORT)
+s32 e1000_enable_ulp_lpt_lp(struct e1000_hw *hw, bool to_sx);
+s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force);
+void e1000_toggle_lanphypc_pch_lpt(struct e1000_hw *hw);
+#endif /* NAHUM6LP_HW && ULP_SUPPORT */
 #endif /* _E1000_ICH8LAN_H_ */
+#ifdef C10_SUPPORT
+void e1000_demote_ltr(struct e1000_hw *hw, bool demote, bool link);
+#endif /* C10_SUPPORT */
index b779e31..1028fd2 100644 (file)
@@ -69,12 +69,8 @@ void e1000_init_mac_ops_generic(struct e1000_hw *hw)
        mac->ops.setup_link = e1000_null_ops_generic;
        mac->ops.get_link_up_info = e1000_null_link_info;
        mac->ops.check_for_link = e1000_null_ops_generic;
-       mac->ops.wait_autoneg = e1000_wait_autoneg_generic;
        /* Management */
        mac->ops.check_mng_mode = e1000_null_mng_mode;
-       mac->ops.mng_host_if_write = e1000_mng_host_if_write_generic;
-       mac->ops.mng_write_cmd_header = e1000_mng_write_cmd_header_generic;
-       mac->ops.mng_enable_host_if = e1000_mng_enable_host_if_generic;
        /* VLAN, MC, etc. */
        mac->ops.update_mc_addr_list = e1000_null_update_mc;
        mac->ops.clear_vfta = e1000_null_mac_generic;
@@ -944,6 +940,7 @@ s32 e1000_set_default_fc_generic(struct e1000_hw *hw)
 {
        s32 ret_val;
        u16 nvm_data;
+       u16 nvm_offset = 0;
 
        DEBUGFUNC("e1000_set_default_fc_generic");
 
@@ -955,7 +952,18 @@ s32 e1000_set_default_fc_generic(struct e1000_hw *hw)
         * control setting, then the variable hw->fc will
         * be initialized based on a value in the EEPROM.
         */
-       ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data);
+       if (hw->mac.type == e1000_i350) {
+               nvm_offset = NVM_82580_LAN_FUNC_OFFSET(hw->bus.func);
+               ret_val = hw->nvm.ops.read(hw,
+                                          NVM_INIT_CONTROL2_REG +
+                                          nvm_offset,
+                                          1, &nvm_data);
+       } else {
+               ret_val = hw->nvm.ops.read(hw,
+                                          NVM_INIT_CONTROL2_REG,
+                                          1, &nvm_data);
+       }
+
 
        if (ret_val) {
                DEBUGOUT("NVM Read Error\n");
@@ -1945,16 +1953,28 @@ s32 e1000_blink_led_generic(struct e1000_hw *hw)
                ledctl_blink = E1000_LEDCTL_LED0_BLINK |
                     (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);
        } else {
-               /*
-                * set the blink bit for each LED that's "on" (0x0E)
-                * in ledctl_mode2
+               /* Set the blink bit for each LED that's "on" (0x0E)
+                * (or "off" if inverted) in ledctl_mode2.  The blink
+                * logic in hardware only works when mode is set to "on"
+                * so it must be changed accordingly when the mode is
+                * "off" and inverted.
                 */
                ledctl_blink = hw->mac.ledctl_mode2;
-               for (i = 0; i < 4; i++)
-                       if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) ==
-                           E1000_LEDCTL_MODE_LED_ON)
-                               ledctl_blink |= (E1000_LEDCTL_LED0_BLINK <<
-                                                (i * 8));
+               for (i = 0; i < 32; i += 8) {
+                       u32 mode = (hw->mac.ledctl_mode2 >> i) &
+                           E1000_LEDCTL_LED0_MODE_MASK;
+                       u32 led_default = hw->mac.ledctl_default >> i;
+
+                       if ((!(led_default & E1000_LEDCTL_LED0_IVRT) &&
+                            (mode == E1000_LEDCTL_MODE_LED_ON)) ||
+                           ((led_default & E1000_LEDCTL_LED0_IVRT) &&
+                            (mode == E1000_LEDCTL_MODE_LED_OFF))) {
+                               ledctl_blink &=
+                                   ~(E1000_LEDCTL_LED0_MODE_MASK << i);
+                               ledctl_blink |= (E1000_LEDCTL_LED0_BLINK |
+                                                E1000_LEDCTL_MODE_LED_ON) << i;
+                       }
+               }
        }
 
        E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl_blink);
index c550845..b2ca174 100644 (file)
@@ -147,7 +147,7 @@ bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw)
        /* If we can't read from the host interface for whatever
         * reason, disable filtering.
         */
-       ret_val = hw->mac.ops.mng_enable_host_if(hw);
+       ret_val = e1000_mng_enable_host_if_generic(hw);
        if (ret_val != E1000_SUCCESS) {
                hw->mac.tx_pkt_filtering = false;
                return hw->mac.tx_pkt_filtering;
@@ -308,18 +308,18 @@ s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, u8 *buffer,
        hdr.checksum = 0;
 
        /* Enable the host interface */
-       ret_val = hw->mac.ops.mng_enable_host_if(hw);
+       ret_val = e1000_mng_enable_host_if_generic(hw);
        if (ret_val)
                return ret_val;
 
        /* Populate the host interface with the contents of "buffer". */
-       ret_val = hw->mac.ops.mng_host_if_write(hw, buffer, length,
-                                               sizeof(hdr), &(hdr.checksum));
+       ret_val = e1000_mng_host_if_write_generic(hw, buffer, length,
+                                                 sizeof(hdr), &(hdr.checksum));
        if (ret_val)
                return ret_val;
 
        /* Write the manageability command header */
-       ret_val = hw->mac.ops.mng_write_cmd_header(hw, &hdr);
+       ret_val = e1000_mng_write_cmd_header_generic(hw, &hdr);
        if (ret_val)
                return ret_val;
 
index 5ada971..5c45431 100644 (file)
@@ -751,6 +751,7 @@ s32 e1000_init_mbx_params_pf(struct e1000_hw *hw)
        switch (hw->mac.type) {
        case e1000_82576:
        case e1000_i350:
+       case e1000_i354:
                mbx->timeout = 0;
                mbx->usec_delay = 0;
 
index 79146c4..37295e9 100644 (file)
@@ -775,6 +775,12 @@ s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
 
        DEBUGFUNC("e1000_read_pba_string_generic");
 
+       if ((hw->mac.type >= e1000_i210) &&
+           !e1000_get_flash_presence_i210(hw)) {
+               DEBUGOUT("Flashless no PBA string\n");
+               return -E1000_ERR_NVM_PBA_SECTION;
+       }
+
        if (pba_num == NULL) {
                DEBUGOUT("PBA string buffer was null\n");
                return -E1000_ERR_INVALID_ARGUMENT;
@@ -924,6 +930,41 @@ s32 e1000_read_pba_length_generic(struct e1000_hw *hw, u32 *pba_num_size)
        return E1000_SUCCESS;
 }
 
+/**
+ *  e1000_read_pba_num_generic - Read device part number
+ *  @hw: pointer to the HW structure
+ *  @pba_num: pointer to device part number
+ *
+ *  Reads the product board assembly (PBA) number from the EEPROM and stores
+ *  the value in pba_num.
+ **/
+s32 e1000_read_pba_num_generic(struct e1000_hw *hw, u32 *pba_num)
+{
+       s32 ret_val;
+       u16 nvm_data;
+
+       DEBUGFUNC("e1000_read_pba_num_generic");
+
+       ret_val = hw->nvm.ops.read(hw, NVM_PBA_OFFSET_0, 1, &nvm_data);
+       if (ret_val) {
+               DEBUGOUT("NVM Read Error\n");
+               return ret_val;
+       } else if (nvm_data == NVM_PBA_PTR_GUARD) {
+               DEBUGOUT("NVM Not Supported\n");
+               return -E1000_NOT_IMPLEMENTED;
+       }
+       *pba_num = (u32)(nvm_data << 16);
+
+       ret_val = hw->nvm.ops.read(hw, NVM_PBA_OFFSET_1, 1, &nvm_data);
+       if (ret_val) {
+               DEBUGOUT("NVM Read Error\n");
+               return ret_val;
+       }
+       *pba_num |= nvm_data;
+
+       return E1000_SUCCESS;
+}
+
 
 /**
  *  e1000_read_pba_raw
@@ -1235,12 +1276,15 @@ STATIC void e1000_reload_nvm_generic(struct e1000_hw *hw)
  **/
 void e1000_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers)
 {
-       u16 eeprom_verh, eeprom_verl, fw_version;
+       u16 eeprom_verh, eeprom_verl, etrack_test, fw_version;
+       u8 q, hval, rem, result;
        u16 comb_verh, comb_verl, comb_offset;
 
        memset(fw_vers, 0, sizeof(struct e1000_fw_version));
 
-       /* this code only applies to certain mac types */
+       /* basic eeprom version numbers, bits used vary by part and by tool
+        * used to create the nvm images */
+       /* Check which data format we have */
        switch (hw->mac.type) {
        case e1000_i211:
                e1000_read_invm_version(hw, fw_vers);
@@ -1248,26 +1292,28 @@ void e1000_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers)
        case e1000_82575:
        case e1000_82576:
        case e1000_82580:
-       case e1000_i350:
-       case e1000_i210:
+               hw->nvm.ops.read(hw, NVM_ETRACK_HIWORD, 1, &etrack_test);
+               /* Use this format, unless EETRACK ID exists,
+                * then use alternate format
+                */
+               if ((etrack_test &  NVM_MAJOR_MASK) != NVM_ETRACK_VALID) {
+                       hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version);
+                       fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK)
+                                             >> NVM_MAJOR_SHIFT;
+                       fw_vers->eep_minor = (fw_version & NVM_MINOR_MASK)
+                                             >> NVM_MINOR_SHIFT;
+                       fw_vers->eep_build = (fw_version & NVM_IMAGE_ID_MASK);
+                       goto etrack_id;
+               }
                break;
-       default:
-               return;
-       }
-
-       /* basic eeprom version numbers */
-       hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version);
-       fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT;
-       fw_vers->eep_minor = (fw_version & NVM_MINOR_MASK);
-
-       /* etrack id */
-       hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verl);
-       hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verh);
-       fw_vers->etrack_id = (eeprom_verh << NVM_ETRACK_SHIFT) | eeprom_verl;
-
-       switch (hw->mac.type) {
        case e1000_i210:
+               if (!(e1000_get_flash_presence_i210(hw))) {
+                       e1000_read_invm_version(hw, fw_vers);
+                       return;
+               }
+               /* fall through */
        case e1000_i350:
+               hw->nvm.ops.read(hw, NVM_ETRACK_HIWORD, 1, &etrack_test);
                /* find combo image version */
                hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset);
                if ((comb_offset != 0x0) &&
@@ -1294,9 +1340,36 @@ void e1000_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers)
                        }
                }
                break;
-
        default:
-               break;
+               hw->nvm.ops.read(hw, NVM_ETRACK_HIWORD, 1, &etrack_test);
+               return;
+       }
+       hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version);
+       fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK)
+                             >> NVM_MAJOR_SHIFT;
+
+       /* check for old style version format in newer images*/
+       if ((fw_version & NVM_NEW_DEC_MASK) == 0x0) {
+               eeprom_verl = (fw_version & NVM_COMB_VER_MASK);
+       } else {
+               eeprom_verl = (fw_version & NVM_MINOR_MASK)
+                               >> NVM_MINOR_SHIFT;
+       }
+       /* Convert minor value to hex before assigning to output struct
+        * Val to be converted will not be higher than 99, per tool output
+        */
+       q = eeprom_verl / NVM_HEX_CONV;
+       hval = q * NVM_HEX_TENS;
+       rem = eeprom_verl % NVM_HEX_CONV;
+       result = hval + rem;
+       fw_vers->eep_minor = result;
+
+etrack_id:
+       if ((etrack_test &  NVM_MAJOR_MASK) == NVM_ETRACK_VALID) {
+               hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verl);
+               hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verh);
+               fw_vers->etrack_id = (eeprom_verh << NVM_ETRACK_SHIFT)
+                       | eeprom_verl;
        }
        return;
 }
index e6948d8..10f0ae8 100644 (file)
@@ -43,6 +43,7 @@ struct e1000_fw_version {
        u32 etrack_id;
        u16 eep_major;
        u16 eep_minor;
+       u16 eep_build;
 
        u8 invm_major;
        u8 invm_minor;
@@ -64,6 +65,7 @@ s32  e1000_acquire_nvm_generic(struct e1000_hw *hw);
 
 s32  e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg);
 s32  e1000_read_mac_addr_generic(struct e1000_hw *hw);
+s32  e1000_read_pba_num_generic(struct e1000_hw *hw, u32 *pba_num);
 s32  e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
                                   u32 pba_num_size);
 s32  e1000_read_pba_length_generic(struct e1000_hw *hw, u32 *pba_num_size);
index cfea424..f1301f7 100644 (file)
@@ -48,6 +48,7 @@
 
 #define DELAY(x) rte_delay_us(x)
 #define usec_delay(x) DELAY(x)
+#define usec_delay_irq(x) DELAY(x)
 #define msec_delay(x) DELAY(1000*(x))
 #define msec_delay_irq(x) DELAY(1000*(x))
 
@@ -109,6 +110,19 @@ static inline uint32_t e1000_read_addr(volatile void* addr)
        return E1000_PCI_REG(addr);
 }
 
+/* Necessary defines */
+#define E1000_MRQC_ENABLE_MASK                  0x00000007
+#define E1000_MRQC_RSS_FIELD_IPV6_EX           0x00080000
+#define E1000_ALL_FULL_DUPLEX   ( \
+        ADVERTISE_10_FULL | ADVERTISE_100_FULL | ADVERTISE_1000_FULL)
+
+#define M88E1543_E_PHY_ID    0x01410EA0
+#define NAHUM6LP_HW 
+#define ULP_SUPPORT
+
+#define E1000_RCTL_DTYP_MASK   0x00000C00 /* Descriptor type mask */
+#define E1000_MRQC_RSS_FIELD_IPV6_EX            0x00080000
+
 /* Register READ/WRITE macros */
 
 #define E1000_READ_REG(hw, reg) \
index 0b77809..cc454d9 100644 (file)
@@ -33,6 +33,7 @@ POSSIBILITY OF SUCH DAMAGE.
 
 #include "e1000_api.h"
 
+static s32 e1000_wait_autoneg(struct e1000_hw *hw);
 STATIC s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
                                          u16 *data, bool read, bool page_set);
 STATIC u32 e1000_get_phy_addr_for_hv_page(u32 page);
@@ -313,7 +314,7 @@ s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data)
         * the lower time out
         */
        for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) {
-               usec_delay(50);
+               usec_delay_irq(50);
                mdic = E1000_READ_REG(hw, E1000_MDIC);
                if (mdic & E1000_MDIC_READY)
                        break;
@@ -326,13 +327,19 @@ s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data)
                DEBUGOUT("MDI Error\n");
                return -E1000_ERR_PHY;
        }
+       if (((mdic & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT) != offset) {
+               DEBUGOUT2("MDI Read offset error - requested %d, returned %d\n",
+                         offset,
+                         (mdic & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
+               return -E1000_ERR_PHY;
+       }
        *data = (u16) mdic;
 
        /* Allow some time after each MDIC transaction to avoid
         * reading duplicate data in the next MDIC transaction.
         */
        if (hw->mac.type == e1000_pch2lan)
-               usec_delay(100);
+               usec_delay_irq(100);
 
        return E1000_SUCCESS;
 }
@@ -373,7 +380,7 @@ s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data)
         * the lower time out
         */
        for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) {
-               usec_delay(50);
+               usec_delay_irq(50);
                mdic = E1000_READ_REG(hw, E1000_MDIC);
                if (mdic & E1000_MDIC_READY)
                        break;
@@ -386,12 +393,18 @@ s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data)
                DEBUGOUT("MDI Error\n");
                return -E1000_ERR_PHY;
        }
+       if (((mdic & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT) != offset) {
+               DEBUGOUT2("MDI Write offset error - requested %d, returned %d\n",
+                         offset,
+                         (mdic & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
+               return -E1000_ERR_PHY;
+       }
 
        /* Allow some time after each MDIC transaction to avoid
         * reading duplicate data in the next MDIC transaction.
         */
        if (hw->mac.type == e1000_pch2lan)
-               usec_delay(100);
+               usec_delay_irq(100);
 
        return E1000_SUCCESS;
 }
@@ -1244,12 +1257,6 @@ s32 e1000_copper_link_setup_m88(struct e1000_hw *hw)
                        return ret_val;
        }
 
-       if (phy->type == e1000_phy_i210) {
-               ret_val = e1000_set_master_slave_mode(hw);
-               if (ret_val)
-                       return ret_val;
-       }
-
        return E1000_SUCCESS;
 }
 
@@ -1313,6 +1320,20 @@ s32 e1000_copper_link_setup_m88_gen2(struct e1000_hw *hw)
                phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
 
        /* Enable downshift and setting it to X6 */
+       if (phy->id == M88E1543_E_PHY_ID) {
+               phy_data &= ~I347AT4_PSCR_DOWNSHIFT_ENABLE;
+               ret_val =
+                   phy->ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
+               if (ret_val)
+                       return ret_val;
+
+               ret_val = phy->ops.commit(hw);
+               if (ret_val) {
+                       DEBUGOUT("Error committing the PHY changes\n");
+                       return ret_val;
+               }
+       }
+
        phy_data &= ~I347AT4_PSCR_DOWNSHIFT_MASK;
        phy_data |= I347AT4_PSCR_DOWNSHIFT_6X;
        phy_data |= I347AT4_PSCR_DOWNSHIFT_ENABLE;
@@ -1328,6 +1349,10 @@ s32 e1000_copper_link_setup_m88_gen2(struct e1000_hw *hw)
                return ret_val;
        }
 
+       ret_val = e1000_set_master_slave_mode(hw);
+       if (ret_val)
+               return ret_val;
+
        return E1000_SUCCESS;
 }
 
@@ -1644,7 +1669,7 @@ s32 e1000_copper_link_autoneg(struct e1000_hw *hw)
         * check at a later time (for example, callback routine).
         */
        if (phy->autoneg_wait_to_complete) {
-               ret_val = hw->mac.ops.wait_autoneg(hw);
+               ret_val = e1000_wait_autoneg(hw);
                if (ret_val) {
                        DEBUGOUT("Error while waiting for autoneg to complete\n");
                        return ret_val;
@@ -1842,6 +1867,8 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw)
                        case I347AT4_E_PHY_ID:
                        case M88E1340M_E_PHY_ID:
                        case M88E1112_E_PHY_ID:
+                       case M88E1543_E_PHY_ID:
+                       case M88E1512_E_PHY_ID:
                        case I210_I_PHY_ID:
                                reset_dsp = false;
                                break;
@@ -1884,6 +1911,9 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw)
                return E1000_SUCCESS;
        if (hw->phy.id == I210_I_PHY_ID)
                return E1000_SUCCESS;
+       if ((hw->phy.id == M88E1543_E_PHY_ID) ||
+           (hw->phy.id == M88E1512_E_PHY_ID))
+               return E1000_SUCCESS;
        ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
        if (ret_val)
                return ret_val;
@@ -2022,11 +2052,10 @@ void e1000_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl)
        if (mac->forced_speed_duplex & E1000_ALL_100_SPEED) {
                ctrl |= E1000_CTRL_SPD_100;
                *phy_ctrl |= MII_CR_SPEED_100;
-               *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_10);
+               *phy_ctrl &= ~MII_CR_SPEED_1000;
                DEBUGOUT("Forcing 100mb\n");
        } else {
                ctrl &= ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100);
-               *phy_ctrl |= MII_CR_SPEED_10;
                *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_100);
                DEBUGOUT("Forcing 10mb\n");
        }
@@ -2278,18 +2307,18 @@ s32 e1000_check_polarity_ife(struct e1000_hw *hw)
 }
 
 /**
- *  e1000_wait_autoneg_generic - Wait for auto-neg completion
+ *  e1000_wait_autoneg - Wait for auto-neg completion
  *  @hw: pointer to the HW structure
  *
  *  Waits for auto-negotiation to complete or for the auto-negotiation time
  *  limit to expire, which ever happens first.
  **/
-s32 e1000_wait_autoneg_generic(struct e1000_hw *hw)
+static s32 e1000_wait_autoneg(struct e1000_hw *hw)
 {
        s32 ret_val = E1000_SUCCESS;
        u16 i, phy_status;
 
-       DEBUGFUNC("e1000_wait_autoneg_generic");
+       DEBUGFUNC("e1000_wait_autoneg");
 
        if (!hw->phy.ops.read_reg)
                return E1000_SUCCESS;
@@ -2406,7 +2435,8 @@ s32 e1000_get_cable_length_m88_gen2(struct e1000_hw *hw)
 {
        struct e1000_phy_info *phy = &hw->phy;
        s32 ret_val;
-       u16 phy_data, phy_data2, index, default_page, is_cm;
+       u16 phy_data, phy_data2, is_cm;
+       u16 index, default_page;
 
        DEBUGFUNC("e1000_get_cable_length_m88_gen2");
 
@@ -2432,6 +2462,8 @@ s32 e1000_get_cable_length_m88_gen2(struct e1000_hw *hw)
                phy->max_cable_length = phy_data / (is_cm ? 100 : 1);
                phy->cable_length = phy_data / (is_cm ? 100 : 1);
                break;
+       case M88E1543_E_PHY_ID:
+       case M88E1512_E_PHY_ID:
        case M88E1340M_E_PHY_ID:
        case I347AT4_E_PHY_ID:
                /* Remember the original page select and set it to 7 */
@@ -2966,6 +2998,8 @@ enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id)
        case M88E1000_E_PHY_ID:
        case M88E1111_I_PHY_ID:
        case M88E1011_I_PHY_ID:
+       case M88E1543_E_PHY_ID:
+       case M88E1512_E_PHY_ID:
        case I347AT4_E_PHY_ID:
        case M88E1112_E_PHY_ID:
        case M88E1340M_E_PHY_ID:
@@ -4009,7 +4043,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw)
                  I82577_DSTATUS_CABLE_LENGTH_SHIFT);
 
        if (length == E1000_CABLE_LENGTH_UNDEFINED)
-               ret_val = -E1000_ERR_PHY;
+               return -E1000_ERR_PHY;
 
        phy->cable_length = length;
 
@@ -4079,3 +4113,157 @@ release:
        return ret_val;
 }
 
+/**
+ *  e1000_read_phy_reg_mphy - Read mPHY control register
+ *  @hw: pointer to the HW structure
+ *  @address: address to be read
+ *  @data: pointer to the read data
+ *
+ *  Reads the mPHY control register in the PHY at offset and stores the
+ *  information read to data.
+ **/
+s32 e1000_read_phy_reg_mphy(struct e1000_hw *hw, u32 address, u32 *data)
+{
+       u32 mphy_ctrl = 0;
+       bool locked = false;
+       bool ready = false;
+
+       DEBUGFUNC("e1000_read_phy_reg_mphy");
+
+       /* Check if mPHY is ready to read/write operations */
+       ready = e1000_is_mphy_ready(hw);
+       if (!ready)
+               return -E1000_ERR_PHY;
+
+       /* Check if mPHY access is disabled and enable it if so */
+       mphy_ctrl = E1000_READ_REG(hw, E1000_MPHY_ADDR_CTRL);
+       if (mphy_ctrl & E1000_MPHY_DIS_ACCESS) {
+               locked = true;
+               ready = e1000_is_mphy_ready(hw);
+               if (!ready)
+                       return -E1000_ERR_PHY;
+               mphy_ctrl |= E1000_MPHY_ENA_ACCESS;
+               E1000_WRITE_REG(hw, E1000_MPHY_ADDR_CTRL, mphy_ctrl);
+       }
+
+       /* Set the address that we want to read */
+       ready = e1000_is_mphy_ready(hw);
+       if (!ready)
+               return -E1000_ERR_PHY;
+
+       /* We mask address, because we want to use only current lane */
+       mphy_ctrl = (mphy_ctrl & ~E1000_MPHY_ADDRESS_MASK &
+               ~E1000_MPHY_ADDRESS_FNC_OVERRIDE) |
+               (address & E1000_MPHY_ADDRESS_MASK);
+       E1000_WRITE_REG(hw, E1000_MPHY_ADDR_CTRL, mphy_ctrl);
+
+       /* Read data from the address */
+       ready = e1000_is_mphy_ready(hw);
+       if (!ready)
+               return -E1000_ERR_PHY;
+       *data = E1000_READ_REG(hw, E1000_MPHY_DATA);
+
+       /* Disable access to mPHY if it was originally disabled */
+       if (locked)
+               ready = e1000_is_mphy_ready(hw);
+               if (!ready)
+                       return -E1000_ERR_PHY;
+               E1000_WRITE_REG(hw, E1000_MPHY_ADDR_CTRL,
+                               E1000_MPHY_DIS_ACCESS);
+
+       return E1000_SUCCESS;
+}
+
+/**
+ *  e1000_write_phy_reg_mphy - Write mPHY control register
+ *  @hw: pointer to the HW structure
+ *  @address: address to write to
+ *  @data: data to write to register at offset
+ *  @line_override: used when we want to use different line than default one
+ *
+ *  Writes data to mPHY control register.
+ **/
+s32 e1000_write_phy_reg_mphy(struct e1000_hw *hw, u32 address, u32 data,
+                            bool line_override)
+{
+       u32 mphy_ctrl = 0;
+       bool locked = false;
+       bool ready = false;
+
+       DEBUGFUNC("e1000_write_phy_reg_mphy");
+
+       /* Check if mPHY is ready to read/write operations */
+       ready = e1000_is_mphy_ready(hw);
+       if (!ready)
+               return -E1000_ERR_PHY;
+
+       /* Check if mPHY access is disabled and enable it if so */
+       mphy_ctrl = E1000_READ_REG(hw, E1000_MPHY_ADDR_CTRL);
+       if (mphy_ctrl & E1000_MPHY_DIS_ACCESS) {
+               locked = true;
+               ready = e1000_is_mphy_ready(hw);
+               if (!ready)
+                       return -E1000_ERR_PHY;
+               mphy_ctrl |= E1000_MPHY_ENA_ACCESS;
+               E1000_WRITE_REG(hw, E1000_MPHY_ADDR_CTRL, mphy_ctrl);
+       }
+
+       /* Set the address that we want to read */
+       ready = e1000_is_mphy_ready(hw);
+       if (!ready)
+               return -E1000_ERR_PHY;
+
+       /* We mask address, because we want to use only current lane */
+       if (line_override)
+               mphy_ctrl |= E1000_MPHY_ADDRESS_FNC_OVERRIDE;
+       else
+               mphy_ctrl &= ~E1000_MPHY_ADDRESS_FNC_OVERRIDE;
+       mphy_ctrl = (mphy_ctrl & ~E1000_MPHY_ADDRESS_MASK) |
+               (address & E1000_MPHY_ADDRESS_MASK);
+       E1000_WRITE_REG(hw, E1000_MPHY_ADDR_CTRL, mphy_ctrl);
+
+       /* Read data from the address */
+       ready = e1000_is_mphy_ready(hw);
+       if (!ready)
+               return -E1000_ERR_PHY;
+       E1000_WRITE_REG(hw, E1000_MPHY_DATA, data);
+
+       /* Disable access to mPHY if it was originally disabled */
+       if (locked)
+               ready = e1000_is_mphy_ready(hw);
+               if (!ready)
+                       return -E1000_ERR_PHY;
+               E1000_WRITE_REG(hw, E1000_MPHY_ADDR_CTRL,
+                               E1000_MPHY_DIS_ACCESS);
+
+       return E1000_SUCCESS;
+}
+
+/**
+ *  e1000_is_mphy_ready - Check if mPHY control register is not busy
+ *  @hw: pointer to the HW structure
+ *
+ *  Returns mPHY control register status.
+ **/
+bool e1000_is_mphy_ready(struct e1000_hw *hw)
+{
+       u16 retry_count = 0;
+       u32 mphy_ctrl = 0;
+       bool ready = false;
+
+       while (retry_count < 2) {
+               mphy_ctrl = E1000_READ_REG(hw, E1000_MPHY_ADDR_CTRL);
+               if (mphy_ctrl & E1000_MPHY_BUSY) {
+                       usec_delay(20);
+                       retry_count++;
+                       continue;
+               }
+               ready = true;
+               break;
+       }
+
+       if (!ready)
+               DEBUGOUT("ERROR READING mPHY control register, phy is busy.\n");
+
+       return ready;
+}
index d577f96..8295dc0 100644 (file)
@@ -77,13 +77,11 @@ s32  e1000_read_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 *data);
 s32  e1000_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data);
 s32  e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active);
 s32  e1000_setup_copper_link_generic(struct e1000_hw *hw);
-s32  e1000_wait_autoneg_generic(struct e1000_hw *hw);
 s32  e1000_write_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 data);
 s32  e1000_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data);
 s32  e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data);
 s32  e1000_write_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 data);
 s32  e1000_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data);
-s32  e1000_phy_reset_dsp(struct e1000_hw *hw);
 s32  e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations,
                                u32 usec_interval, bool *success);
 s32  e1000_phy_init_script_igp3(struct e1000_hw *hw);
@@ -117,6 +115,10 @@ s32  e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw);
 s32  e1000_get_cable_length_82577(struct e1000_hw *hw);
 s32  e1000_write_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 data);
 s32  e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
+s32 e1000_read_phy_reg_mphy(struct e1000_hw *hw, u32 address, u32 *data);
+s32 e1000_write_phy_reg_mphy(struct e1000_hw *hw, u32 address, u32 data,
+                            bool line_override);
+bool e1000_is_mphy_ready(struct e1000_hw *hw);
 
 #define E1000_MAX_PHY_ADDR             8
 
@@ -126,7 +128,6 @@ s32  e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
 #define IGP01E1000_PHY_PORT_CTRL       0x12 /* Control */
 #define IGP01E1000_PHY_LINK_HEALTH     0x13 /* PHY Link Health */
 #define IGP01E1000_GMII_FIFO           0x14 /* GMII FIFO */
-#define IGP01E1000_PHY_CHANNEL_QUALITY 0x15 /* PHY Channel Quality */
 #define IGP02E1000_PHY_POWER_MGMT      0x19 /* Power Management */
 #define IGP01E1000_PHY_PAGE_SELECT     0x1F /* Page Select */
 #define BM_PHY_PAGE_SELECT             22   /* Page Select for BM */
@@ -146,7 +147,6 @@ s32  e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
 
 /* BM/HV Specific Registers */
 #define BM_PORT_CTRL_PAGE              769
-#define BM_PCIE_PAGE                   770
 #define BM_WUC_PAGE                    800
 #define BM_WUC_ADDRESS_OPCODE          0x11
 #define BM_WUC_DATA_OPCODE             0x12
@@ -187,7 +187,6 @@ s32  e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
 #define I82577_PHY_STATUS2_MDIX                        0x0800
 #define I82577_PHY_STATUS2_SPEED_MASK          0x0300
 #define I82577_PHY_STATUS2_SPEED_1000MBPS      0x0200
-#define I82577_PHY_STATUS2_SPEED_100MBPS       0x0100
 
 /* I82577 PHY Control 2 */
 #define I82577_PHY_CTRL2_MANUAL_MDIX           0x0200
@@ -205,13 +204,17 @@ s32  e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
 #define E1000_82580_PM_D3_LPLU         0x0004 /* For all other states */
 #define E1000_82580_PM_GO_LINKD                0x0020 /* Go Link Disconnect */
 
+#define E1000_MPHY_DIS_ACCESS          0x80000000 /* disable_access bit */
+#define E1000_MPHY_ENA_ACCESS          0x40000000 /* enable_access bit */
+#define E1000_MPHY_BUSY                        0x00010000 /* busy bit */
+#define E1000_MPHY_ADDRESS_FNC_OVERRIDE        0x20000000 /* fnc_override bit */
+#define E1000_MPHY_ADDRESS_MASK                0x0000FFFF /* address mask */
+
 /* BM PHY Copper Specific Control 1 */
 #define BM_CS_CTRL1                    16
-#define BM_CS_CTRL1_ENERGY_DETECT      0x0300 /* Enable Energy Detect */
 
 /* BM PHY Copper Specific Status */
 #define BM_CS_STATUS                   17
-#define BM_CS_STATUS_ENERGY_DETECT     0x0010 /* Energy Detect Status */
 #define BM_CS_STATUS_LINK_UP           0x0400
 #define BM_CS_STATUS_RESOLVED          0x0800
 #define BM_CS_STATUS_SPEED_MASK                0xC000
@@ -257,9 +260,6 @@ s32  e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
 #define IGP02E1000_AGC_LENGTH_MASK     0x7F
 #define IGP02E1000_AGC_RANGE           15
 
-#define IGP03E1000_PHY_MISC_CTRL       0x1B
-#define IGP03E1000_PHY_MISC_DUPLEX_MANUAL_SET  0x1000 /* Manually Set Duplex */
-
 #define E1000_CABLE_LENGTH_UNDEFINED   0xFF
 
 #define E1000_KMRNCTRLSTA_OFFSET       0x001F0000
@@ -273,13 +273,11 @@ s32  e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
 #define E1000_KMRNCTRLSTA_DIAG_NELPBK  0x1000 /* Nearend Loopback mode */
 #define E1000_KMRNCTRLSTA_K1_CONFIG    0x7
 #define E1000_KMRNCTRLSTA_K1_ENABLE    0x0002 /* enable K1 */
-#define E1000_KMRNCTRLSTA_UNBLOCK_RX   0x0004 /* unblock Kumeran Rx in K0/K1 */
-#define E1000_KMRNCTRLSTA_PLL_STOP_EN  0x0008 /* enable PLL stop in K1 mode */
-
 #define E1000_KMRNCTRLSTA_HD_CTRL      0x10   /* Kumeran HD Control */
-#define E1000_KMRNCTRLSTA_K0_CTRL      0x1E   /* Kumeran K0s Control */
-#define E1000_KMRNCTRLSTA_K0_GBE_EN    0x1000 /* ena K0s mode for 1G link */
-#define E1000_KMRNCTRLSTA_K0_100_EN    0x2000 /* ena K0s mode for 10/100 lnk */
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_IN_D0_SUPPORT))
+#define E1000_KMRNCTRLSTA_OP_MODES     0x1F   /* Kumeran Modes of Operation */
+#define E1000_KMRNCTRLSTA_OP_MODES_LSC2CSC     0x0002 /* change LSC to CSC */
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_IN_D0_SUPPORT) */
 
 #define IFE_PHY_EXTENDED_STATUS_CONTROL        0x10
 #define IFE_PHY_SPECIAL_CONTROL                0x11 /* 100BaseTx PHY Special Ctrl */
@@ -292,7 +290,6 @@ s32  e1000_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
 /* IFE PHY Special Control */
 #define IFE_PSC_AUTO_POLARITY_DISABLE  0x0010
 #define IFE_PSC_FORCE_POLARITY         0x0020
-#define IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN     0x0100
 
 /* IFE PHY Special Control and LED Control */
 #define IFE_PSCL_PROBE_MODE            0x0020
index 42a558e..81b34e9 100644 (file)
@@ -49,16 +49,23 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_BARCTRL                  0x5BBC /* BAR ctrl reg */
 #define E1000_BARCTRL_FLSIZE           0x0700 /* BAR ctrl Flsize */
 #define E1000_BARCTRL_CSRSIZE          0x2000 /* BAR ctrl CSR size */
+#define E1000_MPHY_ADDR_CTRL   0x0024 /* GbE MPHY Address Control */
+#define E1000_MPHY_DATA                0x0E10 /* GBE MPHY Data */
+#define E1000_MPHY_STAT                0x0E0C /* GBE MPHY Statistics */
+#define E1000_PPHY_CTRL                0x5b48 /* PCIe PHY Control */
 #define E1000_I350_BARCTRL             0x5BFC /* BAR ctrl reg */
 #define E1000_I350_DTXMXPKTSZ          0x355C /* Maximum sent packet size reg*/
 #define E1000_SCTL     0x00024  /* SerDes Control - RW */
 #define E1000_FCAL     0x00028  /* Flow Control Address Low - RW */
 #define E1000_FCAH     0x0002C  /* Flow Control Address High -RW */
+#if !defined(EXTERNAL_RELEASE) || (defined(NAHUM6LP_HW) && defined(ULP_SUPPORT))
 #define E1000_FEXT     0x0002C  /* Future Extended - RW */
+#endif /* !EXTERNAL_RELEASE || (NAHUM6LP_HW && ULP_SUPPORT) */
 #define E1000_FEXTNVM  0x00028  /* Future Extended NVM - RW */
-#define E1000_FEXTNVM2 0x00030  /* Future Extended NVM 2 - RW */
 #define E1000_FEXTNVM3 0x0003C  /* Future Extended NVM 3 - RW */
 #define E1000_FEXTNVM4 0x00024  /* Future Extended NVM 4 - RW */
+#define E1000_FEXTNVM6 0x00010  /* Future Extended NVM 6 - RW */
+#define E1000_FEXTNVM7 0x000E4  /* Future Extended NVM 7 - RW */
 #define E1000_FCT      0x00030  /* Flow Control Type - RW */
 #define E1000_CONNSW   0x00034  /* Copper/Fiber switch control - RW */
 #define E1000_VET      0x00038  /* VLAN Ether Type - RW */
@@ -93,12 +100,14 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_TBT      0x00448  /* Tx Burst Timer - RW */
 #define E1000_AIT      0x00458  /* Adaptive Interframe Spacing Throttle - RW */
 #define E1000_LEDCTL   0x00E00  /* LED Control - RW */
+#define E1000_LEDMUX   0x08130  /* LED MUX Control */
 #define E1000_EXTCNF_CTRL      0x00F00  /* Extended Configuration Control */
 #define E1000_EXTCNF_SIZE      0x00F08  /* Extended Configuration Size */
 #define E1000_PHY_CTRL 0x00F10  /* PHY Control Register in CSR */
 #define E1000_POEMB    E1000_PHY_CTRL /* PHY OEM Bits */
 #define E1000_PBA      0x01000  /* Packet Buffer Allocation - RW */
 #define E1000_PBS      0x01008  /* Packet Buffer Size */
+#define E1000_PBECCSTS 0x0100C  /* Packet Buffer ECC Status - RW */
 #define E1000_EEMNGCTL 0x01010  /* MNG EEprom Control */
 #define E1000_EEARBC   0x01024  /* EEPROM Auto Read Bus Control */
 #define E1000_FLASHT   0x01028  /* FLASH Timer Register */
@@ -131,7 +140,11 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_FCRTL    0x02160  /* Flow Control Receive Threshold Low - RW */
 #define E1000_FCRTH    0x02168  /* Flow Control Receive Threshold High - RW */
 #define E1000_PSRCTL   0x02170  /* Packet Split Receive Control - RW */
-#define E1000_RDFPCQ(_n)       (0x02430 + (0x4 * (_n)))
+#define E1000_RDFH     0x02410  /* Rx Data FIFO Head - RW */
+#define E1000_RDFT     0x02418  /* Rx Data FIFO Tail - RW */
+#define E1000_RDFHS    0x02420  /* Rx Data FIFO Head Saved - RW */
+#define E1000_RDFTS    0x02428  /* Rx Data FIFO Tail Saved - RW */
+#define E1000_RDFPC    0x02430  /* Rx Data FIFO Packet Count - RW */
 #define E1000_PBRTH    0x02458  /* PB Rx Arbitration Threshold - RW */
 #define E1000_FCRTV    0x02460  /* Flow Control Refresh Timer Value - RW */
 /* Split and Replication Rx Control - RW */
@@ -146,6 +159,8 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_PBRWAC   0x024E8 /* Rx packet buffer wrap around counter - RO */
 #define E1000_RDTR     0x02820  /* Rx Delay Timer - RW */
 #define E1000_RADV     0x0282C  /* Rx Interrupt Absolute Delay Timer - RW */
+#define E1000_EMIADD   0x10     /* Extended Memory Indirect Address */
+#define E1000_EMIDATA  0x11     /* Extended Memory Indirect Data */
 #define E1000_SRWR             0x12018  /* Shadow Ram Write Register - RW */
 #define E1000_I210_FLMNGCTL    0x12038
 #define E1000_I210_FLMNGDATA   0x1203C
@@ -202,6 +217,9 @@ POSSIBILITY OF SUCH DAMAGE.
 /* Queues packet buffer size masks where _n can be 0-3 and _s 0-63 [kB] */
 #define E1000_I210_TXPBS_SIZE(_n, _s)  ((_s) << (6 * _n))
 
+#define E1000_MMDAC                    13 /* MMD Access Control */
+#define E1000_MMDAAD                   14 /* MMD Access Address/Data */
+
 /* Convenience macros
  *
  * Note: "_n" is the queue number of the register to be written to.
@@ -454,7 +472,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_PCS_LPAB 0x0421C  /* Link Partner Ability - RW */
 #define E1000_PCS_NPTX 0x04220  /* AN Next Page Transmit - RW */
 #define E1000_PCS_LPABNP       0x04224 /* Link Partner Ability Next Pg - RW */
-#define E1000_1GSTAT_RCV       0x04228 /* 1GSTAT Code Violation Pkt Cnt - RW */
 #define E1000_RXCSUM   0x05000  /* Rx Checksum Control - RW */
 #define E1000_RLPML    0x05004  /* Rx Long Packet Max Length */
 #define E1000_RFCTL    0x05008  /* Receive Filter Control*/
@@ -479,8 +496,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_PBACL    0x05B68  /* MSIx PBA Clear - Read/Write 1's to clear */
 #define E1000_FFLT     0x05F00  /* Flexible Filter Length Table - RW Array */
 #define E1000_HOST_IF  0x08800  /* Host Interface */
-#define E1000_FFMT     0x09000  /* Flexible Filter Mask Table - RW Array */
-#define E1000_FFVT     0x09800  /* Flexible Filter Value Table - RW Array */
 #define E1000_HIBBA    0x8F40   /* Host Interface Buffer Base Address */
 /* Flexible Host Filter Table */
 #define E1000_FHFT(_n) (0x09000 + ((_n) * 0x100))
@@ -489,7 +504,6 @@ POSSIBILITY OF SUCH DAMAGE.
 
 
 #define E1000_KMRNCTRLSTA      0x00034 /* MAC-PHY interface - RW */
-#define E1000_MDPHYA           0x0003C /* PHY address - RW */
 #define E1000_MANC2H           0x05860 /* Management Control To Host - RW */
 /* Management Decision Filters */
 #define E1000_MDEF(_n)         (0x05890 + (4 * (_n)))
@@ -522,15 +536,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #define E1000_IMIREXT(_i)      (0x05AA0 + ((_i) * 4)) /* Immediate INTR Ext*/
 #define E1000_IMIRVP           0x05AC0 /* Immediate INT Rx VLAN Priority -RW */
 #define E1000_MSIXBM(_i)       (0x01600 + ((_i) * 4)) /* MSI-X Alloc Reg -RW */
-/* MSI-X Table entry addr low reg - RW */
-#define E1000_MSIXTADD(_i)     (0x0C000 + ((_i) * 0x10))
-/* MSI-X Table entry addr upper reg - RW */
-#define E1000_MSIXTUADD(_i)    (0x0C004 + ((_i) * 0x10))
-/* MSI-X Table entry message reg - RW */
-#define E1000_MSIXTMSG(_i)     (0x0C008 + ((_i) * 0x10))
-/* MSI-X Table entry vector ctrl reg - RW */
-#define E1000_MSIXVCTRL(_i)    (0x0C00C + ((_i) * 0x10))
-#define E1000_MSIXPBA  0x0E000 /* MSI-X Pending bit array */
 #define E1000_RETA(_i) (0x05C00 + ((_i) * 4)) /* Redirection Table - RW */
 #define E1000_RSSRK(_i)        (0x05C80 + ((_i) * 4)) /* RSS Random Key - RW */
 #define E1000_RSSIM    0x05864 /* RSS Interrupt Mask */
index e8669a5..56cf7b3 100644 (file)
@@ -50,6 +50,8 @@ struct e1000_hw;
 #define E1000_RXDCTL_QUEUE_ENABLE      0x02000000 /* Ena specific Rx Queue */
 
 /* SRRCTL bit definitions */
+#define E1000_SRRCTL(_n)       ((_n) < 4 ? (0x0280C + ((_n) * 0x100)) : \
+                                (0x0C00C + ((_n) * 0x40)))
 #define E1000_SRRCTL_BSIZEPKT_SHIFT            10 /* Shift _right_ */
 #define E1000_SRRCTL_BSIZEHDRSIZE_MASK         0x00000F00
 #define E1000_SRRCTL_BSIZEHDRSIZE_SHIFT                2  /* Shift _left_ */