From d7eb83ec15ecf4b8c692c09ef57e78cc3dae93c6 Mon Sep 17 00:00:00 2001 From: "Pamidipati, Vijay" Date: Wed, 20 Sep 2017 21:19:56 +0530 Subject: [PATCH] qcacmn: Add missing fields in CDP Rx PPDU Statistics structure Enable reaping of HAL PPDU Status ring when ol stats are enabled. Added peer mac address and first_data_seqcntl fields into CDP Rx PPDU_stats structure. Added support to disable printing of per packet stats through iwpriv command. Change-Id: If0f967676e867c7ba9870770c3c818cbea43461a --- dp/inc/cdp_txrx_cmn_struct.h | 18 ++++++++++++++++++ dp/wifi3.0/dp_htt.c | 11 +++++++++-- dp/wifi3.0/dp_rx_mon_status.c | 8 ++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index d214c7a121..ec4142c8f3 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -159,6 +159,18 @@ enum cdp_host_txrx_stats { TXRX_HOST_STATS_MAX, }; +/* + * cdp_ppdu_ftype: PPDU Frame Type + * @CDP_PPDU_FTYPE_DATA: SU or MU Data Frame + * @CDP_PPDU_FTYPE_CTRL: Control/Management Frames +*/ +enum cdp_ppdu_ftype { + CDP_PPDU_FTYPE_DATA, + CDP_PPDU_FTYPE_CTRL, + CDP_PPDU_FTYPE_MAX +}; + + /** * @brief General specification of the tx frame contents * @@ -1168,6 +1180,9 @@ struct cdp_tx_completion_msdu { * @duration: PPDU duration * @tid: TID number * @peer_id: Peer ID + * @vdev_id: VAP ID + * @mac_addr: Peer MAC Address + * @first_data_seq_ctrl: Sequence control field of first data frame * @ltf_size: ltf_size * @stbc: When set, STBC rate was used * @he_re: he_re (range extension) @@ -1200,6 +1215,9 @@ struct cdp_rx_indication_ppdu { uint16_t duration; uint32_t tid:8, peer_id:16; + uint8_t vdev_id; + uint8_t mac_addr[6]; + uint16_t first_data_seq_ctrl; union { uint32_t rate_info; struct { diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index a352909266..efb4306cc8 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -1320,6 +1320,7 @@ static uint8_t dp_get_ppdu_info_user_index(struct dp_pdev *pdev, static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, uint32_t *tag_buf) { + uint16_t frame_type; struct cdp_tx_completion_ppdu *ppdu_desc; htt_ppdu_stats_common_tlv *dp_stats_buf = (htt_ppdu_stats_common_tlv *)tag_buf; @@ -1332,8 +1333,14 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, ppdu_desc->num_users = HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_GET(*tag_buf); tag_buf++; - ppdu_desc->frame_type = - HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_GET(*tag_buf); + frame_type = HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_GET(*tag_buf); + + if ((frame_type == HTT_STATS_FTYPE_TIDQ_DATA_SU) || + (frame_type == HTT_STATS_FTYPE_TIDQ_DATA_MU)) + ppdu_desc->frame_type = CDP_PPDU_FTYPE_DATA; + else + ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL; + ppdu_desc->ppdu_start_timestamp = dp_stats_buf->ppdu_start_tstmp_us; ppdu_desc->ppdu_end_timestamp = 0; /*TODO: value to be provided by FW */ tag_buf += 6; diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 19b09a917e..719412d994 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -66,7 +66,12 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_soc *soc, return; } + qdf_mem_copy(cdp_rx_ppdu->mac_addr, + peer->mac_addr.raw, DP_MAC_ADDR_LEN); + cdp_rx_ppdu->first_data_seq_ctrl = + ppdu_info->rx_status.first_data_seq_ctrl; cdp_rx_ppdu->peer_id = peer->peer_ids[0]; + cdp_rx_ppdu->vdev_id = peer->vdev->vdev_id; cdp_rx_ppdu->ppdu_id = ppdu_info->com_info.ppdu_id; cdp_rx_ppdu->duration = ppdu_info->rx_status.duration; cdp_rx_ppdu->u.bw = ppdu_info->rx_status.bw; @@ -76,7 +81,6 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_soc *soc, cdp_rx_ppdu->rssi = ppdu_info->rx_status.rssi_comb; cdp_rx_ppdu->timestamp = ppdu_info->com_info.ppdu_timestamp; cdp_rx_ppdu->channel = ppdu_info->rx_status.chan_freq; - } #else static inline void @@ -165,7 +169,7 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, uint32_t mac_id, status_nbuf, HTT_INVALID_PEER, WDI_NO_VAL, mac_id); #endif #endif - if (pdev->monitor_vdev != NULL) { + if ((pdev->monitor_vdev != NULL) || (pdev->enhanced_stats_en)) { do { tlv_status = hal_rx_status_get_tlv_info(rx_tlv,