ソースを参照

qcacmn: Fix issues in monitor mode initialization

Current monitor mode implementation does not catch
initialization failures causing it to believe successful
monitor mode initialization.

Change-Id: I5c30ac22e3084871b86cf5e2f0627988ebbb7b5d
CRs-Fixed: 2071602
Ravi Joshi 7 年 前
コミット
a9ebe0a7ca
3 ファイル変更76 行追加25 行削除
  1. 2 4
      dp/wifi3.0/dp_rx.c
  2. 58 17
      dp/wifi3.0/dp_rx_mon_dest.c
  3. 16 4
      dp/wifi3.0/dp_rx_mon_status.c

+ 2 - 4
dp/wifi3.0/dp_rx.c

@@ -97,7 +97,6 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 	 * if desc_list is NULL, allocate the descs from freelist
 	 */
 	if (!(*desc_list)) {
-
 		num_alloc_desc = dp_rx_get_free_desc_list(dp_soc, mac_id,
 							  rx_desc_pool,
 							  num_req_buffers,
@@ -123,8 +122,8 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 						   sync_hw_ptr);
 
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
-			"no of availble entries in rxdma ring: %d",
-			num_entries_avail);
+		"no of availble entries in rxdma ring: %d",
+		num_entries_avail);
 
 	if (num_entries_avail < num_req_buffers) {
 		num_desc_to_free = num_req_buffers - num_entries_avail;
@@ -201,7 +200,6 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 	/*
 	 * add any available free desc back to the free list
 	 */
-
 	if (*desc_list)
 		dp_rx_add_desc_list_to_free_list(dp_soc, desc_list, tail,
 			mac_id, rx_desc_pool);

+ 58 - 17
dp/wifi3.0/dp_rx_mon_dest.c

@@ -760,6 +760,7 @@ dp_rx_pdev_mon_buf_attach(struct dp_pdev *pdev) {
 	struct dp_srng *rxdma_srng;
 	uint32_t rxdma_entries;
 	struct rx_desc_pool *rx_desc_pool;
+	QDF_STATUS status;
 
 	rxdma_srng = &pdev->rxdma_mon_buf_ring;
 
@@ -773,14 +774,26 @@ dp_rx_pdev_mon_buf_attach(struct dp_pdev *pdev) {
 			"%s: Mon RX Desc Pool[%d] allocation size=%d\n"
 			, __func__, pdev_id, rxdma_entries*3);
 
-	dp_rx_desc_pool_alloc(soc, pdev_id, rxdma_entries*3, rx_desc_pool);
+	status = dp_rx_desc_pool_alloc(soc, pdev_id,
+			rxdma_entries*3, rx_desc_pool);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"%s: dp_rx_desc_pool_alloc() failed \n", __func__);
+		return status;
+	}
 
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
 			"%s: Mon RX Buffers Replenish pdev_id=%d\n",
 			__func__, pdev_id);
 
-	dp_rx_buffers_replenish(soc, pdev_id, rxdma_srng, rx_desc_pool,
-		rxdma_entries, &desc_list, &tail, HAL_RX_BUF_RBM_SW3_BM);
+	status = dp_rx_buffers_replenish(soc, pdev_id, rxdma_srng, rx_desc_pool,
+			rxdma_entries, &desc_list, &tail,
+			HAL_RX_BUF_RBM_SW3_BM);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"%s: dp_rx_buffers_replenish() failed \n", __func__);
+		return status;
+	}
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -846,14 +859,22 @@ static int dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
 
 	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN,
 		"%s: total_mem_size: %d, num_link_desc_banks: %u, \
-		max_alloc_size: %d\n",
-		__func__, total_mem_size, num_link_desc_banks, max_alloc_size);
+		max_alloc_size: %d last_bank_size: %d\n",
+		__func__, total_mem_size, num_link_desc_banks, max_alloc_size,
+		last_bank_size);
 
 	for (i = 0; i < num_link_desc_banks; i++) {
 		dp_pdev->link_desc_banks[i].base_vaddr_unaligned =
-		qdf_mem_alloc_consistent(soc->osdev, NULL,
+		qdf_mem_alloc_consistent(soc->osdev, soc->osdev->dev,
 			max_alloc_size,
 			&(dp_pdev->link_desc_banks[i].base_paddr_unaligned));
+
+		if (!dp_pdev->link_desc_banks[i].base_vaddr_unaligned) {
+			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+				"%s: Link desc memory allocation failed\n",
+				__func__);
+			goto fail;
+		}
 		dp_pdev->link_desc_banks[i].size = max_alloc_size;
 
 		dp_pdev->link_desc_banks[i].base_vaddr =
@@ -870,13 +891,6 @@ static int dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
 			(dp_pdev->link_desc_banks[i].base_vaddr) -
 			 (unsigned long)
 			 (dp_pdev->link_desc_banks[i].base_vaddr_unaligned));
-
-		if (!dp_pdev->link_desc_banks[i].base_vaddr_unaligned) {
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-				"%s: Link desc memory allocation failed\n",
-				__func__);
-			goto fail;
-		}
 	}
 
 	if (last_bank_size) {
@@ -885,8 +899,15 @@ static int dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id)
 		 */
 		dp_pdev->link_desc_banks[i].base_vaddr_unaligned =
 			qdf_mem_alloc_consistent(soc->osdev,
-			NULL, last_bank_size,
+			soc->osdev->dev, last_bank_size,
 			&(dp_pdev->link_desc_banks[i].base_paddr_unaligned));
+
+		if (dp_pdev->link_desc_banks[i].base_vaddr_unaligned == NULL) {
+			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+				"%s: allocation failed for mon link desc pool\n",
+				__func__);
+			goto fail;
+		}
 		dp_pdev->link_desc_banks[i].size = last_bank_size;
 
 		dp_pdev->link_desc_banks[i].base_vaddr =
@@ -1002,13 +1023,33 @@ QDF_STATUS
 dp_rx_pdev_mon_attach(struct dp_pdev *pdev) {
 	uint8_t pdev_id = pdev->pdev_id;
 	struct dp_soc *soc = pdev->soc;
+	QDF_STATUS status;
 
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
 			"%s: pdev attach id=%d\n", __func__, pdev_id);
 
-	dp_rx_pdev_mon_buf_attach(pdev);
-	dp_rx_pdev_mon_status_attach(pdev);
-	dp_mon_link_desc_pool_setup(soc, pdev_id);
+	status = dp_rx_pdev_mon_buf_attach(pdev);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"%s: dp_rx_pdev_mon_buf_attach() failed \n", __func__);
+		return status;
+	}
+
+	status = dp_rx_pdev_mon_status_attach(pdev);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"%s: dp_rx_pdev_mon_status_attach() failed \n",
+			__func__);
+		return status;
+	}
+
+	status = dp_mon_link_desc_pool_setup(soc, pdev_id);
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"%s: dp_mon_link_desc_pool_setup() failed \n",
+			__func__);
+		return status;
+	}
 
 	return QDF_STATUS_SUCCESS;
 }

+ 16 - 4
dp/wifi3.0/dp_rx_mon_status.c

@@ -454,6 +454,7 @@ dp_rx_pdev_mon_status_attach(struct dp_pdev *pdev) {
 	struct dp_srng *rxdma_srng;
 	uint32_t rxdma_entries;
 	struct rx_desc_pool *rx_desc_pool;
+	QDF_STATUS status;
 
 	rxdma_srng = &pdev->rxdma_mon_status_ring;
 
@@ -466,15 +467,26 @@ dp_rx_pdev_mon_status_attach(struct dp_pdev *pdev) {
 			"%s: Mon RX Status Pool[%d] allocation size=%d\n",
 			__func__, pdev_id, rxdma_entries);
 
-	dp_rx_desc_pool_alloc(soc, pdev_id, rxdma_entries+1, rx_desc_pool);
+	status = dp_rx_desc_pool_alloc(soc, pdev_id, rxdma_entries+1,
+			rx_desc_pool);
+	if (QDF_IS_STATUS_SUCCESS(status)) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"%s: dp_rx_desc_pool_alloc() failed \n", __func__);
+		return status;
+	}
 
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_WARN,
 			"%s: Mon RX Status Buffers Replenish pdev_id=%d\n",
 			__func__, pdev_id);
 
-	dp_rx_mon_status_buffers_replenish(soc, pdev_id, rxdma_srng,
-		rx_desc_pool, rxdma_entries, &desc_list, &tail,
-		HAL_RX_BUF_RBM_SW3_BM);
+	status = dp_rx_mon_status_buffers_replenish(soc, pdev_id, rxdma_srng,
+			rx_desc_pool, rxdma_entries, &desc_list, &tail,
+			HAL_RX_BUF_RBM_SW3_BM);
+	if (QDF_IS_STATUS_SUCCESS(status)) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"%s: dp_rx_buffers_replenish() failed \n", __func__);
+		return status;
+	}
 
 	qdf_nbuf_queue_init(&pdev->rx_status_q);