diff --git a/core/hdd/src/wlan_hdd_ipa.c b/core/hdd/src/wlan_hdd_ipa.c index 2557ad540252..76cb0a23136c 100644 --- a/core/hdd/src/wlan_hdd_ipa.c +++ b/core/hdd/src/wlan_hdd_ipa.c @@ -2323,18 +2323,22 @@ QDF_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx) struct ipa_wdi_in_params pipe_in; struct ipa_wdi_out_params pipe_out; struct hdd_ipa_priv *ipa_ctxt = (struct hdd_ipa_priv *)hdd_ctx->hdd_ipa; - p_cds_contextType cds_ctx = hdd_ctx->pcds_context; uint8_t i; void *soc = cds_get_context(QDF_MODULE_ID_SOC); - void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + int ret; + QDF_STATUS stat = QDF_STATUS_SUCCESS; ENTER(); + pdev = cds_get_context(QDF_MODULE_ID_TXRX); if (!pdev || !soc) { HDD_IPA_LOG(QDF_TRACE_LEVEL_FATAL, "DP context is NULL"); - return QDF_STATUS_E_FAILURE; + stat = QDF_STATUS_E_FAILURE; + goto fail_return; } - cdp_ipa_get_resource(soc, pdev, &ipa_ctxt->ipa_resource); + + cdp_ipa_get_resource(soc, (void *)pdev, &ipa_ctxt->ipa_resource); if ((ipa_ctxt->ipa_resource.ce_sr_base_paddr == 0) || (ipa_ctxt->ipa_resource.tx_comp_ring_base_paddr == 0) || (ipa_ctxt->ipa_resource.rx_rdy_ring_base_paddr == 0) || @@ -2370,41 +2374,50 @@ QDF_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx) pipe_in.sys.notify = hdd_ipa_i2w_cb; if (!hdd_ipa_is_rm_enabled(hdd_ctx)) { HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, - "%s: IPA RM DISABLED, IPA AWAKE", __func__); + "IPA RM DISABLED, IPA AWAKE"); pipe_in.sys.keep_ipa_awake = true; } pipe_in.u.dl.comp_ring_base_pa = - ipa_ctxt->ipa_resource.tx_comp_ring_base_paddr; + ipa_ctxt->ipa_resource.tx_comp_ring_base_paddr; pipe_in.u.dl.comp_ring_size = - ipa_ctxt->ipa_resource.tx_comp_ring_size * - sizeof(qdf_dma_addr_t); + ipa_ctxt->ipa_resource.tx_comp_ring_size * + sizeof(qdf_dma_addr_t); pipe_in.u.dl.ce_ring_base_pa = - ipa_ctxt->ipa_resource.ce_sr_base_paddr; + ipa_ctxt->ipa_resource.ce_sr_base_paddr; pipe_in.u.dl.ce_door_bell_pa = ipa_ctxt->ipa_resource.ce_reg_paddr; pipe_in.u.dl.ce_ring_size = - ipa_ctxt->ipa_resource.ce_sr_ring_size; + ipa_ctxt->ipa_resource.ce_sr_ring_size; pipe_in.u.dl.num_tx_buffers = - ipa_ctxt->ipa_resource.tx_num_alloc_buffer; + ipa_ctxt->ipa_resource.tx_num_alloc_buffer; - qdf_mem_copy(&ipa_ctxt->cons_pipe_in, - &pipe_in, - sizeof(struct ipa_wdi_in_params)); + qdf_mem_copy(&ipa_ctxt->cons_pipe_in, &pipe_in, + sizeof(struct ipa_wdi_in_params)); hdd_ipa_uc_get_db_paddr(&ipa_ctxt->tx_comp_doorbell_paddr, - IPA_CLIENT_WLAN1_CONS); + IPA_CLIENT_WLAN1_CONS); + if (true == ipa_ctxt->uc_loaded) { /* Connect WDI IPA PIPE */ - ipa_connect_wdi_pipe(&ipa_ctxt->cons_pipe_in, &pipe_out); + ret = ipa_connect_wdi_pipe(&ipa_ctxt->cons_pipe_in, &pipe_out); + if (ret) { + HDD_IPA_LOG(QDF_TRACE_LEVEL_ERROR, + "ipa_connect_wdi_pipe falied for Tx: ret=%d", + ret); + stat = QDF_STATUS_E_FAILURE; + goto fail_return; + } /* Micro Controller Doorbell register */ - HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, - "%s CONS DB pipe out 0x%x", - __func__, (unsigned int)pipe_out.uc_door_bell_pa); + HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO_HIGH, + "CONS DB pipe out 0x%x TX PIPE Handle 0x%x", + (unsigned int)pipe_out.uc_door_bell_pa, + ipa_ctxt->tx_pipe_handle); ipa_ctxt->tx_comp_doorbell_paddr = pipe_out.uc_door_bell_pa; + /* WLAN TX PIPE Handle */ ipa_ctxt->tx_pipe_handle = pipe_out.clnt_hdl; HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO_HIGH, - "TX : CRBPA 0x%x, CRS %d, CERBPA 0x%x, CEDPA 0x%x, CERZ %d, NB %d, CDBPAD 0x%x", + "TX : 0x%x, %d, 0x%x, 0x%x, %d, %d, 0x%x", (unsigned int)pipe_in.u.dl.comp_ring_base_pa, pipe_in.u.dl.comp_ring_size, (unsigned int)pipe_in.u.dl.ce_ring_base_pa, @@ -2426,29 +2439,39 @@ QDF_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx) pipe_in.sys.notify = hdd_ipa_w2i_cb; if (!hdd_ipa_is_rm_enabled(hdd_ctx)) { HDD_IPA_LOG(QDF_TRACE_LEVEL_ERROR, - "%s: IPA RM DISABLED, IPA AWAKE", __func__); + "%s: IPA RM DISABLED, IPA AWAKE", __func__); pipe_in.sys.keep_ipa_awake = true; } pipe_in.u.ul.rdy_ring_base_pa = - ipa_ctxt->ipa_resource.rx_rdy_ring_base_paddr; + ipa_ctxt->ipa_resource.rx_rdy_ring_base_paddr; pipe_in.u.ul.rdy_ring_size = - ipa_ctxt->ipa_resource.rx_rdy_ring_size; + ipa_ctxt->ipa_resource.rx_rdy_ring_size; pipe_in.u.ul.rdy_ring_rp_pa = - ipa_ctxt->ipa_resource.rx_proc_done_idx_paddr; + ipa_ctxt->ipa_resource.rx_proc_done_idx_paddr; HDD_IPA_WDI2_SET(pipe_in, ipa_ctxt); - qdf_mem_copy(&ipa_ctxt->prod_pipe_in, - &pipe_in, - sizeof(struct ipa_wdi_in_params)); + + qdf_mem_copy(&ipa_ctxt->prod_pipe_in, &pipe_in, + sizeof(struct ipa_wdi_in_params)); hdd_ipa_uc_get_db_paddr(&ipa_ctxt->rx_ready_doorbell_paddr, - IPA_CLIENT_WLAN1_PROD); + IPA_CLIENT_WLAN1_PROD); + if (true == ipa_ctxt->uc_loaded) { - ipa_connect_wdi_pipe(&ipa_ctxt->prod_pipe_in, &pipe_out); + ret = ipa_connect_wdi_pipe(&ipa_ctxt->prod_pipe_in, &pipe_out); + if (ret) { + HDD_IPA_LOG(QDF_TRACE_LEVEL_ERROR, + "ipa_connect_wdi_pipe falied for Rx: ret=%d", + ret); + stat = QDF_STATUS_E_FAILURE; + goto fail_return; + + } ipa_ctxt->rx_ready_doorbell_paddr = pipe_out.uc_door_bell_pa; ipa_ctxt->rx_pipe_handle = pipe_out.clnt_hdl; - HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, - "%s PROD DB pipe out 0x%x", - __func__, (unsigned int)pipe_out.uc_door_bell_pa); + HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO_HIGH, + "PROD DB pipe out 0x%x TX PIPE Handle 0x%x", + (unsigned int)pipe_out.uc_door_bell_pa, + ipa_ctxt->tx_pipe_handle); HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO_HIGH, "RX : RRBPA 0x%x, RRS %d, PDIPA 0x%x, RDY_DB_PAD 0x%x", (unsigned int)pipe_in.u.ul.rdy_ring_base_pa, @@ -2457,22 +2480,28 @@ QDF_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx) (unsigned int)ipa_ctxt->rx_ready_doorbell_paddr); } - cdp_ipa_set_doorbell_paddr(soc, - (struct cdp_pdev *)cds_ctx->pdev_txrx_ctx, - ipa_ctxt->tx_comp_doorbell_paddr, - ipa_ctxt->rx_ready_doorbell_paddr); + cdp_ipa_set_doorbell_paddr(soc, (void *)pdev, + ipa_ctxt->tx_comp_doorbell_paddr, + ipa_ctxt->rx_ready_doorbell_paddr); - cdp_ipa_register_op_cb(soc, - (struct cdp_pdev *)cds_ctx->pdev_txrx_ctx, - hdd_ipa_uc_op_event_handler, (void *)hdd_ctx); + cdp_ipa_register_op_cb(soc, (void *)pdev, + hdd_ipa_uc_op_event_handler, (void *)hdd_ctx); + + HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO_HIGH, + "ipa_uc_op_cb=0x%p, tx_comp_idx_paddr=0x%x, rx_rdy_idx_paddr=0x%x", + pdev->ipa_uc_op_cb, + (unsigned int)pdev->htt_pdev->ipa_uc_tx_rsc.tx_comp_idx_paddr, + (unsigned int)pdev->htt_pdev->ipa_uc_rx_rsc.rx_rdy_idx_paddr); for (i = 0; i < HDD_IPA_UC_OPCODE_MAX; i++) { hdd_ipa_init_uc_op_work(&ipa_ctxt->uc_op_work[i].work, - hdd_ipa_uc_fw_op_event_handler); + hdd_ipa_uc_fw_op_event_handler); ipa_ctxt->uc_op_work[i].msg = NULL; } - return QDF_STATUS_SUCCESS; +fail_return: + EXIT(); + return stat; } /** @@ -5314,11 +5343,14 @@ static QDF_STATUS __hdd_ipa_init(hdd_context_t *hdd_ctx) struct hdd_ipa_priv *hdd_ipa = NULL; int ret, i; struct hdd_ipa_iface_context *iface_context = NULL; - struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + struct ol_txrx_pdev_t *pdev = NULL; if (!hdd_ipa_is_enabled(hdd_ctx)) return QDF_STATUS_SUCCESS; + ENTER(); + + pdev = cds_get_context(QDF_MODULE_ID_TXRX); if (!pdev) { HDD_IPA_LOG(QDF_TRACE_LEVEL_FATAL, "pdev is NULL"); goto fail_return; @@ -5380,13 +5412,13 @@ static QDF_STATUS __hdd_ipa_init(hdd_context_t *hdd_ctx) } if (hdd_ipa_uc_register_uc_ready(hdd_ipa)) goto fail_create_sys_pipe; - } else { ret = hdd_ipa_setup_sys_pipe(hdd_ipa); if (ret) goto fail_create_sys_pipe; } + EXIT(); return QDF_STATUS_SUCCESS; fail_create_sys_pipe: @@ -5397,6 +5429,7 @@ fail_setup_rm: hdd_ctx->hdd_ipa = NULL; ghdd_ipa = NULL; fail_return: + EXIT(); return QDF_STATUS_E_FAILURE; }