fm10k: move to drivers/net/
[dpdk.git] / lib / librte_pmd_i40e / i40e / i40e_nvm.c
index c63f5ba..f1a1e88 100644 (file)
@@ -82,7 +82,7 @@ enum i40e_status_code i40e_init_nvm(struct i40e_hw *hw)
        } else { /* Blank programming mode */
                nvm->blank_nvm_mode = true;
                ret_code = I40E_ERR_NVM_BLANK_MODE;
-               DEBUGOUT("NVM init error: unsupported blank mode.\n");
+               i40e_debug(hw, I40E_DEBUG_NVM, "NVM init error: unsupported blank mode.\n");
        }
 
        return ret_code;
@@ -101,7 +101,7 @@ enum i40e_status_code i40e_acquire_nvm(struct i40e_hw *hw,
 {
        enum i40e_status_code ret_code = I40E_SUCCESS;
        u64 gtime, timeout;
-       u64 time = 0;
+       u64 time_left = 0;
 
        DEBUGFUNC("i40e_acquire_nvm");
 
@@ -109,40 +109,39 @@ enum i40e_status_code i40e_acquire_nvm(struct i40e_hw *hw,
                goto i40e_i40e_acquire_nvm_exit;
 
        ret_code = i40e_aq_request_resource(hw, I40E_NVM_RESOURCE_ID, access,
-                                           0, &time, NULL);
+                                           0, &time_left, NULL);
        /* Reading the Global Device Timer */
        gtime = rd32(hw, I40E_GLVFGEN_TIMER);
 
        /* Store the timeout */
-       hw->nvm.hw_semaphore_timeout = I40E_MS_TO_GTIME(time) + gtime;
+       hw->nvm.hw_semaphore_timeout = I40E_MS_TO_GTIME(time_left) + gtime;
 
-       if (ret_code != I40E_SUCCESS) {
-               /* Set the polling timeout */
-               if (time > I40E_MAX_NVM_TIMEOUT)
-                       timeout = I40E_MS_TO_GTIME(I40E_MAX_NVM_TIMEOUT)
-                                 + gtime;
-               else
-                       timeout = hw->nvm.hw_semaphore_timeout;
+       if (ret_code)
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "NVM acquire type %d failed time_left=%llu ret=%d aq_err=%d\n",
+                          access, time_left, ret_code, hw->aq.asq_last_status);
+
+       if (ret_code && time_left) {
                /* Poll until the current NVM owner timeouts */
-               while (gtime < timeout) {
+               timeout = I40E_MS_TO_GTIME(I40E_MAX_NVM_TIMEOUT) + gtime;
+               while ((gtime < timeout) && time_left) {
                        i40e_msec_delay(10);
+                       gtime = rd32(hw, I40E_GLVFGEN_TIMER);
                        ret_code = i40e_aq_request_resource(hw,
                                                        I40E_NVM_RESOURCE_ID,
-                                                       access, 0, &time,
+                                                       access, 0, &time_left,
                                                        NULL);
                        if (ret_code == I40E_SUCCESS) {
                                hw->nvm.hw_semaphore_timeout =
-                                               I40E_MS_TO_GTIME(time) + gtime;
+                                           I40E_MS_TO_GTIME(time_left) + gtime;
                                break;
                        }
-                       gtime = rd32(hw, I40E_GLVFGEN_TIMER);
                }
                if (ret_code != I40E_SUCCESS) {
                        hw->nvm.hw_semaphore_timeout = 0;
-                       hw->nvm.hw_semaphore_wait =
-                                               I40E_MS_TO_GTIME(time) + gtime;
-                       DEBUGOUT1("NVM acquire timed out, wait %llu ms before trying again.\n",
-                                 time);
+                       i40e_debug(hw, I40E_DEBUG_NVM,
+                                  "NVM acquire timed out, wait %llu ms before trying again. status=%d aq_err=%d\n",
+                                  time_left, ret_code, hw->aq.asq_last_status);
                }
        }
 
@@ -187,7 +186,7 @@ static enum i40e_status_code i40e_poll_sr_srctl_done_bit(struct i40e_hw *hw)
                i40e_usec_delay(5);
        }
        if (ret_code == I40E_ERR_TIMEOUT)
-               DEBUGOUT("Done bit in GLNVM_SRCTL not set");
+               i40e_debug(hw, I40E_DEBUG_NVM, "Done bit in GLNVM_SRCTL not set");
        return ret_code;
 }
 
@@ -543,14 +542,21 @@ enum i40e_status_code i40e_write_nvm_buffer(struct i40e_hw *hw,
 enum i40e_status_code i40e_calc_nvm_checksum(struct i40e_hw *hw, u16 *checksum)
 {
        enum i40e_status_code ret_code = I40E_SUCCESS;
+       struct i40e_virt_mem vmem;
        u16 pcie_alt_module = 0;
        u16 checksum_local = 0;
        u16 vpd_module = 0;
-       u16 word = 0;
-       u32 i = 0;
+       u16 *data;
+       u16 i = 0;
 
        DEBUGFUNC("i40e_calc_nvm_checksum");
 
+       ret_code = i40e_allocate_virt_mem(hw, &vmem,
+                                   I40E_SR_SECTOR_SIZE_IN_WORDS * sizeof(u16));
+       if (ret_code)
+               goto i40e_calc_nvm_checksum_exit;
+       data = (u16 *)vmem.va;
+
        /* read pointer to VPD area */
        ret_code = i40e_read_nvm_word(hw, I40E_SR_VPD_PTR, &vpd_module);
        if (ret_code != I40E_SUCCESS) {
@@ -560,7 +566,7 @@ enum i40e_status_code i40e_calc_nvm_checksum(struct i40e_hw *hw, u16 *checksum)
 
        /* read pointer to PCIe Alt Auto-load module */
        ret_code = i40e_read_nvm_word(hw, I40E_SR_PCIE_ALT_AUTO_LOAD_PTR,
-                                      &pcie_alt_module);
+                                     &pcie_alt_module);
        if (ret_code != I40E_SUCCESS) {
                ret_code = I40E_ERR_NVM_CHECKSUM;
                goto i40e_calc_nvm_checksum_exit;
@@ -570,33 +576,39 @@ enum i40e_status_code i40e_calc_nvm_checksum(struct i40e_hw *hw, u16 *checksum)
         * except the VPD and PCIe ALT Auto-load modules
         */
        for (i = 0; i < hw->nvm.sr_size; i++) {
+               /* 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;
+                               goto i40e_calc_nvm_checksum_exit;
+                       }
+               }
+
                /* Skip Checksum word */
                if (i == I40E_SR_SW_CHECKSUM_WORD)
-                       i++;
+                       continue;
                /* Skip VPD module (convert byte size to word count) */
-               if (i == (u32)vpd_module) {
-                       i += (I40E_SR_VPD_MODULE_MAX_SIZE / 2);
-                       if (i >= hw->nvm.sr_size)
-                               break;
+               if ((i >= (u32)vpd_module) &&
+                   (i < ((u32)vpd_module +
+                    (I40E_SR_VPD_MODULE_MAX_SIZE / 2)))) {
+                       continue;
                }
                /* Skip PCIe ALT module (convert byte size to word count) */
-               if (i == (u32)pcie_alt_module) {
-                       i += (I40E_SR_PCIE_ALT_MODULE_MAX_SIZE / 2);
-                       if (i >= hw->nvm.sr_size)
-                               break;
+               if ((i >= (u32)pcie_alt_module) &&
+                   (i < ((u32)pcie_alt_module +
+                    (I40E_SR_PCIE_ALT_MODULE_MAX_SIZE / 2)))) {
+                       continue;
                }
 
-               ret_code = i40e_read_nvm_word(hw, (u16)i, &word);
-               if (ret_code != I40E_SUCCESS) {
-                       ret_code = I40E_ERR_NVM_CHECKSUM;
-                       goto i40e_calc_nvm_checksum_exit;
-               }
-               checksum_local += word;
+               checksum_local += data[i % I40E_SR_SECTOR_SIZE_IN_WORDS];
        }
 
        *checksum = (u16)I40E_SR_SW_CHECKSUM_BASE - checksum_local;
 
 i40e_calc_nvm_checksum_exit:
+       i40e_free_virt_mem(hw, &vmem);
        return ret_code;
 }
 
@@ -693,6 +705,22 @@ STATIC inline u8 i40e_nvmupd_get_transaction(u32 val)
        return (u8)((val & I40E_NVM_TRANS_MASK) >> I40E_NVM_TRANS_SHIFT);
 }
 
+STATIC const char *i40e_nvm_update_state_str[] = {
+       "I40E_NVMUPD_INVALID",
+       "I40E_NVMUPD_READ_CON",
+       "I40E_NVMUPD_READ_SNT",
+       "I40E_NVMUPD_READ_LCB",
+       "I40E_NVMUPD_READ_SA",
+       "I40E_NVMUPD_WRITE_ERA",
+       "I40E_NVMUPD_WRITE_CON",
+       "I40E_NVMUPD_WRITE_SNT",
+       "I40E_NVMUPD_WRITE_LCB",
+       "I40E_NVMUPD_WRITE_SA",
+       "I40E_NVMUPD_CSUM_CON",
+       "I40E_NVMUPD_CSUM_SA",
+       "I40E_NVMUPD_CSUM_LCB",
+};
+
 /**
  * i40e_nvmupd_command - Process an NVM update command
  * @hw: pointer to hardware structure
@@ -728,6 +756,8 @@ enum i40e_status_code i40e_nvmupd_command(struct i40e_hw *hw,
 
        default:
                /* invalid state, should never happen */
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "NVMUPD: no such state %d\n", hw->nvmupd_state);
                status = I40E_NOT_SUPPORTED;
                *perrno = -ESRCH;
                break;
@@ -760,7 +790,8 @@ STATIC enum i40e_status_code i40e_nvmupd_state_init(struct i40e_hw *hw,
        case I40E_NVMUPD_READ_SA:
                status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
                if (status) {
-                       *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+                       *perrno = i40e_aq_rc_to_posix(status,
+                                                    hw->aq.asq_last_status);
                } else {
                        status = i40e_nvmupd_nvm_read(hw, cmd, bytes, perrno);
                        i40e_release_nvm(hw);
@@ -770,17 +801,22 @@ STATIC enum i40e_status_code i40e_nvmupd_state_init(struct i40e_hw *hw,
        case I40E_NVMUPD_READ_SNT:
                status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
                if (status) {
-                       *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+                       *perrno = i40e_aq_rc_to_posix(status,
+                                                    hw->aq.asq_last_status);
                } else {
                        status = i40e_nvmupd_nvm_read(hw, cmd, bytes, perrno);
-                       hw->nvmupd_state = I40E_NVMUPD_STATE_READING;
+                       if (status)
+                               i40e_release_nvm(hw);
+                       else
+                               hw->nvmupd_state = I40E_NVMUPD_STATE_READING;
                }
                break;
 
        case I40E_NVMUPD_WRITE_ERA:
                status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
                if (status) {
-                       *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+                       *perrno = i40e_aq_rc_to_posix(status,
+                                                    hw->aq.asq_last_status);
                } else {
                        status = i40e_nvmupd_nvm_erase(hw, cmd, perrno);
                        if (status)
@@ -793,7 +829,8 @@ STATIC enum i40e_status_code i40e_nvmupd_state_init(struct i40e_hw *hw,
        case I40E_NVMUPD_WRITE_SA:
                status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
                if (status) {
-                       *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+                       *perrno = i40e_aq_rc_to_posix(status,
+                                                    hw->aq.asq_last_status);
                } else {
                        status = i40e_nvmupd_nvm_write(hw, cmd, bytes, perrno);
                        if (status)
@@ -806,22 +843,28 @@ STATIC enum i40e_status_code i40e_nvmupd_state_init(struct i40e_hw *hw,
        case I40E_NVMUPD_WRITE_SNT:
                status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
                if (status) {
-                       *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+                       *perrno = i40e_aq_rc_to_posix(status,
+                                                    hw->aq.asq_last_status);
                } else {
                        status = i40e_nvmupd_nvm_write(hw, cmd, bytes, perrno);
-                       hw->nvmupd_state = I40E_NVMUPD_STATE_WRITING;
+                       if (status)
+                               i40e_release_nvm(hw);
+                       else
+                               hw->nvmupd_state = I40E_NVMUPD_STATE_WRITING;
                }
                break;
 
        case I40E_NVMUPD_CSUM_SA:
                status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
                if (status) {
-                       *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+                       *perrno = i40e_aq_rc_to_posix(status,
+                                                    hw->aq.asq_last_status);
                } else {
                        status = i40e_update_nvm_checksum(hw);
                        if (status) {
                                *perrno = hw->aq.asq_last_status ?
-                                  i40e_aq_rc_to_posix(hw->aq.asq_last_status) :
+                                  i40e_aq_rc_to_posix(status,
+                                                      hw->aq.asq_last_status) :
                                   -EIO;
                                i40e_release_nvm(hw);
                        } else {
@@ -831,6 +874,9 @@ STATIC enum i40e_status_code i40e_nvmupd_state_init(struct i40e_hw *hw,
                break;
 
        default:
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "NVMUPD: bad cmd %s in init state\n",
+                          i40e_nvm_update_state_str[upd_cmd]);
                status = I40E_ERR_NVM;
                *perrno = -ESRCH;
                break;
@@ -872,6 +918,9 @@ STATIC enum i40e_status_code i40e_nvmupd_state_reading(struct i40e_hw *hw,
                break;
 
        default:
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "NVMUPD: bad cmd %s in reading state.\n",
+                          i40e_nvm_update_state_str[upd_cmd]);
                status = I40E_NOT_SUPPORTED;
                *perrno = -ESRCH;
                break;
@@ -895,11 +944,13 @@ STATIC enum i40e_status_code i40e_nvmupd_state_writing(struct i40e_hw *hw,
 {
        enum i40e_status_code status;
        enum i40e_nvmupd_cmd upd_cmd;
+       bool retry_attempt = false;
 
        DEBUGFUNC("i40e_nvmupd_state_writing");
 
        upd_cmd = i40e_nvmupd_validate_command(hw, cmd, perrno);
 
+retry:
        switch (upd_cmd) {
        case I40E_NVMUPD_WRITE_CON:
                status = i40e_nvmupd_nvm_write(hw, cmd, bytes, perrno);
@@ -907,37 +958,75 @@ STATIC enum i40e_status_code i40e_nvmupd_state_writing(struct i40e_hw *hw,
 
        case I40E_NVMUPD_WRITE_LCB:
                status = i40e_nvmupd_nvm_write(hw, cmd, bytes, perrno);
-               if (!status) {
+               if (!status)
                        hw->aq.nvm_release_on_done = true;
-                       hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
-               }
+               hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
                break;
 
        case I40E_NVMUPD_CSUM_CON:
                status = i40e_update_nvm_checksum(hw);
-               if (status)
+               if (status) {
                        *perrno = hw->aq.asq_last_status ?
-                                  i40e_aq_rc_to_posix(hw->aq.asq_last_status) :
+                                  i40e_aq_rc_to_posix(status,
+                                                      hw->aq.asq_last_status) :
                                   -EIO;
+                       hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
+               }
                break;
 
        case I40E_NVMUPD_CSUM_LCB:
                status = i40e_update_nvm_checksum(hw);
-               if (status) {
+               if (status)
                        *perrno = hw->aq.asq_last_status ?
-                                  i40e_aq_rc_to_posix(hw->aq.asq_last_status) :
+                                  i40e_aq_rc_to_posix(status,
+                                                      hw->aq.asq_last_status) :
                                   -EIO;
-               } else {
+               else
                        hw->aq.nvm_release_on_done = true;
-                       hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
-               }
+               hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
                break;
 
        default:
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "NVMUPD: bad cmd %s in writing state.\n",
+                          i40e_nvm_update_state_str[upd_cmd]);
                status = I40E_NOT_SUPPORTED;
                *perrno = -ESRCH;
                break;
        }
+
+       /* In some circumstances, a multi-write transaction takes longer
+        * than the default 3 minute timeout on the write semaphore.  If
+        * the write failed with an EBUSY status, this is likely the problem,
+        * so here we try to reacquire the semaphore then retry the write.
+        * We only do one retry, then give up.
+        */
+       if (status && (hw->aq.asq_last_status == I40E_AQ_RC_EBUSY) &&
+           !retry_attempt) {
+               enum i40e_status_code old_status = status;
+               u32 old_asq_status = hw->aq.asq_last_status;
+               u32 gtime;
+
+               gtime = rd32(hw, I40E_GLVFGEN_TIMER);
+               if (gtime >= hw->nvm.hw_semaphore_timeout) {
+                       i40e_debug(hw, I40E_DEBUG_ALL,
+                                  "NVMUPD: write semaphore expired (%d >= %lld), retrying\n",
+                                  gtime, hw->nvm.hw_semaphore_timeout);
+                       i40e_release_nvm(hw);
+                       status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
+                       if (status) {
+                               i40e_debug(hw, I40E_DEBUG_ALL,
+                                          "NVMUPD: write semaphore reacquire failed aq_err = %d\n",
+                                          hw->aq.asq_last_status);
+                               status = old_status;
+                               hw->aq.asq_last_status = old_asq_status;
+                       } else {
+                               retry_attempt = true;
+                               goto retry;
+                       }
+               }
+       }
+
        return status;
 }
 
@@ -967,8 +1056,9 @@ STATIC enum i40e_nvmupd_cmd i40e_nvmupd_validate_command(struct i40e_hw *hw,
        /* limits on data size */
        if ((cmd->data_size < 1) ||
            (cmd->data_size > I40E_NVMUPD_MAX_DATA)) {
-               DEBUGOUT1("i40e_nvmupd_validate_command data_size %d\n",
-                       cmd->data_size);
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "i40e_nvmupd_validate_command data_size %d\n",
+                          cmd->data_size);
                *perrno = -EFAULT;
                return I40E_NVMUPD_INVALID;
        }
@@ -1020,12 +1110,16 @@ STATIC enum i40e_nvmupd_cmd i40e_nvmupd_validate_command(struct i40e_hw *hw,
                }
                break;
        }
+       i40e_debug(hw, I40E_DEBUG_NVM, "%s state %d nvm_release_on_hold %d\n",
+                  i40e_nvm_update_state_str[upd_cmd],
+                  hw->nvmupd_state,
+                  hw->aq.nvm_release_on_done);
 
        if (upd_cmd == I40E_NVMUPD_INVALID) {
                *perrno = -EFAULT;
-               DEBUGOUT2(
-                       "i40e_nvmupd_validate_command returns %d  perrno: %d\n",
-                       upd_cmd, *perrno);
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "i40e_nvmupd_validate_command returns %d perrno %d\n",
+                          upd_cmd, *perrno);
        }
        return upd_cmd;
 }
@@ -1050,14 +1144,18 @@ STATIC enum i40e_status_code i40e_nvmupd_nvm_read(struct i40e_hw *hw,
        transaction = i40e_nvmupd_get_transaction(cmd->config);
        module = i40e_nvmupd_get_module(cmd->config);
        last = (transaction == I40E_NVM_LCB) || (transaction == I40E_NVM_SA);
-       DEBUGOUT3("i40e_nvmupd_nvm_read mod 0x%x  off 0x%x  len 0x%x\n",
-               module, cmd->offset, cmd->data_size);
 
        status = i40e_aq_read_nvm(hw, module, cmd->offset, (u16)cmd->data_size,
                                  bytes, last, NULL);
-       DEBUGOUT1("i40e_nvmupd_nvm_read status %d\n", status);
-       if (status != I40E_SUCCESS)
-               *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+       if (status) {
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "i40e_nvmupd_nvm_read mod 0x%x  off 0x%x  len 0x%x\n",
+                          module, cmd->offset, cmd->data_size);
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "i40e_nvmupd_nvm_read status %d aq %d\n",
+                          status, hw->aq.asq_last_status);
+               *perrno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
+       }
 
        return status;
 }
@@ -1081,13 +1179,17 @@ STATIC enum i40e_status_code i40e_nvmupd_nvm_erase(struct i40e_hw *hw,
        transaction = i40e_nvmupd_get_transaction(cmd->config);
        module = i40e_nvmupd_get_module(cmd->config);
        last = (transaction & I40E_NVM_LCB);
-       DEBUGOUT3("i40e_nvmupd_nvm_erase mod 0x%x  off 0x%x  len 0x%x\n",
-               module, cmd->offset, cmd->data_size);
        status = i40e_aq_erase_nvm(hw, module, cmd->offset, (u16)cmd->data_size,
                                   last, NULL);
-       DEBUGOUT1("i40e_nvmupd_nvm_erase status %d\n", status);
-       if (status != I40E_SUCCESS)
-               *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+       if (status) {
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "i40e_nvmupd_nvm_erase mod 0x%x  off 0x%x len 0x%x\n",
+                          module, cmd->offset, cmd->data_size);
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "i40e_nvmupd_nvm_erase status %d aq %d\n",
+                          status, hw->aq.asq_last_status);
+               *perrno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
+       }
 
        return status;
 }
@@ -1112,13 +1214,18 @@ STATIC enum i40e_status_code i40e_nvmupd_nvm_write(struct i40e_hw *hw,
        transaction = i40e_nvmupd_get_transaction(cmd->config);
        module = i40e_nvmupd_get_module(cmd->config);
        last = (transaction & I40E_NVM_LCB);
-       DEBUGOUT3("i40e_nvmupd_nvm_write mod 0x%x off 0x%x len 0x%x\n",
-                 module, cmd->offset, cmd->data_size);
+
        status = i40e_aq_update_nvm(hw, module, cmd->offset,
                                    (u16)cmd->data_size, bytes, last, NULL);
-       DEBUGOUT1("i40e_nvmupd_nvm_write status %d\n", status);
-       if (status != I40E_SUCCESS)
-               *perrno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
+       if (status) {
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "i40e_nvmupd_nvm_write mod 0x%x off 0x%x len 0x%x\n",
+                          module, cmd->offset, cmd->data_size);
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "i40e_nvmupd_nvm_write status %d aq %d\n",
+                          status, hw->aq.asq_last_status);
+               *perrno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
+       }
 
        return status;
 }