Browse Source

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
Dhanashri Atre 8 years ago
parent
commit
7351d17b41

+ 25 - 5
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;

+ 19 - 6
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,

+ 2 - 2
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);

+ 1 - 1
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,

+ 5 - 2
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;

+ 2 - 0
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;
 };
 
 /**

+ 6 - 5
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
 };
 

+ 3 - 2
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;
 }