diff mbox

mvpp2: fix multicast address filter

Message ID alpine.LRH.2.02.1802111806550.12159@file01.intranet.prod.int.rdu2.redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Mikulas Patocka Feb. 11, 2018, 11:10 p.m. UTC
IPv6 doesn't work on the MacchiatoBIN board. It is caused by broken
multicast address filter in the mvpp2 driver.

The driver loads doesn't load any multicast entries if "allmulti" is not
set. This condition should be reversed.

The condition !netdev_mc_empty(dev) is useless (because
netdev_for_each_mc_addr is nop if the list is empty).

This patch also fixes a possible overflow of the multicast list - if
mvpp2_prs_mac_da_accept fails, we set the allmulti flag and retry.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Cc: stable@vger.kernel.org

---
 drivers/net/ethernet/marvell/mvpp2.c |   11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

Comments

David Miller Feb. 12, 2018, 3:37 a.m. UTC | #1
From: Mikulas Patocka <mpatocka@redhat.com>
Date: Sun, 11 Feb 2018 18:10:28 -0500 (EST)

> IPv6 doesn't work on the MacchiatoBIN board. It is caused by broken
> multicast address filter in the mvpp2 driver.
> 
> The driver loads doesn't load any multicast entries if "allmulti" is not
> set. This condition should be reversed.
> 
> The condition !netdev_mc_empty(dev) is useless (because
> netdev_for_each_mc_addr is nop if the list is empty).
> 
> This patch also fixes a possible overflow of the multicast list - if
> mvpp2_prs_mac_da_accept fails, we set the allmulti flag and retry.
> 
> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

Applied, thanks.
diff mbox

Patch

Index: linux-2.6/drivers/net/ethernet/marvell/mvpp2.c
===================================================================
--- linux-2.6.orig/drivers/net/ethernet/marvell/mvpp2.c	2018-02-11 23:40:01.000000000 +0100
+++ linux-2.6/drivers/net/ethernet/marvell/mvpp2.c	2018-02-11 23:44:09.000000000 +0100
@@ -7137,6 +7137,7 @@  static void mvpp2_set_rx_mode(struct net
 	int id = port->id;
 	bool allmulti = dev->flags & IFF_ALLMULTI;
 
+retry:
 	mvpp2_prs_mac_promisc_set(priv, id, dev->flags & IFF_PROMISC);
 	mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_ALL, allmulti);
 	mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_IP6, allmulti);
@@ -7144,9 +7145,13 @@  static void mvpp2_set_rx_mode(struct net
 	/* Remove all port->id's mcast enries */
 	mvpp2_prs_mcast_del_all(priv, id);
 
-	if (allmulti && !netdev_mc_empty(dev)) {
-		netdev_for_each_mc_addr(ha, dev)
-			mvpp2_prs_mac_da_accept(priv, id, ha->addr, true);
+	if (!allmulti) {
+		netdev_for_each_mc_addr(ha, dev) {
+			if (mvpp2_prs_mac_da_accept(priv, id, ha->addr, true)) {
+				allmulti = true;
+				goto retry;
+			}
+		}
 	}
 }