[dpdk-dev,v2] net/igb: fix add/delete of flex filters

Message ID 1495110014-20074-1-git-send-email-markus.theil@tu-ilmenau.de (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Markus Theil May 18, 2017, 12:20 p.m. UTC
  Before this patch, flex_filter->index was always zero when it was read
and used after rte_zmalloc. The corresponding code was therefore moved
into the add and delete parts of the if/else statement. i210 and i211
also support flex filters.

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 drivers/net/e1000/igb_ethdev.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

--
2.7.4
  

Comments

Wenzhuo Lu May 22, 2017, 1:51 a.m. UTC | #1
Hi Markus,

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Markus Theil
> Sent: Thursday, May 18, 2017 8:20 PM
> To: dev@dpdk.org
> Cc: Markus Theil
> Subject: [dpdk-dev] [PATCH v2] net/igb: fix add/delete of flex filters
> 
> Before this patch, flex_filter->index was always zero when it was read and
> used after rte_zmalloc. The corresponding code was therefore moved into
> the add and delete parts of the if/else statement. i210 and i211 also support
> flex filters.
Thanks for the patch. To my opinion, there're 2 things here. One is to support the flex filter on i210/i211. The other is to fix the index issue.
Would you like to split it to 2 patches? So you can add a fixes tag for the index one. 

> 
> Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
> ---
>  drivers/net/e1000/igb_ethdev.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
  

Patch

diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 43d1f5f..f090e47 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -3657,7 +3657,8 @@  eth_igb_syn_filter_handle(struct rte_eth_dev *dev,
 }

 #define MAC_TYPE_FILTER_SUP_EXT(type)    do {\
-	if ((type) != e1000_82580 && (type) != e1000_i350)\
+	if ((type) != e1000_82580 && (type) != e1000_i350 &&\
+		(type) != e1000_i210 && (type) != e1000_i211)\
 		return -ENOSYS; \
 } while (0)

@@ -3913,10 +3914,6 @@  eth_igb_add_del_flex_filter(struct rte_eth_dev *dev,
 	}

 	wufc = E1000_READ_REG(hw, E1000_WUFC);
-	if (flex_filter->index < E1000_MAX_FHFT)
-		reg_off = E1000_FHFT(flex_filter->index);
-	else
-		reg_off = E1000_FHFT_EXT(flex_filter->index - E1000_MAX_FHFT);

 	if (add) {
 		if (eth_igb_flex_filter_lookup(&filter_info->flex_list,
@@ -3946,6 +3943,11 @@  eth_igb_add_del_flex_filter(struct rte_eth_dev *dev,
 			return -ENOSYS;
 		}

+		if (flex_filter->index < E1000_MAX_FHFT)
+			reg_off = E1000_FHFT(flex_filter->index);
+		else
+			reg_off = E1000_FHFT_EXT(flex_filter->index - E1000_MAX_FHFT);
+
 		E1000_WRITE_REG(hw, E1000_WUFC, wufc | E1000_WUFC_FLEX_HQ |
 				(E1000_WUFC_FLX0 << flex_filter->index));
 		queueing = filter->len |
@@ -3974,6 +3976,11 @@  eth_igb_add_del_flex_filter(struct rte_eth_dev *dev,
 			return -ENOENT;
 		}

+		if (it->index < E1000_MAX_FHFT)
+			reg_off = E1000_FHFT(it->index);
+		else
+			reg_off = E1000_FHFT_EXT(it->index - E1000_MAX_FHFT);
+
 		for (i = 0; i < E1000_FHFT_SIZE_IN_DWD; i++)
 			E1000_WRITE_REG(hw, reg_off + i * sizeof(uint32_t), 0);
 		E1000_WRITE_REG(hw, E1000_WUFC, wufc &