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
This commit is contained in:
Tushnim Bhattacharyya 2017-08-04 23:39:55 -07:00 • committed by snandini
commit c3c375e5e9
3 changed files with 37 additions and 5 deletions

View file

@ -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);

View file

@ -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 ) */

View file

@ -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;