diff --git a/dp/wifi3.0/dp_rx_mon_feature.c b/dp/wifi3.0/dp_rx_mon_feature.c index 903a003669..26cb8c1337 100644 --- a/dp/wifi3.0/dp_rx_mon_feature.c +++ b/dp/wifi3.0/dp_rx_mon_feature.c @@ -646,4 +646,11 @@ dp_config_enh_rx_capture(struct cdp_pdev *pdev_handle, uint32_t val) return dp_pdev_configure_monitor_rings(pdev); } +void +dp_peer_set_rx_capture_enabled(struct cdp_peer *peer_handle, bool value) +{ + struct dp_peer *peer = (struct dp_peer *)peer_handle; + + peer->rx_cap_enabled = value; +} #endif /* WLAN_RX_PKT_CAPTURE_ENH */ diff --git a/dp/wifi3.0/dp_rx_mon_feature.h b/dp/wifi3.0/dp_rx_mon_feature.h index 0d27222592..db69c669ba 100644 --- a/dp/wifi3.0/dp_rx_mon_feature.h +++ b/dp/wifi3.0/dp_rx_mon_feature.h @@ -73,5 +73,15 @@ dp_rx_mon_enh_capture_process(struct dp_pdev *pdev, uint32_t tlv_status, */ QDF_STATUS dp_config_enh_rx_capture(struct cdp_pdev *pdev_handle, uint8_t val); + +/** + * dp_peer_set_rx_capture_enabled: Set rx_cap_enabled bit in peer + * @peer_handle: Peer handle + * @value: Enable/disable setting for rx_cap_enabled + * + * Return: None + */ +void +dp_peer_set_rx_capture_enabled(struct cdp_peer *peer_handle, bool value); #endif /* WLAN_RX_PKT_CAPTURE_ENH */ #endif /* _DP_RX_MON_FEATURE_H_ */ diff --git a/dp/wifi3.0/dp_tx_capture.c b/dp/wifi3.0/dp_tx_capture.c index 53f68649da..27f7f65160 100644 --- a/dp/wifi3.0/dp_tx_capture.c +++ b/dp/wifi3.0/dp_tx_capture.c @@ -180,6 +180,23 @@ void dp_peer_tid_queue_init(struct dp_peer *peer) } } +static +void dp_peer_tx_cap_tid_queue_flush(struct dp_peer *peer) +{ + int tid; + struct dp_tx_tid *tx_tid; + + for (tid = 0; tid < DP_MAX_TIDS; tid++) { + tx_tid = &peer->tx_capture.tx_tid[tid]; + + qdf_spin_lock_bh(&tx_tid->tid_lock); + qdf_nbuf_queue_free(&tx_tid->msdu_comp_q); + qdf_spin_unlock_bh(&tx_tid->tid_lock); + + tx_tid->max_ppdu_id = 0; + } +} + /* * dp_peer_tid_queue_cleanup() – remove ppdu stats queue per TID * @peer: Datapath peer @@ -468,7 +485,7 @@ QDF_STATUS dp_tx_add_to_comp_queue(struct dp_soc *soc, { int ret = QDF_STATUS_E_FAILURE; - if ((desc->pdev->tx_capture_enabled != CDP_TX_ENH_CAPTURE_DISABLED) && + if (peer && dp_peer_or_pdev_tx_cap_enabled(desc->pdev, peer) && ((ts->status == HAL_TX_TQM_RR_FRAME_ACKED) || (ts->status == HAL_TX_TQM_RR_REM_CMD_TX) || ((ts->status == HAL_TX_TQM_RR_REM_CMD_AGED) && ts->transmit_cnt))) { @@ -3167,4 +3184,21 @@ QDF_STATUS dp_send_ack_frame_to_stack(struct dp_soc *soc, return QDF_STATUS_SUCCESS; } + +/** + * dp_peer_set_tx_capture_enabled: Set tx_cap_enabled bit in peer + * @peer_handle: Peer handle + * @value: Enable/disable setting for tx_cap_enabled + * + * Return: None + */ +void +dp_peer_set_tx_capture_enabled(struct cdp_peer *peer_handle, bool value) +{ + struct dp_peer *peer = (struct dp_peer *)peer_handle; + + peer->tx_cap_enabled = value; + if (!value) + dp_peer_tx_cap_tid_queue_flush(peer); +} #endif diff --git a/dp/wifi3.0/dp_tx_capture.h b/dp/wifi3.0/dp_tx_capture.h index 637c31802b..e4718ec5c7 100644 --- a/dp/wifi3.0/dp_tx_capture.h +++ b/dp/wifi3.0/dp_tx_capture.h @@ -255,5 +255,15 @@ void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev); QDF_STATUS dp_send_ack_frame_to_stack(struct dp_soc *soc, struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info); + +/** + * dp_peer_set_tx_capture_enabled: Set tx_cap_enabled bit in peer + * @peer_handle: Peer handle + * @value: Enable/disable setting for tx_cap_enabled + * + * Return: None + */ +void +dp_peer_set_tx_capture_enabled(struct cdp_peer *peer_handle, bool value); #endif #endif