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:
Sumedh Baikady
2018-03-05 16:50:58 -08:00
committed by nshrivas
parent bef3b1b9b2
commit 12b2b2c897
3 changed files with 19 additions and 4 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;