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:
parent
f912da63c5
commit
ec50aa0179
3 changed files with 59 additions and 92 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue