Lines Matching refs:spec

65 		unsigned long spec;	/* pointer to spec plus flag bits */  member
2860 static unsigned int efx_ef10_filter_hash(const struct efx_filter_spec *spec) in efx_ef10_filter_hash() argument
2863 return jhash2((const u32 *)&spec->outer_vid, in efx_ef10_filter_hash()
2875 static bool efx_ef10_filter_is_exclusive(const struct efx_filter_spec *spec) in efx_ef10_filter_is_exclusive() argument
2877 if (spec->match_flags & EFX_FILTER_MATCH_LOC_MAC && in efx_ef10_filter_is_exclusive()
2878 !is_multicast_ether_addr(spec->loc_mac)) in efx_ef10_filter_is_exclusive()
2881 if ((spec->match_flags & in efx_ef10_filter_is_exclusive()
2884 if (spec->ether_type == htons(ETH_P_IP) && in efx_ef10_filter_is_exclusive()
2885 !ipv4_is_multicast(spec->loc_host[0])) in efx_ef10_filter_is_exclusive()
2887 if (spec->ether_type == htons(ETH_P_IPV6) && in efx_ef10_filter_is_exclusive()
2888 ((const u8 *)spec->loc_host)[0] != 0xff) in efx_ef10_filter_is_exclusive()
2899 return (struct efx_filter_spec *)(table->entry[filter_idx].spec & in efx_ef10_filter_entry_spec()
2907 return table->entry[filter_idx].spec & EFX_EF10_FILTER_FLAGS; in efx_ef10_filter_entry_flags()
2913 const struct efx_filter_spec *spec, in efx_ef10_filter_set_entry() argument
2916 table->entry[filter_idx].spec = (unsigned long)spec | flags; in efx_ef10_filter_set_entry()
2920 const struct efx_filter_spec *spec, in efx_ef10_filter_push_prep() argument
2936 efx_ef10_filter_is_exclusive(spec) ? in efx_ef10_filter_push_prep()
2944 if (spec->match_flags & EFX_FILTER_MATCH_LOC_MAC_IG) in efx_ef10_filter_push_prep()
2946 is_multicast_ether_addr(spec->loc_mac) ? in efx_ef10_filter_push_prep()
2950 if (spec->match_flags & EFX_FILTER_MATCH_ ## gen_flag) { \ in efx_ef10_filter_push_prep()
2956 sizeof(spec->gen_field)); \ in efx_ef10_filter_push_prep()
2958 &spec->gen_field, sizeof(spec->gen_field)); \ in efx_ef10_filter_push_prep()
2977 spec->dmaq_id == EFX_FILTER_RX_DMAQ_ID_DROP ? in efx_ef10_filter_push_prep()
2984 spec->dmaq_id == EFX_FILTER_RX_DMAQ_ID_DROP ? in efx_ef10_filter_push_prep()
2985 0 : spec->dmaq_id); in efx_ef10_filter_push_prep()
2987 (spec->flags & EFX_FILTER_FLAG_RX_RSS) ? in efx_ef10_filter_push_prep()
2990 if (spec->flags & EFX_FILTER_FLAG_RX_RSS) in efx_ef10_filter_push_prep()
2992 spec->rss_context != in efx_ef10_filter_push_prep()
2994 spec->rss_context : nic_data->rx_rss_context); in efx_ef10_filter_push_prep()
2998 const struct efx_filter_spec *spec, in efx_ef10_filter_push() argument
3005 efx_ef10_filter_push_prep(efx, spec, inbuf, *handle, replacing); in efx_ef10_filter_push()
3030 struct efx_filter_spec *spec, in efx_ef10_filter_insert() argument
3045 if ((spec->flags & (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)) != in efx_ef10_filter_insert()
3049 rc = efx_ef10_filter_rx_match_pri(table, spec->match_flags); in efx_ef10_filter_insert()
3054 hash = efx_ef10_filter_hash(spec); in efx_ef10_filter_insert()
3055 is_mc_recip = efx_filter_is_mc_recipient(spec); in efx_ef10_filter_insert()
3076 } else if (efx_ef10_filter_equal(spec, saved_spec)) { in efx_ef10_filter_insert()
3077 if (table->entry[i].spec & in efx_ef10_filter_insert()
3080 if (spec->priority < saved_spec->priority && in efx_ef10_filter_insert()
3081 spec->priority != EFX_FILTER_PRI_AUTO) { in efx_ef10_filter_insert()
3087 if (spec->priority == in efx_ef10_filter_insert()
3095 } else if (spec->priority > in efx_ef10_filter_insert()
3097 (spec->priority == in efx_ef10_filter_insert()
3135 if (spec->priority == EFX_FILTER_PRI_AUTO && in efx_ef10_filter_insert()
3140 table->entry[ins_index].spec &= in efx_ef10_filter_insert()
3148 saved_spec = kmalloc(sizeof(*spec), GFP_ATOMIC); in efx_ef10_filter_insert()
3153 *saved_spec = *spec; in efx_ef10_filter_insert()
3166 table->entry[i].spec |= in efx_ef10_filter_insert()
3173 rc = efx_ef10_filter_push(efx, spec, &table->entry[ins_index].handle, in efx_ef10_filter_insert()
3184 saved_spec->priority = spec->priority; in efx_ef10_filter_insert()
3186 saved_spec->flags |= spec->flags; in efx_ef10_filter_insert()
3187 saved_spec->rss_context = spec->rss_context; in efx_ef10_filter_insert()
3188 saved_spec->dmaq_id = spec->dmaq_id; in efx_ef10_filter_insert()
3267 struct efx_filter_spec *spec; in efx_ef10_filter_remove_internal() local
3277 if (!(table->entry[filter_idx].spec & in efx_ef10_filter_remove_internal()
3285 spec = efx_ef10_filter_entry_spec(table, filter_idx); in efx_ef10_filter_remove_internal()
3286 if (!spec || in efx_ef10_filter_remove_internal()
3288 efx_ef10_filter_rx_match_pri(table, spec->match_flags) != in efx_ef10_filter_remove_internal()
3294 if (spec->flags & EFX_FILTER_FLAG_RX_OVER_AUTO && in efx_ef10_filter_remove_internal()
3297 spec->flags &= ~EFX_FILTER_FLAG_RX_OVER_AUTO; in efx_ef10_filter_remove_internal()
3298 table->entry[filter_idx].spec &= ~EFX_EF10_FILTER_FLAG_AUTO_OLD; in efx_ef10_filter_remove_internal()
3303 if (!(priority_mask & (1U << spec->priority))) { in efx_ef10_filter_remove_internal()
3308 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_remove_internal()
3311 if (spec->flags & EFX_FILTER_FLAG_RX_OVER_AUTO) { in efx_ef10_filter_remove_internal()
3314 struct efx_filter_spec new_spec = *spec; in efx_ef10_filter_remove_internal()
3328 *spec = new_spec; in efx_ef10_filter_remove_internal()
3333 efx_ef10_filter_is_exclusive(spec) ? in efx_ef10_filter_remove_internal()
3343 kfree(spec); in efx_ef10_filter_remove_internal()
3348 table->entry[filter_idx].spec &= ~EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_remove_internal()
3379 u32 filter_id, struct efx_filter_spec *spec) in efx_ef10_filter_get_safe() argument
3391 *spec = *saved_spec; in efx_ef10_filter_get_safe()
3429 if (table->entry[filter_idx].spec && in efx_ef10_filter_count_rx_used()
3450 struct efx_filter_spec *spec; in efx_ef10_filter_get_rx_ids() local
3456 spec = efx_ef10_filter_entry_spec(table, filter_idx); in efx_ef10_filter_get_rx_ids()
3457 if (spec && spec->priority == priority) { in efx_ef10_filter_get_rx_ids()
3463 table, spec->match_flags) * in efx_ef10_filter_get_rx_ids()
3477 struct efx_filter_spec *spec) in efx_ef10_filter_rfs_insert() argument
3493 EFX_WARN_ON_PARANOID(spec->flags != in efx_ef10_filter_rfs_insert()
3495 EFX_WARN_ON_PARANOID(spec->priority != EFX_FILTER_PRI_HINT); in efx_ef10_filter_rfs_insert()
3496 EFX_WARN_ON_PARANOID(efx_filter_is_mc_recipient(spec)); in efx_ef10_filter_rfs_insert()
3498 hash = efx_ef10_filter_hash(spec); in efx_ef10_filter_rfs_insert()
3513 } else if (efx_ef10_filter_equal(spec, saved_spec)) { in efx_ef10_filter_rfs_insert()
3514 if (table->entry[i].spec & EFX_EF10_FILTER_FLAG_BUSY) { in efx_ef10_filter_rfs_insert()
3518 if (spec->priority < saved_spec->priority) { in efx_ef10_filter_rfs_insert()
3550 saved_spec = kmalloc(sizeof(*spec), GFP_ATOMIC); in efx_ef10_filter_rfs_insert()
3555 *saved_spec = *spec; in efx_ef10_filter_rfs_insert()
3563 cookie = replacing << 31 | ins_index << 16 | spec->dmaq_id; in efx_ef10_filter_rfs_insert()
3565 efx_ef10_filter_push_prep(efx, spec, inbuf, in efx_ef10_filter_rfs_insert()
3585 struct efx_filter_spec *spec; in efx_ef10_filter_rfs_insert_complete() local
3594 spec = efx_ef10_filter_entry_spec(table, ins_index); in efx_ef10_filter_rfs_insert_complete()
3599 spec->dmaq_id = dmaq_id; in efx_ef10_filter_rfs_insert_complete()
3601 kfree(spec); in efx_ef10_filter_rfs_insert_complete()
3602 spec = NULL; in efx_ef10_filter_rfs_insert_complete()
3604 efx_ef10_filter_set_entry(table, ins_index, spec, 0); in efx_ef10_filter_rfs_insert_complete()
3620 struct efx_filter_spec *spec = in efx_ef10_filter_rfs_expire_one() local
3626 if (!spec || in efx_ef10_filter_rfs_expire_one()
3627 (table->entry[filter_idx].spec & EFX_EF10_FILTER_FLAG_BUSY) || in efx_ef10_filter_rfs_expire_one()
3628 spec->priority != EFX_FILTER_PRI_HINT || in efx_ef10_filter_rfs_expire_one()
3629 !rps_may_expire_flow(efx->net_dev, spec->dmaq_id, in efx_ef10_filter_rfs_expire_one()
3641 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_rfs_expire_one()
3652 struct efx_filter_spec *spec = in efx_ef10_filter_rfs_expire_complete() local
3657 kfree(spec); in efx_ef10_filter_rfs_expire_complete()
3660 table->entry[filter_idx].spec &= ~EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_rfs_expire_complete()
3770 struct efx_filter_spec *spec; in efx_ef10_filter_table_restore() local
3786 spec = efx_ef10_filter_entry_spec(table, filter_idx); in efx_ef10_filter_table_restore()
3787 if (!spec) in efx_ef10_filter_table_restore()
3790 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_BUSY; in efx_ef10_filter_table_restore()
3793 rc = efx_ef10_filter_push(efx, spec, in efx_ef10_filter_table_restore()
3801 kfree(spec); in efx_ef10_filter_table_restore()
3804 table->entry[filter_idx].spec &= in efx_ef10_filter_table_restore()
3823 struct efx_filter_spec *spec; in efx_ef10_filter_table_remove() local
3832 spec = efx_ef10_filter_entry_spec(table, filter_idx); in efx_ef10_filter_table_remove()
3833 if (!spec) in efx_ef10_filter_table_remove()
3837 efx_ef10_filter_is_exclusive(spec) ? in efx_ef10_filter_table_remove()
3849 kfree(spec); in efx_ef10_filter_table_remove()
3859 WARN_ON(!table->entry[filter_idx].spec); \
3860 table->entry[filter_idx].spec |= EFX_EF10_FILTER_FLAG_AUTO_OLD; \
3942 struct efx_filter_spec spec; in efx_ef10_filter_insert_addr_list() local
3960 efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, filter_flags, 0); in efx_ef10_filter_insert_addr_list()
3961 efx_filter_set_eth_local(&spec, EFX_FILTER_VID_UNSPEC, in efx_ef10_filter_insert_addr_list()
3963 rc = efx_ef10_filter_insert(efx, &spec, true); in efx_ef10_filter_insert_addr_list()
3989 efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, filter_flags, 0); in efx_ef10_filter_insert_addr_list()
3991 efx_filter_set_eth_local(&spec, EFX_FILTER_VID_UNSPEC, baddr); in efx_ef10_filter_insert_addr_list()
3992 rc = efx_ef10_filter_insert(efx, &spec, true); in efx_ef10_filter_insert_addr_list()
4020 struct efx_filter_spec spec; in efx_ef10_filter_insert_def() local
4026 efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, filter_flags, 0); in efx_ef10_filter_insert_def()
4029 efx_filter_set_mc_def(&spec); in efx_ef10_filter_insert_def()
4031 efx_filter_set_uc_def(&spec); in efx_ef10_filter_insert_def()
4033 rc = efx_ef10_filter_insert(efx, &spec, true); in efx_ef10_filter_insert_def()
4042 efx_filter_init_rx(&spec, EFX_FILTER_PRI_AUTO, in efx_ef10_filter_insert_def()
4045 efx_filter_set_eth_local(&spec, EFX_FILTER_VID_UNSPEC, in efx_ef10_filter_insert_def()
4047 rc = efx_ef10_filter_insert(efx, &spec, true); in efx_ef10_filter_insert_def()
4083 if (ACCESS_ONCE(table->entry[i].spec) & in efx_ef10_filter_remove_old()