qcacld-3.0: Don't disable connected 6 GHz channels

Currently host disables 6 GHz band when set_fcc_channel cmd
is received hence existing STA/P2P client 6 GHz connections
get disabled.
Add changes to keep existing STA/P2P client 6 GHz connections
intact and also keep SAP up on 6 GHz if STA+SAP SCC on 6 GHz
channel was present before receiving this command. Disable all
other 6 GHz operations.

Change-Id: I95c094e1b344d430a288b6f613842efe6e576e25
CRs-Fixed: 3495006
This commit is contained in:
Asutosh Mohapatra
2023-05-08 14:38:46 +05:30
committed by Rahul Choudhary
parent 5598f7bcfc
commit 7ebd1c2c35
10 changed files with 172 additions and 41 deletions

View File

@@ -5034,9 +5034,9 @@ bool policy_mgr_is_ll_sap_concurrency_valid(struct wlan_objmgr_psoc *psoc,
* @discon_freq: disconnect frequency
* @type: enum indoor_conc_update_type
*
* Return: None
* Return: True if need to compute pdev current channel list
*/
void
bool
policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t discon_freq,

View File

@@ -414,12 +414,16 @@ QDF_STATUS policy_mgr_update_connection_info(struct wlan_objmgr_psoc *psoc,
policy_mgr_handle_ml_sta_links_on_vdev_up_csa(psoc,
policy_mgr_get_qdf_mode_from_pm(mode), vdev_id);
if (policy_mgr_is_conc_sap_present_on_sta_freq(psoc, mode, cur_freq))
policy_mgr_update_indoor_concurrency(psoc, vdev_id, 0,
SWITCH_WITH_CONCURRENCY);
else
policy_mgr_update_indoor_concurrency(psoc, vdev_id, cur_freq,
SWITCH_WITHOUT_CONCURRENCY);
if (policy_mgr_is_conc_sap_present_on_sta_freq(psoc, mode, cur_freq) &&
policy_mgr_update_indoor_concurrency(psoc, vdev_id, 0,
SWITCH_WITH_CONCURRENCY))
wlan_reg_recompute_current_chan_list(psoc, pm_ctx->pdev);
else if (policy_mgr_update_indoor_concurrency(psoc, vdev_id, cur_freq,
SWITCH_WITHOUT_CONCURRENCY))
wlan_reg_recompute_current_chan_list(psoc, pm_ctx->pdev);
else if (wlan_reg_get_keep_6ghz_sta_cli_connection(pm_ctx->pdev))
wlan_reg_recompute_current_chan_list(psoc, pm_ctx->pdev);
return QDF_STATUS_SUCCESS;
}

View File

@@ -4510,7 +4510,8 @@ void policy_mgr_incr_active_session(struct wlan_objmgr_psoc *psoc,
policy_mgr_dump_current_concurrency(psoc);
policy_mgr_update_indoor_concurrency(psoc, session_id, 0, CONNECT);
if (policy_mgr_update_indoor_concurrency(psoc, session_id, 0, CONNECT))
wlan_reg_recompute_current_chan_list(psoc, pm_ctx->pdev);
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
policy_mgr_handle_ml_sta_links_on_vdev_up_csa(psoc, mode, session_id);
@@ -4687,9 +4688,16 @@ QDF_STATUS policy_mgr_decr_active_session(struct wlan_objmgr_psoc *psoc,
mode == QDF_STA_MODE || mode == QDF_P2P_CLIENT_MODE)
policy_mgr_update_dfs_master_dynamic_enabled(psoc, session_id);
if (!pm_ctx->last_disconn_sta_freq)
policy_mgr_update_indoor_concurrency(psoc, session_id, cur_freq,
DISCONNECT_WITHOUT_CONCURRENCY);
if (!pm_ctx->last_disconn_sta_freq) {
if (policy_mgr_update_indoor_concurrency(psoc, session_id,
cur_freq, DISCONNECT_WITHOUT_CONCURRENCY))
wlan_reg_recompute_current_chan_list(psoc,
pm_ctx->pdev);
}
if (wlan_reg_get_keep_6ghz_sta_cli_connection(pm_ctx->pdev) &&
(mode == QDF_STA_MODE || mode == QDF_P2P_CLIENT_MODE))
wlan_reg_recompute_current_chan_list(psoc, pm_ctx->pdev);
return qdf_status;
}
@@ -10409,7 +10417,7 @@ bool policy_mgr_is_ll_sap_concurrency_valid(struct wlan_objmgr_psoc *psoc,
return true;
}
void
bool
policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t discon_freq,
@@ -10424,13 +10432,13 @@ policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid pm context");
return;
return false;
}
ucfg_mlme_get_indoor_channel_support(psoc, &indoor_support);
if (indoor_support ||
!policy_mgr_get_sta_sap_scc_allowed_on_indoor_chnl(psoc))
return;
return false;
mode = wlan_get_opmode_from_vdev_id(pm_ctx->pdev, vdev_id);
@@ -10440,10 +10448,10 @@ policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
*/
if (type != DISCONNECT_WITH_CONCURRENCY &&
(mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)) {
return;
return false;
} else if (type == DISCONNECT_WITH_CONCURRENCY &&
(mode != QDF_SAP_MODE && mode != QDF_P2P_GO_MODE)) {
return;
return false;
}
switch (type) {
@@ -10458,13 +10466,13 @@ policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
ch_freq = discon_freq;
break;
default:
return;
return false;
}
if (type != SWITCH_WITHOUT_CONCURRENCY &&
!(WLAN_REG_IS_5GHZ_CH_FREQ(ch_freq) &&
wlan_reg_is_freq_indoor(pm_ctx->pdev, ch_freq))) {
return;
return false;
} else if (type == SWITCH_WITHOUT_CONCURRENCY) {
/* Either the previous frequency or the current
* frequency can be indoor. Or both can be indoor.
@@ -10475,7 +10483,7 @@ policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
wlan_reg_is_freq_indoor(pm_ctx->pdev, ch_freq)) ||
(WLAN_REG_IS_5GHZ_CH_FREQ(discon_freq) &&
wlan_reg_is_freq_indoor(pm_ctx->pdev, discon_freq))))
return;
return false;
}
switch (type) {
@@ -10498,7 +10506,7 @@ policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
case DISCONNECT_WITH_CONCURRENCY:
/*If there are other sessions, do not change current chan list*/
if (policy_mgr_get_connection_count_with_ch_freq(ch_freq) > 1)
return;
return false;
wlan_reg_modify_indoor_concurrency(pm_ctx->pdev,
INVALID_VDEV_ID, ch_freq,
CH_WIDTH_INVALID, false);
@@ -10510,9 +10518,9 @@ policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
* The previous frequency removal and current channel list
* recomputation will happen after SAP CSA
*/
return;
return false;
}
wlan_reg_recompute_current_chan_list(psoc, pm_ctx->pdev);
return true;
}
bool policy_mgr_is_conc_sap_present_on_sta_freq(struct wlan_objmgr_psoc *psoc,