[dpdk-dev,05/39] net/ixgbe/base: support VF multicast promiscuous
Commit Message
Currently, VF is limited to 30 multicast addresses. In order to
accommodate more addresses, this patch adds support for VF multicast
promiscuous.
Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
---
drivers/net/ixgbe/base/ixgbe_mbx.h | 2 +-
drivers/net/ixgbe/base/ixgbe_type.h | 1 +
drivers/net/ixgbe/base/ixgbe_vf.c | 38 ++++++++++++++++++++++++++++++++
drivers/net/ixgbe/base/ixgbe_vf.h | 1 +
drivers/net/ixgbe/ixgbe_ethdev.c | 43 ++-----------------------------------
5 files changed, 43 insertions(+), 42 deletions(-)
Comments
On 8/27/2016 4:47 PM, Xiao Wang wrote:
> Currently, VF is limited to 30 multicast addresses. In order to
> accommodate more addresses, this patch adds support for VF multicast
> promiscuous.
It looks like functionality not changed, just
ixgbevf_update_xcast_mode() moved to ixgbe_mac_operations struct.
Is 30 multicast address limitation remains with this patch?
>
> Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
> ---
> drivers/net/ixgbe/base/ixgbe_mbx.h | 2 +-
> drivers/net/ixgbe/base/ixgbe_type.h | 1 +
> drivers/net/ixgbe/base/ixgbe_vf.c | 38 ++++++++++++++++++++++++++++++++
> drivers/net/ixgbe/base/ixgbe_vf.h | 1 +
> drivers/net/ixgbe/ixgbe_ethdev.c | 43 ++-----------------------------------
> 5 files changed, 43 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/net/ixgbe/base/ixgbe_mbx.h b/drivers/net/ixgbe/base/ixgbe_mbx.h
> index d775142..c3e301f 100644
> --- a/drivers/net/ixgbe/base/ixgbe_mbx.h
> +++ b/drivers/net/ixgbe/base/ixgbe_mbx.h
> @@ -111,7 +111,7 @@ enum ixgbe_pfvf_api_rev {
> /* mailbox API, version 1.2 VF requests */
> #define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */
> #define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS key */
> -#define IXGBE_VF_UPDATE_XCAST_MODE 0x0C
> +#define IXGBE_VF_UPDATE_XCAST_MODE 0x0c
>
> /* GET_QUEUES return data indices within the mailbox */
> #define IXGBE_VF_TX_QUEUES 1 /* number of Tx queues supported */
> diff --git a/drivers/net/ixgbe/base/ixgbe_type.h b/drivers/net/ixgbe/base/ixgbe_type.h
> index b2fdfcd..96b5cbd 100644
> --- a/drivers/net/ixgbe/base/ixgbe_type.h
> +++ b/drivers/net/ixgbe/base/ixgbe_type.h
> @@ -3883,6 +3883,7 @@ struct ixgbe_mac_operations {
> s32 (*init_uta_tables)(struct ixgbe_hw *);
> void (*set_mac_anti_spoofing)(struct ixgbe_hw *, bool, int);
> void (*set_vlan_anti_spoofing)(struct ixgbe_hw *, bool, int);
> + s32 (*update_xcast_mode)(struct ixgbe_hw *, int);
>
> /* Flow Control */
> s32 (*fc_enable)(struct ixgbe_hw *);
> diff --git a/drivers/net/ixgbe/base/ixgbe_vf.c b/drivers/net/ixgbe/base/ixgbe_vf.c
> index a75074a..20a739c 100644
> --- a/drivers/net/ixgbe/base/ixgbe_vf.c
> +++ b/drivers/net/ixgbe/base/ixgbe_vf.c
> @@ -75,6 +75,7 @@ s32 ixgbe_init_ops_vf(struct ixgbe_hw *hw)
> hw->mac.ops.set_uc_addr = ixgbevf_set_uc_addr_vf;
> hw->mac.ops.init_rx_addrs = NULL;
> hw->mac.ops.update_mc_addr_list = ixgbe_update_mc_addr_list_vf;
> + hw->mac.ops.update_xcast_mode = ixgbevf_update_xcast_mode;
> hw->mac.ops.enable_mc = NULL;
> hw->mac.ops.disable_mc = NULL;
> hw->mac.ops.clear_vfta = NULL;
> @@ -419,6 +420,43 @@ s32 ixgbe_update_mc_addr_list_vf(struct ixgbe_hw *hw, u8 *mc_addr_list,
> }
>
> /**
> + * ixgbevf_update_xcast_mode - Update Multicast mode
> + * @hw: pointer to the HW structure
> + * @xcast_mode: new multicast mode
> + *
> + * Updates the Multicast Mode of VF.
> + **/
> +s32 ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode)
> +{
> + struct ixgbe_mbx_info *mbx = &hw->mbx;
> + u32 msgbuf[2];
> + s32 err;
> +
> + switch (hw->api_version) {
> + case ixgbe_mbox_api_12:
> + break;
> + default:
> + return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
> + }
> +
> + msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE;
> + msgbuf[1] = xcast_mode;
> +
> + err = mbx->ops.write_posted(hw, msgbuf, 2, 0);
> + if (err)
> + return err;
> +
> + err = mbx->ops.read_posted(hw, msgbuf, 2, 0);
> + if (err)
> + return err;
> +
> + msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
> + if (msgbuf[0] == (IXGBE_VF_UPDATE_XCAST_MODE | IXGBE_VT_MSGTYPE_NACK))
What if other flags set in msgbuf[0]
Please check 18/39 patch, which fixes something similar to this
> + return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
> + return IXGBE_SUCCESS;
> +}
> +
> +/**
> * ixgbe_set_vfta_vf - Set/Unset vlan filter table address
> * @hw: pointer to the HW structure
> * @vlan: 12 bit VLAN ID
> diff --git a/drivers/net/ixgbe/base/ixgbe_vf.h b/drivers/net/ixgbe/base/ixgbe_vf.h
> index 8851cb8..624a97d 100644
> --- a/drivers/net/ixgbe/base/ixgbe_vf.h
> +++ b/drivers/net/ixgbe/base/ixgbe_vf.h
> @@ -131,6 +131,7 @@ s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr);
> s32 ixgbe_update_mc_addr_list_vf(struct ixgbe_hw *hw, u8 *mc_addr_list,
> u32 mc_addr_count, ixgbe_mc_addr_itr,
> bool clear);
> +s32 ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode);
> s32 ixgbe_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind,
> bool vlan_on, bool vlvf_bypass);
> void ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size);
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
> index d478a15..7794960 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -7236,51 +7236,12 @@ ixgbe_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
> return ret;
> }
>
> -/* ixgbevf_update_xcast_mode - Update Multicast mode
> - * @hw: pointer to the HW structure
> - * @netdev: pointer to net device structure
> - * @xcast_mode: new multicast mode
> - *
> - * Updates the Multicast Mode of VF.
> - */
> -static int ixgbevf_update_xcast_mode(struct ixgbe_hw *hw,
> - int xcast_mode)
> -{
> - struct ixgbe_mbx_info *mbx = &hw->mbx;
> - u32 msgbuf[2];
> - s32 err;
> -
> - switch (hw->api_version) {
> - case ixgbe_mbox_api_12:
> - break;
> - default:
> - return -EOPNOTSUPP;
> - }
> -
> - msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE;
> - msgbuf[1] = xcast_mode;
> -
> - err = mbx->ops.write_posted(hw, msgbuf, 2, 0);
> - if (err)
> - return err;
> -
> - err = mbx->ops.read_posted(hw, msgbuf, 2, 0);
> - if (err)
> - return err;
> -
> - msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
> - if (msgbuf[0] == (IXGBE_VF_UPDATE_XCAST_MODE | IXGBE_VT_MSGTYPE_NACK))
> - return -EPERM;
> -
> - return 0;
> -}
> -
> static void
> ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev)
> {
> struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>
> - ixgbevf_update_xcast_mode(hw, IXGBEVF_XCAST_MODE_ALLMULTI);
> + hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_ALLMULTI);
> }
>
> static void
> @@ -7288,7 +7249,7 @@ ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev)
> {
> struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>
> - ixgbevf_update_xcast_mode(hw, IXGBEVF_XCAST_MODE_NONE);
> + hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_NONE);
> }
>
> static void ixgbevf_mbx_process(struct rte_eth_dev *dev)
>
Hi Ferruh,
> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Tuesday, September 20, 2016 1:06 AM
> To: Wang, Xiao W <xiao.w.wang@intel.com>; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 05/39] net/ixgbe/base: support VF multicast
> promiscuous
>
> On 8/27/2016 4:47 PM, Xiao Wang wrote:
> > Currently, VF is limited to 30 multicast addresses. In order to
> > accommodate more addresses, this patch adds support for VF multicast
> > promiscuous.
>
> It looks like functionality not changed, just
> ixgbevf_update_xcast_mode() moved to ixgbe_mac_operations struct.
>
> Is 30 multicast address limitation remains with this patch?
>
You're right, we have supported this feature in ixgbe_ethdev.c before, now shared
code supports it, so it looks like just a function movement patch.
I will rewrite the commit log to avoid misunderstanding.
> >
> > Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
> > ---
> > drivers/net/ixgbe/base/ixgbe_mbx.h | 2 +-
> > drivers/net/ixgbe/base/ixgbe_type.h | 1 +
> > drivers/net/ixgbe/base/ixgbe_vf.c | 38
> ++++++++++++++++++++++++++++++++
> > drivers/net/ixgbe/base/ixgbe_vf.h | 1 +
> > drivers/net/ixgbe/ixgbe_ethdev.c | 43 ++-----------------------------------
> > 5 files changed, 43 insertions(+), 42 deletions(-)
> >
> > diff --git a/drivers/net/ixgbe/base/ixgbe_mbx.h
> b/drivers/net/ixgbe/base/ixgbe_mbx.h
> > index d775142..c3e301f 100644
> > --- a/drivers/net/ixgbe/base/ixgbe_mbx.h
> > +++ b/drivers/net/ixgbe/base/ixgbe_mbx.h
> > @@ -111,7 +111,7 @@ enum ixgbe_pfvf_api_rev {
> > /* mailbox API, version 1.2 VF requests */
> > #define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */
> > #define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS key */
> > -#define IXGBE_VF_UPDATE_XCAST_MODE 0x0C
> > +#define IXGBE_VF_UPDATE_XCAST_MODE 0x0c
> >
> > /* GET_QUEUES return data indices within the mailbox */
> > #define IXGBE_VF_TX_QUEUES 1 /* number of Tx queues
> supported */
> > diff --git a/drivers/net/ixgbe/base/ixgbe_type.h
> b/drivers/net/ixgbe/base/ixgbe_type.h
> > index b2fdfcd..96b5cbd 100644
> > --- a/drivers/net/ixgbe/base/ixgbe_type.h
> > +++ b/drivers/net/ixgbe/base/ixgbe_type.h
> > @@ -3883,6 +3883,7 @@ struct ixgbe_mac_operations {
> > s32 (*init_uta_tables)(struct ixgbe_hw *);
> > void (*set_mac_anti_spoofing)(struct ixgbe_hw *, bool, int);
> > void (*set_vlan_anti_spoofing)(struct ixgbe_hw *, bool, int);
> > + s32 (*update_xcast_mode)(struct ixgbe_hw *, int);
> >
> > /* Flow Control */
> > s32 (*fc_enable)(struct ixgbe_hw *);
> > diff --git a/drivers/net/ixgbe/base/ixgbe_vf.c
> b/drivers/net/ixgbe/base/ixgbe_vf.c
> > index a75074a..20a739c 100644
> > --- a/drivers/net/ixgbe/base/ixgbe_vf.c
> > +++ b/drivers/net/ixgbe/base/ixgbe_vf.c
> > @@ -75,6 +75,7 @@ s32 ixgbe_init_ops_vf(struct ixgbe_hw *hw)
> > hw->mac.ops.set_uc_addr = ixgbevf_set_uc_addr_vf;
> > hw->mac.ops.init_rx_addrs = NULL;
> > hw->mac.ops.update_mc_addr_list = ixgbe_update_mc_addr_list_vf;
> > + hw->mac.ops.update_xcast_mode = ixgbevf_update_xcast_mode;
> > hw->mac.ops.enable_mc = NULL;
> > hw->mac.ops.disable_mc = NULL;
> > hw->mac.ops.clear_vfta = NULL;
> > @@ -419,6 +420,43 @@ s32 ixgbe_update_mc_addr_list_vf(struct ixgbe_hw
> *hw, u8 *mc_addr_list,
> > }
> >
> > /**
> > + * ixgbevf_update_xcast_mode - Update Multicast mode
> > + * @hw: pointer to the HW structure
> > + * @xcast_mode: new multicast mode
> > + *
> > + * Updates the Multicast Mode of VF.
> > + **/
> > +s32 ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode)
> > +{
> > + struct ixgbe_mbx_info *mbx = &hw->mbx;
> > + u32 msgbuf[2];
> > + s32 err;
> > +
> > + switch (hw->api_version) {
> > + case ixgbe_mbox_api_12:
> > + break;
> > + default:
> > + return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
> > + }
> > +
> > + msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE;
> > + msgbuf[1] = xcast_mode;
> > +
> > + err = mbx->ops.write_posted(hw, msgbuf, 2, 0);
> > + if (err)
> > + return err;
> > +
> > + err = mbx->ops.read_posted(hw, msgbuf, 2, 0);
> > + if (err)
> > + return err;
> > +
> > + msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
> > + if (msgbuf[0] == (IXGBE_VF_UPDATE_XCAST_MODE |
> IXGBE_VT_MSGTYPE_NACK))
>
> What if other flags set in msgbuf[0]
> Please check 18/39 patch, which fixes something similar to this
>
This condition should be as (msgbuf[0] == original value of msgbuf[0] | NACK ),
It's what the 18/39 patch fixes. No such issue for this function.
Thanks,
Xiao
>
> > + return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
> > + return IXGBE_SUCCESS;
> > +}
> > +
@@ -111,7 +111,7 @@ enum ixgbe_pfvf_api_rev {
/* mailbox API, version 1.2 VF requests */
#define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */
#define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS key */
-#define IXGBE_VF_UPDATE_XCAST_MODE 0x0C
+#define IXGBE_VF_UPDATE_XCAST_MODE 0x0c
/* GET_QUEUES return data indices within the mailbox */
#define IXGBE_VF_TX_QUEUES 1 /* number of Tx queues supported */
@@ -3883,6 +3883,7 @@ struct ixgbe_mac_operations {
s32 (*init_uta_tables)(struct ixgbe_hw *);
void (*set_mac_anti_spoofing)(struct ixgbe_hw *, bool, int);
void (*set_vlan_anti_spoofing)(struct ixgbe_hw *, bool, int);
+ s32 (*update_xcast_mode)(struct ixgbe_hw *, int);
/* Flow Control */
s32 (*fc_enable)(struct ixgbe_hw *);
@@ -75,6 +75,7 @@ s32 ixgbe_init_ops_vf(struct ixgbe_hw *hw)
hw->mac.ops.set_uc_addr = ixgbevf_set_uc_addr_vf;
hw->mac.ops.init_rx_addrs = NULL;
hw->mac.ops.update_mc_addr_list = ixgbe_update_mc_addr_list_vf;
+ hw->mac.ops.update_xcast_mode = ixgbevf_update_xcast_mode;
hw->mac.ops.enable_mc = NULL;
hw->mac.ops.disable_mc = NULL;
hw->mac.ops.clear_vfta = NULL;
@@ -419,6 +420,43 @@ s32 ixgbe_update_mc_addr_list_vf(struct ixgbe_hw *hw, u8 *mc_addr_list,
}
/**
+ * ixgbevf_update_xcast_mode - Update Multicast mode
+ * @hw: pointer to the HW structure
+ * @xcast_mode: new multicast mode
+ *
+ * Updates the Multicast Mode of VF.
+ **/
+s32 ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode)
+{
+ struct ixgbe_mbx_info *mbx = &hw->mbx;
+ u32 msgbuf[2];
+ s32 err;
+
+ switch (hw->api_version) {
+ case ixgbe_mbox_api_12:
+ break;
+ default:
+ return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
+ }
+
+ msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE;
+ msgbuf[1] = xcast_mode;
+
+ err = mbx->ops.write_posted(hw, msgbuf, 2, 0);
+ if (err)
+ return err;
+
+ err = mbx->ops.read_posted(hw, msgbuf, 2, 0);
+ if (err)
+ return err;
+
+ msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
+ if (msgbuf[0] == (IXGBE_VF_UPDATE_XCAST_MODE | IXGBE_VT_MSGTYPE_NACK))
+ return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
+ return IXGBE_SUCCESS;
+}
+
+/**
* ixgbe_set_vfta_vf - Set/Unset vlan filter table address
* @hw: pointer to the HW structure
* @vlan: 12 bit VLAN ID
@@ -131,6 +131,7 @@ s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr);
s32 ixgbe_update_mc_addr_list_vf(struct ixgbe_hw *hw, u8 *mc_addr_list,
u32 mc_addr_count, ixgbe_mc_addr_itr,
bool clear);
+s32 ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode);
s32 ixgbe_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind,
bool vlan_on, bool vlvf_bypass);
void ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size);
@@ -7236,51 +7236,12 @@ ixgbe_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
return ret;
}
-/* ixgbevf_update_xcast_mode - Update Multicast mode
- * @hw: pointer to the HW structure
- * @netdev: pointer to net device structure
- * @xcast_mode: new multicast mode
- *
- * Updates the Multicast Mode of VF.
- */
-static int ixgbevf_update_xcast_mode(struct ixgbe_hw *hw,
- int xcast_mode)
-{
- struct ixgbe_mbx_info *mbx = &hw->mbx;
- u32 msgbuf[2];
- s32 err;
-
- switch (hw->api_version) {
- case ixgbe_mbox_api_12:
- break;
- default:
- return -EOPNOTSUPP;
- }
-
- msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE;
- msgbuf[1] = xcast_mode;
-
- err = mbx->ops.write_posted(hw, msgbuf, 2, 0);
- if (err)
- return err;
-
- err = mbx->ops.read_posted(hw, msgbuf, 2, 0);
- if (err)
- return err;
-
- msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
- if (msgbuf[0] == (IXGBE_VF_UPDATE_XCAST_MODE | IXGBE_VT_MSGTYPE_NACK))
- return -EPERM;
-
- return 0;
-}
-
static void
ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev)
{
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
- ixgbevf_update_xcast_mode(hw, IXGBEVF_XCAST_MODE_ALLMULTI);
+ hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_ALLMULTI);
}
static void
@@ -7288,7 +7249,7 @@ ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev)
{
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
- ixgbevf_update_xcast_mode(hw, IXGBEVF_XCAST_MODE_NONE);
+ hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_NONE);
}
static void ixgbevf_mbx_process(struct rte_eth_dev *dev)