From 81179cb75ef018b96ea62a500beba12678191d3b Mon Sep 17 00:00:00 2001 From: Mohit Khanna Date: Thu, 16 Aug 2018 20:50:43 -0700 Subject: [PATCH] qcacmn: Fixes for IPA enablement for lithium/Hastings - Support to pass IPA enabled(disabled) flag from ini to DP layer - Use ioremap call to translate tx_comp_doorbell_paddr obtained from calling ipa_setup api to tx_comp_doorbell_vaddr. This is needed to write the initial value of HP at the doorbell address. - Change REO_DST_RING_SIZE and WLAN_CFG_TX_RING_SIZE to 1023 for napier/hastings if IPA is enabled. This is needed because, ipa_setup API can handle only 16-bit values for the size param(bytes) of the ring. - Disable hash based flow steering for SAP peers in case IPA is enabled and set default reo_dest_ring_4 as default RX ring. Since IPA will be reaping RX packets from reo_dest_ring_4 only, flow steering is not needed for SAP peers. - Unmap pre-allocated TX buffers for IPA in the TX completion ring. - Donot execute IPA functionality if IPA is disabled from ini. Change-Id: I6855bfe293a457ccc0abd1ad5567f5c95232a9d2 CRs-Fixed: 2183519 --- dp/inc/cdp_txrx_cmn_struct.h | 3 + dp/wifi3.0/dp_htt.c | 12 +- dp/wifi3.0/dp_ipa.c | 221 ++++++++++++++++++++++------------- dp/wifi3.0/dp_main.c | 148 +++++++++++++++++++---- hal/wifi3.0/hal_api.h | 42 +++---- hal/wifi3.0/hal_srng.c | 38 ++++-- wlan_cfg/cfg_dp.h | 3 +- wlan_cfg/wlan_cfg.c | 5 + wlan_cfg/wlan_cfg.h | 103 +++++++++------- 9 files changed, 391 insertions(+), 184 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 0403143a57..c3841c1e75 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1293,6 +1293,7 @@ struct cdp_rx_indication_msdu { * @flow_steering_enable: Enable/Disable Rx Hash * @tcp_Udp_ChecksumOffload: Enable/Disable tcp-Udp checksum Offload * @napi_enable: Enable/Disable Napi + * @ipa_enable: Flag indicating if IPA is enabled or not * @tx_flow_stop_queue_threshold: Value to Pause tx queues * @tx_flow_start_queue_offset: Available Tx descriptors to unpause * tx queue @@ -1303,9 +1304,11 @@ struct cdp_config_params { unsigned int flow_steering_enable:1; unsigned int tcp_udp_checksumoffload:1; unsigned int napi_enable:1; + unsigned int ipa_enable:1; /* Set when QCA_LL_TX_FLOW_CONTROL_V2 is enabled */ uint8_t tx_flow_stop_queue_threshold; uint8_t tx_flow_start_queue_offset; + }; /** diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 6c6f22326c..84b4c01f33 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -566,14 +566,10 @@ int htt_srng_setup(void *htt_soc, int mac_id, void *hal_srng, goto fail1; } - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, - "%s: ring_type %d ring_id %d", - __func__, hal_ring_type, srng_params.ring_id); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, - "%s: hp_addr 0x%llx tp_addr 0x%llx", - __func__, (uint64_t)hp_addr, (uint64_t)tp_addr); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, - "%s: htt_ring_id %d", __func__, htt_ring_id); + dp_info("ring_type %d ring_id %d htt_ring_id %d hp_addr 0x%llx tp_addr 0x%llx", + hal_ring_type, srng_params.ring_id, htt_ring_id, + (uint64_t)hp_addr, + (uint64_t)tp_addr); break; case RXDMA_MONITOR_BUF: htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING; diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index aceefb2830..eaced3823c 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -45,15 +45,17 @@ static void dp_tx_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev) { int idx; + qdf_nbuf_t nbuf; for (idx = 0; idx < soc->ipa_uc_tx_rsc.alloc_tx_buf_cnt; idx++) { - if (soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx]) { - qdf_nbuf_free((qdf_nbuf_t) - (soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx])); - - soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx] = - (void *)NULL; - } + nbuf = (qdf_nbuf_t) + soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx]; + if (!nbuf) + continue; + qdf_nbuf_unmap_single(soc->osdev, nbuf, QDF_DMA_BIDIRECTIONAL); + qdf_nbuf_free(nbuf); + soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[idx] = + (void *)NULL; } qdf_mem_free(soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned); @@ -213,6 +215,9 @@ int dp_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) { int error; + if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + /* TX resource attach */ error = dp_tx_ipa_uc_attach(soc, pdev); if (error) { @@ -250,6 +255,9 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc, qdf_dma_addr_t hp_addr; unsigned long addr_offset, dev_base_paddr; + if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + /* IPA TCL_DATA Ring - HAL_SRNG_SW2TCL3 */ hal_srng = soc->tcl_data_ring[IPA_TCL_DATA_RING_IDX].hal_srng; hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params); @@ -272,20 +280,23 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc, soc->ipa_uc_tx_rsc.ipa_tcl_hp_paddr = (qdf_dma_addr_t)(addr_offset + dev_base_paddr); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, - "%s: addr_offset=%x, dev_base_paddr=%x, ipa_tcl_hp_paddr=%x", - __func__, (unsigned int)addr_offset, + dp_info("IPA TCL_DATA Ring addr_offset=%x, dev_base_paddr=%x, hp_paddr=%x paddr=%pK vaddr=%pK size= %u(%u bytes)", + (unsigned int)addr_offset, (unsigned int)dev_base_paddr, - (unsigned int)(soc->ipa_uc_tx_rsc.ipa_tcl_hp_paddr)); + (unsigned int)(soc->ipa_uc_tx_rsc.ipa_tcl_hp_paddr), + (void *)soc->ipa_uc_tx_rsc.ipa_tcl_ring_base_paddr, + (void *)soc->ipa_uc_tx_rsc.ipa_tcl_ring_base_vaddr, + srng_params.num_entries, + soc->ipa_uc_tx_rsc.ipa_tcl_ring_size); /* IPA TX COMP Ring - HAL_SRNG_WBM2SW2_RELEASE */ hal_srng = soc->tx_comp_ring[IPA_TX_COMP_RING_IDX].hal_srng; hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params); soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_paddr = - srng_params.ring_base_paddr; + srng_params.ring_base_paddr; soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_vaddr = - srng_params.ring_base_vaddr; + srng_params.ring_base_vaddr; soc->ipa_uc_tx_rsc.ipa_wbm_ring_size = (srng_params.num_entries * srng_params.entry_size) << 2; addr_offset = (unsigned long)(hal_srng->u.dst_ring.tp_addr) - @@ -293,20 +304,23 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc, soc->ipa_uc_tx_rsc.ipa_wbm_tp_paddr = (qdf_dma_addr_t)(addr_offset + dev_base_paddr); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, - "%s: addr_offset=%x, dev_base_paddr=%x, ipa_wbm_tp_paddr=%x", - __func__, (unsigned int)addr_offset, + dp_info("IPA TX COMP Ring addr_offset=%x, dev_base_paddr=%x, ipa_wbm_tp_paddr=%x paddr=%pK vaddr=0%pK size= %u(%u bytes)", + (unsigned int)addr_offset, (unsigned int)dev_base_paddr, - (unsigned int)(soc->ipa_uc_tx_rsc.ipa_wbm_tp_paddr)); + (unsigned int)(soc->ipa_uc_tx_rsc.ipa_wbm_tp_paddr), + (void *)soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_paddr, + (void *)soc->ipa_uc_tx_rsc.ipa_wbm_ring_base_vaddr, + srng_params.num_entries, + soc->ipa_uc_tx_rsc.ipa_wbm_ring_size); /* IPA REO_DEST Ring - HAL_SRNG_REO2SW4 */ hal_srng = soc->reo_dest_ring[IPA_REO_DEST_RING_IDX].hal_srng; hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params); soc->ipa_uc_rx_rsc.ipa_reo_ring_base_paddr = - srng_params.ring_base_paddr; + srng_params.ring_base_paddr; soc->ipa_uc_rx_rsc.ipa_reo_ring_base_vaddr = - srng_params.ring_base_vaddr; + srng_params.ring_base_vaddr; soc->ipa_uc_rx_rsc.ipa_reo_ring_size = (srng_params.num_entries * srng_params.entry_size) << 2; addr_offset = (unsigned long)(hal_srng->u.dst_ring.tp_addr) - @@ -314,11 +328,14 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc, soc->ipa_uc_rx_rsc.ipa_reo_tp_paddr = (qdf_dma_addr_t)(addr_offset + dev_base_paddr); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, - "%s: addr_offset=%x, dev_base_paddr=%x, ipa_reo_tp_paddr=%x", - __func__, (unsigned int)addr_offset, + dp_info("IPA REO_DEST Ring addr_offset=%x, dev_base_paddr=%x, tp_paddr=%x paddr=%pK vaddr=%pK size= %u(%u bytes)", + (unsigned int)addr_offset, (unsigned int)dev_base_paddr, - (unsigned int)(soc->ipa_uc_rx_rsc.ipa_reo_tp_paddr)); + (unsigned int)(soc->ipa_uc_rx_rsc.ipa_reo_tp_paddr), + (void *)soc->ipa_uc_rx_rsc.ipa_reo_ring_base_paddr, + (void *)soc->ipa_uc_rx_rsc.ipa_reo_ring_base_vaddr, + srng_params.num_entries, + soc->ipa_uc_rx_rsc.ipa_reo_ring_size); hal_srng = pdev->rx_refill_buf_ring2.hal_srng; hal_get_srng_params(hal_soc, (void *)hal_srng, &srng_params); @@ -331,9 +348,12 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc, hp_addr = hal_srng_get_hp_addr(hal_soc, (void *)hal_srng); soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_hp_paddr = hp_addr; - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, - "%s: ipa_rx_refill_buf_hp_paddr=%x", __func__, - (unsigned int)(soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_hp_paddr)); + dp_info("IPA REFILL_BUF Ring hp_paddr=%x paddr=%pK vaddr=%pK size= %u(%u bytes)", + (unsigned int)(soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_hp_paddr), + (void *)soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_base_paddr, + (void *)soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_base_vaddr, + srng_params.num_entries, + soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_size); return 0; } @@ -354,6 +374,9 @@ QDF_STATUS dp_ipa_get_resource(struct cdp_pdev *ppdev) struct dp_soc *soc = pdev->soc; struct dp_ipa_resources *ipa_res = &pdev->ipa_resource; + if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + ipa_res->tx_ring_base_paddr = soc->ipa_uc_tx_rsc.ipa_tcl_ring_base_paddr; ipa_res->tx_ring_size = @@ -376,6 +399,14 @@ QDF_STATUS dp_ipa_get_resource(struct cdp_pdev *ppdev) ipa_res->rx_refill_ring_size = soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_ring_size; + dp_debug("ipa_res->tx_ring_base_paddr:%pK ipa_res->tx_ring_size:%u ipa_res->tx_comp_ring_base_paddr:%pK ipa_res->tx_comp_ring_size:%u ipa_res->rx_refill_ring_base_paddr:%pK ipa_res->rx_refill_ring_size:%u", + (void *)ipa_res->tx_ring_base_paddr, + ipa_res->tx_ring_size, + (void *)ipa_res->tx_comp_ring_base_paddr, + ipa_res->tx_comp_ring_size, + (void *)ipa_res->rx_refill_ring_base_paddr, + ipa_res->rx_refill_ring_size); + if ((0 == ipa_res->tx_comp_ring_base_paddr) || (0 == ipa_res->rx_rdy_ring_base_paddr)) return QDF_STATUS_E_FAILURE; @@ -402,10 +433,27 @@ QDF_STATUS dp_ipa_set_doorbell_paddr(struct cdp_pdev *ppdev) struct hal_srng *reo_srng = soc->reo_dest_ring[IPA_REO_DEST_RING_IDX].hal_srng; - hal_srng_dst_set_hp_paddr(wbm_srng, ipa_res->tx_comp_doorbell_paddr); - hal_srng_dst_init_hp(wbm_srng, ipa_res->tx_comp_doorbell_vaddr); - hal_srng_dst_set_hp_paddr(reo_srng, ipa_res->rx_ready_doorbell_paddr); + if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + hal_srng_dst_set_hp_paddr(wbm_srng, ipa_res->tx_comp_doorbell_paddr); + + ipa_res->tx_comp_doorbell_vaddr = + ioremap(ipa_res->tx_comp_doorbell_paddr, 4); + dp_info("paddr %pK vaddr %pK", + (void *)ipa_res->tx_comp_doorbell_paddr, + (void *)ipa_res->tx_comp_doorbell_vaddr); + + hal_srng_dst_init_hp(wbm_srng, ipa_res->tx_comp_doorbell_vaddr); + + /* + * For RX, REO module on Napier/Hastings does reordering on incoming + * Ethernet packets and writes one or more descriptors to REO2IPA Rx + * ring.It then updates the ring’s Write/Head ptr and rings a doorbell + * to IPA. + * Set the doorbell addr for the REO ring. + */ + hal_srng_dst_set_hp_paddr(reo_srng, ipa_res->rx_ready_doorbell_paddr); return QDF_STATUS_SUCCESS; } @@ -420,6 +468,9 @@ QDF_STATUS dp_ipa_op_response(struct cdp_pdev *ppdev, uint8_t *op_msg) { struct dp_pdev *pdev = (struct dp_pdev *)ppdev; + if (!wlan_cfg_is_ipa_enabled(pdev->soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + if (pdev->ipa_uc_op_cb) { pdev->ipa_uc_op_cb(op_msg, pdev->usr_ctxt); } else { @@ -445,6 +496,9 @@ QDF_STATUS dp_ipa_register_op_cb(struct cdp_pdev *ppdev, { struct dp_pdev *pdev = (struct dp_pdev *)ppdev; + if (!wlan_cfg_is_ipa_enabled(pdev->soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + pdev->ipa_uc_op_cb = op_cb; pdev->usr_ctxt = usr_ctxt; @@ -500,6 +554,9 @@ QDF_STATUS dp_ipa_enable_autonomy(struct cdp_pdev *ppdev) struct dp_soc *soc = pdev->soc; uint32_t remap_val; + if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + /* Call HAL API to remap REO rings to REO2IPA ring */ remap_val = HAL_REO_REMAP_VAL(REO_REMAP_TCL, REO_REMAP_TCL) | HAL_REO_REMAP_VAL(REO_REMAP_SW1, REO_REMAP_SW4) | @@ -510,7 +567,6 @@ QDF_STATUS dp_ipa_enable_autonomy(struct cdp_pdev *ppdev) HAL_REO_REMAP_VAL(REO_REMAP_FW, REO_REMAP_FW) | HAL_REO_REMAP_VAL(REO_REMAP_UNUSED, REO_REMAP_FW); hal_reo_remap_IX0(soc->hal_soc, remap_val); - return QDF_STATUS_SUCCESS; } @@ -528,6 +584,9 @@ QDF_STATUS dp_ipa_disable_autonomy(struct cdp_pdev *ppdev) struct dp_soc *soc = pdev->soc; uint32_t remap_val; + if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + /* Call HAL API to remap REO rings to REO2IPA ring */ remap_val = HAL_REO_REMAP_VAL(REO_REMAP_TCL, REO_REMAP_TCL) | HAL_REO_REMAP_VAL(REO_REMAP_SW1, REO_REMAP_SW1) | @@ -607,6 +666,10 @@ QDF_STATUS dp_ipa_setup(struct cdp_pdev *ppdev, void *ipa_i2w_cb, uint32_t desc_size; int ret; + if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + + qdf_mem_zero(&tx, sizeof(qdf_ipa_wdi_pipe_setup_info_t)); qdf_mem_zero(&rx, sizeof(qdf_ipa_wdi_pipe_setup_info_t)); qdf_mem_zero(&pipe_in, sizeof(pipe_in)); @@ -735,8 +798,9 @@ QDF_STATUS dp_ipa_setup(struct cdp_pdev *ppdev, void *ipa_i2w_cb, QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(&pipe_in) = ipa_w2i_cb; QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(&pipe_in) = ipa_priv; - /* Connect WDI IPA PIPE */ + /* Connect WDI IPA PIPEs */ ret = qdf_ipa_wdi_conn_pipes(&pipe_in, &pipe_out); + if (ret) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: ipa_wdi_conn_pipes: IPA pipe setup failed: ret=%d", @@ -745,56 +809,54 @@ QDF_STATUS dp_ipa_setup(struct cdp_pdev *ppdev, void *ipa_i2w_cb, } /* IPA uC Doorbell registers */ - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "%s: Tx DB PA=0x%x, Rx DB PA=0x%x", - __func__, - (unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(&pipe_out), - (unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out)); + dp_info("Tx DB PA=0x%x, Rx DB PA=0x%x", + (unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(&pipe_out), + (unsigned int)QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out)); ipa_res->tx_comp_doorbell_paddr = QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(&pipe_out); ipa_res->rx_ready_doorbell_paddr = QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(&pipe_out); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "%s: Tx: %s=%pK, %s=%d, %s=%pK, %s=%pK, %s=%d, %s=%pK, %s=%d, %s=%pK", - __func__, - "transfer_ring_base_pa", - (void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(tx), - "transfer_ring_size", - QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(tx), - "transfer_ring_doorbell_pa", - (void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(tx), - "event_ring_base_pa", - (void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(tx), - "event_ring_size", - QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(tx), - "event_ring_doorbell_pa", - (void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(tx), - "num_pkt_buffers", - QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(tx), - "tx_comp_doorbell_paddr", - (void *)ipa_res->tx_comp_doorbell_paddr); + dp_info("Tx: %s=%pK, %s=%d, %s=%pK, %s=%pK, %s=%d, %s=%pK, %s=%d, %s=%pK %s=%pK", + "transfer_ring_base_pa", + (void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(tx), + "transfer_ring_size", + QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(tx), + "transfer_ring_doorbell_pa", + (void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(tx), + "event_ring_base_pa", + (void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(tx), + "event_ring_size", + QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(tx), + "event_ring_doorbell_pa", + (void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(tx), + "num_pkt_buffers", + QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(tx), + "tx_comp_doorbell_paddr", + (void *)ipa_res->tx_comp_doorbell_paddr, + "tx_comp_doorbell_vaddr", + (void *)ipa_res->tx_comp_doorbell_vaddr); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "%s: Rx: %s=%pK, %s=%d, %s=%pK, %s=%pK, %s=%d, %s=%pK, %s=%d, %s=%pK", - __func__, - "transfer_ring_base_pa", - (void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(rx), - "transfer_ring_size", - QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(rx), - "transfer_ring_doorbell_pa", - (void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(rx), - "event_ring_base_pa", - (void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(rx), - "event_ring_size", - QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(rx), - "event_ring_doorbell_pa", - (void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(rx), - "num_pkt_buffers", - QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(rx), - "tx_comp_doorbell_paddr", - (void *)ipa_res->rx_ready_doorbell_paddr); + dp_info("Rx: %s=%pK, %s=%d, %s=%pK, %s=%pK, %s=%d, %s=%pK, %s=%d, %s=%u, %s=%pK", + "transfer_ring_base_pa", + (void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(rx), + "transfer_ring_size", + QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(rx), + "transfer_ring_doorbell_pa", + (void *)QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(rx), + "event_ring_base_pa", + (void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(rx), + "event_ring_size", + QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(rx), + "event_ring_doorbell_pa", + (void *)QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(rx), + "num_pkt_buffers", + QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(rx), + "pkt_offset(rx)", + QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(rx), + "tx_comp_doorbell_paddr", + (void *)ipa_res->rx_ready_doorbell_paddr); return QDF_STATUS_SUCCESS; } @@ -821,10 +883,7 @@ QDF_STATUS dp_ipa_setup_iface(char *ifname, uint8_t *mac_addr, struct dp_ipa_uc_tx_hdr uc_tx_hdr_v6; int ret = -EINVAL; - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "%s: Add Partial hdr: %s, %pM", - __func__, ifname, mac_addr); - + dp_debug("Add Partial hdr: %s, %pM", ifname, mac_addr); qdf_mem_zero(&hdr_info, sizeof(qdf_ipa_wdi_hdr_info_t)); qdf_ether_addr_copy(uc_tx_hdr.eth.h_source, mac_addr); @@ -856,7 +915,10 @@ QDF_STATUS dp_ipa_setup_iface(char *ifname, uint8_t *mac_addr, &hdr_info, sizeof(qdf_ipa_wdi_hdr_info_t)); } + dp_debug("registering for session_id: %u", session_id); + ret = qdf_ipa_wdi_reg_intf(&in); + if (ret) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: ipa_wdi_reg_intf: register IPA interface falied: ret=%d", @@ -901,6 +963,9 @@ QDF_STATUS dp_ipa_setup(struct cdp_pdev *ppdev, void *ipa_i2w_cb, uint32_t desc_size; int ret; + if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + qdf_mem_zero(&tx, sizeof(qdf_ipa_wdi_pipe_setup_info_t)); qdf_mem_zero(&rx, sizeof(qdf_ipa_wdi_pipe_setup_info_t)); qdf_mem_zero(&pipe_in, sizeof(pipe_in)); diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 44459fb2f6..4885503dd1 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -997,8 +997,6 @@ static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng, * See if these settings need to passed from DP layer */ ring_params.flags = 0; - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW, - FL("Ring type: %d, num:%d"), ring_type, ring_num); num_entries = (num_entries > max_entries) ? max_entries : num_entries; srng->hal_srng = NULL; @@ -1022,6 +1020,11 @@ static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng, (unsigned long)srng->base_vaddr_unaligned); ring_params.num_entries = num_entries; + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW, + FL("Ring type: %d, num:%d vaddr %pK paddr %pK entries %u"), + ring_type, ring_num, (void *)ring_params.ring_base_vaddr, + (void *)ring_params.ring_base_paddr, ring_params.num_entries); + if (soc->intr_mode == DP_INTR_MSI) { dp_srng_msi_setup(soc, &ring_params, ring_type, ring_num); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, @@ -1935,12 +1938,23 @@ static void dp_hw_link_desc_pool_cleanup(struct dp_soc *soc) } } +#ifdef IPA_OFFLOAD +#define REO_DST_RING_SIZE_QCA6290 1023 +#ifndef QCA_WIFI_QCA8074_VP +#define REO_DST_RING_SIZE_QCA8074 1023 +#else +#define REO_DST_RING_SIZE_QCA8074 8 +#endif /* QCA_WIFI_QCA8074_VP */ + +#else + #define REO_DST_RING_SIZE_QCA6290 1024 #ifndef QCA_WIFI_QCA8074_VP #define REO_DST_RING_SIZE_QCA8074 2048 #else #define REO_DST_RING_SIZE_QCA8074 8 -#endif +#endif /* QCA_WIFI_QCA8074_VP */ +#endif /* IPA_OFFLOAD */ /* * dp_wds_aging_timer_fn() - Timer callback function for WDS aging @@ -2225,13 +2239,14 @@ static bool dp_reo_remap_config(struct dp_soc *soc, uint32_t *remap1, uint32_t *remap2) { - *remap1 = ((0x1 << 0) | (0x2 << 3) | (0x3 << 6) | (0x1 << 9) | (0x2 << 12) | (0x3 << 15) | (0x1 << 18) | (0x2 << 21)) << 8; *remap2 = ((0x3 << 0) | (0x1 << 3) | (0x2 << 6) | (0x3 << 9) | (0x1 << 12) | (0x2 << 15) | (0x3 << 18) | (0x1 << 21)) << 8; + dp_debug("remap1 %x remap2 %x", *remap1, *remap2); + return true; } #else @@ -2251,7 +2266,6 @@ static bool dp_reo_remap_config(struct dp_soc *soc, (0x4 << 9) | (0x1 << 12) | (0x2 << 15) | (0x3 << 18) | (0x4 << 21)) << 8; break; - case 1: *remap1 = ((0x2 << 0) | (0x3 << 3) | (0x4 << 6) | (0x2 << 9) | (0x3 << 12) | (0x4 << 15) | @@ -2276,6 +2290,9 @@ static bool dp_reo_remap_config(struct dp_soc *soc, /* return false if both radios are offloaded to NSS */ return false; } + + dp_debug("remap1 %x remap2 %x offload_radio %u", + *remap1, *remap2, offload_radio); return true; } #endif @@ -4027,6 +4044,98 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle, return (void *)peer; } +/* + * dp_vdev_get_default_reo_hash() - get reo dest ring and hash values for a vdev + * @vdev: Datapath VDEV handle + * @reo_dest: pointer to default reo_dest ring for vdev to be populated + * @hash_based: pointer to hash value (enabled/disabled) to be populated + * + * Return: None + */ +static +void dp_vdev_get_default_reo_hash(struct dp_vdev *vdev, + enum cdp_host_reo_dest_ring *reo_dest, + bool *hash_based) +{ + struct dp_soc *soc; + struct dp_pdev *pdev; + + pdev = vdev->pdev; + soc = pdev->soc; + /* + * hash based steering is disabled for Radios which are offloaded + * to NSS + */ + if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) + *hash_based = wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx); + + /* + * Below line of code will ensure the proper reo_dest ring is chosen + * for cases where toeplitz hash cannot be generated (ex: non TCP/UDP) + */ + *reo_dest = pdev->reo_dest; +} + +#ifdef IPA_OFFLOAD +/* + * dp_peer_setup_get_reo_hash() - get reo dest ring and hash values for a peer + * @vdev: Datapath VDEV handle + * @reo_dest: pointer to default reo_dest ring for vdev to be populated + * @hash_based: pointer to hash value (enabled/disabled) to be populated + * + * If IPA is enabled in ini, for SAP mode, disable hash based + * steering, use default reo_dst ring for RX. Use config values for other modes. + * Return: None + */ +static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, + enum cdp_host_reo_dest_ring *reo_dest, + bool *hash_based) +{ + struct dp_soc *soc; + struct dp_pdev *pdev; + + pdev = vdev->pdev; + soc = pdev->soc; + + dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based); + + /* + * If IPA is enabled, disable hash-based flow steering and set + * reo_dest_ring_4 as the REO ring to receive packets on. + * IPA is configured to reap reo_dest_ring_4. + * + * Note - REO DST indexes are from 0 - 3, while cdp_host_reo_dest_ring + * value enum value is from 1 - 4. + * Hence, *reo_dest = IPA_REO_DEST_RING_IDX + 1 + */ + if (wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) { + if (vdev->opmode == wlan_op_mode_ap) { + *reo_dest = IPA_REO_DEST_RING_IDX + 1; + *hash_based = 0; + } + } +} + +#else + +/* + * dp_peer_setup_get_reo_hash() - get reo dest ring and hash values for a peer + * @vdev: Datapath VDEV handle + * @reo_dest: pointer to default reo_dest ring for vdev to be populated + * @hash_based: pointer to hash value (enabled/disabled) to be populated + * + * Use system config values for hash based steering. + * Return: None + */ + +static void dp_peer_setup_get_reo_hash(struct dp_vdev *vdev, + enum cdp_host_reo_dest_ring *reo_dest, + bool *hash_based) +{ + dp_vdev_get_default_reo_hash(vdev, reo_dest, hash_based); +} +#endif /* IPA_OFFLOAD */ + /* * dp_peer_setup_wifi3() - initialize the peer * @vdev_hdl: virtual device object @@ -4054,22 +4163,12 @@ static void dp_peer_setup_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) peer->last_disassoc_rcvd = 0; peer->last_deauth_rcvd = 0; - /* - * hash based steering is disabled for Radios which are offloaded - * to NSS - */ - if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) - hash_based = wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx); + dp_peer_setup_get_reo_hash(vdev, &reo_dest, &hash_based); - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, - FL("hash based steering for pdev: %d is %d"), - pdev->pdev_id, hash_based); + dp_info("pdev: %d vdev :%d opmode:%u hash-based-steering:%d default-reo_dest:%u", + pdev->pdev_id, vdev->vdev_id, + vdev->opmode, hash_based, reo_dest); - /* - * Below line of code will ensure the proper reo_dest ring is chosen - * for cases where toeplitz hash cannot be generated (ex: non TCP/UDP) - */ - reo_dest = pdev->reo_dest; /* * There are corner cases where the AD1 = AD2 = "VAPs address" @@ -5669,17 +5768,17 @@ dp_print_soc_rx_stats(struct dp_soc *soc) * * Return: void */ -static inline void +static void dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, char *ring_name) { uint32_t tailp; uint32_t headp; - if (srng->hal_srng != NULL) { + if (soc && srng && srng->hal_srng) { hal_api_get_tphp(soc->hal_soc, srng->hal_srng, &tailp, &headp); - DP_PRINT_STATS("%s : Head pointer = %d Tail Pointer = %d\n", - ring_name, headp, tailp); + DP_PRINT_STATS("%s : Head pointer = %d Tail Pointer = %d", + ring_name, headp, tailp); } } @@ -5726,6 +5825,7 @@ dp_print_ring_stats(struct dp_pdev *pdev) &pdev->soc->reo_dest_ring[i], ring_name); } + for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) { snprintf(ring_name, STR_MAXLEN, "Tcl Data Ring %d", i); dp_print_ring_stat_from_hal(pdev->soc, @@ -7280,6 +7380,8 @@ QDF_STATUS dp_update_config_parameters(struct cdp_soc *psoc, soc->wlan_cfg_ctx->tcp_udp_checksumoffload = params->tcp_udp_checksumoffload; soc->wlan_cfg_ctx->napi_enabled = params->napi_enable; + soc->wlan_cfg_ctx->ipa_enabled = params->ipa_enable; + dp_update_flow_control_parameters(soc, params); return QDF_STATUS_SUCCESS; diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index 1fef362151..27d3f9ab7e 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -127,27 +127,27 @@ extern void hal_detach(void *hal_soc); /* SRNG type to be passed in APIs hal_srng_get_entrysize and hal_srng_setup */ enum hal_ring_type { - REO_DST, - REO_EXCEPTION, - REO_REINJECT, - REO_CMD, - REO_STATUS, - TCL_DATA, - TCL_CMD, - TCL_STATUS, - CE_SRC, - CE_DST, - CE_DST_STATUS, - WBM_IDLE_LINK, - SW2WBM_RELEASE, - WBM2SW_RELEASE, - RXDMA_BUF, - RXDMA_DST, - RXDMA_MONITOR_BUF, - RXDMA_MONITOR_STATUS, - RXDMA_MONITOR_DST, - RXDMA_MONITOR_DESC, - DIR_BUF_RX_DMA_SRC, + REO_DST = 0, + REO_EXCEPTION = 1, + REO_REINJECT = 2, + REO_CMD = 3, + REO_STATUS = 4, + TCL_DATA = 5, + TCL_CMD = 6, + TCL_STATUS = 7, + CE_SRC = 8, + CE_DST = 9, + CE_DST_STATUS = 10, + WBM_IDLE_LINK = 11, + SW2WBM_RELEASE = 12, + WBM2SW_RELEASE = 13, + RXDMA_BUF = 14, + RXDMA_DST = 15, + RXDMA_MONITOR_BUF = 16, + RXDMA_MONITOR_STATUS = 17, + RXDMA_MONITOR_DST = 18, + RXDMA_MONITOR_DESC = 19, + DIR_BUF_RX_DMA_SRC = 20, #ifdef WLAN_FEATURE_CIF_CFR WIFI_POS_SRC, #endif diff --git a/hal/wifi3.0/hal_srng.c b/hal/wifi3.0/hal_srng.c index 52c502907d..3ecc1e7c25 100644 --- a/hal/wifi3.0/hal_srng.c +++ b/hal/wifi3.0/hal_srng.c @@ -93,12 +93,22 @@ static void hal_update_srng_hp_tp_address(void *hal_soc, srng = hal_get_srng(hal_soc, ring_id); - if (ring_config->ring_dir == HAL_SRNG_DST_RING) + if (ring_config->ring_dir == HAL_SRNG_DST_RING) { srng->u.dst_ring.tp_addr = SHADOW_REGISTER(shadow_config_index) + hal->dev_base_addr; - else + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, + "%s: tp_addr=%pK dev base addr %pK index %u", + __func__, srng->u.dst_ring.tp_addr, + hal->dev_base_addr, shadow_config_index); + } else { srng->u.src_ring.hp_addr = SHADOW_REGISTER(shadow_config_index) + hal->dev_base_addr; + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, + "%s: hp_addr=%pK dev base addr %pK index %u", + __func__, srng->u.src_ring.hp_addr, + hal->dev_base_addr, shadow_config_index); + } + } QDF_STATUS hal_set_one_shadow_config(void *hal_soc, @@ -132,9 +142,11 @@ QDF_STATUS hal_set_one_shadow_config(void *hal_soc, ring_num); QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO, - "%s: target_reg %x, shadow_index %x, ring_type %d, ring num %d", - __func__, target_register, shadow_config_index, - ring_type, ring_num); + "%s: target_reg %x, shadow register 0x%x shadow_index 0x%x, ring_type %d, ring num %d", + __func__, target_register, + SHADOW_REGISTER(shadow_config_index), + shadow_config_index, + ring_type, ring_num); return QDF_STATUS_SUCCESS; } @@ -435,14 +447,20 @@ void hal_srng_dst_set_hp_paddr(struct hal_srng *srng, void hal_srng_dst_init_hp(struct hal_srng *srng, uint32_t *vaddr) { + if (!srng) + return; + srng->u.dst_ring.hp_addr = vaddr; SRNG_DST_REG_WRITE(srng, HP, srng->u.dst_ring.cached_hp); - *(srng->u.dst_ring.hp_addr) = srng->u.dst_ring.cached_hp; - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "hp_addr=%pK, cached_hp=%d, hp=%d", - (void *)srng->u.dst_ring.hp_addr, srng->u.dst_ring.cached_hp, - *(srng->u.dst_ring.hp_addr)); + if (vaddr) { + *srng->u.dst_ring.hp_addr = srng->u.dst_ring.cached_hp; + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "hp_addr=%pK, cached_hp=%d, hp=%d", + (void *)srng->u.dst_ring.hp_addr, + srng->u.dst_ring.cached_hp, + *srng->u.dst_ring.hp_addr); + } } /** diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h index bf3e13617a..8e0d8dda9c 100644 --- a/wlan_cfg/cfg_dp.h +++ b/wlan_cfg/cfg_dp.h @@ -59,7 +59,8 @@ #define WLAN_CFG_PER_PDEV_LMAC_RING 0 #define WLAN_LRO_ENABLE 0 #ifdef IPA_OFFLOAD -#define WLAN_CFG_TX_RING_SIZE 2048 +/* Size of TCL TX Ring */ +#define WLAN_CFG_TX_RING_SIZE 1024 #define WLAN_CFG_PER_PDEV_TX_RING 0 #define WLAN_CFG_IPA_UC_TX_BUF_SIZE 2048 #define WLAN_CFG_IPA_UC_TX_PARTITION_BASE 3000 diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index 17c6662659..f404324097 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -657,6 +657,11 @@ bool wlan_cfg_is_lro_enabled(struct wlan_cfg_dp_soc_ctxt *cfg) return cfg->lro_enabled; } +bool wlan_cfg_is_ipa_enabled(struct wlan_cfg_dp_soc_ctxt *cfg) +{ + return cfg->ipa_enabled; +} + void wlan_cfg_set_rx_hash(struct wlan_cfg_dp_soc_ctxt *cfg, bool val) { cfg->rx_hash = val; diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index 7988a6eeb7..24c440e0a3 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -84,50 +84,58 @@ struct wlan_cfg_dp_pdev_ctxt; /** * struct wlan_cfg_dp_soc_ctxt - Configuration parameters for SoC (core TxRx) - * @num_int_ctxts - Number of NAPI/Interrupt contexts to be registered for DP - * @max_clients - Maximum number of peers/stations supported by device - * @max_alloc_size - Maximum allocation size for any dynamic memory + * @num_int_ctxts: Number of NAPI/Interrupt contexts to be registered for DP + * @max_clients: Maximum number of peers/stations supported by device + * @max_alloc_size: Maximum allocation size for any dynamic memory * allocation request for this device - * @per_pdev_tx_ring - 0 - TCL ring is not mapped per radio - * 1 - Each TCL ring is mapped to one radio/pdev - * @num_tcl_data_rings - Number of TCL Data rings supported by device - * @per_pdev_rx_ring - 0 - REO ring is not mapped per radio - * 1 - Each REO ring is mapped to one radio/pdev - * @num_tx_desc_pool - Number of Tx Descriptor pools - * @num_tx_ext_desc_pool - Number of Tx MSDU extension Descriptor pools - * @num_tx_desc - Number of Tx Descriptors per pool - * @num_tx_ext_desc - Number of Tx MSDU extension Descriptors per pool - * @max_peer_id - Maximum value of peer id that FW can assign for a client - * @htt_packet_type - Default 802.11 encapsulation type for any VAP created - * @int_tx_ring_mask - Bitmap of Tx interrupts mapped to each NAPI/Intr context - * @int_rx_ring_mask - Bitmap of Rx interrupts mapped to each NAPI/Intr context - * @int_rx_mon_ring_mask - Bitmap of Rx monitor ring interrupts mapped to each + * @per_pdev_tx_ring: 0: TCL ring is not mapped per radio + * 1: Each TCL ring is mapped to one radio/pdev + * @num_tcl_data_rings: Number of TCL Data rings supported by device + * @per_pdev_rx_ring: 0: REO ring is not mapped per radio + * 1: Each REO ring is mapped to one radio/pdev + * @num_tx_desc_pool: Number of Tx Descriptor pools + * @num_tx_ext_desc_pool: Number of Tx MSDU extension Descriptor pools + * @num_tx_desc: Number of Tx Descriptors per pool + * @num_tx_ext_desc: Number of Tx MSDU extension Descriptors per pool + * @max_peer_id: Maximum value of peer id that FW can assign for a client + * @htt_packet_type: Default 802.11 encapsulation type for any VAP created + * @int_tx_ring_mask: Bitmap of Tx interrupts mapped to each NAPI/Intr context + * @int_rx_ring_mask: Bitmap of Rx interrupts mapped to each NAPI/Intr context + * @int_rx_mon_ring_mask: Bitmap of Rx monitor ring interrupts mapped to each * NAPI/Intr context - * @int_rx_err_ring_mask - Bitmap of Rx err ring interrupts mapped to each + * @int_rx_err_ring_mask: Bitmap of Rx err ring interrupts mapped to each * NAPI/Intr context - * @int_wbm_rel_ring_mask - Bitmap of wbm rel ring interrupts mapped to each + * @int_wbm_rel_ring_mask: Bitmap of wbm rel ring interrupts mapped to each * NAPI/Intr context - * @int_reo_status_ring_mask - Bitmap of reo status ring interrupts mapped to each - * NAPI/Intr context - * @int_ce_ring_mask - Bitmap of CE interrupts mapped to each NAPI/Intr context - * @lro_enabled - enable/disable lro feature - * @rx_hash - Enable hash based steering of rx packets - * @tso_enabled - enable/disable tso feature - * @napi_enabled - enable/disable interrupt mode for reaping tx and rx packets - * @tcp_Udp_Checksumoffload - enable/disable checksum offload - * @nss_cfg - nss configuration - * @rx_defrag_min_timeout - rx defrag minimum timeout - * @wbm_release_ring - wbm release ring size - * @tcl_cmd_ring - tcl cmd ring size - * @tcl_status_ring - tcl status ring size - * @reo_reinject_ring - reo reinject ring - * @rx_release_ring - rx release ring size - * @reo_exception_ring - reo exception ring size - * @reo_cmd_ring - reo cmd ring size - * @reo_status_ring - reo status ting size - * @rxdma_refill_ring - rxdma refill ring size - * @rxdma_err_dst_ring - rxdma error detination ring size - * @raw_mode_war - enable/disable raw mode war + * @int_reo_status_ring_mask: Bitmap of reo status ring interrupts mapped to + * each NAPI/Intr context + * @int_ce_ring_mask: Bitmap of CE interrupts mapped to each NAPI/Intr context + * @lro_enabled: enable/disable lro feature + * @rx_hash: Enable hash based steering of rx packets + * @tso_enabled: enable/disable tso feature + * @lro_enabled: enable/disable LRO feature + * @sg_enabled: enable disable scatter gather feature + * @gro_enabled: enable disable GRO feature + * @ipa_enabled: Flag indicating if IPA is enabled + * @ol_tx_csum_enabled: Flag indicating if TX csum is enabled + * @ol_rx_csum_enabled: Flag indicating if Rx csum is enabled + * @rawmode_enabled: Flag indicating if RAW mode is enabled + * @peer_flow_ctrl_enabled: Flag indicating if peer flow control is enabled + * @napi_enabled: enable/disable interrupt mode for reaping tx and rx packets + * @tcp_udp_checksumoffload: enable/disable checksum offload + * @nss_cfg: nss configuration + * @rx_defrag_min_timeout: rx defrag minimum timeout + * @wbm_release_ring: wbm release ring size + * @tcl_cmd_ring: tcl cmd ring size + * @tcl_status_ring: tcl status ring size + * @reo_reinject_ring: reo reinject ring + * @rx_release_ring: rx release ring size + * @reo_exception_ring: reo exception ring size + * @reo_cmd_ring: reo cmd ring size + * @reo_status_ring: reo status ting size + * @rxdma_refill_ring: rxdma refill ring size + * @rxdma_err_dst_ring: rxdma error detination ring size + * @raw_mode_war: enable/disable raw mode war */ struct wlan_cfg_dp_soc_ctxt { int num_int_ctxts; @@ -169,6 +177,7 @@ struct wlan_cfg_dp_soc_ctxt { bool lro_enabled; bool sg_enabled; bool gro_enabled; + bool ipa_enabled; bool ol_tx_csum_enabled; bool ol_rx_csum_enabled; bool rawmode_enabled; @@ -660,20 +669,28 @@ int wlan_cfg_get_num_mac_rings(struct wlan_cfg_dp_pdev_ctxt *cfg); /* * wlan_cfg_is_lro_enabled - Return LRO enabled/disabled - * @wlan_cfg_pdev_ctx + * @wlan_cfg_dp_soc_ctxt * * Return: true - LRO enabled false - LRO disabled */ bool wlan_cfg_is_lro_enabled(struct wlan_cfg_dp_soc_ctxt *cfg); /* - * wlan_cfg_is_lro_enabled - Return RX hash enabled/disabled - * @wlan_cfg_pdev_ctx + * wlan_cfg_is_rx_hash_enabled - Return RX hash enabled/disabled + * @wlan_cfg_dp_soc_ctxt * * Return: true - enabled false - disabled */ bool wlan_cfg_is_rx_hash_enabled(struct wlan_cfg_dp_soc_ctxt *cfg); +/* + * wlan_cfg_is_ipa_enabled - Return IPA enabled/disabled + * @wlan_cfg_dp_soc_ctxt + * + * Return: true - enabled false - disabled + */ +bool wlan_cfg_is_ipa_enabled(struct wlan_cfg_dp_soc_ctxt *cfg); + /* * wlan_cfg_set_rx_hash - set rx hash enabled/disabled * @wlan_cfg_soc_ctx