Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/sfxge/sfxge.c
Show All 12 Lines | |||||
IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWSTATS) | IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWSTATS) | ||||
#define SFXGE_CAP_ENABLE SFXGE_CAP | #define SFXGE_CAP_ENABLE SFXGE_CAP | ||||
#define SFXGE_CAP_FIXED (IFCAP_VLAN_MTU | \ | #define SFXGE_CAP_FIXED (IFCAP_VLAN_MTU | \ | ||||
IFCAP_JUMBO_MTU | IFCAP_LINKSTATE | IFCAP_HWSTATS) | IFCAP_JUMBO_MTU | IFCAP_LINKSTATE | IFCAP_HWSTATS) | ||||
MALLOC_DEFINE(M_SFXGE, "sfxge", "Solarflare 10GigE driver"); | MALLOC_DEFINE(M_SFXGE, "sfxge", "Solarflare 10GigE driver"); | ||||
SYSCTL_NODE(_hw, OID_AUTO, sfxge, CTLFLAG_RD, 0, | SYSCTL_NODE(_hw, OID_AUTO, sfxge, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, | ||||
"SFXGE driver parameters"); | "SFXGE driver parameters"); | ||||
#define SFXGE_PARAM_RX_RING SFXGE_PARAM(rx_ring) | #define SFXGE_PARAM_RX_RING SFXGE_PARAM(rx_ring) | ||||
static int sfxge_rx_ring_entries = SFXGE_NDESCS; | static int sfxge_rx_ring_entries = SFXGE_NDESCS; | ||||
TUNABLE_INT(SFXGE_PARAM_RX_RING, &sfxge_rx_ring_entries); | TUNABLE_INT(SFXGE_PARAM_RX_RING, &sfxge_rx_ring_entries); | ||||
SYSCTL_INT(_hw_sfxge, OID_AUTO, rx_ring, CTLFLAG_RDTUN, | SYSCTL_INT(_hw_sfxge, OID_AUTO, rx_ring, CTLFLAG_RDTUN, | ||||
&sfxge_rx_ring_entries, 0, | &sfxge_rx_ring_entries, 0, | ||||
"Maximum number of descriptors in a receive ring"); | "Maximum number of descriptors in a receive ring"); | ||||
Show All 24 Lines | |||||
#if EFSYS_OPT_MCDI_LOGGING | #if EFSYS_OPT_MCDI_LOGGING | ||||
sc->mcdi_logging = sfxge_mcdi_logging; | sc->mcdi_logging = sfxge_mcdi_logging; | ||||
snprintf(mcdi_log_param_name, sizeof(mcdi_log_param_name), | snprintf(mcdi_log_param_name, sizeof(mcdi_log_param_name), | ||||
SFXGE_PARAM(%d.mcdi_logging), | SFXGE_PARAM(%d.mcdi_logging), | ||||
(int)device_get_unit(dev)); | (int)device_get_unit(dev)); | ||||
TUNABLE_INT_FETCH(mcdi_log_param_name, &sc->mcdi_logging); | TUNABLE_INT_FETCH(mcdi_log_param_name, &sc->mcdi_logging); | ||||
#endif | #endif | ||||
sc->stats_node = SYSCTL_ADD_NODE( | sc->stats_node = SYSCTL_ADD_NODE(device_get_sysctl_ctx(dev), | ||||
device_get_sysctl_ctx(dev), | SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "stats", | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Statistics"); | ||||
OID_AUTO, "stats", CTLFLAG_RD, NULL, "Statistics"); | |||||
if (sc->stats_node == NULL) { | if (sc->stats_node == NULL) { | ||||
error = ENOMEM; | error = ENOMEM; | ||||
goto fail; | goto fail; | ||||
} | } | ||||
TASK_INIT(&sc->task_reset, 0, sfxge_reset, sc); | TASK_INIT(&sc->task_reset, 0, sfxge_reset, sc); | ||||
(void) pci_enable_busmaster(dev); | (void) pci_enable_busmaster(dev); | ||||
Show All 24 Lines | |||||
efx_vpd_value_t value; | efx_vpd_value_t value; | ||||
/* Check whether VPD tag/keyword is present */ | /* Check whether VPD tag/keyword is present */ | ||||
value.evv_tag = tag; | value.evv_tag = tag; | ||||
value.evv_keyword = EFX_VPD_KEYWORD(keyword[0], keyword[1]); | value.evv_keyword = EFX_VPD_KEYWORD(keyword[0], keyword[1]); | ||||
if (efx_vpd_get(sc->enp, sc->vpd_data, sc->vpd_size, &value) != 0) | if (efx_vpd_get(sc->enp, sc->vpd_data, sc->vpd_size, &value) != 0) | ||||
return; | return; | ||||
SYSCTL_ADD_PROC( | SYSCTL_ADD_PROC(ctx, list, OID_AUTO, keyword, | ||||
ctx, list, OID_AUTO, keyword, CTLTYPE_STRING|CTLFLAG_RD, | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
sc, tag << 16 | EFX_VPD_KEYWORD(keyword[0], keyword[1]), | sc, tag << 16 | EFX_VPD_KEYWORD(keyword[0], keyword[1]), | ||||
sfxge_vpd_handler, "A", ""); | sfxge_vpd_handler, "A", ""); | ||||
} | } | ||||
static int | static int | ||||
sfxge_vpd_init(struct sfxge_softc *sc) | sfxge_vpd_init(struct sfxge_softc *sc) | ||||
{ | { | ||||
struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev); | struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev); | ||||
struct sysctl_oid *vpd_node; | struct sysctl_oid *vpd_node; | ||||
struct sysctl_oid_list *vpd_list; | struct sysctl_oid_list *vpd_list; | ||||
Show All 17 Lines | |||||
/* Copy ID (product name) into device description, and log it. */ | /* Copy ID (product name) into device description, and log it. */ | ||||
value.evv_tag = EFX_VPD_ID; | value.evv_tag = EFX_VPD_ID; | ||||
if (efx_vpd_get(sc->enp, sc->vpd_data, sc->vpd_size, &value) == 0) { | if (efx_vpd_get(sc->enp, sc->vpd_data, sc->vpd_size, &value) == 0) { | ||||
value.evv_value[value.evv_length] = 0; | value.evv_value[value.evv_length] = 0; | ||||
device_set_desc_copy(sc->dev, value.evv_value); | device_set_desc_copy(sc->dev, value.evv_value); | ||||
device_printf(sc->dev, "%s\n", value.evv_value); | device_printf(sc->dev, "%s\n", value.evv_value); | ||||
} | } | ||||
vpd_node = SYSCTL_ADD_NODE( | vpd_node = SYSCTL_ADD_NODE(ctx, | ||||
ctx, SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO, "vpd", | ||||
OID_AUTO, "vpd", CTLFLAG_RD, NULL, "Vital Product Data"); | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Vital Product Data"); | ||||
vpd_list = SYSCTL_CHILDREN(vpd_node); | vpd_list = SYSCTL_CHILDREN(vpd_node); | ||||
/* Add sysctls for all expected and any vendor-defined keywords. */ | /* Add sysctls for all expected and any vendor-defined keywords. */ | ||||
sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, "PN"); | sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, "PN"); | ||||
sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, "EC"); | sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, "EC"); | ||||
sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, "SN"); | sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, "SN"); | ||||
keyword[0] = 'V'; | keyword[0] = 'V'; | ||||
keyword[2] = 0; | keyword[2] = 0; | ||||
Show All 12 Lines |