mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 02:19:51 +00:00
i40e: check for AQ timeout in aq_rc decode
Decoding the AQ return code is great except when the AQ send timed out and there's no return code set. This changes the handy decoder interface to help catch and properly report the condition as a useful errno rather than returning a misleading '0'. Change-ID: I07a1f94f921606da49ffac7837bcdc37cd8222eb Signed-off-by: Shannon Nelson <shannon.nelson@intel.com> Acked-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Tested-by: Jim Young <jamesx.m.young@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
a3f0b381ee
commit
bf848f328c
3 changed files with 33 additions and 14 deletions
|
@ -28,6 +28,7 @@
|
||||||
#define _I40E_ADMINQ_H_
|
#define _I40E_ADMINQ_H_
|
||||||
|
|
||||||
#include "i40e_osdep.h"
|
#include "i40e_osdep.h"
|
||||||
|
#include "i40e_status.h"
|
||||||
#include "i40e_adminq_cmd.h"
|
#include "i40e_adminq_cmd.h"
|
||||||
|
|
||||||
#define I40E_ADMINQ_DESC(R, i) \
|
#define I40E_ADMINQ_DESC(R, i) \
|
||||||
|
@ -108,7 +109,7 @@ struct i40e_adminq_info {
|
||||||
* i40e_aq_rc_to_posix - convert errors to user-land codes
|
* i40e_aq_rc_to_posix - convert errors to user-land codes
|
||||||
* aq_rc: AdminQ error code to convert
|
* aq_rc: AdminQ error code to convert
|
||||||
**/
|
**/
|
||||||
static inline int i40e_aq_rc_to_posix(u16 aq_rc)
|
static inline int i40e_aq_rc_to_posix(u32 aq_ret, u16 aq_rc)
|
||||||
{
|
{
|
||||||
int aq_to_posix[] = {
|
int aq_to_posix[] = {
|
||||||
0, /* I40E_AQ_RC_OK */
|
0, /* I40E_AQ_RC_OK */
|
||||||
|
@ -136,6 +137,10 @@ static inline int i40e_aq_rc_to_posix(u16 aq_rc)
|
||||||
-EFBIG, /* I40E_AQ_RC_EFBIG */
|
-EFBIG, /* I40E_AQ_RC_EFBIG */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* aq_rc is invalid if AQ timed out */
|
||||||
|
if (aq_ret == I40E_ERR_ADMIN_QUEUE_TIMEOUT)
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
if (aq_rc >= ARRAY_SIZE(aq_to_posix))
|
if (aq_rc >= ARRAY_SIZE(aq_to_posix))
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
return aq_to_posix[aq_rc];
|
return aq_to_posix[aq_rc];
|
||||||
|
|
|
@ -527,7 +527,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
|
||||||
case I40E_NVMUPD_READ_SA:
|
case I40E_NVMUPD_READ_SA:
|
||||||
status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
|
status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
|
||||||
if (status) {
|
if (status) {
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status,
|
||||||
|
hw->aq.asq_last_status);
|
||||||
} else {
|
} else {
|
||||||
status = i40e_nvmupd_nvm_read(hw, cmd, bytes, errno);
|
status = i40e_nvmupd_nvm_read(hw, cmd, bytes, errno);
|
||||||
i40e_release_nvm(hw);
|
i40e_release_nvm(hw);
|
||||||
|
@ -537,7 +538,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
|
||||||
case I40E_NVMUPD_READ_SNT:
|
case I40E_NVMUPD_READ_SNT:
|
||||||
status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
|
status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
|
||||||
if (status) {
|
if (status) {
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status,
|
||||||
|
hw->aq.asq_last_status);
|
||||||
} else {
|
} else {
|
||||||
status = i40e_nvmupd_nvm_read(hw, cmd, bytes, errno);
|
status = i40e_nvmupd_nvm_read(hw, cmd, bytes, errno);
|
||||||
if (status)
|
if (status)
|
||||||
|
@ -550,7 +552,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
|
||||||
case I40E_NVMUPD_WRITE_ERA:
|
case I40E_NVMUPD_WRITE_ERA:
|
||||||
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
|
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
|
||||||
if (status) {
|
if (status) {
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status,
|
||||||
|
hw->aq.asq_last_status);
|
||||||
} else {
|
} else {
|
||||||
status = i40e_nvmupd_nvm_erase(hw, cmd, errno);
|
status = i40e_nvmupd_nvm_erase(hw, cmd, errno);
|
||||||
if (status)
|
if (status)
|
||||||
|
@ -563,7 +566,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
|
||||||
case I40E_NVMUPD_WRITE_SA:
|
case I40E_NVMUPD_WRITE_SA:
|
||||||
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
|
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
|
||||||
if (status) {
|
if (status) {
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status,
|
||||||
|
hw->aq.asq_last_status);
|
||||||
} else {
|
} else {
|
||||||
status = i40e_nvmupd_nvm_write(hw, cmd, bytes, errno);
|
status = i40e_nvmupd_nvm_write(hw, cmd, bytes, errno);
|
||||||
if (status)
|
if (status)
|
||||||
|
@ -576,7 +580,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
|
||||||
case I40E_NVMUPD_WRITE_SNT:
|
case I40E_NVMUPD_WRITE_SNT:
|
||||||
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
|
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
|
||||||
if (status) {
|
if (status) {
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status,
|
||||||
|
hw->aq.asq_last_status);
|
||||||
} else {
|
} else {
|
||||||
status = i40e_nvmupd_nvm_write(hw, cmd, bytes, errno);
|
status = i40e_nvmupd_nvm_write(hw, cmd, bytes, errno);
|
||||||
if (status)
|
if (status)
|
||||||
|
@ -589,12 +594,14 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
|
||||||
case I40E_NVMUPD_CSUM_SA:
|
case I40E_NVMUPD_CSUM_SA:
|
||||||
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
|
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
|
||||||
if (status) {
|
if (status) {
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status,
|
||||||
|
hw->aq.asq_last_status);
|
||||||
} else {
|
} else {
|
||||||
status = i40e_update_nvm_checksum(hw);
|
status = i40e_update_nvm_checksum(hw);
|
||||||
if (status) {
|
if (status) {
|
||||||
*errno = hw->aq.asq_last_status ?
|
*errno = 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;
|
-EIO;
|
||||||
i40e_release_nvm(hw);
|
i40e_release_nvm(hw);
|
||||||
} else {
|
} else {
|
||||||
|
@ -691,7 +698,8 @@ static i40e_status i40e_nvmupd_state_writing(struct i40e_hw *hw,
|
||||||
status = i40e_update_nvm_checksum(hw);
|
status = i40e_update_nvm_checksum(hw);
|
||||||
if (status) {
|
if (status) {
|
||||||
*errno = hw->aq.asq_last_status ?
|
*errno = 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;
|
-EIO;
|
||||||
hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
|
hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
|
||||||
}
|
}
|
||||||
|
@ -701,7 +709,8 @@ static i40e_status i40e_nvmupd_state_writing(struct i40e_hw *hw,
|
||||||
status = i40e_update_nvm_checksum(hw);
|
status = i40e_update_nvm_checksum(hw);
|
||||||
if (status)
|
if (status)
|
||||||
*errno = hw->aq.asq_last_status ?
|
*errno = 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;
|
-EIO;
|
||||||
else
|
else
|
||||||
hw->aq.nvm_release_on_done = true;
|
hw->aq.nvm_release_on_done = true;
|
||||||
|
@ -839,7 +848,7 @@ static i40e_status i40e_nvmupd_nvm_read(struct i40e_hw *hw,
|
||||||
i40e_debug(hw, I40E_DEBUG_NVM,
|
i40e_debug(hw, I40E_DEBUG_NVM,
|
||||||
"i40e_nvmupd_nvm_read status %d aq %d\n",
|
"i40e_nvmupd_nvm_read status %d aq %d\n",
|
||||||
status, hw->aq.asq_last_status);
|
status, hw->aq.asq_last_status);
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@ -873,7 +882,7 @@ static i40e_status i40e_nvmupd_nvm_erase(struct i40e_hw *hw,
|
||||||
i40e_debug(hw, I40E_DEBUG_NVM,
|
i40e_debug(hw, I40E_DEBUG_NVM,
|
||||||
"i40e_nvmupd_nvm_erase status %d aq %d\n",
|
"i40e_nvmupd_nvm_erase status %d aq %d\n",
|
||||||
status, hw->aq.asq_last_status);
|
status, hw->aq.asq_last_status);
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@ -909,7 +918,7 @@ static i40e_status i40e_nvmupd_nvm_write(struct i40e_hw *hw,
|
||||||
i40e_debug(hw, I40E_DEBUG_NVM,
|
i40e_debug(hw, I40E_DEBUG_NVM,
|
||||||
"i40e_nvmupd_nvm_write status %d aq %d\n",
|
"i40e_nvmupd_nvm_write status %d aq %d\n",
|
||||||
status, hw->aq.asq_last_status);
|
status, hw->aq.asq_last_status);
|
||||||
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
|
*errno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#define _I40E_ADMINQ_H_
|
#define _I40E_ADMINQ_H_
|
||||||
|
|
||||||
#include "i40e_osdep.h"
|
#include "i40e_osdep.h"
|
||||||
|
#include "i40e_status.h"
|
||||||
#include "i40e_adminq_cmd.h"
|
#include "i40e_adminq_cmd.h"
|
||||||
|
|
||||||
#define I40E_ADMINQ_DESC(R, i) \
|
#define I40E_ADMINQ_DESC(R, i) \
|
||||||
|
@ -108,7 +109,7 @@ struct i40e_adminq_info {
|
||||||
* i40e_aq_rc_to_posix - convert errors to user-land codes
|
* i40e_aq_rc_to_posix - convert errors to user-land codes
|
||||||
* aq_rc: AdminQ error code to convert
|
* aq_rc: AdminQ error code to convert
|
||||||
**/
|
**/
|
||||||
static inline int i40e_aq_rc_to_posix(u16 aq_rc)
|
static inline int i40e_aq_rc_to_posix(u32 aq_ret, u16 aq_rc)
|
||||||
{
|
{
|
||||||
int aq_to_posix[] = {
|
int aq_to_posix[] = {
|
||||||
0, /* I40E_AQ_RC_OK */
|
0, /* I40E_AQ_RC_OK */
|
||||||
|
@ -136,6 +137,10 @@ static inline int i40e_aq_rc_to_posix(u16 aq_rc)
|
||||||
-EFBIG, /* I40E_AQ_RC_EFBIG */
|
-EFBIG, /* I40E_AQ_RC_EFBIG */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* aq_rc is invalid if AQ timed out */
|
||||||
|
if (aq_ret == I40E_ERR_ADMIN_QUEUE_TIMEOUT)
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
if (aq_rc >= ARRAY_SIZE(aq_to_posix))
|
if (aq_rc >= ARRAY_SIZE(aq_to_posix))
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
return aq_to_posix[aq_rc];
|
return aq_to_posix[aq_rc];
|
||||||
|
|
Loading…
Reference in a new issue