From b2ef27ba266306f330f40343435c03124969870a Mon Sep 17 00:00:00 2001 From: Pramod Simha Date: Fri, 14 Sep 2018 14:43:19 -0700 Subject: [PATCH] qcacmn: Fixes for IPA datapath 1. Disable host processing of REO2SW4 when IPA is enabled. 2. Change buffer memory location provide to IPA TX transfer ring from consistent to non-consistent memory. Change-Id: Ibb62d9faf5dc9adb5ee8a2e113d10a2912269cbd CRs-Fixed: 2315889 --- dp/wifi3.0/dp_ipa.c | 66 ++++++++++---------------------------------- hal/wifi3.0/hal_rx.h | 20 -------------- wlan_cfg/wlan_cfg.c | 11 ++++++++ 3 files changed, 25 insertions(+), 72 deletions(-) diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index 93f587fbe2..cdca06517d 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -45,37 +45,19 @@ static void dp_tx_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev) { int idx; - uint32_t ring_base_align = 8; - /* - * Uncomment when dp_ops_cfg.cfg_attach is implemented - * unsigned int uc_tx_buf_sz = - * dp_cfg_ipa_uc_tx_buf_size(pdev->osif_pdev); - */ - unsigned int uc_tx_buf_sz = CFG_IPA_UC_TX_BUF_SIZE_DEFAULT; - unsigned int alloc_size = uc_tx_buf_sz + ring_base_align - 1; 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_mem_free_consistent( - soc->osdev, soc->osdev->dev, - alloc_size, - soc->ipa_uc_tx_rsc. - tx_buf_pool_vaddr_unaligned[idx], - soc->ipa_uc_tx_rsc. - tx_buf_pool_paddr_unaligned[idx], - 0); + 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; - soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned[idx] = - (qdf_dma_addr_t)NULL; } } qdf_mem_free(soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned); soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned = NULL; - qdf_mem_free(soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned); - soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned = NULL; } /** @@ -117,9 +99,6 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) { uint32_t tx_buffer_count; uint32_t ring_base_align = 8; - void *buffer_vaddr_unaligned; - void *buffer_vaddr; - qdf_dma_addr_t buffer_paddr_unaligned; qdf_dma_addr_t buffer_paddr; struct hal_srng *wbm_srng = soc->tx_comp_ring[IPA_TX_COMP_RING_IDX].hal_srng; @@ -128,6 +107,7 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) uint32_t paddr_hi; void *ring_entry; int num_entries; + qdf_nbuf_t nbuf; int retval = QDF_STATUS_SUCCESS; /* * Uncomment when dp_ops_cfg.cfg_attach is implemented @@ -154,17 +134,6 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) return -ENOMEM; } - soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned = - qdf_mem_malloc(num_entries * - sizeof(*soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned)); - if (!soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s: IPA WBM Ring Tx buf pool paddr alloc fail", - __func__); - qdf_mem_free(soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned); - return -ENOMEM; - } - hal_srng_access_start(soc->hal_soc, (void *)wbm_srng); /* @@ -175,9 +144,8 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) */ for (tx_buffer_count = 0; tx_buffer_count < num_entries - 1; tx_buffer_count++) { - buffer_vaddr_unaligned = qdf_mem_alloc_consistent(soc->osdev, - soc->osdev->dev, alloc_size, &buffer_paddr_unaligned); - if (!buffer_vaddr_unaligned) + nbuf = qdf_nbuf_alloc(soc->osdev, alloc_size, 0, 256, FALSE); + if (!nbuf) break; ring_entry = hal_srng_dst_get_next_hp(soc->hal_soc, @@ -186,27 +154,23 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "%s: Failed to get WBM ring entry", __func__); - qdf_mem_free_consistent(soc->osdev, soc->osdev->dev, - alloc_size, buffer_vaddr_unaligned, - buffer_paddr_unaligned, 0); + qdf_nbuf_free(nbuf); break; } - buffer_vaddr = (void *)qdf_align((unsigned long) - buffer_vaddr_unaligned, ring_base_align); - buffer_paddr = buffer_paddr_unaligned + - ((unsigned long)(buffer_vaddr) - - (unsigned long)buffer_vaddr_unaligned); + qdf_nbuf_map_single(soc->osdev, nbuf, + QDF_DMA_BIDIRECTIONAL); + buffer_paddr = qdf_nbuf_get_frag_paddr(nbuf, 0); paddr_lo = ((u64)buffer_paddr & 0x00000000ffffffff); paddr_hi = ((u64)buffer_paddr & 0x0000001f00000000) >> 32; - HAL_WBM_PADDR_LO_SET(ring_entry, paddr_lo); - HAL_WBM_PADDR_HI_SET(ring_entry, paddr_hi); + HAL_RXDMA_PADDR_LO_SET(ring_entry, paddr_lo); + HAL_RXDMA_PADDR_HI_SET(ring_entry, paddr_hi); + HAL_RXDMA_MANAGER_SET(ring_entry, (IPA_TCL_DATA_RING_IDX + + HAL_WBM_SW0_BM_ID)); soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[tx_buffer_count] - = buffer_vaddr_unaligned; - soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned[tx_buffer_count] - = buffer_paddr_unaligned; + = (void *)nbuf; } hal_srng_access_end(soc->hal_soc, wbm_srng); @@ -223,8 +187,6 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) __func__); qdf_mem_free(soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned); soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned = NULL; - qdf_mem_free(soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned); - soc->ipa_uc_tx_rsc.tx_buf_pool_paddr_unaligned = NULL; retval = -ENOMEM; } diff --git a/hal/wifi3.0/hal_rx.h b/hal/wifi3.0/hal_rx.h index 7305c31074..e90d356d4e 100644 --- a/hal/wifi3.0/hal_rx.h +++ b/hal/wifi3.0/hal_rx.h @@ -195,26 +195,6 @@ enum hal_rx_ret_buf_manager { (cookie << BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB) & \ BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK) -/* - * macro to set the LSW of the nbuf data physical address - * to the WBM ring entry - */ -#define HAL_WBM_PADDR_LO_SET(buff_addr_info, paddr_lo) \ - ((*(((unsigned int *) buff_addr_info) + \ - (BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET >> 2))) = \ - (paddr_lo << BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB) & \ - BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK) - -/* - * macro to set the LSB of MSW of the nbuf data physical address - * to the WBM ring entry - */ -#define HAL_WBM_PADDR_HI_SET(buff_addr_info, paddr_hi) \ - ((*(((unsigned int *) buff_addr_info) + \ - (BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_OFFSET >> 2))) = \ - (paddr_hi << BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB) & \ - BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK) - /* * macro to set the manager into the rxdma ring entry */ diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index 869ebc791f..2fdcb20663 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -90,6 +90,7 @@ static const int tx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0}; +#ifndef IPA_OFFLOAD static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { 0, 0, @@ -98,6 +99,16 @@ static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { WLAN_CFG_RX_RING_MASK_1, WLAN_CFG_RX_RING_MASK_2, WLAN_CFG_RX_RING_MASK_3}; +#else +static const int rx_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { + 0, + 0, + WLAN_CFG_RX_RING_MASK_0, + 0, + WLAN_CFG_RX_RING_MASK_1, + WLAN_CFG_RX_RING_MASK_2, + 0}; +#endif static const int rx_mon_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS] = { 0,