Currently, i40evf PMD uses a global static buffer to send virtchnl
command to host driver. It is shared by multi VFs.
This patch changed to allocate virtchnl cmd buffer for each VF.
Signed-off-by: Jingjing Wu
---
drivers/net/i40e/i40e_ethdev.h| 2 +
drivers/net/i40e/i40e_ethdev_vf.c | 178 +++---
2 files changed, 71 insertions(+), 109 deletions(-)
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index db6173a..93adc49 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -494,7 +494,9 @@ struct i40e_vf {
bool link_up;
bool vf_reset;
volatile uint32_t pend_cmd; /* pending command not finished yet */
+ uint32_t cmd_retval; /* return value of the cmd response from PF */
u16 pend_msg; /* flags indicates events from pf not handled yet */
+ uint8_t *aq_resp; /* buffer to store the adminq response from PF */
/* VSI info */
struct i40e_virtchnl_vf_resource *vf_res; /* All VSIs */
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
b/drivers/net/i40e/i40e_ethdev_vf.c
index 13c5b3d..4b15ed6 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -103,9 +103,6 @@ enum i40evf_aq_result {
I40EVF_MSG_CMD, /* Read async command result */
};
-/* A share buffer to store the command result from PF driver */
-static uint8_t cmd_result_buffer[I40E_AQ_BUF_SZ];
-
static int i40evf_dev_configure(struct rte_eth_dev *dev);
static int i40evf_dev_start(struct rte_eth_dev *dev);
static void i40evf_dev_stop(struct rte_eth_dev *dev);
@@ -237,31 +234,37 @@ i40evf_set_mac_type(struct i40e_hw *hw)
}
/*
- * Parse admin queue message.
- *
- * return value:
- * < 0: meet error
- * 0: read sys msg
- * > 0: read cmd result
+ * Read data in admin queue to get msg from pf driver
*/
static enum i40evf_aq_result
-i40evf_parse_pfmsg(struct i40e_vf *vf,
- struct i40e_arq_event_info *event,
- struct i40evf_arq_msg_info *data)
+i40evf_read_pfmsg(struct rte_eth_dev *dev, struct i40evf_arq_msg_info *data)
{
- enum i40e_virtchnl_ops opcode = (enum i40e_virtchnl_ops)\
- rte_le_to_cpu_32(event->desc.cookie_high);
- enum i40e_status_code retval = (enum i40e_status_code)\
- rte_le_to_cpu_32(event->desc.cookie_low);
- enum i40evf_aq_result ret = I40EVF_MSG_CMD;
+ struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+ struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+ struct i40e_arq_event_info event;
+ enum i40e_virtchnl_ops opcode;
+ enum i40e_status_code retval;
+ int ret;
+ enum i40evf_aq_result result = I40EVF_MSG_NON;
+
+ event.buf_len = data->buf_len;
+ event.msg_buf = data->msg;
+ ret = i40e_clean_arq_element(hw, , NULL);
+ /* Can't read any msg from adminQ */
+ if (ret) {
+ if (ret != I40E_ERR_ADMIN_QUEUE_NO_WORK)
+ result = I40EVF_MSG_ERR;
+ return result;
+ }
+ opcode = (enum
i40e_virtchnl_ops)rte_le_to_cpu_32(event.desc.cookie_high);
+ retval = (enum i40e_status_code)rte_le_to_cpu_32(event.desc.cookie_low);
/* pf sys event */
if (opcode == I40E_VIRTCHNL_OP_EVENT) {
struct i40e_virtchnl_pf_event *vpe =
- (struct i40e_virtchnl_pf_event *)event->msg_buf;
+ (struct i40e_virtchnl_pf_event *)event.msg_buf;
- /* Initialize ret to sys event */
- ret = I40EVF_MSG_SYS;
+ result = I40EVF_MSG_SYS;
switch (vpe->event) {
case I40E_VIRTCHNL_EVENT_LINK_CHANGE:
vf->link_up =
@@ -286,74 +289,17 @@ i40evf_parse_pfmsg(struct i40e_vf *vf,
}
} else {
/* async reply msg on command issued by vf previously */
- ret = I40EVF_MSG_CMD;
+ result = I40EVF_MSG_CMD;
/* Actual data length read from PF */
- data->msg_len = event->msg_len;
+ data->msg_len = event.msg_len;
}
- /* fill the ops and result to notify VF */
+
data->result = retval;
data->ops = opcode;
- return ret;
-}
-
-/*
- * Read data in admin queue to get msg from pf driver
- */
-static enum i40evf_aq_result
-i40evf_read_pfmsg(struct rte_eth_dev *dev, struct i40evf_arq_msg_info *data)
-{
- struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
- struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
- struct i40e_arq_event_info event;
- int ret;
- enum i40evf_aq_result result = I40EVF_MSG_NON;
-
- event.buf_len = data->buf_len;
- event.msg_buf = data->msg;
- ret = i40e_clean_arq_element(hw, , NULL);
- /* Can't read any msg from