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

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

Merge "net: cnss: add cnss common api support for dual WiFi"

parents 54872c11 fed8040b
Loading
Loading
Loading
Loading
+140 −0
Original line number Diff line number Diff line
@@ -21,8 +21,15 @@
#include <linux/mutex.h>
#include <linux/rwsem.h>
#include <net/cnss.h>
#include <net/cnss_common.h>
#include <net/cfg80211.h>

enum cnss_dev_bus_type {
	CNSS_BUS_NONE = -1,
	CNSS_BUS_PCI,
	CNSS_BUS_SDIO
};

static DEFINE_MUTEX(unsafe_channel_list_lock);
static DEFINE_MUTEX(dfs_nol_info_lock);

@@ -234,3 +241,136 @@ void cnss_dump_stack(struct task_struct *task)
	show_stack(task, NULL);
}
EXPORT_SYMBOL(cnss_dump_stack);

enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev)
{
	if (!dev && !dev->bus)
		return CNSS_BUS_NONE;

	if (memcmp(dev->bus->name, "sdio", 4) == 0)
		return CNSS_BUS_SDIO;
	else if (memcmp(dev->bus->name, "pci", 3) == 0)
		return CNSS_BUS_PCI;
	else
		return CNSS_BUS_NONE;
}

#ifdef CONFIG_CNSS_SDIO
int cnss_common_request_bus_bandwidth(struct device *dev, int bandwidth)
{
	if (CNSS_BUS_SDIO == cnss_get_dev_bus_type(dev))
		return cnss_sdio_request_bus_bandwidth(bandwidth);
	else
		return 0;
}
EXPORT_SYMBOL(cnss_common_request_bus_bandwidth);

void *cnss_common_get_virt_ramdump_mem(struct device *dev, unsigned long *size)
{
	if (CNSS_BUS_SDIO == cnss_get_dev_bus_type(dev))
		return cnss_sdio_get_virt_ramdump_mem(size);
	else
		return NULL;
}
EXPORT_SYMBOL(cnss_common_get_virt_ramdump_mem);

void cnss_common_device_self_recovery(struct device *dev)
{
	if (CNSS_BUS_SDIO == cnss_get_dev_bus_type(dev))
		cnss_sdio_device_self_recovery();
}
EXPORT_SYMBOL(cnss_common_device_self_recovery);

void cnss_common_schedule_recovery_work(struct device *dev)
{
	if (CNSS_BUS_SDIO == cnss_get_dev_bus_type(dev))
		cnss_sdio_schedule_recovery_work();
}
EXPORT_SYMBOL(cnss_common_schedule_recovery_work);

void cnss_common_device_crashed(struct device *dev)
{
	if (CNSS_BUS_SDIO == cnss_get_dev_bus_type(dev))
		cnss_sdio_device_crashed();
}
EXPORT_SYMBOL(cnss_common_device_crashed);

u8 *cnss_common_get_wlan_mac_address(struct device *dev, uint32_t *num)
{
	if (CNSS_BUS_SDIO == cnss_get_dev_bus_type(dev))
		return cnss_sdio_get_wlan_mac_address(num);
	else
		return NULL;
}
EXPORT_SYMBOL(cnss_common_get_wlan_mac_address);

int cnss_common_set_wlan_mac_address(
		struct device *dev, const u8 *in, uint32_t len)
{
	if (CNSS_BUS_SDIO == cnss_get_dev_bus_type(dev))
		return cnss_sdio_set_wlan_mac_address(in, len);
	else
		return -EINVAL;
}
EXPORT_SYMBOL(cnss_common_set_wlan_mac_address);
#endif

#ifdef CONFIG_CNSS_PCI
int cnss_common_request_bus_bandwidth(struct device *dev, int bandwidth)
{
	if (CNSS_BUS_PCI == cnss_get_dev_bus_type(dev))
		return cnss_pci_request_bus_bandwidth(bandwidth);
	else
		return 0;
}
EXPORT_SYMBOL(cnss_common_request_bus_bandwidth);

