mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:44:45 +01:00
ice: reintroduce retry mechanism for indirect AQ
Add retry mechanism for indirect Admin Queue (AQ) commands. To do so we need to keep the command buffer. This technically reverts commit43a630e37e("ice: remove unused buffer copy code in ice_sq_send_cmd_retry()"), but combines it with a fix in the logic by using a kmemdup() call, making it more robust and less likely to break in the future due to programmer error. Cc: Michal Schmidt <mschmidt@redhat.com> Cc: stable@vger.kernel.org Fixes:3056df93f7("ice: Re-send some AQ commands, as result of EBUSY AQ error") Signed-off-by: Jakub Staniszewski <jakub.staniszewski@linux.intel.com> Co-developed-by: Dawid Osuchowski <dawid.osuchowski@linux.intel.com> Signed-off-by: Dawid Osuchowski <dawid.osuchowski@linux.intel.com> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> Tested-by: Rinitha S <sx.rinitha@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
eef33aa449
commit
326256c0a7
1 changed files with 9 additions and 3 deletions
|
|
@ -1841,6 +1841,7 @@ ice_sq_send_cmd_retry(struct ice_hw *hw, struct ice_ctl_q_info *cq,
|
|||
{
|
||||
struct libie_aq_desc desc_cpy;
|
||||
bool is_cmd_for_retry;
|
||||
u8 *buf_cpy = NULL;
|
||||
u8 idx = 0;
|
||||
u16 opcode;
|
||||
int status;
|
||||
|
|
@ -1850,8 +1851,11 @@ ice_sq_send_cmd_retry(struct ice_hw *hw, struct ice_ctl_q_info *cq,
|
|||
memset(&desc_cpy, 0, sizeof(desc_cpy));
|
||||
|
||||
if (is_cmd_for_retry) {
|
||||
/* All retryable cmds are direct, without buf. */
|
||||
WARN_ON(buf);
|
||||
if (buf) {
|
||||
buf_cpy = kmemdup(buf, buf_size, GFP_KERNEL);
|
||||
if (!buf_cpy)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memcpy(&desc_cpy, desc, sizeof(desc_cpy));
|
||||
}
|
||||
|
|
@ -1863,12 +1867,14 @@ ice_sq_send_cmd_retry(struct ice_hw *hw, struct ice_ctl_q_info *cq,
|
|||
hw->adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
|
||||
break;
|
||||
|
||||
if (buf_cpy)
|
||||
memcpy(buf, buf_cpy, buf_size);
|
||||
memcpy(desc, &desc_cpy, sizeof(desc_cpy));
|
||||
|
||||
msleep(ICE_SQ_SEND_DELAY_TIME_MS);
|
||||
|
||||
} while (++idx < ICE_SQ_SEND_MAX_EXECUTE);
|
||||
|
||||
kfree(buf_cpy);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue