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 <sgarna@codeaurora.org>
This commit is contained in:
Sarada Prasanna Garnayak 2016-02-25 20:48:22 +05:30 committed by David Keitel
parent f912da63c5
commit ec50aa0179
3 changed files with 59 additions and 92 deletions

View file

@ -18,10 +18,69 @@
#include <linux/pm_wakeup.h>
#include <linux/sched.h>
#include <linux/suspend.h>
#include <linux/mutex.h>
#include <linux/rwsem.h>
#include <net/cnss.h>
#include <net/cfg80211.h>
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);

View file

@ -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;

View file

@ -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;