qcacmn: Add support for data path ring stats
Add feature to obtain position of head and tail pointer of all rings. Change code to include 'iwpriv athx txrx_stats 263' that gives the entries pointed to by head and tail pointer. Change-Id: Ib125db8982362c50a415058fd29f07f326991a50 CRs-fixed: 2098806
This commit is contained in:

zatwierdzone przez
snandini

rodzic
c70ccac86e
commit
72b1c7195f
@@ -145,6 +145,7 @@ enum htt_cmn_dbg_stats_type {
|
|||||||
* @TXRX_TX_HOST_STATS: Print Tx stats
|
* @TXRX_TX_HOST_STATS: Print Tx stats
|
||||||
* @TXRX_RX_HOST_STATS: Print host Rx stats
|
* @TXRX_RX_HOST_STATS: Print host Rx stats
|
||||||
* @TXRX_CLEAR_STATS: clear all host stats
|
* @TXRX_CLEAR_STATS: clear all host stats
|
||||||
|
* @TXRX_SRNG_PTR_STATS: Print SRNG pointer stats
|
||||||
*/
|
*/
|
||||||
enum cdp_host_txrx_stats {
|
enum cdp_host_txrx_stats {
|
||||||
TXRX_HOST_STATS_INVALID = -1,
|
TXRX_HOST_STATS_INVALID = -1,
|
||||||
@@ -154,6 +155,7 @@ enum cdp_host_txrx_stats {
|
|||||||
TXRX_TX_HOST_STATS = 3,
|
TXRX_TX_HOST_STATS = 3,
|
||||||
TXRX_RX_HOST_STATS = 4,
|
TXRX_RX_HOST_STATS = 4,
|
||||||
TXRX_AST_STATS = 5,
|
TXRX_AST_STATS = 5,
|
||||||
|
TXRX_SRNG_PTR_STATS = 6,
|
||||||
TXRX_HOST_STATS_MAX,
|
TXRX_HOST_STATS_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -74,6 +74,7 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc)
|
|||||||
bool rx_hash = 1;
|
bool rx_hash = 1;
|
||||||
qdf_declare_param(rx_hash, bool);
|
qdf_declare_param(rx_hash, bool);
|
||||||
|
|
||||||
|
#define STR_MAXLEN 64
|
||||||
/**
|
/**
|
||||||
* default_dscp_tid_map - Default DSCP-TID mapping
|
* default_dscp_tid_map - Default DSCP-TID mapping
|
||||||
*
|
*
|
||||||
@@ -260,6 +261,7 @@ const int dp_stats_mapping_table[][STATS_TYPE_MAX] = {
|
|||||||
{TXRX_FW_STATS_INVALID, TXRX_TX_HOST_STATS},
|
{TXRX_FW_STATS_INVALID, TXRX_TX_HOST_STATS},
|
||||||
{TXRX_FW_STATS_INVALID, TXRX_RX_HOST_STATS},
|
{TXRX_FW_STATS_INVALID, TXRX_RX_HOST_STATS},
|
||||||
{TXRX_FW_STATS_INVALID, TXRX_AST_STATS},
|
{TXRX_FW_STATS_INVALID, TXRX_AST_STATS},
|
||||||
|
{TXRX_FW_STATS_INVALID, TXRX_SRNG_PTR_STATS},
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -4082,6 +4084,116 @@ dp_print_soc_rx_stats(struct dp_soc *soc)
|
|||||||
reo_error);
|
reo_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_print_ring_stat_from_hal(): Print hal level ring stats
|
||||||
|
* @soc: DP_SOC handle
|
||||||
|
* @srng: DP_SRNG handle
|
||||||
|
* @ring_name: SRNG name
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng,
|
||||||
|
char *ring_name)
|
||||||
|
{
|
||||||
|
uint32_t tailp;
|
||||||
|
uint32_t headp;
|
||||||
|
|
||||||
|
if (srng->hal_srng != NULL) {
|
||||||
|
hal_api_get_tphp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
|
||||||
|
DP_PRINT_STATS("%s : Head pointer = %d Tail Pointer = %d\n",
|
||||||
|
ring_name, headp, tailp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_print_ring_stats(): Print tail and head pointer
|
||||||
|
* @pdev: DP_PDEV handle
|
||||||
|
*
|
||||||
|
* Return:void
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
dp_print_ring_stats(struct dp_pdev *pdev)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
char ring_name[STR_MAXLEN + 1];
|
||||||
|
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->reo_exception_ring,
|
||||||
|
"Reo Exception Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->reo_reinject_ring,
|
||||||
|
"Reo Inject Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->reo_cmd_ring,
|
||||||
|
"Reo Command Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->reo_status_ring,
|
||||||
|
"Reo Status Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->rx_rel_ring,
|
||||||
|
"Rx Release ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->tcl_cmd_ring,
|
||||||
|
"Tcl command Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->tcl_status_ring,
|
||||||
|
"Tcl Status Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->wbm_desc_rel_ring,
|
||||||
|
"Wbm Desc Rel Ring");
|
||||||
|
for (i = 0; i < MAX_REO_DEST_RINGS; i++) {
|
||||||
|
snprintf(ring_name, STR_MAXLEN, "Reo Dest Ring %d", i);
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->reo_dest_ring[i],
|
||||||
|
ring_name);
|
||||||
|
}
|
||||||
|
for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) {
|
||||||
|
snprintf(ring_name, STR_MAXLEN, "Tcl Data Ring %d", i);
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->tcl_data_ring[i],
|
||||||
|
ring_name);
|
||||||
|
}
|
||||||
|
for (i = 0; i < MAX_TCL_DATA_RINGS; i++) {
|
||||||
|
snprintf(ring_name, STR_MAXLEN, "Tx Comp Ring %d", i);
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->soc->tx_comp_ring[i],
|
||||||
|
ring_name);
|
||||||
|
}
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->rx_refill_buf_ring,
|
||||||
|
"Rx Refill Buf Ring");
|
||||||
|
|
||||||
|
#ifdef IPA_OFFLOAD
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->ipa_rx_refill_buf_ring,
|
||||||
|
"IPA Rx Refill Buf Ring");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->rxdma_mon_buf_ring,
|
||||||
|
"Rxdma Mon Buf Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->rxdma_mon_dst_ring,
|
||||||
|
"Rxdma Mon Dst Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->rxdma_mon_status_ring,
|
||||||
|
"Rxdma Mon Status Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->rxdma_mon_desc_ring,
|
||||||
|
"Rxdma mon desc Ring");
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->rxdma_err_dst_ring,
|
||||||
|
"Rxdma err dst ring");
|
||||||
|
for (i = 0; i < MAX_RX_MAC_RINGS; i++) {
|
||||||
|
snprintf(ring_name, STR_MAXLEN, "Rx mac buf ring %d", i);
|
||||||
|
dp_print_ring_stat_from_hal(pdev->soc,
|
||||||
|
&pdev->rx_mac_buf_ring[i],
|
||||||
|
ring_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dp_txrx_host_stats_clr(): Reinitialize the txrx stats
|
* dp_txrx_host_stats_clr(): Reinitialize the txrx stats
|
||||||
* @vdev: DP_VDEV handle
|
* @vdev: DP_VDEV handle
|
||||||
@@ -4418,6 +4530,7 @@ static inline void dp_print_peer_stats(struct dp_peer *peer)
|
|||||||
* TXRX_TX_HOST_STATS: Print Tx Stats
|
* TXRX_TX_HOST_STATS: Print Tx Stats
|
||||||
* TXRX_RX_HOST_STATS: Print Rx Stats
|
* TXRX_RX_HOST_STATS: Print Rx Stats
|
||||||
* TXRX_AST_STATS: Print AST Stats
|
* TXRX_AST_STATS: Print AST Stats
|
||||||
|
* TXRX_SRNG_PTR_STATS: Print SRNG ring pointer stats
|
||||||
*
|
*
|
||||||
* Return: 0 on success, print error message in case of failure
|
* Return: 0 on success, print error message in case of failure
|
||||||
*/
|
*/
|
||||||
@@ -4450,6 +4563,9 @@ dp_print_host_stats(struct cdp_vdev *vdev_handle, enum cdp_host_txrx_stats type)
|
|||||||
case TXRX_AST_STATS:
|
case TXRX_AST_STATS:
|
||||||
dp_print_ast_stats(pdev->soc);
|
dp_print_ast_stats(pdev->soc);
|
||||||
break;
|
break;
|
||||||
|
case TXRX_SRNG_PTR_STATS:
|
||||||
|
dp_print_ring_stats(pdev);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
DP_TRACE(FATAL, "Wrong Input For TxRx Host Stats");
|
DP_TRACE(FATAL, "Wrong Input For TxRx Host Stats");
|
||||||
break;
|
break;
|
||||||
|
@@ -570,6 +570,30 @@ static inline uint32_t hal_srng_src_done_val(void *hal_soc, void *hal_ring)
|
|||||||
return ((srng->ring_size - next_reap_hp) +
|
return ((srng->ring_size - next_reap_hp) +
|
||||||
srng->u.src_ring.cached_tp) / srng->entry_size;
|
srng->u.src_ring.cached_tp) / srng->entry_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hal_api_get_tphp - Get head and tail pointer location for any ring
|
||||||
|
* @hal_soc: Opaque HAL SOC handle
|
||||||
|
* @hal_ring: Source ring pointer
|
||||||
|
* @tailp: Tail Pointer
|
||||||
|
* @headp: Head Pointer
|
||||||
|
*
|
||||||
|
* Return: Update tail pointer and head pointer in arguments.
|
||||||
|
*/
|
||||||
|
static inline void hal_api_get_tphp(void *hal_soc, void *hal_ring,
|
||||||
|
uint32_t *tailp, uint32_t *headp)
|
||||||
|
{
|
||||||
|
struct hal_srng *srng = (struct hal_srng *)hal_ring;
|
||||||
|
|
||||||
|
if (srng->ring_dir == HAL_SRNG_SRC_RING) {
|
||||||
|
*headp = srng->u.src_ring.hp / srng->entry_size;
|
||||||
|
*tailp = *(srng->u.src_ring.tp_addr) / srng->entry_size;
|
||||||
|
} else {
|
||||||
|
*tailp = srng->u.dst_ring.tp / srng->entry_size;
|
||||||
|
*headp = *(srng->u.dst_ring.hp_addr) / srng->entry_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hal_srng_src_get_next - Get next entry from a source ring and move cached tail pointer
|
* hal_srng_src_get_next - Get next entry from a source ring and move cached tail pointer
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user