diff mbox

[dpdk-dev] i40e: move the fdir_setup from dev_init to dev_configure

Message ID 1417707623-25777-1-git-send-email-jingjing.wu@intel.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Wu, Jingjing Dec. 4, 2014, 3:40 p.m. UTC
In order not to affect the FVL's performance by default setting, this
patch moves the flow director initialization from i40e_pf_setup to
i40e_dev_configure according to the mode in fdir configure info.
Then the resources used for flow director will be only setup if it is enabled.

Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
---
 app/test-pmd/cmdline.c            |  4 +-
 lib/librte_pmd_i40e/i40e_ethdev.c | 49 ++++++++++++-----------
 lib/librte_pmd_i40e/i40e_fdir.c   | 83 ++++++++++++++++++++-------------------
 3 files changed, 72 insertions(+), 64 deletions(-)

Comments

Ananyev, Konstantin Dec. 4, 2014, 8:28 p.m. UTC | #1
> -----Original Message-----
> From: Wu, Jingjing
> Sent: Thursday, December 04, 2014 3:40 PM
> To: dev@dpdk.org
> Cc: Wu, Jingjing; Zhang, Helin; Ananyev, Konstantin
> Subject: [PATCH]i40e: move the fdir_setup from dev_init to dev_configure
> 
> In order not to affect the FVL's performance by default setting, this
> patch moves the flow director initialization from i40e_pf_setup to
> i40e_dev_configure according to the mode in fdir configure info.
> Then the resources used for flow director will be only setup if it is enabled.
> 
> Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
> ---
>  app/test-pmd/cmdline.c            |  4 +-
>  lib/librte_pmd_i40e/i40e_ethdev.c | 49 ++++++++++++-----------
>  lib/librte_pmd_i40e/i40e_fdir.c   | 83 ++++++++++++++++++++-------------------
>  3 files changed, 72 insertions(+), 64 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index c61c3a0..f79ea3e 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -8546,7 +8546,7 @@ cmd_flow_director_flex_mask_parsed(void *parsed_result,
>  	}
>  	flex_mask.flow_type = str2flowtype(res->flow_type);
>  	fdir_set_flex_mask(res->port_id, &flex_mask);
> -	cmd_reconfig_device_queue(res->port_id, 1, 0);
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>  }
> 
>  cmdline_parse_token_string_t cmd_flow_director_flexmask =
> @@ -8667,7 +8667,7 @@ cmd_flow_director_flxpld_parsed(void *parsed_result,
>  	}
> 
>  	fdir_set_flex_payload(res->port_id, &flex_cfg);
> -	cmd_reconfig_device_queue(res->port_id, 1, 0);
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>  }
> 
>  cmdline_parse_token_string_t cmd_flow_director_flexpayload =
> diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c b/lib/librte_pmd_i40e/i40e_ethdev.c
> index 87e750a..002d4a9 100644
> --- a/lib/librte_pmd_i40e/i40e_ethdev.c
> +++ b/lib/librte_pmd_i40e/i40e_ethdev.c
> @@ -546,7 +546,6 @@ eth_i40e_dev_init(__rte_unused struct eth_driver *eth_drv,
>  err_mac_alloc:
>  	i40e_vsi_release(pf->main_vsi);
>  err_setup_pf_switch:
> -	i40e_fdir_teardown(pf);
>  err_get_mac_addr:
>  err_configure_lan_hmc:
>  	(void)i40e_shutdown_lan_hmc(hw);
> @@ -565,8 +564,27 @@ err_get_capabilities:
>  static int
>  i40e_dev_configure(struct rte_eth_dev *dev)
>  {
> -	int ret;
> +	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
>  	enum rte_eth_rx_mq_mode mq_mode = dev->data->dev_conf.rxmode.mq_mode;
> +	int ret;
> +
> +	if (dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) {
> +		ret = i40e_fdir_setup(pf);
> +		if (ret != I40E_SUCCESS) {
> +			PMD_DRV_LOG(ERR, "Failed to setup flow director.");
> +			return -ENOTSUP;
> +		}
> +		ret = i40e_fdir_configure(dev);
> +		if (ret < 0) {
> +			PMD_DRV_LOG(ERR, "failed to configure fdir.");
> +			goto err;
> +		}
> +	} else
> +		i40e_fdir_teardown(pf);
> +
> +	ret = i40e_dev_init_vlan(dev);
> +	if (ret < 0)
> +		goto err;
> 
>  	/* VMDQ setup.
>  	 *  Needs to move VMDQ setting out of i40e_pf_config_mq_rx() as VMDQ and
> @@ -583,10 +601,12 @@ i40e_dev_configure(struct rte_eth_dev *dev)
>  	if (mq_mode & ETH_MQ_RX_VMDQ_FLAG) {
>  		ret = i40e_vmdq_setup(dev);
>  		if (ret)
> -			return ret;
> +			goto err;
>  	}
> -
> -	return i40e_dev_init_vlan(dev);
> +	return 0;
> +err:
> +	i40e_fdir_teardown(pf);
> +	return ret;
>  }
> 
>  void
> @@ -837,14 +857,8 @@ i40e_dev_start(struct rte_eth_dev *dev)
>  		i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi);
>  	}
> 
> -	ret = i40e_fdir_configure(dev);
> -	if (ret < 0) {
> -		PMD_DRV_LOG(ERR, "failed to configure fdir.");
> -		goto err_up;
> -	}
> -
>  	/* enable FDIR MSIX interrupt */
> -	if (pf->flags & I40E_FLAG_FDIR) {
> +	if (pf->fdir.fdir_vsi) {
>  		i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi);
>  		i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi);
>  	}
> @@ -903,7 +917,7 @@ i40e_dev_stop(struct rte_eth_dev *dev)
>  		i40e_vsi_queues_unbind_intr(pf->vmdq[i].vsi);
>  	}
> 
> -	if (pf->flags & I40E_FLAG_FDIR) {
> +	if (pf->fdir.fdir_vsi) {
>  		i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi);
>  		i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi);
>  	}
> @@ -3302,15 +3316,6 @@ i40e_pf_setup(struct i40e_pf *pf)
>  	}
>  	pf->main_vsi = vsi;
> 
> -	/* setup FDIR after main vsi created.*/
> -	if (pf->flags & I40E_FLAG_FDIR) {
> -		ret = i40e_fdir_setup(pf);
> -		if (ret != I40E_SUCCESS) {
> -			PMD_DRV_LOG(ERR, "Failed to setup flow director.");
> -			pf->flags &= ~I40E_FLAG_FDIR;
> -		}
> -	}
> -
>  	/* Configure filter control */
>  	memset(&settings, 0, sizeof(settings));
>  	if (hw->func_caps.rss_table_size == ETH_RSS_RETA_SIZE_128)
> diff --git a/lib/librte_pmd_i40e/i40e_fdir.c b/lib/librte_pmd_i40e/i40e_fdir.c
> index d75b96e..ad38803 100644
> --- a/lib/librte_pmd_i40e/i40e_fdir.c
> +++ b/lib/librte_pmd_i40e/i40e_fdir.c
> @@ -196,6 +196,11 @@ i40e_fdir_setup(struct i40e_pf *pf)
>  	const struct rte_memzone *mz = NULL;
>  	struct rte_eth_dev *eth_dev = pf->adapter->eth_dev;
> 
> +	if ((pf->flags & I40E_FLAG_FDIR) == 0) {
> +		PMD_INIT_LOG(ERR, "HW doesn't support FDIR");
> +		return I40E_NOT_SUPPORTED;
> +	}
> +
>  	PMD_DRV_LOG(INFO, "FDIR HW Capabilities: num_filters_guaranteed = %u,"
>  			" num_filters_best_effort = %u.",
>  			hw->func_caps.fd_filters_guaranteed,
> @@ -203,9 +208,8 @@ i40e_fdir_setup(struct i40e_pf *pf)
> 
>  	vsi = pf->fdir.fdir_vsi;
>  	if (vsi) {
> -		PMD_DRV_LOG(ERR, "FDIR vsi pointer needs "
> -				 "to be null before creation.");
> -		return I40E_ERR_BAD_PTR;
> +		PMD_DRV_LOG(INFO, "FDIR initialization has been done.");
> +		return I40E_SUCCESS;
>  	}
>  	/* make new FDIR VSI */
>  	vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR, pf->main_vsi, 0);
> @@ -302,6 +306,8 @@ i40e_fdir_teardown(struct i40e_pf *pf)
>  	struct i40e_vsi *vsi;
> 
>  	vsi = pf->fdir.fdir_vsi;
> +	if (!vsi)
> +		return;
>  	i40e_switch_tx_queue(hw, vsi->base_queue, FALSE);
>  	i40e_switch_rx_queue(hw, vsi->base_queue, FALSE);
>  	i40e_dev_rx_queue_release(pf->fdir.rxq);
> @@ -653,37 +659,29 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
>  		}
>  	}
> 
> +	/* enable FDIR filter */
>  	val = I40E_READ_REG(hw, I40E_PFQF_CTL_0);
> -	if ((pf->flags & I40E_FLAG_FDIR) &&
> -		dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) {
> -		/* enable FDIR filter */
> -		val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
> -		I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
> +	val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
> +	I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
> 
> -		i40e_init_flx_pld(pf); /* set flex config to default value */
> +	i40e_init_flx_pld(pf); /* set flex config to default value */
> 
> -		conf = &dev->data->dev_conf.fdir_conf.flex_conf;
> -		ret = i40e_check_fdir_flex_conf(conf);
> -		if (ret < 0) {
> -			PMD_DRV_LOG(ERR, " invalid configuration arguments.");
> -			return -EINVAL;
> -		}
> -		/* configure flex payload */
> -		for (i = 0; i < conf->nb_payloads; i++)
> -			i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]);
> -		/* configure flex mask*/
> -		for (i = 0; i < conf->nb_flexmasks; i++) {
> -			pctype = i40e_flowtype_to_pctype(
> -				conf->flex_mask[i].flow_type);
> -			i40e_set_flex_mask_on_pctype(pf,
> -					pctype,
> -					&conf->flex_mask[i]);
> -		}
> -	} else {
> -		/* disable FDIR filter */
> -		val &= ~I40E_PFQF_CTL_0_FD_ENA_MASK;
> -		I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
> -		pf->flags &= ~I40E_FLAG_FDIR;
> +	conf = &dev->data->dev_conf.fdir_conf.flex_conf;
> +	ret = i40e_check_fdir_flex_conf(conf);
> +	if (ret < 0) {
> +		PMD_DRV_LOG(ERR, " invalid configuration arguments.");
> +		return -EINVAL;
> +	}
> +	/* configure flex payload */
> +	for (i = 0; i < conf->nb_payloads; i++)
> +		i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]);
> +	/* configure flex mask*/
> +	for (i = 0; i < conf->nb_flexmasks; i++) {
> +		pctype = i40e_flowtype_to_pctype(
> +			conf->flex_mask[i].flow_type);
> +		i40e_set_flex_mask_on_pctype(pf,
> +				pctype,
> +				&conf->flex_mask[i]);
>  	}
> 
>  	return ret;
> @@ -982,10 +980,12 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
>  	enum i40e_filter_pctype pctype;
>  	int ret = 0;
> 
> -	if (!(pf->flags & I40E_FLAG_FDIR)) {
> -		PMD_DRV_LOG(ERR, "FDIR is not enabled.");
> +	if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT) {
> +		PMD_DRV_LOG(ERR, "FDIR is not enabled, please"
> +			" check the mode in fdir_conf.");
>  		return -ENOTSUP;
>  	}
> +
>  	if (!I40E_VALID_FLOW_TYPE(filter->input.flow_type)) {
>  		PMD_DRV_LOG(ERR, "invalid flow_type input.");
>  		return -EINVAL;
> @@ -1263,8 +1263,11 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
>  	uint16_t num_flex_set = 0;
>  	uint16_t num_flex_mask = 0;
> 
> -	fdir->mode = (pf->flags & I40E_FLAG_FDIR) ?
> -			RTE_FDIR_MODE_PERFECT : RTE_FDIR_MODE_NONE;
> +	if (dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT)
> +		fdir->mode = RTE_FDIR_MODE_PERFECT;
> +	else
> +		fdir->mode = RTE_FDIR_MODE_NONE;
> +
>  	fdir->guarant_spc =
>  		(uint32_t)hw->func_caps.fd_filters_guaranteed;
>  	fdir->best_spc =
> @@ -1324,11 +1327,11 @@ i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
>  	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
>  	int ret = 0;
> 
> -	if (filter_op == RTE_ETH_FILTER_NOP) {
> -		if (!(pf->flags & I40E_FLAG_FDIR))
> -			ret = -ENOTSUP;
> -		return ret;
> -	}
> +	if ((pf->flags & I40E_FLAG_FDIR) == 0)
> +		return -ENOTSUP;
> +
> +	if (filter_op == RTE_ETH_FILTER_NOP)
> +		return 0;
> 
>  	if (arg == NULL && filter_op != RTE_ETH_FILTER_FLUSH)
>  		return -EINVAL;
> --
> 1.8.1.4

Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Helin Zhang Dec. 5, 2014, 12:57 a.m. UTC | #2
> -----Original Message-----
> From: Wu, Jingjing
> Sent: Thursday, December 4, 2014 11:40 PM
> To: dev@dpdk.org
> Cc: Wu, Jingjing; Zhang, Helin; Ananyev, Konstantin
> Subject: [PATCH]i40e: move the fdir_setup from dev_init to dev_configure
> 
> In order not to affect the FVL's performance by default setting, this patch moves
> the flow director initialization from i40e_pf_setup to i40e_dev_configure
> according to the mode in fdir configure info.
> Then the resources used for flow director will be only setup if it is enabled.
> 
> Signed-off-by: jingjing.wu <jingjing.wu@intel.com>

Acked-by: Helin Zhang <helin.zhang@intel.com>

> ---
>  app/test-pmd/cmdline.c            |  4 +-
>  lib/librte_pmd_i40e/i40e_ethdev.c | 49 ++++++++++++-----------
>  lib/librte_pmd_i40e/i40e_fdir.c   | 83
> ++++++++++++++++++++-------------------
>  3 files changed, 72 insertions(+), 64 deletions(-)
Thomas Monjalon Dec. 5, 2014, 4:13 p.m. UTC | #3
> > In order not to affect the FVL's performance by default setting, this patch moves
> > the flow director initialization from i40e_pf_setup to i40e_dev_configure
> > according to the mode in fdir configure info.
> > Then the resources used for flow director will be only setup if it is enabled.
> > 
> > Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
> 
> Acked-by: Helin Zhang <helin.zhang@intel.com>

Applied

A lot of commit titles need rewording. This one is a good example to explain.
We don't need to see the function or structure names in a title.
The global idea is a lot more interesting and easy to read.
Here, I changed
	i40e: move the fdir_setup from dev_init to dev_configure
to
	i40e: setup flow director only if enabled

Thanks
Cao, Min Dec. 26, 2014, 2:15 a.m. UTC | #4
Tested-by: Min Cao <min.cao@intel.com>

Patch name: 		[dpdk-dev] [PATCH]i40e: move the fdir_setup from dev_init to dev_configure
Test Flag: 			Tested-by
Tester name: 		min.cao@intel.com
Result summary:		total 4 cases, 4 passed, 0 failed

Test Case 1:		
Name:				Fortville flow director with no flexible playload(IPv4/IPv6)
Environment:		OS: Fedora20 3.11.10-301.fc20.x86_64
				gcc (GCC) 4.8.2
				CPU: Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
				NIC: Fortville eagle 
Test result:		PASSED

Test Case 2:		
Name:				Fortville flow director with flexible playload(IPv4/IPv6)
Environment:		OS: Fedora20 3.11.10-301.fc20.x86_64
				gcc (GCC) 4.8.2
				CPU: Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
				NIC: Fortville eagle 
Test result:		PASSED

Test Case 3:		
Name:				Fortville flow director flush
Environment:		OS: Fedora20 3.11.10-301.fc20.x86_64
				gcc (GCC) 4.8.2
				CPU: Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
				NIC: Fortville eagle 
Test result:		PASSED

Test Case 4:		
Name:				Fortville flow director performance
Environment:		OS: Fedora20 3.11.10-301.fc20.x86_64
				gcc (GCC) 4.8.2
				CPU: Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
				NIC: Fortville eagle 
Test result:		PASSED



> -----Original Message-----
> From: Wu, Jingjing
> Sent: Thursday, December 04, 2014 3:40 PM
> To: dev@dpdk.org
> Cc: Wu, Jingjing; Zhang, Helin; Ananyev, Konstantin
> Subject: [PATCH]i40e: move the fdir_setup from dev_init to dev_configure
> 
> In order not to affect the FVL's performance by default setting, this
> patch moves the flow director initialization from i40e_pf_setup to
> i40e_dev_configure according to the mode in fdir configure info.
> Then the resources used for flow director will be only setup if it is enabled.
> 
> Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
> ---
>  app/test-pmd/cmdline.c            |  4 +-
>  lib/librte_pmd_i40e/i40e_ethdev.c | 49 ++++++++++++-----------
>  lib/librte_pmd_i40e/i40e_fdir.c   | 83 ++++++++++++++++++++-------------------
>  3 files changed, 72 insertions(+), 64 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index c61c3a0..f79ea3e 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -8546,7 +8546,7 @@ cmd_flow_director_flex_mask_parsed(void *parsed_result,
>  	}
>  	flex_mask.flow_type = str2flowtype(res->flow_type);
>  	fdir_set_flex_mask(res->port_id, &flex_mask);
> -	cmd_reconfig_device_queue(res->port_id, 1, 0);
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>  }
> 
>  cmdline_parse_token_string_t cmd_flow_director_flexmask =
> @@ -8667,7 +8667,7 @@ cmd_flow_director_flxpld_parsed(void *parsed_result,
>  	}
> 
>  	fdir_set_flex_payload(res->port_id, &flex_cfg);
> -	cmd_reconfig_device_queue(res->port_id, 1, 0);
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
>  }
> 
>  cmdline_parse_token_string_t cmd_flow_director_flexpayload =
> diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c b/lib/librte_pmd_i40e/i40e_ethdev.c
> index 87e750a..002d4a9 100644
> --- a/lib/librte_pmd_i40e/i40e_ethdev.c
> +++ b/lib/librte_pmd_i40e/i40e_ethdev.c
> @@ -546,7 +546,6 @@ eth_i40e_dev_init(__rte_unused struct eth_driver *eth_drv,
>  err_mac_alloc:
>  	i40e_vsi_release(pf->main_vsi);
>  err_setup_pf_switch:
> -	i40e_fdir_teardown(pf);
>  err_get_mac_addr:
>  err_configure_lan_hmc:
>  	(void)i40e_shutdown_lan_hmc(hw);
> @@ -565,8 +564,27 @@ err_get_capabilities:
>  static int
>  i40e_dev_configure(struct rte_eth_dev *dev)
>  {
> -	int ret;
> +	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
>  	enum rte_eth_rx_mq_mode mq_mode = dev->data->dev_conf.rxmode.mq_mode;
> +	int ret;
> +
> +	if (dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) {
> +		ret = i40e_fdir_setup(pf);
> +		if (ret != I40E_SUCCESS) {
> +			PMD_DRV_LOG(ERR, "Failed to setup flow director.");
> +			return -ENOTSUP;
> +		}
> +		ret = i40e_fdir_configure(dev);
> +		if (ret < 0) {
> +			PMD_DRV_LOG(ERR, "failed to configure fdir.");
> +			goto err;
> +		}
> +	} else
> +		i40e_fdir_teardown(pf);
> +
> +	ret = i40e_dev_init_vlan(dev);
> +	if (ret < 0)
> +		goto err;
> 
>  	/* VMDQ setup.
>  	 *  Needs to move VMDQ setting out of i40e_pf_config_mq_rx() as VMDQ and
> @@ -583,10 +601,12 @@ i40e_dev_configure(struct rte_eth_dev *dev)
>  	if (mq_mode & ETH_MQ_RX_VMDQ_FLAG) {
>  		ret = i40e_vmdq_setup(dev);
>  		if (ret)
> -			return ret;
> +			goto err;
>  	}
> -
> -	return i40e_dev_init_vlan(dev);
> +	return 0;
> +err:
> +	i40e_fdir_teardown(pf);
> +	return ret;
>  }
> 
>  void
> @@ -837,14 +857,8 @@ i40e_dev_start(struct rte_eth_dev *dev)
>  		i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi);
>  	}
> 
> -	ret = i40e_fdir_configure(dev);
> -	if (ret < 0) {
> -		PMD_DRV_LOG(ERR, "failed to configure fdir.");
> -		goto err_up;
> -	}
> -
>  	/* enable FDIR MSIX interrupt */
> -	if (pf->flags & I40E_FLAG_FDIR) {
> +	if (pf->fdir.fdir_vsi) {
>  		i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi);
>  		i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi);
>  	}
> @@ -903,7 +917,7 @@ i40e_dev_stop(struct rte_eth_dev *dev)
>  		i40e_vsi_queues_unbind_intr(pf->vmdq[i].vsi);
>  	}
> 
> -	if (pf->flags & I40E_FLAG_FDIR) {
> +	if (pf->fdir.fdir_vsi) {
>  		i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi);
>  		i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi);
>  	}
> @@ -3302,15 +3316,6 @@ i40e_pf_setup(struct i40e_pf *pf)
>  	}
>  	pf->main_vsi = vsi;
> 
> -	/* setup FDIR after main vsi created.*/
> -	if (pf->flags & I40E_FLAG_FDIR) {
> -		ret = i40e_fdir_setup(pf);
> -		if (ret != I40E_SUCCESS) {
> -			PMD_DRV_LOG(ERR, "Failed to setup flow director.");
> -			pf->flags &= ~I40E_FLAG_FDIR;
> -		}
> -	}
> -
>  	/* Configure filter control */
>  	memset(&settings, 0, sizeof(settings));
>  	if (hw->func_caps.rss_table_size == ETH_RSS_RETA_SIZE_128)
> diff --git a/lib/librte_pmd_i40e/i40e_fdir.c b/lib/librte_pmd_i40e/i40e_fdir.c
> index d75b96e..ad38803 100644
> --- a/lib/librte_pmd_i40e/i40e_fdir.c
> +++ b/lib/librte_pmd_i40e/i40e_fdir.c
> @@ -196,6 +196,11 @@ i40e_fdir_setup(struct i40e_pf *pf)
>  	const struct rte_memzone *mz = NULL;
>  	struct rte_eth_dev *eth_dev = pf->adapter->eth_dev;
> 
> +	if ((pf->flags & I40E_FLAG_FDIR) == 0) {
> +		PMD_INIT_LOG(ERR, "HW doesn't support FDIR");
> +		return I40E_NOT_SUPPORTED;
> +	}
> +
>  	PMD_DRV_LOG(INFO, "FDIR HW Capabilities: num_filters_guaranteed = %u,"
>  			" num_filters_best_effort = %u.",
>  			hw->func_caps.fd_filters_guaranteed,
> @@ -203,9 +208,8 @@ i40e_fdir_setup(struct i40e_pf *pf)
> 
>  	vsi = pf->fdir.fdir_vsi;
>  	if (vsi) {
> -		PMD_DRV_LOG(ERR, "FDIR vsi pointer needs "
> -				 "to be null before creation.");
> -		return I40E_ERR_BAD_PTR;
> +		PMD_DRV_LOG(INFO, "FDIR initialization has been done.");
> +		return I40E_SUCCESS;
>  	}
>  	/* make new FDIR VSI */
>  	vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR, pf->main_vsi, 0);
> @@ -302,6 +306,8 @@ i40e_fdir_teardown(struct i40e_pf *pf)
>  	struct i40e_vsi *vsi;
> 
>  	vsi = pf->fdir.fdir_vsi;
> +	if (!vsi)
> +		return;
>  	i40e_switch_tx_queue(hw, vsi->base_queue, FALSE);
>  	i40e_switch_rx_queue(hw, vsi->base_queue, FALSE);
>  	i40e_dev_rx_queue_release(pf->fdir.rxq);
> @@ -653,37 +659,29 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
>  		}
>  	}
> 
> +	/* enable FDIR filter */
>  	val = I40E_READ_REG(hw, I40E_PFQF_CTL_0);
> -	if ((pf->flags & I40E_FLAG_FDIR) &&
> -		dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) {
> -		/* enable FDIR filter */
> -		val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
> -		I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
> +	val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
> +	I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
> 
> -		i40e_init_flx_pld(pf); /* set flex config to default value */
> +	i40e_init_flx_pld(pf); /* set flex config to default value */
> 
> -		conf = &dev->data->dev_conf.fdir_conf.flex_conf;
> -		ret = i40e_check_fdir_flex_conf(conf);
> -		if (ret < 0) {
> -			PMD_DRV_LOG(ERR, " invalid configuration arguments.");
> -			return -EINVAL;
> -		}
> -		/* configure flex payload */
> -		for (i = 0; i < conf->nb_payloads; i++)
> -			i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]);
> -		/* configure flex mask*/
> -		for (i = 0; i < conf->nb_flexmasks; i++) {
> -			pctype = i40e_flowtype_to_pctype(
> -				conf->flex_mask[i].flow_type);
> -			i40e_set_flex_mask_on_pctype(pf,
> -					pctype,
> -					&conf->flex_mask[i]);
> -		}
> -	} else {
> -		/* disable FDIR filter */
> -		val &= ~I40E_PFQF_CTL_0_FD_ENA_MASK;
> -		I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
> -		pf->flags &= ~I40E_FLAG_FDIR;
> +	conf = &dev->data->dev_conf.fdir_conf.flex_conf;
> +	ret = i40e_check_fdir_flex_conf(conf);
> +	if (ret < 0) {
> +		PMD_DRV_LOG(ERR, " invalid configuration arguments.");
> +		return -EINVAL;
> +	}
> +	/* configure flex payload */
> +	for (i = 0; i < conf->nb_payloads; i++)
> +		i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]);
> +	/* configure flex mask*/
> +	for (i = 0; i < conf->nb_flexmasks; i++) {
> +		pctype = i40e_flowtype_to_pctype(
> +			conf->flex_mask[i].flow_type);
> +		i40e_set_flex_mask_on_pctype(pf,
> +				pctype,
> +				&conf->flex_mask[i]);
>  	}
> 
>  	return ret;
> @@ -982,10 +980,12 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
>  	enum i40e_filter_pctype pctype;
>  	int ret = 0;
> 
> -	if (!(pf->flags & I40E_FLAG_FDIR)) {
> -		PMD_DRV_LOG(ERR, "FDIR is not enabled.");
> +	if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT) {
> +		PMD_DRV_LOG(ERR, "FDIR is not enabled, please"
> +			" check the mode in fdir_conf.");
>  		return -ENOTSUP;
>  	}
> +
>  	if (!I40E_VALID_FLOW_TYPE(filter->input.flow_type)) {
>  		PMD_DRV_LOG(ERR, "invalid flow_type input.");
>  		return -EINVAL;
> @@ -1263,8 +1263,11 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
>  	uint16_t num_flex_set = 0;
>  	uint16_t num_flex_mask = 0;
> 
> -	fdir->mode = (pf->flags & I40E_FLAG_FDIR) ?
> -			RTE_FDIR_MODE_PERFECT : RTE_FDIR_MODE_NONE;
> +	if (dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT)
> +		fdir->mode = RTE_FDIR_MODE_PERFECT;
> +	else
> +		fdir->mode = RTE_FDIR_MODE_NONE;
> +
>  	fdir->guarant_spc =
>  		(uint32_t)hw->func_caps.fd_filters_guaranteed;
>  	fdir->best_spc =
> @@ -1324,11 +1327,11 @@ i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
>  	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
>  	int ret = 0;
> 
> -	if (filter_op == RTE_ETH_FILTER_NOP) {
> -		if (!(pf->flags & I40E_FLAG_FDIR))
> -			ret = -ENOTSUP;
> -		return ret;
> -	}
> +	if ((pf->flags & I40E_FLAG_FDIR) == 0)
> +		return -ENOTSUP;
> +
> +	if (filter_op == RTE_ETH_FILTER_NOP)
> +		return 0;
> 
>  	if (arg == NULL && filter_op != RTE_ETH_FILTER_FLUSH)
>  		return -EINVAL;
> --
> 1.8.1.4
diff mbox

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index c61c3a0..f79ea3e 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -8546,7 +8546,7 @@  cmd_flow_director_flex_mask_parsed(void *parsed_result,
 	}
 	flex_mask.flow_type = str2flowtype(res->flow_type);
 	fdir_set_flex_mask(res->port_id, &flex_mask);
-	cmd_reconfig_device_queue(res->port_id, 1, 0);
+	cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
 cmdline_parse_token_string_t cmd_flow_director_flexmask =
@@ -8667,7 +8667,7 @@  cmd_flow_director_flxpld_parsed(void *parsed_result,
 	}
 
 	fdir_set_flex_payload(res->port_id, &flex_cfg);
-	cmd_reconfig_device_queue(res->port_id, 1, 0);
+	cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
 cmdline_parse_token_string_t cmd_flow_director_flexpayload =
diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c b/lib/librte_pmd_i40e/i40e_ethdev.c
index 87e750a..002d4a9 100644
--- a/lib/librte_pmd_i40e/i40e_ethdev.c
+++ b/lib/librte_pmd_i40e/i40e_ethdev.c
@@ -546,7 +546,6 @@  eth_i40e_dev_init(__rte_unused struct eth_driver *eth_drv,
 err_mac_alloc:
 	i40e_vsi_release(pf->main_vsi);
 err_setup_pf_switch:
-	i40e_fdir_teardown(pf);
 err_get_mac_addr:
 err_configure_lan_hmc:
 	(void)i40e_shutdown_lan_hmc(hw);
@@ -565,8 +564,27 @@  err_get_capabilities:
 static int
 i40e_dev_configure(struct rte_eth_dev *dev)
 {
-	int ret;
+	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	enum rte_eth_rx_mq_mode mq_mode = dev->data->dev_conf.rxmode.mq_mode;
+	int ret;
+
+	if (dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) {
+		ret = i40e_fdir_setup(pf);
+		if (ret != I40E_SUCCESS) {
+			PMD_DRV_LOG(ERR, "Failed to setup flow director.");
+			return -ENOTSUP;
+		}
+		ret = i40e_fdir_configure(dev);
+		if (ret < 0) {
+			PMD_DRV_LOG(ERR, "failed to configure fdir.");
+			goto err;
+		}
+	} else
+		i40e_fdir_teardown(pf);
+
+	ret = i40e_dev_init_vlan(dev);
+	if (ret < 0)
+		goto err;
 
 	/* VMDQ setup.
 	 *  Needs to move VMDQ setting out of i40e_pf_config_mq_rx() as VMDQ and
@@ -583,10 +601,12 @@  i40e_dev_configure(struct rte_eth_dev *dev)
 	if (mq_mode & ETH_MQ_RX_VMDQ_FLAG) {
 		ret = i40e_vmdq_setup(dev);
 		if (ret)
-			return ret;
+			goto err;
 	}
-
-	return i40e_dev_init_vlan(dev);
+	return 0;
+err:
+	i40e_fdir_teardown(pf);
+	return ret;
 }
 
 void
@@ -837,14 +857,8 @@  i40e_dev_start(struct rte_eth_dev *dev)
 		i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi);
 	}
 
-	ret = i40e_fdir_configure(dev);
-	if (ret < 0) {
-		PMD_DRV_LOG(ERR, "failed to configure fdir.");
-		goto err_up;
-	}
-
 	/* enable FDIR MSIX interrupt */
-	if (pf->flags & I40E_FLAG_FDIR) {
+	if (pf->fdir.fdir_vsi) {
 		i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi);
 		i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi);
 	}
@@ -903,7 +917,7 @@  i40e_dev_stop(struct rte_eth_dev *dev)
 		i40e_vsi_queues_unbind_intr(pf->vmdq[i].vsi);
 	}
 
-	if (pf->flags & I40E_FLAG_FDIR) {
+	if (pf->fdir.fdir_vsi) {
 		i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi);
 		i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi);
 	}
