Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/common/efx_nic.c
Show First 20 Lines • Show All 173 Lines • ▼ Show 20 Lines | |||||
fail1: | fail1: | ||||
EFSYS_PROBE1(fail1, efx_rc_t, rc); | EFSYS_PROBE1(fail1, efx_rc_t, rc); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
#if EFSYS_OPT_SIENA | #if EFSYS_OPT_SIENA | ||||
static efx_nic_ops_t __efx_nic_siena_ops = { | static const efx_nic_ops_t __efx_nic_siena_ops = { | ||||
siena_nic_probe, /* eno_probe */ | siena_nic_probe, /* eno_probe */ | ||||
NULL, /* eno_board_cfg */ | NULL, /* eno_board_cfg */ | ||||
NULL, /* eno_set_drv_limits */ | NULL, /* eno_set_drv_limits */ | ||||
siena_nic_reset, /* eno_reset */ | siena_nic_reset, /* eno_reset */ | ||||
siena_nic_init, /* eno_init */ | siena_nic_init, /* eno_init */ | ||||
NULL, /* eno_get_vi_pool */ | NULL, /* eno_get_vi_pool */ | ||||
NULL, /* eno_get_bar_region */ | NULL, /* eno_get_bar_region */ | ||||
#if EFSYS_OPT_DIAG | #if EFSYS_OPT_DIAG | ||||
siena_nic_register_test, /* eno_register_test */ | siena_nic_register_test, /* eno_register_test */ | ||||
#endif /* EFSYS_OPT_DIAG */ | #endif /* EFSYS_OPT_DIAG */ | ||||
siena_nic_fini, /* eno_fini */ | siena_nic_fini, /* eno_fini */ | ||||
siena_nic_unprobe, /* eno_unprobe */ | siena_nic_unprobe, /* eno_unprobe */ | ||||
}; | }; | ||||
#endif /* EFSYS_OPT_SIENA */ | #endif /* EFSYS_OPT_SIENA */ | ||||
#if EFSYS_OPT_HUNTINGTON | #if EFSYS_OPT_HUNTINGTON | ||||
static efx_nic_ops_t __efx_nic_hunt_ops = { | static const efx_nic_ops_t __efx_nic_hunt_ops = { | ||||
ef10_nic_probe, /* eno_probe */ | ef10_nic_probe, /* eno_probe */ | ||||
hunt_board_cfg, /* eno_board_cfg */ | hunt_board_cfg, /* eno_board_cfg */ | ||||
ef10_nic_set_drv_limits, /* eno_set_drv_limits */ | ef10_nic_set_drv_limits, /* eno_set_drv_limits */ | ||||
ef10_nic_reset, /* eno_reset */ | ef10_nic_reset, /* eno_reset */ | ||||
ef10_nic_init, /* eno_init */ | ef10_nic_init, /* eno_init */ | ||||
ef10_nic_get_vi_pool, /* eno_get_vi_pool */ | ef10_nic_get_vi_pool, /* eno_get_vi_pool */ | ||||
ef10_nic_get_bar_region, /* eno_get_bar_region */ | ef10_nic_get_bar_region, /* eno_get_bar_region */ | ||||
#if EFSYS_OPT_DIAG | #if EFSYS_OPT_DIAG | ||||
ef10_nic_register_test, /* eno_register_test */ | ef10_nic_register_test, /* eno_register_test */ | ||||
#endif /* EFSYS_OPT_DIAG */ | #endif /* EFSYS_OPT_DIAG */ | ||||
ef10_nic_fini, /* eno_fini */ | ef10_nic_fini, /* eno_fini */ | ||||
ef10_nic_unprobe, /* eno_unprobe */ | ef10_nic_unprobe, /* eno_unprobe */ | ||||
}; | }; | ||||
#endif /* EFSYS_OPT_HUNTINGTON */ | #endif /* EFSYS_OPT_HUNTINGTON */ | ||||
#if EFSYS_OPT_MEDFORD | #if EFSYS_OPT_MEDFORD | ||||
static efx_nic_ops_t __efx_nic_medford_ops = { | static const efx_nic_ops_t __efx_nic_medford_ops = { | ||||
ef10_nic_probe, /* eno_probe */ | ef10_nic_probe, /* eno_probe */ | ||||
medford_board_cfg, /* eno_board_cfg */ | medford_board_cfg, /* eno_board_cfg */ | ||||
ef10_nic_set_drv_limits, /* eno_set_drv_limits */ | ef10_nic_set_drv_limits, /* eno_set_drv_limits */ | ||||
ef10_nic_reset, /* eno_reset */ | ef10_nic_reset, /* eno_reset */ | ||||
ef10_nic_init, /* eno_init */ | ef10_nic_init, /* eno_init */ | ||||
ef10_nic_get_vi_pool, /* eno_get_vi_pool */ | ef10_nic_get_vi_pool, /* eno_get_vi_pool */ | ||||
ef10_nic_get_bar_region, /* eno_get_bar_region */ | ef10_nic_get_bar_region, /* eno_get_bar_region */ | ||||
#if EFSYS_OPT_DIAG | #if EFSYS_OPT_DIAG | ||||
Show All 28 Lines | if (enp == NULL) { | ||||
goto fail1; | goto fail1; | ||||
} | } | ||||
enp->en_magic = EFX_NIC_MAGIC; | enp->en_magic = EFX_NIC_MAGIC; | ||||
switch (family) { | switch (family) { | ||||
#if EFSYS_OPT_SIENA | #if EFSYS_OPT_SIENA | ||||
case EFX_FAMILY_SIENA: | case EFX_FAMILY_SIENA: | ||||
enp->en_enop = (efx_nic_ops_t *)&__efx_nic_siena_ops; | enp->en_enop = &__efx_nic_siena_ops; | ||||
enp->en_features = | enp->en_features = | ||||
EFX_FEATURE_IPV6 | | EFX_FEATURE_IPV6 | | ||||
EFX_FEATURE_LFSR_HASH_INSERT | | EFX_FEATURE_LFSR_HASH_INSERT | | ||||
EFX_FEATURE_LINK_EVENTS | | EFX_FEATURE_LINK_EVENTS | | ||||
EFX_FEATURE_PERIODIC_MAC_STATS | | EFX_FEATURE_PERIODIC_MAC_STATS | | ||||
EFX_FEATURE_WOL | | EFX_FEATURE_WOL | | ||||
EFX_FEATURE_MCDI | | EFX_FEATURE_MCDI | | ||||
EFX_FEATURE_LOOKAHEAD_SPLIT | | EFX_FEATURE_LOOKAHEAD_SPLIT | | ||||
EFX_FEATURE_MAC_HEADER_FILTERS | | EFX_FEATURE_MAC_HEADER_FILTERS | | ||||
EFX_FEATURE_TX_SRC_FILTERS; | EFX_FEATURE_TX_SRC_FILTERS; | ||||
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: | ||||
enp->en_enop = (efx_nic_ops_t *)&__efx_nic_hunt_ops; | enp->en_enop = &__efx_nic_hunt_ops; | ||||
/* FIXME: Add WOL support */ | /* FIXME: Add WOL support */ | ||||
enp->en_features = | enp->en_features = | ||||
EFX_FEATURE_IPV6 | | EFX_FEATURE_IPV6 | | ||||
EFX_FEATURE_LINK_EVENTS | | EFX_FEATURE_LINK_EVENTS | | ||||
EFX_FEATURE_PERIODIC_MAC_STATS | | EFX_FEATURE_PERIODIC_MAC_STATS | | ||||
EFX_FEATURE_MCDI | | EFX_FEATURE_MCDI | | ||||
EFX_FEATURE_MAC_HEADER_FILTERS | | EFX_FEATURE_MAC_HEADER_FILTERS | | ||||
EFX_FEATURE_MCDI_DMA | | EFX_FEATURE_MCDI_DMA | | ||||
EFX_FEATURE_PIO_BUFFERS | | EFX_FEATURE_PIO_BUFFERS | | ||||
EFX_FEATURE_FW_ASSISTED_TSO | | EFX_FEATURE_FW_ASSISTED_TSO | | ||||
EFX_FEATURE_FW_ASSISTED_TSO_V2; | EFX_FEATURE_FW_ASSISTED_TSO_V2; | ||||
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: | ||||
enp->en_enop = (efx_nic_ops_t *)&__efx_nic_medford_ops; | enp->en_enop = &__efx_nic_medford_ops; | ||||
/* | /* | ||||
* FW_ASSISTED_TSO omitted as Medford only supports firmware | * FW_ASSISTED_TSO omitted as Medford only supports firmware | ||||
* assisted TSO version 2, not the v1 scheme used on Huntington. | * assisted TSO version 2, not the v1 scheme used on Huntington. | ||||
*/ | */ | ||||
enp->en_features = | enp->en_features = | ||||
EFX_FEATURE_IPV6 | | EFX_FEATURE_IPV6 | | ||||
EFX_FEATURE_LINK_EVENTS | | EFX_FEATURE_LINK_EVENTS | | ||||
EFX_FEATURE_PERIODIC_MAC_STATS | | EFX_FEATURE_PERIODIC_MAC_STATS | | ||||
Show All 31 Lines | fail1: | ||||
return (rc); | return (rc); | ||||
} | } | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_nic_probe( | efx_nic_probe( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
efx_nic_ops_t *enop; | const efx_nic_ops_t *enop; | ||||
efx_rc_t rc; | efx_rc_t rc; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
#if EFSYS_OPT_MCDI | #if EFSYS_OPT_MCDI | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI); | ||||
#endif /* EFSYS_OPT_MCDI */ | #endif /* EFSYS_OPT_MCDI */ | ||||
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_PROBE)); | EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_PROBE)); | ||||
Show All 19 Lines | fail1: | ||||
return (rc); | return (rc); | ||||
} | } | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_nic_set_drv_limits( | efx_nic_set_drv_limits( | ||||
__inout efx_nic_t *enp, | __inout efx_nic_t *enp, | ||||
__in efx_drv_limits_t *edlp) | __in efx_drv_limits_t *edlp) | ||||
{ | { | ||||
efx_nic_ops_t *enop = enp->en_enop; | const efx_nic_ops_t *enop = enp->en_enop; | ||||
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_PROBE); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE); | ||||
if (enop->eno_set_drv_limits != NULL) { | if (enop->eno_set_drv_limits != NULL) { | ||||
if ((rc = enop->eno_set_drv_limits(enp, edlp)) != 0) | if ((rc = enop->eno_set_drv_limits(enp, edlp)) != 0) | ||||
goto fail1; | goto fail1; | ||||
Show All 9 Lines | fail1: | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_nic_get_bar_region( | efx_nic_get_bar_region( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__in efx_nic_region_t region, | __in efx_nic_region_t region, | ||||
__out uint32_t *offsetp, | __out uint32_t *offsetp, | ||||
__out size_t *sizep) | __out size_t *sizep) | ||||
{ | { | ||||
efx_nic_ops_t *enop = enp->en_enop; | const efx_nic_ops_t *enop = enp->en_enop; | ||||
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_PROBE); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); | ||||
if (enop->eno_get_bar_region == NULL) { | if (enop->eno_get_bar_region == NULL) { | ||||
rc = ENOTSUP; | rc = ENOTSUP; | ||||
Show All 18 Lines | fail1: | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_nic_get_vi_pool( | efx_nic_get_vi_pool( | ||||
__in efx_nic_t *enp, | __in efx_nic_t *enp, | ||||
__out uint32_t *evq_countp, | __out uint32_t *evq_countp, | ||||
__out uint32_t *rxq_countp, | __out uint32_t *rxq_countp, | ||||
__out uint32_t *txq_countp) | __out uint32_t *txq_countp) | ||||
{ | { | ||||
efx_nic_ops_t *enop = enp->en_enop; | const efx_nic_ops_t *enop = enp->en_enop; | ||||
efx_nic_cfg_t *encp = &enp->en_nic_cfg; | efx_nic_cfg_t *encp = &enp->en_nic_cfg; | ||||
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_PROBE); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE); | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NIC); | ||||
if (enop->eno_get_vi_pool != NULL) { | if (enop->eno_get_vi_pool != NULL) { | ||||
Show All 20 Lines | fail1: | ||||
return (rc); | return (rc); | ||||
} | } | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_nic_init( | efx_nic_init( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
efx_nic_ops_t *enop = enp->en_enop; | const efx_nic_ops_t *enop = enp->en_enop; | ||||
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_PROBE); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE); | ||||
if (enp->en_mod_flags & EFX_MOD_NIC) { | if (enp->en_mod_flags & EFX_MOD_NIC) { | ||||
rc = EINVAL; | rc = EINVAL; | ||||
goto fail1; | goto fail1; | ||||
Show All 13 Lines | fail1: | ||||
return (rc); | return (rc); | ||||
} | } | ||||
void | void | ||||
efx_nic_fini( | efx_nic_fini( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
efx_nic_ops_t *enop = enp->en_enop; | const efx_nic_ops_t *enop = enp->en_enop; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE); | EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE); | ||||
EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_NIC); | EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_NIC); | ||||
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_INTR)); | EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_INTR)); | ||||
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV)); | EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EV)); | ||||
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_RX)); | EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_RX)); | ||||
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_TX)); | EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_TX)); | ||||
enop->eno_fini(enp); | enop->eno_fini(enp); | ||||
enp->en_mod_flags &= ~EFX_MOD_NIC; | enp->en_mod_flags &= ~EFX_MOD_NIC; | ||||
} | } | ||||
void | void | ||||
efx_nic_unprobe( | efx_nic_unprobe( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
efx_nic_ops_t *enop = enp->en_enop; | const efx_nic_ops_t *enop = enp->en_enop; | ||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); | ||||
#if EFSYS_OPT_MCDI | #if EFSYS_OPT_MCDI | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI); | ||||
#endif /* EFSYS_OPT_MCDI */ | #endif /* EFSYS_OPT_MCDI */ | ||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE); | ||||
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC)); | EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC)); | ||||
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_INTR)); | EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_INTR)); | ||||
Show All 29 Lines | efx_nic_destroy( | ||||
/* Free the NIC object */ | /* Free the NIC object */ | ||||
EFSYS_KMEM_FREE(esip, sizeof (efx_nic_t), enp); | EFSYS_KMEM_FREE(esip, sizeof (efx_nic_t), enp); | ||||
} | } | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_nic_reset( | efx_nic_reset( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
efx_nic_ops_t *enop = enp->en_enop; | const efx_nic_ops_t *enop = enp->en_enop; | ||||
unsigned int mod_flags; | unsigned int mod_flags; | ||||
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_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE); | EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE); | ||||
/* | /* | ||||
* All modules except the MCDI, PROBE, NVRAM, VPD, MON, LIC | * All modules except the MCDI, PROBE, NVRAM, VPD, MON, LIC | ||||
* (which we do not reset here) must have been shut down or never | * (which we do not reset here) must have been shut down or never | ||||
Show All 37 Lines | |||||
} | } | ||||
#if EFSYS_OPT_DIAG | #if EFSYS_OPT_DIAG | ||||
__checkReturn efx_rc_t | __checkReturn efx_rc_t | ||||
efx_nic_register_test( | efx_nic_register_test( | ||||
__in efx_nic_t *enp) | __in efx_nic_t *enp) | ||||
{ | { | ||||
efx_nic_ops_t *enop = enp->en_enop; | const efx_nic_ops_t *enop = enp->en_enop; | ||||
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_PROBE); | EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE); | ||||
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC)); | EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_NIC)); | ||||
if ((rc = enop->eno_register_test(enp)) != 0) | if ((rc = enop->eno_register_test(enp)) != 0) | ||||
goto fail1; | goto fail1; | ||||
▲ Show 20 Lines • Show All 331 Lines • Show Last 20 Lines |