diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 383c004d7172..5feacf88c5f5 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -284,4 +284,5 @@ QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev, uint32_t config_param_1, uint32_t config_param_2, uint32_t config_param_3); void dp_htt_stats_print_tag(uint8_t tag_type, uint32_t *tag_buf); +int dp_peer_rxtid_stats(struct dp_peer *peer); #endif /* #ifndef _DP_INTERNAL_H_ */ diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index beb18f4dc9b8..117634a0e82b 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -3373,7 +3373,14 @@ dp_get_host_peer_stats(struct cdp_pdev *pdev_handle, char *mac_addr) peer = (struct dp_peer *)dp_find_peer_by_addr(pdev_handle, mac_addr, &local_id); + if (!peer) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: Invalid peer\n", __func__); + return; + } + dp_print_peer_stats(peer); + dp_peer_rxtid_stats(peer); return; } @@ -3416,6 +3423,7 @@ dp_get_fw_peer_stats(struct cdp_pdev *pdev_handle, uint8_t *mac_addr, dp_h2t_ext_stats_msg_send(pdev, HTT_DBG_EXT_STATS_PEER_INFO, config_param0, config_param1, config_param2, config_param3); + } /* diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 646a8098091b..59d7ed82c475 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -318,6 +318,69 @@ int dp_peer_find_attach(struct dp_soc *soc) return 0; /* success */ } +static void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt, + union hal_reo_status *reo_status) +{ + struct dp_rx_tid *rx_tid = (struct dp_rx_tid *)cb_ctxt; + struct hal_reo_queue_status *queue_status = &(reo_status->queue_status); + + if (queue_status->header.status != HAL_REO_CMD_SUCCESS) { + DP_TRACE_STATS(FATAL, "REO stats failure %d for TID %d\n", + queue_status->header.status, rx_tid->tid); + return; + } + + DP_TRACE_STATS(FATAL, "REO queue stats (TID: %d): \n" + "ssn: %d\n" + "curr_idx : %d\n" + "pn_31_0 : %08x\n" + "pn_63_32 : %08x\n" + "pn_95_64 : %08x\n" + "pn_127_96 : %08x\n" + "last_rx_enq_tstamp : %08x\n" + "last_rx_deq_tstamp : %08x\n" + "rx_bitmap_31_0 : %08x\n" + "rx_bitmap_63_32 : %08x\n" + "rx_bitmap_95_64 : %08x\n" + "rx_bitmap_127_96 : %08x\n" + "rx_bitmap_159_128 : %08x\n" + "rx_bitmap_191_160 : %08x\n" + "rx_bitmap_223_192 : %08x\n" + "rx_bitmap_255_224 : %08x\n" + "curr_mpdu_cnt : %d\n" + "curr_msdu_cnt : %d\n" + "fwd_timeout_cnt : %d\n" + "fwd_bar_cnt : %d\n" + "dup_cnt : %d\n" + "frms_in_order_cnt : %d\n" + "bar_rcvd_cnt : %d\n" + "mpdu_frms_cnt : %d\n" + "msdu_frms_cnt : %d\n" + "total_byte_cnt : %d\n" + "late_recv_mpdu_cnt : %d\n" + "win_jump_2k : %d\n" + "hole_cnt : %d\n", + rx_tid->tid, + queue_status->ssn, queue_status->curr_idx, + queue_status->pn_31_0, queue_status->pn_63_32, + queue_status->pn_95_64, queue_status->pn_127_96, + queue_status->last_rx_enq_tstamp, + queue_status->last_rx_deq_tstamp, + queue_status->rx_bitmap_31_0, queue_status->rx_bitmap_63_32, + queue_status->rx_bitmap_95_64, queue_status->rx_bitmap_127_96, + queue_status->rx_bitmap_159_128, + queue_status->rx_bitmap_191_160, + queue_status->rx_bitmap_223_192, + queue_status->rx_bitmap_255_224, + queue_status->curr_mpdu_cnt, queue_status->curr_msdu_cnt, + queue_status->fwd_timeout_cnt, queue_status->fwd_bar_cnt, + queue_status->dup_cnt, queue_status->frms_in_order_cnt, + queue_status->bar_rcvd_cnt, queue_status->mpdu_frms_cnt, + queue_status->msdu_frms_cnt, queue_status->total_cnt, + queue_status->late_recv_mpdu_cnt, queue_status->win_jump_2k, + queue_status->hole_cnt); +} + static inline void dp_peer_find_add_id(struct dp_soc *soc, uint8_t *peer_mac_addr, uint16_t peer_id, uint16_t hw_peer_id, uint8_t vdev_id) @@ -1536,3 +1599,31 @@ uint8_t dp_get_peer_mac_addr_frm_id(struct cdp_soc_t *soc_handle, qdf_mem_copy(peer_mac, peer->mac_addr.raw, 6); return peer->vdev->vdev_id; } + +/** + * dp_peer_rxtid_stats: Retried Rx TID (REO queue) stats from HW + * @peer: DP peer handle + * + * Return: 0 on success, error code on failure + */ +int dp_peer_rxtid_stats(struct dp_peer *peer) +{ + struct dp_soc *soc = peer->vdev->pdev->soc; + struct hal_reo_cmd_params params; + int i; + + qdf_mem_zero(¶ms, sizeof(params)); + for (i = 0; i < DP_MAX_TIDS; i++) { + struct dp_rx_tid *rx_tid = &peer->rx_tid[i]; + if (rx_tid->hw_qdesc_vaddr_unaligned != NULL) { + params.std.need_status = 1; + params.std.addr_lo = + rx_tid->hw_qdesc_paddr & 0xffffffff; + params.std.addr_hi = + (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32; + dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS, ¶ms, + dp_rx_tid_stats_cb, rx_tid); + } + } + return 0; +} diff --git a/hal/wifi3.0/hal_reo.h b/hal/wifi3.0/hal_reo.h index b34f55f27a7f..8986f437949e 100644 --- a/hal/wifi3.0/hal_reo.h +++ b/hal/wifi3.0/hal_reo.h @@ -136,7 +136,8 @@ enum reo_thres_index_reg { enum reo_cmd_exec_status { HAL_REO_CMD_SUCCESS = 0, HAL_REO_CMD_BLOCKED = 1, - HAL_REO_CMD_FAILED = 2 + HAL_REO_CMD_FAILED = 2, + HAL_REO_CMD_RESOURCE_BLOCKED = 3 }; /**