Commit 373a88d7 authored by Bruce Allan's avatar Bruce Allan Committed by David S. Miller

e1000e: fix acquisition of SW/FW/HW semaphore for ICHx parts

For ICHx parts, write the EXTCNF_CTRL.SWFLAG bit once when trying to
acquire the SW/FW/HW semaphore instead of multiple times to prevent the
hardware from having problems (especially for systems with manageability
enabled), and extend the timeout for the hardware to set the SWFLAG bit.
Signed-off-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6e455b89
...@@ -594,8 +594,8 @@ static DEFINE_MUTEX(nvm_mutex); ...@@ -594,8 +594,8 @@ static DEFINE_MUTEX(nvm_mutex);
**/ **/
static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw)
{ {
u32 extcnf_ctrl; u32 extcnf_ctrl, timeout = PHY_CFG_TIMEOUT;
u32 timeout = PHY_CFG_TIMEOUT; s32 ret_val = 0;
might_sleep(); might_sleep();
...@@ -603,28 +603,46 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) ...@@ -603,28 +603,46 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw)
while (timeout) { while (timeout) {
extcnf_ctrl = er32(EXTCNF_CTRL); extcnf_ctrl = er32(EXTCNF_CTRL);
if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG))
break;
mdelay(1);
timeout--;
}
if (!timeout) {
hw_dbg(hw, "SW/FW/HW has locked the resource for too long.\n");
ret_val = -E1000_ERR_CONFIG;
goto out;
}
timeout = PHY_CFG_TIMEOUT * 2;
if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)) {
extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
ew32(EXTCNF_CTRL, extcnf_ctrl); ew32(EXTCNF_CTRL, extcnf_ctrl);
while (timeout) {
extcnf_ctrl = er32(EXTCNF_CTRL); extcnf_ctrl = er32(EXTCNF_CTRL);
if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
break; break;
}
mdelay(1); mdelay(1);
timeout--; timeout--;
} }
if (!timeout) { if (!timeout) {
hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); hw_dbg(hw, "Failed to acquire the semaphore.\n");
extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
ew32(EXTCNF_CTRL, extcnf_ctrl); ew32(EXTCNF_CTRL, extcnf_ctrl);
mutex_unlock(&nvm_mutex); ret_val = -E1000_ERR_CONFIG;
return -E1000_ERR_CONFIG; goto out;
} }
return 0; out:
if (ret_val)
mutex_unlock(&nvm_mutex);
return ret_val;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment