From 5c57a8905ee57aab8b10cde048801372f46cc3c0 Mon Sep 17 00:00:00 2001 From: "Poddar, Siddarth" Date: Mon, 4 Sep 2017 12:16:38 +0530 Subject: [PATCH] qcacmn: Add register/deregister data stall detect cb api Add register and deregister data stall detect callback apis. Change-Id: I59d5871b7ec03da4b4f69d87b14f7eb5e8606c4a CRs-Fixed: 2090654 --- dp/inc/cdp_txrx_cmn_struct.h | 78 +++++++++++++++++++ dp/inc/cdp_txrx_misc.h | 70 +++++++++++++++++ dp/inc/cdp_txrx_ops.h | 10 +++ scheduler/inc/scheduler_api.h | 2 +- .../host_diag_log/inc/host_diag_core_event.h | 18 +++++ 5 files changed, 177 insertions(+), 1 deletion(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index eac535290e..d214c7a121 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -565,6 +565,84 @@ enum cdp_vdev_param_type { #define PER_RADIO_FW_STATS_REQUEST 0 #define PER_VDEV_FW_STATS_REQUEST 1 +/** + * enum data_stall_log_event_indicator - Module triggering data stall + * @DATA_STALL_LOG_INDICATOR_UNUSED: Unused + * @DATA_STALL_LOG_INDICATOR_HOST_DRIVER: Host driver indicates data stall + * @DATA_STALL_LOG_INDICATOR_FIRMWARE: FW indicates data stall + * @DATA_STALL_LOG_INDICATOR_FRAMEWORK: Framework indicates data stall + * + * Enum indicating the module that indicates data stall event + */ +enum data_stall_log_event_indicator { + DATA_STALL_LOG_INDICATOR_UNUSED, + DATA_STALL_LOG_INDICATOR_HOST_DRIVER, + DATA_STALL_LOG_INDICATOR_FIRMWARE, + DATA_STALL_LOG_INDICATOR_FRAMEWORK, +}; + +/** + * enum data_stall_log_event_type - data stall event type + * @DATA_STALL_LOG_NONE + * @DATA_STALL_LOG_FW_VDEV_PAUSE + * @DATA_STALL_LOG_HWSCHED_CMD_FILTER + * @DATA_STALL_LOG_HWSCHED_CMD_FLUSH + * @DATA_STALL_LOG_FW_RX_REFILL_FAILED + * @DATA_STALL_LOG_FW_RX_FCS_LEN_ERROR + * @DATA_STALL_LOG_FW_WDOG_ERRORS + * @DATA_STALL_LOG_BB_WDOG_ERROR + * @DATA_STALL_LOG_HOST_STA_TX_TIMEOUT + * @DATA_STALL_LOG_HOST_SOFTAP_TX_TIMEOUT + * @DATA_STALL_LOG_NUD_FAILURE + * + * Enum indicating data stall event type + */ +enum data_stall_log_event_type { + DATA_STALL_LOG_NONE, + DATA_STALL_LOG_FW_VDEV_PAUSE, + DATA_STALL_LOG_HWSCHED_CMD_FILTER, + DATA_STALL_LOG_HWSCHED_CMD_FLUSH, + DATA_STALL_LOG_FW_RX_REFILL_FAILED, + DATA_STALL_LOG_FW_RX_FCS_LEN_ERROR, + DATA_STALL_LOG_FW_WDOG_ERRORS, + DATA_STALL_LOG_BB_WDOG_ERROR, + DATA_STALL_LOG_HOST_STA_TX_TIMEOUT, + DATA_STALL_LOG_HOST_SOFTAP_TX_TIMEOUT, + DATA_STALL_LOG_NUD_FAILURE, +}; + +/** + * enum data_stall_log_recovery_type - data stall recovery type + * @DATA_STALL_LOG_RECOVERY_NONE, + * @DATA_STALL_LOG_RECOVERY_CONNECT_DISCONNECT, + * @DATA_STALL_LOG_RECOVERY_TRIGGER_PDR + * + * Enum indicating data stall recovery type + */ +enum data_stall_log_recovery_type { + DATA_STALL_LOG_RECOVERY_NONE = 0, + DATA_STALL_LOG_RECOVERY_CONNECT_DISCONNECT, + DATA_STALL_LOG_RECOVERY_TRIGGER_PDR, +}; + +/** + * struct data_stall_event_info - data stall info + * @indicator: Module triggering data stall + * @data_stall_type: data stall event type + * @vdev_id_bitmap: vdev_id_bitmap + * @pdev_id: pdev id + * @recovery_type: data stall recovery type + */ +struct data_stall_event_info { + uint32_t indicator; + uint32_t data_stall_type; + uint32_t vdev_id_bitmap; + uint32_t pdev_id; + uint32_t recovery_type; +}; + +typedef void (*data_stall_detect_cb)(struct data_stall_event_info *); + /* * cdp_stats - options for host and firmware * statistics diff --git a/dp/inc/cdp_txrx_misc.h b/dp/inc/cdp_txrx_misc.h index 9894f76d0c..4ddd88507c 100644 --- a/dp/inc/cdp_txrx_misc.h +++ b/dp/inc/cdp_txrx_misc.h @@ -120,6 +120,76 @@ cdp_set_wisa_mode(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, bool enable) return QDF_STATUS_SUCCESS; } +/** + * cdp_data_stall_cb_register() - register data stall callback + * @soc - data path soc handle + * @cb - callback function + * + * Return: QDF_STATUS_SUCCESS register success + */ +static inline QDF_STATUS cdp_data_stall_cb_register(ol_txrx_soc_handle soc, + data_stall_detect_cb cb) +{ + if (!soc || !soc->ops || !soc->ops->misc_ops) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, + "%s invalid instance", __func__); + return QDF_STATUS_E_INVAL; + } + + if (soc->ops->misc_ops->txrx_data_stall_cb_register) + return soc->ops->misc_ops->txrx_data_stall_cb_register(cb); + return QDF_STATUS_SUCCESS; +} + +/** + * cdp_data_stall_cb_deregister() - de-register data stall callback + * @soc - data path soc handle + * @cb - callback function + * + * Return: QDF_STATUS_SUCCESS de-register success + */ +static inline QDF_STATUS cdp_data_stall_cb_deregister(ol_txrx_soc_handle soc, + data_stall_detect_cb cb) +{ + if (!soc || !soc->ops || !soc->ops->misc_ops) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, + "%s invalid instance", __func__); + return QDF_STATUS_E_INVAL; + } + + if (soc->ops->misc_ops->txrx_data_stall_cb_deregister) + return soc->ops->misc_ops->txrx_data_stall_cb_deregister(cb); + return QDF_STATUS_SUCCESS; +} + +/** + * cdp_post_data_stall_event() - post data stall event + * @soc - data path soc handle + * @indicator: Module triggering data stall + * @data_stall_type: data stall event type + * @pdev_id: pdev id + * @vdev_id_bitmap: vdev id bitmap + * @recovery_type: data stall recovery type + * + * Return: None + */ +static inline void +cdp_post_data_stall_event(ol_txrx_soc_handle soc, + enum data_stall_log_event_indicator indicator, + enum data_stall_log_event_type data_stall_type, + uint32_t pdev_id, uint32_t vdev_id_bitmap, + enum data_stall_log_recovery_type recovery_type) +{ + if (!soc || !soc->ops || !soc->ops->misc_ops) + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, + "%s invalid instance", __func__); + + if (soc->ops->misc_ops->txrx_post_data_stall_event) + soc->ops->misc_ops->txrx_post_data_stall_event( + indicator, data_stall_type, pdev_id, + vdev_id_bitmap, recovery_type); +} + /** * cdp_set_wmm_param() - set wmm parameter * @soc - data path soc handle diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 034cce3683..b028b19675 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -644,6 +644,9 @@ struct ol_if_ops { * @tx_non_std: * @get_vdev_id: * @set_wisa_mode: + * @txrx_data_stall_cb_register: + * @txrx_data_stall_cb_deregister: + * @txrx_post_data_stall_event * @runtime_suspend: * @runtime_resume: */ @@ -661,6 +664,13 @@ struct cdp_misc_ops { enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list); uint16_t (*get_vdev_id)(struct cdp_vdev *vdev); QDF_STATUS (*set_wisa_mode)(struct cdp_vdev *vdev, bool enable); + QDF_STATUS (*txrx_data_stall_cb_register)(data_stall_detect_cb cb); + QDF_STATUS (*txrx_data_stall_cb_deregister)(data_stall_detect_cb cb); + void (*txrx_post_data_stall_event)( + enum data_stall_log_event_indicator indicator, + enum data_stall_log_event_type data_stall_type, + uint32_t pdev_id, uint32_t vdev_id_bitmap, + enum data_stall_log_recovery_type recovery_type); QDF_STATUS (*runtime_suspend)(struct cdp_pdev *pdev); QDF_STATUS (*runtime_resume)(struct cdp_pdev *pdev); int (*get_opmode)(struct cdp_vdev *vdev); diff --git a/scheduler/inc/scheduler_api.h b/scheduler/inc/scheduler_api.h index 3e7afd0f9a..d7bc3a5f6b 100644 --- a/scheduler/inc/scheduler_api.h +++ b/scheduler/inc/scheduler_api.h @@ -54,7 +54,7 @@ typedef enum { SYS_MSG_ID_MC_TIMER, SYS_MSG_ID_FTM_RSP, SYS_MSG_ID_QVIT, - + SYS_MSG_ID_DATA_STALL_MSG, } SYS_MSG_ID; /** diff --git a/utils/host_diag_log/inc/host_diag_core_event.h b/utils/host_diag_log/inc/host_diag_core_event.h index d3406112c9..ddfa1c962e 100644 --- a/utils/host_diag_log/inc/host_diag_core_event.h +++ b/utils/host_diag_log/inc/host_diag_core_event.h @@ -394,14 +394,32 @@ enum host_sta_kickout_events { ------------------------------------------------------------------------*/ /** * enum host_datastall_events - Enum containing datastall subtype + * @DATA_STALL_NONE: Indicate no data stall + * @FW_VDEV_PAUSE: Indicate FW vdev Pause + * @HWSCHED_CMD_FILTER:Indicate HW sched command filter + * @HWSCHED_CMD_FLUSH: Indicate HW sched command flush + * @FW_RX_REFILL_FAILED:Indicate FW rx refill failed + * @FW_RX_FCS_LEN_ERROR:Indicate FW fcs len error + * @FW_WDOG_ERRORS:Indicate watchdog error + * @FW_BB_WDOG_ERROR:Indicate BB watchdog error * @STA_TX_TIMEOUT: Indicate sta tx timeout * @SOFTAP_TX_TIMEOUT:Indicate softap tx timeout + * @NUD_FAILURE: Indicare NUD Failure * * This enum contains the event subtype */ enum host_datastall_events { + DATA_STALL_NONE, + FW_VDEV_PAUSE, + HWSCHED_CMD_FILTER, + HWSCHED_CMD_FLUSH, + FW_RX_REFILL_FAILED, + FW_RX_FCS_LEN_ERROR, + FW_WDOG_ERRORS, + FW_BB_WDOG_ERROR, STA_TX_TIMEOUT, SOFTAP_TX_TIMEOUT, + NUD_FAILURE, }; /*-------------------------------------------------------------------------