[PATCH net 1/1] net: fec: fix multicast filtering hardware setup

Subsystems: freescale imx / mxc fec driver, networking drivers, the rest

STALE3496d

3 messages, 2 authors, 2017-02-13 · open the first message on its own page

[PATCH net 1/1] net: fec: fix multicast filtering hardware setup

From: Andy Duan <hidden>
Date: 2017-02-10 05:56:04

Fix hardware setup of multicast address hash:
- Never clear the hardware hash (to avoid packet loss)
- Construct the hash register values in software and then write once
to hardware

Signed-off-by: Fugang Duan <redacted>
Signed-off-by: Rui Sousa <redacted>
---
 drivers/net/ethernet/freescale/fec_main.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 2cc552d..91a1664 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -2910,6 +2910,7 @@ static void set_multicast_list(struct net_device *ndev)
 	struct netdev_hw_addr *ha;
 	unsigned int i, bit, data, crc, tmp;
 	unsigned char hash;
+	unsigned int hash_high = 0, hash_low = 0;
 
 	if (ndev->flags & IFF_PROMISC) {
 		tmp = readl(fep->hwp + FEC_R_CNTRL);
@@ -2932,11 +2933,7 @@ static void set_multicast_list(struct net_device *ndev)
 		return;
 	}
 
-	/* Clear filter and add the addresses in hash register
-	 */
-	writel(0, fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
-	writel(0, fep->hwp + FEC_GRP_HASH_TABLE_LOW);
-
+	/* Add the addresses in hash register */
 	netdev_for_each_mc_addr(ha, ndev) {
 		/* calculate crc32 value of mac address */
 		crc = 0xffffffff;
@@ -2954,16 +2951,14 @@ static void set_multicast_list(struct net_device *ndev)
 		 */
 		hash = (crc >> (32 - FEC_HASH_BITS)) & 0x3f;
 
-		if (hash > 31) {
-			tmp = readl(fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
-			tmp |= 1 << (hash - 32);
-			writel(tmp, fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
-		} else {
-			tmp = readl(fep->hwp + FEC_GRP_HASH_TABLE_LOW);
-			tmp |= 1 << hash;
-			writel(tmp, fep->hwp + FEC_GRP_HASH_TABLE_LOW);
-		}
+		if (hash > 31)
+			hash_high |= 1 << (hash - 32);
+		else
+			hash_low |= 1 << hash;
 	}
+
+	writel(hash_high, fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
+	writel(hash_low, fep->hwp + FEC_GRP_HASH_TABLE_LOW);
 }
 
 /* Set a MAC change in hardware. */
-- 
1.9.1

Re: [PATCH net 1/1] net: fec: fix multicast filtering hardware setup

From: Fabio Estevam <festevam@gmail.com>
Date: 2017-02-10 21:19:37

On Fri, Feb 10, 2017 at 3:54 AM, Andy Duan [off-list ref] wrote:
Fix hardware setup of multicast address hash:
- Never clear the hardware hash (to avoid packet loss)
- Construct the hash register values in software and then write once
to hardware

Signed-off-by: Fugang Duan <redacted>
Signed-off-by: Rui Sousa <redacted>
It seems you missed to put Rui's name in the From: field.

RE: [PATCH net 1/1] net: fec: fix multicast filtering hardware setup

From: Andy Duan <hidden>
Date: 2017-02-13 01:51:06

From: Fabio Estevam <festevam@gmail.com> Sent: Saturday, February 11, 2017 5:20 AM
To: Andy Duan <redacted>
Cc: David S. Miller <davem@davemloft.net>; netdev@vger.kernel.org;
Stephen Hemminger [off-list ref]
Subject: Re: [PATCH net 1/1] net: fec: fix multicast filtering hardware setup

On Fri, Feb 10, 2017 at 3:54 AM, Andy Duan [off-list ref] wrote:
quoted
Fix hardware setup of multicast address hash:
- Never clear the hardware hash (to avoid packet loss)
- Construct the hash register values in software and then write once
to hardware

Signed-off-by: Fugang Duan <redacted>
Signed-off-by: Rui Sousa <redacted>
It seems you missed to put Rui's name in the From: field.
I did some change base on original patch and merge into net tree.
Forget to change thr FR field, send it again, not V2 version.

Regards,
Andy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help