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
This commit is contained in:
Liangwei Dong 2019-05-22 23:25:40 -04:00 • committed by nshrivas
commit b2569fd660
2 changed files with 63 additions and 21 deletions

View file

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

View file

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