Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/common/ef10_filter.c
Show First 20 Lines • Show All 139 Lines • ▼ Show 20 Lines | #define MATCH_MASK(match) (EFX_MASK32(match) << EFX_LOW_BIT(match)) | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_ETHER_TYPE == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_ETHER_TYPE == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE)); | MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_ETHER_TYPE)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_INNER_VID == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_INNER_VID == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN)); | MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_INNER_VLAN)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_OUTER_VID == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_OUTER_VID == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN)); | MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_OUTER_VLAN)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_IP_PROTO == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_IP_PROTO == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO)); | MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_IP_PROTO)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_UNKNOWN_MCAST_DST == | |||||
MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST)); | |||||
EFX_STATIC_ASSERT((uint32_t)EFX_FILTER_MATCH_UNKNOWN_UCAST_DST == | |||||
MATCH_MASK(MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST)); | |||||
#undef MATCH_MASK | #undef MATCH_MASK | ||||
EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (ef10_filter_table_t), eftp); | EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (ef10_filter_table_t), eftp); | ||||
if (!eftp) { | if (!eftp) { | ||||
rc = ENOMEM; | rc = ENOMEM; | ||||
goto fail1; | goto fail1; | ||||
} | } | ||||
Show All 26 Lines | efx_mcdi_filter_op_add( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in efx_filter_spec_t *spec, | __in efx_filter_spec_t *spec, | ||||
__in unsigned int filter_op, | __in unsigned int filter_op, | ||||
__inout ef10_filter_handle_t *handle) | __inout ef10_filter_handle_t *handle) | ||||
{ | { | ||||
efx_mcdi_req_t req; | efx_mcdi_req_t req; | ||||
uint8_t payload[MAX(MC_CMD_FILTER_OP_IN_LEN, | uint8_t payload[MAX(MC_CMD_FILTER_OP_IN_LEN, | ||||
MC_CMD_FILTER_OP_OUT_LEN)]; | MC_CMD_FILTER_OP_OUT_LEN)]; | ||||
uint32_t match_fields = 0; | |||||
efx_rc_t rc; | efx_rc_t rc; | ||||
memset(payload, 0, sizeof (payload)); | memset(payload, 0, sizeof (payload)); | ||||
req.emr_cmd = MC_CMD_FILTER_OP; | req.emr_cmd = MC_CMD_FILTER_OP; | ||||
req.emr_in_buf = payload; | req.emr_in_buf = payload; | ||||
req.emr_in_length = MC_CMD_FILTER_OP_IN_LEN; | req.emr_in_length = MC_CMD_FILTER_OP_IN_LEN; | ||||
req.emr_out_buf = payload; | req.emr_out_buf = payload; | ||||
req.emr_out_length = MC_CMD_FILTER_OP_OUT_LEN; | req.emr_out_length = MC_CMD_FILTER_OP_OUT_LEN; | ||||
Show All 10 Lines | case MC_CMD_FILTER_OP_IN_OP_SUBSCRIBE: | ||||
MCDI_IN_SET_DWORD(req, FILTER_OP_IN_OP, filter_op); | MCDI_IN_SET_DWORD(req, FILTER_OP_IN_OP, filter_op); | ||||
break; | break; | ||||
default: | default: | ||||
EFSYS_ASSERT(0); | EFSYS_ASSERT(0); | ||||
rc = EINVAL; | rc = EINVAL; | ||||
goto fail1; | goto fail1; | ||||
} | } | ||||
if (spec->efs_match_flags & EFX_FILTER_MATCH_LOC_MAC_IG) { | |||||
/* | |||||
* The LOC_MAC_IG match flag can represent unknown unicast | |||||
* or multicast filters - use the MAC address to distinguish | |||||
* them. | |||||
*/ | |||||
if (EFX_MAC_ADDR_IS_MULTICAST(spec->efs_loc_mac)) | |||||
match_fields |= 1U << | |||||
MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_LBN; | |||||
else | |||||
match_fields |= 1U << | |||||
MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_LBN; | |||||
} | |||||
match_fields |= spec->efs_match_flags & (~EFX_FILTER_MATCH_LOC_MAC_IG); | |||||
MCDI_IN_SET_DWORD(req, FILTER_OP_IN_PORT_ID, | MCDI_IN_SET_DWORD(req, FILTER_OP_IN_PORT_ID, | ||||
EVB_PORT_ID_ASSIGNED); | EVB_PORT_ID_ASSIGNED); | ||||
MCDI_IN_SET_DWORD(req, FILTER_OP_IN_MATCH_FIELDS, | MCDI_IN_SET_DWORD(req, FILTER_OP_IN_MATCH_FIELDS, | ||||
match_fields); | spec->efs_match_flags); | ||||
MCDI_IN_SET_DWORD(req, FILTER_OP_IN_RX_DEST, | MCDI_IN_SET_DWORD(req, FILTER_OP_IN_RX_DEST, | ||||
MC_CMD_FILTER_OP_IN_RX_DEST_HOST); | MC_CMD_FILTER_OP_IN_RX_DEST_HOST); | ||||
MCDI_IN_SET_DWORD(req, FILTER_OP_IN_RX_QUEUE, | MCDI_IN_SET_DWORD(req, FILTER_OP_IN_RX_QUEUE, | ||||
spec->efs_dmaq_id); | spec->efs_dmaq_id); | ||||
if (spec->efs_flags & EFX_FILTER_FLAG_RX_RSS) { | if (spec->efs_flags & EFX_FILTER_FLAG_RX_RSS) { | ||||
MCDI_IN_SET_DWORD(req, FILTER_OP_IN_RX_CONTEXT, | MCDI_IN_SET_DWORD(req, FILTER_OP_IN_RX_CONTEXT, | ||||
spec->efs_rss_context); | spec->efs_rss_context); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 642 Lines • ▼ Show 20 Lines | efx_mcdi_get_parser_disp_info( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__out uint32_t *list, | __out uint32_t *list, | ||||
__out size_t *length) | __out size_t *length) | ||||
{ | { | ||||
efx_mcdi_req_t req; | efx_mcdi_req_t req; | ||||
uint8_t payload[MAX(MC_CMD_GET_PARSER_DISP_INFO_IN_LEN, | uint8_t payload[MAX(MC_CMD_GET_PARSER_DISP_INFO_IN_LEN, | ||||
MC_CMD_GET_PARSER_DISP_INFO_OUT_LENMAX)]; | MC_CMD_GET_PARSER_DISP_INFO_OUT_LENMAX)]; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
uint32_t i; | |||||
boolean_t support_unknown_ucast = B_FALSE; | |||||
boolean_t support_unknown_mcast = B_FALSE; | |||||
(void) memset(payload, 0, sizeof (payload)); | (void) memset(payload, 0, sizeof (payload)); | ||||
req.emr_cmd = MC_CMD_GET_PARSER_DISP_INFO; | req.emr_cmd = MC_CMD_GET_PARSER_DISP_INFO; | ||||
req.emr_in_buf = payload; | req.emr_in_buf = payload; | ||||
req.emr_in_length = MC_CMD_GET_PARSER_DISP_INFO_IN_LEN; | req.emr_in_length = MC_CMD_GET_PARSER_DISP_INFO_IN_LEN; | ||||
req.emr_out_buf = payload; | req.emr_out_buf = payload; | ||||
req.emr_out_length = MC_CMD_GET_PARSER_DISP_INFO_OUT_LENMAX; | req.emr_out_length = MC_CMD_GET_PARSER_DISP_INFO_OUT_LENMAX; | ||||
Show All 18 Lines | efx_mcdi_get_parser_disp_info( | ||||
memcpy(list, | memcpy(list, | ||||
MCDI_OUT2(req, | MCDI_OUT2(req, | ||||
uint32_t, | uint32_t, | ||||
GET_PARSER_DISP_INFO_OUT_SUPPORTED_MATCHES), | GET_PARSER_DISP_INFO_OUT_SUPPORTED_MATCHES), | ||||
(*length) * sizeof (uint32_t)); | (*length) * sizeof (uint32_t)); | ||||
EFX_STATIC_ASSERT(sizeof (uint32_t) == | EFX_STATIC_ASSERT(sizeof (uint32_t) == | ||||
MC_CMD_GET_PARSER_DISP_INFO_OUT_SUPPORTED_MATCHES_LEN); | MC_CMD_GET_PARSER_DISP_INFO_OUT_SUPPORTED_MATCHES_LEN); | ||||
/* | |||||
* Remove UNKNOWN UCAST and MCAST flags, and if both are present, change | |||||
* the lower priority one to LOC_MAC_IG. | |||||
*/ | |||||
for (i = 0; i < *length; i++) { | |||||
if (list[i] & MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_LBN) { | |||||
list[i] &= | |||||
(~MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_UCAST_DST_LBN); | |||||
support_unknown_ucast = B_TRUE; | |||||
} | |||||
if (list[i] & MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_LBN) { | |||||
list[i] &= | |||||
(~MC_CMD_FILTER_OP_IN_MATCH_UNKNOWN_MCAST_DST_LBN); | |||||
support_unknown_mcast = B_TRUE; | |||||
} | |||||
if (support_unknown_ucast && support_unknown_mcast) { | |||||
list[i] &= EFX_FILTER_MATCH_LOC_MAC_IG; | |||||
break; | |||||
} | |||||
} | |||||
return (0); | return (0); | ||||
fail2: | fail2: | ||||
EFSYS_PROBE(fail2); | EFSYS_PROBE(fail2); | ||||
fail1: | fail1: | ||||
EFSYS_PROBE1(fail1, efx_rc_t, rc); | EFSYS_PROBE1(fail1, efx_rc_t, rc); | ||||
▲ Show 20 Lines • Show All 521 Lines • Show Last 20 Lines |