Hi, Best Regards, Wang, Xiao
> -----Original Message----- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Wenzhuo Lu > Sent: Sunday, February 14, 2016 2:25 PM > To: dev at dpdk.org > Subject: [dpdk-dev] [PATCH v2] ixgbe: support multicast promiscuous mode on > VF > > Add multicast promiscuous mode support on ixgbe VF driver. > > Please note if we want to use this promiscuous mode, we need both PF and VF > driver to support it. The reason is this VF feature is configged on PF. > If use kernel PF driver + dpdk VF driver, make sure kernel PF driver support > VF > multicast promiscuous mode. If use dpdk PF + dpdk VF, better make sure PF > driver is the same version as VF. > > V2: > Update release note. Maybe it's better to put change log below the "---" > > Signed-off-by: Wenzhuo Lu <wenzhuo.lu at intel.com> > Acked-by: Shaopeng He <shaopeng.he at intel.com> > --- > doc/guides/rel_notes/release_16_04.rst | 11 ++++++ > drivers/net/ixgbe/base/ixgbe_mbx.h | 4 +++ > drivers/net/ixgbe/ixgbe_ethdev.c | 66 > ++++++++++++++++++++++++++++++++++ > drivers/net/ixgbe/ixgbe_pf.c | 65 > +++++++++++++++++++++++++++++++++ > 4 files changed, 146 insertions(+) > > diff --git a/doc/guides/rel_notes/release_16_04.rst > b/doc/guides/rel_notes/release_16_04.rst > index 27fc624..e71d316 100644 > --- a/doc/guides/rel_notes/release_16_04.rst > +++ b/doc/guides/rel_notes/release_16_04.rst > @@ -39,6 +39,17 @@ This section should contain new features added in this > release. Sample format: > > Enabled virtio 1.0 support for virtio pmd driver. > > +* **Added multicast promiscuous mode support on VF for ixgbe.** > + > + Added multicast promiscuous mode support on ixgbe VF driver. So all > + the VFs can receive the multicast packets. > + > + Please note if we want to use this promiscuous mode, we need both PF > + and VF driver to support it. The reason is this VF feature is configged on > PF. > + If use kernel PF driver + dpdk VF driver, make sure kernel PF driver > + support VF multicast promiscuous mode. If use dpdk PF + dpdk VF, > + better make sure PF driver is the same version as VF. > + > > Resolved Issues > --------------- > diff --git a/drivers/net/ixgbe/base/ixgbe_mbx.h > b/drivers/net/ixgbe/base/ixgbe_mbx.h > index 445df10..4a120a3 100644 > --- a/drivers/net/ixgbe/base/ixgbe_mbx.h > +++ b/drivers/net/ixgbe/base/ixgbe_mbx.h > @@ -89,6 +89,7 @@ enum ixgbe_pfvf_api_rev { > ixgbe_mbox_api_10, /* API version 1.0, linux/freebsd VF driver */ > ixgbe_mbox_api_20, /* API version 2.0, solaris Phase1 VF driver */ > ixgbe_mbox_api_11, /* API version 1.1, linux/freebsd VF driver */ > + ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */ > /* This value should always be last */ > ixgbe_mbox_api_unknown, /* indicates that API version is not > known */ > }; > @@ -107,6 +108,9 @@ enum ixgbe_pfvf_api_rev { > /* mailbox API, version 1.1 VF requests */ > #define IXGBE_VF_GET_QUEUES 0x09 /* get queue configuration */ > > +/* mailbox API, version 1.2 VF requests */ > +#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 */ > #define IXGBE_VF_RX_QUEUES 2 /* number of Rx queues supported */ > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c > b/drivers/net/ixgbe/ixgbe_ethdev.c > index 3e6fe86..82ba755 100644 > --- a/drivers/net/ixgbe/ixgbe_ethdev.c > +++ b/drivers/net/ixgbe/ixgbe_ethdev.c > @@ -138,6 +138,12 @@ > > #define IXGBE_CYCLECOUNTER_MASK 0xffffffffffffffffULL > > +enum ixgbevf_xcast_modes { > + IXGBEVF_XCAST_MODE_NONE = 0, > + IXGBEVF_XCAST_MODE_MULTI, > + IXGBEVF_XCAST_MODE_ALLMULTI, > +}; > + > static int eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev); static int > eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev); static int > ixgbe_dev_configure(struct rte_eth_dev *dev); @@ -237,6 +243,8 @@ static > int ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, static void > ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction, > uint8_t queue, uint8_t msix_vector); static > void ixgbevf_configure_msix(struct rte_eth_dev *dev); > +static void ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev); > +static void ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev); > > /* For Eth VMDQ APIs support */ > static int ixgbe_uc_hash_table_set(struct rte_eth_dev *dev, struct @@ -511,6 > +519,8 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = { > .stats_reset = ixgbevf_dev_stats_reset, > .xstats_reset = ixgbevf_dev_stats_reset, > .dev_close = ixgbevf_dev_close, > + .allmulticast_enable = ixgbevf_dev_allmulticast_enable, > + .allmulticast_disable = ixgbevf_dev_allmulticast_disable, > .dev_infos_get = ixgbevf_dev_info_get, > .mtu_set = ixgbevf_dev_set_mtu, > .vlan_filter_set = ixgbevf_vlan_filter_set, > @@ -1224,6 +1234,7 @@ ixgbevf_negotiate_api(struct ixgbe_hw *hw) > > /* start with highest supported, proceed down */ > static const enum ixgbe_pfvf_api_rev sup_ver[] = { > + ixgbe_mbox_api_12, > ixgbe_mbox_api_11, > ixgbe_mbox_api_10, > }; > @@ -6191,6 +6202,61 @@ ixgbe_dev_get_dcb_info(struct rte_eth_dev *dev, > return 0; > } > > +/* 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); Is it more reasonable to read a message of size 1 than 2? Pf side only write 1 word into mbx. > + if (err) > + return err;