**/
 void i40e_release_nvm(struct i40e_hw *hw)
 {
+       enum i40e_status_code ret_code = I40E_SUCCESS;
+       u32 total_delay = 0;
+
        DEBUGFUNC("i40e_release_nvm");
 
-       if (!hw->nvm.blank_nvm_mode)
-               i40e_aq_release_resource(hw, I40E_NVM_RESOURCE_ID, 0, NULL);
+       if (hw->nvm.blank_nvm_mode)
+               return;
+
+       ret_code = i40e_aq_release_resource(hw, I40E_NVM_RESOURCE_ID, 0, NULL);
+
+       /* there are some rare cases when trying to release the resource
+        * results in an admin Q timeout, so handle them correctly
+        */
+       while ((ret_code == I40E_ERR_ADMIN_QUEUE_TIMEOUT) &&
+              (total_delay < hw->aq.asq_cmd_timeout)) {
+                       i40e_msec_delay(1);
+                       ret_code = i40e_aq_release_resource(hw,
+                                               I40E_NVM_RESOURCE_ID, 0, NULL);
+                       total_delay++;
+       }
 }
 
 /**
                /* Read SR page */
                if ((i % I40E_SR_SECTOR_SIZE_IN_WORDS) == 0) {
                        u16 words = I40E_SR_SECTOR_SIZE_IN_WORDS;
+
                        ret_code = i40e_read_nvm_buffer(hw, i, &words, data);
                        if (ret_code != I40E_SUCCESS) {
                                ret_code = I40E_ERR_NVM_CHECKSUM;
 {
        enum i40e_status_code ret_code = I40E_SUCCESS;
        u16 checksum;
+       __le16 le_sum;
 
        DEBUGFUNC("i40e_update_nvm_checksum");
 
        ret_code = i40e_calc_nvm_checksum(hw, &checksum);
+       le_sum = CPU_TO_LE16(checksum);
        if (ret_code == I40E_SUCCESS)
                ret_code = i40e_write_nvm_aq(hw, 0x00, I40E_SR_SW_CHECKSUM_WORD,
-                                            1, &checksum, true);
+                                            1, &le_sum, true);
 
        return ret_code;
 }