qcacld-3.0: Allow TDLS connection on 6GHz only if fw supports
Allow TDLS connection on 6GHz only if FW supports TDLS on 6GHz. Change-Id: I663bd6d73235664c21029d8956f465da5a5b39c6 CRs-Fixed: 3223677
This commit is contained in:

committed by
Madan Koyyalamudi

parent
6fac8201a3
commit
5b8626946b
@@ -34,6 +34,7 @@
|
||||
#include "wlan_scan_ucfg_api.h"
|
||||
#include "wlan_tdls_ucfg_api.h"
|
||||
#include "wlan_cm_roam_api.h"
|
||||
#include "wlan_cfg80211_tdls.h"
|
||||
|
||||
/* Global tdls soc pvt object
|
||||
* this is useful for some functions which does not receive either vdev or psoc
|
||||
@@ -846,7 +847,7 @@ QDF_STATUS tdls_update_fw_tdls_state(struct tdls_soc_priv_obj *tdls_soc_obj,
|
||||
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
bool tdls_is_6g_freq_allowed(struct wlan_objmgr_vdev *vdev,
|
||||
qdf_freq_t freq)
|
||||
qdf_freq_t freq)
|
||||
{
|
||||
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
|
||||
struct regulatory_channel chan[NUM_CHANNELS] = {0};
|
||||
@@ -859,6 +860,9 @@ bool tdls_is_6g_freq_allowed(struct wlan_objmgr_vdev *vdev,
|
||||
if (!wlan_reg_is_6ghz_chan_freq(freq))
|
||||
goto error;
|
||||
|
||||
if (!wlan_cfg80211_tdls_is_fw_6ghz_capable(vdev))
|
||||
goto error;
|
||||
|
||||
if (!pdev)
|
||||
goto error;
|
||||
|
||||
|
@@ -193,6 +193,7 @@ struct tdls_set_state_info {
|
||||
* @tdls_osif_init_cb: Callback to initialize the tdls private
|
||||
* @tdls_osif_deinit_cb: Callback to deinitialize the tdls private
|
||||
* @fw_tdls_11ax_capablity: bool for tdls 11ax fw capability
|
||||
* @fw_tdls_6g_capability: bool for tdls 6g fw capability
|
||||
* @bss_sta_power: bss sta power
|
||||
* @@bss_sta_power_type: bss sta power type
|
||||
*/
|
||||
@@ -245,6 +246,7 @@ struct tdls_soc_priv_obj {
|
||||
tdls_vdev_deinit_cb tdls_osif_deinit_cb;
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
bool fw_tdls_11ax_capability;
|
||||
bool fw_tdls_6g_capability;
|
||||
uint8_t bss_sta_power;
|
||||
uint8_t bss_sta_power_type;
|
||||
#endif
|
||||
|
@@ -87,6 +87,17 @@ QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc,
|
||||
void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc,
|
||||
bool is_fw_tdls_11ax_capable);
|
||||
|
||||
/**
|
||||
* ucfg_tdls_update_fw_6g_support() - Update FW TDLS 6g capability in TLDS
|
||||
* Component
|
||||
* @psoc: psoc object
|
||||
* @is_fw_tdls_6g_capable: set to true if firmware supports TDLS on 6G band
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
void ucfg_update_fw_tdls_6g_capability(struct wlan_objmgr_psoc *psoc,
|
||||
bool is_fw_tdls_6g_capable);
|
||||
|
||||
/**
|
||||
* ucfg_tdls_is_fw_11ax_supported() - Get FW TDLS 11ax capability from TLDS
|
||||
* component.
|
||||
@@ -96,6 +107,15 @@ void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc,
|
||||
*/
|
||||
bool ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc *psoc);
|
||||
|
||||
/**
|
||||
* ucfg_tdls_is_fw_6g_capable() - Get FW TDLS 6g capability from TLDS
|
||||
* component.
|
||||
* @psoc: psoc object
|
||||
*
|
||||
* Return: true if fw supports tdls on 6ghz band
|
||||
*/
|
||||
bool ucfg_tdls_is_fw_6g_capable(struct wlan_objmgr_psoc *psoc);
|
||||
|
||||
#else
|
||||
static inline
|
||||
void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc,
|
||||
@@ -108,6 +128,18 @@ bool ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc *psoc)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline
|
||||
void ucfg_update_fw_tdls_6g_capability(struct wlan_objmgr_psoc *psoc,
|
||||
bool is_fw_tdls_6g_capable)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
bool ucfg_tdls_is_fw_6g_capable(struct wlan_objmgr_psoc *psoc)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@@ -334,6 +334,21 @@ void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc,
|
||||
soc_obj->fw_tdls_11ax_capability = is_fw_tdls_11ax_capable;
|
||||
}
|
||||
|
||||
void ucfg_update_fw_tdls_6g_capability(struct wlan_objmgr_psoc *psoc,
|
||||
bool is_fw_tdls_6g_capable)
|
||||
{
|
||||
struct tdls_soc_priv_obj *soc_obj;
|
||||
|
||||
soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
|
||||
WLAN_UMAC_COMP_TDLS);
|
||||
if (!soc_obj) {
|
||||
tdls_err("Failed to get tdls psoc component");
|
||||
return;
|
||||
}
|
||||
|
||||
soc_obj->fw_tdls_6g_capability = is_fw_tdls_6g_capable;
|
||||
}
|
||||
|
||||
bool ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc *psoc)
|
||||
{
|
||||
struct tdls_soc_priv_obj *soc_obj;
|
||||
@@ -348,6 +363,22 @@ bool ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc *psoc)
|
||||
|
||||
return soc_obj->fw_tdls_11ax_capability;
|
||||
}
|
||||
|
||||
bool ucfg_tdls_is_fw_6g_capable(struct wlan_objmgr_psoc *psoc)
|
||||
{
|
||||
struct tdls_soc_priv_obj *soc_obj;
|
||||
|
||||
soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
|
||||
WLAN_UMAC_COMP_TDLS);
|
||||
if (!soc_obj) {
|
||||
tdls_err("Failed to get tdls psoc component");
|
||||
return false;
|
||||
}
|
||||
tdls_debug("FW 6g capability %d", soc_obj->fw_tdls_6g_capability);
|
||||
|
||||
return soc_obj->fw_tdls_6g_capability;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc,
|
||||
|
@@ -1837,17 +1837,32 @@ static void hdd_update_fw_tdls_11ax_capability(struct hdd_context *hdd_ctx,
|
||||
ucfg_tdls_update_fw_11ax_capability(hdd_ctx->psoc,
|
||||
cfg->en_tdls_11ax_support);
|
||||
}
|
||||
|
||||
static void hdd_update_fw_tdls_6g_capability(struct hdd_context *hdd_ctx,
|
||||
struct wma_tgt_services *cfg)
|
||||
{
|
||||
ucfg_update_fw_tdls_6g_capability(hdd_ctx->psoc,
|
||||
cfg->en_tdls_6g_support);
|
||||
}
|
||||
#else
|
||||
static inline
|
||||
void hdd_update_fw_tdls_11ax_capability(struct hdd_context *hdd_ctx,
|
||||
struct wma_tgt_services *cfg)
|
||||
{}
|
||||
static inline
|
||||
void hdd_update_fw_tdls_6g_capability(struct hdd_context *hdd_ctx,
|
||||
struct wma_tgt_services *cfg)
|
||||
{}
|
||||
#endif
|
||||
#else
|
||||
static inline
|
||||
void hdd_update_fw_tdls_11ax_capability(struct hdd_context *hdd_ctx,
|
||||
struct wma_tgt_services *cfg)
|
||||
{}
|
||||
static inline
|
||||
void hdd_update_fw_tdls_6g_capability(struct hdd_context *hdd_ctx,
|
||||
struct wma_tgt_services *cfg)
|
||||
{}
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
|
||||
@@ -1956,6 +1971,7 @@ static void hdd_update_tgt_services(struct hdd_context *hdd_ctx,
|
||||
CFG_THERMAL_MITIGATION_ENABLE);
|
||||
hdd_update_fw_tdls_11ax_capability(hdd_ctx, cfg);
|
||||
hdd_set_dynamic_macaddr_update_capability(hdd_ctx, cfg);
|
||||
hdd_update_fw_tdls_6g_capability(hdd_ctx, cfg);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2022 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
|
||||
@@ -39,6 +39,7 @@
|
||||
* @en_tdls_uapsd_buf_sta: enable sta tdls uapsd buf
|
||||
* @en_tdls_uapsd_sleep_sta: enable sta tdls uapsd sleep
|
||||
* @en_tdls_11ax_support: Get TDLS ax support
|
||||
* @en_tdls_6g_support: Get TDLS 6g fw capability
|
||||
* @en_roam_offload: enable roam offload
|
||||
* @en_11ax: enable 11ax
|
||||
* @is_fw_mawc_capable: Motion Aided Wireless Connectivity feature
|
||||
@@ -75,6 +76,7 @@ struct wma_tgt_services {
|
||||
bool en_tdls_uapsd_sleep_sta;
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
bool en_tdls_11ax_support;
|
||||
bool en_tdls_6g_support;
|
||||
#endif
|
||||
#endif /* FEATURE_WLAN_TDLS */
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
|
@@ -4734,17 +4734,36 @@ wma_get_tdls_ax_support(struct wmi_unified *wmi_handle,
|
||||
wmi_handle,
|
||||
wmi_service_tdls_ax_support);
|
||||
}
|
||||
|
||||
static inline void
|
||||
wma_get_tdls_6g_support(struct wmi_unified *wmi_handle,
|
||||
struct wma_tgt_services *cfg)
|
||||
{
|
||||
cfg->en_tdls_6g_support = wmi_service_enabled(
|
||||
wmi_handle,
|
||||
wmi_service_tdls_6g_support);
|
||||
}
|
||||
#else
|
||||
static inline void
|
||||
wma_get_tdls_ax_support(struct wmi_unified *wmi_handle,
|
||||
struct wma_tgt_services *cfg)
|
||||
{}
|
||||
|
||||
static inline void
|
||||
wma_get_tdls_6g_support(struct wmi_unified *wmi_handle,
|
||||
struct wma_tgt_services *cfg)
|
||||
{}
|
||||
#endif
|
||||
#else
|
||||
static inline void
|
||||
wma_get_tdls_ax_support(struct wmi_unified *wmi_handle,
|
||||
struct wma_tgt_services *cfg)
|
||||
{}
|
||||
|
||||
static inline void
|
||||
wma_get_tdls_6g_support(struct wmi_unified *wmi_handle,
|
||||
struct wma_tgt_services *cfg)
|
||||
{}
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
|
||||
@@ -4906,6 +4925,7 @@ static inline void wma_update_target_services(struct wmi_unified *wmi_handle,
|
||||
|
||||
wma_get_igmp_offload_enable(wmi_handle, cfg);
|
||||
wma_get_tdls_ax_support(wmi_handle, cfg);
|
||||
wma_get_tdls_6g_support(wmi_handle, cfg);
|
||||
|
||||
wma_get_dynamic_vdev_macaddr_support(wmi_handle, cfg);
|
||||
}
|
||||
|
@@ -164,6 +164,16 @@ int wlan_cfg80211_tdls_oper(struct wlan_objmgr_vdev *vdev,
|
||||
int wlan_cfg80211_tdls_get_all_peers(struct wlan_objmgr_vdev *vdev,
|
||||
char *buf, int buflen);
|
||||
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
/**
|
||||
* hdd_tdls_is_fw_6ghz_capable() - Check whether fw supports 6ghz band tdls
|
||||
* @vdev: Pointer to vdev
|
||||
*
|
||||
* Return: true if fw supports 6ghz tdls connection
|
||||
*/
|
||||
bool wlan_cfg80211_tdls_is_fw_6ghz_capable(struct wlan_objmgr_vdev *vdev);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wlan_cfg80211_tdls_mgmt() - process tdls management frames from the supplicant
|
||||
* @vdev: vdev object
|
||||
|
@@ -263,7 +263,8 @@ wlan_cfg80211_tdls_extract_6ghz_params(struct tdls_update_peer_params *req_info,
|
||||
|
||||
static void
|
||||
wlan_cfg80211_tdls_extract_he_params(struct tdls_update_peer_params *req_info,
|
||||
struct station_parameters *params)
|
||||
struct station_parameters *params,
|
||||
bool tdls_6g_support)
|
||||
{
|
||||
if (params->he_capa_len < MIN_TDLS_HE_CAP_LEN) {
|
||||
osif_debug("he_capa_len %d less than MIN_TDLS_HE_CAP_LEN",
|
||||
@@ -283,7 +284,8 @@ wlan_cfg80211_tdls_extract_he_params(struct tdls_update_peer_params *req_info,
|
||||
qdf_mem_copy(&req_info->he_cap, params->he_capa,
|
||||
req_info->he_cap_len);
|
||||
|
||||
wlan_cfg80211_tdls_extract_6ghz_params(req_info, params);
|
||||
if (tdls_6g_support)
|
||||
wlan_cfg80211_tdls_extract_6ghz_params(req_info, params);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -291,7 +293,8 @@ wlan_cfg80211_tdls_extract_he_params(struct tdls_update_peer_params *req_info,
|
||||
#else
|
||||
static void
|
||||
wlan_cfg80211_tdls_extract_he_params(struct tdls_update_peer_params *req_info,
|
||||
struct station_parameters *params)
|
||||
struct station_parameters *params,
|
||||
bool tdls_6g_support)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
@@ -299,7 +302,7 @@ wlan_cfg80211_tdls_extract_he_params(struct tdls_update_peer_params *req_info,
|
||||
static void
|
||||
wlan_cfg80211_tdls_extract_params(struct tdls_update_peer_params *req_info,
|
||||
struct station_parameters *params,
|
||||
bool tdls_11ax_support)
|
||||
bool tdls_11ax_support, bool tdls_6g_support)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -380,7 +383,8 @@ wlan_cfg80211_tdls_extract_params(struct tdls_update_peer_params *req_info,
|
||||
req_info->is_pmf = 1;
|
||||
}
|
||||
if (tdls_11ax_support)
|
||||
wlan_cfg80211_tdls_extract_he_params(req_info, params);
|
||||
wlan_cfg80211_tdls_extract_he_params(req_info, params,
|
||||
tdls_6g_support);
|
||||
else
|
||||
osif_debug("tdls ax disabled");
|
||||
}
|
||||
@@ -396,6 +400,7 @@ int wlan_cfg80211_tdls_update_peer(struct wlan_objmgr_vdev *vdev,
|
||||
unsigned long rc;
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
bool tdls_11ax_support = false;
|
||||
bool tdls_6g_support = false;
|
||||
|
||||
status = wlan_cfg80211_tdls_validate_mac_addr(mac);
|
||||
|
||||
@@ -416,7 +421,9 @@ int wlan_cfg80211_tdls_update_peer(struct wlan_objmgr_vdev *vdev,
|
||||
}
|
||||
|
||||
tdls_11ax_support = ucfg_tdls_is_fw_11ax_capable(psoc);
|
||||
wlan_cfg80211_tdls_extract_params(req_info, params, tdls_11ax_support);
|
||||
tdls_6g_support = ucfg_tdls_is_fw_6g_capable(psoc);
|
||||
wlan_cfg80211_tdls_extract_params(req_info, params, tdls_11ax_support,
|
||||
tdls_6g_support);
|
||||
|
||||
osif_priv = wlan_vdev_get_ospriv(vdev);
|
||||
if (!osif_priv || !osif_priv->osif_tdls) {
|
||||
@@ -736,6 +743,18 @@ error_get_tdls_peers:
|
||||
return len;
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
bool wlan_cfg80211_tdls_is_fw_6ghz_capable(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
|
||||
|
||||
if (!psoc)
|
||||
return false;
|
||||
|
||||
return ucfg_tdls_is_fw_6g_capable(psoc);
|
||||
}
|
||||
#endif
|
||||
|
||||
int wlan_cfg80211_tdls_mgmt(struct wlan_objmgr_vdev *vdev,
|
||||
const uint8_t *peer_mac,
|
||||
uint8_t action_code, uint8_t dialog_token,
|
||||
|
Reference in New Issue
Block a user