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
このコミットが含まれているのは:
Gyanranjan Hazarika
2019-06-15 23:49:37 -07:00
committed by nshrivas
コミット 91005b0b3f

ファイルの表示

@@ -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);