From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.hongo.wide.ad.jp (mail.hongo.wide.ad.jp [203.178.135.13]) by dpdk.org (Postfix) with ESMTP id 4D5651396 for ; Sun, 24 May 2015 09:19:00 +0200 (CEST) Received: from arch.localdomain (ae129082.dynamic.ppp.asahi-net.or.jp [14.3.129.82]) by mail.hongo.wide.ad.jp (Postfix) with ESMTPA id 7071610AA907; Sun, 24 May 2015 16:18:56 +0900 (JST) From: motomu To: dev@dpdk.org Date: Sun, 24 May 2015 16:17:31 +0000 Message-Id: <1432484252-3517-1-git-send-email-motomu@hongo.wide.ad.jp> X-Mailer: git-send-email 2.4.1 Subject: [dpdk-dev] [PATCH] drivers/net/e1000/igb_ethdev.c:fix eth_igb_add_del_flex_filter X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 May 2015 07:19:00 -0000 From: Motomu Utsumi in add flexfiler it always write to same register address, so when try to adapt some filters only last one is enabled. I substitute value based on based on flex_filter->index for reg_off. in del flexfilter, it delete target filter and also delete first filter because of similar reason. I substitute value based on based on it->index for reg_off. --- drivers/net/e1000/igb_ethdev.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index e4b370d..5a7f50a 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -2781,10 +2781,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, @@ -2813,6 +2809,10 @@ eth_igb_add_del_flex_filter(struct rte_eth_dev *dev, rte_free(flex_filter); 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)); @@ -2841,6 +2841,10 @@ eth_igb_add_del_flex_filter(struct rte_eth_dev *dev, rte_free(flex_filter); 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); -- 1.8.3.1