aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAkeem G. Abodunrin <akeem.g.abodunrin@intel.com>2012-11-02 23:08:41 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2012-12-01 05:49:17 -0500
commit23e0f1488f193d53d282404c1ab50112cb237341 (patch)
tree3fcb0162b69ead4ad4e470136f641ea09708facc /drivers/net
parent1720ee3e4054eff175743820ceba16ecfe97943a (diff)
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>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_nvm.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_nvm.c b/drivers/net/ethernet/intel/igb/e1000_nvm.c
index 7db3f80bcd57..fbb7604db364 100644
--- a/drivers/net/ethernet/intel/igb/e1000_nvm.c
+++ b/drivers/net/ethernet/intel/igb/e1000_nvm.c
@@ -438,7 +438,7 @@ out:
438s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 438s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
439{ 439{
440 struct e1000_nvm_info *nvm = &hw->nvm; 440 struct e1000_nvm_info *nvm = &hw->nvm;
441 s32 ret_val; 441 s32 ret_val = -E1000_ERR_NVM;
442 u16 widx = 0; 442 u16 widx = 0;
443 443
444 /* 444 /*
@@ -448,22 +448,21 @@ s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
448 if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || 448 if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
449 (words == 0)) { 449 (words == 0)) {
450 hw_dbg("nvm parameter(s) out of bounds\n"); 450 hw_dbg("nvm parameter(s) out of bounds\n");
451 ret_val = -E1000_ERR_NVM; 451 return ret_val;
452 goto out;
453 } 452 }
454 453
455 ret_val = hw->nvm.ops.acquire(hw);
456 if (ret_val)
457 goto out;
458
459 msleep(10);
460
461 while (widx < words) { 454 while (widx < words) {
462 u8 write_opcode = NVM_WRITE_OPCODE_SPI; 455 u8 write_opcode = NVM_WRITE_OPCODE_SPI;
463 456
464 ret_val = igb_ready_nvm_eeprom(hw); 457 ret_val = nvm->ops.acquire(hw);
465 if (ret_val) 458 if (ret_val)
466 goto release; 459 return ret_val;
460
461 ret_val = igb_ready_nvm_eeprom(hw);
462 if (ret_val) {
463 nvm->ops.release(hw);
464 return ret_val;
465 }
467 466
468 igb_standby_nvm(hw); 467 igb_standby_nvm(hw);
469 468
@@ -497,13 +496,10 @@ s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
497 break; 496 break;
498 } 497 }
499 } 498 }
499 usleep_range(1000, 2000);
500 nvm->ops.release(hw);
500 } 501 }
501 502
502 msleep(10);
503release:
504 hw->nvm.ops.release(hw);
505
506out:
507 return ret_val; 503 return ret_val;
508} 504}
509 505