@@ -3302,15 +3316,6 @@  i40e_pf_setup(struct i40e_pf *pf)
 	}
 	pf->main_vsi = vsi;
 
-	/* setup FDIR after main vsi created.*/
-	if (pf->flags & I40E_FLAG_FDIR) {
-		ret = i40e_fdir_setup(pf);
-		if (ret != I40E_SUCCESS) {
-			PMD_DRV_LOG(ERR, "Failed to setup flow director.");
-			pf->flags &= ~I40E_FLAG_FDIR;
-		}
-	}
-
 	/* Configure filter control */
 	memset(&settings, 0, sizeof(settings));
 	if (hw->func_caps.rss_table_size == ETH_RSS_RETA_SIZE_128)
diff --git a/lib/librte_pmd_i40e/i40e_fdir.c b/lib/librte_pmd_i40e/i40e_fdir.c
index d75b96e..ad38803 100644
--- a/lib/librte_pmd_i40e/i40e_fdir.c
+++ b/lib/librte_pmd_i40e/i40e_fdir.c
@@ -196,6 +196,11 @@  i40e_fdir_setup(struct i40e_pf *pf)
 	const struct rte_memzone *mz = NULL;
 	struct rte_eth_dev *eth_dev = pf->adapter->eth_dev;
 
+	if ((pf->flags & I40E_FLAG_FDIR) == 0) {
+		PMD_INIT_LOG(ERR, "HW doesn't support FDIR");
+		return I40E_NOT_SUPPORTED;
+	}
+
 	PMD_DRV_LOG(INFO, "FDIR HW Capabilities: num_filters_guaranteed = %u,"
 			" num_filters_best_effort = %u.",
 			hw->func_caps.fd_filters_guaranteed,
@@ -203,9 +208,8 @@  i40e_fdir_setup(struct i40e_pf *pf)
 
 	vsi = pf->fdir.fdir_vsi;
 	if (vsi) {
-		PMD_DRV_LOG(ERR, "FDIR vsi pointer needs "
-				 "to be null before creation.");
-		return I40E_ERR_BAD_PTR;
+		PMD_DRV_LOG(INFO, "FDIR initialization has been done.");
+		return I40E_SUCCESS;
 	}
 	/* make new FDIR VSI */
 	vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR, pf->main_vsi, 0);
