int sfc_mcdi_init(struct sfc_adapter *sa) { struct sfc_mcdi *mcdi; size_t max_msg_size; efx_mcdi_transport_t *emtp; int rc; sfc_log_init(sa, "entry"); mcdi = &sa->mcdi; SFC_ASSERT(mcdi->state == SFC_MCDI_UNINITIALIZED); rte_spinlock_init(&mcdi->lock); mcdi->state = SFC_MCDI_INITIALIZED; max_msg_size = sizeof(uint32_t) + MCDI_CTL_SDU_LEN_MAX_V2; rc = sfc_dma_alloc(sa, "mcdi", 0, max_msg_size, sa->socket_id, &mcdi->mem); if (rc != 0) goto fail_dma_alloc; /* Convert negative error to positive used in the driver */ rc = sfc_kvargs_process(sa, SFC_KVARG_MCDI_LOGGING, sfc_kvarg_bool_handler, &mcdi->logging); if (rc != 0) goto fail_kvargs_process; emtp = &mcdi->transport; emtp->emt_context = sa; emtp->emt_dma_mem = &mcdi->mem; emtp->emt_execute = sfc_mcdi_execute; emtp->emt_ev_cpl = sfc_mcdi_ev_cpl; emtp->emt_exception = sfc_mcdi_exception; emtp->emt_logger = sfc_mcdi_logger; sfc_log_init(sa, "init MCDI"); rc = efx_mcdi_init(sa->nic, emtp); if (rc != 0) goto fail_mcdi_init; return 0; fail_mcdi_init: memset(emtp, 0, sizeof(*emtp)); fail_kvargs_process: sfc_dma_free(sa, &mcdi->mem); fail_dma_alloc: mcdi->state = SFC_MCDI_UNINITIALIZED; return rc; }
int sfc_ev_attach(struct sfc_adapter *sa) { int rc; sfc_log_init(sa, "entry"); sa->evq_flags = EFX_EVQ_FLAGS_TYPE_THROUGHPUT; rc = sfc_kvargs_process(sa, SFC_KVARG_PERF_PROFILE, sfc_kvarg_perf_profile_handler, &sa->evq_flags); if (rc != 0) { sfc_err(sa, "invalid %s parameter value", SFC_KVARG_PERF_PROFILE); goto fail_kvarg_perf_profile; } sa->mgmt_evq_index = 0; rte_spinlock_init(&sa->mgmt_evq_lock); rc = sfc_ev_qinit(sa, SFC_EVQ_TYPE_MGMT, 0, SFC_MGMT_EVQ_ENTRIES, sa->socket_id, &sa->mgmt_evq); if (rc != 0) goto fail_mgmt_evq_init; /* * Rx/Tx event queues are created/destroyed when corresponding * Rx/Tx queue is created/destroyed. */ return 0; fail_mgmt_evq_init: fail_kvarg_perf_profile: sfc_log_init(sa, "failed %d", rc); return rc; }