瀏覽代碼

qcacmn: Fix issues in monitor path

1. Replenish path issue:

a. when number of required buffers passed to replenish API is '1',
host does not replenish '1' buffer.

b. If no. of available entries in ring are '0', return sw desc
   back to pool.

2. 32-bit compilation issue

3. Block ppdu desc deliver API when pktlog is enabled for BE

Change-Id: I79ebf1f84830b4c2f5e5b727e3e08c5ee1870898
Adwait Nayak 3 年之前
父節點
當前提交
9a61b83a20

+ 13 - 5
dp/wifi3.0/monitor/2.0/dp_mon_2.0.c

@@ -178,6 +178,11 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc,
 	num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc,
 						   mon_srng, sync_hw_ptr);
 
+	if (!num_entries_avail) {
+		num_desc_to_free = num_req_buffers;
+		hal_srng_access_end(dp_soc->hal_soc, mon_srng);
+		goto free_desc;
+	}
 	if (num_entries_avail < num_req_buffers) {
 		num_desc_to_free = num_req_buffers - num_entries_avail;
 		num_req_buffers = num_entries_avail;
@@ -205,7 +210,7 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc,
 		num_req_buffers = num_alloc_desc;
 	}
 
-	while (count < num_req_buffers - 1) {
+	while (count <= num_req_buffers - 1) {
 		ret = dp_mon_frag_alloc_and_map(dp_soc,
 						&mon_desc,
 						mon_desc_pool);
@@ -242,6 +247,7 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc,
 
 	hal_srng_access_end(dp_soc->hal_soc, mon_srng);
 
+free_desc:
 	/*
 	 * add any available free desc back to the free list
 	 */
@@ -267,9 +273,11 @@ dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool,
 	/* link SW descs into a freelist */
 	mon_desc_pool->freelist = &mon_desc_pool->array[0];
 	mon_desc_pool->pool_size = pool_size;
-	qdf_mem_zero(mon_desc_pool->freelist, mon_desc_pool->pool_size);
+	qdf_mem_zero(mon_desc_pool->freelist,
+		     mon_desc_pool->pool_size *
+		     sizeof(union dp_mon_desc_list_elem_t));
 
-	for (desc_id = 0; desc_id <= mon_desc_pool->pool_size - 1; desc_id++) {
+	for (desc_id = 0; desc_id <= mon_desc_pool->pool_size; desc_id++) {
 		if (desc_id == mon_desc_pool->pool_size - 1)
 			mon_desc_pool->array[desc_id].next = NULL;
 		else
@@ -302,8 +310,8 @@ void dp_mon_desc_pool_free(struct dp_mon_desc_pool *mon_desc_pool)
 QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size,
 				  struct dp_mon_desc_pool *mon_desc_pool)
 {
-	mon_desc_pool->pool_size = pool_size;
-	mon_desc_pool->array = qdf_mem_malloc(pool_size *
+	mon_desc_pool->pool_size = pool_size - 1;
+	mon_desc_pool->array = qdf_mem_malloc((pool_size - 1) *
 				     sizeof(union dp_mon_desc_list_elem_t));
 
 	return QDF_STATUS_SUCCESS;

+ 2 - 2
dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c

@@ -43,8 +43,8 @@ dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
 	qdf_nbuf_t nbuf = NULL;
 	enum WDI_EVENT pktlog_mode = WDI_NO_VAL;
 
-	if (!mon_pdev->dp_peer_based_pktlog &&
-	    (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_DISABLED)) {
+	if (mon_pdev->dp_peer_based_pktlog &&
+	    (mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED)) {
 		return;
 	}
 

+ 3 - 0
dp/wifi3.0/monitor/dp_mon.c

@@ -4387,6 +4387,9 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
 	if (!pdev)
 		return true;
 
+	if (wlan_cfg_get_txmon_hw_support(soc->wlan_cfg_ctx))
+		return free_buf;
+
 	if (!mon_pdev->enhanced_stats_en && !mon_pdev->tx_sniffer_enable &&
 	    !mon_pdev->mcopy_mode && !mon_pdev->bpr_enable)
 		return free_buf;

+ 4 - 4
hal/wifi3.0/be/hal_be_api_mon.h

@@ -179,10 +179,10 @@ void hal_mon_buff_addr_info_set(hal_soc_handle_t hal_soc_hdl,
 				void *mon_desc_addr,
 				qdf_dma_addr_t phy_addr)
 {
-	uint32_t paddr_lo = ((u64)phy_addr & 0x00000000ffffffff);
-	uint32_t paddr_hi = ((u64)phy_addr & 0xffffffff00000000) >> 32;
-	uint32_t vaddr_lo = ((u64)mon_desc_addr & 0x00000000ffffffff);
-	uint32_t vaddr_hi = ((u64)mon_desc_addr & 0xffffffff00000000) >> 32;
+	uint32_t paddr_lo = ((uintptr_t)phy_addr & 0x00000000ffffffff);
+	uint32_t paddr_hi = ((uintptr_t)phy_addr & 0xffffffff00000000) >> 32;
+	uint32_t vaddr_lo = ((uintptr_t)mon_desc_addr & 0x00000000ffffffff);
+	uint32_t vaddr_hi = ((uintptr_t)mon_desc_addr & 0xffffffff00000000) >> 32;
 
 	HAL_MON_PADDR_LO_SET(mon_entry, paddr_lo);
 	HAL_MON_PADDR_HI_SET(mon_entry, paddr_hi);

+ 3 - 3
hal/wifi3.0/be/hal_be_generic_api.h

@@ -1742,9 +1742,9 @@ hal_txmon_get_buffer_addr_generic_be(void *tx_tlv,
 						   HAL_RX_TLV32_HDR_SIZE);
 	qdf_frag_t buf_addr = NULL;
 
-	buf_addr = (qdf_frag_t)((u64)hal_buffer_addr->buffer_virt_addr_31_0 |
-				((u64)hal_buffer_addr->buffer_virt_addr_63_32 <<
-				 32));
+	buf_addr = (qdf_frag_t)(uintptr_t)((hal_buffer_addr->buffer_virt_addr_31_0 |
+				((unsigned long long)hal_buffer_addr->buffer_virt_addr_63_32 <<
+				 32)));
 
 	/* qdf_frag_t is derived from buffer address tlv */
 	if (qdf_unlikely(status)) {