void *cnss_common_get_virt_ramdump_mem(struct device *dev, unsigned long *size)
{
	if (CNSS_BUS_PCI == cnss_get_dev_bus_type(dev))
		return cnss_pci_get_virt_ramdump_mem(size);
	else
		return NULL;
}
EXPORT_SYMBOL(cnss_common_get_virt_ramdump_mem);

void cnss_common_device_self_recovery(struct device *dev)
{
	if (CNSS_BUS_PCI == cnss_get_dev_bus_type(dev))
		cnss_pci_device_self_recovery();
}
EXPORT_SYMBOL(cnss_common_device_self_recovery);

void cnss_common_schedule_recovery_work(struct device *dev)
{
	if (CNSS_BUS_PCI == cnss_get_dev_bus_type(dev))
		cnss_pci_schedule_recovery_work();
}
EXPORT_SYMBOL(cnss_common_schedule_recovery_work);

void cnss_common_device_crashed(struct device *dev)
{
	if (CNSS_BUS_PCI == cnss_get_dev_bus_type(dev))
		cnss_pci_device_crashed();
}
EXPORT_SYMBOL(cnss_common_device_crashed);

u8 *cnss_common_get_wlan_mac_address(struct device *dev, uint32_t *num)
{
	if (CNSS_BUS_PCI == cnss_get_dev_bus_type(dev))
		return cnss_pci_get_wlan_mac_address(num);
	else
		return NULL;
}
EXPORT_SYMBOL(cnss_common_get_wlan_mac_address);

int cnss_common_set_wlan_mac_address(
		struct device *dev, const u8 *in, uint32_t len)
{
	if (CNSS_BUS_PCI == cnss_get_dev_bus_type(dev))
		return cnss_pcie_set_wlan_mac_address(in, len);
	else
		return -EINVAL;
}
EXPORT_SYMBOL(cnss_common_set_wlan_mac_address);
#endif
+37 −18
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@
#include <net/cfg80211.h>
#include <soc/qcom/memory_dump.h>
#include <net/cnss.h>
#include <net/cnss_common.h>

#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
#include <net/cnss_prealloc.h>
@@ -1767,7 +1768,7 @@ static DEVICE_ATTR(fw_image_setup, S_IRUSR | S_IWUSR,

void cnss_pci_recovery_work_handler(struct work_struct *recovery)
{
	cnss_device_self_recovery();
	cnss_pci_device_self_recovery();
}

DECLARE_WORK(recovery_work, cnss_pci_recovery_work_handler);
@@ -1940,6 +1941,41 @@ end:
	return;
}

/**
 * cnss_get_wlan_mac_address() - API to return MAC addresses buffer
 * @dev: struct device pointer
 * @num: buffer for number of mac addresses supported
 *
 * API returns the pointer to the buffer filled with mac addresses and
 * updates num with the number of mac addresses the buffer contains.
 *
 * Return: pointer to mac address buffer.
 */
u8 *cnss_pci_get_wlan_mac_address(uint32_t *num)
{
	struct cnss_wlan_mac_addr *addr = NULL;

	if (!penv) {
		pr_err("%s: Invalid Platform Driver Context\n", __func__);
		goto end;
	}

	if (!penv->is_wlan_mac_set) {
		pr_info("%s: Platform Driver doesn't have any mac address\n",
			__func__);
		goto end;
	}

	addr = &penv->wlan_mac_addr;
	*num = addr->no_of_mac_addr_set;
	return &addr->mac_addr[0][0];

end:
	*num = 0;
	return NULL;
}
EXPORT_SYMBOL(cnss_pci_get_wlan_mac_address);

/**
 * cnss_get_wlan_mac_address() - API to return MAC addresses buffer
 * @dev: struct device pointer
@@ -2296,7 +2332,6 @@ void cnss_pci_schedule_recovery_work(void)
{
	schedule_work(&recovery_work);
}
EXPORT_SYMBOL(cnss_pci_schedule_recovery_work);

void *cnss_pci_get_virt_ramdump_mem(unsigned long *size)
{
@@ -2307,7 +2342,6 @@ void *cnss_pci_get_virt_ramdump_mem(unsigned long *size)

	return penv->ramdump_addr;
}
EXPORT_SYMBOL(cnss_pci_get_virt_ramdump_mem);

void cnss_pci_device_crashed(void)
{
@@ -2316,19 +2350,6 @@ void cnss_pci_device_crashed(void)
		subsystem_restart_dev(penv->subsys);
	}
}
EXPORT_SYMBOL(cnss_pci_device_crashed);

int cnss_get_ramdump_mem(unsigned long *address, unsigned long *size)
{
	if (!penv || !penv->pldev)
		return -ENODEV;

	*address = penv->ramdump_phys;
	*size = penv->ramdump_size;

	return 0;
}
EXPORT_SYMBOL(cnss_get_ramdump_mem);

void *cnss_get_virt_ramdump_mem(unsigned long *size)
{
@@ -2517,7 +2538,6 @@ void cnss_pci_device_self_recovery(void)
	cnss_pm_wake_lock_release(&penv->ws);
	penv->recovery_in_progress = false;
}
EXPORT_SYMBOL(cnss_pci_device_self_recovery);

static int cnss_ramdump(int enable, const struct subsys_desc *subsys)
{
@@ -3029,7 +3049,6 @@ int cnss_pci_request_bus_bandwidth(int bandwidth)
	}
	return ret;
}
EXPORT_SYMBOL(cnss_pci_request_bus_bandwidth);

int cnss_request_bus_bandwidth(int bandwidth)
{
+9 −21
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <soc/qcom/ramdump.h>
#include <soc/qcom/memory_dump.h>
#include <net/cnss.h>
#include <net/cnss_common.h>
#include <linux/pm_qos.h>

#define WLAN_VREG_NAME		"vdd-wlan"
@@ -139,7 +140,6 @@ int cnss_sdio_request_bus_bandwidth(int bandwidth)
{
	return 0;
}
EXPORT_SYMBOL(cnss_sdio_request_bus_bandwidth);

void cnss_sdio_request_pm_qos(u32 qos_val)
{
@@ -476,7 +476,6 @@ void *cnss_sdio_get_virt_ramdump_mem(unsigned long *size)

	return cnss_pdata->ssr_info.ramdump_addr;
}
EXPORT_SYMBOL(cnss_sdio_get_virt_ramdump_mem);

void cnss_sdio_device_self_recovery(void)
{
@@ -484,7 +483,6 @@ void cnss_sdio_device_self_recovery(void)
	msleep(WLAN_RECOVERY_DELAY);
	cnss_sdio_powerup(NULL);
}
EXPORT_SYMBOL(cnss_sdio_device_self_recovery);

void cnss_sdio_device_crashed(void)
{
@@ -498,22 +496,6 @@ void cnss_sdio_device_crashed(void)
		subsystem_restart_dev(ssr_info->subsys);
	}
}
EXPORT_SYMBOL(cnss_sdio_device_crashed);

int cnss_get_ramdump_mem(unsigned long *address, unsigned long *size)
{
	struct cnss_ssr_info *ssr_info;

	if (!cnss_pdata || !cnss_pdata->pdev)
		return -ENODEV;

	ssr_info = &cnss_pdata->ssr_info;
	*address = ssr_info->ramdump_phys;
	*size = ssr_info->ramdump_size;

	return 0;
}
EXPORT_SYMBOL(cnss_get_ramdump_mem);

void *cnss_get_virt_ramdump_mem(unsigned long *size)
{
@@ -536,7 +518,7 @@ EXPORT_SYMBOL(cnss_device_self_recovery);

static void cnss_sdio_recovery_work_handler(struct work_struct *recovery)
{
	cnss_device_self_recovery();
	cnss_sdio_device_self_recovery();
}

DECLARE_WORK(recovery_work, cnss_sdio_recovery_work_handler);
@@ -545,7 +527,6 @@ void cnss_sdio_schedule_recovery_work(void)
{
	schedule_work(&recovery_work);
}
EXPORT_SYMBOL(cnss_sdio_schedule_recovery_work);

void cnss_schedule_recovery_work(void)
{
@@ -1060,6 +1041,13 @@ int cnss_sdio_set_wlan_mac_address(const u8 *in, uint32_t len)
}
EXPORT_SYMBOL(cnss_sdio_set_wlan_mac_address);

u8 *cnss_sdio_get_wlan_mac_address(uint32_t *num)
{
	*num = 0;
	return NULL;
}
EXPORT_SYMBOL(cnss_sdio_get_wlan_mac_address);

u8 *cnss_get_wlan_mac_address(struct device *dev, uint32_t *num)
{
	*num = 0;
+3 −39
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#include <linux/device.h>
#include <linux/skbuff.h>
#include <linux/pci.h>
#include <net/cnss_common.h>
#ifdef CONFIG_CNSS_SDIO
#include <linux/mmc/sdio_func.h>
#endif
@@ -22,8 +23,6 @@
#ifdef CONFIG_CNSS
#define CNSS_MAX_FILE_NAME	20

#define MAX_FIRMWARE_SIZE (1 * 1024 * 1024)

enum cnss_bus_width_type {
	CNSS_BUS_WIDTH_NONE,
	CNSS_BUS_WIDTH_LOW,
@@ -122,10 +121,8 @@ extern void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver);
extern int cnss_get_fw_files(struct cnss_fw_files *pfw_files);
extern int cnss_get_fw_files_for_target(struct cnss_fw_files *pfw_files,
					u32 target_type, u32 target_version);
extern int cnss_pci_request_bus_bandwidth(int bandwidth);
extern int cnss_sdio_request_bus_bandwidth(int bandwidth);
extern int cnss_request_bus_bandwidth(int bandwidth);

extern int cnss_request_bus_bandwidth(int bandwidth);
extern int cnss_get_sha_hash(const u8 *data, u32 data_len,
					u8 *hash_idx, u8 *out);
extern void *cnss_get_fw_ptr(void);
@@ -172,47 +169,15 @@ extern int cnss_is_auto_suspend_allowed(const char *caller_func);
extern int cnss_pm_runtime_request(struct device *dev, enum
		cnss_runtime_request request);
#endif
/* max 20mhz channel count */
#define CNSS_MAX_CH_NUM       45

