| From 7ac8ff95f48cbfa609a060fd6a1e361dd62feeb3 Mon Sep 17 00:00:00 2001 |
| From: Mikulas Patocka <mpatocka@redhat.com> |
| Date: Sun, 11 Feb 2018 18:10:28 -0500 |
| Subject: mvpp2: fix multicast address filter |
| |
| From: Mikulas Patocka <mpatocka@redhat.com> |
| |
| commit 7ac8ff95f48cbfa609a060fd6a1e361dd62feeb3 upstream. |
| |
| 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 |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/ethernet/marvell/mvpp2.c | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/ethernet/marvell/mvpp2.c |
| +++ b/drivers/net/ethernet/marvell/mvpp2.c |
| @@ -5666,6 +5666,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); |
| @@ -5673,9 +5674,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; |
| + } |
| + } |
| } |
| } |
| |