From 7351d17b418ae53310f12cb5d17ce02f41138faf Mon Sep 17 00:00:00 2001 From: Dhanashri Atre Date: Wed, 12 Oct 2016 13:08:09 -0700 Subject: [PATCH] qcacmn: MCL Buffer Replenishment Add support for replenishing the rx buffers using the host to firmware buffer ring. This includes adding a flag QCA_HOST2FW_RXBUF_RING: When QCA_HOST2FW_RXBUF_RING is enabled the host will do the following: - Allocate the refill buffer ring (HTT_HOST1_TO_FW_RXBUF_RING) and populate it with rx buffers - Send the refill buffer ring configuration to the firmware - Allocate the rx DMA ring (HTT_RXDMA_HOST_BUF_RING), leave it empty. - Send the rx DMA ring configuration to the firmware When QCA_HOST2FW_RXBUF_RING is disabled, the host will do the following: - Allocate the rx DMA ring (HTT_RXDMA_HOST_BUF_RING), and populate it with rx buffers - Send the rx DMA ring configuration to the firmware CRs-Fixed: 1074199 Change-Id: Iec05a973cd9d628c742e3aaa16b8dabc7797625d --- dp/wifi3.0/dp_htt.c | 30 +++++++++++++++++++++++++----- dp/wifi3.0/dp_main.c | 25 +++++++++++++++++++------ dp/wifi3.0/dp_rx.c | 4 ++-- dp/wifi3.0/dp_rx_desc.c | 2 +- dp/wifi3.0/dp_types.h | 7 +++++-- hal/wifi3.0/hal_api.h | 2 ++ hal/wifi3.0/hal_internal.h | 11 ++++++----- hal/wifi3.0/hal_srng.c | 5 +++-- 8 files changed, 63 insertions(+), 23 deletions(-) diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 0d64cecebff6..228cfeb4e929 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -264,13 +264,33 @@ int htt_srng_setup(void *htt_soc, int pdev_id, void *hal_srng, switch (hal_ring_type) { case RXDMA_BUF: -#if QCA_HOST2FW_RXBUF_RING - htt_ring_id = HTT_HOST1_TO_FW_RXBUF_RING; - htt_ring_type = HTT_SW_TO_SW_RING; + switch (srng_params.ring_id) { + case HAL_SRNG_WMAC1_SW2RXDMA0_BUF: +#ifdef QCA_HOST2FW_RXBUF_RING + htt_ring_id = HTT_HOST1_TO_FW_RXBUF_RING; + htt_ring_type = HTT_SW_TO_SW_RING; #else - htt_ring_id = HTT_RXDMA_HOST_BUF_RING; - htt_ring_type = HTT_SW_TO_HW_RING; + htt_ring_id = HTT_RXDMA_HOST_BUF_RING; + htt_ring_type = HTT_SW_TO_HW_RING; #endif + break; + case HAL_SRNG_WMAC1_SW2RXDMA1_BUF: + htt_ring_id = HTT_RXDMA_HOST_BUF_RING; + htt_ring_type = HTT_SW_TO_HW_RING; + break; + default: + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: Ring %d currently not supported\n", + __func__, srng_params.ring_id); + goto fail1; + } + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: ring_type %d ring_id %d\n", + __func__, hal_ring_type, srng_params.ring_id); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "hp_addr 0x%x tp_addr 0x%x\n", hp_addr, tp_addr); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "htt_ring_id %d\n", htt_ring_id); break; case RXDMA_MONITOR_BUF: htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING; diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 5632df7602aa..2ecee1708eb3 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -768,14 +768,20 @@ void *dp_pdev_attach_wifi3(void *txrx_soc, void *ctrl_pdev, } - if (dp_srng_setup(soc, &pdev->rxdma_buf_ring, RXDMA_BUF, 0, pdev_id, + if (dp_srng_setup(soc, &pdev->rx_refill_buf_ring, RXDMA_BUF, 0, pdev_id, RXDMA_BUF_RING_SIZE)) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: dp_srng_setup failed for rxdma_buf_ring\n", - __func__); + "%s: dp_srng_setup failed rx refill ring\n", __func__); goto fail0; } - +#ifdef QCA_HOST2FW_RXBUF_RING + if (dp_srng_setup(soc, &pdev->rx_mac_buf_ring, RXDMA_BUF, 1, pdev_id, + RXDMA_BUF_RING_SIZE)) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: dp_srng_setup failed rx mac ring\n", __func__); + goto fail0; + } +#endif /* TODO: RXDMA destination ring is not planned to be used currently. * Setup the ring when required */ @@ -837,8 +843,11 @@ static void dp_pdev_detach_wifi3(void *txrx_pdev, int force) REO_DST, pdev->pdev_id); } - dp_srng_cleanup(soc, &pdev->rxdma_buf_ring, RXDMA_BUF, 0); + dp_srng_cleanup(soc, &pdev->rx_refill_buf_ring, RXDMA_BUF, 0); +#ifdef QCA_HOST2FW_RXBUF_RING + dp_srng_cleanup(soc, &pdev->rx_mac_buf_ring, RXDMA_BUF, 1); +#endif dp_srng_cleanup(soc, &pdev->rxdma_mon_buf_ring, RXDMA_MONITOR_BUF, 0); dp_srng_cleanup(soc, &pdev->rxdma_mon_dst_ring, RXDMA_MONITOR_DST, 0); @@ -939,7 +948,11 @@ int dp_soc_attach_target_wifi3(void *txrx_soc) struct dp_pdev *pdev = soc->pdev_list[i]; if (pdev) { htt_srng_setup(soc->htt_handle, i, - pdev->rxdma_buf_ring.hal_srng, RXDMA_BUF); + pdev->rx_refill_buf_ring.hal_srng, RXDMA_BUF); +#ifdef QCA_HOST2FW_RXBUF_RING + htt_srng_setup(soc->htt_handle, i, + pdev->rx_mac_buf_ring.hal_srng, RXDMA_BUF); +#endif #ifdef notyet /* FW doesn't handle monitor rings yet */ htt_srng_setup(soc->htt_handle, i, pdev->rxdma_mon_buf_ring.hal_srng, diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 608853b9d4a7..2d4e9c4d1478 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -62,7 +62,7 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, qdf_nbuf_t rx_netbuf; void *rxdma_ring_entry; union dp_rx_desc_list_elem_t *next; - struct dp_srng *dp_rxdma_srng = &dp_pdev->rxdma_buf_ring; + struct dp_srng *dp_rxdma_srng = &dp_pdev->rx_refill_buf_ring; void *rxdma_srng = dp_rxdma_srng->hal_srng; if (!rxdma_srng) { @@ -425,7 +425,7 @@ dp_rx_pdev_attach(struct dp_pdev *pdev) qdf_spinlock_create(&soc->rx_desc_mutex[pdev_id]); pdev = soc->pdev_list[pdev_id]; - rxdma_srng = pdev->rxdma_buf_ring; + rxdma_srng = pdev->rx_refill_buf_ring; rxdma_entries = rxdma_srng.alloc_size/hal_srng_get_entrysize( soc->hal_soc, RXDMA_BUF); diff --git a/dp/wifi3.0/dp_rx_desc.c b/dp/wifi3.0/dp_rx_desc.c index 8e7d528c62b8..54799e444c6a 100644 --- a/dp/wifi3.0/dp_rx_desc.c +++ b/dp/wifi3.0/dp_rx_desc.c @@ -32,7 +32,7 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id) { uint32_t i; struct dp_pdev *dp_pdev = soc->pdev_list[pool_id]; - struct dp_srng *rxdma_srng = &dp_pdev->rxdma_buf_ring; + struct dp_srng *rxdma_srng = &dp_pdev->rx_refill_buf_ring; soc->rx_desc[pool_id].array = qdf_mem_malloc( ((rxdma_srng->alloc_size/hal_srng_get_entrysize(soc->hal_soc, diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 7ff5c5052ee9..c681cf125b6c 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -291,8 +291,11 @@ struct dp_pdev { /* TXRX SOC handle */ struct dp_soc *soc; - /* RXDMA buffer replenish ring */ - struct dp_srng rxdma_buf_ring; + /* Ring used to replenish rx buffers (maybe to the firmware of MAC) */ + struct dp_srng rx_refill_buf_ring; + + /* Empty ring used by firmware to post rx buffers to the MAC */ + struct dp_srng rx_mac_buf_ring; /* RXDMA monitor buffer replenish ring */ struct dp_srng rxdma_mon_buf_ring; diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index 1d118d7d03c9..b968ab184178 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -120,6 +120,8 @@ struct hal_srng_params { uint32_t low_threshold; /* Misc flags */ uint32_t flags; + /* Unique ring id */ + uint8_t ring_id; }; /** diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index b8474fd684b9..bfd2eedb829c 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -111,11 +111,12 @@ enum hal_srng_ring_id { HAL_SRNG_LMAC1_ID_START = 128, HAL_SRNG_WMAC1_SW2RXDMA0_BUF = HAL_SRNG_LMAC1_ID_START, HAL_SRNG_WMAC1_SW2RXDMA1_BUF = 129, - HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = 130, - HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF = 131, - HAL_SRNG_WMAC1_RXDMA2SW0 = 132, - HAL_SRNG_WMAC1_RXDMA2SW1 = 133, - /* 134-142 unused */ + HAL_SRNG_WMAC1_SW2RXDMA2_BUF = 130, + HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = 131, + HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF = 132, + HAL_SRNG_WMAC1_RXDMA2SW0 = 133, + HAL_SRNG_WMAC1_RXDMA2SW1 = 134, + /* 135-142 unused */ HAL_SRNG_LMAC1_ID_END = 143 }; diff --git a/hal/wifi3.0/hal_srng.c b/hal/wifi3.0/hal_srng.c index 1d0d282fc126..94e14e711037 100644 --- a/hal/wifi3.0/hal_srng.c +++ b/hal/wifi3.0/hal_srng.c @@ -426,7 +426,7 @@ static struct hal_hw_srng_config hw_srng_table[] = { }, { /* RXDMA_BUF */ .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF, - .max_rings = 1, + .max_rings = 2, /* TODO: Check if the additional IPA buffer ring needs to be * setup here (in which case max_rings should be set to 2), * or it will be setup by IPA host driver @@ -453,7 +453,7 @@ static struct hal_hw_srng_config hw_srng_table[] = { .reg_size = {}, }, { /* RXDMA_MONITOR_BUF */ - .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_BUF, + .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF, .max_rings = 1, .entry_size = sizeof(struct wbm_buffer_ring) >> 2, .lmac_ring = TRUE, @@ -944,4 +944,5 @@ extern void hal_get_srng_params(void *hal_soc, void *hal_ring, srng->intr_batch_cntr_thres_entries; ring_params->low_threshold = srng->u.src_ring.low_threshold; ring_params->flags = srng->flags; + ring_params->ring_id = srng->ring_id; }