Skip to content

Commit bf848f3

Browse files
Shannon NelsonJeff Kirsher
authored andcommitted
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>
1 parent a3f0b38 commit bf848f3

File tree

3 files changed

+33
-14
lines changed

3 files changed

+33
-14
lines changed

drivers/net/ethernet/intel/i40e/i40e_adminq.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#define _I40E_ADMINQ_H_
2929

3030
#include "i40e_osdep.h"
31+
#include "i40e_status.h"
3132
#include "i40e_adminq_cmd.h"
3233

3334
#define I40E_ADMINQ_DESC(R, i) \
@@ -108,7 +109,7 @@ struct i40e_adminq_info {
108109
* i40e_aq_rc_to_posix - convert errors to user-land codes
109110
* aq_rc: AdminQ error code to convert
110111
**/
111-
static inline int i40e_aq_rc_to_posix(u16 aq_rc)
112+
static inline int i40e_aq_rc_to_posix(u32 aq_ret, u16 aq_rc)
112113
{
113114
int aq_to_posix[] = {
114115
0, /* I40E_AQ_RC_OK */
@@ -136,6 +137,10 @@ static inline int i40e_aq_rc_to_posix(u16 aq_rc)
136137
-EFBIG, /* I40E_AQ_RC_EFBIG */
137138
};
138139

140+
/* aq_rc is invalid if AQ timed out */
141+
if (aq_ret == I40E_ERR_ADMIN_QUEUE_TIMEOUT)
142+
return -EAGAIN;
143+
139144
if (aq_rc >= ARRAY_SIZE(aq_to_posix))
140145
return -ERANGE;
141146
return aq_to_posix[aq_rc];

drivers/net/ethernet/intel/i40e/i40e_nvm.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
527527
case I40E_NVMUPD_READ_SA:
528528
status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
529529
if (status) {
530-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
530+
*errno = i40e_aq_rc_to_posix(status,
531+
hw->aq.asq_last_status);
531532
} else {
532533
status = i40e_nvmupd_nvm_read(hw, cmd, bytes, errno);
533534
i40e_release_nvm(hw);
@@ -537,7 +538,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
537538
case I40E_NVMUPD_READ_SNT:
538539
status = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
539540
if (status) {
540-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
541+
*errno = i40e_aq_rc_to_posix(status,
542+
hw->aq.asq_last_status);
541543
} else {
542544
status = i40e_nvmupd_nvm_read(hw, cmd, bytes, errno);
543545
if (status)
@@ -550,7 +552,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
550552
case I40E_NVMUPD_WRITE_ERA:
551553
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
552554
if (status) {
553-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
555+
*errno = i40e_aq_rc_to_posix(status,
556+
hw->aq.asq_last_status);
554557
} else {
555558
status = i40e_nvmupd_nvm_erase(hw, cmd, errno);
556559
if (status)
@@ -563,7 +566,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
563566
case I40E_NVMUPD_WRITE_SA:
564567
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
565568
if (status) {
566-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
569+
*errno = i40e_aq_rc_to_posix(status,
570+
hw->aq.asq_last_status);
567571
} else {
568572
status = i40e_nvmupd_nvm_write(hw, cmd, bytes, errno);
569573
if (status)
@@ -576,7 +580,8 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
576580
case I40E_NVMUPD_WRITE_SNT:
577581
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
578582
if (status) {
579-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
583+
*errno = i40e_aq_rc_to_posix(status,
584+
hw->aq.asq_last_status);
580585
} else {
581586
status = i40e_nvmupd_nvm_write(hw, cmd, bytes, errno);
582587
if (status)
@@ -589,12 +594,14 @@ static i40e_status i40e_nvmupd_state_init(struct i40e_hw *hw,
589594
case I40E_NVMUPD_CSUM_SA:
590595
status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE);
591596
if (status) {
592-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
597+
*errno = i40e_aq_rc_to_posix(status,
598+
hw->aq.asq_last_status);
593599
} else {
594600
status = i40e_update_nvm_checksum(hw);
595601
if (status) {
596602
*errno = hw->aq.asq_last_status ?
597-
i40e_aq_rc_to_posix(hw->aq.asq_last_status) :
603+
i40e_aq_rc_to_posix(status,
604+
hw->aq.asq_last_status) :
598605
-EIO;
599606
i40e_release_nvm(hw);
600607
} else {
@@ -691,7 +698,8 @@ static i40e_status i40e_nvmupd_state_writing(struct i40e_hw *hw,
691698
status = i40e_update_nvm_checksum(hw);
692699
if (status) {
693700
*errno = hw->aq.asq_last_status ?
694-
i40e_aq_rc_to_posix(hw->aq.asq_last_status) :
701+
i40e_aq_rc_to_posix(status,
702+
hw->aq.asq_last_status) :
695703
-EIO;
696704
hw->nvmupd_state = I40E_NVMUPD_STATE_INIT;
697705
}
@@ -701,7 +709,8 @@ static i40e_status i40e_nvmupd_state_writing(struct i40e_hw *hw,
701709
status = i40e_update_nvm_checksum(hw);
702710
if (status)
703711
*errno = hw->aq.asq_last_status ?
704-
i40e_aq_rc_to_posix(hw->aq.asq_last_status) :
712+
i40e_aq_rc_to_posix(status,
713+
hw->aq.asq_last_status) :
705714
-EIO;
706715
else
707716
hw->aq.nvm_release_on_done = true;
@@ -839,7 +848,7 @@ static i40e_status i40e_nvmupd_nvm_read(struct i40e_hw *hw,
839848
i40e_debug(hw, I40E_DEBUG_NVM,
840849
"i40e_nvmupd_nvm_read status %d aq %d\n",
841850
status, hw->aq.asq_last_status);
842-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
851+
*errno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
843852
}
844853

845854
return status;
@@ -873,7 +882,7 @@ static i40e_status i40e_nvmupd_nvm_erase(struct i40e_hw *hw,
873882
i40e_debug(hw, I40E_DEBUG_NVM,
874883
"i40e_nvmupd_nvm_erase status %d aq %d\n",
875884
status, hw->aq.asq_last_status);
876-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
885+
*errno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
877886
}
878887

879888
return status;
@@ -909,7 +918,7 @@ static i40e_status i40e_nvmupd_nvm_write(struct i40e_hw *hw,
909918
i40e_debug(hw, I40E_DEBUG_NVM,
910919
"i40e_nvmupd_nvm_write status %d aq %d\n",
911920
status, hw->aq.asq_last_status);
912-
*errno = i40e_aq_rc_to_posix(hw->aq.asq_last_status);
921+
*errno = i40e_aq_rc_to_posix(status, hw->aq.asq_last_status);
913922
}
914923

915924
return status;

drivers/net/ethernet/intel/i40evf/i40e_adminq.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#define _I40E_ADMINQ_H_
2929

3030
#include "i40e_osdep.h"
31+
#include "i40e_status.h"
3132
#include "i40e_adminq_cmd.h"
3233

3334
#define I40E_ADMINQ_DESC(R, i) \
@@ -108,7 +109,7 @@ struct i40e_adminq_info {
108109
* i40e_aq_rc_to_posix - convert errors to user-land codes
109110
* aq_rc: AdminQ error code to convert
110111
**/
111-
static inline int i40e_aq_rc_to_posix(u16 aq_rc)
112+
static inline int i40e_aq_rc_to_posix(u32 aq_ret, u16 aq_rc)
112113
{
113114
int aq_to_posix[] = {
114115
0, /* I40E_AQ_RC_OK */
@@ -136,6 +137,10 @@ static inline int i40e_aq_rc_to_posix(u16 aq_rc)
136137
-EFBIG, /* I40E_AQ_RC_EFBIG */
137138
};
138139

140+
/* aq_rc is invalid if AQ timed out */
141+
if (aq_ret == I40E_ERR_ADMIN_QUEUE_TIMEOUT)
142+
return -EAGAIN;
143+
139144
if (aq_rc >= ARRAY_SIZE(aq_to_posix))
140145
return -ERANGE;
141146
return aq_to_posix[aq_rc];

0 commit comments

Comments
 (0)