> -----Original Message----- > From: Rybalchenko, Kirill > Sent: Friday, December 1, 2017 11:27 PM > To: dev@dpdk.org > Cc: Rybalchenko, Kirill <kirill.rybalche...@intel.com>; Chilikin, Andrey > <andrey.chili...@intel.com>; Xing, Beilei <beilei.x...@intel.com>; Wu, > Jingjing <jingjing...@intel.com> > Subject: [PATCH] net/i40e: do not turn on flexible payload on driver init > > Function i40e_GLQF_reg_init() overwrites global register for flexible payload, > forcing extraction of first 16 bytes of > L2/L3/L4 payload to the field vector even if flexible payload is not used by > an > application. Such unconditional turn on of flexible payload effectively > disables ability to use outer IP Destination address for RSS/FDIR for > tunnelled > packets, as flexible payload overwrites outer IP destination address on the > field vector. > > Now flexible payload turned on only when flow director is enabled and > configured. > > v1: > Global registers will be set only when payload is enabled. > They will be reset if payload is disabled or on port reset (uninit). > > Signed-off-by: Kirill Rybalchenko <kirill.rybalche...@intel.com> > --- > drivers/net/i40e/i40e_ethdev.c | 32 +++++++++++++++++++++----------- > drivers/net/i40e/i40e_ethdev.h | 1 + > drivers/net/i40e/i40e_fdir.c | 1 + > 3 files changed, 23 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c > index 811cc9f..d6a207f 100644 > --- a/drivers/net/i40e/i40e_ethdev.c > +++ b/drivers/net/i40e/i40e_ethdev.c > @@ -701,17 +701,6 @@ RTE_PMD_REGISTER_KMOD_DEP(net_i40e, "* > igb_uio | uio_pci_generic | vfio-pci"); static inline void > i40e_GLQF_reg_init(struct i40e_hw *hw) { > /* > - * Force global configuration for flexible payload > - * to the first 16 bytes of the corresponding L2/L3/L4 paylod. > - * This should be removed from code once proper > - * configuration API is added to avoid configuration conflicts > - * between ports of the same device. > - */ > - I40E_WRITE_REG(hw, I40E_GLQF_ORT(33), 0x000000E0); > - I40E_WRITE_REG(hw, I40E_GLQF_ORT(34), 0x000000E3); > - I40E_WRITE_REG(hw, I40E_GLQF_ORT(35), 0x000000E6); > - > - /* > * Initialize registers for parsing packet type of QinQ > * This should be removed from code once proper > * configuration API is added to avoid configuration conflicts @@ - > 1435,6 +1424,24 @@ i40e_rm_fdir_filter_list(struct i40e_pf *pf) > } > } > > +void i40e_flex_payload_reg_cfg(struct i40e_hw *hw, bool enable) { > + if (enable) { > + /* > + * Set global configuration for flexible payload > + * to the first 16 bytes of the corresponding L2/L3/L4 paylod. > + */ > + I40E_WRITE_REG(hw, I40E_GLQF_ORT(33), 0x000000E0); > + I40E_WRITE_REG(hw, I40E_GLQF_ORT(34), 0x000000E3); > + I40E_WRITE_REG(hw, I40E_GLQF_ORT(35), 0x000000E6); > + } else { > + /* Disable flexible payload in global configuration */ > + I40E_WRITE_REG(hw, I40E_GLQF_ORT(33), 0x00000000); > + I40E_WRITE_REG(hw, I40E_GLQF_ORT(34), 0x00000000); > + I40E_WRITE_REG(hw, I40E_GLQF_ORT(35), 0x00000000);
I'm not sure if 0 is the default value for the three registers, just remind to check the value in FW first. > + } > +} > + > static int > eth_i40e_dev_uninit(struct rte_eth_dev *dev) { @@ -1478,6 +1485,9 @@ > eth_i40e_dev_uninit(struct rte_eth_dev *dev) > hw->fc.requested_mode = I40E_FC_NONE; > i40e_set_fc(hw, &aq_fail, TRUE); > > + /* Disable flexible payload in global configuration */ > + i40e_flex_payload_reg_cfg(hw, false); > + How about moving it to dev_close and also adding disable flexible payload in dev_init function? Guarantee flexible payload is disabled during the next launch if application quits in unexpected way. > /* uninitialize pf host driver */ > i40e_pf_host_uninit(dev); > > diff --git a/drivers/net/i40e/i40e_ethdev.h > b/drivers/net/i40e/i40e_ethdev.h index cd67453..2cbe9cb 100644 > --- a/drivers/net/i40e/i40e_ethdev.h > +++ b/drivers/net/i40e/i40e_ethdev.h > @@ -1198,6 +1198,7 @@ int i40e_dcb_init_configure(struct rte_eth_dev > *dev, bool sw_dcb); int i40e_flush_queue_region_all_conf(struct > rte_eth_dev *dev, > struct i40e_hw *hw, struct i40e_pf *pf, uint16_t on); void > i40e_init_queue_region_conf(struct rte_eth_dev *dev); > +void i40e_flex_payload_reg_cfg(struct i40e_hw *hw, bool enable); > > #define I40E_DEV_TO_PCI(eth_dev) \ > RTE_DEV_TO_PCI((eth_dev)->device) > diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c index > 3d7170d..0ae8fbd 100644 > --- a/drivers/net/i40e/i40e_fdir.c > +++ b/drivers/net/i40e/i40e_fdir.c > @@ -671,6 +671,7 @@ i40e_fdir_configure(struct rte_eth_dev *dev) > return -EINVAL; > } > /* configure flex payload */ > + i40e_flex_payload_reg_cfg(hw, !!conf->nb_payloads); > for (i = 0; i < conf->nb_payloads; i++) > i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]); > /* configure flex mask*/ > -- > 2.5.5