From 443b9b4da256ba37e36895c5c9cf8719f5339fa1 Mon Sep 17 00:00:00 2001 From: Venkata Sharath Chandra Manchala Date: Wed, 10 Oct 2018 12:04:54 -0700 Subject: [PATCH] qcacmn: Print HP/TP Stats Extend txrx_stats to print current HP/TP Status for UMAC rings. Change-Id: I50332f7507fdf1841dee51f0b1e97ef4ea68f04f CRs-Fixed: 2332191 --- dp/wifi3.0/dp_main.c | 165 ++++++++++++------ dp/wifi3.0/dp_rx_mon_status.c | 4 +- hal/wifi3.0/hal_api.h | 59 ++++++- hal/wifi3.0/hal_generic_api.h | 41 +++++ hal/wifi3.0/hal_hw_headers.h | 3 + hal/wifi3.0/hal_internal.h | 3 + hal/wifi3.0/qca6290/hal_6290.c | 1 + hal/wifi3.0/qca6390/hal_6390.c | 1 + hal/wifi3.0/qca8074v1/hal_8074v1.c | 1 + hal/wifi3.0/qca8074v2/hal_8074v2.c | 1 + qdf/inc/qdf_types.h | 2 + qdf/linux/src/qdf_trace.c | 2 + .../src/target_if_direct_buf_rx_main.c | 2 +- 13 files changed, 221 insertions(+), 64 deletions(-) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index af5bee5e24..737a327530 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5977,27 +5977,88 @@ dp_print_soc_rx_stats(struct dp_soc *soc) reo_error); } +/** + * dp_srng_get_str_from_ring_type() - Return string name for a ring + * @ring_type: Ring + * + * Return: char const pointer + */ +static inline const +char *dp_srng_get_str_from_hal_ring_type(enum hal_ring_type ring_type) +{ + switch (ring_type) { + case REO_DST: + return "Reo_dst"; + case REO_EXCEPTION: + return "Reo_exception"; + case REO_CMD: + return "Reo_cmd"; + case REO_REINJECT: + return "Reo_reinject"; + case REO_STATUS: + return "Reo_status"; + case WBM2SW_RELEASE: + return "wbm2sw_release"; + case TCL_DATA: + return "tcl_data"; + case TCL_CMD: + return "tcl_cmd"; + case TCL_STATUS: + return "tcl_status"; + case SW2WBM_RELEASE: + return "sw2wbm_release"; + case RXDMA_BUF: + return "Rxdma_buf"; + case RXDMA_DST: + return "Rxdma_dst"; + case RXDMA_MONITOR_BUF: + return "Rxdma_monitor_buf"; + case RXDMA_MONITOR_DESC: + return "Rxdma_monitor_desc"; + case RXDMA_MONITOR_STATUS: + return "Rxdma_monitor_status"; + default: + dp_err("Invalid ring type"); + break; + } + return "Invalid"; +} /** * dp_print_ring_stat_from_hal(): Print hal level ring stats * @soc: DP_SOC handle * @srng: DP_SRNG handle * @ring_name: SRNG name + * @ring_type: srng src/dst ring * * Return: void */ static void dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, - char *ring_name) + enum hal_ring_type ring_type) { uint32_t tailp; uint32_t headp; + int32_t hw_headp = -1; + int32_t hw_tailp = -1; + const char *ring_name; + struct hal_soc *hal_soc = (struct hal_soc *)soc->hal_soc; if (soc && srng && srng->hal_srng) { - hal_api_get_tphp(soc->hal_soc, srng->hal_srng, &tailp, &headp); - DP_PRINT_STATS("%s : Head pointer = %d Tail Pointer = %d", + ring_name = dp_srng_get_str_from_hal_ring_type(ring_type); + + hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp); + + DP_PRINT_STATS("%s:SW:Head pointer = %d Tail Pointer = %d\n", ring_name, headp, tailp); + + hal_get_hw_hptp(hal_soc, srng->hal_srng, &hw_headp, + &hw_tailp, ring_type); + + DP_PRINT_STATS("%s:HW:Head pointer = %d Tail Pointer = %d\n", + ring_name, hw_headp, hw_tailp); } + } /** @@ -6014,18 +6075,18 @@ void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id) if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { dp_print_ring_stat_from_hal(pdev->soc, &pdev->rxdma_mon_buf_ring[mac_id], - "Rxdma Mon Buf Ring"); + RXDMA_MONITOR_BUF); dp_print_ring_stat_from_hal(pdev->soc, &pdev->rxdma_mon_dst_ring[mac_id], - "Rxdma Mon Dst Ring"); + RXDMA_MONITOR_DST); dp_print_ring_stat_from_hal(pdev->soc, &pdev->rxdma_mon_desc_ring[mac_id], - "Rxdma mon desc Ring"); + RXDMA_MONITOR_DESC); } dp_print_ring_stat_from_hal(pdev->soc, &pdev->rxdma_mon_status_ring[mac_id], - "Rxdma Mon Status Ring"); + RXDMA_MONITOR_STATUS); } /** @@ -6038,77 +6099,67 @@ static inline void dp_print_ring_stats(struct dp_pdev *pdev) { uint32_t i; - char ring_name[STR_MAXLEN + 1]; int mac_id; dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->reo_exception_ring, - "Reo Exception Ring"); + &pdev->soc->reo_exception_ring, + REO_EXCEPTION); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->reo_reinject_ring, - "Reo Inject Ring"); + &pdev->soc->reo_reinject_ring, + REO_REINJECT); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->reo_cmd_ring, - "Reo Command Ring"); + &pdev->soc->reo_cmd_ring, + REO_CMD); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->reo_status_ring, - "Reo Status Ring"); + &pdev->soc->reo_status_ring, + REO_STATUS); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->rx_rel_ring, - "Rx Release ring"); + &pdev->soc->rx_rel_ring, + WBM2SW_RELEASE); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->tcl_cmd_ring, - "Tcl command Ring"); + &pdev->soc->tcl_cmd_ring, + TCL_CMD); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->tcl_status_ring, - "Tcl Status Ring"); + &pdev->soc->tcl_status_ring, + TCL_STATUS); 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); + &pdev->soc->wbm_desc_rel_ring, + SW2WBM_RELEASE); + for (i = 0; i < MAX_REO_DEST_RINGS; i++) dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->reo_dest_ring[i], - ring_name); - } + &pdev->soc->reo_dest_ring[i], + REO_DST); - for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) { - snprintf(ring_name, STR_MAXLEN, "Tcl Data Ring %d", i); + for (i = 0; i < pdev->soc->num_tcl_data_rings; 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); + &pdev->soc->tcl_data_ring[i], + TCL_DATA); + for (i = 0; i < MAX_TCL_DATA_RINGS; 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"); + &pdev->soc->tx_comp_ring[i], + WBM2SW_RELEASE); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->rx_refill_buf_ring2, - "Second Rx Refill Buf Ring"); + &pdev->rx_refill_buf_ring, + RXDMA_BUF); - for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rx_refill_buf_ring2, + RXDMA_BUF); + + for (i = 0; i < MAX_RX_MAC_RINGS; i++) + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rx_mac_buf_ring[i], + RXDMA_BUF); + + for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) dp_print_mon_ring_stat_from_hal(pdev, mac_id); - } - for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++) { - snprintf(ring_name, STR_MAXLEN, "Rxdma err dst ring %d", i); + for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++) dp_print_ring_stat_from_hal(pdev->soc, - &pdev->rxdma_err_dst_ring[i], - ring_name); - } + &pdev->rxdma_err_dst_ring[i], + RXDMA_DST); - 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); - } } /** diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 8215ff4c22..626aedb3ca 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -615,8 +615,8 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, uint32_t mac_id, if (status != QDF_STATUS_SUCCESS) { uint32_t hp, tp; - hal_api_get_tphp(hal_soc, mon_status_srng, - &tp, &hp); + hal_get_sw_hptp(hal_soc, mon_status_srng, + &tp, &hp); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "[%s][%d] status not done - hp:%u, tp:%u", diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index 86f8546097..d5427d6344 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -22,7 +22,6 @@ #include "qdf_types.h" #include "qdf_util.h" #include "hal_internal.h" - #define MAX_UNWINDOWED_ADDRESS 0x80000 #ifdef QCA_WIFI_QCA6390 #define WINDOW_ENABLE_BIT 0x40000000 @@ -178,6 +177,27 @@ static inline uint32_t hal_read32_mb(struct hal_soc *hal_soc, uint32_t offset) return ret; } + +/** + * hal_read_address_32_mb() - Read 32-bit value from the register + * @soc: soc handle + * @addr: register address to read + * + * Return: 32-bit value + */ +static inline uint32_t hal_read_address_32_mb(struct hal_soc *soc, + void __iomem *addr) +{ + uint32_t offset; + uint32_t ret; + + if (!soc->use_register_windowing) + return qdf_ioread32(addr); + + offset = addr - soc->dev_base_addr; + ret = hal_read32_mb(soc, offset); + return ret; +} #else static inline uint32_t hal_read32_mb(struct hal_soc *hal_soc, uint32_t offset) { @@ -208,6 +228,20 @@ static inline uint32_t hal_read32_mb(struct hal_soc *hal_soc, uint32_t offset) return ret; } + +static inline uint32_t hal_read_address_32_mb(struct hal_soc *soc, + void __iomem *addr) +{ + uint32_t offset; + uint32_t ret; + + if (!soc->use_register_windowing) + return qdf_ioread32(addr); + + offset = addr - soc->dev_base_addr; + ret = hal_read32_mb(soc, offset); + return ret; +} #endif #include "hif_io32.h" @@ -749,7 +783,7 @@ static inline uint32_t hal_srng_src_done_val(void *hal_soc, void *hal_ring) } /** - * hal_api_get_tphp - Get head and tail pointer location for any ring + * hal_get_sw_hptp - Get SW head and tail pointer location for any ring * @hal_soc: Opaque HAL SOC handle * @hal_ring: Source ring pointer * @tailp: Tail Pointer @@ -757,8 +791,8 @@ static inline uint32_t hal_srng_src_done_val(void *hal_soc, void *hal_ring) * * 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) +static inline void hal_get_sw_hptp(void *hal_soc, void *hal_ring, + uint32_t *tailp, uint32_t *headp) { struct hal_srng *srng = (struct hal_srng *)hal_ring; @@ -1242,6 +1276,23 @@ static inline void hal_srng_src_hw_init(struct hal_soc *hal, hal->ops->hal_srng_src_hw_init(hal, srng); } +/** + * hal_get_hw_hptp() - Get HW head and tail pointer value for any ring + * @hal_soc: Opaque HAL SOC handle + * @hal_ring: Source ring pointer + * @headp: Head Pointer + * @tailp: Tail Pointer + * @ring_type: Ring + * + * Return: Update tail pointer and head pointer in arguments. + */ +static inline void hal_get_hw_hptp(struct hal_soc *hal, void *hal_ring, + uint32_t *headp, uint32_t *tailp, + uint8_t ring_type) +{ + hal->ops->hal_get_hw_hptp(hal, hal_ring, headp, tailp, ring_type); +} + /** * hal_reo_setup - Initialize HW REO block * diff --git a/hal/wifi3.0/hal_generic_api.h b/hal/wifi3.0/hal_generic_api.h index dfa4e3f18d..084cfdc5d4 100644 --- a/hal/wifi3.0/hal_generic_api.h +++ b/hal/wifi3.0/hal_generic_api.h @@ -1381,6 +1381,47 @@ static void hal_reo_setup_generic(void *hal_soc, */ } +/** + * hal_get_hw_hptp_generic() - Get HW head and tail pointer value for any ring + * @hal_soc: Opaque HAL SOC handle + * @hal_ring: Source ring pointer + * @headp: Head Pointer + * @tailp: Tail Pointer + * @ring: Ring type + * + * Return: Update tail pointer and head pointer in arguments. + */ +static inline +void hal_get_hw_hptp_generic(struct hal_soc *soc, void *hal_ring, + uint32_t *headp, uint32_t *tailp, + uint8_t ring) +{ + struct hal_srng *srng = (struct hal_srng *)hal_ring; + struct hal_hw_srng_config *ring_config; + enum hal_ring_type ring_type = (enum hal_ring_type)ring; + + if (!soc || !srng) { + QDF_TRACE(QDF_MODULE_ID_HAL, QDF_TRACE_LEVEL_ERROR, + "%s: Context is Null", __func__); + return; + } + + ring_config = HAL_SRNG_CONFIG(soc, ring_type); + if (!ring_config->lmac_ring) { + if (srng->ring_dir == HAL_SRNG_SRC_RING) { + *headp = + (SRNG_SRC_REG_READ(srng, HP)) / srng->entry_size; + *tailp = + (SRNG_SRC_REG_READ(srng, TP)) / srng->entry_size; + } else { + *headp = + (SRNG_DST_REG_READ(srng, HP)) / srng->entry_size; + *tailp = + (SRNG_DST_REG_READ(srng, TP)) / srng->entry_size; + } + } +} + /** * hal_srng_src_hw_init - Private function to initialize SRNG * source ring HW diff --git a/hal/wifi3.0/hal_hw_headers.h b/hal/wifi3.0/hal_hw_headers.h index 5f516bd65f..7b37df30cc 100644 --- a/hal/wifi3.0/hal_hw_headers.h +++ b/hal/wifi3.0/hal_hw_headers.h @@ -239,6 +239,9 @@ #define SRNG_SRC_REG_READ(_srng, _reg) \ SRNG_REG_READ(_srng, _reg, SRC) +#define SRNG_DST_REG_READ(_srng, _reg) \ + SRNG_REG_READ(_srng, _reg, DST) + #define _SRNG_FM(_reg_fld) _reg_fld ## _BMSK #define _SRNG_FS(_reg_fld) _reg_fld ## _SHFT diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index ba0d1cdc16..91d5ee642a 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -275,6 +275,9 @@ struct hal_hw_txrx_ops { struct hal_srng *srng); void (*hal_srng_src_hw_init)(void *hal, struct hal_srng *srng); + void (*hal_get_hw_hptp)(struct hal_soc *hal, void *hal_ring, + uint32_t *headp, uint32_t *tailp, + uint8_t ring_type); void (*hal_reo_setup)(void *hal_soc, void *reoparams); void (*hal_setup_link_idle_list)(void *hal_soc, qdf_dma_addr_t scatter_bufs_base_paddr[], diff --git a/hal/wifi3.0/qca6290/hal_6290.c b/hal/wifi3.0/qca6290/hal_6290.c index 593820904e..94039c5409 100644 --- a/hal/wifi3.0/qca6290/hal_6290.c +++ b/hal/wifi3.0/qca6290/hal_6290.c @@ -112,6 +112,7 @@ struct hal_hw_txrx_ops qca6290_hal_hw_txrx_ops = { /* init and setup */ hal_srng_dst_hw_init_generic, hal_srng_src_hw_init_generic, + hal_get_hw_hptp_generic, hal_reo_setup_generic, hal_setup_link_idle_list_generic, diff --git a/hal/wifi3.0/qca6390/hal_6390.c b/hal/wifi3.0/qca6390/hal_6390.c index 080fe58abc..6f4295e4f8 100644 --- a/hal/wifi3.0/qca6390/hal_6390.c +++ b/hal/wifi3.0/qca6390/hal_6390.c @@ -112,6 +112,7 @@ struct hal_hw_txrx_ops qca6390_hal_hw_txrx_ops = { /* init and setup */ hal_srng_dst_hw_init_generic, hal_srng_src_hw_init_generic, + hal_get_hw_hptp_generic, hal_reo_setup_generic, hal_setup_link_idle_list_generic, diff --git a/hal/wifi3.0/qca8074v1/hal_8074v1.c b/hal/wifi3.0/qca8074v1/hal_8074v1.c index b762236a4f..5059d69997 100644 --- a/hal/wifi3.0/qca8074v1/hal_8074v1.c +++ b/hal/wifi3.0/qca8074v1/hal_8074v1.c @@ -108,6 +108,7 @@ struct hal_hw_txrx_ops qca8074_hal_hw_txrx_ops = { /* init and setup */ hal_srng_dst_hw_init_generic, hal_srng_src_hw_init_generic, + hal_get_hw_hptp_generic, hal_reo_setup_generic, hal_setup_link_idle_list_generic, diff --git a/hal/wifi3.0/qca8074v2/hal_8074v2.c b/hal/wifi3.0/qca8074v2/hal_8074v2.c index 8461b0ba77..9d46341b44 100644 --- a/hal/wifi3.0/qca8074v2/hal_8074v2.c +++ b/hal/wifi3.0/qca8074v2/hal_8074v2.c @@ -108,6 +108,7 @@ struct hal_hw_txrx_ops qca8074v2_hal_hw_txrx_ops = { /* init and setup */ hal_srng_dst_hw_init_generic, hal_srng_src_hw_init_generic, + hal_get_hw_hptp_generic, hal_reo_setup_generic, hal_setup_link_idle_list_generic, diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index fdc925d685..65e9193b72 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -332,6 +332,7 @@ typedef void (*qdf_timer_func_t)(void *); * @QDF_MODULE_ID_EPPING: EPPING module ID * @QDF_MODULE_ID_QVIT: QVIT module ID * @QDF_MODULE_ID_DP: Data-path module ID + * @QDF_MODULE_ID_HAL: Hal abstraction module ID * @QDF_MODULE_ID_SOC: SOC module ID * @QDF_MODULE_ID_OS_IF: OS-interface module ID * @QDF_MODULE_ID_TARGET_IF: targer interface module ID @@ -436,6 +437,7 @@ typedef enum { QDF_MODULE_ID_EPPING, QDF_MODULE_ID_QVIT, QDF_MODULE_ID_DP, + QDF_MODULE_ID_HAL, QDF_MODULE_ID_SOC, QDF_MODULE_ID_OS_IF, QDF_MODULE_ID_TARGET_IF, diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index fe543d26d8..586d473119 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -2806,6 +2806,7 @@ struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = { [QDF_MODULE_ID_EPPING] = {"EPPING"}, [QDF_MODULE_ID_QVIT] = {"QVIT"}, [QDF_MODULE_ID_DP] = {"DP"}, + [QDF_MODULE_ID_HAL] = {"HAL"}, [QDF_MODULE_ID_SOC] = {"SOC"}, [QDF_MODULE_ID_OS_IF] = {"OSIF"}, [QDF_MODULE_ID_TARGET_IF] = {"TIF"}, @@ -3258,6 +3259,7 @@ static void set_default_trace_levels(struct category_info *cinfo) [QDF_MODULE_ID_EPPING] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_QVIT] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_DP] = QDF_TRACE_LEVEL_FATAL, + [QDF_MODULE_ID_HAL] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_SOC] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_OS_IF] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_TARGET_IF] = QDF_TRACE_LEVEL_INFO, diff --git a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c index d3c64bffc4..e2dc3ccd35 100644 --- a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c +++ b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c @@ -1080,7 +1080,7 @@ QDF_STATUS target_if_direct_buf_rx_print_ring_stat( mod_param = &dbr_pdev_obj->dbr_mod_param[mod_idx]; dbr_ring_cfg = mod_param->dbr_ring_cfg; srng = dbr_ring_cfg->srng; - hal_api_get_tphp(hal_soc, srng, &tp, &hp); + hal_get_sw_hptp(hal_soc, srng, &tp, &hp); direct_buf_rx_err("|%11d|%14s|%10x|%10x|", mod_idx, g_dbr_module_name[mod_idx].module_name_str,