Explorar el Código

qcacmn: Added support to handle NULL Q descriptors

The MC BC packets cause a NULL REO queue descriptor exception,
and hence are directed to the ring that is configured to receive
this exception from REO. As of now, this error is directed to
WBM release ring. Add handling to pass these packets to stack
instead of dropping them, when received on the WBM release ring.

Note that, the final fix may be route these to REO exception ring
from which the driver may need to pass them to stack.

CRs-Fixed: 1098153
Change-Id: If544911e7882a9f5e7dbffa5ef705618e9fcbbda
Tallapragada Kalyan hace 8 años
padre
commit
1ef5480ea4
Se han modificado 7 ficheros con 361 adiciones y 202 borrados
  1. 146 159
      dp/wifi3.0/dp_main.c
  2. 5 10
      dp/wifi3.0/dp_rx.c
  3. 5 1
      dp/wifi3.0/dp_rx.h
  4. 150 27
      dp/wifi3.0/dp_rx_err.c
  5. 2 0
      dp/wifi3.0/dp_types.h
  6. 50 5
      dp/wifi3.0/hal_rx.h
  7. 3 0
      hal/wifi3.0/hal_internal.h

+ 146 - 159
dp/wifi3.0/dp_main.c

@@ -51,9 +51,9 @@ static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng,
 		&(srng->base_paddr_unaligned));
 
 	if (!srng->base_vaddr_unaligned) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: alloc failed - ring_type: %d, ring_num %d\n",
-			__func__, ring_type, ring_num);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("alloc failed - ring_type: %d, ring_num %d"),
+			ring_type, ring_num);
 		return QDF_STATUS_E_NOMEM;
 	}
 
@@ -105,9 +105,9 @@ static void dp_srng_cleanup(struct dp_soc *soc, struct dp_srng *srng,
 	int ring_type, int ring_num)
 {
 	if (!srng->hal_srng) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: Ring type: %d, num:%d not setup\n",
-			__func__, ring_type, ring_num);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("Ring type: %d, num:%d not setup"),
+			ring_type, ring_num);
 		return;
 	}
 
@@ -138,6 +138,8 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget)
 	uint32_t budget = dp_budget;
 	uint8_t tx_mask = int_ctx->tx_ring_mask;
 	uint8_t rx_mask = int_ctx->rx_ring_mask;
+	uint8_t rx_err_mask = int_ctx->rx_err_ring_mask;
+	uint8_t rx_wbm_rel_mask = int_ctx->rx_wbm_rel_ring_mask;
 
 	/* Process Tx completion interrupts first to return back buffers */
 	if (tx_mask) {
@@ -147,7 +149,10 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget)
 					dp_tx_comp_handler(soc, ring, budget);
 				budget -= work_done;
 				if (work_done)
-					DP_TRACE(INFO, "tx mask 0x%x ring %d, budget %d\n",
+					QDF_TRACE(QDF_MODULE_ID_DP,
+						QDF_TRACE_LEVEL_INFO,
+						"tx mask 0x%x ring %d,"
+						"budget %d",
 						tx_mask, ring, budget);
 				if (budget <= 0)
 					goto budget_done;
@@ -155,6 +160,36 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget)
 		}
 	}
 
+	/* Process REO Exception ring interrupt */
+	if (rx_err_mask) {
+		work_done = dp_rx_err_process(soc,
+				soc->reo_exception_ring.hal_srng, budget);
+		budget -=  work_done;
+
+		if (work_done)
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
+				"REO Exception Ring: work_done %d budget %d",
+				work_done, budget);
+		if (budget <= 0) {
+			goto budget_done;
+		}
+	}
+
+	/* Process Rx WBM release ring interrupt */
+	if (rx_wbm_rel_mask) {
+		work_done = dp_rx_wbm_err_process(soc,
+				soc->rx_rel_ring.hal_srng, budget);
+		budget -=  work_done;
+
+		if (work_done)
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
+				"WBM Release Ring: work_done %d budget %d",
+				work_done, budget);
+		if (budget <= 0) {
+			goto budget_done;
+		}
+	}
+
 	/* Process Rx interrupts */
 	if (rx_mask) {
 		for (ring = 0; ring < soc->num_reo_dest_rings; ring++) {
@@ -165,7 +200,10 @@ uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget)
 					    budget);
 				budget -=  work_done;
 				if (work_done)
-					DP_TRACE(INFO, "rx mask 0x%x ring %d, budget %d\n",
+					QDF_TRACE(QDF_MODULE_ID_DP,
+						QDF_TRACE_LEVEL_INFO,
+						"rx mask 0x%x ring %d,"
+						"budget %d",
 						tx_mask, ring, budget);
 				if (budget <= 0)
 					goto budget_done;
@@ -215,6 +253,8 @@ QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc)
 		soc->intr_ctx[i].tx_ring_mask = 0xF;
 		soc->intr_ctx[i].rx_ring_mask = 0xF;
 		soc->intr_ctx[i].rx_mon_ring_mask = 0xF;
+		soc->intr_ctx[i].rx_err_ring_mask = 0x1;
+		soc->intr_ctx[i].rx_wbm_rel_ring_mask = 0x1;
 		soc->intr_ctx[i].soc = soc;
 	}
 
@@ -305,8 +345,8 @@ QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc)
 				&soc->intr_ctx[i]);
 
 		if (ret) {
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: failed, ret = %d",	__func__, ret);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("failed, ret = %d"), ret);
 
 			return QDF_STATUS_E_FAILURE;
 		}
@@ -390,9 +430,9 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc)
 	while (total_link_descs < num_entries)
 		total_link_descs <<= 1;
 
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		"%s: total_link_descs: %u, link_desc_size: %d\n",
-		__func__, total_link_descs, link_desc_size);
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
+		FL("total_link_descs: %u, link_desc_size: %d"),
+		total_link_descs, link_desc_size);
 	total_mem_size =  total_link_descs * link_desc_size;
 
 	total_mem_size += link_desc_align;
@@ -407,9 +447,9 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc)
 			(max_alloc_size - link_desc_align);
 	}
 
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		"%s: total_mem_size: %d, num_link_desc_banks: %u\n",
-		__func__, total_mem_size, num_link_desc_banks);
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
+		FL("total_mem_size: %d, num_link_desc_banks: %u"),
+		total_mem_size, num_link_desc_banks);
 
 	for (i = 0; i < num_link_desc_banks; i++) {
 		soc->link_desc_banks[i].base_vaddr_unaligned =
@@ -431,9 +471,8 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc)
 			soc->link_desc_banks[i].base_vaddr_unaligned));
 
 		if (!soc->link_desc_banks[i].base_vaddr_unaligned) {
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: Link descriptor memory alloc failed\n",
-				__func__);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("Link descriptor memory alloc failed"));
 			goto fail;
 		}
 	}
@@ -472,9 +511,8 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc)
 
 		if (dp_srng_setup(soc, &soc->wbm_idle_link_ring,
 			WBM_IDLE_LINK, 0, 0, total_link_descs)) {
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: Link desc idle ring setup failed\n",
-				__func__);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("Link desc idle ring setup failed"));
 			goto fail;
 		}
 
@@ -523,10 +561,9 @@ static int dp_hw_link_desc_pool_setup(struct dp_soc *soc)
 				soc->wbm_idle_scatter_buf_size,
 				&(soc->wbm_idle_scatter_buf_base_paddr[i]));
 			if (soc->wbm_idle_scatter_buf_base_vaddr[i] == NULL) {
-				QDF_TRACE(QDF_MODULE_ID_TXRX,
+				QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE_LEVEL_ERROR,
-					"%s:Scatter list memory alloc failed\n",
-					__func__);
+					FL("Scatter list memory alloc failed"));
 				goto fail;
 			}
 		}
@@ -681,9 +718,8 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 	/* Common rings */
 	if (dp_srng_setup(soc, &soc->wbm_desc_rel_ring, SW2WBM_RELEASE, 0, 0,
 		WBM_RELEASE_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for wbm_desc_rel_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for wbm_desc_rel_ring"));
 		goto fail1;
 	}
 
@@ -696,18 +732,16 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 		for (i = 0; i < soc->num_tcl_data_rings; i++) {
 			if (dp_srng_setup(soc, &soc->tcl_data_ring[i],
 				TCL_DATA, i, 0, TCL_DATA_RING_SIZE)) {
-				QDF_TRACE(QDF_MODULE_ID_TXRX,
+				QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE_LEVEL_ERROR,
-					"%s: dp_srng_setup failed for tcl_data_ring[%d]\n",
-					__func__, i);
+					FL("dp_srng_setup failed for tcl_data_ring[%d]"), i);
 				goto fail1;
 			}
 			if (dp_srng_setup(soc, &soc->tx_comp_ring[i],
 				WBM2SW_RELEASE, i, 0, TCL_DATA_RING_SIZE)) {
-				QDF_TRACE(QDF_MODULE_ID_TXRX,
+				QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE_LEVEL_ERROR,
-					"%s: dp_srng_setup failed for tx_comp_ring[%d]\n",
-					__func__, i);
+					FL("dp_srng_setup failed for tx_comp_ring[%d]"), i);
 				goto fail1;
 			}
 		}
@@ -717,25 +751,23 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 	}
 
 	if (dp_tx_soc_attach(soc)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: dp_tx_soc_attach failed\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("dp_tx_soc_attach failed"));
 		goto fail1;
 	}
 
 	/* TCL command and status rings */
 	if (dp_srng_setup(soc, &soc->tcl_cmd_ring, TCL_CMD, 0, 0,
 		TCL_CMD_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for tcl_cmd_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for tcl_cmd_ring"));
 		goto fail1;
 	}
 
 	if (dp_srng_setup(soc, &soc->tcl_status_ring, TCL_STATUS, 0, 0,
 		TCL_STATUS_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for tcl_status_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for tcl_status_ring"));
 		goto fail1;
 	}
 
@@ -751,10 +783,9 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 		for (i = 0; i < soc->num_reo_dest_rings; i++) {
 			if (dp_srng_setup(soc, &soc->reo_dest_ring[i], REO_DST,
 				i, 0, REO_DST_RING_SIZE)) {
-				QDF_TRACE(QDF_MODULE_ID_TXRX,
+				QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE_LEVEL_ERROR,
-					"%s: dp_srng_setup failed for reo_dest_ring[%d]\n",
-					__func__, i);
+					FL("dp_srng_setup failed for reo_dest_ring[%d]"), i);
 				goto fail1;
 			}
 		}
@@ -768,9 +799,8 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 	/* REO reinjection ring */
 	if (dp_srng_setup(soc, &soc->reo_reinject_ring, REO_REINJECT, 0, 0,
 		REO_REINJECT_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for reo_reinject_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for reo_reinject_ring"));
 		goto fail1;
 	}
 
@@ -778,9 +808,8 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 	/* Rx release ring */
 	if (dp_srng_setup(soc, &soc->rx_rel_ring, WBM2SW_RELEASE, 3, 0,
 		RX_RELEASE_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for rx_rel_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for rx_rel_ring"));
 		goto fail1;
 	}
 
@@ -788,9 +817,8 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 	/* Rx exception ring */
 	if (dp_srng_setup(soc, &soc->reo_exception_ring, REO_EXCEPTION, 0,
 		MAX_REO_DEST_RINGS, REO_EXCEPTION_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for reo_exception_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for reo_exception_ring"));
 		goto fail1;
 	}
 
@@ -798,17 +826,15 @@ static int dp_soc_cmn_setup(struct dp_soc *soc)
 	/* REO command and status rings */
 	if (dp_srng_setup(soc, &soc->reo_cmd_ring, REO_CMD, 0, 0,
 		REO_CMD_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for reo_cmd_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for reo_cmd_ring"));
 		goto fail1;
 	}
 
 	if (dp_srng_setup(soc, &soc->reo_status_ring, REO_STATUS, 0, 0,
 		REO_STATUS_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for reo_status_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for reo_status_ring"));
 		goto fail1;
 	}
 
@@ -846,16 +872,16 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev,
 	struct dp_pdev *pdev = qdf_mem_malloc(sizeof(*pdev));
 
 	if (!pdev) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: DP PDEV memory allocation failed\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("DP PDEV memory allocation failed"));
 		goto fail0;
 	}
 
 	pdev->wlan_cfg_ctx = wlan_cfg_pdev_attach();
 
 	if (!pdev->wlan_cfg_ctx) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: pdev cfg_attach failed\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("pdev cfg_attach failed"));
 
 		qdf_mem_free(pdev);
 		goto fail0;
@@ -870,8 +896,8 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev,
 	pdev->vdev_count = 0;
 
 	if (dp_soc_cmn_setup(soc)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_soc_cmn_setup failed\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_soc_cmn_setup failed"));
 		goto fail1;
 	}
 
@@ -879,16 +905,14 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev,
 	if (wlan_cfg_per_pdev_tx_ring(soc->wlan_cfg_ctx)) {
 		if (dp_srng_setup(soc, &soc->tcl_data_ring[pdev_id], TCL_DATA,
 			pdev_id, pdev_id, TCL_DATA_RING_SIZE)) {
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: dp_srng_setup failed for tcl_data_ring\n",
-				__func__);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("dp_srng_setup failed for tcl_data_ring"));
 			goto fail1;
 		}
 		if (dp_srng_setup(soc, &soc->tx_comp_ring[pdev_id],
 			WBM2SW_RELEASE, pdev_id, pdev_id, TCL_DATA_RING_SIZE)) {
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: dp_srng_setup failed for tx_comp_ring\n",
-				__func__);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("dp_srng_setup failed for tx_comp_ring"));
 			goto fail1;
 		}
 		soc->num_tcl_data_rings++;
@@ -896,8 +920,8 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev,
 
 	/* Tx specific init */
 	if (dp_tx_pdev_attach(pdev)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_tx_pdev_attach failed\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_tx_pdev_attach failed"));
 		goto fail1;
 	}
 
@@ -905,9 +929,8 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev,
 	if (wlan_cfg_per_pdev_rx_ring(soc->wlan_cfg_ctx)) {
 		if (dp_srng_setup(soc, &soc->reo_dest_ring[pdev_id], REO_DST,
 			pdev_id, pdev_id, REO_DST_RING_SIZE)) {
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: dp_srng_setup failed for reo_dest_ring\n",
-				__func__);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("dp_srng_setup failed for reo_dest_ringn"));
 			goto fail1;
 		}
 		soc->num_reo_dest_rings++;
@@ -916,15 +939,15 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev,
 
 	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 rx refill ring\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			 FL("dp_srng_setup failed rx refill ring"));
 		goto fail1;
 	}
 #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__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			 FL("dp_srng_setup failed rx mac ring"));
 		goto fail1;
 	}
 #endif
@@ -933,17 +956,15 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev,
 	 */
 	if (dp_srng_setup(soc, &pdev->rxdma_mon_buf_ring, RXDMA_MONITOR_BUF, 0,
 		pdev_id, RXDMA_MONITOR_BUF_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for rxdma_mon_buf_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for rxdma_mon_buf_ring"));
 		goto fail1;
 	}
 
 	if (dp_srng_setup(soc, &pdev->rxdma_mon_dst_ring, RXDMA_MONITOR_DST, 0,
 		pdev_id, RXDMA_MONITOR_DST_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for rxdma_mon_dst_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for rxdma_mon_dst_ring"));
 		goto fail1;
 	}
 
@@ -951,16 +972,15 @@ void *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, void *ctrl_pdev,
 	if (dp_srng_setup(soc, &pdev->rxdma_mon_status_ring,
 		RXDMA_MONITOR_STATUS, 0, pdev_id,
 		RXDMA_MONITOR_STATUS_RING_SIZE)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: dp_srng_setup failed for rxdma_mon_status_ring\n",
-			__func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("dp_srng_setup failed for rxdma_mon_status_ring"));
 		goto fail1;
 	}
 
 	/* Rx specific init */
 	if (dp_rx_pdev_attach(pdev)) {
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: dp_rx_pdev_attach failed \n", __func__);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("dp_rx_pdev_attach failed "));
 			goto fail0;
 	}
 
@@ -1154,8 +1174,8 @@ void *dp_vdev_attach_wifi3(void *txrx_pdev,
 	struct dp_vdev *vdev = qdf_mem_malloc(sizeof(*vdev));
 
 	if (!vdev) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: DP VDEV memory allocation failed\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("DP VDEV memory allocation failed"));
 		goto fail0;
 	}
 
@@ -1198,11 +1218,8 @@ void *dp_vdev_attach_wifi3(void *txrx_pdev,
 		qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
 #endif
 
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-		"Created vdev %p (%02x:%02x:%02x:%02x:%02x:%02x)\n", vdev,
-		vdev->mac_addr.raw[0], vdev->mac_addr.raw[1],
-		vdev->mac_addr.raw[2], vdev->mac_addr.raw[3],
-		vdev->mac_addr.raw[4], vdev->mac_addr.raw[5]);
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+		"Created vdev %p (%pM)", vdev, vdev->mac_addr.raw);
 
 	return (void *)vdev;
 
@@ -1236,7 +1253,8 @@ void dp_vdev_register_wifi3(void *vdev_handle, void *osif_vdev,
 	/* TODO: Enable the following once Tx code is integrated */
 	txrx_ops->tx.tx = dp_tx_send;
 
-	DP_TRACE(ERROR, "DP Vdev Register success");
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
+		"DP Vdev Register success");
 }
 
 /*
@@ -1267,13 +1285,10 @@ void dp_vdev_detach_wifi3(void *vdev_handle,
 	/* check that the vdev has no peers allocated */
 	if (!TAILQ_EMPTY(&vdev->peer_list)) {
 		/* debug print - will be removed later */
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN,
-			"%s: not deleting vdev object %p (%02x:%02x:%02x:%02x:%02x:%02x)"
-			"until deletion finishes for all its peers\n",
-			__func__, vdev,
-			vdev->mac_addr.raw[0], vdev->mac_addr.raw[1],
-			vdev->mac_addr.raw[2], vdev->mac_addr.raw[3],
-			vdev->mac_addr.raw[4], vdev->mac_addr.raw[5]);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
+			FL("not deleting vdev object %p (%pM)"
+			"until deletion finishes for all its peers"),
+			vdev, vdev->mac_addr.raw);
 		/* indicate that the vdev needs to be deleted */
 		vdev->delete.pending = 1;
 		vdev->delete.callback = callback;
@@ -1284,12 +1299,8 @@ void dp_vdev_detach_wifi3(void *vdev_handle,
 	qdf_spin_unlock_bh(&soc->peer_ref_mutex);
 
 	dp_tx_vdev_detach(vdev);
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		"%s: deleting vdev object %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
-		__func__, vdev,
-		vdev->mac_addr.raw[0], vdev->mac_addr.raw[1],
-		vdev->mac_addr.raw[2], vdev->mac_addr.raw[3],
-		vdev->mac_addr.raw[4], vdev->mac_addr.raw[5]);
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
+		FL("deleting vdev object %p (%pM)"), vdev, vdev->mac_addr.raw);
 
 	qdf_mem_free(vdev);
 
@@ -1357,18 +1368,15 @@ void *dp_peer_create_wifi3(void *vdev_handle, uint8_t *peer_mac_addr)
 	/* TODO: See if hash based search is required */
 	dp_peer_find_hash_add(soc, peer);
 
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		"vdev %p created peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
-		vdev, peer,
-		peer->mac_addr.raw[0], peer->mac_addr.raw[1],
-		peer->mac_addr.raw[2], peer->mac_addr.raw[3],
-		peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
+		"vdev %p created peer %p (%pM)",
+		vdev, peer, peer->mac_addr.raw);
 	/*
 	 * For every peer MAp message search and set if bss_peer
 	 */
 	if (memcmp(peer->mac_addr.raw, vdev->mac_addr.raw, 6) == 0) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-			"vdev bss_peer!!!!\n");
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
+			"vdev bss_peer!!!!");
 		peer->bss_peer = 1;
 		vdev->vap_bss_peer = peer;
 	}
@@ -1469,11 +1477,8 @@ void dp_peer_unref_delete(void *peer_handle)
 		if (peer_id != HTT_INVALID_PEER)
 			soc->peer_id_to_obj_map[peer_id] = NULL;
 
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-			"Deleting peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
-			peer, peer->mac_addr.raw[0], peer->mac_addr.raw[1],
-			peer->mac_addr.raw[2], peer->mac_addr.raw[3],
-			peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
+			"Deleting peer %p (%pM)", peer, peer->mac_addr.raw);
 
 		/* remove the reference to the peer from the hash table */
 		dp_peer_find_hash_remove(soc, peer);
@@ -1489,8 +1494,8 @@ void dp_peer_unref_delete(void *peer_handle)
 				peer_list_elem);
 		} else {
 			/*Ignoring the remove operation as peer not found*/
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN,
-				"WARN peer %p not found in vdev (%p)->peer_list:%p\n",
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
+				"peer %p not found in vdev (%p)->peer_list:%p",
 				peer, vdev, &peer->vdev->peer_list);
 		}
 
