diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 6b4a91f42b..07f8f82435 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -836,6 +836,9 @@ struct cdp_tx_stats { /* SGI count */ uint32_t sgi_count[MAX_GI]; + /* Packet count for different num_spatial_stream values */ + uint32_t nss[SS_COUNT]; + /* Packet Count for different bandwidths */ uint32_t bw[MAX_BW]; @@ -935,6 +938,8 @@ struct cdp_tx_ingress_stats { struct cdp_pkt_info inspect_pkts; /*NAWDS Multicast Packet Count */ struct cdp_pkt_info nawds_mcast; + /* Number of broadcast packets */ + struct cdp_pkt_info bcast; struct { /* Total Raw packets */ diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 79df9a9fa5..160edcecbf 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -80,6 +80,7 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer, DP_STATS_UPD(peer, tx.tx_rate, ppdu->tx_rate); DP_STATS_INC(peer, tx.sgi_count[ppdu->gi], num_msdu); DP_STATS_INC(peer, tx.bw[ppdu->bw], num_msdu); + DP_STATS_INC(peer, tx.nss[ppdu->nss], num_msdu); DP_STATS_UPD(peer, tx.last_ack_rssi, ack_rssi); DP_STATS_INC(peer, tx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], num_msdu); DP_STATS_INCC(peer, tx.stbc, num_msdu, ppdu->stbc); @@ -101,31 +102,31 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer, DP_STATS_INC(peer, tx.retries, (ppdu->long_retries + ppdu->short_retries)); DP_STATS_INCC(peer, - tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_A))); DP_STATS_INCC(peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11A) && (preamble == DOT11_A))); DP_STATS_INCC(peer, - tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu, ((mcs >= MAX_MCS_11B) && (preamble == DOT11_B))); DP_STATS_INCC(peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < (MAX_MCS_11B)) && (preamble == DOT11_B))); DP_STATS_INCC(peer, - tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_N))); DP_STATS_INCC(peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11A) && (preamble == DOT11_N))); DP_STATS_INCC(peer, - tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu, ((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC))); DP_STATS_INCC(peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC))); DP_STATS_INCC(peer, - tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX))); DP_STATS_INCC(peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index c4c81b6fc2..b8d5ef9c57 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -4828,6 +4828,14 @@ static inline void dp_print_peer_stats(struct dp_peer *peer) peer->stats.tx.bw[2], peer->stats.tx.bw[3], peer->stats.tx.bw[4], peer->stats.tx.bw[5]); + index = 0; + for (i = 0; i < SS_COUNT; i++) { + index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, + " %d", peer->stats.tx.nss[i]); + } + DP_PRINT_STATS("NSS(1-8) = %s", + nss); + DP_PRINT_STATS("Aggregation:"); DP_PRINT_STATS(" Number of Msdu's Part of Amsdu = %d", peer->stats.tx.amsdu_cnt); diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 236e0cb671..1326cf344a 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1193,14 +1193,16 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota) DP_STATS_INC_PKT(peer, rx.rcvd_reo[ring_id], 1, qdf_nbuf_len(rx_desc->nbuf)); - ampdu_flag = (mpdu_desc_info.mpdu_flags & - HAL_MPDU_F_AMPDU_FLAG); + if (soc->process_rx_status) { + ampdu_flag = (mpdu_desc_info.mpdu_flags & + HAL_MPDU_F_AMPDU_FLAG); - DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag); - DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag)); + DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag); + DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag)); + } amsdu_flag = ((msdu_desc_info.msdu_flags & - HAL_MSDU_F_FIRST_MSDU_IN_MPDU) && + HAL_MSDU_F_FIRST_MSDU_IN_MPDU) && (msdu_desc_info.msdu_flags & HAL_MSDU_F_LAST_MSDU_IN_MPDU)); @@ -1410,7 +1412,7 @@ done: DP_STATS_INC(peer, rx.bw[bw], 1); DP_STATS_INC(peer, rx.sgi_count[sgi], 1); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, + mcs_count[MAX_MCS - 1], 1, ((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_A))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. @@ -1418,7 +1420,7 @@ done: ((mcs < MAX_MCS_11A) && (pkt_type == DOT11_A))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, + mcs_count[MAX_MCS - 1], 1, ((mcs >= MAX_MCS_11B) && (pkt_type == DOT11_B))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. @@ -1426,7 +1428,7 @@ done: ((mcs < MAX_MCS_11B) && (pkt_type == DOT11_B))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, + mcs_count[MAX_MCS - 1], 1, ((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_N))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. @@ -1434,7 +1436,7 @@ done: ((mcs < MAX_MCS_11A) && (pkt_type == DOT11_N))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, + mcs_count[MAX_MCS - 1], 1, ((mcs >= MAX_MCS_11AC) && (pkt_type == DOT11_AC))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. @@ -1442,7 +1444,7 @@ done: ((mcs < MAX_MCS_11AC) && (pkt_type == DOT11_AC))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, + mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (pkt_type == DOT11_AX))); DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 7da58c0cb5..3a748af36c 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 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018 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 @@ -86,6 +86,11 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_soc *soc, cdp_rx_ppdu->num_msdu = (cdp_rx_ppdu->tcp_msdu_count + cdp_rx_ppdu->udp_msdu_count + cdp_rx_ppdu->other_msdu_count); + + if (ppdu_info->com_info.mpdu_cnt_fcs_ok > 1) + cdp_rx_ppdu->is_ampdu = 1; + else + cdp_rx_ppdu->is_ampdu = 0; } #else static inline void @@ -124,37 +129,44 @@ static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer, return; DP_STATS_UPD(peer, rx.rssi, ppdu->rssi); + + if ((preamble == DOT11_A) || (preamble == DOT11_B)) + ppdu->u.nss = 1; + + if (ppdu->u.nss) + DP_STATS_INC(peer, rx.nss[ppdu->u.nss - 1], num_msdu); + DP_STATS_INC(peer, rx.sgi_count[ppdu->u.gi], num_msdu); DP_STATS_INC(peer, rx.bw[ppdu->u.bw], num_msdu); DP_STATS_INCC(peer, rx.ampdu_cnt, num_msdu, ppdu->is_ampdu); DP_STATS_INCC(peer, rx.non_ampdu_cnt, num_msdu, !(ppdu->is_ampdu)); DP_STATS_UPD(peer, rx.rx_rate, mcs); DP_STATS_INCC(peer, - rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_A))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11A) && (preamble == DOT11_A))); DP_STATS_INCC(peer, - rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11B) && (preamble == DOT11_B))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11B) && (preamble == DOT11_B))); DP_STATS_INCC(peer, - rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_N))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11A) && (preamble == DOT11_N))); DP_STATS_INCC(peer, - rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC))); DP_STATS_INCC(peer, - rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index eafa6940d0..77d0ddc5e1 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -2353,23 +2353,23 @@ static void dp_tx_update_peer_stats(struct dp_peer *peer, if (!(soc->process_tx_status)) return; - DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1, ((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_A))); DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, ((mcs < (MAX_MCS_11A)) && (pkt_type == DOT11_A))); - DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1, ((mcs >= MAX_MCS_11B) && (pkt_type == DOT11_B))); DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, ((mcs < MAX_MCS_11B) && (pkt_type == DOT11_B))); - DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1, ((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_N))); DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, ((mcs < MAX_MCS_11A) && (pkt_type == DOT11_N))); - DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1, ((mcs >= MAX_MCS_11AC) && (pkt_type == DOT11_AC))); DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, ((mcs < MAX_MCS_11AC) && (pkt_type == DOT11_AC))); - DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (pkt_type == DOT11_AX))); DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (pkt_type == DOT11_AX))); diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index cd39a27caf..74120626a6 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -428,6 +428,8 @@ struct hal_rx_ppdu_common_info { uint32_t ppdu_id; uint32_t last_ppdu_id; uint32_t ppdu_timestamp; + uint32_t mpdu_cnt_fcs_ok; + uint32_t mpdu_cnt_fcs_err; }; struct hal_rx_ppdu_info { @@ -523,6 +525,9 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info) ppdu_info->rx_status.ast_index = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4, AST_INDEX); + ppdu_info->rx_status.mcs = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, MCS); + tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12, RECEIVED_QOS_DATA_TID_BITMAP); ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, sizeof(tid)*8); @@ -536,13 +541,21 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info) UDP_MSDU_COUNT); ppdu_info->rx_status.other_msdu_count = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10, - OTHER_MSDU_COUNT); + OTHER_MSDU_COUNT); + ppdu_info->rx_status.nss = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, NSS); ppdu_info->rx_status.first_data_seq_ctrl = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, DATA_SEQUENCE_CONTROL_INFO_VALID); ppdu_info->rx_status.preamble_type = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, HT_CONTROL_FIELD_PKT_TYPE); + ppdu_info->com_info.mpdu_cnt_fcs_ok = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, + MPDU_CNT_FCS_OK); + ppdu_info->com_info.mpdu_cnt_fcs_err = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2, + MPDU_CNT_FCS_ERR); break; }