Due to changes in FW the SW is required to perform double SR dump in
some cases.
Implementation adds two new steps to update nvm checksum function:
- recalculate checksum and check if checksum in NVM is correct
- if checksum in NVM is not correct then update it again

Signed-off-by: Maciej Paczkowski <maciej.paczkow...@intel.com>
Reviewed-by: Paul M Stillwell Jr <paul.m.stillwell...@intel.com>
Reviewed-by: Galazka Krzysztof <krzysztof.gala...@intel.com>
Reviewed-by: Azarewicz Piotr <piotr.azarew...@intel.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktio...@intel.com>
Reviewed-by: Kirsher Jeffrey T <jeffrey.t.kirs...@intel.com>
Signed-off-by: Xiaolong Ye <xiaolong...@intel.com>
---
 drivers/net/i40e/base/i40e_nvm.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/drivers/net/i40e/base/i40e_nvm.c b/drivers/net/i40e/base/i40e_nvm.c
index c8b401cdd..8c94b6072 100644
--- a/drivers/net/i40e/base/i40e_nvm.c
+++ b/drivers/net/i40e/base/i40e_nvm.c
@@ -676,16 +676,38 @@ enum i40e_status_code i40e_calc_nvm_checksum(struct 
i40e_hw *hw, u16 *checksum)
 enum i40e_status_code i40e_update_nvm_checksum(struct i40e_hw *hw)
 {
        enum i40e_status_code ret_code = I40E_SUCCESS;
-       u16 checksum;
+       u16 checksum, checksum_sr;
        __le16 le_sum;
 
        DEBUGFUNC("i40e_update_nvm_checksum");
 
        ret_code = i40e_calc_nvm_checksum(hw, &checksum);
+       if (ret_code)
+               return ret_code;
+
        le_sum = CPU_TO_LE16(checksum);
-       if (ret_code == I40E_SUCCESS)
-               ret_code = i40e_write_nvm_aq(hw, 0x00, I40E_SR_SW_CHECKSUM_WORD,
+       ret_code = i40e_write_nvm_aq(hw, 0x00, I40E_SR_SW_CHECKSUM_WORD,
+                                    1, &le_sum, true);
+       if (ret_code)
+               return ret_code;
+
+       /* Due to changes in FW the SW is required to perform double SR-dump
+        * in some cases. SR-dump is the process when internal shadow RAM is
+        * dumped into flash bank. It is triggered by setting "last_command"
+        * argument in i40e_write_nvm_aq function call.
+        * Since FW 1.8 we need to calculate SR checksum again and update it
+        * in flash if it is not equal to previously computed checksum.
+        * This situation would occur only in FW >= 1.8
+        */
+       ret_code = i40e_calc_nvm_checksum(hw, &checksum_sr);
+       if (ret_code)
+               return ret_code;
+       if (checksum_sr != checksum) {
+               le_sum = CPU_TO_LE16(checksum_sr);
+               ret_code = i40e_write_nvm_aq(hw, 0x00,
+                                            I40E_SR_SW_CHECKSUM_WORD,
                                             1, &le_sum, true);
+       }
 
        return ret_code;
 }
-- 
2.17.1

Reply via email to