diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index f85ed0f2a4..da4b4614db 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -173,6 +173,16 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc, mon_srng = dp_mon_srng->hal_srng; + hal_srng_access_start(dp_soc->hal_soc, mon_srng); + + num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc, + mon_srng, sync_hw_ptr); + + if (num_entries_avail < num_req_buffers) { + num_desc_to_free = num_req_buffers - num_entries_avail; + num_req_buffers = num_entries_avail; + } + /* * if desc_list is NULL, allocate the descs from freelist */ @@ -185,6 +195,7 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc, if (!num_alloc_desc) { dp_mon_debug("%pK: no free rx_descs in freelist", dp_soc); + hal_srng_access_end(dp_soc->hal_soc, mon_srng); return QDF_STATUS_E_NOMEM; } @@ -194,16 +205,7 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc, num_req_buffers = num_alloc_desc; } - hal_srng_access_start(dp_soc->hal_soc, mon_srng); - num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc, - mon_srng, sync_hw_ptr); - - if (num_entries_avail < num_req_buffers) { - num_desc_to_free = num_req_buffers - num_entries_avail; - num_req_buffers = num_entries_avail; - } - - 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); @@ -440,10 +442,11 @@ dp_set_bpr_enable_2_0(struct dp_pdev *pdev, int val) static QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc) { + QDF_STATUS status; +#ifdef QCA_TXMON_HW_SUPPORT struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); - - QDF_STATUS status; +#endif hal_set_low_threshold(soc->rxdma_mon_buf_ring[0].hal_srng, 0); status = htt_srng_setup(soc->htt_handle, 0, @@ -455,6 +458,7 @@ QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc) return status; } +#ifdef QCA_TXMON_HW_SUPPORT hal_set_low_threshold(mon_soc_be->tx_mon_buf_ring.hal_srng, 0); status = htt_srng_setup(soc->htt_handle, 0, mon_soc_be->tx_mon_buf_ring.hal_srng, @@ -464,6 +468,7 @@ QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc) dp_err("Failed to send htt srng setup message for Tx mon buf ring"); return status; } +#endif return status; } @@ -474,8 +479,10 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc, int mac_id, int mac_for_pdev) { +#ifdef QCA_TXMON_HW_SUPPORT struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); +#endif QDF_STATUS status; status = htt_srng_setup(soc->htt_handle, mac_for_pdev, @@ -487,6 +494,7 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc, return status; } +#ifdef QCA_TXMON_HW_SUPPORT status = htt_srng_setup(soc->htt_handle, mac_for_pdev, mon_soc_be->tx_mon_dst_ring[mac_id].hal_srng, TX_MONITOR_DST); @@ -495,6 +503,7 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc, dp_mon_err("Failed to send htt srng message for Tx mon dst ring"); return status; } +#endif return status; } @@ -967,9 +976,11 @@ static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc) struct dp_mon_soc *mon_soc = soc->monitor_soc; mon_soc->mon_ops->rx_mon_refill_buf_ring = - dp_rx_mon_refill_buf_ring_2_0, + NULL, +#ifdef QCA_TXMON_HW_SUPPORT mon_soc->mon_ops->tx_mon_refill_buf_ring = dp_tx_mon_refill_buf_ring_2_0, +#endif mon_soc->mon_rx_process = dp_rx_mon_process_2_0; } diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c index ab4b9657a2..030210d3ef 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c @@ -75,7 +75,7 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, } while (qdf_likely((rx_mon_dst_ring_desc = - (void *)hal_srng_dst_get_next(hal_soc, mon_dst_srng)) + (void *)hal_srng_dst_peek(hal_soc, mon_dst_srng)) && quota--)) { struct hal_mon_desc hal_mon_rx_desc; struct dp_mon_desc *mon_desc; @@ -106,12 +106,16 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, qdf_frag_free(mon_desc->buf_addr); dp_mon_add_to_free_desc_list(&desc_list, &tail, mon_desc); work_done++; + hal_srng_dst_get_next(hal_soc, mon_dst_srng); } dp_srng_access_end(int_ctx, soc, mon_dst_srng); - if (desc_list) - dp_mon_add_desc_list_to_free_list(soc, &desc_list, - &tail, rx_mon_desc_pool); + if (desc_list) { + dp_mon_buffers_replenish(soc, &soc->rxdma_mon_buf_ring[0], + rx_mon_desc_pool, + work_done, + &desc_list, &tail); + } qdf_spin_unlock_bh(&mon_pdev->mon_lock); dp_mon_info("mac_id: %d, work_done:%d", mac_id, work_done); return work_done; diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c index cb7d874d83..0be2700c7a 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c @@ -78,9 +78,7 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, && quota--)) { struct hal_mon_desc hal_mon_tx_desc; struct dp_mon_desc *mon_desc; - struct dp_mon_desc_pool *tx_desc_pool; - tx_desc_pool = &mon_soc_be->tx_desc_mon; hal_be_get_mon_dest_status(soc->hal_soc, tx_mon_dst_ring_desc, &hal_mon_tx_desc); diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 70af0204bb..50d057815c 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -1668,6 +1668,10 @@ dp_enable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) dp_cal_client_timer_start(mon_pdev->cal_client_ctx); mon_pdev->enhanced_stats_en = 1; + pdev->enhanced_stats_en = true; + + if (wlan_cfg_get_txmon_hw_support(pdev->soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; dp_mon_filter_setup_enhanced_stats(pdev); status = dp_mon_filter_update(pdev); @@ -1676,10 +1680,10 @@ dp_enable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) dp_mon_filter_reset_enhanced_stats(pdev); dp_cal_client_timer_stop(mon_pdev->cal_client_ctx); mon_pdev->enhanced_stats_en = 0; + pdev->enhanced_stats_en = false; return QDF_STATUS_E_FAILURE; } - pdev->enhanced_stats_en = true; if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS, pdev->pdev_id); @@ -1720,6 +1724,9 @@ dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) mon_pdev->enhanced_stats_en = 0; pdev->enhanced_stats_en = false; + if (wlan_cfg_get_txmon_hw_support(pdev->soc->wlan_cfg_ctx)) + return QDF_STATUS_SUCCESS; + if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id); } else if (is_ppdu_txrx_capture_enabled(pdev) && mon_pdev->bpr_enable) { diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index 984338b946..b6dbeb8dcb 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -498,8 +498,10 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev) return QDF_STATUS_E_FAILURE; } +#ifdef QCA_TXMON_HW_SUPPORT if (mon_ops && mon_ops->tx_mon_filter_update) mon_ops->tx_mon_filter_update(pdev); +#endif if (mon_ops && mon_ops->rx_mon_filter_update) mon_ops->rx_mon_filter_update(pdev); diff --git a/hal/wifi3.0/be/hal_be_api_mon.h b/hal/wifi3.0/be/hal_be_api_mon.h index 88eea4e9c9..19b9190dcc 100644 --- a/hal/wifi3.0/be/hal_be_api_mon.h +++ b/hal/wifi3.0/be/hal_be_api_mon.h @@ -151,8 +151,12 @@ hal_be_get_mon_dest_status(hal_soc_handle_t hal_soc, { struct mon_destination_ring *desc = hw_desc; - status->buf_addr = ((u64)desc->stat_buf_virt_addr_31_0 | - ((u64)desc->stat_buf_virt_addr_63_32 << 32)); + status->buf_addr = HAL_RX_GET(desc, MON_DESTINATION_RING_STAT, + BUF_VIRT_ADDR_31_0) | + (((uint64_t)HAL_RX_GET(desc, + MON_DESTINATION_RING_STAT, + BUF_VIRT_ADDR_63_32)) << 32); + status->ppdu_id = desc->ppdu_id; status->end_offset = desc->end_offset; status->end_reason = desc->end_reason; @@ -177,8 +181,8 @@ void hal_mon_buff_addr_info_set(hal_soc_handle_t hal_soc_hdl, { uint32_t paddr_lo = ((u64)phy_addr & 0x00000000ffffffff); uint32_t paddr_hi = ((u64)phy_addr & 0xffffffff00000000) >> 32; - uint32_t vaddr_lo = ((u64)(uintptr_t)mon_desc_addr & 0x00000000ffffffff); - uint32_t vaddr_hi = ((u64)(uintptr_t)mon_desc_addr & 0xffffffff00000000) >> 32; + uint32_t vaddr_lo = ((u64)mon_desc_addr & 0x00000000ffffffff); + uint32_t vaddr_hi = ((u64)mon_desc_addr & 0xffffffff00000000) >> 32; HAL_MON_PADDR_LO_SET(mon_entry, paddr_lo); HAL_MON_PADDR_HI_SET(mon_entry, paddr_hi); diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index f3e973b5a4..901d54f9d4 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -3378,3 +3378,5 @@ bool wlan_cfg_get_txmon_hw_support(struct wlan_cfg_dp_soc_ctxt *cfg) { return cfg->txmon_hw_support; } + +qdf_export_symbol(wlan_cfg_get_txmon_hw_support);