Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d084686 authored by Sarada Prasanna Garnayak's avatar Sarada Prasanna Garnayak Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarSarada Prasanna Garnayak <sgarna@codeaurora.org>
parent b65b7cae
Loading
Loading
Loading
Loading
+59 −0
Original line number Diff line number Diff line
@@ -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);
+0 −40
Original line number Diff line number Diff line
@@ -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;
+0 −52
Original line number Diff line number Diff line
@@ -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;