qcacmn: Enable support for REO Queue Stats

Map the cdp api call to a datapath handle to print REO
Queue Stats.

Change-Id: I14f880e9fc3743991fd7c8441326c23b7c3bdff8
CRs-Fixed: 2217649
This commit is contained in:
Venkata Sharath Chandra Manchala 2018-03-30 15:55:26 -07:00 • committed by nshrivas
commit 0cb3198ecb
4 changed files with 61 additions and 41 deletions

View file

@ -186,17 +186,19 @@ enum htt_cmn_dbg_stats_type {
* @TXRX_CLEAR_STATS: clear all host stats
* @TXRX_SRNG_PTR_STATS: Print SRNG pointer stats
* @TXRX_RX_MON_STATS: Print monitor mode stats
* @TXRX_REO_QUEUE_STATS: Print Per peer REO Queue Stats
*/
enum cdp_host_txrx_stats {
TXRX_HOST_STATS_INVALID = -1,
TXRX_CLEAR_STATS = 0,
TXRX_RX_RATE_STATS = 1,
TXRX_TX_RATE_STATS = 2,
TXRX_TX_HOST_STATS = 3,
TXRX_RX_HOST_STATS = 4,
TXRX_AST_STATS = 5,
TXRX_SRNG_PTR_STATS = 6,
TXRX_RX_MON_STATS = 7,
TXRX_CLEAR_STATS = 0,
TXRX_RX_RATE_STATS = 1,
TXRX_TX_RATE_STATS = 2,
TXRX_TX_HOST_STATS = 3,
TXRX_RX_HOST_STATS = 4,
TXRX_AST_STATS = 5,
TXRX_SRNG_PTR_STATS = 6,
TXRX_RX_MON_STATS = 7,
TXRX_REO_QUEUE_STATS = 8,
TXRX_HOST_STATS_MAX,
};
@ -859,6 +861,7 @@ enum cdp_stats {
CDP_TXRX_STATS_25,
CDP_TXRX_STATS_26,
CDP_TXRX_STATS_27,
CDP_TXRX_STATS_28,
CDP_TXRX_STATS_HTT_MAX = 256,
CDP_TXRX_MAX_STATS = 512,
};
@ -1246,6 +1249,7 @@ struct cdp_txrx_stats_req {
uint32_t param3;
uint32_t cookie_val;
uint8_t mac_id;
char *peer_addr;
};
/**

View file

@ -304,12 +304,20 @@ cdp_host_me_stats(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
return soc->ops->host_stats_ops->txrx_host_me_stats(vdev);
}
static inline void cdp_per_peer_stats
(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, char *addr)
/**
* cdp_per_peer_stats(): function to print per peer REO Queue stats
* @soc: soc handle
* @pdev: physical device
* @addr: peer address
*
* return: status
*/
static inline void cdp_per_peer_stats(ol_txrx_soc_handle soc,
struct cdp_pdev *pdev, char *addr)
{
if (!soc || !soc->ops) {
QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
"%s: Invalid Instance", __func__);
"%s: Invalid Instance", __func__);
QDF_BUG(0);
return;
}
@ -318,8 +326,7 @@ static inline void cdp_per_peer_stats
!soc->ops->host_stats_ops->txrx_per_peer_stats)
return;
soc->ops->host_stats_ops->txrx_per_peer_stats
(pdev, addr);
soc->ops->host_stats_ops->txrx_per_peer_stats(pdev, addr);
}
static inline int cdp_host_msdu_ttl_stats(ol_txrx_soc_handle soc,

View file

@ -645,8 +645,10 @@ struct cdp_host_stats_ops {
A_STATUS
(*txrx_host_me_stats)(struct cdp_vdev *vdev);
void
(*txrx_per_peer_stats)(struct cdp_pdev *pdev, char *addr);
int (*txrx_host_msdu_ttl_stats)(struct cdp_vdev *vdev,
struct ol_txrx_stats_req *req);

View file

@ -293,6 +293,7 @@ const int dp_stats_mapping_table[][STATS_TYPE_MAX] = {
{TXRX_FW_STATS_INVALID, TXRX_AST_STATS},
{TXRX_FW_STATS_INVALID, TXRX_SRNG_PTR_STATS},
{TXRX_FW_STATS_INVALID, TXRX_RX_MON_STATS},
{TXRX_FW_STATS_INVALID, TXRX_REO_QUEUE_STATS},
};
/* MCL specific functions */
@ -6096,6 +6097,32 @@ static inline void dp_print_peer_stats(struct dp_peer *peer)
peer->stats.rx.non_amsdu_cnt);
}
/*
* dp_get_host_peer_stats()- function to print peer stats
* @pdev_handle: DP_PDEV handle
* @mac_addr: mac address of the peer
*
* Return: void
*/
static void
dp_get_host_peer_stats(struct cdp_pdev *pdev_handle, char *mac_addr)
{
struct dp_peer *peer;
uint8_t local_id;
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, dp_rx_tid_stats_cb, NULL);
}
/**
* dp_print_host_stats()- Function to print the stats aggregated at host
* @vdev_handle: DP_VDEV handle
@ -6113,10 +6140,13 @@ static inline void dp_print_peer_stats(struct dp_peer *peer)
* Return: 0 on success, print error message in case of failure
*/
static int
dp_print_host_stats(struct cdp_vdev *vdev_handle, enum cdp_host_txrx_stats type)
dp_print_host_stats(struct cdp_vdev *vdev_handle,
struct cdp_txrx_stats_req *req)
{
struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
enum cdp_host_txrx_stats type =
dp_stats_mapping_table[req->stats][STATS_HOST];
dp_aggregate_pdev_stats(pdev);
@ -6148,6 +6178,9 @@ dp_print_host_stats(struct cdp_vdev *vdev_handle, enum cdp_host_txrx_stats type)
case TXRX_RX_MON_STATS:
dp_print_pdev_rx_mon_stats(pdev);
break;
case TXRX_REO_QUEUE_STATS:
dp_get_host_peer_stats((struct cdp_pdev *)pdev, req->peer_addr);
break;
default:
DP_TRACE(FATAL, "Wrong Input For TxRx Host Stats");
break;
@ -6155,32 +6188,6 @@ dp_print_host_stats(struct cdp_vdev *vdev_handle, enum cdp_host_txrx_stats type)
return 0;
}
/*
* dp_get_host_peer_stats()- function to print peer stats
* @pdev_handle: DP_PDEV handle
* @mac_addr: mac address of the peer
*
* Return: void
*/
static void
dp_get_host_peer_stats(struct cdp_pdev *pdev_handle, char *mac_addr)
{
struct dp_peer *peer;
uint8_t local_id;
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, dp_rx_tid_stats_cb, NULL);
return;
}
/*
* dp_ppdu_ring_reset()- Reset PPDU Stats ring
* @pdev: DP_PDEV handle
@ -6751,7 +6758,7 @@ static int dp_txrx_stats_request(struct cdp_vdev *vdev,
if ((host_stats != TXRX_HOST_STATS_INVALID) &&
(host_stats <= TXRX_HOST_STATS_MAX))
return dp_print_host_stats(vdev, host_stats);
return dp_print_host_stats(vdev, req);
else
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
"Wrong Input for TxRx Stats");