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;
|
pdev_id = pdev->pdev_id;
|
||||||
soc = pdev->soc;
|
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);
|
qdf_mem_set(&(htt_tlv_filter), sizeof(htt_tlv_filter), 0x0);
|
||||||
|
|
||||||
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
|
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);
|
RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pdev->monitor_vdev = NULL;
|
||||||
|
|
||||||
|
qdf_spin_unlock_bh(&pdev->mon_lock);
|
||||||
|
|
||||||
return 0;
|
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_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))) {
|
if (qdf_unlikely(hal_srng_access_start(hal_soc, mon_dst_srng))) {
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
"%s %d : HAL Monitor Destination Ring access Failed -- %pK\n",
|
"%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;
|
ppdu_id = pdev->ppdu_info.com_info.ppdu_id;
|
||||||
rx_bufs_used = 0;
|
rx_bufs_used = 0;
|
||||||
|
|
||||||
while (qdf_likely(rxdma_dst_ring_desc =
|
while (qdf_likely(rxdma_dst_ring_desc =
|
||||||
hal_srng_dst_peek(hal_soc, mon_dst_srng))) {
|
hal_srng_dst_peek(hal_soc, mon_dst_srng))) {
|
||||||
qdf_nbuf_t head_msdu, tail_msdu;
|
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);
|
hal_srng_access_end(hal_soc, mon_dst_srng);
|
||||||
|
|
||||||
|
qdf_spin_unlock_bh(&pdev->mon_lock);
|
||||||
|
|
||||||
if (rx_bufs_used) {
|
if (rx_bufs_used) {
|
||||||
dp_rx_buffers_replenish(soc, mac_id,
|
dp_rx_buffers_replenish(soc, mac_id,
|
||||||
&pdev->rxdma_mon_buf_ring[mac_for_pdev],
|
&pdev->rxdma_mon_buf_ring[mac_for_pdev],
|
||||||
@@ -1141,7 +1150,7 @@ dp_rx_pdev_mon_attach(struct dp_pdev *pdev) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
qdf_spinlock_create(&pdev->mon_lock);
|
||||||
return QDF_STATUS_SUCCESS;
|
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++) {
|
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);
|
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_mon_link_desc_pool_cleanup(soc, mac_for_pdev);
|
||||||
dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev);
|
dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev);
|
||||||
dp_rx_pdev_mon_buf_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 */
|
/* Monitor mode interface and status storage */
|
||||||
struct dp_vdev *monitor_vdev;
|
struct dp_vdev *monitor_vdev;
|
||||||
|
|
||||||
/* monitor mode mutex */
|
/* monitor mode lock */
|
||||||
qdf_spinlock_t mon_mutex;
|
qdf_spinlock_t mon_lock;
|
||||||
|
|
||||||
/*tx_mutex for me*/
|
/*tx_mutex for me*/
|
||||||
DP_MUTEX_TYPE tx_mutex;
|
DP_MUTEX_TYPE tx_mutex;
|
||||||
|
Reference in New Issue
Block a user