Merge tag 'LA.VENDOR.1.0.r1-27600-WAIPIO.QSSI15.0' of https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0 into lineage-20

LA.VENDOR.1.0.r1-27600-WAIPIO.QSSI15.0

* tag 'LA.VENDOR.1.0.r1-27600-WAIPIO.QSSI15.0' of https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0:
  Release 2.0.9.24C
  qcacld-3.0: Update ll_stats request pending flag properly
  Release 2.0.9.24B
  qcacld-3.0: Fix potential OOB memory access
  Release 2.0.9.24A
  qcacld-3.0: Fix the bandwidth switch while handling CSA WBW IE
  Release 2.0.9.24
  qcacld-3.0: Don't advertise NAN if NAN INI disabled
  qcacld-3.0: Dynamically select Iface combination
  Release 2.0.9.23Z
  qcacld-3.0: Update hdd APIs for kernel upgrade
  Release 2.0.9.23Y
  qcacld-3.0: Fix compile error when SDIO enabled

Change-Id: Ic84d8a2513d1be427fbb1eca9cd56cacc1903ed3
This commit is contained in:
Michael Bestas
2025-06-30 10:38:28 +03:00
18 changed files with 668 additions and 229 deletions

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2022, 2024-2025 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
@@ -1413,3 +1413,16 @@ bool wlan_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc)
{
return ucfg_nan_is_beamforming_supported(psoc);
}
bool nan_is_allowed(struct wlan_objmgr_psoc *psoc)
{
struct nan_psoc_priv_obj *psoc_nan_obj;
psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
if (!psoc_nan_obj) {
nan_err("psoc_nan_obj is null");
return false;
}
return psoc_nan_obj->cfg_param.enable;
}

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021,2025 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
@@ -287,6 +287,13 @@ bool nan_is_disc_active(struct wlan_objmgr_psoc *psoc);
QDF_STATUS
nan_get_connection_info(struct wlan_objmgr_psoc *psoc, uint8_t *chan,
uint8_t *mac_id);
/**
* nan_is_allowed() - This API will check for NAN enable INI
*
* @psoc: pointer to PSOC object
*
* Return: true if NAN is allowed otherwise false
*/
bool nan_is_allowed(struct wlan_objmgr_psoc *psoc);
#endif /* _WLAN_NAN_MAIN_I_H_ */
#endif /* WLAN_FEATURE_NAN */

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2022, 2025 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
@@ -537,6 +537,14 @@ bool ucfg_get_disable_6g_nan(struct wlan_objmgr_psoc *psoc);
*/
bool ucfg_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_nan_is_allowed() - This API is wrapper for function nan_is_allowed()
*
* @psoc: pointer to PSOC object
*
* Return: true if nan is allowed otherwise false
*/
bool ucfg_nan_is_allowed(struct wlan_objmgr_psoc *psoc);
#else /* WLAN_FEATURE_NAN */
static inline
@@ -679,5 +687,10 @@ ucfg_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc)
{
return false;
}
static inline bool ucfg_nan_is_allowed(struct wlan_objmgr_psoc *psoc)
{
return false;
}
#endif /* WLAN_FEATURE_NAN */
#endif /* _NAN_UCFG_API_H_ */

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2025 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
@@ -1276,12 +1276,6 @@ bool ucfg_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc)
return psoc_nan_obj->nan_caps.ndi_txbf_supported;
}
static inline bool
ucfg_is_nan_enabled(struct nan_psoc_priv_obj *psoc_nan_obj)
{
return psoc_nan_obj->cfg_param.enable;
}
static inline bool
ucfg_nan_is_vdev_creation_supp_by_fw(struct nan_psoc_priv_obj *psoc_nan_obj)
{
@@ -1353,7 +1347,7 @@ bool ucfg_nan_is_vdev_creation_allowed(struct wlan_objmgr_psoc *psoc)
return false;
}
if (!ucfg_is_nan_enabled(psoc_nan_obj)) {
if (!nan_is_allowed(psoc)) {
nan_debug("NAN is not enabled");
return false;
}
@@ -1448,3 +1442,8 @@ bool ucfg_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc)
{
return wlan_is_mlo_sta_nan_ndi_allowed(psoc);
}
bool ucfg_nan_is_allowed(struct wlan_objmgr_psoc *psoc)
{
return nan_is_allowed(psoc);
}

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2018, 2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2025 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
@@ -490,6 +491,7 @@ static int target_if_dcc_get_stats_resp(ol_scn_t scn,
rc = 0;
} else {
target_if_fatal("No dcc_stats_indicate callback");
response = NULL;
rc = -EINVAL;
}
exit:

View File

@@ -1880,22 +1880,6 @@
#define WLAN_FEATURE_SAP_ACS_OPTIMIZE (1)
#endif
#ifdef CONFIG_WLAN_FEATURE_NO_STA_SAP_CONCURRENCY
#define WLAN_FEATURE_NO_STA_SAP_CONCURRENCY (1)
#endif
#ifdef CONFIG_WLAN_FEATURE_NO_STA_NAN_CONCURRENCY
#define WLAN_FEATURE_NO_STA_NAN_CONCURRENCY (1)
#endif
#ifdef CONFIG_WLAN_FEATURE_NO_P2P_CONCURRENCY
#define WLAN_FEATURE_NO_P2P_CONCURRENCY (1)
#endif
#ifdef CONFIG_WLAN_FEATURE_NO_SAP_NAN_CONCURRENCY
#define WLAN_FEATURE_NO_SAP_NAN_CONCURRENCY (1)
#endif
#ifdef CONFIG_VERBOSE_DEBUG
#define ENABLE_VERBOSE_DEBUG (1)
#endif

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2025 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
@@ -71,7 +72,7 @@ htt_set_checksum_result_hl(qdf_nbuf_t msdu,
int is_udp = flag & HTT_RX_IND_HL_FLAG_UDP ? 1 : 0;
qdf_nbuf_rx_cksum_t cksum = {
QDF_NBUF_RX_CKSUM_NONE,
QDF_NBUF_RX_CKSUM_ZERO,
QDF_NBUF_RX_CKSUM_NONE,
0
};
@@ -90,7 +91,7 @@ htt_set_checksum_result_hl(qdf_nbuf_t msdu,
cksum.l4_type = QDF_NBUF_RX_CKSUM_TCPIPV6;
break;
default:
cksum.l4_type = QDF_NBUF_RX_CKSUM_NONE;
cksum.l4_type = QDF_NBUF_RX_CKSUM_ZERO;
break;
}
if (cksum.l4_type != (qdf_nbuf_l4_rx_cksum_type_t)

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2025 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
@@ -1852,6 +1852,129 @@ enum host_log_level {
#define CFG_DYNAMIC_MAC_ADDR_UPDATE_SUPPORTED_ALL
#endif
/*
* <ini>
* g_no_p2p_concurrency - disable P2P concurrency
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini will not allow P2P iface to be included in the iface combinations.
*
* 0: enable P2P concurrency
* 1: disable P2P concurrency
* Related: None
*
* Supported Feature: IFACE combinations
*
* Usage: External
*
* </ini>
*/
#define CFG_NO_P2P_CONCURRENCY CFG_INI_BOOL( \
"g_no_p2p_concurrency", \
0, \
"This ini is used to disable P2P concurrency")
/*
* <ini>
* g_no_sap_nan_concurrency - disable SAP-NAN concurrency
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini will not allow SAP-NAN Concurrency to be included in the
* iface combinations.
*
* 0: enable SAP-NAN concurrency
* 1: disable SAP-NAN concurrency
* Related: None
*
* Supported Feature: IFACE combinations
*
* Usage: External
*
* </ini>
*/
#define CFG_NO_SAP_NAN_CONCURRENCY CFG_INI_BOOL( \
"g_no_sap_nan_concurrency", \
0, \
"This ini is used to disable SAP-NAN concurrency")
/*
* <ini>
* g_no_sta_nan_concurrency - disable STA-NAN concurrency
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini will not allow STA-NAN Concurrency to be included in the
* iface combinations.
*
* 0: enable STA-NAN concurrency
* 1: disable STA-NAN concurrency
* Related: None
*
* Supported Feature: IFACE combinations
*
* Usage: External
*
* </ini>
*/
#define CFG_NO_STA_NAN_CONCURRENCY CFG_INI_BOOL( \
"g_no_sta_nan_concurrency", \
0, \
"This ini is used to disable STA-NAN concurrency")
/*
* <ini>
* g_no_sta_sap_concurrency - disable STA-SAP concurrency
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini will not allow STA-SAP concurrency to be included in the
* iface combinations.
*
* 0: enable STA-SAP concurrency
* 1: disable STA-SAP concurrency
* Related: None
*
* Supported Feature: IFACE combinations
*
* Usage: External
*
* </ini>
*/
#define CFG_NO_STA_SAP_CONCURRENCY CFG_INI_BOOL( \
"g_no_sta_sap_concurrency", \
0, \
"This ini is used to disable STA-SAP concurrency")
/*
* <ini>
* g_sta_sap_p2p_concurrency - enable STA-SAP-P2P concurrency
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini will not allow STA-SAP-P2P concurrency to be included in the
* iface combinations.
*
* 0: disable STA-SAP-P2P concurrency
* 1: enable STA-SAP-P2P concurrency
* Related: None
*
* Supported Feature: IFACE combinations
*
* Usage: External
*
* </ini>
*/
#define CFG_STA_SAP_P2P_CONCURRENCY CFG_INI_BOOL( \
"g_sta_sap_p2p_concurrency", \
0, \
"This ini is used to enable STA-SAP-P2P concurrency")
#define CFG_HDD_ALL \
CFG_DYNAMIC_MAC_ADDR_UPDATE_SUPPORTED_ALL \
CFG_ENABLE_PACKET_LOG_ALL \
@@ -1901,5 +2024,10 @@ enum host_log_level {
CFG(CFG_SAR_CONVERSION) \
CFG(CFG_ENABLE_HOST_MODULE_LOG_LEVEL) \
SAR_SAFETY_FEATURE_ALL \
CFG_CPU_CXPC_THRESHOLD_ALL
CFG_CPU_CXPC_THRESHOLD_ALL \
CFG(CFG_NO_STA_SAP_CONCURRENCY) \
CFG(CFG_NO_STA_NAN_CONCURRENCY) \
CFG(CFG_NO_SAP_NAN_CONCURRENCY) \
CFG(CFG_NO_P2P_CONCURRENCY) \
CFG(CFG_STA_SAP_P2P_CONCURRENCY)
#endif

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2025 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
@@ -819,10 +819,10 @@ struct hdd_stats {
struct hdd_eapol_stats_s hdd_eapol_stats;
struct hdd_dhcp_stats_s hdd_dhcp_stats;
struct pmf_bcn_protect_stats bcn_protect_stats;
qdf_atomic_t is_ll_stats_req_pending;
#ifdef FEATURE_CLUB_LL_STATS_AND_GET_STATION
uint32_t sta_stats_cached_timestamp;
bool is_ll_stats_req_in_progress;
#endif
};
@@ -2021,6 +2021,7 @@ struct hdd_rtpm_tput_policy_context {
* @hdd_dual_sta_policy: Concurrent STA policy configuration
* @last_pagefault_ssr_time: Time when last recovery was triggered because of
* @host wakeup from fw with reason as pagefault
* @combination: interface combination register to wiphy
*/
struct hdd_context {
struct wlan_objmgr_psoc *psoc;
@@ -2402,6 +2403,7 @@ struct hdd_context {
uint8_t power_type;
#endif
qdf_time_t last_pagefault_ssr_time;
struct ieee80211_iface_combination *combination;
};
/**
@@ -5363,4 +5365,22 @@ static inline int hdd_set_suspend_mode(struct hdd_context *hdd_ctx)
*/
void hdd_update_multicast_list(struct wlan_objmgr_vdev *vdev);
/**
* wlan_hdd_alloc_iface_combination_mem() - This API will allocate memory for
* interface combinations
* @hdd_ctx: HDD context
*
* Return: 0 on success and -ENOMEM on failure
*/
int wlan_hdd_alloc_iface_combination_mem(struct hdd_context *hdd_ctx);
/**
* wlan_hdd_free_iface_combination_mem() - This API will free memory for
* interface combinations
* @hdd_ctx: HDD context
*
* Return: none
*/
void wlan_hdd_free_iface_combination_mem(struct hdd_context *hdd_ctx);
#endif /* end #if !defined(WLAN_HDD_MAIN_H) */

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2025 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
@@ -770,6 +770,14 @@ static struct ieee80211_iface_combination
.beacon_int_min_gcd = 1,
#endif
},
/* STA + P2P */
{
.limits = wlan_hdd_sta_p2p_iface_limit,
.num_different_channels = 2,
.max_interfaces = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_sta_p2p_iface_limit),
.beacon_int_infra_match = true,
},
/* STA + P2P + P2P */
{
.limits = wlan_hdd_sta_p2p_iface_limit,
@@ -834,103 +842,6 @@ static struct ieee80211_iface_combination
#endif /* WLAN_FEATURE_NAN */
};
/* 1 and 2 port concurrencies */
static struct ieee80211_iface_combination
wlan_hdd_derived_combination[] = {
/* STA */
{
.limits = wlan_hdd_sta_iface_limit,
.num_different_channels = 2,
.max_interfaces = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_sta_iface_limit),
},
/* AP */
{
.limits = wlan_hdd_ap_iface_limit,
.num_different_channels = 2,
.max_interfaces = (QDF_MAX_NO_OF_SAP_MODE),
.n_limits = ARRAY_SIZE(wlan_hdd_ap_iface_limit),
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)) || \
defined(CFG80211_BEACON_INTERVAL_BACKPORT)
.beacon_int_min_gcd = 1,
#endif
},
#ifndef WLAN_FEATURE_NO_P2P_CONCURRENCY
/* P2P */
{
.limits = wlan_hdd_p2p_iface_limit,
.num_different_channels = 2,
.max_interfaces = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_p2p_iface_limit),
},
/* SAP + P2P */
{
.limits = wlan_hdd_sap_p2p_iface_limit,
.num_different_channels = 2,
/* 1-SAP + 1-P2P */
.max_interfaces = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_sap_p2p_iface_limit),
.beacon_int_infra_match = true,
},
/* P2P + P2P */
{
.limits = wlan_hdd_p2p_p2p_iface_limit,
.num_different_channels = 2,
/* 2-P2P */
.max_interfaces = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_p2p_p2p_iface_limit),
.beacon_int_infra_match = true,
},
#endif
/* STA + P2P */
{
.limits = wlan_hdd_sta_p2p_iface_limit,
.num_different_channels = 2,
.max_interfaces = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_sta_p2p_iface_limit),
.beacon_int_infra_match = true,
},
#ifndef WLAN_FEATURE_NO_STA_SAP_CONCURRENCY
/* STA + SAP */
{
.limits = wlan_hdd_sta_ap_iface_limit,
.num_different_channels = 2,
.max_interfaces = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_sta_ap_iface_limit),
.beacon_int_infra_match = true,
},
#endif /* WLAN_FEATURE_NO_STA_SAP_CONCURRENCY */
/* Monitor */
{
.limits = wlan_hdd_mon_iface_limit,
.max_interfaces = 2,
.num_different_channels = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_mon_iface_limit),
},
#if defined(WLAN_FEATURE_NAN) && \
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0))
#ifndef WLAN_FEATURE_NO_STA_NAN_CONCURRENCY
/* NAN + STA */
{
.limits = wlan_hdd_sta_nan_iface_limit,
.max_interfaces = 2,
.num_different_channels = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_sta_nan_iface_limit),
},
#endif /* WLAN_FEATURE_NO_STA_NAN_CONCURRENCY */
#ifndef WLAN_FEATURE_NO_SAP_NAN_CONCURRENCY
/* NAN + SAP */
{
.limits = wlan_hdd_sap_nan_iface_limit,
.num_different_channels = 2,
.max_interfaces = 2,
.n_limits = ARRAY_SIZE(wlan_hdd_sap_nan_iface_limit),
.beacon_int_infra_match = true,
},
#endif /* !WLAN_FEATURE_NO_SAP_NAN_CONCURRENCY */
#endif /* WLAN_FEATURE_NAN */
};
static struct cfg80211_ops wlan_hdd_cfg80211_ops;
#ifdef WLAN_NL80211_TESTMODE
@@ -18982,8 +18893,6 @@ int wlan_hdd_cfg80211_init(struct device *dev,
| BIT(NL80211_IFTYPE_AP)
| BIT(NL80211_IFTYPE_MONITOR);
wlan_hdd_set_nan_if_mode(wiphy);
/*
* In case of static linked driver at the time of driver unload,
* module exit doesn't happens. Module cleanup helps in cleaning
@@ -19300,6 +19209,366 @@ static void wlan_hdd_set_mfp_optional(struct wiphy *wiphy)
}
#endif
/**
* wlan_hdd_iface_debug_string() - This API converts IFACE type to string
* @iface_type: interface type
*
* Return: name string
*/
static char *wlan_hdd_iface_debug_string(uint32_t iface_type)
{
if (iface_type == BIT(NL80211_IFTYPE_STATION))
return "STA";
else if (iface_type == BIT(NL80211_IFTYPE_AP))
return "SAP";
else if (iface_type == (BIT(NL80211_IFTYPE_P2P_CLIENT) |
BIT(NL80211_IFTYPE_P2P_GO)))
return "(P2P_CLI or P2P_GO)";
else if (iface_type == BIT(NL80211_IFTYPE_P2P_CLIENT))
return "P2P_CLIENT";
else if (iface_type == BIT(NL80211_IFTYPE_P2P_GO))
return "P2P_GO";
else if (iface_type == BIT(NL80211_IFTYPE_NAN))
return "NAN";
else if (iface_type == BIT(NL80211_IFTYPE_MONITOR))
return "MONITOR";
return "invalid iface";
}
#define IFACE_DUMP_SIZE 100
/**
* wlan_hdd_dump_iface_combinations() - This API prints the IFACE combinations
* @num: number of combinations
* @combination: pointer to iface combination structure
*
* Return: void
*/
static void wlan_hdd_dump_iface_combinations(uint32_t num,
const struct ieee80211_iface_combination *combination)
{
int i, j, k;
char buf[IFACE_DUMP_SIZE] = {0};
uint8_t len = 0;
hdd_debug("max combinations %d", num);
for (i = 0; i < num; i++) {
for (j = 0; j < combination[i].n_limits; j++) {
for (k = 0; k < combination[i].limits[j].max; k++) {
if (combination[i].limits[j].types)
len += qdf_scnprintf(buf + len,
IFACE_DUMP_SIZE - len,
k == 0 && j == 0 ? "%s" : "+%s",
wlan_hdd_iface_debug_string(
combination[i].limits[j].types));
}
}
hdd_nofl_debug("iface combination[%d]: %s", i, buf);
len = 0;
}
}
/**
* wlan_hdd_is_sta_sap_concurrency_present() - This API checks whether STA and
* SAP present in the interface combination
* @idx: index for interface combination array
*
* Return: true if STA and SAP interface is present otherwise false
*/
static bool wlan_hdd_is_sta_sap_concurrency_present(uint8_t idx)
{
int j = 0;
bool sta_present = false;
bool sap_present = false;
for (j = 0; j < wlan_hdd_iface_combination[idx].n_limits; j++) {
if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_STATION))
sta_present = true;
else if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_AP))
sap_present = true;
}
return (sta_present && sap_present);
}
/**
* wlan_hdd_is_sta_nan_concurrency_present() - This API checks whether STA and
* NAN present in the interface combination
* @idx: index for interface combination array
*
* Return: true if STA and NAN interface is present otherwise false
*/
static bool wlan_hdd_is_sta_nan_concurrency_present(uint8_t idx)
{
int j = 0;
bool nan_present = false;
bool sta_present = false;
for (j = 0; j < wlan_hdd_iface_combination[idx].n_limits; j++) {
if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_NAN))
nan_present = true;
else if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_STATION))
sta_present = true;
}
return (nan_present && sta_present);
}
/**
* wlan_hdd_is_sap_nan_concurrency_present() - This API checks whether SAP and
* NAN present in the interface combination
* @idx: index for interface combination array
*
* Return: true if SAP and NAN interface is present otherwise false
*/
static bool wlan_hdd_is_sap_nan_concurrency_present(uint8_t idx)
{
int j = 0;
bool nan_present = false;
bool sap_present = false;
for (j = 0; j < wlan_hdd_iface_combination[idx].n_limits; j++) {
if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_NAN))
nan_present = true;
else if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_AP))
sap_present = true;
}
return (nan_present && sap_present);
}
/**
* wlan_hdd_is_p2p_iface_present() - This API checks whether P2P present
* in the interface combination
* @idx: index for interface combination array
*
* Return: true if SAP interface is present otherwise false
*/
static bool wlan_hdd_is_p2p_iface_present(uint8_t idx)
{
int j = 0;
bool p2p_present = false;
for (j = 0; j < wlan_hdd_iface_combination[idx].n_limits; j++) {
if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_P2P_CLIENT) ||
wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_P2P_GO) ||
(wlan_hdd_iface_combination[idx].limits[j].types ==
(BIT(NL80211_IFTYPE_P2P_CLIENT) |
BIT(NL80211_IFTYPE_P2P_GO))))
p2p_present = true;
}
return p2p_present;
}
/**
* wlan_hdd_is_sta_p2p_concurrency_present() - This API checks whether STA + P2P
* only present in the interface combination
* @idx: index for interface combination array
*
* Return: true if STA and P2P interface is present otherwise false
*/
static bool wlan_hdd_is_sta_p2p_concurrency_present(uint8_t idx)
{
int j = 0;
bool p2p_present = false;
bool sta_present = false;
if (wlan_hdd_iface_combination[idx].max_interfaces != 2)
return false;
for (j = 0; j < wlan_hdd_iface_combination[idx].n_limits; j++) {
if (wlan_hdd_iface_combination[idx].limits[j].types ==
(BIT(NL80211_IFTYPE_P2P_CLIENT) |
BIT(NL80211_IFTYPE_P2P_GO)))
p2p_present = true;
else if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_STATION))
sta_present = true;
}
return (p2p_present && sta_present);
}
/**
* wlan_hdd_is_p2p_concurrency_present() - This API checks whether P2P
* concurrency is present in the interface combination
* @sta_sap_p2p_concurrency: flag to check STA-SAP-P2P concurrency
* @idx: index for interface combination array
*
* This API will allow the P2P concurrencies with following exception:
* a) STA-P2P
* b) STA-SAP-P2P when g_sta_sap_p2p INI is enabled
*
* Return: true if P2P allowed otherwise false
*/
static bool wlan_hdd_is_p2p_concurrency_present(bool sta_sap_p2p_concurrency,
uint8_t idx)
{
if (wlan_hdd_is_sta_p2p_concurrency_present(idx))
return false;
if (!wlan_hdd_is_p2p_iface_present(idx))
return false;
if (sta_sap_p2p_concurrency &&
wlan_hdd_is_sta_sap_concurrency_present(idx))
return false;
return true;
}
int wlan_hdd_alloc_iface_combination_mem(struct hdd_context *hdd_ctx)
{
uint8_t num = ARRAY_SIZE(wlan_hdd_iface_combination);
hdd_ctx->combination =
qdf_mem_malloc(num * sizeof(wlan_hdd_iface_combination));
if (!hdd_ctx->combination)
return -ENOMEM;
return 0;
}
void wlan_hdd_free_iface_combination_mem(struct hdd_context *hdd_ctx)
{
if (hdd_ctx->combination) {
qdf_mem_free(hdd_ctx->combination);
hdd_ctx->combination = NULL;
}
}
/**
* wlan_hdd_is_iface_nan() - This API checks whether NAN interface is present
* in the interface combination
* @idx: index for interface combination array
*
* Return: true if NAN interface is present otherwise false
*/
static bool wlan_hdd_is_iface_nan(uint8_t idx)
{
uint8_t j;
for (j = 0; j < wlan_hdd_iface_combination[idx].n_limits; j++) {
if (wlan_hdd_iface_combination[idx].limits[j].types ==
BIT(NL80211_IFTYPE_NAN))
return true;
}
return false;
}
/**
* wlan_hdd_update_iface_combination() - This API updates interface combination
* @hdd_ctx: HDD context
* @wiphy: WIPHY structure pointer
* @allow_mcc_go_diff_bi: allow MCC go different beacon interval
* @enable_mcc: enable MCC feature
*
* Return: none
*/
static void wlan_hdd_update_iface_combination(struct hdd_context *hdd_ctx,
struct wiphy *wiphy,
uint8_t allow_mcc_go_diff_bi,
uint8_t enable_mcc)
{
uint8_t i, j = 0;
bool dbs_one_by_one, dbs_two_by_two;
struct wlan_objmgr_psoc *psoc = hdd_ctx->psoc;
bool no_p2p_concurrency, no_sap_nan_concurrency, no_sta_sap_concurrency;
bool no_sta_nan_concurrency, sta_sap_p2p_concurrency;
uint8_t num;
QDF_STATUS status;
bool is_nan_allowed;
if (!hdd_ctx->config->advertise_concurrent_operation)
return;
status = ucfg_policy_mgr_get_dbs_hw_modes(psoc, &dbs_one_by_one,
&dbs_two_by_two);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("HW mode failure");
return;
}
no_p2p_concurrency = cfg_get(psoc, CFG_NO_P2P_CONCURRENCY);
no_sta_nan_concurrency = cfg_get(psoc, CFG_NO_STA_NAN_CONCURRENCY);
no_sap_nan_concurrency = cfg_get(psoc, CFG_NO_SAP_NAN_CONCURRENCY);
no_sta_sap_concurrency = cfg_get(psoc, CFG_NO_STA_SAP_CONCURRENCY);
sta_sap_p2p_concurrency = cfg_get(psoc, CFG_STA_SAP_P2P_CONCURRENCY);
num = ARRAY_SIZE(wlan_hdd_iface_combination);
is_nan_allowed = ucfg_nan_is_allowed(psoc);
if (is_nan_allowed)
wlan_hdd_set_nan_if_mode(wiphy);
for (i = 0; i < num; i++) {
/* Filter for non-DBS targets */
if (!ucfg_policy_mgr_is_fw_supports_dbs(psoc) &&
wlan_hdd_iface_combination[i].max_interfaces > 2)
continue;
/* Filter for 1x1 DBS targets */
if ((dbs_one_by_one && !dbs_two_by_two) &&
wlan_hdd_iface_combination[i].max_interfaces > 2)
continue;
/*
* remove P2P concurrencies with following exception:
* a) STA-P2P
* b) STA-SAP-P2P when g_sta_sap_p2p INI is enabled
*/
if (no_p2p_concurrency &&
wlan_hdd_is_p2p_concurrency_present(sta_sap_p2p_concurrency,
i))
continue;
/* remove NAN concurrency if NAN is not allowed */
if (wlan_hdd_is_iface_nan(i) && !is_nan_allowed)
continue;
/* remove STA NAN concurrency */
if (no_sta_nan_concurrency &&
wlan_hdd_is_sta_nan_concurrency_present(i))
continue;
/* remove SAP NAN concurrency */
if (no_sap_nan_concurrency &&
wlan_hdd_is_sap_nan_concurrency_present(i))
continue;
/* remove STA SAP concurrency */
if (no_sta_sap_concurrency &&
wlan_hdd_is_sta_sap_concurrency_present(i))
continue;
hdd_ctx->combination[j] = wlan_hdd_iface_combination[i];
if (enable_mcc && !allow_mcc_go_diff_bi)
hdd_ctx->combination[j].beacon_int_infra_match = true;
j++;
}
wiphy->iface_combinations = hdd_ctx->combination;
wiphy->n_iface_combinations = j;
wlan_hdd_dump_iface_combinations(wiphy->n_iface_combinations,
wiphy->iface_combinations);
}
/*
* In this function, wiphy structure is updated after QDF
* initialization. In wlan_hdd_cfg80211_init, only the
@@ -19316,8 +19585,6 @@ void wlan_hdd_update_wiphy(struct hdd_context *hdd_ctx)
uint8_t allow_mcc_go_diff_bi = 0, enable_mcc = 0;
bool is_bigtk_supported;
bool is_ocv_supported;
uint8_t iface_num;
bool dbs_one_by_one, dbs_two_by_two;
if (!wiphy) {
hdd_err("Invalid wiphy");
@@ -19368,40 +19635,8 @@ void wlan_hdd_update_wiphy(struct hdd_context *hdd_ctx)
ucfg_mlme_get_mcc_feature(hdd_ctx->psoc, &enable_mcc))
hdd_err("can't get enable_mcc value, use default");
if (hdd_ctx->config->advertise_concurrent_operation) {
if (enable_mcc) {
int i;
for (i = 0;
i < ARRAY_SIZE(wlan_hdd_iface_combination);
i++) {
if (!allow_mcc_go_diff_bi)
wlan_hdd_iface_combination[i].
beacon_int_infra_match = true;
}
}
status = ucfg_policy_mgr_get_dbs_hw_modes(hdd_ctx->psoc,
&dbs_one_by_one,
&dbs_two_by_two);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("HW mode failure");
return;
}
if (!ucfg_policy_mgr_is_fw_supports_dbs(hdd_ctx->psoc) ||
(dbs_one_by_one && !dbs_two_by_two)) {
wiphy->iface_combinations =
wlan_hdd_derived_combination;
iface_num = ARRAY_SIZE(wlan_hdd_derived_combination);
} else {
wiphy->iface_combinations = wlan_hdd_iface_combination;
iface_num = ARRAY_SIZE(wlan_hdd_iface_combination);
}
wiphy->n_iface_combinations = iface_num;
}
wlan_hdd_update_iface_combination(hdd_ctx, wiphy, allow_mcc_go_diff_bi,
enable_mcc);
mac_spoofing_enabled = ucfg_scan_is_mac_spoofing_enabled(hdd_ctx->psoc);
if (mac_spoofing_enabled)

View File

@@ -7527,6 +7527,33 @@ static int __wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
return status;
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
/**
* wlan_hdd_cfg80211_change_beacon() - change beacon content in sap mode
* @wiphy: Pointer to wiphy
* @dev: Pointer to netdev
* @params: Pointer to ap update parameters
*
* Return: zero for success non-zero for failure
*/
int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_ap_update *params)
{
int errno;
struct osif_vdev_sync *vdev_sync;
errno = osif_vdev_sync_op_start(dev, &vdev_sync);
if (errno)
return errno;
errno = __wlan_hdd_cfg80211_change_beacon(wiphy, dev, &params->beacon);
osif_vdev_sync_op_stop(vdev_sync);
return errno;
}
#else
/**
* wlan_hdd_cfg80211_change_beacon() - change beacon content in sap mode
* @wiphy: Pointer to wiphy
@@ -7552,6 +7579,7 @@ int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
return errno;
}
#endif
/**
* hdd_sap_indicate_disconnect_for_sta() - Indicate disconnect indication

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022, 2025 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
@@ -326,11 +326,15 @@ int wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
int wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_ap_settings *params);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_ap_update *params);
#else
int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_beacon_data *params);
#endif
/**
* hdd_is_peer_associated - is peer connected to softap
* @adapter: pointer to softap adapter

View File

@@ -1762,7 +1762,6 @@ hdd_update_feature_cfg_club_get_sta_in_ll_stats_req(
static void
hdd_init_get_sta_in_ll_stats_config(struct hdd_adapter *adapter)
{
adapter->hdd_stats.is_ll_stats_req_in_progress = false;
adapter->hdd_stats.sta_stats_cached_timestamp = 0;
}
#else
@@ -6307,6 +6306,7 @@ hdd_alloc_station_adapter(struct hdd_context *hdd_ctx, tSirMacAddr mac_addr,
adapter->start_time = qdf_system_ticks();
adapter->last_time = adapter->start_time;
qdf_atomic_init(&adapter->hdd_stats.is_ll_stats_req_pending);
hdd_init_get_sta_in_ll_stats_config(adapter);
return adapter;
@@ -9988,6 +9988,8 @@ void hdd_wlan_exit(struct hdd_context *hdd_ctx)
hdd_lpass_notify_stop(hdd_ctx);
}
wlan_hdd_free_iface_combination_mem(hdd_ctx);
hdd_deinit_regulatory_update_event(hdd_ctx);
hdd_exit_netlink_services(hdd_ctx);
#ifdef FEATURE_WLAN_CH_AVOID
@@ -16349,18 +16351,23 @@ int hdd_wlan_startup(struct hdd_context *hdd_ctx)
hdd_driver_memdump_init();
hdd_dp_trace_init(hdd_ctx->config);
errno = wlan_hdd_alloc_iface_combination_mem(hdd_ctx);
if (errno) {
hdd_err("failed to alloc iface combination mem");
goto memdump_deinit;
}
errno = hdd_init_regulatory_update_event(hdd_ctx);
if (errno) {
hdd_err("Failed to initialize regulatory update event; errno:%d",
errno);
goto memdump_deinit;
goto free_iface_comb;
}
errno = hdd_wlan_start_modules(hdd_ctx, false);
if (errno) {
hdd_err("Failed to start modules; errno:%d", errno);
goto memdump_deinit;
goto free_iface_comb;
}
if (hdd_get_conparam() == QDF_GLOBAL_EPPING_MODE)
@@ -16420,6 +16427,9 @@ unregister_wiphy:
stop_modules:
hdd_wlan_stop_modules(hdd_ctx, false);
free_iface_comb:
wlan_hdd_free_iface_combination_mem(hdd_ctx);
memdump_deinit:
hdd_driver_memdump_deinit();
osif_request_manager_deinit();

View File

@@ -1911,6 +1911,18 @@ static void wlan_hdd_dealloc_ll_stats(void *priv)
qdf_list_destroy(&ll_stats_priv->ll_stats_q);
}
static QDF_STATUS
wlan_hdd_set_ll_stats_request_pending(struct hdd_adapter *adapter)
{
if (qdf_atomic_read(&adapter->hdd_stats.is_ll_stats_req_pending)) {
hdd_nofl_debug("Previous ll_stats request is in progress");
return QDF_STATUS_E_ALREADY;
}
qdf_atomic_set(&adapter->hdd_stats.is_ll_stats_req_pending, 1);
return QDF_STATUS_SUCCESS;
}
#ifdef FEATURE_CLUB_LL_STATS_AND_GET_STATION
/**
* cache_station_stats_cb() - cache_station_stats_cb callback function
@@ -1963,16 +1975,11 @@ wlan_hdd_set_station_stats_request_pending(struct hdd_adapter *adapter)
if (!vdev)
return QDF_STATUS_E_INVAL;
if (adapter->hdd_stats.is_ll_stats_req_in_progress) {
hdd_err("Previous ll_stats request is in progress");
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_STATS_ID);
return QDF_STATUS_E_ALREADY;
}
info.cookie = adapter;
info.u.get_station_stats_cb = cache_station_stats_cb;
info.vdev_id = adapter->vdev_id;
info.pdev_id = wlan_objmgr_pdev_get_pdev_id(wlan_vdev_get_pdev(vdev));
peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_OSIF_STATS_ID);
if (!peer) {
osif_err("peer is null");
@@ -1980,14 +1987,13 @@ wlan_hdd_set_station_stats_request_pending(struct hdd_adapter *adapter)
return QDF_STATUS_E_INVAL;
}
adapter->hdd_stats.is_ll_stats_req_in_progress = true;
qdf_mem_copy(info.peer_mac_addr, peer->macaddr, QDF_MAC_ADDR_SIZE);
wlan_objmgr_peer_release_ref(peer, WLAN_OSIF_STATS_ID);
ucfg_mc_cp_stats_set_pending_req(wlan_vdev_get_psoc(vdev),
TYPE_STATION_STATS, &info);
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_STATS_ID);
return QDF_STATUS_SUCCESS;
}
@@ -2003,8 +2009,6 @@ wlan_hdd_reset_station_stats_request_pending(struct wlan_objmgr_psoc *psoc,
if (!adapter->hdd_ctx->is_get_station_clubbed_in_ll_stats_req)
return;
adapter->hdd_stats.is_ll_stats_req_in_progress = false;
status = ucfg_mc_cp_stats_get_pending_req(psoc, TYPE_STATION_STATS,
&last_req);
if (QDF_IS_STATUS_ERROR(status)) {
@@ -2076,10 +2080,14 @@ static int wlan_hdd_send_ll_stats_req(struct hdd_adapter *adapter,
hdd_enter_dev(adapter->dev);
status = wlan_hdd_set_station_stats_request_pending(adapter);
if (status == QDF_STATUS_E_ALREADY)
status = wlan_hdd_set_ll_stats_request_pending(adapter);
if (QDF_IS_STATUS_ERROR(status))
return qdf_status_to_os_return(status);
status = wlan_hdd_set_station_stats_request_pending(adapter);
if (QDF_IS_STATUS_ERROR(status))
hdd_nofl_debug("Requesting LL_STATS only");
/*
* FW can send radio stats with multiple events and for the first event
* host allocates memory in wma and processes the events, there is a
@@ -2149,6 +2157,7 @@ static int wlan_hdd_send_ll_stats_req(struct hdd_adapter *adapter,
}
qdf_list_destroy(&priv->ll_stats_q);
exit:
qdf_atomic_set(&adapter->hdd_stats.is_ll_stats_req_pending, 0);
wlan_hdd_reset_station_stats_request_pending(hdd_ctx->psoc, adapter);
hdd_exit();
osif_request_put(request);

View File

@@ -32,9 +32,9 @@
#define QWLAN_VERSION_MAJOR 2
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 9
#define QWLAN_VERSION_EXTRA "X"
#define QWLAN_VERSION_BUILD 23
#define QWLAN_VERSION_EXTRA "C"
#define QWLAN_VERSION_BUILD 24
#define QWLAN_VERSIONSTR "2.0.9.23X"
#define QWLAN_VERSIONSTR "2.0.9.24C"
#endif /* QWLAN_VERSION_H */