@@ -1514,18 +1519,11 @@ void dp_peer_unref_delete(void *peer_handle)
 				void *vdev_delete_context =
 					vdev->delete.context;
 
-				QDF_TRACE(QDF_MODULE_ID_TXRX,
+				QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE_LEVEL_INFO_HIGH,
-					"%s: deleting vdev object %p "
-					"(%02x:%02x:%02x:%02x:%02x:%02x)"
-					" - its last peer is done\n",
-					__func__, vdev,
-					vdev->mac_addr.raw[0],
-					vdev->mac_addr.raw[1],
-					vdev->mac_addr.raw[2],
-					vdev->mac_addr.raw[3],
-					vdev->mac_addr.raw[4],
-					vdev->mac_addr.raw[5]);
+					FL("deleting vdev object %p (%pM)"
+					" - its last peer is done"),
+					vdev, vdev->mac_addr.raw);
 				/* all peers are gone, go ahead and delete it */
 				qdf_mem_free(vdev);
 				if (vdev_delete_cb)
@@ -1561,11 +1559,8 @@ void dp_peer_delete_wifi3(void *peer_handle)
 	 */
 	peer->rx_opt_proc = dp_rx_discard;
 
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		"%s:peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n", __func__, peer,
-		  peer->mac_addr.raw[0], peer->mac_addr.raw[1],
-		  peer->mac_addr.raw[2], peer->mac_addr.raw[3],
-		  peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
+		FL("peer %p (%pM)"),  peer, peer->mac_addr.raw);
 
 	/*
 	 * Remove the reference added during peer_attach.
@@ -1805,8 +1800,8 @@ void *dp_soc_attach_wifi3(void *osif_soc, void *hif_handle,
 	struct dp_soc *soc = qdf_mem_malloc(sizeof(*soc));
 
 	if (!soc) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: DP SOC memory allocation failed\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("DP SOC memory allocation failed"));
 		goto fail0;
 	}
 
@@ -1819,28 +1814,20 @@ void *dp_soc_attach_wifi3(void *osif_soc, void *hif_handle,
 	soc->hal_soc = hif_get_hal_handle(hif_handle);
 	soc->htt_handle = htt_soc_attach(soc, osif_soc, htc_handle,
 		soc->hal_soc, qdf_osdev);
-	if (soc->htt_handle == NULL) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: HTT attach failed\n", __func__);
+	if (!soc->htt_handle) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("HTT attach failed"));
 		goto fail1;
 	}
 
 	soc->wlan_cfg_ctx = wlan_cfg_soc_attach();
 	if (!soc->wlan_cfg_ctx) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: wlan_cfg_soc_attach failed\n", __func__);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("wlan_cfg_soc_attach failed"));
 		goto fail2;
 	}
 	qdf_spinlock_create(&soc->peer_ref_mutex);
 
-#ifdef notyet
-	if (wdi_event_attach(soc)) {
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s: WDI event attach failed\n", __func__);
-		goto fail2;
-	}
-#endif
-
 	if (dp_soc_interrupt_attach(soc) != QDF_STATUS_SUCCESS) {
 		goto fail2;
 	}

+ 5 - 10
dp/wifi3.0/dp_rx.c

@@ -170,8 +170,7 @@ dp_rx_intrabss_fwd(struct dp_soc *soc,
 		   bool *is_term)
 {
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-		"%s %d : Intra-BSS forwarding not implemented",
-			__func__, __LINE__);
+		FL("Intra-BSS forwarding not implemented"));
 	return false;
 }
 
@@ -222,8 +221,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		 * Ring Type / Ring Id combo
 		 */
 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s %d : HAL RING Access Failed -- %p\n",
-			__func__, __LINE__, hal_ring);
+			FL("HAL RING Access Failed -- %p"), hal_ring);
 		hal_srng_access_end(hal_soc, hal_ring);
 		goto done;
 	}
@@ -238,8 +236,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 
 		if (qdf_unlikely(error == HAL_REO_ERROR_DETECTED)) {
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-			"%s %d : HAL RING 0x%p:error %d\n",
-			__func__, __LINE__, hal_ring, error);
+			FL("HAL RING 0x%p:error %d"), hal_ring, error);
 			/* Don't know how to deal with this -- assert */
 			qdf_assert(0);
 		}
@@ -288,8 +285,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		if (!hal_rx_attn_msdu_done_get(rx_desc->rx_buf_start)) {
 
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-			"%s %d : HAL RING 0x%p\n",
-			__func__, __LINE__, hal_ring);
+			FL("HAL RING 0x%p"), hal_ring);
 
 			print_hex_dump(KERN_ERR,
 			       "\t Pkt Desc:", DUMP_PREFIX_NONE, 32, 4,
@@ -338,8 +334,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		/* Peer lookup failed */
 		if (!peer) {
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-				 "%s %d : peer look-up failed peer id %d\n",
-				 __func__, __LINE__, peer_id);
+				 FL("peer look-up failed peer id %d"), peer_id);
 
 			/* Drop & free packet */
 			qdf_nbuf_free(rx_desc->nbuf);

+ 5 - 1
dp/wifi3.0/dp_rx.h

@@ -119,8 +119,12 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 				   union dp_rx_desc_list_elem_t **desc_list,
 				   union dp_rx_desc_list_elem_t **tail,
 				   uint8_t owner);
+uint32_t dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota);
+
+uint32_t dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota);
+
 uint32_t
-dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota);
+dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota);
 
 /**
  * dp_rx_add_to_free_desc_list() - Adds to a local free descriptor list

+ 150 - 27
dp/wifi3.0/dp_rx_err.c

@@ -219,6 +219,111 @@ dp_rx_2k_jump_handle(struct dp_soc *soc, void *ring_desc,
 				head, tail, quota);
 }
 
+/**
+* dp_rx_null_q_desc_handle() - Function to handle NULL Queue
+*                              descriptor violation on either a
+*                              REO or WBM ring
+*
+* @soc: core DP main context
+* @ring_desc: opaque pointer to the REO error ring descriptor
+* @head: pointer to head of rx descriptors to be added to free list
+* @tail: pointer to tail of rx descriptors to be added to free list
+* quota: upper limit of descriptors that can be reaped
+*
+* This function handles NULL queue descriptor violations arising out
+* a missing REO queue for a given peer or a given TID. This typically
+* may happen if a packet is received on a QOS enabled TID before the
+* ADDBA negotiation for that TID, when the TID queue is setup. Or
+* it may also happen for MC/BC frames if they are not routed to the
+* non-QOS TID queue, in the absence of any other default TID queue.
+* This error can show up both in a REO destination or WBM release ring.
+*
+* Return: uint32_t: No. of Rx buffers reaped
+*/
+uint32_t
+dp_rx_null_q_desc_handle(struct dp_soc *soc, void *ring_desc,
+			union dp_rx_desc_list_elem_t **head,
+			union dp_rx_desc_list_elem_t **tail,
+			uint32_t quota)
+{
+	uint32_t rx_buf_cookie;
+	struct dp_rx_desc *rx_desc;
+	uint32_t rx_bufs_used = 0;
+	uint32_t pkt_len, l2_hdr_offset;
+	uint16_t msdu_len;
+	qdf_nbuf_t nbuf;
+	struct dp_pdev *pdev0;
+	struct dp_vdev *vdev0;
+
+	rx_buf_cookie = HAL_RX_WBM_BUF_COOKIE_GET(ring_desc);
+
+	rx_desc = dp_rx_cookie_2_va(soc, rx_buf_cookie);
+
+	qdf_assert(rx_desc);
+
+	rx_bufs_used++;
+
+	nbuf = rx_desc->nbuf;
+
+	qdf_nbuf_unmap_single(soc->osdev, nbuf,
+				QDF_DMA_BIDIRECTIONAL);
+
+	rx_desc->rx_buf_start = qdf_nbuf_data(nbuf);
+
+	l2_hdr_offset =
+		hal_rx_msdu_end_l3_hdr_padding_get(rx_desc->rx_buf_start);
+
+	msdu_len = hal_rx_msdu_start_msdu_len_get(rx_desc->rx_buf_start);
+	pkt_len = msdu_len + l2_hdr_offset + RX_PKT_TLVS_LEN;
+
+	/* Set length in nbuf */
+	qdf_nbuf_set_pktlen(nbuf, pkt_len);
+
+	/*
+	 * Check if DMA completed -- msdu_done is the last bit
+	 * to be written
+	 */
+	if (!hal_rx_attn_msdu_done_get(rx_desc->rx_buf_start)) {
+
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+		FL("nbuf->data 0x%p"), rx_desc->rx_buf_start);
+
+		qdf_assert(0);
+	}
+
+	/*
+	 * Advance the packet start pointer by total size of
+	 * pre-header TLV's
+	 */
+	qdf_nbuf_pull_head(nbuf, RX_PKT_TLVS_LEN);
+
+	if (l2_hdr_offset)
+		qdf_nbuf_pull_head(nbuf, l2_hdr_offset);
+
+	pdev0 = soc->pdev_list[0];/* Hard code 0th elem */
+
+	if (pdev0) {
+		vdev0 = (struct dp_vdev *)TAILQ_FIRST(&pdev0->vdev_list);
+		if (vdev0 && vdev0->osif_rx) {
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
+				FL("pdev0 %p vdev0 %p osif_rx %p"), pdev0, vdev0,
+				vdev0->osif_rx);
+
+			vdev0->osif_rx(vdev0->osif_vdev, nbuf);
+		} else {
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("INVALID vdev0 %p OR osif_rx"), vdev0);
+		}
+	} else {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("INVALID pdev %p"), pdev0);
+	}
+
+	dp_rx_add_to_free_desc_list(head, tail, rx_desc);
+
+	return rx_bufs_used;
+}
+
 /**
  * dp_rx_link_desc_return() - Return a MPDU link descriptor to HW
  *			      (WBM), following error handling
@@ -239,7 +344,8 @@ dp_rx_link_desc_return(struct dp_soc *soc, void *ring_desc)
 	void *src_srng_desc;
 
 	if (!wbm_rel_srng) {
-		qdf_print("WBM RELEASE RING not initialized\n");
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"WBM RELEASE RING not initialized");
 		return status;
 	}
 
@@ -250,10 +356,9 @@ dp_rx_link_desc_return(struct dp_soc *soc, void *ring_desc)
 		 * Need API to convert from hal_ring pointer to
 		 * Ring Type / Ring Id combo
 		 */
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s %d : "
-			"HAL RING Access For WBM Release SRNG Failed -- %p\n",
-			__func__, __LINE__, wbm_rel_srng);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("HAL RING Access For WBM Release SRNG Failed - %p"),
+			wbm_rel_srng);
 		goto done;
 	}
 	src_srng_desc = hal_srng_src_get_next(hal_soc, wbm_rel_srng);
@@ -264,9 +369,10 @@ dp_rx_link_desc_return(struct dp_soc *soc, void *ring_desc)
 		status = QDF_STATUS_SUCCESS;
 	} else {
 		struct hal_srng *srng = (struct hal_srng *)wbm_rel_srng;
-		qdf_print("%s %d -- WBM Release Ring (Id %d) Full\n",
-			__func__, __LINE__, srng->ring_id);
-		qdf_print("HP 0x%x Reap HP 0x%x TP 0x%x Cached TP 0x%x\n",
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("WBM Release Ring (Id %d) Full"), srng->ring_id);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"HP 0x%x Reap HP 0x%x TP 0x%x Cached TP 0x%x",
 			*srng->u.src_ring.hp_addr, srng->u.src_ring.reap_hp,
 			*srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp);
 	}
@@ -315,9 +421,8 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		 * Need API to convert from hal_ring pointer to
 		 * Ring Type / Ring Id combo
 		 */
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s %d : HAL RING Access Failed -- %p\n",
-			__func__, __LINE__, hal_ring);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("HAL RING Access Failed -- %p"), hal_ring);
 		goto done;
 	}
 
@@ -338,8 +443,8 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 			/* TODO */
 			/* Call appropriate handler */
 
-			qdf_print("%s %d: Invalid RBM %d\n",
-				__func__, __LINE__, rbm);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("Invalid RBM %d"), rbm);
 			continue;
 		}
 
@@ -386,7 +491,8 @@ done:
 	hal_srng_access_end(hal_soc, hal_ring);
 
 	/* Assume MAC id = 0, owner = 0 */
-	dp_rx_buffers_replenish(soc, 0, rx_bufs_used, &head, &tail,
+	if (rx_bufs_used)
+		dp_rx_buffers_replenish(soc, 0, rx_bufs_used, &head, &tail,
 					HAL_RX_BUF_RBM_SW3_BM);
 
 	return rx_bufs_used; /* Assume no scale factor for now */
@@ -432,9 +538,8 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		 * Need API to convert from hal_ring pointer to
 		 * Ring Type / Ring Id combo
 		 */
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-			"%s %d : HAL RING Access Failed -- %p\n",
-			__func__, __LINE__, hal_ring);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			FL("HAL RING Access Failed -- %p"), hal_ring);
 		goto done;
 	}
 
@@ -457,8 +562,8 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 			/* TODO */
 			/* Call appropriate handler */
 
-			qdf_print("%s %d: Invalid RBM %d\n",
-				__func__, __LINE__, rbm);
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				FL("Invalid RBM %d"), rbm);
 			continue;
 		}
 