extern void cnss_init_work(struct work_struct *work, work_func_t func);
extern void cnss_flush_work(void *work);
extern void cnss_flush_delayed_work(void *dwork);
extern void cnss_get_monotonic_boottime(struct timespec *ts);
extern void cnss_get_boottime(struct timespec *ts);
extern void cnss_init_delayed_work(struct delayed_work *work, work_func_t func);
extern int cnss_vendor_cmd_reply(struct sk_buff *skb);

extern void cnss_pm_wake_lock_init(struct wakeup_source *ws, const char *name);
extern void cnss_pm_wake_lock(struct wakeup_source *ws);
extern void cnss_pm_wake_lock_timeout(struct wakeup_source *ws, ulong msec);
extern void cnss_pm_wake_lock_release(struct wakeup_source *ws);
extern void cnss_pm_wake_lock_destroy(struct wakeup_source *ws);
extern int cnss_set_cpus_allowed_ptr(struct task_struct *task, ulong cpu);

extern int cnss_set_wlan_unsafe_channel(u16 *unsafe_ch_list, u16 ch_count);
extern int cnss_get_wlan_unsafe_channel(u16 *unsafe_ch_list,
		u16 *ch_count, u16 buf_len);
extern int cnss_wlan_set_dfs_nol(const void *info, u16 info_len);
extern int cnss_wlan_get_dfs_nol(void *info, u16 info_len);

extern void cnss_device_crashed(void);
extern void cnss_sdio_device_crashed(void);
extern void cnss_pci_device_crashed(void);

extern void cnss_device_self_recovery(void);
extern void cnss_pci_device_self_recovery(void);
extern void cnss_sdio_device_self_recovery(void);

extern int cnss_get_ramdump_mem(unsigned long *address, unsigned long *size);

extern void *cnss_get_virt_ramdump_mem(unsigned long *size);
extern void *cnss_pci_get_virt_ramdump_mem(unsigned long *size);
extern void *cnss_sdio_get_virt_ramdump_mem(unsigned long *size);

