diff mbox

[dpdk-dev,v4,12/21] i40e: implement operations to get fdir info

Message ID 1413939687-11177-13-git-send-email-jingjing.wu@intel.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Jingjing Wu Oct. 22, 2014, 1:01 a.m. UTC
implement operation to get flow director information in i40e pmd driver

Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
---
 lib/librte_pmd_i40e/i40e_fdir.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)
diff mbox

Patch

diff --git a/lib/librte_pmd_i40e/i40e_fdir.c b/lib/librte_pmd_i40e/i40e_fdir.c
index 8996a1c..d2c8304 100644
--- a/lib/librte_pmd_i40e/i40e_fdir.c
+++ b/lib/librte_pmd_i40e/i40e_fdir.c
@@ -89,6 +89,8 @@  static int i40e_fdir_filter_programming(struct i40e_pf *pf,
 			enum i40e_filter_pctype pctype,
 			struct rte_eth_fdir_filter *filter,
 			bool add);
+static void i40e_fdir_info_get(struct i40e_pf *pf,
+			   struct rte_eth_fdir_info *fdir);
 
 static int
 i40e_fdir_rx_queue_init(struct i40e_rx_queue *rxq)
@@ -874,6 +876,36 @@  i40e_fdir_filter_programming(struct i40e_pf *pf,
 }
 
 /*
+ * i40e_fdir_info_get - get information of Flow Director
+ * @pf: ethernet device to get info from
+ * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with
+ *    the flow director information.
+ */
+static void
+i40e_fdir_info_get(struct i40e_pf *pf, struct rte_eth_fdir_info *fdir)
+{
+	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
+	uint32_t pfqf_ctl;
+
+	pfqf_ctl = I40E_READ_REG(hw, I40E_PFQF_CTL_0);
+	fdir->mode = pfqf_ctl & I40E_PFQF_CTL_0_FD_ENA_MASK ?
+		     RTE_FDIR_MODE_PERFECT : RTE_FDIR_MODE_NONE;
+	fdir->info_ext.guarant_spc =
+		(uint16_t)hw->func_caps.fd_filters_guaranteed;
+	fdir->info_ext.guarant_cnt =
+		(uint16_t)((I40E_READ_REG(hw, I40E_PFQF_FDSTAT) &
+			    I40E_PFQF_FDSTAT_GUARANT_CNT_MASK) >>
+			    I40E_PFQF_FDSTAT_GUARANT_CNT_SHIFT);
+	fdir->info_ext.best_spc =
+		(uint16_t)hw->func_caps.fd_filters_best_effort;
+	fdir->info_ext.best_cnt =
+		(uint16_t)((I40E_READ_REG(hw, I40E_PFQF_FDSTAT) &
+			    I40E_PFQF_FDSTAT_BEST_CNT_MASK) >>
+			    I40E_PFQF_FDSTAT_BEST_CNT_SHIFT);
+	return;
+}
+
+/*
  * i40e_fdir_ctrl_func - deal with all operations on flow director.
  * @pf: board private structure
  * @filter_op:operation will be taken.
@@ -903,6 +935,9 @@  i40e_fdir_ctrl_func(struct i40e_pf *pf, enum rte_filter_op filter_op, void *arg)
 			(struct rte_eth_fdir_filter *)arg,
 			FALSE);
 		break;
+	case RTE_ETH_FILTER_INFO:
+		i40e_fdir_info_get(pf, (struct rte_eth_fdir_info *)arg);
+		break;
 	default:
 		PMD_DRV_LOG(ERR, "unknown operation %u.", filter_op);
 		ret = -EINVAL;