Browse Source

qcacmn: Setup RXDMA to software Ring for WMAC1

Setup RxDMA to software ring of both MACs, required for
DBS MCC case.

Change-Id: I1a094c1fafe39a2a41e8867c82c1236c4b9b6593
CRs-Fixed: 2135851
Manjunathappa Prakash 7 years ago
parent
commit
e23acaf21e
6 changed files with 115 additions and 18 deletions
  1. 3 0
      dp/wifi3.0/dp_internal.h
  2. 90 15
      dp/wifi3.0/dp_main.c
  3. 3 2
      dp/wifi3.0/dp_rx_err.c
  4. 1 1
      dp/wifi3.0/dp_types.h
  5. 8 0
      wlan_cfg/wlan_cfg.c
  6. 10 0
      wlan_cfg/wlan_cfg.h

+ 3 - 0
dp/wifi3.0/dp_internal.h

@@ -309,6 +309,9 @@ void dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle,
 	struct cdp_peer *peer_handle, enum cdp_sec_type sec_type,
 	 uint32_t *rx_pn);
 
+void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id);
+int dp_get_ring_id_for_mac_id(struct dp_soc *soc, uint32_t mac_id);
+
 #if defined(CONFIG_WIN) && WDI_EVENT_ENABLE
 QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
 		                uint32_t stats_type_upload_mask);

+ 90 - 15
dp/wifi3.0/dp_main.c

@@ -687,6 +687,12 @@ static uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget)
 				remaining_quota = budget;
 			}
 		}
+		for (ring = 0; ring < MAX_RX_MAC_RINGS; ring++) {
+			/* Need to check on this, why is required */
+			work_done = dp_rxdma_err_process(soc, ring,
+						remaining_quota);
+			budget -= work_done;
+		}
 	}
 
 	if (reo_status_mask)
@@ -1843,6 +1849,21 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 		soc->num_reo_dest_rings = 0;
 	}
 
+	/* LMAC RxDMA to SW Rings configuration */
+	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
+		/* Only valid for MCL */
+		struct dp_pdev *pdev = soc->pdev_list[0];
+
+		for (i = 0; i < MAX_RX_MAC_RINGS; i++) {
+			if (dp_srng_setup(soc, &pdev->rxdma_err_dst_ring[i],
+				RXDMA_DST, 0, i, RXDMA_ERR_DST_RING_SIZE)) {
+				QDF_TRACE(QDF_MODULE_ID_DP,
+					QDF_TRACE_LEVEL_ERROR,
+					FL("dp_srng_setup failed for rxdma_err_dst_ring"));
+				goto fail1;
+			}
+		}
+	}
 	/* TBD: call dp_rx_init to setup Rx SW descriptors */
 
 	/* REO reinjection ring */
@@ -2191,11 +2212,13 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
 		goto fail1;
 	}
 
-	if (dp_srng_setup(soc, &pdev->rxdma_err_dst_ring, RXDMA_DST, 0,
-		pdev_id, RXDMA_ERR_DST_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-			FL("dp_srng_setup failed for rxdma_mon_dst_ring"));
-		goto fail1;
+	if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
+		if (dp_srng_setup(soc, &pdev->rxdma_err_dst_ring[0], RXDMA_DST,
+				  0, pdev_id, RXDMA_ERR_DST_RING_SIZE)) {
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("dp_srng_setup failed for rxdma_err_dst_ring"));
+			goto fail1;
+		}
 	}
 
 	/* Setup second Rx refill buffer ring */
@@ -2357,7 +2380,15 @@ static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force)
 	dp_srng_cleanup(soc, &pdev->rxdma_mon_desc_ring,
 		RXDMA_MONITOR_DESC, 0);
 
-	dp_srng_cleanup(soc, &pdev->rxdma_err_dst_ring, RXDMA_DST, 0);
+	if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
+		dp_srng_cleanup(soc, &pdev->rxdma_err_dst_ring[0], RXDMA_DST, 0);
+	} else {
+		int i;
+
+		for (i = 0; i < MAX_RX_MAC_RINGS; i++)
+			dp_srng_cleanup(soc, &pdev->rxdma_err_dst_ring[i],
+				RXDMA_DST, 0);
+	}
 
 	soc->pdev_list[pdev->pdev_id] = NULL;
 	soc->pdev_count--;
