diff options
Diffstat (limited to 'drivers/net/e1000e/ich8lan.c')
| -rw-r--r-- | drivers/net/e1000e/ich8lan.c | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 5059c22155d..b8c4dce01a0 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c @@ -83,6 +83,8 @@  #define E1000_ICH_FWSM_RSPCIPHY	0x00000040 /* Reset PHY on PCI Reset */ +/* FW established a valid mode */ +#define E1000_ICH_FWSM_FW_VALID		0x00008000  #define E1000_ICH_MNG_IAMT_MODE		0x2 @@ -259,6 +261,7 @@ static inline void __ew32flash(struct e1000_hw *hw, unsigned long reg, u32 val)  static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)  {  	struct e1000_phy_info *phy = &hw->phy; +	u32 ctrl;  	s32 ret_val = 0;  	phy->addr                     = 1; @@ -274,6 +277,33 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)  	phy->ops.power_down           = e1000_power_down_phy_copper_ich8lan;  	phy->autoneg_mask             = AUTONEG_ADVERTISE_SPEED_DEFAULT; +	if (!(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) { +		/* +		 * The MAC-PHY interconnect may still be in SMBus mode +		 * after Sx->S0.  Toggle the LANPHYPC Value bit to force +		 * the interconnect to PCIe mode, but only if there is no +		 * firmware present otherwise firmware will have done it. +		 */ +		ctrl = er32(CTRL); +		ctrl |=  E1000_CTRL_LANPHYPC_OVERRIDE; +		ctrl &= ~E1000_CTRL_LANPHYPC_VALUE; +		ew32(CTRL, ctrl); +		udelay(10); +		ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE; +		ew32(CTRL, ctrl); +		msleep(50); +	} + +	/* +	 * Reset the PHY before any acccess 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 = e1000e_phy_hw_reset_generic(hw); +	if (ret_val) +		goto out; +  	phy->id = e1000_phy_unknown;  	ret_val = e1000e_get_phy_id(hw);  	if (ret_val)  |