diff options
| -rw-r--r-- | drivers/net/ethernet/sfc/ef10.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c index c60c2d4c646a..78efb2822b86 100644 --- a/drivers/net/ethernet/sfc/ef10.c +++ b/drivers/net/ethernet/sfc/ef10.c | |||
| @@ -119,6 +119,7 @@ struct efx_ef10_filter_table { | |||
| 119 | bool mc_promisc; | 119 | bool mc_promisc; |
| 120 | /* Whether in multicast promiscuous mode when last changed */ | 120 | /* Whether in multicast promiscuous mode when last changed */ |
| 121 | bool mc_promisc_last; | 121 | bool mc_promisc_last; |
| 122 | bool mc_overflow; /* Too many MC addrs; should always imply mc_promisc */ | ||
| 122 | bool vlan_filter; | 123 | bool vlan_filter; |
| 123 | struct list_head vlan_list; | 124 | struct list_head vlan_list; |
| 124 | }; | 125 | }; |
| @@ -5058,6 +5059,7 @@ static void efx_ef10_filter_mc_addr_list(struct efx_nic *efx) | |||
| 5058 | struct netdev_hw_addr *mc; | 5059 | struct netdev_hw_addr *mc; |
| 5059 | unsigned int i, addr_count; | 5060 | unsigned int i, addr_count; |
| 5060 | 5061 | ||
| 5062 | table->mc_overflow = false; | ||
| 5061 | table->mc_promisc = !!(net_dev->flags & (IFF_PROMISC | IFF_ALLMULTI)); | 5063 | table->mc_promisc = !!(net_dev->flags & (IFF_PROMISC | IFF_ALLMULTI)); |
| 5062 | 5064 | ||
| 5063 | addr_count = netdev_mc_count(net_dev); | 5065 | addr_count = netdev_mc_count(net_dev); |
| @@ -5065,6 +5067,7 @@ static void efx_ef10_filter_mc_addr_list(struct efx_nic *efx) | |||
| 5065 | netdev_for_each_mc_addr(mc, net_dev) { | 5067 | netdev_for_each_mc_addr(mc, net_dev) { |
| 5066 | if (i >= EFX_EF10_FILTER_DEV_MC_MAX) { | 5068 | if (i >= EFX_EF10_FILTER_DEV_MC_MAX) { |
| 5067 | table->mc_promisc = true; | 5069 | table->mc_promisc = true; |
| 5070 | table->mc_overflow = true; | ||
| 5068 | break; | 5071 | break; |
| 5069 | } | 5072 | } |
| 5070 | ether_addr_copy(table->dev_mc_list[i].addr, mc->addr); | 5073 | 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, | |||
| 5469 | } | 5472 | } |
| 5470 | } else { | 5473 | } else { |
| 5471 | /* If we failed to insert promiscuous filters, don't | 5474 | /* If we failed to insert promiscuous filters, don't |
| 5472 | * rollback. Regardless, also insert the mc_list | 5475 | * rollback. Regardless, also insert the mc_list, |
| 5476 | * unless it's incomplete due to overflow | ||
| 5473 | */ | 5477 | */ |
| 5474 | efx_ef10_filter_insert_def(efx, vlan, | 5478 | efx_ef10_filter_insert_def(efx, vlan, |
| 5475 | EFX_ENCAP_TYPE_NONE, | 5479 | EFX_ENCAP_TYPE_NONE, |
| 5476 | true, false); | 5480 | true, false); |
| 5477 | efx_ef10_filter_insert_addr_list(efx, vlan, true, false); | 5481 | if (!table->mc_overflow) |
| 5482 | efx_ef10_filter_insert_addr_list(efx, vlan, | ||
| 5483 | true, false); | ||
| 5478 | } | 5484 | } |
| 5479 | } else { | 5485 | } else { |
| 5480 | /* If any filters failed to insert, rollback and fall back to | 5486 | /* If any filters failed to insert, rollback and fall back to |
