igb: Acquire, release semaphore for writing each EEPROM page
This patch allows software acquires and releases NVM resource for writing each EEPROM page, instead of holding semaphore for the whole data block which is too long and could trigger write fails on unpredictable addresses. Signed-off-by: Akeem G Abodunrin <akeem.g.abodunrin@intel.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
1720ee3e40
commit
23e0f1488f
|
@ -438,7 +438,7 @@ out:
|
||||||
s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
|
s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
|
||||||
{
|
{
|
||||||
struct e1000_nvm_info *nvm = &hw->nvm;
|
struct e1000_nvm_info *nvm = &hw->nvm;
|
||||||
s32 ret_val;
|
s32 ret_val = -E1000_ERR_NVM;
|
||||||
u16 widx = 0;
|
u16 widx = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -448,22 +448,21 @@ s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
|
||||||
if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
|
if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
|
||||||
(words == 0)) {
|
(words == 0)) {
|
||||||
hw_dbg("nvm parameter(s) out of bounds\n");
|
hw_dbg("nvm parameter(s) out of bounds\n");
|
||||||
ret_val = -E1000_ERR_NVM;
|
return ret_val;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret_val = hw->nvm.ops.acquire(hw);
|
|
||||||
if (ret_val)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
msleep(10);
|
|
||||||
|
|
||||||
while (widx < words) {
|
while (widx < words) {
|
||||||
u8 write_opcode = NVM_WRITE_OPCODE_SPI;
|
u8 write_opcode = NVM_WRITE_OPCODE_SPI;
|
||||||
|
|
||||||
ret_val = igb_ready_nvm_eeprom(hw);
|
ret_val = nvm->ops.acquire(hw);
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
goto release;
|
return ret_val;
|
||||||
|
|
||||||
|
ret_val = igb_ready_nvm_eeprom(hw);
|
||||||
|
if (ret_val) {
|
||||||
|
nvm->ops.release(hw);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
igb_standby_nvm(hw);
|
igb_standby_nvm(hw);
|
||||||
|
|
||||||
|
@ -497,13 +496,10 @@ s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
usleep_range(1000, 2000);
|
||||||
|
nvm->ops.release(hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
msleep(10);
|
|
||||||
release:
|
|
||||||
hw->nvm.ops.release(hw);
|
|
||||||
|
|
||||||
out:
|
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue