Просмотр исходного кода

qcacld-3.0: Cleanup roc and tx action before suspending mc thread

Scheduler thread enter suspend state when calling p2p callback from
pmo, and it can't execute cleanup task on time in p2p suspend handler.
So, cleanup roc and tx action frame before suspend mc thread. Add
cleaning up tx action frame by vdev in hdd layer.

Change-Id: Ib0ef1cb3a73c5a48b3c365935a6d5b9307d2aae0
CRs-Fixed: 2283298
Wu Gao 6 лет назад
Родитель
Сommit
4a1ec8cc7a

+ 10 - 0
core/hdd/inc/wlan_hdd_p2p.h

@@ -196,4 +196,14 @@ int wlan_hdd_go_set_mcc_p2p_quota(struct hdd_adapter *hostapd_adapter,
  * Return: None
  */
 void wlan_hdd_set_mcc_latency(struct hdd_adapter *adapter, int set_value);
+
+/**
+ * wlan_hdd_cleanup_actionframe() - Cleanup action frame
+ * @adapter: Pointer to HDD adapter
+ *
+ * This function cleans up action frame.
+ *
+ * Return: None
+ */
+void wlan_hdd_cleanup_actionframe(struct hdd_adapter *adapter);
 #endif /* __P2P_H */

+ 1 - 0
core/hdd/src/wlan_hdd_hostapd.c

@@ -5128,6 +5128,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
 		       adapter->session_id);
 		return -EINVAL;
 	}
+	wlan_hdd_cleanup_actionframe(adapter);
 	wlan_hdd_cleanup_remain_on_channel_ctx(adapter);
 	mutex_lock(&hdd_ctx->sap_lock);
 	if (test_bit(SOFTAP_BSS_STARTED, &adapter->event_flags)) {

+ 1 - 0
core/hdd/src/wlan_hdd_main.c

@@ -5185,6 +5185,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		}
 		wlan_hdd_scan_abort(adapter);
 
+		wlan_hdd_cleanup_actionframe(adapter);
 		wlan_hdd_cleanup_remain_on_channel_ctx(adapter);
 		hdd_clear_fils_connection_info(adapter);
 

+ 11 - 7
core/hdd/src/wlan_hdd_p2p.c

@@ -81,15 +81,12 @@ const char *tdls_action_frame_type[] = { "TDLS Setup Request",
 
 void wlan_hdd_cancel_existing_remain_on_channel(struct hdd_adapter *adapter)
 {
-	QDF_STATUS status;
-
 	if (!adapter) {
 		hdd_err("null adapter");
 		return;
 	}
 
-	status = ucfg_p2p_cleanup_roc(adapter->hdd_vdev);
-	hdd_debug("status:%d", status);
+	ucfg_p2p_cleanup_roc_by_vdev(adapter->hdd_vdev);
 }
 
 int wlan_hdd_check_remain_on_channel(struct hdd_adapter *adapter)
@@ -103,15 +100,22 @@ int wlan_hdd_check_remain_on_channel(struct hdd_adapter *adapter)
 /* Clean up RoC context at hdd_stop_adapter*/
 void wlan_hdd_cleanup_remain_on_channel_ctx(struct hdd_adapter *adapter)
 {
-	QDF_STATUS status;
+	if (!adapter) {
+		hdd_err("null adapter");
+		return;
+	}
 
+	ucfg_p2p_cleanup_roc_by_vdev(adapter->hdd_vdev);
+}
+
+void wlan_hdd_cleanup_actionframe(struct hdd_adapter *adapter)
+{
 	if (!adapter) {
 		hdd_err("null adapter");
 		return;
 	}
 
-	status = ucfg_p2p_cleanup_roc(adapter->hdd_vdev);
-	hdd_debug("status:%d", status);
+	ucfg_p2p_cleanup_tx_by_vdev(adapter->hdd_vdev);
 }
 
 static int __wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,

+ 4 - 0
core/hdd/src/wlan_hdd_power.c

@@ -76,6 +76,7 @@
 #include "wlan_cfg80211_scan.h"
 #include "wlan_ipa_ucfg_api.h"
 #include <wlan_cfg80211_mc_cp_stats.h>
+#include "wlan_p2p_ucfg_api.h"
 
 /* Preprocessor definitions and constants */
 #ifdef QCA_WIFI_NAPIER_EMULATION
@@ -1667,6 +1668,9 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
 			}
 		}
 	}
+	/* p2p cleanup task based on scheduler */
+	ucfg_p2p_cleanup_tx_by_psoc(hdd_ctx->hdd_psoc);
+	ucfg_p2p_cleanup_roc_by_psoc(hdd_ctx->hdd_psoc);
 
 	/* Stop ongoing scan on each interface */
 	hdd_for_each_adapter(hdd_ctx, adapter) {