From 1baadae237e55d63e9583d5a0a819ca7895256d9 Mon Sep 17 00:00:00 2001 From: Manikandan Mohan Date: Fri, 23 Aug 2019 08:32:56 -0700 Subject: [PATCH] qcacld-3.0: Add support for WMI over QMI Add support for WMI over QMI to reduce power consumption for periodic stats report. Change-Id: Iec725b357d9bcfa33029aedf7c568814499bc130 CRs-fixed: 2521826 --- Kbuild | 1 + configs/default_defconfig | 3 +++ core/cds/src/cds_api.c | 19 +++++++++++++++++++ core/hdd/src/wlan_hdd_stats.c | 17 +++++++++++------ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Kbuild b/Kbuild index d29faaff171e..bb28df17fd5e 100644 --- a/Kbuild +++ b/Kbuild @@ -2928,6 +2928,7 @@ ccflags-$(CONFIG_HASTINGS_BT_WAR) += -DHASTINGS_BT_WAR cppflags-$(CONFIG_SLUB_DEBUG_ON) += -DHIF_CONFIG_SLUB_DEBUG_ON ccflags-$(CONFIG_FOURTH_CONNECTION) += -DFEATURE_FOURTH_CONNECTION +ccflags-$(CONFIG_WMI_SEND_RECV_QMI) += -DWLAN_FEATURE_WMI_SEND_RECV_QMI KBUILD_CPPFLAGS += $(cppflags-y) diff --git a/configs/default_defconfig b/configs/default_defconfig index 0f5946f049ae..514e81fa590b 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -848,7 +848,10 @@ ifeq ($(CONFIG_LITHIUM), y) CONFIG_WLAN_FEATURE_DP_EVENT_HISTORY := y endif CONFIG_WLAN_DP_PER_RING_TYPE_CONFIG := y + #Enable WMI TX/RX over QMI + CONFIG_WMI_SEND_RECV_QMI := y endif + #Flag to enable hdd memory dump feature CONFIG_FEATURE_MEMDUMP_ENABLE := y diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c index bbe716bc617d..4b81af96a95a 100644 --- a/core/cds/src/cds_api.c +++ b/core/cds/src/cds_api.c @@ -193,6 +193,23 @@ static bool cds_is_drv_connected(void) return ((ret > 0) ? true : false); } +static QDF_STATUS cds_wmi_send_recv_qmi(void *buf, uint32_t len, void * cb_ctx, + qdf_wmi_recv_qmi_cb wmi_rx_cb) +{ + qdf_device_t qdf_ctx; + + qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); + if (!qdf_ctx) { + cds_err("cds context is invalid"); + return QDF_STATUS_E_INVAL; + } + + if (pld_qmi_send(qdf_ctx->dev, 0, buf, len, cb_ctx, wmi_rx_cb)) + return QDF_STATUS_E_INVAL; + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS cds_init(void) { QDF_STATUS status; @@ -213,6 +230,7 @@ QDF_STATUS cds_init(void) qdf_register_fw_down_callback(cds_is_fw_down); qdf_register_recovering_state_query_callback(cds_is_driver_recovering); qdf_register_drv_connected_callback(cds_is_drv_connected); + qdf_register_wmi_send_recv_qmi_callback(cds_wmi_send_recv_qmi); return QDF_STATUS_SUCCESS; @@ -237,6 +255,7 @@ void cds_deinit(void) qdf_register_recovering_state_query_callback(NULL); qdf_register_fw_down_callback(NULL); qdf_register_self_recovery_callback(NULL); + qdf_register_wmi_send_recv_qmi_callback(NULL); gp_cds_context->qdf_ctx = NULL; qdf_mem_zero(&g_qdf_ctx, sizeof(g_qdf_ctx)); diff --git a/core/hdd/src/wlan_hdd_stats.c b/core/hdd/src/wlan_hdd_stats.c index e2417c214c41..4424e7e4a532 100644 --- a/core/hdd/src/wlan_hdd_stats.c +++ b/core/hdd/src/wlan_hdd_stats.c @@ -1550,13 +1550,21 @@ int wlan_hdd_cfg80211_ll_stats_get(struct wiphy *wiphy, { struct osif_vdev_sync *vdev_sync; int errno; + qdf_device_t qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); errno = osif_vdev_sync_op_start(wdev->netdev, &vdev_sync); if (errno) return errno; + errno = pld_qmi_send_get(qdf_ctx->dev); + if (errno) + goto end; + errno = __wlan_hdd_cfg80211_ll_stats_get(wiphy, wdev, data, data_len); + pld_qmi_send_put(qdf_ctx->dev); + +end: osif_vdev_sync_op_stop(vdev_sync); return errno; @@ -4673,23 +4681,20 @@ static int _wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, struct station_info *sinfo) { struct hdd_context *hdd_ctx = wiphy_priv(wiphy); - void *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF); + qdf_device_t qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); int errno; errno = wlan_hdd_validate_context(hdd_ctx); if (errno) return errno; - errno = hif_pm_runtime_get_sync(hif_ctx); + errno = pld_qmi_send_get(qdf_ctx->dev); if (errno) return errno; errno = __wlan_hdd_cfg80211_get_station(wiphy, dev, mac, sinfo); - if (wlan_hdd_rx_rpm_mark_last_busy(hdd_ctx, hif_ctx)) - hif_pm_runtime_put(hif_ctx); - else - hif_pm_runtime_put_sync_suspend(hif_ctx); + pld_qmi_send_put(qdf_ctx->dev); return errno; }