View File

@@ -1600,10 +1600,8 @@ static QDF_STATUS lim_process_csa_wbw_ie(struct mac_context *mac_ctx,
ap_new_ch_width = csa_params->new_ch_width + 1;
if (!csa_params->new_ch_freq_seg1 && !csa_params->new_ch_freq_seg2) {
pe_err("CSA wide BW IE has invalid center freq");
if (!csa_params->new_ch_freq_seg1 && !csa_params->new_ch_freq_seg2)
return QDF_STATUS_E_INVAL;
}
csa_cent_freq = csa_params->csa_chan_freq;
if (wlan_reg_is_6ghz_op_class(mac_ctx->pdev,
@@ -1647,7 +1645,7 @@ static QDF_STATUS lim_process_csa_wbw_ie(struct mac_context *mac_ctx,
csa_cent_freq1 = cent_freq1;
break;
default:
pe_err("CSA wide BW IE has wrong ch_width %d", ap_new_ch_width);
pe_debug("CSA wide BW IE has ch_width %d", ap_new_ch_width);
return QDF_STATUS_E_INVAL;
}
@@ -1705,18 +1703,19 @@ static QDF_STATUS lim_process_csa_wbw_ie(struct mac_context *mac_ctx,
}
if (ap_new_ch_width > fw_vht_ch_wd) {
pe_debug("New BW is not supported, setting BW to %d",
pe_debug("New BW is not supported, downgrade BW to %d",
fw_vht_ch_wd);
ap_new_ch_width = fw_vht_ch_wd;
ch_params.ch_width = ap_new_ch_width;
wlan_reg_set_channel_params_for_freq(mac_ctx->pdev,
csa_params->csa_chan_freq,
0, &ch_params);
ap_new_ch_width = ch_params.ch_width;
csa_params->new_ch_freq_seg1 = ch_params.center_freq_seg0;
csa_params->new_ch_freq_seg2 = ch_params.center_freq_seg1;
}
ch_params.ch_width = ap_new_ch_width;
wlan_reg_set_channel_params_for_freq(mac_ctx->pdev,
csa_params->csa_chan_freq,
0, &ch_params);
ap_new_ch_width = ch_params.ch_width;
csa_params->new_ch_freq_seg1 = ch_params.center_freq_seg0;
csa_params->new_ch_freq_seg2 = ch_params.center_freq_seg1;
session_entry->gLimChannelSwitch.state =
eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY;
@@ -1724,18 +1723,6 @@ static QDF_STATUS lim_process_csa_wbw_ie(struct mac_context *mac_ctx,
chnl_switch_info->newCenterChanFreq0 = csa_params->new_ch_freq_seg1;
chnl_switch_info->newCenterChanFreq1 = csa_params->new_ch_freq_seg2;
if (session_entry->ch_width == ap_new_ch_width)
goto prnt_log;
if (session_entry->ch_width == CH_WIDTH_80MHZ) {
chnl_switch_info->newChanWidth = CH_WIDTH_80MHZ;
chnl_switch_info->newCenterChanFreq1 = 0;
} else {
session_entry->ch_width = ap_new_ch_width;
chnl_switch_info->newChanWidth = ap_new_ch_width;
}
prnt_log:
return QDF_STATUS_SUCCESS;
}
@@ -2035,13 +2022,12 @@ static void lim_handle_sta_csa_param(struct mac_context *mac_ctx,
session_entry->htSupportedChannelWidthSet = true;
}
}
pe_debug("new ch %d freq %d width: %d freq0 %d freq1 %d ht width %d",
lim_ch_switch->primaryChannel,
lim_ch_switch->sw_target_freq,
lim_ch_switch->ch_width,
lim_ch_switch->ch_center_freq_seg0,
pe_debug("new ch %d: freq %d width: %d freq0 %d freq1 %d ht width %d, current freq %d: bw %d",
lim_ch_switch->primaryChannel, lim_ch_switch->sw_target_freq,
lim_ch_switch->ch_width, lim_ch_switch->ch_center_freq_seg0,
lim_ch_switch->ch_center_freq_seg1,
lim_ch_switch->sec_ch_offset);
lim_ch_switch->sec_ch_offset, session_entry->curr_op_freq,
session_entry->ch_width);
if (session_entry->curr_op_freq == csa_params->csa_chan_freq &&
session_entry->ch_width == lim_ch_switch->ch_width) {

View File

@@ -2166,9 +2166,11 @@ void lim_switch_primary_secondary_channel(struct mac_context *mac,
mac->lim.gpchangeChannelData = NULL;
/* Store the new primary and secondary channel in session entries if different */
if (pe_session->curr_op_freq != new_channel_freq) {
pe_warn("freq: %d --> freq: %d", pe_session->curr_op_freq,
new_channel_freq);
if (pe_session->curr_op_freq != new_channel_freq ||
pe_session->ch_width != ch_width) {
pe_warn("freq: %d[%d] --> freq: %d[%d]",
pe_session->curr_op_freq, pe_session->ch_width,
new_channel_freq, ch_width);
pe_session->curr_op_freq = new_channel_freq;
}
if (pe_session->htSecondaryChannelOffset !=

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2025 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
@@ -714,7 +714,6 @@ int wma_stats_ext_event_handler(void *handle, uint8_t *event_buf,
}
stats_ext_info = param_buf->fixed_param;
buf_ptr = (uint8_t *)stats_ext_info;
alloc_len = sizeof(tSirStatsExtEvent);
alloc_len += stats_ext_info->data_len;
@@ -731,7 +730,7 @@ int wma_stats_ext_event_handler(void *handle, uint8_t *event_buf,
if (!stats_ext_event)
return -ENOMEM;
buf_ptr += sizeof(wmi_stats_ext_event_fixed_param) + WMI_TLV_HDR_SIZE;
buf_ptr = (uint8_t *)param_buf->data;
stats_ext_event->vdev_id = stats_ext_info->vdev_id;
stats_ext_event->event_data_len = stats_ext_info->data_len;
@@ -781,7 +780,6 @@ int wma_stats_ext_event_handler(void *handle, uint8_t *event_buf,
}
stats_ext_info = param_buf->fixed_param;
buf_ptr = (uint8_t *)stats_ext_info;
alloc_len = sizeof(tSirStatsExtEvent);
alloc_len += stats_ext_info->data_len;
@@ -797,7 +795,7 @@ int wma_stats_ext_event_handler(void *handle, uint8_t *event_buf,
if (!stats_ext_event)
return -ENOMEM;
buf_ptr += sizeof(wmi_stats_ext_event_fixed_param) + WMI_TLV_HDR_SIZE;
buf_ptr = (uint8_t *)param_buf->data;
stats_ext_event->vdev_id = stats_ext_info->vdev_id;
stats_ext_event->event_data_len = stats_ext_info->data_len;