Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/ena/ena.c
Context not available. | |||||
static void ena_update_on_link_change(void *, struct ena_admin_aenq_entry *); | static void ena_update_on_link_change(void *, struct ena_admin_aenq_entry *); | ||||
static void unimplemented_aenq_handler(void *, struct ena_admin_aenq_entry *); | static void unimplemented_aenq_handler(void *, struct ena_admin_aenq_entry *); | ||||
static int ena_copy_eni_metrics(struct ena_adapter *); | static int ena_copy_eni_metrics(struct ena_adapter *); | ||||
static int ena_copy_customer_metrics(struct ena_adapter *); | |||||
static void ena_timer_service(void *); | static void ena_timer_service(void *); | ||||
static char ena_version[] = ENA_DEVICE_NAME ENA_DRV_MODULE_NAME | static char ena_version[] = ENA_DEVICE_NAME ENA_DRV_MODULE_NAME | ||||
Context not available. | |||||
return (rc); | return (rc); | ||||
} | } | ||||
static int | |||||
ena_copy_customer_metrics(struct ena_adapter *adapter) | |||||
{ | |||||
struct ena_com_dev *dev; | |||||
u32 supported_metrics_count; | |||||
int rc, len; | |||||
dev = adapter->ena_dev; | |||||
supported_metrics_count = ena_com_get_customer_metric_count(dev); | |||||
len = supported_metrics_count * sizeof(u64); | |||||
/* Fill the data buffer */ | |||||
rc = ena_com_get_customer_metrics(adapter->ena_dev, | |||||
(char *)(adapter->customer_metrics_array), len); | |||||
return (rc); | |||||
} | |||||
static void | static void | ||||
ena_timer_service(void *data) | ena_timer_service(void *data) | ||||
{ | { | ||||
Context not available. | |||||
struct ena_adapter *adapter = (struct ena_adapter *)arg; | struct ena_adapter *adapter = (struct ena_adapter *)arg; | ||||
ENA_LOCK_LOCK(); | ENA_LOCK_LOCK(); | ||||
(void)ena_copy_eni_metrics(adapter); | |||||
if (ena_com_get_cap(adapter->ena_dev, ENA_ADMIN_CUSTOMER_METRICS)) | |||||
(void)ena_copy_customer_metrics(adapter); | |||||
else if (ena_com_get_cap(adapter->ena_dev, ENA_ADMIN_ENI_STATS)) | |||||
(void)ena_copy_eni_metrics(adapter); | |||||
ENA_LOCK_UNLOCK(); | ENA_LOCK_UNLOCK(); | ||||
} | } | ||||
Context not available. | |||||
/* initialize rings basic information */ | /* initialize rings basic information */ | ||||
ena_init_io_rings(adapter); | ena_init_io_rings(adapter); | ||||
rc = ena_com_allocate_customer_metrics_buffer(ena_dev); | |||||
if (rc) { | |||||
ena_log(pdev, ERR, "Failed to allocate customer metrics buffer.\n"); | |||||
goto err_msix_free; | |||||
} | |||||
rc = ena_sysctl_allocate_customer_metrics_buffer(adapter); | |||||
if (unlikely(rc)){ | |||||
ena_log(pdev, ERR, "Failed to allocate sysctl customer metrics buffer.\n"); | |||||
goto err_metrics_buffer_destroy; | |||||
} | |||||
/* Initialize statistics */ | /* Initialize statistics */ | ||||
ena_alloc_counters((counter_u64_t *)&adapter->dev_stats, | ena_alloc_counters((counter_u64_t *)&adapter->dev_stats, | ||||
sizeof(struct ena_stats_dev)); | sizeof(struct ena_stats_dev)); | ||||
Context not available. | |||||
rc = ena_setup_ifnet(pdev, adapter, &get_feat_ctx); | rc = ena_setup_ifnet(pdev, adapter, &get_feat_ctx); | ||||
if (unlikely(rc != 0)) { | if (unlikely(rc != 0)) { | ||||
ena_log(pdev, ERR, "Error with network interface setup\n"); | ena_log(pdev, ERR, "Error with network interface setup\n"); | ||||
goto err_msix_free; | goto err_customer_metrics_alloc; | ||||
} | } | ||||
/* Initialize reset task queue */ | /* Initialize reset task queue */ | ||||
Context not available. | |||||
err_detach: | err_detach: | ||||
ether_ifdetach(adapter->ifp); | ether_ifdetach(adapter->ifp); | ||||
#endif /* DEV_NETMAP */ | #endif /* DEV_NETMAP */ | ||||
err_customer_metrics_alloc: | |||||
free(adapter->customer_metrics_array, M_DEVBUF); | |||||
err_metrics_buffer_destroy: | |||||
ena_com_delete_customer_metrics_buffer(ena_dev); | |||||
err_msix_free: | err_msix_free: | ||||
ena_free_stats(adapter); | ena_free_stats(adapter); | ||||
ena_com_dev_reset(adapter->ena_dev, ENA_REGS_RESET_INIT_ERR); | ena_com_dev_reset(adapter->ena_dev, ENA_REGS_RESET_INIT_ERR); | ||||
Context not available. | |||||
ena_com_delete_host_info(ena_dev); | ena_com_delete_host_info(ena_dev); | ||||
free(adapter->customer_metrics_array, M_DEVBUF); | |||||
ena_com_delete_customer_metrics_buffer(ena_dev); | |||||
if_free(adapter->ifp); | if_free(adapter->ifp); | ||||
free(ena_dev->bus, M_DEVBUF); | free(ena_dev->bus, M_DEVBUF); | ||||
Context not available. |