Преглед изворни кода

qcacld-3.0: Simplify pre-cac flush prevention

Change I875c2f14ffd54272fc9ea0df1cecc6dd1171e310 introduced an elaborate
workaround to prevent the pre-cac work from flushing itself during stop
adapter. Introduce a less complicated work around by simply checking if
the current adapter is the pre-cac adapter before flushing the pre-cac
work.

Change-Id: Ib3e0716f8d088d124e960dcd724f579fb39a3d74
CRs-Fixed: 2387173
Dustin Brown пре 6 година
родитељ
комит
b4260d5e38

+ 0 - 8
core/hdd/inc/wlan_hdd_main.h

@@ -2132,14 +2132,6 @@ void hdd_deinit_adapter(struct hdd_context *hdd_ctx,
 QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx,
 			    struct hdd_adapter *adapter);
 
-enum hdd_adapter_stop_flag_t {
-	HDD_IN_CAC_WORK_TH_CONTEXT = 0x00000001,
-};
-
-QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
-				struct hdd_adapter *adapter,
-				enum hdd_adapter_stop_flag_t flag);
-
 void hdd_set_station_ops(struct net_device *dev);
 
 /**

+ 6 - 36
core/hdd/src/wlan_hdd_hostapd.c

@@ -1025,32 +1025,6 @@ static int wlan_hdd_set_pre_cac_complete_status(struct hdd_adapter *ap_adapter,
 	return 0;
 }
 
-/**
- * hdd_check_adapter() - check adapter existing or not
- * @adapter: adapter
- *
- * Check adapter in the hdd global list or not
- *
- * Return: true if adapter exists.
- */
-static bool hdd_check_adapter(struct hdd_adapter *adapter)
-{
-	struct hdd_adapter *temp;
-	struct hdd_context *hdd_ctx;
-
-	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
-	if (!hdd_ctx) {
-		hdd_err("HDD context is null");
-		return false;
-	}
-	hdd_for_each_adapter(hdd_ctx, temp) {
-		if (temp == adapter)
-			return true;
-	}
-
-	return false;
-}
-
 /**
  * __wlan_hdd_sap_pre_cac_failure() - Process the pre cac failure
  * @data: AP adapter
@@ -1067,8 +1041,7 @@ static void __wlan_hdd_sap_pre_cac_failure(void *data)
 	hdd_enter();
 
 	adapter = (struct hdd_adapter *) data;
-	if (!adapter || !hdd_check_adapter(adapter) ||
-	    adapter->magic != WLAN_HDD_ADAPTER_MAGIC) {
+	if (!adapter || adapter->magic != WLAN_HDD_ADAPTER_MAGIC) {
 		hdd_err("SAP Pre CAC adapter invalid");
 		return;
 	}
@@ -1079,9 +1052,8 @@ static void __wlan_hdd_sap_pre_cac_failure(void *data)
 		return;
 	}
 
-	wlan_hdd_release_intf_addr(hdd_ctx,
-				   adapter->mac_addr.bytes);
-	hdd_stop_adapter_ext(hdd_ctx, adapter, HDD_IN_CAC_WORK_TH_CONTEXT);
+	wlan_hdd_release_intf_addr(hdd_ctx, adapter->mac_addr.bytes);
+	hdd_stop_adapter(hdd_ctx, adapter);
 	hdd_close_adapter(hdd_ctx, adapter, false);
 }
 
@@ -1118,8 +1090,7 @@ static void wlan_hdd_sap_pre_cac_success(void *data)
 	hdd_enter();
 
 	adapter = (struct hdd_adapter *) data;
-	if (!adapter || !hdd_check_adapter(adapter) ||
-	    adapter->magic != WLAN_HDD_ADAPTER_MAGIC) {
+	if (!adapter || adapter->magic != WLAN_HDD_ADAPTER_MAGIC) {
 		hdd_err("SAP Pre CAC adapter invalid");
 		return;
 	}
@@ -1131,9 +1102,8 @@ static void wlan_hdd_sap_pre_cac_success(void *data)
 	}
 
 	cds_ssr_protect(__func__);
-	wlan_hdd_release_intf_addr(hdd_ctx,
-				   adapter->mac_addr.bytes);
-	hdd_stop_adapter_ext(hdd_ctx, adapter, HDD_IN_CAC_WORK_TH_CONTEXT);
+	wlan_hdd_release_intf_addr(hdd_ctx, adapter->mac_addr.bytes);
+	hdd_stop_adapter(hdd_ctx, adapter);
 	hdd_close_adapter(hdd_ctx, adapter, false);
 	cds_ssr_unprotect(__func__);
 

+ 5 - 8
core/hdd/src/wlan_hdd_main.c

@@ -5377,16 +5377,10 @@ void wlan_hdd_reset_prob_rspies(struct hdd_adapter *adapter)
 
 QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx,
 			    struct hdd_adapter *adapter)
-{
-	return hdd_stop_adapter_ext(hdd_ctx, adapter, 0);
-}
-
-QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
-				struct hdd_adapter *adapter,
-				enum hdd_adapter_stop_flag_t flag)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct hdd_station_ctx *sta_ctx;
+	struct sap_context *sap_ctx;
 	struct csr_roam_profile *roam_profile;
 	union iwreq_data wrqu;
 	tSirUpdateIE updateIE;
@@ -5539,8 +5533,11 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 
 		ucfg_ipa_flush(hdd_ctx->pdev);
 
-		if (!(flag & HDD_IN_CAC_WORK_TH_CONTEXT))
+		/* don't flush pre-cac destroy if we are destroying pre-cac */
+		sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(adapter);
+		if (!wlan_sap_is_pre_cac_context(sap_ctx))
 			cds_flush_work(&hdd_ctx->sap_pre_cac_work);
