From b9570e9fcb81dc9aca4b45aaf6a7b564539ab568 Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Fri, 8 Jan 2021 19:37:56 +0530 Subject: [PATCH] qcacld-3.0: Advertise TWT capability if "enable_twt" ini is true Currently in SAP and STA mode the driver advertises TWT capabilities in the HE capabilities IE based on the below ini values irrespective of the master ini "enable_twt" to enable the twt feature: "he_twt_requestor","he_twt_responder", "he_bcast_twt", "he_flex_twt_sched". So even with the ini is disabled, twt capabilities are advertised Advertise TWT capability only if "enable_twt" ini is true. Change-Id: Iae3a98ee339f3859391e0deb64ddd354634b0cbf CRs-Fixed: 2844516 --- components/mlme/core/src/wlan_mlme_main.c | 19 +++--- .../mlme/dispatcher/inc/cfg_mlme_he_caps.h | 20 +----- .../mlme/dispatcher/inc/wlan_mlme_api.h | 20 +++++- .../dispatcher/inc/wlan_mlme_public_struct.h | 10 ++- .../mlme/dispatcher/inc/wlan_mlme_ucfg_api.h | 62 ++++++++++++++---- .../mlme/dispatcher/src/wlan_mlme_api.c | 38 +++++++---- .../mlme/dispatcher/src/wlan_mlme_ucfg_api.c | 63 +++++++++++-------- core/hdd/src/wlan_hdd_main.c | 7 --- core/hdd/src/wlan_hdd_twt.c | 16 ++++- core/mac/src/include/parser_api.h | 2 +- .../src/sys/legacy/src/utils/src/parser_api.c | 48 +++++++++++++- core/sme/src/csr/csr_api_roam.c | 14 +++-- 12 files changed, 220 insertions(+), 99 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 9a0f1698e679..6a13078a326d 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -1001,8 +1001,14 @@ static void mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc *psoc, struct wlan_mlme_he_caps *he_caps = &mlme_cfg->he_caps; he_caps->dot11_he_cap.htc_he = cfg_default(CFG_HE_CONTROL); - he_caps->dot11_he_cap.twt_request = cfg_default(CFG_HE_TWT_REQUESTOR); - he_caps->dot11_he_cap.twt_responder = cfg_default(CFG_HE_TWT_RESPONDER); + he_caps->dot11_he_cap.twt_request = + cfg_get(psoc, CFG_TWT_REQUESTOR); + he_caps->dot11_he_cap.twt_responder = + cfg_get(psoc, CFG_TWT_RESPONDER); + he_caps->dot11_he_cap.broadcast_twt = cfg_get(psoc, CFG_BCAST_TWT); + if (mlme_is_twt_enabled(psoc)) + he_caps->dot11_he_cap.flex_twt_sched = + cfg_default(CFG_HE_FLEX_TWT_SCHED); he_caps->dot11_he_cap.fragmentation = cfg_default(CFG_HE_FRAGMENTATION); he_caps->dot11_he_cap.max_num_frag_msdu_amsdu_exp = @@ -1018,7 +1024,6 @@ static void mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc *psoc, he_caps->dot11_he_cap.trigd_rsp_sched = cfg_default(CFG_HE_TRIGD_RSP_SCHEDULING); he_caps->dot11_he_cap.a_bsr = cfg_default(CFG_HE_BUFFER_STATUS_RPT); - he_caps->dot11_he_cap.broadcast_twt = cfg_default(CFG_HE_BCAST_TWT); he_caps->dot11_he_cap.ba_32bit_bitmap = cfg_default(CFG_HE_BA_32BIT); he_caps->dot11_he_cap.mu_cascade = cfg_default(CFG_HE_MU_CASCADING); he_caps->dot11_he_cap.ack_enabled_multitid = @@ -1028,8 +1033,7 @@ static void mlme_init_he_cap_in_cfg(struct wlan_objmgr_psoc *psoc, he_caps->dot11_he_cap.max_ampdu_len_exp_ext = cfg_default(CFG_HE_MAX_AMPDU_LEN); he_caps->dot11_he_cap.amsdu_frag = cfg_default(CFG_HE_AMSDU_FRAG); - he_caps->dot11_he_cap.flex_twt_sched = - cfg_default(CFG_HE_FLEX_TWT_SCHED); + he_caps->dot11_he_cap.rx_ctrl_frame = cfg_default(CFG_HE_RX_CTRL); he_caps->dot11_he_cap.bsrp_ampdu_aggr = cfg_default(CFG_HE_BSRP_AMPDU_AGGR); @@ -1196,10 +1200,7 @@ static void mlme_init_twt_cfg(struct wlan_objmgr_psoc *psoc, { uint32_t bcast_conf = cfg_get(psoc, CFG_BCAST_TWT_REQ_RESP); - twt_cfg->is_twt_bcast_enabled = cfg_get(psoc, CFG_BCAST_TWT); twt_cfg->is_twt_enabled = cfg_get(psoc, CFG_ENABLE_TWT); - twt_cfg->is_twt_responder_enabled = cfg_get(psoc, CFG_TWT_RESPONDER); - twt_cfg->is_twt_requestor_enabled = cfg_get(psoc, CFG_TWT_REQUESTOR); twt_cfg->twt_congestion_timeout = cfg_get(psoc, CFG_TWT_CONGESTION_TIMEOUT); twt_cfg->is_bcast_requestor_enabled = CFG_TWT_GET_BCAST_REQ(bcast_conf); twt_cfg->is_bcast_responder_enabled = CFG_TWT_GET_BCAST_RES(bcast_conf); @@ -2323,13 +2324,13 @@ QDF_STATUS mlme_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc) mlme_init_chainmask_cfg(psoc, &mlme_cfg->chainmask_cfg); mlme_init_sap_cfg(psoc, &mlme_cfg->sap_cfg); mlme_init_nss_chains(psoc, &mlme_cfg->nss_chains_ini_cfg); + mlme_init_twt_cfg(psoc, &mlme_cfg->twt_cfg); mlme_init_he_cap_in_cfg(psoc, mlme_cfg); mlme_init_obss_ht40_cfg(psoc, &mlme_cfg->obss_ht40); mlme_init_product_details_cfg(&mlme_cfg->product_details); mlme_init_powersave_params(psoc, &mlme_cfg->ps_params); mlme_init_sta_cfg(psoc, &mlme_cfg->sta); mlme_init_stats_cfg(psoc, &mlme_cfg->stats); - mlme_init_twt_cfg(psoc, &mlme_cfg->twt_cfg); mlme_init_lfr_cfg(psoc, &mlme_cfg->lfr); mlme_init_feature_flag_in_cfg(psoc, &mlme_cfg->feature_flags); mlme_init_roam_scoring_cfg(psoc, &mlme_cfg->roam_scoring); diff --git a/components/mlme/dispatcher/inc/cfg_mlme_he_caps.h b/components/mlme/dispatcher/inc/cfg_mlme_he_caps.h index ac584f34470f..94177c024c13 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_he_caps.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_he_caps.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -28,16 +28,6 @@ 0, \ "HE Control") -#define CFG_HE_TWT_REQUESTOR CFG_BOOL( \ - "he_twt_requestor", \ - 0, \ - "HE Twt Requestor") - -#define CFG_HE_TWT_RESPONDER CFG_BOOL( \ - "he_twt_responder", \ - 0, \ - "HE Twt Responder") - #define CFG_HE_FRAGMENTATION CFG_UINT( \ "he_fragmentation", \ 0, \ @@ -101,11 +91,6 @@ 0, \ "HE Buffer Status Rpt") -#define CFG_HE_BCAST_TWT CFG_BOOL( \ - "he_bcast_twt", \ - 0, \ - "HE Bcast twt") - #define CFG_HE_BA_32BIT CFG_BOOL( \ "he_ba_32bit", \ 0, \ @@ -748,8 +733,6 @@ #define CFG_HE_CAPS_ALL \ CFG(CFG_HE_CONTROL) \ - CFG(CFG_HE_TWT_REQUESTOR) \ - CFG(CFG_HE_TWT_RESPONDER) \ CFG(CFG_HE_FRAGMENTATION) \ CFG(CFG_HE_MAX_FRAG_MSDU) \ CFG(CFG_HE_MIN_FRAG_SIZE) \ @@ -759,7 +742,6 @@ CFG(CFG_HE_ALL_ACK) \ CFG(CFG_HE_TRIGD_RSP_SCHEDULING) \ CFG(CFG_HE_BUFFER_STATUS_RPT) \ - CFG(CFG_HE_BCAST_TWT) \ CFG(CFG_HE_BA_32BIT) \ CFG(CFG_HE_MU_CASCADING) \ CFG(CFG_HE_MULTI_TID) \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 0ee18479cce6..888f18268bb2 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-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 @@ -3028,4 +3028,22 @@ QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, * Return: True if supported */ bool wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc); + +#ifdef WLAN_SUPPORT_TWT +/** + * mlme_is_twt_enabled() - Get if TWT is enabled via ini. + * @psoc: pointer to psoc object + * @val: pointer to the value to be filled + * + * Return: True if TWT is enabled else false. + */ +bool +mlme_is_twt_enabled(struct wlan_objmgr_psoc *psoc); +#else +static inline bool +mlme_is_twt_enabled(struct wlan_objmgr_psoc *psoc) +{ + return false; +} +#endif /* WLAN_SUPPORT_TWT */ #endif /* _WLAN_MLME_API_H_ */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 8f5f5e58d3c9..63f256b86589 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1340,21 +1340,19 @@ struct wlan_mlme_acs { /* * struct wlan_mlme_cfg_twt - All twt related cfg items - * @is_twt_bcast_enabled: twt capability for the session * @is_twt_enabled: global twt configuration - * @is_twt_responder_enabled: twt responder - * @is_twt_requestor_enabled: twt requestor + * @bcast_requestor_tgt_cap: Broadcast requestor target capability + * @bcast_responder_tgt_cap: Broadcast responder target capability * @is_bcast_responder_enabled: bcast responder enable/disable * @is_bcast_requestor_enabled: bcast requestor enable/disable * @twt_congestion_timeout: congestion timeout value */ struct wlan_mlme_cfg_twt { - bool is_twt_bcast_enabled; bool is_twt_enabled; - bool is_twt_responder_enabled; - bool is_twt_requestor_enabled; bool is_bcast_responder_enabled; bool is_bcast_requestor_enabled; + bool bcast_requestor_tgt_cap; + bool bcast_responder_tgt_cap; uint32_t twt_congestion_timeout; }; diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index 9cd6a1fd8d2d..02dbdc2c707c 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-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 @@ -889,7 +889,7 @@ QDF_STATUS ucfg_mlme_set_pmkid_modes(struct wlan_objmgr_psoc *psoc, uint32_t val); -#ifdef WLAN_SUPPORT_TWT +#if defined(WLAN_SUPPORT_TWT) && defined(WLAN_FEATURE_11AX) /** * ucfg_mlme_get_twt_requestor() - Get twt requestor * @psoc: pointer to psoc object @@ -979,15 +979,16 @@ ucfg_mlme_set_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc, uint32_t val); /** - * ucfg_mlme_get_enable_twt() - Get global twt config support + * ucfg_mlme_is_twt_enabled() - Get global twt config support * @psoc: pointer to psoc object - * @val: Pointer to the value which will be filled for the caller * - * Return: QDF Status + * Return: True if TWT is enabled else false. */ -QDF_STATUS -ucfg_mlme_get_enable_twt(struct wlan_objmgr_psoc *psoc, - bool *val); +static inline bool +ucfg_mlme_is_twt_enabled(struct wlan_objmgr_psoc *psoc) +{ + return mlme_is_twt_enabled(psoc); +} /** * ucfg_mlme_set_enable_twt() - Set global twt config support @@ -1042,6 +1043,30 @@ ucfg_mlme_get_twt_bcast_responder(struct wlan_objmgr_psoc *psoc, QDF_STATUS ucfg_mlme_set_twt_bcast_responder(struct wlan_objmgr_psoc *psoc, bool val); + +/** + * ucfg_mlme_set_twt_bcast_requestor_tgt_cap() - Update the broadast requestor + * target capability + * @psoc: pointer to psoc object + * @val: Value to be set to config + * + * Return: QDF Status + */ +QDF_STATUS +ucfg_mlme_set_twt_bcast_requestor_tgt_cap(struct wlan_objmgr_psoc *psoc, + bool val); + +/** + * ucfg_mlme_set_twt_bcast_responder_tgt_cap() - Update the broadast responder + * target capability + * @psoc: pointer to psoc object + * @val: Value to be set to config + * + * Return: QDF Status + */ +QDF_STATUS +ucfg_mlme_set_twt_bcast_responder_tgt_cap(struct wlan_objmgr_psoc *psoc, + bool val); #else static inline QDF_STATUS ucfg_mlme_get_twt_requestor(struct wlan_objmgr_psoc *psoc, @@ -1103,11 +1128,9 @@ ucfg_mlme_set_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_E_NOSUPPORT; } -static inline QDF_STATUS -ucfg_mlme_get_enable_twt(struct wlan_objmgr_psoc *psoc, - bool *val) +static inline bool +ucfg_mlme_is_twt_enabled(struct wlan_objmgr_psoc *psoc) { - *val = false; return QDF_STATUS_E_NOSUPPORT; } @@ -1147,7 +1170,22 @@ ucfg_mlme_set_twt_bcast_responder(struct wlan_objmgr_psoc *psoc, { return QDF_STATUS_E_NOSUPPORT; } + +static inline QDF_STATUS +ucfg_mlme_set_twt_bcast_requestor_tgt_cap(struct wlan_objmgr_psoc *psoc, + bool val) +{ + return QDF_STATUS_E_NOSUPPORT; +} + +static inline QDF_STATUS +ucfg_mlme_set_twt_bcast_responder_tgt_cap(struct wlan_objmgr_psoc *psoc, + bool val) +{ + return QDF_STATUS_E_NOSUPPORT; +} #endif + /** * ucfg_mlme_get_dot11p_mode() - Get the setting about 802.11p mode * @psoc: pointer to psoc object diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 3e310613a443..76dc34b1cdb0 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-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 @@ -573,13 +573,11 @@ QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc, mlme_obj->cfg.he_caps.dot11_he_cap.present = 1; mlme_obj->cfg.he_caps.dot11_he_cap.htc_he = he_cap->htc_he; - mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = - he_cap->twt_request; - mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder = - he_cap->twt_responder; + value = QDF_MIN(he_cap->twt_request, + mlme_obj->cfg.he_caps.dot11_he_cap.twt_request); + mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = value; - value = QDF_MIN( - he_cap->fragmentation, + value = QDF_MIN(he_cap->fragmentation, mlme_obj->cfg.he_caps.he_dynamic_fragmentation); if (cfg_in_range(CFG_HE_FRAGMENTATION, value)) @@ -609,8 +607,15 @@ QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc, mlme_obj->cfg.he_caps.dot11_he_cap.trigd_rsp_sched = he_cap->trigd_rsp_sched; mlme_obj->cfg.he_caps.dot11_he_cap.a_bsr = he_cap->a_bsr; - mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = - he_cap->broadcast_twt; + + value = QDF_MIN(he_cap->broadcast_twt, + mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt); + mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = value; + + value = QDF_MIN(he_cap->flex_twt_sched, + mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched); + mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched = value; + mlme_obj->cfg.he_caps.dot11_he_cap.ba_32bit_bitmap = he_cap->ba_32bit_bitmap; mlme_obj->cfg.he_caps.dot11_he_cap.mu_cascade = he_cap->mu_cascade; @@ -622,8 +627,6 @@ QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc, mlme_obj->cfg.he_caps.dot11_he_cap.max_ampdu_len_exp_ext = he_cap->max_ampdu_len_exp_ext; mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_frag = he_cap->amsdu_frag; - mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched = - he_cap->flex_twt_sched; mlme_obj->cfg.he_caps.dot11_he_cap.rx_ctrl_frame = he_cap->rx_ctrl_frame; mlme_obj->cfg.he_caps.dot11_he_cap.bsrp_ampdu_aggr = @@ -4681,3 +4684,16 @@ bool wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc) return false; } + +#ifdef WLAN_SUPPORT_TWT +bool mlme_is_twt_enabled(struct wlan_objmgr_psoc *psoc) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return cfg_default(CFG_ENABLE_TWT); + + return mlme_obj->cfg.twt_cfg.is_twt_enabled; +} +#endif diff --git a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c index 0ff011da2572..1a73fd0924dc 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-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 @@ -508,7 +508,7 @@ ucfg_mlme_set_pmkid_modes(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } -#ifdef WLAN_SUPPORT_TWT +#if defined(WLAN_SUPPORT_TWT) && defined(WLAN_FEATURE_11AX) QDF_STATUS ucfg_mlme_get_twt_requestor(struct wlan_objmgr_psoc *psoc, bool *val) @@ -521,7 +521,7 @@ ucfg_mlme_get_twt_requestor(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_E_INVAL; } - *val = mlme_obj->cfg.twt_cfg.is_twt_requestor_enabled; + *val = mlme_obj->cfg.he_caps.dot11_he_cap.twt_request; return QDF_STATUS_SUCCESS; } @@ -536,7 +536,7 @@ ucfg_mlme_set_twt_requestor(struct wlan_objmgr_psoc *psoc, if (!mlme_obj) return QDF_STATUS_E_INVAL; - mlme_obj->cfg.twt_cfg.is_twt_requestor_enabled = val; + mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = val; return QDF_STATUS_SUCCESS; } @@ -553,7 +553,7 @@ ucfg_mlme_get_twt_responder(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_E_INVAL; } - *val = mlme_obj->cfg.twt_cfg.is_twt_responder_enabled; + *val = mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder; return QDF_STATUS_SUCCESS; } @@ -568,7 +568,7 @@ ucfg_mlme_set_twt_responder(struct wlan_objmgr_psoc *psoc, if (!mlme_obj) return QDF_STATUS_E_INVAL; - mlme_obj->cfg.twt_cfg.is_twt_responder_enabled = val; + mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder = val; return QDF_STATUS_SUCCESS; } @@ -585,7 +585,7 @@ ucfg_mlme_get_bcast_twt(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_E_INVAL; } - *val = mlme_obj->cfg.twt_cfg.is_twt_bcast_enabled; + *val = mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt; return QDF_STATUS_SUCCESS; } @@ -600,7 +600,7 @@ ucfg_mlme_set_bcast_twt(struct wlan_objmgr_psoc *psoc, if (!mlme_obj) return QDF_STATUS_E_INVAL; - mlme_obj->cfg.twt_cfg.is_twt_bcast_enabled = val; + mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = val; return QDF_STATUS_SUCCESS; } @@ -637,23 +637,6 @@ ucfg_mlme_set_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } -QDF_STATUS -ucfg_mlme_get_enable_twt(struct wlan_objmgr_psoc *psoc, - bool *val) -{ - struct wlan_mlme_psoc_ext_obj *mlme_obj; - - mlme_obj = mlme_get_psoc_ext_obj(psoc); - if (!mlme_obj) { - *val = cfg_default(CFG_ENABLE_TWT); - return QDF_STATUS_E_INVAL; - } - - *val = mlme_obj->cfg.twt_cfg.is_twt_enabled; - - return QDF_STATUS_SUCCESS; -} - QDF_STATUS ucfg_mlme_set_enable_twt(struct wlan_objmgr_psoc *psoc, bool val) @@ -738,6 +721,36 @@ ucfg_mlme_set_twt_bcast_responder(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } + +QDF_STATUS +ucfg_mlme_set_twt_bcast_requestor_tgt_cap(struct wlan_objmgr_psoc *psoc, + bool val) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return QDF_STATUS_E_INVAL; + + mlme_obj->cfg.twt_cfg.bcast_requestor_tgt_cap = val; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +ucfg_mlme_set_twt_bcast_responder_tgt_cap(struct wlan_objmgr_psoc *psoc, + bool val) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return QDF_STATUS_E_INVAL; + + mlme_obj->cfg.twt_cfg.bcast_responder_tgt_cap = val; + + return QDF_STATUS_SUCCESS; +} #endif QDF_STATUS diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 316ef4d83a76..46c2adde4df9 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2598,13 +2598,6 @@ int hdd_update_tgt_cfg(hdd_handle_t hdd_handle, struct wma_tgt_cfg *cfg) if (QDF_IS_STATUS_ERROR(status)) hdd_err("Failed to set WNI_CFG_OBSS_COLOR_COLLISION_OFFLOAD"); - ucfg_mlme_get_bcast_twt(hdd_ctx->psoc, &bval); - if (bval) - ucfg_mlme_set_bcast_twt(hdd_ctx->psoc, cfg->bcast_twt_support); - else - hdd_debug("bcast twt is disable in ini, fw cap %d", - cfg->bcast_twt_support); - hdd_update_score_config(hdd_ctx); hdd_update_multi_client_thermal_support(hdd_ctx); diff --git a/core/hdd/src/wlan_hdd_twt.c b/core/hdd/src/wlan_hdd_twt.c index 3bd57a76cdcd..1140b160d562 100644 --- a/core/hdd/src/wlan_hdd_twt.c +++ b/core/hdd/src/wlan_hdd_twt.c @@ -2002,10 +2002,11 @@ void hdd_update_tgt_twt_cap(struct hdd_context *hdd_ctx, bool twt_bcast_req; bool twt_bcast_res; bool enable_twt; + bool bcast_twt; bool twt_req; bool twt_res; - ucfg_mlme_get_enable_twt(hdd_ctx->psoc, &enable_twt); + enable_twt = ucfg_mlme_is_twt_enabled(hdd_ctx->psoc); ucfg_mlme_get_twt_requestor(hdd_ctx->psoc, &twt_req); @@ -2017,6 +2018,15 @@ void hdd_update_tgt_twt_cap(struct hdd_context *hdd_ctx, ucfg_mlme_get_twt_bcast_responder(hdd_ctx->psoc, &twt_bcast_res); + ucfg_mlme_get_bcast_twt(hdd_ctx->psoc, &bcast_twt); + if (bcast_twt) + ucfg_mlme_set_bcast_twt(hdd_ctx->psoc, + QDF_MIN(cfg->bcast_twt_support, + enable_twt)); + else + hdd_debug("bcast twt is disable in ini, fw cap %d", + cfg->bcast_twt_support); + hdd_debug("ini: enable_twt=%d, bcast_req=%d, bcast_res=%d", enable_twt, twt_bcast_req, twt_bcast_res); hdd_debug("ini: twt_req=%d, twt_res=%d", twt_req, twt_res); @@ -2033,11 +2043,15 @@ void hdd_update_tgt_twt_cap(struct hdd_context *hdd_ctx, (enable_twt && twt_res))); twt_req = enable_twt && twt_bcast_req; + ucfg_mlme_set_twt_bcast_requestor_tgt_cap(hdd_ctx->psoc, + cfg->twt_bcast_req_support); ucfg_mlme_set_twt_bcast_requestor(hdd_ctx->psoc, QDF_MIN(cfg->twt_bcast_req_support, twt_req)); twt_res = enable_twt && twt_bcast_res; + ucfg_mlme_set_twt_bcast_responder_tgt_cap(hdd_ctx->psoc, + cfg->twt_bcast_res_support); ucfg_mlme_set_twt_bcast_responder(hdd_ctx->psoc, QDF_MIN(cfg->twt_bcast_res_support, twt_res)); diff --git a/core/mac/src/include/parser_api.h b/core/mac/src/include/parser_api.h index ca2b2400aa56..7aebc32329ae 100644 --- a/core/mac/src/include/parser_api.h +++ b/core/mac/src/include/parser_api.h @@ -1212,7 +1212,7 @@ static inline QDF_STATUS populate_dot11f_he_bss_color_change( } #endif -#ifdef WLAN_SUPPORT_TWT +#if defined(WLAN_FEATURE_11AX) && defined(WLAN_SUPPORT_TWT) /** * populate_dot11f_twt_extended_caps() - populate TWT extended capabilities * @mac_ctx: Global MAC context. diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c index c365fbac8330..4968ff3e58f7 100644 --- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c +++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c @@ -6082,6 +6082,45 @@ populate_dot11f_timing_advert_frame(struct mac_context *mac_ctx, } #ifdef WLAN_FEATURE_11AX +#ifdef WLAN_SUPPORT_TWT +static void +populate_dot11f_broadcast_twt_he_cap(struct mac_context *mac, + struct pe_session *session, + tDot11fIEhe_cap *he_cap) +{ + bool enable_bcast_twt = + mac->mlme_cfg->he_caps.dot11_he_cap.broadcast_twt; + bool requestor_tgt_cap = + mac->mlme_cfg->twt_cfg.bcast_requestor_tgt_cap; + bool responder_tgt_cap = + mac->mlme_cfg->twt_cfg.bcast_responder_tgt_cap; + bool requestor_cfg = + mac->mlme_cfg->twt_cfg.is_bcast_requestor_enabled; + bool responder_cfg = + mac->mlme_cfg->twt_cfg.is_bcast_responder_enabled; + he_cap->broadcast_twt = 0; + if (session->opmode == QDF_STA_MODE) { + if (enable_bcast_twt && requestor_tgt_cap) + he_cap->broadcast_twt = requestor_cfg; + else if (enable_bcast_twt) + he_cap->broadcast_twt = 1; + } else if (session->opmode == QDF_SAP_MODE) { + if (enable_bcast_twt && responder_tgt_cap) + he_cap->broadcast_twt = responder_cfg; + else if (enable_bcast_twt) + he_cap->broadcast_twt = 1; + } +} +#else +static inline void +populate_dot11f_broadcast_twt_he_cap(struct mac_context *mac_ctx, + struct pe_session *session, + tDot11fIEhe_cap *he_cap) +{ + he_cap->broadcast_twt = 0; +} +#endif + /** * populate_dot11f_he_caps() - pouldate HE Capability IE * @mac_ctx: Global MAC context @@ -6103,6 +6142,7 @@ QDF_STATUS populate_dot11f_he_caps(struct mac_context *mac_ctx, struct pe_sessio sizeof(tDot11fIEhe_cap)); return QDF_STATUS_SUCCESS; } + /** TODO: String items needs attention. **/ qdf_mem_copy(he_cap, &session->he_config, sizeof(*he_cap)); if (he_cap->ppet_present) { @@ -6123,6 +6163,7 @@ QDF_STATUS populate_dot11f_he_caps(struct mac_context *mac_ctx, struct pe_sessio } else { he_cap->ppet.ppe_threshold.num_ppe_th = 0; } + populate_dot11f_broadcast_twt_he_cap(mac_ctx, session, he_cap); return QDF_STATUS_SUCCESS; } @@ -6231,7 +6272,7 @@ populate_dot11f_he_bss_color_change(struct mac_context *mac_ctx, #endif /* WLAN_FEATURE_11AX_BSS_COLOR */ #endif /* WLAN_FEATURE_11AX */ -#ifdef WLAN_SUPPORT_TWT +#if defined(WLAN_FEATURE_11AX) && defined(WLAN_SUPPORT_TWT) QDF_STATUS populate_dot11f_twt_extended_caps(struct mac_context *mac_ctx, struct pe_session *pe_session, tDot11fIEExtCap *dot11f) @@ -6246,10 +6287,11 @@ QDF_STATUS populate_dot11f_twt_extended_caps(struct mac_context *mac_ctx, if (pe_session->opmode == QDF_STA_MODE) p_ext_cap->twt_requestor_support = - mac_ctx->mlme_cfg->twt_cfg.is_twt_requestor_enabled; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request; + if (pe_session->opmode == QDF_SAP_MODE) p_ext_cap->twt_responder_support = - mac_ctx->mlme_cfg->twt_cfg.is_twt_responder_enabled; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_responder; dot11f->num_bytes = lim_compute_ext_cap_ie_length(dot11f); diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 678c1cc99942..105f97ded19d 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -14497,6 +14497,7 @@ static inline void csr_update_sae_config(struct join_req *csr_join_req, { } #endif +#if defined(WLAN_FEATURE_11AX) && defined(WLAN_SUPPORT_TWT) /** * csr_get_nss_supported_by_sta_and_ap() - finds out nss from session * and beacon from AP @@ -14591,16 +14592,21 @@ csr_check_vendor_ap_3_present(struct mac_context *mac_ctx, uint8_t *ie, static bool csr_enable_twt(struct mac_context *mac_ctx, tDot11fBeaconIEs *ie) { - if (mac_ctx->mlme_cfg->twt_cfg.is_twt_requestor_enabled && ie && + if (mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request && ie && (ie->qcn_ie.present || ie->he_cap.twt_responder)) { sme_debug("TWT is supported, hence disable UAPSD; twt req supp: %d,twt respon supp: %d, QCN_IE: %d", - mac_ctx->mlme_cfg->twt_cfg.is_twt_requestor_enabled, - ie->he_cap.twt_responder, - ie->qcn_ie.present); + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request, + ie->he_cap.twt_responder, ie->qcn_ie.present); return true; } return false; } +#else +static bool csr_enable_twt(struct mac_context *mac_ctx, tDot11fBeaconIEs *ie) +{ + return false; +} +#endif #ifdef WLAN_FEATURE_11AX static void