mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 21:54:34 -04:00
qcacmn: Control frame stats Rx BAR frames
Add Pdev level stats for Rx BAR frames.
Change-Id: I1cce56559fd1ffec11f873e35cb1c42b49c1c9ff
CRs-Fixed: 2110552
This commit is contained in:
parent
110e03024d
commit
51b6b6d21b
4 changed files with 97 additions and 8 deletions
|
|
@ -33,6 +33,7 @@
|
|||
#include "htc_api.h"
|
||||
#include "qdf_types.h"
|
||||
#include "qdf_nbuf.h"
|
||||
#include "qdf_atomic.h"
|
||||
#ifndef CONFIG_WIN
|
||||
#include <cdp_txrx_mob_def.h>
|
||||
#endif /* CONFIG_WIN */
|
||||
|
|
@ -836,6 +837,8 @@ struct cdp_rx_stats {
|
|||
uint32_t non_amsdu_cnt;
|
||||
/* Number of MSDUs part of AMSDU*/
|
||||
uint32_t amsdu_cnt;
|
||||
/* Number of bar received */
|
||||
uint32_t bar_recv_cnt;
|
||||
};
|
||||
|
||||
/* Tx ingress Stats */
|
||||
|
|
@ -1003,6 +1006,7 @@ struct cdp_pdev_stats {
|
|||
struct cdp_hist_tx_comp tx_comp_histogram;
|
||||
/* Number of Rx ring descriptors reaped per interrupt */
|
||||
struct cdp_hist_rx_ind rx_ind_histogram;
|
||||
qdf_atomic_t cmd_complete;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -287,6 +287,10 @@ extern QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc,
|
|||
extern void dp_reo_cmdlist_destroy(struct dp_soc *soc);
|
||||
extern void dp_reo_status_ring_handler(struct dp_soc *soc);
|
||||
void dp_aggregate_vdev_stats(struct dp_vdev *vdev);
|
||||
void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt,
|
||||
union hal_reo_status *reo_status);
|
||||
void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt,
|
||||
union hal_reo_status *reo_status);
|
||||
uint16_t dp_tx_me_send_convert_ucast(struct cdp_vdev *vdev_handle,
|
||||
qdf_nbuf_t nbuf, uint8_t newmac[][DP_MAC_ADDR_LEN],
|
||||
uint8_t new_mac_cnt);
|
||||
|
|
@ -298,7 +302,8 @@ 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);
|
||||
void dp_peer_rxtid_stats(struct dp_peer *peer, void (*callback_fn),
|
||||
void *cb_ctxt);
|
||||
void dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle,
|
||||
struct cdp_peer *peer_handle, enum cdp_sec_type sec_type,
|
||||
uint32_t *rx_pn);
|
||||
|
|
|
|||
|
|
@ -3745,6 +3745,69 @@ void dp_peer_set_mesh_rx_filter(struct cdp_vdev *vdev_hdl, uint32_t val)
|
|||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats
|
||||
* Current scope is bar recieved count
|
||||
*
|
||||
* @pdev_handle: DP_PDEV handle
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
#define STATS_PROC_TIMEOUT (HZ/10)
|
||||
|
||||
static void
|
||||
dp_aggregate_pdev_ctrl_frames_stats(struct dp_pdev *pdev)
|
||||
{
|
||||
struct dp_vdev *vdev;
|
||||
struct dp_peer *peer;
|
||||
uint32_t waitcnt;
|
||||
|
||||
TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
|
||||
TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
|
||||
if (!peer) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
||||
FL("DP Invalid Peer refernce"));
|
||||
return;
|
||||
}
|
||||
waitcnt = 0;
|
||||
dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev);
|
||||
while (!(qdf_atomic_read(&(pdev->stats.cmd_complete)))
|
||||
&& waitcnt < 10) {
|
||||
schedule_timeout_interruptible(
|
||||
STATS_PROC_TIMEOUT);
|
||||
waitcnt++;
|
||||
}
|
||||
qdf_atomic_set(&(pdev->stats.cmd_complete), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_rx_bar_stats_cb(): BAR received stats callback
|
||||
* @soc: SOC handle
|
||||
* @cb_ctxt: Call back context
|
||||
* @reo_status: Reo status
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt,
|
||||
union hal_reo_status *reo_status)
|
||||
{
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)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 \n",
|
||||
queue_status->header.status);
|
||||
qdf_atomic_set(&(pdev->stats.cmd_complete), 1);
|
||||
return;
|
||||
}
|
||||
|
||||
pdev->stats.rx.bar_recv_cnt += queue_status->bar_rcvd_cnt;
|
||||
qdf_atomic_set(&(pdev->stats.cmd_complete), 1);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_aggregate_vdev_stats(): Consolidate stats at VDEV level
|
||||
* @vdev: DP VDEV handle
|
||||
|
|
@ -4104,6 +4167,12 @@ dp_print_pdev_rx_stats(struct dp_pdev *pdev)
|
|||
pdev->stats.replenish.rxdma_err);
|
||||
DP_PRINT_STATS(" Desc Alloc Failed: = %d",
|
||||
pdev->stats.err.desc_alloc_fail);
|
||||
|
||||
/* Get bar_recv_cnt */
|
||||
dp_aggregate_pdev_ctrl_frames_stats(pdev);
|
||||
DP_PRINT_STATS("BAR Received Count: = %d",
|
||||
pdev->stats.rx.bar_recv_cnt);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -4690,7 +4759,7 @@ dp_get_host_peer_stats(struct cdp_pdev *pdev_handle, char *mac_addr)
|
|||
}
|
||||
|
||||
dp_print_peer_stats(peer);
|
||||
dp_peer_rxtid_stats(peer);
|
||||
dp_peer_rxtid_stats(peer, dp_rx_tid_stats_cb, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -625,7 +625,7 @@ 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,
|
||||
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;
|
||||
|
|
@ -1991,15 +1991,21 @@ uint8_t dp_get_peer_mac_addr_frm_id(struct cdp_soc_t *soc_handle,
|
|||
/**
|
||||
* dp_peer_rxtid_stats: Retried Rx TID (REO queue) stats from HW
|
||||
* @peer: DP peer handle
|
||||
* @dp_stats_cmd_cb: REO command callback function
|
||||
* @cb_ctxt: Callback context
|
||||
*
|
||||
* Return: 0 on success, error code on failure
|
||||
* Return: none
|
||||
*/
|
||||
int dp_peer_rxtid_stats(struct dp_peer *peer)
|
||||
void dp_peer_rxtid_stats(struct dp_peer *peer, void (*dp_stats_cmd_cb),
|
||||
void *cb_ctxt)
|
||||
{
|
||||
struct dp_soc *soc = peer->vdev->pdev->soc;
|
||||
struct hal_reo_cmd_params params;
|
||||
int i;
|
||||
|
||||
if (!dp_stats_cmd_cb)
|
||||
return;
|
||||
|
||||
qdf_mem_zero(¶ms, sizeof(params));
|
||||
for (i = 0; i < DP_MAX_TIDS; i++) {
|
||||
struct dp_rx_tid *rx_tid = &peer->rx_tid[i];
|
||||
|
|
@ -2009,8 +2015,14 @@ int dp_peer_rxtid_stats(struct dp_peer *peer)
|
|||
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);
|
||||
|
||||
if (cb_ctxt) {
|
||||
dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS,
|
||||
¶ms, dp_stats_cmd_cb, cb_ctxt);
|
||||
} else {
|
||||
dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS,
|
||||
¶ms, dp_stats_cmd_cb, rx_tid);
|
||||
}
|
||||
|
||||
/* Flush REO descriptor from HW cache to update stats
|
||||
* in descriptor memory. This is to help debugging */
|
||||
|
|
@ -2024,5 +2036,4 @@ int dp_peer_rxtid_stats(struct dp_peer *peer)
|
|||
NULL);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue