From 91005b0b3fd6815b963cf01d9dca1934e2a30c2a Mon Sep 17 00:00:00 2001 From: Gyanranjan Hazarika Date: Sat, 15 Jun 2019 23:49:37 -0700 Subject: [PATCH] qcacmn: Add WAR for DBS mode phy0 band limitation The limitation of having a single BDF for both DBS (2 radio) and DBS_SBS (3 radio) capable board is leading to FW sending per-phy band-to-mac mapping as regulatory capability as part of service_ext_ready. The boards which have the capability of switching between DBS and DBS_SBS modes through init-time (INI) file configuration are limited to 5G upper bound only even in DBS mode becasue of the above constraint. This WAR overwrites, in psoc-reg_cap, phy0 low or phy0 high frequency depending on whether it is mapped to upper or lower 5G band by FW/hal-phy. Change-Id: I65ab1b803f652cf6b636cd885c6c0afd2251b0ce CRs-Fixed: 2465391 --- .../init_deinit/src/service_ready_util.c | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/target_if/init_deinit/src/service_ready_util.c b/target_if/init_deinit/src/service_ready_util.c index 4c4e3ee86de4..1a2837a07eee 100644 --- a/target_if/init_deinit/src/service_ready_util.c +++ b/target_if/init_deinit/src/service_ready_util.c @@ -505,6 +505,54 @@ QDF_STATUS init_deinit_spectral_scaling_params_free( qdf_export_symbol(init_deinit_spectral_scaling_params_free); +#ifdef DBS_SBS_BAND_LIMITATION_WAR +#define phy0 0 +#define phy2 2 +#define NUM_RF_MODES 2 /* (DBS + DBS_SBS) */ +/** + * init_deinit_update_phy_reg_cap() - Update the low/high frequency for phy0. + * @psoc: PSOC common object + * @info: FW or lower layer related info + * @wlan_psoc_host_hal_reg_capabilities_ext: Reg caps per PHY + * + * For the DBS_SBS capable board, update the low or high frequency + * for phy0 by leveraging the frequency populated for phy2 + * depending on whether it is mapped to upper or lower 5G band by + * FW/HAL-PHY. + */ +static void init_deinit_update_phy_reg_cap(struct wlan_objmgr_psoc *psoc, + struct tgt_info *info, + struct wlan_psoc_host_hal_reg_capabilities_ext *reg_cap) +{ + struct target_psoc_info *tgt_hdl; + enum wmi_host_hw_mode_config_type mode; + + tgt_hdl = (struct target_psoc_info *)wlan_psoc_get_tgt_if_handle( + psoc); + if (!tgt_hdl) { + target_if_err("target_psoc_info is null in service ready ev"); + return; + } + + mode = target_psoc_get_preferred_hw_mode(tgt_hdl); + + if ((mode == WMI_HOST_HW_MODE_DBS) && + (info->hw_modes.num_modes == NUM_RF_MODES)) { + if (reg_cap[phy0].low_5ghz_chan > reg_cap[phy2].low_5ghz_chan) + reg_cap[phy0].low_5ghz_chan = reg_cap[phy2].low_5ghz_chan; + else if (reg_cap[phy0].high_5ghz_chan < reg_cap[phy2].high_5ghz_chan) + reg_cap[phy0].high_5ghz_chan = reg_cap[phy2].high_5ghz_chan; + } + +} +#else +static void init_deinit_update_phy_reg_cap(struct wlan_objmgr_psoc *psoc, + struct tgt_info *info, + struct wlan_psoc_host_hal_reg_capabilities_ext *reg_cap) +{ +} +#endif + int init_deinit_populate_phy_reg_cap(struct wlan_objmgr_psoc *psoc, void *handle, uint8_t *event, struct tgt_info *info, bool service_ready) @@ -548,6 +596,7 @@ int init_deinit_populate_phy_reg_cap(struct wlan_objmgr_psoc *psoc, } } + init_deinit_update_phy_reg_cap(psoc, info, reg_cap); status = ucfg_reg_set_hal_reg_cap(psoc, reg_cap, num_phy_reg_cap); return qdf_status_to_os_return(status);