+
 		/* fallthrough */
 
 	case QDF_P2P_GO_MODE:

+ 11 - 3
core/sap/inc/sap_api.h

@@ -643,15 +643,15 @@ typedef struct sSapDfsInfo {
 	uint16_t reduced_beacon_interval;
 } tSapDfsInfo;
 
-typedef struct tagSapCtxList {
+struct sap_ctx_list {
 	void *sap_context;
 	enum QDF_OPMODE sapPersona;
-} tSapCtxList, tpSapCtxList;
+};
 
 typedef struct tagSapStruct {
 	/* Information Required for SAP DFS Master mode */
 	tSapDfsInfo SapDfsInfo;
-	tSapCtxList sapCtxList[SAP_MAX_NUM_SESSION];
+	struct sap_ctx_list sapCtxList[SAP_MAX_NUM_SESSION];
 #ifdef FEATURE_AP_MCC_CH_AVOIDANCE
 	bool sap_channel_avoidance;
 #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
@@ -882,6 +882,14 @@ QDF_STATUS wlan_sap_set_chan_before_pre_cac(struct sap_context *sap_ctx,
 QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
 						bool status);
 
+/**
+ * wlan_sap_is_pre_cac_context() - checks if @context is for a pre-cac adapter
+ * @context: the SAP context to check
+ *
+ * Return: true if @context is for a pre-cac adapter
+ */
+bool wlan_sap_is_pre_cac_context(struct sap_context *context);
+
 bool wlan_sap_is_pre_cac_active(mac_handle_t handle);
 QDF_STATUS wlan_sap_get_pre_cac_vdev_id(mac_handle_t handle, uint8_t *vdev_id);
 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH

+ 9 - 3
core/sap/src/sap_module.c

@@ -1518,6 +1518,11 @@ QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
 	return QDF_STATUS_SUCCESS;
 }
 
+bool wlan_sap_is_pre_cac_context(struct sap_context *context)
+{
+	return context && context->is_pre_cac_on;
+}
+
 /**
  * wlan_sap_is_pre_cac_active() - Checks if pre cac in in progress
  * @handle: Global MAC handle
@@ -1529,6 +1534,7 @@ QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
 bool wlan_sap_is_pre_cac_active(mac_handle_t handle)
 {
 	struct mac_context *mac = NULL;
+	struct sap_ctx_list *ctx_list;
 	int i;
 
 	mac = MAC_CONTEXT(handle);
@@ -1538,12 +1544,12 @@ bool wlan_sap_is_pre_cac_active(mac_handle_t handle)
 		return false;
 	}
 
+	ctx_list = mac->sap.sapCtxList;
 	for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
-		struct sap_context *context =
-			mac->sap.sapCtxList[i].sap_context;
-		if (context && context->is_pre_cac_on)
+		if (wlan_sap_is_pre_cac_context(ctx_list[i].sap_context))
 			return true;
 	}
+
 	return false;
 }