Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/common/ef10_filter.c
Show All 28 Lines | |||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include "efx.h" | #include "efx.h" | ||||
#include "efx_impl.h" | #include "efx_impl.h" | ||||
#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD | #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 | ||||
#if EFSYS_OPT_FILTER | #if EFSYS_OPT_FILTER | ||||
#define EFE_SPEC(eftp, index) ((eftp)->eft_entry[(index)].efe_spec) | #define EFE_SPEC(eftp, index) ((eftp)->eft_entry[(index)].efe_spec) | ||||
static efx_filter_spec_t * | static efx_filter_spec_t * | ||||
ef10_filter_entry_spec( | ef10_filter_entry_spec( | ||||
__in const ef10_filter_table_t *eftp, | __in const ef10_filter_table_t *eftp, | ||||
▲ Show 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | ef10_filter_set_entry_not_auto_old( | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
ef10_filter_init( | ef10_filter_init( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
ef10_filter_table_t *eftp; | ef10_filter_table_t *eftp; | ||||
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | ||||
enp->en_family == EFX_FAMILY_MEDFORD); | enp->en_family == EFX_FAMILY_MEDFORD || | ||||
enp->en_family == EFX_FAMILY_MEDFORD2); | |||||
#define MATCH_MASK(match) (EFX_MASK32(match) << EFX_LOW_BIT(match)) | #define MATCH_MASK(match) (EFX_MASK32(match) << EFX_LOW_BIT(match)) | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_REM_HOST == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_REM_HOST == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_IP)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_LOC_HOST == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_LOC_HOST == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_DST_IP)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_REM_MAC == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_REM_MAC == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_SRC_MAC)); | ||||
Show All 38 Lines | fail1: | ||||
return (rc); | return (rc); | ||||
} | } | ||||
void | void | ||||
ef10_filter_fini( | ef10_filter_fini( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | ||||
enp->en_family == EFX_FAMILY_MEDFORD); | enp->en_family == EFX_FAMILY_MEDFORD || | ||||
enp->en_family == EFX_FAMILY_MEDFORD2); | |||||
if (enp->en_filter.ef_ef10_filter_table != NULL) { | if (enp->en_filter.ef_ef10_filter_table != NULL) { | ||||
EFSYS_KMEM_FREE(enp->en_esip, sizeof (ef10_filter_table_t), | EFSYS_KMEM_FREE(enp->en_esip, sizeof (ef10_filter_table_t), | ||||
enp->en_filter.ef_ef10_filter_table); | enp->en_filter.ef_ef10_filter_table); | ||||
} | } | ||||
} | } | ||||
static __checkReturn efx_rc_t | static __checkReturn efx_rc_t | ||||
▲ Show 20 Lines • Show All 328 Lines • ▼ Show 20 Lines | ef10_filter_restore( | ||||
int tbl_id; | int tbl_id; | ||||
efx_filter_spec_t *spec; | efx_filter_spec_t *spec; | ||||
ef10_filter_table_t *eftp = enp->en_filter.ef_ef10_filter_table; | ef10_filter_table_t *eftp = enp->en_filter.ef_ef10_filter_table; | ||||
boolean_t restoring; | boolean_t restoring; | ||||
efsys_lock_state_t state; | efsys_lock_state_t state; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | ||||
enp->en_family == EFX_FAMILY_MEDFORD); | enp->en_family == EFX_FAMILY_MEDFORD || | ||||
enp->en_family == EFX_FAMILY_MEDFORD2); | |||||
for (tbl_id = 0; tbl_id < EFX_EF10_FILTER_TBL_ROWS; tbl_id++) { | for (tbl_id = 0; tbl_id < EFX_EF10_FILTER_TBL_ROWS; tbl_id++) { | ||||
EFSYS_LOCK(enp->en_eslp, state); | EFSYS_LOCK(enp->en_eslp, state); | ||||
spec = ef10_filter_entry_spec(eftp, tbl_id); | spec = ef10_filter_entry_spec(eftp, tbl_id); | ||||
if (spec == NULL) { | if (spec == NULL) { | ||||
restoring = B_FALSE; | restoring = B_FALSE; | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | ef10_filter_add_internal( | ||||
unsigned int depth; | unsigned int depth; | ||||
int ins_index; | int ins_index; | ||||
boolean_t replacing = B_FALSE; | boolean_t replacing = B_FALSE; | ||||
unsigned int i; | unsigned int i; | ||||
efsys_lock_state_t state; | efsys_lock_state_t state; | ||||
boolean_t locked = B_FALSE; | boolean_t locked = B_FALSE; | ||||
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | ||||
enp->en_family == EFX_FAMILY_MEDFORD); | enp->en_family == EFX_FAMILY_MEDFORD || | ||||
enp->en_family == EFX_FAMILY_MEDFORD2); | |||||
hash = ef10_filter_hash(spec); | hash = ef10_filter_hash(spec); | ||||
/* | /* | ||||
* FIXME: Add support for inserting filters of different priorities | * FIXME: Add support for inserting filters of different priorities | ||||
* and removing lower priority multicast filters (bug 42378) | * and removing lower priority multicast filters (bug 42378) | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 255 Lines • ▼ Show 20 Lines | ef10_filter_delete( | ||||
efx_filter_spec_t *saved_spec; | efx_filter_spec_t *saved_spec; | ||||
unsigned int hash; | unsigned int hash; | ||||
unsigned int depth; | unsigned int depth; | ||||
unsigned int i; | unsigned int i; | ||||
efsys_lock_state_t state; | efsys_lock_state_t state; | ||||
boolean_t locked = B_FALSE; | boolean_t locked = B_FALSE; | ||||
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || | ||||
enp->en_family == EFX_FAMILY_MEDFORD); | enp->en_family == EFX_FAMILY_MEDFORD || | ||||
enp->en_family == EFX_FAMILY_MEDFORD2); | |||||
hash = ef10_filter_hash(spec); | hash = ef10_filter_hash(spec); | ||||
EFSYS_LOCK(enp->en_eslp, state); | EFSYS_LOCK(enp->en_eslp, state); | ||||
locked = B_TRUE; | locked = B_TRUE; | ||||
depth = 1; | depth = 1; | ||||
for (;;) { | for (;;) { | ||||
▲ Show 20 Lines • Show All 777 Lines • ▼ Show 20 Lines | ef10_filter_default_rxq_clear( | ||||
table->eft_default_rxq = NULL; | table->eft_default_rxq = NULL; | ||||
table->eft_using_rss = B_FALSE; | table->eft_using_rss = B_FALSE; | ||||
} | } | ||||
#endif /* EFSYS_OPT_FILTER */ | #endif /* EFSYS_OPT_FILTER */ | ||||
#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */ | #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */ |