diff --git a/components/tdls/core/src/wlan_tdls_main.h b/components/tdls/core/src/wlan_tdls_main.h index bf3c7d3e0e..e822da3ab5 100644 --- a/components/tdls/core/src/wlan_tdls_main.h +++ b/components/tdls/core/src/wlan_tdls_main.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2021 The Linux Foundation. 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 @@ -191,6 +191,7 @@ struct tdls_set_state_info { * @runtime_lock: runtime lock * @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 */ struct tdls_soc_priv_obj { struct wlan_objmgr_psoc *soc; @@ -239,6 +240,9 @@ struct tdls_soc_priv_obj { #endif tdls_vdev_init_cb tdls_osif_init_cb; tdls_vdev_deinit_cb tdls_osif_deinit_cb; +#ifdef WLAN_FEATURE_11AX + bool fw_tdls_11ax_capability; +#endif }; /** diff --git a/components/tdls/dispatcher/inc/wlan_tdls_public_structs.h b/components/tdls/dispatcher/inc/wlan_tdls_public_structs.h index 1b29493d15..621f2e676b 100644 --- a/components/tdls/dispatcher/inc/wlan_tdls_public_structs.h +++ b/components/tdls/dispatcher/inc/wlan_tdls_public_structs.h @@ -88,6 +88,11 @@ #define INVALID_TDLS_PEER_INDEX 0xFF +#ifdef WLAN_FEATURE_11AX +#define MIN_TDLS_HE_CAP_LEN 17 +#define MAX_TDLS_HE_CAP_LEN 29 +#endif + /** * enum tdls_add_oper - add peer type * @TDLS_OPER_NONE: none diff --git a/components/tdls/dispatcher/inc/wlan_tdls_ucfg_api.h b/components/tdls/dispatcher/inc/wlan_tdls_ucfg_api.h index a294f06e3b..5b5a61b0db 100644 --- a/components/tdls/dispatcher/inc/wlan_tdls_ucfg_api.h +++ b/components/tdls/dispatcher/inc/wlan_tdls_ucfg_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2021 The Linux Foundation. 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 @@ -74,6 +74,41 @@ QDF_STATUS ucfg_tdls_psoc_close(struct wlan_objmgr_psoc *psoc); QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc, struct tdls_start_params *req); +#ifdef WLAN_FEATURE_11AX +/** + * ucfg_tdls_update_fw_11ax_support() - Update FW TDLS 11ax capability in TLDS + * Component + * @psoc: psoc object + * @is_fw_tdls_11ax_capable: bool if fw is tdls 11ax capable then it is true + * + * Return: void + */ +void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc, + bool is_fw_tdls_11ax_capable); + +/** + * ucfg_tdls_is_fw_11ax_supported() - Get FW TDLS 11ax capability from TLDS + * component. + * @psoc: psoc object + * + * Return: true if fw supports tdls 11ax + */ +bool ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc *psoc); + +#else +static inline +void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc, + bool is_fw_tdls_11ax_capable) +{ +} + +static inline +bool ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc *psoc) +{ +return false; +} +#endif + /** * ucfg_tdls_psoc_enable() - TDLS module enable API * @psoc: psoc object @@ -409,5 +444,16 @@ struct wlan_objmgr_vdev *ucfg_get_tdls_vdev(struct wlan_objmgr_psoc *psoc, return NULL; } +static inline +void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc, + bool is_fw_tdls_11ax_capable) +{ +} + +static inline +bool ucfg_tdls_is_fw_11ax_capable(struct wlan_objmgr_psoc *psoc) +{ +return false; +} #endif /* FEATURE_WLAN_TDLS */ #endif diff --git a/components/tdls/dispatcher/src/wlan_tdls_ucfg_api.c b/components/tdls/dispatcher/src/wlan_tdls_ucfg_api.c index acc459a387..cab01a3cdf 100644 --- a/components/tdls/dispatcher/src/wlan_tdls_ucfg_api.c +++ b/components/tdls/dispatcher/src/wlan_tdls_ucfg_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2021 The Linux Foundation. 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 @@ -317,6 +317,38 @@ QDF_STATUS ucfg_tdls_psoc_open(struct wlan_objmgr_psoc *psoc) return status; } +#ifdef WLAN_FEATURE_11AX +void ucfg_tdls_update_fw_11ax_capability(struct wlan_objmgr_psoc *psoc, + bool is_fw_tdls_11ax_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_11ax_capability = is_fw_tdls_11ax_capable; +} + +bool ucfg_tdls_is_fw_11ax_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 11AX capability %d", soc_obj->fw_tdls_11ax_capability); + + return soc_obj->fw_tdls_11ax_capability; +} +#endif + QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc, struct tdls_start_params *req) { diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 814744598e..ce13420404 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -1683,6 +1683,27 @@ hdd_intersect_igmp_offload_setting(struct wlan_objmgr_psoc *psoc, {} #endif +#ifdef FEATURE_WLAN_TDLS +#ifdef WLAN_FEATURE_11AX +static void hdd_update_fw_tdls_11ax_capability(struct hdd_context *hdd_ctx, + struct wma_tgt_services *cfg) +{ + ucfg_tdls_update_fw_11ax_capability(hdd_ctx->psoc, + cfg->en_tdls_11ax_support); +} +#else +static inline +void hdd_update_fw_tdls_11ax_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) +{} +#endif + static void hdd_update_tgt_services(struct hdd_context *hdd_ctx, struct wma_tgt_services *cfg) { @@ -1769,6 +1790,7 @@ static void hdd_update_tgt_services(struct hdd_context *hdd_ctx, cfg->is_fw_therm_throt_supp && cfg_get(hdd_ctx->psoc, CFG_THERMAL_MITIGATION_ENABLE); + hdd_update_fw_tdls_11ax_capability(hdd_ctx, cfg); } /** diff --git a/core/mac/src/pe/lim/lim_process_tdls.c b/core/mac/src/pe/lim/lim_process_tdls.c index decf7e8df3..b9b096f347 100644 --- a/core/mac/src/pe/lim/lim_process_tdls.c +++ b/core/mac/src/pe/lim/lim_process_tdls.c @@ -784,8 +784,6 @@ static void populate_dot11f_tdls_ht_vht_cap(struct mac_context *mac, #ifdef WLAN_FEATURE_11AX -#define LIM_TDLS_MIN_LEN 21 - static void lim_tdls_set_he_chan_width(tDot11fIEhe_cap *heCap, struct pe_session *session) { @@ -888,7 +886,7 @@ lim_tdls_populate_dot11f_he_caps(struct mac_context *mac, struct he_capability_info he_cap; } uHECapInfo; - if (add_sta_req->he_cap_len < LIM_TDLS_MIN_LEN) { + if (add_sta_req->he_cap_len < MIN_TDLS_HE_CAP_LEN) { pe_debug("He_capability invalid"); return QDF_STATUS_E_INVAL; } diff --git a/core/wma/inc/wma_tgt_cfg.h b/core/wma/inc/wma_tgt_cfg.h index 0ca5c4b1b8..1185a58c49 100644 --- a/core/wma/inc/wma_tgt_cfg.h +++ b/core/wma/inc/wma_tgt_cfg.h @@ -37,6 +37,7 @@ * @en_tdls_offchan: enable tdls offchan * @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_roam_offload: enable roam offload * @en_11ax: enable 11ax * @is_fw_mawc_capable: Motion Aided Wireless Connectivity feature @@ -69,6 +70,9 @@ struct wma_tgt_services { bool en_tdls_offchan; bool en_tdls_uapsd_buf_sta; bool en_tdls_uapsd_sleep_sta; +#ifdef WLAN_FEATURE_11AX + bool en_tdls_11ax_support; +#endif #endif /* FEATURE_WLAN_TDLS */ #ifdef WLAN_FEATURE_ROAM_OFFLOAD bool en_roam_offload; diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 37bd834243..9b9fe7d4c3 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -4554,6 +4554,36 @@ wma_get_igmp_offload_enable(struct wmi_unified *wmi_handle, {} #endif +#ifdef WLAN_FEATURE_11AX +#ifdef FEATURE_WLAN_TDLS +/** + * wma_get_tdls_ax_support() - update tgt service with service tdls ax support + * @wmi_handle: Unified wmi handle + * @cfg: target services + * + * Return: none + */ +static inline void +wma_get_tdls_ax_support(struct wmi_unified *wmi_handle, + struct wma_tgt_services *cfg) +{ + cfg->en_tdls_11ax_support = wmi_service_enabled( + wmi_handle, + wmi_service_tdls_ax_support); +} +#else +static inline void +wma_get_tdls_ax_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) +{} +#endif + /** * wma_update_target_services() - update target services from wma handle * @wmi_handle: Unified wmi handle @@ -4696,6 +4726,7 @@ static inline void wma_update_target_services(struct wmi_unified *wmi_handle, wma_get_service_cap_club_get_sta_in_ll_stats_req(wmi_handle, cfg); wma_get_igmp_offload_enable(wmi_handle, cfg); + wma_get_tdls_ax_support(wmi_handle, cfg); } /** diff --git a/os_if/tdls/src/wlan_cfg80211_tdls.c b/os_if/tdls/src/wlan_cfg80211_tdls.c index 9aaf9e7744..5d1c5b8d42 100644 --- a/os_if/tdls/src/wlan_cfg80211_tdls.c +++ b/os_if/tdls/src/wlan_cfg80211_tdls.c @@ -35,7 +35,7 @@ #include #include "wlan_cfg80211_mc_cp_stats.h" #include "sir_api.h" - +#include "wlan_tdls_ucfg_api.h" #define TDLS_MAX_NO_OF_2_4_CHANNELS 14 @@ -238,8 +238,6 @@ tdls_calc_channels_from_staparams(struct tdls_update_peer_params *req_info, } #ifdef WLAN_FEATURE_11AX -#define MIN_TDLS_HE_CAP_LEN 17 -#define MAX_TDLS_HE_CAP_LEN 29 static void wlan_cfg80211_tdls_extract_he_params(struct tdls_update_peer_params *req_info, @@ -276,7 +274,8 @@ 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) + struct station_parameters *params, + bool tdls_11ax_support) { int i; @@ -356,8 +355,10 @@ wlan_cfg80211_tdls_extract_params(struct tdls_update_peer_params *req_info, osif_debug("TDLS peer pmf capable"); req_info->is_pmf = 1; } - - wlan_cfg80211_tdls_extract_he_params(req_info, params); + if (tdls_11ax_support) + wlan_cfg80211_tdls_extract_he_params(req_info, params); + else + osif_debug("tdls ax disabled"); } int wlan_cfg80211_tdls_update_peer(struct wlan_objmgr_vdev *vdev, @@ -369,6 +370,8 @@ int wlan_cfg80211_tdls_update_peer(struct wlan_objmgr_vdev *vdev, struct vdev_osif_priv *osif_priv; struct osif_tdls_vdev *tdls_priv; unsigned long rc; + struct wlan_objmgr_psoc *psoc; + bool tdls_11ax_support = false; status = wlan_cfg80211_tdls_validate_mac_addr(mac); @@ -382,7 +385,14 @@ int wlan_cfg80211_tdls_update_peer(struct wlan_objmgr_vdev *vdev, if (!req_info) return -EINVAL; - wlan_cfg80211_tdls_extract_params(req_info, params); + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + osif_err_rl("Invalid psoc"); + return -EINVAL; + } + + tdls_11ax_support = ucfg_tdls_is_fw_11ax_capable(psoc); + wlan_cfg80211_tdls_extract_params(req_info, params, tdls_11ax_support); osif_priv = wlan_vdev_get_ospriv(vdev); if (!osif_priv || !osif_priv->osif_tdls) {