@@ -2553,6 +2584,10 @@ static void dp_rxdma_ring_config(struct dp_soc *soc)
 					 pdev->rx_mac_buf_ring[j]
 						.hal_srng,
 					 RXDMA_BUF);
+				htt_srng_setup(soc->htt_handle, mac_id,
+					pdev->rxdma_err_dst_ring[j]
+						.hal_srng,
+					RXDMA_DST);
 				mac_id++;
 			}
 
@@ -2572,10 +2607,6 @@ static void dp_rxdma_ring_config(struct dp_soc *soc)
 			htt_srng_setup(soc->htt_handle, i,
 				pdev->rxdma_mon_desc_ring.hal_srng,
 				RXDMA_MONITOR_DESC);
-
-			htt_srng_setup(soc->htt_handle, i,
-					pdev->rxdma_err_dst_ring.hal_srng,
-					RXDMA_DST);
 		}
 	}
 }
@@ -2588,6 +2619,8 @@ static void dp_rxdma_ring_config(struct dp_soc *soc)
 		struct dp_pdev *pdev = soc->pdev_list[i];
 
 		if (pdev) {
+			int ring_idx = dp_get_ring_id_for_mac_id(soc, i);
+
 			htt_srng_setup(soc->htt_handle, i,
 				pdev->rx_refill_buf_ring.hal_srng, RXDMA_BUF);
 
@@ -2604,8 +2637,8 @@ static void dp_rxdma_ring_config(struct dp_soc *soc)
 				pdev->rxdma_mon_desc_ring.hal_srng,
 				RXDMA_MONITOR_DESC);
 			htt_srng_setup(soc->htt_handle, i,
-					pdev->rxdma_err_dst_ring.hal_srng,
-					RXDMA_DST);
+				pdev->rxdma_err_dst_ring[ring_idx].hal_srng,
+				RXDMA_DST);
 		}
 	}
 }
@@ -4134,9 +4167,14 @@ dp_print_ring_stats(struct dp_pdev *pdev)
 	dp_print_ring_stat_from_hal(pdev->soc,
 			&pdev->rxdma_mon_desc_ring,
 			"Rxdma mon desc Ring");
-	dp_print_ring_stat_from_hal(pdev->soc,
-			&pdev->rxdma_err_dst_ring,
-			"Rxdma err dst ring");
+
+	for (i = 0; i < MAX_RX_MAC_RINGS; i++) {
+		snprintf(ring_name, STR_MAXLEN, "Rxdma err dst ring %d", i);
+		dp_print_ring_stat_from_hal(pdev->soc,
+			&pdev->rxdma_err_dst_ring[i],
+			ring_name);
+	}
+
 	for (i = 0; i < MAX_RX_MAC_RINGS; i++) {
 		snprintf(ring_name, STR_MAXLEN, "Rx mac buf ring %d", i);
 		dp_print_ring_stat_from_hal(pdev->soc,
@@ -5653,6 +5691,43 @@ fail0:
 	return NULL;
 }
 
+/*
+ * dp_get_pdev_for_mac_id() -  Return pdev for mac_id
+ *
+ * @soc: handle to DP soc
+ * @mac_id: MAC id
+ *
+ * Return: Return pdev corresponding to MAC
+ */
+void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id)
+{
+	if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
+		return soc->pdev_list[mac_id];
+
+	/* Typically for MCL as there only 1 PDEV*/
+	return soc->pdev_list[0];
+}
+
+/*
+ * dp_get_ring_id_for_mac_id() -  Return pdev for mac_id
+ *
+ * @soc: handle to DP soc
+ * @mac_id: MAC id
+ *
+ * Return: ring id
+ */
+int dp_get_ring_id_for_mac_id(struct dp_soc *soc, uint32_t mac_id)
+{
+	/*
+	 * Single pdev using both MACs will operate on both MAC rings,
+	 * which is the case for MCL.
+	 */
+	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
+		return mac_id;
+
+	/* For WIN each PDEV will operate one ring, so index is zero. */
+	return 0;
+}
 #if defined(CONFIG_WIN) && WDI_EVENT_ENABLE
 /*
 * dp_set_pktlog_wifi3() - attach txrx vdev

+ 3 - 2
dp/wifi3.0/dp_rx_err.c

@@ -1235,7 +1235,8 @@ dp_rx_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 uint32_t
 dp_rxdma_err_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 {
-	struct dp_pdev *pdev = soc->pdev_list[mac_id];
+	struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id);
+	int ring_idx = dp_get_ring_id_for_mac_id(soc, mac_id);
 	uint8_t pdev_id;
 	void *hal_soc;
 	void *rxdma_dst_ring_desc;
@@ -1252,7 +1253,7 @@ dp_rxdma_err_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
 		return 0;
 #endif
 	pdev_id = pdev->pdev_id;
-	err_dst_srng = pdev->rxdma_err_dst_ring.hal_srng;
+	err_dst_srng = pdev->rxdma_err_dst_ring[ring_idx].hal_srng;
 
 	if (!err_dst_srng) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,

+ 1 - 1
dp/wifi3.0/dp_types.h

@@ -921,7 +921,7 @@ struct dp_pdev {
 	struct dp_srng rxdma_mon_desc_ring;
 
 	/* RXDMA error destination ring */
