Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/common/efx_rx.c
Show First 20 Lines • Show All 123 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
falconsiena_rx_qdestroy( | falconsiena_rx_qdestroy( | ||||
__in efx_rxq_t *erp); | __in efx_rxq_t *erp); | ||||
#endif /* EFSYS_OPT_SIENA */ | #endif /* EFSYS_OPT_SIENA */ | ||||
#if EFSYS_OPT_SIENA | #if EFSYS_OPT_SIENA | ||||
static efx_rx_ops_t __efx_rx_siena_ops = { | static const efx_rx_ops_t __efx_rx_siena_ops = { | ||||
falconsiena_rx_init, /* erxo_init */ | falconsiena_rx_init, /* erxo_init */ | ||||
falconsiena_rx_fini, /* erxo_fini */ | falconsiena_rx_fini, /* erxo_fini */ | ||||
#if EFSYS_OPT_RX_SCATTER | #if EFSYS_OPT_RX_SCATTER | ||||
falconsiena_rx_scatter_enable, /* erxo_scatter_enable */ | falconsiena_rx_scatter_enable, /* erxo_scatter_enable */ | ||||
#endif | #endif | ||||
#if EFSYS_OPT_RX_SCALE | #if EFSYS_OPT_RX_SCALE | ||||
falconsiena_rx_scale_mode_set, /* erxo_scale_mode_set */ | falconsiena_rx_scale_mode_set, /* erxo_scale_mode_set */ | ||||
falconsiena_rx_scale_key_set, /* erxo_scale_key_set */ | falconsiena_rx_scale_key_set, /* erxo_scale_key_set */ | ||||
falconsiena_rx_scale_tbl_set, /* erxo_scale_tbl_set */ | falconsiena_rx_scale_tbl_set, /* erxo_scale_tbl_set */ | ||||
falconsiena_rx_prefix_hash, /* erxo_prefix_hash */ | falconsiena_rx_prefix_hash, /* erxo_prefix_hash */ | ||||
#endif | #endif | ||||
falconsiena_rx_prefix_pktlen, /* erxo_prefix_pktlen */ | falconsiena_rx_prefix_pktlen, /* erxo_prefix_pktlen */ | ||||
falconsiena_rx_qpost, /* erxo_qpost */ | falconsiena_rx_qpost, /* erxo_qpost */ | ||||
falconsiena_rx_qpush, /* erxo_qpush */ | falconsiena_rx_qpush, /* erxo_qpush */ | ||||
falconsiena_rx_qflush, /* erxo_qflush */ | falconsiena_rx_qflush, /* erxo_qflush */ | ||||
falconsiena_rx_qenable, /* erxo_qenable */ | falconsiena_rx_qenable, /* erxo_qenable */ | ||||
falconsiena_rx_qcreate, /* erxo_qcreate */ | falconsiena_rx_qcreate, /* erxo_qcreate */ | ||||
falconsiena_rx_qdestroy, /* erxo_qdestroy */ | falconsiena_rx_qdestroy, /* erxo_qdestroy */ | ||||
}; | }; | ||||
#endif /* EFSYS_OPT_SIENA */ | #endif /* EFSYS_OPT_SIENA */ | ||||
#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD | #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD | ||||
static efx_rx_ops_t __efx_rx_ef10_ops = { | static const efx_rx_ops_t __efx_rx_ef10_ops = { | ||||
ef10_rx_init, /* erxo_init */ | ef10_rx_init, /* erxo_init */ | ||||
ef10_rx_fini, /* erxo_fini */ | ef10_rx_fini, /* erxo_fini */ | ||||
#if EFSYS_OPT_RX_SCATTER | #if EFSYS_OPT_RX_SCATTER | ||||
ef10_rx_scatter_enable, /* erxo_scatter_enable */ | ef10_rx_scatter_enable, /* erxo_scatter_enable */ | ||||
#endif | #endif | ||||
#if EFSYS_OPT_RX_SCALE | #if EFSYS_OPT_RX_SCALE | ||||
ef10_rx_scale_mode_set, /* erxo_scale_mode_set */ | ef10_rx_scale_mode_set, /* erxo_scale_mode_set */ | ||||
ef10_rx_scale_key_set, /* erxo_scale_key_set */ | ef10_rx_scale_key_set, /* erxo_scale_key_set */ | ||||
Show All 10 Lines | |||||
}; | }; | ||||
#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */ | #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */ | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_rx_init( | efx_rx_init( | ||||
__inout efx_nic_t *enp) | __inout efx_nic_t *enp) | ||||
{ | { | ||||
efx_rx_ops_t *erxop; | const efx_rx_ops_t *erxop; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); | ||||
if (!(enp->en_mod_flags & EFX_MOD_EV)) { | if (!(enp->en_mod_flags & EFX_MOD_EV)) { | ||||
rc = EINVAL; | rc = EINVAL; | ||||
goto fail1; | goto fail1; | ||||
} | } | ||||
if (enp->en_mod_flags & EFX_MOD_RX) { | if (enp->en_mod_flags & EFX_MOD_RX) { | ||||
rc = EINVAL; | rc = EINVAL; | ||||
goto fail2; | goto fail2; | ||||
} | } | ||||
switch (enp->en_family) { | switch (enp->en_family) { | ||||
#if EFSYS_OPT_SIENA | #if EFSYS_OPT_SIENA | ||||
case EFX_FAMILY_SIENA: | case EFX_FAMILY_SIENA: | ||||
erxop = (efx_rx_ops_t *)&__efx_rx_siena_ops; | erxop = &__efx_rx_siena_ops; | ||||
break; | break; | ||||
#endif /* EFSYS_OPT_SIENA */ | #endif /* EFSYS_OPT_SIENA */ | ||||
#if EFSYS_OPT_HUNTINGTON | #if EFSYS_OPT_HUNTINGTON | ||||
case EFX_FAMILY_HUNTINGTON: | case EFX_FAMILY_HUNTINGTON: | ||||
erxop = (efx_rx_ops_t *)&__efx_rx_ef10_ops; | erxop = &__efx_rx_ef10_ops; | ||||
break; | break; | ||||
#endif /* EFSYS_OPT_HUNTINGTON */ | #endif /* EFSYS_OPT_HUNTINGTON */ | ||||
#if EFSYS_OPT_MEDFORD | #if EFSYS_OPT_MEDFORD | ||||
case EFX_FAMILY_MEDFORD: | case EFX_FAMILY_MEDFORD: | ||||
erxop = (efx_rx_ops_t *)&__efx_rx_ef10_ops; | erxop = &__efx_rx_ef10_ops; | ||||
break; | break; | ||||
#endif /* EFSYS_OPT_MEDFORD */ | #endif /* EFSYS_OPT_MEDFORD */ | ||||
default: | default: | ||||
EFSYS_ASSERT(0); | EFSYS_ASSERT(0); | ||||
rc = ENOTSUP; | rc = ENOTSUP; | ||||
goto fail3; | goto fail3; | ||||
} | } | ||||
Show All 18 Lines | fail1: | ||||
enp->en_mod_flags &= ~EFX_MOD_RX; | enp->en_mod_flags &= ~EFX_MOD_RX; | ||||
return (rc); | return (rc); | ||||
} | } | ||||
void | void | ||||
efx_rx_fini( | efx_rx_fini( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | ||||
EFSYS_ASSERT3U(enp->en_rx_qcount, ==, 0); | EFSYS_ASSERT3U(enp->en_rx_qcount, ==, 0); | ||||
erxop->erxo_fini(enp); | erxop->erxo_fini(enp); | ||||
enp->en_erxop = NULL; | enp->en_erxop = NULL; | ||||
enp->en_mod_flags &= ~EFX_MOD_RX; | enp->en_mod_flags &= ~EFX_MOD_RX; | ||||
} | } | ||||
#if EFSYS_OPT_RX_SCATTER | #if EFSYS_OPT_RX_SCATTER | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_rx_scatter_enable( | efx_rx_scatter_enable( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in unsigned int buf_size) | __in unsigned int buf_size) | ||||
{ | { | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | ||||
if ((rc = erxop->erxo_scatter_enable(enp, buf_size)) != 0) | if ((rc = erxop->erxo_scatter_enable(enp, buf_size)) != 0) | ||||
goto fail1; | goto fail1; | ||||
▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | fail1: | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_rx_scale_mode_set( | efx_rx_scale_mode_set( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in efx_rx_hash_alg_t alg, | __in efx_rx_hash_alg_t alg, | ||||
__in efx_rx_hash_type_t type, | __in efx_rx_hash_type_t type, | ||||
__in boolean_t insert) | __in boolean_t insert) | ||||
{ | { | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | ||||
if (erxop->erxo_scale_mode_set != NULL) { | if (erxop->erxo_scale_mode_set != NULL) { | ||||
if ((rc = erxop->erxo_scale_mode_set(enp, alg, | if ((rc = erxop->erxo_scale_mode_set(enp, alg, | ||||
type, insert)) != 0) | type, insert)) != 0) | ||||
Show All 10 Lines | |||||
#if EFSYS_OPT_RX_SCALE | #if EFSYS_OPT_RX_SCALE | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_rx_scale_key_set( | efx_rx_scale_key_set( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in_ecount(n) uint8_t *key, | __in_ecount(n) uint8_t *key, | ||||
__in size_t n) | __in size_t n) | ||||
{ | { | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | ||||
if ((rc = erxop->erxo_scale_key_set(enp, key, n)) != 0) | if ((rc = erxop->erxo_scale_key_set(enp, key, n)) != 0) | ||||
goto fail1; | goto fail1; | ||||
return (0); | return (0); | ||||
fail1: | fail1: | ||||
EFSYS_PROBE1(fail1, efx_rc_t, rc); | EFSYS_PROBE1(fail1, efx_rc_t, rc); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
#endif /* EFSYS_OPT_RX_SCALE */ | #endif /* EFSYS_OPT_RX_SCALE */ | ||||
#if EFSYS_OPT_RX_SCALE | #if EFSYS_OPT_RX_SCALE | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_rx_scale_tbl_set( | efx_rx_scale_tbl_set( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in_ecount(n) unsigned int *table, | __in_ecount(n) unsigned int *table, | ||||
__in size_t n) | __in size_t n) | ||||
{ | { | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | ||||
if ((rc = erxop->erxo_scale_tbl_set(enp, table, n)) != 0) | if ((rc = erxop->erxo_scale_tbl_set(enp, table, n)) != 0) | ||||
goto fail1; | goto fail1; | ||||
Show All 11 Lines | efx_rx_qpost( | ||||
__in efx_rxq_t *erp, | __in efx_rxq_t *erp, | ||||
__in_ecount(n) efsys_dma_addr_t *addrp, | __in_ecount(n) efsys_dma_addr_t *addrp, | ||||
__in size_t size, | __in size_t size, | ||||
__in unsigned int n, | __in unsigned int n, | ||||
__in unsigned int completed, | __in unsigned int completed, | ||||
__in unsigned int added) | __in unsigned int added) | ||||
{ | { | ||||
efx_nic_t *enp = erp->er_enp; | efx_nic_t *enp = erp->er_enp; | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | ||||
erxop->erxo_qpost(erp, addrp, size, n, completed, added); | erxop->erxo_qpost(erp, addrp, size, n, completed, added); | ||||
} | } | ||||
void | void | ||||
efx_rx_qpush( | efx_rx_qpush( | ||||
__in efx_rxq_t *erp, | __in efx_rxq_t *erp, | ||||
__in unsigned int added, | __in unsigned int added, | ||||
__inout unsigned int *pushedp) | __inout unsigned int *pushedp) | ||||
{ | { | ||||
efx_nic_t *enp = erp->er_enp; | efx_nic_t *enp = erp->er_enp; | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | ||||
erxop->erxo_qpush(erp, added, pushedp); | erxop->erxo_qpush(erp, added, pushedp); | ||||
} | } | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_rx_qflush( | efx_rx_qflush( | ||||
__in efx_rxq_t *erp) | __in efx_rxq_t *erp) | ||||
{ | { | ||||
efx_nic_t *enp = erp->er_enp; | efx_nic_t *enp = erp->er_enp; | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | ||||
if ((rc = erxop->erxo_qflush(erp)) != 0) | if ((rc = erxop->erxo_qflush(erp)) != 0) | ||||
goto fail1; | goto fail1; | ||||
return (0); | return (0); | ||||
fail1: | fail1: | ||||
EFSYS_PROBE1(fail1, efx_rc_t, rc); | EFSYS_PROBE1(fail1, efx_rc_t, rc); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
void | void | ||||
efx_rx_qenable( | efx_rx_qenable( | ||||
__in efx_rxq_t *erp) | __in efx_rxq_t *erp) | ||||
{ | { | ||||
efx_nic_t *enp = erp->er_enp; | efx_nic_t *enp = erp->er_enp; | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | ||||
erxop->erxo_qenable(erp); | erxop->erxo_qenable(erp); | ||||
} | } | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_rx_qcreate( | efx_rx_qcreate( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in unsigned int index, | __in unsigned int index, | ||||
__in unsigned int label, | __in unsigned int label, | ||||
__in efx_rxq_type_t type, | __in efx_rxq_type_t type, | ||||
__in efsys_mem_t *esmp, | __in efsys_mem_t *esmp, | ||||
__in size_t n, | __in size_t n, | ||||
__in uint32_t id, | __in uint32_t id, | ||||
__in efx_evq_t *eep, | __in efx_evq_t *eep, | ||||
__deref_out efx_rxq_t **erpp) | __deref_out efx_rxq_t **erpp) | ||||
{ | { | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
efx_rxq_t *erp; | efx_rxq_t *erp; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX); | ||||
/* Allocate an RXQ object */ | /* Allocate an RXQ object */ | ||||
EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_rxq_t), erp); | EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_rxq_t), erp); | ||||
Show All 28 Lines | fail1: | ||||
return (rc); | return (rc); | ||||
} | } | ||||
void | void | ||||
efx_rx_qdestroy( | efx_rx_qdestroy( | ||||
__in efx_rxq_t *erp) | __in efx_rxq_t *erp) | ||||
{ | { | ||||
efx_nic_t *enp = erp->er_enp; | efx_nic_t *enp = erp->er_enp; | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC); | ||||
erxop->erxo_qdestroy(erp); | erxop->erxo_qdestroy(erp); | ||||
} | } | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_psuedo_hdr_pkt_length_get( | efx_psuedo_hdr_pkt_length_get( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in uint8_t *buffer, | __in uint8_t *buffer, | ||||
__out uint16_t *lengthp) | __out uint16_t *lengthp) | ||||
{ | { | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
return (erxop->erxo_prefix_pktlen(enp, buffer, lengthp)); | return (erxop->erxo_prefix_pktlen(enp, buffer, lengthp)); | ||||
} | } | ||||
#if EFSYS_OPT_RX_SCALE | #if EFSYS_OPT_RX_SCALE | ||||
__checkReturn uint32_t | __checkReturn uint32_t | ||||
efx_psuedo_hdr_hash_get( | efx_psuedo_hdr_hash_get( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in efx_rx_hash_alg_t func, | __in efx_rx_hash_alg_t func, | ||||
__in uint8_t *buffer) | __in uint8_t *buffer) | ||||
{ | { | ||||
efx_rx_ops_t *erxop = enp->en_erxop; | const efx_rx_ops_t *erxop = enp->en_erxop; | ||||
EFSYS_ASSERT3U(enp->en_hash_support, ==, EFX_RX_HASH_AVAILABLE); | EFSYS_ASSERT3U(enp->en_hash_support, ==, EFX_RX_HASH_AVAILABLE); | ||||
return (erxop->erxo_prefix_hash(enp, func, buffer)); | return (erxop->erxo_prefix_hash(enp, func, buffer)); | ||||
} | } | ||||
#endif /* EFSYS_OPT_RX_SCALE */ | #endif /* EFSYS_OPT_RX_SCALE */ | ||||
#if EFSYS_OPT_SIENA | #if EFSYS_OPT_SIENA | ||||
▲ Show 20 Lines • Show All 654 Lines • Show Last 20 Lines |