mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
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: Bruce Allan <bruce.w.allan@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6e455b897b
commit
373a88d78b
1 changed files with 34 additions and 16 deletions
|
@ -594,8 +594,8 @@ static DEFINE_MUTEX(nvm_mutex);
|
|||
**/
|
||||
static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw)
|
||||
{
|
||||
u32 extcnf_ctrl;
|
||||
u32 timeout = PHY_CFG_TIMEOUT;
|
||||
u32 extcnf_ctrl, timeout = PHY_CFG_TIMEOUT;
|
||||
s32 ret_val = 0;
|
||||
|
||||
might_sleep();
|
||||
|
||||
|
@ -603,28 +603,46 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw)
|
|||
|
||||
while (timeout) {
|
||||
extcnf_ctrl = er32(EXTCNF_CTRL);
|
||||
if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG))
|
||||
break;
|
||||
|
||||
if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)) {
|
||||
extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
|
||||
ew32(EXTCNF_CTRL, extcnf_ctrl);
|
||||
|
||||
extcnf_ctrl = er32(EXTCNF_CTRL);
|
||||
if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
|
||||
break;
|
||||
}
|
||||
mdelay(1);
|
||||
timeout--;
|
||||
}
|
||||
|
||||
if (!timeout) {
|
||||
hw_dbg(hw, "FW or HW has locked the resource for too long.\n");
|
||||
extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
|
||||
ew32(EXTCNF_CTRL, extcnf_ctrl);
|
||||
mutex_unlock(&nvm_mutex);
|
||||
return -E1000_ERR_CONFIG;
|
||||
hw_dbg(hw, "SW/FW/HW has locked the resource for too long.\n");
|
||||
ret_val = -E1000_ERR_CONFIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return 0;
|
||||
timeout = PHY_CFG_TIMEOUT * 2;
|
||||
|
||||
extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
|
||||
ew32(EXTCNF_CTRL, extcnf_ctrl);
|
||||
|
||||
while (timeout) {
|
||||
extcnf_ctrl = er32(EXTCNF_CTRL);
|
||||
if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
|
||||
break;
|
||||
|
||||
mdelay(1);
|
||||
timeout--;
|
||||
}
|
||||
|
||||
if (!timeout) {
|
||||
hw_dbg(hw, "Failed to acquire the semaphore.\n");
|
||||
extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
|
||||
ew32(EXTCNF_CTRL, extcnf_ctrl);
|
||||
ret_val = -E1000_ERR_CONFIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
if (ret_val)
|
||||
mutex_unlock(&nvm_mutex);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue