qcacmn: Use mon_lock while accessing monitor vap
Use monitor mode lock to prevent vap down while monitor vap is still delivering all MPDUs to radiotap Api. Change-Id: I908d8048afbf3210bddaafc2c19b177ec8209085 CRs-fixed: 2212004
This commit is contained in:
@@ -4158,7 +4158,8 @@ static int dp_reset_monitor_mode(struct cdp_pdev *pdev_handle)
|
||||
pdev_id = pdev->pdev_id;
|
||||
soc = pdev->soc;
|
||||
|
||||
pdev->monitor_vdev = NULL;
|
||||
qdf_spin_lock_bh(&pdev->mon_lock);
|
||||
|
||||
qdf_mem_set(&(htt_tlv_filter), sizeof(htt_tlv_filter), 0x0);
|
||||
|
||||
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
|
||||
@@ -4173,6 +4174,10 @@ static int dp_reset_monitor_mode(struct cdp_pdev *pdev_handle)
|
||||
RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter);
|
||||
}
|
||||
|
||||
pdev->monitor_vdev = NULL;
|
||||
|
||||
qdf_spin_unlock_bh(&pdev->mon_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -756,6 +756,12 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
|
||||
|
||||
qdf_assert(hal_soc);
|
||||
|
||||
qdf_spin_lock_bh(&pdev->mon_lock);
|
||||
if (pdev->monitor_vdev == NULL) {
|
||||
qdf_spin_unlock(&pdev->mon_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
if (qdf_unlikely(hal_srng_access_start(hal_soc, mon_dst_srng))) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||
"%s %d : HAL Monitor Destination Ring access Failed -- %pK\n",
|
||||
@@ -765,6 +771,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
|
||||
|
||||
ppdu_id = pdev->ppdu_info.com_info.ppdu_id;
|
||||
rx_bufs_used = 0;
|
||||
|
||||
while (qdf_likely(rxdma_dst_ring_desc =
|
||||
hal_srng_dst_peek(hal_soc, mon_dst_srng))) {
|
||||
qdf_nbuf_t head_msdu, tail_msdu;
|
||||
@@ -797,6 +804,8 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota)
|
||||
|
||||
hal_srng_access_end(hal_soc, mon_dst_srng);
|
||||
|
||||
qdf_spin_unlock_bh(&pdev->mon_lock);
|
||||
|
||||
if (rx_bufs_used) {
|
||||
dp_rx_buffers_replenish(soc, mac_id,
|
||||
&pdev->rxdma_mon_buf_ring[mac_for_pdev],
|
||||
@@ -1141,7 +1150,7 @@ dp_rx_pdev_mon_attach(struct dp_pdev *pdev) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
qdf_spinlock_create(&pdev->mon_lock);
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
/**
|
||||
@@ -1164,6 +1173,7 @@ dp_rx_pdev_mon_detach(struct dp_pdev *pdev) {
|
||||
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
|
||||
int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id);
|
||||
|
||||
qdf_spinlock_destroy(&pdev->mon_lock);
|
||||
dp_mon_link_desc_pool_cleanup(soc, mac_for_pdev);
|
||||
dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev);
|
||||
dp_rx_pdev_mon_buf_detach(pdev, mac_for_pdev);
|
||||
|
@@ -1037,8 +1037,8 @@ struct dp_pdev {
|
||||
/* Monitor mode interface and status storage */
|
||||
struct dp_vdev *monitor_vdev;
|
||||
|
||||
/* monitor mode mutex */
|
||||
qdf_spinlock_t mon_mutex;
|
||||
/* monitor mode lock */
|
||||
qdf_spinlock_t mon_lock;
|
||||
|
||||
/*tx_mutex for me*/
|
||||
DP_MUTEX_TYPE tx_mutex;
|
||||
|
Reference in New Issue
Block a user