From ec50aa017963816a52645dd529dcc89858f65f3c Mon Sep 17 00:00:00 2001 From: Sarada Prasanna Garnayak Date: Thu, 25 Feb 2016 20:48:22 +0530 Subject: [PATCH] net: cnss: add unsafe channel list support for dual WiFi Store WiFi unsafe Channel list and return to wlan host driver on query. It adds support WiFi unsafe Channel list for LTE-WiFi coexistence. This export symbol supported by both SDIO and PCIe platform driver. So add this API as a common API for both SDIO and PCIe interface based wlan module and remove the duplicate API from the SDIO and PCIe platform driver. CRs-Fixed: 983607 Change-Id: I1698df3fb689ef17294e00032adde5ae635e76de Signed-off-by: Sarada Prasanna Garnayak --- drivers/net/wireless/cnss/cnss_common.c | 59 +++++++++++++++++++++++++ drivers/net/wireless/cnss/cnss_pci.c | 40 ----------------- drivers/net/wireless/cnss/cnss_sdio.c | 52 ---------------------- 3 files changed, 59 insertions(+), 92 deletions(-) diff --git a/drivers/net/wireless/cnss/cnss_common.c b/drivers/net/wireless/cnss/cnss_common.c index 346ac07f6db5..0bad2d256870 100644 --- a/drivers/net/wireless/cnss/cnss_common.c +++ b/drivers/net/wireless/cnss/cnss_common.c @@ -18,10 +18,69 @@ #include #include #include +#include #include #include #include +static DEFINE_MUTEX(unsafe_channel_list_lock); + +static struct cnss_unsafe_channel_list { + u16 unsafe_ch_count; + u16 unsafe_ch_list[CNSS_MAX_CH_NUM]; +} unsafe_channel_list; + +int cnss_set_wlan_unsafe_channel(u16 *unsafe_ch_list, u16 ch_count) +{ + struct cnss_unsafe_channel_list *unsafe_list; + + mutex_lock(&unsafe_channel_list_lock); + if ((!unsafe_ch_list) || (!ch_count) || (ch_count > CNSS_MAX_CH_NUM)) { + mutex_unlock(&unsafe_channel_list_lock); + return -EINVAL; + } + + unsafe_list = &unsafe_channel_list; + unsafe_channel_list.unsafe_ch_count = ch_count; + + memcpy( + (char *)unsafe_list->unsafe_ch_list, + (char *)unsafe_ch_list, ch_count * sizeof(u16)); + mutex_unlock(&unsafe_channel_list_lock); + + return 0; +} +EXPORT_SYMBOL(cnss_set_wlan_unsafe_channel); + +int cnss_get_wlan_unsafe_channel( + u16 *unsafe_ch_list, + u16 *ch_count, u16 buf_len) +{ + struct cnss_unsafe_channel_list *unsafe_list; + + mutex_lock(&unsafe_channel_list_lock); + if (!unsafe_ch_list || !ch_count) { + mutex_unlock(&unsafe_channel_list_lock); + return -EINVAL; + } + + unsafe_list = &unsafe_channel_list; + if (buf_len < (unsafe_list->unsafe_ch_count * sizeof(u16))) { + mutex_unlock(&unsafe_channel_list_lock); + return -ENOMEM; + } + + *ch_count = unsafe_list->unsafe_ch_count; + memcpy( + (char *)unsafe_ch_list, + (char *)unsafe_list->unsafe_ch_list, + unsafe_list->unsafe_ch_count * sizeof(u16)); + mutex_unlock(&unsafe_channel_list_lock); + + return 0; +} +EXPORT_SYMBOL(cnss_get_wlan_unsafe_channel); + void cnss_init_work(struct work_struct *work, work_func_t func) { INIT_WORK(work, func); diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index 84ecb68cbc94..b5431c94dca3 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -236,8 +236,6 @@ static struct cnss_data { void *ramdump_addr; phys_addr_t ramdump_phys; struct msm_dump_data dump_data; - u16 unsafe_ch_count; - u16 unsafe_ch_list[CNSS_MAX_CH_NUM]; struct cnss_wlan_driver *driver; struct pci_dev *pdev; const struct pci_device_id *id; @@ -2167,44 +2165,6 @@ cut_power: } EXPORT_SYMBOL(cnss_wlan_unregister_driver); -int cnss_set_wlan_unsafe_channel(u16 *unsafe_ch_list, u16 ch_count) -{ - if (!penv) - return -ENODEV; - - if ((!unsafe_ch_list) || (ch_count > CNSS_MAX_CH_NUM)) - return -EINVAL; - - penv->unsafe_ch_count = ch_count; - - if (ch_count != 0) - memcpy((char *)penv->unsafe_ch_list, (char *)unsafe_ch_list, - ch_count * sizeof(u16)); - - return 0; -} -EXPORT_SYMBOL(cnss_set_wlan_unsafe_channel); - -int cnss_get_wlan_unsafe_channel(u16 *unsafe_ch_list, - u16 *ch_count, u16 buf_len) -{ - if (!penv) - return -ENODEV; - - if (!unsafe_ch_list || !ch_count) - return -EINVAL; - - if (buf_len < (penv->unsafe_ch_count * sizeof(u16))) - return -ENOMEM; - - *ch_count = penv->unsafe_ch_count; - memcpy((char *)unsafe_ch_list, (char *)penv->unsafe_ch_list, - penv->unsafe_ch_count * sizeof(u16)); - - return 0; -} -EXPORT_SYMBOL(cnss_get_wlan_unsafe_channel); - int cnss_wlan_set_dfs_nol(const void *info, u16 info_len) { void *temp; diff --git a/drivers/net/wireless/cnss/cnss_sdio.c b/drivers/net/wireless/cnss/cnss_sdio.c index 6a9f6b5c4845..bd3ec7639d99 100644 --- a/drivers/net/wireless/cnss/cnss_sdio.c +++ b/drivers/net/wireless/cnss/cnss_sdio.c @@ -45,11 +45,6 @@ #define CNSS_DUMP_MAGIC_VER_V2 0x42445953 #define CNSS_DUMP_NAME "CNSS_WLAN" -struct cnss_unsafe_channel_list { - u16 unsafe_ch_count; - u16 unsafe_ch_list[CNSS_MAX_CH_NUM]; -}; - struct cnss_dfs_nol_info { void *dfs_nol_info; u16 dfs_nol_info_len; @@ -85,7 +80,6 @@ static struct cnss_sdio_data { struct cnss_sdio_regulator regulator; struct platform_device *pdev; struct cnss_dfs_nol_info dfs_info; - struct cnss_unsafe_channel_list unsafe_list; struct cnss_sdio_info cnss_sdio_info; struct cnss_ssr_info ssr_info; struct pm_qos_request qos_request; @@ -175,52 +169,6 @@ void cnss_remove_pm_qos(void) } EXPORT_SYMBOL(cnss_remove_pm_qos); -int cnss_set_wlan_unsafe_channel(u16 *unsafe_ch_list, u16 ch_count) -{ - struct cnss_unsafe_channel_list *unsafe_list; - - if (!cnss_pdata) - return -ENODEV; - - if ((!unsafe_ch_list) || (!ch_count) || (ch_count > CNSS_MAX_CH_NUM)) - return -EINVAL; - - unsafe_list = &cnss_pdata->unsafe_list; - unsafe_list->unsafe_ch_count = ch_count; - - memcpy( - (char *)unsafe_list->unsafe_ch_list, - (char *)unsafe_ch_list, ch_count * sizeof(u16)); - - return 0; -} -EXPORT_SYMBOL(cnss_set_wlan_unsafe_channel); - -int cnss_get_wlan_unsafe_channel( - u16 *unsafe_ch_list, u16 *ch_count, u16 buf_len) -{ - struct cnss_unsafe_channel_list *unsafe_list; - - if (!cnss_pdata) - return -ENODEV; - - if (!unsafe_ch_list || !ch_count) - return -EINVAL; - - unsafe_list = &cnss_pdata->unsafe_list; - - if (buf_len < (unsafe_list->unsafe_ch_count * sizeof(u16))) - return -ENOMEM; - - *ch_count = unsafe_list->unsafe_ch_count; - memcpy( - (char *)unsafe_ch_list, (char *)unsafe_list->unsafe_ch_list, - unsafe_list->unsafe_ch_count * sizeof(u16)); - - return 0; -} -EXPORT_SYMBOL(cnss_get_wlan_unsafe_channel); - int cnss_wlan_set_dfs_nol(const void *info, u16 info_len) { void *temp;