Merge branch 'parisc-4.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[cascardo/linux.git] / drivers / net / ethernet / intel / e1000e / ich8lan.c
index a049e30..c0f4887 100644 (file)
@@ -1252,9 +1252,9 @@ static s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force)
                        ew32(H2ME, mac_reg);
                }
 
-               /* Poll up to 100msec for ME to clear ULP_CFG_DONE */
+               /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */
                while (er32(FWSM) & E1000_FWSM_ULP_CFG_DONE) {
-                       if (i++ == 10) {
+                       if (i++ == 30) {
                                ret_val = -E1000_ERR_PHY;
                                goto out;
                        }
@@ -1328,6 +1328,8 @@ static s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force)
                     I218_ULP_CONFIG1_RESET_TO_SMBUS |
                     I218_ULP_CONFIG1_WOL_HOST |
                     I218_ULP_CONFIG1_INBAND_EXIT |
+                    I218_ULP_CONFIG1_EN_ULP_LANPHYPC |
+                    I218_ULP_CONFIG1_DIS_CLR_STICKY_ON_PERST |
                     I218_ULP_CONFIG1_DISABLE_SMB_PERST);
        e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
 
@@ -1433,6 +1435,18 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
                        emi_addr = I217_RX_CONFIG;
                ret_val = e1000_write_emi_reg_locked(hw, emi_addr, emi_val);
 
+               if (hw->mac.type == e1000_pch_lpt ||
+                   hw->mac.type == e1000_pch_spt) {
+                       u16 phy_reg;
+
+                       e1e_rphy_locked(hw, I217_PLL_CLOCK_GATE_REG, &phy_reg);
+                       phy_reg &= ~I217_PLL_CLOCK_GATE_MASK;
+                       if (speed == SPEED_100 || speed == SPEED_10)
+                               phy_reg |= 0x3E8;
+                       else
+                               phy_reg |= 0xFA;
+                       e1e_wphy_locked(hw, I217_PLL_CLOCK_GATE_REG, phy_reg);
+               }
                hw->phy.ops.release(hw);
 
                if (ret_val)
@@ -1467,6 +1481,18 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
                                hw->phy.ops.release(hw);
                                if (ret_val)
                                        return ret_val;
+                       } else {
+                               ret_val = hw->phy.ops.acquire(hw);
+                               if (ret_val)
+                                       return ret_val;
+
+                               ret_val = e1e_wphy_locked(hw,
+                                                         PHY_REG(776, 20),
+                                                         0xC023);
+                               hw->phy.ops.release(hw);
+                               if (ret_val)
+                                       return ret_val;
+
                        }
                }
        }