Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b21f502f authored by Igor Russkikh's avatar Igor Russkikh Committed by David S. Miller
Browse files

net:ethernet:aquantia: Fix for multicast filter handling.



Since the HW supports up to 32 multicast filters we should
track count of multicast filters to avoid overflow.
If we attempt to add >32 multicast filter - just set NETIF_ALLMULTI flag
instead.

Fixes: 94f6c9e4cdf6 ("net: ethernet: aquantia: Support for NIC-specific code")
Signed-off-by: default avatarIgor Russkikh <Igor.Russkikh@aquantia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bd8ed441
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -669,12 +669,27 @@ int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)
	netdev_for_each_mc_addr(ha, ndev) {
		ether_addr_copy(self->mc_list.ar[i++], ha->addr);
		++self->mc_list.count;

		if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX)
			break;
	}

	if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX) {
		/* Number of filters is too big: atlantic does not support this.
		 * Force all multi filter to support this.
		 * With this we disable all UC filters and setup "all pass"
		 * multicast mask
		 */
		self->packet_filter |= IFF_ALLMULTI;
		self->aq_hw->aq_nic_cfg->mc_list_count = 0;
		return self->aq_hw_ops.hw_packet_filter_set(self->aq_hw,
							self->packet_filter);
	} else {
		return self->aq_hw_ops.hw_multicast_list_set(self->aq_hw,
						    self->mc_list.ar,
						    self->mc_list.count);
	}
}

int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu)
{