From 1c055e55a242a33e574e48be530e06770a210dcd Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 19 Feb 2024 03:26:26 +0000 Subject: [PATCH] add r8169 read mac form eeprom --- kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/linuxver.h | 261 ++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 200 insertions(+), 61 deletions(-) diff --git a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/linuxver.h b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/linuxver.h index 88c4999..268d126 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/linuxver.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/include/linuxver.h @@ -1,16 +1,17 @@ -/* SPDX-License-Identifier: GPL-2.0 */ /* * Linux-specific abstractions to gain some independence from linux kernel versions. * Pave over some 2.2 versus 2.4 versus 2.6 kernel differences. * - * 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 @@ -18,7 +19,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. @@ -26,7 +27,7 @@ * * <<Broadcom-WL-IPTag/Open:>> * - * $Id: linuxver.h 514727 2014-11-12 03:02:48Z $ + * $Id: linuxver.h 646730 2016-06-30 13:01:49Z $ */ #ifndef _linuxver_h_ @@ -36,7 +37,7 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-but-set-variable" #pragma GCC diagnostic ignored "-Wunused-but-set-parameter" -#endif +#endif // endif #include <typedefs.h> #include <linux/version.h> @@ -47,12 +48,12 @@ #include <generated/autoconf.h> #else #include <linux/autoconf.h> -#endif +#endif // endif #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)) #include <linux/kconfig.h> -#endif +#endif // endif #include <linux/module.h> #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)) @@ -61,21 +62,21 @@ #undef __NO_VERSION__ #else #define __NO_VERSION__ -#endif +#endif // endif #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0) */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) #define module_param(_name_, _type_, _perm_) MODULE_PARM(_name_, "i") #define module_param_string(_name_, _string_, _size_, _perm_) \ MODULE_PARM(_string_, "c" __MODULE_STRING(_size_)) -#endif +#endif // endif /* linux/malloc.h is deprecated, use linux/slab.h instead. */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 9)) #include <linux/malloc.h> #else #include <linux/slab.h> -#endif +#endif // endif #include <linux/types.h> #include <linux/init.h> @@ -101,16 +102,16 @@ #include <linux/tqueue.h> #ifndef work_struct #define work_struct tq_struct -#endif +#endif // endif #ifndef INIT_WORK #define INIT_WORK(_work, _func, _data) INIT_TQUEUE((_work), (_func), (_data)) -#endif +#endif // endif #ifndef schedule_work #define schedule_work(_work) schedule_task((_work)) -#endif +#endif // endif #ifndef flush_scheduled_work #define flush_scheduled_work() flush_scheduled_tasks() -#endif +#endif // endif #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 41) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) @@ -140,7 +141,7 @@ (RHEL_MAJOR == 5)) /* Exclude RHEL 5 */ typedef void (*work_func_t)(void *work); -#endif +#endif // endif #endif /* >= 2.6.20 */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) @@ -150,7 +151,7 @@ #define IRQ_NONE #define IRQ_HANDLED #define IRQ_RETVAL(x) -#endif +#endif // endif #else typedef irqreturn_t(*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs); #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0) */ @@ -162,7 +163,7 @@ #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 17) #ifdef CONFIG_NET_RADIO #define CONFIG_WIRELESS_EXT -#endif +#endif // endif #endif /* < 2.6.17 */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 67) @@ -174,28 +175,32 @@ #include <linux/sched.h> #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32) */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)) +#include <linux/signal.h> +#include <linux/sched/signal.h> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */ + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) #include <linux/sched/rt.h> #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) #include <net/lib80211.h> -#endif +#endif // endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) #include <linux/ieee80211.h> #else #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) #include <net/ieee80211.h> -#endif +#endif // endif #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30) */ - #ifndef __exit #define __exit -#endif +#endif // endif #ifndef __devexit #define __devexit -#endif +#endif // endif #ifndef __devinit # if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) # define __devinit __init @@ -206,10 +211,10 @@ #endif /* !__devinit */ #ifndef __devinitdata #define __devinitdata -#endif +#endif // endif #ifndef __devexit_p #define __devexit_p(x) x -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)) @@ -252,7 +257,7 @@ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)) #define pci_module_init pci_register_driver -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 18)) #ifdef MODULE @@ -261,39 +266,39 @@ #else #define module_init(x) __initcall(x); #define module_exit(x) __exitcall(x); -#endif +#endif // endif #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 18) */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31) #define WL_USE_NETDEV_OPS #else #undef WL_USE_NETDEV_OPS -#endif +#endif // endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) && defined(CONFIG_RFKILL) #define WL_CONFIG_RFKILL #else #undef WL_CONFIG_RFKILL -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 48)) #define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); pos = pos->next) -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 13)) #define pci_resource_start(dev, bar) ((dev)->base_address[(bar)]) #elif (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 44)) #define pci_resource_start(dev, bar) ((dev)->resource[(bar)].start) -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 23)) #define pci_enable_device(dev) do { } while (0) -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 14)) #define net_device device -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 42)) @@ -306,7 +311,7 @@ #ifndef PCI_DMA_TODEVICE #define PCI_DMA_TODEVICE 1 #define PCI_DMA_FROMDEVICE 2 -#endif +#endif // endif typedef u32 dma_addr_t; @@ -347,6 +352,41 @@ #define pci_unmap_single(cookie, address, size, dir) #endif /* DMA mapping */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0) +typedef struct timer_list timer_list_compat_t; + +#define init_timer_compat(timer_compat, cb, priv) \ + init_timer(timer_compat); \ + (timer_compat)->data = (ulong)priv; \ + (timer_compat)->function = cb +#define timer_set_private(timer_compat, priv) (timer_compat)->data = (ulong)priv +#define timer_expires(timer_compat) (timer_compat)->expires + +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0) */ + +typedef struct timer_list_compat { + struct timer_list timer; + void *arg; + void (*callback)(ulong arg); +} timer_list_compat_t; + +extern void timer_cb_compat(struct timer_list *tl); + +#define init_timer_compat(timer_compat, cb, priv) \ + (timer_compat)->arg = priv; \ + (timer_compat)->callback = cb; \ + timer_setup(&(timer_compat)->timer, timer_cb_compat, 0); +#define timer_set_private(timer_compat, priv) (timer_compat)->arg = priv +#define timer_expires(timer_compat) (timer_compat)->timer.expires + +#define del_timer(t) del_timer(&((t)->timer)) +#define del_timer_sync(t) del_timer_sync(&((t)->timer)) +#define timer_pending(t) timer_pending(&((t)->timer)) +#define add_timer(t) add_timer(&((t)->timer)) +#define mod_timer(t, j) mod_timer(&((t)->timer), j) + +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0) */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 43)) @@ -445,7 +485,7 @@ #else #define PCI_SAVE_STATE(a, b) pci_save_state(a, b) #define PCI_RESTORE_STATE(a, b) pci_restore_state(a, b) -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 6)) static inline int @@ -488,7 +528,7 @@ /* Old cp0 access macros deprecated in 2.4.19 */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 19)) #define read_c0_count() read_32bit_cp0_register(CP0_COUNT) -#endif +#endif // endif /* Module refcount handled internally in 2.6.x */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)) @@ -499,46 +539,46 @@ #else #define OLD_MOD_INC_USE_COUNT do {} while (0) #define OLD_MOD_DEC_USE_COUNT do {} while (0) -#endif +#endif // endif #else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) */ #ifndef SET_MODULE_OWNER #define SET_MODULE_OWNER(dev) do {} while (0) -#endif +#endif // endif #ifndef MOD_INC_USE_COUNT #define MOD_INC_USE_COUNT do {} while (0) -#endif +#endif // endif #ifndef MOD_DEC_USE_COUNT #define MOD_DEC_USE_COUNT do {} while (0) -#endif +#endif // endif #define OLD_MOD_INC_USE_COUNT MOD_INC_USE_COUNT #define OLD_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) */ #ifndef SET_NETDEV_DEV #define SET_NETDEV_DEV(net, pdev) do {} while (0) -#endif +#endif // endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)) #ifndef HAVE_FREE_NETDEV #define free_netdev(dev) kfree(dev) -#endif +#endif // endif #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0) */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) /* struct packet_type redefined in 2.6.x */ #define af_packet_priv data -#endif +#endif // endif /* suspend args */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) #define DRV_SUSPEND_STATE_TYPE pm_message_t #else #define DRV_SUSPEND_STATE_TYPE uint32 -#endif +#endif // endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) #define CHECKSUM_HW CHECKSUM_PARTIAL -#endif +#endif // endif typedef struct { void *parent; /* some external entity that the thread supposed to work for */ @@ -549,10 +589,11 @@ struct semaphore sema; int terminated; struct completion completed; + int flush_ind; + struct completion flushed; spinlock_t spinlock; int up_cnt; } tsk_ctl_t; - /* requires tsk_ctl_t tsk argument, the caller's priv data is passed in owner ptr */ /* note this macro assumes there may be only one context waiting on thread's completion */ @@ -560,7 +601,7 @@ #define DBG_THR(x) printk x #else #define DBG_THR(x) -#endif +#endif // endif static inline bool binary_sema_down(tsk_ctl_t *tsk) { @@ -600,40 +641,111 @@ return sem_up; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)) +#define SMP_RD_BARRIER_DEPENDS(x) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) #define SMP_RD_BARRIER_DEPENDS(x) smp_read_barrier_depends(x) #else #define SMP_RD_BARRIER_DEPENDS(x) smp_rmb(x) -#endif +#endif // endif #define PROC_START(thread_func, owner, tsk_ctl, flags, name) \ { \ sema_init(&((tsk_ctl)->sema), 0); \ init_completion(&((tsk_ctl)->completed)); \ + init_completion(&((tsk_ctl)->flushed)); \ (tsk_ctl)->parent = owner; \ (tsk_ctl)->proc_name = name; \ (tsk_ctl)->terminated = FALSE; \ + (tsk_ctl)->flush_ind = FALSE; \ + (tsk_ctl)->up_cnt = 0; \ (tsk_ctl)->p_task = kthread_run(thread_func, tsk_ctl, (char*)name); \ - (tsk_ctl)->thr_pid = (tsk_ctl)->p_task->pid; \ - spin_lock_init(&((tsk_ctl)->spinlock)); \ - DBG_THR(("%s(): thread:%s:%lx started\n", __FUNCTION__, \ - (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + if (IS_ERR((tsk_ctl)->p_task)) { \ + (tsk_ctl)->thr_pid = -1; \ + DBG_THR(("%s(): thread:%s create failed\n", __FUNCTION__, \ + (tsk_ctl)->proc_name)); \ + } else { \ + (tsk_ctl)->thr_pid = (tsk_ctl)->p_task->pid; \ + spin_lock_init(&((tsk_ctl)->spinlock)); \ + DBG_THR(("%s(): thread:%s:%lx started\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + }; \ } + +#define PROC_WAIT_TIMEOUT_MSEC 5000 /* 5 seconds */ #define PROC_STOP(tsk_ctl) \ { \ + uint timeout = (uint)msecs_to_jiffies(PROC_WAIT_TIMEOUT_MSEC); \ (tsk_ctl)->terminated = TRUE; \ smp_wmb(); \ up(&((tsk_ctl)->sema)); \ - wait_for_completion(&((tsk_ctl)->completed)); \ - DBG_THR(("%s(): thread:%s:%lx terminated OK\n", __FUNCTION__, \ + DBG_THR(("%s(): thread:%s:%lx wait for terminate\n", __FUNCTION__, \ (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + timeout = (uint)wait_for_completion_timeout(&((tsk_ctl)->completed), timeout); \ + if (timeout == 0) \ + DBG_THR(("%s(): thread:%s:%lx terminate timeout\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + else \ + DBG_THR(("%s(): thread:%s:%lx terminated OK\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + (tsk_ctl)->parent = NULL; \ + (tsk_ctl)->proc_name = NULL; \ (tsk_ctl)->thr_pid = -1; \ + (tsk_ctl)->up_cnt = 0; \ +} + +#define PROC_STOP_USING_BINARY_SEMA(tsk_ctl) \ +{ \ + uint timeout = (uint)msecs_to_jiffies(PROC_WAIT_TIMEOUT_MSEC); \ + (tsk_ctl)->terminated = TRUE; \ + smp_wmb(); \ + binary_sema_up(tsk_ctl); \ + DBG_THR(("%s(): thread:%s:%lx wait for terminate\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + timeout = (uint)wait_for_completion_timeout(&((tsk_ctl)->completed), timeout); \ + if (timeout == 0) \ + DBG_THR(("%s(): thread:%s:%lx terminate timeout\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + else \ + DBG_THR(("%s(): thread:%s:%lx terminated OK\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + (tsk_ctl)->parent = NULL; \ + (tsk_ctl)->proc_name = NULL; \ + (tsk_ctl)->thr_pid = -1; \ +} + +/* +* Flush is non-rentrant, so callers must make sure +* there is no race condition. +* For safer exit, added wait_for_completion_timeout +* with 1 sec timeout. +*/ +#define PROC_FLUSH_USING_BINARY_SEMA(tsk_ctl) \ +{ \ + uint timeout = (uint)msecs_to_jiffies(PROC_WAIT_TIMEOUT_MSEC); \ + (tsk_ctl)->flush_ind = TRUE; \ + smp_wmb(); \ + binary_sema_up(tsk_ctl); \ + DBG_THR(("%s(): thread:%s:%lx wait for flush\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + timeout = (uint)wait_for_completion_timeout(&((tsk_ctl)->flushed), timeout); \ + if (timeout == 0) \ + DBG_THR(("%s(): thread:%s:%lx flush timeout\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ + else \ + DBG_THR(("%s(): thread:%s:%lx flushed OK\n", __FUNCTION__, \ + (tsk_ctl)->proc_name, (tsk_ctl)->thr_pid)); \ } /* ----------------------- */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) +/* send_sig declaration moved */ +#include <linux/sched/signal.h> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) */ + #define KILL_PROC(nr, sig) \ { \ struct task_struct *tsk; \ @@ -656,7 +768,7 @@ { \ kill_proc(pid, sig, 1); \ } -#endif +#endif // endif #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) @@ -708,7 +820,7 @@ #define DEV_PRIV(dev) (dev->priv) #else #define DEV_PRIV(dev) netdev_priv(dev) -#endif +#endif // endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20) #define WL_ISR(i, d, p) wl_isr((i), (d)) @@ -724,14 +836,16 @@ #define CAN_SLEEP() ((!in_atomic() && !irqs_disabled())) #else #define CAN_SLEEP() (FALSE) -#endif +#endif // endif #define KMALLOC_FLAG (CAN_SLEEP() ? GFP_KERNEL: GFP_ATOMIC) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) #define RANDOM32 prandom_u32 +#define RANDOM_BYTES prandom_bytes #else #define RANDOM32 random32 +#define RANDOM_BYTES get_random_bytes #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) @@ -744,7 +858,7 @@ * Overide latest kfifo functions with * older version to work on older kernels */ -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)) && !defined(WL_COMPAT_WIRELESS) #define kfifo_in_spinlocked(a, b, c, d) kfifo_put(a, (u8 *)b, c) #define kfifo_out_spinlocked(a, b, c, d) kfifo_get(a, (u8 *)b, c) #define kfifo_esize(a) 1 @@ -757,6 +871,31 @@ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) #pragma GCC diagnostic pop -#endif +#endif // endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0)) +static inline struct inode *file_inode(const struct file *f) +{ + return f->f_dentry->d_inode; +} +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0)) */ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) +#define vfs_write(fp, buf, len, pos) kernel_write(fp, buf, len, pos) +#define vfs_read(fp, buf, len, pos) kernel_read(fp, buf, len, pos) +int kernel_read_compat(struct file *file, loff_t offset, char *addr, unsigned long count); +#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) */ +#define kernel_read_compat(file, offset, addr, count) kernel_read(file, offset, addr, count) +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0) +#define timespec64 timespec +#define ktime_get_real_ts64(timespec) ktime_get_real_ts(timespec) +#define ktime_to_timespec64(timespec) ktime_to_timespec(timespec) +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0) */ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) +#define rtc_time_to_tm(time, tm) rtc_time64_to_tm(time, tm) +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0) */ #endif /* _linuxver_h_ */ -- Gitblit v1.6.2