|
@@ -753,6 +753,11 @@ i40e_status i40e_nvmupd_command(struct i40e_hw *hw,
|
|
hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
|
|
hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* Acquire lock to prevent race condition where adminq_task
|
|
|
|
+ * can execute after i40e_nvmupd_nvm_read/write but before state
|
|
|
|
+ * variables (nvm_wait_opcode, nvm_release_on_done) are updated
|
|
|
|
+ */
|
|
|
|
+ mutex_lock(&hw->aq.arq_mutex);
|
|
switch (hw->nvmupd_state) {
|
|
switch (hw->nvmupd_state) {
|
|
case I40E_NVMUPD_STATE_INIT:
|
|
case I40E_NVMUPD_STATE_INIT:
|
|
status = i40e_nvmupd_state_init(hw, cmd, bytes, perrno);
|
|
status = i40e_nvmupd_state_init(hw, cmd, bytes, perrno);
|
|
@@ -788,6 +793,7 @@ i40e_status i40e_nvmupd_command(struct i40e_hw *hw,
|
|
*perrno = -ESRCH;
|
|
*perrno = -ESRCH;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ mutex_unlock(&hw->aq.arq_mutex);
|
|
return status;
|
|
return status;
|
|
}
|
|
}
|
|
|
|
|