Lines Matching refs:spec

55 		unsigned long spec;	/* pointer to spec plus flag bits */  member
2176 static unsigned int efx_ef10_filter_hash(const struct efx_filter_spec *spec) in efx_ef10_filter_hash() argument
2179 return jhash2((const u32 *)&spec->outer_vid, in efx_ef10_filter_hash()
2191 static bool efx_ef10_filter_is_exclusive(const struct efx_filter_spec *spec) in efx_ef10_filter_is_exclusive() argument
2193 if (spec->match_flags & EFX_FILTER_MATCH_LOC_MAC && in efx_ef10_filter_is_exclusive()
2194 !is_multicast_ether_addr(spec->loc_mac)) in efx_ef10_filter_is_exclusive()
2197 if ((spec->match_flags & in efx_ef10_filter_is_exclusive()
2200 if (spec->ether_type == htons(ETH_P_IP) && in efx_ef10_filter_is_exclusive()
2201 !ipv4_is_multicast(spec->loc_host[0])) in efx_ef10_filter_is_exclusive()
2203 if (spec->ether_type == htons(ETH_P_IPV6) && in efx_ef10_filter_is_exclusive()
2204 ((const u8 *)spec->loc_host)[0] != 0xff) in efx_ef10_filter_is_exclusive()
2215 return (struct efx_filter_spec *)(table->entry[filter_idx].spec & in efx_ef10_filter_entry_spec()
2223 return table->entry[filter_idx].spec & EFX_EF10_FILTER_FLAGS; in efx_ef10_filter_entry_flags()
2229 const struct efx_filter_spec *spec, in efx_ef10_filter_set_entry() argument
2232 table->entry[filter_idx].spec = (unsigned long)spec | flags; in efx_ef10_filter_set_entry()
2236 const struct efx_filter_spec *spec, in efx_ef10_filter_push_prep() argument
2252 efx_ef10_filter_is_exclusive(spec) ? in efx_ef10_filter_push_prep()
2260 if (spec->match_flags & EFX_FILTER_MATCH_LOC_MAC_IG) in efx_ef10_filter_push_prep()
2262 is_multicast_ether_addr(spec->loc_mac) ? in efx_ef10_filter_push_prep()
2266 if (spec->match_flags & EFX_FILTER_MATCH_ ## gen_flag) { \ in efx_ef10_filter_push_prep()
2272 sizeof(spec->gen_field)); \ in efx_ef10_filter_push_prep()
2274 &spec->gen_field, sizeof(spec->gen_field)); \ in efx_ef10_filter_push_prep()
2293 spec->dmaq_id == EFX_FILTER_RX_DMAQ_ID_DROP ? in efx_ef10_filter_push_prep()
2299 spec->dmaq_id == EFX_FILTER_RX_DMAQ_ID_DROP ? in efx_ef10_filter_push_prep()
2300 0 : spec->dmaq_id); in efx_ef10_filter_push_prep()
2302 (spec->flags & EFX_FILTER_FLAG_RX_RSS) ? in efx_ef10_filter_push_prep()
2305 if (spec->flags & EFX_FILTER_FLAG_RX_RSS) in efx_ef10_filter_push_prep()
2307 spec->rss_context != in efx_ef10_filter_push_prep()
2309 spec->rss_context : nic_data->rx_rss_context); in efx_ef10_filter_push_prep()
2313 const struct efx_filter_spec *spec, in efx_ef10_filter_push() argument
2320 efx_ef10_filter_push_prep(efx, spec, inbuf, *handle, replacing); in efx_ef10_filter_push()
2345 struct efx_filter_spec *spec, in efx_ef10_filter_insert() argument
2360 if ((spec->flags & (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)) != in efx_ef10_filter_insert()
2364 rc = efx_ef10_filter_rx_match_pri(table, spec->match_flags); in efx_ef10_filter_insert()
2369 hash = efx_ef10_filter_hash(spec); in efx_ef10_filter_insert()
2370 is_mc_recip = efx_filter_is_mc_recipient(spec); in efx_ef10_filter_insert()
2391 } else if (efx_ef10_filter_equal(spec, saved_spec)) { in efx_ef10_filter_insert()
2392 if (table->entry[i].spec & in efx_ef10_filter_insert()
2395 if (spec->priority < saved_spec->priority && in efx_ef10_filter_insert()
2396 spec->priority != EFX_FILTER_PRI_AUTO) { in efx_ef10_filter_insert()
2402 if (spec->priority == in efx_ef10_filter_insert()
2410 } else if (spec->priority > in efx_ef10_filter_insert()
2412 (spec->priority == in efx_ef10_filter_insert()
2450 if (spec->priority == EFX_FILTER_PRI_AUTO && in efx_ef10_filter_insert()
2455 table->entry[ins_index].spec &= in efx_ef10_filter_insert()
2463 saved_spec = kmalloc(sizeof(*spec), GFP_ATOMIC); in efx_ef10_filter_insert()
2468 *saved_spec = *spec; in efx_ef10_filter_insert()
2481 table->entry[i].spec |= in efx_ef10_filter_insert()
2488 rc = efx_ef10_filter_push(efx, spec, &table->entry[ins_index].handle, in efx_ef10_filter_insert()
2499 saved_spec->priority = spec->priority; in efx_ef10_filter_insert()
2501 saved_spec->flags |= spec->flags; in efx_ef10_filter_insert()
2502 saved_spec->rss_context = spec->rss_context; in efx_ef10_filter_insert()
2503 saved_spec->dmaq_id = spec->dmaq_id; in efx_ef10_filter_insert()
2582 struct efx_filter_spec *spec; in efx_ef10_filter_remove_internal() local
2592 if (!(table->entry[filter_idx].spec & in efx_ef10_filter_remove_internal()
2600 spec = efx_ef10_filter_entry_spec(table, filter_idx); in efx_ef10_filter_remove_internal()
2601 if (!spec || in efx_ef10_filter_remove_internal()
2603 efx_ef10_filter_rx_match_pri(table, spec->match_flags) != in efx_ef10_filter_remove_internal()
2609 if (spec->flags & EFX_FILTER_FLAG_RX_OVER_AUTO && in efx_ef10_filter_remove_internal()
2612 spec->flags &= ~EFX_FILTER_FLAG_RX_OVER_AUTO; in efx_ef10_filter_remove_internal()
2613 table->entry[filter_idx].spec &= ~EFX_EF10_FILTER_FLAG_AUTO_OLD; in efx_ef10_filter_remove_internal()
2618 if (!(priority_mask & (1U << spec->priority))) { in efx_ef10_filter_remove_internal()
2623 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_remove_internal()
2626 if (spec->flags & EFX_FILTER_FLAG_RX_OVER_AUTO) { in efx_ef10_filter_remove_internal()
2629 struct efx_filter_spec new_spec = *spec; in efx_ef10_filter_remove_internal()
2642 *spec = new_spec; in efx_ef10_filter_remove_internal()
2647 efx_ef10_filter_is_exclusive(spec) ? in efx_ef10_filter_remove_internal()
2657 kfree(spec); in efx_ef10_filter_remove_internal()
2662 table->entry[filter_idx].spec &= ~EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_remove_internal()
2680 u32 filter_id, struct efx_filter_spec *spec) in efx_ef10_filter_get_safe() argument
2692 *spec = *saved_spec; in efx_ef10_filter_get_safe()
2730 if (table->entry[filter_idx].spec && in efx_ef10_filter_count_rx_used()
2751 struct efx_filter_spec *spec; in efx_ef10_filter_get_rx_ids() local
2757 spec = efx_ef10_filter_entry_spec(table, filter_idx); in efx_ef10_filter_get_rx_ids()
2758 if (spec && spec->priority == priority) { in efx_ef10_filter_get_rx_ids()
2764 table, spec->match_flags) * in efx_ef10_filter_get_rx_ids()
2778 struct efx_filter_spec *spec) in efx_ef10_filter_rfs_insert() argument
2794 EFX_WARN_ON_PARANOID(spec->flags != in efx_ef10_filter_rfs_insert()
2796 EFX_WARN_ON_PARANOID(spec->priority != EFX_FILTER_PRI_HINT); in efx_ef10_filter_rfs_insert()
2797 EFX_WARN_ON_PARANOID(efx_filter_is_mc_recipient(spec)); in efx_ef10_filter_rfs_insert()
2799 hash = efx_ef10_filter_hash(spec); in efx_ef10_filter_rfs_insert()
2814 } else if (efx_ef10_filter_equal(spec, saved_spec)) { in efx_ef10_filter_rfs_insert()
2815 if (table->entry[i].spec & EFX_EF10_FILTER_FLAG_BUSY) { in efx_ef10_filter_rfs_insert()
2819 if (spec->priority < saved_spec->priority) { in efx_ef10_filter_rfs_insert()
2851 saved_spec = kmalloc(sizeof(*spec), GFP_ATOMIC); in efx_ef10_filter_rfs_insert()
2856 *saved_spec = *spec; in efx_ef10_filter_rfs_insert()
2864 cookie = replacing << 31 | ins_index << 16 | spec->dmaq_id; in efx_ef10_filter_rfs_insert()
2866 efx_ef10_filter_push_prep(efx, spec, inbuf, in efx_ef10_filter_rfs_insert()
2886 struct efx_filter_spec *spec; in efx_ef10_filter_rfs_insert_complete() local
2895 spec = efx_ef10_filter_entry_spec(table, ins_index); in efx_ef10_filter_rfs_insert_complete()
2900 spec->dmaq_id = dmaq_id; in efx_ef10_filter_rfs_insert_complete()
2902 kfree(spec); in efx_ef10_filter_rfs_insert_complete()
2903 spec = NULL; in efx_ef10_filter_rfs_insert_complete()
2905 efx_ef10_filter_set_entry(table, ins_index, spec, 0); in efx_ef10_filter_rfs_insert_complete()
2921 struct efx_filter_spec *spec = in efx_ef10_filter_rfs_expire_one() local
2927 if (!spec || in efx_ef10_filter_rfs_expire_one()
2928 (table->entry[filter_idx].spec & EFX_EF10_FILTER_FLAG_BUSY) || in efx_ef10_filter_rfs_expire_one()
2929 spec->priority != EFX_FILTER_PRI_HINT || in efx_ef10_filter_rfs_expire_one()
2930 !rps_may_expire_flow(efx->net_dev, spec->dmaq_id, in efx_ef10_filter_rfs_expire_one()
2942 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_rfs_expire_one()
2953 struct efx_filter_spec *spec = in efx_ef10_filter_rfs_expire_complete() local
2958 kfree(spec); in efx_ef10_filter_rfs_expire_complete()
2961 table->entry[filter_idx].spec &= ~EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_rfs_expire_complete()
3064 struct efx_filter_spec *spec; in efx_ef10_filter_table_restore() local
3075 spec = efx_ef10_filter_entry_spec(table, filter_idx); in efx_ef10_filter_table_restore()
3076 if (!spec) in efx_ef10_filter_table_restore()
3079 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_table_restore()
3082 rc = efx_ef10_filter_push(efx, spec, in efx_ef10_filter_table_restore()
3090 kfree(spec); in efx_ef10_filter_table_restore()
3093 table->entry[filter_idx].spec &= in efx_ef10_filter_table_restore()
3111 struct efx_filter_spec *spec; in efx_ef10_filter_table_remove() local
3116 spec = efx_ef10_filter_entry_spec(table, filter_idx); in efx_ef10_filter_table_remove()
3117 if (!spec) in efx_ef10_filter_table_remove()
3121 efx_ef10_filter_is_exclusive(spec) ? in efx_ef10_filter_table_remove()
3133 kfree(spec); in efx_ef10_filter_table_remove()
3144 struct efx_filter_spec spec; in efx_ef10_filter_sync_rx_mode() local
3159 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_AUTO_OLD; in efx_ef10_filter_sync_rx_mode()
3164 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_AUTO_OLD; in efx_ef10_filter_sync_rx_mode()
3201 efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, in efx_ef10_filter_sync_rx_mode()
3204 efx_filter_set_eth_local(&spec, EFX_FILTER_VID_UNSPEC, in efx_ef10_filter_sync_rx_mode()
3206 rc = efx_ef10_filter_insert(efx, &spec, true); in efx_ef10_filter_sync_rx_mode()
3220 efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, in efx_ef10_filter_sync_rx_mode()
3223 efx_filter_set_uc_def(&spec); in efx_ef10_filter_sync_rx_mode()
3224 rc = efx_ef10_filter_insert(efx, &spec, true); in efx_ef10_filter_sync_rx_mode()
3236 efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, in efx_ef10_filter_sync_rx_mode()
3239 efx_filter_set_eth_local(&spec, EFX_FILTER_VID_UNSPEC, in efx_ef10_filter_sync_rx_mode()
3241 rc = efx_ef10_filter_insert(efx, &spec, true); in efx_ef10_filter_sync_rx_mode()
3255 efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, in efx_ef10_filter_sync_rx_mode()
3258 efx_filter_set_mc_def(&spec); in efx_ef10_filter_sync_rx_mode()
3259 rc = efx_ef10_filter_insert(efx, &spec, true); in efx_ef10_filter_sync_rx_mode()
3274 if (ACCESS_ONCE(table->entry[i].spec) & in efx_ef10_filter_sync_rx_mode()