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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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_ */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) */
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, ¶ms->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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 !=
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user