-	struct dp_srng rxdma_err_dst_ring;
+	struct dp_srng rxdma_err_dst_ring[MAX_RX_MAC_RINGS];
 
 	/* Link descriptor memory banks */
 	struct {

+ 8 - 0
wlan_cfg/wlan_cfg.c

@@ -34,6 +34,7 @@
 
 #ifdef CONFIG_MCL
 #define WLAN_CFG_PER_PDEV_RX_RING 0
+#define WLAN_CFG_PER_PDEV_LMAC_RING 0
 #define NUM_RXDMA_RINGS_PER_PDEV 2
 #define WLAN_LRO_ENABLE 1
 #ifdef IPA_OFFLOAD
@@ -61,6 +62,7 @@
 
 #ifdef CONFIG_WIN
 #define WLAN_CFG_PER_PDEV_RX_RING 0
+#define WLAN_CFG_PER_PDEV_LMAC_RING 1
 #define NUM_RXDMA_RINGS_PER_PDEV 1
 #define WLAN_LRO_ENABLE 0
 
@@ -302,6 +304,7 @@ struct wlan_cfg_dp_soc_ctxt *wlan_cfg_soc_attach()
 	wlan_cfg_ctx->per_pdev_tx_ring = WLAN_CFG_PER_PDEV_TX_RING;
 	wlan_cfg_ctx->num_tcl_data_rings = WLAN_CFG_NUM_TCL_DATA_RINGS;
 	wlan_cfg_ctx->per_pdev_rx_ring = WLAN_CFG_PER_PDEV_RX_RING;
+	wlan_cfg_ctx->per_pdev_lmac_ring = WLAN_CFG_PER_PDEV_LMAC_RING;
 	wlan_cfg_ctx->num_reo_dest_rings = WLAN_CFG_NUM_REO_DEST_RING;
 	wlan_cfg_ctx->num_tx_desc_pool = MAX_TXDESC_POOLS;
 	wlan_cfg_ctx->num_tx_ext_desc_pool = WLAN_CFG_NUM_TXEXT_DESC_POOL;
@@ -536,6 +539,11 @@ int wlan_cfg_per_pdev_tx_ring(struct wlan_cfg_dp_soc_ctxt *cfg)
 	return cfg->per_pdev_tx_ring;
 }
 
+int wlan_cfg_per_pdev_lmac_ring(struct wlan_cfg_dp_soc_ctxt *cfg)
+{
+	return cfg->per_pdev_lmac_ring;
+}
+
 int wlan_cfg_num_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *cfg)
 {
 	return cfg->num_tcl_data_rings;

+ 10 - 0
wlan_cfg/wlan_cfg.h

@@ -105,6 +105,7 @@ struct wlan_cfg_dp_soc_ctxt {
 	int per_pdev_tx_ring;
 	int num_tcl_data_rings;
 	int per_pdev_rx_ring;
+	int per_pdev_lmac_ring;
 	int num_reo_dest_rings;
 	int num_tx_desc_pool;
 	int num_tx_ext_desc_pool;
@@ -410,6 +411,15 @@ int wlan_cfg_num_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx);
  */
 int wlan_cfg_per_pdev_rx_ring(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx);
 
+/*
+ * wlan_cfg_per_pdev_lmac_ring() - Return true if error rings are mapped as
+ *                              one per radio
+ * @wlan_cfg_ctx
+ *
+ * Return: return 1 if per pdev error ring else 0
+ */
+int wlan_cfg_per_pdev_lmac_ring(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx);
+
 /*
  * wlan_cfg_num_reo_dest_rings() - Number of REO Data rings supported by device
  * @wlan_cfg_ctx - Configuration Handle