Kaynağa Gözat

qcacld-3.0: Schedule work for peer_unmap_timer_handler actions

Mutex cannot be used when peer_unmap_timer_handler() calls
cds_trigger_recover() because it runs in soft_irq. Schedule work
to perform the recovery instead.

CRs-Fixed: 2060775
Change-Id: I9a9554ef0aa9288bf5abe22cd2513d8cc41c29d4
Deepak Dhamdhere 7 yıl önce
ebeveyn
işleme
64bfe97415
3 değiştirilmiş dosya ile 26 ekleme ve 5 silme
  1. 24 5
      core/dp/txrx/ol_txrx.c
  2. 1 0
      core/dp/txrx/ol_txrx.h
  3. 1 0
      core/dp/txrx/ol_txrx_types.h

+ 24 - 5
core/dp/txrx/ol_txrx.c

@@ -3333,8 +3333,26 @@ static QDF_STATUS ol_txrx_clear_peer(struct cdp_pdev *ppdev, uint8_t sta_id)
 
 }
 
+void peer_unmap_timer_work_function(void *param)
+{
+	WMA_LOGE("Enter: %s", __func__);
+	/*
+	 * wma_peer_debug_dump() will be replaced with a new routine.
+	 * Add the equivalent of wma_peer_debug_dump() when available.
+	 */
+	if (cds_is_self_recovery_enabled()) {
+		if (!cds_is_driver_recovering())
+			cds_trigger_recovery(false);
+		else
+			WMA_LOGE("%s: Recovery is in progress, ignore!",
+					__func__);
+	} else {
+		QDF_BUG(0);
+	}
+}
+
 /**
- * peer_unmap_timer() - peer unmap timer function
+ * peer_unmap_timer_handler() - peer unmap timer function
  * @data: peer object pointer
  *
  * Return: none
@@ -3342,6 +3360,7 @@ static QDF_STATUS ol_txrx_clear_peer(struct cdp_pdev *ppdev, uint8_t sta_id)
 void peer_unmap_timer_handler(void *data)
 {
 	ol_txrx_peer_handle peer = (ol_txrx_peer_handle)data;
+	ol_txrx_pdev_handle txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 
 	ol_txrx_err("all unmap events not received for peer %p, ref_cnt %d",
 		    peer, qdf_atomic_read(&peer->ref_cnt));
@@ -3351,10 +3370,10 @@ void peer_unmap_timer_handler(void *data)
 		    peer->mac_addr.raw[2], peer->mac_addr.raw[3],
 		    peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
 	if (!cds_is_driver_recovering()) {
-		/*
-		 * Add the equivalent of wma_peer_debug_dump() when available.
-		 */
-		QDF_BUG(0);
+		qdf_create_work(0, &txrx_pdev->peer_unmap_timer_work,
+				peer_unmap_timer_work_function,
+				NULL);
+		qdf_sched_work(0, &txrx_pdev->peer_unmap_timer_work);
 	} else {
 		ol_txrx_err("Recovery is in progress, ignore!");
 	}

+ 1 - 0
core/dp/txrx/ol_txrx.h

@@ -128,6 +128,7 @@ void *ol_txrx_find_peer_by_addr(struct cdp_pdev *pdev,
 				uint8_t *peer_id);
 
 void htt_pkt_log_init(struct cdp_pdev *pdev_handle, void *scn);
+void peer_unmap_timer_work_function(void *);
 void peer_unmap_timer_handler(void *data);
 
 #endif /* _OL_TXRX__H_ */

+ 1 - 0
core/dp/txrx/ol_txrx_types.h

@@ -974,6 +974,7 @@ struct ol_txrx_pdev_t {
 		qdf_atomic_t lro_dev_cnt;
 	} lro_info;
 	struct ol_txrx_peer_t *self_peer;
+	qdf_work_t peer_unmap_timer_work;
 };
 
 struct ol_txrx_vdev_t {