From 08c37be1d9156fa50840bbc6fbd32d223b556ecf Mon Sep 17 00:00:00 2001 From: Santosh Anbu Date: Wed, 19 May 2021 14:29:01 +0530 Subject: [PATCH] qcacmn: Add INI param to support max chan switch IE Add change to support max channel switch IE as a INI config. With this INI enabled, max channel switch IE will be used in scenario, where client disconnection is to be avoided with CSA on CAC channel. Change-Id: I786e7e12e12ebcb3fc7d0720ed02e01bff6c82b8 CRs-Fixed: 2949206 --- cfg/inc/cfg_converged.h | 4 +- umac/mlme/include/cfg_cmn_mlme.h | 50 +++++++++++++++++++ umac/mlme/include/wlan_mlme_cmn.h | 8 +++ umac/mlme/include/wlan_psoc_mlme.h | 4 +- .../dispatcher/src/wlan_cmn_mlme_main.c | 19 +++++++ .../dispatcher/src/wlan_psoc_mlme_api.c | 5 +- umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c | 6 ++- 7 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 umac/mlme/include/cfg_cmn_mlme.h diff --git a/cfg/inc/cfg_converged.h b/cfg/inc/cfg_converged.h index 1595b6da2a..953a189214 100644 --- a/cfg/inc/cfg_converged.h +++ b/cfg/inc/cfg_converged.h @@ -28,6 +28,7 @@ #include "cfg_dp.h" #include "cfg_hif.h" #include +#include #ifdef WLAN_SUPPORT_GREEN_AP #include "cfg_green_ap_params.h" #else @@ -60,7 +61,8 @@ CFG_DCS_ALL \ CFG_CFR_ALL \ CFG_MLME_SCORE_ALL \ - CFG_WLAN_CM_UTF_PARAM + CFG_WLAN_CM_UTF_PARAM \ + CFG_CMN_MLME_ALL #endif /* __CFG_CONVERGED_H */ diff --git a/umac/mlme/include/cfg_cmn_mlme.h b/umac/mlme/include/cfg_cmn_mlme.h new file mode 100644 index 0000000000..1fc6493b62 --- /dev/null +++ b/umac/mlme/include/cfg_cmn_mlme.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021, The Linux Foundation. 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 above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: This file contains umac mlme related CFG/INI Items. + */ + +#ifndef __CFG_CMN_MLME_H +#define __CFG_CMN_MLME_H + +/* + * + * max_chan_switch_ie_enable - Flag to enable max chan switch IE support + * @Min: false + * @Max: true + * @Default: false + * + * For non_ap platform, this flag will be enabled at later point and for ap + * platform this flag will be disabled + * + * Related: None + * + * Supported Feature: Max channel switch IE + * + * Usage: External + * + * + */ +#define CFG_MLME_MAX_CHAN_SWITCH_IE_ENABLE \ + CFG_INI_BOOL("max_chan_switch_ie_enable", \ + PLATFORM_VALUE(false, false), \ + "To enable max channel switch IE") + +#define CFG_CMN_MLME_ALL \ + CFG(CFG_MLME_MAX_CHAN_SWITCH_IE_ENABLE) + +#endif /* __CFG_CMN_MLME_H */ diff --git a/umac/mlme/include/wlan_mlme_cmn.h b/umac/mlme/include/wlan_mlme_cmn.h index bc7c550fb7..52b071cddb 100644 --- a/umac/mlme/include/wlan_mlme_cmn.h +++ b/umac/mlme/include/wlan_mlme_cmn.h @@ -743,4 +743,12 @@ typedef struct mlme_cm_ops *(*osif_cm_get_global_ops_cb)(void); */ void mlme_set_osif_cm_cb(osif_cm_get_global_ops_cb cm_osif_ops); +/** + * mlme_max_chan_switch_is_set() - Get if max chan switch IE is enabled + * @vdev: Object manager vdev pointer + * + * Return: True if max chan switch is enabled else false + */ +bool mlme_max_chan_switch_is_set(struct wlan_objmgr_vdev *vdev); + #endif diff --git a/umac/mlme/include/wlan_psoc_mlme.h b/umac/mlme/include/wlan_psoc_mlme.h index 5bd0e14cf4..f48eab0316 100644 --- a/umac/mlme/include/wlan_psoc_mlme.h +++ b/umac/mlme/include/wlan_psoc_mlme.h @@ -54,6 +54,7 @@ struct wlan_6ghz_rnr_global_cache { * @beamformee_cap:If dev is configured as BF capable * @bw_above_20_5ghz: BW greater than 20Mhz supprted for 5Ghz * @bw_above_20_24ghz: BW greater than 20Mhz supprted for 2.4Ghz + * @max_chan_switch_ie: If max channel switch IE is supported */ struct psoc_phy_config { uint8_t vdev_nss_24g; @@ -65,7 +66,8 @@ struct psoc_phy_config { vht_24G_cap:1, beamformee_cap:1, bw_above_20_5ghz:1, - bw_above_20_24ghz:1; + bw_above_20_24ghz:1, + max_chan_switch_ie:1; }; /** diff --git a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c index 176c3cbfa7..cdf78a3f47 100644 --- a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c +++ b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c @@ -26,6 +26,7 @@ #include #include #include +#include struct mlme_ext_ops *glbl_ops; mlme_get_global_ops_cb glbl_ops_cb; @@ -554,3 +555,21 @@ void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb) { glbl_ops_cb = ops_cb; } + +bool mlme_max_chan_switch_is_set(struct wlan_objmgr_vdev *vdev) +{ + struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev); + struct psoc_mlme_obj *mlme_psoc_obj; + struct psoc_phy_config *phy_config; + + if (!psoc) + return false; + + mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc); + if (!mlme_psoc_obj) + return false; + + phy_config = &mlme_psoc_obj->psoc_cfg.phy_config; + + return phy_config->max_chan_switch_ie; +} diff --git a/umac/mlme/psoc_mgr/dispatcher/src/wlan_psoc_mlme_api.c b/umac/mlme/psoc_mgr/dispatcher/src/wlan_psoc_mlme_api.c index f64eb45380..1f947b02e2 100644 --- a/umac/mlme/psoc_mgr/dispatcher/src/wlan_psoc_mlme_api.c +++ b/umac/mlme/psoc_mgr/dispatcher/src/wlan_psoc_mlme_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2021 The Linux Foundation. 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 above @@ -23,6 +23,7 @@ #include #include #include +#include "cfg_ucfg_api.h" struct psoc_mlme_obj *wlan_psoc_mlme_get_cmpt_obj(struct wlan_objmgr_psoc *psoc) { @@ -88,6 +89,8 @@ static void mlme_init_cfg(struct wlan_objmgr_psoc *psoc) return; wlan_cm_init_score_config(psoc, &mlme_psoc_obj->psoc_cfg.score_config); + mlme_psoc_obj->psoc_cfg.phy_config.max_chan_switch_ie = + cfg_get(psoc, CFG_MLME_MAX_CHAN_SWITCH_IE_ENABLE); } QDF_STATUS mlme_psoc_open(struct wlan_objmgr_psoc *psoc) diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c index fbe294cf8f..9e2334152d 100644 --- a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c +++ b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c @@ -24,6 +24,7 @@ #include "include/wlan_vdev_mlme.h" #include "vdev_mlme_sm.h" #include +#include /** * mlme_vdev_set_state() - set mlme state @@ -1357,8 +1358,9 @@ static bool mlme_vdev_subst_suspend_csa_restart_event(void *ctx, status = true; break; case WLAN_VDEV_SM_EV_CSA_COMPLETE: - if (mlme_vdev_is_newchan_no_cac(vdev_mlme) == - QDF_STATUS_SUCCESS) { + if ((mlme_vdev_is_newchan_no_cac(vdev_mlme) == + QDF_STATUS_SUCCESS) || + mlme_max_chan_switch_is_set(vdev_mlme->vdev)) { mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_START); mlme_vdev_sm_deliver_event(vdev_mlme,