diff --git a/drivers/net/wireless/cnss/cnss_common.c b/drivers/net/wireless/cnss/cnss_common.c index 5122e5b755c1..428c2f6ad5e6 100644 --- a/drivers/net/wireless/cnss/cnss_common.c +++ b/drivers/net/wireless/cnss/cnss_common.c @@ -21,8 +21,15 @@ #include #include #include +#include #include +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 diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index cf01023e4654..07a5f6c4ceb1 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -52,6 +52,7 @@ #include #include #include +#include #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC #include @@ -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) { diff --git a/drivers/net/wireless/cnss/cnss_sdio.c b/drivers/net/wireless/cnss/cnss_sdio.c index 3faf5aac8b31..294aee7e7369 100644 --- a/drivers/net/wireless/cnss/cnss_sdio.c +++ b/drivers/net/wireless/cnss/cnss_sdio.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #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; diff --git a/include/net/cnss.h b/include/net/cnss.h index bf1f80d5655f..e9d0ca85d7f2 100644 --- a/include/net/cnss.h +++ b/include/net/cnss.h @@ -15,14 +15,13 @@ #include #include #include +#include #ifdef CONFIG_CNSS_SDIO #include #endif #ifdef CONFIG_CNSS -#define CNSS_MAX_FILE_NAME 20 - -#define MAX_FIRMWARE_SIZE (1 * 1024 * 1024) +#define CNSS_MAX_FILE_NAME 20 enum cnss_bus_width_type { CNSS_BUS_WIDTH_NONE, @@ -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 { diff --git a/include/net/cnss_common.h b/include/net/cnss_common.h new file mode 100644 index 000000000000..c5175a190b37 --- /dev/null +++ b/include/net/cnss_common.h @@ -0,0 +1,73 @@ +/* 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_ */