From: Alvin Zhang Date: Sun, 25 Apr 2021 07:39:34 +0000 (+0800) Subject: net/iavf: fix VF to PF command failure handling X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=0c35eecfe8b54bbdf59c30a803404acfdcc4f7eb;p=dpdk.git net/iavf: fix VF to PF command failure handling When the command sent by VF to PF fails, iavf may need to run different code paths according to the specific reason of the failure (not supported or other reasons). This patch adds support of identifying PF return error type. Fixes: 22b123a36d07 ("net/avf: initialize PMD") Cc: stable@dpdk.org Signed-off-by: Alvin Zhang Acked-by: Beilei Xing --- diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index 1e73f01211..4f5811ae87 100644 --- a/drivers/net/iavf/iavf.h +++ b/drivers/net/iavf/iavf.h @@ -144,7 +144,7 @@ struct iavf_info { uint64_t supported_rxdid; uint8_t *proto_xtr; /* proto xtr type for all queues */ volatile enum virtchnl_ops pend_cmd; /* pending command not finished */ - uint32_t cmd_retval; /* return value of the cmd response from PF */ + int cmd_retval; /* return value of the cmd response from PF */ uint8_t *aq_resp; /* buffer to store the adminq response from PF */ /* Event from pf */ @@ -264,7 +264,7 @@ struct iavf_cmd_info { * _atomic_set_cmd successfully. */ static inline void -_notify_cmd(struct iavf_info *vf, uint32_t msg_ret) +_notify_cmd(struct iavf_info *vf, int msg_ret) { vf->cmd_retval = msg_ret; rte_wmb(); diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index b0fbe15677..0026120cf4 100644 --- a/drivers/net/iavf/iavf_vchnl.c +++ b/drivers/net/iavf/iavf_vchnl.c @@ -228,13 +228,19 @@ iavf_execute_vf_cmd(struct iavf_adapter *adapter, struct iavf_cmd_info *args) rte_delay_ms(ASQ_DELAY_MS); /* If don't read msg or read sys event, continue */ } while (i++ < MAX_TRY_TIMES); - /* If there's no response is received, clear command */ - if (i >= MAX_TRY_TIMES || - vf->cmd_retval != VIRTCHNL_STATUS_SUCCESS) { - err = -1; - PMD_DRV_LOG(ERR, "No response or return failure (%d)" - " for cmd %d", vf->cmd_retval, args->ops); + + if (i >= MAX_TRY_TIMES) { + PMD_DRV_LOG(ERR, "No response for cmd %d", args->ops); _clear_cmd(vf); + err = -EIO; + } else if (vf->cmd_retval == + VIRTCHNL_STATUS_ERR_NOT_SUPPORTED) { + PMD_DRV_LOG(ERR, "Cmd %d not supported", args->ops); + err = -ENOTSUP; + } else if (vf->cmd_retval != VIRTCHNL_STATUS_SUCCESS) { + PMD_DRV_LOG(ERR, "Return failure %d for cmd %d", + vf->cmd_retval, args->ops); + err = -EINVAL; } break; }