Przeglądaj źródła

qcacld-3.0: Initialize spinlocks used for STA and SAP information update

qcacld-2.0 to qcacld-3.0 propagation

Initialize spinlocks sap_update_info_lock and sta_update_info_lock which
are used during SAP and STA information update respectively. These
uninitialized spinlocks lead to crash during access due to bad magic
value of the spinlock.

Change-Id: I7d2df8337f9feed352430774907aa095affa5a69
CRs-Fixed: 1011996
Manishekar Chandrasekaran 9 lat temu
rodzic
commit
7f63d05a48

+ 8 - 8
core/cds/src/cds_concurrency.c

@@ -1927,9 +1927,9 @@ bool cds_is_sta_connection_pending(void)
 		return false;
 	}
 
-	spin_lock(&hdd_ctx->sta_update_info_lock);
+	qdf_spin_lock(&hdd_ctx->sta_update_info_lock);
 	status = hdd_ctx->is_sta_connection_pending;
-	spin_unlock(&hdd_ctx->sta_update_info_lock);
+	qdf_spin_unlock(&hdd_ctx->sta_update_info_lock);
 	return status;
 }
 
@@ -1952,9 +1952,9 @@ void cds_change_sta_conn_pending_status(bool value)
 		return;
 	}
 
-	spin_lock(&hdd_ctx->sta_update_info_lock);
+	qdf_spin_lock(&hdd_ctx->sta_update_info_lock);
 	hdd_ctx->is_sta_connection_pending = value;
-	spin_unlock(&hdd_ctx->sta_update_info_lock);
+	qdf_spin_unlock(&hdd_ctx->sta_update_info_lock);
 }
 
 /**
@@ -1976,9 +1976,9 @@ static bool cds_is_sap_restart_required(void)
 		return false;
 	}
 
-	spin_lock(&hdd_ctx->sap_update_info_lock);
+	qdf_spin_lock(&hdd_ctx->sap_update_info_lock);
 	status = hdd_ctx->is_sap_restart_required;
-	spin_unlock(&hdd_ctx->sap_update_info_lock);
+	qdf_spin_unlock(&hdd_ctx->sap_update_info_lock);
 	return status;
 }
 
@@ -2001,9 +2001,9 @@ void cds_change_sap_restart_required_status(bool value)
 		return;
 	}
 
-	spin_lock(&hdd_ctx->sap_update_info_lock);
+	qdf_spin_lock(&hdd_ctx->sap_update_info_lock);
 	hdd_ctx->is_sap_restart_required = value;
-	spin_unlock(&hdd_ctx->sap_update_info_lock);
+	qdf_spin_unlock(&hdd_ctx->sap_update_info_lock);
 }
 
 /**

+ 2 - 2
core/hdd/inc/wlan_hdd_main.h

@@ -1320,8 +1320,8 @@ struct hdd_context_s {
 	struct work_struct  sap_start_work;
 	bool is_sap_restart_required;
 	bool is_sta_connection_pending;
-	spinlock_t sap_update_info_lock;
-	spinlock_t sta_update_info_lock;
+	qdf_spinlock_t sap_update_info_lock;
+	qdf_spinlock_t sta_update_info_lock;
 
 	uint8_t dev_dfs_cac_status;
 

+ 5 - 2
core/hdd/src/wlan_hdd_hostapd.c

@@ -116,6 +116,7 @@ int hdd_sap_context_init(hdd_context_t *hdd_ctx)
 
 	mutex_init(&hdd_ctx->sap_lock);
 	qdf_wake_lock_create(&hdd_ctx->sap_wake_lock, "qcom_sap_wakelock");
+	qdf_spinlock_create(&hdd_ctx->sap_update_info_lock);
 
 	mutex_init(&hdd_ctx->dfs_lock);
 
@@ -220,6 +221,8 @@ void hdd_sap_context_destroy(hdd_context_t *hdd_ctx)
 
 	mutex_destroy(&hdd_ctx->dfs_lock);
 
+	qdf_spinlock_destroy(&hdd_ctx->sap_update_info_lock);
+
 }
 
 /**
@@ -8161,9 +8164,9 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
 	    (QDF_SAP_MODE == pAdapter->device_mode)) {
 		cds_flush_work(&pHddCtx->sap_start_work);
 		hddLog(LOGW, FL("Canceled the pending restart work"));
-		spin_lock(&pHddCtx->sap_update_info_lock);
+		qdf_spin_lock(&pHddCtx->sap_update_info_lock);
 		pHddCtx->is_sap_restart_required = false;
-		spin_unlock(&pHddCtx->sap_update_info_lock);
+		qdf_spin_unlock(&pHddCtx->sap_update_info_lock);
 	}
 	pAdapter->sessionCtx.ap.sapConfig.acs_cfg.acs_mode = false;
 	if (pAdapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list)

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

@@ -4183,6 +4183,10 @@ void hdd_wlan_exit(hdd_context_t *hdd_ctx)
 		QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 
+	qdf_spinlock_destroy(&hdd_ctx->hdd_adapter_lock);
+	qdf_spinlock_destroy(&hdd_ctx->sta_update_info_lock);
+	qdf_spinlock_destroy(&hdd_ctx->connection_status_lock);
+
 	/*
 	 * Close CDS
 	 * This frees pMac(HAL) context. There should not be any call
@@ -5484,8 +5488,9 @@ static int hdd_context_init(hdd_context_t *hdd_ctx)
 	hdd_init_bpf_completion();
 
 	qdf_spinlock_create(&hdd_ctx->connection_status_lock);
-
+	qdf_spinlock_create(&hdd_ctx->sta_update_info_lock);
 	qdf_spinlock_create(&hdd_ctx->hdd_adapter_lock);
+
 	qdf_list_create(&hdd_ctx->hddAdapters, MAX_NUMBER_OF_ADAPTERS);
 
 	init_completion(&hdd_ctx->set_antenna_mode_cmpl);

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

@@ -2502,6 +2502,7 @@ void hdd_cleanup_scan_queue(hdd_context_t *hdd_ctx)
 void hdd_scan_context_destroy(hdd_context_t *hdd_ctx)
 {
 	qdf_list_destroy(&hdd_ctx->hdd_scan_req_q);
+	qdf_spinlock_destroy(&hdd_ctx->sched_scan_lock);
 }
 
 /**