@@ -302,6 +306,8 @@  i40e_fdir_teardown(struct i40e_pf *pf)
 	struct i40e_vsi *vsi;
 
 	vsi = pf->fdir.fdir_vsi;
+	if (!vsi)
+		return;
 	i40e_switch_tx_queue(hw, vsi->base_queue, FALSE);
 	i40e_switch_rx_queue(hw, vsi->base_queue, FALSE);
 	i40e_dev_rx_queue_release(pf->fdir.rxq);
@@ -653,37 +659,29 @@  i40e_fdir_configure(struct rte_eth_dev *dev)
 		}
 	}
 
+	/* enable FDIR filter */
 	val = I40E_READ_REG(hw, I40E_PFQF_CTL_0);
-	if ((pf->flags & I40E_FLAG_FDIR) &&
-		dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) {
-		/* enable FDIR filter */
-		val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
-		I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
+	val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
+	I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
 
-		i40e_init_flx_pld(pf); /* set flex config to default value */
+	i40e_init_flx_pld(pf); /* set flex config to default value */
 
-		conf = &dev->data->dev_conf.fdir_conf.flex_conf;
-		ret = i40e_check_fdir_flex_conf(conf);
-		if (ret < 0) {
-			PMD_DRV_LOG(ERR, " invalid configuration arguments.");
-			return -EINVAL;
-		}
-		/* configure flex payload */
-		for (i = 0; i < conf->nb_payloads; i++)
-			i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]);
-		/* configure flex mask*/
-		for (i = 0; i < conf->nb_flexmasks; i++) {
-			pctype = i40e_flowtype_to_pctype(
-				conf->flex_mask[i].flow_type);
-			i40e_set_flex_mask_on_pctype(pf,
-					pctype,
-					&conf->flex_mask[i]);
-		}
-	} else {
-		/* disable FDIR filter */
-		val &= ~I40E_PFQF_CTL_0_FD_ENA_MASK;
-		I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val);
-		pf->flags &= ~I40E_FLAG_FDIR;
+	conf = &dev->data->dev_conf.fdir_conf.flex_conf;
+	ret = i40e_check_fdir_flex_conf(conf);
+	if (ret < 0) {
+		PMD_DRV_LOG(ERR, " invalid configuration arguments.");
+		return -EINVAL;
+	}
+	/* configure flex payload */
+	for (i = 0; i < conf->nb_payloads; i++)
+		i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]);
+	/* configure flex mask*/
+	for (i = 0; i < conf->nb_flexmasks; i++) {
+		pctype = i40e_flowtype_to_pctype(
+			conf->flex_mask[i].flow_type);
+		i40e_set_flex_mask_on_pctype(pf,
+				pctype,
+				&conf->flex_mask[i]);
 	}
 
 	return ret;