extern void cnss_schedule_recovery_work(void);
extern void cnss_sdio_schedule_recovery_work(void);
extern void cnss_pci_schedule_recovery_work(void);
extern int cnss_pcie_set_wlan_mac_address(const u8 *in, uint32_t len);
extern u8 *cnss_get_wlan_mac_address(struct device *dev, uint32_t *num);
extern int cnss_sdio_set_wlan_mac_address(const u8 *in, uint32_t len);
@@ -223,7 +188,6 @@ enum {
	CNSS_RESET_LEVEL_MAX
};
extern int cnss_get_restart_level(void);
extern void cnss_dump_stack(struct task_struct *task);

#ifdef CONFIG_CNSS_SDIO
struct cnss_sdio_wlan_driver {
+73 −0
Original line number Diff line number Diff line
/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef _NET_CNSS_COMMON_H_
#define _NET_CNSS_COMMON_H_

#ifdef CONFIG_CNSS

#define MAX_FIRMWARE_SIZE (1 * 1024 * 1024)
/* max 20mhz channel count */
#define CNSS_MAX_CH_NUM		45

extern int cnss_set_wlan_unsafe_channel(u16 *unsafe_ch_list, u16 ch_count);
extern int cnss_get_wlan_unsafe_channel(u16 *unsafe_ch_list,
			u16 *ch_count, u16 buf_len);

extern int cnss_wlan_set_dfs_nol(const void *info, u16 info_len);
extern int cnss_wlan_get_dfs_nol(void *info, u16 info_len);

extern void cnss_init_work(struct work_struct *work, work_func_t func);
extern void cnss_flush_work(void *work);
extern void cnss_flush_delayed_work(void *dwork);
extern void cnss_pm_wake_lock_timeout(struct wakeup_source *ws, ulong msec);
extern void cnss_pm_wake_lock_release(struct wakeup_source *ws);
extern void cnss_pm_wake_lock_destroy(struct wakeup_source *ws);
extern void cnss_get_monotonic_boottime(struct timespec *ts);
extern void cnss_get_boottime(struct timespec *ts);
extern void cnss_init_delayed_work(struct delayed_work *work, work_func_t func);
extern int cnss_vendor_cmd_reply(struct sk_buff *skb);
extern int cnss_set_cpus_allowed_ptr(struct task_struct *task, ulong cpu);
extern void cnss_dump_stack(struct task_struct *task);

int cnss_pci_request_bus_bandwidth(int bandwidth);
int cnss_sdio_request_bus_bandwidth(int bandwidth);
extern int cnss_common_request_bus_bandwidth(struct device *dev,
				int bandwidth);

void cnss_sdio_device_crashed(void);
void cnss_pci_device_crashed(void);
extern void cnss_common_device_crashed(struct device *dev);

void cnss_pci_device_self_recovery(void);
void cnss_sdio_device_self_recovery(void);
extern void cnss_common_device_self_recovery(struct device *dev);

void *cnss_pci_get_virt_ramdump_mem(unsigned long *size);
void *cnss_sdio_get_virt_ramdump_mem(unsigned long *size);
extern void *cnss_common_get_virt_ramdump_mem(struct device *dev,
				unsigned long *size);

void cnss_sdio_schedule_recovery_work(void);
void cnss_pci_schedule_recovery_work(void);
extern void cnss_common_schedule_recovery_work(struct device *dev);

extern int cnss_pcie_set_wlan_mac_address(const u8 *in, uint32_t len);
extern int cnss_sdio_set_wlan_mac_address(const u8 *in, uint32_t len);
extern int cnss_common_set_wlan_mac_address(struct device *dev,
				const u8 *in, uint32_t len);

u8 *cnss_pci_get_wlan_mac_address(uint32_t *num);
u8 *cnss_sdio_get_wlan_mac_address(uint32_t *num);
extern u8 *cnss_common_get_wlan_mac_address(struct device *dev, uint32_t *num);
#endif
#endif /* _NET_CNSS_COMMON_H_ */