|
@@ -119,6 +119,7 @@ struct efx_ef10_filter_table {
|
|
|
bool mc_promisc;
|
|
|
/* Whether in multicast promiscuous mode when last changed */
|
|
|
bool mc_promisc_last;
|
|
|
+ bool mc_overflow; /* Too many MC addrs; should always imply mc_promisc */
|
|
|
bool vlan_filter;
|
|
|
struct list_head vlan_list;
|
|
|
};
|
|
@@ -5058,6 +5059,7 @@ static void efx_ef10_filter_mc_addr_list(struct efx_nic *efx)
|
|
|
struct netdev_hw_addr *mc;
|
|
|
unsigned int i, addr_count;
|
|
|
|
|
|
+ table->mc_overflow = false;
|
|
|
table->mc_promisc = !!(net_dev->flags & (IFF_PROMISC | IFF_ALLMULTI));
|
|
|
|
|
|
addr_count = netdev_mc_count(net_dev);
|
|
@@ -5065,6 +5067,7 @@ static void efx_ef10_filter_mc_addr_list(struct efx_nic *efx)
|
|
|
netdev_for_each_mc_addr(mc, net_dev) {
|
|
|
if (i >= EFX_EF10_FILTER_DEV_MC_MAX) {
|
|
|
table->mc_promisc = true;
|
|
|
+ table->mc_overflow = true;
|
|
|
break;
|
|
|
}
|
|
|
ether_addr_copy(table->dev_mc_list[i].addr, mc->addr);
|
|
@@ -5469,12 +5472,15 @@ static void efx_ef10_filter_vlan_sync_rx_mode(struct efx_nic *efx,
|
|
|
}
|
|
|
} else {
|
|
|
/* If we failed to insert promiscuous filters, don't
|
|
|
- * rollback. Regardless, also insert the mc_list
|
|
|
+ * rollback. Regardless, also insert the mc_list,
|
|
|
+ * unless it's incomplete due to overflow
|
|
|
*/
|
|
|
efx_ef10_filter_insert_def(efx, vlan,
|
|
|
EFX_ENCAP_TYPE_NONE,
|
|
|
true, false);
|
|
|
- efx_ef10_filter_insert_addr_list(efx, vlan, true, false);
|
|
|
+ if (!table->mc_overflow)
|
|
|
+ efx_ef10_filter_insert_addr_list(efx, vlan,
|
|
|
+ true, false);
|
|
|
}
|
|
|
} else {
|
|
|
/* If any filters failed to insert, rollback and fall back to
|