From cde9070d9970eef1f7ec2360586c802a16230ad8 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 10 May 2024 07:43:50 +0000 Subject: [PATCH] rtl88x2CE_WiFi_linux driver --- kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/bcmsdh_linux.c | 122 ++++++++++++++++++++++++++++++---------- 1 files changed, 91 insertions(+), 31 deletions(-) diff --git a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/bcmsdh_linux.c b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/bcmsdh_linux.c index 77a2206..e5d8a7f 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/bcmsdh_linux.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/bcmsdh_linux.c @@ -1,15 +1,16 @@ -/* SPDX-License-Identifier: GPL-2.0 */ /* * SDIO access interface for drivers - linux specific (pci only) * - * Copyright (C) 1999-2019, Broadcom Corporation - * + * Portions of this code are copyright (c) 2022 Cypress Semiconductor Corporation + * + * Copyright (C) 1999-2017, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,7 +18,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -25,7 +26,7 @@ * * <<Broadcom-WL-IPTag/Open:>> * - * $Id: bcmsdh_linux.c 579798 2015-08-17 07:00:05Z $ + * $Id: bcmsdh_linux.c 689948 2017-03-14 05:21:03Z $ */ /** @@ -48,9 +49,6 @@ #include <bcmutils.h> #include <dngl_stats.h> #include <dhd.h> -#if defined(CONFIG_ARCH_ODIN) -#include <linux/platform_data/gpio-odin.h> -#endif /* defined(CONFIG_ARCH_ODIN) */ #include <dhd_linux.h> /* driver info, initialized when bcmsdh_register is called */ @@ -85,7 +83,7 @@ } bcmsdh_os_info_t; /* debugging macros */ -#define SDLX_MSG(x) do { printf x; } while (0) +#define SDLX_MSG(x) /** * Checks to see if vendor and device IDs match a supported SDIO Host Controller. @@ -98,6 +96,9 @@ #ifdef BCMSDIOH_STD /* Check for Arasan host controller */ if (vendor == VENDOR_SI_IMAGE) { + return (TRUE); + } + if (device == SDIOH_FPGA_ID && vendor == VENDOR_CYPRESS) { return (TRUE); } /* Check for BRCM 27XX Standard host controller */ @@ -161,10 +162,13 @@ bcmsdh_osinfo->dev = dev; osl_set_bus_handle(osh, bcmsdh); -#if !defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) +#if (!defined(CONFIG_PM_WAKELOCKS) || !defined(CONFIG_HAS_WAKELOCK)) && \ + (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) if (dev && device_init_wakeup(dev, true) == 0) bcmsdh_osinfo->dev_wake_enabled = TRUE; -#endif /* !defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) */ +#endif /* CONFIG_PM_WAKELOCKS ||CONFIG_HAS_WAKELOCK && + * (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) + */ #if defined(OOB_INTR_ONLY) spin_lock_init(&bcmsdh_osinfo->oob_irq_spinlock); @@ -179,9 +183,15 @@ /* Read the vendor/device ID from the CIS */ vendevid = bcmsdh_query_device(bcmsdh); + /* try to attach to the target device */ +#if defined(BCMSPI) && (defined(BCMPCISPIHOST) || defined(BCMSDIOH_SPI)) + bcmsdh_osinfo->context = drvinfo.probe((vendevid >> 16), (vendevid & 0xFFFF), bus_num, + slot_num, 0, bus_type, (void *)regs, NULL, bcmsdh); +#else bcmsdh_osinfo->context = drvinfo.probe((vendevid >> 16), (vendevid & 0xFFFF), bus_num, slot_num, 0, bus_type, (void *)regs, osh, bcmsdh); +#endif /* BCMSPI && (BCMPCISPIHOST || BCMSDIOH_SPI) */ if (bcmsdh_osinfo->context == NULL) { SDLX_MSG(("%s: device attach failed\n", __FUNCTION__)); goto err; @@ -202,11 +212,14 @@ { bcmsdh_os_info_t *bcmsdh_osinfo = bcmsdh->os_cxt; -#if !defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) +#if (!defined(CONFIG_PM_WAKELOCKS) || !defined(CONFIG_HAS_WAKELOCK)) && \ + (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) if (bcmsdh_osinfo->dev) device_init_wakeup(bcmsdh_osinfo->dev, false); bcmsdh_osinfo->dev_wake_enabled = FALSE; -#endif /* !defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) */ +#endif /* CONFIG_PM_WAKELOCKS ||CONFIG_HAS_WAKELOCK && + * (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) + */ drvinfo.remove(bcmsdh_osinfo->context); MFREE(bcmsdh->osh, bcmsdh->os_cxt, sizeof(bcmsdh_os_info_t)); @@ -214,6 +227,29 @@ return 0; } + +#ifdef DHD_WAKE_STATUS +int bcmsdh_get_total_wake(bcmsdh_info_t *bcmsdh) +{ + return bcmsdh->total_wake_count; +} + +int bcmsdh_set_get_wake(bcmsdh_info_t *bcmsdh, int flag) +{ + bcmsdh_os_info_t *bcmsdh_osinfo = bcmsdh->os_cxt; + unsigned long flags; + int ret; + + spin_lock_irqsave(&bcmsdh_osinfo->oob_irq_spinlock, flags); + + ret = bcmsdh->pkt_wake; + bcmsdh->total_wake_count += flag; + bcmsdh->pkt_wake = flag; + + spin_unlock_irqrestore(&bcmsdh_osinfo->oob_irq_spinlock, flags); + return ret; +} +#endif /* DHD_WAKE_STATUS */ int bcmsdh_suspend(bcmsdh_info_t *bcmsdh) { @@ -270,25 +306,31 @@ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) if (bcmsdh_pci_driver.node.next == NULL) return; -#endif +#endif // endif bcmsdh_unregister_client_driver(); } void bcmsdh_dev_pm_stay_awake(bcmsdh_info_t *bcmsdh) { -#if !defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) +#if (!defined(CONFIG_PM_WAKELOCKS) || !defined(CONFIG_HAS_WAKELOCK)) && \ + (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) bcmsdh_os_info_t *bcmsdh_osinfo = bcmsdh->os_cxt; pm_stay_awake(bcmsdh_osinfo->dev); -#endif /* !defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) */ +#endif /* CONFIG_PM_WAKELOCKS ||CONFIG_HAS_WAKELOCK && + * (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) + */ } void bcmsdh_dev_relax(bcmsdh_info_t *bcmsdh) { -#if !defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) +#if (!defined(CONFIG_PM_WAKELOCKS) || !defined(CONFIG_HAS_WAKELOCK)) && \ + (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) bcmsdh_os_info_t *bcmsdh_osinfo = bcmsdh->os_cxt; pm_relax(bcmsdh_osinfo->dev); -#endif /* !defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) */ +#endif /* CONFIG_PM_WAKELOCKS ||CONFIG_HAS_WAKELOCK && + * (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)) + */ } bool bcmsdh_dev_pm_enabled(bcmsdh_info_t *bcmsdh) @@ -298,7 +340,7 @@ return bcmsdh_osinfo->dev_wake_enabled; } -#if defined(OOB_INTR_ONLY) +#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) void bcmsdh_oob_intr_set(bcmsdh_info_t *bcmsdh, bool enable) { unsigned long flags; @@ -324,7 +366,9 @@ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)dev_id; bcmsdh_os_info_t *bcmsdh_osinfo = bcmsdh->os_cxt; +#ifndef BCMSPI_ANDROID bcmsdh_oob_intr_set(bcmsdh, FALSE); +#endif /* !BCMSPI_ANDROID */ bcmsdh_osinfo->oob_irq_handler(bcmsdh_osinfo->oob_irq_handler_context); return IRQ_HANDLED; @@ -345,23 +389,26 @@ (int)bcmsdh_osinfo->oob_irq_num, (int)bcmsdh_osinfo->oob_irq_flags)); bcmsdh_osinfo->oob_irq_handler = oob_irq_handler; bcmsdh_osinfo->oob_irq_handler_context = oob_irq_handler_context; -#if defined(CONFIG_ARCH_ODIN) - err = odin_gpio_sms_request_irq(bcmsdh_osinfo->oob_irq_num, wlan_oob_irq, - bcmsdh_osinfo->oob_irq_flags, "bcmsdh_sdmmc", bcmsdh); -#else + bcmsdh_osinfo->oob_irq_enabled = TRUE; + bcmsdh_osinfo->oob_irq_registered = TRUE; err = request_irq(bcmsdh_osinfo->oob_irq_num, wlan_oob_irq, bcmsdh_osinfo->oob_irq_flags, "bcmsdh_sdmmc", bcmsdh); -#endif /* defined(CONFIG_ARCH_ODIN) */ if (err) { SDLX_MSG(("%s: request_irq failed with %d\n", __FUNCTION__, err)); + bcmsdh_osinfo->oob_irq_enabled = FALSE; + bcmsdh_osinfo->oob_irq_registered = FALSE; return err; } +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + if (device_may_wakeup(bcmsdh_osinfo->dev)) { +#endif /* CONFIG_ARCH_RHEA || CONFIG_ARCH_CAPRI */ err = enable_irq_wake(bcmsdh_osinfo->oob_irq_num); if (!err) bcmsdh_osinfo->oob_irq_wake_enabled = TRUE; - bcmsdh_osinfo->oob_irq_enabled = TRUE; - bcmsdh_osinfo->oob_irq_registered = TRUE; +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + } +#endif /* CONFIG_ARCH_RHEA || CONFIG_ARCH_CAPRI */ return err; } @@ -376,9 +423,15 @@ return; } if (bcmsdh_osinfo->oob_irq_wake_enabled) { +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + if (device_may_wakeup(bcmsdh_osinfo->dev)) { +#endif /* CONFIG_ARCH_RHEA || CONFIG_ARCH_CAPRI */ err = disable_irq_wake(bcmsdh_osinfo->oob_irq_num); if (!err) bcmsdh_osinfo->oob_irq_wake_enabled = FALSE; +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + } +#endif /* CONFIG_ARCH_RHEA || CONFIG_ARCH_CAPRI */ } if (bcmsdh_osinfo->oob_irq_enabled) { disable_irq(bcmsdh_osinfo->oob_irq_num); @@ -387,12 +440,12 @@ free_irq(bcmsdh_osinfo->oob_irq_num, bcmsdh); bcmsdh_osinfo->oob_irq_registered = FALSE; } -#endif +#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ /* Module parameters specific to each host-controller driver */ extern uint sd_msglevel; /* Debug message level */ -module_param(sd_msglevel, uint, 0664); +module_param(sd_msglevel, uint, 0); extern uint sd_power; /* 0 = SD Power OFF, 1 = SD Power ON. */ module_param(sd_power, uint, 0); @@ -427,7 +480,10 @@ extern char dhd_sdiod_uhsi_ds_override[2]; module_param_string(dhd_sdiod_uhsi_ds_override, dhd_sdiod_uhsi_ds_override, 2, 0); -#endif +#endif // endif + + + #ifdef BCMSDH_MODULE EXPORT_SYMBOL(bcmsdh_attach); @@ -440,7 +496,11 @@ #if defined(DHD_DEBUG) EXPORT_SYMBOL(bcmsdh_intr_pending); -#endif +#endif // endif + +#if defined(BT_OVER_SDIO) +EXPORT_SYMBOL(bcmsdh_btsdio_interface_init); +#endif /* defined (BT_OVER_SDIO) */ EXPORT_SYMBOL(bcmsdh_devremove_reg); EXPORT_SYMBOL(bcmsdh_cfg_read); -- Gitblit v1.6.2