Merge 74058400d1 on remote branch

Change-Id: I5227828de0d58f35102a95d4eb6bbfca3087bbec
This commit is contained in:
Linux Build Service Account 2023-10-09 05:24:38 -07:00
commit 1535fc8bf4
37 changed files with 705 additions and 345 deletions

View file

@ -2097,7 +2097,8 @@ static bool policy_mgr_valid_sta_channel_check(struct wlan_objmgr_psoc *psoc,
!sta_sap_scc_on_dfs_chan) ||
wlan_reg_is_passive_or_disable_for_freq(
pm_ctx->pdev, sta_ch_freq) ||
!policy_mgr_is_safe_channel(psoc, sta_ch_freq)) {
(!policy_mgr_sta_sap_scc_on_lte_coex_chan(psoc) &&
!policy_mgr_is_safe_channel(psoc, sta_ch_freq))) {
if (policy_mgr_is_hw_dbs_capable(psoc))
return true;
else

View file

@ -2324,11 +2324,15 @@ policy_mgr_add_24g_to_pcl(uint32_t *pcl_freqs, uint8_t *pcl_weights,
{
uint32_t num_to_add, i;
if (*index >= NUM_CHANNELS || *index >= pcl_sz)
return;
num_to_add = QDF_MIN((*index + chlist_24g_len), pcl_sz) - *index;
qdf_mem_copy(&pcl_freqs[*index], chlist_24g,
num_to_add * sizeof(*chlist_24g));
for (i = *index; i < *index + num_to_add; i++)
pcl_weights[i] = weight;
for (i = 0; i < num_to_add; i++) {
if ((i + *index) >= NUM_CHANNELS || (i + *index) >= pcl_sz)
break;
pcl_weights[i + *index] = weight;
pcl_freqs[i + *index] = chlist_24g[i];
}
*index = i;
policy_mgr_debug("Add 24g chlist len %d len %d index %d",

View file

@ -36,6 +36,7 @@
#include "wlan_mlme_ucfg_api.h"
#include "csr_neighbor_roam.h"
#include "wlan_scan_api.h"
#include <wlan_reg_ucfg_api.h>
/**
* first_connection_pcl_table - table which provides PCL for the
@ -733,6 +734,96 @@ policy_mgr_modify_pcl_based_on_indoor(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
/**
* policy_mgr_modify_sap_pcl_for_6G_channels() - filter out the
* 6GHz channels where SCC is not supported.
* @psoc: pointer to soc
* @pcl_list_org: channel list to filter out
* @weight_list_org: weight of channel list
* @pcl_len_org: length of channel list
*
* Return: QDF_STATUS
*/
static QDF_STATUS
policy_mgr_modify_sap_pcl_for_6G_channels(struct wlan_objmgr_psoc *psoc,
uint32_t *pcl_list_org,
uint8_t *weight_list_org,
uint32_t *pcl_len_org)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
uint32_t pcl_list[NUM_CHANNELS];
uint8_t weight_list[NUM_CHANNELS];
uint32_t vdev_id = 0, pcl_len = 0, i;
struct wlan_objmgr_vdev *vdev;
qdf_freq_t sta_gc_freq = 0;
uint32_t ap_pwr_type_6g = 0;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
if (*pcl_len_org > NUM_CHANNELS) {
policy_mgr_err("Invalid PCL List Length %d", *pcl_len_org);
return QDF_STATUS_E_FAILURE;
}
if (policy_mgr_mode_specific_connection_count(psoc,
PM_STA_MODE, NULL)) {
sta_gc_freq =
policy_mgr_mode_specific_get_channel(psoc, PM_STA_MODE);
vdev_id = policy_mgr_mode_specific_vdev_id(psoc, PM_STA_MODE);
} else if (policy_mgr_mode_specific_connection_count(psoc,
PM_P2P_CLIENT_MODE,
NULL)) {
sta_gc_freq = policy_mgr_mode_specific_get_channel(
psoc, PM_P2P_CLIENT_MODE);
vdev_id = policy_mgr_mode_specific_vdev_id(psoc,
PM_P2P_CLIENT_MODE);
}
if (!sta_gc_freq || !WLAN_REG_IS_6GHZ_CHAN_FREQ(sta_gc_freq))
return QDF_STATUS_SUCCESS;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_POLICY_MGR_ID);
if (!vdev) {
policy_mgr_err("vdev %d is not present", vdev_id);
return QDF_STATUS_E_FAILURE;
}
/* If STA is present in 6GHz, STA+SAP SCC is allowed
* only on PSC channels in VLP mode. Therefore, remove
* all other 6GHz channels from the PCL list.
*
* VLP STA in PSC + SAP - Allowed
* VLP STA in non-PSC + SAP - Not allowed
* non-VLP STA + SAP - Not allowed
*/
ucfg_reg_get_cur_6g_ap_pwr_type(pm_ctx->pdev, &ap_pwr_type_6g);
policy_mgr_debug("STA power type : %d", ap_pwr_type_6g);
for (i = 0; i < *pcl_len_org; i++) {
if (WLAN_REG_IS_6GHZ_CHAN_FREQ(pcl_list_org[i])) {
if (ap_pwr_type_6g != REG_VERY_LOW_POWER_AP)
continue;
else if (!WLAN_REG_IS_6GHZ_PSC_CHAN_FREQ(pcl_list_org[i]))
continue;
}
pcl_list[pcl_len] = pcl_list_org[i];
weight_list[pcl_len++] = weight_list_org[i];
}
qdf_mem_zero(pcl_list_org, *pcl_len_org * sizeof(*pcl_list_org));
qdf_mem_zero(weight_list_org, *pcl_len_org * sizeof(*weight_list_org));
qdf_mem_copy(pcl_list_org, pcl_list, pcl_len * sizeof(*pcl_list_org));
qdf_mem_copy(weight_list_org, weight_list, pcl_len);
*pcl_len_org = pcl_len;
wlan_objmgr_vdev_release_ref(vdev, WLAN_POLICY_MGR_ID);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS policy_mgr_pcl_modification_for_sap(
struct wlan_objmgr_psoc *psoc,
uint32_t *pcl_channels, uint8_t *pcl_weight,
@ -793,6 +884,14 @@ static QDF_STATUS policy_mgr_pcl_modification_for_sap(
}
indoor_modified_pcl = true;
status = policy_mgr_modify_sap_pcl_for_6G_channels(psoc,
pcl_channels,
pcl_weight, len);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("failed to modify pcl for 6G channels");
return status;
}
modified_final_pcl = true;
policy_mgr_debug(" %d %d %d %d %d",
mandatory_modified_pcl,
@ -1031,6 +1130,8 @@ QDF_STATUS policy_mgr_get_pcl(struct wlan_objmgr_psoc *psoc,
policy_mgr_dump_channel_list(*len, pcl_channels, pcl_weight);
policy_mgr_debug("PCL before modification");
policy_mgr_dump_channel_list(*len, pcl_channels, pcl_weight);
policy_mgr_mode_specific_modification_on_pcl(
psoc, pcl_channels, pcl_weight, len, mode);
@ -1041,6 +1142,10 @@ QDF_STATUS policy_mgr_get_pcl(struct wlan_objmgr_psoc *psoc,
policy_mgr_err("failed to get modified pcl based on DNBS");
return status;
}
policy_mgr_debug("PCL after modification");
policy_mgr_dump_channel_list(*len, pcl_channels, pcl_weight);
return QDF_STATUS_SUCCESS;
}

View file

@ -1468,6 +1468,16 @@ QDF_STATUS
wlan_mlme_cfg_set_vht_max_mpdu_len(struct wlan_objmgr_psoc *psoc,
uint8_t value);
/**
* wlan_mlme_cfg_get_ht_smps() - gets HT SM Power Save mode from cfg item
* @psoc: psoc context
* @value: data to be set
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc *psoc,
uint8_t *value);
/**
* wlan_mlme_cfg_get_vht_chan_width() - gets vht supported channel width from
* cfg item

View file

@ -4262,4 +4262,24 @@ ucfg_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc)
return wlan_mlme_is_sta_mon_conc_supported(psoc);
}
static inline QDF_STATUS
ucfg_mlme_cfg_get_vht_ampdu_len_exp(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
return wlan_mlme_cfg_get_vht_ampdu_len_exp(psoc, value);
}
static inline QDF_STATUS
ucfg_mlme_cfg_get_vht_max_mpdu_len(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
return wlan_mlme_cfg_get_vht_max_mpdu_len(psoc, value);
}
static inline QDF_STATUS
ucfg_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
return wlan_mlme_cfg_get_ht_smps(psoc, value);
}
#endif /* _WLAN_MLME_UCFG_API_H_ */

View file

@ -1314,6 +1314,48 @@ QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_sus_intv(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_cfg_get_vht_ampdu_len_exp(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_FAILURE;
*value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len_exponent;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_cfg_get_vht_max_mpdu_len(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_FAILURE;
*value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_FAILURE;
*value = mlme_obj->cfg.ht_caps.smps;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_wmm_dir_ac_vi(struct wlan_objmgr_psoc *psoc, uint8_t *value)
{

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -59,12 +59,12 @@ struct pkt_capture_cb_context {
* @cb_ctx: pointer to packet capture mon callback context
* @frame_filter: config filter set by vendor command
* @cfg_params: packet capture config params
* @rx_avg_rssi: avg rssi of rx data packets
* @ppdu_stats_q: list used for storing smu related ppdu stats
* @lock_q: spinlock for ppdu_stats q
* @tx_nss: nss of tx data packets received from ppdu stats
* @last_freq: Last connected freq
* @curr_freq: current connected freq
* @rx_vht_sgi: guard interval of vht rx packet
*/
struct pkt_capture_vdev_priv {
struct wlan_objmgr_vdev *vdev;
@ -72,12 +72,12 @@ struct pkt_capture_vdev_priv {
struct pkt_capture_cb_context *cb_ctx;
struct pkt_capture_frame_filter frame_filter;
struct pkt_capture_cfg cfg_params;
int32_t rx_avg_rssi;
qdf_list_t ppdu_stats_q;
qdf_spinlock_t lock_q;
uint8_t tx_nss;
qdf_freq_t last_freq;
qdf_freq_t curr_freq;
uint8_t rx_vht_sgi;
};
/**

View file

@ -687,6 +687,7 @@ static void pkt_capture_rx_get_phy_info(void *context, void *psoc,
struct dp_soc *soc = psoc;
hal_soc_handle_t hal_soc;
struct wlan_objmgr_vdev *vdev = context;
struct pkt_capture_vdev_priv *vdev_priv;
hal_soc = soc->hal_soc;
preamble_type = hal_rx_msdu_start_get_pkt_type(rx_tlv_hdr);
@ -694,6 +695,7 @@ static void pkt_capture_rx_get_phy_info(void *context, void *psoc,
bw = hal_rx_msdu_start_bw_get(rx_tlv_hdr);
mcs = hal_rx_msdu_start_rate_mcs_get(rx_tlv_hdr);
sgi = hal_rx_msdu_start_sgi_get(rx_tlv_hdr);
vdev_priv = pkt_capture_vdev_get_priv(vdev);
switch (preamble_type) {
case HAL_RX_PKT_TYPE_11A:
@ -712,6 +714,7 @@ static void pkt_capture_rx_get_phy_info(void *context, void *psoc,
rx_status->ht_mcs = mcs;
break;
case HAL_RX_PKT_TYPE_11AC:
sgi = vdev_priv->rx_vht_sgi;
rx_status->vht_flags = 1;
rx_status->vht_flag_values3[0] = mcs << 0x4 | nss;
bw = vdev->vdev_mlme.des_chan->ch_width;

View file

@ -83,7 +83,7 @@ struct mgmt_offload_event_params {
struct smu_event_params {
uint32_t vdev_id;
int32_t rx_avg_rssi;
uint8_t rx_vht_sgi;
};
/**

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. 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
@ -222,7 +222,7 @@ tgt_pkt_capture_smu_event(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_E_FAILURE;
}
vdev_priv->rx_avg_rssi = param->rx_avg_rssi;
vdev_priv->rx_vht_sgi = param->rx_vht_sgi;
pkt_capture_vdev_put_ref(vdev);

View file

@ -1901,6 +1901,7 @@ QDF_STATUS dp_fisa_rx(struct dp_soc *soc, struct dp_vdev *vdev,
struct dp_fisa_rx_sw_ft *fisa_flow;
int fisa_ret;
uint8_t rx_ctx_id = QDF_NBUF_CB_RX_CTX_ID(nbuf_list);
uint32_t tlv_reo_dest_ind;
head_nbuf = nbuf_list;
@ -1929,6 +1930,17 @@ QDF_STATUS dp_fisa_rx(struct dp_soc *soc, struct dp_vdev *vdev,
qdf_nbuf_push_head(head_nbuf, RX_PKT_TLVS_LEN +
QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(head_nbuf));
hal_rx_msdu_get_reo_destination_indication(soc->hal_soc,
(uint8_t *)qdf_nbuf_data(head_nbuf),
&tlv_reo_dest_ind);
/* Skip FISA aggregation and drop the frame if RDI is REO2TCL */
if (qdf_unlikely(tlv_reo_dest_ind == REO_REMAP_TCL)) {
qdf_nbuf_free(head_nbuf);
head_nbuf = next_nbuf;
DP_STATS_INC(dp_fisa_rx_hdl, incorrect_rdi, 1);
continue;
}
/* Add new flow if the there is no ongoing flow */
fisa_flow = dp_rx_get_fisa_flow(dp_fisa_rx_hdl, vdev,
head_nbuf);

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -273,6 +274,17 @@ struct hdd_adapter *hdd_get_sta_connection_in_progress(
*/
void hdd_abort_ongoing_sta_connection(struct hdd_context *hdd_ctx);
/**
* hdd_abort_ongoing_sta_sae_connection() - Disconnect the sta for which the
* sae connection is in progress.
* @hdd_ctx: hdd context
* @adapter: pointer to the adapter
*
* Return: none
*/
void hdd_abort_ongoing_sta_sae_connection(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter);
/**
* hdd_is_any_sta_connected() - check if any sta in connected state
* @hdd_ctx: hdd context

View file

@ -460,6 +460,47 @@ void hdd_abort_ongoing_sta_connection(struct hdd_context *hdd_ctx)
}
}
void hdd_abort_ongoing_sta_sae_connection(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter)
{
struct hdd_adapter *sta_adapter;
struct wlan_objmgr_vdev *vdev;
int32_t key_mgmt;
QDF_STATUS status;
sta_adapter = hdd_get_sta_connection_in_progress(hdd_ctx);
if (!sta_adapter) {
hdd_err("sta_adapter is NULL");
return;
}
vdev = hdd_objmgr_get_vdev(adapter);
if (!vdev) {
hdd_err("vdev is NULL");
return;
}
key_mgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
hdd_objmgr_put_vdev(vdev);
if (key_mgmt < 0) {
hdd_debug_rl("Invalid key_mgmt: %d", key_mgmt);
return;
}
if (QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_SAE) ||
QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_SAE)) {
hdd_debug("Disconnecting STA on vdev: %d",
sta_adapter->vdev_id);
status = wlan_hdd_disconnect(sta_adapter,
eCSR_DISCONNECT_REASON_DEAUTH,
REASON_DISASSOC_NETWORK_LEAVING);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("wlan_hdd_disconnect failed, status: %d",
status);
}
}
bool hdd_is_any_sta_connected(struct hdd_context *hdd_ctx)
{
struct hdd_adapter *adapter = NULL, *next_adapter = NULL;

View file

@ -5274,6 +5274,21 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
}
}
/*
* For STA+SAP/GO concurrency support from GUI, In case if
* START AP/GO request comes just before the SAE authentication
* completion on STA, SAE AUTH REQ waits for START AP RSP and
* START AP RSP waits to complete SAE AUTH REQ.
* Driver completes START AP RSP only upon SAE AUTH REQ timeout(5 sec)
* as start ap will be in serialization pending queue, and SAE auth
* sequence cannot complete as hostap thread is blocked in start ap
* cfg80211 ops.
* To avoid above deadlock until SAE timeout, abort the SAE connection
* immediately and complete START AP/GO asap so that the upper layer
* can trigger a fresh connection after START AP/GO completion.
*/
hdd_abort_ongoing_sta_sae_connection(hdd_ctx, adapter);
mac_handle = hdd_ctx->mac_handle;
sme_config = qdf_mem_malloc(sizeof(*sme_config));
@ -6043,6 +6058,21 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
goto exit;
}
/*
* For STA+SAP/GO concurrency support from GUI, In case if
* STOP AP/GO request comes just before the SAE authentication
* completion on STA, SAE AUTH REQ waits for STOP AP RSP and
* STOP AP RSP waits to complete SAE AUTH REQ.
* Driver completes STOP AP RSP only upon SAE AUTH REQ timeout(5 sec)
* as stop ap will be in serialization pending queue, and SAE auth
* sequence cannot complete as hostap thread is blocked in stop ap
* cfg80211 ops.
* To avoid above deadlock until SAE timeout, abort the SAE connection
* immediately and complete STOP AP/GO asap so that the upper layer
* can trigger a fresh connection after STOP AP/GO completion.
*/
hdd_abort_ongoing_sta_sae_connection(hdd_ctx, adapter);
/* Clear SOFTAP_INIT_DONE flag to mark stop_ap deinit. So that we do
* not restart SAP after SSR as SAP is already stopped from user space.
* This update is moved to start of this function to resolve stop_ap

View file

@ -201,6 +201,7 @@
#ifdef WLAN_FEATURE_DYNAMIC_RX_AGGREGATION
#include <net/pkt_cls.h>
#endif
#include <linux/bitfield.h>
#ifdef MODULE
#ifdef WLAN_WEAR_CHIPSET
@ -2255,6 +2256,42 @@ static void hdd_extract_fw_version_info(struct hdd_context *hdd_ctx)
#if defined(WLAN_FEATURE_11AX) && \
(defined(CFG80211_SBAND_IFTYPE_DATA_BACKPORT) || \
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)))
#if defined(CONFIG_BAND_6GHZ) && (defined(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START))
static void hdd_update_wiphy_he_6ghz_capa(struct hdd_context *hdd_ctx)
{
uint16_t he_6ghz_capa = 0;
uint8_t min_mpdu_start_spacing;
uint8_t max_ampdu_len_exp;
uint8_t max_mpdu_len;
uint8_t sm_pow_save;
ucfg_mlme_get_ht_mpdu_density(hdd_ctx->psoc, &min_mpdu_start_spacing);
he_6ghz_capa |= FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
min_mpdu_start_spacing);
ucfg_mlme_cfg_get_vht_ampdu_len_exp(hdd_ctx->psoc, &max_ampdu_len_exp);
he_6ghz_capa |= FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
max_ampdu_len_exp);
ucfg_mlme_cfg_get_vht_max_mpdu_len(hdd_ctx->psoc, &max_mpdu_len);
he_6ghz_capa |= FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN,
max_mpdu_len);
ucfg_mlme_cfg_get_ht_smps(hdd_ctx->psoc, &sm_pow_save);
he_6ghz_capa |= FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS, sm_pow_save);
he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
hdd_ctx->iftype_data_6g->he_6ghz_capa.capa = he_6ghz_capa;
}
#else
static inline void hdd_update_wiphy_he_6ghz_capa(struct hdd_context *hdd_ctx)
{
}
#endif
#if defined(CONFIG_BAND_6GHZ) && (defined(CFG80211_6GHZ_BAND_SUPPORTED) || \
(KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE))
static void
@ -2295,6 +2332,8 @@ hdd_update_wiphy_he_caps_6ghz(struct hdd_context *hdd_ctx,
if (he_cap_cfg->twt_responder)
mac_info_6g[0] |= IEEE80211_HE_MAC_CAP0_TWT_RES;
hdd_update_wiphy_he_6ghz_capa(hdd_ctx);
band_6g->iftype_data = hdd_ctx->iftype_data_6g;
}
#else
@ -9696,7 +9735,6 @@ void hdd_prevent_suspend_timeout(uint32_t timeout, uint32_t reason)
QDF_STATUS hdd_set_sme_chan_list(struct hdd_context *hdd_ctx)
{
return sme_init_chan_list(hdd_ctx->mac_handle,
hdd_ctx->reg.alpha2,
hdd_ctx->reg.cc_src);
}

View file

@ -32,9 +32,9 @@
#define QWLAN_VERSION_MAJOR 2
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 8
#define QWLAN_VERSION_EXTRA "M"
#define QWLAN_VERSION_EXTRA "V"
#define QWLAN_VERSION_BUILD 33
#define QWLAN_VERSIONSTR "2.0.8.33M"
#define QWLAN_VERSIONSTR "2.0.8.33V"
#endif /* QWLAN_VERSION_H */

View file

@ -1,6 +1,7 @@
/*
* Copyright (c) 2006-2007, 2014-2018, 2020-2021 The Linux Foundation.
* All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -3861,6 +3862,7 @@ FRAME AssocResponse // 7.2.3.5
OPTIE P2PAssocRes;
OPTIE VHTCaps;
OPTIE VHTOperation;
OPTIE OperatingMode;
OPTIE ExtCap;
OPTIE OBSSScanParameters;
OPTIE QosMapSet;
@ -3950,6 +3952,7 @@ FRAME ReAssocResponse // 7.2.3.7
OPTIE P2PAssocRes;
OPTIE VHTCaps;
OPTIE VHTOperation;
OPTIE OperatingMode;
OPTIE ExtCap;
OPTIE OBSSScanParameters;
OPTIE QosMapSet;

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -26,7 +27,7 @@
*
*
* This file was automatically generated by 'framesc'
* Wed Sep 29 13:23:21 2021 from the following file(s):
* Mon May 30 20:50:39 2022 from the following file(s):
*
* dot11f.frms
*
@ -10110,6 +10111,7 @@ typedef struct sDot11fAssocResponse{
tDot11fIEP2PAssocRes P2PAssocRes;
tDot11fIEVHTCaps VHTCaps;
tDot11fIEVHTOperation VHTOperation;
tDot11fIEOperatingMode OperatingMode;
tDot11fIEExtCap ExtCap;
tDot11fIEOBSSScanParameters OBSSScanParameters;
tDot11fIEQosMapSet QosMapSet;
@ -11061,6 +11063,7 @@ typedef struct sDot11fReAssocResponse{
tDot11fIEP2PAssocRes P2PAssocRes;
tDot11fIEVHTCaps VHTCaps;
tDot11fIEVHTOperation VHTOperation;
tDot11fIEOperatingMode OperatingMode;
tDot11fIEExtCap ExtCap;
tDot11fIEOBSSScanParameters OBSSScanParameters;
tDot11fIEQosMapSet QosMapSet;

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -471,6 +471,7 @@ typedef struct sSirAssocRsp {
tDot11fIEVHTCaps VHTCaps;
tDot11fIEVHTOperation VHTOperation;
tDot11fIEExtCap ExtCap;
tDot11fIEOperatingMode oper_mode_ntf;
struct qos_map_set QosMapSet;
#ifdef WLAN_FEATURE_11W
tDot11fIETimeoutInterval TimeoutInterval;

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -3410,30 +3410,30 @@ void lim_update_vhtcaps_assoc_resp(struct mac_context *mac_ctx,
* lim_update_vht_oper_assoc_resp : Update VHT Operations in assoc response.
* @mac_ctx Pointer to Global MAC structure
* @pAddBssParams: parameters required for add bss params.
* @vht_caps: VHT CAP IE to update.
* @vht_oper: VHT Operations to update.
* @ht_info: HT Info IE to update.
* @pe_session : session entry.
*
* Return : void
*/
static void lim_update_vht_oper_assoc_resp(struct mac_context *mac_ctx,
struct bss_params *pAddBssParams,
tDot11fIEVHTOperation *vht_oper, struct pe_session *pe_session)
tDot11fIEVHTCaps *vht_caps, tDot11fIEVHTOperation *vht_oper,
tDot11fIEHTInfo *ht_info, struct pe_session *pe_session)
{
int16_t ccfs0 = vht_oper->chan_center_freq_seg0;
int16_t ccfs1 = vht_oper->chan_center_freq_seg1;
int16_t offset = abs((ccfs0 - ccfs1));
uint8_t ch_width;
ch_width = pAddBssParams->ch_width;
if (vht_oper->chanWidth && pe_session->ch_width) {
ch_width = CH_WIDTH_80MHZ;
if (ccfs1 && offset == 8)
ch_width = CH_WIDTH_160MHZ;
else if (ccfs1 && offset > 16)
ch_width = CH_WIDTH_80P80MHZ;
}
if (vht_oper->chanWidth == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ &&
pe_session->ch_width)
ch_width =
lim_get_vht_ch_width(vht_caps, vht_oper, ht_info) + 1;
if (ch_width > pe_session->ch_width)
ch_width = pe_session->ch_width;
pAddBssParams->ch_width = ch_width;
pAddBssParams->staContext.ch_width = ch_width;
}
@ -3529,11 +3529,34 @@ QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac, tpSirAssocRsp pAssocRsp
lim_get_ht_capability(mac,
eHT_SUPPORTED_CHANNEL_WIDTH_SET,
pe_session);
lim_sta_add_bss_update_ht_parameter(bssDescription->chan_freq,
&pAssocRsp->HTCaps,
&pAssocRsp->HTInfo,
chan_width_support,
pAddBssParams);
/**
* in limExtractApCapability function intersection of FW
* advertised channel width and AP advertised channel
* width has been taken into account for calculating
* pe_session->ch_width
*/
if (chan_width_support &&
((pAssocRsp->HTCaps.present &&
pAssocRsp->HTCaps.supportedChannelWidthSet) ||
(pBeaconStruct->HTCaps.present &&
pBeaconStruct->HTCaps.supportedChannelWidthSet))) {
pAddBssParams->ch_width =
pe_session->ch_width;
pAddBssParams->staContext.ch_width =
pe_session->ch_width;
} else {
pAddBssParams->ch_width = CH_WIDTH_20MHZ;
pAddBssParams->staContext.ch_width = CH_WIDTH_20MHZ;
if (!vht_cap_info->enable_txbf_20mhz)
pAddBssParams->staContext.vhtTxBFCapable = 0;
}
}
if (pe_session->vhtCapability && (pAssocRsp->VHTCaps.present)) {
@ -3553,7 +3576,9 @@ QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac, tpSirAssocRsp pAssocRsp
if (pAddBssParams->vhtCapable) {
if (vht_oper)
lim_update_vht_oper_assoc_resp(mac, pAddBssParams,
vht_oper, pe_session);
vht_caps, vht_oper,
&pAssocRsp->HTInfo,
pe_session);
if (vht_caps)
lim_update_vhtcaps_assoc_resp(mac, pAddBssParams,
vht_caps, pe_session);
@ -3664,26 +3689,6 @@ QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac, tpSirAssocRsp pAssocRsp
sta);
}
/*
* in limExtractApCapability function intersection of FW
* advertised channel width and AP advertised channel
* width has been taken into account for calculating
* pe_session->ch_width
*/
if (chan_width_support &&
((pAssocRsp->HTCaps.supportedChannelWidthSet) ||
(pBeaconStruct->HTCaps.supportedChannelWidthSet))) {
pAddBssParams->ch_width =
pe_session->ch_width;
pAddBssParams->staContext.ch_width =
pe_session->ch_width;
} else {
pAddBssParams->ch_width = CH_WIDTH_20MHZ;
sta_context->ch_width = CH_WIDTH_20MHZ;
if (!vht_cap_info->enable_txbf_20mhz)
sta_context->vhtTxBFCapable = 0;
}
pAddBssParams->staContext.mimoPS =
(tSirMacHTMIMOPowerSaveState)
pAssocRsp->HTCaps.mimoPowerSave;

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -244,10 +244,7 @@ static void __lim_process_operating_mode_action_frame(struct mac_context *mac_ct
uint32_t status;
tpDphHashNode sta_ptr;
uint16_t aid;
uint8_t oper_mode;
uint8_t cb_mode;
uint8_t ch_bw = 0;
uint8_t skip_opmode_update = false;
mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
@ -287,87 +284,13 @@ static void __lim_process_operating_mode_action_frame(struct mac_context *mac_ct
goto end;
}
if (wlan_reg_is_24ghz_ch_freq(session->curr_op_freq))
cb_mode = mac_ctx->roam.configParam.channelBondingMode24GHz;
else
cb_mode = mac_ctx->roam.configParam.channelBondingMode5GHz;
/*
* Do not update the channel bonding mode if channel bonding
* mode is disabled in INI.
*/
if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE == cb_mode) {
pe_debug("channel bonding disabled");
goto update_nss;
}
lim_update_nss(mac_ctx, sta_ptr,
operating_mode_frm->OperatingMode.rxNSS,
session);
if (sta_ptr->htSupportedChannelWidthSet) {
if (WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ <
sta_ptr->vhtSupportedChannelWidthSet)
oper_mode = eHT_CHANNEL_WIDTH_160MHZ;
else
oper_mode = sta_ptr->vhtSupportedChannelWidthSet + 1;
} else {
oper_mode = eHT_CHANNEL_WIDTH_20MHZ;
}
if ((oper_mode == eHT_CHANNEL_WIDTH_80MHZ) &&
(operating_mode_frm->OperatingMode.chanWidth >
eHT_CHANNEL_WIDTH_80MHZ))
skip_opmode_update = true;
if (!skip_opmode_update && (oper_mode !=
operating_mode_frm->OperatingMode.chanWidth)) {
uint32_t fw_vht_ch_wd = wma_get_vht_ch_width();
pe_debug("received Chanwidth: %d",
operating_mode_frm->OperatingMode.chanWidth);
pe_debug(" MAC: %0x:%0x:%0x:%0x:%0x:%0x",
mac_hdr->sa[0], mac_hdr->sa[1], mac_hdr->sa[2],
mac_hdr->sa[3], mac_hdr->sa[4], mac_hdr->sa[5]);
if (operating_mode_frm->OperatingMode.chanWidth >=
eHT_CHANNEL_WIDTH_160MHZ
&& (fw_vht_ch_wd >= eHT_CHANNEL_WIDTH_160MHZ)) {
sta_ptr->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ;
sta_ptr->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
ch_bw = eHT_CHANNEL_WIDTH_160MHZ;
} else if (operating_mode_frm->OperatingMode.chanWidth >=
eHT_CHANNEL_WIDTH_80MHZ) {
sta_ptr->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ;
sta_ptr->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
ch_bw = eHT_CHANNEL_WIDTH_80MHZ;
} else if (operating_mode_frm->OperatingMode.chanWidth ==
eHT_CHANNEL_WIDTH_40MHZ) {
sta_ptr->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
sta_ptr->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
ch_bw = eHT_CHANNEL_WIDTH_40MHZ;
} else if (operating_mode_frm->OperatingMode.chanWidth ==
eHT_CHANNEL_WIDTH_20MHZ) {
sta_ptr->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
sta_ptr->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_20MHZ;
ch_bw = eHT_CHANNEL_WIDTH_20MHZ;
}
lim_check_vht_op_mode_change(mac_ctx, session, ch_bw,
mac_hdr->sa);
}
update_nss:
if (sta_ptr->vhtSupportedRxNss !=
(operating_mode_frm->OperatingMode.rxNSS + 1)) {
sta_ptr->vhtSupportedRxNss =
operating_mode_frm->OperatingMode.rxNSS + 1;
lim_set_nss_change(mac_ctx, session, sta_ptr->vhtSupportedRxNss,
mac_hdr->sa);
}
lim_update_channel_width(mac_ctx, sta_ptr, session,
operating_mode_frm->OperatingMode.chanWidth,
&ch_bw);
end:
qdf_mem_free(operating_mode_frm);

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -139,6 +139,7 @@ void lim_update_assoc_sta_datas(struct mac_context *mac_ctx,
tDot11fIEVHTCaps *vht_caps = NULL;
tDot11fIEhe_cap *he_cap = NULL;
struct bss_description *bss_desc = NULL;
tDot11fIEVHTOperation *vht_oper = NULL;
lim_get_phy_mode(mac_ctx, &phy_mode, session_entry);
sta_ds->staType = STA_ENTRY_SELF;
@ -155,10 +156,13 @@ void lim_update_assoc_sta_datas(struct mac_context *mac_ctx,
lim_update_stads_htcap(mac_ctx, sta_ds, assoc_rsp,
session_entry);
if (assoc_rsp->VHTCaps.present)
if (assoc_rsp->VHTCaps.present) {
vht_caps = &assoc_rsp->VHTCaps;
else if (assoc_rsp->vendor_vht_ie.VHTCaps.present)
vht_oper = &assoc_rsp->VHTOperation;
} else if (assoc_rsp->vendor_vht_ie.VHTCaps.present) {
vht_caps = &assoc_rsp->vendor_vht_ie.VHTCaps;
vht_oper = &assoc_rsp->vendor_vht_ie.VHTOperation;
}
if (session_entry->vhtCapability && (vht_caps && vht_caps->present)) {
sta_ds->mlmStaContext.vhtCapability =
@ -171,13 +175,16 @@ void lim_update_assoc_sta_datas(struct mac_context *mac_ctx,
*/
sta_ds->htMaxRxAMpduFactor = vht_caps->maxAMPDULenExp;
if (session_entry->htSupportedChannelWidthSet) {
if (assoc_rsp->VHTOperation.present)
if (vht_oper && vht_oper->present)
sta_ds->vhtSupportedChannelWidthSet =
assoc_rsp->VHTOperation.chanWidth;
lim_get_vht_ch_width(vht_caps,
vht_oper,
&assoc_rsp->HTInfo);
else
sta_ds->vhtSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
}
sta_ds->vht_mcs_10_11_supp = 0;
if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.
vht_mcs_10_11_supp &&
@ -289,6 +296,13 @@ void lim_update_assoc_sta_datas(struct mac_context *mac_ctx,
if (session_entry->limRmfEnabled)
sta_ds->rmfEnabled = 1;
#endif
if (session_entry->vhtCapability && assoc_rsp->oper_mode_ntf.present) {
/**
* OMN IE is present in the Assoc response, but the channel
* width/Rx NSS update will happen through the peer_assoc cmd.
*/
pe_debug("OMN IE is present in the assoc response frame");
}
}
/**

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -205,6 +205,7 @@ static void populate_dot11f_tdls_offchannel_params(
uint8_t nss_2g;
uint8_t nss_5g;
qdf_freq_t ch_freq;
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
numChans = mac->mlme_cfg->reg.valid_channel_list_num;
@ -270,13 +271,14 @@ static void populate_dot11f_tdls_offchannel_params(
break;
}
wlan_reg_read_current_country(mac->psoc, reg_cc);
op_class = wlan_reg_dmn_get_opclass_from_channel(
mac->scan.countryCodeCurrent,
reg_cc,
wlan_reg_freq_to_chan(mac->pdev, pe_session->curr_op_freq),
chanOffset);
pe_debug("countryCodeCurrent: %s, curr_op_freq: %d, htSecondaryChannelOffset: %d, chanOffset: %d op class: %d",
mac->scan.countryCodeCurrent,
reg_cc,
pe_session->curr_op_freq,
pe_session->htSecondaryChannelOffset,
chanOffset, op_class);

View file

@ -4288,6 +4288,7 @@ lim_send_extended_chan_switch_action_frame(struct mac_context *mac_ctx,
uint8_t vdev_id = 0;
uint8_t ch_spacing;
tLimWiderBWChannelSwitchInfo *wide_bw_ie;
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
if (!session_entry) {
pe_err("Session entry is NULL!!!");
@ -4306,9 +4307,9 @@ lim_send_extended_chan_switch_action_frame(struct mac_context *mac_ctx,
frm.ext_chan_switch_ann_action.new_channel = new_channel;
frm.ext_chan_switch_ann_action.switch_count = count;
wlan_reg_read_current_country(mac_ctx->psoc, reg_cc);
ch_spacing = wlan_reg_dmn_get_chanwidth_from_opclass(
mac_ctx->scan.countryCodeCurrent, new_channel,
new_op_class);
reg_cc, new_channel, new_op_class);
if ((ch_spacing == 80) || (ch_spacing == 160)) {
wide_bw_ie = &session_entry->gLimWiderBWChannelSwitch;

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -477,6 +478,7 @@ QDF_STATUS lim_send_ht40_obss_scanind(struct mac_context *mac_ctx,
uint32_t channelnum, chan_freq;
struct scheduler_msg msg = {0};
uint8_t channel24gnum, count;
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
ht40_obss_scanind = qdf_mem_malloc(sizeof(struct obss_ht40_scanind));
if (!ht40_obss_scanind)
@ -485,6 +487,7 @@ QDF_STATUS lim_send_ht40_obss_scanind(struct mac_context *mac_ctx,
"OBSS Scan Indication bssid " QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(session->bssId));
wlan_reg_read_current_country(mac_ctx->psoc, reg_cc);
ht40_obss_scanind->cmd = HT40_OBSS_SCAN_PARAM_START;
ht40_obss_scanind->scan_type = eSIR_ACTIVE_SCAN;
ht40_obss_scanind->obss_passive_dwelltime =
@ -503,7 +506,7 @@ QDF_STATUS lim_send_ht40_obss_scanind(struct mac_context *mac_ctx,
session->obss_ht40_scanparam.obss_activity_threshold;
ht40_obss_scanind->current_operatingclass =
wlan_reg_dmn_get_opclass_from_channel(
mac_ctx->scan.countryCodeCurrent,
reg_cc,
wlan_reg_freq_to_chan(
mac_ctx->pdev, session->curr_op_freq),
session->ch_width);

View file

@ -3765,10 +3765,41 @@ static void lim_ht_switch_chnl_req(struct pe_session *session)
}
}
uint8_t lim_get_cb_mode_for_freq(struct mac_context *mac,
struct pe_session *session,
qdf_freq_t chan_freq)
{
uint8_t cb_mode = mac->roam.configParam.channelBondingMode5GHz;
if (WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq)) {
if (session->force_24ghz_in_ht20) {
cb_mode = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
pe_debug_rl("vdev %d force 20 Mhz in 2.4 GHz",
session->vdev_id);
} else {
cb_mode = mac->roam.configParam.channelBondingMode24GHz;
}
}
return cb_mode;
}
void lim_update_sta_run_time_ht_switch_chnl_params(struct mac_context *mac,
tDot11fIEHTInfo *pHTInfo,
struct pe_session *pe_session)
{
uint8_t cb_mode;
cb_mode = lim_get_cb_mode_for_freq(mac, pe_session,
pe_session->curr_op_freq);
/* If self capability is set to '20Mhz only', then do not change the CB mode. */
if (cb_mode == WNI_CFG_CHANNEL_BONDING_MODE_DISABLE) {
pe_debug_rl("self_cb_mode 0 for freq %d",
pe_session->curr_op_freq);
return;
}
/* If self capability is set to '20Mhz only', then do not change the CB mode. */
if (!lim_get_ht_capability
(mac, eHT_SUPPORTED_CHANNEL_WIDTH_SET, pe_session))
@ -9301,3 +9332,127 @@ QDF_STATUS lim_pre_vdev_start(struct mac_context *mac,
return lim_set_ch_phy_mode(mlme_obj->vdev, session->dot11mode);
}
void lim_update_nss(struct mac_context *mac_ctx, tpDphHashNode sta_ds,
uint8_t rx_nss, struct pe_session *session)
{
if (sta_ds->vhtSupportedRxNss != (rx_nss + 1)) {
if (session->nss_forced_1x1) {
pe_debug("Not Updating NSS for special AP");
return;
}
sta_ds->vhtSupportedRxNss = rx_nss + 1;
lim_set_nss_change(mac_ctx, session,
sta_ds->vhtSupportedRxNss,
sta_ds->staAddr);
}
}
bool lim_update_channel_width(struct mac_context *mac_ctx,
tpDphHashNode sta_ptr,
struct pe_session *session,
uint8_t ch_width, uint8_t *new_ch_width)
{
uint8_t cb_mode, oper_mode;
uint32_t fw_vht_ch_wd;
cb_mode = lim_get_cb_mode_for_freq(mac_ctx, session,
session->curr_op_freq);
/*
* Do not update the channel bonding mode if channel bonding
* mode is disabled in INI.
*/
if (cb_mode == WNI_CFG_CHANNEL_BONDING_MODE_DISABLE) {
pe_debug("channel bonding disabled");
return false;
}
if (sta_ptr->htSupportedChannelWidthSet) {
if (sta_ptr->vhtSupportedChannelWidthSet >
WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
oper_mode = eHT_CHANNEL_WIDTH_160MHZ;
else
oper_mode = sta_ptr->vhtSupportedChannelWidthSet + 1;
} else {
oper_mode = eHT_CHANNEL_WIDTH_20MHZ;
}
if (((oper_mode == eHT_CHANNEL_WIDTH_80MHZ) &&
(ch_width > eHT_CHANNEL_WIDTH_80MHZ)) ||
(oper_mode == ch_width))
return false;
fw_vht_ch_wd = wma_get_vht_ch_width();
pe_debug("ChannelWidth - Current : %d, New: %d mac : " QDF_MAC_ADDR_FMT,
oper_mode, ch_width, QDF_MAC_ADDR_REF(sta_ptr->staAddr));
if (ch_width >= eHT_CHANNEL_WIDTH_160MHZ &&
(fw_vht_ch_wd >= eHT_CHANNEL_WIDTH_160MHZ)) {
sta_ptr->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ;
sta_ptr->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
*new_ch_width = eHT_CHANNEL_WIDTH_160MHZ;
} else if (ch_width >= eHT_CHANNEL_WIDTH_80MHZ) {
sta_ptr->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ;
sta_ptr->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
*new_ch_width = eHT_CHANNEL_WIDTH_80MHZ;
} else if (ch_width == eHT_CHANNEL_WIDTH_40MHZ) {
sta_ptr->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
sta_ptr->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
*new_ch_width = eHT_CHANNEL_WIDTH_40MHZ;
} else if (ch_width == eHT_CHANNEL_WIDTH_20MHZ) {
sta_ptr->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
sta_ptr->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_20MHZ;
*new_ch_width = eHT_CHANNEL_WIDTH_20MHZ;
}
lim_check_vht_op_mode_change(mac_ctx, session, *new_ch_width,
sta_ptr->staAddr);
return true;
}
uint8_t lim_get_vht_ch_width(tDot11fIEVHTCaps *vht_cap,
tDot11fIEVHTOperation *vht_op,
tDot11fIEHTInfo *ht_info)
{
uint8_t ccfs0, ccfs1, offset;
uint8_t ch_width;
ccfs0 = vht_op->chan_center_freq_seg0;
ccfs1 = vht_op->chan_center_freq_seg1;
ch_width = vht_op->chanWidth;
if (ch_width > WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ) {
pe_err("Invalid ch width in vht operation IE %d", ch_width);
return WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
}
if (vht_cap->vht_extended_nss_bw_cap &&
vht_cap->extended_nss_bw_supp && ht_info && ht_info->present)
ccfs1 = ht_info->chan_center_freq_seg2;
/* According to new VHTOP IE definition, vht ch_width will
* be 1 for 80MHz, 160MHz and 80+80MHz.
*
* To get the correct operation ch_width, find center
* frequency difference.
*/
if (ch_width == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ && ccfs1) {
offset = abs(ccfs0 - ccfs1);
if (offset == 8)
ch_width = WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ;
else if (offset > 16)
ch_width = WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ;
}
pe_debug("The VHT Operation channel width is %d", ch_width);
return ch_width;
}

View file

@ -327,6 +327,18 @@ void lim_decide_sta_protection_on_assoc(struct mac_context *mac,
tpSchBeaconStruct pBeaconStruct,
struct pe_session *pe_session);
/**
* lim_get_cb_mode_for_freq() - Get cb mode depending on the freq
* @mac: pointer to Global MAC structure
* @pe_session: pe session
* @chan_freq: Freq to get cb mode for
*
* Return: cb mode allowed for the freq
*/
uint8_t lim_get_cb_mode_for_freq(struct mac_context *mac,
struct pe_session *session,
qdf_freq_t chan_freq);
/**
* lim_update_sta_run_time_ht_switch_chnl_params() - Process change in HT
* bandwidth
@ -2261,4 +2273,49 @@ static inline void lim_process_sae_msg(struct mac_context *mac, void *body);
{}
#endif
/**
* lim_update_nss() - Function to update NSS
* @mac_ctx: pointer to Global Mac structure
* @sta_ds: pointer to tpDphHashNode
* @rx_nss: Rx NSS in operating mode notification
* @session: pointer to pe_session
*
* function to update NSS
*
* Return: None
*/
void lim_update_nss(struct mac_context *mac_ctx, tpDphHashNode sta_ds,
uint8_t rx_nss, struct pe_session *session);
/**
* lim_update_channel_width() - Function to update channel width
* @mac_ctx: pointer to Global Mac structure
* @sta_ptr: pointer to tpDphHashNode
* @session: pointer to pe_session
* @ch_width: Channel width in operating mode notification
* @new_ch_width: Final channel bandwifdth
*
* function to update channel width
*
* Return: Success or Failure
*/
bool lim_update_channel_width(struct mac_context *mac_ctx,
tpDphHashNode sta_ptr,
struct pe_session *session,
uint8_t ch_width,
uint8_t *new_ch_width);
/**
* lim_get_vht_ch_width() - Function to get the VHT
* operating channel width based on frequency params
*
* @vht_cap: Pointer to VHT Caps IE.
* @vht_op: Pointer to VHT Operation IE.
* @ht_info: Pointer to HT Info IE.
*
* Return: VHT channel width
*/
uint8_t lim_get_vht_ch_width(tDot11fIEVHTCaps *vht_cap,
tDot11fIEVHTOperation *vht_op,
tDot11fIEHTInfo *ht_info);
#endif /* __LIM_UTILS_H */

View file

@ -241,36 +241,6 @@ ap_beacon_process(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
/* -------------------------------------------------------------------- */
/**
* get_operating_channel_width() - Get operating channel width
* @stads - station entry.
*
* This function returns the operating channel width based on
* the supported channel width entry.
*
* Return: tSirMacHTChannelWidth on success
*/
static tSirMacHTChannelWidth get_operating_channel_width(tpDphHashNode stads)
{
tSirMacHTChannelWidth ch_width = eHT_CHANNEL_WIDTH_20MHZ;
if (stads->vhtSupportedChannelWidthSet ==
WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
ch_width = eHT_CHANNEL_WIDTH_160MHZ;
else if (stads->vhtSupportedChannelWidthSet ==
WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
ch_width = eHT_CHANNEL_WIDTH_160MHZ;
else if (stads->vhtSupportedChannelWidthSet ==
WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
ch_width = eHT_CHANNEL_WIDTH_80MHZ;
else if (stads->htSupportedChannelWidthSet)
ch_width = eHT_CHANNEL_WIDTH_40MHZ;
else
ch_width = eHT_CHANNEL_WIDTH_20MHZ;
return ch_width;
}
/*
* sch_bcn_process_sta() - Process the received beacon frame for sta
* @mac_ctx: mac_ctx
@ -415,35 +385,6 @@ sch_bcn_process_sta(struct mac_context *mac_ctx,
return true;
}
/**
* update_nss() - Function to update NSS
* @mac_ctx: pointer to Global Mac structure
* @sta_ds: pointer to tpDphHashNode
* @beacon: pointer to tpSchBeaconStruct
* @session_entry: pointer to struct pe_session *
* @mgmt_hdr: pointer to tpSirMacMgmtHdr
*
* function to update NSS
*
* Return: none
*/
static void update_nss(struct mac_context *mac_ctx, tpDphHashNode sta_ds,
tpSchBeaconStruct beacon, struct pe_session *session_entry,
tpSirMacMgmtHdr mgmt_hdr)
{
if (sta_ds->vhtSupportedRxNss != (beacon->OperatingMode.rxNSS + 1)) {
if (session_entry->nss_forced_1x1) {
pe_debug("Not Updating NSS for special AP");
return;
}
sta_ds->vhtSupportedRxNss =
beacon->OperatingMode.rxNSS + 1;
lim_set_nss_change(mac_ctx, session_entry,
sta_ds->vhtSupportedRxNss,
mgmt_hdr->sa);
}
}
#ifdef WLAN_FEATURE_11AX_BSS_COLOR
static void
sch_bcn_update_he_ies(struct mac_context *mac_ctx, tpDphHashNode sta_ds,
@ -499,7 +440,7 @@ sch_bcn_update_opmode_change(struct mac_context *mac_ctx, tpDphHashNode sta_ds,
bool skip_opmode_update = false;
uint8_t oper_mode;
uint32_t fw_vht_ch_wd = wma_get_vht_ch_width();
uint8_t ch_width = 0;
uint8_t ch_width = 0, ch_bw;
/*
* Ignore opmode change during channel change The opmode will be updated
@ -511,72 +452,10 @@ sch_bcn_update_opmode_change(struct mac_context *mac_ctx, tpDphHashNode sta_ds,
}
if (session->vhtCapability && bcn->OperatingMode.present) {
update_nss(mac_ctx, sta_ds, bcn, session, mac_hdr);
oper_mode = get_operating_channel_width(sta_ds);
if ((oper_mode == eHT_CHANNEL_WIDTH_80MHZ) &&
(bcn->OperatingMode.chanWidth > eHT_CHANNEL_WIDTH_80MHZ))
skip_opmode_update = true;
if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE == cb_mode) {
/*
* if channel bonding is disabled from INI do not
* update the chan width
*/
pe_debug_rl("CB disabled skip bw update: old[%d] new[%d]",
oper_mode,
bcn->OperatingMode.chanWidth);
return;
}
if (!skip_opmode_update &&
((oper_mode != bcn->OperatingMode.chanWidth) ||
(sta_ds->vhtSupportedRxNss !=
(bcn->OperatingMode.rxNSS + 1)))) {
pe_debug("received OpMode Chanwidth %d",
bcn->OperatingMode.chanWidth);
pe_debug("MAC - %0x:%0x:%0x:%0x:%0x:%0x",
mac_hdr->sa[0], mac_hdr->sa[1],
mac_hdr->sa[2], mac_hdr->sa[3],
mac_hdr->sa[4], mac_hdr->sa[5]);
if ((bcn->OperatingMode.chanWidth >=
eHT_CHANNEL_WIDTH_160MHZ) &&
(fw_vht_ch_wd > eHT_CHANNEL_WIDTH_80MHZ)) {
pe_debug("Updating the CH Width to 160MHz");
sta_ds->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ;
sta_ds->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
ch_width = eHT_CHANNEL_WIDTH_160MHZ;
} else if (bcn->OperatingMode.chanWidth >=
eHT_CHANNEL_WIDTH_80MHZ) {
pe_debug("Updating the CH Width to 80MHz");
sta_ds->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ;
sta_ds->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
ch_width = eHT_CHANNEL_WIDTH_80MHZ;
} else if (bcn->OperatingMode.chanWidth ==
eHT_CHANNEL_WIDTH_40MHZ) {
pe_debug("Updating the CH Width to 40MHz");
sta_ds->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
sta_ds->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_40MHZ;
ch_width = eHT_CHANNEL_WIDTH_40MHZ;
} else if (bcn->OperatingMode.chanWidth ==
eHT_CHANNEL_WIDTH_20MHZ) {
pe_debug("Updating the CH Width to 20MHz");
sta_ds->vhtSupportedChannelWidthSet =
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ;
sta_ds->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_20MHZ;
ch_width = eHT_CHANNEL_WIDTH_20MHZ;
}
lim_check_vht_op_mode_change(mac_ctx, session,
ch_width, mac_hdr->sa);
update_nss(mac_ctx, sta_ds, bcn, session, mac_hdr);
}
lim_update_nss(mac_ctx, sta_ds, bcn->OperatingMode.rxNSS,
session);
lim_update_channel_width(mac_ctx, sta_ds, session,
bcn->OperatingMode.chanWidth, &ch_bw);
return;
}
@ -658,14 +537,8 @@ sch_bcn_process_sta_opmode(struct mac_context *mac_ctx,
uint16_t aid;
uint8_t cb_mode;
if (wlan_reg_is_24ghz_ch_freq(session->curr_op_freq)) {
if (session->force_24ghz_in_ht20)
cb_mode = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
else
cb_mode =
mac_ctx->roam.configParam.channelBondingMode24GHz;
} else
cb_mode = mac_ctx->roam.configParam.channelBondingMode5GHz;
cb_mode = lim_get_cb_mode_for_freq(mac_ctx, session,
session->curr_op_freq);
/* check for VHT capability */
sta = dph_lookup_hash_entry(mac_ctx, pMh->sa, &aid,
&session->dph.dphHashTable);

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -24,7 +25,7 @@
*
*
* This file was automatically generated by 'framesc'
* Wed Sep 29 13:23:21 2021 from the following file(s):
* Mon May 30 20:50:39 2022 from the following file(s):
*
* dot11f.frms
*
@ -10202,6 +10203,10 @@ static const tIEDefn IES_AssocResponse[] = {
offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
0, DOT11F_EID_VHTOPERATION, 0, 0, },
{ offsetof(tDot11fAssocResponse, OperatingMode),
offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
0, DOT11F_EID_OPERATINGMODE, 0, 0, },
{ offsetof(tDot11fAssocResponse, ExtCap), offsetof(tDot11fIEExtCap,
present), 0, "ExtCap", 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0},
0, DOT11F_EID_EXTCAP, 0, 0, },
@ -12055,6 +12060,10 @@ static const tIEDefn IES_ReAssocResponse[] = {
offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
0, DOT11F_EID_VHTOPERATION, 0, 0, },
{ offsetof(tDot11fReAssocResponse, OperatingMode),
offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
0, DOT11F_EID_OPERATINGMODE, 0, 0, },
{ offsetof(tDot11fReAssocResponse, ExtCap), offsetof(tDot11fIEExtCap,
present), 0, "ExtCap", 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0},
0, DOT11F_EID_EXTCAP, 0, 0, },

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -185,6 +185,7 @@ void populate_dot_11_f_ext_chann_switch_ann(struct mac_context *mac_ptr,
uint32_t sw_target_freq;
uint8_t primary_channel;
enum phy_ch_width ch_width;
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
ch_width = session_entry->gLimChannelSwitch.ch_width;
ch_offset = session_entry->gLimChannelSwitch.sec_ch_offset;
@ -201,8 +202,9 @@ void populate_dot_11_f_ext_chann_switch_ann(struct mac_context *mac_ptr,
session_entry->gLimChannelSwitch.switchCount;
dot_11_ptr->present = 1;
wlan_reg_read_current_country(mac_ptr->psoc, reg_cc);
pe_debug("country:%s chan:%d freq %d width:%d reg:%d off:%d",
mac_ptr->scan.countryCodeCurrent,
reg_cc,
session_entry->gLimChannelSwitch.primaryChannel,
sw_target_freq,
session_entry->gLimChannelSwitch.ch_width,
@ -913,7 +915,7 @@ populate_dot11f_ht_caps(struct mac_context *mac,
{
qdf_size_t ncfglen;
QDF_STATUS nSirStatus;
uint8_t disable_high_ht_mcs_2x2 = 0;
uint8_t disable_high_ht_mcs_2x2 = 0, cb_mode;
struct ch_params ch_params = {0};
tSirMacTxBFCapabilityInfo *pTxBFCapabilityInfo;
@ -943,10 +945,11 @@ populate_dot11f_ht_caps(struct mac_context *mac,
pDot11f->shortGI20MHz = ht_cap_info->short_gi_20_mhz;
pDot11f->shortGI40MHz = ht_cap_info->short_gi_40_mhz;
} else {
cb_mode = lim_get_cb_mode_for_freq(mac, pe_session,
pe_session->curr_op_freq);
if (WLAN_REG_IS_24GHZ_CH_FREQ(pe_session->curr_op_freq) &&
LIM_IS_STA_ROLE(pe_session) &&
WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
mac->roam.configParam.channelBondingMode24GHz) {
cb_mode != WNI_CFG_CHANNEL_BONDING_MODE_DISABLE) {
pDot11f->supportedChannelWidthSet = 1;
ch_params.ch_width = CH_WIDTH_40MHZ;
wlan_reg_set_channel_params_for_freq(
@ -3512,6 +3515,10 @@ sir_convert_assoc_resp_frame2_struct(struct mac_context *mac,
ext_cap->fine_time_meas_responder);
}
if (ar->OperatingMode.present) {
qdf_mem_copy(&pAssocRsp->oper_mode_ntf, &ar->OperatingMode,
sizeof(tDot11fIEOperatingMode));
}
if (ar->QosMapSet.present) {
pAssocRsp->QosMapSet.present = 1;
convert_qos_mapset_frame(mac, &pAssocRsp->QosMapSet,
@ -6518,6 +6525,7 @@ QDF_STATUS populate_dot11f_twt_extended_caps(struct mac_context *mac_ctx,
dot11f->num_bytes = DOT11F_IE_EXTCAP_MAX_LEN;
p_ext_cap = (struct s_ext_cap *)dot11f->bytes;
dot11f->present = 1;
if (pe_session->opmode == QDF_STA_MODE)
p_ext_cap->twt_requestor_support =
@ -6530,6 +6538,10 @@ QDF_STATUS populate_dot11f_twt_extended_caps(struct mac_context *mac_ctx,
mac_ctx->mlme_cfg->twt_cfg.res_flag;
dot11f->num_bytes = lim_compute_ext_cap_ie_length(dot11f);
if (!dot11f->num_bytes) {
dot11f->present = 0;
pe_debug("ext ie length become 0, disable the ext caps");
}
return QDF_STATUS_SUCCESS;
}
@ -6545,6 +6557,7 @@ QDF_STATUS populate_dot11f_btm_extended_caps(struct mac_context *mac_ctx,
pe_debug("enter");
dot11f->num_bytes = DOT11F_IE_EXTCAP_MAX_LEN;
p_ext_cap = (struct s_ext_cap *)dot11f->bytes;
dot11f->present = 1;
status = cm_akm_roam_allowed(mac_ctx, pe_session->vdev_id);
if (QDF_IS_STATUS_ERROR(status)) {
@ -6553,6 +6566,10 @@ QDF_STATUS populate_dot11f_btm_extended_caps(struct mac_context *mac_ctx,
}
dot11f->num_bytes = lim_compute_ext_cap_ie_length(dot11f);
if (!dot11f->num_bytes) {
dot11f->present = 0;
pe_debug("ext ie length become 0, disable the ext caps");
}
return QDF_STATUS_SUCCESS;
}

View file

@ -274,7 +274,6 @@ typedef struct sCsrChnPower_ {
typedef struct tagCsr11dinfo {
sCsrChannel Channels;
uint8_t countryCode[REG_ALPHA2_LEN + 1];
/* max power channel list */
sCsrChnPower ChnPower[CFG_VALID_CHANNEL_LIST_LEN];
} tCsr11dinfo;

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -399,8 +399,6 @@ struct csr_scanstruct {
tDblLinkList channelPowerInfoList5G;
uint32_t nLastAgeTimeOut;
uint32_t nAgingCountDown;
uint8_t countryCodeDefault[REG_ALPHA2_LEN + 1];
uint8_t countryCodeCurrent[REG_ALPHA2_LEN + 1];
uint8_t countryCode11d[REG_ALPHA2_LEN + 1];
v_REGDOMAIN_t domainIdDefault; /* default regulatory domain */
v_REGDOMAIN_t domainIdCurrent; /* current regulatory domain */
@ -895,7 +893,7 @@ QDF_STATUS csr_change_default_config_param(struct mac_context *mac,
struct csr_config_params *pParam);
QDF_STATUS csr_msg_processor(struct mac_context *mac, void *msg_buf);
QDF_STATUS csr_open(struct mac_context *mac);
QDF_STATUS csr_init_chan_list(struct mac_context *mac, uint8_t *alpha2);
QDF_STATUS csr_init_chan_list(struct mac_context *mac);
QDF_STATUS csr_close(struct mac_context *mac);
QDF_STATUS csr_start(struct mac_context *mac);
QDF_STATUS csr_stop(struct mac_context *mac);

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -256,8 +257,7 @@ enum {
Function declarations and documenation
------------------------------------------------------------------------*/
QDF_STATUS sme_open(mac_handle_t mac_handle);
QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, uint8_t *alpha2,
enum country_src cc_src);
QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, enum country_src cc_src);
QDF_STATUS sme_close(mac_handle_t mac_handle);
QDF_STATUS sme_start(mac_handle_t mac_handle);

View file

@ -861,8 +861,7 @@ QDF_STATUS sme_open(mac_handle_t mac_handle)
/*
* sme_init_chan_list, triggers channel setup based on country code.
*/
QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, uint8_t *alpha2,
enum country_src cc_src)
QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, enum country_src cc_src)
{
struct mac_context *pmac = MAC_CONTEXT(mac_handle);
@ -871,7 +870,7 @@ QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, uint8_t *alpha2,
pmac->mlme_cfg->gen.enabled_11d = false;
}
return csr_init_chan_list(pmac, alpha2);
return csr_init_chan_list(pmac);
}
/*
@ -13090,7 +13089,9 @@ void sme_get_opclass(mac_handle_t mac_handle, uint8_t channel,
uint8_t bw_offset, uint8_t *opclass)
{
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
wlan_reg_read_current_country(mac_ctx->psoc, reg_cc);
/* redgm opclass table contains opclass for 40MHz low primary,
* 40MHz high primary and 20MHz. No support for 80MHz yet. So
* first we will check if bit for 40MHz is set and if so find
@ -13100,21 +13101,17 @@ void sme_get_opclass(mac_handle_t mac_handle, uint8_t channel,
*/
if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
*opclass = wlan_reg_dmn_get_opclass_from_channel(
mac_ctx->scan.countryCodeCurrent,
channel, BW40_LOW_PRIMARY);
reg_cc, channel, BW40_LOW_PRIMARY);
if (!(*opclass)) {
*opclass = wlan_reg_dmn_get_opclass_from_channel(
mac_ctx->scan.countryCodeCurrent,
channel, BW40_HIGH_PRIMARY);
reg_cc, channel, BW40_HIGH_PRIMARY);
}
} else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
*opclass = wlan_reg_dmn_get_opclass_from_channel(
mac_ctx->scan.countryCodeCurrent,
channel, BW20);
reg_cc, channel, BW20);
} else {
*opclass = wlan_reg_dmn_get_opclass_from_channel(
mac_ctx->scan.countryCodeCurrent,
channel, BWALL);
reg_cc, channel, BWALL);
}
}
#endif

View file

@ -637,23 +637,19 @@ QDF_STATUS csr_open(struct mac_context *mac)
return status;
}
QDF_STATUS csr_init_chan_list(struct mac_context *mac, uint8_t *alpha2)
QDF_STATUS csr_init_chan_list(struct mac_context *mac)
{
QDF_STATUS status;
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
mac->scan.countryCodeDefault[0] = alpha2[0];
mac->scan.countryCodeDefault[1] = alpha2[1];
mac->scan.countryCodeDefault[2] = alpha2[2];
sme_debug("init time country code %.2s", mac->scan.countryCodeDefault);
wlan_reg_read_current_country(mac->psoc, reg_cc);
sme_debug("init time country code %.2s", reg_cc);
mac->scan.domainIdDefault = 0;
mac->scan.domainIdCurrent = 0;
qdf_mem_copy(mac->scan.countryCodeCurrent,
mac->scan.countryCodeDefault, REG_ALPHA2_LEN + 1);
qdf_mem_copy(mac->scan.countryCodeElected,
mac->scan.countryCodeDefault, REG_ALPHA2_LEN + 1);
reg_cc, REG_ALPHA2_LEN + 1);
status = csr_get_channel_and_power_list(mac);
return status;
@ -665,8 +661,6 @@ QDF_STATUS csr_set_channels(struct mac_context *mac,
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint8_t index = 0;
qdf_mem_copy(pParam->Csr11dinfo.countryCode,
mac->scan.countryCodeCurrent, REG_ALPHA2_LEN + 1);
for (index = 0; index < mac->scan.base_channels.numChannels;
index++) {
pParam->Csr11dinfo.Channels.channel_freq_list[index] =
@ -2796,8 +2790,7 @@ QDF_STATUS csr_apply_channel_and_power_list(struct mac_context *mac)
csr_save_channel_power_for_band(mac, false);
csr_save_channel_power_for_band(mac, true);
csr_apply_channel_power_info_to_fw(mac,
&mac->scan.base_channels,
mac->scan.countryCodeCurrent);
&mac->scan.base_channels);
csr_init_operating_classes(mac);
return status;
@ -2829,17 +2822,6 @@ static QDF_STATUS csr_init11d_info(struct mac_context *mac, tCsr11dinfo *ps11din
}
/* legacy maintenance */
qdf_mem_copy(mac->scan.countryCodeDefault, ps11dinfo->countryCode,
REG_ALPHA2_LEN + 1);
/* Tush: at csropen get this initialized with default,
* during csr reset if this already set with some value
* no need initilaize with default again
*/
if (0 == mac->scan.countryCodeCurrent[0]) {
qdf_mem_copy(mac->scan.countryCodeCurrent,
ps11dinfo->countryCode, REG_ALPHA2_LEN + 1);
}
/* need to add the max power channel list */
pChanInfo =
qdf_mem_malloc(sizeof(tSirMacChanInfo) *
@ -2881,9 +2863,7 @@ static QDF_STATUS csr_init11d_info(struct mac_context *mac, tCsr11dinfo *ps11din
*/
csr_apply_channel_power_info_to_fw(mac,
&mac->scan.
base_channels,
mac->scan.
countryCodeCurrent);
base_channels);
}
}
return status;
@ -15050,6 +15030,7 @@ QDF_STATUS csr_send_join_req_msg(struct mac_context *mac, uint32_t sessionId,
uint8_t programmed_country[REG_ALPHA2_LEN + 1];
enum reg_6g_ap_type power_type_6g;
bool ctry_code_match;
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
if (!pSession) {
sme_err("session %d not found", sessionId);
@ -15136,8 +15117,9 @@ QDF_STATUS csr_send_join_req_msg(struct mac_context *mac, uint32_t sessionId,
qdf_mem_copy(&csr_join_req->self_mac_addr,
&pSession->self_mac_addr,
sizeof(tSirMacAddr));
wlan_reg_read_current_country(mac->psoc, reg_cc);
sme_nofl_info("vdev-%d: Connecting to %.*s " QDF_MAC_ADDR_FMT
" rssi: %d freq: %d akm %d cipher: uc %d mc %d, CC: %c%c",
" rssi: %d freq: %d akm %d cipher: uc %d mc %d, CC: %s",
sessionId, csr_join_req->ssId.length,
csr_join_req->ssId.ssId,
QDF_MAC_ADDR_REF(pBssDescription->bssId),
@ -15145,8 +15127,7 @@ QDF_STATUS csr_send_join_req_msg(struct mac_context *mac, uint32_t sessionId,
pProfile->negotiatedAuthType,
pProfile->negotiatedUCEncryptionType,
pProfile->negotiatedMCEncryptionType,
mac->scan.countryCodeCurrent[0],
mac->scan.countryCodeCurrent[1]);
reg_cc);
wlan_rec_conn_info(sessionId, DEBUG_CONN_CONNECTING,
pBssDescription->bssId,
pProfile->negotiatedAuthType,
@ -20311,10 +20292,10 @@ static void csr_init_operating_classes(struct mac_context *mac)
uint8_t swap = 0;
uint8_t numClasses = 0;
uint8_t opClasses[REG_MAX_SUPP_OPER_CLASSES] = {0,};
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
sme_debug("Current Country = %c%c",
mac->scan.countryCodeCurrent[0],
mac->scan.countryCodeCurrent[1]);
wlan_reg_read_current_country(mac->psoc, reg_cc);
sme_debug("Current Country = %s", reg_cc);
csr_update_op_class_array(mac, opClasses,
&mac->scan.base_channels, "20MHz", &i);

View file

@ -566,8 +566,7 @@ void csr_apply_power2_current(struct mac_context *mac)
}
void csr_apply_channel_power_info_to_fw(struct mac_context *mac_ctx,
struct csr_channel *ch_lst,
uint8_t *countryCode)
struct csr_channel *ch_lst)
{
int i;
uint8_t num_ch = 0;
@ -598,6 +597,7 @@ static void csr_diag_reset_country_information(struct mac_context *mac)
host_log_802_11d_pkt_type *p11dLog;
int Index;
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
WLAN_HOST_DIAG_LOG_ALLOC(p11dLog, host_log_802_11d_pkt_type,
LOG_WLAN_80211D_C);
@ -605,7 +605,8 @@ static void csr_diag_reset_country_information(struct mac_context *mac)
return;
p11dLog->eventId = WLAN_80211D_EVENT_RESET;
qdf_mem_copy(p11dLog->countryCode, mac->scan.countryCodeCurrent, 3);
wlan_reg_read_current_country(mac->psoc, reg_cc);
qdf_mem_copy(p11dLog->countryCode, reg_cc, 3);
p11dLog->numChannel = mac->scan.base_channels.numChannels;
if (p11dLog->numChannel <= HOST_LOG_MAX_NUM_CHANNEL) {
for (Index = 0;
@ -640,8 +641,7 @@ void csr_apply_channel_power_info_wrapper(struct mac_context *mac)
csr_save_channel_power_for_band(mac, false);
csr_save_channel_power_for_band(mac, true);
/* apply the channel list, power settings, and the country code. */
csr_apply_channel_power_info_to_fw(mac,
&mac->scan.base_channels, mac->scan.countryCodeCurrent);
csr_apply_channel_power_info_to_fw(mac, &mac->scan.base_channels);
/* clear the 11d channel list */
qdf_mem_zero(&mac->scan.channels11d, sizeof(mac->scan.channels11d));
}
@ -846,6 +846,7 @@ bool csr_learn_11dcountry_information(struct mac_context *mac,
v_REGDOMAIN_t domainId;
tDot11fBeaconIEs *pIesLocal = pIes;
bool useVoting = false;
uint8_t reg_cc[REG_ALPHA2_LEN + 1];
if ((!pSirBssDesc) && (!pIes))
useVoting = true;
@ -877,10 +878,11 @@ bool csr_learn_11dcountry_information(struct mac_context *mac,
else
pCountryCodeSelected = mac->scan.countryCodeElected;
if (qdf_mem_cmp(pCountryCodeSelected, mac->scan.countryCodeCurrent,
wlan_reg_read_current_country(mac->psoc, reg_cc);
if (qdf_mem_cmp(pCountryCodeSelected, reg_cc,
CDS_COUNTRY_CODE_LEN) == 0) {
qdf_mem_copy(mac->scan.countryCode11d,
mac->scan.countryCodeCurrent,
reg_cc,
CDS_COUNTRY_CODE_LEN);
goto free_ie;
}

View file

@ -337,8 +337,7 @@ uint32_t csr_translate_to_wni_cfg_dot11_mode(struct mac_context *mac,
enum csr_cfgdot11mode csrDot11Mode);
void csr_save_channel_power_for_band(struct mac_context *mac, bool fPopulate5GBand);
void csr_apply_channel_power_info_to_fw(struct mac_context *mac,
struct csr_channel *pChannelList,
uint8_t *countryCode);
struct csr_channel *pChannelList);
void csr_apply_power2_current(struct mac_context *mac);
/* return a bool to indicate whether roaming completed or continue. */