From 8fbe1e4593c1532adf9cf37e7c8f3ab7e01d044c Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Fri, 11 Feb 2022 16:08:53 +0530 Subject: [PATCH] qcacld-3.0: Add ini support to disable regulatory channels Currently regulatory channels are disabled for QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_EXT vendor command event if ini coex_unsafe_chan_nb_user_prefer is not set and if STA operates on disabled channels which results in crash for STA interface in STA + SAP SCC case. Hence coex_unsafe_chan_reg_disable ini is controlled based on coex_unsafe_chan_nb_user_prefer. Ini behavior summary: |----------------|----------------------|-------------|--------------------------------| |User prefer ini | Reg chan disable ini | PLs | Expectation | | | | | | |----------------|----------------------|-------------|--------------------------------| | 1 | 1 | LE | accept freq ext command and | | | | | disable the regulatory channel| |----------------|----------------------|-------------|--------------------------------| | 0 | 0 | Non-Pixel SP| reject freq ext cmd driver and | | | | | returns NOT SUPP | |----------------|----------------------|-------------|--------------------------------| | 1 | 0 | Pixel SP | accept freq ext command and | | | | | Don't disable the reg channels| |----------------|----------------------|-------------|--------------------------------| Change-Id: Ia3acbc133cab4865d8ad69992e893be91439f856 CRs-Fixed: 3128908 --- components/mlme/core/src/wlan_mlme_main.c | 23 +++++++++++--- components/mlme/dispatcher/inc/cfg_mlme_reg.h | 31 ++++++++++++++++--- .../dispatcher/inc/wlan_mlme_public_struct.h | 3 ++ .../mlme/dispatcher/inc/wlan_mlme_ucfg_api.h | 18 +++++++++++ .../mlme/dispatcher/src/wlan_mlme_ucfg_api.c | 13 ++++++++ core/hdd/src/wlan_hdd_regulatory.c | 18 +++++++++++ 6 files changed, 96 insertions(+), 10 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 8fdc328402..cdc1ff6d26 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -2395,15 +2395,27 @@ static void mlme_init_acs_avoid_freq_list(struct wlan_objmgr_psoc *psoc, #endif #ifdef FEATURE_WLAN_CH_AVOID_EXT -static void mlme_init_unsafe_coex_cfg(struct wlan_objmgr_psoc *psoc, - struct wlan_mlme_reg *reg) +static void mlme_init_coex_unsafe_chan_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_reg *reg) { reg->coex_unsafe_chan_nb_user_prefer = cfg_get(psoc, CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER); } + +static void mlme_init_coex_unsafe_chan_reg_disable_cfg( + struct wlan_objmgr_psoc *psoc, struct wlan_mlme_reg *reg) +{ + reg->coex_unsafe_chan_reg_disable = + cfg_get(psoc, CFG_COEX_UNSAFE_CHAN_REG_DISABLE); +} #else -static void mlme_init_unsafe_coex_cfg(struct wlan_objmgr_psoc *psoc, - struct wlan_mlme_reg *reg) +static void mlme_init_coex_unsafe_chan_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_reg *reg) +{ +} + +static void mlme_init_coex_unsafe_chan_reg_disable_cfg( + struct wlan_objmgr_psoc *psoc, struct wlan_mlme_reg *reg) { } #endif @@ -2434,7 +2446,8 @@ static void mlme_init_reg_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN); mlme_init_acs_avoid_freq_list(psoc, reg); - mlme_init_unsafe_coex_cfg(psoc, reg); + mlme_init_coex_unsafe_chan_cfg(psoc, reg); + mlme_init_coex_unsafe_chan_reg_disable_cfg(psoc, reg); } static void diff --git a/components/mlme/dispatcher/inc/cfg_mlme_reg.h b/components/mlme/dispatcher/inc/cfg_mlme_reg.h index 42c005bedc..8fb184b2de 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_reg.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_reg.h @@ -349,18 +349,39 @@ * * */ -#define CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER CFG_INI_BOOL( \ +#define CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER CFG_INI_BOOL( \ "coex_unsafe_chan_nb_user_prefer", \ 0, \ "Honor coex unsafe freq event from firmware") -#define CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER_ALL \ - CFG(CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER) +/* + * + * coex_unsafe_chan_reg_disable - Used to disable reg channels + * for coex unsafe freq event + * + * @Min: 0 (Don't disable reg channels for coex unsafe chan event) + * @Max: 1 (Disable reg channels for coex unsafe chan event) + * Default: 0 + * + * This ini is used to disable reg channels for coex unsafe chan + * event + * Usage: External + * + * + */ +#define CFG_COEX_UNSAFE_CHAN_REG_DISABLE CFG_INI_BOOL( \ + "coex_unsafe_chan_reg_disable", \ + 0, \ + "Disable reg channels for coex unsafe chan event") + +#define CFG_COEX_UNSAFE_CHAN_ALL \ + CFG(CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER) \ + CFG(CFG_COEX_UNSAFE_CHAN_REG_DISABLE) #else -#define CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER_ALL +#define CFG_COEX_UNSAFE_CHAN_ALL #endif #define CFG_REG_ALL \ - CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER_ALL \ + CFG_COEX_UNSAFE_CHAN_ALL \ CFG(CFG_SELF_GEN_FRM_PWR) \ CFG(CFG_ENABLE_PENDING_CHAN_LIST_REQ) \ CFG(CFG_ENABLE_11D_IN_WORLD_MODE) \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 046acfbe69..a6122c4ae3 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -2464,6 +2464,8 @@ enum mlme_reg_srd_master_modes { * @enable_nan_on_indoor_channels: Enable nan on Indoor channels * @coex_unsafe_chan_nb_user_prefer: Honor coex unsafe freq event from firmware * or not + * @coex_unsafe_chan_reg_disable: To disable reg channels for received coex + * unsafe channels list */ struct wlan_mlme_reg { uint32_t self_gen_frm_pwr; @@ -2486,6 +2488,7 @@ struct wlan_mlme_reg { bool enable_nan_on_indoor_channels; #ifdef FEATURE_WLAN_CH_AVOID_EXT bool coex_unsafe_chan_nb_user_prefer; + bool coex_unsafe_chan_reg_disable; #endif }; diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index a512d58c8e..8eafc4ae90 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -4391,6 +4391,17 @@ ucfg_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc *psoc, */ bool ucfg_mlme_get_coex_unsafe_chan_nb_user_prefer( struct wlan_objmgr_psoc *psoc); + +/** + * ucfg_mlme_get_coex_unsafe_chan_reg_disable() - get reg disable cap for + * coex unsafe channels support + * @psoc: pointer to psoc object + * @value: pointer to the value which will be filled for the caller + * + * Return: coex_unsafe_chan_reg_disable + */ +bool ucfg_mlme_get_coex_unsafe_chan_reg_disable( + struct wlan_objmgr_psoc *psoc); #else static inline bool ucfg_mlme_get_coex_unsafe_chan_nb_user_prefer( @@ -4398,5 +4409,12 @@ bool ucfg_mlme_get_coex_unsafe_chan_nb_user_prefer( { return false; } + +static inline +bool ucfg_mlme_get_coex_unsafe_chan_reg_disable( + struct wlan_objmgr_psoc *psoc) +{ + return false; +} #endif #endif /* _WLAN_MLME_UCFG_API_H_ */ diff --git a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c index dd37ab42a5..5c292a0f91 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c @@ -1705,4 +1705,17 @@ bool ucfg_mlme_get_coex_unsafe_chan_nb_user_prefer( } return mlme_obj->cfg.reg.coex_unsafe_chan_nb_user_prefer; } + +bool ucfg_mlme_get_coex_unsafe_chan_reg_disable( + struct wlan_objmgr_psoc *psoc) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) { + mlme_legacy_err("Failed to get MLME Obj"); + return cfg_default(CFG_COEX_UNSAFE_CHAN_REG_DISABLE); + } + return mlme_obj->cfg.reg.coex_unsafe_chan_reg_disable; +} #endif diff --git a/core/hdd/src/wlan_hdd_regulatory.c b/core/hdd/src/wlan_hdd_regulatory.c index 334f20e38c..dd20e577eb 100644 --- a/core/hdd/src/wlan_hdd_regulatory.c +++ b/core/hdd/src/wlan_hdd_regulatory.c @@ -228,6 +228,16 @@ void hdd_update_coex_unsafe_chan_nb_user_prefer( ucfg_mlme_get_coex_unsafe_chan_nb_user_prefer( hdd_ctx->psoc); } + +static inline +void hdd_update_coex_unsafe_chan_reg_disable( + struct hdd_context *hdd_ctx, + struct reg_config_vars *config_vars) +{ + config_vars->coex_unsafe_chan_reg_disable = + ucfg_mlme_get_coex_unsafe_chan_reg_disable( + hdd_ctx->psoc); +} #else static inline void hdd_update_coex_unsafe_chan_nb_user_prefer( @@ -235,6 +245,13 @@ void hdd_update_coex_unsafe_chan_nb_user_prefer( struct reg_config_vars *config_vars) { } + +static inline +void hdd_update_coex_unsafe_chan_reg_disable( + struct hdd_context *hdd_ctx, + struct reg_config_vars *config_vars) +{ +} #endif static void reg_program_config_vars(struct hdd_context *hdd_ctx, @@ -303,6 +320,7 @@ static void reg_program_config_vars(struct hdd_context *hdd_ctx, config_vars->enable_5dot9_ghz_chan_in_master_mode = enable_5dot9_ghz_chan; hdd_update_coex_unsafe_chan_nb_user_prefer(hdd_ctx, config_vars); + hdd_update_coex_unsafe_chan_reg_disable(hdd_ctx, config_vars); } /**