|
@@ -32,6 +32,16 @@
|
|
|
|
|
|
static void i40e_resume_aq(struct i40e_hw *hw);
|
|
|
|
|
|
+/**
|
|
|
+ * i40e_is_nvm_update_op - return true if this is an NVM update operation
|
|
|
+ * @desc: API request descriptor
|
|
|
+ **/
|
|
|
+static inline bool i40e_is_nvm_update_op(struct i40e_aq_desc *desc)
|
|
|
+{
|
|
|
+ return (desc->opcode == i40e_aqc_opc_nvm_erase) ||
|
|
|
+ (desc->opcode == i40e_aqc_opc_nvm_update);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* i40e_adminq_init_regs - Initialize AdminQ registers
|
|
|
* @hw: pointer to the hardware structure
|
|
@@ -585,6 +595,7 @@ i40e_status i40e_init_adminq(struct i40e_hw *hw)
|
|
|
|
|
|
/* pre-emptive resource lock release */
|
|
|
i40e_aq_release_resource(hw, I40E_NVM_RESOURCE_ID, 0, NULL);
|
|
|
+ hw->aq.nvm_busy = false;
|
|
|
|
|
|
ret_code = i40e_aq_set_hmc_resource_profile(hw,
|
|
|
I40E_HMC_PROFILE_DEFAULT,
|
|
@@ -708,6 +719,12 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
|
|
|
goto asq_send_command_exit;
|
|
|
}
|
|
|
|
|
|
+ if (i40e_is_nvm_update_op(desc) && hw->aq.nvm_busy) {
|
|
|
+ i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQTX: NVM busy.\n");
|
|
|
+ status = I40E_ERR_NVM;
|
|
|
+ goto asq_send_command_exit;
|
|
|
+ }
|
|
|
+
|
|
|
details = I40E_ADMINQ_DETAILS(hw->aq.asq, hw->aq.asq.next_to_use);
|
|
|
if (cmd_details) {
|
|
|
*details = *cmd_details;
|
|
@@ -835,6 +852,9 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
|
|
|
hw->aq.asq_last_status = (enum i40e_admin_queue_err)retval;
|
|
|
}
|
|
|
|
|
|
+ if (i40e_is_nvm_update_op(desc))
|
|
|
+ hw->aq.nvm_busy = true;
|
|
|
+
|
|
|
/* update the error if time out occurred */
|
|
|
if ((!cmd_completed) &&
|
|
|
(!details->async && !details->postpone)) {
|
|
@@ -929,6 +949,9 @@ i40e_status i40e_clean_arq_element(struct i40e_hw *hw,
|
|
|
e->msg_size);
|
|
|
}
|
|
|
|
|
|
+ if (i40e_is_nvm_update_op(&e->desc))
|
|
|
+ hw->aq.nvm_busy = false;
|
|
|
+
|
|
|
/* Restore the original datalen and buffer address in the desc,
|
|
|
* FW updates datalen to indicate the event message
|
|
|
* size
|