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;
 };
        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);
        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);
                        }
                } 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