From 571f0d3e653463f99364deecb04ddca366769361 Mon Sep 17 00:00:00 2001 From: Kiran Kumar Lokere Date: Tue, 19 Nov 2019 19:38:31 -0800 Subject: [PATCH] qcacld-3.0: Add 80+80 restricted BW support Add support for restricted 80+80 bandwidth in STA and SAP modes. Change-Id: Id1a61b853584fa84db3bb8f0f2aaf68eecabeaac CRs-Fixed: 2570023 --- .../dispatcher/inc/wlan_mlme_public_struct.h | 1 + .../mlme/dispatcher/inc/wlan_mlme_ucfg_api.h | 18 +++++++++++++ .../mlme/dispatcher/src/wlan_mlme_ucfg_api.c | 27 +++++++++++++++++++ core/hdd/src/wlan_hdd_hostapd.c | 14 ++++++++++ core/hdd/src/wlan_hdd_main.c | 5 ++++ core/mac/src/pe/lim/lim_prop_exts_utils.c | 17 ++++++++++++ core/wma/inc/wma_tgt_cfg.h | 2 ++ core/wma/src/wma_main.c | 21 ++++++++++++++- 8 files changed, 104 insertions(+), 1 deletion(-) diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index f05b23ef3754..7b3c0670bb73 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -844,6 +844,7 @@ struct mlme_vht_capabilities_info { uint8_t extended_nss_bw_supp; uint8_t vht_extended_nss_bw_cap; uint8_t max_nsts_total; + bool restricted_80p80_bw_supp; }; /** diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index 401633fd7f94..0abca96b1cd7 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -3833,6 +3833,24 @@ QDF_STATUS ucfg_mlme_set_obss_color_collision_offload_enabled( struct wlan_objmgr_psoc *psoc, uint8_t value); +/** + * ucfg_mlme_set_restricted_80p80_bw_supp() - Set the restricted 80p80 support + * @psoc: pointer to psoc object + * @restricted_80p80_supp: Value to be set from the caller + * + * Return: QDF Status + */ +QDF_STATUS ucfg_mlme_set_restricted_80p80_bw_supp(struct wlan_objmgr_psoc *psoc, + bool restricted_80p80_supp); + +/** + * ucfg_mlme_get_restricted_80p80_bw_supp() - Get the restricted 80p80 support + * @psoc: pointer to psoc object + * + * Return: true or false + */ +bool ucfg_mlme_get_restricted_80p80_bw_supp(struct wlan_objmgr_psoc *psoc); + /** * ucfg_mlme_get_channel_bonding_24ghz() - get channel bonding mode of 24ghz * @psoc: pointer to psoc object diff --git a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c index 214896ad66bc..2ed7543ec516 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c @@ -1720,6 +1720,33 @@ ucfg_mlme_set_obss_color_collision_offload_enabled( return QDF_STATUS_SUCCESS; } +QDF_STATUS ucfg_mlme_set_restricted_80p80_bw_supp(struct wlan_objmgr_psoc *psoc, + bool restricted_80p80_supp) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return QDF_STATUS_E_INVAL; + + mlme_obj->cfg.vht_caps.vht_cap_info.restricted_80p80_bw_supp = + restricted_80p80_supp; + + return QDF_STATUS_SUCCESS; +} + +bool ucfg_mlme_get_restricted_80p80_bw_supp(struct wlan_objmgr_psoc *psoc) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + + if (!mlme_obj) + return true; + + return mlme_obj->cfg.vht_caps.vht_cap_info.restricted_80p80_bw_supp; +} + QDF_STATUS ucfg_mlme_get_channel_bonding_24ghz(struct wlan_objmgr_psoc *psoc, uint32_t *val) diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 682314f9d6bd..fc2ed3373a5f 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -3712,6 +3712,8 @@ int wlan_hdd_set_channel(struct wiphy *wiphy, sap_config = &((WLAN_HDD_GET_AP_CTX_PTR(adapter))->sap_config); sap_config->chan_freq = chandef->chan->center_freq; sap_config->ch_params.center_freq_seg1 = channel_seg2; + sap_config->ch_params.center_freq_seg0 = + ieee80211_frequency_to_channel(chandef->center_freq1); if (QDF_SAP_MODE == adapter->device_mode) { /* set channel to what hostapd configured */ @@ -5433,6 +5435,18 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter, } config->ch_params.ch_width = config->ch_width_orig; + if ((config->ch_params.ch_width == CH_WIDTH_80P80MHZ) && + ucfg_mlme_get_restricted_80p80_bw_supp(hdd_ctx->psoc)) { + if (!((config->ch_params.center_freq_seg0 == 138 && + config->ch_params.center_freq_seg1 == 155) || + (config->ch_params.center_freq_seg1 == 138 && + config->ch_params.center_freq_seg0 == 155))) { + config->ch_params.center_freq_seg1 = 0; + config->ch_width_orig = CH_WIDTH_80MHZ; + config->ch_params.ch_width = config->ch_width_orig; + } + } + wlan_reg_set_channel_params_for_freq(hdd_ctx->pdev, config->chan_freq, config->sec_ch_freq, &config->ch_params); diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 2b7f242a92d0..ae4cf4acb3a7 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2207,6 +2207,11 @@ int hdd_update_tgt_cfg(hdd_handle_t hdd_handle, struct wma_tgt_cfg *cfg) hdd_err("set tx_bfee_ant_supp failed"); } + status = ucfg_mlme_set_restricted_80p80_bw_supp(hdd_ctx->psoc, + cfg->restricted_80p80_bw_supp); + if (QDF_IS_STATUS_ERROR(status)) + hdd_err("Failed to set MLME restircted 80p80 BW support"); + if ((value > MLME_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_FW_DEF) && !cfg->tx_bfee_8ss_enabled) { status = ucfg_mlme_cfg_set_vht_tx_bfee_ant_supp(hdd_ctx->psoc, diff --git a/core/mac/src/pe/lim/lim_prop_exts_utils.c b/core/mac/src/pe/lim/lim_prop_exts_utils.c index 2b4b55f2c5bc..793549e92139 100644 --- a/core/mac/src/pe/lim/lim_prop_exts_utils.c +++ b/core/mac/src/pe/lim/lim_prop_exts_utils.c @@ -315,6 +315,7 @@ void lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie, uint8_t chan_center_freq_seg1; tDot11fIEVHTCaps *vht_caps; uint8_t channel = 0; + struct mlme_vht_capabilities_info *mlme_vht_cap; beacon_struct = qdf_mem_malloc(sizeof(tSirProbeRespBeacon)); if (!beacon_struct) @@ -332,6 +333,7 @@ void lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie, return; } + mlme_vht_cap = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info; if (beacon_struct->wmeInfoPresent || beacon_struct->wmeEdcaPresent || beacon_struct->HTCaps.present) @@ -405,6 +407,21 @@ void lim_extract_ap_capability(struct mac_context *mac_ctx, uint8_t *p_ie, fw_vht_ch_wd = wma_get_vht_ch_width(); vht_ch_wd = QDF_MIN(fw_vht_ch_wd, ap_bcon_ch_width); + + if ((vht_ch_wd > WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) && + (ap_bcon_ch_width == + WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ) && + mlme_vht_cap->restricted_80p80_bw_supp) { + if ((chan_center_freq_seg1 == 138 && + vht_op->chan_center_freq_seg0 == 155) || + (vht_op->chan_center_freq_seg0 == 138 && + chan_center_freq_seg1 == 155)) + vht_ch_wd = + WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ; + else + vht_ch_wd = + WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ; + } /* * If the supported channel width is greater than 80MHz and * AP supports Nss > 1 in 160MHz mode then connect the STA diff --git a/core/wma/inc/wma_tgt_cfg.h b/core/wma/inc/wma_tgt_cfg.h index 43b99febab78..e3304a5ed4e5 100644 --- a/core/wma/inc/wma_tgt_cfg.h +++ b/core/wma/inc/wma_tgt_cfg.h @@ -175,6 +175,7 @@ struct board_info { * @obss_color_collision_offloaded: obss color collision offloaded to firmware * @sar_version: Version of SAR supported by firmware * @bcast_twt_support: braodcast twt support + * @restricted_80p80_bw_supp: Restricted 80+80MHz(165MHz BW) support */ struct wma_tgt_cfg { uint32_t target_fw_version; @@ -215,5 +216,6 @@ struct wma_tgt_cfg { enum sar_version sar_version; struct nan_tgt_caps nan_caps; bool bcast_twt_support; + bool restricted_80p80_bw_supp; }; #endif /* WMA_TGT_CFG_H */ diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index dec2d1e615f1..aff8a8b5aa0d 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -5177,6 +5177,25 @@ static void wma_update_obss_color_collision_support(tp_wma_handle wh, tgt_cfg->obss_color_collision_offloaded = false; } +/** + * wma_update_restricted_80p80_bw_support() - update restricted 80+80 supprot + * @wh: wma handle + * @tgt_cfg: target configuration to be updated + * + * Update restricted 80+80MHz (165MHz) BW support based on service bit. + * + * Return: None + */ +static void wma_update_restricted_80p80_bw_support(tp_wma_handle wh, + struct wma_tgt_cfg *tgt_cfg) +{ + if (wmi_service_enabled(wh->wmi_handle, + wmi_service_bw_165mhz_support)) + tgt_cfg->restricted_80p80_bw_supp = true; + else + tgt_cfg->restricted_80p80_bw_supp = false; +} + #ifdef WLAN_SUPPORT_GREEN_AP static void wma_green_ap_register_handlers(tp_wma_handle wma_handle) { @@ -5421,7 +5440,7 @@ static int wma_update_hdd_cfg(tp_wma_handle wma_handle) wma_update_hdd_cfg_ndp(wma_handle, &tgt_cfg); wma_update_nan_target_caps(wma_handle, &tgt_cfg); wma_update_bcast_twt_support(wma_handle, &tgt_cfg); - + wma_update_restricted_80p80_bw_support(wma_handle, &tgt_cfg); /* Take the max of chains supported by FW, which will limit nss */ for (i = 0; i < tgt_hdl->info.total_mac_phy_cnt; i++) wma_fill_chain_cfg(tgt_hdl, i);