From b29bc2ad437ea1f7554e8dd62db32e9d7ca4e134 Mon Sep 17 00:00:00 2001 From: Sarada Prasanna Garnayak <sgarna@codeaurora.org> Date: Sat, 27 Feb 2016 19:42:35 +0530 Subject: [PATCH] net: cnss: add PM QoS support for dual WiFi PM QoS adds support to improve the wlan throughput. The cnss platform driver export PM QoS API to wlan host driver. Refactor PM QoS wrapper APIs to avoid the name space collision in cnss platform driver compilation in dual WiFi mode. CRs-Fixed: 983653 Change-Id: Id7a486f2f111476e73d5707eba36611a3530e9cf Signed-off-by: Sarada Prasanna Garnayak <sgarna@codeaurora.org> --- drivers/net/wireless/cnss/cnss_pci.c | 66 +++++++++++++++++++++++++++ drivers/net/wireless/cnss/cnss_sdio.c | 38 +++++++++++++++ include/net/cnss.h | 11 +++++ 3 files changed, 115 insertions(+) diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index 00d3f2a1fd3f..2e01ae9528f2 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -2810,6 +2810,72 @@ void cnss_remove_pm_qos(void) } EXPORT_SYMBOL(cnss_remove_pm_qos); +void cnss_pci_request_pm_qos_type(int latency_type, u32 qos_val) +{ + if (!penv) { + pr_err("%s: penv is NULL\n", __func__); + return; + } + + pm_qos_add_request(&penv->qos_request, latency_type, qos_val); +} +EXPORT_SYMBOL(cnss_pci_request_pm_qos_type); + +void cnss_pci_request_pm_qos(u32 qos_val) +{ + if (!penv) { + pr_err("%s: penv is NULL\n", __func__); + return; + } + + pm_qos_add_request(&penv->qos_request, PM_QOS_CPU_DMA_LATENCY, qos_val); +} +EXPORT_SYMBOL(cnss_pci_request_pm_qos); + +void cnss_pci_remove_pm_qos(void) +{ + if (!penv) { + pr_err("%s: penv is NULL\n", __func__); + return; + } + + pm_qos_remove_request(&penv->qos_request); +} +EXPORT_SYMBOL(cnss_pci_remove_pm_qos); + +int cnss_pci_request_bus_bandwidth(int bandwidth) +{ + int ret = 0; + + if (!penv) + return -ENODEV; + + if (!penv->bus_client) + return -ENOSYS; + + switch (bandwidth) { + case CNSS_BUS_WIDTH_NONE: + case CNSS_BUS_WIDTH_LOW: + case CNSS_BUS_WIDTH_MEDIUM: + case CNSS_BUS_WIDTH_HIGH: + ret = msm_bus_scale_client_update_request( + penv->bus_client, bandwidth); + if (!ret) { + penv->current_bandwidth_vote = bandwidth; + } else { + pr_err("%s: could not set bus bandwidth %d, ret = %d\n", + __func__, bandwidth, ret); + } + break; + + default: + pr_err("%s: Invalid request %d", __func__, bandwidth); + ret = -EINVAL; + } + return ret; +} +EXPORT_SYMBOL(cnss_pci_request_bus_bandwidth); + int cnss_request_bus_bandwidth(int bandwidth) { int ret = 0; diff --git a/drivers/net/wireless/cnss/cnss_sdio.c b/drivers/net/wireless/cnss/cnss_sdio.c index baf81d851688..7cdd2a033caf 100644 --- a/drivers/net/wireless/cnss/cnss_sdio.c +++ b/drivers/net/wireless/cnss/cnss_sdio.c @@ -125,6 +125,44 @@ static const struct sdio_device_id ar6k_id_table[] = { }; MODULE_DEVICE_TABLE(sdio, ar6k_id_table); +void cnss_sdio_request_pm_qos_type(int latency_type, u32 qos_val) +{ + if (!cnss_pdata) + return; + + pr_debug("%s: PM QoS value: %d\n", __func__, qos_val); + pm_qos_add_request(&cnss_pdata->qos_request, latency_type, qos_val); +} +EXPORT_SYMBOL(cnss_sdio_request_pm_qos_type); + +int cnss_sdio_request_bus_bandwidth(int bandwidth) +{ + return 0; +} +EXPORT_SYMBOL(cnss_sdio_request_bus_bandwidth); + +void cnss_sdio_request_pm_qos(u32 qos_val) +{ + if (!cnss_pdata) + return; + + pr_debug("%s: PM QoS value: %d\n", __func__, qos_val); + pm_qos_add_request( + &cnss_pdata->qos_request, + PM_QOS_CPU_DMA_LATENCY, qos_val); +} +EXPORT_SYMBOL(cnss_sdio_request_pm_qos); + +void cnss_sdio_remove_pm_qos(void) +{ + if (!cnss_pdata) + return; + + pm_qos_remove_request(&cnss_pdata->qos_request); + pr_debug("%s: PM QoS removed\n", __func__); +} +EXPORT_SYMBOL(cnss_sdio_remove_pm_qos); + int cnss_request_bus_bandwidth(int bandwidth) { return 0; diff --git a/include/net/cnss.h b/include/net/cnss.h index cfda3cdfa128..71b8d9a27f46 100644 --- a/include/net/cnss.h +++ b/include/net/cnss.h @@ -122,6 +122,8 @@ extern void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver); extern int cnss_get_fw_files(struct cnss_fw_files *pfw_files); extern int cnss_get_fw_files_for_target(struct cnss_fw_files *pfw_files, u32 target_type, u32 target_version); +extern int cnss_pci_request_bus_bandwidth(int bandwidth); +extern int cnss_sdio_request_bus_bandwidth(int bandwidth); extern int cnss_request_bus_bandwidth(int bandwidth); extern int cnss_get_sha_hash(const u8 *data, u32 data_len, @@ -140,6 +142,15 @@ extern void cnss_release_pm_sem(void); extern void cnss_request_pm_qos_type(int latency_type, u32 qos_val); extern void cnss_request_pm_qos(u32 qos_val); extern void cnss_remove_pm_qos(void); + +extern void cnss_pci_request_pm_qos_type(int latency_type, u32 qos_val); +extern void cnss_pci_request_pm_qos(u32 qos_val); +extern void cnss_pci_remove_pm_qos(void); + +extern void cnss_sdio_request_pm_qos_type(int latency_type, u32 qos_val); +extern void cnss_sdio_request_pm_qos(u32 qos_val); +extern void cnss_sdio_remove_pm_qos(void); + extern int cnss_get_platform_cap(struct cnss_platform_cap *cap); extern void cnss_set_driver_status(enum cnss_driver_status driver_status);