From 939ca50cf200bcfb163729a28a5e4296e66ee114 Mon Sep 17 00:00:00 2001 From: Alok Kumar Date: Mon, 11 Nov 2019 11:34:37 +0530 Subject: [PATCH] qcacld-3.0: Update Datastall callbacks definition Update definitions for datastall callback which posts DataStall Events. Change-Id: I1aadb438afeafe1f13114b1472b2280f0f713db4 CRs-Fixed: 2563194 --- core/dp/txrx/ol_txrx.c | 39 +++++++--------- core/hdd/src/wlan_hdd_cfg80211.c | 5 +- core/hdd/src/wlan_hdd_data_stall_detection.c | 49 +++++++++++++++++++- 3 files changed, 67 insertions(+), 26 deletions(-) diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 63397e64ee7c..bf89ab6222f5 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -5318,9 +5318,7 @@ static void ol_txrx_post_data_stall_event( enum data_stall_log_recovery_type recovery_type) { struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl); - struct scheduler_msg msg = {0}; - QDF_STATUS status; - struct data_stall_event_info *data_stall_info; + struct data_stall_event_info data_stall_info; ol_txrx_pdev_handle pdev; if (qdf_unlikely(!soc)) { @@ -5335,32 +5333,27 @@ static void ol_txrx_post_data_stall_event( return; } - data_stall_info = qdf_mem_malloc(sizeof(*data_stall_info)); - if (!data_stall_info) + if (!pdev->data_stall_detect_callback) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: data stall cb not registered", __func__); return; + } - data_stall_info->indicator = indicator; - data_stall_info->data_stall_type = data_stall_type; - data_stall_info->vdev_id_bitmap = vdev_id_bitmap; - data_stall_info->pdev_id = pdev_id; - data_stall_info->recovery_type = recovery_type; + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, + "%s: data_stall_type: %x pdev_id: %d", + __func__, data_stall_type, pdev_id); - if (data_stall_info->data_stall_type == + data_stall_info.indicator = indicator; + data_stall_info.data_stall_type = data_stall_type; + data_stall_info.vdev_id_bitmap = vdev_id_bitmap; + data_stall_info.pdev_id = pdev_id; + data_stall_info.recovery_type = recovery_type; + + if (data_stall_info.data_stall_type == DATA_STALL_LOG_FW_RX_REFILL_FAILED) htt_log_rx_ring_info(pdev->htt_pdev); - sys_build_message_header(SYS_MSG_ID_DATA_STALL_MSG, &msg); - /* Save callback and data */ - msg.callback = pdev->data_stall_detect_callback; - msg.bodyptr = data_stall_info; - msg.bodyval = 0; - - status = scheduler_post_message(QDF_MODULE_ID_TXRX, - QDF_MODULE_ID_HDD, - QDF_MODULE_ID_SYS, &msg); - - if (status != QDF_STATUS_SUCCESS) - qdf_mem_free(data_stall_info); + pdev->data_stall_detect_callback(&data_stall_info); } void diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index fca44a0d735a..f875e52dad3a 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -13275,12 +13275,15 @@ static int __wlan_hdd_cfg80211_get_nud_stats(struct wiphy *wiphy, /* send NUD failure event only when ARP tracking is enabled. */ if (cdp_cfg_get(soc, cfg_dp_enable_data_stall) && - (pkt_type_bitmap & CONNECTIVITY_CHECK_SET_ARP)) + (pkt_type_bitmap & CONNECTIVITY_CHECK_SET_ARP)) { + QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_ERROR, + "Data stall due to NUD failure"); cdp_post_data_stall_event(soc, DATA_STALL_LOG_INDICATOR_FRAMEWORK, DATA_STALL_LOG_NUD_FAILURE, OL_TXRX_PDEV_ID, 0XFF, DATA_STALL_LOG_RECOVERY_TRIGGER_PDR); + } mac_handle = hdd_ctx->mac_handle; if (sme_set_nud_debug_stats_cb(mac_handle, hdd_get_nud_stats_cb, diff --git a/core/hdd/src/wlan_hdd_data_stall_detection.c b/core/hdd/src/wlan_hdd_data_stall_detection.c index 46c05ebb1957..195468a8d9ad 100644 --- a/core/hdd/src/wlan_hdd_data_stall_detection.c +++ b/core/hdd/src/wlan_hdd_data_stall_detection.c @@ -22,7 +22,10 @@ * WLAN Host Device Driver Data Stall detection API implementation */ +#include +#include #include "wlan_hdd_data_stall_detection.h" +#include "wlan_hdd_main.h" #include "cdp_txrx_cmn.h" #include "cdp_txrx_misc.h" #include "ol_txrx_types.h" @@ -47,6 +50,7 @@ static void hdd_data_stall_send_event(uint32_t reason) struct host_event_wlan_datastall); qdf_mem_zero(&sta_data_stall, sizeof(sta_data_stall)); sta_data_stall.reason = reason; + hdd_debug("Posting data stall event %x", reason); WLAN_HOST_DIAG_EVENT_REPORT(&sta_data_stall, EVENT_WLAN_STA_DATASTALL); } #else @@ -55,6 +59,20 @@ static inline void hdd_data_stall_send_event(uint32_t reason) } #endif +/** + * hdd_data_stall_process_event() - Process data stall event + * @message: data stall message + * + * Process data stall message + * + * Return: void + */ +static void hdd_data_stall_process_event( + struct data_stall_event_info *data_stall_info) +{ + hdd_data_stall_send_event(data_stall_info->data_stall_type); +} + /** * hdd_data_stall_process_cb() - Process data stall message * @message: data stall message @@ -64,9 +82,34 @@ static inline void hdd_data_stall_send_event(uint32_t reason) * Return: void */ static void hdd_data_stall_process_cb( - struct data_stall_event_info *data_stall_info) + struct data_stall_event_info *info) { - hdd_data_stall_send_event(data_stall_info->data_stall_type); + struct scheduler_msg msg = {0}; + struct data_stall_event_info *data_stall_event_info; + QDF_STATUS status; + + data_stall_event_info = qdf_mem_malloc(sizeof(*data_stall_event_info)); + if (!data_stall_event_info) + return; + + data_stall_event_info->data_stall_type = info->data_stall_type; + data_stall_event_info->indicator = info->indicator; + data_stall_event_info->pdev_id = info->pdev_id; + data_stall_event_info->recovery_type = info->recovery_type; + data_stall_event_info->vdev_id_bitmap = info->vdev_id_bitmap; + + sys_build_message_header(SYS_MSG_ID_DATA_STALL_MSG, &msg); + /* Save callback and data */ + msg.callback = hdd_data_stall_process_event; + msg.bodyptr = data_stall_event_info; + msg.bodyval = 0; + + status = scheduler_post_message(QDF_MODULE_ID_HDD, + QDF_MODULE_ID_HDD, + QDF_MODULE_ID_SYS, &msg); + + if (status != QDF_STATUS_SUCCESS) + qdf_mem_free(data_stall_event_info); } int hdd_register_data_stall_detect_cb(void) @@ -75,6 +118,7 @@ int hdd_register_data_stall_detect_cb(void) void *soc = cds_get_context(QDF_MODULE_ID_SOC); /* Register the data stall callback */ + hdd_debug("Register data stall detect callback"); status = cdp_data_stall_cb_register(soc, OL_TXRX_PDEV_ID, hdd_data_stall_process_cb); return qdf_status_to_os_return(status); @@ -86,6 +130,7 @@ int hdd_deregister_data_stall_detect_cb(void) void *soc = cds_get_context(QDF_MODULE_ID_SOC); /* De-Register the data stall callback */ + hdd_debug("De-Register data stall detect callback"); status = cdp_data_stall_cb_deregister(soc, OL_TXRX_PDEV_ID, hdd_data_stall_process_cb); return qdf_status_to_os_return(status);