Browse Source

qcacld-3.0: Use lockless sme API to get valid channel list from sme

Use lockless sme API to get valid channel list from sme instead of
sme_get_cfg_valid_channels to avoid deadlock.

Change-Id: I481824cb116244b9c13665d6a0ee88e28c88cf66
CRs-Fixed: 2063060
Tushnim Bhattacharyya 7 years ago
parent
commit
c3c375e5e9
3 changed files with 37 additions and 5 deletions
  1. 5 4
      core/hdd/src/wlan_hdd_conc_ut.c
  2. 13 0
      core/sme/inc/sme_api.h
  3. 19 1
      core/sme/src/common/sme_api.c

+ 5 - 4
core/hdd/src/wlan_hdd_conc_ut.c

@@ -637,7 +637,7 @@ void wlan_hdd_one_connection_scenario(struct hdd_context *hdd_ctx)
 	QDF_STATUS ret;
 	struct policy_mgr_sme_cbacks sme_cbacks;
 
-	sme_cbacks.sme_get_valid_channels = sme_get_cfg_valid_channels;
+	sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
 	sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
 	/* flush the entire table first */
 	ret = policy_mgr_psoc_enable(hdd_ctx->hdd_psoc);
@@ -697,7 +697,7 @@ void wlan_hdd_two_connections_scenario(struct hdd_context *hdd_ctx,
 		sub_type < PM_MAX_NUM_OF_MODE; sub_type++) {
 		type = wlan_hdd_valid_type_of_persona(sub_type);
 
-		sme_cbacks.sme_get_valid_channels = sme_get_cfg_valid_channels;
+		sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
 		sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
 		/* flush the entire table first */
 		ret = policy_mgr_psoc_enable(hdd_ctx->hdd_psoc);
@@ -734,7 +734,8 @@ void wlan_hdd_two_connections_scenario(struct hdd_context *hdd_ctx,
 			pcl_len = 0;
 			pcl_type = policy_mgr_get_pcl_from_second_conn_table(
 				second_index, next_sub_type, system_pref,
-				policy_mgr_is_hw_dbs_capable(hdd_ctx->hdd_psoc));
+				policy_mgr_is_hw_dbs_capable(
+					hdd_ctx->hdd_psoc));
 			/* check PCL for second connection is correct or no */
 			policy_mgr_get_pcl(hdd_ctx->hdd_psoc,
 				next_sub_type, pcl, &pcl_len,
@@ -802,7 +803,7 @@ void wlan_hdd_three_connections_scenario(struct hdd_context *hdd_ctx,
 
 		type_1 = wlan_hdd_valid_type_of_persona(sub_type_1);
 
-		sme_cbacks.sme_get_valid_channels = sme_get_cfg_valid_channels;
+		sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
 		sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
 		/* flush the entire table first */
 		ret = policy_mgr_psoc_enable(hdd_ctx->hdd_psoc);

+ 13 - 0
core/sme/inc/sme_api.h

@@ -1682,4 +1682,17 @@ QDF_STATUS sme_get_chain_rssi(tHalHandle hal,
 			      struct get_chain_rssi_req_params *input,
 			      get_chain_rssi_callback callback,
 			      void *context);
+
+/**
+ * sme_get_valid_channels() - sme api to get valid channels for
+ * current regulatory domain
+ * @chan_list: list of the valid channels
+ * @list_len: length of the channel list
+ *
+ * This function will get valid channels for current regulatory
+ * domain
+ *
+ * Return: QDF_STATUS_SUCCESS or non-zero on failure
+ */
+QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len);
 #endif /* #if !defined( __SME_API_H ) */

+ 19 - 1
core/sme/src/common/sme_api.c

@@ -1318,6 +1318,24 @@ QDF_STATUS sme_hdd_ready_ind(tHalHandle hHal)
 	return status;
 }
 
+QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len)
+{
+	tpAniSirGlobal mac_ctx = sme_get_mac_context();
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	if (NULL == mac_ctx) {
+		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
+			FL("Invalid MAC context"));
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (eSIR_SUCCESS != wlan_cfg_get_str(mac_ctx,
+			WNI_CFG_VALID_CHANNEL_LIST, chan_list, list_len))
+		status = QDF_STATUS_E_INVAL;
+
+	return status;
+}
+
 /*--------------------------------------------------------------------------
 
    \brief sme_start() - Put all SME modules at ready state.
@@ -1346,7 +1364,7 @@ QDF_STATUS sme_start(tHalHandle hHal)
 			break;
 		}
 		sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
-		sme_cbacks.sme_get_valid_channels = sme_get_cfg_valid_channels;
+		sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
 		sme_cbacks.sme_nss_update_request = sme_nss_update_request;
 		sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
 		sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;