aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/sfc
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2012-02-02 17:41:49 -0500
committerBen Hutchings <bhutchings@solarflare.com>2012-02-15 19:11:24 -0500
commitc274d65c949d0909fc8f4f19561ecb7c1d3d1559 (patch)
treea30ae1b9657f498a582f025b43d9db203d23965a /drivers/net/ethernet/sfc
parent7c43161c11d7f40e38db9a1adb61347f06127796 (diff)
sfc: Add support for configuring RX unicast/multicast default filters
On Siena all received packets that don't match a more specific filter will match the unicast or multicast default filter. Currently we leave these set to the default values (RSS with base queue number of 0). Allow them to be reconfigured to select a single RX queue. These default filters are programmed through the FILTER_CTL register, but we represent them internally as an additional table of size 2. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc')
-rw-r--r--drivers/net/ethernet/sfc/ethtool.c59
-rw-r--r--drivers/net/ethernet/sfc/filter.c196
-rw-r--r--drivers/net/ethernet/sfc/filter.h6
3 files changed, 214 insertions, 47 deletions
diff --git a/drivers/net/ethernet/sfc/ethtool.c b/drivers/net/ethernet/sfc/ethtool.c
index f887f65e4189..83191151b650 100644
--- a/drivers/net/ethernet/sfc/ethtool.c
+++ b/drivers/net/ethernet/sfc/ethtool.c
@@ -808,11 +808,16 @@ static int efx_ethtool_reset(struct net_device *net_dev, u32 *flags)
808 return efx_reset(efx, rc); 808 return efx_reset(efx, rc);
809} 809}
810 810
811/* MAC address mask including only MC flag */
812static const u8 mac_addr_mc_mask[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 };
813
811static int efx_ethtool_get_class_rule(struct efx_nic *efx, 814static int efx_ethtool_get_class_rule(struct efx_nic *efx,
812 struct ethtool_rx_flow_spec *rule) 815 struct ethtool_rx_flow_spec *rule)
813{ 816{
814 struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec; 817 struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec;
815 struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec; 818 struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec;
819 struct ethhdr *mac_entry = &rule->h_u.ether_spec;
820 struct ethhdr *mac_mask = &rule->m_u.ether_spec;
816 struct efx_filter_spec spec; 821 struct efx_filter_spec spec;
817 u16 vid; 822 u16 vid;
818 u8 proto; 823 u8 proto;
@@ -828,11 +833,18 @@ static int efx_ethtool_get_class_rule(struct efx_nic *efx,
828 else 833 else
829 rule->ring_cookie = spec.dmaq_id; 834 rule->ring_cookie = spec.dmaq_id;
830 835
831 rc = efx_filter_get_eth_local(&spec, &vid, 836 if (spec.type == EFX_FILTER_MC_DEF || spec.type == EFX_FILTER_UC_DEF) {
832 rule->h_u.ether_spec.h_dest); 837 rule->flow_type = ETHER_FLOW;
838 memcpy(mac_mask->h_dest, mac_addr_mc_mask, ETH_ALEN);
839 if (spec.type == EFX_FILTER_MC_DEF)
840 memcpy(mac_entry->h_dest, mac_addr_mc_mask, ETH_ALEN);
841 return 0;
842 }
843
844 rc = efx_filter_get_eth_local(&spec, &vid, mac_entry->h_dest);
833 if (rc == 0) { 845 if (rc == 0) {
834 rule->flow_type = ETHER_FLOW; 846 rule->flow_type = ETHER_FLOW;
835 memset(rule->m_u.ether_spec.h_dest, ~0, ETH_ALEN); 847 memset(mac_mask->h_dest, ~0, ETH_ALEN);
836 if (vid != EFX_FILTER_VID_UNSPEC) { 848 if (vid != EFX_FILTER_VID_UNSPEC) {
837 rule->flow_type |= FLOW_EXT; 849 rule->flow_type |= FLOW_EXT;
838 rule->h_ext.vlan_tci = htons(vid); 850 rule->h_ext.vlan_tci = htons(vid);
@@ -1001,27 +1013,40 @@ static int efx_ethtool_set_class_rule(struct efx_nic *efx,
1001 } 1013 }
1002 1014
1003 case ETHER_FLOW | FLOW_EXT: 1015 case ETHER_FLOW | FLOW_EXT:
1004 /* Must match all or none of VID */ 1016 case ETHER_FLOW: {
1005 if (rule->m_ext.vlan_tci != htons(0xfff) && 1017 u16 vlan_tag_mask = (rule->flow_type & FLOW_EXT ?
1006 rule->m_ext.vlan_tci != 0) 1018 ntohs(rule->m_ext.vlan_tci) : 0);
1007 return -EINVAL; 1019
1008 case ETHER_FLOW: 1020 /* Must not match on source address or Ethertype */
1009 /* Must match all of destination */
1010 if (!is_broadcast_ether_addr(mac_mask->h_dest))
1011 return -EINVAL;
1012 /* and nothing else */
1013 if (!is_zero_ether_addr(mac_mask->h_source) || 1021 if (!is_zero_ether_addr(mac_mask->h_source) ||
1014 mac_mask->h_proto) 1022 mac_mask->h_proto)
1015 return -EINVAL; 1023 return -EINVAL;
1016 1024
1017 rc = efx_filter_set_eth_local( 1025 /* Is it a default UC or MC filter? */
1018 &spec, 1026 if (!compare_ether_addr(mac_mask->h_dest, mac_addr_mc_mask) &&
1019 (rule->flow_type & FLOW_EXT && rule->m_ext.vlan_tci) ? 1027 vlan_tag_mask == 0) {
1020 ntohs(rule->h_ext.vlan_tci) : EFX_FILTER_VID_UNSPEC, 1028 if (is_multicast_ether_addr(mac_entry->h_dest))
1021 mac_entry->h_dest); 1029 rc = efx_filter_set_mc_def(&spec);
1030 else
1031 rc = efx_filter_set_uc_def(&spec);
1032 }
1033 /* Otherwise, it must match all of destination and all
1034 * or none of VID.
1035 */
1036 else if (is_broadcast_ether_addr(mac_mask->h_dest) &&
1037 (vlan_tag_mask == 0xfff || vlan_tag_mask == 0)) {
1038 rc = efx_filter_set_eth_local(
1039 &spec,
1040 vlan_tag_mask ?
1041 ntohs(rule->h_ext.vlan_tci) : EFX_FILTER_VID_UNSPEC,
1042 mac_entry->h_dest);
1043 } else {
1044 rc = -EINVAL;
1045 }
1022 if (rc) 1046 if (rc)
1023 return rc; 1047 return rc;
1024 break; 1048 break;
1049 }
1025 1050
1026 default: 1051 default:
1027 return -EINVAL; 1052 return -EINVAL;
diff --git a/drivers/net/ethernet/sfc/filter.c b/drivers/net/ethernet/sfc/filter.c
index 1fbbbee7b1ae..92517ea42715 100644
--- a/drivers/net/ethernet/sfc/filter.c
+++ b/drivers/net/ethernet/sfc/filter.c
@@ -35,9 +35,16 @@
35enum efx_filter_table_id { 35enum efx_filter_table_id {
36 EFX_FILTER_TABLE_RX_IP = 0, 36 EFX_FILTER_TABLE_RX_IP = 0,
37 EFX_FILTER_TABLE_RX_MAC, 37 EFX_FILTER_TABLE_RX_MAC,
38 EFX_FILTER_TABLE_RX_DEF,
38 EFX_FILTER_TABLE_COUNT, 39 EFX_FILTER_TABLE_COUNT,
39}; 40};
40 41
42enum efx_filter_index {
43 EFX_FILTER_INDEX_UC_DEF,
44 EFX_FILTER_INDEX_MC_DEF,
45 EFX_FILTER_SIZE_RX_DEF,
46};
47
41struct efx_filter_table { 48struct efx_filter_table {
42 enum efx_filter_table_id id; 49 enum efx_filter_table_id id;
43 u32 offset; /* address of table relative to BAR */ 50 u32 offset; /* address of table relative to BAR */
@@ -109,7 +116,7 @@ static void efx_filter_table_reset_search_depth(struct efx_filter_table *table)
109 memset(table->search_depth, 0, sizeof(table->search_depth)); 116 memset(table->search_depth, 0, sizeof(table->search_depth));
110} 117}
111 118
112static void efx_filter_push_rx_limits(struct efx_nic *efx) 119static void efx_filter_push_rx_config(struct efx_nic *efx)
113{ 120{
114 struct efx_filter_state *state = efx->filter_state; 121 struct efx_filter_state *state = efx->filter_state;
115 struct efx_filter_table *table; 122 struct efx_filter_table *table;
@@ -143,6 +150,32 @@ static void efx_filter_push_rx_limits(struct efx_nic *efx)
143 FILTER_CTL_SRCH_FUDGE_WILD); 150 FILTER_CTL_SRCH_FUDGE_WILD);
144 } 151 }
145 152
153 table = &state->table[EFX_FILTER_TABLE_RX_DEF];
154 if (table->size) {
155 EFX_SET_OWORD_FIELD(
156 filter_ctl, FRF_CZ_UNICAST_NOMATCH_Q_ID,
157 table->spec[EFX_FILTER_INDEX_UC_DEF].dmaq_id);
158 EFX_SET_OWORD_FIELD(
159 filter_ctl, FRF_CZ_UNICAST_NOMATCH_RSS_ENABLED,
160 !!(table->spec[EFX_FILTER_INDEX_UC_DEF].flags &
161 EFX_FILTER_FLAG_RX_RSS));
162 EFX_SET_OWORD_FIELD(
163 filter_ctl, FRF_CZ_UNICAST_NOMATCH_IP_OVERRIDE,
164 !!(table->spec[EFX_FILTER_INDEX_UC_DEF].flags &
165 EFX_FILTER_FLAG_RX_OVERRIDE_IP));
166 EFX_SET_OWORD_FIELD(
167 filter_ctl, FRF_CZ_MULTICAST_NOMATCH_Q_ID,
168 table->spec[EFX_FILTER_INDEX_MC_DEF].dmaq_id);
169 EFX_SET_OWORD_FIELD(
170 filter_ctl, FRF_CZ_MULTICAST_NOMATCH_RSS_ENABLED,
171 !!(table->spec[EFX_FILTER_INDEX_MC_DEF].flags &
172 EFX_FILTER_FLAG_RX_RSS));
173 EFX_SET_OWORD_FIELD(
174 filter_ctl, FRF_CZ_MULTICAST_NOMATCH_IP_OVERRIDE,
175 !!(table->spec[EFX_FILTER_INDEX_MC_DEF].flags &
176 EFX_FILTER_FLAG_RX_OVERRIDE_IP));
177 }
178
146 efx_writeo(efx, &filter_ctl, FR_BZ_RX_FILTER_CTL); 179 efx_writeo(efx, &filter_ctl, FR_BZ_RX_FILTER_CTL);
147} 180}
148 181
@@ -319,6 +352,52 @@ int efx_filter_set_eth_local(struct efx_filter_spec *spec,
319 return 0; 352 return 0;
320} 353}
321 354
355/**
356 * efx_filter_set_uc_def - specify matching otherwise-unmatched unicast
357 * @spec: Specification to initialise
358 */
359int efx_filter_set_uc_def(struct efx_filter_spec *spec)
360{
361 EFX_BUG_ON_PARANOID(!(spec->flags &
362 (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)));
363
364 if (spec->type != EFX_FILTER_UNSPEC)
365 return -EINVAL;
366
367 spec->type = EFX_FILTER_UC_DEF;
368 memset(spec->data, 0, sizeof(spec->data)); /* ensure equality */
369 return 0;
370}
371
372/**
373 * efx_filter_set_mc_def - specify matching otherwise-unmatched multicast
374 * @spec: Specification to initialise
375 */
376int efx_filter_set_mc_def(struct efx_filter_spec *spec)
377{
378 EFX_BUG_ON_PARANOID(!(spec->flags &
379 (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)));
380
381 if (spec->type != EFX_FILTER_UNSPEC)
382 return -EINVAL;
383
384 spec->type = EFX_FILTER_MC_DEF;
385 memset(spec->data, 0, sizeof(spec->data)); /* ensure equality */
386 return 0;
387}
388
389static void efx_filter_reset_rx_def(struct efx_nic *efx, unsigned filter_idx)
390{
391 struct efx_filter_state *state = efx->filter_state;
392 struct efx_filter_table *table = &state->table[EFX_FILTER_TABLE_RX_DEF];
393 struct efx_filter_spec *spec = &table->spec[filter_idx];
394
395 efx_filter_init_rx(spec, EFX_FILTER_PRI_MANUAL,
396 EFX_FILTER_FLAG_RX_RSS, 0);
397 spec->type = EFX_FILTER_UC_DEF + filter_idx;
398 table->used_bitmap[0] |= 1 << filter_idx;
399}
400
322int efx_filter_get_eth_local(const struct efx_filter_spec *spec, 401int efx_filter_get_eth_local(const struct efx_filter_spec *spec,
323 u16 *vid, u8 *addr) 402 u16 *vid, u8 *addr)
324{ 403{
@@ -366,6 +445,13 @@ static u32 efx_filter_build(efx_oword_t *filter, struct efx_filter_spec *spec)
366 break; 445 break;
367 } 446 }
368 447
448 case EFX_FILTER_TABLE_RX_DEF:
449 /* One filter spec per type */
450 BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0);
451 BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF !=
452 EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF);
453 return spec->type - EFX_FILTER_UC_DEF;
454
369 case EFX_FILTER_TABLE_RX_MAC: { 455 case EFX_FILTER_TABLE_RX_MAC: {
370 bool is_wild = spec->type == EFX_FILTER_MAC_WILD; 456 bool is_wild = spec->type == EFX_FILTER_MAC_WILD;
371 EFX_POPULATE_OWORD_8( 457 EFX_POPULATE_OWORD_8(
@@ -448,23 +534,40 @@ static int efx_filter_search(struct efx_filter_table *table,
448 * MAC filters without overriding behaviour. 534 * MAC filters without overriding behaviour.
449 */ 535 */
450 536
537#define EFX_FILTER_MATCH_PRI_RX_MAC_OVERRIDE_IP 0
538#define EFX_FILTER_MATCH_PRI_RX_DEF_OVERRIDE_IP 1
539#define EFX_FILTER_MATCH_PRI_NORMAL_BASE 2
540
451#define EFX_FILTER_INDEX_WIDTH 13 541#define EFX_FILTER_INDEX_WIDTH 13
452#define EFX_FILTER_INDEX_MASK ((1 << EFX_FILTER_INDEX_WIDTH) - 1) 542#define EFX_FILTER_INDEX_MASK ((1 << EFX_FILTER_INDEX_WIDTH) - 1)
453 543
454static inline u32 efx_filter_make_id(enum efx_filter_table_id table_id, 544static inline u32 efx_filter_make_id(enum efx_filter_table_id table_id,
455 unsigned int index, u8 flags) 545 unsigned int index, u8 flags)
456{ 546{
457 return (table_id == EFX_FILTER_TABLE_RX_MAC && 547 unsigned int match_pri = EFX_FILTER_MATCH_PRI_NORMAL_BASE + table_id;
458 flags & EFX_FILTER_FLAG_RX_OVERRIDE_IP) ? 548
459 index : 549 if (flags & EFX_FILTER_FLAG_RX_OVERRIDE_IP) {
460 (table_id + 1) << EFX_FILTER_INDEX_WIDTH | index; 550 if (table_id == EFX_FILTER_TABLE_RX_MAC)
551 match_pri = EFX_FILTER_MATCH_PRI_RX_MAC_OVERRIDE_IP;
552 else if (table_id == EFX_FILTER_TABLE_RX_DEF)
553 match_pri = EFX_FILTER_MATCH_PRI_RX_DEF_OVERRIDE_IP;
554 }
555
556 return match_pri << EFX_FILTER_INDEX_WIDTH | index;
461} 557}
462 558
463static inline enum efx_filter_table_id efx_filter_id_table_id(u32 id) 559static inline enum efx_filter_table_id efx_filter_id_table_id(u32 id)
464{ 560{
465 return (id <= EFX_FILTER_INDEX_MASK) ? 561 unsigned int match_pri = id >> EFX_FILTER_INDEX_WIDTH;
466 EFX_FILTER_TABLE_RX_MAC : 562
467 (id >> EFX_FILTER_INDEX_WIDTH) - 1; 563 switch (match_pri) {
564 case EFX_FILTER_MATCH_PRI_RX_MAC_OVERRIDE_IP:
565 return EFX_FILTER_TABLE_RX_MAC;
566 case EFX_FILTER_MATCH_PRI_RX_DEF_OVERRIDE_IP:
567 return EFX_FILTER_TABLE_RX_DEF;
568 default:
569 return match_pri - EFX_FILTER_MATCH_PRI_NORMAL_BASE;
570 }
468} 571}
469 572
470static inline unsigned int efx_filter_id_index(u32 id) 573static inline unsigned int efx_filter_id_index(u32 id)
@@ -474,23 +577,27 @@ static inline unsigned int efx_filter_id_index(u32 id)
474 577
475static inline u8 efx_filter_id_flags(u32 id) 578static inline u8 efx_filter_id_flags(u32 id)
476{ 579{
477 return (id <= EFX_FILTER_INDEX_MASK) ? 580 unsigned int match_pri = id >> EFX_FILTER_INDEX_WIDTH;
478 EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_RX_OVERRIDE_IP : 581
479 EFX_FILTER_FLAG_RX; 582 if (match_pri < EFX_FILTER_MATCH_PRI_NORMAL_BASE)
583 return EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_RX_OVERRIDE_IP;
584 else
585 return EFX_FILTER_FLAG_RX;
480} 586}
481 587
482u32 efx_filter_get_rx_id_limit(struct efx_nic *efx) 588u32 efx_filter_get_rx_id_limit(struct efx_nic *efx)
483{ 589{
484 struct efx_filter_state *state = efx->filter_state; 590 struct efx_filter_state *state = efx->filter_state;
591 unsigned int table_id = EFX_FILTER_TABLE_RX_DEF;
485 592
486 if (state->table[EFX_FILTER_TABLE_RX_MAC].size != 0) 593 do {
487 return ((EFX_FILTER_TABLE_RX_MAC + 1) << EFX_FILTER_INDEX_WIDTH) 594 if (state->table[table_id].size != 0)
488 + state->table[EFX_FILTER_TABLE_RX_MAC].size; 595 return ((EFX_FILTER_MATCH_PRI_NORMAL_BASE + table_id)
489 else if (state->table[EFX_FILTER_TABLE_RX_IP].size != 0) 596 << EFX_FILTER_INDEX_WIDTH) +
490 return ((EFX_FILTER_TABLE_RX_IP + 1) << EFX_FILTER_INDEX_WIDTH) 597 state->table[table_id].size;
491 + state->table[EFX_FILTER_TABLE_RX_IP].size; 598 } while (table_id--);
492 else 599
493 return 0; 600 return 0;
494} 601}
495 602
496/** 603/**
@@ -548,12 +655,17 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
548 } 655 }
549 *saved_spec = *spec; 656 *saved_spec = *spec;
550 657
551 if (table->search_depth[spec->type] < depth) { 658 if (table->id == EFX_FILTER_TABLE_RX_DEF) {
552 table->search_depth[spec->type] = depth; 659 efx_filter_push_rx_config(efx);
553 efx_filter_push_rx_limits(efx); 660 } else {
554 } 661 if (table->search_depth[spec->type] < depth) {
662 table->search_depth[spec->type] = depth;
663 efx_filter_push_rx_config(efx);
664 }
555 665
556 efx_writeo(efx, &filter, table->offset + table->step * filter_idx); 666 efx_writeo(efx, &filter,
667 table->offset + table->step * filter_idx);
668 }
557 669
558 netif_vdbg(efx, hw, efx->net_dev, 670 netif_vdbg(efx, hw, efx->net_dev,
559 "%s: filter type %d index %d rxq %u set", 671 "%s: filter type %d index %d rxq %u set",
@@ -571,7 +683,11 @@ static void efx_filter_table_clear_entry(struct efx_nic *efx,
571{ 683{
572 static efx_oword_t filter; 684 static efx_oword_t filter;
573 685
574 if (test_bit(filter_idx, table->used_bitmap)) { 686 if (table->id == EFX_FILTER_TABLE_RX_DEF) {
687 /* RX default filters must always exist */
688 efx_filter_reset_rx_def(efx, filter_idx);
689 efx_filter_push_rx_config(efx);
690 } else if (test_bit(filter_idx, table->used_bitmap)) {
575 __clear_bit(filter_idx, table->used_bitmap); 691 __clear_bit(filter_idx, table->used_bitmap);
576 --table->used; 692 --table->used;
577 memset(&table->spec[filter_idx], 0, sizeof(table->spec[0])); 693 memset(&table->spec[filter_idx], 0, sizeof(table->spec[0]));
@@ -617,7 +733,8 @@ int efx_filter_remove_id_safe(struct efx_nic *efx,
617 spin_lock_bh(&state->lock); 733 spin_lock_bh(&state->lock);
618 734
619 if (test_bit(filter_idx, table->used_bitmap) && 735 if (test_bit(filter_idx, table->used_bitmap) &&
620 spec->priority == priority && spec->flags == filter_flags) { 736 spec->priority == priority &&
737 !((spec->flags ^ filter_flags) & EFX_FILTER_FLAG_RX_OVERRIDE_IP)) {
621 efx_filter_table_clear_entry(efx, table, filter_idx); 738 efx_filter_table_clear_entry(efx, table, filter_idx);
622 if (table->used == 0) 739 if (table->used == 0)
623 efx_filter_table_reset_search_depth(table); 740 efx_filter_table_reset_search_depth(table);
@@ -668,7 +785,8 @@ int efx_filter_get_filter_safe(struct efx_nic *efx,
668 spin_lock_bh(&state->lock); 785 spin_lock_bh(&state->lock);
669 786
670 if (test_bit(filter_idx, table->used_bitmap) && 787 if (test_bit(filter_idx, table->used_bitmap) &&
671 spec->priority == priority && spec->flags == filter_flags) { 788 spec->priority == priority &&
789 !((spec->flags ^ filter_flags) & EFX_FILTER_FLAG_RX_OVERRIDE_IP)) {
672 *spec_buf = *spec; 790 *spec_buf = *spec;
673 rc = 0; 791 rc = 0;
674 } else { 792 } else {
@@ -722,7 +840,7 @@ u32 efx_filter_count_rx_used(struct efx_nic *efx,
722 spin_lock_bh(&state->lock); 840 spin_lock_bh(&state->lock);
723 841
724 for (table_id = EFX_FILTER_TABLE_RX_IP; 842 for (table_id = EFX_FILTER_TABLE_RX_IP;
725 table_id <= EFX_FILTER_TABLE_RX_MAC; 843 table_id <= EFX_FILTER_TABLE_RX_DEF;
726 table_id++) { 844 table_id++) {
727 table = &state->table[table_id]; 845 table = &state->table[table_id];
728 for (filter_idx = 0; filter_idx < table->size; filter_idx++) { 846 for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
@@ -750,7 +868,7 @@ s32 efx_filter_get_rx_ids(struct efx_nic *efx,
750 spin_lock_bh(&state->lock); 868 spin_lock_bh(&state->lock);
751 869
752 for (table_id = EFX_FILTER_TABLE_RX_IP; 870 for (table_id = EFX_FILTER_TABLE_RX_IP;
753 table_id <= EFX_FILTER_TABLE_RX_MAC; 871 table_id <= EFX_FILTER_TABLE_RX_DEF;
754 table_id++) { 872 table_id++) {
755 table = &state->table[table_id]; 873 table = &state->table[table_id];
756 for (filter_idx = 0; filter_idx < table->size; filter_idx++) { 874 for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
@@ -785,6 +903,11 @@ void efx_restore_filters(struct efx_nic *efx)
785 903
786 for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) { 904 for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) {
787 table = &state->table[table_id]; 905 table = &state->table[table_id];
906
907 /* Check whether this is a regular register table */
908 if (table->step == 0)
909 continue;
910
788 for (filter_idx = 0; filter_idx < table->size; filter_idx++) { 911 for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
789 if (!test_bit(filter_idx, table->used_bitmap)) 912 if (!test_bit(filter_idx, table->used_bitmap))
790 continue; 913 continue;
@@ -794,7 +917,7 @@ void efx_restore_filters(struct efx_nic *efx)
794 } 917 }
795 } 918 }
796 919
797 efx_filter_push_rx_limits(efx); 920 efx_filter_push_rx_config(efx);
798 921
799 spin_unlock_bh(&state->lock); 922 spin_unlock_bh(&state->lock);
800} 923}
@@ -833,6 +956,10 @@ int efx_probe_filters(struct efx_nic *efx)
833 table->offset = FR_CZ_RX_MAC_FILTER_TBL0; 956 table->offset = FR_CZ_RX_MAC_FILTER_TBL0;
834 table->size = FR_CZ_RX_MAC_FILTER_TBL0_ROWS; 957 table->size = FR_CZ_RX_MAC_FILTER_TBL0_ROWS;
835 table->step = FR_CZ_RX_MAC_FILTER_TBL0_STEP; 958 table->step = FR_CZ_RX_MAC_FILTER_TBL0_STEP;
959
960 table = &state->table[EFX_FILTER_TABLE_RX_DEF];
961 table->id = EFX_FILTER_TABLE_RX_DEF;
962 table->size = EFX_FILTER_SIZE_RX_DEF;
836 } 963 }
837 964
838 for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) { 965 for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) {
@@ -849,6 +976,15 @@ int efx_probe_filters(struct efx_nic *efx)
849 goto fail; 976 goto fail;
850 } 977 }
851 978
979 if (state->table[EFX_FILTER_TABLE_RX_DEF].size) {
980 /* RX default filters must always exist */
981 unsigned i;
982 for (i = 0; i < EFX_FILTER_SIZE_RX_DEF; i++)
983 efx_filter_reset_rx_def(efx, i);
984 }
985
986 efx_filter_push_rx_config(efx);
987
852 return 0; 988 return 0;
853 989
854fail: 990fail:
diff --git a/drivers/net/ethernet/sfc/filter.h b/drivers/net/ethernet/sfc/filter.h
index 3d4108cd90ca..451997841dc9 100644
--- a/drivers/net/ethernet/sfc/filter.h
+++ b/drivers/net/ethernet/sfc/filter.h
@@ -20,6 +20,8 @@
20 * @EFX_FILTER_UDP_WILD: Matching UDP/IPv4 destination (host, port) 20 * @EFX_FILTER_UDP_WILD: Matching UDP/IPv4 destination (host, port)
21 * @EFX_FILTER_MAC_FULL: Matching Ethernet destination MAC address, VID 21 * @EFX_FILTER_MAC_FULL: Matching Ethernet destination MAC address, VID
22 * @EFX_FILTER_MAC_WILD: Matching Ethernet destination MAC address 22 * @EFX_FILTER_MAC_WILD: Matching Ethernet destination MAC address
23 * @EFX_FILTER_UC_DEF: Matching all otherwise unmatched unicast
24 * @EFX_FILTER_MC_DEF: Matching all otherwise unmatched multicast
23 * @EFX_FILTER_UNSPEC: Match type is unspecified 25 * @EFX_FILTER_UNSPEC: Match type is unspecified
24 * 26 *
25 * Falcon NICs only support the TCP/IPv4 and UDP/IPv4 filter types. 27 * Falcon NICs only support the TCP/IPv4 and UDP/IPv4 filter types.
@@ -31,6 +33,8 @@ enum efx_filter_type {
31 EFX_FILTER_UDP_WILD, 33 EFX_FILTER_UDP_WILD,
32 EFX_FILTER_MAC_FULL = 4, 34 EFX_FILTER_MAC_FULL = 4,
33 EFX_FILTER_MAC_WILD, 35 EFX_FILTER_MAC_WILD,
36 EFX_FILTER_UC_DEF = 8,
37 EFX_FILTER_MC_DEF,
34 EFX_FILTER_TYPE_COUNT, /* number of specific types */ 38 EFX_FILTER_TYPE_COUNT, /* number of specific types */
35 EFX_FILTER_UNSPEC = 0xf, 39 EFX_FILTER_UNSPEC = 0xf,
36}; 40};
@@ -117,6 +121,8 @@ extern int efx_filter_set_eth_local(struct efx_filter_spec *spec,
117 u16 vid, const u8 *addr); 121 u16 vid, const u8 *addr);
118extern int efx_filter_get_eth_local(const struct efx_filter_spec *spec, 122extern int efx_filter_get_eth_local(const struct efx_filter_spec *spec,
119 u16 *vid, u8 *addr); 123 u16 *vid, u8 *addr);
124extern int efx_filter_set_uc_def(struct efx_filter_spec *spec);
125extern int efx_filter_set_mc_def(struct efx_filter_spec *spec);
120enum { 126enum {
121 EFX_FILTER_VID_UNSPEC = 0xffff, 127 EFX_FILTER_VID_UNSPEC = 0xffff,
122}; 128};