qcacld-2.0: Add timestamp and duration for mac counters
A timestamp and measurement duration is added for MAC counters.
User layer APP can detect lantency for last report and its accuracy.
Change-Id: I99aa4f0f2ea92e8a7eb25c79419c480a3f4d7424
CRs-Fixed: 2139854
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index 79de31f..18c0076 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -2543,6 +2543,12 @@
* @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_ANT_NF: per antenna NF value
* @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_RSSI_BEACON: RSSI of beacon
* @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_SNR_BEACON: SNR of beacon
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_REPORT_TIME: u64
+ * Absolute timestamp from 1970/1/1, unit in ms. After receiving the
+ * message, user layer APP could call gettimeofday to get another
+ * timestamp and calculate transfer delay for the message.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MEASUREMENT_TIME: u32
+ * Real period for this measurement, unit in us.
*/
enum qca_wlan_vendor_attr_ll_stats_ext {
QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_INVALID = 0,
@@ -2636,6 +2642,9 @@
QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_RSSI_BEACON,
QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_SNR_BEACON,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_REPORT_TIME,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MEASUREMENT_TIME,
+
QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_LAST,
QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MAX =
QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_LAST - 1,
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index eeb7b93..d671e9d 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -7197,8 +7197,14 @@
{
uint32_t i;
struct nlattr *peer, *peer_info, *channels, *channel_info;
+ struct sir_wifi_ll_ext_period *period;
- if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_EVENT_MODE,
+ period = &stats->time_stamp;
+ if (nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_REPORT_TIME,
+ period->end_time) ||
+ nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MEASUREMENT_TIME,
+ period->duration) ||
+ nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_EVENT_MODE,
stats->trigger_cond_id) ||
nla_put_u32(skb,
QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_CCA_BSS_BITMAP,
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 372ffbb..fd48a3f 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -6674,6 +6674,16 @@
};
/**
+ * struct sir_wifi_ll_ext_time_stamp - time stamp for stats report
+ * @duration: the count duration on fw side for this report
+ * @end_time: timestamp when LL stats reported to user layer
+ */
+struct sir_wifi_ll_ext_period {
+ uint32_t duration;
+ v_TIME_t end_time;
+};
+
+/**
* struct sir_wifi_ll_ext_stats - link layer stats report
* @trigger_cond_id: Indicate what triggered this event.
* 1: timeout. 2: threshold
@@ -6713,6 +6723,8 @@
* +-------------------------------+
* | channel_num |
* +-------------------------------+
+ * | time stamp |
+ * +-------------------------------+
* | tx_mpdu_aggr_array_len |
* +-------------------------------+
* | tx_succ_mcs_array_len |
@@ -6766,6 +6778,7 @@
uint32_t rx_chgd_bitmap;
uint8_t peer_num;
uint8_t channel_num;
+ struct sir_wifi_ll_ext_period time_stamp;
uint32_t tx_mpdu_aggr_array_len;
uint32_t tx_succ_mcs_array_len;
uint32_t tx_fail_mcs_array_len;
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index aab897e..118457a 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -5587,6 +5587,8 @@
* +-------------------------------+
* | channel_num |
* +-------------------------------+
+ * | time stamp |
+ * +-------------------------------+
* | tx_mpdu_aggr_array_len |
* +-------------------------------+
* | tx_succ_mcs_array_len |
@@ -6009,6 +6011,28 @@
}
/**
+ * __wma_ll_stats_time_stamp() - log indication timestamp and counting duration
+ * @period - counting period on FW side
+ * @time_stamp - time stamp for user layer
+ *
+ * return: none
+ */
+static void __wma_ll_stats_time_stamp(wmi_stats_period *period,
+ struct sir_wifi_ll_ext_period *time_stamp)
+{
+ time_stamp->end_time = vos_timer_get_system_time();
+ if (!period) {
+ WMA_LOGE(FL("Period buf is null."));
+ time_stamp->duration = 0;
+ return;
+ }
+ WMA_LOGD(FL("On fw side, start time is %d, start count is %d "),
+ period->start_low_freq_msec, period->start_low_freq_count);
+ time_stamp->duration = period->end_low_freq_msec -
+ period->start_low_freq_msec;
+}
+
+/**
* wma_ll_stats_evt_handler() - handler for MAC layer counters.
* @handle - wma handle
* @event - FW event
@@ -6036,6 +6060,7 @@
vos_msg_t vos_msg;
struct ol_txrx_peer_t *peer;
ol_txrx_pdev_handle pdev;
+ wmi_stats_period *period;
mac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE,
wma_handle->vos_context);
@@ -6062,6 +6087,9 @@
wmi_cca_stats = param_buf->chan_cca_stats;
wmi_peer_signal = param_buf->peer_signal_stats;
wmi_peer_rx = param_buf->peer_ac_rx_stats;
+ period = param_buf->stats_period;
+ WMA_LOGD("%s: stats period length is %d. ", __func__,
+ fixed_param->stats_period_array_len);
/* Get the MAX of three peer numbers */
peer_num = fixed_param->num_peer_signal_stats >
@@ -6095,6 +6123,7 @@
ll_stats->channel_num = fixed_param->num_chan_cca_stats;
ll_stats->peer_num = peer_num;
+ __wma_ll_stats_time_stamp(period, &ll_stats->time_stamp);
result = (uint8_t *)ll_stats->stats;
peer_stats = (struct sir_wifi_ll_ext_peer_stats *)result;
ll_stats->peer_stats = peer_stats;