From b2569fd6606e05ee66cc7b39226b06e0bf207399 Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Wed, 22 May 2019 23:25:40 -0400 Subject: [PATCH] qcacmn: Support p2p GO random chan selection MCL needs the interface type to query policy mgr for PCL when selecting random channel. The existing API utils_dfs_get_random_channel doesn't provide the vdev type. Add new utils_dfs_get_vdev_random_channel with vdev parameter to support P2P GO random channel selection. Change-Id: I0c6841b1692baca92730a6be73653282c98f1682 CRs-Fixed: 2467871 --- umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h | 20 ++++++ umac/dfs/dispatcher/src/wlan_dfs_utils_api.c | 68 +++++++++++++------- 2 files changed, 65 insertions(+), 23 deletions(-) diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h index f1950749ae47..feb1d1d3f43d 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h @@ -448,6 +448,26 @@ QDF_STATUS utils_dfs_get_random_channel(struct wlan_objmgr_pdev *pdev, uint32_t *hw_mode, uint8_t *target_chan, struct dfs_acs_info *acs_info); +/** + * utils_dfs_get_vdev_random_channel() - Get random channel for vdev + * @pdev: Pointer to DFS pdev object. + * @vdev: vdev of the request + * @flags: random channel selection flags. + * @ch_params: current channel params. + * @hw_mode: current operating mode. + * @target_chan: Pointer to target_chan. + * @acs_info: acs range info. + * + * Get random channel based on vdev interface type. If the vdev is null, + * the function will get random channel by SAP interface type. + * + * Return: QDF_STATUS + */ +QDF_STATUS utils_dfs_get_vdev_random_channel( + struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev, + uint16_t flags, struct ch_params *ch_params, uint32_t *hw_mode, + uint8_t *target_chan, struct dfs_acs_info *acs_info); + /** * utils_dfs_bw_reduced_channel() - Get BW reduced channel. * @pdev: Pointer to DFS pdev object. diff --git a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c index 0ba8a971afc7..baf6b876e6a6 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c @@ -663,6 +663,7 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev, * utils_dfs_get_channel_list() - Get channel list from regdb component, based * on current channel list. * @pdev: Pointer to pdev structure. + * @vdev: vdev of request * @chan: Pointer to channel list. * @num_chan: number of channels. * @@ -672,6 +673,7 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev, * channel. */ static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, struct dfs_channel *chan_list, uint32_t *num_chan) { @@ -735,15 +737,16 @@ static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev, } #else - void utils_dfs_get_nol_history_chan_list(struct wlan_objmgr_pdev *pdev, void *clist, uint32_t *num_chan) { utils_dfs_get_chan_list(pdev, clist, num_chan); } -void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev, - void *clist, uint32_t *num_chan) +static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev, + struct dfs_channel *chan_list, + uint32_t *num_chan) { uint8_t pcl_ch[QDF_MAX_NUM_CHAN] = {0}; uint8_t weight_list[QDF_MAX_NUM_CHAN] = {0}; @@ -752,7 +755,7 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev, int i; struct wlan_objmgr_psoc *psoc; uint32_t conn_count = 0; - struct dfs_channel *chan_list = (struct dfs_channel *)clist; + enum policy_mgr_con_mode mode; psoc = wlan_pdev_get_psoc(pdev); if (!psoc) { @@ -763,14 +766,21 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev, len = QDF_ARRAY_SIZE(pcl_ch); weight_len = QDF_ARRAY_SIZE(weight_list); - conn_count = policy_mgr_mode_specific_connection_count( - psoc, PM_SAP_MODE, NULL); - if (0 == conn_count) - policy_mgr_get_pcl(psoc, PM_SAP_MODE, pcl_ch, - &len, weight_list, weight_len); + + if (vdev) + mode = policy_mgr_convert_device_mode_to_qdf_type( + wlan_vdev_mlme_get_opmode(vdev)); else - policy_mgr_get_pcl_for_existing_conn(psoc, PM_SAP_MODE, pcl_ch, - &len, weight_list, weight_len, true); + mode = PM_SAP_MODE; + conn_count = policy_mgr_mode_specific_connection_count( + psoc, mode, NULL); + if (0 == conn_count) + policy_mgr_get_pcl(psoc, mode, pcl_ch, + &len, weight_list, weight_len); + else + policy_mgr_get_pcl_for_existing_conn( + psoc, mode, pcl_ch, &len, weight_list, + weight_len, true); if (*num_chan < len) { dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, @@ -789,21 +799,18 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev, dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "num channels %d", i); } -static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev, - struct dfs_channel *chan_list, - uint32_t *num_chan) +void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev, + void *clist, uint32_t *num_chan) { - utils_dfs_get_chan_list(pdev, (void *)chan_list, num_chan); + utils_dfs_get_channel_list(pdev, NULL, (struct dfs_channel *)clist, + num_chan); } #endif -QDF_STATUS utils_dfs_get_random_channel( - struct wlan_objmgr_pdev *pdev, - uint16_t flags, - struct ch_params *ch_params, - uint32_t *hw_mode, - uint8_t *target_chan, - struct dfs_acs_info *acs_info) +QDF_STATUS utils_dfs_get_vdev_random_channel( + struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev, + uint16_t flags, struct ch_params *ch_params, uint32_t *hw_mode, + uint8_t *target_chan, struct dfs_acs_info *acs_info) { uint32_t dfs_reg; uint32_t num_chan = NUM_CHANNELS; @@ -831,7 +838,7 @@ QDF_STATUS utils_dfs_get_random_channel( if (!chan_list) goto random_chan_error; - utils_dfs_get_channel_list(pdev, chan_list, &num_chan); + utils_dfs_get_channel_list(pdev, vdev, chan_list, &num_chan); if (!num_chan) { dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "zero channels"); goto random_chan_error; @@ -870,6 +877,21 @@ random_chan_error: return status; } + +qdf_export_symbol(utils_dfs_get_vdev_random_channel); + +QDF_STATUS utils_dfs_get_random_channel( + struct wlan_objmgr_pdev *pdev, + uint16_t flags, + struct ch_params *ch_params, + uint32_t *hw_mode, + uint8_t *target_chan, + struct dfs_acs_info *acs_info) +{ + return utils_dfs_get_vdev_random_channel( + pdev, NULL, flags, ch_params, hw_mode, target_chan, + acs_info); +} qdf_export_symbol(utils_dfs_get_random_channel); QDF_STATUS utils_dfs_bw_reduced_channel(