Jelajahi Sumber

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
Sumedh Baikady 7 tahun lalu
induk
melakukan
12b2b2c897
3 mengubah file dengan 19 tambahan dan 4 penghapusan
  1. 6 1
      dp/wifi3.0/dp_main.c
  2. 11 1
      dp/wifi3.0/dp_rx_mon_dest.c
  3. 2 2
      dp/wifi3.0/dp_types.h

+ 6 - 1
dp/wifi3.0/dp_main.c

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

+ 11 - 1
dp/wifi3.0/dp_rx_mon_dest.c

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

+ 2 - 2
dp/wifi3.0/dp_types.h

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