[dpdk-dev] [PATCH v2 1/2] i40evf: allocate virtchnl cmd buffer for each vf

2016-02-22 Thread Zhang, Helin


> -Original Message-
> From: Wu, Jingjing
> Sent: Wednesday, January 27, 2016 9:50 AM
> To: dev at dpdk.org
> Cc: Wu, Jingjing; Zhang, Helin; Lu, Wenzhuo; Pei, Yulong
> Subject: [PATCH v2 1/2] i40evf: allocate virtchnl cmd buffer for each vf
> 
> 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 | 181 +++---
> 
>  2 files changed, 74 insertions(+), 109 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev.h
> b/drivers/net/i40e/i40e_ethdev.h index 1f9792b..93122ad 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 14d2a50..64e6957 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,39 @@
> 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_NON;
No need to assign I40EVF_MSG_NON, as it was initialized at first.

> + else
> + 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 +291,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 

[dpdk-dev] [PATCH v2 1/2] i40evf: allocate virtchnl cmd buffer for each vf

2016-02-14 Thread Wu, Jingjing


> -Original Message-
> From: Tao, Zhe
> Sent: Friday, January 29, 2016 3:28 PM
> To: Wu, Jingjing; dev at dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v2 1/2] i40evf: allocate virtchnl cmd buffer
> for each vf
> 
> 
> 
> > -Original Message-
> > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Jingjing Wu
> > Sent: Wednesday, January 27, 2016 9:50 AM
> > To: dev at dpdk.org
> > Subject: [dpdk-dev] [PATCH v2 1/2] i40evf: allocate virtchnl cmd
> > buffer for each vf
> >
> > 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 | 181
> > +++---
> > 
> >  2 files changed, 74 insertions(+), 109 deletions(-)
> >
> > diff --git a/drivers/net/i40e/i40e_ethdev.h
> > b/drivers/net/i40e/i40e_ethdev.h index 1f9792b..93122ad 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 14d2a50..64e6957 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,39 @@
> > 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_NON;
> > +   else
> > +   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;
> > +  

[dpdk-dev] [PATCH v2 1/2] i40evf: allocate virtchnl cmd buffer for each vf

2016-01-29 Thread Tao, Zhe


> -Original Message-
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Jingjing Wu
> Sent: Wednesday, January 27, 2016 9:50 AM
> To: dev at dpdk.org
> Subject: [dpdk-dev] [PATCH v2 1/2] i40evf: allocate virtchnl cmd buffer for
> each vf
> 
> 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 | 181 +++---
> 
>  2 files changed, 74 insertions(+), 109 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev.h
> b/drivers/net/i40e/i40e_ethdev.h index 1f9792b..93122ad 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 14d2a50..64e6957 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,39 @@
> 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_NON;
> + else
> + 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 +291,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-

[dpdk-dev] [PATCH v2 1/2] i40evf: allocate virtchnl cmd buffer for each vf

2016-01-27 Thread Jingjing Wu
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 | 181 +++---
 2 files changed, 74 insertions(+), 109 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index 1f9792b..93122ad 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 14d2a50..64e6957 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,39 @@ 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_NON;
+   else
+   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 +291,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 = 

[dpdk-dev] [PATCH v2 1/2] i40evf: allocate virtchnl cmd buffer for each vf

2016-01-27 Thread Jingjing Wu
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 | 181 +++---
 2 files changed, 74 insertions(+), 109 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index 1f9792b..93122ad 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 14d2a50..64e6957 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,39 @@ 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_NON;
+   else
+   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 +291,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 =