From 5f60fdf1a350c2516eef9ca248c8b3eb9817ee89 Mon Sep 17 00:00:00 2001 From: wadesong Date: Mon, 13 Sep 2021 13:05:06 +0800 Subject: [PATCH 01/30] qcacmn: Add bss membership selectors to wlan_cmn_ieee80211.h These defines are used by Supported Rates or Extended Supported Rates IE to set additional information beside rate. Change-Id: I44eac41a9a07d368a6fe3abc76e341915b3249b9 CRs-Fixed: 3034939 --- umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index e423506e6445..e5d6615115e3 100644 --- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -210,9 +210,15 @@ #define WLAN_HE_6GHZ_CHWIDTH_160_80_80 3 /* 160/80+80 MHz Oper Ch width */ #define WLAN_RATE_VAL 0x7f +#define WLAN_BASIC_RATE_MASK 0x80 #define WLAN_RV(v) ((v) & WLAN_RATE_VAL) +#define WLAN_BSS_MEMBERSHIP_SELECTOR_HT_PHY 127 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_SAE_H2E 123 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_HE_PHY 122 + #define WLAN_CHAN_IS_5GHZ(chanidx) \ ((chanidx > 30) ? true : false) #define WLAN_CHAN_IS_2GHZ(chanidx) \ From c97dd3ff6fe6024acb7cfd4946d62d7338b78e17 Mon Sep 17 00:00:00 2001 From: wadesong Date: Mon, 4 Oct 2021 15:15:08 -0700 Subject: [PATCH 02/30] qcacmn: Add all membership selector elements Include all elements from the BSS membership selector value encoding table. Change-Id: Ia9dda9aaa44d5c6ea83d750676511c1ed74bfb4b CRs-fixed: 3050316 --- umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index e5d6615115e3..6a9907af33e7 100644 --- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -216,6 +216,8 @@ #define WLAN_BSS_MEMBERSHIP_SELECTOR_HT_PHY 127 #define WLAN_BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_GLK 125 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_EPD 124 #define WLAN_BSS_MEMBERSHIP_SELECTOR_SAE_H2E 123 #define WLAN_BSS_MEMBERSHIP_SELECTOR_HE_PHY 122 From 6b0bc63a02265aa83c5e38f0363582ab033cdbbc Mon Sep 17 00:00:00 2001 From: Jingxiang Ge Date: Tue, 23 Nov 2021 14:17:41 +0800 Subject: [PATCH 03/30] qcacmn: Fix compliation error when disable CONFIG_LEAK_DETECTION Fix error when disable CONFIG_LEAK_DETECTION. Change-Id: I16d85b596ef64ad45e9fb0bb594b0a3287554e8f CRs-Fixed: 3080460 --- qdf/inc/qdf_tracker.h | 39 +++++++++++++++++++++++++++++++++++++ qdf/src/qdf_tracker.c | 6 ++++-- qdf/test/qdf_tracker_test.c | 5 ++++- qdf/test/qdf_tracker_test.h | 4 +++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/qdf/inc/qdf_tracker.h b/qdf/inc/qdf_tracker.h index 04dee0e7b246..bece8a77b06f 100644 --- a/qdf/inc/qdf_tracker.h +++ b/qdf/inc/qdf_tracker.h @@ -1,5 +1,7 @@ /* * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -60,6 +62,7 @@ struct qdf_tracker name = { \ .ht = qdf_ptr_hash_ptr(name ## _ht), \ } +#ifdef CONFIG_LEAK_DETECTION /** * qdf_tracker_init() - initialize a qdf_tracker * @tracker: the qdf_tracker to initialize @@ -125,6 +128,42 @@ qdf_must_check bool qdf_tracker_lookup(struct qdf_tracker *tracker, void *ptr, char (*out_func)[QDF_TRACKER_FUNC_SIZE], uint32_t *out_line); +#else +static inline +void qdf_tracker_init(struct qdf_tracker *tracker) +{ +} +static inline +void qdf_tracker_deinit(struct qdf_tracker *tracker) +{ +} + +static inline qdf_must_check QDF_STATUS +qdf_tracker_track(struct qdf_tracker *tracker, void *ptr, + const char *func, uint32_t line) +{ + return QDF_STATUS_SUCCESS; +} + +static inline +void qdf_tracker_untrack(struct qdf_tracker *tracker, void *ptr, + const char *func, uint32_t line) +{ +} + +static inline +void qdf_tracker_check_for_leaks(struct qdf_tracker *tracker) +{ +} + +static inline qdf_must_check bool +qdf_tracker_lookup(struct qdf_tracker *tracker, void *ptr, + char (*out_func)[QDF_TRACKER_FUNC_SIZE], + uint32_t *out_line) +{ + return false; +} +#endif #endif /* __QDF_TRACKER_H */ diff --git a/qdf/src/qdf_tracker.c b/qdf/src/qdf_tracker.c index 2061a4b5537a..2b58765b7820 100644 --- a/qdf/src/qdf_tracker.c +++ b/qdf/src/qdf_tracker.c @@ -1,5 +1,6 @@ /* - * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2019, 2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -26,6 +27,7 @@ #include "qdf_tracker.h" #include "qdf_types.h" +#ifdef CONFIG_LEAK_DETECTION struct qdf_tracker_node { struct qdf_ptr_hash_entry entry; enum qdf_debug_domain domain; @@ -188,4 +190,4 @@ bool qdf_tracker_lookup(struct qdf_tracker *tracker, void *ptr, return !!node; } - +#endif diff --git a/qdf/test/qdf_tracker_test.c b/qdf/test/qdf_tracker_test.c index b1bd7a8968b8..219a89bd9cbc 100644 --- a/qdf/test/qdf_tracker_test.c +++ b/qdf/test/qdf_tracker_test.c @@ -1,5 +1,7 @@ /* * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -21,6 +23,7 @@ #include "qdf_trace.h" #include "qdf_types.h" +#if defined(CONFIG_LEAK_DETECTION) && defined(WLAN_TRACKER_TEST) #define qdf_ut_tracker_bits 4 /* 16 buckets */ #define qdf_ut_tracker_item_count 3 #define qdf_ut_tracker_declare(name) \ @@ -92,4 +95,4 @@ uint32_t qdf_tracker_unit_test(void) return errors; } - +#endif diff --git a/qdf/test/qdf_tracker_test.h b/qdf/test/qdf_tracker_test.h index 8500f5110439..4b7d7968e1e9 100644 --- a/qdf/test/qdf_tracker_test.h +++ b/qdf/test/qdf_tracker_test.h @@ -1,5 +1,7 @@ /* * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -19,7 +21,7 @@ #ifndef __QDF_TRACKER_TEST #define __QDF_TRACKER_TEST -#ifdef WLAN_TRACKER_TEST +#if defined(CONFIG_LEAK_DETECTION) && defined(WLAN_TRACKER_TEST) /** * qdf_tracker_unit_test() - run the qdf tracker unit test suite * From ba98d887f9c92ac738bcba5890179effac743cf2 Mon Sep 17 00:00:00 2001 From: Karthik Kantamneni Date: Tue, 23 Nov 2021 15:55:37 +0530 Subject: [PATCH 04/30] qcacmn: Fix disconnection issue due to N/W queues pause Due to DP flow control network queues are stuck in paused state and not getting reset even after new connection. This is causing DHCP packets to be dropped and resulting immediate disconnection after every connection. Fix this by properly pausing and unpausing the AC flow control based network subqueues during disconnection/connection events. Change-Id: I280e704d5a01b19d180c32aaa272c0cb731f8c0e CRs-Fixed: 3078745 --- dp/inc/cdp_txrx_mob_def.h | 12 +++-- dp/wifi3.0/dp_tx_desc.h | 82 +++++++++++++++++++++++++++++++-- dp/wifi3.0/dp_tx_flow_control.c | 65 ++++++++++++++++++++------ dp/wifi3.0/dp_types.h | 26 +++++++++++ 4 files changed, 163 insertions(+), 22 deletions(-) diff --git a/dp/inc/cdp_txrx_mob_def.h b/dp/inc/cdp_txrx_mob_def.h index b68867f28983..191e5f7efb93 100644 --- a/dp/inc/cdp_txrx_mob_def.h +++ b/dp/inc/cdp_txrx_mob_def.h @@ -1,5 +1,6 @@ /* - * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -104,8 +105,9 @@ enum netif_action_type { WLAN_NETIF_VI_QUEUE_ON = 14, WLAN_NETIF_VI_QUEUE_OFF = 15, WLAN_NETIF_BE_BK_QUEUE_OFF = 16, - WLAN_WAKE_NON_PRIORITY_QUEUE = 17, - WLAN_STOP_NON_PRIORITY_QUEUE = 18, + WLAN_NETIF_BE_BK_QUEUE_ON = 17, + WLAN_WAKE_NON_PRIORITY_QUEUE = 18, + WLAN_STOP_NON_PRIORITY_QUEUE = 19, WLAN_NETIF_ACTION_TYPE_MAX, }; @@ -128,6 +130,10 @@ enum netif_reason_type { WLAN_PEER_UNAUTHORISED, WLAN_THERMAL_MITIGATION, WLAN_DATA_FLOW_CONTROL_PRIORITY, + WLAN_DATA_FLOW_CTRL_BE_BK, + WLAN_DATA_FLOW_CTRL_VI, + WLAN_DATA_FLOW_CTRL_VO, + WLAN_DATA_FLOW_CTRL_PRI, WLAN_REASON_TYPE_MAX, }; diff --git a/dp/wifi3.0/dp_tx_desc.h b/dp/wifi3.0/dp_tx_desc.h index cdc1f4c25e32..c3913aaf8487 100644 --- a/dp/wifi3.0/dp_tx_desc.h +++ b/dp/wifi3.0/dp_tx_desc.h @@ -1,5 +1,6 @@ /* - * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -219,6 +220,58 @@ dp_tx_is_threshold_reached(struct dp_tx_desc_pool_s *pool, uint16_t avail_desc) return false; } +/** + * dp_tx_adjust_flow_pool_state() - Adjust flow pool state + * + * @soc: dp soc + * @pool: flow pool + */ +static inline void +dp_tx_adjust_flow_pool_state(struct dp_soc *soc, + struct dp_tx_desc_pool_s *pool) +{ + if (pool->avail_desc > pool->stop_th[DP_TH_BE_BK]) { + pool->status = FLOW_POOL_ACTIVE_UNPAUSED; + return; + } else if (pool->avail_desc <= pool->stop_th[DP_TH_BE_BK] && + pool->avail_desc > pool->stop_th[DP_TH_VI]) { + pool->status = FLOW_POOL_BE_BK_PAUSED; + } else if (pool->avail_desc <= pool->stop_th[DP_TH_VI] && + pool->avail_desc > pool->stop_th[DP_TH_VO]) { + pool->status = FLOW_POOL_VI_PAUSED; + } else if (pool->avail_desc <= pool->stop_th[DP_TH_VO] && + pool->avail_desc > pool->stop_th[DP_TH_HI]) { + pool->status = FLOW_POOL_VO_PAUSED; + } else if (pool->avail_desc <= pool->stop_th[DP_TH_HI]) { + pool->status = FLOW_POOL_ACTIVE_PAUSED; + } + + switch (pool->status) { + case FLOW_POOL_ACTIVE_PAUSED: + soc->pause_cb(pool->flow_pool_id, + WLAN_NETIF_PRIORITY_QUEUE_OFF, + WLAN_DATA_FLOW_CTRL_PRI); + + case FLOW_POOL_VO_PAUSED: + soc->pause_cb(pool->flow_pool_id, + WLAN_NETIF_VO_QUEUE_OFF, + WLAN_DATA_FLOW_CTRL_VO); + + case FLOW_POOL_VI_PAUSED: + soc->pause_cb(pool->flow_pool_id, + WLAN_NETIF_VI_QUEUE_OFF, + WLAN_DATA_FLOW_CTRL_VI); + + case FLOW_POOL_BE_BK_PAUSED: + soc->pause_cb(pool->flow_pool_id, + WLAN_NETIF_BE_BK_QUEUE_OFF, + WLAN_DATA_FLOW_CTRL_BE_BK); + break; + default: + dp_err("Invalid pool staus:%u to adjust", pool->status); + } +} + /** * dp_tx_desc_alloc() - Allocate a Software Tx descriptor from given pool * @@ -235,39 +288,53 @@ dp_tx_desc_alloc(struct dp_soc *soc, uint8_t desc_pool_id) bool is_pause = false; enum netif_action_type act = WLAN_NETIF_ACTION_TYPE_NONE; enum dp_fl_ctrl_threshold level = DP_TH_BE_BK; + enum netif_reason_type reason; if (qdf_likely(pool)) { qdf_spin_lock_bh(&pool->flow_pool_lock); - if (qdf_likely(pool->avail_desc)) { + if (qdf_likely(pool->avail_desc && + pool->status != FLOW_POOL_INVALID && + pool->status != FLOW_POOL_INACTIVE)) { tx_desc = dp_tx_get_desc_flow_pool(pool); tx_desc->pool_id = desc_pool_id; tx_desc->flags = DP_TX_DESC_FLAG_ALLOCATED; + is_pause = dp_tx_is_threshold_reached(pool, pool->avail_desc); + if (qdf_unlikely(pool->status == + FLOW_POOL_ACTIVE_UNPAUSED_REATTACH)) { + dp_tx_adjust_flow_pool_state(soc, pool); + is_pause = false; + } + if (qdf_unlikely(is_pause)) { switch (pool->status) { case FLOW_POOL_ACTIVE_UNPAUSED: /* pause network BE\BK queue */ act = WLAN_NETIF_BE_BK_QUEUE_OFF; + reason = WLAN_DATA_FLOW_CTRL_BE_BK; level = DP_TH_BE_BK; pool->status = FLOW_POOL_BE_BK_PAUSED; break; case FLOW_POOL_BE_BK_PAUSED: /* pause network VI queue */ act = WLAN_NETIF_VI_QUEUE_OFF; + reason = WLAN_DATA_FLOW_CTRL_VI; level = DP_TH_VI; pool->status = FLOW_POOL_VI_PAUSED; break; case FLOW_POOL_VI_PAUSED: /* pause network VO queue */ act = WLAN_NETIF_VO_QUEUE_OFF; + reason = WLAN_DATA_FLOW_CTRL_VO; level = DP_TH_VO; pool->status = FLOW_POOL_VO_PAUSED; break; case FLOW_POOL_VO_PAUSED: /* pause network HI PRI queue */ act = WLAN_NETIF_PRIORITY_QUEUE_OFF; + reason = WLAN_DATA_FLOW_CTRL_PRI; level = DP_TH_HI; pool->status = FLOW_POOL_ACTIVE_PAUSED; break; @@ -285,7 +352,7 @@ dp_tx_desc_alloc(struct dp_soc *soc, uint8_t desc_pool_id) qdf_get_system_timestamp(); soc->pause_cb(desc_pool_id, act, - WLAN_DATA_FLOW_CONTROL); + reason); } } } else { @@ -315,6 +382,7 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, struct dp_tx_desc_pool_s *pool = &soc->tx_desc[desc_pool_id]; qdf_time_t unpause_time = qdf_get_system_timestamp(), pause_dur; enum netif_action_type act = WLAN_WAKE_ALL_NETIF_QUEUE; + enum netif_reason_type reason; qdf_spin_lock_bh(&pool->flow_pool_lock); tx_desc->vdev_id = DP_INVALID_VDEV_ID; @@ -325,6 +393,7 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, case FLOW_POOL_ACTIVE_PAUSED: if (pool->avail_desc > pool->start_th[DP_TH_HI]) { act = WLAN_NETIF_PRIORITY_QUEUE_ON; + reason = WLAN_DATA_FLOW_CTRL_PRI; pool->status = FLOW_POOL_VO_PAUSED; /* Update maxinum pause duration for HI queue */ @@ -337,6 +406,7 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, case FLOW_POOL_VO_PAUSED: if (pool->avail_desc > pool->start_th[DP_TH_VO]) { act = WLAN_NETIF_VO_QUEUE_ON; + reason = WLAN_DATA_FLOW_CTRL_VO; pool->status = FLOW_POOL_VI_PAUSED; /* Update maxinum pause duration for VO queue */ @@ -349,6 +419,7 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, case FLOW_POOL_VI_PAUSED: if (pool->avail_desc > pool->start_th[DP_TH_VI]) { act = WLAN_NETIF_VI_QUEUE_ON; + reason = WLAN_DATA_FLOW_CTRL_VI; pool->status = FLOW_POOL_BE_BK_PAUSED; /* Update maxinum pause duration for VI queue */ @@ -360,7 +431,8 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, break; case FLOW_POOL_BE_BK_PAUSED: if (pool->avail_desc > pool->start_th[DP_TH_BE_BK]) { - act = WLAN_WAKE_NON_PRIORITY_QUEUE; + act = WLAN_NETIF_BE_BK_QUEUE_ON; + reason = WLAN_DATA_FLOW_CTRL_BE_BK; pool->status = FLOW_POOL_ACTIVE_UNPAUSED; /* Update maxinum pause duration for BE_BK queue */ @@ -393,7 +465,7 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, if (act != WLAN_WAKE_ALL_NETIF_QUEUE) soc->pause_cb(pool->flow_pool_id, - act, WLAN_DATA_FLOW_CONTROL); + act, reason); qdf_spin_unlock_bh(&pool->flow_pool_lock); } #else /* QCA_AC_BASED_FLOW_CONTROL */ diff --git a/dp/wifi3.0/dp_tx_flow_control.c b/dp/wifi3.0/dp_tx_flow_control.c index 6d728d278d65..d12a82e0131e 100644 --- a/dp/wifi3.0/dp_tx_flow_control.c +++ b/dp/wifi3.0/dp_tx_flow_control.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -90,20 +91,7 @@ dp_tx_flow_pool_reattach(struct dp_tx_desc_pool_s *pool) "%s: flow pool already allocated, attached %d times", __func__, pool->pool_create_cnt); - if (pool->avail_desc > pool->start_th[DP_TH_BE_BK]) - pool->status = FLOW_POOL_ACTIVE_UNPAUSED; - else if (pool->avail_desc <= pool->start_th[DP_TH_BE_BK] && - pool->avail_desc > pool->start_th[DP_TH_VI]) - pool->status = FLOW_POOL_BE_BK_PAUSED; - else if (pool->avail_desc <= pool->start_th[DP_TH_VI] && - pool->avail_desc > pool->start_th[DP_TH_VO]) - pool->status = FLOW_POOL_VI_PAUSED; - else if (pool->avail_desc <= pool->start_th[DP_TH_VO] && - pool->avail_desc > pool->start_th[DP_TH_HI]) - pool->status = FLOW_POOL_VO_PAUSED; - else - pool->status = FLOW_POOL_ACTIVE_PAUSED; - + pool->status = FLOW_POOL_ACTIVE_UNPAUSED_REATTACH; pool->pool_create_cnt++; } @@ -131,6 +119,44 @@ dp_tx_flow_pool_dump_threshold(struct dp_tx_desc_pool_s *pool) } } +/** + * dp_tx_flow_ctrl_reset_subqueues() - Reset subqueues to orginal state + * @soc: dp soc + * @pool: flow pool + * @pool_status: flow pool status + * + * Return: none + */ +static inline void +dp_tx_flow_ctrl_reset_subqueues(struct dp_soc *soc, + struct dp_tx_desc_pool_s *pool, + enum flow_pool_status pool_status) +{ + switch (pool_status) { + case FLOW_POOL_ACTIVE_PAUSED: + soc->pause_cb(pool->flow_pool_id, + WLAN_NETIF_PRIORITY_QUEUE_ON, + WLAN_DATA_FLOW_CTRL_PRI); + + case FLOW_POOL_VO_PAUSED: + soc->pause_cb(pool->flow_pool_id, + WLAN_NETIF_VO_QUEUE_ON, + WLAN_DATA_FLOW_CTRL_VO); + + case FLOW_POOL_VI_PAUSED: + soc->pause_cb(pool->flow_pool_id, + WLAN_NETIF_VI_QUEUE_ON, + WLAN_DATA_FLOW_CTRL_VI); + + case FLOW_POOL_BE_BK_PAUSED: + soc->pause_cb(pool->flow_pool_id, + WLAN_NETIF_BE_BK_QUEUE_ON, + WLAN_DATA_FLOW_CTRL_BE_BK); + default: + break; + } +} + #else static inline void dp_tx_initialize_threshold(struct dp_tx_desc_pool_s *pool, @@ -166,6 +192,13 @@ dp_tx_flow_pool_dump_threshold(struct dp_tx_desc_pool_s *pool) pool->start_th, pool->stop_th); } +static inline void +dp_tx_flow_ctrl_reset_subqueues(struct dp_soc *soc, + struct dp_tx_desc_pool_s *pool, + enum flow_pool_status pool_status) +{ +} + #endif /** @@ -356,6 +389,7 @@ int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool, bool force) { struct dp_vdev *vdev; + enum flow_pool_status pool_status; if (!soc || !pool) { dp_err("pool or soc is NULL"); @@ -381,7 +415,10 @@ int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool, } if (pool->avail_desc < pool->pool_size) { + pool_status = pool->status; pool->status = FLOW_POOL_INVALID; + dp_tx_flow_ctrl_reset_subqueues(soc, pool, pool_status); + qdf_spin_unlock_bh(&pool->flow_pool_lock); /* Reset TX desc associated to this Vdev as NULL */ vdev = dp_vdev_get_ref_by_id(soc, pool->flow_pool_id, diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 2d3d0add270a..87587b070bfc 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -533,6 +533,30 @@ struct dp_tx_desc_s { struct hal_tx_desc_comp_s comp; }; +#ifdef QCA_AC_BASED_FLOW_CONTROL +/** + * enum flow_pool_status - flow pool status + * @FLOW_POOL_ACTIVE_UNPAUSED : pool is active (can take/put descriptors) + * and network queues are unpaused + * @FLOW_POOL_ACTIVE_PAUSED: pool is active (can take/put descriptors) + * and network queues are paused + * @FLOW_POOL_INVALID: pool is invalid (put descriptor) + * @FLOW_POOL_INACTIVE: pool is inactive (pool is free) + * @FLOW_POOL_ACTIVE_UNPAUSED_REATTACH: pool is reattached but network + * queues are not paused + */ +enum flow_pool_status { + FLOW_POOL_ACTIVE_UNPAUSED = 0, + FLOW_POOL_ACTIVE_PAUSED = 1, + FLOW_POOL_BE_BK_PAUSED = 2, + FLOW_POOL_VI_PAUSED = 3, + FLOW_POOL_VO_PAUSED = 4, + FLOW_POOL_INVALID = 5, + FLOW_POOL_INACTIVE = 6, + FLOW_POOL_ACTIVE_UNPAUSED_REATTACH = 7, +}; + +#else /** * enum flow_pool_status - flow pool status * @FLOW_POOL_ACTIVE_UNPAUSED : pool is active (can take/put descriptors) @@ -552,6 +576,8 @@ enum flow_pool_status { FLOW_POOL_INACTIVE = 6, }; +#endif + /** * struct dp_tx_tso_seg_pool_s * @pool_size: total number of pool elements From 2361ccf5b8b521493a72660ea70f0c076fad0073 Mon Sep 17 00:00:00 2001 From: Karthik Kantamneni Date: Tue, 30 Nov 2021 18:47:35 +0530 Subject: [PATCH 05/30] qcacmn: Increase EP wake timeout for debug build in QCA6750 Currently EP wake delay timeout is less and there is chance of timeout to happen, so increase the timeout value. Change-Id: I59261ade269908cd4d9c17025838807f39913999 CRs-Fixed: 3086547 --- hif/src/ipcie/if_ipci.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hif/src/ipcie/if_ipci.h b/hif/src/ipcie/if_ipci.h index 2270890f6f60..209d91d437df 100644 --- a/hif/src/ipcie/if_ipci.h +++ b/hif/src/ipcie/if_ipci.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 above @@ -68,11 +69,10 @@ struct hif_ipci_stats { #define EP_VOTE_POLL_TIME_CNT 2 #ifdef HAL_CONFIG_SLUB_DEBUG_ON #define EP_WAKE_RESET_DELAY_TIMEOUT_MS 3 -#define EP_WAKE_DELAY_TIMEOUT_MS 7 #else #define EP_WAKE_RESET_DELAY_TIMEOUT_MS 10 -#define EP_WAKE_DELAY_TIMEOUT_MS 10 #endif +#define EP_WAKE_DELAY_TIMEOUT_MS 10 #define EP_WAKE_RESET_DELAY_US 50 #define EP_WAKE_DELAY_US 200 #endif From f2da57d9ca3a00d1ba2f5237487a8cffc830c931 Mon Sep 17 00:00:00 2001 From: Surya Prakash Raajen Date: Thu, 24 Jun 2021 22:17:42 +0530 Subject: [PATCH 06/30] qcacmn: Add support for beamforming in mgmt frames Add support for enable beamforming in mgmt frames to FW. Change-Id: I0b7f8d13b6fc399d6255b217f5a53cd3c595fa51 CRs-Fixed: 2976861 --- wmi/inc/wmi_unified_param.h | 5 ++++- wmi/src/wmi_unified_tlv.c | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index b97c2455e142..0befbeff9338 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -1298,6 +1298,8 @@ struct seg_hdr_info { * Data:1 Mgmt:0 * @cfr_enable: flag to enable CFR capture * 0:disable 1:enable + * @en_beamforming: flag to enable tx beamforming + * 0:disable 1:enable */ struct tx_send_params { uint32_t pwr:8, @@ -1309,7 +1311,8 @@ struct tx_send_params { preamble_type:5, frame_type:1, cfr_enable:1, - reserved:10; + en_beamforming:1, + reserved:9; }; /** diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 1b95fa9770e9..35f42c87709a 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -3393,6 +3393,8 @@ static inline QDF_STATUS populate_tx_send_params(uint8_t *bufp, param.frame_type); WMI_TX_SEND_PARAM_CFR_CAPTURE_SET(tx_param->tx_param_dword1, param.cfr_enable); + WMI_TX_SEND_PARAM_BEAMFORM_SET(tx_param->tx_param_dword1, + param.en_beamforming); return status; } From 87b2d3e4ea9babb01e1d910f19ac3d5a1afcbd36 Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Tue, 23 Nov 2021 11:29:38 +0800 Subject: [PATCH 07/30] qcacmn: Set retry_limit_ext for MGMT frame send WMI command Some p2p action frame needs big retry count than the default max 15 retry count to get high tx successful ratio. FW allocates 3 extra bits for retry count setup. To use this field needs FW change in CR 3082533. Set the extra 3 bits "retry_limit_ext" to "tx_param_dword0" field for WMI MGMT send command. Existing 4 bits "retry_limit" combines with this new 3 bits "retry_limit_ext" to create a 7 bits retry count: bit 0 - 3: retry_limit bit 4 - 6: retry_limit_ext. So Maximum 127 retries can be specified to a certain mgmt frame. To use this field needs FW change in CR 3082533. Change-Id: I889933ea1750c03701ba8a60340f27e6c2594c1b CRs-Fixed: 3082534 --- wmi/inc/wmi_unified_param.h | 7 ++++++- wmi/src/wmi_unified_tlv.c | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 0befbeff9338..03a5b24689bd 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -1300,6 +1300,10 @@ struct seg_hdr_info { * 0:disable 1:enable * @en_beamforming: flag to enable tx beamforming * 0:disable 1:enable + * @retry_limit_ext: 3 bits of extended retry limit. + * Combined with 4 bits "retry_limit" + * to create 7 bits hw retry count. + * Maximum 127 retries for specific frames. */ struct tx_send_params { uint32_t pwr:8, @@ -1312,7 +1316,8 @@ struct tx_send_params { frame_type:1, cfr_enable:1, en_beamforming:1, - reserved:9; + retry_limit_ext:3, + reserved:6; }; /** diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 35f42c87709a..df3781218048 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -3395,6 +3395,8 @@ static inline QDF_STATUS populate_tx_send_params(uint8_t *bufp, param.cfr_enable); WMI_TX_SEND_PARAM_BEAMFORM_SET(tx_param->tx_param_dword1, param.en_beamforming); + WMI_TX_SEND_PARAM_RETRY_LIMIT_EXT_SET(tx_param->tx_param_dword1, + param.retry_limit_ext); return status; } From b05e30407ff2192eb319a8a006322b7d0fdde4a6 Mon Sep 17 00:00:00 2001 From: Jianmin Zhu Date: Fri, 10 Dec 2021 10:57:45 +0800 Subject: [PATCH 08/30] qcacmn: Fix 11ac no rate info in monitor mode PPDU nss is set as 0 illegally for qca6490, can't calculate rate. Change-Id: I6d06d4cb220300e202f7b4f93e4e0eb1299cc8e6 CRs-Fixed: 3085590 --- hal/wifi3.0/hal_generic_api.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hal/wifi3.0/hal_generic_api.h b/hal/wifi3.0/hal_generic_api.h index 38d44dc0ef27..159bb076fa2f 100644 --- a/hal/wifi3.0/hal_generic_api.h +++ b/hal/wifi3.0/hal_generic_api.h @@ -907,6 +907,7 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, #ifdef QCA_WIFI_QCA6390 case TARGET_TYPE_QCA6390: #endif + case TARGET_TYPE_QCA6490: ppdu_info->rx_status.is_stbc = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0, STBC); @@ -935,7 +936,6 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, ppdu_info->rx_status.nss = 0; #endif break; - case TARGET_TYPE_QCA6490: case TARGET_TYPE_QCA6750: ppdu_info->rx_status.nss = 0; break; From 3248f7adec98878ca9b80be73a03039319518f0b Mon Sep 17 00:00:00 2001 From: Dundi Raviteja Date: Wed, 1 Dec 2021 18:50:06 +0530 Subject: [PATCH 09/30] qcacmn: Avoid possible out of array access In function wbuff_buff_put(), there is a possibility to access array out of boundaries for module slot and pool slot. Add condition to check for array boundaries. Change-Id: Iaf5a0ef6b2e712804717abf27d0c0d06862a04f5 CRs-Fixed: 3086342 --- wbuff/src/wbuff.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/wbuff/src/wbuff.c b/wbuff/src/wbuff.c index 65455bfb4d09..4b964d161aa7 100644 --- a/wbuff/src/wbuff.c +++ b/wbuff/src/wbuff.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -345,6 +346,10 @@ qdf_nbuf_t wbuff_buff_put(qdf_nbuf_t buf) mslot = (slot_info & WBUFF_MSLOT_BITMASK) >> WBUFF_MSLOT_SHIFT; pslot = (slot_info & WBUFF_PSLOT_BITMASK) >> WBUFF_PSLOT_SHIFT; + + if (mslot >= WBUFF_MAX_MODULES || pslot >= WBUFF_MAX_POOLS) + return NULL; + qdf_nbuf_reset(buffer, wbuff.mod[mslot].reserve, wbuff.mod[mslot]. align); qdf_spin_lock_bh(&wbuff.mod[mslot].lock); From c183eeaca474cb16f36bebde9bccb9b093586301 Mon Sep 17 00:00:00 2001 From: Karthik Kantamneni Date: Mon, 6 Dec 2021 15:41:24 +0530 Subject: [PATCH 10/30] qcacmn: Fix compilation error in flow control switch case logic In flow control code switch logic break statements are not used intentionally, but compiler is treating this as error. So to avoid compilation error add fall through comment. Change-Id: Ic79b75c48554182fba7c4c0f3885e3a44347e2e7 CRs-Fixed: 3090182 --- dp/wifi3.0/dp_tx_desc.h | 3 +++ dp/wifi3.0/dp_tx_flow_control.c | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/dp/wifi3.0/dp_tx_desc.h b/dp/wifi3.0/dp_tx_desc.h index c3913aaf8487..9c8527971742 100644 --- a/dp/wifi3.0/dp_tx_desc.h +++ b/dp/wifi3.0/dp_tx_desc.h @@ -251,16 +251,19 @@ dp_tx_adjust_flow_pool_state(struct dp_soc *soc, soc->pause_cb(pool->flow_pool_id, WLAN_NETIF_PRIORITY_QUEUE_OFF, WLAN_DATA_FLOW_CTRL_PRI); + /* fallthrough */ case FLOW_POOL_VO_PAUSED: soc->pause_cb(pool->flow_pool_id, WLAN_NETIF_VO_QUEUE_OFF, WLAN_DATA_FLOW_CTRL_VO); + /* fallthrough */ case FLOW_POOL_VI_PAUSED: soc->pause_cb(pool->flow_pool_id, WLAN_NETIF_VI_QUEUE_OFF, WLAN_DATA_FLOW_CTRL_VI); + /* fallthrough */ case FLOW_POOL_BE_BK_PAUSED: soc->pause_cb(pool->flow_pool_id, diff --git a/dp/wifi3.0/dp_tx_flow_control.c b/dp/wifi3.0/dp_tx_flow_control.c index d12a82e0131e..341e7945904d 100644 --- a/dp/wifi3.0/dp_tx_flow_control.c +++ b/dp/wifi3.0/dp_tx_flow_control.c @@ -137,21 +137,25 @@ dp_tx_flow_ctrl_reset_subqueues(struct dp_soc *soc, soc->pause_cb(pool->flow_pool_id, WLAN_NETIF_PRIORITY_QUEUE_ON, WLAN_DATA_FLOW_CTRL_PRI); + /* fallthrough */ case FLOW_POOL_VO_PAUSED: soc->pause_cb(pool->flow_pool_id, WLAN_NETIF_VO_QUEUE_ON, WLAN_DATA_FLOW_CTRL_VO); + /* fallthrough */ case FLOW_POOL_VI_PAUSED: soc->pause_cb(pool->flow_pool_id, WLAN_NETIF_VI_QUEUE_ON, WLAN_DATA_FLOW_CTRL_VI); + /* fallthrough */ case FLOW_POOL_BE_BK_PAUSED: soc->pause_cb(pool->flow_pool_id, WLAN_NETIF_BE_BK_QUEUE_ON, WLAN_DATA_FLOW_CTRL_BE_BK); + /* fallthrough */ default: break; } From a48f5b3c5cc12cc4c41da6b621c2433100ffc2e0 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Mon, 12 Oct 2020 13:54:36 +0530 Subject: [PATCH 11/30] qcacmn: Extract additional info to cfr metadata Extract agc gain information, CFO & rx_start_ts from rx status and cfr peer capture event to CFR host metadata Change-Id: Id896554f1da6920bd3eeced1298b07857d41a68b --- target_if/cfr/inc/target_if_cfr.h | 6 +- target_if/cfr/src/target_if_cfr_enh.c | 108 +++++++++++++++++++------- 2 files changed, 84 insertions(+), 30 deletions(-) diff --git a/target_if/cfr/inc/target_if_cfr.h b/target_if/cfr/inc/target_if_cfr.h index 237aaee8dfc5..608de0c7b847 100644 --- a/target_if/cfr/inc/target_if_cfr.h +++ b/target_if/cfr/inc/target_if_cfr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-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 @@ -48,6 +48,10 @@ */ #define CORRELATE_TX_EV_MODULE_ID 1 +#define get_u16_lsb(value) (uint16_t)(value) +#define get_u16_msb(value) (uint16_t)(((uint32_t)value) >> 16) +#define get_gain_db(value) ((value) & 0xFF) + /** * target_if_cfr_init_pdev() - Inits cfr pdev and registers necessary handlers. * @psoc: pointer to psoc object diff --git a/target_if/cfr/src/target_if_cfr_enh.c b/target_if/cfr/src/target_if_cfr_enh.c index 8a17ace66c90..7a52b19437e3 100644 --- a/target_if/cfr/src/target_if_cfr_enh.c +++ b/target_if/cfr/src/target_if_cfr_enh.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-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 @@ -337,7 +337,7 @@ static void dump_mu_rx_info(void *mu_rx_user_info, static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) { uint8_t user_id, chain_id; - struct cfr_metadata_version_3 *meta = &header->u.meta_v3; + struct cfr_metadata_version_5 *meta = &header->u.meta_v5; uint8_t *usermac = NULL; cfr_debug("<%u>\n" @@ -345,6 +345,7 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) "vendorid = 0x%x\n" "cfr_metadata_version = %d\n" "cfr_data_version = %d\n" + "cfr_metadata_len = %d\n" "chip_type = %d\n" "platform_type = %d\n" "status = %d\n" @@ -367,6 +368,7 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) header->vendorid, header->cfr_metadata_version, header->cfr_data_version, + header->cfr_metadata_len, header->chip_type, header->pltform_type, meta->status, @@ -407,6 +409,18 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) chain_id, meta->chain_phase[chain_id]); } + + if (header->cfr_metadata_version == CFR_META_VERSION_5) { + cfr_debug("rtt_cfo_measurement = %d\n", + meta->rtt_cfo_measurement); + cfr_debug("rx_start_ts = %u\n", meta->rx_start_ts); + + for (chain_id = 0; chain_id < HOST_MAX_CHAINS; chain_id++) { + cfr_debug("agc_gain[%d] = %d\n", + chain_id, + meta->agc_gain[chain_id]); + } + } } /** @@ -704,9 +718,10 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) int i, status = 0; QDF_STATUS retval = 0; struct wlan_lmac_if_cfr_rx_ops *cfr_rx_ops = NULL; - struct cfr_metadata_version_3 *meta = NULL; + struct cfr_metadata_version_5 *meta = NULL; uint8_t srng_id = 0; struct wlan_lmac_if_rx_ops *rx_ops; + uint32_t target_type; if (qdf_unlikely(!pdev)) { cfr_err("pdev is null\n"); @@ -745,6 +760,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) cfr_err("rx_ops is NULL"); goto relref; } + target_type = target_if_cfr_get_target_type(psoc); cfr_rx_ops = &rx_ops->cfr_rx_ops; buf_addr_extn = cfr_info->rtt_che_buffer_pointer_high8 & 0xF; buf_addr = (cfr_info->rtt_che_buffer_pointer_low32 | @@ -805,15 +821,20 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) lut->tx_address2 = cfr_info->rtt_che_buffer_pointer_high8; lut->txrx_tstamp = qdf_ktime_to_ms(qdf_ktime_get()); header = &lut->header; - meta = &header->u.meta_v3; + meta = &header->u.meta_v5; header->start_magic_num = 0xDEADBEAF; header->vendorid = 0x8cfdf0; - header->cfr_metadata_version = CFR_META_VERSION_3; + if (target_type == TARGET_TYPE_QCN9000 || + target_type == TARGET_TYPE_QCA6018) + header->cfr_metadata_version = CFR_META_VERSION_5; + else + header->cfr_metadata_version = CFR_META_VERSION_3; + header->cfr_data_version = CFR_DATA_VERSION_1; header->chip_type = pcfr->chip_type; header->pltform_type = CFR_PLATFORM_TYPE_ARM; - header->Reserved = 0; + header->cfr_metadata_len = sizeof(struct cfr_metadata_version_5); meta->status = 1; meta->phy_mode = ch_phymode; @@ -826,6 +847,18 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) meta->is_mu_ppdu = (cdp_rx_ppdu->u.ppdu_type == CDP_RX_TYPE_SU) ? 0 : 1; meta->num_mu_users = (meta->is_mu_ppdu) ? (cdp_rx_ppdu->num_users) : 0; + meta->rtt_cfo_measurement = cfr_info->rtt_cfo_measurement; + meta->rx_start_ts = cfr_info->rx_start_ts; + + meta->agc_gain[0] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info0)); + meta->agc_gain[1] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info0)); + meta->agc_gain[2] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info1)); + meta->agc_gain[3] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info1)); + meta->agc_gain[4] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info2)); + meta->agc_gain[5] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info2)); + meta->agc_gain[6] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info3)); + meta->agc_gain[7] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info3)); + if (meta->num_mu_users > pcfr->max_mu_users) meta->num_mu_users = pcfr->max_mu_users; @@ -923,7 +956,7 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev, uint8_t capture_type = CFR_TYPE_METHOD_AUTO; uint8_t *peer_macaddr = NULL; struct wlan_lmac_if_cfr_rx_ops *cfr_rx_ops = NULL; - struct cfr_metadata_version_3 *meta = NULL; + struct cfr_metadata_version_5 *meta = NULL; struct wlan_lmac_if_rx_ops *rx_ops; if ((!pdev) || (!payload)) { @@ -1004,7 +1037,7 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev, header = &lut->header; header->chip_type = pcfr->chip_type; - meta = &header->u.meta_v3; + meta = &header->u.meta_v5; meta->channel_bw = dma_hdr.upload_pkt_bw; meta->num_rx_chain = NUM_CHAINS_FW_TO_HOST(dma_hdr.num_chains); meta->length = length; @@ -1166,8 +1199,13 @@ static void enh_prepare_cfr_header_txstatus(wmi_cfr_peer_tx_event_param { header->start_magic_num = 0xDEADBEAF; header->vendorid = 0x8cfdf0; - header->cfr_metadata_version = CFR_META_VERSION_3; header->cfr_data_version = CFR_DATA_VERSION_1; + if (target_type == TARGET_TYPE_QCN9000 || + target_type == TARGET_TYPE_QCA6018 || + target_type == TARGET_TYPE_QCA5018) + header->cfr_metadata_version = CFR_META_VERSION_5; + else + header->cfr_metadata_version = CFR_META_VERSION_3; if (target_type == TARGET_TYPE_QCN9000) header->chip_type = CFR_CAPTURE_RADIO_PINE; @@ -1177,11 +1215,13 @@ static void enh_prepare_cfr_header_txstatus(wmi_cfr_peer_tx_event_param header->chip_type = CFR_CAPTURE_RADIO_CYP; header->pltform_type = CFR_PLATFORM_TYPE_ARM; - header->Reserved = 0; - header->u.meta_v3.status = 0; /* failure */ - header->u.meta_v3.length = 0; + header->cfr_metadata_len = sizeof(struct cfr_metadata_version_5); + header->u.meta_v5.status = 0; /* failure */ + header->u.meta_v5.length = 0; + header->u.meta_v5.rtt_cfo_measurement = tx_evt_param->cfo_measurement; + header->u.meta_v5.rx_start_ts = tx_evt_param->rx_start_ts; - qdf_mem_copy(&header->u.meta_v3.peer_addr.su_peer_addr[0], + qdf_mem_copy(&header->u.meta_v5.peer_addr.su_peer_addr[0], &tx_evt_param->peer_mac_addr.bytes[0], QDF_MAC_ADDR_SIZE); } @@ -1364,8 +1404,14 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen) header = &lut->header; header->start_magic_num = 0xDEADBEAF; header->vendorid = 0x8cfdf0; - header->cfr_metadata_version = CFR_META_VERSION_3; header->cfr_data_version = CFR_DATA_VERSION_1; + header->cfr_metadata_len = sizeof(struct cfr_metadata_version_5); + if (target_type == TARGET_TYPE_QCN9000 || + target_type == TARGET_TYPE_QCA6018 || + target_type == TARGET_TYPE_QCA5018) + header->cfr_metadata_version = CFR_META_VERSION_5; + else + header->cfr_metadata_version = CFR_META_VERSION_3; if (target_type == TARGET_TYPE_QCN9000) header->chip_type = CFR_CAPTURE_RADIO_PINE; @@ -1375,37 +1421,41 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen) header->chip_type = CFR_CAPTURE_RADIO_CYP; header->pltform_type = CFR_PLATFORM_TYPE_ARM; - header->Reserved = 0; - header->u.meta_v3.status = (tx_evt_param.status & + header->u.meta_v5.status = (tx_evt_param.status & PEER_CFR_CAPTURE_EVT_STATUS_MASK) ? 1 : 0; - header->u.meta_v3.capture_bw = tx_evt_param.bandwidth; + header->u.meta_v5.capture_bw = tx_evt_param.bandwidth; bss_chan = wlan_vdev_mlme_get_bss_chan(vdev); - header->u.meta_v3.phy_mode = bss_chan->ch_phymode; + header->u.meta_v5.phy_mode = bss_chan->ch_phymode; - header->u.meta_v3.prim20_chan = tx_evt_param.primary_20mhz_chan; - header->u.meta_v3.center_freq1 = tx_evt_param.band_center_freq1; - header->u.meta_v3.center_freq2 = tx_evt_param.band_center_freq2; + header->u.meta_v5.prim20_chan = tx_evt_param.primary_20mhz_chan; + header->u.meta_v5.center_freq1 = tx_evt_param.band_center_freq1; + header->u.meta_v5.center_freq2 = tx_evt_param.band_center_freq2; /* Currently CFR data is captured on ACK of a Qos NULL frame. * For 20 MHz, ACK is Legacy and for 40/80/160, ACK is DUP Legacy. */ - header->u.meta_v3.capture_mode = tx_evt_param.bandwidth ? + header->u.meta_v5.capture_mode = tx_evt_param.bandwidth ? CFR_DUP_LEGACY_ACK : CFR_LEGACY_ACK; - header->u.meta_v3.capture_type = tx_evt_param.capture_method; - header->u.meta_v3.num_rx_chain = wlan_vdev_mlme_get_rxchainmask(vdev); - header->u.meta_v3.sts_count = tx_evt_param.spatial_streams; - header->u.meta_v3.timestamp = tx_evt_param.timestamp_us; + header->u.meta_v5.capture_type = tx_evt_param.capture_method; + header->u.meta_v5.num_rx_chain = wlan_vdev_mlme_get_rxchainmask(vdev); + header->u.meta_v5.sts_count = tx_evt_param.spatial_streams; + header->u.meta_v5.timestamp = tx_evt_param.timestamp_us; - qdf_mem_copy(&header->u.meta_v3.peer_addr.su_peer_addr[0], + qdf_mem_copy(&header->u.meta_v5.peer_addr.su_peer_addr[0], &tx_evt_param.peer_mac_addr.bytes[0], QDF_MAC_ADDR_SIZE); - qdf_mem_copy(&header->u.meta_v3.chain_rssi[0], + qdf_mem_copy(&header->u.meta_v5.chain_rssi[0], &tx_evt_param.chain_rssi[0], HOST_MAX_CHAINS * sizeof(tx_evt_param.chain_rssi[0])); - qdf_mem_copy(&header->u.meta_v3.chain_phase[0], + qdf_mem_copy(&header->u.meta_v5.chain_phase[0], &tx_evt_param.chain_phase[0], HOST_MAX_CHAINS * sizeof(tx_evt_param.chain_phase[0])); + qdf_mem_copy(&header->u.meta_v5.agc_gain[0], + &tx_evt_param.agc_gain[0], + HOST_MAX_CHAINS * sizeof(tx_evt_param.agc_gain[0])); + header->u.meta_v5.rtt_cfo_measurement = tx_evt_param.cfo_measurement; + header->u.meta_v5.rx_start_ts = tx_evt_param.rx_start_ts; status = correlate_and_relay_enh(pdev, cookie, lut, CORRELATE_TX_EV_MODULE_ID); From 107d6a5048829152e0e65e31b7a1fb87fa67eced Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Mon, 12 Oct 2020 13:51:34 +0530 Subject: [PATCH 12/30] qcacmn: Add additional parameters to CFR meta data Add per chain agc gain in dB information, CFO & rx_start_ts fields to CFR metadata Change-Id: I6af9c4212fe5a0bed6e51516d1c446155cea63aa --- umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h | 60 +++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h index e8b7721734b1..1d7d6ac62812 100644 --- a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h +++ b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h @@ -1,6 +1,6 @@ /* - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-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 @@ -67,6 +67,8 @@ enum cfrmetaversion { CFR_META_VERSION_1, CFR_META_VERSION_2, CFR_META_VERSION_3, + CFR_META_VERSION_4, + CFR_META_VERSION_5, CFR_META_VERSION_MAX = 0xFF, }; @@ -170,6 +172,28 @@ struct cfr_metadata_version_2 { u_int16_t chain_phase[HOST_MAX_CHAINS]; } __attribute__ ((__packed__)); +struct cfr_metadata_version_4 { + u_int8_t peer_addr[QDF_MAC_ADDR_SIZE]; + u_int8_t status; + u_int8_t capture_bw; + u_int8_t channel_bw; + u_int8_t phy_mode; + u_int16_t prim20_chan; + u_int16_t center_freq1; + u_int16_t center_freq2; + u_int8_t capture_mode; + u_int8_t capture_type; + u_int8_t sts_count; + u_int8_t num_rx_chain; + u_int32_t timestamp; + u_int32_t length; + u_int32_t chain_rssi[HOST_MAX_CHAINS]; + u_int16_t chain_phase[HOST_MAX_CHAINS]; + u_int32_t rtt_cfo_measurement; + u_int8_t agc_gain[HOST_MAX_CHAINS]; + u_int32_t rx_start_ts; +} __attribute__ ((__packed__)); + #ifdef WLAN_ENH_CFR_ENABLE struct cfr_metadata_version_3 { u_int8_t status; @@ -194,6 +218,34 @@ struct cfr_metadata_version_3 { u_int32_t chain_rssi[HOST_MAX_CHAINS]; u_int16_t chain_phase[HOST_MAX_CHAINS]; } __attribute__ ((__packed__)); + +struct cfr_metadata_version_5 { + u_int8_t status; + u_int8_t capture_bw; + u_int8_t channel_bw; + u_int8_t phy_mode; + u_int16_t prim20_chan; + u_int16_t center_freq1; + u_int16_t center_freq2; + u_int8_t capture_mode; /* ack_capture_mode */ + u_int8_t capture_type; /* cfr_capture_type */ + u_int8_t sts_count; + u_int8_t num_rx_chain; + u_int64_t timestamp; + u_int32_t length; + u_int8_t is_mu_ppdu; + u_int8_t num_mu_users; + union { + u_int8_t su_peer_addr[QDF_MAC_ADDR_SIZE]; + u_int8_t mu_peer_addr[MAX_CFR_MU_USERS][QDF_MAC_ADDR_SIZE]; + } peer_addr; + u_int32_t chain_rssi[HOST_MAX_CHAINS]; + u_int16_t chain_phase[HOST_MAX_CHAINS]; + u_int32_t rtt_cfo_measurement; + u_int8_t agc_gain[HOST_MAX_CHAINS]; + u_int32_t rx_start_ts; +} __attribute__ ((__packed__)); + #endif struct csi_cfr_header { @@ -203,13 +255,17 @@ struct csi_cfr_header { u_int8_t cfr_data_version; u_int8_t chip_type; u_int8_t pltform_type; - u_int32_t Reserved; + u_int32_t cfr_metadata_len; union { struct cfr_metadata_version_1 meta_v1; struct cfr_metadata_version_2 meta_v2; #ifdef WLAN_ENH_CFR_ENABLE struct cfr_metadata_version_3 meta_v3; +#endif + struct cfr_metadata_version_4 meta_v4; +#ifdef WLAN_ENH_CFR_ENABLE + struct cfr_metadata_version_5 meta_v5; #endif } u; } __attribute__ ((__packed__)); From 0555407656fd6442b25561e764c1035a2122dafa Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Tue, 22 Dec 2020 18:59:35 +0530 Subject: [PATCH 13/30] qcacmn: Update the cfr_metadata_len of cfr header Update the cfr_metadata_len of cfr header Change-Id: I85f0d4c1637b93608cebb77d6e8ea41b3d1cb713 --- umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c index 33ea0ed87edb..86b30f2d6786 100644 --- a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c +++ b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-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 @@ -424,7 +424,7 @@ void ucfg_cfr_capture_data(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id, hdr->cfr_data_version = CFR_DATA_VERSION_1; hdr->chip_type = CFR_CAPTURE_RADIO_ADRASTEA; hdr->pltform_type = CFR_PLATFORM_TYPE_ARM; - hdr->Reserved = 0; + hdr->cfr_metadata_len = sizeof(struct cfr_metadata_version_1); vaddr = pcfr->cfr_mem_chunk.vaddr; rindex = (u32 *)vaddr; From 668ec8ba0f421aeaf7c92695a5265c9bf051e357 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Tue, 6 Apr 2021 12:33:29 +0530 Subject: [PATCH 14/30] qcacmn: Update cfr metadata len calculation logic Separate the common fields of csi_cfr_header and update the logic of calculating the cfr_metadata_len. Move cmn header update code to single place. CRs-Fixed: 2916901 Change-Id: I97d99df45f667f4ed3b80264b12d3d09a3bcae95 --- target_if/cfr/inc/target_if_cfr.h | 11 +++ target_if/cfr/src/target_if_cfr.c | 41 +++++++++++ target_if/cfr/src/target_if_cfr_enh.c | 73 ++++---------------- umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h | 8 ++- umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c | 12 ++-- 5 files changed, 78 insertions(+), 67 deletions(-) diff --git a/target_if/cfr/inc/target_if_cfr.h b/target_if/cfr/inc/target_if_cfr.h index 608de0c7b847..1053571185e5 100644 --- a/target_if/cfr/inc/target_if_cfr.h +++ b/target_if/cfr/inc/target_if_cfr.h @@ -172,6 +172,17 @@ void target_if_cfr_info_send(struct wlan_objmgr_pdev *pdev, void *head, size_t hlen, void *data, size_t dlen, void *tail, size_t tlen); +/** + * target_if_cfr_fill_header() - Function to fill cfr header cmn section + * @hdr: pointer to the csi_cfr_header + * @is_wifi_2_0: flag to indicate legacy and non legacy radio + * @target_type: target type of the radio + * @is_rcc: flag to denote fill header request from periodic cfr/rcc + */ +void target_if_cfr_fill_header(struct csi_cfr_header *hdr, + bool is_wifi_2_0, + uint32_t target_type, + bool is_rcc); #ifdef WIFI_TARGET_TYPE_2_0 /** * cfr_wifi2_0_init_pdev() - Function to init legacy pdev diff --git a/target_if/cfr/src/target_if_cfr.c b/target_if/cfr/src/target_if_cfr.c index 4423a8937487..f5dc19a7eabc 100644 --- a/target_if/cfr/src/target_if_cfr.c +++ b/target_if/cfr/src/target_if_cfr.c @@ -201,6 +201,47 @@ int target_if_cfr_get_target_type(struct wlan_objmgr_psoc *psoc) return target_type; } +void target_if_cfr_fill_header(struct csi_cfr_header *hdr, + bool is_wifi_2_0, + uint32_t target_type, + bool is_rcc) +{ + hdr->cmn.start_magic_num = 0xDEADBEAF; + hdr->cmn.vendorid = 0x8cfdf0; + hdr->cmn.pltform_type = CFR_PLATFORM_TYPE_ARM; + hdr->cmn.cfr_metadata_len = CFR_META_DATA_LEN; + hdr->cmn.cfr_data_version = CFR_DATA_VERSION_1; + + if (is_wifi_2_0) { + hdr->cmn.cfr_metadata_version = CFR_META_VERSION_1; + if (target_type == TARGET_TYPE_IPQ4019) + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_DAKOTA; + else if (target_type == TARGET_TYPE_QCA9888) + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_BESRA; + else if (target_type == TARGET_TYPE_QCA9984) + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_CASCADE; + else + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_NONE; + } else if (target_type == TARGET_TYPE_QCA8074V2) { + hdr->cmn.cfr_metadata_version = CFR_META_VERSION_4; + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_HKV2; + } else { + if ((target_type == TARGET_TYPE_QCN9000) || + (target_type == TARGET_TYPE_QCA6018) || + ((target_type == TARGET_TYPE_QCA5018) && (!is_rcc))) + hdr->cmn.cfr_metadata_version = CFR_META_VERSION_5; + else + hdr->cmn.cfr_metadata_version = CFR_META_VERSION_3; + + if (target_type == TARGET_TYPE_QCN9000) + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_PINE; + else if (target_type == TARGET_TYPE_QCA5018) + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_MAPLE; + else + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_CYP; + } +} + #ifdef CFR_USE_FIXED_FOLDER static QDF_STATUS target_if_cfr_init_target(struct wlan_objmgr_psoc *psoc, struct wlan_objmgr_pdev *pdev, diff --git a/target_if/cfr/src/target_if_cfr_enh.c b/target_if/cfr/src/target_if_cfr_enh.c index 7a52b19437e3..4e4b8a848de5 100644 --- a/target_if/cfr/src/target_if_cfr_enh.c +++ b/target_if/cfr/src/target_if_cfr_enh.c @@ -364,13 +364,13 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) "is_mu_ppdu = %d\n" "num_users = %d\n", cookie, - header->start_magic_num, - header->vendorid, - header->cfr_metadata_version, - header->cfr_data_version, - header->cfr_metadata_len, - header->chip_type, - header->pltform_type, + header->cmn.start_magic_num, + header->cmn.vendorid, + header->cmn.cfr_metadata_version, + header->cmn.cfr_data_version, + header->cmn.cfr_metadata_len, + header->cmn.chip_type, + header->cmn.pltform_type, meta->status, meta->capture_bw, meta->channel_bw, @@ -410,7 +410,7 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) meta->chain_phase[chain_id]); } - if (header->cfr_metadata_version == CFR_META_VERSION_5) { + if (header->cmn.cfr_metadata_version == CFR_META_VERSION_5) { cfr_debug("rtt_cfo_measurement = %d\n", meta->rtt_cfo_measurement); cfr_debug("rx_start_ts = %u\n", meta->rx_start_ts); @@ -823,18 +823,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) header = &lut->header; meta = &header->u.meta_v5; - header->start_magic_num = 0xDEADBEAF; - header->vendorid = 0x8cfdf0; - if (target_type == TARGET_TYPE_QCN9000 || - target_type == TARGET_TYPE_QCA6018) - header->cfr_metadata_version = CFR_META_VERSION_5; - else - header->cfr_metadata_version = CFR_META_VERSION_3; - - header->cfr_data_version = CFR_DATA_VERSION_1; - header->chip_type = pcfr->chip_type; - header->pltform_type = CFR_PLATFORM_TYPE_ARM; - header->cfr_metadata_len = sizeof(struct cfr_metadata_version_5); + target_if_cfr_fill_header(header, false, target_type, true); meta->status = 1; meta->phy_mode = ch_phymode; @@ -1036,7 +1025,7 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev, sizeof(struct whal_cfir_dma_hdr)); header = &lut->header; - header->chip_type = pcfr->chip_type; + header->cmn.chip_type = pcfr->chip_type; meta = &header->u.meta_v5; meta->channel_bw = dma_hdr.upload_pkt_bw; meta->num_rx_chain = NUM_CHAINS_FW_TO_HOST(dma_hdr.num_chains); @@ -1197,25 +1186,7 @@ static void enh_prepare_cfr_header_txstatus(wmi_cfr_peer_tx_event_param struct csi_cfr_header *header, uint32_t target_type) { - header->start_magic_num = 0xDEADBEAF; - header->vendorid = 0x8cfdf0; - header->cfr_data_version = CFR_DATA_VERSION_1; - if (target_type == TARGET_TYPE_QCN9000 || - target_type == TARGET_TYPE_QCA6018 || - target_type == TARGET_TYPE_QCA5018) - header->cfr_metadata_version = CFR_META_VERSION_5; - else - header->cfr_metadata_version = CFR_META_VERSION_3; - - if (target_type == TARGET_TYPE_QCN9000) - header->chip_type = CFR_CAPTURE_RADIO_PINE; - else if (target_type == TARGET_TYPE_QCA5018) - header->chip_type = CFR_CAPTURE_RADIO_MAPLE; - else - header->chip_type = CFR_CAPTURE_RADIO_CYP; - - header->pltform_type = CFR_PLATFORM_TYPE_ARM; - header->cfr_metadata_len = sizeof(struct cfr_metadata_version_5); + target_if_cfr_fill_header(header, false, target_type, false); header->u.meta_v5.status = 0; /* failure */ header->u.meta_v5.length = 0; header->u.meta_v5.rtt_cfo_measurement = tx_evt_param->cfo_measurement; @@ -1246,7 +1217,7 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen) struct pdev_cfr *pcfr; struct look_up_table *lut = NULL; struct csi_cfr_header *header = NULL; - struct csi_cfr_header header_error = {0}; + struct csi_cfr_header header_error = {{0} }; wmi_cfr_peer_tx_event_param tx_evt_param = {0}; qdf_dma_addr_t buf_addr = 0, buf_addr_temp = 0; int status; @@ -1402,25 +1373,7 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen) lut->txrx_tstamp = qdf_ktime_to_ms(qdf_ktime_get()); header = &lut->header; - header->start_magic_num = 0xDEADBEAF; - header->vendorid = 0x8cfdf0; - header->cfr_data_version = CFR_DATA_VERSION_1; - header->cfr_metadata_len = sizeof(struct cfr_metadata_version_5); - if (target_type == TARGET_TYPE_QCN9000 || - target_type == TARGET_TYPE_QCA6018 || - target_type == TARGET_TYPE_QCA5018) - header->cfr_metadata_version = CFR_META_VERSION_5; - else - header->cfr_metadata_version = CFR_META_VERSION_3; - - if (target_type == TARGET_TYPE_QCN9000) - header->chip_type = CFR_CAPTURE_RADIO_PINE; - else if (target_type == TARGET_TYPE_QCA5018) - header->chip_type = CFR_CAPTURE_RADIO_MAPLE; - else - header->chip_type = CFR_CAPTURE_RADIO_CYP; - - header->pltform_type = CFR_PLATFORM_TYPE_ARM; + target_if_cfr_fill_header(header, false, target_type, false); header->u.meta_v5.status = (tx_evt_param.status & PEER_CFR_CAPTURE_EVT_STATUS_MASK) ? 1 : 0; diff --git a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h index 1d7d6ac62812..5c3aa0f7dce0 100644 --- a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h +++ b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h @@ -248,7 +248,10 @@ struct cfr_metadata_version_5 { #endif -struct csi_cfr_header { +#define CFR_META_DATA_LEN \ + (sizeof(struct csi_cfr_header) - sizeof(struct cfr_header_cmn)) + +struct cfr_header_cmn { u_int32_t start_magic_num; u_int32_t vendorid; u_int8_t cfr_metadata_version; @@ -256,7 +259,10 @@ struct csi_cfr_header { u_int8_t chip_type; u_int8_t pltform_type; u_int32_t cfr_metadata_len; +} __attribute__ ((__packed__)); +struct csi_cfr_header { + struct cfr_header_cmn cmn; union { struct cfr_metadata_version_1 meta_v1; struct cfr_metadata_version_2 meta_v2; diff --git a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c index 86b30f2d6786..3c42d11ab901 100644 --- a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c +++ b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c @@ -419,12 +419,12 @@ void ucfg_cfr_capture_data(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id, goto exit; } - hdr->vendorid = CFR_VENDOR_ID; - hdr->cfr_metadata_version = CFR_META_VERSION_1; - hdr->cfr_data_version = CFR_DATA_VERSION_1; - hdr->chip_type = CFR_CAPTURE_RADIO_ADRASTEA; - hdr->pltform_type = CFR_PLATFORM_TYPE_ARM; - hdr->cfr_metadata_len = sizeof(struct cfr_metadata_version_1); + hdr->cmn.vendorid = CFR_VENDOR_ID; + hdr->cmn.cfr_metadata_version = CFR_META_VERSION_1; + hdr->cmn.cfr_data_version = CFR_DATA_VERSION_1; + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_ADRASTEA; + hdr->cmn.pltform_type = CFR_PLATFORM_TYPE_ARM; + hdr->cmn.cfr_metadata_len = CFR_META_DATA_LEN; vaddr = pcfr->cfr_mem_chunk.vaddr; rindex = (u32 *)vaddr; From 5a4758e1fe905b6f3d5605d1002903017f7ccd17 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Mon, 12 Oct 2020 13:48:53 +0530 Subject: [PATCH 15/30] qcacmn: Populate additional cfr parameters to cfr info Populate agc gain info, CFO and rx_start_ts to cfr info Change-Id: I5f841b25ee55a9ca890012ebddfaa8c57f606add --- dp/inc/cdp_txrx_stats_struct.h | 8 +++++++- dp/wifi3.0/dp_rx_mon_status.c | 14 +++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index de4ed05f0882..3ab238c5b5d6 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -475,6 +475,12 @@ struct cdp_rx_ppdu_cfr_info { uint8_t chan_capture_status; uint8_t rtt_che_buffer_pointer_high8; uint32_t rtt_che_buffer_pointer_low32; + int16_t rtt_cfo_measurement; + uint32_t agc_gain_info0; + uint32_t agc_gain_info1; + uint32_t agc_gain_info2; + uint32_t agc_gain_info3; + uint32_t rx_start_ts; }; #endif /* diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 53cf6b3671d7..cd0560f894a4 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.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 @@ -1247,6 +1247,18 @@ dp_rx_mon_populate_cfr_info(struct dp_pdev *pdev, = ppdu_info->cfr_info.rtt_che_buffer_pointer_high8; cfr_info->rtt_che_buffer_pointer_low32 = ppdu_info->cfr_info.rtt_che_buffer_pointer_low32; + cfr_info->rtt_cfo_measurement + = (int16_t)ppdu_info->cfr_info.rtt_cfo_measurement; + cfr_info->agc_gain_info0 + = ppdu_info->cfr_info.agc_gain_info0; + cfr_info->agc_gain_info1 + = ppdu_info->cfr_info.agc_gain_info1; + cfr_info->agc_gain_info2 + = ppdu_info->cfr_info.agc_gain_info2; + cfr_info->agc_gain_info3 + = ppdu_info->cfr_info.agc_gain_info3; + cfr_info->rx_start_ts + = ppdu_info->cfr_info.rx_start_ts; } /** From 924857a53a13ddeaf460b72ad21f0bf44cbcb526 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Mon, 12 Oct 2020 13:45:55 +0530 Subject: [PATCH 16/30] qcacmn: Populate additional params to CFR info HAL changes to populate agc gain info, CFO and rx_start_ts parameters to CFR info Change-Id: I71ae6bf94095e82053d59114a6ae4bdb6b4586d2 --- hal/wifi3.0/hal_api_mon.h | 8 ++++++- hal/wifi3.0/qca8074v2/hal_8074v2_rx.h | 32 ++++++++++++++++++++++++++- hal/wifi3.0/qcn9000/hal_9000.c | 32 ++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index 3ed0268816fc..105c73e5f9fb 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.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 @@ -601,6 +601,12 @@ struct hal_rx_ppdu_cfr_info { uint8_t rtt_che_buffer_pointer_high8; uint32_t rtt_che_buffer_pointer_low32; struct hal_rx_ppdu_cfr_user_info cfr_user_info[HAL_MAX_UL_MU_USERS]; + int16_t rtt_cfo_measurement; + uint32_t agc_gain_info0; + uint32_t agc_gain_info1; + uint32_t agc_gain_info2; + uint32_t agc_gain_info3; + uint32_t rx_start_ts; }; #else struct hal_rx_ppdu_cfr_info {}; diff --git a/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h b/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h index 8ceae3823277..23a879977740 100644 --- a/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h +++ b/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -545,6 +545,36 @@ void hal_rx_get_rtt_info_8074v2(void *rx_tlv, HAL_RX_GET(rx_tlv, PHYRX_PKT_END_13_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, RESERVED_8); + + ppdu_info->cfr_info.rx_start_ts = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_9_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RX_START_TS); + + ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t) + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_13_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_CFO_MEASUREMENT); + + ppdu_info->cfr_info.agc_gain_info0 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_1_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_1_LOWER_32); + + ppdu_info->cfr_info.agc_gain_info1 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_2_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_1_UPPER_32); + + ppdu_info->cfr_info.agc_gain_info2 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_3_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_2_LOWER_32); + + ppdu_info->cfr_info.agc_gain_info3 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_4_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_2_UPPER_32); } #endif diff --git a/hal/wifi3.0/qcn9000/hal_9000.c b/hal/wifi3.0/qcn9000/hal_9000.c index f276e63a426a..c33b3a6d2919 100644 --- a/hal/wifi3.0/qcn9000/hal_9000.c +++ b/hal/wifi3.0/qcn9000/hal_9000.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -337,6 +337,36 @@ void hal_rx_get_rtt_info_9000(void *rx_tlv, void *ppdu_info_hdl) ppdu_info->cfr_info.chan_capture_status = GET_RX_LOCATION_INFO_CHAN_CAPTURE_STATUS(rx_tlv); + + ppdu_info->cfr_info.rx_start_ts = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_9_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RX_START_TS); + + ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t) + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_13_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_CFO_MEASUREMENT); + + ppdu_info->cfr_info.agc_gain_info0 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_1_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_1_LOWER_32); + + ppdu_info->cfr_info.agc_gain_info1 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_2_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_1_UPPER_32); + + ppdu_info->cfr_info.agc_gain_info2 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_3_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_2_LOWER_32); + + ppdu_info->cfr_info.agc_gain_info3 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_4_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_2_UPPER_32); } #endif /** From 79cfea059aabd2f171b9cf1a70b9a67e39b31cbd Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Tue, 22 Dec 2020 17:26:10 +0530 Subject: [PATCH 17/30] qcacmn: Populate additional parameters from CFR capture event Add CFO, agc_gain and rx start timestamp related parameters to wmi_cfr_peer_tx_event_param and populate the same with data from FW peer tx event. Change-Id: I462fa56a854b18d1f9b46d1e14eea85da0d45f23 --- wmi/inc/wmi_unified_param.h | 4 ++++ wmi/src/wmi_unified_cfr_tlv.c | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 03a5b24689bd..41b324bb66ac 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -8123,6 +8123,10 @@ typedef struct { uint32_t counter; uint32_t chain_rssi[WMI_HOST_MAX_CHAINS]; uint16_t chain_phase[WMI_HOST_MAX_CHAINS]; + int32_t cfo_measurement; + uint8_t agc_gain[WMI_HOST_MAX_CHAINS]; + uint32_t rx_start_ts; + uint32_t rx_ts_reset; } wmi_cfr_peer_tx_event_param; /** diff --git a/wmi/src/wmi_unified_cfr_tlv.c b/wmi/src/wmi_unified_cfr_tlv.c index be782021f3ae..e2c6ce04198a 100644 --- a/wmi/src/wmi_unified_cfr_tlv.c +++ b/wmi/src/wmi_unified_cfr_tlv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2019-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 above @@ -62,6 +62,14 @@ extract_cfr_peer_tx_event_param_tlv(wmi_unified_t wmi_handle, void *evt_buf, peer_tx_event->counter = peer_tx_event_ev->counter; qdf_mem_copy(peer_tx_event->chain_rssi, peer_tx_event_ev->chain_rssi, sizeof(peer_tx_event->chain_rssi)); + if (peer_tx_event_ev->cfo_measurement_valid) + peer_tx_event->cfo_measurement = + peer_tx_event_ev->cfo_measurement; + else + peer_tx_event->cfo_measurement = 0; + + peer_tx_event->rx_start_ts = peer_tx_event_ev->rx_start_ts; + peer_tx_event->rx_ts_reset = peer_tx_event_ev->rx_ts_reset; chain_phase_ev = param_buf->phase_param; if (chain_phase_ev) { @@ -74,6 +82,8 @@ extract_cfr_peer_tx_event_param_tlv(wmi_unified_t wmi_handle, void *evt_buf, */ peer_tx_event->chain_phase[idx] = (0xffff & chain_phase_ev->chain_phase[idx]); + peer_tx_event->agc_gain[idx] = + WMI_UNIFIED_AGC_GAIN_GET(chain_phase_ev, idx); } } From 65714f33fd8e6c1b3e05fb24971c120321c4f0b6 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Thu, 10 Jun 2021 19:52:39 +0530 Subject: [PATCH 18/30] qcacmn: Cleanup CFR meta version structures Cleanup CFR metadata version structures to avoid redundant & unused definitions CRs-Fixed: 2966842 Change-Id: I81a4f780ffc70be266fbcaa43ff739c544a49c02 --- umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h | 63 +++----------------- umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c | 2 +- 2 files changed, 10 insertions(+), 55 deletions(-) diff --git a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h index 5c3aa0f7dce0..52b8ce86ecc7 100644 --- a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h +++ b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h @@ -134,7 +134,8 @@ enum cfr_capture_type { CFR_TYPE_METHOD_MAX, }; -struct cfr_metadata_version_1 { +/* ensure to add new members at the end of the structure only */ +struct leg_cfr_metadata { u_int8_t peer_addr[QDF_MAC_ADDR_SIZE]; u_int8_t status; u_int8_t capture_bw; @@ -153,26 +154,8 @@ struct cfr_metadata_version_1 { #define HOST_MAX_CHAINS 8 -struct cfr_metadata_version_2 { - u_int8_t peer_addr[QDF_MAC_ADDR_SIZE]; - u_int8_t status; - u_int8_t capture_bw; - u_int8_t channel_bw; - u_int8_t phy_mode; - u_int16_t prim20_chan; - u_int16_t center_freq1; - u_int16_t center_freq2; - u_int8_t capture_mode; - u_int8_t capture_type; - u_int8_t sts_count; - u_int8_t num_rx_chain; - u_int32_t timestamp; - u_int32_t length; - u_int32_t chain_rssi[HOST_MAX_CHAINS]; - u_int16_t chain_phase[HOST_MAX_CHAINS]; -} __attribute__ ((__packed__)); - -struct cfr_metadata_version_4 { +/* ensure to add new members at the end of the structure only */ +struct dbr_cfr_metadata { u_int8_t peer_addr[QDF_MAC_ADDR_SIZE]; u_int8_t status; u_int8_t capture_bw; @@ -195,31 +178,8 @@ struct cfr_metadata_version_4 { } __attribute__ ((__packed__)); #ifdef WLAN_ENH_CFR_ENABLE -struct cfr_metadata_version_3 { - u_int8_t status; - u_int8_t capture_bw; - u_int8_t channel_bw; - u_int8_t phy_mode; - u_int16_t prim20_chan; - u_int16_t center_freq1; - u_int16_t center_freq2; - u_int8_t capture_mode; /* ack_capture_mode */ - u_int8_t capture_type; /* cfr_capture_type */ - u_int8_t sts_count; - u_int8_t num_rx_chain; - u_int64_t timestamp; - u_int32_t length; - u_int8_t is_mu_ppdu; - u_int8_t num_mu_users; - union { - u_int8_t su_peer_addr[QDF_MAC_ADDR_SIZE]; - u_int8_t mu_peer_addr[MAX_CFR_MU_USERS][QDF_MAC_ADDR_SIZE]; - } peer_addr; - u_int32_t chain_rssi[HOST_MAX_CHAINS]; - u_int16_t chain_phase[HOST_MAX_CHAINS]; -} __attribute__ ((__packed__)); - -struct cfr_metadata_version_5 { +/* ensure to add new members at the end of the structure only */ +struct enh_cfr_metadata { u_int8_t status; u_int8_t capture_bw; u_int8_t channel_bw; @@ -245,7 +205,6 @@ struct cfr_metadata_version_5 { u_int8_t agc_gain[HOST_MAX_CHAINS]; u_int32_t rx_start_ts; } __attribute__ ((__packed__)); - #endif #define CFR_META_DATA_LEN \ @@ -264,14 +223,10 @@ struct cfr_header_cmn { struct csi_cfr_header { struct cfr_header_cmn cmn; union { - struct cfr_metadata_version_1 meta_v1; - struct cfr_metadata_version_2 meta_v2; + struct leg_cfr_metadata meta_leg; + struct dbr_cfr_metadata meta_dbr; #ifdef WLAN_ENH_CFR_ENABLE - struct cfr_metadata_version_3 meta_v3; -#endif - struct cfr_metadata_version_4 meta_v4; -#ifdef WLAN_ENH_CFR_ENABLE - struct cfr_metadata_version_5 meta_v5; + struct enh_cfr_metadata meta_enh; #endif } u; } __attribute__ ((__packed__)); diff --git a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c index 3c42d11ab901..c6b79cc56627 100644 --- a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c +++ b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c @@ -435,7 +435,7 @@ void ucfg_cfr_capture_data(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id, * find data pointer from mem index and start address of memory. */ payload = vaddr + mem_index; - payload_len = hdr->u.meta_v1.length; + payload_len = hdr->u.meta_leg.length; /* Write data into streamfs */ tgt_cfr_info_send(pdev, hdr, sizeof(struct csi_cfr_header), From aee8b781d8d8e167a86802e6a4900736ad0c89ba Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Sat, 5 Jun 2021 14:23:09 +0530 Subject: [PATCH 19/30] qcacmn: Cleanup CFR meta version structures Cleanup CFR metadata version structures to avoid redundant & unused definitions Change-Id: Ia8b8234a38455f8c976600ef40c0a56c7bf66a53 --- target_if/cfr/src/target_if_cfr_enh.c | 58 +++++++++++++-------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/target_if/cfr/src/target_if_cfr_enh.c b/target_if/cfr/src/target_if_cfr_enh.c index 4e4b8a848de5..ec8d6c96d7e6 100644 --- a/target_if/cfr/src/target_if_cfr_enh.c +++ b/target_if/cfr/src/target_if_cfr_enh.c @@ -337,7 +337,7 @@ static void dump_mu_rx_info(void *mu_rx_user_info, static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) { uint8_t user_id, chain_id; - struct cfr_metadata_version_5 *meta = &header->u.meta_v5; + struct enh_cfr_metadata *meta = &header->u.meta_enh; uint8_t *usermac = NULL; cfr_debug("<%u>\n" @@ -718,7 +718,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) int i, status = 0; QDF_STATUS retval = 0; struct wlan_lmac_if_cfr_rx_ops *cfr_rx_ops = NULL; - struct cfr_metadata_version_5 *meta = NULL; + struct enh_cfr_metadata *meta = NULL; uint8_t srng_id = 0; struct wlan_lmac_if_rx_ops *rx_ops; uint32_t target_type; @@ -821,7 +821,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) lut->tx_address2 = cfr_info->rtt_che_buffer_pointer_high8; lut->txrx_tstamp = qdf_ktime_to_ms(qdf_ktime_get()); header = &lut->header; - meta = &header->u.meta_v5; + meta = &header->u.meta_enh; target_if_cfr_fill_header(header, false, target_type, true); @@ -945,7 +945,7 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev, uint8_t capture_type = CFR_TYPE_METHOD_AUTO; uint8_t *peer_macaddr = NULL; struct wlan_lmac_if_cfr_rx_ops *cfr_rx_ops = NULL; - struct cfr_metadata_version_5 *meta = NULL; + struct enh_cfr_metadata *meta = NULL; struct wlan_lmac_if_rx_ops *rx_ops; if ((!pdev) || (!payload)) { @@ -1026,7 +1026,7 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev, header = &lut->header; header->cmn.chip_type = pcfr->chip_type; - meta = &header->u.meta_v5; + meta = &header->u.meta_enh; meta->channel_bw = dma_hdr.upload_pkt_bw; meta->num_rx_chain = NUM_CHAINS_FW_TO_HOST(dma_hdr.num_chains); meta->length = length; @@ -1187,12 +1187,12 @@ static void enh_prepare_cfr_header_txstatus(wmi_cfr_peer_tx_event_param uint32_t target_type) { target_if_cfr_fill_header(header, false, target_type, false); - header->u.meta_v5.status = 0; /* failure */ - header->u.meta_v5.length = 0; - header->u.meta_v5.rtt_cfo_measurement = tx_evt_param->cfo_measurement; - header->u.meta_v5.rx_start_ts = tx_evt_param->rx_start_ts; + header->u.meta_enh.status = 0; /* failure */ + header->u.meta_enh.length = 0; + header->u.meta_enh.rtt_cfo_measurement = tx_evt_param->cfo_measurement; + header->u.meta_enh.rx_start_ts = tx_evt_param->rx_start_ts; - qdf_mem_copy(&header->u.meta_v5.peer_addr.su_peer_addr[0], + qdf_mem_copy(&header->u.meta_enh.peer_addr.su_peer_addr[0], &tx_evt_param->peer_mac_addr.bytes[0], QDF_MAC_ADDR_SIZE); } @@ -1374,41 +1374,41 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen) header = &lut->header; target_if_cfr_fill_header(header, false, target_type, false); - header->u.meta_v5.status = (tx_evt_param.status & - PEER_CFR_CAPTURE_EVT_STATUS_MASK) ? - 1 : 0; - header->u.meta_v5.capture_bw = tx_evt_param.bandwidth; + header->u.meta_enh.status = (tx_evt_param.status & + PEER_CFR_CAPTURE_EVT_STATUS_MASK) ? + 1 : 0; + header->u.meta_enh.capture_bw = tx_evt_param.bandwidth; bss_chan = wlan_vdev_mlme_get_bss_chan(vdev); - header->u.meta_v5.phy_mode = bss_chan->ch_phymode; + header->u.meta_enh.phy_mode = bss_chan->ch_phymode; - header->u.meta_v5.prim20_chan = tx_evt_param.primary_20mhz_chan; - header->u.meta_v5.center_freq1 = tx_evt_param.band_center_freq1; - header->u.meta_v5.center_freq2 = tx_evt_param.band_center_freq2; + header->u.meta_enh.prim20_chan = tx_evt_param.primary_20mhz_chan; + header->u.meta_enh.center_freq1 = tx_evt_param.band_center_freq1; + header->u.meta_enh.center_freq2 = tx_evt_param.band_center_freq2; /* Currently CFR data is captured on ACK of a Qos NULL frame. * For 20 MHz, ACK is Legacy and for 40/80/160, ACK is DUP Legacy. */ - header->u.meta_v5.capture_mode = tx_evt_param.bandwidth ? + header->u.meta_enh.capture_mode = tx_evt_param.bandwidth ? CFR_DUP_LEGACY_ACK : CFR_LEGACY_ACK; - header->u.meta_v5.capture_type = tx_evt_param.capture_method; - header->u.meta_v5.num_rx_chain = wlan_vdev_mlme_get_rxchainmask(vdev); - header->u.meta_v5.sts_count = tx_evt_param.spatial_streams; - header->u.meta_v5.timestamp = tx_evt_param.timestamp_us; + header->u.meta_enh.capture_type = tx_evt_param.capture_method; + header->u.meta_enh.num_rx_chain = wlan_vdev_mlme_get_rxchainmask(vdev); + header->u.meta_enh.sts_count = tx_evt_param.spatial_streams; + header->u.meta_enh.timestamp = tx_evt_param.timestamp_us; - qdf_mem_copy(&header->u.meta_v5.peer_addr.su_peer_addr[0], + qdf_mem_copy(&header->u.meta_enh.peer_addr.su_peer_addr[0], &tx_evt_param.peer_mac_addr.bytes[0], QDF_MAC_ADDR_SIZE); - qdf_mem_copy(&header->u.meta_v5.chain_rssi[0], + qdf_mem_copy(&header->u.meta_enh.chain_rssi[0], &tx_evt_param.chain_rssi[0], HOST_MAX_CHAINS * sizeof(tx_evt_param.chain_rssi[0])); - qdf_mem_copy(&header->u.meta_v5.chain_phase[0], + qdf_mem_copy(&header->u.meta_enh.chain_phase[0], &tx_evt_param.chain_phase[0], HOST_MAX_CHAINS * sizeof(tx_evt_param.chain_phase[0])); - qdf_mem_copy(&header->u.meta_v5.agc_gain[0], + qdf_mem_copy(&header->u.meta_enh.agc_gain[0], &tx_evt_param.agc_gain[0], HOST_MAX_CHAINS * sizeof(tx_evt_param.agc_gain[0])); - header->u.meta_v5.rtt_cfo_measurement = tx_evt_param.cfo_measurement; - header->u.meta_v5.rx_start_ts = tx_evt_param.rx_start_ts; + header->u.meta_enh.rtt_cfo_measurement = tx_evt_param.cfo_measurement; + header->u.meta_enh.rx_start_ts = tx_evt_param.rx_start_ts; status = correlate_and_relay_enh(pdev, cookie, lut, CORRELATE_TX_EV_MODULE_ID); From 33ff4850153fe7c5e3101ec618d2f493e6752a62 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Sat, 5 Jun 2021 16:55:11 +0530 Subject: [PATCH 20/30] qcacmn: Add mcs, gI & sig info to cfr metadata Add mcs rate, gI type and other SU sig info to cfr metadata. For Tx based capture mcs rate & gI type is applicable MCS For legacy mode 0: 48 Mbps 1: 24 Mbps 2: 12 Mbps 3: 6 Mbps 4: 54 Mbps 5: 36 Mbps 6: 18 Mbps 7: 9 Mbps 8: invalid entry MCS for HT, 0-7: MCS0-MCS7, MCS for VHT, 0-9: MCS0-MCS9, MCS for HE, 0-11 MCS0-MCS11, 12-13: 4096QAM GI: 0: 0.8 us 1: 0.4 us 2: 1.6 us 3: 3.2 us ltf_size: 0: he_ltf_1_x 1: he_ltf_2_x 2: he_ltf_4_x dcm: Indicates if DCM set 0: No DCM 1: DCM sgi: Indicates if short gI used 0: No short gI 1: short gI beamformed: Is packet beamformed 0: non-beamformed 1: beamformed stbc: Indicates if stbc applied 0: No STBC 1: STBC Coding: 0: BCC 1: LDPC Change-Id: If6ab4b4878ab24406aba0e890ec08a2dae2b4634 --- target_if/cfr/src/target_if_cfr.c | 9 +++++---- target_if/cfr/src/target_if_cfr_enh.c | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/target_if/cfr/src/target_if_cfr.c b/target_if/cfr/src/target_if_cfr.c index f5dc19a7eabc..486aa05d78b1 100644 --- a/target_if/cfr/src/target_if_cfr.c +++ b/target_if/cfr/src/target_if_cfr.c @@ -223,12 +223,13 @@ void target_if_cfr_fill_header(struct csi_cfr_header *hdr, else hdr->cmn.chip_type = CFR_CAPTURE_RADIO_NONE; } else if (target_type == TARGET_TYPE_QCA8074V2) { - hdr->cmn.cfr_metadata_version = CFR_META_VERSION_4; + hdr->cmn.cfr_metadata_version = CFR_META_VERSION_6; hdr->cmn.chip_type = CFR_CAPTURE_RADIO_HKV2; } else { - if ((target_type == TARGET_TYPE_QCN9000) || - (target_type == TARGET_TYPE_QCA6018) || - ((target_type == TARGET_TYPE_QCA5018) && (!is_rcc))) + if (target_type == TARGET_TYPE_QCN9000) + hdr->cmn.cfr_metadata_version = CFR_META_VERSION_7; + else if ((target_type == TARGET_TYPE_QCA6018) || + ((target_type == TARGET_TYPE_QCA5018) && (!is_rcc))) hdr->cmn.cfr_metadata_version = CFR_META_VERSION_5; else hdr->cmn.cfr_metadata_version = CFR_META_VERSION_3; diff --git a/target_if/cfr/src/target_if_cfr_enh.c b/target_if/cfr/src/target_if_cfr_enh.c index ec8d6c96d7e6..170bcec6ea3e 100644 --- a/target_if/cfr/src/target_if_cfr_enh.c +++ b/target_if/cfr/src/target_if_cfr_enh.c @@ -410,7 +410,7 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) meta->chain_phase[chain_id]); } - if (header->cmn.cfr_metadata_version == CFR_META_VERSION_5) { + if (header->cmn.cfr_metadata_version >= CFR_META_VERSION_5) { cfr_debug("rtt_cfo_measurement = %d\n", meta->rtt_cfo_measurement); cfr_debug("rx_start_ts = %u\n", meta->rx_start_ts); @@ -420,6 +420,9 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie) chain_id, meta->agc_gain[chain_id]); } + + cfr_debug("mcs_rate = %u\n", meta->mcs_rate); + cfr_debug("gi_type = %u\n", meta->gi_type); } } @@ -848,6 +851,15 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) meta->agc_gain[6] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info3)); meta->agc_gain[7] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info3)); + meta->mcs_rate = cfr_info->mcs_rate; + meta->gi_type = cfr_info->gi_type; + meta->sig_info.ltf_size = cdp_rx_ppdu->u.ltf_size; + meta->sig_info.stbc = cdp_rx_ppdu->u.stbc; + meta->sig_info.sgi = (cdp_rx_ppdu->u.gi == CDP_SGI_0_4_US) ? 1 : 0; + meta->sig_info.dcm = cdp_rx_ppdu->u.dcm; + meta->sig_info.coding = cdp_rx_ppdu->u.ldpc; + meta->sig_info.beamformed = cdp_rx_ppdu->beamformed; + if (meta->num_mu_users > pcfr->max_mu_users) meta->num_mu_users = pcfr->max_mu_users; @@ -1409,6 +1421,8 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen) HOST_MAX_CHAINS * sizeof(tx_evt_param.agc_gain[0])); header->u.meta_enh.rtt_cfo_measurement = tx_evt_param.cfo_measurement; header->u.meta_enh.rx_start_ts = tx_evt_param.rx_start_ts; + header->u.meta_enh.mcs_rate = tx_evt_param.mcs_rate; + header->u.meta_enh.gi_type = tx_evt_param.gi_type; status = correlate_and_relay_enh(pdev, cookie, lut, CORRELATE_TX_EV_MODULE_ID); From beeca2250faa3a00dfaf638d20a65aeddbd1b668 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Thu, 10 Jun 2021 21:44:47 +0530 Subject: [PATCH 21/30] qcacmn: Add mcs, gi and sig info to metadata Add MCS, gI, and other SU sig information to CFR metadata CRs-Fixed: 2966860 Change-Id: I541fe9ba12c8a01ea6817ec1dda0c9a436d2d76a --- umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h | 27 ++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h index 52b8ce86ecc7..a3cf8ba37193 100644 --- a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h +++ b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h @@ -64,11 +64,13 @@ enum cfrmetaversion { CFR_META_VERSION_NONE, - CFR_META_VERSION_1, - CFR_META_VERSION_2, - CFR_META_VERSION_3, - CFR_META_VERSION_4, - CFR_META_VERSION_5, + CFR_META_VERSION_1, /* initial version for leg_cfr_metadata */ + CFR_META_VERSION_2, /* initial version for dbr_cfr_metadata */ + CFR_META_VERSION_3, /* initial version for enh_cfr_metadata */ + CFR_META_VERSION_4, /* agc gain, cfo, rx_start_ts in dbr_cfr_metadata */ + CFR_META_VERSION_5, /* agc gain, cfo, rx_start_ts in enh_cfr_metadata */ + CFR_META_VERSION_6, /* mcs, gi_type in dbr_cfr_metadata */ + CFR_META_VERSION_7, /* mcs, gi_type, sig_info in enh_cfr_metadata */ CFR_META_VERSION_MAX = 0xFF, }; @@ -175,9 +177,21 @@ struct dbr_cfr_metadata { u_int32_t rtt_cfo_measurement; u_int8_t agc_gain[HOST_MAX_CHAINS]; u_int32_t rx_start_ts; + u_int16_t mcs_rate; + u_int16_t gi_type; } __attribute__ ((__packed__)); #ifdef WLAN_ENH_CFR_ENABLE +struct cfr_su_sig_info { + u_int8_t coding; + u_int8_t stbc; + u_int8_t beamformed; + u_int8_t dcm; + u_int8_t ltf_size; + u_int8_t sgi; + u_int16_t reserved; +} __attribute__ ((__packed__)); + /* ensure to add new members at the end of the structure only */ struct enh_cfr_metadata { u_int8_t status; @@ -204,6 +218,9 @@ struct enh_cfr_metadata { u_int32_t rtt_cfo_measurement; u_int8_t agc_gain[HOST_MAX_CHAINS]; u_int32_t rx_start_ts; + u_int16_t mcs_rate; + u_int16_t gi_type; + struct cfr_su_sig_info sig_info; } __attribute__ ((__packed__)); #endif From 55105a2a431cfb2d30e1b54585ca3304d1026365 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Sat, 5 Jun 2021 17:36:33 +0530 Subject: [PATCH 22/30] qcacmn: Extract mcs & gI info from peer tx event Changes to extract mcs rate and gI from cfr peer tx capture event. Change-Id: Ia64807aed4559466dc25f20928ed8c43ae77be62 --- wmi/inc/wmi_unified_param.h | 2 ++ wmi/src/wmi_unified_cfr_tlv.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 41b324bb66ac..4ee01ee2886f 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -8127,6 +8127,8 @@ typedef struct { uint8_t agc_gain[WMI_HOST_MAX_CHAINS]; uint32_t rx_start_ts; uint32_t rx_ts_reset; + uint32_t mcs_rate; + uint32_t gi_type; } wmi_cfr_peer_tx_event_param; /** diff --git a/wmi/src/wmi_unified_cfr_tlv.c b/wmi/src/wmi_unified_cfr_tlv.c index e2c6ce04198a..5c79f4c25c6e 100644 --- a/wmi/src/wmi_unified_cfr_tlv.c +++ b/wmi/src/wmi_unified_cfr_tlv.c @@ -70,6 +70,10 @@ extract_cfr_peer_tx_event_param_tlv(wmi_unified_t wmi_handle, void *evt_buf, peer_tx_event->rx_start_ts = peer_tx_event_ev->rx_start_ts; peer_tx_event->rx_ts_reset = peer_tx_event_ev->rx_ts_reset; + peer_tx_event->mcs_rate = + WMI_CFR_MCS_GET(peer_tx_event_ev->mcs_gi_info); + peer_tx_event->gi_type = + WMI_CFR_GI_TYPE_GET(peer_tx_event_ev->mcs_gi_info); chain_phase_ev = param_buf->phase_param; if (chain_phase_ev) { From 0b75aa69c2b1c6e18d10ba8a15436fa9db94f326 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Thu, 10 Jun 2021 19:00:58 +0530 Subject: [PATCH 23/30] qcacmn: Populate mcs & gI parameters to cfr_info Populate mcs rate & gI type parameters to cfr_info CRs-Fixed: 2966865 Change-Id: Id9cc720a12d2aa3840620bde97fa44ede66d86c6 --- hal/wifi3.0/hal_api_mon.h | 43 ++++++++++++++++++++++++++- hal/wifi3.0/qca8074v2/hal_8074v2_rx.h | 10 +++++++ hal/wifi3.0/qcn9000/hal_9000.c | 10 +++++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index 105c73e5f9fb..79b009e3e16a 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -590,8 +590,47 @@ struct hal_rx_ppdu_cfr_user_info { * d. CAPTURE_NO_BUFFER: next buffer in IPC ring not available * * @cfr_user_info: Peer mac for upto 4 MU users + * + * @rtt_cfo_measurement : raw cfo data extracted from hardware, which is 14 bit + * signed number. The first bit used for sign representation and 13 bits for + * fractional part. + * + * @agc_gain_info0: Chain 0 & chain 1 agc gain information reported by PHY + * + * @agc_gain_info1: Chain 2 & chain 3 agc gain information reported by PHY + * + * @agc_gain_info2: Chain 4 & chain 5 agc gain information reported by PHY + * + * @agc_gain_info3: Chain 6 & chain 7 agc gain information reported by PHY + * + * @rx_start_ts: Rx packet timestamp, the time the first L-STF ADC sample + * arrived at Rx antenna. + * + * @mcs_rate: Indicates the mcs/rate in which packet is received. + * If HT, + * 0-7: MCS0-MCS7 + * If VHT, + * 0-9: MCS0 to MCS9 + * If HE, + * 0-11: MCS0 to MCS11, + * 12-13: 4096QAM, + * 14-15: reserved + * If Legacy, + * 0: 48 Mbps + * 1: 24 Mbps + * 2: 12 Mbps + * 3: 6 Mbps + * 4: 54 Mbps + * 5: 36 Mbps + * 6: 18 Mbps + * 7: 9 Mbps + * + * @gi_type: Indicates the gaurd interval. + * 0: 0.8 us + * 1: 0.4 us + * 2: 1.6 us + * 3: 3.2 us */ - struct hal_rx_ppdu_cfr_info { bool bb_captured_channel; bool bb_captured_timeout; @@ -607,6 +646,8 @@ struct hal_rx_ppdu_cfr_info { uint32_t agc_gain_info2; uint32_t agc_gain_info3; uint32_t rx_start_ts; + uint32_t mcs_rate; + uint32_t gi_type; }; #else struct hal_rx_ppdu_cfr_info {}; diff --git a/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h b/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h index 23a879977740..4c51ef665010 100644 --- a/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h +++ b/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h @@ -575,6 +575,16 @@ void hal_rx_get_rtt_info_8074v2(void *rx_tlv, HAL_RX_GET(rx_tlv, PHYRX_PKT_END_4_RX_PKT_END_DETAILS, PHY_TIMESTAMP_2_UPPER_32); + + ppdu_info->cfr_info.mcs_rate = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_8_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_MCS_RATE); + + ppdu_info->cfr_info.gi_type = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_8_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_GI_TYPE); } #endif diff --git a/hal/wifi3.0/qcn9000/hal_9000.c b/hal/wifi3.0/qcn9000/hal_9000.c index c33b3a6d2919..025aca716c37 100644 --- a/hal/wifi3.0/qcn9000/hal_9000.c +++ b/hal/wifi3.0/qcn9000/hal_9000.c @@ -367,6 +367,16 @@ void hal_rx_get_rtt_info_9000(void *rx_tlv, void *ppdu_info_hdl) HAL_RX_GET(rx_tlv, PHYRX_PKT_END_4_RX_PKT_END_DETAILS, PHY_TIMESTAMP_2_UPPER_32); + + ppdu_info->cfr_info.mcs_rate = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_8_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_MCS_RATE); + + ppdu_info->cfr_info.gi_type = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_8_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_GI_TYPE); } #endif /** From 2c4fa6c9327865f29072ac7a14c6d6640700e8cb Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Thu, 10 Jun 2021 18:37:17 +0530 Subject: [PATCH 24/30] qcacmn: Add sig info parameters to cfr info Add sig info parameters like dcm, stbc, coding etc to cfr_info CRs-Fixed: 2966868 Change-Id: If0c36f58d93c631c75ecfbe47fa1f8cafa84dfaf --- dp/inc/cdp_txrx_stats_struct.h | 42 +++++++++++++++++++++++++++++++++- dp/wifi3.0/dp_rx_mon_status.c | 29 +++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 3ab238c5b5d6..34bd143389c5 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -465,8 +465,46 @@ struct cdp_tidq_stats { * @rtt_che_buffer_pointer_low32 : The low 32 bits of the 40 bits pointer to * external RTT channel information buffer * + * @rtt_cfo_measurement : raw cfo data extracted from hardware, which is 14 bit + * signed number. The first bit used for sign representation and 13 bits for + * fractional part. + * + * @agc_gain_info0: Chain 0 & chain 1 agc gain information reported by PHY + * + * @agc_gain_info1: Chain 2 & chain 3 agc gain information reported by PHY + * + * @agc_gain_info2: Chain 4 & chain 5 agc gain information reported by PHY + * + * @agc_gain_info3: Chain 6 & chain 7 agc gain information reported by PHY + * + * @rx_start_ts: Rx packet timestamp, the time the first L-STF ADC sample + * arrived at Rx antenna. + * + * @mcs_rate: Indicates the mcs/rate in which packet is received. + * If HT, + * 0-7: MCS0-MCS7 + * If VHT, + * 0-9: MCS0 to MCS9 + * If HE, + * 0-11: MCS0 to MCS11, + * 12-13: 4096QAM, + * 14-15: reserved + * If Legacy, + * 0: 48 Mbps + * 1: 24 Mbps + * 2: 12 Mbps + * 3: 6 Mbps + * 4: 54 Mbps + * 5: 36 Mbps + * 6: 18 Mbps + * 7: 9 Mbps + * + * @gi_type: Indicates the gaurd interval. + * 0: 0.8 us + * 1: 0.4 us + * 2: 1.6 us + * 3: 3.2 us */ - struct cdp_rx_ppdu_cfr_info { bool bb_captured_channel; bool bb_captured_timeout; @@ -481,6 +519,8 @@ struct cdp_rx_ppdu_cfr_info { uint32_t agc_gain_info2; uint32_t agc_gain_info3; uint32_t rx_start_ts; + uint32_t mcs_rate; + uint32_t gi_type; }; #endif /* diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index cd0560f894a4..d0e03a61e951 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -489,6 +489,16 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev, cdp_rx_ppdu->lsig_a = ppdu_info->rx_status.rate; cdp_rx_ppdu->u.ltf_size = ppdu_info->rx_status.ltf_size; + if (ppdu_info->rx_status.preamble_type == HAL_RX_PKT_TYPE_11AC) { + cdp_rx_ppdu->u.stbc = ppdu_info->rx_status.is_stbc; + } else if (ppdu_info->rx_status.preamble_type == + HAL_RX_PKT_TYPE_11AX) { + cdp_rx_ppdu->u.stbc = (ppdu_info->rx_status.he_data3 >> + QDF_MON_STATUS_STBC_SHIFT) & 0x1; + cdp_rx_ppdu->u.dcm = (ppdu_info->rx_status.he_data3 >> + QDF_MON_STATUS_DCM_SHIFT) & 0x1; + } + dp_rx_populate_rx_rssi_chain(ppdu_info, cdp_rx_ppdu); dp_rx_populate_su_evm_details(ppdu_info, cdp_rx_ppdu); cdp_rx_ppdu->rx_antenna = ppdu_info->rx_status.rx_antenna; @@ -1197,6 +1207,21 @@ dp_rx_mon_populate_cfr_ppdu_info(struct dp_pdev *pdev, for (chain = 0; chain < MAX_CHAIN; chain++) cdp_rx_ppdu->per_chain_rssi[chain] = ppdu_info->rx_status.rssi[chain]; + + cdp_rx_ppdu->u.ltf_size = ppdu_info->rx_status.ltf_size; + cdp_rx_ppdu->beamformed = ppdu_info->rx_status.beamformed; + cdp_rx_ppdu->u.ldpc = ppdu_info->rx_status.ldpc; + + if (ppdu_info->rx_status.preamble_type == HAL_RX_PKT_TYPE_11AC) { + cdp_rx_ppdu->u.stbc = ppdu_info->rx_status.is_stbc; + } else if (ppdu_info->rx_status.preamble_type == + HAL_RX_PKT_TYPE_11AX) { + cdp_rx_ppdu->u.stbc = (ppdu_info->rx_status.he_data3 >> + QDF_MON_STATUS_STBC_SHIFT) & 0x1; + cdp_rx_ppdu->u.dcm = (ppdu_info->rx_status.he_data3 >> + QDF_MON_STATUS_DCM_SHIFT) & 0x1; + } + dp_rx_mon_handle_cfr_mu_info(pdev, ppdu_info, cdp_rx_ppdu); } @@ -1259,6 +1284,10 @@ dp_rx_mon_populate_cfr_info(struct dp_pdev *pdev, = ppdu_info->cfr_info.agc_gain_info3; cfr_info->rx_start_ts = ppdu_info->cfr_info.rx_start_ts; + cfr_info->mcs_rate + = ppdu_info->cfr_info.mcs_rate; + cfr_info->gi_type + = ppdu_info->cfr_info.gi_type; } /** From 9fbee4330a02c51dafae47cc1fce1b546953c79e Mon Sep 17 00:00:00 2001 From: Wu Gao Date: Sat, 11 Dec 2021 00:29:23 +0800 Subject: [PATCH 25/30] qcacmn: Add chip type QCA6490 & QCA6750 in cfr meta data header There is wrong chip type in cfr meta data header if run CFR/CSI with HSP since doesn't fill it for QCA6490 & QCA6750. Change-Id: I932c065d33c5eaa33f66ec8a92470f5820472d7b CRs-Fixed: 3073865 --- target_if/cfr/src/target_if_cfr.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/target_if/cfr/src/target_if_cfr.c b/target_if/cfr/src/target_if_cfr.c index 486aa05d78b1..f5dc3ab26cf6 100644 --- a/target_if/cfr/src/target_if_cfr.c +++ b/target_if/cfr/src/target_if_cfr.c @@ -238,6 +238,10 @@ void target_if_cfr_fill_header(struct csi_cfr_header *hdr, hdr->cmn.chip_type = CFR_CAPTURE_RADIO_PINE; else if (target_type == TARGET_TYPE_QCA5018) hdr->cmn.chip_type = CFR_CAPTURE_RADIO_MAPLE; + else if (target_type == TARGET_TYPE_QCA6490) + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_HSP; + else if (target_type == TARGET_TYPE_QCA6750) + hdr->cmn.chip_type = CFR_CAPTURE_RADIO_MOSELLE; else hdr->cmn.chip_type = CFR_CAPTURE_RADIO_CYP; } From 9a4fd7c02de8b1e9bf3e56df62489a5b86dd1b28 Mon Sep 17 00:00:00 2001 From: Wu Gao Date: Mon, 15 Nov 2021 22:48:31 +0800 Subject: [PATCH 26/30] qcacmn: Don't write stop string after CFR stopped User space needn't stop string if host indicates data by netlink. Change-Id: I905c2bd53705307cffb3c0911a84edf42908aee1 CRs-Fixed: 3076152 --- umac/cfr/core/src/cfr_common.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/umac/cfr/core/src/cfr_common.c b/umac/cfr/core/src/cfr_common.c index 988ff51415f2..1365dc8a718b 100644 --- a/umac/cfr/core/src/cfr_common.c +++ b/umac/cfr/core/src/cfr_common.c @@ -1,5 +1,6 @@ /* - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -510,13 +511,11 @@ QDF_STATUS cfr_stop_indication(struct wlan_objmgr_vdev *vdev) return QDF_STATUS_E_INVAL; } - if (pa->nl_cb.cfr_nl_cb) { - pa->nl_cb.cfr_nl_cb(pa->nl_cb.vdev_id, pa->nl_cb.pid, - (const void *)CFR_STOP_STR, - sizeof(CFR_STOP_STR)); - + /* Don't write stop sting if there is valid cfr_nl_cb. Since + * userspace needn't stop event string + */ + if (pa->nl_cb.cfr_nl_cb) return QDF_STATUS_SUCCESS; - } status = cfr_streamfs_write(pa, (const void *)CFR_STOP_STR, sizeof(CFR_STOP_STR)); From c4bd71be6cd9a7809f666aad29462d4a320a2650 Mon Sep 17 00:00:00 2001 From: Wu Gao Date: Thu, 2 Dec 2021 18:17:16 +0800 Subject: [PATCH 27/30] qcacmn: Populate additional params to CFR info for QCA6490 HAL changes to populate agc gain, CFO, rx_start_ts, mcs_rate and gi_type to CFR info for QCA6490. Change-Id: I6f6f47c87d40bd661162f764fb3a360230a56457 CRs-Fixed: 3086667 --- hal/wifi3.0/qca6490/hal_6490_rx.h | 40 +++++++++++++++++++++++++++++++ target_if/cfr/src/target_if_cfr.c | 3 ++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/hal/wifi3.0/qca6490/hal_6490_rx.h b/hal/wifi3.0/qca6490/hal_6490_rx.h index 8859e95eb02f..bf935dae38ba 100644 --- a/hal/wifi3.0/qca6490/hal_6490_rx.h +++ b/hal/wifi3.0/qca6490/hal_6490_rx.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -462,6 +463,45 @@ void hal_rx_get_rtt_info_6490(void *rx_tlv, HAL_RX_GET(rx_tlv, PHYRX_PKT_END_13_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, RESERVED_8); + ppdu_info->cfr_info.rx_start_ts = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_9_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RX_START_TS); + + ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t) + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_13_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_CFO_MEASUREMENT); + + ppdu_info->cfr_info.agc_gain_info0 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_1_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_1_LOWER_32); + + ppdu_info->cfr_info.agc_gain_info1 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_2_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_1_UPPER_32); + + ppdu_info->cfr_info.agc_gain_info2 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_3_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_2_LOWER_32); + + ppdu_info->cfr_info.agc_gain_info3 = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_4_RX_PKT_END_DETAILS, + PHY_TIMESTAMP_2_UPPER_32); + + ppdu_info->cfr_info.mcs_rate = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_8_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_MCS_RATE); + + ppdu_info->cfr_info.gi_type = + HAL_RX_GET(rx_tlv, + PHYRX_PKT_END_8_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS, + RTT_GI_TYPE); } #endif #endif diff --git a/target_if/cfr/src/target_if_cfr.c b/target_if/cfr/src/target_if_cfr.c index f5dc3ab26cf6..dce4c5c37a7a 100644 --- a/target_if/cfr/src/target_if_cfr.c +++ b/target_if/cfr/src/target_if_cfr.c @@ -226,7 +226,8 @@ void target_if_cfr_fill_header(struct csi_cfr_header *hdr, hdr->cmn.cfr_metadata_version = CFR_META_VERSION_6; hdr->cmn.chip_type = CFR_CAPTURE_RADIO_HKV2; } else { - if (target_type == TARGET_TYPE_QCN9000) + if (target_type == TARGET_TYPE_QCN9000 || + target_type == TARGET_TYPE_QCA6490) hdr->cmn.cfr_metadata_version = CFR_META_VERSION_7; else if ((target_type == TARGET_TYPE_QCA6018) || ((target_type == TARGET_TYPE_QCA5018) && (!is_rcc))) From 2b97da905095efa3d725082f7fe4925f4ffb7217 Mon Sep 17 00:00:00 2001 From: Shwetha G K Date: Mon, 20 Dec 2021 10:57:08 +0800 Subject: [PATCH 28/30] qcacmn: Fix invalid VAP instance error in RCC case Fix the invalid VAP instance error seen when RCC is enabled and ol_ath_stats (enhanced stats) feature is disabled case. Populate gI as well similar to other rate stats in CFR handler where this information would not be available if ol_ath_stats is disabled. CRs-Fixed: 3056621 Change-Id: Id1af6359408cb977ba0becf298121ee10dd5ef72 --- dp/wifi3.0/dp_rx_mon_status.c | 36 ++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index d0e03a61e951..1d7e1d0fcaad 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -1197,12 +1197,15 @@ dp_rx_mon_populate_cfr_ppdu_info(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, struct cdp_rx_indication_ppdu *cdp_rx_ppdu) { + struct dp_peer *peer; + struct dp_ast_entry *ast_entry; + struct dp_soc *soc = pdev->soc; + uint32_t ast_index; int chain; cdp_rx_ppdu->ppdu_id = ppdu_info->com_info.ppdu_id; cdp_rx_ppdu->timestamp = ppdu_info->rx_status.tsft; cdp_rx_ppdu->u.ppdu_type = ppdu_info->rx_status.reception_type; - cdp_rx_ppdu->num_users = ppdu_info->com_info.num_users; for (chain = 0; chain < MAX_CHAIN; chain++) cdp_rx_ppdu->per_chain_rssi[chain] = @@ -1212,6 +1215,12 @@ dp_rx_mon_populate_cfr_ppdu_info(struct dp_pdev *pdev, cdp_rx_ppdu->beamformed = ppdu_info->rx_status.beamformed; cdp_rx_ppdu->u.ldpc = ppdu_info->rx_status.ldpc; + if ((ppdu_info->rx_status.sgi == VHT_SGI_NYSM) && + (ppdu_info->rx_status.preamble_type == HAL_RX_PKT_TYPE_11AC)) + cdp_rx_ppdu->u.gi = CDP_SGI_0_4_US; + else + cdp_rx_ppdu->u.gi = ppdu_info->rx_status.sgi; + if (ppdu_info->rx_status.preamble_type == HAL_RX_PKT_TYPE_11AC) { cdp_rx_ppdu->u.stbc = ppdu_info->rx_status.is_stbc; } else if (ppdu_info->rx_status.preamble_type == @@ -1223,6 +1232,31 @@ dp_rx_mon_populate_cfr_ppdu_info(struct dp_pdev *pdev, } dp_rx_mon_handle_cfr_mu_info(pdev, ppdu_info, cdp_rx_ppdu); + ast_index = ppdu_info->rx_status.ast_index; + if (ast_index >= wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) { + cdp_rx_ppdu->peer_id = HTT_INVALID_PEER; + cdp_rx_ppdu->num_users = 0; + return; + } + + ast_entry = soc->ast_table[ast_index]; + if (!ast_entry || ast_entry->peer_id == HTT_INVALID_PEER) { + cdp_rx_ppdu->peer_id = HTT_INVALID_PEER; + cdp_rx_ppdu->num_users = 0; + return; + } + + peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id, + DP_MOD_ID_RX_PPDU_STATS); + if (!peer) { + cdp_rx_ppdu->peer_id = HTT_INVALID_PEER; + cdp_rx_ppdu->num_users = 0; + return; + } + + cdp_rx_ppdu->peer_id = peer->peer_id; + cdp_rx_ppdu->vdev_id = peer->vdev->vdev_id; + cdp_rx_ppdu->num_users = ppdu_info->com_info.num_users; } /** From dd25cb7b7505f4d8ee7a8e9df5b1ff9f8b080df7 Mon Sep 17 00:00:00 2001 From: Surya Prakash Sivaraj Date: Tue, 30 Nov 2021 14:58:06 +0530 Subject: [PATCH 29/30] qcacmn: Fix MBSSID parsing for OUIs without subtype Host splits MBSSID into individual scan entries. The IEs added into the new scan entries should neither be in the non-inheritance list nor a duplicate IE. Host checks duplicity of Vendor specific IEs by comparing the OUI, type subtype of the non-tx and tx BSSID IEs. Adaptive 11r VS IEs doesn't have subtype, and host uses IE data as subtype. In this case, even if both the IEs are same, still both are added into the new scan entry. The supplicant uses the capability from the first IE belonging to the tx profile leading to connection failure. In MBSSID parsing logic, add exception for OUI from this specific vendor in the Vendor IE comparison logic. Change-Id: I7bb6cc7ebe34a5f007b9b84c91d6db6c7fcf997b CRs-Fixed: 3084721 --- .../scan/dispatcher/src/wlan_scan_utils_api.c | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/umac/scan/dispatcher/src/wlan_scan_utils_api.c b/umac/scan/dispatcher/src/wlan_scan_utils_api.c index 0e00c2b62f2d..e98e19d05e84 100644 --- a/umac/scan/dispatcher/src/wlan_scan_utils_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_utils_api.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -1944,6 +1945,16 @@ static void util_parse_noninheritance_list(uint8_t *extn_elem, } } +static size_t util_oui_header_len(uint8_t *ie) +{ + /* Cisco Vendor Specific IEs doesn't have subtype in + * their VSIE header, therefore skip subtype + */ + if (ie[0] == 0x00 && ie[1] == 0x40 && ie[2] == 0x96) + return OUI_LEN - 1; + return OUI_LEN; +} + static uint32_t util_gen_new_ie(uint8_t *ie, uint32_t ielen, uint8_t *subelement, size_t subie_len, uint8_t *new_ie) @@ -2033,16 +2044,18 @@ static uint32_t util_gen_new_ie(uint8_t *ie, uint32_t ielen, } else { /* ie in transmitting ie also in subelement, * copy from subelement and flag the ie in subelement - * as copied (by setting eid field to 0xff). For - * vendor ie, compare OUI + type + subType to - * determine if they are the same ie. + * as copied (by setting eid field to 0xff). + * To determine if the vendor ies are same: + * 1. For Cisco OUI, compare only OUI + type + * 2. For other OUI, compare OUI + type + subType */ tmp_rem_len = subie_len - (tmp - sub_copy); if (tmp_old[0] == WLAN_ELEMID_VENDOR && tmp_rem_len >= MIN_VENDOR_TAG_LEN) { if (!qdf_mem_cmp(tmp_old + PAYLOAD_START_POS, tmp + PAYLOAD_START_POS, - OUI_LEN)) { + util_oui_header_len(tmp + + PAYLOAD_START_POS))) { /* same vendor ie, copy from * subelement */ From 7bcd95e94a91bee3fb29de066711839197a0c29e Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Wed, 15 Dec 2021 18:59:51 +0800 Subject: [PATCH 30/30] qcacmn: Add DEBUG_CONN_RSO log history Add new DEBUG_CONN_RSO enum to record RSO state changing. Change-Id: Ie46ab5d4b32d8b5632aa3c3eaed96d00afda22b3 CRs-Fixed: 3097076 --- utils/logging/inc/wlan_roam_debug.h | 3 +++ utils/logging/src/wlan_roam_debug.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/utils/logging/inc/wlan_roam_debug.h b/utils/logging/inc/wlan_roam_debug.h index 136f3c6cb0c8..1848215b79a1 100644 --- a/utils/logging/inc/wlan_roam_debug.h +++ b/utils/logging/inc/wlan_roam_debug.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2013-2019, 2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -64,6 +65,7 @@ typedef enum { * @DEBUG_CONN_DISCONNECT: trace station disconnect * @DEBUG_CONN_DISCONNECT_HANDLER: trace disconnect handler * @DEBUG_CONN_DISCONNECT_IND: trace disconnect indication + * @DEBUG_CONN_RSO: trace RSO state changing */ enum peer_debug_op { DEBUG_PEER_CREATE_SEND = 0, @@ -91,6 +93,7 @@ enum peer_debug_op { DEBUG_CONN_DISCONNECT, DEBUG_CONN_DISCONNECT_HANDLER, DEBUG_CONN_DISCONNECT_IND, + DEBUG_CONN_RSO, }; /** diff --git a/utils/logging/src/wlan_roam_debug.c b/utils/logging/src/wlan_roam_debug.c index 1f0b0c956095..d41fec171834 100644 --- a/utils/logging/src/wlan_roam_debug.c +++ b/utils/logging/src/wlan_roam_debug.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2013-2018, 2020-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 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 @@ -248,6 +249,8 @@ static char *wlan_roam_debug_string(uint32_t op) return "dishdr"; case DEBUG_CONN_DISCONNECT_IND: return "disind"; + case DEBUG_CONN_RSO: + return "rso"; default: return "unknown"; }