@@ -982,10 +980,12 @@  i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
 	enum i40e_filter_pctype pctype;
 	int ret = 0;
 
-	if (!(pf->flags & I40E_FLAG_FDIR)) {
-		PMD_DRV_LOG(ERR, "FDIR is not enabled.");
+	if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT) {
+		PMD_DRV_LOG(ERR, "FDIR is not enabled, please"
+			" check the mode in fdir_conf.");
 		return -ENOTSUP;
 	}
+
 	if (!I40E_VALID_FLOW_TYPE(filter->input.flow_type)) {
 		PMD_DRV_LOG(ERR, "invalid flow_type input.");
 		return -EINVAL;
@@ -1263,8 +1263,11 @@  i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir)
 	uint16_t num_flex_set = 0;
 	uint16_t num_flex_mask = 0;
 
-	fdir->mode = (pf->flags & I40E_FLAG_FDIR) ?
-			RTE_FDIR_MODE_PERFECT : RTE_FDIR_MODE_NONE;
+	if (dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT)
+		fdir->mode = RTE_FDIR_MODE_PERFECT;
+	else
+		fdir->mode = RTE_FDIR_MODE_NONE;
+
 	fdir->guarant_spc =
 		(uint32_t)hw->func_caps.fd_filters_guaranteed;
 	fdir->best_spc =
@@ -1324,11 +1327,11 @@  i40e_fdir_ctrl_func(struct rte_eth_dev *dev,
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	int ret = 0;
 
-	if (filter_op == RTE_ETH_FILTER_NOP) {
-		if (!(pf->flags & I40E_FLAG_FDIR))
-			ret = -ENOTSUP;
-		return ret;
-	}
+	if ((pf->flags & I40E_FLAG_FDIR) == 0)
+		return -ENOTSUP;
+
+	if (filter_op == RTE_ETH_FILTER_NOP)
+		return 0;
 
 	if (arg == NULL && filter_op != RTE_ETH_FILTER_FLUSH)
 		return -EINVAL;