Hi Xiao, > -----Original Message----- > From: Wang, Xiao W > Sent: Monday, February 15, 2016 4:10 PM > To: Lu, Wenzhuo; dev at dpdk.org > Subject: RE: [dpdk-dev] [PATCH v2] ixgbe: support multicast promiscuous mode > on VF > > 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. Thanks for the comment. But actually PF writes 16 words into the mbx, and 2 words have meaning. Word0 is used to check ack/nack. PF uses word1 to write the xcast_mode back. I don't check the word1 because I don't see the necessary:)
> > > + if (err) > > + return err;