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

Commit 94f8545f authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss: Store and Retrieve WiFi unsafe Channel list"

parents c5334ea1 8c53a301
Loading
Loading
Loading
Loading
+119 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/slab.h>

#define WLAN_VREG_NAME		"vdd-wlan"
#define WLAN_VREG_IO_NAME	"vdd-wlan-io"
@@ -31,6 +32,18 @@
#define WLAN_VREG_XTAL_MIN	1800000
#define POWER_ON_DELAY		4

#define CNSS_MAX_CH_NUM 100

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

struct cnss_sdio_wlan_gpio_info {
	u32 num;
	u32 flags;
@@ -46,8 +59,106 @@ static struct cnss_sdio_data {
	struct cnss_sdio_regulator regulator;
	struct platform_device *pdev;
	struct cnss_sdio_wlan_gpio_info pmic_gpio;
	struct cnss_dfs_nol_info dfs_info;
	struct cnss_unsafe_channel_list unsafe_list;
} *cnss_pdata;

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(void *info, u16 info_len)
{
	void *temp;
	struct cnss_dfs_nol_info *dfs_info;

	if (!cnss_pdata)
		return -ENODEV;

	if (!info || !info_len)
		return -EINVAL;

	temp = kmalloc(info_len, GFP_KERNEL);
	if (!temp)
		return -ENOMEM;

	memcpy(temp, info, info_len);
	dfs_info = &cnss_pdata->dfs_info;
	kfree(dfs_info->dfs_nol_info);

	dfs_info->dfs_nol_info = temp;
	dfs_info->dfs_nol_info_len = info_len;

	return 0;
}
EXPORT_SYMBOL(cnss_wlan_set_dfs_nol);

int cnss_wlan_get_dfs_nol(void *info, u16 info_len)
{
	int len;
	struct cnss_dfs_nol_info *dfs_info;

	if (!cnss_pdata)
		return -ENODEV;

	if (!info || !info_len)
		return -EINVAL;

	dfs_info = &cnss_pdata->dfs_info;

	if (dfs_info->dfs_nol_info == NULL || dfs_info->dfs_nol_info_len == 0)
		return -ENOENT;

	len = min(info_len, dfs_info->dfs_nol_info_len);

	memcpy(info, dfs_info->dfs_nol_info, len);

	return len;
}
EXPORT_SYMBOL(cnss_wlan_get_dfs_nol);

static int cnss_sdio_configure_gpio(void)
{
	int error;
@@ -250,6 +361,14 @@ err_wlan_enable_gpio:

static int cnss_sdio_remove(struct platform_device *pdev)
{
	struct cnss_dfs_nol_info *dfs_info;

	if (!cnss_pdata)
		return -ENODEV;

	dfs_info = &cnss_pdata->dfs_info;
	kfree(dfs_info->dfs_nol_info);

	cnss_sdio_release_resource();
	return 0;
}