summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/dp/htt/htt_rx.c1
-rw-r--r--core/dp/ol/inc/ol_txrx_stats.h15
-rw-r--r--core/dp/txrx/ol_rx.c38
-rw-r--r--core/dp/txrx/ol_rx.h1
-rw-r--r--core/dp/txrx/ol_txrx.c46
5 files changed, 96 insertions, 5 deletions
diff --git a/core/dp/htt/htt_rx.c b/core/dp/htt/htt_rx.c
index b5d8667c5f3a..24efd40b14d6 100644
--- a/core/dp/htt/htt_rx.c
+++ b/core/dp/htt/htt_rx.c
@@ -1654,6 +1654,7 @@ htt_rx_amsdu_rx_in_order_pop_ll(htt_pdev_handle pdev,
/* Get the total number of MSDUs */
msdu_count = HTT_RX_IN_ORD_PADDR_IND_MSDU_CNT_GET(*(msg_word + 1));
HTT_RX_CHECK_MSDU_COUNT(msdu_count);
+ ol_rx_update_histogram_stats(msdu_count);
msg_word =
(uint32_t *) (rx_ind_data + HTT_RX_IN_ORD_PADDR_IND_HDR_BYTES);
diff --git a/core/dp/ol/inc/ol_txrx_stats.h b/core/dp/ol/inc/ol_txrx_stats.h
index febf71863ebc..27a49ef03c09 100644
--- a/core/dp/ol/inc/ol_txrx_stats.h
+++ b/core/dp/ol/inc/ol_txrx_stats.h
@@ -80,6 +80,7 @@ struct ol_txrx_stats_tx_dropped {
couldn't get an ack for */
struct ol_txrx_stats_elem no_ack;
};
+
struct ol_txrx_stats_tx_histogram {
uint32_t pkts_1;
uint32_t pkts_2_10;
@@ -112,6 +113,16 @@ struct ol_txrx_stats_tx {
/*
* RX
*/
+struct ol_txrx_stats_rx_histogram {
+ uint32_t pkts_1;
+ uint32_t pkts_2_10;
+ uint32_t pkts_11_20;
+ uint32_t pkts_21_30;
+ uint32_t pkts_31_40;
+ uint32_t pkts_41_50;
+ uint32_t pkts_51_60;
+ uint32_t pkts_61_plus;
+};
struct ol_txrx_stats_rx_ibss_fwd {
/* MSDUs forwarded to network stack */
u_int32_t packets_stack;
@@ -123,7 +134,11 @@ struct ol_txrx_stats_rx_ibss_fwd {
struct ol_txrx_stats_rx {
/* MSDUs given to the OS shim */
struct ol_txrx_stats_elem delivered;
+ struct ol_txrx_stats_elem dropped_err;
+ struct ol_txrx_stats_elem dropped_mic_err;
+ struct ol_txrx_stats_elem dropped_peer_invalid;
struct ol_txrx_stats_rx_ibss_fwd intra_bss_fwd;
+ struct ol_txrx_stats_rx_histogram rx_ind_histogram;
};
struct ol_txrx_stats {
struct ol_txrx_stats_tx tx;
diff --git a/core/dp/txrx/ol_rx.c b/core/dp/txrx/ol_rx.c
index eea89ab5570a..9f2f65a15b34 100644
--- a/core/dp/txrx/ol_rx.c
+++ b/core/dp/txrx/ol_rx.c
@@ -103,6 +103,41 @@ void ol_rx_trigger_restore(htt_pdev_handle htt_pdev, qdf_nbuf_t head_msdu,
}
#endif
+/**
+ * ol_rx_update_histogram_stats() - update rx histogram statistics
+ * @msdu_count: msdu count
+ *
+ * Return: none
+ */
+void ol_rx_update_histogram_stats(uint32_t msdu_count)
+{
+ struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+
+ if (!pdev) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s pdev is NULL\n", __func__);
+ return;
+ }
+
+ if (msdu_count > 60) {
+ TXRX_STATS_ADD(pdev, pub.rx.rx_ind_histogram.pkts_61_plus, 1);
+ } else if (msdu_count > 50) {
+ TXRX_STATS_ADD(pdev, pub.rx.rx_ind_histogram.pkts_51_60, 1);
+ } else if (msdu_count > 40) {
+ TXRX_STATS_ADD(pdev, pub.rx.rx_ind_histogram.pkts_41_50, 1);
+ } else if (msdu_count > 30) {
+ TXRX_STATS_ADD(pdev, pub.rx.rx_ind_histogram.pkts_31_40, 1);
+ } else if (msdu_count > 20) {
+ TXRX_STATS_ADD(pdev, pub.rx.rx_ind_histogram.pkts_21_30, 1);
+ } else if (msdu_count > 10) {
+ TXRX_STATS_ADD(pdev, pub.rx.rx_ind_histogram.pkts_11_20, 1);
+ } else if (msdu_count > 1) {
+ TXRX_STATS_ADD(pdev, pub.rx.rx_ind_histogram.pkts_2_10, 1);
+ } else if (msdu_count == 1) {
+ TXRX_STATS_ADD(pdev, pub.rx.rx_ind_histogram.pkts_1, 1);
+ }
+}
+
static void ol_rx_process_inv_peer(ol_txrx_pdev_handle pdev,
void *rx_mpdu_desc, qdf_nbuf_t msdu)
{
@@ -808,6 +843,7 @@ ol_rx_mic_error_handler(
struct ol_txrx_vdev_t *vdev = NULL;
if (pdev) {
+ TXRX_STATS_MSDU_INCR(pdev, rx.dropped_mic_err, msdu);
peer = ol_txrx_peer_find_by_id(pdev, peer_id);
if (peer) {
vdev = peer->vdev;
@@ -1298,6 +1334,8 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev,
while (head_msdu) {
qdf_nbuf_t msdu = head_msdu;
head_msdu = qdf_nbuf_next(head_msdu);
+ TXRX_STATS_MSDU_INCR(pdev,
+ rx.dropped_peer_invalid, msdu);
htt_rx_desc_frame_free(htt_pdev, msdu);
}
return;
diff --git a/core/dp/txrx/ol_rx.h b/core/dp/txrx/ol_rx.h
index 536a6d888f82..58a7114838e9 100644
--- a/core/dp/txrx/ol_rx.h
+++ b/core/dp/txrx/ol_rx.h
@@ -56,6 +56,7 @@ void
ol_rx_offload_paddr_deliver_ind_handler(htt_pdev_handle htt_pdev,
uint32_t msdu_count,
uint32_t *msg_word);
+void ol_rx_update_histogram_stats(uint32_t msdu_count);
void
ol_rx_mic_error_handler(
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index b374ee65a6f0..7c9c94cebc6c 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -2995,10 +2995,10 @@ ol_txrx_stats(uint8_t vdev_id, char *buffer, unsigned buf_len)
void ol_txrx_stats_display(ol_txrx_pdev_handle pdev)
{
- QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "txrx stats:");
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
- " tx: sent %lld msdus (%lld B), "
- " rejected %lld (%lld B), dropped %lld (%lld B)",
+ "TX PATH Statistics:");
+ QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+ "sent %lld msdus (%lld B), rejected %lld (%lld B), dropped %lld (%lld B)",
pdev->stats.pub.tx.delivered.pkts,
pdev->stats.pub.tx.delivered.bytes,
pdev->stats.pub.tx.dropped.host_reject.pkts,
@@ -3038,18 +3038,46 @@ void ol_txrx_stats_display(ol_txrx_pdev_handle pdev)
pdev->stats.pub.tx.comp_histogram.pkts_51_60,
pdev->stats.pub.tx.comp_histogram.pkts_61_plus);
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
- " rx: %lld ppdus, %lld mpdus, %lld msdus, %lld bytes, %lld errs",
+ "RX PATH Statistics:");
+ QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+ "%lld ppdus, %lld mpdus, %lld msdus, %lld bytes\n"
+ "dropped: err %lld (%lld B), peer_invalid %lld (%lld B), mic_err %lld (%lld B)",
pdev->stats.priv.rx.normal.ppdus,
pdev->stats.priv.rx.normal.mpdus,
pdev->stats.pub.rx.delivered.pkts,
pdev->stats.pub.rx.delivered.bytes,
- pdev->stats.priv.rx.err.mpdu_bad);
+ pdev->stats.pub.rx.dropped_err.pkts,
+ pdev->stats.pub.rx.dropped_err.bytes,
+ pdev->stats.pub.rx.dropped_peer_invalid.pkts,
+ pdev->stats.pub.rx.dropped_peer_invalid.bytes,
+ pdev->stats.pub.rx.dropped_mic_err.pkts,
+ pdev->stats.pub.rx.dropped_mic_err.bytes);
+
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
" fwd to stack %d, fwd to fw %d, fwd to stack & fw %d\n",
pdev->stats.pub.rx.intra_bss_fwd.packets_stack,
pdev->stats.pub.rx.intra_bss_fwd.packets_fwd,
pdev->stats.pub.rx.intra_bss_fwd.packets_stack_n_fwd);
+
+ QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+ "rx packets per HTT indication:\n"
+ "Single Packet %d\n"
+ " 2-10 Packets %d\n"
+ "11-20 Packets %d\n"
+ "21-30 Packets %d\n"
+ "31-40 Packets %d\n"
+ "41-50 Packets %d\n"
+ "51-60 Packets %d\n"
+ " 60+ Packets %d\n",
+ pdev->stats.pub.rx.rx_ind_histogram.pkts_1,
+ pdev->stats.pub.rx.rx_ind_histogram.pkts_2_10,
+ pdev->stats.pub.rx.rx_ind_histogram.pkts_11_20,
+ pdev->stats.pub.rx.rx_ind_histogram.pkts_21_30,
+ pdev->stats.pub.rx.rx_ind_histogram.pkts_31_40,
+ pdev->stats.pub.rx.rx_ind_histogram.pkts_41_50,
+ pdev->stats.pub.rx.rx_ind_histogram.pkts_51_60,
+ pdev->stats.pub.rx.rx_ind_histogram.pkts_61_plus);
}
void ol_txrx_stats_clear(ol_txrx_pdev_handle pdev)
@@ -3563,6 +3591,8 @@ static void ol_rx_data_cb(struct ol_txrx_pdev_t *pdev,
ret = data_rx(osif_dev, buf);
if (ret != QDF_STATUS_SUCCESS) {
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "Frame Rx to HDD failed");
+ if (pdev)
+ TXRX_STATS_MSDU_INCR(pdev, rx.dropped_err, buf);
qdf_nbuf_free(buf);
}
buf = next_buf;
@@ -3574,6 +3604,9 @@ free_buf:
buf = buf_list;
while (buf) {
next_buf = qdf_nbuf_queue_next(buf);
+ if (pdev)
+ TXRX_STATS_MSDU_INCR(pdev,
+ rx.dropped_peer_invalid, buf);
qdf_nbuf_free(buf);
buf = next_buf;
}
@@ -3675,6 +3708,9 @@ drop_rx_buf:
buf = rx_buf_list;
while (buf) {
next_buf = qdf_nbuf_queue_next(buf);
+ if (pdev)
+ TXRX_STATS_MSDU_INCR(pdev,
+ rx.dropped_peer_invalid, buf);
qdf_nbuf_free(buf);
buf = next_buf;
}