@@ -480,14 +585,30 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 				   HAL_RX_WBM_REO_ERROR_CODE_GET(ring_desc);
 
 				switch (reo_error_code) {
-
+				/*
+				 * Handling for packets which have NULL REO
+				 * queue descriptor
+				 */
+				case HAL_REO_ERR_QUEUE_DESC_ADDR_0:
+				case HAL_REO_ERR_REGULAR_FRAME_2K_JUMP:
+				case HAL_REO_ERR_2K_ERROR_HANDLING_FLAG_SET:
+					QDF_TRACE(QDF_MODULE_ID_DP,
+						QDF_TRACE_LEVEL_WARN,
+						"Got pkt with REO ERROR: %d",
+						reo_error_code);
+
+					rx_bufs_used +=
+						dp_rx_null_q_desc_handle(soc,
+						ring_desc, &head, &tail, quota);
+					continue;
 				/* TODO */
 				/* Add per error code accounting */
 
 				default:
-					qdf_print(
-					"%s %d: REO error %d detected\n",
-					__func__, __LINE__, reo_error_code);
+					QDF_TRACE(QDF_MODULE_ID_DP,
+						QDF_TRACE_LEVEL_ERROR,
+						"REO error %d detected",
+						reo_error_code);
 				}
 			}
 		} else if (wbm_err_src == HAL_RX_WBM_ERR_SRC_RXDMA) {
@@ -505,9 +626,10 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 				/* Add per error code accounting */
 
 				default:
-					qdf_print(
-					"%s %d: RXDMA error %d detected\n",
-					__func__, __LINE__, rxdma_error_code);
+					QDF_TRACE(QDF_MODULE_ID_DP,
+						QDF_TRACE_LEVEL_ERROR,
+						"RXDMA error %d detected",
+						rxdma_error_code);
 				}
 			}
 		} else {
@@ -534,7 +656,8 @@ done:
 	hal_srng_access_end(hal_soc, hal_ring);
 
 	/* Assume MAC id = 0, owner = 0 */
-	dp_rx_buffers_replenish(soc, 0, rx_bufs_used, &head, &tail,
+	if (rx_bufs_used)
+		dp_rx_buffers_replenish(soc, 0, rx_bufs_used, &head, &tail,
 					HAL_RX_BUF_RBM_SW3_BM);
 
 	return rx_bufs_used; /* Assume no scale factor for now */

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

@@ -239,6 +239,8 @@ struct dp_intr {
 	uint8_t rx_ring_mask;   /* Rx REO rings (0-3) associated
 				with this interrupt context */
 	uint8_t rx_mon_ring_mask;  /* Rx monitor ring mask (0-2) */
+	uint8_t rx_err_ring_mask; /* REO Exception Ring */
+	uint8_t rx_wbm_rel_ring_mask; /* WBM2SW Rx Release Ring */
 	struct dp_soc *soc;    /* Reference to SoC structure ,
 				to get DMA ring handles */
 };

+ 50 - 5
dp/wifi3.0/hal_rx.h

@@ -498,14 +498,20 @@ struct rx_pkt_hdr_tlv {
  * 2) TLV's don't span across 128 byte lines
  * 3) Rx Buffer is nicely aligned on the 128 byte boundary
  */
-#define RX_PADDING_BYTES	16
+#if defined(WCSS_VERSION) && (WCSS_VERSION >= 96)
+#define RX_PADDING0_BYTES	4
+#endif
+#define RX_PADDING1_BYTES	16
 struct rx_pkt_tlvs {
 	struct rx_msdu_end_tlv   msdu_end_tlv;	/*  72 bytes */
 	struct rx_attention_tlv  attn_tlv;	/*  16 bytes */
 	struct rx_msdu_start_tlv msdu_start_tlv;/*  40 bytes */
+#if defined(WCSS_VERSION) && (WCSS_VERSION >= 96)
+	uint8_t rx_padding0[RX_PADDING0_BYTES];	/*   4 bytes */
+#endif
 	struct rx_mpdu_start_tlv mpdu_start_tlv;/*  96 bytes */
 	struct rx_mpdu_end_tlv   mpdu_end_tlv;	/*  12 bytes */
-	uint8_t rx_padding[RX_PADDING_BYTES];	/*  20 bytes */
+	uint8_t rx_padding1[RX_PADDING1_BYTES];	/*  16 bytes */
 	struct rx_pkt_hdr_tlv	 pkt_hdr_tlv;	/* 128 bytes */
 };
 #else /* RXDMA_OPTIMIZATION */
@@ -542,15 +548,27 @@ hal_rx_attn_msdu_done_get(uint8_t *buf)
 	return msdu_done;
 }
 
-/*
- * Get l3_header_padding from RX_MSDU_END
- */
+#if defined(WCSS_VERSION) && (WCSS_VERSION > 81)
+#define HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(_rx_msdu_end)	\
+	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end,		\
+		RX_MSDU_END_5_L3_HEADER_PADDING_OFFSET)),	\
+		RX_MSDU_END_5_L3_HEADER_PADDING_MASK,		\
+		RX_MSDU_END_5_L3_HEADER_PADDING_LSB))
+#else
 #define HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(_rx_msdu_end)	\
 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end,		\
 		RX_MSDU_END_9_L3_HEADER_PADDING_OFFSET)),	\
 		RX_MSDU_END_9_L3_HEADER_PADDING_MASK,		\
 		RX_MSDU_END_9_L3_HEADER_PADDING_LSB))
+#endif
 
+ /**
+ * hal_rx_msdu_end_l3_hdr_padding_get: API to get the
+ * l3_header padding from rx_msdu_end TLV
+ *
+ * @ buf: pointer to the start of RX PKT TLV headers
+ * Return: number of l3 header padding bytes
+ */
 static inline uint32_t
 hal_rx_msdu_end_l3_hdr_padding_get(uint8_t *buf)
 {
@@ -562,6 +580,33 @@ hal_rx_msdu_end_l3_hdr_padding_get(uint8_t *buf)
 
 	return l3_header_padding;
 }
+
+#define HAL_RX_MSDU_START_MSDU_LEN_GET(_rx_msdu_start)		\
+	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start,		\
+		RX_MSDU_START_1_MSDU_LENGTH_OFFSET)),		\
+		RX_MSDU_START_1_MSDU_LENGTH_MASK,		\
+		RX_MSDU_START_1_MSDU_LENGTH_LSB))
+
+ /**
+ * hal_rx_msdu_start_msdu_len_get: API to get the MSDU length
+ * from rx_msdu_start TLV
+ *
+ * @ buf: pointer to the start of RX PKT TLV headers
+ * Return: msdu length
+ */
+static inline uint32_t
+hal_rx_msdu_start_msdu_len_get(uint8_t *buf)
+{
+	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
+	struct rx_msdu_start *msdu_start =
+			&pkt_tlvs->msdu_start_tlv.rx_msdu_start;
+	uint32_t msdu_len;
+
+	msdu_len = HAL_RX_MSDU_START_MSDU_LEN_GET(msdu_start);
+
+	return msdu_len;
+}
+
 /*******************************************************************************
  * RX ERROR APIS
  ******************************************************************************/

+ 3 - 0
hal/wifi3.0/hal_internal.h

@@ -59,6 +59,9 @@
 #include "rx_msdu_end.h"
 #include "rx_attention.h"
 #include "tx_msdu_extension.h"
+#ifdef CONFIG_WIN
+#include "wcss_version.h"
+#endif
 
 /* TBD: This should be movded to shared HW header file */
 enum hal_srng_ring_id {