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

Commit 909a2217 authored by Sarada Prasanna Garnayak's avatar Sarada Prasanna Garnayak
Browse files

cnss: Store and Retrieve DFS NOL list in SDIO Platform driver



Store DFS Nol list in CNSS SDIO platform driver and return
to wlan host driver on query.

DFS list is needed on Radar detection.

CRs-Fixed: 943144
Change-Id: Iafa58da46793076d5d451aa93d6b1258f63c8286
Signed-off-by: default avatarKomal Seelam <kseelam@codeaurora.org>
Signed-off-by: default avatarSarada Prasanna Garnayak <sgarna@codeaurora.org>
parent 8fc24404
Loading
Loading
Loading
Loading
+65 −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,11 @@
#define WLAN_VREG_XTAL_MIN	1800000
#define POWER_ON_DELAY		4

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 +52,59 @@ 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;
} *cnss_pdata;

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 +307,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;
}