qcacld-3.0: Correct BW parameter for CSA concurrency check

In SAP+GO concurrency, if move SAP to DFS channel (BW 160 MHz)
and cause MCC with GO, the target will do CAC on SAP, but target
doesn't support MCC with GO when SAP is CAC state.
Fix by checking correct BW of CSA target channel so that correct
DFS flag can be got and if target channel is DFS causing MCC
with other AP interface then reject CSA request.

Change-Id: Ic7821cf62d3b364e4d2ea052dc82d65d18054091
CRs-Fixed: 3275285
This commit is contained in:
Srikanth Marepalli 2022-12-21 16:27:11 +05:30 • committed by Madan Koyyalamudi
commit 4c3c4ddb3d
4 changed files with 38 additions and 26 deletions

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -884,6 +884,7 @@ policy_mgr_nan_sap_pre_enable_conc_check(struct wlan_objmgr_psoc *psoc,
* @psoc: PSOC object information
* @mode: connection mode
* @ch_freq: target channel frequency to switch
* @bw: target channel bandwidth
* @vdev_id: vdev id of channel switch interface
* @forced: forced to chan switch.
* @reason: request reason of CSA
@ -903,8 +904,17 @@ policy_mgr_nan_sap_pre_enable_conc_check(struct wlan_objmgr_psoc *psoc,
bool
policy_mgr_allow_concurrency_csa(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_con_mode mode,
uint32_t ch_freq, uint32_t vdev_id,
bool forced, enum sap_csa_reason_code reason);
uint32_t ch_freq, enum hw_mode_bandwidth bw,
uint32_t vdev_id, bool forced,
enum sap_csa_reason_code reason);
/**
* policy_mgr_get_bw() - Convert phy_ch_width to hw_mode_bandwidth.
* @chan_width: phy_ch_width
*
* Return: hw_mode_bandwidth
*/
enum hw_mode_bandwidth policy_mgr_get_bw(enum phy_ch_width chan_width);
/**
* policy_mgr_get_first_connection_pcl_table_index() - provides the

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -2653,11 +2653,14 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
}
if (ch_freq) {
chan_state = wlan_reg_get_5g_bonded_channel_state_for_freq(
if (wlan_reg_is_5ghz_ch_freq(ch_freq)) {
chan_state =
wlan_reg_get_5g_bonded_channel_state_for_freq(
pm_ctx->pdev, ch_freq,
policy_mgr_get_ch_width(bw));
if (chan_state == CHANNEL_STATE_DFS)
is_dfs_ch = true;
if (chan_state == CHANNEL_STATE_DFS)
is_dfs_ch = true;
}
/* don't allow 3rd home channel on same MAC
* also check for single mac target which doesn't
* support interbad MCC as well
@ -2693,8 +2696,10 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
sta_sap_scc_on_dfs_chan =
policy_mgr_is_sta_sap_scc_allowed_on_dfs_chan(psoc);
go_force_scc = policy_mgr_go_scc_enforced(psoc);
if ((!sta_sap_scc_on_dfs_chan && mode == PM_SAP_MODE) ||
(!go_force_scc && mode == PM_P2P_GO_MODE)) {
if ((mode == PM_SAP_MODE || mode == PM_P2P_GO_MODE) &&
(!sta_sap_scc_on_dfs_chan ||
!policy_mgr_is_sta_sap_scc(psoc, ch_freq) ||
(!go_force_scc && mode == PM_P2P_GO_MODE))) {
if (is_dfs_ch)
match = policy_mgr_disallow_mcc(psoc,
ch_freq);
@ -2796,8 +2801,9 @@ bool policy_mgr_allow_concurrency(struct wlan_objmgr_psoc *psoc,
bool
policy_mgr_allow_concurrency_csa(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_con_mode mode,
uint32_t ch_freq, uint32_t vdev_id,
bool forced, enum sap_csa_reason_code reason)
uint32_t ch_freq, enum hw_mode_bandwidth bw,
uint32_t vdev_id, bool forced,
enum sap_csa_reason_code reason)
{
bool allow = false;
struct policy_mgr_conc_connection_info
@ -2812,8 +2818,8 @@ policy_mgr_allow_concurrency_csa(struct wlan_objmgr_psoc *psoc,
policy_mgr_err("Invalid Context");
return allow;
}
policy_mgr_debug("check concurrency_csa vdev:%d ch %d, forced %d, reason %d",
vdev_id, ch_freq, forced, reason);
policy_mgr_debug("check concurrency_csa vdev:%d ch %d bw %d, forced %d, reason %d",
vdev_id, ch_freq, bw, forced, reason);
status = policy_mgr_get_chan_by_session_id(psoc, vdev_id,
&old_ch_freq);
@ -2851,8 +2857,7 @@ policy_mgr_allow_concurrency_csa(struct wlan_objmgr_psoc *psoc,
policy_mgr_store_and_del_conn_info_by_vdev_id(
psoc, vdev_id, info, &num_cxn_del);
allow = policy_mgr_allow_concurrency(psoc, mode, ch_freq,
HW_MODE_20_MHZ);
allow = policy_mgr_allow_concurrency(psoc, mode, ch_freq, bw);
/* Restore the connection entry */
if (num_cxn_del > 0)
policy_mgr_restore_deleted_conn_info(psoc, info, num_cxn_del);

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -570,14 +571,6 @@ void pm_dbs_opportunistic_timer_handler(void *data);
enum policy_mgr_con_mode policy_mgr_get_mode(uint8_t type,
uint8_t subtype);
/**
* policy_mgr_get_bw() - Convert phy_ch_width to hw_mode_bandwidth.
* @chan_width: phy_ch_width
*
* Return: hw_mode_bandwidth
*/
enum hw_mode_bandwidth policy_mgr_get_bw(enum phy_ch_width chan_width);
QDF_STATUS policy_mgr_get_channel_list(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_pcl_type pcl,
uint32_t *pcl_channels, uint32_t *len,

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -2966,6 +2966,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq,
struct wlan_objmgr_vdev *vdev;
bool strict;
uint32_t sta_cnt = 0;
struct ch_params ch_params = {0};
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
ret = wlan_hdd_validate_context(hdd_ctx);
@ -3046,7 +3047,10 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq,
hdd_err("Channel switch in progress!!");
return -EBUSY;
}
ch_params.ch_width = target_bw;
target_bw = wlansap_get_csa_chanwidth_from_phymode(sap_ctx,
target_chan_freq,
&ch_params);
/*
* Do SAP concurrency check to cover channel switch case as following:
* There is already existing SAP+GO combination but due to upper layer
@ -3063,7 +3067,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_chan_freq,
hdd_ctx->psoc,
policy_mgr_convert_device_mode_to_qdf_type(
adapter->device_mode),
target_chan_freq,
target_chan_freq, policy_mgr_get_bw(target_bw),
adapter->vdev_id,
forced,
sap_ctx->csa_reason)) {