From 811245271bc7825d55af37a99a6a2374fa0e6dec Mon Sep 17 00:00:00 2001 From: Kailiang Zhou Date: Wed, 12 Oct 2022 10:46:29 +0300 Subject: [PATCH] common/virtio_mi: Submit admin cmd again if returen EAGAIN following spec,when Bit (7) - Do Not Retry (DNR) is not set, submit again. Signed-off-by: Kailiang Zhou --- drivers/common/virtio/virtio_admin.h | 24 ++++++++++++------------ drivers/common/virtio/virtqueue.h | 13 +++++++++++++ drivers/common/virtio_mi/lm.c | 11 ++++++++++- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/drivers/common/virtio/virtio_admin.h b/drivers/common/virtio/virtio_admin.h index 36891484d57..9dfabf05554 100644 --- a/drivers/common/virtio/virtio_admin.h +++ b/drivers/common/virtio/virtio_admin.h @@ -94,21 +94,21 @@ struct virtio_admin_hdr { typedef uint8_t virtio_admin_status; -/* status values that are transport, device and vendor independent */ -#define VIRTIO_ADMIN_STATUS_COMMON_START 0 -#define VIRTIO_ADMIN_STATUS_COMMON_END 63 +/* Status Code (SC) that are transport, device and vendor independent */ +#define VIRTIO_ADMIN_STATUS_COMMON_START 0 +#define VIRTIO_ADMIN_STATUS_COMMON_END 31 -/* status values that are transport specific */ -#define VIRTIO_ADMIN_STATUS_TRANSPORT_START 64 -#define VIRTIO_ADMIN_STATUS_TRANSPORT_END 127 +/* Status Code (SC) that are transport specific */ +#define VIRTIO_ADMIN_STATUS_TRANSPORT_START 32 +#define VIRTIO_ADMIN_STATUS_TRANSPORT_END 63 -/* status values that are device specific */ -#define VIRTIO_ADMIN_STATUS_DEVICE_START 128 -#define VIRTIO_ADMIN_STATUS_DEVICE_END 191 +/* Status Code (SC) that are device specific */ +#define VIRTIO_ADMIN_STATUS_DEVICE_START 64 +#define VIRTIO_ADMIN_STATUS_DEVICE_END 95 -/* status values that are reserved */ -#define VIRTIO_ADMIN_STATUS_RESERVED_START 192 -#define VIRTIO_ADMIN_STATUS_RESERVED_END 255 +/* Status Code (SC) that are reserved */ +#define VIRTIO_ADMIN_STATUS_RESERVED_START 96 +#define VIRTIO_ADMIN_STATUS_RESERVED_END 127 /* Common status values */ #define VIRTIO_ADMIN_STATUS_COMMON_OK 0 diff --git a/drivers/common/virtio/virtqueue.h b/drivers/common/virtio/virtqueue.h index d634d189107..6db8be4fe2b 100644 --- a/drivers/common/virtio/virtqueue.h +++ b/drivers/common/virtio/virtqueue.h @@ -231,6 +231,19 @@ struct virtio_admin_ctrl_hdr { uint8_t cmd; } __rte_packed; +#define VIRTIO_ADMIN_CMD_RETRY_CNT 120 +#define VIRTIO_ADMIN_CMD_STATUS_DNR_BIT 0x80 + +/* + * Bits (6:0) - Status Code (SC) + * Indicate status information for the command + * + * Bit (7) - Do Not Retry (DNR) + * If set to 1, indicates that if the same command is submitted + * again - it is expected to fail. + * If cleared to 0, indicates that the same command is submitted + * again may succeed. + */ typedef uint8_t virtio_admin_ctrl_ack; #define VIRTIO_MAX_ADMIN_DATA 2048 diff --git a/drivers/common/virtio_mi/lm.c b/drivers/common/virtio_mi/lm.c index 3ed081a802c..de23c5f4f83 100644 --- a/drivers/common/virtio_mi/lm.c +++ b/drivers/common/virtio_mi/lm.c @@ -185,6 +185,7 @@ virtio_vdpa_send_admin_command(struct virtadmin_ctl *avq, virtio_admin_ctrl_ack status = ~0; struct virtio_admin_ctrl *result; struct virtqueue *vq; + int i; if (!avq) { DRV_LOG(ERR, "Admin queue is not supported"); @@ -202,8 +203,16 @@ virtio_vdpa_send_admin_command(struct virtadmin_ctl *avq, return -1; } - result = virtio_vdpa_send_admin_command_split(avq, ctrl, dat_ctrl, + for (i = 0; i < VIRTIO_ADMIN_CMD_RETRY_CNT; i++) { + result = virtio_vdpa_send_admin_command_split(avq, ctrl, dat_ctrl, dlen, pkt_num); + if(result->status && (!(result->status & VIRTIO_ADMIN_CMD_STATUS_DNR_BIT))) { + DRV_LOG(DEBUG, "No:%d cmd status:0x%x, submit again after 100ms", i, result->status); + usleep(100000); + } + else + break; + } return result->status; }