From 57830ef010ed1b6374d2d1ae5ce208eb0fbaca68 Mon Sep 17 00:00:00 2001 From: 5kft <5kft@users.noreply.github.com> Date: Tue, 21 Jan 2020 20:16:13 -0800 Subject: [PATCH] [ allwinner-current ] remove deprecated patches and update configs (this syncs armbian with the current megous orange-pi-5.4 upstream) --- config/kernel/linux-sunxi-current.config | 2 +- config/kernel/linux-sunxi64-current.config | 2 +- .../sunxi-current/patch-5.4.11-12.patch | 2421 ----- .../sunxi-current/patch-5.4.12-13.patch | 8038 ----------------- 4 files changed, 2 insertions(+), 10461 deletions(-) delete mode 100644 patch/kernel/sunxi-current/patch-5.4.11-12.patch delete mode 100644 patch/kernel/sunxi-current/patch-5.4.12-13.patch diff --git a/config/kernel/linux-sunxi-current.config b/config/kernel/linux-sunxi-current.config index a39660e245..87f764bab0 100644 --- a/config/kernel/linux-sunxi-current.config +++ b/config/kernel/linux-sunxi-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.4.12 Kernel Configuration +# Linux/arm 5.4.13 Kernel Configuration # # diff --git a/config/kernel/linux-sunxi64-current.config b/config/kernel/linux-sunxi64-current.config index a63407bfd7..825c1c0a7b 100644 --- a/config/kernel/linux-sunxi64-current.config +++ b/config/kernel/linux-sunxi64-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.4.12 Kernel Configuration +# Linux/arm64 5.4.13 Kernel Configuration # # diff --git a/patch/kernel/sunxi-current/patch-5.4.11-12.patch b/patch/kernel/sunxi-current/patch-5.4.11-12.patch deleted file mode 100644 index e0f4084ba9..0000000000 --- a/patch/kernel/sunxi-current/patch-5.4.11-12.patch +++ /dev/null @@ -1,2421 +0,0 @@ -diff --git a/Makefile b/Makefile -index e8963f623568..45c6264f1108 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0 - VERSION = 5 - PATCHLEVEL = 4 --SUBLEVEL = 11 -+SUBLEVEL = 12 - EXTRAVERSION = - NAME = Kleptomaniac Octopus - -diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig -index 8a50efb559f3..39002d769d95 100644 ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -73,6 +73,7 @@ config ARM - select HAVE_ARM_SMCCC if CPU_V7 - select HAVE_EBPF_JIT if !CPU_ENDIAN_BE32 - select HAVE_CONTEXT_TRACKING -+ select HAVE_COPY_THREAD_TLS - select HAVE_C_RECORDMCOUNT - select HAVE_DEBUG_KMEMLEAK - select HAVE_DMA_CONTIGUOUS if MMU -diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c -index 9485acc520a4..e7fac125ea0d 100644 ---- a/arch/arm/kernel/process.c -+++ b/arch/arm/kernel/process.c -@@ -224,8 +224,8 @@ void release_thread(struct task_struct *dead_task) - asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); - - int --copy_thread(unsigned long clone_flags, unsigned long stack_start, -- unsigned long stk_sz, struct task_struct *p) -+copy_thread_tls(unsigned long clone_flags, unsigned long stack_start, -+ unsigned long stk_sz, struct task_struct *p, unsigned long tls) - { - struct thread_info *thread = task_thread_info(p); - struct pt_regs *childregs = task_pt_regs(p); -@@ -259,7 +259,7 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start, - clear_ptrace_hw_breakpoint(p); - - if (clone_flags & CLONE_SETTLS) -- thread->tp_value[0] = childregs->ARM_r3; -+ thread->tp_value[0] = tls; - thread->tp_value[1] = get_tpuser(); - - thread_notify(THREAD_NOTIFY_COPY, thread); -diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index 3f047afb982c..6ccd2ed30963 100644 ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -139,6 +139,7 @@ config ARM64 - select HAVE_CMPXCHG_DOUBLE - select HAVE_CMPXCHG_LOCAL - select HAVE_CONTEXT_TRACKING -+ select HAVE_COPY_THREAD_TLS - select HAVE_DEBUG_BUGVERBOSE - select HAVE_DEBUG_KMEMLEAK - select HAVE_DMA_CONTIGUOUS -diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h -index 2629a68b8724..5af82587909e 100644 ---- a/arch/arm64/include/asm/unistd.h -+++ b/arch/arm64/include/asm/unistd.h -@@ -42,7 +42,6 @@ - #endif - - #define __ARCH_WANT_SYS_CLONE --#define __ARCH_WANT_SYS_CLONE3 - - #ifndef __COMPAT_SYSCALL_NR - #include -diff --git a/arch/arm64/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h -index 4703d218663a..f83a70e07df8 100644 ---- a/arch/arm64/include/uapi/asm/unistd.h -+++ b/arch/arm64/include/uapi/asm/unistd.h -@@ -19,5 +19,6 @@ - #define __ARCH_WANT_NEW_STAT - #define __ARCH_WANT_SET_GET_RLIMIT - #define __ARCH_WANT_TIME32_SYSCALLS -+#define __ARCH_WANT_SYS_CLONE3 - - #include -diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c -index 71f788cd2b18..d54586d5b031 100644 ---- a/arch/arm64/kernel/process.c -+++ b/arch/arm64/kernel/process.c -@@ -360,8 +360,8 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) - - asmlinkage void ret_from_fork(void) asm("ret_from_fork"); - --int copy_thread(unsigned long clone_flags, unsigned long stack_start, -- unsigned long stk_sz, struct task_struct *p) -+int copy_thread_tls(unsigned long clone_flags, unsigned long stack_start, -+ unsigned long stk_sz, struct task_struct *p, unsigned long tls) - { - struct pt_regs *childregs = task_pt_regs(p); - -@@ -394,11 +394,11 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start, - } - - /* -- * If a TLS pointer was passed to clone (4th argument), use it -- * for the new thread. -+ * If a TLS pointer was passed to clone, use it for the new -+ * thread. - */ - if (clone_flags & CLONE_SETTLS) -- p->thread.uw.tp_value = childregs->regs[3]; -+ p->thread.uw.tp_value = tls; - } else { - memset(childregs, 0, sizeof(struct pt_regs)); - childregs->pstate = PSR_MODE_EL1h; -diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig -index b16237c95ea3..0c29d6cb2c8d 100644 ---- a/arch/parisc/Kconfig -+++ b/arch/parisc/Kconfig -@@ -62,6 +62,7 @@ config PARISC - select HAVE_FTRACE_MCOUNT_RECORD if HAVE_DYNAMIC_FTRACE - select HAVE_KPROBES_ON_FTRACE - select HAVE_DYNAMIC_FTRACE_WITH_REGS -+ select HAVE_COPY_THREAD_TLS - - help - The PA-RISC microprocessor is designed by Hewlett-Packard and used -diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c -index ecc5c2771208..230a6422b99f 100644 ---- a/arch/parisc/kernel/process.c -+++ b/arch/parisc/kernel/process.c -@@ -208,8 +208,8 @@ arch_initcall(parisc_idle_init); - * Copy architecture-specific thread state - */ - int --copy_thread(unsigned long clone_flags, unsigned long usp, -- unsigned long kthread_arg, struct task_struct *p) -+copy_thread_tls(unsigned long clone_flags, unsigned long usp, -+ unsigned long kthread_arg, struct task_struct *p, unsigned long tls) - { - struct pt_regs *cregs = &(p->thread.regs); - void *stack = task_stack_page(p); -@@ -254,9 +254,9 @@ copy_thread(unsigned long clone_flags, unsigned long usp, - cregs->ksp = (unsigned long)stack + THREAD_SZ_ALGN + FRAME_SIZE; - cregs->kpc = (unsigned long) &child_return; - -- /* Setup thread TLS area from the 4th parameter in clone */ -+ /* Setup thread TLS area */ - if (clone_flags & CLONE_SETTLS) -- cregs->cr27 = cregs->gr[23]; -+ cregs->cr27 = tls; - } - - return 0; -diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig -index 8eebbc8860bb..ade9699aa0dd 100644 ---- a/arch/riscv/Kconfig -+++ b/arch/riscv/Kconfig -@@ -61,6 +61,7 @@ config RISCV - select SPARSEMEM_STATIC if 32BIT - select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU - select HAVE_ARCH_MMAP_RND_BITS -+ select HAVE_COPY_THREAD_TLS - - config ARCH_MMAP_RND_BITS_MIN - default 18 if 64BIT -diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c -index 85e3c39bb60b..330b34706aa0 100644 ---- a/arch/riscv/kernel/process.c -+++ b/arch/riscv/kernel/process.c -@@ -99,8 +99,8 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) - return 0; - } - --int copy_thread(unsigned long clone_flags, unsigned long usp, -- unsigned long arg, struct task_struct *p) -+int copy_thread_tls(unsigned long clone_flags, unsigned long usp, -+ unsigned long arg, struct task_struct *p, unsigned long tls) - { - struct pt_regs *childregs = task_pt_regs(p); - -@@ -120,7 +120,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, - if (usp) /* User fork */ - childregs->sp = usp; - if (clone_flags & CLONE_SETTLS) -- childregs->tp = childregs->a5; -+ childregs->tp = tls; - childregs->a0 = 0; /* Return value of fork() */ - p->thread.ra = (unsigned long)ret_from_fork; - } -diff --git a/arch/um/Kconfig b/arch/um/Kconfig -index fec6b4ca2b6e..c56d3526a3bd 100644 ---- a/arch/um/Kconfig -+++ b/arch/um/Kconfig -@@ -14,6 +14,7 @@ config UML - select HAVE_FUTEX_CMPXCHG if FUTEX - select HAVE_DEBUG_KMEMLEAK - select HAVE_DEBUG_BUGVERBOSE -+ select HAVE_COPY_THREAD_TLS - select GENERIC_IRQ_SHOW - select GENERIC_CPU_DEVICES - select GENERIC_CLOCKEVENTS -diff --git a/arch/um/include/asm/ptrace-generic.h b/arch/um/include/asm/ptrace-generic.h -index 81c647ef9c6c..adf91ef553ae 100644 ---- a/arch/um/include/asm/ptrace-generic.h -+++ b/arch/um/include/asm/ptrace-generic.h -@@ -36,7 +36,7 @@ extern long subarch_ptrace(struct task_struct *child, long request, - extern unsigned long getreg(struct task_struct *child, int regno); - extern int putreg(struct task_struct *child, int regno, unsigned long value); - --extern int arch_copy_tls(struct task_struct *new); -+extern int arch_set_tls(struct task_struct *new, unsigned long tls); - extern void clear_flushed_tls(struct task_struct *task); - extern int syscall_trace_enter(struct pt_regs *regs); - extern void syscall_trace_leave(struct pt_regs *regs); -diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c -index 263a8f069133..17045e7211bf 100644 ---- a/arch/um/kernel/process.c -+++ b/arch/um/kernel/process.c -@@ -153,8 +153,8 @@ void fork_handler(void) - userspace(¤t->thread.regs.regs, current_thread_info()->aux_fp_regs); - } - --int copy_thread(unsigned long clone_flags, unsigned long sp, -- unsigned long arg, struct task_struct * p) -+int copy_thread_tls(unsigned long clone_flags, unsigned long sp, -+ unsigned long arg, struct task_struct * p, unsigned long tls) - { - void (*handler)(void); - int kthread = current->flags & PF_KTHREAD; -@@ -188,7 +188,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, - * Set a new TLS for the child thread? - */ - if (clone_flags & CLONE_SETTLS) -- ret = arch_copy_tls(p); -+ ret = arch_set_tls(p, tls); - } - - return ret; -diff --git a/arch/x86/um/tls_32.c b/arch/x86/um/tls_32.c -index 5bd949da7a4a..ac8eee093f9c 100644 ---- a/arch/x86/um/tls_32.c -+++ b/arch/x86/um/tls_32.c -@@ -215,14 +215,12 @@ static int set_tls_entry(struct task_struct* task, struct user_desc *info, - return 0; - } - --int arch_copy_tls(struct task_struct *new) -+int arch_set_tls(struct task_struct *new, unsigned long tls) - { - struct user_desc info; - int idx, ret = -EFAULT; - -- if (copy_from_user(&info, -- (void __user *) UPT_SI(&new->thread.regs.regs), -- sizeof(info))) -+ if (copy_from_user(&info, (void __user *) tls, sizeof(info))) - goto out; - - ret = -EINVAL; -diff --git a/arch/x86/um/tls_64.c b/arch/x86/um/tls_64.c -index 3a621e0d3925..ebd3855d9b13 100644 ---- a/arch/x86/um/tls_64.c -+++ b/arch/x86/um/tls_64.c -@@ -6,14 +6,13 @@ void clear_flushed_tls(struct task_struct *task) - { - } - --int arch_copy_tls(struct task_struct *t) -+int arch_set_tls(struct task_struct *t, unsigned long tls) - { - /* - * If CLONE_SETTLS is set, we need to save the thread id -- * (which is argument 5, child_tid, of clone) so it can be set -- * during context switches. -+ * so it can be set during context switches. - */ -- t->thread.arch.fs = t->thread.regs.regs.gp[R8 / sizeof(long)]; -+ t->thread.arch.fs = tls; - - return 0; - } -diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig -index a8e7beb6b7b5..8352037322df 100644 ---- a/arch/xtensa/Kconfig -+++ b/arch/xtensa/Kconfig -@@ -22,6 +22,7 @@ config XTENSA - select HAVE_ARCH_JUMP_LABEL - select HAVE_ARCH_KASAN if MMU - select HAVE_ARCH_TRACEHOOK -+ select HAVE_COPY_THREAD_TLS - select HAVE_DEBUG_KMEMLEAK - select HAVE_DMA_CONTIGUOUS - select HAVE_EXIT_THREAD -diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c -index db278a9e80c7..7cbf8bd6d922 100644 ---- a/arch/xtensa/kernel/process.c -+++ b/arch/xtensa/kernel/process.c -@@ -202,8 +202,9 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) - * involved. Much simpler to just not copy those live frames across. - */ - --int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn, -- unsigned long thread_fn_arg, struct task_struct *p) -+int copy_thread_tls(unsigned long clone_flags, unsigned long usp_thread_fn, -+ unsigned long thread_fn_arg, struct task_struct *p, -+ unsigned long tls) - { - struct pt_regs *childregs = task_pt_regs(p); - -@@ -264,9 +265,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn, - ®s->areg[XCHAL_NUM_AREGS - len/4], len); - } - -- /* The thread pointer is passed in the '4th argument' (= a5) */ - if (clone_flags & CLONE_SETTLS) -- childregs->threadptr = childregs->areg[5]; -+ childregs->threadptr = tls; - } else { - p->thread.ra = MAKE_RA_FOR_CALL( - (unsigned long)ret_from_kernel_thread, 1); -diff --git a/drivers/char/tpm/tpm-dev-common.c b/drivers/char/tpm/tpm-dev-common.c -index b23b0b999232..87f449340202 100644 ---- a/drivers/char/tpm/tpm-dev-common.c -+++ b/drivers/char/tpm/tpm-dev-common.c -@@ -130,7 +130,7 @@ ssize_t tpm_common_read(struct file *file, char __user *buf, - priv->response_read = true; - - ret_size = min_t(ssize_t, size, priv->response_length); -- if (!ret_size) { -+ if (ret_size <= 0) { - priv->response_length = 0; - goto out; - } -diff --git a/drivers/char/tpm/tpm-dev.h b/drivers/char/tpm/tpm-dev.h -index 1089fc0bb290..f3742bcc73e3 100644 ---- a/drivers/char/tpm/tpm-dev.h -+++ b/drivers/char/tpm/tpm-dev.h -@@ -14,7 +14,7 @@ struct file_priv { - struct work_struct timeout_work; - struct work_struct async_work; - wait_queue_head_t async_wait; -- size_t response_length; -+ ssize_t response_length; - bool response_read; - bool command_enqueued; - -diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c -index f528fc39ea6b..c3181ea9f271 100644 ---- a/drivers/char/tpm/tpm_tis_core.c -+++ b/drivers/char/tpm/tpm_tis_core.c -@@ -899,13 +899,13 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, - - if (wait_startup(chip, 0) != 0) { - rc = -ENODEV; -- goto err_start; -+ goto out_err; - } - - /* Take control of the TPM's interrupt hardware and shut it off */ - rc = tpm_tis_read32(priv, TPM_INT_ENABLE(priv->locality), &intmask); - if (rc < 0) -- goto err_start; -+ goto out_err; - - intmask |= TPM_INTF_CMD_READY_INT | TPM_INTF_LOCALITY_CHANGE_INT | - TPM_INTF_DATA_AVAIL_INT | TPM_INTF_STS_VALID_INT; -@@ -914,21 +914,21 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, - - rc = tpm_chip_start(chip); - if (rc) -- goto err_start; -- -+ goto out_err; - rc = tpm2_probe(chip); -+ tpm_chip_stop(chip); - if (rc) -- goto err_probe; -+ goto out_err; - - rc = tpm_tis_read32(priv, TPM_DID_VID(0), &vendor); - if (rc < 0) -- goto err_probe; -+ goto out_err; - - priv->manufacturer_id = vendor; - - rc = tpm_tis_read8(priv, TPM_RID(0), &rid); - if (rc < 0) -- goto err_probe; -+ goto out_err; - - dev_info(dev, "%s TPM (device-id 0x%X, rev-id %d)\n", - (chip->flags & TPM_CHIP_FLAG_TPM2) ? "2.0" : "1.2", -@@ -937,13 +937,13 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, - probe = probe_itpm(chip); - if (probe < 0) { - rc = -ENODEV; -- goto err_probe; -+ goto out_err; - } - - /* Figure out the capabilities */ - rc = tpm_tis_read32(priv, TPM_INTF_CAPS(priv->locality), &intfcaps); - if (rc < 0) -- goto err_probe; -+ goto out_err; - - dev_dbg(dev, "TPM interface capabilities (0x%x):\n", - intfcaps); -@@ -977,10 +977,9 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, - if (tpm_get_timeouts(chip)) { - dev_err(dev, "Could not get TPM timeouts and durations\n"); - rc = -ENODEV; -- goto err_probe; -+ goto out_err; - } - -- chip->flags |= TPM_CHIP_FLAG_IRQ; - if (irq) { - tpm_tis_probe_irq_single(chip, intmask, IRQF_SHARED, - irq); -@@ -992,18 +991,15 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, - } - } - -- tpm_chip_stop(chip); -- - rc = tpm_chip_register(chip); - if (rc) -- goto err_start; -- -- return 0; -+ goto out_err; - --err_probe: -- tpm_chip_stop(chip); -+ if (chip->ops->clk_enable != NULL) -+ chip->ops->clk_enable(chip, false); - --err_start: -+ return 0; -+out_err: - if ((chip->ops != NULL) && (chip->ops->clk_enable != NULL)) - chip->ops->clk_enable(chip, false); - -diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c -index 59ccfd24627d..1f98e988c0d3 100644 ---- a/drivers/gpio/gpiolib-acpi.c -+++ b/drivers/gpio/gpiolib-acpi.c -@@ -21,11 +21,19 @@ - #include "gpiolib.h" - #include "gpiolib-acpi.h" - -+#define QUIRK_NO_EDGE_EVENTS_ON_BOOT 0x01l -+#define QUIRK_NO_WAKEUP 0x02l -+ - static int run_edge_events_on_boot = -1; - module_param(run_edge_events_on_boot, int, 0444); - MODULE_PARM_DESC(run_edge_events_on_boot, - "Run edge _AEI event-handlers at boot: 0=no, 1=yes, -1=auto"); - -+static int honor_wakeup = -1; -+module_param(honor_wakeup, int, 0444); -+MODULE_PARM_DESC(honor_wakeup, -+ "Honor the ACPI wake-capable flag: 0=no, 1=yes, -1=auto"); -+ - /** - * struct acpi_gpio_event - ACPI GPIO event handler data - * -@@ -274,7 +282,7 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, - event->handle = evt_handle; - event->handler = handler; - event->irq = irq; -- event->irq_is_wake = agpio->wake_capable == ACPI_WAKE_CAPABLE; -+ event->irq_is_wake = honor_wakeup && agpio->wake_capable == ACPI_WAKE_CAPABLE; - event->pin = pin; - event->desc = desc; - -@@ -1302,7 +1310,7 @@ static int acpi_gpio_handle_deferred_request_irqs(void) - /* We must use _sync so that this runs after the first deferred_probe run */ - late_initcall_sync(acpi_gpio_handle_deferred_request_irqs); - --static const struct dmi_system_id run_edge_events_on_boot_blacklist[] = { -+static const struct dmi_system_id gpiolib_acpi_quirks[] = { - { - /* - * The Minix Neo Z83-4 has a micro-USB-B id-pin handler for -@@ -1312,7 +1320,8 @@ static const struct dmi_system_id run_edge_events_on_boot_blacklist[] = { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "MINIX"), - DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"), -- } -+ }, -+ .driver_data = (void *)QUIRK_NO_EDGE_EVENTS_ON_BOOT, - }, - { - /* -@@ -1324,20 +1333,52 @@ static const struct dmi_system_id run_edge_events_on_boot_blacklist[] = { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Wortmann_AG"), - DMI_MATCH(DMI_PRODUCT_NAME, "TERRA_PAD_1061"), -- } -+ }, -+ .driver_data = (void *)QUIRK_NO_EDGE_EVENTS_ON_BOOT, -+ }, -+ { -+ /* -+ * Various HP X2 10 Cherry Trail models use an external -+ * embedded-controller connected via I2C + an ACPI GPIO -+ * event handler. The embedded controller generates various -+ * spurious wakeup events when suspended. So disable wakeup -+ * for its handler (it uses the only ACPI GPIO event handler). -+ * This breaks wakeup when opening the lid, the user needs -+ * to press the power-button to wakeup the system. The -+ * alternative is suspend simply not working, which is worse. -+ */ -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "HP"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "HP x2 Detachable 10-p0XX"), -+ }, -+ .driver_data = (void *)QUIRK_NO_WAKEUP, - }, - {} /* Terminating entry */ - }; - - static int acpi_gpio_setup_params(void) - { -+ const struct dmi_system_id *id; -+ long quirks = 0; -+ -+ id = dmi_first_match(gpiolib_acpi_quirks); -+ if (id) -+ quirks = (long)id->driver_data; -+ - if (run_edge_events_on_boot < 0) { -- if (dmi_check_system(run_edge_events_on_boot_blacklist)) -+ if (quirks & QUIRK_NO_EDGE_EVENTS_ON_BOOT) - run_edge_events_on_boot = 0; - else - run_edge_events_on_boot = 1; - } - -+ if (honor_wakeup < 0) { -+ if (quirks & QUIRK_NO_WAKEUP) -+ honor_wakeup = 0; -+ else -+ honor_wakeup = 1; -+ } -+ - return 0; - } - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c -index b19157b19fa0..33a1099e2f33 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c -@@ -145,7 +145,7 @@ int amdgpu_async_gfx_ring = 1; - int amdgpu_mcbp = 0; - int amdgpu_discovery = -1; - int amdgpu_mes = 0; --int amdgpu_noretry = 1; -+int amdgpu_noretry; - - struct amdgpu_mgpu_info mgpu_info = { - .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), -@@ -613,7 +613,7 @@ MODULE_PARM_DESC(mes, - module_param_named(mes, amdgpu_mes, int, 0444); - - MODULE_PARM_DESC(noretry, -- "Disable retry faults (0 = retry enabled, 1 = retry disabled (default))"); -+ "Disable retry faults (0 = retry enabled (default), 1 = retry disabled)"); - module_param_named(noretry, amdgpu_noretry, int, 0644); - - #ifdef CONFIG_HSA_AMD -diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c -index 86c17896b532..a48a4c21b1b3 100644 ---- a/drivers/gpu/drm/drm_dp_mst_topology.c -+++ b/drivers/gpu/drm/drm_dp_mst_topology.c -@@ -339,7 +339,7 @@ static void drm_dp_encode_sideband_req(struct drm_dp_sideband_msg_req_body *req, - memcpy(&buf[idx], req->u.i2c_read.transactions[i].bytes, req->u.i2c_read.transactions[i].num_bytes); - idx += req->u.i2c_read.transactions[i].num_bytes; - -- buf[idx] = (req->u.i2c_read.transactions[i].no_stop_bit & 0x1) << 5; -+ buf[idx] = (req->u.i2c_read.transactions[i].no_stop_bit & 0x1) << 4; - buf[idx] |= (req->u.i2c_read.transactions[i].i2c_transaction_delay & 0xf); - idx++; - } -diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c -index a7ba5b4902d6..8d193a58363d 100644 ---- a/drivers/gpu/drm/drm_fb_helper.c -+++ b/drivers/gpu/drm/drm_fb_helper.c -@@ -1320,7 +1320,7 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, - * Changes struct fb_var_screeninfo are currently not pushed back - * to KMS, hence fail if different settings are requested. - */ -- if (var->bits_per_pixel != fb->format->cpp[0] * 8 || -+ if (var->bits_per_pixel > fb->format->cpp[0] * 8 || - var->xres > fb->width || var->yres > fb->height || - var->xres_virtual > fb->width || var->yres_virtual > fb->height) { - DRM_DEBUG("fb requested width/height/bpp can't fit in current fb " -@@ -1345,6 +1345,11 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, - drm_fb_helper_fill_pixel_fmt(var, fb->format->depth); - } - -+ /* -+ * Likewise, bits_per_pixel should be rounded up to a supported value. -+ */ -+ var->bits_per_pixel = fb->format->cpp[0] * 8; -+ - /* - * drm fbdev emulation doesn't support changing the pixel format at all, - * so reject all pixel format changing requests. -diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c -index d564bfcab6a3..4949b5ad860f 100644 ---- a/drivers/gpu/drm/i915/gt/intel_lrc.c -+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c -@@ -2132,6 +2132,14 @@ static u32 *gen9_init_indirectctx_bb(struct intel_engine_cs *engine, u32 *batch) - /* WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt,glk */ - batch = gen8_emit_flush_coherentl3_wa(engine, batch); - -+ /* WaClearSlmSpaceAtContextSwitch:skl,bxt,kbl,glk,cfl */ -+ batch = gen8_emit_pipe_control(batch, -+ PIPE_CONTROL_FLUSH_L3 | -+ PIPE_CONTROL_GLOBAL_GTT_IVB | -+ PIPE_CONTROL_CS_STALL | -+ PIPE_CONTROL_QW_WRITE, -+ slm_offset(engine)); -+ - batch = emit_lri(batch, lri, ARRAY_SIZE(lri)); - - /* WaMediaPoolStateCmdInWABB:bxt,glk */ -@@ -3716,9 +3724,11 @@ intel_execlists_create_virtual(struct i915_gem_context *ctx, - ve->base.i915 = ctx->i915; - ve->base.gt = siblings[0]->gt; - ve->base.id = -1; -+ - ve->base.class = OTHER_CLASS; - ve->base.uabi_class = I915_ENGINE_CLASS_INVALID; - ve->base.instance = I915_ENGINE_CLASS_INVALID_VIRTUAL; -+ ve->base.uabi_instance = I915_ENGINE_CLASS_INVALID_VIRTUAL; - - /* - * The decision on whether to submit a request using semaphores -diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h -index f8ee9aba3955..7b6e68f082f8 100644 ---- a/drivers/gpu/drm/i915/i915_reg.h -+++ b/drivers/gpu/drm/i915/i915_reg.h -@@ -4049,7 +4049,13 @@ enum { - #define GWUNIT_CLKGATE_DIS (1 << 16) - - #define UNSLICE_UNIT_LEVEL_CLKGATE _MMIO(0x9434) --#define VFUNIT_CLKGATE_DIS (1 << 20) -+#define VFUNIT_CLKGATE_DIS REG_BIT(20) -+#define HSUNIT_CLKGATE_DIS REG_BIT(8) -+#define VSUNIT_CLKGATE_DIS REG_BIT(3) -+ -+#define UNSLICE_UNIT_LEVEL_CLKGATE2 _MMIO(0x94e4) -+#define VSUNIT_CLKGATE_DIS_TGL REG_BIT(19) -+#define PSDUNIT_CLKGATE_DIS REG_BIT(5) - - #define INF_UNIT_LEVEL_CLKGATE _MMIO(0x9560) - #define CGPSF_CLKGATE_DIS (1 << 3) -diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c -index 2efe1d12d5a9..3ccfc025fde2 100644 ---- a/drivers/gpu/drm/i915/intel_pm.c -+++ b/drivers/gpu/drm/i915/intel_pm.c -@@ -9194,6 +9194,17 @@ static void icl_init_clock_gating(struct drm_i915_private *dev_priv) - /* WaEnable32PlaneMode:icl */ - I915_WRITE(GEN9_CSFE_CHICKEN1_RCS, - _MASKED_BIT_ENABLE(GEN11_ENABLE_32_PLANE_MODE)); -+ -+ /* -+ * Wa_1408615072:icl,ehl (vsunit) -+ * Wa_1407596294:icl,ehl (hsunit) -+ */ -+ intel_uncore_rmw(&dev_priv->uncore, UNSLICE_UNIT_LEVEL_CLKGATE, -+ 0, VSUNIT_CLKGATE_DIS | HSUNIT_CLKGATE_DIS); -+ -+ /* Wa_1407352427:icl,ehl */ -+ intel_uncore_rmw(&dev_priv->uncore, UNSLICE_UNIT_LEVEL_CLKGATE2, -+ 0, PSDUNIT_CLKGATE_DIS); - } - - static void cnp_init_clock_gating(struct drm_i915_private *dev_priv) -diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c -index b89439ed210d..27c80c9e2b83 100644 ---- a/drivers/gpu/drm/sun4i/sun4i_tcon.c -+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c -@@ -488,7 +488,7 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon, - - WARN_ON(!tcon->quirks->has_channel_0); - -- tcon->dclk_min_div = 1; -+ tcon->dclk_min_div = tcon->quirks->dclk_min_div; - tcon->dclk_max_div = 127; - sun4i_tcon0_mode_set_common(tcon, mode); - -@@ -1425,12 +1425,14 @@ static int sun8i_r40_tcon_tv_set_mux(struct sun4i_tcon *tcon, - static const struct sun4i_tcon_quirks sun4i_a10_quirks = { - .has_channel_0 = true, - .has_channel_1 = true, -+ .dclk_min_div = 4, - .set_mux = sun4i_a10_tcon_set_mux, - }; - - static const struct sun4i_tcon_quirks sun5i_a13_quirks = { - .has_channel_0 = true, - .has_channel_1 = true, -+ .dclk_min_div = 4, - .set_mux = sun5i_a13_tcon_set_mux, - }; - -@@ -1439,6 +1441,7 @@ static const struct sun4i_tcon_quirks sun6i_a31_quirks = { - .has_channel_1 = true, - .has_lvds_alt = true, - .needs_de_be_mux = true, -+ .dclk_min_div = 1, - .set_mux = sun6i_tcon_set_mux, - }; - -@@ -1446,11 +1449,13 @@ static const struct sun4i_tcon_quirks sun6i_a31s_quirks = { - .has_channel_0 = true, - .has_channel_1 = true, - .needs_de_be_mux = true, -+ .dclk_min_div = 1, - }; - - static const struct sun4i_tcon_quirks sun7i_a20_quirks = { - .has_channel_0 = true, - .has_channel_1 = true, -+ .dclk_min_div = 4, - /* Same display pipeline structure as A10 */ - .set_mux = sun4i_a10_tcon_set_mux, - }; -@@ -1458,11 +1463,13 @@ static const struct sun4i_tcon_quirks sun7i_a20_quirks = { - static const struct sun4i_tcon_quirks sun8i_a33_quirks = { - .has_channel_0 = true, - .has_lvds_alt = true, -+ .dclk_min_div = 1, - }; - - static const struct sun4i_tcon_quirks sun8i_a83t_lcd_quirks = { - .supports_lvds = true, - .has_channel_0 = true, -+ .dclk_min_div = 1, - }; - - static const struct sun4i_tcon_quirks sun8i_a83t_tv_quirks = { -@@ -1476,11 +1483,13 @@ static const struct sun4i_tcon_quirks sun8i_r40_tv_quirks = { - - static const struct sun4i_tcon_quirks sun8i_v3s_quirks = { - .has_channel_0 = true, -+ .dclk_min_div = 1, - }; - - static const struct sun4i_tcon_quirks sun9i_a80_tcon_lcd_quirks = { -- .has_channel_0 = true, -- .needs_edp_reset = true, -+ .has_channel_0 = true, -+ .needs_edp_reset = true, -+ .dclk_min_div = 1, - }; - - static const struct sun4i_tcon_quirks sun9i_a80_tcon_tv_quirks = { -diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.h b/drivers/gpu/drm/sun4i/sun4i_tcon.h -index f9f1fe80b206..a62ec826ae71 100644 ---- a/drivers/gpu/drm/sun4i/sun4i_tcon.h -+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.h -@@ -224,6 +224,7 @@ struct sun4i_tcon_quirks { - bool needs_de_be_mux; /* sun6i needs mux to select backend */ - bool needs_edp_reset; /* a80 edp reset needed for tcon0 access */ - bool supports_lvds; /* Does the TCON support an LVDS output? */ -+ u8 dclk_min_div; /* minimum divider for TCON0 DCLK */ - - /* callback to handle tcon muxing options */ - int (*set_mux)(struct sun4i_tcon *, const struct drm_encoder *); -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index e0b241bd3070..851fe54ea59e 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -288,6 +288,12 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign - offset = report->size; - report->size += parser->global.report_size * parser->global.report_count; - -+ /* Total size check: Allow for possible report index byte */ -+ if (report->size > (HID_MAX_BUFFER_SIZE - 1) << 3) { -+ hid_err(parser->device, "report is too long\n"); -+ return -1; -+ } -+ - if (!parser->local.usage_index) /* Ignore padding fields */ - return 0; - -diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c -index 63855f275a38..dea9cc65bf80 100644 ---- a/drivers/hid/hid-input.c -+++ b/drivers/hid/hid-input.c -@@ -1132,9 +1132,15 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel - } - - mapped: -- if (device->driver->input_mapped && device->driver->input_mapped(device, -- hidinput, field, usage, &bit, &max) < 0) -- goto ignore; -+ if (device->driver->input_mapped && -+ device->driver->input_mapped(device, hidinput, field, usage, -+ &bit, &max) < 0) { -+ /* -+ * The driver indicated that no further generic handling -+ * of the usage is desired. -+ */ -+ return; -+ } - - set_bit(usage->type, input->evbit); - -@@ -1215,9 +1221,11 @@ mapped: - set_bit(MSC_SCAN, input->mscbit); - } - --ignore: - return; - -+ignore: -+ usage->type = 0; -+ usage->code = 0; - } - - static void hidinput_handle_scroll(struct hid_usage *usage, -diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c -index bbc6ec1aa5cb..c25e95c19cad 100644 ---- a/drivers/hid/hidraw.c -+++ b/drivers/hid/hidraw.c -@@ -252,10 +252,10 @@ static __poll_t hidraw_poll(struct file *file, poll_table *wait) - - poll_wait(file, &list->hidraw->wait, wait); - if (list->head != list->tail) -- return EPOLLIN | EPOLLRDNORM | EPOLLOUT; -+ return EPOLLIN | EPOLLRDNORM; - if (!list->hidraw->exist) - return EPOLLERR | EPOLLHUP; -- return 0; -+ return EPOLLOUT | EPOLLWRNORM; - } - - static int hidraw_open(struct inode *inode, struct file *file) -diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c -index fa0cc0899827..935c3d0a3b63 100644 ---- a/drivers/hid/uhid.c -+++ b/drivers/hid/uhid.c -@@ -772,7 +772,7 @@ static __poll_t uhid_char_poll(struct file *file, poll_table *wait) - if (uhid->head != uhid->tail) - return EPOLLIN | EPOLLRDNORM; - -- return 0; -+ return EPOLLOUT | EPOLLWRNORM; - } - - static const struct file_operations uhid_fops = { -diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c -index 1f9bc4483465..c879b214a479 100644 ---- a/drivers/hid/usbhid/hiddev.c -+++ b/drivers/hid/usbhid/hiddev.c -@@ -241,12 +241,51 @@ static int hiddev_release(struct inode * inode, struct file * file) - return 0; - } - -+static int __hiddev_open(struct hiddev *hiddev, struct file *file) -+{ -+ struct hiddev_list *list; -+ int error; -+ -+ lockdep_assert_held(&hiddev->existancelock); -+ -+ list = vzalloc(sizeof(*list)); -+ if (!list) -+ return -ENOMEM; -+ -+ mutex_init(&list->thread_lock); -+ list->hiddev = hiddev; -+ -+ if (!hiddev->open++) { -+ error = hid_hw_power(hiddev->hid, PM_HINT_FULLON); -+ if (error < 0) -+ goto err_drop_count; -+ -+ error = hid_hw_open(hiddev->hid); -+ if (error < 0) -+ goto err_normal_power; -+ } -+ -+ spin_lock_irq(&hiddev->list_lock); -+ list_add_tail(&list->node, &hiddev->list); -+ spin_unlock_irq(&hiddev->list_lock); -+ -+ file->private_data = list; -+ -+ return 0; -+ -+err_normal_power: -+ hid_hw_power(hiddev->hid, PM_HINT_NORMAL); -+err_drop_count: -+ hiddev->open--; -+ vfree(list); -+ return error; -+} -+ - /* - * open file op - */ - static int hiddev_open(struct inode *inode, struct file *file) - { -- struct hiddev_list *list; - struct usb_interface *intf; - struct hid_device *hid; - struct hiddev *hiddev; -@@ -255,66 +294,14 @@ static int hiddev_open(struct inode *inode, struct file *file) - intf = usbhid_find_interface(iminor(inode)); - if (!intf) - return -ENODEV; -+ - hid = usb_get_intfdata(intf); - hiddev = hid->hiddev; - -- if (!(list = vzalloc(sizeof(struct hiddev_list)))) -- return -ENOMEM; -- mutex_init(&list->thread_lock); -- list->hiddev = hiddev; -- file->private_data = list; -- -- /* -- * no need for locking because the USB major number -- * is shared which usbcore guards against disconnect -- */ -- if (list->hiddev->exist) { -- if (!list->hiddev->open++) { -- res = hid_hw_open(hiddev->hid); -- if (res < 0) -- goto bail; -- } -- } else { -- res = -ENODEV; -- goto bail; -- } -- -- spin_lock_irq(&list->hiddev->list_lock); -- list_add_tail(&list->node, &hiddev->list); -- spin_unlock_irq(&list->hiddev->list_lock); -- - mutex_lock(&hiddev->existancelock); -- /* -- * recheck exist with existance lock held to -- * avoid opening a disconnected device -- */ -- if (!list->hiddev->exist) { -- res = -ENODEV; -- goto bail_unlock; -- } -- if (!list->hiddev->open++) -- if (list->hiddev->exist) { -- struct hid_device *hid = hiddev->hid; -- res = hid_hw_power(hid, PM_HINT_FULLON); -- if (res < 0) -- goto bail_unlock; -- res = hid_hw_open(hid); -- if (res < 0) -- goto bail_normal_power; -- } -- mutex_unlock(&hiddev->existancelock); -- return 0; --bail_normal_power: -- hid_hw_power(hid, PM_HINT_NORMAL); --bail_unlock: -+ res = hiddev->exist ? __hiddev_open(hiddev, file) : -ENODEV; - mutex_unlock(&hiddev->existancelock); - -- spin_lock_irq(&list->hiddev->list_lock); -- list_del(&list->node); -- spin_unlock_irq(&list->hiddev->list_lock); --bail: -- file->private_data = NULL; -- vfree(list); - return res; - } - -diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c -index 5f6a4985f2bc..810a942eaa8e 100644 ---- a/drivers/i2c/i2c-core-base.c -+++ b/drivers/i2c/i2c-core-base.c -@@ -186,10 +186,11 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap) - * If we can set SDA, we will always create a STOP to ensure additional - * pulses will do no harm. This is achieved by letting SDA follow SCL - * half a cycle later. Check the 'incomplete_write_byte' fault injector -- * for details. -+ * for details. Note that we must honour tsu:sto, 4us, but lets use 5us -+ * here for simplicity. - */ - bri->set_scl(adap, scl); -- ndelay(RECOVERY_NDELAY / 2); -+ ndelay(RECOVERY_NDELAY); - if (bri->set_sda) - bri->set_sda(adap, scl); - ndelay(RECOVERY_NDELAY / 2); -@@ -211,7 +212,13 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap) - scl = !scl; - bri->set_scl(adap, scl); - /* Creating STOP again, see above */ -- ndelay(RECOVERY_NDELAY / 2); -+ if (scl) { -+ /* Honour minimum tsu:sto */ -+ ndelay(RECOVERY_NDELAY); -+ } else { -+ /* Honour minimum tf and thd:dat */ -+ ndelay(RECOVERY_NDELAY / 2); -+ } - if (bri->set_sda) - bri->set_sda(adap, scl); - ndelay(RECOVERY_NDELAY / 2); -diff --git a/drivers/infiniband/hw/hfi1/tid_rdma.c b/drivers/infiniband/hw/hfi1/tid_rdma.c -index e53f542b60af..8a2e0d9351e9 100644 ---- a/drivers/infiniband/hw/hfi1/tid_rdma.c -+++ b/drivers/infiniband/hw/hfi1/tid_rdma.c -@@ -4633,6 +4633,15 @@ void hfi1_rc_rcv_tid_rdma_ack(struct hfi1_packet *packet) - */ - fpsn = full_flow_psn(flow, flow->flow_state.spsn); - req->r_ack_psn = psn; -+ /* -+ * If resync_psn points to the last flow PSN for a -+ * segment and the new segment (likely from a new -+ * request) starts with a new generation number, we -+ * need to adjust resync_psn accordingly. -+ */ -+ if (flow->flow_state.generation != -+ (resync_psn >> HFI1_KDETH_BTH_SEQ_SHIFT)) -+ resync_psn = mask_psn(fpsn - 1); - flow->resync_npkts += - delta_psn(mask_psn(resync_psn + 1), fpsn); - /* -diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c -index d7dd6fcf2db0..f918fca9ada3 100644 ---- a/drivers/input/evdev.c -+++ b/drivers/input/evdev.c -@@ -224,13 +224,13 @@ static void __pass_event(struct evdev_client *client, - */ - client->tail = (client->head - 2) & (client->bufsize - 1); - -- client->buffer[client->tail].input_event_sec = -- event->input_event_sec; -- client->buffer[client->tail].input_event_usec = -- event->input_event_usec; -- client->buffer[client->tail].type = EV_SYN; -- client->buffer[client->tail].code = SYN_DROPPED; -- client->buffer[client->tail].value = 0; -+ client->buffer[client->tail] = (struct input_event) { -+ .input_event_sec = event->input_event_sec, -+ .input_event_usec = event->input_event_usec, -+ .type = EV_SYN, -+ .code = SYN_DROPPED, -+ .value = 0, -+ }; - - client->packet_head = client->tail; - } -diff --git a/drivers/input/input.c b/drivers/input/input.c -index 55086279d044..ee6c3234df36 100644 ---- a/drivers/input/input.c -+++ b/drivers/input/input.c -@@ -878,16 +878,18 @@ static int input_default_setkeycode(struct input_dev *dev, - } - } - -- __clear_bit(*old_keycode, dev->keybit); -- __set_bit(ke->keycode, dev->keybit); -- -- for (i = 0; i < dev->keycodemax; i++) { -- if (input_fetch_keycode(dev, i) == *old_keycode) { -- __set_bit(*old_keycode, dev->keybit); -- break; /* Setting the bit twice is useless, so break */ -+ if (*old_keycode <= KEY_MAX) { -+ __clear_bit(*old_keycode, dev->keybit); -+ for (i = 0; i < dev->keycodemax; i++) { -+ if (input_fetch_keycode(dev, i) == *old_keycode) { -+ __set_bit(*old_keycode, dev->keybit); -+ /* Setting the bit twice is useless, so break */ -+ break; -+ } - } - } - -+ __set_bit(ke->keycode, dev->keybit); - return 0; - } - -@@ -943,9 +945,13 @@ int input_set_keycode(struct input_dev *dev, - * Simulate keyup event if keycode is not present - * in the keymap anymore - */ -- if (test_bit(EV_KEY, dev->evbit) && -- !is_event_supported(old_keycode, dev->keybit, KEY_MAX) && -- __test_and_clear_bit(old_keycode, dev->key)) { -+ if (old_keycode > KEY_MAX) { -+ dev_warn(dev->dev.parent ?: &dev->dev, -+ "%s: got too big old keycode %#x\n", -+ __func__, old_keycode); -+ } else if (test_bit(EV_KEY, dev->evbit) && -+ !is_event_supported(old_keycode, dev->keybit, KEY_MAX) && -+ __test_and_clear_bit(old_keycode, dev->key)) { - struct input_value vals[] = { - { EV_KEY, old_keycode, 0 }, - input_value_sync -diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c -index 84051f20b18a..002654ec7040 100644 ---- a/drivers/input/misc/uinput.c -+++ b/drivers/input/misc/uinput.c -@@ -74,12 +74,16 @@ static int uinput_dev_event(struct input_dev *dev, - struct uinput_device *udev = input_get_drvdata(dev); - struct timespec64 ts; - -- udev->buff[udev->head].type = type; -- udev->buff[udev->head].code = code; -- udev->buff[udev->head].value = value; - ktime_get_ts64(&ts); -- udev->buff[udev->head].input_event_sec = ts.tv_sec; -- udev->buff[udev->head].input_event_usec = ts.tv_nsec / NSEC_PER_USEC; -+ -+ udev->buff[udev->head] = (struct input_event) { -+ .input_event_sec = ts.tv_sec, -+ .input_event_usec = ts.tv_nsec / NSEC_PER_USEC, -+ .type = type, -+ .code = code, -+ .value = value, -+ }; -+ - udev->head = (udev->head + 1) % UINPUT_BUFFER_SIZE; - - wake_up_interruptible(&udev->waitq); -diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c -index 4ce797d4259f..67aa317de6db 100644 ---- a/drivers/iommu/intel-iommu.c -+++ b/drivers/iommu/intel-iommu.c -@@ -5786,6 +5786,13 @@ static void intel_iommu_apply_resv_region(struct device *dev, - WARN_ON_ONCE(!reserve_iova(&dmar_domain->iovad, start, end)); - } - -+static struct iommu_group *intel_iommu_device_group(struct device *dev) -+{ -+ if (dev_is_pci(dev)) -+ return pci_device_group(dev); -+ return generic_device_group(dev); -+} -+ - #ifdef CONFIG_INTEL_IOMMU_SVM - struct intel_iommu *intel_svm_device_to_iommu(struct device *dev) - { -@@ -5958,7 +5965,7 @@ const struct iommu_ops intel_iommu_ops = { - .get_resv_regions = intel_iommu_get_resv_regions, - .put_resv_regions = intel_iommu_put_resv_regions, - .apply_resv_region = intel_iommu_apply_resv_region, -- .device_group = pci_device_group, -+ .device_group = intel_iommu_device_group, - .dev_has_feat = intel_iommu_dev_has_feat, - .dev_feat_enabled = intel_iommu_dev_feat_enabled, - .dev_enable_feat = intel_iommu_dev_enable_feat, -diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c -index d5d4bfa9c8fd..d797912e665a 100644 ---- a/drivers/net/can/m_can/tcan4x5x.c -+++ b/drivers/net/can/m_can/tcan4x5x.c -@@ -445,6 +445,10 @@ static int tcan4x5x_can_probe(struct spi_device *spi) - - tcan4x5x_power_enable(priv->power, 1); - -+ ret = tcan4x5x_init(mcan_class); -+ if (ret) -+ goto out_power; -+ - ret = m_can_class_register(mcan_class); - if (ret) - goto out_power; -diff --git a/drivers/net/can/mscan/mscan.c b/drivers/net/can/mscan/mscan.c -index 8caf7af0dee2..99101d7027a8 100644 ---- a/drivers/net/can/mscan/mscan.c -+++ b/drivers/net/can/mscan/mscan.c -@@ -381,13 +381,12 @@ static int mscan_rx_poll(struct napi_struct *napi, int quota) - struct net_device *dev = napi->dev; - struct mscan_regs __iomem *regs = priv->reg_base; - struct net_device_stats *stats = &dev->stats; -- int npackets = 0; -- int ret = 1; -+ int work_done = 0; - struct sk_buff *skb; - struct can_frame *frame; - u8 canrflg; - -- while (npackets < quota) { -+ while (work_done < quota) { - canrflg = in_8(®s->canrflg); - if (!(canrflg & (MSCAN_RXF | MSCAN_ERR_IF))) - break; -@@ -408,18 +407,18 @@ static int mscan_rx_poll(struct napi_struct *napi, int quota) - - stats->rx_packets++; - stats->rx_bytes += frame->can_dlc; -- npackets++; -+ work_done++; - netif_receive_skb(skb); - } - -- if (!(in_8(®s->canrflg) & (MSCAN_RXF | MSCAN_ERR_IF))) { -- napi_complete(&priv->napi); -- clear_bit(F_RX_PROGRESS, &priv->flags); -- if (priv->can.state < CAN_STATE_BUS_OFF) -- out_8(®s->canrier, priv->shadow_canrier); -- ret = 0; -+ if (work_done < quota) { -+ if (likely(napi_complete_done(&priv->napi, work_done))) { -+ clear_bit(F_RX_PROGRESS, &priv->flags); -+ if (priv->can.state < CAN_STATE_BUS_OFF) -+ out_8(®s->canrier, priv->shadow_canrier); -+ } - } -- return ret; -+ return work_done; - } - - static irqreturn_t mscan_isr(int irq, void *dev_id) -diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c -index 2f74f6704c12..a4b4b742c80c 100644 ---- a/drivers/net/can/usb/gs_usb.c -+++ b/drivers/net/can/usb/gs_usb.c -@@ -918,7 +918,7 @@ static int gs_usb_probe(struct usb_interface *intf, - GS_USB_BREQ_HOST_FORMAT, - USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, - 1, -- intf->altsetting[0].desc.bInterfaceNumber, -+ intf->cur_altsetting->desc.bInterfaceNumber, - hconf, - sizeof(*hconf), - 1000); -@@ -941,7 +941,7 @@ static int gs_usb_probe(struct usb_interface *intf, - GS_USB_BREQ_DEVICE_CONFIG, - USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, - 1, -- intf->altsetting[0].desc.bInterfaceNumber, -+ intf->cur_altsetting->desc.bInterfaceNumber, - dconf, - sizeof(*dconf), - 1000); -diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c -index 5fc0be564274..7ab87a758754 100644 ---- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c -+++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c -@@ -1590,7 +1590,7 @@ static int kvaser_usb_hydra_setup_endpoints(struct kvaser_usb *dev) - struct usb_endpoint_descriptor *ep; - int i; - -- iface_desc = &dev->intf->altsetting[0]; -+ iface_desc = dev->intf->cur_altsetting; - - for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { - ep = &iface_desc->endpoint[i].desc; -diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c -index ae4c37e1bb75..1b9957f12459 100644 ---- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c -+++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c -@@ -1310,7 +1310,7 @@ static int kvaser_usb_leaf_setup_endpoints(struct kvaser_usb *dev) - struct usb_endpoint_descriptor *endpoint; - int i; - -- iface_desc = &dev->intf->altsetting[0]; -+ iface_desc = dev->intf->cur_altsetting; - - for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { - endpoint = &iface_desc->endpoint[i].desc; -diff --git a/drivers/net/wireless/ath/ath10k/usb.c b/drivers/net/wireless/ath/ath10k/usb.c -index 9ebe74ee4aef..1e0343081be9 100644 ---- a/drivers/net/wireless/ath/ath10k/usb.c -+++ b/drivers/net/wireless/ath/ath10k/usb.c -@@ -443,6 +443,7 @@ static int ath10k_usb_hif_tx_sg(struct ath10k *ar, u8 pipe_id, - ath10k_dbg(ar, ATH10K_DBG_USB_BULK, - "usb bulk transmit failed: %d\n", ret); - usb_unanchor_urb(urb); -+ usb_free_urb(urb); - ret = -EINVAL; - goto err_free_urb_to_pipe; - } -diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c -index 096334e941a1..fc1706d0647d 100644 ---- a/drivers/net/wireless/marvell/mwifiex/pcie.c -+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c -@@ -1032,8 +1032,10 @@ static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter) - } - skb_put(skb, MWIFIEX_UPLD_SIZE); - if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE, -- PCI_DMA_FROMDEVICE)) -+ PCI_DMA_FROMDEVICE)) { -+ kfree_skb(skb); - return -1; -+ } - - card->cmdrsp_buf = skb; - -diff --git a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c -index 74e50566db1f..6dd835f1efc2 100644 ---- a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c -+++ b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c -@@ -229,6 +229,14 @@ static int mwifiex_process_country_ie(struct mwifiex_private *priv, - "11D: skip setting domain info in FW\n"); - return 0; - } -+ -+ if (country_ie_len > -+ (IEEE80211_COUNTRY_STRING_LEN + MWIFIEX_MAX_TRIPLET_802_11D)) { -+ mwifiex_dbg(priv->adapter, ERROR, -+ "11D: country_ie_len overflow!, deauth AP\n"); -+ return -EINVAL; -+ } -+ - memcpy(priv->adapter->country_code, &country_ie[2], 2); - - domain_info->country_code[0] = country_ie[2]; -@@ -272,8 +280,9 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss, - priv->scan_block = false; - - if (bss) { -- if (adapter->region_code == 0x00) -- mwifiex_process_country_ie(priv, bss); -+ if (adapter->region_code == 0x00 && -+ mwifiex_process_country_ie(priv, bss)) -+ return -EINVAL; - - /* Allocate and fill new bss descriptor */ - bss_desc = kzalloc(sizeof(struct mwifiex_bssdescriptor), -diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -index 361248e97568..e7d96ac673b7 100644 ---- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -@@ -5447,6 +5447,7 @@ static int rtl8xxxu_submit_int_urb(struct ieee80211_hw *hw) - ret = usb_submit_urb(urb, GFP_KERNEL); - if (ret) { - usb_unanchor_urb(urb); -+ usb_free_urb(urb); - goto error; - } - -diff --git a/drivers/phy/motorola/phy-cpcap-usb.c b/drivers/phy/motorola/phy-cpcap-usb.c -index ead06c6c2601..9a38741d3546 100644 ---- a/drivers/phy/motorola/phy-cpcap-usb.c -+++ b/drivers/phy/motorola/phy-cpcap-usb.c -@@ -207,6 +207,19 @@ static int cpcap_phy_get_ints_state(struct cpcap_phy_ddata *ddata, - static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata); - static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata); - -+static void cpcap_usb_try_musb_mailbox(struct cpcap_phy_ddata *ddata, -+ enum musb_vbus_id_status status) -+{ -+ int error; -+ -+ error = musb_mailbox(status); -+ if (!error) -+ return; -+ -+ dev_dbg(ddata->dev, "%s: musb_mailbox failed: %i\n", -+ __func__, error); -+} -+ - static void cpcap_usb_detect(struct work_struct *work) - { - struct cpcap_phy_ddata *ddata; -@@ -226,9 +239,7 @@ static void cpcap_usb_detect(struct work_struct *work) - if (error) - goto out_err; - -- error = musb_mailbox(MUSB_ID_GROUND); -- if (error) -- goto out_err; -+ cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND); - - error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3, - CPCAP_BIT_VBUSSTBY_EN | -@@ -257,9 +268,7 @@ static void cpcap_usb_detect(struct work_struct *work) - error = cpcap_usb_set_usb_mode(ddata); - if (error) - goto out_err; -- error = musb_mailbox(MUSB_ID_GROUND); -- if (error) -- goto out_err; -+ cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND); - - return; - } -@@ -269,22 +278,18 @@ static void cpcap_usb_detect(struct work_struct *work) - error = cpcap_usb_set_usb_mode(ddata); - if (error) - goto out_err; -- error = musb_mailbox(MUSB_VBUS_VALID); -- if (error) -- goto out_err; -+ cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_VALID); - - return; - } - -+ cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_OFF); -+ - /* Default to debug UART mode */ - error = cpcap_usb_set_uart_mode(ddata); - if (error) - goto out_err; - -- error = musb_mailbox(MUSB_VBUS_OFF); -- if (error) -- goto out_err; -- - dev_dbg(ddata->dev, "set UART mode\n"); - - return; -@@ -649,9 +654,7 @@ static int cpcap_usb_phy_remove(struct platform_device *pdev) - if (error) - dev_err(ddata->dev, "could not set UART mode\n"); - -- error = musb_mailbox(MUSB_VBUS_OFF); -- if (error) -- dev_err(ddata->dev, "could not set mailbox\n"); -+ cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_OFF); - - usb_remove_phy(&ddata->phy); - cancel_delayed_work_sync(&ddata->detect_work); -diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_rapl_common.c -index 94ddd7d659c8..925b0004a0ed 100644 ---- a/drivers/powercap/intel_rapl_common.c -+++ b/drivers/powercap/intel_rapl_common.c -@@ -1293,6 +1293,9 @@ struct rapl_package *rapl_add_package(int cpu, struct rapl_if_priv *priv) - struct cpuinfo_x86 *c = &cpu_data(cpu); - int ret; - -+ if (!rapl_defaults) -+ return ERR_PTR(-ENODEV); -+ - rp = kzalloc(sizeof(struct rapl_package), GFP_KERNEL); - if (!rp) - return ERR_PTR(-ENOMEM); -diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c -index eea5ebbb5119..c655074c07c2 100644 ---- a/drivers/rpmsg/rpmsg_char.c -+++ b/drivers/rpmsg/rpmsg_char.c -@@ -227,8 +227,10 @@ static ssize_t rpmsg_eptdev_write_iter(struct kiocb *iocb, - if (!kbuf) - return -ENOMEM; - -- if (!copy_from_iter_full(kbuf, len, from)) -- return -EFAULT; -+ if (!copy_from_iter_full(kbuf, len, from)) { -+ ret = -EFAULT; -+ goto free_kbuf; -+ } - - if (mutex_lock_interruptible(&eptdev->ept_lock)) { - ret = -ERESTARTSYS; -diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c -index 5e2bd9f1d01e..fc32be687606 100644 ---- a/drivers/rtc/rtc-sun6i.c -+++ b/drivers/rtc/rtc-sun6i.c -@@ -380,6 +380,22 @@ static void __init sun50i_h6_rtc_clk_init(struct device_node *node) - CLK_OF_DECLARE_DRIVER(sun50i_h6_rtc_clk, "allwinner,sun50i-h6-rtc", - sun50i_h6_rtc_clk_init); - -+/* -+ * The R40 user manual is self-conflicting on whether the prescaler is -+ * fixed or configurable. The clock diagram shows it as fixed, but there -+ * is also a configurable divider in the RTC block. -+ */ -+static const struct sun6i_rtc_clk_data sun8i_r40_rtc_data = { -+ .rc_osc_rate = 16000000, -+ .fixed_prescaler = 512, -+}; -+static void __init sun8i_r40_rtc_clk_init(struct device_node *node) -+{ -+ sun6i_rtc_clk_init(node, &sun8i_r40_rtc_data); -+} -+CLK_OF_DECLARE_DRIVER(sun8i_r40_rtc_clk, "allwinner,sun8i-r40-rtc", -+ sun8i_r40_rtc_clk_init); -+ - static const struct sun6i_rtc_clk_data sun8i_v3_rtc_data = { - .rc_osc_rate = 32000, - .has_out_clk = 1, -diff --git a/drivers/scsi/bfa/bfad_attr.c b/drivers/scsi/bfa/bfad_attr.c -index 29ab81df75c0..fbfce02e5b93 100644 ---- a/drivers/scsi/bfa/bfad_attr.c -+++ b/drivers/scsi/bfa/bfad_attr.c -@@ -275,8 +275,10 @@ bfad_im_get_stats(struct Scsi_Host *shost) - rc = bfa_port_get_stats(BFA_FCPORT(&bfad->bfa), - fcstats, bfad_hcb_comp, &fcomp); - spin_unlock_irqrestore(&bfad->bfad_lock, flags); -- if (rc != BFA_STATUS_OK) -+ if (rc != BFA_STATUS_OK) { -+ kfree(fcstats); - return NULL; -+ } - - wait_for_completion(&fcomp.comp); - -diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c -index dbff0f7e7cf5..ddc0dc93d08b 100644 ---- a/drivers/staging/comedi/drivers/adv_pci1710.c -+++ b/drivers/staging/comedi/drivers/adv_pci1710.c -@@ -46,8 +46,8 @@ - #define PCI171X_RANGE_UNI BIT(4) - #define PCI171X_RANGE_GAIN(x) (((x) & 0x7) << 0) - #define PCI171X_MUX_REG 0x04 /* W: A/D multiplexor control */ --#define PCI171X_MUX_CHANH(x) (((x) & 0xf) << 8) --#define PCI171X_MUX_CHANL(x) (((x) & 0xf) << 0) -+#define PCI171X_MUX_CHANH(x) (((x) & 0xff) << 8) -+#define PCI171X_MUX_CHANL(x) (((x) & 0xff) << 0) - #define PCI171X_MUX_CHAN(x) (PCI171X_MUX_CHANH(x) | PCI171X_MUX_CHANL(x)) - #define PCI171X_STATUS_REG 0x06 /* R: status register */ - #define PCI171X_STATUS_IRQ BIT(11) /* 1=IRQ occurred */ -diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c b/drivers/staging/rtl8188eu/os_dep/usb_intf.c -index a7cac0719b8b..b5d42f411dd8 100644 ---- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c -+++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c -@@ -37,6 +37,7 @@ static const struct usb_device_id rtw_usb_id_tbl[] = { - {USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */ - {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */ - {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */ -+ {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */ - {USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xffef)}, /* Rosewill RNX-N150NUB */ - {} /* Terminating entry */ -diff --git a/drivers/staging/vt6656/baseband.c b/drivers/staging/vt6656/baseband.c -index 8d19ae71e7cc..4e651b698617 100644 ---- a/drivers/staging/vt6656/baseband.c -+++ b/drivers/staging/vt6656/baseband.c -@@ -449,8 +449,8 @@ int vnt_vt3184_init(struct vnt_private *priv) - - memcpy(array, addr, length); - -- ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0, -- MESSAGE_REQUEST_BBREG, length, array); -+ ret = vnt_control_out_blocks(priv, VNT_REG_BLOCK_SIZE, -+ MESSAGE_REQUEST_BBREG, length, array); - if (ret) - goto end; - -diff --git a/drivers/staging/vt6656/card.c b/drivers/staging/vt6656/card.c -index 56cd77fd9ea0..7958fc165462 100644 ---- a/drivers/staging/vt6656/card.c -+++ b/drivers/staging/vt6656/card.c -@@ -719,7 +719,7 @@ end: - */ - int vnt_radio_power_on(struct vnt_private *priv) - { -- int ret = true; -+ int ret = 0; - - vnt_exit_deep_sleep(priv); - -diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h -index 6074ceda78bf..50e1c8918040 100644 ---- a/drivers/staging/vt6656/device.h -+++ b/drivers/staging/vt6656/device.h -@@ -259,6 +259,7 @@ struct vnt_private { - u8 mac_hw; - /* netdev */ - struct usb_device *usb; -+ struct usb_interface *intf; - - u64 tsf_time; - u8 rx_rate; -diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c -index 856ba97aec4f..c26882e2bb80 100644 ---- a/drivers/staging/vt6656/main_usb.c -+++ b/drivers/staging/vt6656/main_usb.c -@@ -950,7 +950,7 @@ static const struct ieee80211_ops vnt_mac_ops = { - - int vnt_init(struct vnt_private *priv) - { -- if (!(vnt_init_registers(priv))) -+ if (vnt_init_registers(priv)) - return -EAGAIN; - - SET_IEEE80211_PERM_ADDR(priv->hw, priv->permanent_net_addr); -@@ -993,6 +993,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) - priv = hw->priv; - priv->hw = hw; - priv->usb = udev; -+ priv->intf = intf; - - vnt_set_options(priv); - -diff --git a/drivers/staging/vt6656/usbpipe.c b/drivers/staging/vt6656/usbpipe.c -index d3304df6bd53..d977d4777e4f 100644 ---- a/drivers/staging/vt6656/usbpipe.c -+++ b/drivers/staging/vt6656/usbpipe.c -@@ -59,7 +59,9 @@ int vnt_control_out(struct vnt_private *priv, u8 request, u16 value, - - kfree(usb_buffer); - -- if (ret >= 0 && ret < (int)length) -+ if (ret == (int)length) -+ ret = 0; -+ else - ret = -EIO; - - end_unlock: -@@ -74,6 +76,23 @@ int vnt_control_out_u8(struct vnt_private *priv, u8 reg, u8 reg_off, u8 data) - reg_off, reg, sizeof(u8), &data); - } - -+int vnt_control_out_blocks(struct vnt_private *priv, -+ u16 block, u8 reg, u16 length, u8 *data) -+{ -+ int ret = 0, i; -+ -+ for (i = 0; i < length; i += block) { -+ u16 len = min_t(int, length - i, block); -+ -+ ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, -+ i, reg, len, data + i); -+ if (ret) -+ goto end; -+ } -+end: -+ return ret; -+} -+ - int vnt_control_in(struct vnt_private *priv, u8 request, u16 value, - u16 index, u16 length, u8 *buffer) - { -@@ -103,7 +122,9 @@ int vnt_control_in(struct vnt_private *priv, u8 request, u16 value, - - kfree(usb_buffer); - -- if (ret >= 0 && ret < (int)length) -+ if (ret == (int)length) -+ ret = 0; -+ else - ret = -EIO; - - end_unlock: -diff --git a/drivers/staging/vt6656/usbpipe.h b/drivers/staging/vt6656/usbpipe.h -index 95147ec7b96a..b65d9c01a211 100644 ---- a/drivers/staging/vt6656/usbpipe.h -+++ b/drivers/staging/vt6656/usbpipe.h -@@ -18,6 +18,8 @@ - - #include "device.h" - -+#define VNT_REG_BLOCK_SIZE 64 -+ - int vnt_control_out(struct vnt_private *priv, u8 request, u16 value, - u16 index, u16 length, u8 *buffer); - int vnt_control_in(struct vnt_private *priv, u8 request, u16 value, -@@ -26,6 +28,9 @@ int vnt_control_in(struct vnt_private *priv, u8 request, u16 value, - int vnt_control_out_u8(struct vnt_private *priv, u8 reg, u8 ref_off, u8 data); - int vnt_control_in_u8(struct vnt_private *priv, u8 reg, u8 reg_off, u8 *data); - -+int vnt_control_out_blocks(struct vnt_private *priv, -+ u16 block, u8 reg, u16 len, u8 *data); -+ - int vnt_start_interrupt_urb(struct vnt_private *priv); - int vnt_submit_rx_urb(struct vnt_private *priv, struct vnt_rcb *rcb); - int vnt_tx_context(struct vnt_private *priv, -diff --git a/drivers/staging/vt6656/wcmd.c b/drivers/staging/vt6656/wcmd.c -index 3eb2f11a5de1..2c5250ca2801 100644 ---- a/drivers/staging/vt6656/wcmd.c -+++ b/drivers/staging/vt6656/wcmd.c -@@ -99,6 +99,7 @@ void vnt_run_command(struct work_struct *work) - if (vnt_init(priv)) { - /* If fail all ends TODO retry */ - dev_err(&priv->usb->dev, "failed to start\n"); -+ usb_set_intfdata(priv->intf, NULL); - ieee80211_free_hw(priv->hw); - return; - } -diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c -index a0ac16ee6575..a9719858c950 100644 ---- a/drivers/tty/serdev/core.c -+++ b/drivers/tty/serdev/core.c -@@ -582,6 +582,12 @@ static acpi_status acpi_serdev_register_device(struct serdev_controller *ctrl, - return AE_OK; - } - -+static const struct acpi_device_id serdev_acpi_devices_blacklist[] = { -+ { "INT3511", 0 }, -+ { "INT3512", 0 }, -+ { }, -+}; -+ - static acpi_status acpi_serdev_add_device(acpi_handle handle, u32 level, - void *data, void **return_value) - { -@@ -591,6 +597,10 @@ static acpi_status acpi_serdev_add_device(acpi_handle handle, u32 level, - if (acpi_bus_get_device(handle, &adev)) - return AE_OK; - -+ /* Skip if black listed */ -+ if (!acpi_match_device_ids(adev, serdev_acpi_devices_blacklist)) -+ return AE_OK; -+ - return acpi_serdev_register_device(ctrl, adev); - } - -diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c -index b0a6eb106edb..7c2782785736 100644 ---- a/drivers/tty/serial/serial_core.c -+++ b/drivers/tty/serial/serial_core.c -@@ -2834,6 +2834,7 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport) - if (uport->cons && uport->dev) - of_console_check(uport->dev->of_node, uport->cons->name, uport->line); - -+ tty_port_link_device(port, drv->tty_driver, uport->line); - uart_configure_port(drv, state, uport); - - port->console = uart_console(uport); -diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c -index 4c1e75509303..02f6ca2cb1ba 100644 ---- a/drivers/usb/cdns3/gadget.c -+++ b/drivers/usb/cdns3/gadget.c -@@ -1375,13 +1375,10 @@ static void cdns3_check_usb_interrupt_proceed(struct cdns3_device *priv_dev, - */ - static irqreturn_t cdns3_device_irq_handler(int irq, void *data) - { -- struct cdns3_device *priv_dev; -- struct cdns3 *cdns = data; -+ struct cdns3_device *priv_dev = data; - irqreturn_t ret = IRQ_NONE; - u32 reg; - -- priv_dev = cdns->gadget_dev; -- - /* check USB device interrupt */ - reg = readl(&priv_dev->regs->usb_ists); - if (reg) { -@@ -1419,14 +1416,12 @@ static irqreturn_t cdns3_device_irq_handler(int irq, void *data) - */ - static irqreturn_t cdns3_device_thread_irq_handler(int irq, void *data) - { -- struct cdns3_device *priv_dev; -- struct cdns3 *cdns = data; -+ struct cdns3_device *priv_dev = data; - irqreturn_t ret = IRQ_NONE; - unsigned long flags; - int bit; - u32 reg; - -- priv_dev = cdns->gadget_dev; - spin_lock_irqsave(&priv_dev->lock, flags); - - reg = readl(&priv_dev->regs->usb_ists); -@@ -2539,7 +2534,7 @@ void cdns3_gadget_exit(struct cdns3 *cdns) - - priv_dev = cdns->gadget_dev; - -- devm_free_irq(cdns->dev, cdns->dev_irq, cdns); -+ devm_free_irq(cdns->dev, cdns->dev_irq, priv_dev); - - pm_runtime_mark_last_busy(cdns->dev); - pm_runtime_put_autosuspend(cdns->dev); -@@ -2710,7 +2705,8 @@ static int __cdns3_gadget_init(struct cdns3 *cdns) - ret = devm_request_threaded_irq(cdns->dev, cdns->dev_irq, - cdns3_device_irq_handler, - cdns3_device_thread_irq_handler, -- IRQF_SHARED, dev_name(cdns->dev), cdns); -+ IRQF_SHARED, dev_name(cdns->dev), -+ cdns->gadget_dev); - - if (ret) - goto err0; -diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c -index b45ceb91c735..48e4a5ca1835 100644 ---- a/drivers/usb/chipidea/host.c -+++ b/drivers/usb/chipidea/host.c -@@ -26,6 +26,7 @@ static int (*orig_bus_suspend)(struct usb_hcd *hcd); - - struct ehci_ci_priv { - struct regulator *reg_vbus; -+ bool enabled; - }; - - static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable) -@@ -37,7 +38,7 @@ static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable) - int ret = 0; - int port = HCS_N_PORTS(ehci->hcs_params); - -- if (priv->reg_vbus) { -+ if (priv->reg_vbus && enable != priv->enabled) { - if (port > 1) { - dev_warn(dev, - "Not support multi-port regulator control\n"); -@@ -53,6 +54,7 @@ static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable) - enable ? "enable" : "disable", ret); - return ret; - } -+ priv->enabled = enable; - } - - if (enable && (ci->platdata->phy_mode == USBPHY_INTERFACE_MODE_HSIC)) { -diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c -index 5e92c6abe306..3e94259406d7 100644 ---- a/drivers/usb/core/config.c -+++ b/drivers/usb/core/config.c -@@ -392,12 +392,16 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, - endpoint->desc.wMaxPacketSize = cpu_to_le16(8); - } - -- /* Validate the wMaxPacketSize field */ -+ /* -+ * Validate the wMaxPacketSize field. -+ * Some devices have isochronous endpoints in altsetting 0; -+ * the USB-2 spec requires such endpoints to have wMaxPacketSize = 0 -+ * (see the end of section 5.6.3), so don't warn about them. -+ */ - maxp = usb_endpoint_maxp(&endpoint->desc); -- if (maxp == 0) { -- dev_warn(ddev, "config %d interface %d altsetting %d endpoint 0x%X has wMaxPacketSize 0, skipping\n", -+ if (maxp == 0 && !(usb_endpoint_xfer_isoc(d) && asnum == 0)) { -+ dev_warn(ddev, "config %d interface %d altsetting %d endpoint 0x%X has invalid wMaxPacketSize 0\n", - cfgno, inum, asnum, d->bEndpointAddress); -- goto skip_to_next_endpoint_or_interface_descriptor; - } - - /* Find the highest legal maxpacket size for this endpoint */ -diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c -index 38183ac438c6..1371b0c249ec 100644 ---- a/drivers/usb/host/ohci-da8xx.c -+++ b/drivers/usb/host/ohci-da8xx.c -@@ -415,13 +415,17 @@ static int ohci_da8xx_probe(struct platform_device *pdev) - } - - da8xx_ohci->oc_gpio = devm_gpiod_get_optional(dev, "oc", GPIOD_IN); -- if (IS_ERR(da8xx_ohci->oc_gpio)) -+ if (IS_ERR(da8xx_ohci->oc_gpio)) { -+ error = PTR_ERR(da8xx_ohci->oc_gpio); - goto err; -+ } - - if (da8xx_ohci->oc_gpio) { - oc_irq = gpiod_to_irq(da8xx_ohci->oc_gpio); -- if (oc_irq < 0) -+ if (oc_irq < 0) { -+ error = oc_irq; - goto err; -+ } - - error = devm_request_threaded_irq(dev, oc_irq, NULL, - ohci_da8xx_oc_thread, IRQF_TRIGGER_RISING | -diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c -index bd63450af76a..bf083c1f997f 100644 ---- a/drivers/usb/musb/musb_core.c -+++ b/drivers/usb/musb/musb_core.c -@@ -1840,6 +1840,9 @@ ATTRIBUTE_GROUPS(musb); - #define MUSB_QUIRK_B_INVALID_VBUS_91 (MUSB_DEVCTL_BDEVICE | \ - (2 << MUSB_DEVCTL_VBUS_SHIFT) | \ - MUSB_DEVCTL_SESSION) -+#define MUSB_QUIRK_B_DISCONNECT_99 (MUSB_DEVCTL_BDEVICE | \ -+ (3 << MUSB_DEVCTL_VBUS_SHIFT) | \ -+ MUSB_DEVCTL_SESSION) - #define MUSB_QUIRK_A_DISCONNECT_19 ((3 << MUSB_DEVCTL_VBUS_SHIFT) | \ - MUSB_DEVCTL_SESSION) - -@@ -1862,6 +1865,11 @@ static void musb_pm_runtime_check_session(struct musb *musb) - s = MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV | - MUSB_DEVCTL_HR; - switch (devctl & ~s) { -+ case MUSB_QUIRK_B_DISCONNECT_99: -+ musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n"); -+ schedule_delayed_work(&musb->irq_work, -+ msecs_to_jiffies(1000)); -+ break; - case MUSB_QUIRK_B_INVALID_VBUS_91: - if (musb->quirk_retries && !musb->flush_irq_work) { - musb_dbg(musb, -@@ -2310,6 +2318,9 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) - musb_disable_interrupts(musb); - musb_writeb(musb->mregs, MUSB_DEVCTL, 0); - -+ /* MUSB_POWER_SOFTCONN might be already set, JZ4740 does this. */ -+ musb_writeb(musb->mregs, MUSB_POWER, 0); -+ - /* Init IRQ workqueue before request_irq */ - INIT_DELAYED_WORK(&musb->irq_work, musb_irq_work); - INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); -diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c -index 5fc6825745f2..2d3751d885b4 100644 ---- a/drivers/usb/musb/musbhsdma.c -+++ b/drivers/usb/musb/musbhsdma.c -@@ -425,7 +425,7 @@ struct dma_controller *musbhs_dma_controller_create(struct musb *musb, - controller->controller.channel_abort = dma_channel_abort; - - if (request_irq(irq, dma_controller_irq, 0, -- dev_name(musb->controller), &controller->controller)) { -+ dev_name(musb->controller), controller)) { - dev_err(dev, "request_irq %d failed!\n", irq); - musb_dma_controller_destroy(&controller->controller); - -diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c -index fea09a3f491f..2d919d0e6e45 100644 ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -567,6 +567,9 @@ static void option_instat_callback(struct urb *urb); - /* Interface must have two endpoints */ - #define NUMEP2 BIT(16) - -+/* Device needs ZLP */ -+#define ZLP BIT(17) -+ - - static const struct usb_device_id option_ids[] = { - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, -@@ -1198,6 +1201,8 @@ static const struct usb_device_id option_ids[] = { - .driver_info = NCTRL(0) | RSVD(1) }, - { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1901, 0xff), /* Telit LN940 (MBIM) */ - .driver_info = NCTRL(0) }, -+ { USB_DEVICE(TELIT_VENDOR_ID, 0x9010), /* Telit SBL FN980 flashing device */ -+ .driver_info = NCTRL(0) | ZLP }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), - .driver_info = RSVD(1) }, -@@ -2099,6 +2104,9 @@ static int option_attach(struct usb_serial *serial) - if (!(device_flags & NCTRL(iface_desc->bInterfaceNumber))) - data->use_send_setup = 1; - -+ if (device_flags & ZLP) -+ data->use_zlp = 1; -+ - spin_lock_init(&data->susp_lock); - - usb_set_serial_data(serial, data); -diff --git a/drivers/usb/serial/usb-wwan.h b/drivers/usb/serial/usb-wwan.h -index 1c120eaf4091..934e9361cf6b 100644 ---- a/drivers/usb/serial/usb-wwan.h -+++ b/drivers/usb/serial/usb-wwan.h -@@ -38,6 +38,7 @@ struct usb_wwan_intf_private { - spinlock_t susp_lock; - unsigned int suspended:1; - unsigned int use_send_setup:1; -+ unsigned int use_zlp:1; - int in_flight; - unsigned int open_ports; - void *private; -diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c -index 7e855c87e4f7..13be21aad2f4 100644 ---- a/drivers/usb/serial/usb_wwan.c -+++ b/drivers/usb/serial/usb_wwan.c -@@ -461,6 +461,7 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, - void (*callback) (struct urb *)) - { - struct usb_serial *serial = port->serial; -+ struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial); - struct urb *urb; - - urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ -@@ -471,6 +472,9 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, - usb_sndbulkpipe(serial->dev, endpoint) | dir, - buf, len, callback, ctx); - -+ if (intfdata->use_zlp && dir == USB_DIR_OUT) -+ urb->transfer_flags |= URB_ZERO_PACKET; -+ - return urb; - } - -diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c -index c1f7073a56de..8b4ff9fff340 100644 ---- a/drivers/usb/typec/tcpm/tcpci.c -+++ b/drivers/usb/typec/tcpm/tcpci.c -@@ -432,20 +432,30 @@ irqreturn_t tcpci_irq(struct tcpci *tcpci) - - if (status & TCPC_ALERT_RX_STATUS) { - struct pd_message msg; -- unsigned int cnt; -+ unsigned int cnt, payload_cnt; - u16 header; - - regmap_read(tcpci->regmap, TCPC_RX_BYTE_CNT, &cnt); -+ /* -+ * 'cnt' corresponds to READABLE_BYTE_COUNT in section 4.4.14 -+ * of the TCPCI spec [Rev 2.0 Ver 1.0 October 2017] and is -+ * defined in table 4-36 as one greater than the number of -+ * bytes received. And that number includes the header. So: -+ */ -+ if (cnt > 3) -+ payload_cnt = cnt - (1 + sizeof(msg.header)); -+ else -+ payload_cnt = 0; - - tcpci_read16(tcpci, TCPC_RX_HDR, &header); - msg.header = cpu_to_le16(header); - -- if (WARN_ON(cnt > sizeof(msg.payload))) -- cnt = sizeof(msg.payload); -+ if (WARN_ON(payload_cnt > sizeof(msg.payload))) -+ payload_cnt = sizeof(msg.payload); - -- if (cnt > 0) -+ if (payload_cnt > 0) - regmap_raw_read(tcpci->regmap, TCPC_RX_DATA, -- &msg.payload, cnt); -+ &msg.payload, payload_cnt); - - /* Read complete, clear RX status alert bit */ - tcpci_write16(tcpci, TCPC_ALERT, TCPC_ALERT_RX_STATUS); -diff --git a/fs/char_dev.c b/fs/char_dev.c -index 00dfe17871ac..c5e6eff5a381 100644 ---- a/fs/char_dev.c -+++ b/fs/char_dev.c -@@ -352,7 +352,7 @@ static struct kobject *cdev_get(struct cdev *p) - - if (owner && !try_module_get(owner)) - return NULL; -- kobj = kobject_get(&p->kobj); -+ kobj = kobject_get_unless_zero(&p->kobj); - if (!kobj) - module_put(owner); - return kobj; -diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c -index 487ee39b438a..013486b5125e 100644 ---- a/fs/pstore/ram.c -+++ b/fs/pstore/ram.c -@@ -583,12 +583,12 @@ static int ramoops_init_przs(const char *name, - prz_ar[i] = persistent_ram_new(*paddr, zone_sz, sig, - &cxt->ecc_info, - cxt->memtype, flags, label); -+ kfree(label); - if (IS_ERR(prz_ar[i])) { - err = PTR_ERR(prz_ar[i]); - dev_err(dev, "failed to request %s mem region (0x%zx@0x%llx): %d\n", - name, record_size, - (unsigned long long)*paddr, err); -- kfree(label); - - while (i > 0) { - i--; -@@ -629,12 +629,12 @@ static int ramoops_init_prz(const char *name, - label = kasprintf(GFP_KERNEL, "ramoops:%s", name); - *prz = persistent_ram_new(*paddr, sz, sig, &cxt->ecc_info, - cxt->memtype, PRZ_FLAG_ZAP_OLD, label); -+ kfree(label); - if (IS_ERR(*prz)) { - int err = PTR_ERR(*prz); - - dev_err(dev, "failed to request %s mem region (0x%zx@0x%llx): %d\n", - name, sz, (unsigned long long)*paddr, err); -- kfree(label); - return err; - } - -diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c -index 8823f65888f0..1f4d8c06f9be 100644 ---- a/fs/pstore/ram_core.c -+++ b/fs/pstore/ram_core.c -@@ -574,7 +574,7 @@ struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, - /* Initialize general buffer state. */ - raw_spin_lock_init(&prz->buffer_lock); - prz->flags = flags; -- prz->label = label; -+ prz->label = kstrdup(label, GFP_KERNEL); - - ret = persistent_ram_buffer_map(start, size, prz, memtype); - if (ret) -diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h -index 9b3c720a31b1..5e3d45525bd3 100644 ---- a/include/linux/can/dev.h -+++ b/include/linux/can/dev.h -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - - /* -@@ -91,6 +92,36 @@ struct can_priv { - #define get_can_dlc(i) (min_t(__u8, (i), CAN_MAX_DLC)) - #define get_canfd_dlc(i) (min_t(__u8, (i), CANFD_MAX_DLC)) - -+/* Check for outgoing skbs that have not been created by the CAN subsystem */ -+static inline bool can_skb_headroom_valid(struct net_device *dev, -+ struct sk_buff *skb) -+{ -+ /* af_packet creates a headroom of HH_DATA_MOD bytes which is fine */ -+ if (WARN_ON_ONCE(skb_headroom(skb) < sizeof(struct can_skb_priv))) -+ return false; -+ -+ /* af_packet does not apply CAN skb specific settings */ -+ if (skb->ip_summed == CHECKSUM_NONE) { -+ /* init headroom */ -+ can_skb_prv(skb)->ifindex = dev->ifindex; -+ can_skb_prv(skb)->skbcnt = 0; -+ -+ skb->ip_summed = CHECKSUM_UNNECESSARY; -+ -+ /* preform proper loopback on capable devices */ -+ if (dev->flags & IFF_ECHO) -+ skb->pkt_type = PACKET_LOOPBACK; -+ else -+ skb->pkt_type = PACKET_HOST; -+ -+ skb_reset_mac_header(skb); -+ skb_reset_network_header(skb); -+ skb_reset_transport_header(skb); -+ } -+ -+ return true; -+} -+ - /* Drop a given socketbuffer if it does not contain a valid CAN frame. */ - static inline bool can_dropped_invalid_skb(struct net_device *dev, - struct sk_buff *skb) -@@ -108,6 +139,9 @@ static inline bool can_dropped_invalid_skb(struct net_device *dev, - } else - goto inval_skb; - -+ if (!can_skb_headroom_valid(dev, skb)) -+ goto inval_skb; -+ - return false; - - inval_skb: -diff --git a/include/trace/events/preemptirq.h b/include/trace/events/preemptirq.h -index 95fba0471e5b..3f249e150c0c 100644 ---- a/include/trace/events/preemptirq.h -+++ b/include/trace/events/preemptirq.h -@@ -18,13 +18,13 @@ DECLARE_EVENT_CLASS(preemptirq_template, - TP_ARGS(ip, parent_ip), - - TP_STRUCT__entry( -- __field(u32, caller_offs) -- __field(u32, parent_offs) -+ __field(s32, caller_offs) -+ __field(s32, parent_offs) - ), - - TP_fast_assign( -- __entry->caller_offs = (u32)(ip - (unsigned long)_stext); -- __entry->parent_offs = (u32)(parent_ip - (unsigned long)_stext); -+ __entry->caller_offs = (s32)(ip - (unsigned long)_stext); -+ __entry->parent_offs = (s32)(parent_ip - (unsigned long)_stext); - ), - - TP_printk("caller=%pS parent=%pS", -diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h -index f056b2a00d5c..9a61c28ed3ae 100644 ---- a/include/uapi/linux/input.h -+++ b/include/uapi/linux/input.h -@@ -34,6 +34,7 @@ struct input_event { - __kernel_ulong_t __sec; - #if defined(__sparc__) && defined(__arch64__) - unsigned int __usec; -+ unsigned int __pad; - #else - __kernel_ulong_t __usec; - #endif -diff --git a/kernel/fork.c b/kernel/fork.c -index 6cabc124378c..755d8160e001 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -2513,6 +2513,16 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, - #endif - - #ifdef __ARCH_WANT_SYS_CLONE3 -+ -+/* -+ * copy_thread implementations handle CLONE_SETTLS by reading the TLS value from -+ * the registers containing the syscall arguments for clone. This doesn't work -+ * with clone3 since the TLS value is passed in clone_args instead. -+ */ -+#ifndef CONFIG_HAVE_COPY_THREAD_TLS -+#error clone3 requires copy_thread_tls support in arch -+#endif -+ - noinline static int copy_clone_args_from_user(struct kernel_clone_args *kargs, - struct clone_args __user *uargs, - size_t usize) -diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c -index 5e43b9664eca..617e297f46dc 100644 ---- a/kernel/trace/trace_sched_wakeup.c -+++ b/kernel/trace/trace_sched_wakeup.c -@@ -630,7 +630,7 @@ static void start_wakeup_tracer(struct trace_array *tr) - if (ret) { - pr_info("wakeup trace: Couldn't activate tracepoint" - " probe to kernel_sched_migrate_task\n"); -- return; -+ goto fail_deprobe_sched_switch; - } - - wakeup_reset(tr); -@@ -648,6 +648,8 @@ static void start_wakeup_tracer(struct trace_array *tr) - printk(KERN_ERR "failed to start wakeup tracer\n"); - - return; -+fail_deprobe_sched_switch: -+ unregister_trace_sched_switch(probe_wakeup_sched_switch, NULL); - fail_deprobe_wake_new: - unregister_trace_sched_wakeup_new(probe_wakeup, NULL); - fail_deprobe: -diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c -index 4df9a209f7ca..c557f42a9397 100644 ---- a/kernel/trace/trace_stack.c -+++ b/kernel/trace/trace_stack.c -@@ -283,6 +283,11 @@ static void check_stack(unsigned long ip, unsigned long *stack) - local_irq_restore(flags); - } - -+/* Some archs may not define MCOUNT_INSN_SIZE */ -+#ifndef MCOUNT_INSN_SIZE -+# define MCOUNT_INSN_SIZE 0 -+#endif -+ - static void - stack_trace_call(unsigned long ip, unsigned long parent_ip, - struct ftrace_ops *op, struct pt_regs *pt_regs) -diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c -index 214154b47d56..069f72edb264 100644 ---- a/net/ipv4/netfilter/arp_tables.c -+++ b/net/ipv4/netfilter/arp_tables.c -@@ -384,10 +384,11 @@ next: ; - return 1; - } - --static inline int check_target(struct arpt_entry *e, const char *name) -+static int check_target(struct arpt_entry *e, struct net *net, const char *name) - { - struct xt_entry_target *t = arpt_get_target(e); - struct xt_tgchk_param par = { -+ .net = net, - .table = name, - .entryinfo = e, - .target = t->u.kernel.target, -@@ -399,8 +400,9 @@ static inline int check_target(struct arpt_entry *e, const char *name) - return xt_check_target(&par, t->u.target_size - sizeof(*t), 0, false); - } - --static inline int --find_check_entry(struct arpt_entry *e, const char *name, unsigned int size, -+static int -+find_check_entry(struct arpt_entry *e, struct net *net, const char *name, -+ unsigned int size, - struct xt_percpu_counter_alloc_state *alloc_state) - { - struct xt_entry_target *t; -@@ -419,7 +421,7 @@ find_check_entry(struct arpt_entry *e, const char *name, unsigned int size, - } - t->u.kernel.target = target; - -- ret = check_target(e, name); -+ ret = check_target(e, net, name); - if (ret) - goto err; - return 0; -@@ -512,7 +514,9 @@ static inline void cleanup_entry(struct arpt_entry *e) - /* Checks and translates the user-supplied table segment (held in - * newinfo). - */ --static int translate_table(struct xt_table_info *newinfo, void *entry0, -+static int translate_table(struct net *net, -+ struct xt_table_info *newinfo, -+ void *entry0, - const struct arpt_replace *repl) - { - struct xt_percpu_counter_alloc_state alloc_state = { 0 }; -@@ -569,7 +573,7 @@ static int translate_table(struct xt_table_info *newinfo, void *entry0, - /* Finally, each sanity check must pass */ - i = 0; - xt_entry_foreach(iter, entry0, newinfo->size) { -- ret = find_check_entry(iter, repl->name, repl->size, -+ ret = find_check_entry(iter, net, repl->name, repl->size, - &alloc_state); - if (ret != 0) - break; -@@ -974,7 +978,7 @@ static int do_replace(struct net *net, const void __user *user, - goto free_newinfo; - } - -- ret = translate_table(newinfo, loc_cpu_entry, &tmp); -+ ret = translate_table(net, newinfo, loc_cpu_entry, &tmp); - if (ret != 0) - goto free_newinfo; - -@@ -1149,7 +1153,8 @@ compat_copy_entry_from_user(struct compat_arpt_entry *e, void **dstptr, - } - } - --static int translate_compat_table(struct xt_table_info **pinfo, -+static int translate_compat_table(struct net *net, -+ struct xt_table_info **pinfo, - void **pentry0, - const struct compat_arpt_replace *compatr) - { -@@ -1217,7 +1222,7 @@ static int translate_compat_table(struct xt_table_info **pinfo, - repl.num_counters = 0; - repl.counters = NULL; - repl.size = newinfo->size; -- ret = translate_table(newinfo, entry1, &repl); -+ ret = translate_table(net, newinfo, entry1, &repl); - if (ret) - goto free_newinfo; - -@@ -1270,7 +1275,7 @@ static int compat_do_replace(struct net *net, void __user *user, - goto free_newinfo; - } - -- ret = translate_compat_table(&newinfo, &loc_cpu_entry, &tmp); -+ ret = translate_compat_table(net, &newinfo, &loc_cpu_entry, &tmp); - if (ret != 0) - goto free_newinfo; - -@@ -1546,7 +1551,7 @@ int arpt_register_table(struct net *net, - loc_cpu_entry = newinfo->entries; - memcpy(loc_cpu_entry, repl->entries, repl->size); - -- ret = translate_table(newinfo, loc_cpu_entry, repl); -+ ret = translate_table(net, newinfo, loc_cpu_entry, repl); - if (ret != 0) - goto out_free; - -diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c -index d73d1828216a..d8143a8c034d 100644 ---- a/net/netfilter/ipset/ip_set_core.c -+++ b/net/netfilter/ipset/ip_set_core.c -@@ -1658,6 +1658,7 @@ static int ip_set_utest(struct net *net, struct sock *ctnl, struct sk_buff *skb, - struct ip_set *set; - struct nlattr *tb[IPSET_ATTR_ADT_MAX + 1] = {}; - int ret = 0; -+ u32 lineno; - - if (unlikely(protocol_min_failed(attr) || - !attr[IPSET_ATTR_SETNAME] || -@@ -1674,7 +1675,7 @@ static int ip_set_utest(struct net *net, struct sock *ctnl, struct sk_buff *skb, - return -IPSET_ERR_PROTOCOL; - - rcu_read_lock_bh(); -- ret = set->variant->uadt(set, tb, IPSET_TEST, NULL, 0, 0); -+ ret = set->variant->uadt(set, tb, IPSET_TEST, &lineno, 0, 0); - rcu_read_unlock_bh(); - /* Userspace can't trigger element to be re-added */ - if (ret == -EAGAIN) -diff --git a/net/netfilter/nf_conntrack_proto_dccp.c b/net/netfilter/nf_conntrack_proto_dccp.c -index b6b14db3955b..b3f4a334f9d7 100644 ---- a/net/netfilter/nf_conntrack_proto_dccp.c -+++ b/net/netfilter/nf_conntrack_proto_dccp.c -@@ -677,6 +677,9 @@ static int dccp_timeout_nlattr_to_obj(struct nlattr *tb[], - unsigned int *timeouts = data; - int i; - -+ if (!timeouts) -+ timeouts = dn->dccp_timeout; -+ - /* set default DCCP timeouts. */ - for (i=0; idccp_timeout[i]; -diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c -index fce3d93f1541..0399ae8f1188 100644 ---- a/net/netfilter/nf_conntrack_proto_sctp.c -+++ b/net/netfilter/nf_conntrack_proto_sctp.c -@@ -594,6 +594,9 @@ static int sctp_timeout_nlattr_to_obj(struct nlattr *tb[], - struct nf_sctp_net *sn = nf_sctp_pernet(net); - int i; - -+ if (!timeouts) -+ timeouts = sn->timeouts; -+ - /* set default SCTP timeouts. */ - for (i=0; itimeouts[i]; -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index 252888f426de..d293488dc3dd 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -412,6 +412,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) - case 0x10ec0672: - alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */ - break; -+ case 0x10ec0222: - case 0x10ec0623: - alc_update_coef_idx(codec, 0x19, 1<<13, 0); - break; -@@ -430,6 +431,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) - break; - case 0x10ec0899: - case 0x10ec0900: -+ case 0x10ec0b00: - case 0x10ec1168: - case 0x10ec1220: - alc_update_coef_idx(codec, 0x7, 1<<1, 0); -@@ -2526,6 +2528,7 @@ static int patch_alc882(struct hda_codec *codec) - case 0x10ec0882: - case 0x10ec0885: - case 0x10ec0900: -+ case 0x10ec0b00: - case 0x10ec1220: - break; - default: -@@ -7257,6 +7260,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { - SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), - SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), - SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), -+ SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Yoga 7th", ALC285_FIXUP_SPEAKER2_TO_DAC1), - SND_PCI_QUIRK(0x17aa, 0x2293, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_SPEAKER2_TO_DAC1), - SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), - SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), -@@ -9295,6 +9299,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = { - HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662), - HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882), - HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882), -+ HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882), - HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882), - HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882), - {} /* terminator */ -diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c -index a81c2066499f..82184036437b 100644 ---- a/sound/usb/quirks.c -+++ b/sound/usb/quirks.c -@@ -1397,6 +1397,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) - case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */ - case USB_ID(0x0556, 0x0014): /* Phoenix Audio TMX320VC */ - case USB_ID(0x05A3, 0x9420): /* ELP HD USB Camera */ -+ case USB_ID(0x05a7, 0x1020): /* Bose Companion 5 */ - case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */ - case USB_ID(0x1395, 0x740a): /* Sennheiser DECT */ - case USB_ID(0x1901, 0x0191): /* GE B850V3 CP2114 audio interface */ diff --git a/patch/kernel/sunxi-current/patch-5.4.12-13.patch b/patch/kernel/sunxi-current/patch-5.4.12-13.patch deleted file mode 100644 index b9c725867e..0000000000 --- a/patch/kernel/sunxi-current/patch-5.4.12-13.patch +++ /dev/null @@ -1,8038 +0,0 @@ -diff --git a/Documentation/ABI/stable/sysfs-driver-mlxreg-io b/Documentation/ABI/stable/sysfs-driver-mlxreg-io -index 8ca498447aeb..05601a90a9b6 100644 ---- a/Documentation/ABI/stable/sysfs-driver-mlxreg-io -+++ b/Documentation/ABI/stable/sysfs-driver-mlxreg-io -@@ -29,13 +29,13 @@ Description: This file shows the system fans direction: - - The files are read only. - --What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/jtag_enable -+What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/cpld3_version - - Date: November 2018 - KernelVersion: 5.0 - Contact: Vadim Pasternak - Description: These files show with which CPLD versions have been burned -- on LED board. -+ on LED or Gearbox board. - - The files are read only. - -@@ -121,6 +121,15 @@ Description: These files show the system reset cause, as following: ComEx - - The files are read only. - -+What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/cpld4_version -+Date: November 2018 -+KernelVersion: 5.0 -+Contact: Vadim Pasternak -+Description: These files show with which CPLD versions have been burned -+ on LED board. -+ -+ The files are read only. -+ - Date: June 2019 - KernelVersion: 5.3 - Contact: Vadim Pasternak -diff --git a/Documentation/ABI/testing/sysfs-bus-mei b/Documentation/ABI/testing/sysfs-bus-mei -index 6bd45346ac7e..3f8701e8fa24 100644 ---- a/Documentation/ABI/testing/sysfs-bus-mei -+++ b/Documentation/ABI/testing/sysfs-bus-mei -@@ -4,7 +4,7 @@ KernelVersion: 3.10 - Contact: Samuel Ortiz - linux-mei@linux.intel.com - Description: Stores the same MODALIAS value emitted by uevent -- Format: mei::: -+ Format: mei::: - - What: /sys/bus/mei/devices/.../name - Date: May 2015 -diff --git a/Documentation/admin-guide/device-mapper/index.rst b/Documentation/admin-guide/device-mapper/index.rst -index c77c58b8f67b..d8dec8911eb3 100644 ---- a/Documentation/admin-guide/device-mapper/index.rst -+++ b/Documentation/admin-guide/device-mapper/index.rst -@@ -8,6 +8,7 @@ Device Mapper - cache-policies - cache - delay -+ dm-clone - dm-crypt - dm-flakey - dm-init -diff --git a/Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.txt b/Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.txt -index 6e5341b4f891..ee59409640f2 100644 ---- a/Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.txt -+++ b/Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.txt -@@ -22,6 +22,6 @@ Example: - }; - - ðernet_switch { -- resets = <&reset>; -+ resets = <&reset 26>; - reset-names = "switch"; - }; -diff --git a/Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt b/Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt -index d6d5207fa996..17ff3892f439 100644 ---- a/Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt -+++ b/Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt -@@ -2,9 +2,11 @@ MT8183 with MT6358, TS3A227 and MAX98357 CODECS - - Required properties: - - compatible : "mediatek,mt8183_mt6358_ts3a227_max98357" --- mediatek,headset-codec: the phandles of ts3a227 codecs - - mediatek,platform: the phandle of MT8183 ASoC platform - -+Optional properties: -+- mediatek,headset-codec: the phandles of ts3a227 codecs -+ - Example: - - sound { -diff --git a/Documentation/networking/j1939.rst b/Documentation/networking/j1939.rst -index dc60b13fcd09..f5be243d250a 100644 ---- a/Documentation/networking/j1939.rst -+++ b/Documentation/networking/j1939.rst -@@ -339,7 +339,7 @@ To claim an address following code example can be used: - .pgn = J1939_PGN_ADDRESS_CLAIMED, - .pgn_mask = J1939_PGN_PDU1_MAX, - }, { -- .pgn = J1939_PGN_ADDRESS_REQUEST, -+ .pgn = J1939_PGN_REQUEST, - .pgn_mask = J1939_PGN_PDU1_MAX, - }, { - .pgn = J1939_PGN_ADDRESS_COMMANDED, -diff --git a/Documentation/scsi/smartpqi.txt b/Documentation/scsi/smartpqi.txt -index 201f80c7c050..df129f55ace5 100644 ---- a/Documentation/scsi/smartpqi.txt -+++ b/Documentation/scsi/smartpqi.txt -@@ -29,7 +29,7 @@ smartpqi specific entries in /sys - smartpqi host attributes: - ------------------------- - /sys/class/scsi_host/host*/rescan -- /sys/class/scsi_host/host*/version -+ /sys/class/scsi_host/host*/driver_version - - The host rescan attribute is a write only attribute. Writing to this - attribute will trigger the driver to scan for new, changed, or removed -diff --git a/MAINTAINERS b/MAINTAINERS -index 9d3a5c54a41d..4f7ac27d8651 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -6973,6 +6973,7 @@ L: linux-acpi@vger.kernel.org - S: Maintained - F: Documentation/firmware-guide/acpi/gpio-properties.rst - F: drivers/gpio/gpiolib-acpi.c -+F: drivers/gpio/gpiolib-acpi.h - - GPIO IR Transmitter - M: Sean Young -diff --git a/Makefile b/Makefile -index 45c6264f1108..d4cf4700ae3f 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0 - VERSION = 5 - PATCHLEVEL = 4 --SUBLEVEL = 12 -+SUBLEVEL = 13 - EXTRAVERSION = - NAME = Kleptomaniac Octopus - -diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c -index 4b0bab2607e4..46e1be9e57a8 100644 ---- a/arch/arm/kernel/smp.c -+++ b/arch/arm/kernel/smp.c -@@ -240,6 +240,10 @@ int __cpu_disable(void) - if (ret) - return ret; - -+#ifdef CONFIG_GENERIC_ARCH_TOPOLOGY -+ remove_cpu_topology(cpu); -+#endif -+ - /* - * Take this CPU offline. Once we clear this, we can't return, - * and we must not schedule until we're ready to give up the cpu. -diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi -index 04ad2fb22b9a..dba3488492f1 100644 ---- a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi -+++ b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi -@@ -623,6 +623,8 @@ - l21 { - regulator-min-microvolt = <2950000>; - regulator-max-microvolt = <2950000>; -+ regulator-allow-set-load; -+ regulator-system-load = <200000>; - }; - l22 { - regulator-min-microvolt = <3300000>; -diff --git a/arch/arm64/crypto/aes-neonbs-glue.c b/arch/arm64/crypto/aes-neonbs-glue.c -index ea873b8904c4..e3e27349a9fe 100644 ---- a/arch/arm64/crypto/aes-neonbs-glue.c -+++ b/arch/arm64/crypto/aes-neonbs-glue.c -@@ -384,7 +384,7 @@ static int __xts_crypt(struct skcipher_request *req, bool encrypt, - goto xts_tail; - - kernel_neon_end(); -- skcipher_walk_done(&walk, nbytes); -+ err = skcipher_walk_done(&walk, nbytes); - } - - if (err || likely(!tail)) -diff --git a/arch/hexagon/include/asm/atomic.h b/arch/hexagon/include/asm/atomic.h -index 12cd9231c4b8..0231d69c8bf2 100644 ---- a/arch/hexagon/include/asm/atomic.h -+++ b/arch/hexagon/include/asm/atomic.h -@@ -91,7 +91,7 @@ static inline void atomic_##op(int i, atomic_t *v) \ - "1: %0 = memw_locked(%1);\n" \ - " %0 = "#op "(%0,%2);\n" \ - " memw_locked(%1,P3)=%0;\n" \ -- " if !P3 jump 1b;\n" \ -+ " if (!P3) jump 1b;\n" \ - : "=&r" (output) \ - : "r" (&v->counter), "r" (i) \ - : "memory", "p3" \ -@@ -107,7 +107,7 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \ - "1: %0 = memw_locked(%1);\n" \ - " %0 = "#op "(%0,%2);\n" \ - " memw_locked(%1,P3)=%0;\n" \ -- " if !P3 jump 1b;\n" \ -+ " if (!P3) jump 1b;\n" \ - : "=&r" (output) \ - : "r" (&v->counter), "r" (i) \ - : "memory", "p3" \ -@@ -124,7 +124,7 @@ static inline int atomic_fetch_##op(int i, atomic_t *v) \ - "1: %0 = memw_locked(%2);\n" \ - " %1 = "#op "(%0,%3);\n" \ - " memw_locked(%2,P3)=%1;\n" \ -- " if !P3 jump 1b;\n" \ -+ " if (!P3) jump 1b;\n" \ - : "=&r" (output), "=&r" (val) \ - : "r" (&v->counter), "r" (i) \ - : "memory", "p3" \ -@@ -173,7 +173,7 @@ static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u) - " }" - " memw_locked(%2, p3) = %1;" - " {" -- " if !p3 jump 1b;" -+ " if (!p3) jump 1b;" - " }" - "2:" - : "=&r" (__oldval), "=&r" (tmp) -diff --git a/arch/hexagon/include/asm/bitops.h b/arch/hexagon/include/asm/bitops.h -index 47384b094b94..71429f756af0 100644 ---- a/arch/hexagon/include/asm/bitops.h -+++ b/arch/hexagon/include/asm/bitops.h -@@ -38,7 +38,7 @@ static inline int test_and_clear_bit(int nr, volatile void *addr) - "1: R12 = memw_locked(R10);\n" - " { P0 = tstbit(R12,R11); R12 = clrbit(R12,R11); }\n" - " memw_locked(R10,P1) = R12;\n" -- " {if !P1 jump 1b; %0 = mux(P0,#1,#0);}\n" -+ " {if (!P1) jump 1b; %0 = mux(P0,#1,#0);}\n" - : "=&r" (oldval) - : "r" (addr), "r" (nr) - : "r10", "r11", "r12", "p0", "p1", "memory" -@@ -62,7 +62,7 @@ static inline int test_and_set_bit(int nr, volatile void *addr) - "1: R12 = memw_locked(R10);\n" - " { P0 = tstbit(R12,R11); R12 = setbit(R12,R11); }\n" - " memw_locked(R10,P1) = R12;\n" -- " {if !P1 jump 1b; %0 = mux(P0,#1,#0);}\n" -+ " {if (!P1) jump 1b; %0 = mux(P0,#1,#0);}\n" - : "=&r" (oldval) - : "r" (addr), "r" (nr) - : "r10", "r11", "r12", "p0", "p1", "memory" -@@ -88,7 +88,7 @@ static inline int test_and_change_bit(int nr, volatile void *addr) - "1: R12 = memw_locked(R10);\n" - " { P0 = tstbit(R12,R11); R12 = togglebit(R12,R11); }\n" - " memw_locked(R10,P1) = R12;\n" -- " {if !P1 jump 1b; %0 = mux(P0,#1,#0);}\n" -+ " {if (!P1) jump 1b; %0 = mux(P0,#1,#0);}\n" - : "=&r" (oldval) - : "r" (addr), "r" (nr) - : "r10", "r11", "r12", "p0", "p1", "memory" -@@ -223,7 +223,7 @@ static inline int ffs(int x) - int r; - - asm("{ P0 = cmp.eq(%1,#0); %0 = ct0(%1);}\n" -- "{ if P0 %0 = #0; if !P0 %0 = add(%0,#1);}\n" -+ "{ if (P0) %0 = #0; if (!P0) %0 = add(%0,#1);}\n" - : "=&r" (r) - : "r" (x) - : "p0"); -diff --git a/arch/hexagon/include/asm/cmpxchg.h b/arch/hexagon/include/asm/cmpxchg.h -index 6091322c3af9..92b8a02e588a 100644 ---- a/arch/hexagon/include/asm/cmpxchg.h -+++ b/arch/hexagon/include/asm/cmpxchg.h -@@ -30,7 +30,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, - __asm__ __volatile__ ( - "1: %0 = memw_locked(%1);\n" /* load into retval */ - " memw_locked(%1,P0) = %2;\n" /* store into memory */ -- " if !P0 jump 1b;\n" -+ " if (!P0) jump 1b;\n" - : "=&r" (retval) - : "r" (ptr), "r" (x) - : "memory", "p0" -diff --git a/arch/hexagon/include/asm/futex.h b/arch/hexagon/include/asm/futex.h -index cb635216a732..0191f7c7193e 100644 ---- a/arch/hexagon/include/asm/futex.h -+++ b/arch/hexagon/include/asm/futex.h -@@ -16,7 +16,7 @@ - /* For example: %1 = %4 */ \ - insn \ - "2: memw_locked(%3,p2) = %1;\n" \ -- " if !p2 jump 1b;\n" \ -+ " if (!p2) jump 1b;\n" \ - " %1 = #0;\n" \ - "3:\n" \ - ".section .fixup,\"ax\"\n" \ -@@ -84,10 +84,10 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, - "1: %1 = memw_locked(%3)\n" - " {\n" - " p2 = cmp.eq(%1,%4)\n" -- " if !p2.new jump:NT 3f\n" -+ " if (!p2.new) jump:NT 3f\n" - " }\n" - "2: memw_locked(%3,p2) = %5\n" -- " if !p2 jump 1b\n" -+ " if (!p2) jump 1b\n" - "3:\n" - ".section .fixup,\"ax\"\n" - "4: %0 = #%6\n" -diff --git a/arch/hexagon/include/asm/spinlock.h b/arch/hexagon/include/asm/spinlock.h -index bfe07d842ff3..ef103b73bec8 100644 ---- a/arch/hexagon/include/asm/spinlock.h -+++ b/arch/hexagon/include/asm/spinlock.h -@@ -30,9 +30,9 @@ static inline void arch_read_lock(arch_rwlock_t *lock) - __asm__ __volatile__( - "1: R6 = memw_locked(%0);\n" - " { P3 = cmp.ge(R6,#0); R6 = add(R6,#1);}\n" -- " { if !P3 jump 1b; }\n" -+ " { if (!P3) jump 1b; }\n" - " memw_locked(%0,P3) = R6;\n" -- " { if !P3 jump 1b; }\n" -+ " { if (!P3) jump 1b; }\n" - : - : "r" (&lock->lock) - : "memory", "r6", "p3" -@@ -46,7 +46,7 @@ static inline void arch_read_unlock(arch_rwlock_t *lock) - "1: R6 = memw_locked(%0);\n" - " R6 = add(R6,#-1);\n" - " memw_locked(%0,P3) = R6\n" -- " if !P3 jump 1b;\n" -+ " if (!P3) jump 1b;\n" - : - : "r" (&lock->lock) - : "memory", "r6", "p3" -@@ -61,7 +61,7 @@ static inline int arch_read_trylock(arch_rwlock_t *lock) - __asm__ __volatile__( - " R6 = memw_locked(%1);\n" - " { %0 = #0; P3 = cmp.ge(R6,#0); R6 = add(R6,#1);}\n" -- " { if !P3 jump 1f; }\n" -+ " { if (!P3) jump 1f; }\n" - " memw_locked(%1,P3) = R6;\n" - " { %0 = P3 }\n" - "1:\n" -@@ -78,9 +78,9 @@ static inline void arch_write_lock(arch_rwlock_t *lock) - __asm__ __volatile__( - "1: R6 = memw_locked(%0)\n" - " { P3 = cmp.eq(R6,#0); R6 = #-1;}\n" -- " { if !P3 jump 1b; }\n" -+ " { if (!P3) jump 1b; }\n" - " memw_locked(%0,P3) = R6;\n" -- " { if !P3 jump 1b; }\n" -+ " { if (!P3) jump 1b; }\n" - : - : "r" (&lock->lock) - : "memory", "r6", "p3" -@@ -94,7 +94,7 @@ static inline int arch_write_trylock(arch_rwlock_t *lock) - __asm__ __volatile__( - " R6 = memw_locked(%1)\n" - " { %0 = #0; P3 = cmp.eq(R6,#0); R6 = #-1;}\n" -- " { if !P3 jump 1f; }\n" -+ " { if (!P3) jump 1f; }\n" - " memw_locked(%1,P3) = R6;\n" - " %0 = P3;\n" - "1:\n" -@@ -117,9 +117,9 @@ static inline void arch_spin_lock(arch_spinlock_t *lock) - __asm__ __volatile__( - "1: R6 = memw_locked(%0);\n" - " P3 = cmp.eq(R6,#0);\n" -- " { if !P3 jump 1b; R6 = #1; }\n" -+ " { if (!P3) jump 1b; R6 = #1; }\n" - " memw_locked(%0,P3) = R6;\n" -- " { if !P3 jump 1b; }\n" -+ " { if (!P3) jump 1b; }\n" - : - : "r" (&lock->lock) - : "memory", "r6", "p3" -@@ -139,7 +139,7 @@ static inline unsigned int arch_spin_trylock(arch_spinlock_t *lock) - __asm__ __volatile__( - " R6 = memw_locked(%1);\n" - " P3 = cmp.eq(R6,#0);\n" -- " { if !P3 jump 1f; R6 = #1; %0 = #0; }\n" -+ " { if (!P3) jump 1f; R6 = #1; %0 = #0; }\n" - " memw_locked(%1,P3) = R6;\n" - " %0 = P3;\n" - "1:\n" -diff --git a/arch/hexagon/kernel/stacktrace.c b/arch/hexagon/kernel/stacktrace.c -index 35f29423fda8..5ed02f699479 100644 ---- a/arch/hexagon/kernel/stacktrace.c -+++ b/arch/hexagon/kernel/stacktrace.c -@@ -11,8 +11,6 @@ - #include - #include - --register unsigned long current_frame_pointer asm("r30"); -- - struct stackframe { - unsigned long fp; - unsigned long rets; -@@ -30,7 +28,7 @@ void save_stack_trace(struct stack_trace *trace) - - low = (unsigned long)task_stack_page(current); - high = low + THREAD_SIZE; -- fp = current_frame_pointer; -+ fp = (unsigned long)__builtin_frame_address(0); - - while (fp >= low && fp <= (high - sizeof(*frame))) { - frame = (struct stackframe *)fp; -diff --git a/arch/hexagon/kernel/vm_entry.S b/arch/hexagon/kernel/vm_entry.S -index 12242c27e2df..4023fdbea490 100644 ---- a/arch/hexagon/kernel/vm_entry.S -+++ b/arch/hexagon/kernel/vm_entry.S -@@ -369,7 +369,7 @@ ret_from_fork: - R26.L = #LO(do_work_pending); - R0 = #VM_INT_DISABLE; - } -- if P0 jump check_work_pending -+ if (P0) jump check_work_pending - { - R0 = R25; - callr R24 -diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile -index 172801ed35b8..d859f079b771 100644 ---- a/arch/mips/boot/compressed/Makefile -+++ b/arch/mips/boot/compressed/Makefile -@@ -29,6 +29,9 @@ KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__ \ - -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \ - -DKERNEL_ENTRY=$(VMLINUX_ENTRY_ADDRESS) - -+# Prevents link failures: __sanitizer_cov_trace_pc() is not linked in. -+KCOV_INSTRUMENT := n -+ - # decompressor objects (linked with vmlinuz) - vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o - -diff --git a/arch/mips/include/asm/vdso/gettimeofday.h b/arch/mips/include/asm/vdso/gettimeofday.h -index b08825531e9f..0ae9b4cbc153 100644 ---- a/arch/mips/include/asm/vdso/gettimeofday.h -+++ b/arch/mips/include/asm/vdso/gettimeofday.h -@@ -26,8 +26,6 @@ - - #define __VDSO_USE_SYSCALL ULLONG_MAX - --#ifdef CONFIG_MIPS_CLOCK_VSYSCALL -- - static __always_inline long gettimeofday_fallback( - struct __kernel_old_timeval *_tv, - struct timezone *_tz) -@@ -48,17 +46,6 @@ static __always_inline long gettimeofday_fallback( - return error ? -ret : ret; - } - --#else -- --static __always_inline long gettimeofday_fallback( -- struct __kernel_old_timeval *_tv, -- struct timezone *_tz) --{ -- return -1; --} -- --#endif -- - static __always_inline long clock_gettime_fallback( - clockid_t _clkid, - struct __kernel_timespec *_ts) -diff --git a/arch/mips/kernel/cacheinfo.c b/arch/mips/kernel/cacheinfo.c -index f777e44653d5..47312c529410 100644 ---- a/arch/mips/kernel/cacheinfo.c -+++ b/arch/mips/kernel/cacheinfo.c -@@ -50,6 +50,25 @@ static int __init_cache_level(unsigned int cpu) - return 0; - } - -+static void fill_cpumask_siblings(int cpu, cpumask_t *cpu_map) -+{ -+ int cpu1; -+ -+ for_each_possible_cpu(cpu1) -+ if (cpus_are_siblings(cpu, cpu1)) -+ cpumask_set_cpu(cpu1, cpu_map); -+} -+ -+static void fill_cpumask_cluster(int cpu, cpumask_t *cpu_map) -+{ -+ int cpu1; -+ int cluster = cpu_cluster(&cpu_data[cpu]); -+ -+ for_each_possible_cpu(cpu1) -+ if (cpu_cluster(&cpu_data[cpu1]) == cluster) -+ cpumask_set_cpu(cpu1, cpu_map); -+} -+ - static int __populate_cache_leaves(unsigned int cpu) - { - struct cpuinfo_mips *c = ¤t_cpu_data; -@@ -57,14 +76,20 @@ static int __populate_cache_leaves(unsigned int cpu) - struct cacheinfo *this_leaf = this_cpu_ci->info_list; - - if (c->icache.waysize) { -+ /* L1 caches are per core */ -+ fill_cpumask_siblings(cpu, &this_leaf->shared_cpu_map); - populate_cache(dcache, this_leaf, 1, CACHE_TYPE_DATA); -+ fill_cpumask_siblings(cpu, &this_leaf->shared_cpu_map); - populate_cache(icache, this_leaf, 1, CACHE_TYPE_INST); - } else { - populate_cache(dcache, this_leaf, 1, CACHE_TYPE_UNIFIED); - } - -- if (c->scache.waysize) -+ if (c->scache.waysize) { -+ /* L2 cache is per cluster */ -+ fill_cpumask_cluster(cpu, &this_leaf->shared_cpu_map); - populate_cache(scache, this_leaf, 2, CACHE_TYPE_UNIFIED); -+ } - - if (c->tcache.waysize) - populate_cache(tcache, this_leaf, 3, CACHE_TYPE_UNIFIED); -diff --git a/arch/mips/pci/pci-xtalk-bridge.c b/arch/mips/pci/pci-xtalk-bridge.c -index 7b4d40354ee7..30017d5945bc 100644 ---- a/arch/mips/pci/pci-xtalk-bridge.c -+++ b/arch/mips/pci/pci-xtalk-bridge.c -@@ -279,16 +279,15 @@ static int bridge_set_affinity(struct irq_data *d, const struct cpumask *mask, - struct bridge_irq_chip_data *data = d->chip_data; - int bit = d->parent_data->hwirq; - int pin = d->hwirq; -- nasid_t nasid; - int ret, cpu; - - ret = irq_chip_set_affinity_parent(d, mask, force); - if (ret >= 0) { - cpu = cpumask_first_and(mask, cpu_online_mask); -- nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu)); -+ data->nnasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu)); - bridge_write(data->bc, b_int_addr[pin].addr, - (((data->bc->intr_addr >> 30) & 0x30000) | -- bit | (nasid << 8))); -+ bit | (data->nasid << 8))); - bridge_read(data->bc, b_wid_tflush); - } - return ret; -diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c -index 37be04975831..79a2f6bd2b5a 100644 ---- a/arch/mips/sgi-ip27/ip27-irq.c -+++ b/arch/mips/sgi-ip27/ip27-irq.c -@@ -73,6 +73,9 @@ static void setup_hub_mask(struct hub_irq_data *hd, const struct cpumask *mask) - int cpu; - - cpu = cpumask_first_and(mask, cpu_online_mask); -+ if (cpu >= nr_cpu_ids) -+ cpu = cpumask_any(cpu_online_mask); -+ - nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu)); - hd->cpu = cpu; - if (!cputoslice(cpu)) { -@@ -139,6 +142,7 @@ static int hub_domain_alloc(struct irq_domain *domain, unsigned int virq, - /* use CPU connected to nearest hub */ - hub = hub_data(NASID_TO_COMPACT_NODEID(info->nasid)); - setup_hub_mask(hd, &hub->h_cpus); -+ info->nasid = cpu_to_node(hd->cpu); - - /* Make sure it's not already pending when we connect it. */ - REMOTE_HUB_CLR_INTR(info->nasid, swlevel); -diff --git a/arch/mips/vdso/vgettimeofday.c b/arch/mips/vdso/vgettimeofday.c -index 6ebdc37c89fc..6b83b6376a4b 100644 ---- a/arch/mips/vdso/vgettimeofday.c -+++ b/arch/mips/vdso/vgettimeofday.c -@@ -17,12 +17,22 @@ int __vdso_clock_gettime(clockid_t clock, - return __cvdso_clock_gettime32(clock, ts); - } - -+#ifdef CONFIG_MIPS_CLOCK_VSYSCALL -+ -+/* -+ * This is behind the ifdef so that we don't provide the symbol when there's no -+ * possibility of there being a usable clocksource, because there's nothing we -+ * can do without it. When libc fails the symbol lookup it should fall back on -+ * the standard syscall path. -+ */ - int __vdso_gettimeofday(struct __kernel_old_timeval *tv, - struct timezone *tz) - { - return __cvdso_gettimeofday(tv, tz); - } - -+#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */ -+ - int __vdso_clock_getres(clockid_t clock_id, - struct old_timespec32 *res) - { -@@ -43,12 +53,22 @@ int __vdso_clock_gettime(clockid_t clock, - return __cvdso_clock_gettime(clock, ts); - } - -+#ifdef CONFIG_MIPS_CLOCK_VSYSCALL -+ -+/* -+ * This is behind the ifdef so that we don't provide the symbol when there's no -+ * possibility of there being a usable clocksource, because there's nothing we -+ * can do without it. When libc fails the symbol lookup it should fall back on -+ * the standard syscall path. -+ */ - int __vdso_gettimeofday(struct __kernel_old_timeval *tv, - struct timezone *tz) - { - return __cvdso_gettimeofday(tv, tz); - } - -+#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */ -+ - int __vdso_clock_getres(clockid_t clock_id, - struct __kernel_timespec *res) - { -diff --git a/arch/nds32/include/asm/cacheflush.h b/arch/nds32/include/asm/cacheflush.h -index d9ac7e6408ef..caddded56e77 100644 ---- a/arch/nds32/include/asm/cacheflush.h -+++ b/arch/nds32/include/asm/cacheflush.h -@@ -9,7 +9,11 @@ - #define PG_dcache_dirty PG_arch_1 - - void flush_icache_range(unsigned long start, unsigned long end); -+#define flush_icache_range flush_icache_range -+ - void flush_icache_page(struct vm_area_struct *vma, struct page *page); -+#define flush_icache_page flush_icache_page -+ - #ifdef CONFIG_CPU_CACHE_ALIASING - void flush_cache_mm(struct mm_struct *mm); - void flush_cache_dup_mm(struct mm_struct *mm); -@@ -40,12 +44,11 @@ void invalidate_kernel_vmap_range(void *addr, int size); - #define flush_dcache_mmap_unlock(mapping) xa_unlock_irq(&(mapping)->i_pages) - - #else --#include --#undef flush_icache_range --#undef flush_icache_page --#undef flush_icache_user_range - void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, - unsigned long addr, int len); -+#define flush_icache_user_range flush_icache_user_range -+ -+#include - #endif - - #endif /* __NDS32_CACHEFLUSH_H__ */ -diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c -index 2825d004dece..c0bea75ac27b 100644 ---- a/arch/powerpc/platforms/powernv/pci.c -+++ b/arch/powerpc/platforms/powernv/pci.c -@@ -945,6 +945,23 @@ void __init pnv_pci_init(void) - if (!firmware_has_feature(FW_FEATURE_OPAL)) - return; - -+#ifdef CONFIG_PCIEPORTBUS -+ /* -+ * On PowerNV PCIe devices are (currently) managed in cooperation -+ * with firmware. This isn't *strictly* required, but there's enough -+ * assumptions baked into both firmware and the platform code that -+ * it's unwise to allow the portbus services to be used. -+ * -+ * We need to fix this eventually, but for now set this flag to disable -+ * the portbus driver. The AER service isn't required since that AER -+ * events are handled via EEH. The pciehp hotplug driver can't work -+ * without kernel changes (and portbus binding breaks pnv_php). The -+ * other services also require some thinking about how we're going -+ * to integrate them. -+ */ -+ pcie_ports_disabled = true; -+#endif -+ - /* Look for IODA IO-Hubs. */ - for_each_compatible_node(np, NULL, "ibm,ioda-hub") { - pnv_pci_init_ioda_hub(np); -diff --git a/arch/riscv/mm/cacheflush.c b/arch/riscv/mm/cacheflush.c -index 3f15938dec89..c54bd3c79955 100644 ---- a/arch/riscv/mm/cacheflush.c -+++ b/arch/riscv/mm/cacheflush.c -@@ -14,6 +14,7 @@ void flush_icache_all(void) - { - sbi_remote_fence_i(NULL); - } -+EXPORT_SYMBOL(flush_icache_all); - - /* - * Performs an icache flush for the given MM context. RISC-V has no direct -diff --git a/arch/x86/entry/syscall_32.c b/arch/x86/entry/syscall_32.c -index aa3336a7cb15..7d17b3addbbb 100644 ---- a/arch/x86/entry/syscall_32.c -+++ b/arch/x86/entry/syscall_32.c -@@ -10,13 +10,11 @@ - #ifdef CONFIG_IA32_EMULATION - /* On X86_64, we use struct pt_regs * to pass parameters to syscalls */ - #define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *); -- --/* this is a lie, but it does not hurt as sys_ni_syscall just returns -EINVAL */ --extern asmlinkage long sys_ni_syscall(const struct pt_regs *); -- -+#define __sys_ni_syscall __ia32_sys_ni_syscall - #else /* CONFIG_IA32_EMULATION */ - #define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long); - extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long); -+#define __sys_ni_syscall sys_ni_syscall - #endif /* CONFIG_IA32_EMULATION */ - - #include -@@ -29,6 +27,6 @@ __visible const sys_call_ptr_t ia32_sys_call_table[__NR_syscall_compat_max+1] = - * Smells like a compiler bug -- it doesn't work - * when the & below is removed. - */ -- [0 ... __NR_syscall_compat_max] = &sys_ni_syscall, -+ [0 ... __NR_syscall_compat_max] = &__sys_ni_syscall, - #include - }; -diff --git a/arch/x86/entry/syscall_64.c b/arch/x86/entry/syscall_64.c -index b1bf31713374..adf619a856e8 100644 ---- a/arch/x86/entry/syscall_64.c -+++ b/arch/x86/entry/syscall_64.c -@@ -4,11 +4,17 @@ - #include - #include - #include -+#include - #include - #include - --/* this is a lie, but it does not hurt as sys_ni_syscall just returns -EINVAL */ --extern asmlinkage long sys_ni_syscall(const struct pt_regs *); -+extern asmlinkage long sys_ni_syscall(void); -+ -+SYSCALL_DEFINE0(ni_syscall) -+{ -+ return sys_ni_syscall(); -+} -+ - #define __SYSCALL_64(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *); - #define __SYSCALL_X32(nr, sym, qual) __SYSCALL_64(nr, sym, qual) - #include -@@ -23,7 +29,7 @@ asmlinkage const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { - * Smells like a compiler bug -- it doesn't work - * when the & below is removed. - */ -- [0 ... __NR_syscall_max] = &sys_ni_syscall, -+ [0 ... __NR_syscall_max] = &__x64_sys_ni_syscall, - #include - }; - -@@ -40,7 +46,7 @@ asmlinkage const sys_call_ptr_t x32_sys_call_table[__NR_syscall_x32_max+1] = { - * Smells like a compiler bug -- it doesn't work - * when the & below is removed. - */ -- [0 ... __NR_syscall_x32_max] = &sys_ni_syscall, -+ [0 ... __NR_syscall_x32_max] = &__x64_sys_ni_syscall, - #include - }; - -diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl -index 3fe02546aed3..15908eb9b17e 100644 ---- a/arch/x86/entry/syscalls/syscall_32.tbl -+++ b/arch/x86/entry/syscalls/syscall_32.tbl -@@ -124,13 +124,13 @@ - 110 i386 iopl sys_iopl __ia32_sys_iopl - 111 i386 vhangup sys_vhangup __ia32_sys_vhangup - 112 i386 idle --113 i386 vm86old sys_vm86old sys_ni_syscall -+113 i386 vm86old sys_vm86old __ia32_sys_ni_syscall - 114 i386 wait4 sys_wait4 __ia32_compat_sys_wait4 - 115 i386 swapoff sys_swapoff __ia32_sys_swapoff - 116 i386 sysinfo sys_sysinfo __ia32_compat_sys_sysinfo - 117 i386 ipc sys_ipc __ia32_compat_sys_ipc - 118 i386 fsync sys_fsync __ia32_sys_fsync --119 i386 sigreturn sys_sigreturn sys32_sigreturn -+119 i386 sigreturn sys_sigreturn __ia32_compat_sys_sigreturn - 120 i386 clone sys_clone __ia32_compat_sys_x86_clone - 121 i386 setdomainname sys_setdomainname __ia32_sys_setdomainname - 122 i386 uname sys_newuname __ia32_sys_newuname -@@ -177,14 +177,14 @@ - 163 i386 mremap sys_mremap __ia32_sys_mremap - 164 i386 setresuid sys_setresuid16 __ia32_sys_setresuid16 - 165 i386 getresuid sys_getresuid16 __ia32_sys_getresuid16 --166 i386 vm86 sys_vm86 sys_ni_syscall -+166 i386 vm86 sys_vm86 __ia32_sys_ni_syscall - 167 i386 query_module - 168 i386 poll sys_poll __ia32_sys_poll - 169 i386 nfsservctl - 170 i386 setresgid sys_setresgid16 __ia32_sys_setresgid16 - 171 i386 getresgid sys_getresgid16 __ia32_sys_getresgid16 - 172 i386 prctl sys_prctl __ia32_sys_prctl --173 i386 rt_sigreturn sys_rt_sigreturn sys32_rt_sigreturn -+173 i386 rt_sigreturn sys_rt_sigreturn __ia32_compat_sys_rt_sigreturn - 174 i386 rt_sigaction sys_rt_sigaction __ia32_compat_sys_rt_sigaction - 175 i386 rt_sigprocmask sys_rt_sigprocmask __ia32_compat_sys_rt_sigprocmask - 176 i386 rt_sigpending sys_rt_sigpending __ia32_compat_sys_rt_sigpending -diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c -index 1cee10091b9f..30416d7f19d4 100644 ---- a/arch/x86/ia32/ia32_signal.c -+++ b/arch/x86/ia32/ia32_signal.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -118,7 +119,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, - return err; - } - --asmlinkage long sys32_sigreturn(void) -+COMPAT_SYSCALL_DEFINE0(sigreturn) - { - struct pt_regs *regs = current_pt_regs(); - struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); -@@ -144,7 +145,7 @@ badframe: - return 0; - } - --asmlinkage long sys32_rt_sigreturn(void) -+COMPAT_SYSCALL_DEFINE0(rt_sigreturn) - { - struct pt_regs *regs = current_pt_regs(); - struct rt_sigframe_ia32 __user *frame; -diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h -index 90eb70df0b18..e2389ce9bf58 100644 ---- a/arch/x86/include/asm/syscall_wrapper.h -+++ b/arch/x86/include/asm/syscall_wrapper.h -@@ -6,6 +6,8 @@ - #ifndef _ASM_X86_SYSCALL_WRAPPER_H - #define _ASM_X86_SYSCALL_WRAPPER_H - -+struct pt_regs; -+ - /* Mapping of registers to parameters for syscalls on x86-64 and x32 */ - #define SC_X86_64_REGS_TO_ARGS(x, ...) \ - __MAP(x,__SC_ARGS \ -@@ -28,13 +30,21 @@ - * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this - * case as well. - */ -+#define __IA32_COMPAT_SYS_STUB0(x, name) \ -+ asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs);\ -+ ALLOW_ERROR_INJECTION(__ia32_compat_sys_##name, ERRNO); \ -+ asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs)\ -+ { \ -+ return __se_compat_sys_##name(); \ -+ } -+ - #define __IA32_COMPAT_SYS_STUBx(x, name, ...) \ - asmlinkage long __ia32_compat_sys##name(const struct pt_regs *regs);\ - ALLOW_ERROR_INJECTION(__ia32_compat_sys##name, ERRNO); \ - asmlinkage long __ia32_compat_sys##name(const struct pt_regs *regs)\ - { \ - return __se_compat_sys##name(SC_IA32_REGS_TO_ARGS(x,__VA_ARGS__));\ -- } \ -+ } - - #define __IA32_SYS_STUBx(x, name, ...) \ - asmlinkage long __ia32_sys##name(const struct pt_regs *regs); \ -@@ -56,9 +66,15 @@ - SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname); \ - asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused) - --#define COND_SYSCALL(name) \ -- cond_syscall(__x64_sys_##name); \ -- cond_syscall(__ia32_sys_##name) -+#define COND_SYSCALL(name) \ -+ asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \ -+ { \ -+ return sys_ni_syscall(); \ -+ } \ -+ asmlinkage __weak long __ia32_sys_##name(const struct pt_regs *__unused)\ -+ { \ -+ return sys_ni_syscall(); \ -+ } - - #define SYS_NI(name) \ - SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers); \ -@@ -76,15 +92,24 @@ - * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common - * with x86_64 obviously do not need such care. - */ -+#define __X32_COMPAT_SYS_STUB0(x, name, ...) \ -+ asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs);\ -+ ALLOW_ERROR_INJECTION(__x32_compat_sys_##name, ERRNO); \ -+ asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs)\ -+ { \ -+ return __se_compat_sys_##name();\ -+ } -+ - #define __X32_COMPAT_SYS_STUBx(x, name, ...) \ - asmlinkage long __x32_compat_sys##name(const struct pt_regs *regs);\ - ALLOW_ERROR_INJECTION(__x32_compat_sys##name, ERRNO); \ - asmlinkage long __x32_compat_sys##name(const struct pt_regs *regs)\ - { \ - return __se_compat_sys##name(SC_X86_64_REGS_TO_ARGS(x,__VA_ARGS__));\ -- } \ -+ } - - #else /* CONFIG_X86_X32 */ -+#define __X32_COMPAT_SYS_STUB0(x, name) - #define __X32_COMPAT_SYS_STUBx(x, name, ...) - #endif /* CONFIG_X86_X32 */ - -@@ -95,6 +120,17 @@ - * mapping of registers to parameters, we need to generate stubs for each - * of them. - */ -+#define COMPAT_SYSCALL_DEFINE0(name) \ -+ static long __se_compat_sys_##name(void); \ -+ static inline long __do_compat_sys_##name(void); \ -+ __IA32_COMPAT_SYS_STUB0(x, name) \ -+ __X32_COMPAT_SYS_STUB0(x, name) \ -+ static long __se_compat_sys_##name(void) \ -+ { \ -+ return __do_compat_sys_##name(); \ -+ } \ -+ static inline long __do_compat_sys_##name(void) -+ - #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ - static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ - static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ -@@ -190,7 +226,11 @@ - #endif - - #ifndef COND_SYSCALL --#define COND_SYSCALL(name) cond_syscall(__x64_sys_##name) -+#define COND_SYSCALL(name) \ -+ asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \ -+ { \ -+ return sys_ni_syscall(); \ -+ } - #endif - - #ifndef SYS_NI -@@ -202,7 +242,6 @@ - * For VSYSCALLS, we need to declare these three syscalls with the new - * pt_regs-based calling convention for in-kernel use. - */ --struct pt_regs; - asmlinkage long __x64_sys_getcpu(const struct pt_regs *regs); - asmlinkage long __x64_sys_gettimeofday(const struct pt_regs *regs); - asmlinkage long __x64_sys_time(const struct pt_regs *regs); -diff --git a/block/bio.c b/block/bio.c -index c822ceb7c4de..906da3581a3e 100644 ---- a/block/bio.c -+++ b/block/bio.c -@@ -535,6 +535,16 @@ void zero_fill_bio_iter(struct bio *bio, struct bvec_iter start) - } - EXPORT_SYMBOL(zero_fill_bio_iter); - -+/** -+ * bio_truncate - truncate the bio to small size of @new_size -+ * @bio: the bio to be truncated -+ * @new_size: new size for truncating the bio -+ * -+ * Description: -+ * Truncate the bio to new size of @new_size. If bio_op(bio) is -+ * REQ_OP_READ, zero the truncated part. This function should only -+ * be used for handling corner cases, such as bio eod. -+ */ - void bio_truncate(struct bio *bio, unsigned new_size) - { - struct bio_vec bv; -@@ -545,7 +555,7 @@ void bio_truncate(struct bio *bio, unsigned new_size) - if (new_size >= bio->bi_iter.bi_size) - return; - -- if (bio_data_dir(bio) != READ) -+ if (bio_op(bio) != REQ_OP_READ) - goto exit; - - bio_for_each_segment(bv, bio, iter) { -diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c -index c1601edd70e3..e2c8ab408bed 100644 ---- a/crypto/algif_skcipher.c -+++ b/crypto/algif_skcipher.c -@@ -56,7 +56,7 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, - struct alg_sock *pask = alg_sk(psk); - struct af_alg_ctx *ctx = ask->private; - struct crypto_skcipher *tfm = pask->private; -- unsigned int bs = crypto_skcipher_blocksize(tfm); -+ unsigned int bs = crypto_skcipher_chunksize(tfm); - struct af_alg_async_req *areq; - int err = 0; - size_t len = 0; -diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c -index 27a95c86a80b..4fc294c2f9e8 100644 ---- a/drivers/clk/clk.c -+++ b/drivers/clk/clk.c -@@ -3886,6 +3886,7 @@ void clk_unregister(struct clk *clk) - __func__, clk->core->name); - - kref_put(&clk->core->ref, __clk_release); -+ free_clk(clk); - unlock: - clk_prepare_unlock(); - } -diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c -index d43b4a3c0de8..047f1d8fe323 100644 ---- a/drivers/clk/imx/clk-pll14xx.c -+++ b/drivers/clk/imx/clk-pll14xx.c -@@ -112,43 +112,17 @@ static unsigned long clk_pll1443x_recalc_rate(struct clk_hw *hw, - return fvco; - } - --static inline bool clk_pll1416x_mp_change(const struct imx_pll14xx_rate_table *rate, -+static inline bool clk_pll14xx_mp_change(const struct imx_pll14xx_rate_table *rate, - u32 pll_div) - { - u32 old_mdiv, old_pdiv; - -- old_mdiv = (pll_div >> MDIV_SHIFT) & MDIV_MASK; -- old_pdiv = (pll_div >> PDIV_SHIFT) & PDIV_MASK; -+ old_mdiv = (pll_div & MDIV_MASK) >> MDIV_SHIFT; -+ old_pdiv = (pll_div & PDIV_MASK) >> PDIV_SHIFT; - - return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv; - } - --static inline bool clk_pll1443x_mpk_change(const struct imx_pll14xx_rate_table *rate, -- u32 pll_div_ctl0, u32 pll_div_ctl1) --{ -- u32 old_mdiv, old_pdiv, old_kdiv; -- -- old_mdiv = (pll_div_ctl0 >> MDIV_SHIFT) & MDIV_MASK; -- old_pdiv = (pll_div_ctl0 >> PDIV_SHIFT) & PDIV_MASK; -- old_kdiv = (pll_div_ctl1 >> KDIV_SHIFT) & KDIV_MASK; -- -- return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv || -- rate->kdiv != old_kdiv; --} -- --static inline bool clk_pll1443x_mp_change(const struct imx_pll14xx_rate_table *rate, -- u32 pll_div_ctl0, u32 pll_div_ctl1) --{ -- u32 old_mdiv, old_pdiv, old_kdiv; -- -- old_mdiv = (pll_div_ctl0 >> MDIV_SHIFT) & MDIV_MASK; -- old_pdiv = (pll_div_ctl0 >> PDIV_SHIFT) & PDIV_MASK; -- old_kdiv = (pll_div_ctl1 >> KDIV_SHIFT) & KDIV_MASK; -- -- return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv || -- rate->kdiv != old_kdiv; --} -- - static int clk_pll14xx_wait_lock(struct clk_pll14xx *pll) - { - u32 val; -@@ -174,7 +148,7 @@ static int clk_pll1416x_set_rate(struct clk_hw *hw, unsigned long drate, - - tmp = readl_relaxed(pll->base + 4); - -- if (!clk_pll1416x_mp_change(rate, tmp)) { -+ if (!clk_pll14xx_mp_change(rate, tmp)) { - tmp &= ~(SDIV_MASK) << SDIV_SHIFT; - tmp |= rate->sdiv << SDIV_SHIFT; - writel_relaxed(tmp, pll->base + 4); -@@ -239,13 +213,15 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate, - } - - tmp = readl_relaxed(pll->base + 4); -- div_val = readl_relaxed(pll->base + 8); - -- if (!clk_pll1443x_mpk_change(rate, tmp, div_val)) { -+ if (!clk_pll14xx_mp_change(rate, tmp)) { - tmp &= ~(SDIV_MASK) << SDIV_SHIFT; - tmp |= rate->sdiv << SDIV_SHIFT; - writel_relaxed(tmp, pll->base + 4); - -+ tmp = rate->kdiv << KDIV_SHIFT; -+ writel_relaxed(tmp, pll->base + 8); -+ - return 0; - } - -diff --git a/drivers/clk/meson/axg-audio.c b/drivers/clk/meson/axg-audio.c -index 18b23cdf679c..aa2522624fd3 100644 ---- a/drivers/clk/meson/axg-audio.c -+++ b/drivers/clk/meson/axg-audio.c -@@ -1001,7 +1001,7 @@ static const struct regmap_config axg_audio_regmap_cfg = { - .reg_bits = 32, - .val_bits = 32, - .reg_stride = 4, -- .max_register = AUDIO_CLK_PDMIN_CTRL1, -+ .max_register = AUDIO_CLK_SPDIFOUT_B_CTRL, - }; - - struct audioclk_data { -diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c -index 31466cd1842f..3b7601647d7b 100644 ---- a/drivers/clk/samsung/clk-exynos5420.c -+++ b/drivers/clk/samsung/clk-exynos5420.c -@@ -165,6 +165,8 @@ static const unsigned long exynos5x_clk_regs[] __initconst = { - GATE_BUS_CPU, - GATE_SCLK_CPU, - CLKOUT_CMU_CPU, -+ APLL_CON0, -+ KPLL_CON0, - CPLL_CON0, - DPLL_CON0, - EPLL_CON0, -diff --git a/drivers/crypto/cavium/nitrox/nitrox_main.c b/drivers/crypto/cavium/nitrox/nitrox_main.c -index bc924980e10c..c4632d84c9a1 100644 ---- a/drivers/crypto/cavium/nitrox/nitrox_main.c -+++ b/drivers/crypto/cavium/nitrox/nitrox_main.c -@@ -103,8 +103,7 @@ static void write_to_ucd_unit(struct nitrox_device *ndev, u32 ucode_size, - offset = UCD_UCODE_LOAD_BLOCK_NUM; - nitrox_write_csr(ndev, offset, block_num); - -- code_size = ucode_size; -- code_size = roundup(code_size, 8); -+ code_size = roundup(ucode_size, 16); - while (code_size) { - data = ucode_data[i]; - /* write 8 bytes at a time */ -@@ -220,11 +219,11 @@ static int nitrox_load_fw(struct nitrox_device *ndev) - - /* write block number and firmware length - * bit:<2:0> block number -- * bit:3 is set SE uses 32KB microcode -- * bit:3 is clear SE uses 64KB microcode -+ * bit:3 is set AE uses 32KB microcode -+ * bit:3 is clear AE uses 64KB microcode - */ - core_2_eid_val.value = 0ULL; -- core_2_eid_val.ucode_blk = 0; -+ core_2_eid_val.ucode_blk = 2; - if (ucode_size <= CNN55XX_UCD_BLOCK_SIZE) - core_2_eid_val.ucode_len = 1; - else -diff --git a/drivers/crypto/geode-aes.c b/drivers/crypto/geode-aes.c -index 940485112d15..73a899e6f837 100644 ---- a/drivers/crypto/geode-aes.c -+++ b/drivers/crypto/geode-aes.c -@@ -10,7 +10,7 @@ - #include - #include - #include --#include -+#include - - #include - #include -@@ -24,12 +24,12 @@ static spinlock_t lock; - - /* Write a 128 bit field (either a writable key or IV) */ - static inline void --_writefield(u32 offset, void *value) -+_writefield(u32 offset, const void *value) - { - int i; - - for (i = 0; i < 4; i++) -- iowrite32(((u32 *) value)[i], _iobase + offset + (i * 4)); -+ iowrite32(((const u32 *) value)[i], _iobase + offset + (i * 4)); - } - - /* Read a 128 bit field (either a writable key or IV) */ -@@ -43,12 +43,12 @@ _readfield(u32 offset, void *value) - } - - static int --do_crypt(void *src, void *dst, int len, u32 flags) -+do_crypt(const void *src, void *dst, u32 len, u32 flags) - { - u32 status; - u32 counter = AES_OP_TIMEOUT; - -- iowrite32(virt_to_phys(src), _iobase + AES_SOURCEA_REG); -+ iowrite32(virt_to_phys((void *)src), _iobase + AES_SOURCEA_REG); - iowrite32(virt_to_phys(dst), _iobase + AES_DSTA_REG); - iowrite32(len, _iobase + AES_LENA_REG); - -@@ -65,16 +65,14 @@ do_crypt(void *src, void *dst, int len, u32 flags) - return counter ? 0 : 1; - } - --static unsigned int --geode_aes_crypt(struct geode_aes_op *op) -+static void -+geode_aes_crypt(const struct geode_aes_tfm_ctx *tctx, const void *src, -+ void *dst, u32 len, u8 *iv, int mode, int dir) - { - u32 flags = 0; - unsigned long iflags; - int ret; - -- if (op->len == 0) -- return 0; -- - /* If the source and destination is the same, then - * we need to turn on the coherent flags, otherwise - * we don't need to worry -@@ -82,32 +80,28 @@ geode_aes_crypt(struct geode_aes_op *op) - - flags |= (AES_CTRL_DCA | AES_CTRL_SCA); - -- if (op->dir == AES_DIR_ENCRYPT) -+ if (dir == AES_DIR_ENCRYPT) - flags |= AES_CTRL_ENCRYPT; - - /* Start the critical section */ - - spin_lock_irqsave(&lock, iflags); - -- if (op->mode == AES_MODE_CBC) { -+ if (mode == AES_MODE_CBC) { - flags |= AES_CTRL_CBC; -- _writefield(AES_WRITEIV0_REG, op->iv); -+ _writefield(AES_WRITEIV0_REG, iv); - } - -- if (!(op->flags & AES_FLAGS_HIDDENKEY)) { -- flags |= AES_CTRL_WRKEY; -- _writefield(AES_WRITEKEY0_REG, op->key); -- } -+ flags |= AES_CTRL_WRKEY; -+ _writefield(AES_WRITEKEY0_REG, tctx->key); - -- ret = do_crypt(op->src, op->dst, op->len, flags); -+ ret = do_crypt(src, dst, len, flags); - BUG_ON(ret); - -- if (op->mode == AES_MODE_CBC) -- _readfield(AES_WRITEIV0_REG, op->iv); -+ if (mode == AES_MODE_CBC) -+ _readfield(AES_WRITEIV0_REG, iv); - - spin_unlock_irqrestore(&lock, iflags); -- -- return op->len; - } - - /* CRYPTO-API Functions */ -@@ -115,13 +109,13 @@ geode_aes_crypt(struct geode_aes_op *op) - static int geode_setkey_cip(struct crypto_tfm *tfm, const u8 *key, - unsigned int len) - { -- struct geode_aes_op *op = crypto_tfm_ctx(tfm); -+ struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - unsigned int ret; - -- op->keylen = len; -+ tctx->keylen = len; - - if (len == AES_KEYSIZE_128) { -- memcpy(op->key, key, len); -+ memcpy(tctx->key, key, len); - return 0; - } - -@@ -134,132 +128,93 @@ static int geode_setkey_cip(struct crypto_tfm *tfm, const u8 *key, - /* - * The requested key size is not supported by HW, do a fallback - */ -- op->fallback.cip->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; -- op->fallback.cip->base.crt_flags |= (tfm->crt_flags & CRYPTO_TFM_REQ_MASK); -+ tctx->fallback.cip->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; -+ tctx->fallback.cip->base.crt_flags |= -+ (tfm->crt_flags & CRYPTO_TFM_REQ_MASK); - -- ret = crypto_cipher_setkey(op->fallback.cip, key, len); -+ ret = crypto_cipher_setkey(tctx->fallback.cip, key, len); - if (ret) { - tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK; -- tfm->crt_flags |= (op->fallback.cip->base.crt_flags & CRYPTO_TFM_RES_MASK); -+ tfm->crt_flags |= (tctx->fallback.cip->base.crt_flags & -+ CRYPTO_TFM_RES_MASK); - } - return ret; - } - --static int geode_setkey_blk(struct crypto_tfm *tfm, const u8 *key, -- unsigned int len) -+static int geode_setkey_skcipher(struct crypto_skcipher *tfm, const u8 *key, -+ unsigned int len) - { -- struct geode_aes_op *op = crypto_tfm_ctx(tfm); -+ struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm); - unsigned int ret; - -- op->keylen = len; -+ tctx->keylen = len; - - if (len == AES_KEYSIZE_128) { -- memcpy(op->key, key, len); -+ memcpy(tctx->key, key, len); - return 0; - } - - if (len != AES_KEYSIZE_192 && len != AES_KEYSIZE_256) { - /* not supported at all */ -- tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; -+ crypto_skcipher_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); - return -EINVAL; - } - - /* - * The requested key size is not supported by HW, do a fallback - */ -- crypto_sync_skcipher_clear_flags(op->fallback.blk, CRYPTO_TFM_REQ_MASK); -- crypto_sync_skcipher_set_flags(op->fallback.blk, -- tfm->crt_flags & CRYPTO_TFM_REQ_MASK); -- -- ret = crypto_sync_skcipher_setkey(op->fallback.blk, key, len); -- if (ret) { -- tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK; -- tfm->crt_flags |= crypto_sync_skcipher_get_flags(op->fallback.blk) & -- CRYPTO_TFM_RES_MASK; -- } -+ crypto_skcipher_clear_flags(tctx->fallback.skcipher, -+ CRYPTO_TFM_REQ_MASK); -+ crypto_skcipher_set_flags(tctx->fallback.skcipher, -+ crypto_skcipher_get_flags(tfm) & -+ CRYPTO_TFM_REQ_MASK); -+ ret = crypto_skcipher_setkey(tctx->fallback.skcipher, key, len); -+ crypto_skcipher_set_flags(tfm, -+ crypto_skcipher_get_flags(tctx->fallback.skcipher) & -+ CRYPTO_TFM_RES_MASK); - return ret; - } - --static int fallback_blk_dec(struct blkcipher_desc *desc, -- struct scatterlist *dst, struct scatterlist *src, -- unsigned int nbytes) --{ -- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); -- SYNC_SKCIPHER_REQUEST_ON_STACK(req, op->fallback.blk); -- -- skcipher_request_set_sync_tfm(req, op->fallback.blk); -- skcipher_request_set_callback(req, 0, NULL, NULL); -- skcipher_request_set_crypt(req, src, dst, nbytes, desc->info); -- -- return crypto_skcipher_decrypt(req); --} -- --static int fallback_blk_enc(struct blkcipher_desc *desc, -- struct scatterlist *dst, struct scatterlist *src, -- unsigned int nbytes) --{ -- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); -- SYNC_SKCIPHER_REQUEST_ON_STACK(req, op->fallback.blk); -- -- skcipher_request_set_sync_tfm(req, op->fallback.blk); -- skcipher_request_set_callback(req, 0, NULL, NULL); -- skcipher_request_set_crypt(req, src, dst, nbytes, desc->info); -- -- return crypto_skcipher_encrypt(req); --} -- - static void - geode_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) - { -- struct geode_aes_op *op = crypto_tfm_ctx(tfm); -+ const struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - -- if (unlikely(op->keylen != AES_KEYSIZE_128)) { -- crypto_cipher_encrypt_one(op->fallback.cip, out, in); -+ if (unlikely(tctx->keylen != AES_KEYSIZE_128)) { -+ crypto_cipher_encrypt_one(tctx->fallback.cip, out, in); - return; - } - -- op->src = (void *) in; -- op->dst = (void *) out; -- op->mode = AES_MODE_ECB; -- op->flags = 0; -- op->len = AES_BLOCK_SIZE; -- op->dir = AES_DIR_ENCRYPT; -- -- geode_aes_crypt(op); -+ geode_aes_crypt(tctx, in, out, AES_BLOCK_SIZE, NULL, -+ AES_MODE_ECB, AES_DIR_ENCRYPT); - } - - - static void - geode_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) - { -- struct geode_aes_op *op = crypto_tfm_ctx(tfm); -+ const struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - -- if (unlikely(op->keylen != AES_KEYSIZE_128)) { -- crypto_cipher_decrypt_one(op->fallback.cip, out, in); -+ if (unlikely(tctx->keylen != AES_KEYSIZE_128)) { -+ crypto_cipher_decrypt_one(tctx->fallback.cip, out, in); - return; - } - -- op->src = (void *) in; -- op->dst = (void *) out; -- op->mode = AES_MODE_ECB; -- op->flags = 0; -- op->len = AES_BLOCK_SIZE; -- op->dir = AES_DIR_DECRYPT; -- -- geode_aes_crypt(op); -+ geode_aes_crypt(tctx, in, out, AES_BLOCK_SIZE, NULL, -+ AES_MODE_ECB, AES_DIR_DECRYPT); - } - - static int fallback_init_cip(struct crypto_tfm *tfm) - { - const char *name = crypto_tfm_alg_name(tfm); -- struct geode_aes_op *op = crypto_tfm_ctx(tfm); -+ struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - -- op->fallback.cip = crypto_alloc_cipher(name, 0, -- CRYPTO_ALG_NEED_FALLBACK); -+ tctx->fallback.cip = crypto_alloc_cipher(name, 0, -+ CRYPTO_ALG_NEED_FALLBACK); - -- if (IS_ERR(op->fallback.cip)) { -+ if (IS_ERR(tctx->fallback.cip)) { - printk(KERN_ERR "Error allocating fallback algo %s\n", name); -- return PTR_ERR(op->fallback.cip); -+ return PTR_ERR(tctx->fallback.cip); - } - - return 0; -@@ -267,10 +222,9 @@ static int fallback_init_cip(struct crypto_tfm *tfm) - - static void fallback_exit_cip(struct crypto_tfm *tfm) - { -- struct geode_aes_op *op = crypto_tfm_ctx(tfm); -+ struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - -- crypto_free_cipher(op->fallback.cip); -- op->fallback.cip = NULL; -+ crypto_free_cipher(tctx->fallback.cip); - } - - static struct crypto_alg geode_alg = { -@@ -283,7 +237,7 @@ static struct crypto_alg geode_alg = { - .cra_init = fallback_init_cip, - .cra_exit = fallback_exit_cip, - .cra_blocksize = AES_BLOCK_SIZE, -- .cra_ctxsize = sizeof(struct geode_aes_op), -+ .cra_ctxsize = sizeof(struct geode_aes_tfm_ctx), - .cra_module = THIS_MODULE, - .cra_u = { - .cipher = { -@@ -296,220 +250,126 @@ static struct crypto_alg geode_alg = { - } - }; - --static int --geode_cbc_decrypt(struct blkcipher_desc *desc, -- struct scatterlist *dst, struct scatterlist *src, -- unsigned int nbytes) -+static int geode_init_skcipher(struct crypto_skcipher *tfm) - { -- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); -- struct blkcipher_walk walk; -- int err, ret; -- -- if (nbytes % AES_BLOCK_SIZE) -- return -EINVAL; -- -- if (unlikely(op->keylen != AES_KEYSIZE_128)) -- return fallback_blk_dec(desc, dst, src, nbytes); -+ const char *name = crypto_tfm_alg_name(&tfm->base); -+ struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm); - -- blkcipher_walk_init(&walk, dst, src, nbytes); -- err = blkcipher_walk_virt(desc, &walk); -- op->iv = walk.iv; -- -- while ((nbytes = walk.nbytes)) { -- op->src = walk.src.virt.addr, -- op->dst = walk.dst.virt.addr; -- op->mode = AES_MODE_CBC; -- op->len = nbytes - (nbytes % AES_BLOCK_SIZE); -- op->dir = AES_DIR_DECRYPT; -- -- ret = geode_aes_crypt(op); -- -- nbytes -= ret; -- err = blkcipher_walk_done(desc, &walk, nbytes); -+ tctx->fallback.skcipher = -+ crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK | -+ CRYPTO_ALG_ASYNC); -+ if (IS_ERR(tctx->fallback.skcipher)) { -+ printk(KERN_ERR "Error allocating fallback algo %s\n", name); -+ return PTR_ERR(tctx->fallback.skcipher); - } - -- return err; -+ crypto_skcipher_set_reqsize(tfm, sizeof(struct skcipher_request) + -+ crypto_skcipher_reqsize(tctx->fallback.skcipher)); -+ return 0; - } - --static int --geode_cbc_encrypt(struct blkcipher_desc *desc, -- struct scatterlist *dst, struct scatterlist *src, -- unsigned int nbytes) -+static void geode_exit_skcipher(struct crypto_skcipher *tfm) - { -- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); -- struct blkcipher_walk walk; -- int err, ret; -+ struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm); - -- if (nbytes % AES_BLOCK_SIZE) -- return -EINVAL; -- -- if (unlikely(op->keylen != AES_KEYSIZE_128)) -- return fallback_blk_enc(desc, dst, src, nbytes); -+ crypto_free_skcipher(tctx->fallback.skcipher); -+} - -- blkcipher_walk_init(&walk, dst, src, nbytes); -- err = blkcipher_walk_virt(desc, &walk); -- op->iv = walk.iv; -+static int geode_skcipher_crypt(struct skcipher_request *req, int mode, int dir) -+{ -+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); -+ const struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm); -+ struct skcipher_walk walk; -+ unsigned int nbytes; -+ int err; -+ -+ if (unlikely(tctx->keylen != AES_KEYSIZE_128)) { -+ struct skcipher_request *subreq = skcipher_request_ctx(req); -+ -+ *subreq = *req; -+ skcipher_request_set_tfm(subreq, tctx->fallback.skcipher); -+ if (dir == AES_DIR_DECRYPT) -+ return crypto_skcipher_decrypt(subreq); -+ else -+ return crypto_skcipher_encrypt(subreq); -+ } - -- while ((nbytes = walk.nbytes)) { -- op->src = walk.src.virt.addr, -- op->dst = walk.dst.virt.addr; -- op->mode = AES_MODE_CBC; -- op->len = nbytes - (nbytes % AES_BLOCK_SIZE); -- op->dir = AES_DIR_ENCRYPT; -+ err = skcipher_walk_virt(&walk, req, false); - -- ret = geode_aes_crypt(op); -- nbytes -= ret; -- err = blkcipher_walk_done(desc, &walk, nbytes); -+ while ((nbytes = walk.nbytes) != 0) { -+ geode_aes_crypt(tctx, walk.src.virt.addr, walk.dst.virt.addr, -+ round_down(nbytes, AES_BLOCK_SIZE), -+ walk.iv, mode, dir); -+ err = skcipher_walk_done(&walk, nbytes % AES_BLOCK_SIZE); - } - - return err; - } - --static int fallback_init_blk(struct crypto_tfm *tfm) -+static int geode_cbc_encrypt(struct skcipher_request *req) - { -- const char *name = crypto_tfm_alg_name(tfm); -- struct geode_aes_op *op = crypto_tfm_ctx(tfm); -- -- op->fallback.blk = crypto_alloc_sync_skcipher(name, 0, -- CRYPTO_ALG_NEED_FALLBACK); -- if (IS_ERR(op->fallback.blk)) { -- printk(KERN_ERR "Error allocating fallback algo %s\n", name); -- return PTR_ERR(op->fallback.blk); -- } -- -- return 0; -+ return geode_skcipher_crypt(req, AES_MODE_CBC, AES_DIR_ENCRYPT); - } - --static void fallback_exit_blk(struct crypto_tfm *tfm) -+static int geode_cbc_decrypt(struct skcipher_request *req) - { -- struct geode_aes_op *op = crypto_tfm_ctx(tfm); -- -- crypto_free_sync_skcipher(op->fallback.blk); -- op->fallback.blk = NULL; -+ return geode_skcipher_crypt(req, AES_MODE_CBC, AES_DIR_DECRYPT); - } - --static struct crypto_alg geode_cbc_alg = { -- .cra_name = "cbc(aes)", -- .cra_driver_name = "cbc-aes-geode", -- .cra_priority = 400, -- .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | -- CRYPTO_ALG_KERN_DRIVER_ONLY | -- CRYPTO_ALG_NEED_FALLBACK, -- .cra_init = fallback_init_blk, -- .cra_exit = fallback_exit_blk, -- .cra_blocksize = AES_BLOCK_SIZE, -- .cra_ctxsize = sizeof(struct geode_aes_op), -- .cra_alignmask = 15, -- .cra_type = &crypto_blkcipher_type, -- .cra_module = THIS_MODULE, -- .cra_u = { -- .blkcipher = { -- .min_keysize = AES_MIN_KEY_SIZE, -- .max_keysize = AES_MAX_KEY_SIZE, -- .setkey = geode_setkey_blk, -- .encrypt = geode_cbc_encrypt, -- .decrypt = geode_cbc_decrypt, -- .ivsize = AES_BLOCK_SIZE, -- } -- } --}; -- --static int --geode_ecb_decrypt(struct blkcipher_desc *desc, -- struct scatterlist *dst, struct scatterlist *src, -- unsigned int nbytes) -+static int geode_ecb_encrypt(struct skcipher_request *req) - { -- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); -- struct blkcipher_walk walk; -- int err, ret; -- -- if (nbytes % AES_BLOCK_SIZE) -- return -EINVAL; -- -- if (unlikely(op->keylen != AES_KEYSIZE_128)) -- return fallback_blk_dec(desc, dst, src, nbytes); -- -- blkcipher_walk_init(&walk, dst, src, nbytes); -- err = blkcipher_walk_virt(desc, &walk); -- -- while ((nbytes = walk.nbytes)) { -- op->src = walk.src.virt.addr, -- op->dst = walk.dst.virt.addr; -- op->mode = AES_MODE_ECB; -- op->len = nbytes - (nbytes % AES_BLOCK_SIZE); -- op->dir = AES_DIR_DECRYPT; -- -- ret = geode_aes_crypt(op); -- nbytes -= ret; -- err = blkcipher_walk_done(desc, &walk, nbytes); -- } -- -- return err; -+ return geode_skcipher_crypt(req, AES_MODE_ECB, AES_DIR_ENCRYPT); - } - --static int --geode_ecb_encrypt(struct blkcipher_desc *desc, -- struct scatterlist *dst, struct scatterlist *src, -- unsigned int nbytes) -+static int geode_ecb_decrypt(struct skcipher_request *req) - { -- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); -- struct blkcipher_walk walk; -- int err, ret; -- -- if (nbytes % AES_BLOCK_SIZE) -- return -EINVAL; -- -- if (unlikely(op->keylen != AES_KEYSIZE_128)) -- return fallback_blk_enc(desc, dst, src, nbytes); -- -- blkcipher_walk_init(&walk, dst, src, nbytes); -- err = blkcipher_walk_virt(desc, &walk); -- -- while ((nbytes = walk.nbytes)) { -- op->src = walk.src.virt.addr, -- op->dst = walk.dst.virt.addr; -- op->mode = AES_MODE_ECB; -- op->len = nbytes - (nbytes % AES_BLOCK_SIZE); -- op->dir = AES_DIR_ENCRYPT; -- -- ret = geode_aes_crypt(op); -- nbytes -= ret; -- ret = blkcipher_walk_done(desc, &walk, nbytes); -- } -- -- return err; -+ return geode_skcipher_crypt(req, AES_MODE_ECB, AES_DIR_DECRYPT); - } - --static struct crypto_alg geode_ecb_alg = { -- .cra_name = "ecb(aes)", -- .cra_driver_name = "ecb-aes-geode", -- .cra_priority = 400, -- .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | -- CRYPTO_ALG_KERN_DRIVER_ONLY | -- CRYPTO_ALG_NEED_FALLBACK, -- .cra_init = fallback_init_blk, -- .cra_exit = fallback_exit_blk, -- .cra_blocksize = AES_BLOCK_SIZE, -- .cra_ctxsize = sizeof(struct geode_aes_op), -- .cra_alignmask = 15, -- .cra_type = &crypto_blkcipher_type, -- .cra_module = THIS_MODULE, -- .cra_u = { -- .blkcipher = { -- .min_keysize = AES_MIN_KEY_SIZE, -- .max_keysize = AES_MAX_KEY_SIZE, -- .setkey = geode_setkey_blk, -- .encrypt = geode_ecb_encrypt, -- .decrypt = geode_ecb_decrypt, -- } -- } -+static struct skcipher_alg geode_skcipher_algs[] = { -+ { -+ .base.cra_name = "cbc(aes)", -+ .base.cra_driver_name = "cbc-aes-geode", -+ .base.cra_priority = 400, -+ .base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY | -+ CRYPTO_ALG_NEED_FALLBACK, -+ .base.cra_blocksize = AES_BLOCK_SIZE, -+ .base.cra_ctxsize = sizeof(struct geode_aes_tfm_ctx), -+ .base.cra_alignmask = 15, -+ .base.cra_module = THIS_MODULE, -+ .init = geode_init_skcipher, -+ .exit = geode_exit_skcipher, -+ .setkey = geode_setkey_skcipher, -+ .encrypt = geode_cbc_encrypt, -+ .decrypt = geode_cbc_decrypt, -+ .min_keysize = AES_MIN_KEY_SIZE, -+ .max_keysize = AES_MAX_KEY_SIZE, -+ .ivsize = AES_BLOCK_SIZE, -+ }, { -+ .base.cra_name = "ecb(aes)", -+ .base.cra_driver_name = "ecb-aes-geode", -+ .base.cra_priority = 400, -+ .base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY | -+ CRYPTO_ALG_NEED_FALLBACK, -+ .base.cra_blocksize = AES_BLOCK_SIZE, -+ .base.cra_ctxsize = sizeof(struct geode_aes_tfm_ctx), -+ .base.cra_alignmask = 15, -+ .base.cra_module = THIS_MODULE, -+ .init = geode_init_skcipher, -+ .exit = geode_exit_skcipher, -+ .setkey = geode_setkey_skcipher, -+ .encrypt = geode_ecb_encrypt, -+ .decrypt = geode_ecb_decrypt, -+ .min_keysize = AES_MIN_KEY_SIZE, -+ .max_keysize = AES_MAX_KEY_SIZE, -+ }, - }; - - static void geode_aes_remove(struct pci_dev *dev) - { - crypto_unregister_alg(&geode_alg); -- crypto_unregister_alg(&geode_ecb_alg); -- crypto_unregister_alg(&geode_cbc_alg); -+ crypto_unregister_skciphers(geode_skcipher_algs, -+ ARRAY_SIZE(geode_skcipher_algs)); - - pci_iounmap(dev, _iobase); - _iobase = NULL; -@@ -547,20 +407,14 @@ static int geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id) - if (ret) - goto eiomap; - -- ret = crypto_register_alg(&geode_ecb_alg); -+ ret = crypto_register_skciphers(geode_skcipher_algs, -+ ARRAY_SIZE(geode_skcipher_algs)); - if (ret) - goto ealg; - -- ret = crypto_register_alg(&geode_cbc_alg); -- if (ret) -- goto eecb; -- - dev_notice(&dev->dev, "GEODE AES engine enabled.\n"); - return 0; - -- eecb: -- crypto_unregister_alg(&geode_ecb_alg); -- - ealg: - crypto_unregister_alg(&geode_alg); - -diff --git a/drivers/crypto/geode-aes.h b/drivers/crypto/geode-aes.h -index f8a86898ac22..6d0a0cdc7647 100644 ---- a/drivers/crypto/geode-aes.h -+++ b/drivers/crypto/geode-aes.h -@@ -46,21 +46,10 @@ - - #define AES_OP_TIMEOUT 0x50000 - --struct geode_aes_op { -- -- void *src; -- void *dst; -- -- u32 mode; -- u32 dir; -- u32 flags; -- int len; -- -+struct geode_aes_tfm_ctx { - u8 key[AES_KEYSIZE_128]; -- u8 *iv; -- - union { -- struct crypto_sync_skcipher *blk; -+ struct crypto_skcipher *skcipher; - struct crypto_cipher *cip; - } fallback; - u32 keylen; -diff --git a/drivers/crypto/hisilicon/Kconfig b/drivers/crypto/hisilicon/Kconfig -index ebaf91e0146d..504daff7687d 100644 ---- a/drivers/crypto/hisilicon/Kconfig -+++ b/drivers/crypto/hisilicon/Kconfig -@@ -17,6 +17,7 @@ config CRYPTO_DEV_HISI_SEC - config CRYPTO_DEV_HISI_QM - tristate - depends on ARM64 && PCI && PCI_MSI -+ select NEED_SG_DMA_LENGTH - help - HiSilicon accelerator engines use a common queue management - interface. Specific engine driver may use this module. -diff --git a/drivers/crypto/virtio/virtio_crypto_algs.c b/drivers/crypto/virtio/virtio_crypto_algs.c -index 673fb29fda53..82b316b2f537 100644 ---- a/drivers/crypto/virtio/virtio_crypto_algs.c -+++ b/drivers/crypto/virtio/virtio_crypto_algs.c -@@ -435,6 +435,11 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req, - goto free; - } - memcpy(iv, req->info, ivsize); -+ if (!vc_sym_req->encrypt) -+ scatterwalk_map_and_copy(req->info, req->src, -+ req->nbytes - AES_BLOCK_SIZE, -+ AES_BLOCK_SIZE, 0); -+ - sg_init_one(&iv_sg, iv, ivsize); - sgs[num_out++] = &iv_sg; - vc_sym_req->iv = iv; -@@ -571,6 +576,10 @@ static void virtio_crypto_ablkcipher_finalize_req( - struct ablkcipher_request *req, - int err) - { -+ if (vc_sym_req->encrypt) -+ scatterwalk_map_and_copy(req->info, req->dst, -+ req->nbytes - AES_BLOCK_SIZE, -+ AES_BLOCK_SIZE, 0); - crypto_finalize_ablkcipher_request(vc_sym_req->base.dataq->engine, - req, err); - kzfree(vc_sym_req->iv); -diff --git a/drivers/devfreq/Kconfig b/drivers/devfreq/Kconfig -index defe1d438710..af4a3ccb96b3 100644 ---- a/drivers/devfreq/Kconfig -+++ b/drivers/devfreq/Kconfig -@@ -99,6 +99,7 @@ config ARM_TEGRA_DEVFREQ - ARCH_TEGRA_210_SOC || \ - COMPILE_TEST - select PM_OPP -+ depends on COMMON_CLK - help - This adds the DEVFREQ driver for the Tegra family of SoCs. - It reads ACTMON counters of memory controllers and adjusts the -diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c -index c90c798e5ec3..0585d749d935 100644 ---- a/drivers/dma/dw/platform.c -+++ b/drivers/dma/dw/platform.c -@@ -66,7 +66,7 @@ static int dw_probe(struct platform_device *pdev) - - data->chip = chip; - -- chip->clk = devm_clk_get(chip->dev, "hclk"); -+ chip->clk = devm_clk_get_optional(chip->dev, "hclk"); - if (IS_ERR(chip->clk)) - return PTR_ERR(chip->clk); - err = clk_prepare_enable(chip->clk); -diff --git a/drivers/dma/ioat/dma.c b/drivers/dma/ioat/dma.c -index 1a422a8b43cf..18c011e57592 100644 ---- a/drivers/dma/ioat/dma.c -+++ b/drivers/dma/ioat/dma.c -@@ -377,10 +377,11 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags) - - descs->virt = dma_alloc_coherent(to_dev(ioat_chan), - SZ_2M, &descs->hw, flags); -- if (!descs->virt && (i > 0)) { -+ if (!descs->virt) { - int idx; - - for (idx = 0; idx < i; idx++) { -+ descs = &ioat_chan->descs[idx]; - dma_free_coherent(to_dev(ioat_chan), SZ_2M, - descs->virt, descs->hw); - descs->virt = NULL; -diff --git a/drivers/dma/k3dma.c b/drivers/dma/k3dma.c -index 4b36c8810517..d05471653224 100644 ---- a/drivers/dma/k3dma.c -+++ b/drivers/dma/k3dma.c -@@ -229,9 +229,11 @@ static irqreturn_t k3_dma_int_handler(int irq, void *dev_id) - c = p->vchan; - if (c && (tc1 & BIT(i))) { - spin_lock_irqsave(&c->vc.lock, flags); -- vchan_cookie_complete(&p->ds_run->vd); -- p->ds_done = p->ds_run; -- p->ds_run = NULL; -+ if (p->ds_run != NULL) { -+ vchan_cookie_complete(&p->ds_run->vd); -+ p->ds_done = p->ds_run; -+ p->ds_run = NULL; -+ } - spin_unlock_irqrestore(&c->vc.lock, flags); - } - if (c && (tc2 & BIT(i))) { -@@ -271,6 +273,10 @@ static int k3_dma_start_txd(struct k3_dma_chan *c) - if (BIT(c->phy->idx) & k3_dma_get_chan_stat(d)) - return -EAGAIN; - -+ /* Avoid losing track of ds_run if a transaction is in flight */ -+ if (c->phy->ds_run) -+ return -EAGAIN; -+ - if (vd) { - struct k3_dma_desc_sw *ds = - container_of(vd, struct k3_dma_desc_sw, vd); -diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c -index a031cbcdf6ef..d72a3a5507b0 100644 ---- a/drivers/gpio/gpio-mpc8xxx.c -+++ b/drivers/gpio/gpio-mpc8xxx.c -@@ -346,6 +346,7 @@ static int mpc8xxx_probe(struct platform_device *pdev) - return -ENOMEM; - - gc = &mpc8xxx_gc->gc; -+ gc->parent = &pdev->dev; - - if (of_property_read_bool(np, "little-endian")) { - ret = bgpio_init(gc, &pdev->dev, 4, -diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c -index cd475ff4bcad..7835aad6d162 100644 ---- a/drivers/gpio/gpio-zynq.c -+++ b/drivers/gpio/gpio-zynq.c -@@ -681,6 +681,8 @@ static void zynq_gpio_restore_context(struct zynq_gpio *gpio) - unsigned int bank_num; - - for (bank_num = 0; bank_num < gpio->p_data->max_bank; bank_num++) { -+ writel_relaxed(ZYNQ_GPIO_IXR_DISABLE_ALL, gpio->base_addr + -+ ZYNQ_GPIO_INTDIS_OFFSET(bank_num)); - writel_relaxed(gpio->context.datalsw[bank_num], - gpio->base_addr + - ZYNQ_GPIO_DATA_LSW_OFFSET(bank_num)); -@@ -690,9 +692,6 @@ static void zynq_gpio_restore_context(struct zynq_gpio *gpio) - writel_relaxed(gpio->context.dirm[bank_num], - gpio->base_addr + - ZYNQ_GPIO_DIRM_OFFSET(bank_num)); -- writel_relaxed(gpio->context.int_en[bank_num], -- gpio->base_addr + -- ZYNQ_GPIO_INTEN_OFFSET(bank_num)); - writel_relaxed(gpio->context.int_type[bank_num], - gpio->base_addr + - ZYNQ_GPIO_INTTYPE_OFFSET(bank_num)); -@@ -702,6 +701,9 @@ static void zynq_gpio_restore_context(struct zynq_gpio *gpio) - writel_relaxed(gpio->context.int_any[bank_num], - gpio->base_addr + - ZYNQ_GPIO_INTANY_OFFSET(bank_num)); -+ writel_relaxed(~(gpio->context.int_en[bank_num]), -+ gpio->base_addr + -+ ZYNQ_GPIO_INTEN_OFFSET(bank_num)); - } - } - -diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c -index 99d19f80440e..3d9524a2abc4 100644 ---- a/drivers/gpio/gpiolib.c -+++ b/drivers/gpio/gpiolib.c -@@ -4328,8 +4328,9 @@ static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id, - - if (chip->ngpio <= p->chip_hwnum) { - dev_err(dev, -- "requested GPIO %d is out of range [0..%d] for chip %s\n", -- idx, chip->ngpio, chip->label); -+ "requested GPIO %u (%u) is out of range [0..%u] for chip %s\n", -+ idx, p->chip_hwnum, chip->ngpio - 1, -+ chip->label); - return ERR_PTR(-EINVAL); - } - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -index bd37df5dd6d0..d1e278e999ee 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -@@ -813,6 +813,7 @@ struct amdgpu_device { - uint8_t *bios; - uint32_t bios_size; - struct amdgpu_bo *stolen_vga_memory; -+ struct amdgpu_bo *discovery_memory; - uint32_t bios_scratch_reg_offset; - uint32_t bios_scratch[AMDGPU_BIOS_NUM_SCRATCH]; - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c -index 1481899f86c1..71198c5318e1 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c -@@ -136,7 +136,7 @@ static int amdgpu_discovery_read_binary(struct amdgpu_device *adev, uint8_t *bin - { - uint32_t *p = (uint32_t *)binary; - uint64_t vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20; -- uint64_t pos = vram_size - BINARY_MAX_SIZE; -+ uint64_t pos = vram_size - DISCOVERY_TMR_SIZE; - unsigned long flags; - - while (pos < vram_size) { -@@ -179,7 +179,7 @@ int amdgpu_discovery_init(struct amdgpu_device *adev) - uint16_t checksum; - int r; - -- adev->discovery = kzalloc(BINARY_MAX_SIZE, GFP_KERNEL); -+ adev->discovery = kzalloc(DISCOVERY_TMR_SIZE, GFP_KERNEL); - if (!adev->discovery) - return -ENOMEM; - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h -index 85b8c4d4d576..5a6693d7d269 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h -@@ -24,6 +24,8 @@ - #ifndef __AMDGPU_DISCOVERY__ - #define __AMDGPU_DISCOVERY__ - -+#define DISCOVERY_TMR_SIZE (64 << 10) -+ - int amdgpu_discovery_init(struct amdgpu_device *adev); - void amdgpu_discovery_fini(struct amdgpu_device *adev); - int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev); -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c -index 7289e1b4fb60..28361a9c5add 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c -@@ -342,6 +342,67 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev, - return 0; - } - -+/** -+ * amdgpu_bo_create_kernel_at - create BO for kernel use at specific location -+ * -+ * @adev: amdgpu device object -+ * @offset: offset of the BO -+ * @size: size of the BO -+ * @domain: where to place it -+ * @bo_ptr: used to initialize BOs in structures -+ * @cpu_addr: optional CPU address mapping -+ * -+ * Creates a kernel BO at a specific offset in the address space of the domain. -+ * -+ * Returns: -+ * 0 on success, negative error code otherwise. -+ */ -+int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev, -+ uint64_t offset, uint64_t size, uint32_t domain, -+ struct amdgpu_bo **bo_ptr, void **cpu_addr) -+{ -+ struct ttm_operation_ctx ctx = { false, false }; -+ unsigned int i; -+ int r; -+ -+ offset &= PAGE_MASK; -+ size = ALIGN(size, PAGE_SIZE); -+ -+ r = amdgpu_bo_create_reserved(adev, size, PAGE_SIZE, domain, bo_ptr, -+ NULL, NULL); -+ if (r) -+ return r; -+ -+ /* -+ * Remove the original mem node and create a new one at the request -+ * position. -+ */ -+ for (i = 0; i < (*bo_ptr)->placement.num_placement; ++i) { -+ (*bo_ptr)->placements[i].fpfn = offset >> PAGE_SHIFT; -+ (*bo_ptr)->placements[i].lpfn = (offset + size) >> PAGE_SHIFT; -+ } -+ -+ ttm_bo_mem_put(&(*bo_ptr)->tbo, &(*bo_ptr)->tbo.mem); -+ r = ttm_bo_mem_space(&(*bo_ptr)->tbo, &(*bo_ptr)->placement, -+ &(*bo_ptr)->tbo.mem, &ctx); -+ if (r) -+ goto error; -+ -+ if (cpu_addr) { -+ r = amdgpu_bo_kmap(*bo_ptr, cpu_addr); -+ if (r) -+ goto error; -+ } -+ -+ amdgpu_bo_unreserve(*bo_ptr); -+ return 0; -+ -+error: -+ amdgpu_bo_unreserve(*bo_ptr); -+ amdgpu_bo_unref(bo_ptr); -+ return r; -+} -+ - /** - * amdgpu_bo_free_kernel - free BO for kernel use - * -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h -index 658f4c9779b7..4fcea23ee516 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h -@@ -237,6 +237,9 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev, - unsigned long size, int align, - u32 domain, struct amdgpu_bo **bo_ptr, - u64 *gpu_addr, void **cpu_addr); -+int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev, -+ uint64_t offset, uint64_t size, uint32_t domain, -+ struct amdgpu_bo **bo_ptr, void **cpu_addr); - void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, - void **cpu_addr); - int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c -index 016ea274b955..9c5cbc47edf1 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c -@@ -65,12 +65,6 @@ const char *ras_block_string[] = { - /* inject address is 52 bits */ - #define RAS_UMC_INJECT_ADDR_LIMIT (0x1ULL << 52) - --static int amdgpu_ras_reserve_vram(struct amdgpu_device *adev, -- uint64_t offset, uint64_t size, -- struct amdgpu_bo **bo_ptr); --static int amdgpu_ras_release_vram(struct amdgpu_device *adev, -- struct amdgpu_bo **bo_ptr); -- - static ssize_t amdgpu_ras_debugfs_read(struct file *f, char __user *buf, - size_t size, loff_t *pos) - { -@@ -1214,75 +1208,6 @@ static void amdgpu_ras_do_recovery(struct work_struct *work) - atomic_set(&ras->in_recovery, 0); - } - --static int amdgpu_ras_release_vram(struct amdgpu_device *adev, -- struct amdgpu_bo **bo_ptr) --{ -- /* no need to free it actually. */ -- amdgpu_bo_free_kernel(bo_ptr, NULL, NULL); -- return 0; --} -- --/* reserve vram with size@offset */ --static int amdgpu_ras_reserve_vram(struct amdgpu_device *adev, -- uint64_t offset, uint64_t size, -- struct amdgpu_bo **bo_ptr) --{ -- struct ttm_operation_ctx ctx = { false, false }; -- struct amdgpu_bo_param bp; -- int r = 0; -- int i; -- struct amdgpu_bo *bo; -- -- if (bo_ptr) -- *bo_ptr = NULL; -- memset(&bp, 0, sizeof(bp)); -- bp.size = size; -- bp.byte_align = PAGE_SIZE; -- bp.domain = AMDGPU_GEM_DOMAIN_VRAM; -- bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS | -- AMDGPU_GEM_CREATE_NO_CPU_ACCESS; -- bp.type = ttm_bo_type_kernel; -- bp.resv = NULL; -- -- r = amdgpu_bo_create(adev, &bp, &bo); -- if (r) -- return -EINVAL; -- -- r = amdgpu_bo_reserve(bo, false); -- if (r) -- goto error_reserve; -- -- offset = ALIGN(offset, PAGE_SIZE); -- for (i = 0; i < bo->placement.num_placement; ++i) { -- bo->placements[i].fpfn = offset >> PAGE_SHIFT; -- bo->placements[i].lpfn = (offset + size) >> PAGE_SHIFT; -- } -- -- ttm_bo_mem_put(&bo->tbo, &bo->tbo.mem); -- r = ttm_bo_mem_space(&bo->tbo, &bo->placement, &bo->tbo.mem, &ctx); -- if (r) -- goto error_pin; -- -- r = amdgpu_bo_pin_restricted(bo, -- AMDGPU_GEM_DOMAIN_VRAM, -- offset, -- offset + size); -- if (r) -- goto error_pin; -- -- if (bo_ptr) -- *bo_ptr = bo; -- -- amdgpu_bo_unreserve(bo); -- return r; -- --error_pin: -- amdgpu_bo_unreserve(bo); --error_reserve: -- amdgpu_bo_unref(&bo); -- return r; --} -- - /* alloc/realloc bps array */ - static int amdgpu_ras_realloc_eh_data_space(struct amdgpu_device *adev, - struct ras_err_handler_data *data, int pages) -@@ -1345,7 +1270,7 @@ int amdgpu_ras_reserve_bad_pages(struct amdgpu_device *adev) - struct amdgpu_ras *con = amdgpu_ras_get_context(adev); - struct ras_err_handler_data *data; - uint64_t bp; -- struct amdgpu_bo *bo; -+ struct amdgpu_bo *bo = NULL; - int i; - - if (!con || !con->eh_data) -@@ -1359,12 +1284,14 @@ int amdgpu_ras_reserve_bad_pages(struct amdgpu_device *adev) - for (i = data->last_reserved; i < data->count; i++) { - bp = data->bps[i].bp; - -- if (amdgpu_ras_reserve_vram(adev, bp << PAGE_SHIFT, -- PAGE_SIZE, &bo)) -+ if (amdgpu_bo_create_kernel_at(adev, bp << PAGE_SHIFT, PAGE_SIZE, -+ AMDGPU_GEM_DOMAIN_VRAM, -+ &bo, NULL)) - DRM_ERROR("RAS ERROR: reserve vram %llx fail\n", bp); - - data->bps[i].bo = bo; - data->last_reserved = i + 1; -+ bo = NULL; - } - out: - mutex_unlock(&con->recovery_lock); -@@ -1390,7 +1317,7 @@ static int amdgpu_ras_release_bad_pages(struct amdgpu_device *adev) - for (i = data->last_reserved - 1; i >= 0; i--) { - bo = data->bps[i].bo; - -- amdgpu_ras_release_vram(adev, &bo); -+ amdgpu_bo_free_kernel(&bo, NULL, NULL); - - data->bps[i].bo = bo; - data->last_reserved = i; -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c -index c0e41f1f0c23..f15ded1ce905 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c -@@ -1639,81 +1639,25 @@ static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev) - */ - static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev) - { -- struct ttm_operation_ctx ctx = { false, false }; -- struct amdgpu_bo_param bp; -- int r = 0; -- int i; -- u64 vram_size = adev->gmc.visible_vram_size; -- u64 offset = adev->fw_vram_usage.start_offset; -- u64 size = adev->fw_vram_usage.size; -- struct amdgpu_bo *bo; -- -- memset(&bp, 0, sizeof(bp)); -- bp.size = adev->fw_vram_usage.size; -- bp.byte_align = PAGE_SIZE; -- bp.domain = AMDGPU_GEM_DOMAIN_VRAM; -- bp.flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | -- AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; -- bp.type = ttm_bo_type_kernel; -- bp.resv = NULL; -+ uint64_t vram_size = adev->gmc.visible_vram_size; -+ int r; -+ - adev->fw_vram_usage.va = NULL; - adev->fw_vram_usage.reserved_bo = NULL; - -- if (adev->fw_vram_usage.size > 0 && -- adev->fw_vram_usage.size <= vram_size) { -- -- r = amdgpu_bo_create(adev, &bp, -- &adev->fw_vram_usage.reserved_bo); -- if (r) -- goto error_create; -- -- r = amdgpu_bo_reserve(adev->fw_vram_usage.reserved_bo, false); -- if (r) -- goto error_reserve; -- -- /* remove the original mem node and create a new one at the -- * request position -- */ -- bo = adev->fw_vram_usage.reserved_bo; -- offset = ALIGN(offset, PAGE_SIZE); -- for (i = 0; i < bo->placement.num_placement; ++i) { -- bo->placements[i].fpfn = offset >> PAGE_SHIFT; -- bo->placements[i].lpfn = (offset + size) >> PAGE_SHIFT; -- } -- -- ttm_bo_mem_put(&bo->tbo, &bo->tbo.mem); -- r = ttm_bo_mem_space(&bo->tbo, &bo->placement, -- &bo->tbo.mem, &ctx); -- if (r) -- goto error_pin; -- -- r = amdgpu_bo_pin_restricted(adev->fw_vram_usage.reserved_bo, -- AMDGPU_GEM_DOMAIN_VRAM, -- adev->fw_vram_usage.start_offset, -- (adev->fw_vram_usage.start_offset + -- adev->fw_vram_usage.size)); -- if (r) -- goto error_pin; -- r = amdgpu_bo_kmap(adev->fw_vram_usage.reserved_bo, -- &adev->fw_vram_usage.va); -- if (r) -- goto error_kmap; -- -- amdgpu_bo_unreserve(adev->fw_vram_usage.reserved_bo); -- } -- return r; -+ if (adev->fw_vram_usage.size == 0 || -+ adev->fw_vram_usage.size > vram_size) -+ return 0; - --error_kmap: -- amdgpu_bo_unpin(adev->fw_vram_usage.reserved_bo); --error_pin: -- amdgpu_bo_unreserve(adev->fw_vram_usage.reserved_bo); --error_reserve: -- amdgpu_bo_unref(&adev->fw_vram_usage.reserved_bo); --error_create: -- adev->fw_vram_usage.va = NULL; -- adev->fw_vram_usage.reserved_bo = NULL; -+ return amdgpu_bo_create_kernel_at(adev, -+ adev->fw_vram_usage.start_offset, -+ adev->fw_vram_usage.size, -+ AMDGPU_GEM_DOMAIN_VRAM, -+ &adev->fw_vram_usage.reserved_bo, -+ &adev->fw_vram_usage.va); - return r; - } -+ - /** - * amdgpu_ttm_init - Init the memory management (ttm) as well as various - * gtt/vram related fields. -@@ -1786,6 +1730,20 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) - NULL, &stolen_vga_buf); - if (r) - return r; -+ -+ /* -+ * reserve one TMR (64K) memory at the top of VRAM which holds -+ * IP Discovery data and is protected by PSP. -+ */ -+ r = amdgpu_bo_create_kernel_at(adev, -+ adev->gmc.real_vram_size - DISCOVERY_TMR_SIZE, -+ DISCOVERY_TMR_SIZE, -+ AMDGPU_GEM_DOMAIN_VRAM, -+ &adev->discovery_memory, -+ NULL); -+ if (r) -+ return r; -+ - DRM_INFO("amdgpu: %uM of VRAM memory ready\n", - (unsigned) (adev->gmc.real_vram_size / (1024 * 1024))); - -@@ -1850,6 +1808,9 @@ void amdgpu_ttm_late_init(struct amdgpu_device *adev) - void *stolen_vga_buf; - /* return the VGA stolen memory (if any) back to VRAM */ - amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, &stolen_vga_buf); -+ -+ /* return the IP Discovery TMR memory back to VRAM */ -+ amdgpu_bo_free_kernel(&adev->discovery_memory, NULL, NULL); - } - - /** -diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c -index c9ba2ec6d038..ab4a0d8545dc 100644 ---- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c -+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c -@@ -1038,17 +1038,10 @@ static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev) - case CHIP_VEGA20: - break; - case CHIP_RAVEN: -- /* Disable GFXOFF on original raven. There are combinations -- * of sbios and platforms that are not stable. -- */ -- if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8)) -- adev->pm.pp_feature &= ~PP_GFXOFF_MASK; -- else if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) -- &&((adev->gfx.rlc_fw_version != 106 && -- adev->gfx.rlc_fw_version < 531) || -- (adev->gfx.rlc_fw_version == 53815) || -- (adev->gfx.rlc_feature_version < 1) || -- !adev->gfx.rlc.is_rlc_v2_1)) -+ if (!(adev->rev_id >= 0x8 || -+ adev->pdev->device == 0x15d8) && -+ (adev->pm.fw_version < 0x41e2b || /* not raven1 fresh */ -+ !adev->gfx.rlc.is_rlc_v2_1)) /* without rlc save restore ucodes */ - adev->pm.pp_feature &= ~PP_GFXOFF_MASK; - - if (adev->pm.pp_feature & PP_GFXOFF_MASK) -diff --git a/drivers/gpu/drm/amd/include/discovery.h b/drivers/gpu/drm/amd/include/discovery.h -index 5dcb776548d8..7ec4331e67f2 100644 ---- a/drivers/gpu/drm/amd/include/discovery.h -+++ b/drivers/gpu/drm/amd/include/discovery.h -@@ -25,7 +25,6 @@ - #define _DISCOVERY_H_ - - #define PSP_HEADER_SIZE 256 --#define BINARY_MAX_SIZE (64 << 10) - #define BINARY_SIGNATURE 0x28211407 - #define DISCOVERY_TABLE_SIGNATURE 0x53445049 - -diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c -index 875a3a9eabfa..7d0e7b031e44 100644 ---- a/drivers/gpu/drm/arm/malidp_mw.c -+++ b/drivers/gpu/drm/arm/malidp_mw.c -@@ -56,7 +56,7 @@ malidp_mw_connector_mode_valid(struct drm_connector *connector, - return MODE_OK; - } - --const struct drm_connector_helper_funcs malidp_mw_connector_helper_funcs = { -+static const struct drm_connector_helper_funcs malidp_mw_connector_helper_funcs = { - .get_modes = malidp_mw_connector_get_modes, - .mode_valid = malidp_mw_connector_mode_valid, - }; -diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c -index 6fb7d74ff553..bc7cc32140f8 100644 ---- a/drivers/gpu/drm/tegra/drm.c -+++ b/drivers/gpu/drm/tegra/drm.c -@@ -201,19 +201,19 @@ hub: - if (tegra->hub) - tegra_display_hub_cleanup(tegra->hub); - device: -- host1x_device_exit(device); --fbdev: -- drm_kms_helper_poll_fini(drm); -- tegra_drm_fb_free(drm); --config: -- drm_mode_config_cleanup(drm); -- - if (tegra->domain) { - mutex_destroy(&tegra->mm_lock); - drm_mm_takedown(&tegra->mm); - put_iova_domain(&tegra->carveout.domain); - iova_cache_put(); - } -+ -+ host1x_device_exit(device); -+fbdev: -+ drm_kms_helper_poll_fini(drm); -+ tegra_drm_fb_free(drm); -+config: -+ drm_mode_config_cleanup(drm); - domain: - if (tegra->domain) - iommu_domain_free(tegra->domain); -diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c -index a662394f6892..0a88ef11b9d3 100644 ---- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c -+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c -@@ -463,29 +463,25 @@ out: - } - - static int virtio_gpu_wait_ioctl(struct drm_device *dev, void *data, -- struct drm_file *file) -+ struct drm_file *file) - { - struct drm_virtgpu_3d_wait *args = data; -- struct drm_gem_object *obj; -- long timeout = 15 * HZ; -+ struct drm_gem_object *gobj = NULL; -+ struct virtio_gpu_object *qobj = NULL; - int ret; -+ bool nowait = false; - -- obj = drm_gem_object_lookup(file, args->handle); -- if (obj == NULL) -+ gobj = drm_gem_object_lookup(file, args->handle); -+ if (gobj == NULL) - return -ENOENT; - -- if (args->flags & VIRTGPU_WAIT_NOWAIT) { -- ret = dma_resv_test_signaled_rcu(obj->resv, true); -- } else { -- ret = dma_resv_wait_timeout_rcu(obj->resv, true, true, -- timeout); -- } -- if (ret == 0) -- ret = -EBUSY; -- else if (ret > 0) -- ret = 0; -+ qobj = gem_to_virtio_gpu_obj(gobj); - -- drm_gem_object_put_unlocked(obj); -+ if (args->flags & VIRTGPU_WAIT_NOWAIT) -+ nowait = true; -+ ret = virtio_gpu_object_wait(qobj, nowait); -+ -+ drm_gem_object_put_unlocked(gobj); - return ret; - } - -diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c -index c25e95c19cad..b382c6bf2c5c 100644 ---- a/drivers/hid/hidraw.c -+++ b/drivers/hid/hidraw.c -@@ -249,13 +249,14 @@ out: - static __poll_t hidraw_poll(struct file *file, poll_table *wait) - { - struct hidraw_list *list = file->private_data; -+ __poll_t mask = EPOLLOUT | EPOLLWRNORM; /* hidraw is always writable */ - - poll_wait(file, &list->hidraw->wait, wait); - if (list->head != list->tail) -- return EPOLLIN | EPOLLRDNORM; -+ mask |= EPOLLIN | EPOLLRDNORM; - if (!list->hidraw->exist) -- return EPOLLERR | EPOLLHUP; -- return EPOLLOUT | EPOLLWRNORM; -+ mask |= EPOLLERR | EPOLLHUP; -+ return mask; - } - - static int hidraw_open(struct inode *inode, struct file *file) -diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c -index 935c3d0a3b63..8fe3efcb8327 100644 ---- a/drivers/hid/uhid.c -+++ b/drivers/hid/uhid.c -@@ -766,13 +766,14 @@ unlock: - static __poll_t uhid_char_poll(struct file *file, poll_table *wait) - { - struct uhid_device *uhid = file->private_data; -+ __poll_t mask = EPOLLOUT | EPOLLWRNORM; /* uhid is always writable */ - - poll_wait(file, &uhid->waitq, wait); - - if (uhid->head != uhid->tail) -- return EPOLLIN | EPOLLRDNORM; -+ mask |= EPOLLIN | EPOLLRDNORM; - -- return EPOLLOUT | EPOLLWRNORM; -+ return mask; - } - - static const struct file_operations uhid_fops = { -diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index e01b2b57e724..5ab901ad615d 100644 ---- a/drivers/i2c/busses/i2c-bcm2835.c -+++ b/drivers/i2c/busses/i2c-bcm2835.c -@@ -58,6 +58,7 @@ struct bcm2835_i2c_dev { - struct i2c_adapter adapter; - struct completion completion; - struct i2c_msg *curr_msg; -+ struct clk *bus_clk; - int num_msgs; - u32 msg_err; - u8 *msg_buf; -@@ -404,7 +405,6 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) - struct resource *mem, *irq; - int ret; - struct i2c_adapter *adap; -- struct clk *bus_clk; - struct clk *mclk; - u32 bus_clk_rate; - -@@ -427,11 +427,11 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) - return PTR_ERR(mclk); - } - -- bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev); -+ i2c_dev->bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev); - -- if (IS_ERR(bus_clk)) { -+ if (IS_ERR(i2c_dev->bus_clk)) { - dev_err(&pdev->dev, "Could not register clock\n"); -- return PTR_ERR(bus_clk); -+ return PTR_ERR(i2c_dev->bus_clk); - } - - ret = of_property_read_u32(pdev->dev.of_node, "clock-frequency", -@@ -442,13 +442,13 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) - bus_clk_rate = 100000; - } - -- ret = clk_set_rate_exclusive(bus_clk, bus_clk_rate); -+ ret = clk_set_rate_exclusive(i2c_dev->bus_clk, bus_clk_rate); - if (ret < 0) { - dev_err(&pdev->dev, "Could not set clock frequency\n"); - return ret; - } - -- ret = clk_prepare_enable(bus_clk); -+ ret = clk_prepare_enable(i2c_dev->bus_clk); - if (ret) { - dev_err(&pdev->dev, "Couldn't prepare clock"); - return ret; -@@ -491,10 +491,9 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) - static int bcm2835_i2c_remove(struct platform_device *pdev) - { - struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev); -- struct clk *bus_clk = devm_clk_get(i2c_dev->dev, "div"); - -- clk_rate_exclusive_put(bus_clk); -- clk_disable_unprepare(bus_clk); -+ clk_rate_exclusive_put(i2c_dev->bus_clk); -+ clk_disable_unprepare(i2c_dev->bus_clk); - - free_irq(i2c_dev->irq, i2c_dev); - i2c_del_adapter(&i2c_dev->adapter); -diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c -index 7b966a41d623..cf7b59d97802 100644 ---- a/drivers/iio/imu/adis16480.c -+++ b/drivers/iio/imu/adis16480.c -@@ -454,12 +454,14 @@ static int adis16480_get_calibbias(struct iio_dev *indio_dev, - case IIO_MAGN: - case IIO_PRESSURE: - ret = adis_read_reg_16(&st->adis, reg, &val16); -- *bias = sign_extend32(val16, 15); -+ if (ret == 0) -+ *bias = sign_extend32(val16, 15); - break; - case IIO_ANGL_VEL: - case IIO_ACCEL: - ret = adis_read_reg_32(&st->adis, reg, &val32); -- *bias = sign_extend32(val32, 31); -+ if (ret == 0) -+ *bias = sign_extend32(val32, 31); - break; - default: - ret = -EINVAL; -diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c -index 28e011b35f21..3e0528793d95 100644 ---- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c -+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c -@@ -152,9 +152,10 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { - .addr = 0x10, - .mask = GENMASK(4, 3), - }, -- .fs_avl[0] = { IIO_DEGREE_TO_RAD(245), 0x0 }, -- .fs_avl[1] = { IIO_DEGREE_TO_RAD(500), 0x1 }, -- .fs_avl[2] = { IIO_DEGREE_TO_RAD(2000), 0x3 }, -+ -+ .fs_avl[0] = { IIO_DEGREE_TO_RAD(8750), 0x0 }, -+ .fs_avl[1] = { IIO_DEGREE_TO_RAD(17500), 0x1 }, -+ .fs_avl[2] = { IIO_DEGREE_TO_RAD(70000), 0x3 }, - .fs_len = 3, - }, - }, -diff --git a/drivers/infiniband/core/counters.c b/drivers/infiniband/core/counters.c -index 023478107f0e..46dd50ff7c85 100644 ---- a/drivers/infiniband/core/counters.c -+++ b/drivers/infiniband/core/counters.c -@@ -466,10 +466,15 @@ static struct rdma_counter *rdma_get_counter_by_id(struct ib_device *dev, - int rdma_counter_bind_qpn(struct ib_device *dev, u8 port, - u32 qp_num, u32 counter_id) - { -+ struct rdma_port_counter *port_counter; - struct rdma_counter *counter; - struct ib_qp *qp; - int ret; - -+ port_counter = &dev->port_data[port].port_counter; -+ if (port_counter->mode.mode == RDMA_COUNTER_MODE_AUTO) -+ return -EINVAL; -+ - qp = rdma_counter_get_qp(dev, qp_num); - if (!qp) - return -ENOENT; -@@ -506,6 +511,7 @@ err: - int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u8 port, - u32 qp_num, u32 *counter_id) - { -+ struct rdma_port_counter *port_counter; - struct rdma_counter *counter; - struct ib_qp *qp; - int ret; -@@ -513,9 +519,13 @@ int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u8 port, - if (!rdma_is_port_valid(dev, port)) - return -EINVAL; - -- if (!dev->port_data[port].port_counter.hstats) -+ port_counter = &dev->port_data[port].port_counter; -+ if (!port_counter->hstats) - return -EOPNOTSUPP; - -+ if (port_counter->mode.mode == RDMA_COUNTER_MODE_AUTO) -+ return -EINVAL; -+ - qp = rdma_counter_get_qp(dev, qp_num); - if (!qp) - return -ENOENT; -diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c -index b4149dc9e824..ebc3e3d4a6e2 100644 ---- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c -+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c -@@ -3323,8 +3323,10 @@ int bnxt_re_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) - int rc; - - rc = bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr); -- if (rc) -+ if (rc) { - dev_err(rdev_to_dev(rdev), "Dereg MR failed: %#x\n", rc); -+ return rc; -+ } - - if (mr->pages) { - rc = bnxt_qplib_free_fast_reg_page_list(&rdev->qplib_res, -diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c -index 958c1ff9c515..4d07d22bfa7b 100644 ---- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c -+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c -@@ -2283,13 +2283,13 @@ static int bnxt_qplib_cq_process_req(struct bnxt_qplib_cq *cq, - /* Add qp to flush list of the CQ */ - bnxt_qplib_add_flush_qp(qp); - } else { -+ /* Before we complete, do WA 9060 */ -+ if (do_wa9060(qp, cq, cq_cons, sw_sq_cons, -+ cqe_sq_cons)) { -+ *lib_qp = qp; -+ goto out; -+ } - if (swq->flags & SQ_SEND_FLAGS_SIGNAL_COMP) { -- /* Before we complete, do WA 9060 */ -- if (do_wa9060(qp, cq, cq_cons, sw_sq_cons, -- cqe_sq_cons)) { -- *lib_qp = qp; -- goto out; -- } - cqe->status = CQ_REQ_STATUS_OK; - cqe++; - (*budget)--; -diff --git a/drivers/infiniband/hw/hfi1/iowait.c b/drivers/infiniband/hw/hfi1/iowait.c -index adb4a1ba921b..5836fe7b2817 100644 ---- a/drivers/infiniband/hw/hfi1/iowait.c -+++ b/drivers/infiniband/hw/hfi1/iowait.c -@@ -81,7 +81,9 @@ void iowait_init(struct iowait *wait, u32 tx_limit, - void iowait_cancel_work(struct iowait *w) - { - cancel_work_sync(&iowait_get_ib_work(w)->iowork); -- cancel_work_sync(&iowait_get_tid_work(w)->iowork); -+ /* Make sure that the iowork for TID RDMA is used */ -+ if (iowait_get_tid_work(w)->iowork.func) -+ cancel_work_sync(&iowait_get_tid_work(w)->iowork); - } - - /** -diff --git a/drivers/infiniband/hw/hns/Kconfig b/drivers/infiniband/hw/hns/Kconfig -index d602b698b57e..4921c1e40ccd 100644 ---- a/drivers/infiniband/hw/hns/Kconfig -+++ b/drivers/infiniband/hw/hns/Kconfig -@@ -1,23 +1,34 @@ - # SPDX-License-Identifier: GPL-2.0-only - config INFINIBAND_HNS -- bool "HNS RoCE Driver" -+ tristate "HNS RoCE Driver" - depends on NET_VENDOR_HISILICON - depends on ARM64 || (COMPILE_TEST && 64BIT) -+ depends on (HNS_DSAF && HNS_ENET) || HNS3 - ---help--- - This is a RoCE/RDMA driver for the Hisilicon RoCE engine. The engine - is used in Hisilicon Hip06 and more further ICT SoC based on - platform device. - -+ To compile HIP06 or HIP08 driver as module, choose M here. -+ - config INFINIBAND_HNS_HIP06 -- tristate "Hisilicon Hip06 Family RoCE support" -+ bool "Hisilicon Hip06 Family RoCE support" - depends on INFINIBAND_HNS && HNS && HNS_DSAF && HNS_ENET -+ depends on INFINIBAND_HNS=m || (HNS_DSAF=y && HNS_ENET=y) - ---help--- - RoCE driver support for Hisilicon RoCE engine in Hisilicon Hip06 and - Hip07 SoC. These RoCE engines are platform devices. - -+ To compile this driver, choose Y here: if INFINIBAND_HNS is m, this -+ module will be called hns-roce-hw-v1 -+ - config INFINIBAND_HNS_HIP08 -- tristate "Hisilicon Hip08 Family RoCE support" -+ bool "Hisilicon Hip08 Family RoCE support" - depends on INFINIBAND_HNS && PCI && HNS3 -+ depends on INFINIBAND_HNS=m || HNS3=y - ---help--- - RoCE driver support for Hisilicon RoCE engine in Hisilicon Hip08 SoC. - The RoCE engine is a PCI device. -+ -+ To compile this driver, choose Y here: if INFINIBAND_HNS is m, this -+ module will be called hns-roce-hw-v2. -diff --git a/drivers/infiniband/hw/hns/Makefile b/drivers/infiniband/hw/hns/Makefile -index 449a2d81319d..e105945b94a1 100644 ---- a/drivers/infiniband/hw/hns/Makefile -+++ b/drivers/infiniband/hw/hns/Makefile -@@ -9,8 +9,12 @@ hns-roce-objs := hns_roce_main.o hns_roce_cmd.o hns_roce_pd.o \ - hns_roce_ah.o hns_roce_hem.o hns_roce_mr.o hns_roce_qp.o \ - hns_roce_cq.o hns_roce_alloc.o hns_roce_db.o hns_roce_srq.o hns_roce_restrack.o - -+ifdef CONFIG_INFINIBAND_HNS_HIP06 - hns-roce-hw-v1-objs := hns_roce_hw_v1.o $(hns-roce-objs) --obj-$(CONFIG_INFINIBAND_HNS_HIP06) += hns-roce-hw-v1.o -+obj-$(CONFIG_INFINIBAND_HNS) += hns-roce-hw-v1.o -+endif - -+ifdef CONFIG_INFINIBAND_HNS_HIP08 - hns-roce-hw-v2-objs := hns_roce_hw_v2.o hns_roce_hw_v2_dfx.o $(hns-roce-objs) --obj-$(CONFIG_INFINIBAND_HNS_HIP08) += hns-roce-hw-v2.o -+obj-$(CONFIG_INFINIBAND_HNS) += hns-roce-hw-v2.o -+endif -diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c -index e82567fcdeb7..79294f278b26 100644 ---- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c -+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c -@@ -389,7 +389,7 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, - roce_set_field(ud_sq_wqe->byte_36, - V2_UD_SEND_WQE_BYTE_36_VLAN_M, - V2_UD_SEND_WQE_BYTE_36_VLAN_S, -- le16_to_cpu(ah->av.vlan)); -+ ah->av.vlan); - roce_set_field(ud_sq_wqe->byte_36, - V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_M, - V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_S, -@@ -4650,16 +4650,14 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev, - { - struct hns_roce_cq *send_cq, *recv_cq; - struct ib_device *ibdev = &hr_dev->ib_dev; -- int ret; -+ int ret = 0; - - if (hr_qp->ibqp.qp_type == IB_QPT_RC && hr_qp->state != IB_QPS_RESET) { - /* Modify qp to reset before destroying qp */ - ret = hns_roce_v2_modify_qp(&hr_qp->ibqp, NULL, 0, - hr_qp->state, IB_QPS_RESET); -- if (ret) { -+ if (ret) - ibdev_err(ibdev, "modify QP to Reset failed.\n"); -- return ret; -- } - } - - send_cq = to_hr_cq(hr_qp->ibqp.send_cq); -@@ -4715,7 +4713,7 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev, - kfree(hr_qp->rq_inl_buf.wqe_list); - } - -- return 0; -+ return ret; - } - - static int hns_roce_v2_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) -@@ -4725,11 +4723,9 @@ static int hns_roce_v2_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) - int ret; - - ret = hns_roce_v2_destroy_qp_common(hr_dev, hr_qp, udata); -- if (ret) { -+ if (ret) - ibdev_err(&hr_dev->ib_dev, "Destroy qp 0x%06lx failed(%d)\n", - hr_qp->qpn, ret); -- return ret; -- } - - if (hr_qp->ibqp.qp_type == IB_QPT_GSI) - kfree(hr_to_hr_sqp(hr_qp)); -@@ -6092,11 +6088,11 @@ static void hns_roce_v2_write_srqc(struct hns_roce_dev *hr_dev, - roce_set_field(srq_context->byte_44_idxbufpgsz_addr, - SRQC_BYTE_44_SRQ_IDX_BA_PG_SZ_M, - SRQC_BYTE_44_SRQ_IDX_BA_PG_SZ_S, -- hr_dev->caps.idx_ba_pg_sz); -+ hr_dev->caps.idx_ba_pg_sz + PG_SHIFT_OFFSET); - roce_set_field(srq_context->byte_44_idxbufpgsz_addr, - SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_M, - SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_S, -- hr_dev->caps.idx_buf_pg_sz); -+ hr_dev->caps.idx_buf_pg_sz + PG_SHIFT_OFFSET); - - srq_context->idx_nxt_blk_addr = - cpu_to_le32(mtts_idx[1] >> PAGE_ADDR_SHIFT); -diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h -index 43219d2f7de0..76a14db7028d 100644 ---- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h -+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h -@@ -87,8 +87,8 @@ - #define HNS_ROCE_V2_MTT_ENTRY_SZ 64 - #define HNS_ROCE_V2_CQE_ENTRY_SIZE 32 - #define HNS_ROCE_V2_SCCC_ENTRY_SZ 32 --#define HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ 4096 --#define HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ 4096 -+#define HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ PAGE_SIZE -+#define HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ PAGE_SIZE - #define HNS_ROCE_V2_PAGE_SIZE_SUPPORTED 0xFFFFF000 - #define HNS_ROCE_V2_MAX_INNER_MTPT_NUM 2 - #define HNS_ROCE_INVALID_LKEY 0x100 -diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c -index bd78ff90d998..8dd2d666f687 100644 ---- a/drivers/infiniband/hw/hns/hns_roce_qp.c -+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c -@@ -332,9 +332,8 @@ static int check_sq_size_with_integrity(struct hns_roce_dev *hr_dev, - u8 max_sq_stride = ilog2(roundup_sq_stride); - - /* Sanity check SQ size before proceeding */ -- if ((u32)(1 << ucmd->log_sq_bb_count) > hr_dev->caps.max_wqes || -- ucmd->log_sq_stride > max_sq_stride || -- ucmd->log_sq_stride < HNS_ROCE_IB_MIN_SQ_STRIDE) { -+ if (ucmd->log_sq_stride > max_sq_stride || -+ ucmd->log_sq_stride < HNS_ROCE_IB_MIN_SQ_STRIDE) { - ibdev_err(&hr_dev->ib_dev, "check SQ size error!\n"); - return -EINVAL; - } -@@ -358,13 +357,16 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev, - u32 max_cnt; - int ret; - -+ if (check_shl_overflow(1, ucmd->log_sq_bb_count, &hr_qp->sq.wqe_cnt) || -+ hr_qp->sq.wqe_cnt > hr_dev->caps.max_wqes) -+ return -EINVAL; -+ - ret = check_sq_size_with_integrity(hr_dev, cap, ucmd); - if (ret) { - ibdev_err(&hr_dev->ib_dev, "Sanity check sq size failed\n"); - return ret; - } - -- hr_qp->sq.wqe_cnt = 1 << ucmd->log_sq_bb_count; - hr_qp->sq.wqe_shift = ucmd->log_sq_stride; - - max_cnt = max(1U, cap->max_send_sge); -diff --git a/drivers/infiniband/hw/hns/hns_roce_restrack.c b/drivers/infiniband/hw/hns/hns_roce_restrack.c -index 06871731ac43..39c08217e861 100644 ---- a/drivers/infiniband/hw/hns/hns_roce_restrack.c -+++ b/drivers/infiniband/hw/hns/hns_roce_restrack.c -@@ -95,7 +95,7 @@ static int hns_roce_fill_res_cq_entry(struct sk_buff *msg, - - ret = hr_dev->dfx->query_cqc_info(hr_dev, hr_cq->cqn, (int *)context); - if (ret) -- goto err; -+ return -EINVAL; - - table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); - if (!table_attr) { -diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c -index 7019c12005f4..99d563dba91b 100644 ---- a/drivers/infiniband/hw/mlx5/mr.c -+++ b/drivers/infiniband/hw/mlx5/mr.c -@@ -428,7 +428,7 @@ struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev, int entry) - - if (entry < 0 || entry >= MAX_MR_CACHE_ENTRIES) { - mlx5_ib_err(dev, "cache entry %d is out of range\n", entry); -- return NULL; -+ return ERR_PTR(-EINVAL); - } - - ent = &cache->ent[entry]; -diff --git a/drivers/infiniband/sw/siw/siw_cm.c b/drivers/infiniband/sw/siw/siw_cm.c -index 8c1931a57f4a..0454561718d9 100644 ---- a/drivers/infiniband/sw/siw/siw_cm.c -+++ b/drivers/infiniband/sw/siw/siw_cm.c -@@ -1867,14 +1867,7 @@ static int siw_listen_address(struct iw_cm_id *id, int backlog, - list_add_tail(&cep->listenq, (struct list_head *)id->provider_data); - cep->state = SIW_EPSTATE_LISTENING; - -- if (addr_family == AF_INET) -- siw_dbg(id->device, "Listen at laddr %pI4 %u\n", -- &(((struct sockaddr_in *)laddr)->sin_addr), -- ((struct sockaddr_in *)laddr)->sin_port); -- else -- siw_dbg(id->device, "Listen at laddr %pI6 %u\n", -- &(((struct sockaddr_in6 *)laddr)->sin6_addr), -- ((struct sockaddr_in6 *)laddr)->sin6_port); -+ siw_dbg(id->device, "Listen at laddr %pISp\n", laddr); - - return 0; - -diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c -index e25c70a56be6..02b92e3cd9a8 100644 ---- a/drivers/infiniband/ulp/srpt/ib_srpt.c -+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c -@@ -1364,9 +1364,11 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch, - struct srpt_send_ioctx *ioctx, u64 tag, - int status) - { -+ struct se_cmd *cmd = &ioctx->cmd; - struct srp_rsp *srp_rsp; - const u8 *sense_data; - int sense_data_len, max_sense_len; -+ u32 resid = cmd->residual_count; - - /* - * The lowest bit of all SAM-3 status codes is zero (see also -@@ -1388,6 +1390,28 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch, - srp_rsp->tag = tag; - srp_rsp->status = status; - -+ if (cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) { -+ if (cmd->data_direction == DMA_TO_DEVICE) { -+ /* residual data from an underflow write */ -+ srp_rsp->flags = SRP_RSP_FLAG_DOUNDER; -+ srp_rsp->data_out_res_cnt = cpu_to_be32(resid); -+ } else if (cmd->data_direction == DMA_FROM_DEVICE) { -+ /* residual data from an underflow read */ -+ srp_rsp->flags = SRP_RSP_FLAG_DIUNDER; -+ srp_rsp->data_in_res_cnt = cpu_to_be32(resid); -+ } -+ } else if (cmd->se_cmd_flags & SCF_OVERFLOW_BIT) { -+ if (cmd->data_direction == DMA_TO_DEVICE) { -+ /* residual data from an overflow write */ -+ srp_rsp->flags = SRP_RSP_FLAG_DOOVER; -+ srp_rsp->data_out_res_cnt = cpu_to_be32(resid); -+ } else if (cmd->data_direction == DMA_FROM_DEVICE) { -+ /* residual data from an overflow read */ -+ srp_rsp->flags = SRP_RSP_FLAG_DIOVER; -+ srp_rsp->data_in_res_cnt = cpu_to_be32(resid); -+ } -+ } -+ - if (sense_data_len) { - BUILD_BUG_ON(MIN_MAX_RSP_SIZE <= sizeof(*srp_rsp)); - max_sense_len = ch->max_ti_iu_len - sizeof(*srp_rsp); -diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c -index 67aa317de6db..e84c5dfe146f 100644 ---- a/drivers/iommu/intel-iommu.c -+++ b/drivers/iommu/intel-iommu.c -@@ -5593,8 +5593,10 @@ static int intel_iommu_add_device(struct device *dev) - - group = iommu_group_get_for_dev(dev); - -- if (IS_ERR(group)) -- return PTR_ERR(group); -+ if (IS_ERR(group)) { -+ ret = PTR_ERR(group); -+ goto unlink; -+ } - - iommu_group_put(group); - -@@ -5620,7 +5622,8 @@ static int intel_iommu_add_device(struct device *dev) - if (!get_private_domain_for_dev(dev)) { - dev_warn(dev, - "Failed to get a private domain.\n"); -- return -ENOMEM; -+ ret = -ENOMEM; -+ goto unlink; - } - - dev_info(dev, -@@ -5635,6 +5638,10 @@ static int intel_iommu_add_device(struct device *dev) - } - - return 0; -+ -+unlink: -+ iommu_device_unlink(&iommu->iommu, dev); -+ return ret; - } - - static void intel_iommu_remove_device(struct device *dev) -diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c -index 24248aa8a7e5..cd3c0ea56657 100644 ---- a/drivers/iommu/iommu.c -+++ b/drivers/iommu/iommu.c -@@ -751,6 +751,7 @@ err_put_group: - mutex_unlock(&group->mutex); - dev->iommu_group = NULL; - kobject_put(group->devices_kobj); -+ sysfs_remove_link(group->devices_kobj, device->name); - err_free_name: - kfree(device->name); - err_remove_link: -diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c -index 67a483c1a935..c2f6c78fee44 100644 ---- a/drivers/iommu/mtk_iommu.c -+++ b/drivers/iommu/mtk_iommu.c -@@ -219,22 +219,37 @@ static void mtk_iommu_tlb_sync(void *cookie) - static void mtk_iommu_tlb_flush_walk(unsigned long iova, size_t size, - size_t granule, void *cookie) - { -+ struct mtk_iommu_data *data = cookie; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&data->tlb_lock, flags); - mtk_iommu_tlb_add_flush_nosync(iova, size, granule, false, cookie); - mtk_iommu_tlb_sync(cookie); -+ spin_unlock_irqrestore(&data->tlb_lock, flags); - } - - static void mtk_iommu_tlb_flush_leaf(unsigned long iova, size_t size, - size_t granule, void *cookie) - { -+ struct mtk_iommu_data *data = cookie; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&data->tlb_lock, flags); - mtk_iommu_tlb_add_flush_nosync(iova, size, granule, true, cookie); - mtk_iommu_tlb_sync(cookie); -+ spin_unlock_irqrestore(&data->tlb_lock, flags); - } - - static void mtk_iommu_tlb_flush_page_nosync(struct iommu_iotlb_gather *gather, - unsigned long iova, size_t granule, - void *cookie) - { -+ struct mtk_iommu_data *data = cookie; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&data->tlb_lock, flags); - mtk_iommu_tlb_add_flush_nosync(iova, granule, granule, true, cookie); -+ spin_unlock_irqrestore(&data->tlb_lock, flags); - } - - static const struct iommu_flush_ops mtk_iommu_flush_ops = { -@@ -447,13 +462,18 @@ static size_t mtk_iommu_unmap(struct iommu_domain *domain, - - static void mtk_iommu_flush_iotlb_all(struct iommu_domain *domain) - { -- mtk_iommu_tlb_sync(mtk_iommu_get_m4u_data()); -+ mtk_iommu_tlb_flush_all(mtk_iommu_get_m4u_data()); - } - - static void mtk_iommu_iotlb_sync(struct iommu_domain *domain, - struct iommu_iotlb_gather *gather) - { -- mtk_iommu_tlb_sync(mtk_iommu_get_m4u_data()); -+ struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); -+ unsigned long flags; -+ -+ spin_lock_irqsave(&data->tlb_lock, flags); -+ mtk_iommu_tlb_sync(data); -+ spin_unlock_irqrestore(&data->tlb_lock, flags); - } - - static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain, -@@ -733,6 +753,7 @@ static int mtk_iommu_probe(struct platform_device *pdev) - if (ret) - return ret; - -+ spin_lock_init(&data->tlb_lock); - list_add_tail(&data->list, &m4ulist); - - if (!iommu_present(&platform_bus_type)) -diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h -index fc0f16eabacd..8cae22de7663 100644 ---- a/drivers/iommu/mtk_iommu.h -+++ b/drivers/iommu/mtk_iommu.h -@@ -58,6 +58,7 @@ struct mtk_iommu_data { - struct iommu_group *m4u_group; - bool enable_4GB; - bool tlb_flush_active; -+ spinlock_t tlb_lock; /* lock for tlb range flush */ - - struct iommu_device iommu; - const struct mtk_iommu_plat_data *plat_data; -diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c -index a5b2448c0abc..af482620f94a 100644 ---- a/drivers/media/i2c/ov6650.c -+++ b/drivers/media/i2c/ov6650.c -@@ -201,7 +201,6 @@ struct ov6650 { - unsigned long pclk_max; /* from resolution and format */ - struct v4l2_fract tpf; /* as requested with s_frame_interval */ - u32 code; -- enum v4l2_colorspace colorspace; - }; - - -@@ -214,6 +213,17 @@ static u32 ov6650_codes[] = { - MEDIA_BUS_FMT_Y8_1X8, - }; - -+static const struct v4l2_mbus_framefmt ov6650_def_fmt = { -+ .width = W_CIF, -+ .height = H_CIF, -+ .code = MEDIA_BUS_FMT_SBGGR8_1X8, -+ .colorspace = V4L2_COLORSPACE_SRGB, -+ .field = V4L2_FIELD_NONE, -+ .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT, -+ .quantization = V4L2_QUANTIZATION_DEFAULT, -+ .xfer_func = V4L2_XFER_FUNC_DEFAULT, -+}; -+ - /* read a register */ - static int ov6650_reg_read(struct i2c_client *client, u8 reg, u8 *val) - { -@@ -514,12 +524,20 @@ static int ov6650_get_fmt(struct v4l2_subdev *sd, - if (format->pad) - return -EINVAL; - -- mf->width = priv->rect.width >> priv->half_scale; -- mf->height = priv->rect.height >> priv->half_scale; -- mf->code = priv->code; -- mf->colorspace = priv->colorspace; -- mf->field = V4L2_FIELD_NONE; -+ /* initialize response with default media bus frame format */ -+ *mf = ov6650_def_fmt; -+ -+ /* update media bus format code and frame size */ -+ if (format->which == V4L2_SUBDEV_FORMAT_TRY) { -+ mf->width = cfg->try_fmt.width; -+ mf->height = cfg->try_fmt.height; -+ mf->code = cfg->try_fmt.code; - -+ } else { -+ mf->width = priv->rect.width >> priv->half_scale; -+ mf->height = priv->rect.height >> priv->half_scale; -+ mf->code = priv->code; -+ } - return 0; - } - -@@ -624,11 +642,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) - priv->pclk_max = 8000000; - } - -- if (code == MEDIA_BUS_FMT_SBGGR8_1X8) -- priv->colorspace = V4L2_COLORSPACE_SRGB; -- else if (code != 0) -- priv->colorspace = V4L2_COLORSPACE_JPEG; -- - if (half_scale) { - dev_dbg(&client->dev, "max resolution: QCIF\n"); - coma_set |= COMA_QCIF; -@@ -662,11 +675,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) - if (!ret) - priv->code = code; - -- if (!ret) { -- mf->colorspace = priv->colorspace; -- mf->width = priv->rect.width >> half_scale; -- mf->height = priv->rect.height >> half_scale; -- } - return ret; - } - -@@ -685,8 +693,6 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd, - v4l_bound_align_image(&mf->width, 2, W_CIF, 1, - &mf->height, 2, H_CIF, 1, 0); - -- mf->field = V4L2_FIELD_NONE; -- - switch (mf->code) { - case MEDIA_BUS_FMT_Y10_1X10: - mf->code = MEDIA_BUS_FMT_Y8_1X8; -@@ -696,20 +702,39 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd, - case MEDIA_BUS_FMT_YUYV8_2X8: - case MEDIA_BUS_FMT_VYUY8_2X8: - case MEDIA_BUS_FMT_UYVY8_2X8: -- mf->colorspace = V4L2_COLORSPACE_JPEG; - break; - default: - mf->code = MEDIA_BUS_FMT_SBGGR8_1X8; - /* fall through */ - case MEDIA_BUS_FMT_SBGGR8_1X8: -- mf->colorspace = V4L2_COLORSPACE_SRGB; - break; - } - -- if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) -- return ov6650_s_fmt(sd, mf); -- cfg->try_fmt = *mf; -+ if (format->which == V4L2_SUBDEV_FORMAT_TRY) { -+ /* store media bus format code and frame size in pad config */ -+ cfg->try_fmt.width = mf->width; -+ cfg->try_fmt.height = mf->height; -+ cfg->try_fmt.code = mf->code; - -+ /* return default mbus frame format updated with pad config */ -+ *mf = ov6650_def_fmt; -+ mf->width = cfg->try_fmt.width; -+ mf->height = cfg->try_fmt.height; -+ mf->code = cfg->try_fmt.code; -+ -+ } else { -+ /* apply new media bus format code and frame size */ -+ int ret = ov6650_s_fmt(sd, mf); -+ -+ if (ret) -+ return ret; -+ -+ /* return default format updated with active size and code */ -+ *mf = ov6650_def_fmt; -+ mf->width = priv->rect.width >> priv->half_scale; -+ mf->height = priv->rect.height >> priv->half_scale; -+ mf->code = priv->code; -+ } - return 0; - } - -@@ -852,6 +877,11 @@ static int ov6650_video_probe(struct v4l2_subdev *sd) - ret = ov6650_reset(client); - if (!ret) - ret = ov6650_prog_dflt(client); -+ if (!ret) { -+ struct v4l2_mbus_framefmt mf = ov6650_def_fmt; -+ -+ ret = ov6650_s_fmt(sd, &mf); -+ } - if (!ret) - ret = v4l2_ctrl_handler_setup(&priv->hdl); - -@@ -1006,9 +1036,6 @@ static int ov6650_probe(struct i2c_client *client, - priv->rect.top = DEF_VSTRT << 1; - priv->rect.width = W_CIF; - priv->rect.height = H_CIF; -- priv->half_scale = false; -- priv->code = MEDIA_BUS_FMT_YUYV8_2X8; -- priv->colorspace = V4L2_COLORSPACE_JPEG; - - /* Hardware default frame interval */ - priv->tpf.numerator = GET_CLKRC_DIV(DEF_CLKRC); -diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c -index 096a7c9a8963..4eaaf39b9223 100644 ---- a/drivers/media/platform/aspeed-video.c -+++ b/drivers/media/platform/aspeed-video.c -@@ -1658,7 +1658,8 @@ static int aspeed_video_probe(struct platform_device *pdev) - { - int rc; - struct resource *res; -- struct aspeed_video *video = kzalloc(sizeof(*video), GFP_KERNEL); -+ struct aspeed_video *video = -+ devm_kzalloc(&pdev->dev, sizeof(*video), GFP_KERNEL); - - if (!video) - return -ENOMEM; -diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c -index 31ace114eda1..be9ec59774d6 100644 ---- a/drivers/media/platform/cadence/cdns-csi2rx.c -+++ b/drivers/media/platform/cadence/cdns-csi2rx.c -@@ -129,7 +129,7 @@ static int csi2rx_start(struct csi2rx_priv *csi2rx) - */ - for (i = csi2rx->num_lanes; i < csi2rx->max_lanes; i++) { - unsigned int idx = find_first_zero_bit(&lanes_used, -- sizeof(lanes_used)); -+ csi2rx->max_lanes); - set_bit(idx, &lanes_used); - reg |= CSI2RX_STATIC_CFG_DLANE_MAP(i, i + 1); - } -diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c -index 73222c0615c0..834f11fe9dc2 100644 ---- a/drivers/media/platform/coda/coda-common.c -+++ b/drivers/media/platform/coda/coda-common.c -@@ -1084,16 +1084,16 @@ static int coda_decoder_cmd(struct file *file, void *fh, - - switch (dc->cmd) { - case V4L2_DEC_CMD_START: -- mutex_lock(&ctx->bitstream_mutex); - mutex_lock(&dev->coda_mutex); -+ mutex_lock(&ctx->bitstream_mutex); - coda_bitstream_flush(ctx); -- mutex_unlock(&dev->coda_mutex); - dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, - V4L2_BUF_TYPE_VIDEO_CAPTURE); - vb2_clear_last_buffer_dequeued(dst_vq); - ctx->bit_stream_param &= ~CODA_BIT_STREAM_END_FLAG; - coda_fill_bitstream(ctx, NULL); - mutex_unlock(&ctx->bitstream_mutex); -+ mutex_unlock(&dev->coda_mutex); - break; - case V4L2_DEC_CMD_STOP: - stream_end = false; -diff --git a/drivers/media/platform/exynos4-is/fimc-isp-video.c b/drivers/media/platform/exynos4-is/fimc-isp-video.c -index 378cc302e1f8..d2cbcdca0463 100644 ---- a/drivers/media/platform/exynos4-is/fimc-isp-video.c -+++ b/drivers/media/platform/exynos4-is/fimc-isp-video.c -@@ -313,7 +313,7 @@ static int isp_video_release(struct file *file) - ivc->streaming = 0; - } - -- vb2_fop_release(file); -+ _vb2_fop_release(file, NULL); - - if (v4l2_fh_is_singular_file(file)) { - fimc_pipeline_call(&ivc->ve, close); -diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c -index cbc1c07f0a96..ec2796413e26 100644 ---- a/drivers/media/platform/rcar-vin/rcar-v4l2.c -+++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c -@@ -208,6 +208,7 @@ static int rvin_try_format(struct rvin_dev *vin, u32 which, - ret = v4l2_subdev_call(sd, pad, set_fmt, pad_cfg, &format); - if (ret < 0 && ret != -ENOIOCTLCMD) - goto done; -+ ret = 0; - - v4l2_fill_pix_format(pix, &format.format); - -@@ -242,7 +243,7 @@ static int rvin_try_format(struct rvin_dev *vin, u32 which, - done: - v4l2_subdev_free_pad_config(pad_cfg); - -- return 0; -+ return ret; - } - - static int rvin_querycap(struct file *file, void *priv, -diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c -index 439d7d886873..a113e811faab 100644 ---- a/drivers/memory/mtk-smi.c -+++ b/drivers/memory/mtk-smi.c -@@ -366,6 +366,8 @@ static int __maybe_unused mtk_smi_larb_suspend(struct device *dev) - - static const struct dev_pm_ops smi_larb_pm_ops = { - SET_RUNTIME_PM_OPS(mtk_smi_larb_suspend, mtk_smi_larb_resume, NULL) -+ SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, -+ pm_runtime_force_resume) - }; - - static struct platform_driver mtk_smi_larb_driver = { -@@ -507,6 +509,8 @@ static int __maybe_unused mtk_smi_common_suspend(struct device *dev) - - static const struct dev_pm_ops smi_common_pm_ops = { - SET_RUNTIME_PM_OPS(mtk_smi_common_suspend, mtk_smi_common_resume, NULL) -+ SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, -+ pm_runtime_force_resume) - }; - - static struct platform_driver mtk_smi_common_driver = { -diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c -index 6d27ccfe0680..3c2d405bc79b 100644 ---- a/drivers/misc/enclosure.c -+++ b/drivers/misc/enclosure.c -@@ -406,10 +406,9 @@ int enclosure_remove_device(struct enclosure_device *edev, struct device *dev) - cdev = &edev->component[i]; - if (cdev->dev == dev) { - enclosure_remove_links(cdev); -- device_del(&cdev->cdev); - put_device(dev); - cdev->dev = NULL; -- return device_add(&cdev->cdev); -+ return 0; - } - } - return -ENODEV; -diff --git a/drivers/mtd/nand/onenand/omap2.c b/drivers/mtd/nand/onenand/omap2.c -index edf94ee54ec7..71a632b815aa 100644 ---- a/drivers/mtd/nand/onenand/omap2.c -+++ b/drivers/mtd/nand/onenand/omap2.c -@@ -328,7 +328,8 @@ static inline int omap2_onenand_dma_transfer(struct omap2_onenand *c, - struct dma_async_tx_descriptor *tx; - dma_cookie_t cookie; - -- tx = dmaengine_prep_dma_memcpy(c->dma_chan, dst, src, count, 0); -+ tx = dmaengine_prep_dma_memcpy(c->dma_chan, dst, src, count, -+ DMA_CTRL_ACK | DMA_PREP_INTERRUPT); - if (!tx) { - dev_err(&c->pdev->dev, "Failed to prepare DMA memcpy\n"); - return -EIO; -diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c b/drivers/mtd/nand/raw/stm32_fmc2_nand.c -index 8cc852dc7d54..5c06e0b4d4ef 100644 ---- a/drivers/mtd/nand/raw/stm32_fmc2_nand.c -+++ b/drivers/mtd/nand/raw/stm32_fmc2_nand.c -@@ -37,6 +37,7 @@ - /* Max ECC buffer length */ - #define FMC2_MAX_ECC_BUF_LEN (FMC2_BCHDSRS_LEN * FMC2_MAX_SG) - -+#define FMC2_TIMEOUT_US 1000 - #define FMC2_TIMEOUT_MS 1000 - - /* Timings */ -@@ -53,6 +54,8 @@ - #define FMC2_PMEM 0x88 - #define FMC2_PATT 0x8c - #define FMC2_HECCR 0x94 -+#define FMC2_ISR 0x184 -+#define FMC2_ICR 0x188 - #define FMC2_CSQCR 0x200 - #define FMC2_CSQCFGR1 0x204 - #define FMC2_CSQCFGR2 0x208 -@@ -118,6 +121,12 @@ - #define FMC2_PATT_ATTHIZ(x) (((x) & 0xff) << 24) - #define FMC2_PATT_DEFAULT 0x0a0a0a0a - -+/* Register: FMC2_ISR */ -+#define FMC2_ISR_IHLF BIT(1) -+ -+/* Register: FMC2_ICR */ -+#define FMC2_ICR_CIHLF BIT(1) -+ - /* Register: FMC2_CSQCR */ - #define FMC2_CSQCR_CSQSTART BIT(0) - -@@ -1322,6 +1331,31 @@ static void stm32_fmc2_write_data(struct nand_chip *chip, const void *buf, - stm32_fmc2_set_buswidth_16(fmc2, true); - } - -+static int stm32_fmc2_waitrdy(struct nand_chip *chip, unsigned long timeout_ms) -+{ -+ struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller); -+ const struct nand_sdr_timings *timings; -+ u32 isr, sr; -+ -+ /* Check if there is no pending requests to the NAND flash */ -+ if (readl_relaxed_poll_timeout_atomic(fmc2->io_base + FMC2_SR, sr, -+ sr & FMC2_SR_NWRF, 1, -+ FMC2_TIMEOUT_US)) -+ dev_warn(fmc2->dev, "Waitrdy timeout\n"); -+ -+ /* Wait tWB before R/B# signal is low */ -+ timings = nand_get_sdr_timings(&chip->data_interface); -+ ndelay(PSEC_TO_NSEC(timings->tWB_max)); -+ -+ /* R/B# signal is low, clear high level flag */ -+ writel_relaxed(FMC2_ICR_CIHLF, fmc2->io_base + FMC2_ICR); -+ -+ /* Wait R/B# signal is high */ -+ return readl_relaxed_poll_timeout_atomic(fmc2->io_base + FMC2_ISR, -+ isr, isr & FMC2_ISR_IHLF, -+ 5, 1000 * timeout_ms); -+} -+ - static int stm32_fmc2_exec_op(struct nand_chip *chip, - const struct nand_operation *op, - bool check_only) -@@ -1366,8 +1400,8 @@ static int stm32_fmc2_exec_op(struct nand_chip *chip, - break; - - case NAND_OP_WAITRDY_INSTR: -- ret = nand_soft_waitrdy(chip, -- instr->ctx.waitrdy.timeout_ms); -+ ret = stm32_fmc2_waitrdy(chip, -+ instr->ctx.waitrdy.timeout_ms); - break; - } - } -diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c -index 7acf4a93b592..1548e0f7f5f4 100644 ---- a/drivers/mtd/spi-nor/spi-nor.c -+++ b/drivers/mtd/spi-nor/spi-nor.c -@@ -2544,7 +2544,7 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, u_char *buf) - { - struct spi_nor *nor = mtd_to_spi_nor(mtd); -- int ret; -+ ssize_t ret; - - dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len); - -@@ -2865,7 +2865,7 @@ static int spi_nor_hwcaps_pp2cmd(u32 hwcaps) - */ - static int spi_nor_read_raw(struct spi_nor *nor, u32 addr, size_t len, u8 *buf) - { -- int ret; -+ ssize_t ret; - - while (len) { - ret = spi_nor_read_data(nor, addr, len, buf); -diff --git a/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c b/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c -index 159490f5a111..60731e07f681 100644 ---- a/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c -+++ b/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c -@@ -84,7 +84,7 @@ static int ath9k_pci_fixup(struct pci_dev *pdev, const u16 *cal_data, - val = swahb32(val); - } - -- __raw_writel(val, mem + reg); -+ iowrite32(val, mem + reg); - usleep_range(100, 120); - } - -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c -index d9eb2b286438..c59cbb8cbdd7 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c -@@ -514,6 +514,18 @@ static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm) - struct iwl_phy_cfg_cmd phy_cfg_cmd; - enum iwl_ucode_type ucode_type = mvm->fwrt.cur_fw_img; - -+ if (iwl_mvm_has_unified_ucode(mvm) && -+ !mvm->trans->cfg->tx_with_siso_diversity) { -+ return 0; -+ } else if (mvm->trans->cfg->tx_with_siso_diversity) { -+ /* -+ * TODO: currently we don't set the antenna but letting the NIC -+ * to decide which antenna to use. This should come from BIOS. -+ */ -+ phy_cfg_cmd.phy_cfg = -+ cpu_to_le32(FW_PHY_CFG_CHAIN_SAD_ENABLED); -+ } -+ - /* Set parameters */ - phy_cfg_cmd.phy_cfg = cpu_to_le32(iwl_mvm_get_phy_config(mvm)); - -@@ -1344,12 +1356,12 @@ int iwl_mvm_up(struct iwl_mvm *mvm) - ret = iwl_send_phy_db_data(mvm->phy_db); - if (ret) - goto error; -- -- ret = iwl_send_phy_cfg_cmd(mvm); -- if (ret) -- goto error; - } - -+ ret = iwl_send_phy_cfg_cmd(mvm); -+ if (ret) -+ goto error; -+ - ret = iwl_mvm_send_bt_init_conf(mvm); - if (ret) - goto error; -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c -index 8f50e2b121bd..098d48153a38 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c -@@ -350,7 +350,13 @@ void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, - u16 size = le32_to_cpu(notif->amsdu_size); - int i; - -- if (WARN_ON(sta->max_amsdu_len < size)) -+ /* -+ * In debug sta->max_amsdu_len < size -+ * so also check with orig_amsdu_len which holds the original -+ * data before debugfs changed the value -+ */ -+ if (WARN_ON(sta->max_amsdu_len < size && -+ mvmsta->orig_amsdu_len < size)) - goto out; - - mvmsta->amsdu_enabled = le32_to_cpu(notif->amsdu_enabled); -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -index 8a059da7a1fa..e3b2a2bf3863 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -@@ -935,7 +935,12 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb, - !(mvmsta->amsdu_enabled & BIT(tid))) - return iwl_mvm_tx_tso_segment(skb, 1, netdev_flags, mpdus_skb); - -- max_amsdu_len = iwl_mvm_max_amsdu_size(mvm, sta, tid); -+ /* -+ * Take the min of ieee80211 station and mvm station -+ */ -+ max_amsdu_len = -+ min_t(unsigned int, sta->max_amsdu_len, -+ iwl_mvm_max_amsdu_size(mvm, sta, tid)); - - /* - * Limit A-MSDU in A-MPDU to 4095 bytes when VHT is not -diff --git a/drivers/net/wireless/realtek/rtlwifi/regd.c b/drivers/net/wireless/realtek/rtlwifi/regd.c -index c10432cd703e..8be31e0ad878 100644 ---- a/drivers/net/wireless/realtek/rtlwifi/regd.c -+++ b/drivers/net/wireless/realtek/rtlwifi/regd.c -@@ -386,7 +386,7 @@ int rtl_regd_init(struct ieee80211_hw *hw, - struct wiphy *wiphy = hw->wiphy; - struct country_code_to_enum_rd *country = NULL; - -- if (wiphy == NULL || &rtlpriv->regd == NULL) -+ if (!wiphy) - return -EINVAL; - - /* init country_code from efuse channel plan */ -diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c -index 760eaffeebd6..23a1d00b5f38 100644 ---- a/drivers/net/wireless/rsi/rsi_91x_usb.c -+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c -@@ -793,7 +793,7 @@ static int rsi_probe(struct usb_interface *pfunction, - adapter->device_model = RSI_DEV_9116; - } else { - rsi_dbg(ERR_ZONE, "%s: Unsupported RSI device id 0x%x\n", -- __func__, id->idProduct); -+ __func__, id ? id->idProduct : 0x0); - goto err1; - } - -diff --git a/drivers/pci/controller/dwc/pci-meson.c b/drivers/pci/controller/dwc/pci-meson.c -index e35e9eaa50ee..b927a92e3463 100644 ---- a/drivers/pci/controller/dwc/pci-meson.c -+++ b/drivers/pci/controller/dwc/pci-meson.c -@@ -250,15 +250,15 @@ static int meson_pcie_probe_clocks(struct meson_pcie *mp) - if (IS_ERR(res->port_clk)) - return PTR_ERR(res->port_clk); - -- res->mipi_gate = meson_pcie_probe_clock(dev, "pcie_mipi_en", 0); -+ res->mipi_gate = meson_pcie_probe_clock(dev, "mipi", 0); - if (IS_ERR(res->mipi_gate)) - return PTR_ERR(res->mipi_gate); - -- res->general_clk = meson_pcie_probe_clock(dev, "pcie_general", 0); -+ res->general_clk = meson_pcie_probe_clock(dev, "general", 0); - if (IS_ERR(res->general_clk)) - return PTR_ERR(res->general_clk); - -- res->clk = meson_pcie_probe_clock(dev, "pcie", 0); -+ res->clk = meson_pcie_probe_clock(dev, "pclk", 0); - if (IS_ERR(res->clk)) - return PTR_ERR(res->clk); - -diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c -index 0f36a926059a..8615f1548882 100644 ---- a/drivers/pci/controller/dwc/pcie-designware-host.c -+++ b/drivers/pci/controller/dwc/pcie-designware-host.c -@@ -78,7 +78,8 @@ static struct msi_domain_info dw_pcie_msi_domain_info = { - irqreturn_t dw_handle_msi_irq(struct pcie_port *pp) - { - int i, pos, irq; -- u32 val, num_ctrls; -+ unsigned long val; -+ u32 status, num_ctrls; - irqreturn_t ret = IRQ_NONE; - - num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; -@@ -86,14 +87,14 @@ irqreturn_t dw_handle_msi_irq(struct pcie_port *pp) - for (i = 0; i < num_ctrls; i++) { - dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_STATUS + - (i * MSI_REG_CTRL_BLOCK_SIZE), -- 4, &val); -- if (!val) -+ 4, &status); -+ if (!status) - continue; - - ret = IRQ_HANDLED; -+ val = status; - pos = 0; -- while ((pos = find_next_bit((unsigned long *) &val, -- MAX_MSI_IRQS_PER_CTRL, -+ while ((pos = find_next_bit(&val, MAX_MSI_IRQS_PER_CTRL, - pos)) != MAX_MSI_IRQS_PER_CTRL) { - irq = irq_find_mapping(pp->irq_domain, - (i * MAX_MSI_IRQS_PER_CTRL) + -diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c -index fc0fe4d4de49..97245e076548 100644 ---- a/drivers/pci/controller/pci-aardvark.c -+++ b/drivers/pci/controller/pci-aardvark.c -@@ -180,6 +180,8 @@ - #define LINK_WAIT_MAX_RETRIES 10 - #define LINK_WAIT_USLEEP_MIN 90000 - #define LINK_WAIT_USLEEP_MAX 100000 -+#define RETRAIN_WAIT_MAX_RETRIES 10 -+#define RETRAIN_WAIT_USLEEP_US 2000 - - #define MSI_IRQ_NUM 32 - -@@ -239,6 +241,17 @@ static int advk_pcie_wait_for_link(struct advk_pcie *pcie) - return -ETIMEDOUT; - } - -+static void advk_pcie_wait_for_retrain(struct advk_pcie *pcie) -+{ -+ size_t retries; -+ -+ for (retries = 0; retries < RETRAIN_WAIT_MAX_RETRIES; ++retries) { -+ if (!advk_pcie_link_up(pcie)) -+ break; -+ udelay(RETRAIN_WAIT_USLEEP_US); -+ } -+} -+ - static void advk_pcie_setup_hw(struct advk_pcie *pcie) - { - u32 reg; -@@ -415,7 +428,7 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge, - - case PCI_EXP_RTCTL: { - u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); -- *value = (val & PCIE_MSG_PM_PME_MASK) ? PCI_EXP_RTCTL_PMEIE : 0; -+ *value = (val & PCIE_MSG_PM_PME_MASK) ? 0 : PCI_EXP_RTCTL_PMEIE; - return PCI_BRIDGE_EMUL_HANDLED; - } - -@@ -426,11 +439,20 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge, - return PCI_BRIDGE_EMUL_HANDLED; - } - -+ case PCI_EXP_LNKCTL: { -+ /* u32 contains both PCI_EXP_LNKCTL and PCI_EXP_LNKSTA */ -+ u32 val = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg) & -+ ~(PCI_EXP_LNKSTA_LT << 16); -+ if (!advk_pcie_link_up(pcie)) -+ val |= (PCI_EXP_LNKSTA_LT << 16); -+ *value = val; -+ return PCI_BRIDGE_EMUL_HANDLED; -+ } -+ - case PCI_CAP_LIST_ID: - case PCI_EXP_DEVCAP: - case PCI_EXP_DEVCTL: - case PCI_EXP_LNKCAP: -- case PCI_EXP_LNKCTL: - *value = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg); - return PCI_BRIDGE_EMUL_HANDLED; - default: -@@ -447,14 +469,24 @@ advk_pci_bridge_emul_pcie_conf_write(struct pci_bridge_emul *bridge, - - switch (reg) { - case PCI_EXP_DEVCTL: -+ advk_writel(pcie, new, PCIE_CORE_PCIEXP_CAP + reg); -+ break; -+ - case PCI_EXP_LNKCTL: - advk_writel(pcie, new, PCIE_CORE_PCIEXP_CAP + reg); -+ if (new & PCI_EXP_LNKCTL_RL) -+ advk_pcie_wait_for_retrain(pcie); - break; - -- case PCI_EXP_RTCTL: -- new = (new & PCI_EXP_RTCTL_PMEIE) << 3; -- advk_writel(pcie, new, PCIE_ISR0_MASK_REG); -+ case PCI_EXP_RTCTL: { -+ /* Only mask/unmask PME interrupt */ -+ u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG) & -+ ~PCIE_MSG_PM_PME_MASK; -+ if ((new & PCI_EXP_RTCTL_PMEIE) == 0) -+ val |= PCIE_MSG_PM_PME_MASK; -+ advk_writel(pcie, val, PCIE_ISR0_MASK_REG); - break; -+ } - - case PCI_EXP_RTSTA: - new = (new & PCI_EXP_RTSTA_PME) >> 9; -diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c -index b3122c151b80..56daad828c9e 100644 ---- a/drivers/pci/hotplug/pciehp_core.c -+++ b/drivers/pci/hotplug/pciehp_core.c -@@ -253,7 +253,7 @@ static bool pme_is_native(struct pcie_device *dev) - return pcie_ports_native || host->native_pme; - } - --static int pciehp_suspend(struct pcie_device *dev) -+static void pciehp_disable_interrupt(struct pcie_device *dev) - { - /* - * Disable hotplug interrupt so that it does not trigger -@@ -261,7 +261,19 @@ static int pciehp_suspend(struct pcie_device *dev) - */ - if (pme_is_native(dev)) - pcie_disable_interrupt(get_service_data(dev)); -+} - -+#ifdef CONFIG_PM_SLEEP -+static int pciehp_suspend(struct pcie_device *dev) -+{ -+ /* -+ * If the port is already runtime suspended we can keep it that -+ * way. -+ */ -+ if (dev_pm_smart_suspend_and_suspended(&dev->port->dev)) -+ return 0; -+ -+ pciehp_disable_interrupt(dev); - return 0; - } - -@@ -279,6 +291,7 @@ static int pciehp_resume_noirq(struct pcie_device *dev) - - return 0; - } -+#endif - - static int pciehp_resume(struct pcie_device *dev) - { -@@ -292,6 +305,12 @@ static int pciehp_resume(struct pcie_device *dev) - return 0; - } - -+static int pciehp_runtime_suspend(struct pcie_device *dev) -+{ -+ pciehp_disable_interrupt(dev); -+ return 0; -+} -+ - static int pciehp_runtime_resume(struct pcie_device *dev) - { - struct controller *ctrl = get_service_data(dev); -@@ -318,10 +337,12 @@ static struct pcie_port_service_driver hpdriver_portdrv = { - .remove = pciehp_remove, - - #ifdef CONFIG_PM -+#ifdef CONFIG_PM_SLEEP - .suspend = pciehp_suspend, - .resume_noirq = pciehp_resume_noirq, - .resume = pciehp_resume, -- .runtime_suspend = pciehp_suspend, -+#endif -+ .runtime_suspend = pciehp_runtime_suspend, - .runtime_resume = pciehp_runtime_resume, - #endif /* PM */ - }; -diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c -index d4ac8ce8c1f9..0c3086793e4e 100644 ---- a/drivers/pci/pci-driver.c -+++ b/drivers/pci/pci-driver.c -@@ -941,12 +941,11 @@ static int pci_pm_resume_noirq(struct device *dev) - pci_pm_default_resume_early(pci_dev); - - pci_fixup_device(pci_fixup_resume_early, pci_dev); -+ pcie_pme_root_status_cleanup(pci_dev); - - if (pci_has_legacy_pm_support(pci_dev)) - return pci_legacy_resume_early(dev); - -- pcie_pme_root_status_cleanup(pci_dev); -- - if (drv && drv->pm && drv->pm->resume_noirq) - error = drv->pm->resume_noirq(dev); - -diff --git a/drivers/pci/pcie/ptm.c b/drivers/pci/pcie/ptm.c -index 98cfa30f3fae..9361f3aa26ab 100644 ---- a/drivers/pci/pcie/ptm.c -+++ b/drivers/pci/pcie/ptm.c -@@ -21,7 +21,7 @@ static void pci_ptm_info(struct pci_dev *dev) - snprintf(clock_desc, sizeof(clock_desc), ">254ns"); - break; - default: -- snprintf(clock_desc, sizeof(clock_desc), "%udns", -+ snprintf(clock_desc, sizeof(clock_desc), "%uns", - dev->ptm_granularity); - break; - } -diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c -index 64ebe3e5e611..d3033873395d 100644 ---- a/drivers/pci/probe.c -+++ b/drivers/pci/probe.c -@@ -572,6 +572,7 @@ static void devm_pci_release_host_bridge_dev(struct device *dev) - bridge->release_fn(bridge); - - pci_free_resource_list(&bridge->windows); -+ pci_free_resource_list(&bridge->dma_ranges); - } - - static void pci_release_host_bridge_dev(struct device *dev) -diff --git a/drivers/phy/motorola/phy-mapphone-mdm6600.c b/drivers/phy/motorola/phy-mapphone-mdm6600.c -index ee184d5607bd..f20524f0c21d 100644 ---- a/drivers/phy/motorola/phy-mapphone-mdm6600.c -+++ b/drivers/phy/motorola/phy-mapphone-mdm6600.c -@@ -200,7 +200,7 @@ static void phy_mdm6600_status(struct work_struct *work) - struct phy_mdm6600 *ddata; - struct device *dev; - DECLARE_BITMAP(values, PHY_MDM6600_NR_STATUS_LINES); -- int error, i, val = 0; -+ int error; - - ddata = container_of(work, struct phy_mdm6600, status_work.work); - dev = ddata->dev; -@@ -212,16 +212,11 @@ static void phy_mdm6600_status(struct work_struct *work) - if (error) - return; - -- for (i = 0; i < PHY_MDM6600_NR_STATUS_LINES; i++) { -- val |= test_bit(i, values) << i; -- dev_dbg(ddata->dev, "XXX %s: i: %i values[i]: %i val: %i\n", -- __func__, i, test_bit(i, values), val); -- } -- ddata->status = values[0]; -+ ddata->status = values[0] & ((1 << PHY_MDM6600_NR_STATUS_LINES) - 1); - - dev_info(dev, "modem status: %i %s\n", - ddata->status, -- phy_mdm6600_status_name[ddata->status & 7]); -+ phy_mdm6600_status_name[ddata->status]); - complete(&ddata->ack); - } - -diff --git a/drivers/pinctrl/cirrus/Kconfig b/drivers/pinctrl/cirrus/Kconfig -index f1806fd781a0..530426a74f75 100644 ---- a/drivers/pinctrl/cirrus/Kconfig -+++ b/drivers/pinctrl/cirrus/Kconfig -@@ -2,6 +2,7 @@ - config PINCTRL_LOCHNAGAR - tristate "Cirrus Logic Lochnagar pinctrl driver" - depends on MFD_LOCHNAGAR -+ select GPIOLIB - select PINMUX - select PINCONF - select GENERIC_PINCONF -diff --git a/drivers/pinctrl/intel/pinctrl-lewisburg.c b/drivers/pinctrl/intel/pinctrl-lewisburg.c -index 2e06fb1464ab..7fdf4257df1e 100644 ---- a/drivers/pinctrl/intel/pinctrl-lewisburg.c -+++ b/drivers/pinctrl/intel/pinctrl-lewisburg.c -@@ -33,6 +33,7 @@ - .npins = ((e) - (s) + 1), \ - } - -+/* Lewisburg */ - static const struct pinctrl_pin_desc lbg_pins[] = { - /* GPP_A */ - PINCTRL_PIN(0, "RCINB"), -@@ -72,7 +73,7 @@ static const struct pinctrl_pin_desc lbg_pins[] = { - PINCTRL_PIN(33, "SRCCLKREQB_4"), - PINCTRL_PIN(34, "SRCCLKREQB_5"), - PINCTRL_PIN(35, "GPP_B_11"), -- PINCTRL_PIN(36, "GLB_RST_WARN_N"), -+ PINCTRL_PIN(36, "SLP_S0B"), - PINCTRL_PIN(37, "PLTRSTB"), - PINCTRL_PIN(38, "SPKR"), - PINCTRL_PIN(39, "GPP_B_15"), -@@ -185,96 +186,96 @@ static const struct pinctrl_pin_desc lbg_pins[] = { - PINCTRL_PIN(141, "GBE_PCI_DIS"), - PINCTRL_PIN(142, "GBE_LAN_DIS"), - PINCTRL_PIN(143, "GPP_I_10"), -- PINCTRL_PIN(144, "GPIO_RCOMP_3P3"), - /* GPP_J */ -- PINCTRL_PIN(145, "GBE_LED_0_0"), -- PINCTRL_PIN(146, "GBE_LED_0_1"), -- PINCTRL_PIN(147, "GBE_LED_1_0"), -- PINCTRL_PIN(148, "GBE_LED_1_1"), -- PINCTRL_PIN(149, "GBE_LED_2_0"), -- PINCTRL_PIN(150, "GBE_LED_2_1"), -- PINCTRL_PIN(151, "GBE_LED_3_0"), -- PINCTRL_PIN(152, "GBE_LED_3_1"), -- PINCTRL_PIN(153, "GBE_SCL_0"), -- PINCTRL_PIN(154, "GBE_SDA_0"), -- PINCTRL_PIN(155, "GBE_SCL_1"), -- PINCTRL_PIN(156, "GBE_SDA_1"), -- PINCTRL_PIN(157, "GBE_SCL_2"), -- PINCTRL_PIN(158, "GBE_SDA_2"), -- PINCTRL_PIN(159, "GBE_SCL_3"), -- PINCTRL_PIN(160, "GBE_SDA_3"), -- PINCTRL_PIN(161, "GBE_SDP_0_0"), -- PINCTRL_PIN(162, "GBE_SDP_0_1"), -- PINCTRL_PIN(163, "GBE_SDP_1_0"), -- PINCTRL_PIN(164, "GBE_SDP_1_1"), -- PINCTRL_PIN(165, "GBE_SDP_2_0"), -- PINCTRL_PIN(166, "GBE_SDP_2_1"), -- PINCTRL_PIN(167, "GBE_SDP_3_0"), -- PINCTRL_PIN(168, "GBE_SDP_3_1"), -+ PINCTRL_PIN(144, "GBE_LED_0_0"), -+ PINCTRL_PIN(145, "GBE_LED_0_1"), -+ PINCTRL_PIN(146, "GBE_LED_1_0"), -+ PINCTRL_PIN(147, "GBE_LED_1_1"), -+ PINCTRL_PIN(148, "GBE_LED_2_0"), -+ PINCTRL_PIN(149, "GBE_LED_2_1"), -+ PINCTRL_PIN(150, "GBE_LED_3_0"), -+ PINCTRL_PIN(151, "GBE_LED_3_1"), -+ PINCTRL_PIN(152, "GBE_SCL_0"), -+ PINCTRL_PIN(153, "GBE_SDA_0"), -+ PINCTRL_PIN(154, "GBE_SCL_1"), -+ PINCTRL_PIN(155, "GBE_SDA_1"), -+ PINCTRL_PIN(156, "GBE_SCL_2"), -+ PINCTRL_PIN(157, "GBE_SDA_2"), -+ PINCTRL_PIN(158, "GBE_SCL_3"), -+ PINCTRL_PIN(159, "GBE_SDA_3"), -+ PINCTRL_PIN(160, "GBE_SDP_0_0"), -+ PINCTRL_PIN(161, "GBE_SDP_0_1"), -+ PINCTRL_PIN(162, "GBE_SDP_1_0"), -+ PINCTRL_PIN(163, "GBE_SDP_1_1"), -+ PINCTRL_PIN(164, "GBE_SDP_2_0"), -+ PINCTRL_PIN(165, "GBE_SDP_2_1"), -+ PINCTRL_PIN(166, "GBE_SDP_3_0"), -+ PINCTRL_PIN(167, "GBE_SDP_3_1"), - /* GPP_K */ -- PINCTRL_PIN(169, "GBE_RMIICLK"), -- PINCTRL_PIN(170, "GBE_RMII_TXD_0"), -- PINCTRL_PIN(171, "GBE_RMII_TXD_1"), -+ PINCTRL_PIN(168, "GBE_RMIICLK"), -+ PINCTRL_PIN(169, "GBE_RMII_RXD_0"), -+ PINCTRL_PIN(170, "GBE_RMII_RXD_1"), -+ PINCTRL_PIN(171, "GBE_RMII_CRS_DV"), - PINCTRL_PIN(172, "GBE_RMII_TX_EN"), -- PINCTRL_PIN(173, "GBE_RMII_CRS_DV"), -- PINCTRL_PIN(174, "GBE_RMII_RXD_0"), -- PINCTRL_PIN(175, "GBE_RMII_RXD_1"), -- PINCTRL_PIN(176, "GBE_RMII_RX_ER"), -- PINCTRL_PIN(177, "GBE_RMII_ARBIN"), -- PINCTRL_PIN(178, "GBE_RMII_ARB_OUT"), -- PINCTRL_PIN(179, "PE_RST_N"), -- PINCTRL_PIN(180, "GPIO_RCOMP_1P8_3P3"), -+ PINCTRL_PIN(173, "GBE_RMII_TXD_0"), -+ PINCTRL_PIN(174, "GBE_RMII_TXD_1"), -+ PINCTRL_PIN(175, "GBE_RMII_RX_ER"), -+ PINCTRL_PIN(176, "GBE_RMII_ARBIN"), -+ PINCTRL_PIN(177, "GBE_RMII_ARB_OUT"), -+ PINCTRL_PIN(178, "PE_RST_N"), - /* GPP_G */ -- PINCTRL_PIN(181, "FAN_TACH_0"), -- PINCTRL_PIN(182, "FAN_TACH_1"), -- PINCTRL_PIN(183, "FAN_TACH_2"), -- PINCTRL_PIN(184, "FAN_TACH_3"), -- PINCTRL_PIN(185, "FAN_TACH_4"), -- PINCTRL_PIN(186, "FAN_TACH_5"), -- PINCTRL_PIN(187, "FAN_TACH_6"), -- PINCTRL_PIN(188, "FAN_TACH_7"), -- PINCTRL_PIN(189, "FAN_PWM_0"), -- PINCTRL_PIN(190, "FAN_PWM_1"), -- PINCTRL_PIN(191, "FAN_PWM_2"), -- PINCTRL_PIN(192, "FAN_PWM_3"), -- PINCTRL_PIN(193, "GSXDOUT"), -- PINCTRL_PIN(194, "GSXSLOAD"), -- PINCTRL_PIN(195, "GSXDIN"), -- PINCTRL_PIN(196, "GSXSRESETB"), -- PINCTRL_PIN(197, "GSXCLK"), -- PINCTRL_PIN(198, "ADR_COMPLETE"), -- PINCTRL_PIN(199, "NMIB"), -- PINCTRL_PIN(200, "SMIB"), -- PINCTRL_PIN(201, "SSATA_DEVSLP_0"), -- PINCTRL_PIN(202, "SSATA_DEVSLP_1"), -- PINCTRL_PIN(203, "SSATA_DEVSLP_2"), -- PINCTRL_PIN(204, "SSATAXPCIE0_SSATAGP0"), -+ PINCTRL_PIN(179, "FAN_TACH_0"), -+ PINCTRL_PIN(180, "FAN_TACH_1"), -+ PINCTRL_PIN(181, "FAN_TACH_2"), -+ PINCTRL_PIN(182, "FAN_TACH_3"), -+ PINCTRL_PIN(183, "FAN_TACH_4"), -+ PINCTRL_PIN(184, "FAN_TACH_5"), -+ PINCTRL_PIN(185, "FAN_TACH_6"), -+ PINCTRL_PIN(186, "FAN_TACH_7"), -+ PINCTRL_PIN(187, "FAN_PWM_0"), -+ PINCTRL_PIN(188, "FAN_PWM_1"), -+ PINCTRL_PIN(189, "FAN_PWM_2"), -+ PINCTRL_PIN(190, "FAN_PWM_3"), -+ PINCTRL_PIN(191, "GSXDOUT"), -+ PINCTRL_PIN(192, "GSXSLOAD"), -+ PINCTRL_PIN(193, "GSXDIN"), -+ PINCTRL_PIN(194, "GSXSRESETB"), -+ PINCTRL_PIN(195, "GSXCLK"), -+ PINCTRL_PIN(196, "ADR_COMPLETE"), -+ PINCTRL_PIN(197, "NMIB"), -+ PINCTRL_PIN(198, "SMIB"), -+ PINCTRL_PIN(199, "SSATA_DEVSLP_0"), -+ PINCTRL_PIN(200, "SSATA_DEVSLP_1"), -+ PINCTRL_PIN(201, "SSATA_DEVSLP_2"), -+ PINCTRL_PIN(202, "SSATAXPCIE0_SSATAGP0"), - /* GPP_H */ -- PINCTRL_PIN(205, "SRCCLKREQB_6"), -- PINCTRL_PIN(206, "SRCCLKREQB_7"), -- PINCTRL_PIN(207, "SRCCLKREQB_8"), -- PINCTRL_PIN(208, "SRCCLKREQB_9"), -- PINCTRL_PIN(209, "SRCCLKREQB_10"), -- PINCTRL_PIN(210, "SRCCLKREQB_11"), -- PINCTRL_PIN(211, "SRCCLKREQB_12"), -- PINCTRL_PIN(212, "SRCCLKREQB_13"), -- PINCTRL_PIN(213, "SRCCLKREQB_14"), -- PINCTRL_PIN(214, "SRCCLKREQB_15"), -- PINCTRL_PIN(215, "SML2CLK"), -- PINCTRL_PIN(216, "SML2DATA"), -- PINCTRL_PIN(217, "SML2ALERTB"), -- PINCTRL_PIN(218, "SML3CLK"), -- PINCTRL_PIN(219, "SML3DATA"), -- PINCTRL_PIN(220, "SML3ALERTB"), -- PINCTRL_PIN(221, "SML4CLK"), -- PINCTRL_PIN(222, "SML4DATA"), -- PINCTRL_PIN(223, "SML4ALERTB"), -- PINCTRL_PIN(224, "SSATAXPCIE1_SSATAGP1"), -- PINCTRL_PIN(225, "SSATAXPCIE2_SSATAGP2"), -- PINCTRL_PIN(226, "SSATAXPCIE3_SSATAGP3"), -- PINCTRL_PIN(227, "SSATAXPCIE4_SSATAGP4"), -- PINCTRL_PIN(228, "SSATAXPCIE5_SSATAGP5"), -+ PINCTRL_PIN(203, "SRCCLKREQB_6"), -+ PINCTRL_PIN(204, "SRCCLKREQB_7"), -+ PINCTRL_PIN(205, "SRCCLKREQB_8"), -+ PINCTRL_PIN(206, "SRCCLKREQB_9"), -+ PINCTRL_PIN(207, "SRCCLKREQB_10"), -+ PINCTRL_PIN(208, "SRCCLKREQB_11"), -+ PINCTRL_PIN(209, "SRCCLKREQB_12"), -+ PINCTRL_PIN(210, "SRCCLKREQB_13"), -+ PINCTRL_PIN(211, "SRCCLKREQB_14"), -+ PINCTRL_PIN(212, "SRCCLKREQB_15"), -+ PINCTRL_PIN(213, "SML2CLK"), -+ PINCTRL_PIN(214, "SML2DATA"), -+ PINCTRL_PIN(215, "SML2ALERTB"), -+ PINCTRL_PIN(216, "SML3CLK"), -+ PINCTRL_PIN(217, "SML3DATA"), -+ PINCTRL_PIN(218, "SML3ALERTB"), -+ PINCTRL_PIN(219, "SML4CLK"), -+ PINCTRL_PIN(220, "SML4DATA"), -+ PINCTRL_PIN(221, "SML4ALERTB"), -+ PINCTRL_PIN(222, "SSATAXPCIE1_SSATAGP1"), -+ PINCTRL_PIN(223, "SSATAXPCIE2_SSATAGP2"), -+ PINCTRL_PIN(224, "SSATAXPCIE3_SSATAGP3"), -+ PINCTRL_PIN(225, "SSATAXPCIE4_SSATAGP4"), -+ PINCTRL_PIN(226, "SSATAXPCIE5_SSATAGP5"), - /* GPP_L */ -+ PINCTRL_PIN(227, "GPP_L_0"), -+ PINCTRL_PIN(228, "EC_CSME_INTR_OUT"), - PINCTRL_PIN(229, "VISA2CH0_D0"), - PINCTRL_PIN(230, "VISA2CH0_D1"), - PINCTRL_PIN(231, "VISA2CH0_D2"), -diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c -index 8bba9d053d9f..aba479a1150c 100644 ---- a/drivers/pinctrl/meson/pinctrl-meson.c -+++ b/drivers/pinctrl/meson/pinctrl-meson.c -@@ -441,6 +441,7 @@ static int meson_pinconf_get_drive_strength(struct meson_pinctrl *pc, - return ret; - - meson_calc_reg_and_bit(bank, pin, REG_DS, ®, &bit); -+ bit = bit << 1; - - ret = regmap_read(pc->reg_ds, reg, &val); - if (ret) -diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c -index b8640ad41bef..ce983247c9e2 100644 ---- a/drivers/pinctrl/sh-pfc/core.c -+++ b/drivers/pinctrl/sh-pfc/core.c -@@ -29,12 +29,12 @@ - static int sh_pfc_map_resources(struct sh_pfc *pfc, - struct platform_device *pdev) - { -- unsigned int num_windows, num_irqs; - struct sh_pfc_window *windows; - unsigned int *irqs = NULL; -+ unsigned int num_windows; - struct resource *res; - unsigned int i; -- int irq; -+ int num_irqs; - - /* Count the MEM and IRQ resources. */ - for (num_windows = 0;; num_windows++) { -@@ -42,17 +42,13 @@ static int sh_pfc_map_resources(struct sh_pfc *pfc, - if (!res) - break; - } -- for (num_irqs = 0;; num_irqs++) { -- irq = platform_get_irq(pdev, num_irqs); -- if (irq == -EPROBE_DEFER) -- return irq; -- if (irq < 0) -- break; -- } -- - if (num_windows == 0) - return -EINVAL; - -+ num_irqs = platform_irq_count(pdev); -+ if (num_irqs < 0) -+ return num_irqs; -+ - /* Allocate memory windows and IRQs arrays. */ - windows = devm_kcalloc(pfc->dev, num_windows, sizeof(*windows), - GFP_KERNEL); -diff --git a/drivers/pinctrl/sh-pfc/sh_pfc.h b/drivers/pinctrl/sh-pfc/sh_pfc.h -index 835148fc0f28..cab7da130925 100644 ---- a/drivers/pinctrl/sh-pfc/sh_pfc.h -+++ b/drivers/pinctrl/sh-pfc/sh_pfc.h -@@ -422,12 +422,12 @@ extern const struct sh_pfc_soc_info shx3_pinmux_info; - /* - * Describe a pinmux configuration in which a pin is physically multiplexed - * with other pins. -- * - ipsr: IPSR field (unused, for documentation purposes only) -+ * - ipsr: IPSR field - * - fn: Function name - * - psel: Physical multiplexing selector - */ - #define PINMUX_IPSR_PHYS(ipsr, fn, psel) \ -- PINMUX_DATA(fn##_MARK, FN_##psel) -+ PINMUX_DATA(fn##_MARK, FN_##psel, FN_##ipsr) - - /* - * Describe a pinmux configuration for a single-function pin with GPIO -diff --git a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c -index e5e7f1f22813..b522ca010332 100644 ---- a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c -+++ b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c -@@ -496,7 +496,7 @@ static int ti_iodelay_dt_node_to_map(struct pinctrl_dev *pctldev, - return -EINVAL; - - rows = pinctrl_count_index_with_args(np, name); -- if (rows == -EINVAL) -+ if (rows < 0) - return rows; - - *map = devm_kzalloc(iod->dev, sizeof(**map), GFP_KERNEL); -diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c -index 9a5c9fd2dbc6..5739a9669b29 100644 ---- a/drivers/platform/mellanox/mlxbf-tmfifo.c -+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c -@@ -149,7 +149,7 @@ struct mlxbf_tmfifo_irq_info { - * @work: work struct for deferred process - * @timer: background timer - * @vring: Tx/Rx ring -- * @spin_lock: spin lock -+ * @spin_lock: Tx/Rx spin lock - * @is_ready: ready flag - */ - struct mlxbf_tmfifo { -@@ -164,7 +164,7 @@ struct mlxbf_tmfifo { - struct work_struct work; - struct timer_list timer; - struct mlxbf_tmfifo_vring *vring[2]; -- spinlock_t spin_lock; /* spin lock */ -+ spinlock_t spin_lock[2]; /* spin lock */ - bool is_ready; - }; - -@@ -525,7 +525,7 @@ static void mlxbf_tmfifo_console_tx(struct mlxbf_tmfifo *fifo, int avail) - writeq(*(u64 *)&hdr, fifo->tx_base + MLXBF_TMFIFO_TX_DATA); - - /* Use spin-lock to protect the 'cons->tx_buf'. */ -- spin_lock_irqsave(&fifo->spin_lock, flags); -+ spin_lock_irqsave(&fifo->spin_lock[0], flags); - - while (size > 0) { - addr = cons->tx_buf.buf + cons->tx_buf.tail; -@@ -552,7 +552,7 @@ static void mlxbf_tmfifo_console_tx(struct mlxbf_tmfifo *fifo, int avail) - } - } - -- spin_unlock_irqrestore(&fifo->spin_lock, flags); -+ spin_unlock_irqrestore(&fifo->spin_lock[0], flags); - } - - /* Rx/Tx one word in the descriptor buffer. */ -@@ -731,9 +731,9 @@ static bool mlxbf_tmfifo_rxtx_one_desc(struct mlxbf_tmfifo_vring *vring, - fifo->vring[is_rx] = NULL; - - /* Notify upper layer that packet is done. */ -- spin_lock_irqsave(&fifo->spin_lock, flags); -+ spin_lock_irqsave(&fifo->spin_lock[is_rx], flags); - vring_interrupt(0, vring->vq); -- spin_unlock_irqrestore(&fifo->spin_lock, flags); -+ spin_unlock_irqrestore(&fifo->spin_lock[is_rx], flags); - } - - mlxbf_tmfifo_desc_done: -@@ -852,10 +852,10 @@ static bool mlxbf_tmfifo_virtio_notify(struct virtqueue *vq) - * worker handler. - */ - if (vring->vdev_id == VIRTIO_ID_CONSOLE) { -- spin_lock_irqsave(&fifo->spin_lock, flags); -+ spin_lock_irqsave(&fifo->spin_lock[0], flags); - tm_vdev = fifo->vdev[VIRTIO_ID_CONSOLE]; - mlxbf_tmfifo_console_output(tm_vdev, vring); -- spin_unlock_irqrestore(&fifo->spin_lock, flags); -+ spin_unlock_irqrestore(&fifo->spin_lock[0], flags); - } else if (test_and_set_bit(MLXBF_TM_TX_LWM_IRQ, - &fifo->pend_events)) { - return true; -@@ -1189,7 +1189,8 @@ static int mlxbf_tmfifo_probe(struct platform_device *pdev) - if (!fifo) - return -ENOMEM; - -- spin_lock_init(&fifo->spin_lock); -+ spin_lock_init(&fifo->spin_lock[0]); -+ spin_lock_init(&fifo->spin_lock[1]); - INIT_WORK(&fifo->work, mlxbf_tmfifo_work_handler); - mutex_init(&fifo->lock); - -diff --git a/drivers/platform/mips/cpu_hwmon.c b/drivers/platform/mips/cpu_hwmon.c -index a7f184bb47e0..3d29a11c1d6b 100644 ---- a/drivers/platform/mips/cpu_hwmon.c -+++ b/drivers/platform/mips/cpu_hwmon.c -@@ -161,7 +161,7 @@ static int __init loongson_hwmon_init(void) - - cpu_hwmon_dev = hwmon_device_register(NULL); - if (IS_ERR(cpu_hwmon_dev)) { -- ret = -ENOMEM; -+ ret = PTR_ERR(cpu_hwmon_dev); - pr_err("hwmon_device_register fail!\n"); - goto fail_hwmon_device_register; - } -diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 821b08e01635..982f0cc8270c 100644 ---- a/drivers/platform/x86/asus-wmi.c -+++ b/drivers/platform/x86/asus-wmi.c -@@ -512,13 +512,7 @@ static void kbd_led_update(struct asus_wmi *asus) - { - int ctrl_param = 0; - -- /* -- * bits 0-2: level -- * bit 7: light on/off -- */ -- if (asus->kbd_led_wk > 0) -- ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F); -- -+ ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F); - asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL); - } - -diff --git a/drivers/platform/x86/gpd-pocket-fan.c b/drivers/platform/x86/gpd-pocket-fan.c -index be85ed966bf3..73eb1572b966 100644 ---- a/drivers/platform/x86/gpd-pocket-fan.c -+++ b/drivers/platform/x86/gpd-pocket-fan.c -@@ -16,17 +16,27 @@ - - #define MAX_SPEED 3 - --static int temp_limits[3] = { 55000, 60000, 65000 }; -+#define TEMP_LIMIT0_DEFAULT 55000 -+#define TEMP_LIMIT1_DEFAULT 60000 -+#define TEMP_LIMIT2_DEFAULT 65000 -+ -+#define HYSTERESIS_DEFAULT 3000 -+ -+#define SPEED_ON_AC_DEFAULT 2 -+ -+static int temp_limits[3] = { -+ TEMP_LIMIT0_DEFAULT, TEMP_LIMIT1_DEFAULT, TEMP_LIMIT2_DEFAULT, -+}; - module_param_array(temp_limits, int, NULL, 0444); - MODULE_PARM_DESC(temp_limits, - "Millicelsius values above which the fan speed increases"); - --static int hysteresis = 3000; -+static int hysteresis = HYSTERESIS_DEFAULT; - module_param(hysteresis, int, 0444); - MODULE_PARM_DESC(hysteresis, - "Hysteresis in millicelsius before lowering the fan speed"); - --static int speed_on_ac = 2; -+static int speed_on_ac = SPEED_ON_AC_DEFAULT; - module_param(speed_on_ac, int, 0444); - MODULE_PARM_DESC(speed_on_ac, - "minimum fan speed to allow when system is powered by AC"); -@@ -120,18 +130,21 @@ static int gpd_pocket_fan_probe(struct platform_device *pdev) - if (temp_limits[i] < 40000 || temp_limits[i] > 70000) { - dev_err(&pdev->dev, "Invalid temp-limit %d (must be between 40000 and 70000)\n", - temp_limits[i]); -- return -EINVAL; -+ temp_limits[0] = TEMP_LIMIT0_DEFAULT; -+ temp_limits[1] = TEMP_LIMIT1_DEFAULT; -+ temp_limits[2] = TEMP_LIMIT2_DEFAULT; -+ break; - } - } - if (hysteresis < 1000 || hysteresis > 10000) { - dev_err(&pdev->dev, "Invalid hysteresis %d (must be between 1000 and 10000)\n", - hysteresis); -- return -EINVAL; -+ hysteresis = HYSTERESIS_DEFAULT; - } - if (speed_on_ac < 0 || speed_on_ac > MAX_SPEED) { - dev_err(&pdev->dev, "Invalid speed_on_ac %d (must be between 0 and 3)\n", - speed_on_ac); -- return -EINVAL; -+ speed_on_ac = SPEED_ON_AC_DEFAULT; - } - - fan = devm_kzalloc(&pdev->dev, sizeof(*fan), GFP_KERNEL); -diff --git a/drivers/reset/reset-brcmstb.c b/drivers/reset/reset-brcmstb.c -index a608f445dad6..f213264c8567 100644 ---- a/drivers/reset/reset-brcmstb.c -+++ b/drivers/reset/reset-brcmstb.c -@@ -91,12 +91,6 @@ static int brcmstb_reset_probe(struct platform_device *pdev) - return -ENOMEM; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- if (!IS_ALIGNED(res->start, SW_INIT_BANK_SIZE) || -- !IS_ALIGNED(resource_size(res), SW_INIT_BANK_SIZE)) { -- dev_err(kdev, "incorrect register range\n"); -- return -EINVAL; -- } -- - priv->base = devm_ioremap_resource(kdev, res); - if (IS_ERR(priv->base)) - return PTR_ERR(priv->base); -diff --git a/drivers/rtc/rtc-bd70528.c b/drivers/rtc/rtc-bd70528.c -index 7744333b0f40..ddfef4d43bab 100644 ---- a/drivers/rtc/rtc-bd70528.c -+++ b/drivers/rtc/rtc-bd70528.c -@@ -491,3 +491,4 @@ module_platform_driver(bd70528_rtc); - MODULE_AUTHOR("Matti Vaittinen "); - MODULE_DESCRIPTION("BD70528 RTC driver"); - MODULE_LICENSE("GPL"); -+MODULE_ALIAS("platofrm:bd70528-rtc"); -diff --git a/drivers/rtc/rtc-brcmstb-waketimer.c b/drivers/rtc/rtc-brcmstb-waketimer.c -index 3e9800f9878a..82d2ab0b3e9c 100644 ---- a/drivers/rtc/rtc-brcmstb-waketimer.c -+++ b/drivers/rtc/rtc-brcmstb-waketimer.c -@@ -277,6 +277,7 @@ static int brcmstb_waketmr_remove(struct platform_device *pdev) - struct brcmstb_waketmr *timer = dev_get_drvdata(&pdev->dev); - - unregister_reboot_notifier(&timer->reboot_notifier); -+ clk_disable_unprepare(timer->clk); - - return 0; - } -diff --git a/drivers/rtc/rtc-msm6242.c b/drivers/rtc/rtc-msm6242.c -index 1c2d3c4a4963..b1f2bedee77e 100644 ---- a/drivers/rtc/rtc-msm6242.c -+++ b/drivers/rtc/rtc-msm6242.c -@@ -133,7 +133,8 @@ static int msm6242_read_time(struct device *dev, struct rtc_time *tm) - msm6242_read(priv, MSM6242_SECOND1); - tm->tm_min = msm6242_read(priv, MSM6242_MINUTE10) * 10 + - msm6242_read(priv, MSM6242_MINUTE1); -- tm->tm_hour = (msm6242_read(priv, MSM6242_HOUR10 & 3)) * 10 + -+ tm->tm_hour = (msm6242_read(priv, MSM6242_HOUR10) & -+ MSM6242_HOUR10_HR_MASK) * 10 + - msm6242_read(priv, MSM6242_HOUR1); - tm->tm_mday = msm6242_read(priv, MSM6242_DAY10) * 10 + - msm6242_read(priv, MSM6242_DAY1); -diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c -index 704229eb0cac..b216bdcba0da 100644 ---- a/drivers/rtc/rtc-mt6397.c -+++ b/drivers/rtc/rtc-mt6397.c -@@ -47,6 +47,14 @@ - - #define RTC_AL_SEC 0x0018 - -+#define RTC_AL_SEC_MASK 0x003f -+#define RTC_AL_MIN_MASK 0x003f -+#define RTC_AL_HOU_MASK 0x001f -+#define RTC_AL_DOM_MASK 0x001f -+#define RTC_AL_DOW_MASK 0x0007 -+#define RTC_AL_MTH_MASK 0x000f -+#define RTC_AL_YEA_MASK 0x007f -+ - #define RTC_PDN2 0x002e - #define RTC_PDN2_PWRON_ALARM BIT(4) - -@@ -103,7 +111,7 @@ static irqreturn_t mtk_rtc_irq_handler_thread(int irq, void *data) - irqen = irqsta & ~RTC_IRQ_EN_AL; - mutex_lock(&rtc->lock); - if (regmap_write(rtc->regmap, rtc->addr_base + RTC_IRQ_EN, -- irqen) < 0) -+ irqen) == 0) - mtk_rtc_write_trigger(rtc); - mutex_unlock(&rtc->lock); - -@@ -225,12 +233,12 @@ static int mtk_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) - alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM); - mutex_unlock(&rtc->lock); - -- tm->tm_sec = data[RTC_OFFSET_SEC]; -- tm->tm_min = data[RTC_OFFSET_MIN]; -- tm->tm_hour = data[RTC_OFFSET_HOUR]; -- tm->tm_mday = data[RTC_OFFSET_DOM]; -- tm->tm_mon = data[RTC_OFFSET_MTH]; -- tm->tm_year = data[RTC_OFFSET_YEAR]; -+ tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_AL_SEC_MASK; -+ tm->tm_min = data[RTC_OFFSET_MIN] & RTC_AL_MIN_MASK; -+ tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_AL_HOU_MASK; -+ tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_AL_DOM_MASK; -+ tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_AL_MTH_MASK; -+ tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_AL_YEA_MASK; - - tm->tm_year += RTC_MIN_YEAR_OFFSET; - tm->tm_mon--; -@@ -251,14 +259,25 @@ static int mtk_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) - tm->tm_year -= RTC_MIN_YEAR_OFFSET; - tm->tm_mon++; - -- data[RTC_OFFSET_SEC] = tm->tm_sec; -- data[RTC_OFFSET_MIN] = tm->tm_min; -- data[RTC_OFFSET_HOUR] = tm->tm_hour; -- data[RTC_OFFSET_DOM] = tm->tm_mday; -- data[RTC_OFFSET_MTH] = tm->tm_mon; -- data[RTC_OFFSET_YEAR] = tm->tm_year; -- - mutex_lock(&rtc->lock); -+ ret = regmap_bulk_read(rtc->regmap, rtc->addr_base + RTC_AL_SEC, -+ data, RTC_OFFSET_COUNT); -+ if (ret < 0) -+ goto exit; -+ -+ data[RTC_OFFSET_SEC] = ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) | -+ (tm->tm_sec & RTC_AL_SEC_MASK)); -+ data[RTC_OFFSET_MIN] = ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) | -+ (tm->tm_min & RTC_AL_MIN_MASK)); -+ data[RTC_OFFSET_HOUR] = ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) | -+ (tm->tm_hour & RTC_AL_HOU_MASK)); -+ data[RTC_OFFSET_DOM] = ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) | -+ (tm->tm_mday & RTC_AL_DOM_MASK)); -+ data[RTC_OFFSET_MTH] = ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) | -+ (tm->tm_mon & RTC_AL_MTH_MASK)); -+ data[RTC_OFFSET_YEAR] = ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) | -+ (tm->tm_year & RTC_AL_YEA_MASK)); -+ - if (alm->enabled) { - ret = regmap_bulk_write(rtc->regmap, - rtc->addr_base + RTC_AL_SEC, -diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c -index 9df47421d69c..5be4d800e4ba 100644 ---- a/drivers/s390/net/qeth_core_main.c -+++ b/drivers/s390/net/qeth_core_main.c -@@ -2451,50 +2451,46 @@ static int qeth_mpc_initialize(struct qeth_card *card) - rc = qeth_cm_enable(card); - if (rc) { - QETH_CARD_TEXT_(card, 2, "2err%d", rc); -- goto out_qdio; -+ return rc; - } - rc = qeth_cm_setup(card); - if (rc) { - QETH_CARD_TEXT_(card, 2, "3err%d", rc); -- goto out_qdio; -+ return rc; - } - rc = qeth_ulp_enable(card); - if (rc) { - QETH_CARD_TEXT_(card, 2, "4err%d", rc); -- goto out_qdio; -+ return rc; - } - rc = qeth_ulp_setup(card); - if (rc) { - QETH_CARD_TEXT_(card, 2, "5err%d", rc); -- goto out_qdio; -+ return rc; - } - rc = qeth_alloc_qdio_queues(card); - if (rc) { - QETH_CARD_TEXT_(card, 2, "5err%d", rc); -- goto out_qdio; -+ return rc; - } - rc = qeth_qdio_establish(card); - if (rc) { - QETH_CARD_TEXT_(card, 2, "6err%d", rc); - qeth_free_qdio_queues(card); -- goto out_qdio; -+ return rc; - } - rc = qeth_qdio_activate(card); - if (rc) { - QETH_CARD_TEXT_(card, 2, "7err%d", rc); -- goto out_qdio; -+ return rc; - } - rc = qeth_dm_act(card); - if (rc) { - QETH_CARD_TEXT_(card, 2, "8err%d", rc); -- goto out_qdio; -+ return rc; - } - - return 0; --out_qdio: -- qeth_qdio_clear_card(card, !IS_IQD(card)); -- qdio_free(CARD_DDEV(card)); -- return rc; - } - - void qeth_print_status_message(struct qeth_card *card) -@@ -3382,11 +3378,6 @@ int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq) - goto out; - } - -- if (card->state != CARD_STATE_DOWN) { -- rc = -1; -- goto out; -- } -- - qeth_free_qdio_queues(card); - card->options.cq = cq; - rc = 0; -@@ -4972,10 +4963,8 @@ retriable: - } - if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { - rc = qeth_query_setdiagass(card); -- if (rc < 0) { -+ if (rc) - QETH_CARD_TEXT_(card, 2, "8err%d", rc); -- goto out; -- } - } - return 0; - out: -diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c -index 8b7d911dccd8..11e3292c0adf 100644 ---- a/drivers/s390/net/qeth_l2_main.c -+++ b/drivers/s390/net/qeth_l2_main.c -@@ -287,12 +287,12 @@ static void qeth_l2_stop_card(struct qeth_card *card) - card->state = CARD_STATE_HARDSETUP; - } - if (card->state == CARD_STATE_HARDSETUP) { -- qeth_qdio_clear_card(card, 0); - qeth_drain_output_queues(card); - qeth_clear_working_pool_list(card); - card->state = CARD_STATE_DOWN; - } - -+ qeth_qdio_clear_card(card, 0); - flush_workqueue(card->event_wq); - card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; - card->info.promisc_mode = 0; -@@ -1983,8 +1983,7 @@ int qeth_l2_vnicc_get_timeout(struct qeth_card *card, u32 *timeout) - /* check if VNICC is currently enabled */ - bool qeth_l2_vnicc_is_in_use(struct qeth_card *card) - { -- /* if everything is turned off, VNICC is not active */ -- if (!card->options.vnicc.cur_chars) -+ if (!card->options.vnicc.sup_chars) - return false; - /* default values are only OK if rx_bcast was not enabled by user - * or the card is offline. -@@ -2071,8 +2070,9 @@ static void qeth_l2_vnicc_init(struct qeth_card *card) - /* enforce assumed default values and recover settings, if changed */ - error |= qeth_l2_vnicc_recover_timeout(card, QETH_VNICC_LEARNING, - timeout); -- chars_tmp = card->options.vnicc.wanted_chars ^ QETH_VNICC_DEFAULT; -- chars_tmp |= QETH_VNICC_BRIDGE_INVISIBLE; -+ /* Change chars, if necessary */ -+ chars_tmp = card->options.vnicc.wanted_chars ^ -+ card->options.vnicc.cur_chars; - chars_len = sizeof(card->options.vnicc.wanted_chars) * BITS_PER_BYTE; - for_each_set_bit(i, &chars_tmp, chars_len) { - vnicc = BIT(i); -diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c -index 32385327539b..5152970a9aa4 100644 ---- a/drivers/s390/net/qeth_l3_main.c -+++ b/drivers/s390/net/qeth_l3_main.c -@@ -1426,12 +1426,12 @@ static void qeth_l3_stop_card(struct qeth_card *card) - card->state = CARD_STATE_HARDSETUP; - } - if (card->state == CARD_STATE_HARDSETUP) { -- qeth_qdio_clear_card(card, 0); - qeth_drain_output_queues(card); - qeth_clear_working_pool_list(card); - card->state = CARD_STATE_DOWN; - } - -+ qeth_qdio_clear_card(card, 0); - flush_workqueue(card->event_wq); - card->info.promisc_mode = 0; - } -diff --git a/drivers/s390/net/qeth_l3_sys.c b/drivers/s390/net/qeth_l3_sys.c -index 2f73b33c9347..333fd4619dc6 100644 ---- a/drivers/s390/net/qeth_l3_sys.c -+++ b/drivers/s390/net/qeth_l3_sys.c -@@ -270,24 +270,36 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) - { - struct qeth_card *card = dev_get_drvdata(dev); -+ int rc = 0; - char *tmp; -- int rc; - - if (!card) - return -EINVAL; - - if (!IS_IQD(card)) - return -EPERM; -- if (card->state != CARD_STATE_DOWN) -- return -EPERM; -- if (card->options.sniffer) -- return -EPERM; -- if (card->options.cq == QETH_CQ_NOTAVAILABLE) -- return -EPERM; -+ -+ mutex_lock(&card->conf_mutex); -+ if (card->state != CARD_STATE_DOWN) { -+ rc = -EPERM; -+ goto out; -+ } -+ -+ if (card->options.sniffer) { -+ rc = -EPERM; -+ goto out; -+ } -+ -+ if (card->options.cq == QETH_CQ_NOTAVAILABLE) { -+ rc = -EPERM; -+ goto out; -+ } - - tmp = strsep((char **)&buf, "\n"); -- if (strlen(tmp) > 8) -- return -EINVAL; -+ if (strlen(tmp) > 8) { -+ rc = -EINVAL; -+ goto out; -+ } - - if (card->options.hsuid[0]) - /* delete old ip address */ -@@ -298,11 +310,13 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev, - card->options.hsuid[0] = '\0'; - memcpy(card->dev->perm_addr, card->options.hsuid, 9); - qeth_configure_cq(card, QETH_CQ_DISABLED); -- return count; -+ goto out; - } - -- if (qeth_configure_cq(card, QETH_CQ_ENABLED)) -- return -EPERM; -+ if (qeth_configure_cq(card, QETH_CQ_ENABLED)) { -+ rc = -EPERM; -+ goto out; -+ } - - snprintf(card->options.hsuid, sizeof(card->options.hsuid), - "%-8s", tmp); -@@ -311,6 +325,8 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev, - - rc = qeth_l3_modify_hsuid(card, true); - -+out: -+ mutex_unlock(&card->conf_mutex); - return rc ? rc : count; - } - -diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c -index 3e17af8aedeb..2cd2761bd249 100644 ---- a/drivers/scsi/cxgbi/libcxgbi.c -+++ b/drivers/scsi/cxgbi/libcxgbi.c -@@ -121,7 +121,8 @@ static inline void cxgbi_device_destroy(struct cxgbi_device *cdev) - "cdev 0x%p, p# %u.\n", cdev, cdev->nports); - cxgbi_hbas_remove(cdev); - cxgbi_device_portmap_cleanup(cdev); -- cxgbi_ppm_release(cdev->cdev2ppm(cdev)); -+ if (cdev->cdev2ppm) -+ cxgbi_ppm_release(cdev->cdev2ppm(cdev)); - if (cdev->pmap.max_connect) - cxgbi_free_big_mem(cdev->pmap.port_csk); - kfree(cdev); -diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c -index fea3cb6a090b..752b71cfbe12 100644 ---- a/drivers/scsi/mpt3sas/mpt3sas_base.c -+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c -@@ -5234,7 +5234,6 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc) - &ct->chain_buffer_dma); - if (!ct->chain_buffer) { - ioc_err(ioc, "chain_lookup: pci_pool_alloc failed\n"); -- _base_release_memory_pools(ioc); - goto out; - } - } -diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c -index ebb40160539f..ac2e88ec1190 100644 ---- a/drivers/scsi/sd.c -+++ b/drivers/scsi/sd.c -@@ -1694,20 +1694,30 @@ static void sd_rescan(struct device *dev) - static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode, - unsigned int cmd, unsigned long arg) - { -- struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device; -+ struct gendisk *disk = bdev->bd_disk; -+ struct scsi_disk *sdkp = scsi_disk(disk); -+ struct scsi_device *sdev = sdkp->device; -+ void __user *p = compat_ptr(arg); - int error; - -+ error = scsi_verify_blk_ioctl(bdev, cmd); -+ if (error < 0) -+ return error; -+ - error = scsi_ioctl_block_when_processing_errors(sdev, cmd, - (mode & FMODE_NDELAY) != 0); - if (error) - return error; -+ -+ if (is_sed_ioctl(cmd)) -+ return sed_ioctl(sdkp->opal_dev, cmd, p); - - /* - * Let the static ioctl translation table take care of it. - */ - if (!sdev->host->hostt->compat_ioctl) - return -ENOIOCTLCMD; -- return sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg); -+ return sdev->host->hostt->compat_ioctl(sdev, cmd, p); - } - #endif - -@@ -2192,8 +2202,10 @@ static int sd_read_protection_type(struct scsi_disk *sdkp, unsigned char *buffer - u8 type; - int ret = 0; - -- if (scsi_device_protection(sdp) == 0 || (buffer[12] & 1) == 0) -+ if (scsi_device_protection(sdp) == 0 || (buffer[12] & 1) == 0) { -+ sdkp->protection_type = 0; - return ret; -+ } - - type = ((buffer[12] >> 1) & 7) + 1; /* P_TYPE 0 = Type 1 */ - -diff --git a/drivers/scsi/ufs/ufs_bsg.c b/drivers/scsi/ufs/ufs_bsg.c -index dc2f6d2b46ed..d2197a31abe5 100644 ---- a/drivers/scsi/ufs/ufs_bsg.c -+++ b/drivers/scsi/ufs/ufs_bsg.c -@@ -202,7 +202,7 @@ int ufs_bsg_probe(struct ufs_hba *hba) - bsg_dev->parent = get_device(parent); - bsg_dev->release = ufs_bsg_node_release; - -- dev_set_name(bsg_dev, "ufs-bsg"); -+ dev_set_name(bsg_dev, "ufs-bsg%u", shost->host_no); - - ret = device_add(bsg_dev); - if (ret) -diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c -index ba8eff41b746..abbc1582f457 100644 ---- a/drivers/spi/spi-atmel.c -+++ b/drivers/spi/spi-atmel.c -@@ -302,7 +302,6 @@ struct atmel_spi { - bool use_cs_gpios; - - bool keep_cs; -- bool cs_active; - - u32 fifo_size; - }; -@@ -1374,11 +1373,9 @@ static int atmel_spi_one_transfer(struct spi_master *master, - &msg->transfers)) { - as->keep_cs = true; - } else { -- as->cs_active = !as->cs_active; -- if (as->cs_active) -- cs_activate(as, msg->spi); -- else -- cs_deactivate(as, msg->spi); -+ cs_deactivate(as, msg->spi); -+ udelay(10); -+ cs_activate(as, msg->spi); - } - } - -@@ -1401,7 +1398,6 @@ static int atmel_spi_transfer_one_message(struct spi_master *master, - atmel_spi_lock(as); - cs_activate(as, spi); - -- as->cs_active = true; - as->keep_cs = false; - - msg->status = 0; -diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c -index d08e9324140e..3528ed5eea9b 100644 ---- a/drivers/spi/spi-fsl-lpspi.c -+++ b/drivers/spi/spi-fsl-lpspi.c -@@ -938,7 +938,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev) - ret = pm_runtime_get_sync(fsl_lpspi->dev); - if (ret < 0) { - dev_err(fsl_lpspi->dev, "failed to enable clock\n"); -- return ret; -+ goto out_controller_put; - } - - temp = readl(fsl_lpspi->base + IMX7ULP_PARAM); -diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c -index ae95ec0bc964..9f92165fe09f 100644 ---- a/drivers/spi/spi-pxa2xx.c -+++ b/drivers/spi/spi-pxa2xx.c -@@ -1612,6 +1612,11 @@ static int pxa2xx_spi_fw_translate_cs(struct spi_controller *controller, - return cs; - } - -+static size_t pxa2xx_spi_max_dma_transfer_size(struct spi_device *spi) -+{ -+ return MAX_DMA_LEN; -+} -+ - static int pxa2xx_spi_probe(struct platform_device *pdev) - { - struct device *dev = &pdev->dev; -@@ -1717,6 +1722,8 @@ static int pxa2xx_spi_probe(struct platform_device *pdev) - } else { - controller->can_dma = pxa2xx_spi_can_dma; - controller->max_dma_len = MAX_DMA_LEN; -+ controller->max_transfer_size = -+ pxa2xx_spi_max_dma_transfer_size; - } - } - -diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c -index 15f5723d9f95..7222c7689c3c 100644 ---- a/drivers/spi/spi-rspi.c -+++ b/drivers/spi/spi-rspi.c -@@ -1257,9 +1257,9 @@ static int rspi_probe(struct platform_device *pdev) - ctlr->flags = ops->flags; - ctlr->dev.of_node = pdev->dev.of_node; - -- ret = platform_get_irq_byname(pdev, "rx"); -+ ret = platform_get_irq_byname_optional(pdev, "rx"); - if (ret < 0) { -- ret = platform_get_irq_byname(pdev, "mux"); -+ ret = platform_get_irq_byname_optional(pdev, "mux"); - if (ret < 0) - ret = platform_get_irq(pdev, 0); - if (ret >= 0) -@@ -1270,10 +1270,6 @@ static int rspi_probe(struct platform_device *pdev) - if (ret >= 0) - rspi->tx_irq = ret; - } -- if (ret < 0) { -- dev_err(&pdev->dev, "platform_get_irq error\n"); -- goto error2; -- } - - if (rspi->rx_irq == rspi->tx_irq) { - /* Single multiplexed interrupt */ -diff --git a/drivers/spi/spi-sprd.c b/drivers/spi/spi-sprd.c -index 8c9021b7f7a9..fa597e27be17 100644 ---- a/drivers/spi/spi-sprd.c -+++ b/drivers/spi/spi-sprd.c -@@ -674,7 +674,7 @@ static void sprd_spi_init_hw(struct sprd_spi *ss, struct spi_transfer *t) - u16 word_delay, interval; - u32 val; - -- val = readl_relaxed(ss->base + SPRD_SPI_CTL7); -+ val = readl_relaxed(ss->base + SPRD_SPI_CTL0); - val &= ~(SPRD_SPI_SCK_REV | SPRD_SPI_NG_TX | SPRD_SPI_NG_RX); - /* Set default chip selection, clock phase and clock polarity */ - val |= ss->hw_mode & SPI_CPHA ? SPRD_SPI_NG_RX : SPRD_SPI_NG_TX; -diff --git a/drivers/staging/media/hantro/hantro_g1_h264_dec.c b/drivers/staging/media/hantro/hantro_g1_h264_dec.c -index 636bf972adcf..5f29b7a836db 100644 ---- a/drivers/staging/media/hantro/hantro_g1_h264_dec.c -+++ b/drivers/staging/media/hantro/hantro_g1_h264_dec.c -@@ -63,7 +63,7 @@ static void set_params(struct hantro_ctx *ctx) - /* always use the matrix sent from userspace */ - reg |= G1_REG_DEC_CTRL2_TYPE1_QUANT_E; - -- if (slices[0].flags & V4L2_H264_SLICE_FLAG_FIELD_PIC) -+ if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)) - reg |= G1_REG_DEC_CTRL2_FIELDPIC_FLAG_E; - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL2); - -diff --git a/drivers/staging/media/hantro/hantro_h264.c b/drivers/staging/media/hantro/hantro_h264.c -index 0d758e0c0f99..a9c134204351 100644 ---- a/drivers/staging/media/hantro/hantro_h264.c -+++ b/drivers/staging/media/hantro/hantro_h264.c -@@ -20,7 +20,7 @@ - /* Size with u32 units. */ - #define CABAC_INIT_BUFFER_SIZE (460 * 2) - #define POC_BUFFER_SIZE 34 --#define SCALING_LIST_SIZE (6 * 16 + 6 * 64) -+#define SCALING_LIST_SIZE (6 * 16 + 2 * 64) - - #define POC_CMP(p0, p1) ((p0) < (p1) ? -1 : 1) - -@@ -194,23 +194,6 @@ static const u32 h264_cabac_table[] = { - 0x1f0c2517, 0x1f261440 - }; - --/* -- * NOTE: The scaling lists are in zig-zag order, apply inverse scanning process -- * to get the values in matrix order. In addition, the hardware requires bytes -- * swapped within each subsequent 4 bytes. Both arrays below include both -- * transformations. -- */ --static const u32 zig_zag_4x4[] = { -- 3, 2, 7, 11, 6, 1, 0, 5, 10, 15, 14, 9, 4, 8, 13, 12 --}; -- --static const u32 zig_zag_8x8[] = { -- 3, 2, 11, 19, 10, 1, 0, 9, 18, 27, 35, 26, 17, 8, 7, 6, -- 15, 16, 25, 34, 43, 51, 42, 33, 24, 23, 14, 5, 4, 13, 22, 31, -- 32, 41, 50, 59, 58, 49, 40, 39, 30, 21, 12, 20, 29, 38, 47, 48, -- 57, 56, 55, 46, 37, 28, 36, 45, 54, 63, 62, 53, 44, 52, 61, 60 --}; -- - static void - reorder_scaling_list(struct hantro_ctx *ctx) - { -@@ -218,33 +201,23 @@ reorder_scaling_list(struct hantro_ctx *ctx) - const struct v4l2_ctrl_h264_scaling_matrix *scaling = ctrls->scaling; - const size_t num_list_4x4 = ARRAY_SIZE(scaling->scaling_list_4x4); - const size_t list_len_4x4 = ARRAY_SIZE(scaling->scaling_list_4x4[0]); -- const size_t num_list_8x8 = ARRAY_SIZE(scaling->scaling_list_8x8); - const size_t list_len_8x8 = ARRAY_SIZE(scaling->scaling_list_8x8[0]); - struct hantro_h264_dec_priv_tbl *tbl = ctx->h264_dec.priv.cpu; -- u8 *dst = tbl->scaling_list; -- const u8 *src; -+ u32 *dst = (u32 *)tbl->scaling_list; -+ const u32 *src; - int i, j; - -- BUILD_BUG_ON(ARRAY_SIZE(zig_zag_4x4) != list_len_4x4); -- BUILD_BUG_ON(ARRAY_SIZE(zig_zag_8x8) != list_len_8x8); -- BUILD_BUG_ON(ARRAY_SIZE(tbl->scaling_list) != -- num_list_4x4 * list_len_4x4 + -- num_list_8x8 * list_len_8x8); -- -- src = &scaling->scaling_list_4x4[0][0]; -- for (i = 0; i < num_list_4x4; ++i) { -- for (j = 0; j < list_len_4x4; ++j) -- dst[zig_zag_4x4[j]] = src[j]; -- src += list_len_4x4; -- dst += list_len_4x4; -+ for (i = 0; i < num_list_4x4; i++) { -+ src = (u32 *)&scaling->scaling_list_4x4[i]; -+ for (j = 0; j < list_len_4x4 / 4; j++) -+ *dst++ = swab32(src[j]); - } - -- src = &scaling->scaling_list_8x8[0][0]; -- for (i = 0; i < num_list_8x8; ++i) { -- for (j = 0; j < list_len_8x8; ++j) -- dst[zig_zag_8x8[j]] = src[j]; -- src += list_len_8x8; -- dst += list_len_8x8; -+ /* Only Intra/Inter Y lists */ -+ for (i = 0; i < 2; i++) { -+ src = (u32 *)&scaling->scaling_list_8x8[i]; -+ for (j = 0; j < list_len_8x8 / 4; j++) -+ *dst++ = swab32(src[j]); - } - } - -@@ -271,6 +244,7 @@ struct hantro_h264_reflist_builder { - const struct v4l2_h264_dpb_entry *dpb; - s32 pocs[HANTRO_H264_DPB_SIZE]; - u8 unordered_reflist[HANTRO_H264_DPB_SIZE]; -+ int frame_nums[HANTRO_H264_DPB_SIZE]; - s32 curpoc; - u8 num_valid; - }; -@@ -294,13 +268,20 @@ static void - init_reflist_builder(struct hantro_ctx *ctx, - struct hantro_h264_reflist_builder *b) - { -+ const struct v4l2_ctrl_h264_slice_params *slice_params; - const struct v4l2_ctrl_h264_decode_params *dec_param; -+ const struct v4l2_ctrl_h264_sps *sps; - struct vb2_v4l2_buffer *buf = hantro_get_dst_buf(ctx); - const struct v4l2_h264_dpb_entry *dpb = ctx->h264_dec.dpb; - struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; -+ int cur_frame_num, max_frame_num; - unsigned int i; - - dec_param = ctx->h264_dec.ctrls.decode; -+ slice_params = &ctx->h264_dec.ctrls.slices[0]; -+ sps = ctx->h264_dec.ctrls.sps; -+ max_frame_num = 1 << (sps->log2_max_frame_num_minus4 + 4); -+ cur_frame_num = slice_params->frame_num; - - memset(b, 0, sizeof(*b)); - b->dpb = dpb; -@@ -318,6 +299,18 @@ init_reflist_builder(struct hantro_ctx *ctx, - continue; - - buf = to_vb2_v4l2_buffer(vb2_get_buffer(cap_q, buf_idx)); -+ -+ /* -+ * Handle frame_num wraparound as described in section -+ * '8.2.4.1 Decoding process for picture numbers' of the spec. -+ * TODO: This logic will have to be adjusted when we start -+ * supporting interlaced content. -+ */ -+ if (dpb[i].frame_num > cur_frame_num) -+ b->frame_nums[i] = (int)dpb[i].frame_num - max_frame_num; -+ else -+ b->frame_nums[i] = dpb[i].frame_num; -+ - b->pocs[i] = get_poc(buf->field, dpb[i].top_field_order_cnt, - dpb[i].bottom_field_order_cnt); - b->unordered_reflist[b->num_valid] = i; -@@ -353,7 +346,7 @@ static int p_ref_list_cmp(const void *ptra, const void *ptrb, const void *data) - * ascending order. - */ - if (!(a->flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)) -- return b->frame_num - a->frame_num; -+ return builder->frame_nums[idxb] - builder->frame_nums[idxa]; - - return a->pic_num - b->pic_num; - } -diff --git a/drivers/staging/media/ipu3/include/intel-ipu3.h b/drivers/staging/media/ipu3/include/intel-ipu3.h -index c7cd27efac8a..0b1cb9f9cbd1 100644 ---- a/drivers/staging/media/ipu3/include/intel-ipu3.h -+++ b/drivers/staging/media/ipu3/include/intel-ipu3.h -@@ -449,7 +449,7 @@ struct ipu3_uapi_awb_fr_config_s { - __u16 reserved1; - __u32 bayer_sign; - __u8 bayer_nf; -- __u8 reserved2[3]; -+ __u8 reserved2[7]; - } __attribute__((aligned(32))) __packed; - - /** -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c -index 08c6c9c410cc..c07526c12629 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c -@@ -244,8 +244,8 @@ static void cedrus_write_scaling_lists(struct cedrus_ctx *ctx, - sizeof(scaling->scaling_list_8x8[0])); - - cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_8x8_1, -- scaling->scaling_list_8x8[3], -- sizeof(scaling->scaling_list_8x8[3])); -+ scaling->scaling_list_8x8[1], -+ sizeof(scaling->scaling_list_8x8[1])); - - cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_4x4, - scaling->scaling_list_4x4, -diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c -index 6949ea8bc387..51ffd5c002de 100644 ---- a/drivers/target/target_core_iblock.c -+++ b/drivers/target/target_core_iblock.c -@@ -646,7 +646,9 @@ iblock_alloc_bip(struct se_cmd *cmd, struct bio *bio, - } - - bip->bip_iter.bi_size = bio_integrity_bytes(bi, bio_sectors(bio)); -- bip_set_seed(bip, bio->bi_iter.bi_sector); -+ /* virtual start sector must be in integrity interval units */ -+ bip_set_seed(bip, bio->bi_iter.bi_sector >> -+ (bi->interval_exp - SECTOR_SHIFT)); - - pr_debug("IBLOCK BIP Size: %u Sector: %llu\n", bip->bip_iter.bi_size, - (unsigned long long)bip->bip_iter.bi_sector); -diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c -index 5e08f2657b90..34f602c3a882 100644 ---- a/drivers/tty/serial/imx.c -+++ b/drivers/tty/serial/imx.c -@@ -619,7 +619,7 @@ static void imx_uart_dma_tx(struct imx_port *sport) - dev_err(dev, "DMA mapping error for TX.\n"); - return; - } -- desc = dmaengine_prep_slave_sg(chan, sgl, sport->dma_tx_nents, -+ desc = dmaengine_prep_slave_sg(chan, sgl, ret, - DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT); - if (!desc) { - dma_unmap_sg(dev, sgl, sport->dma_tx_nents, -diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c -index 6157213a8359..c16234bca78f 100644 ---- a/drivers/tty/serial/pch_uart.c -+++ b/drivers/tty/serial/pch_uart.c -@@ -233,6 +233,7 @@ struct eg20t_port { - struct dma_chan *chan_rx; - struct scatterlist *sg_tx_p; - int nent; -+ int orig_nent; - struct scatterlist sg_rx; - int tx_dma_use; - void *rx_buf_virt; -@@ -787,9 +788,10 @@ static void pch_dma_tx_complete(void *arg) - } - xmit->tail &= UART_XMIT_SIZE - 1; - async_tx_ack(priv->desc_tx); -- dma_unmap_sg(port->dev, sg, priv->nent, DMA_TO_DEVICE); -+ dma_unmap_sg(port->dev, sg, priv->orig_nent, DMA_TO_DEVICE); - priv->tx_dma_use = 0; - priv->nent = 0; -+ priv->orig_nent = 0; - kfree(priv->sg_tx_p); - pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_TX_INT); - } -@@ -1010,6 +1012,7 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv) - dev_err(priv->port.dev, "%s:dma_map_sg Failed\n", __func__); - return 0; - } -+ priv->orig_nent = num; - priv->nent = nent; - - for (i = 0; i < nent; i++, sg++) { -diff --git a/fs/affs/super.c b/fs/affs/super.c -index cc463ae47c12..3812f7bc3a7f 100644 ---- a/fs/affs/super.c -+++ b/fs/affs/super.c -@@ -561,14 +561,9 @@ affs_remount(struct super_block *sb, int *flags, char *data) - int root_block; - unsigned long mount_flags; - int res = 0; -- char *new_opts; - char volume[32]; - char *prefix = NULL; - -- new_opts = kstrdup(data, GFP_KERNEL); -- if (data && !new_opts) -- return -ENOMEM; -- - pr_debug("%s(flags=0x%x,opts=\"%s\")\n", __func__, *flags, data); - - sync_filesystem(sb); -@@ -579,7 +574,6 @@ affs_remount(struct super_block *sb, int *flags, char *data) - &blocksize, &prefix, volume, - &mount_flags)) { - kfree(prefix); -- kfree(new_opts); - return -EINVAL; - } - -diff --git a/fs/afs/dir.c b/fs/afs/dir.c -index 497f979018c2..5c794f4b051a 100644 ---- a/fs/afs/dir.c -+++ b/fs/afs/dir.c -@@ -908,6 +908,7 @@ static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry, - unsigned int flags) - { - struct afs_vnode *dvnode = AFS_FS_I(dir); -+ struct afs_fid fid = {}; - struct inode *inode; - struct dentry *d; - struct key *key; -@@ -951,21 +952,18 @@ static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry, - afs_stat_v(dvnode, n_lookup); - inode = afs_do_lookup(dir, dentry, key); - key_put(key); -- if (inode == ERR_PTR(-ENOENT)) { -+ if (inode == ERR_PTR(-ENOENT)) - inode = afs_try_auto_mntpt(dentry, dir); -- } else { -- dentry->d_fsdata = -- (void *)(unsigned long)dvnode->status.data_version; -- } -+ -+ if (!IS_ERR_OR_NULL(inode)) -+ fid = AFS_FS_I(inode)->fid; -+ - d = d_splice_alias(inode, dentry); - if (!IS_ERR_OR_NULL(d)) { - d->d_fsdata = dentry->d_fsdata; -- trace_afs_lookup(dvnode, &d->d_name, -- inode ? AFS_FS_I(inode) : NULL); -+ trace_afs_lookup(dvnode, &d->d_name, &fid); - } else { -- trace_afs_lookup(dvnode, &dentry->d_name, -- IS_ERR_OR_NULL(inode) ? NULL -- : AFS_FS_I(inode)); -+ trace_afs_lookup(dvnode, &dentry->d_name, &fid); - } - return d; - } -diff --git a/fs/afs/super.c b/fs/afs/super.c -index d9a6036b70b9..7f8a9b3137bf 100644 ---- a/fs/afs/super.c -+++ b/fs/afs/super.c -@@ -404,6 +404,7 @@ static int afs_test_super(struct super_block *sb, struct fs_context *fc) - return (as->net_ns == fc->net_ns && - as->volume && - as->volume->vid == ctx->volume->vid && -+ as->cell == ctx->cell && - !as->dyn_root); - } - -diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c -index eaafd00f93d4..5739b8fc7fff 100644 ---- a/fs/btrfs/file.c -+++ b/fs/btrfs/file.c -@@ -1903,9 +1903,10 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, - (iocb->ki_flags & IOCB_NOWAIT)) - return -EOPNOTSUPP; - -- if (!inode_trylock(inode)) { -- if (iocb->ki_flags & IOCB_NOWAIT) -+ if (iocb->ki_flags & IOCB_NOWAIT) { -+ if (!inode_trylock(inode)) - return -EAGAIN; -+ } else { - inode_lock(inode); - } - -diff --git a/fs/buffer.c b/fs/buffer.c -index 7744488f7bde..91ceca52d14f 100644 ---- a/fs/buffer.c -+++ b/fs/buffer.c -@@ -2991,7 +2991,7 @@ static void end_bio_bh_io_sync(struct bio *bio) - * errors, this only handles the "we need to be able to - * do IO at the final sector" case. - */ --void guard_bio_eod(int op, struct bio *bio) -+void guard_bio_eod(struct bio *bio) - { - sector_t maxsector; - struct hd_struct *part; -@@ -3055,15 +3055,15 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, - bio->bi_end_io = end_bio_bh_io_sync; - bio->bi_private = bh; - -- /* Take care of bh's that straddle the end of the device */ -- guard_bio_eod(op, bio); -- - if (buffer_meta(bh)) - op_flags |= REQ_META; - if (buffer_prio(bh)) - op_flags |= REQ_PRIO; - bio_set_op_attrs(bio, op, op_flags); - -+ /* Take care of bh's that straddle the end of the device */ -+ guard_bio_eod(bio); -+ - if (wbc) { - wbc_init_bio(wbc, bio); - wbc_account_cgroup_owner(wbc, bh->b_page, bh->b_size); -diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c -index 8b0b512c5792..afe1f03aabe3 100644 ---- a/fs/cifs/smb2file.c -+++ b/fs/cifs/smb2file.c -@@ -67,7 +67,7 @@ smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms, - goto out; - - -- if (oparms->tcon->use_resilient) { -+ if (oparms->tcon->use_resilient) { - /* default timeout is 0, servers pick default (120 seconds) */ - nr_ioctl_req.Timeout = - cpu_to_le32(oparms->tcon->handle_timeout); -diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c -index 5755e897a5f0..2e9c73165800 100644 ---- a/fs/f2fs/data.c -+++ b/fs/f2fs/data.c -@@ -2098,7 +2098,7 @@ static int __write_data_page(struct page *page, bool *submitted, - loff_t i_size = i_size_read(inode); - const pgoff_t end_index = ((unsigned long long) i_size) - >> PAGE_SHIFT; -- loff_t psize = (page->index + 1) << PAGE_SHIFT; -+ loff_t psize = (loff_t)(page->index + 1) << PAGE_SHIFT; - unsigned offset = 0; - bool need_balance_fs = false; - int err = 0; -diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c -index 8ed8e4328bd1..fae665691481 100644 ---- a/fs/f2fs/file.c -+++ b/fs/f2fs/file.c -@@ -1139,7 +1139,7 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode, - } - dn.ofs_in_node++; - i++; -- new_size = (dst + i) << PAGE_SHIFT; -+ new_size = (loff_t)(dst + i) << PAGE_SHIFT; - if (dst_inode->i_size < new_size) - f2fs_i_size_write(dst_inode, new_size); - } while (--ilen && (do_replace[i] || blkaddr[i] == NULL_ADDR)); -diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c -index c53e3b892210..01ff37b76652 100644 ---- a/fs/gfs2/file.c -+++ b/fs/gfs2/file.c -@@ -6,6 +6,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -354,6 +355,31 @@ static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) - return -ENOTTY; - } - -+#ifdef CONFIG_COMPAT -+static long gfs2_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -+{ -+ switch(cmd) { -+ /* These are just misnamed, they actually get/put from/to user an int */ -+ case FS_IOC32_GETFLAGS: -+ cmd = FS_IOC_GETFLAGS; -+ break; -+ case FS_IOC32_SETFLAGS: -+ cmd = FS_IOC_SETFLAGS; -+ break; -+ /* Keep this list in sync with gfs2_ioctl */ -+ case FITRIM: -+ case FS_IOC_GETFSLABEL: -+ break; -+ default: -+ return -ENOIOCTLCMD; -+ } -+ -+ return gfs2_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); -+} -+#else -+#define gfs2_compat_ioctl NULL -+#endif -+ - /** - * gfs2_size_hint - Give a hint to the size of a write request - * @filep: The struct file -@@ -1294,6 +1320,7 @@ const struct file_operations gfs2_file_fops = { - .write_iter = gfs2_file_write_iter, - .iopoll = iomap_dio_iopoll, - .unlocked_ioctl = gfs2_ioctl, -+ .compat_ioctl = gfs2_compat_ioctl, - .mmap = gfs2_mmap, - .open = gfs2_open, - .release = gfs2_release, -@@ -1309,6 +1336,7 @@ const struct file_operations gfs2_file_fops = { - const struct file_operations gfs2_dir_fops = { - .iterate_shared = gfs2_readdir, - .unlocked_ioctl = gfs2_ioctl, -+ .compat_ioctl = gfs2_compat_ioctl, - .open = gfs2_open, - .release = gfs2_release, - .fsync = gfs2_fsync, -@@ -1325,6 +1353,7 @@ const struct file_operations gfs2_file_fops_nolock = { - .write_iter = gfs2_file_write_iter, - .iopoll = iomap_dio_iopoll, - .unlocked_ioctl = gfs2_ioctl, -+ .compat_ioctl = gfs2_compat_ioctl, - .mmap = gfs2_mmap, - .open = gfs2_open, - .release = gfs2_release, -@@ -1338,6 +1367,7 @@ const struct file_operations gfs2_file_fops_nolock = { - const struct file_operations gfs2_dir_fops_nolock = { - .iterate_shared = gfs2_readdir, - .unlocked_ioctl = gfs2_ioctl, -+ .compat_ioctl = gfs2_compat_ioctl, - .open = gfs2_open, - .release = gfs2_release, - .fsync = gfs2_fsync, -diff --git a/fs/internal.h b/fs/internal.h -index 315fcd8d237c..7651e8b8ef13 100644 ---- a/fs/internal.h -+++ b/fs/internal.h -@@ -38,7 +38,7 @@ static inline int __sync_blockdev(struct block_device *bdev, int wait) - /* - * buffer.c - */ --extern void guard_bio_eod(int rw, struct bio *bio); -+extern void guard_bio_eod(struct bio *bio); - extern int __block_write_begin_int(struct page *page, loff_t pos, unsigned len, - get_block_t *get_block, struct iomap *iomap); - -diff --git a/fs/mpage.c b/fs/mpage.c -index a63620cdb73a..ccba3c4c4479 100644 ---- a/fs/mpage.c -+++ b/fs/mpage.c -@@ -62,7 +62,7 @@ static struct bio *mpage_bio_submit(int op, int op_flags, struct bio *bio) - { - bio->bi_end_io = mpage_end_io; - bio_set_op_attrs(bio, op, op_flags); -- guard_bio_eod(op, bio); -+ guard_bio_eod(bio); - submit_bio(bio); - return NULL; - } -diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c -index cbc17a203248..887f9136a9db 100644 ---- a/fs/nfs/nfs2xdr.c -+++ b/fs/nfs/nfs2xdr.c -@@ -370,7 +370,7 @@ static void encode_sattr(struct xdr_stream *xdr, const struct iattr *attr, - } else - p = xdr_time_not_set(p); - if (attr->ia_valid & ATTR_MTIME_SET) { -- ts = timespec64_to_timespec(attr->ia_atime); -+ ts = timespec64_to_timespec(attr->ia_mtime); - xdr_encode_time(p, &ts); - } else if (attr->ia_valid & ATTR_MTIME) { - ts = timespec64_to_timespec(attr->ia_mtime); -diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c -index caacf5e7f5e1..f26d714f9f28 100644 ---- a/fs/nfs/nfs4proc.c -+++ b/fs/nfs/nfs4proc.c -@@ -521,9 +521,7 @@ static int nfs4_do_handle_exception(struct nfs_server *server, - case -NFS4ERR_DEADSESSION: - case -NFS4ERR_SEQ_FALSE_RETRY: - case -NFS4ERR_SEQ_MISORDERED: -- dprintk("%s ERROR: %d Reset session\n", __func__, -- errorcode); -- nfs4_schedule_session_recovery(clp->cl_session, errorcode); -+ /* Handled in nfs41_sequence_process() */ - goto wait_on_recovery; - #endif /* defined(CONFIG_NFS_V4_1) */ - case -NFS4ERR_FILE_OPEN: -@@ -782,6 +780,7 @@ static int nfs41_sequence_process(struct rpc_task *task, - struct nfs4_session *session; - struct nfs4_slot *slot = res->sr_slot; - struct nfs_client *clp; -+ int status; - int ret = 1; - - if (slot == NULL) -@@ -793,8 +792,13 @@ static int nfs41_sequence_process(struct rpc_task *task, - session = slot->table->session; - - trace_nfs4_sequence_done(session, res); -+ -+ status = res->sr_status; -+ if (task->tk_status == -NFS4ERR_DEADSESSION) -+ status = -NFS4ERR_DEADSESSION; -+ - /* Check the SEQUENCE operation status */ -- switch (res->sr_status) { -+ switch (status) { - case 0: - /* Mark this sequence number as having been acked */ - nfs4_slot_sequence_acked(slot, slot->seq_nr); -@@ -866,6 +870,10 @@ static int nfs41_sequence_process(struct rpc_task *task, - */ - slot->seq_nr = slot->seq_nr_highest_sent; - goto out_retry; -+ case -NFS4ERR_BADSESSION: -+ case -NFS4ERR_DEADSESSION: -+ case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: -+ goto session_recover; - default: - /* Just update the slot sequence no. */ - slot->seq_done = 1; -@@ -876,8 +884,10 @@ out: - out_noaction: - return ret; - session_recover: -- nfs4_schedule_session_recovery(session, res->sr_status); -- goto retry_nowait; -+ nfs4_schedule_session_recovery(session, status); -+ dprintk("%s ERROR: %d Reset session\n", __func__, status); -+ nfs41_sequence_free_slot(res); -+ goto out; - retry_new_seq: - ++slot->seq_nr; - retry_nowait: -@@ -2188,7 +2198,6 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct - case -NFS4ERR_BAD_HIGH_SLOT: - case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: - case -NFS4ERR_DEADSESSION: -- nfs4_schedule_session_recovery(server->nfs_client->cl_session, err); - return -EAGAIN; - case -NFS4ERR_STALE_CLIENTID: - case -NFS4ERR_STALE_STATEID: -@@ -6243,8 +6252,10 @@ static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data) - - d_data = (struct nfs4_delegreturndata *)data; - -- if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task)) -+ if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task)) { -+ nfs4_sequence_done(task, &d_data->res.seq_res); - return; -+ } - - lo = d_data->args.lr_args ? d_data->args.lr_args->layout : NULL; - if (lo && !pnfs_layout_is_valid(lo)) { -@@ -7820,6 +7831,15 @@ nfs41_same_server_scope(struct nfs41_server_scope *a, - static void - nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata) - { -+ struct nfs41_bind_conn_to_session_args *args = task->tk_msg.rpc_argp; -+ struct nfs_client *clp = args->client; -+ -+ switch (task->tk_status) { -+ case -NFS4ERR_BADSESSION: -+ case -NFS4ERR_DEADSESSION: -+ nfs4_schedule_session_recovery(clp->cl_session, -+ task->tk_status); -+ } - } - - static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = { -@@ -8867,8 +8887,6 @@ static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nf - case -NFS4ERR_BADSESSION: - case -NFS4ERR_DEADSESSION: - case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: -- nfs4_schedule_session_recovery(clp->cl_session, -- task->tk_status); - break; - default: - nfs4_schedule_lease_recovery(clp); -diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig -index 10cefb0c07c7..c4b1a89b8845 100644 ---- a/fs/nfsd/Kconfig -+++ b/fs/nfsd/Kconfig -@@ -73,7 +73,7 @@ config NFSD_V4 - select NFSD_V3 - select FS_POSIX_ACL - select SUNRPC_GSS -- select CRYPTO -+ select CRYPTO_SHA256 - select GRACE_PERIOD - help - This option enables support in your system's NFS server for -diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c -index 38c0aeda500e..4798667af647 100644 ---- a/fs/nfsd/nfs4proc.c -+++ b/fs/nfsd/nfs4proc.c -@@ -1298,7 +1298,8 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, - out: - return status; - out_err: -- cleanup_async_copy(async_copy); -+ if (async_copy) -+ cleanup_async_copy(async_copy); - goto out; - } - -diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c -index cdc75ad4438b..c35c0ebaf722 100644 ---- a/fs/nfsd/nfs4recover.c -+++ b/fs/nfsd/nfs4recover.c -@@ -1578,6 +1578,7 @@ nfsd4_cld_tracking_init(struct net *net) - struct nfsd_net *nn = net_generic(net, nfsd_net_id); - bool running; - int retries = 10; -+ struct crypto_shash *tfm; - - status = nfs4_cld_state_init(net); - if (status) -@@ -1586,11 +1587,6 @@ nfsd4_cld_tracking_init(struct net *net) - status = __nfsd4_init_cld_pipe(net); - if (status) - goto err_shutdown; -- nn->cld_net->cn_tfm = crypto_alloc_shash("sha256", 0, 0); -- if (IS_ERR(nn->cld_net->cn_tfm)) { -- status = PTR_ERR(nn->cld_net->cn_tfm); -- goto err_remove; -- } - - /* - * rpc pipe upcalls take 30 seconds to time out, so we don't want to -@@ -1607,6 +1603,12 @@ nfsd4_cld_tracking_init(struct net *net) - status = -ETIMEDOUT; - goto err_remove; - } -+ tfm = crypto_alloc_shash("sha256", 0, 0); -+ if (IS_ERR(tfm)) { -+ status = PTR_ERR(tfm); -+ goto err_remove; -+ } -+ nn->cld_net->cn_tfm = tfm; - - status = nfsd4_cld_get_version(nn); - if (status == -EOPNOTSUPP) -diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c -index 699a560efbb0..900e4ef686bf 100644 ---- a/fs/ocfs2/journal.c -+++ b/fs/ocfs2/journal.c -@@ -1066,6 +1066,14 @@ int ocfs2_journal_load(struct ocfs2_journal *journal, int local, int replayed) - - ocfs2_clear_journal_error(osb->sb, journal->j_journal, osb->slot_num); - -+ if (replayed) { -+ jbd2_journal_lock_updates(journal->j_journal); -+ status = jbd2_journal_flush(journal->j_journal); -+ jbd2_journal_unlock_updates(journal->j_journal); -+ if (status < 0) -+ mlog_errno(status); -+ } -+ - status = ocfs2_journal_toggle_dirty(osb, 1, replayed); - if (status < 0) { - mlog_errno(status); -diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c -index 4fd9683b8245..826dad0243dc 100644 ---- a/fs/ubifs/journal.c -+++ b/fs/ubifs/journal.c -@@ -899,7 +899,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode) - fname_name(&nm) = xent->name; - fname_len(&nm) = le16_to_cpu(xent->nlen); - -- xino = ubifs_iget(c->vfs_sb, xent->inum); -+ xino = ubifs_iget(c->vfs_sb, le64_to_cpu(xent->inum)); - if (IS_ERR(xino)) { - err = PTR_ERR(xino); - ubifs_err(c, "dead directory entry '%s', error %d", -diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c -index 3b4b4114f208..54d6db61106f 100644 ---- a/fs/ubifs/orphan.c -+++ b/fs/ubifs/orphan.c -@@ -631,12 +631,17 @@ static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb, - ino_t inum; - int i, n, err, first = 1; - -+ ino = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS); -+ if (!ino) -+ return -ENOMEM; -+ - list_for_each_entry(snod, &sleb->nodes, list) { - if (snod->type != UBIFS_ORPH_NODE) { - ubifs_err(c, "invalid node type %d in orphan area at %d:%d", - snod->type, sleb->lnum, snod->offs); - ubifs_dump_node(c, snod->node); -- return -EINVAL; -+ err = -EINVAL; -+ goto out_free; - } - - orph = snod->node; -@@ -663,20 +668,18 @@ static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb, - ubifs_err(c, "out of order commit number %llu in orphan node at %d:%d", - cmt_no, sleb->lnum, snod->offs); - ubifs_dump_node(c, snod->node); -- return -EINVAL; -+ err = -EINVAL; -+ goto out_free; - } - dbg_rcvry("out of date LEB %d", sleb->lnum); - *outofdate = 1; -- return 0; -+ err = 0; -+ goto out_free; - } - - if (first) - first = 0; - -- ino = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS); -- if (!ino) -- return -ENOMEM; -- - n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3; - for (i = 0; i < n; i++) { - union ubifs_key key1, key2; -diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c -index 7d4547e5202d..5e1e8ec0589e 100644 ---- a/fs/ubifs/super.c -+++ b/fs/ubifs/super.c -@@ -2267,10 +2267,8 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags, - } - } else { - err = ubifs_fill_super(sb, data, flags & SB_SILENT ? 1 : 0); -- if (err) { -- kfree(c); -+ if (err) - goto out_deact; -- } - /* We do not support atime */ - sb->s_flags |= SB_ACTIVE; - if (IS_ENABLED(CONFIG_UBIFS_ATIME_SUPPORT)) -diff --git a/include/asm-generic/cacheflush.h b/include/asm-generic/cacheflush.h -index a950a22c4890..cac7404b2bdd 100644 ---- a/include/asm-generic/cacheflush.h -+++ b/include/asm-generic/cacheflush.h -@@ -11,71 +11,102 @@ - * The cache doesn't need to be flushed when TLB entries change when - * the cache is mapped to physical memory, not virtual memory - */ -+#ifndef flush_cache_all - static inline void flush_cache_all(void) - { - } -+#endif - -+#ifndef flush_cache_mm - static inline void flush_cache_mm(struct mm_struct *mm) - { - } -+#endif - -+#ifndef flush_cache_dup_mm - static inline void flush_cache_dup_mm(struct mm_struct *mm) - { - } -+#endif - -+#ifndef flush_cache_range - static inline void flush_cache_range(struct vm_area_struct *vma, - unsigned long start, - unsigned long end) - { - } -+#endif - -+#ifndef flush_cache_page - static inline void flush_cache_page(struct vm_area_struct *vma, - unsigned long vmaddr, - unsigned long pfn) - { - } -+#endif - -+#ifndef flush_dcache_page - static inline void flush_dcache_page(struct page *page) - { - } -+#endif - -+#ifndef flush_dcache_mmap_lock - static inline void flush_dcache_mmap_lock(struct address_space *mapping) - { - } -+#endif - -+#ifndef flush_dcache_mmap_unlock - static inline void flush_dcache_mmap_unlock(struct address_space *mapping) - { - } -+#endif - -+#ifndef flush_icache_range - static inline void flush_icache_range(unsigned long start, unsigned long end) - { - } -+#endif - -+#ifndef flush_icache_page - static inline void flush_icache_page(struct vm_area_struct *vma, - struct page *page) - { - } -+#endif - -+#ifndef flush_icache_user_range - static inline void flush_icache_user_range(struct vm_area_struct *vma, - struct page *page, - unsigned long addr, int len) - { - } -+#endif - -+#ifndef flush_cache_vmap - static inline void flush_cache_vmap(unsigned long start, unsigned long end) - { - } -+#endif - -+#ifndef flush_cache_vunmap - static inline void flush_cache_vunmap(unsigned long start, unsigned long end) - { - } -+#endif - --#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ -+#ifndef copy_to_user_page -+#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ - do { \ - memcpy(dst, src, len); \ - flush_icache_user_range(vma, page, vaddr, len); \ - } while (0) -+#endif -+ -+#ifndef copy_from_user_page - #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ - memcpy(dst, src, len) -+#endif - - #endif /* __ASM_CACHEFLUSH_H */ -diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h -index 734b6f7081b8..3175dfeaed2c 100644 ---- a/include/crypto/internal/skcipher.h -+++ b/include/crypto/internal/skcipher.h -@@ -205,19 +205,6 @@ static inline unsigned int crypto_skcipher_alg_max_keysize( - return alg->max_keysize; - } - --static inline unsigned int crypto_skcipher_alg_chunksize( -- struct skcipher_alg *alg) --{ -- if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) == -- CRYPTO_ALG_TYPE_BLKCIPHER) -- return alg->base.cra_blocksize; -- -- if (alg->base.cra_ablkcipher.encrypt) -- return alg->base.cra_blocksize; -- -- return alg->chunksize; --} -- - static inline unsigned int crypto_skcipher_alg_walksize( - struct skcipher_alg *alg) - { -@@ -231,23 +218,6 @@ static inline unsigned int crypto_skcipher_alg_walksize( - return alg->walksize; - } - --/** -- * crypto_skcipher_chunksize() - obtain chunk size -- * @tfm: cipher handle -- * -- * The block size is set to one for ciphers such as CTR. However, -- * you still need to provide incremental updates in multiples of -- * the underlying block size as the IV does not have sub-block -- * granularity. This is known in this API as the chunk size. -- * -- * Return: chunk size in bytes -- */ --static inline unsigned int crypto_skcipher_chunksize( -- struct crypto_skcipher *tfm) --{ -- return crypto_skcipher_alg_chunksize(crypto_skcipher_alg(tfm)); --} -- - /** - * crypto_skcipher_walksize() - obtain walk size - * @tfm: cipher handle -diff --git a/include/crypto/skcipher.h b/include/crypto/skcipher.h -index 37c164234d97..aada87916918 100644 ---- a/include/crypto/skcipher.h -+++ b/include/crypto/skcipher.h -@@ -304,6 +304,36 @@ static inline unsigned int crypto_skcipher_blocksize( - return crypto_tfm_alg_blocksize(crypto_skcipher_tfm(tfm)); - } - -+static inline unsigned int crypto_skcipher_alg_chunksize( -+ struct skcipher_alg *alg) -+{ -+ if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) == -+ CRYPTO_ALG_TYPE_BLKCIPHER) -+ return alg->base.cra_blocksize; -+ -+ if (alg->base.cra_ablkcipher.encrypt) -+ return alg->base.cra_blocksize; -+ -+ return alg->chunksize; -+} -+ -+/** -+ * crypto_skcipher_chunksize() - obtain chunk size -+ * @tfm: cipher handle -+ * -+ * The block size is set to one for ciphers such as CTR. However, -+ * you still need to provide incremental updates in multiples of -+ * the underlying block size as the IV does not have sub-block -+ * granularity. This is known in this API as the chunk size. -+ * -+ * Return: chunk size in bytes -+ */ -+static inline unsigned int crypto_skcipher_chunksize( -+ struct crypto_skcipher *tfm) -+{ -+ return crypto_skcipher_alg_chunksize(crypto_skcipher_alg(tfm)); -+} -+ - static inline unsigned int crypto_sync_skcipher_blocksize( - struct crypto_sync_skcipher *tfm) - { -diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h -index d4ee6e942562..38555435a64a 100644 ---- a/include/linux/uaccess.h -+++ b/include/linux/uaccess.h -@@ -337,6 +337,18 @@ extern long __probe_user_read(void *dst, const void __user *src, size_t size); - extern long notrace probe_kernel_write(void *dst, const void *src, size_t size); - extern long notrace __probe_kernel_write(void *dst, const void *src, size_t size); - -+/* -+ * probe_user_write(): safely attempt to write to a location in user space -+ * @dst: address to write to -+ * @src: pointer to the data that shall be written -+ * @size: size of the data chunk -+ * -+ * Safely write to address @dst from the buffer at @src. If a kernel fault -+ * happens, handle that and return -EFAULT. -+ */ -+extern long notrace probe_user_write(void __user *dst, const void *src, size_t size); -+extern long notrace __probe_user_write(void __user *dst, const void *src, size_t size); -+ - extern long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count); - extern long strncpy_from_unsafe_user(char *dst, const void __user *unsafe_addr, - long count); -diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h -index 31f76b6abf71..bbdd1542d6f1 100644 ---- a/include/sound/simple_card_utils.h -+++ b/include/sound/simple_card_utils.h -@@ -8,6 +8,7 @@ - #ifndef __SIMPLE_CARD_UTILS_H - #define __SIMPLE_CARD_UTILS_H - -+#include - #include - - #define asoc_simple_init_hp(card, sjack, prefix) \ -diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h -index d5ec4fac82ae..564ba1b5cf57 100644 ---- a/include/trace/events/afs.h -+++ b/include/trace/events/afs.h -@@ -915,9 +915,9 @@ TRACE_EVENT(afs_call_state, - - TRACE_EVENT(afs_lookup, - TP_PROTO(struct afs_vnode *dvnode, const struct qstr *name, -- struct afs_vnode *vnode), -+ struct afs_fid *fid), - -- TP_ARGS(dvnode, name, vnode), -+ TP_ARGS(dvnode, name, fid), - - TP_STRUCT__entry( - __field_struct(struct afs_fid, dfid ) -@@ -928,13 +928,7 @@ TRACE_EVENT(afs_lookup, - TP_fast_assign( - int __len = min_t(int, name->len, 23); - __entry->dfid = dvnode->fid; -- if (vnode) { -- __entry->fid = vnode->fid; -- } else { -- __entry->fid.vid = 0; -- __entry->fid.vnode = 0; -- __entry->fid.unique = 0; -- } -+ __entry->fid = *fid; - memcpy(__entry->name, name->name, __len); - __entry->name[__len] = 0; - ), -diff --git a/include/trace/events/rpcrdma.h b/include/trace/events/rpcrdma.h -index a13830616107..7fd11ec1c9a4 100644 ---- a/include/trace/events/rpcrdma.h -+++ b/include/trace/events/rpcrdma.h -@@ -735,6 +735,31 @@ TRACE_EVENT(xprtrdma_post_recvs, - ) - ); - -+TRACE_EVENT(xprtrdma_post_linv, -+ TP_PROTO( -+ const struct rpcrdma_req *req, -+ int status -+ ), -+ -+ TP_ARGS(req, status), -+ -+ TP_STRUCT__entry( -+ __field(const void *, req) -+ __field(int, status) -+ __field(u32, xid) -+ ), -+ -+ TP_fast_assign( -+ __entry->req = req; -+ __entry->status = status; -+ __entry->xid = be32_to_cpu(req->rl_slot.rq_xid); -+ ), -+ -+ TP_printk("req=%p xid=0x%08x status=%d", -+ __entry->req, __entry->xid, __entry->status -+ ) -+); -+ - /** - ** Completion events - **/ -diff --git a/include/uapi/rdma/nes-abi.h b/include/uapi/rdma/nes-abi.h -deleted file mode 100644 -index f80495baa969..000000000000 ---- a/include/uapi/rdma/nes-abi.h -+++ /dev/null -@@ -1,115 +0,0 @@ --/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */ --/* -- * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. -- * Copyright (c) 2005 Topspin Communications. All rights reserved. -- * Copyright (c) 2005 Cisco Systems. All rights reserved. -- * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. -- * -- * This software is available to you under a choice of one of two -- * licenses. You may choose to be licensed under the terms of the GNU -- * General Public License (GPL) Version 2, available from the file -- * COPYING in the main directory of this source tree, or the -- * OpenIB.org BSD license below: -- * -- * Redistribution and use in source and binary forms, with or -- * without modification, are permitted provided that the following -- * conditions are met: -- * -- * - Redistributions of source code must retain the above -- * copyright notice, this list of conditions and the following -- * disclaimer. -- * -- * - Redistributions in binary form must reproduce the above -- * copyright notice, this list of conditions and the following -- * disclaimer in the documentation and/or other materials -- * provided with the distribution. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -- * SOFTWARE. -- * -- */ -- --#ifndef NES_ABI_USER_H --#define NES_ABI_USER_H -- --#include -- --#define NES_ABI_USERSPACE_VER 2 --#define NES_ABI_KERNEL_VER 2 -- --/* -- * Make sure that all structs defined in this file remain laid out so -- * that they pack the same way on 32-bit and 64-bit architectures (to -- * avoid incompatibility between 32-bit userspace and 64-bit kernels). -- * In particular do not use pointer types -- pass pointers in __u64 -- * instead. -- */ -- --struct nes_alloc_ucontext_req { -- __u32 reserved32; -- __u8 userspace_ver; -- __u8 reserved8[3]; --}; -- --struct nes_alloc_ucontext_resp { -- __u32 max_pds; /* maximum pds allowed for this user process */ -- __u32 max_qps; /* maximum qps allowed for this user process */ -- __u32 wq_size; /* size of the WQs (sq+rq) allocated to the mmaped area */ -- __u8 virtwq; /* flag to indicate if virtual WQ are to be used or not */ -- __u8 kernel_ver; -- __u8 reserved[2]; --}; -- --struct nes_alloc_pd_resp { -- __u32 pd_id; -- __u32 mmap_db_index; --}; -- --struct nes_create_cq_req { -- __aligned_u64 user_cq_buffer; -- __u32 mcrqf; -- __u8 reserved[4]; --}; -- --struct nes_create_qp_req { -- __aligned_u64 user_wqe_buffers; -- __aligned_u64 user_qp_buffer; --}; -- --enum iwnes_memreg_type { -- IWNES_MEMREG_TYPE_MEM = 0x0000, -- IWNES_MEMREG_TYPE_QP = 0x0001, -- IWNES_MEMREG_TYPE_CQ = 0x0002, -- IWNES_MEMREG_TYPE_MW = 0x0003, -- IWNES_MEMREG_TYPE_FMR = 0x0004, -- IWNES_MEMREG_TYPE_FMEM = 0x0005, --}; -- --struct nes_mem_reg_req { -- __u32 reg_type; /* indicates if id is memory, QP or CQ */ -- __u32 reserved; --}; -- --struct nes_create_cq_resp { -- __u32 cq_id; -- __u32 cq_size; -- __u32 mmap_db_index; -- __u32 reserved; --}; -- --struct nes_create_qp_resp { -- __u32 qp_id; -- __u32 actual_sq_size; -- __u32 actual_rq_size; -- __u32 mmap_sq_db_index; -- __u32 mmap_rq_db_index; -- __u32 nes_drv_opt; --}; -- --#endif /* NES_ABI_USER_H */ -diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c -index a3eaf08e7dd3..8bd69062fbe5 100644 ---- a/kernel/bpf/cgroup.c -+++ b/kernel/bpf/cgroup.c -@@ -35,8 +35,8 @@ void cgroup_bpf_offline(struct cgroup *cgrp) - */ - static void cgroup_bpf_release(struct work_struct *work) - { -- struct cgroup *cgrp = container_of(work, struct cgroup, -- bpf.release_work); -+ struct cgroup *p, *cgrp = container_of(work, struct cgroup, -+ bpf.release_work); - enum bpf_cgroup_storage_type stype; - struct bpf_prog_array *old_array; - unsigned int type; -@@ -65,6 +65,9 @@ static void cgroup_bpf_release(struct work_struct *work) - - mutex_unlock(&cgroup_mutex); - -+ for (p = cgroup_parent(cgrp); p; p = cgroup_parent(p)) -+ cgroup_bpf_put(p); -+ - percpu_ref_exit(&cgrp->bpf.refcnt); - cgroup_put(cgrp); - } -@@ -199,6 +202,7 @@ int cgroup_bpf_inherit(struct cgroup *cgrp) - */ - #define NR ARRAY_SIZE(cgrp->bpf.effective) - struct bpf_prog_array *arrays[NR] = {}; -+ struct cgroup *p; - int ret, i; - - ret = percpu_ref_init(&cgrp->bpf.refcnt, cgroup_bpf_release_fn, 0, -@@ -206,6 +210,9 @@ int cgroup_bpf_inherit(struct cgroup *cgrp) - if (ret) - return ret; - -+ for (p = cgroup_parent(cgrp); p; p = cgroup_parent(p)) -+ cgroup_bpf_get(p); -+ - for (i = 0; i < NR; i++) - INIT_LIST_HEAD(&cgrp->bpf.progs[i]); - -diff --git a/kernel/cred.c b/kernel/cred.c -index 9ed51b70ed80..809a985b1793 100644 ---- a/kernel/cred.c -+++ b/kernel/cred.c -@@ -175,8 +175,8 @@ void exit_creds(struct task_struct *tsk) - put_cred(cred); - - #ifdef CONFIG_KEYS_REQUEST_CACHE -- key_put(current->cached_requested_key); -- current->cached_requested_key = NULL; -+ key_put(tsk->cached_requested_key); -+ tsk->cached_requested_key = NULL; - #endif - } - -diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c -index 44bd08f2443b..89bdac61233d 100644 ---- a/kernel/trace/bpf_trace.c -+++ b/kernel/trace/bpf_trace.c -@@ -163,7 +163,7 @@ static const struct bpf_func_proto bpf_probe_read_proto = { - .arg3_type = ARG_ANYTHING, - }; - --BPF_CALL_3(bpf_probe_write_user, void *, unsafe_ptr, const void *, src, -+BPF_CALL_3(bpf_probe_write_user, void __user *, unsafe_ptr, const void *, src, - u32, size) - { - /* -@@ -186,10 +186,8 @@ BPF_CALL_3(bpf_probe_write_user, void *, unsafe_ptr, const void *, src, - return -EPERM; - if (unlikely(!nmi_uaccess_okay())) - return -EPERM; -- if (!access_ok(unsafe_ptr, size)) -- return -EPERM; - -- return probe_kernel_write(unsafe_ptr, src, size); -+ return probe_user_write(unsafe_ptr, src, size); - } - - static const struct bpf_func_proto bpf_probe_write_user_proto = { -diff --git a/mm/maccess.c b/mm/maccess.c -index d065736f6b87..2d3c3d01064c 100644 ---- a/mm/maccess.c -+++ b/mm/maccess.c -@@ -18,6 +18,18 @@ probe_read_common(void *dst, const void __user *src, size_t size) - return ret ? -EFAULT : 0; - } - -+static __always_inline long -+probe_write_common(void __user *dst, const void *src, size_t size) -+{ -+ long ret; -+ -+ pagefault_disable(); -+ ret = __copy_to_user_inatomic(dst, src, size); -+ pagefault_enable(); -+ -+ return ret ? -EFAULT : 0; -+} -+ - /** - * probe_kernel_read(): safely attempt to read from a kernel-space location - * @dst: pointer to the buffer that shall take the data -@@ -85,6 +97,7 @@ EXPORT_SYMBOL_GPL(probe_user_read); - * Safely write to address @dst from the buffer at @src. If a kernel fault - * happens, handle that and return -EFAULT. - */ -+ - long __weak probe_kernel_write(void *dst, const void *src, size_t size) - __attribute__((alias("__probe_kernel_write"))); - -@@ -94,15 +107,39 @@ long __probe_kernel_write(void *dst, const void *src, size_t size) - mm_segment_t old_fs = get_fs(); - - set_fs(KERNEL_DS); -- pagefault_disable(); -- ret = __copy_to_user_inatomic((__force void __user *)dst, src, size); -- pagefault_enable(); -+ ret = probe_write_common((__force void __user *)dst, src, size); - set_fs(old_fs); - -- return ret ? -EFAULT : 0; -+ return ret; - } - EXPORT_SYMBOL_GPL(probe_kernel_write); - -+/** -+ * probe_user_write(): safely attempt to write to a user-space location -+ * @dst: address to write to -+ * @src: pointer to the data that shall be written -+ * @size: size of the data chunk -+ * -+ * Safely write to address @dst from the buffer at @src. If a kernel fault -+ * happens, handle that and return -EFAULT. -+ */ -+ -+long __weak probe_user_write(void __user *dst, const void *src, size_t size) -+ __attribute__((alias("__probe_user_write"))); -+ -+long __probe_user_write(void __user *dst, const void *src, size_t size) -+{ -+ long ret = -EFAULT; -+ mm_segment_t old_fs = get_fs(); -+ -+ set_fs(USER_DS); -+ if (access_ok(dst, size)) -+ ret = probe_write_common(dst, src, size); -+ set_fs(old_fs); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(probe_user_write); - - /** - * strncpy_from_unsafe: - Copy a NUL terminated string from unsafe address. -diff --git a/net/core/skmsg.c b/net/core/skmsg.c -index 0675d022584e..ded2d5227678 100644 ---- a/net/core/skmsg.c -+++ b/net/core/skmsg.c -@@ -793,15 +793,18 @@ static void sk_psock_strp_data_ready(struct sock *sk) - static void sk_psock_write_space(struct sock *sk) - { - struct sk_psock *psock; -- void (*write_space)(struct sock *sk); -+ void (*write_space)(struct sock *sk) = NULL; - - rcu_read_lock(); - psock = sk_psock(sk); -- if (likely(psock && sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED))) -- schedule_work(&psock->work); -- write_space = psock->saved_write_space; -+ if (likely(psock)) { -+ if (sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED)) -+ schedule_work(&psock->work); -+ write_space = psock->saved_write_space; -+ } - rcu_read_unlock(); -- write_space(sk); -+ if (write_space) -+ write_space(sk); - } - - int sk_psock_init_strp(struct sock *sk, struct sk_psock *psock) -diff --git a/net/hsr/hsr_debugfs.c b/net/hsr/hsr_debugfs.c -index 6618a9d8e58e..d5f709b940ff 100644 ---- a/net/hsr/hsr_debugfs.c -+++ b/net/hsr/hsr_debugfs.c -@@ -20,6 +20,8 @@ - #include "hsr_main.h" - #include "hsr_framereg.h" - -+static struct dentry *hsr_debugfs_root_dir; -+ - static void print_mac_address(struct seq_file *sfp, unsigned char *mac) - { - seq_printf(sfp, "%02x:%02x:%02x:%02x:%02x:%02x:", -@@ -63,6 +65,19 @@ hsr_node_table_open(struct inode *inode, struct file *filp) - return single_open(filp, hsr_node_table_show, inode->i_private); - } - -+void hsr_debugfs_rename(struct net_device *dev) -+{ -+ struct hsr_priv *priv = netdev_priv(dev); -+ struct dentry *d; -+ -+ d = debugfs_rename(hsr_debugfs_root_dir, priv->node_tbl_root, -+ hsr_debugfs_root_dir, dev->name); -+ if (IS_ERR(d)) -+ netdev_warn(dev, "failed to rename\n"); -+ else -+ priv->node_tbl_root = d; -+} -+ - static const struct file_operations hsr_fops = { - .open = hsr_node_table_open, - .read = seq_read, -@@ -81,9 +96,9 @@ void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev) - { - struct dentry *de = NULL; - -- de = debugfs_create_dir(hsr_dev->name, NULL); -+ de = debugfs_create_dir(hsr_dev->name, hsr_debugfs_root_dir); - if (IS_ERR(de)) { -- pr_err("Cannot create hsr debugfs root\n"); -+ pr_err("Cannot create hsr debugfs directory\n"); - return; - } - -@@ -93,7 +108,7 @@ void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev) - priv->node_tbl_root, priv, - &hsr_fops); - if (IS_ERR(de)) { -- pr_err("Cannot create hsr node_table directory\n"); -+ pr_err("Cannot create hsr node_table file\n"); - debugfs_remove(priv->node_tbl_root); - priv->node_tbl_root = NULL; - return; -@@ -115,3 +130,18 @@ hsr_debugfs_term(struct hsr_priv *priv) - debugfs_remove(priv->node_tbl_root); - priv->node_tbl_root = NULL; - } -+ -+void hsr_debugfs_create_root(void) -+{ -+ hsr_debugfs_root_dir = debugfs_create_dir("hsr", NULL); -+ if (IS_ERR(hsr_debugfs_root_dir)) { -+ pr_err("Cannot create hsr debugfs root directory\n"); -+ hsr_debugfs_root_dir = NULL; -+ } -+} -+ -+void hsr_debugfs_remove_root(void) -+{ -+ /* debugfs_remove() internally checks NULL and ERROR */ -+ debugfs_remove(hsr_debugfs_root_dir); -+} -diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c -index 62c03f0d0079..c7bd6c49fadf 100644 ---- a/net/hsr/hsr_device.c -+++ b/net/hsr/hsr_device.c -@@ -272,6 +272,8 @@ static void send_hsr_supervision_frame(struct hsr_port *master, - skb->dev->dev_addr, skb->len) <= 0) - goto out; - skb_reset_mac_header(skb); -+ skb_reset_network_header(skb); -+ skb_reset_transport_header(skb); - - if (hsr_ver > 0) { - hsr_tag = skb_put(skb, sizeof(struct hsr_tag)); -diff --git a/net/hsr/hsr_main.c b/net/hsr/hsr_main.c -index 6deb8fa8d5c8..9e389accbfc7 100644 ---- a/net/hsr/hsr_main.c -+++ b/net/hsr/hsr_main.c -@@ -45,6 +45,10 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event, - case NETDEV_CHANGE: /* Link (carrier) state changes */ - hsr_check_carrier_and_operstate(hsr); - break; -+ case NETDEV_CHANGENAME: -+ if (is_hsr_master(dev)) -+ hsr_debugfs_rename(dev); -+ break; - case NETDEV_CHANGEADDR: - if (port->type == HSR_PT_MASTER) { - /* This should not happen since there's no -@@ -123,6 +127,7 @@ static void __exit hsr_exit(void) - { - unregister_netdevice_notifier(&hsr_nb); - hsr_netlink_exit(); -+ hsr_debugfs_remove_root(); - } - - module_init(hsr_init); -diff --git a/net/hsr/hsr_main.h b/net/hsr/hsr_main.h -index 9ec38e33b8b1..d40de84a637f 100644 ---- a/net/hsr/hsr_main.h -+++ b/net/hsr/hsr_main.h -@@ -185,14 +185,24 @@ static inline u16 hsr_get_skb_sequence_nr(struct sk_buff *skb) - } - - #if IS_ENABLED(CONFIG_DEBUG_FS) -+void hsr_debugfs_rename(struct net_device *dev); - void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev); - void hsr_debugfs_term(struct hsr_priv *priv); -+void hsr_debugfs_create_root(void); -+void hsr_debugfs_remove_root(void); - #else -+static inline void void hsr_debugfs_rename(struct net_device *dev) -+{ -+} - static inline void hsr_debugfs_init(struct hsr_priv *priv, - struct net_device *hsr_dev) - {} - static inline void hsr_debugfs_term(struct hsr_priv *priv) - {} -+static inline void hsr_debugfs_create_root(void) -+{} -+static inline void hsr_debugfs_remove_root(void) -+{} - #endif - - #endif /* __HSR_PRIVATE_H */ -diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c -index 8f8337f893ba..8dc0547f01d0 100644 ---- a/net/hsr/hsr_netlink.c -+++ b/net/hsr/hsr_netlink.c -@@ -476,6 +476,7 @@ int __init hsr_netlink_init(void) - if (rc) - goto fail_genl_register_family; - -+ hsr_debugfs_create_root(); - return 0; - - fail_genl_register_family: -diff --git a/net/netfilter/nf_tables_offload.c b/net/netfilter/nf_tables_offload.c -index e743f811245f..96a64e7594a5 100644 ---- a/net/netfilter/nf_tables_offload.c -+++ b/net/netfilter/nf_tables_offload.c -@@ -358,14 +358,14 @@ int nft_flow_rule_offload_commit(struct net *net) - continue; - - if (trans->ctx.flags & NLM_F_REPLACE || -- !(trans->ctx.flags & NLM_F_APPEND)) -- return -EOPNOTSUPP; -- -+ !(trans->ctx.flags & NLM_F_APPEND)) { -+ err = -EOPNOTSUPP; -+ break; -+ } - err = nft_flow_offload_rule(trans->ctx.chain, - nft_trans_rule(trans), - nft_trans_flow_rule(trans), - FLOW_CLS_REPLACE); -- nft_flow_rule_destroy(nft_trans_flow_rule(trans)); - break; - case NFT_MSG_DELRULE: - if (!(trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD)) -@@ -379,7 +379,23 @@ int nft_flow_rule_offload_commit(struct net *net) - } - - if (err) -- return err; -+ break; -+ } -+ -+ list_for_each_entry(trans, &net->nft.commit_list, list) { -+ if (trans->ctx.family != NFPROTO_NETDEV) -+ continue; -+ -+ switch (trans->msg_type) { -+ case NFT_MSG_NEWRULE: -+ if (!(trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD)) -+ continue; -+ -+ nft_flow_rule_destroy(nft_trans_flow_rule(trans)); -+ break; -+ default: -+ break; -+ } - } - - return err; -diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c -index f29bbc74c4bf..ff5ac173e897 100644 ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -197,9 +197,6 @@ static void nft_flow_offload_activate(const struct nft_ctx *ctx, - static void nft_flow_offload_destroy(const struct nft_ctx *ctx, - const struct nft_expr *expr) - { -- struct nft_flow_offload *priv = nft_expr_priv(expr); -- -- priv->flowtable->use--; - nf_ct_netns_put(ctx->net, ctx->family); - } - -diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c -index 317e3a9e8c5b..dda1e55d5801 100644 ---- a/net/netfilter/nft_meta.c -+++ b/net/netfilter/nft_meta.c -@@ -33,19 +33,19 @@ - - static DEFINE_PER_CPU(struct rnd_state, nft_prandom_state); - --static u8 nft_meta_weekday(unsigned long secs) -+static u8 nft_meta_weekday(time64_t secs) - { - unsigned int dse; - u8 wday; - - secs -= NFT_META_SECS_PER_MINUTE * sys_tz.tz_minuteswest; -- dse = secs / NFT_META_SECS_PER_DAY; -+ dse = div_u64(secs, NFT_META_SECS_PER_DAY); - wday = (4 + dse) % NFT_META_DAYS_PER_WEEK; - - return wday; - } - --static u32 nft_meta_hour(unsigned long secs) -+static u32 nft_meta_hour(time64_t secs) - { - struct tm tm; - -@@ -250,10 +250,10 @@ void nft_meta_get_eval(const struct nft_expr *expr, - nft_reg_store64(dest, ktime_get_real_ns()); - break; - case NFT_META_TIME_DAY: -- nft_reg_store8(dest, nft_meta_weekday(get_seconds())); -+ nft_reg_store8(dest, nft_meta_weekday(ktime_get_real_seconds())); - break; - case NFT_META_TIME_HOUR: -- *dest = nft_meta_hour(get_seconds()); -+ *dest = nft_meta_hour(ktime_get_real_seconds()); - break; - default: - WARN_ON(1); -diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h -index 7c7d10f2e0c1..5e99df80e80a 100644 ---- a/net/rxrpc/ar-internal.h -+++ b/net/rxrpc/ar-internal.h -@@ -209,6 +209,7 @@ struct rxrpc_skb_priv { - struct rxrpc_security { - const char *name; /* name of this service */ - u8 security_index; /* security type provided */ -+ u32 no_key_abort; /* Abort code indicating no key */ - - /* Initialise a security service */ - int (*init)(void); -@@ -977,8 +978,9 @@ static inline void rxrpc_reduce_conn_timer(struct rxrpc_connection *conn, - struct rxrpc_connection *rxrpc_find_service_conn_rcu(struct rxrpc_peer *, - struct sk_buff *); - struct rxrpc_connection *rxrpc_prealloc_service_connection(struct rxrpc_net *, gfp_t); --void rxrpc_new_incoming_connection(struct rxrpc_sock *, -- struct rxrpc_connection *, struct sk_buff *); -+void rxrpc_new_incoming_connection(struct rxrpc_sock *, struct rxrpc_connection *, -+ const struct rxrpc_security *, struct key *, -+ struct sk_buff *); - void rxrpc_unpublish_service_conn(struct rxrpc_connection *); - - /* -@@ -1103,7 +1105,9 @@ extern const struct rxrpc_security rxkad; - int __init rxrpc_init_security(void); - void rxrpc_exit_security(void); - int rxrpc_init_client_conn_security(struct rxrpc_connection *); --int rxrpc_init_server_conn_security(struct rxrpc_connection *); -+bool rxrpc_look_up_server_security(struct rxrpc_local *, struct rxrpc_sock *, -+ const struct rxrpc_security **, struct key **, -+ struct sk_buff *); - - /* - * sendmsg.c -diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c -index 135bf5cd8dd5..70e44abf106c 100644 ---- a/net/rxrpc/call_accept.c -+++ b/net/rxrpc/call_accept.c -@@ -239,6 +239,22 @@ void rxrpc_discard_prealloc(struct rxrpc_sock *rx) - kfree(b); - } - -+/* -+ * Ping the other end to fill our RTT cache and to retrieve the rwind -+ * and MTU parameters. -+ */ -+static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb) -+{ -+ struct rxrpc_skb_priv *sp = rxrpc_skb(skb); -+ ktime_t now = skb->tstamp; -+ -+ if (call->peer->rtt_usage < 3 || -+ ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), now)) -+ rxrpc_propose_ACK(call, RXRPC_ACK_PING, sp->hdr.serial, -+ true, true, -+ rxrpc_propose_ack_ping_for_params); -+} -+ - /* - * Allocate a new incoming call from the prealloc pool, along with a connection - * and a peer as necessary. -@@ -247,6 +263,8 @@ static struct rxrpc_call *rxrpc_alloc_incoming_call(struct rxrpc_sock *rx, - struct rxrpc_local *local, - struct rxrpc_peer *peer, - struct rxrpc_connection *conn, -+ const struct rxrpc_security *sec, -+ struct key *key, - struct sk_buff *skb) - { - struct rxrpc_backlog *b = rx->backlog; -@@ -294,7 +312,7 @@ static struct rxrpc_call *rxrpc_alloc_incoming_call(struct rxrpc_sock *rx, - conn->params.local = rxrpc_get_local(local); - conn->params.peer = peer; - rxrpc_see_connection(conn); -- rxrpc_new_incoming_connection(rx, conn, skb); -+ rxrpc_new_incoming_connection(rx, conn, sec, key, skb); - } else { - rxrpc_get_connection(conn); - } -@@ -333,9 +351,11 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local, - struct sk_buff *skb) - { - struct rxrpc_skb_priv *sp = rxrpc_skb(skb); -+ const struct rxrpc_security *sec = NULL; - struct rxrpc_connection *conn; - struct rxrpc_peer *peer = NULL; -- struct rxrpc_call *call; -+ struct rxrpc_call *call = NULL; -+ struct key *key = NULL; - - _enter(""); - -@@ -346,9 +366,7 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local, - sp->hdr.seq, RX_INVALID_OPERATION, ESHUTDOWN); - skb->mark = RXRPC_SKB_MARK_REJECT_ABORT; - skb->priority = RX_INVALID_OPERATION; -- _leave(" = NULL [close]"); -- call = NULL; -- goto out; -+ goto no_call; - } - - /* The peer, connection and call may all have sprung into existence due -@@ -358,29 +376,19 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local, - */ - conn = rxrpc_find_connection_rcu(local, skb, &peer); - -- call = rxrpc_alloc_incoming_call(rx, local, peer, conn, skb); -+ if (!conn && !rxrpc_look_up_server_security(local, rx, &sec, &key, skb)) -+ goto no_call; -+ -+ call = rxrpc_alloc_incoming_call(rx, local, peer, conn, sec, key, skb); -+ key_put(key); - if (!call) { - skb->mark = RXRPC_SKB_MARK_REJECT_BUSY; -- _leave(" = NULL [busy]"); -- call = NULL; -- goto out; -+ goto no_call; - } - - trace_rxrpc_receive(call, rxrpc_receive_incoming, - sp->hdr.serial, sp->hdr.seq); - -- /* Lock the call to prevent rxrpc_kernel_send/recv_data() and -- * sendmsg()/recvmsg() inconveniently stealing the mutex once the -- * notification is generated. -- * -- * The BUG should never happen because the kernel should be well -- * behaved enough not to access the call before the first notification -- * event and userspace is prevented from doing so until the state is -- * appropriate. -- */ -- if (!mutex_trylock(&call->user_mutex)) -- BUG(); -- - /* Make the call live. */ - rxrpc_incoming_call(rx, call, skb); - conn = call->conn; -@@ -421,6 +429,9 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local, - BUG(); - } - spin_unlock(&conn->state_lock); -+ spin_unlock(&rx->incoming_lock); -+ -+ rxrpc_send_ping(call, skb); - - if (call->state == RXRPC_CALL_SERVER_ACCEPTING) - rxrpc_notify_socket(call); -@@ -433,9 +444,12 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local, - rxrpc_put_call(call, rxrpc_call_put); - - _leave(" = %p{%d}", call, call->debug_id); --out: -- spin_unlock(&rx->incoming_lock); - return call; -+ -+no_call: -+ spin_unlock(&rx->incoming_lock); -+ _leave(" = NULL [%u]", skb->mark); -+ return NULL; - } - - /* -diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c -index a1ceef4f5cd0..808a4723f868 100644 ---- a/net/rxrpc/conn_event.c -+++ b/net/rxrpc/conn_event.c -@@ -376,21 +376,7 @@ static void rxrpc_secure_connection(struct rxrpc_connection *conn) - _enter("{%d}", conn->debug_id); - - ASSERT(conn->security_ix != 0); -- -- if (!conn->params.key) { -- _debug("set up security"); -- ret = rxrpc_init_server_conn_security(conn); -- switch (ret) { -- case 0: -- break; -- case -ENOENT: -- abort_code = RX_CALL_DEAD; -- goto abort; -- default: -- abort_code = RXKADNOAUTH; -- goto abort; -- } -- } -+ ASSERT(conn->server_key); - - if (conn->security->issue_challenge(conn) < 0) { - abort_code = RX_CALL_DEAD; -diff --git a/net/rxrpc/conn_service.c b/net/rxrpc/conn_service.c -index 123d6ceab15c..21da48e3d2e5 100644 ---- a/net/rxrpc/conn_service.c -+++ b/net/rxrpc/conn_service.c -@@ -148,6 +148,8 @@ struct rxrpc_connection *rxrpc_prealloc_service_connection(struct rxrpc_net *rxn - */ - void rxrpc_new_incoming_connection(struct rxrpc_sock *rx, - struct rxrpc_connection *conn, -+ const struct rxrpc_security *sec, -+ struct key *key, - struct sk_buff *skb) - { - struct rxrpc_skb_priv *sp = rxrpc_skb(skb); -@@ -160,6 +162,8 @@ void rxrpc_new_incoming_connection(struct rxrpc_sock *rx, - conn->service_id = sp->hdr.serviceId; - conn->security_ix = sp->hdr.securityIndex; - conn->out_clientflag = 0; -+ conn->security = sec; -+ conn->server_key = key_get(key); - if (conn->security_ix) - conn->state = RXRPC_CONN_SERVICE_UNSECURED; - else -diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c -index 157be1ff8697..86bd133b4fa0 100644 ---- a/net/rxrpc/input.c -+++ b/net/rxrpc/input.c -@@ -192,22 +192,6 @@ send_extra_data: - goto out_no_clear_ca; - } - --/* -- * Ping the other end to fill our RTT cache and to retrieve the rwind -- * and MTU parameters. -- */ --static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb) --{ -- struct rxrpc_skb_priv *sp = rxrpc_skb(skb); -- ktime_t now = skb->tstamp; -- -- if (call->peer->rtt_usage < 3 || -- ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), now)) -- rxrpc_propose_ACK(call, RXRPC_ACK_PING, sp->hdr.serial, -- true, true, -- rxrpc_propose_ack_ping_for_params); --} -- - /* - * Apply a hard ACK by advancing the Tx window. - */ -@@ -1396,8 +1380,6 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb) - call = rxrpc_new_incoming_call(local, rx, skb); - if (!call) - goto reject_packet; -- rxrpc_send_ping(call, skb); -- mutex_unlock(&call->user_mutex); - } - - /* Process a call packet; this either discards or passes on the ref -diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c -index 8d8aa3c230b5..098f1f9ec53b 100644 ---- a/net/rxrpc/rxkad.c -+++ b/net/rxrpc/rxkad.c -@@ -648,9 +648,9 @@ static int rxkad_issue_challenge(struct rxrpc_connection *conn) - u32 serial; - int ret; - -- _enter("{%d,%x}", conn->debug_id, key_serial(conn->params.key)); -+ _enter("{%d,%x}", conn->debug_id, key_serial(conn->server_key)); - -- ret = key_validate(conn->params.key); -+ ret = key_validate(conn->server_key); - if (ret < 0) - return ret; - -@@ -1293,6 +1293,7 @@ static void rxkad_exit(void) - const struct rxrpc_security rxkad = { - .name = "rxkad", - .security_index = RXRPC_SECURITY_RXKAD, -+ .no_key_abort = RXKADUNKNOWNKEY, - .init = rxkad_init, - .exit = rxkad_exit, - .init_connection_security = rxkad_init_connection_security, -diff --git a/net/rxrpc/security.c b/net/rxrpc/security.c -index a4c47d2b7054..9b1fb9ed0717 100644 ---- a/net/rxrpc/security.c -+++ b/net/rxrpc/security.c -@@ -101,62 +101,58 @@ int rxrpc_init_client_conn_security(struct rxrpc_connection *conn) - } - - /* -- * initialise the security on a server connection -+ * Find the security key for a server connection. - */ --int rxrpc_init_server_conn_security(struct rxrpc_connection *conn) -+bool rxrpc_look_up_server_security(struct rxrpc_local *local, struct rxrpc_sock *rx, -+ const struct rxrpc_security **_sec, -+ struct key **_key, -+ struct sk_buff *skb) - { - const struct rxrpc_security *sec; -- struct rxrpc_local *local = conn->params.local; -- struct rxrpc_sock *rx; -- struct key *key; -- key_ref_t kref; -+ struct rxrpc_skb_priv *sp = rxrpc_skb(skb); -+ key_ref_t kref = NULL; - char kdesc[5 + 1 + 3 + 1]; - - _enter(""); - -- sprintf(kdesc, "%u:%u", conn->service_id, conn->security_ix); -+ sprintf(kdesc, "%u:%u", sp->hdr.serviceId, sp->hdr.securityIndex); - -- sec = rxrpc_security_lookup(conn->security_ix); -+ sec = rxrpc_security_lookup(sp->hdr.securityIndex); - if (!sec) { -- _leave(" = -ENOKEY [lookup]"); -- return -ENOKEY; -+ trace_rxrpc_abort(0, "SVS", -+ sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq, -+ RX_INVALID_OPERATION, EKEYREJECTED); -+ skb->mark = RXRPC_SKB_MARK_REJECT_ABORT; -+ skb->priority = RX_INVALID_OPERATION; -+ return false; - } - -- /* find the service */ -- read_lock(&local->services_lock); -- rx = rcu_dereference_protected(local->service, -- lockdep_is_held(&local->services_lock)); -- if (rx && (rx->srx.srx_service == conn->service_id || -- rx->second_service == conn->service_id)) -- goto found_service; -+ if (sp->hdr.securityIndex == RXRPC_SECURITY_NONE) -+ goto out; - -- /* the service appears to have died */ -- read_unlock(&local->services_lock); -- _leave(" = -ENOENT"); -- return -ENOENT; -- --found_service: - if (!rx->securities) { -- read_unlock(&local->services_lock); -- _leave(" = -ENOKEY"); -- return -ENOKEY; -+ trace_rxrpc_abort(0, "SVR", -+ sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq, -+ RX_INVALID_OPERATION, EKEYREJECTED); -+ skb->mark = RXRPC_SKB_MARK_REJECT_ABORT; -+ skb->priority = RX_INVALID_OPERATION; -+ return false; - } - - /* look through the service's keyring */ - kref = keyring_search(make_key_ref(rx->securities, 1UL), - &key_type_rxrpc_s, kdesc, true); - if (IS_ERR(kref)) { -- read_unlock(&local->services_lock); -- _leave(" = %ld [search]", PTR_ERR(kref)); -- return PTR_ERR(kref); -+ trace_rxrpc_abort(0, "SVK", -+ sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq, -+ sec->no_key_abort, EKEYREJECTED); -+ skb->mark = RXRPC_SKB_MARK_REJECT_ABORT; -+ skb->priority = sec->no_key_abort; -+ return false; - } - -- key = key_ref_to_ptr(kref); -- read_unlock(&local->services_lock); -- -- conn->server_key = key; -- conn->security = sec; -- -- _leave(" = 0"); -- return 0; -+out: -+ *_sec = sec; -+ *_key = key_ref_to_ptr(kref); -+ return true; - } -diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c -index dd0e8680b030..2277369feae5 100644 ---- a/net/sched/sch_cake.c -+++ b/net/sched/sch_cake.c -@@ -2184,6 +2184,7 @@ static const struct nla_policy cake_policy[TCA_CAKE_MAX + 1] = { - [TCA_CAKE_MPU] = { .type = NLA_U32 }, - [TCA_CAKE_INGRESS] = { .type = NLA_U32 }, - [TCA_CAKE_ACK_FILTER] = { .type = NLA_U32 }, -+ [TCA_CAKE_SPLIT_GSO] = { .type = NLA_U32 }, - [TCA_CAKE_FWMARK] = { .type = NLA_U32 }, - }; - -diff --git a/net/socket.c b/net/socket.c -index ca8de9e1582d..432800b39ddb 100644 ---- a/net/socket.c -+++ b/net/socket.c -@@ -3532,6 +3532,7 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock, - case SIOCSARP: - case SIOCGARP: - case SIOCDARP: -+ case SIOCOUTQNSD: - case SIOCATMARK: - return sock_do_ioctl(net, sock, cmd, arg); - } -diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c -index 30065a28628c..9901a811f598 100644 ---- a/net/sunrpc/xprtrdma/frwr_ops.c -+++ b/net/sunrpc/xprtrdma/frwr_ops.c -@@ -570,7 +570,6 @@ void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) - */ - bad_wr = NULL; - rc = ib_post_send(r_xprt->rx_ia.ri_id->qp, first, &bad_wr); -- trace_xprtrdma_post_send(req, rc); - - /* The final LOCAL_INV WR in the chain is supposed to - * do the wake. If it was never posted, the wake will -@@ -583,6 +582,7 @@ void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) - - /* Recycle MRs in the LOCAL_INV chain that did not get posted. - */ -+ trace_xprtrdma_post_linv(req, rc); - while (bad_wr) { - frwr = container_of(bad_wr, struct rpcrdma_frwr, - fr_invwr); -@@ -673,12 +673,12 @@ void frwr_unmap_async(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) - */ - bad_wr = NULL; - rc = ib_post_send(r_xprt->rx_ia.ri_id->qp, first, &bad_wr); -- trace_xprtrdma_post_send(req, rc); - if (!rc) - return; - - /* Recycle MRs in the LOCAL_INV chain that did not get posted. - */ -+ trace_xprtrdma_post_linv(req, rc); - while (bad_wr) { - frwr = container_of(bad_wr, struct rpcrdma_frwr, fr_invwr); - mr = container_of(frwr, struct rpcrdma_mr, frwr); -diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c -index b86b5fd62d9f..ef5102b60589 100644 ---- a/net/sunrpc/xprtrdma/rpc_rdma.c -+++ b/net/sunrpc/xprtrdma/rpc_rdma.c -@@ -1362,6 +1362,7 @@ void rpcrdma_reply_handler(struct rpcrdma_rep *rep) - xprt->cwnd = credits << RPC_CWNDSHIFT; - spin_unlock(&xprt->transport_lock); - } -+ rpcrdma_post_recvs(r_xprt, false); - - req = rpcr_to_rdmar(rqst); - if (req->rl_reply) { -diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c -index 160558b4135e..c67d465dc062 100644 ---- a/net/sunrpc/xprtrdma/transport.c -+++ b/net/sunrpc/xprtrdma/transport.c -@@ -428,8 +428,11 @@ void xprt_rdma_close(struct rpc_xprt *xprt) - /* Prepare @xprt for the next connection by reinitializing - * its credit grant to one (see RFC 8166, Section 3.3.3). - */ -+ spin_lock(&xprt->transport_lock); - r_xprt->rx_buf.rb_credits = 1; -+ xprt->cong = 0; - xprt->cwnd = RPC_CWNDSHIFT; -+ spin_unlock(&xprt->transport_lock); - - out: - xprt->reestablish_timeout = 0; -diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c -index 3a907537e2cf..0f4d39fdb48f 100644 ---- a/net/sunrpc/xprtrdma/verbs.c -+++ b/net/sunrpc/xprtrdma/verbs.c -@@ -75,16 +75,15 @@ - * internal functions - */ - static void rpcrdma_sendctx_put_locked(struct rpcrdma_sendctx *sc); --static void rpcrdma_reps_destroy(struct rpcrdma_buffer *buf); -+static void rpcrdma_reqs_reset(struct rpcrdma_xprt *r_xprt); -+static void rpcrdma_reps_unmap(struct rpcrdma_xprt *r_xprt); - static void rpcrdma_mrs_create(struct rpcrdma_xprt *r_xprt); - static void rpcrdma_mrs_destroy(struct rpcrdma_buffer *buf); --static void rpcrdma_mr_free(struct rpcrdma_mr *mr); - static struct rpcrdma_regbuf * - rpcrdma_regbuf_alloc(size_t size, enum dma_data_direction direction, - gfp_t flags); - static void rpcrdma_regbuf_dma_unmap(struct rpcrdma_regbuf *rb); - static void rpcrdma_regbuf_free(struct rpcrdma_regbuf *rb); --static void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp); - - /* Wait for outstanding transport work to finish. ib_drain_qp - * handles the drains in the wrong order for us, so open code -@@ -170,7 +169,6 @@ rpcrdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc) - rdmab_addr(rep->rr_rdmabuf), - wc->byte_len, DMA_FROM_DEVICE); - -- rpcrdma_post_recvs(r_xprt, false); - rpcrdma_reply_handler(rep); - return; - -@@ -247,6 +245,7 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) - ia->ri_id->device->name, - rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt)); - #endif -+ init_completion(&ia->ri_remove_done); - set_bit(RPCRDMA_IAF_REMOVING, &ia->ri_flags); - ep->rep_connected = -ENODEV; - xprt_force_disconnect(xprt); -@@ -301,7 +300,6 @@ rpcrdma_create_id(struct rpcrdma_xprt *xprt, struct rpcrdma_ia *ia) - trace_xprtrdma_conn_start(xprt); - - init_completion(&ia->ri_done); -- init_completion(&ia->ri_remove_done); - - id = rdma_create_id(xprt->rx_xprt.xprt_net, rpcrdma_cm_event_handler, - xprt, RDMA_PS_TCP, IB_QPT_RC); -@@ -431,7 +429,7 @@ rpcrdma_ia_remove(struct rpcrdma_ia *ia) - /* The ULP is responsible for ensuring all DMA - * mappings and MRs are gone. - */ -- rpcrdma_reps_destroy(buf); -+ rpcrdma_reps_unmap(r_xprt); - list_for_each_entry(req, &buf->rb_allreqs, rl_all) { - rpcrdma_regbuf_dma_unmap(req->rl_rdmabuf); - rpcrdma_regbuf_dma_unmap(req->rl_sendbuf); -@@ -609,6 +607,7 @@ static int rpcrdma_ep_recreate_xprt(struct rpcrdma_xprt *r_xprt, - struct ib_qp_init_attr *qp_init_attr) - { - struct rpcrdma_ia *ia = &r_xprt->rx_ia; -+ struct rpcrdma_ep *ep = &r_xprt->rx_ep; - int rc, err; - - trace_xprtrdma_reinsert(r_xprt); -@@ -623,6 +622,7 @@ static int rpcrdma_ep_recreate_xprt(struct rpcrdma_xprt *r_xprt, - pr_err("rpcrdma: rpcrdma_ep_create returned %d\n", err); - goto out2; - } -+ memcpy(qp_init_attr, &ep->rep_attr, sizeof(*qp_init_attr)); - - rc = -ENETUNREACH; - err = rdma_create_qp(ia->ri_id, ia->ri_pd, qp_init_attr); -@@ -780,6 +780,7 @@ rpcrdma_ep_disconnect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia) - trace_xprtrdma_disconnect(r_xprt, rc); - - rpcrdma_xprt_drain(r_xprt); -+ rpcrdma_reqs_reset(r_xprt); - } - - /* Fixed-size circular FIFO queue. This implementation is wait-free and -@@ -965,7 +966,7 @@ rpcrdma_mrs_create(struct rpcrdma_xprt *r_xprt) - mr->mr_xprt = r_xprt; - - spin_lock(&buf->rb_lock); -- list_add(&mr->mr_list, &buf->rb_mrs); -+ rpcrdma_mr_push(mr, &buf->rb_mrs); - list_add(&mr->mr_all, &buf->rb_all_mrs); - spin_unlock(&buf->rb_lock); - } -@@ -1042,6 +1043,26 @@ out1: - return NULL; - } - -+/** -+ * rpcrdma_reqs_reset - Reset all reqs owned by a transport -+ * @r_xprt: controlling transport instance -+ * -+ * ASSUMPTION: the rb_allreqs list is stable for the duration, -+ * and thus can be walked without holding rb_lock. Eg. the -+ * caller is holding the transport send lock to exclude -+ * device removal or disconnection. -+ */ -+static void rpcrdma_reqs_reset(struct rpcrdma_xprt *r_xprt) -+{ -+ struct rpcrdma_buffer *buf = &r_xprt->rx_buf; -+ struct rpcrdma_req *req; -+ -+ list_for_each_entry(req, &buf->rb_allreqs, rl_all) { -+ /* Credits are valid only for one connection */ -+ req->rl_slot.rq_cong = 0; -+ } -+} -+ - static struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt, - bool temp) - { -@@ -1065,6 +1086,7 @@ static struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt, - rep->rr_recv_wr.sg_list = &rep->rr_rdmabuf->rg_iov; - rep->rr_recv_wr.num_sge = 1; - rep->rr_temp = temp; -+ list_add(&rep->rr_all, &r_xprt->rx_buf.rb_all_reps); - return rep; - - out_free: -@@ -1075,6 +1097,7 @@ out: - - static void rpcrdma_rep_destroy(struct rpcrdma_rep *rep) - { -+ list_del(&rep->rr_all); - rpcrdma_regbuf_free(rep->rr_rdmabuf); - kfree(rep); - } -@@ -1093,10 +1116,16 @@ static struct rpcrdma_rep *rpcrdma_rep_get_locked(struct rpcrdma_buffer *buf) - static void rpcrdma_rep_put(struct rpcrdma_buffer *buf, - struct rpcrdma_rep *rep) - { -- if (!rep->rr_temp) -- llist_add(&rep->rr_node, &buf->rb_free_reps); -- else -- rpcrdma_rep_destroy(rep); -+ llist_add(&rep->rr_node, &buf->rb_free_reps); -+} -+ -+static void rpcrdma_reps_unmap(struct rpcrdma_xprt *r_xprt) -+{ -+ struct rpcrdma_buffer *buf = &r_xprt->rx_buf; -+ struct rpcrdma_rep *rep; -+ -+ list_for_each_entry(rep, &buf->rb_all_reps, rr_all) -+ rpcrdma_regbuf_dma_unmap(rep->rr_rdmabuf); - } - - static void rpcrdma_reps_destroy(struct rpcrdma_buffer *buf) -@@ -1129,6 +1158,7 @@ int rpcrdma_buffer_create(struct rpcrdma_xprt *r_xprt) - - INIT_LIST_HEAD(&buf->rb_send_bufs); - INIT_LIST_HEAD(&buf->rb_allreqs); -+ INIT_LIST_HEAD(&buf->rb_all_reps); - - rc = -ENOMEM; - for (i = 0; i < buf->rb_max_requests; i++) { -@@ -1163,10 +1193,19 @@ out: - */ - void rpcrdma_req_destroy(struct rpcrdma_req *req) - { -+ struct rpcrdma_mr *mr; -+ - list_del(&req->rl_all); - -- while (!list_empty(&req->rl_free_mrs)) -- rpcrdma_mr_free(rpcrdma_mr_pop(&req->rl_free_mrs)); -+ while ((mr = rpcrdma_mr_pop(&req->rl_free_mrs))) { -+ struct rpcrdma_buffer *buf = &mr->mr_xprt->rx_buf; -+ -+ spin_lock(&buf->rb_lock); -+ list_del(&mr->mr_all); -+ spin_unlock(&buf->rb_lock); -+ -+ frwr_release_mr(mr); -+ } - - rpcrdma_regbuf_free(req->rl_recvbuf); - rpcrdma_regbuf_free(req->rl_sendbuf); -@@ -1174,24 +1213,28 @@ void rpcrdma_req_destroy(struct rpcrdma_req *req) - kfree(req); - } - --static void --rpcrdma_mrs_destroy(struct rpcrdma_buffer *buf) -+/** -+ * rpcrdma_mrs_destroy - Release all of a transport's MRs -+ * @buf: controlling buffer instance -+ * -+ * Relies on caller holding the transport send lock to protect -+ * removing mr->mr_list from req->rl_free_mrs safely. -+ */ -+static void rpcrdma_mrs_destroy(struct rpcrdma_buffer *buf) - { - struct rpcrdma_xprt *r_xprt = container_of(buf, struct rpcrdma_xprt, - rx_buf); - struct rpcrdma_mr *mr; -- unsigned int count; - -- count = 0; - spin_lock(&buf->rb_lock); - while ((mr = list_first_entry_or_null(&buf->rb_all_mrs, - struct rpcrdma_mr, - mr_all)) != NULL) { -+ list_del(&mr->mr_list); - list_del(&mr->mr_all); - spin_unlock(&buf->rb_lock); - - frwr_release_mr(mr); -- count++; - spin_lock(&buf->rb_lock); - } - spin_unlock(&buf->rb_lock); -@@ -1264,17 +1307,6 @@ void rpcrdma_mr_put(struct rpcrdma_mr *mr) - rpcrdma_mr_push(mr, &mr->mr_req->rl_free_mrs); - } - --static void rpcrdma_mr_free(struct rpcrdma_mr *mr) --{ -- struct rpcrdma_xprt *r_xprt = mr->mr_xprt; -- struct rpcrdma_buffer *buf = &r_xprt->rx_buf; -- -- mr->mr_req = NULL; -- spin_lock(&buf->rb_lock); -- rpcrdma_mr_push(mr, &buf->rb_mrs); -- spin_unlock(&buf->rb_lock); --} -- - /** - * rpcrdma_buffer_get - Get a request buffer - * @buffers: Buffer pool from which to obtain a buffer -@@ -1455,8 +1487,13 @@ rpcrdma_ep_post(struct rpcrdma_ia *ia, - return 0; - } - --static void --rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp) -+/** -+ * rpcrdma_post_recvs - Refill the Receive Queue -+ * @r_xprt: controlling transport instance -+ * @temp: mark Receive buffers to be deleted after use -+ * -+ */ -+void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp) - { - struct rpcrdma_buffer *buf = &r_xprt->rx_buf; - struct rpcrdma_ep *ep = &r_xprt->rx_ep; -@@ -1478,6 +1515,10 @@ rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp) - wr = NULL; - while (needed) { - rep = rpcrdma_rep_get_locked(buf); -+ if (rep && rep->rr_temp) { -+ rpcrdma_rep_destroy(rep); -+ continue; -+ } - if (!rep) - rep = rpcrdma_rep_create(r_xprt, temp); - if (!rep) -diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h -index 65e6b0eb862e..fc761679487c 100644 ---- a/net/sunrpc/xprtrdma/xprt_rdma.h -+++ b/net/sunrpc/xprtrdma/xprt_rdma.h -@@ -203,6 +203,7 @@ struct rpcrdma_rep { - struct xdr_stream rr_stream; - struct llist_node rr_node; - struct ib_recv_wr rr_recv_wr; -+ struct list_head rr_all; - }; - - /* To reduce the rate at which a transport invokes ib_post_recv -@@ -372,6 +373,7 @@ struct rpcrdma_buffer { - - struct list_head rb_allreqs; - struct list_head rb_all_mrs; -+ struct list_head rb_all_reps; - - struct llist_head rb_free_reps; - -@@ -474,6 +476,7 @@ void rpcrdma_ep_disconnect(struct rpcrdma_ep *, struct rpcrdma_ia *); - - int rpcrdma_ep_post(struct rpcrdma_ia *, struct rpcrdma_ep *, - struct rpcrdma_req *); -+void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp); - - /* - * Buffer calls - xprtrdma/verbs.c -diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c -index 0d8da809bea2..b3369d678f1a 100644 ---- a/net/unix/af_unix.c -+++ b/net/unix/af_unix.c -@@ -646,6 +646,9 @@ static __poll_t unix_poll(struct file *, struct socket *, poll_table *); - static __poll_t unix_dgram_poll(struct file *, struct socket *, - poll_table *); - static int unix_ioctl(struct socket *, unsigned int, unsigned long); -+#ifdef CONFIG_COMPAT -+static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); -+#endif - static int unix_shutdown(struct socket *, int); - static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t); - static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int); -@@ -687,6 +690,9 @@ static const struct proto_ops unix_stream_ops = { - .getname = unix_getname, - .poll = unix_poll, - .ioctl = unix_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = unix_compat_ioctl, -+#endif - .listen = unix_listen, - .shutdown = unix_shutdown, - .setsockopt = sock_no_setsockopt, -@@ -710,6 +716,9 @@ static const struct proto_ops unix_dgram_ops = { - .getname = unix_getname, - .poll = unix_dgram_poll, - .ioctl = unix_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = unix_compat_ioctl, -+#endif - .listen = sock_no_listen, - .shutdown = unix_shutdown, - .setsockopt = sock_no_setsockopt, -@@ -732,6 +741,9 @@ static const struct proto_ops unix_seqpacket_ops = { - .getname = unix_getname, - .poll = unix_dgram_poll, - .ioctl = unix_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = unix_compat_ioctl, -+#endif - .listen = unix_listen, - .shutdown = unix_shutdown, - .setsockopt = sock_no_setsockopt, -@@ -2582,6 +2594,13 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) - return err; - } - -+#ifdef CONFIG_COMPAT -+static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) -+{ -+ return unix_ioctl(sock, cmd, (unsigned long)compat_ptr(arg)); -+} -+#endif -+ - static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait) - { - struct sock *sk = sock->sk; -diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh -index 06495379fcd8..2998ddb323e3 100755 ---- a/scripts/link-vmlinux.sh -+++ b/scripts/link-vmlinux.sh -@@ -127,7 +127,8 @@ gen_btf() - cut -d, -f1 | cut -d' ' -f2) - bin_format=$(LANG=C ${OBJDUMP} -f ${1} | grep 'file format' | \ - awk '{print $4}') -- ${OBJCOPY} --dump-section .BTF=.btf.vmlinux.bin ${1} 2>/dev/null -+ ${OBJCOPY} --set-section-flags .BTF=alloc -O binary \ -+ --only-section=.BTF ${1} .btf.vmlinux.bin 2>/dev/null - ${OBJCOPY} -I binary -O ${bin_format} -B ${bin_arch} \ - --rename-section .data=.BTF .btf.vmlinux.bin ${2} - } -@@ -253,6 +254,10 @@ btf_vmlinux_bin_o="" - if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then - if gen_btf .tmp_vmlinux.btf .btf.vmlinux.bin.o ; then - btf_vmlinux_bin_o=.btf.vmlinux.bin.o -+ else -+ echo >&2 "Failed to generate BTF for vmlinux" -+ echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF" -+ exit 1 - fi - fi - -diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian -index 7c230016b08d..357dc56bcf30 100755 ---- a/scripts/package/mkdebian -+++ b/scripts/package/mkdebian -@@ -136,7 +136,7 @@ mkdir -p debian/source/ - echo "1.0" > debian/source/format - - echo $debarch > debian/arch --extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev)" -+extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev:native)" - extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUSTED_KEYRING libssl-dev:native)" - - # Generate a simple changelog template -diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c -index dd3d5942e669..c36bafbcd77e 100644 ---- a/security/tomoyo/common.c -+++ b/security/tomoyo/common.c -@@ -951,7 +951,8 @@ static bool tomoyo_manager(void) - exe = tomoyo_get_exe(); - if (!exe) - return false; -- list_for_each_entry_rcu(ptr, &tomoyo_kernel_namespace.policy_list[TOMOYO_ID_MANAGER], head.list) { -+ list_for_each_entry_rcu(ptr, &tomoyo_kernel_namespace.policy_list[TOMOYO_ID_MANAGER], head.list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (!ptr->head.is_deleted && - (!tomoyo_pathcmp(domainname, ptr->manager) || - !strcmp(exe, ptr->manager->name))) { -@@ -1095,7 +1096,8 @@ static int tomoyo_delete_domain(char *domainname) - if (mutex_lock_interruptible(&tomoyo_policy_lock)) - return -EINTR; - /* Is there an active domain? */ -- list_for_each_entry_rcu(domain, &tomoyo_domain_list, list) { -+ list_for_each_entry_rcu(domain, &tomoyo_domain_list, list, -+ srcu_read_lock_held(&tomoyo_ss)) { - /* Never delete tomoyo_kernel_domain */ - if (domain == &tomoyo_kernel_domain) - continue; -@@ -2778,7 +2780,8 @@ void tomoyo_check_profile(void) - - tomoyo_policy_loaded = true; - pr_info("TOMOYO: 2.6.0\n"); -- list_for_each_entry_rcu(domain, &tomoyo_domain_list, list) { -+ list_for_each_entry_rcu(domain, &tomoyo_domain_list, list, -+ srcu_read_lock_held(&tomoyo_ss)) { - const u8 profile = domain->profile; - struct tomoyo_policy_namespace *ns = domain->ns; - -diff --git a/security/tomoyo/domain.c b/security/tomoyo/domain.c -index 8526a0a74023..7869d6a9980b 100644 ---- a/security/tomoyo/domain.c -+++ b/security/tomoyo/domain.c -@@ -41,7 +41,8 @@ int tomoyo_update_policy(struct tomoyo_acl_head *new_entry, const int size, - - if (mutex_lock_interruptible(&tomoyo_policy_lock)) - return -ENOMEM; -- list_for_each_entry_rcu(entry, list, list) { -+ list_for_each_entry_rcu(entry, list, list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (entry->is_deleted == TOMOYO_GC_IN_PROGRESS) - continue; - if (!check_duplicate(entry, new_entry)) -@@ -119,7 +120,8 @@ int tomoyo_update_domain(struct tomoyo_acl_info *new_entry, const int size, - } - if (mutex_lock_interruptible(&tomoyo_policy_lock)) - goto out; -- list_for_each_entry_rcu(entry, list, list) { -+ list_for_each_entry_rcu(entry, list, list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (entry->is_deleted == TOMOYO_GC_IN_PROGRESS) - continue; - if (!tomoyo_same_acl_head(entry, new_entry) || -@@ -166,7 +168,8 @@ void tomoyo_check_acl(struct tomoyo_request_info *r, - u16 i = 0; - - retry: -- list_for_each_entry_rcu(ptr, list, list) { -+ list_for_each_entry_rcu(ptr, list, list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (ptr->is_deleted || ptr->type != r->param_type) - continue; - if (!check_entry(r, ptr)) -@@ -298,7 +301,8 @@ static inline bool tomoyo_scan_transition - { - const struct tomoyo_transition_control *ptr; - -- list_for_each_entry_rcu(ptr, list, head.list) { -+ list_for_each_entry_rcu(ptr, list, head.list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (ptr->head.is_deleted || ptr->type != type) - continue; - if (ptr->domainname) { -@@ -735,7 +739,8 @@ retry: - - /* Check 'aggregator' directive. */ - candidate = &exename; -- list_for_each_entry_rcu(ptr, list, head.list) { -+ list_for_each_entry_rcu(ptr, list, head.list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (ptr->head.is_deleted || - !tomoyo_path_matches_pattern(&exename, - ptr->original_name)) -diff --git a/security/tomoyo/group.c b/security/tomoyo/group.c -index a37c7dc66e44..1cecdd797597 100644 ---- a/security/tomoyo/group.c -+++ b/security/tomoyo/group.c -@@ -133,7 +133,8 @@ tomoyo_path_matches_group(const struct tomoyo_path_info *pathname, - { - struct tomoyo_path_group *member; - -- list_for_each_entry_rcu(member, &group->member_list, head.list) { -+ list_for_each_entry_rcu(member, &group->member_list, head.list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (member->head.is_deleted) - continue; - if (!tomoyo_path_matches_pattern(pathname, member->member_name)) -@@ -161,7 +162,8 @@ bool tomoyo_number_matches_group(const unsigned long min, - struct tomoyo_number_group *member; - bool matched = false; - -- list_for_each_entry_rcu(member, &group->member_list, head.list) { -+ list_for_each_entry_rcu(member, &group->member_list, head.list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (member->head.is_deleted) - continue; - if (min > member->number.values[1] || -@@ -191,7 +193,8 @@ bool tomoyo_address_matches_group(const bool is_ipv6, const __be32 *address, - bool matched = false; - const u8 size = is_ipv6 ? 16 : 4; - -- list_for_each_entry_rcu(member, &group->member_list, head.list) { -+ list_for_each_entry_rcu(member, &group->member_list, head.list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (member->head.is_deleted) - continue; - if (member->address.is_ipv6 != is_ipv6) -diff --git a/security/tomoyo/util.c b/security/tomoyo/util.c -index 52752e1a84ed..eba0b3395851 100644 ---- a/security/tomoyo/util.c -+++ b/security/tomoyo/util.c -@@ -594,7 +594,8 @@ struct tomoyo_domain_info *tomoyo_find_domain(const char *domainname) - - name.name = domainname; - tomoyo_fill_path_info(&name); -- list_for_each_entry_rcu(domain, &tomoyo_domain_list, list) { -+ list_for_each_entry_rcu(domain, &tomoyo_domain_list, list, -+ srcu_read_lock_held(&tomoyo_ss)) { - if (!domain->is_deleted && - !tomoyo_pathcmp(&name, domain->domainname)) - return domain; -@@ -1028,7 +1029,8 @@ bool tomoyo_domain_quota_is_ok(struct tomoyo_request_info *r) - return false; - if (!domain) - return true; -- list_for_each_entry_rcu(ptr, &domain->acl_info_list, list) { -+ list_for_each_entry_rcu(ptr, &domain->acl_info_list, list, -+ srcu_read_lock_held(&tomoyo_ss)) { - u16 perm; - u8 i; - -diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c -index a78e4ab478df..c7a49d03463a 100644 ---- a/sound/soc/fsl/fsl_esai.c -+++ b/sound/soc/fsl/fsl_esai.c -@@ -33,6 +33,7 @@ - * @fsysclk: system clock source to derive HCK, SCK and FS - * @spbaclk: SPBA clock (optional, depending on SoC design) - * @task: tasklet to handle the reset operation -+ * @lock: spin lock between hw_reset() and trigger() - * @fifo_depth: depth of tx/rx FIFO - * @slot_width: width of each DAI slot - * @slots: number of slots -@@ -56,6 +57,7 @@ struct fsl_esai { - struct clk *fsysclk; - struct clk *spbaclk; - struct tasklet_struct task; -+ spinlock_t lock; /* Protect hw_reset and trigger */ - u32 fifo_depth; - u32 slot_width; - u32 slots; -@@ -676,8 +678,10 @@ static void fsl_esai_hw_reset(unsigned long arg) - { - struct fsl_esai *esai_priv = (struct fsl_esai *)arg; - bool tx = true, rx = false, enabled[2]; -+ unsigned long lock_flags; - u32 tfcr, rfcr; - -+ spin_lock_irqsave(&esai_priv->lock, lock_flags); - /* Save the registers */ - regmap_read(esai_priv->regmap, REG_ESAI_TFCR, &tfcr); - regmap_read(esai_priv->regmap, REG_ESAI_RFCR, &rfcr); -@@ -715,6 +719,8 @@ static void fsl_esai_hw_reset(unsigned long arg) - fsl_esai_trigger_start(esai_priv, tx); - if (enabled[rx]) - fsl_esai_trigger_start(esai_priv, rx); -+ -+ spin_unlock_irqrestore(&esai_priv->lock, lock_flags); - } - - static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd, -@@ -722,6 +728,7 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd, - { - struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); - bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; -+ unsigned long lock_flags; - - esai_priv->channels[tx] = substream->runtime->channels; - -@@ -729,12 +736,16 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd, - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: -+ spin_lock_irqsave(&esai_priv->lock, lock_flags); - fsl_esai_trigger_start(esai_priv, tx); -+ spin_unlock_irqrestore(&esai_priv->lock, lock_flags); - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: -+ spin_lock_irqsave(&esai_priv->lock, lock_flags); - fsl_esai_trigger_stop(esai_priv, tx); -+ spin_unlock_irqrestore(&esai_priv->lock, lock_flags); - break; - default: - return -EINVAL; -@@ -1002,6 +1013,7 @@ static int fsl_esai_probe(struct platform_device *pdev) - - dev_set_drvdata(&pdev->dev, esai_priv); - -+ spin_lock_init(&esai_priv->lock); - ret = fsl_esai_hw_init(esai_priv); - if (ret) - return ret; -diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig -index 01c99750212a..ef493cae78ff 100644 ---- a/sound/soc/intel/Kconfig -+++ b/sound/soc/intel/Kconfig -@@ -59,6 +59,9 @@ config SND_SOC_INTEL_HASWELL - If you have a Intel Haswell or Broadwell platform connected to - an I2S codec, then enable this option by saying Y or m. This is - typically used for Chromebooks. This is a recommended option. -+ This option is mutually exclusive with the SOF support on -+ Broadwell. If you want to enable SOF on Broadwell, you need to -+ deselect this option first. - - config SND_SOC_INTEL_BAYTRAIL - tristate "Baytrail (legacy) Platforms" -diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c -index e9596c2096cd..a6c1cf987e6e 100644 ---- a/sound/soc/sh/rcar/core.c -+++ b/sound/soc/sh/rcar/core.c -@@ -376,6 +376,17 @@ u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io) - */ - u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io) - { -+ static const u32 dalign_values[8][2] = { -+ {0x76543210, 0x67452301}, -+ {0x00000032, 0x00000023}, -+ {0x00007654, 0x00006745}, -+ {0x00000076, 0x00000067}, -+ {0xfedcba98, 0xefcdab89}, -+ {0x000000ba, 0x000000ab}, -+ {0x0000fedc, 0x0000efcd}, -+ {0x000000fe, 0x000000ef}, -+ }; -+ int id = 0, inv; - struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io); - struct rsnd_mod *target; - struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); -@@ -411,13 +422,18 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io) - target = cmd ? cmd : ssiu; - } - -+ if (mod == ssiu) -+ id = rsnd_mod_id_sub(mod); -+ - /* Non target mod or non 16bit needs normal DALIGN */ - if ((snd_pcm_format_width(runtime->format) != 16) || - (mod != target)) -- return 0x76543210; -+ inv = 0; - /* Target mod needs inverted DALIGN when 16bit */ - else -- return 0x67452301; -+ inv = 1; -+ -+ return dalign_values[id][inv]; - } - - u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod) -diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c -index 88978a3036c4..9d3b546bae7b 100644 ---- a/sound/soc/soc-core.c -+++ b/sound/soc/soc-core.c -@@ -1886,6 +1886,8 @@ match: - - /* convert non BE into BE */ - dai_link->no_pcm = 1; -+ dai_link->dpcm_playback = 1; -+ dai_link->dpcm_capture = 1; - - /* override any BE fixups */ - dai_link->be_hw_params_fixup = -diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c -index a6e96cf1d8ff..d07026a846b9 100644 ---- a/sound/soc/soc-pcm.c -+++ b/sound/soc/soc-pcm.c -@@ -1148,7 +1148,9 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe, - { - struct snd_soc_dpcm *dpcm; - unsigned long flags; -+#ifdef CONFIG_DEBUG_FS - char *name; -+#endif - - /* only add new dpcms */ - for_each_dpcm_be(fe, stream, dpcm) { -diff --git a/sound/soc/sof/imx/imx8.c b/sound/soc/sof/imx/imx8.c -index 2a22b18e5ec0..69785f688ddf 100644 ---- a/sound/soc/sof/imx/imx8.c -+++ b/sound/soc/sof/imx/imx8.c -@@ -209,7 +209,7 @@ static int imx8_probe(struct snd_sof_dev *sdev) - - priv->pd_dev = devm_kmalloc_array(&pdev->dev, priv->num_domains, - sizeof(*priv->pd_dev), GFP_KERNEL); -- if (!priv) -+ if (!priv->pd_dev) - return -ENOMEM; - - priv->link = devm_kmalloc_array(&pdev->dev, priv->num_domains, -@@ -304,6 +304,9 @@ static int imx8_probe(struct snd_sof_dev *sdev) - } - sdev->mailbox_bar = SOF_FW_BLK_TYPE_SRAM; - -+ /* set default mailbox offset for FW ready message */ -+ sdev->dsp_box.offset = MBOX_OFFSET; -+ - return 0; - - exit_pdev_unregister: -diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig -index d62f51d33be1..8421b97d949e 100644 ---- a/sound/soc/sof/intel/Kconfig -+++ b/sound/soc/sof/intel/Kconfig -@@ -76,10 +76,18 @@ config SND_SOC_SOF_BAYTRAIL - - config SND_SOC_SOF_BROADWELL_SUPPORT - bool "SOF support for Broadwell" -+ depends on SND_SOC_INTEL_HASWELL=n - help - This adds support for Sound Open Firmware for Intel(R) platforms - using the Broadwell processors. -- Say Y if you have such a device. -+ This option is mutually exclusive with the Haswell/Broadwell legacy -+ driver. If you want to enable SOF on Broadwell you need to deselect -+ the legacy driver first. -+ SOF does fully support Broadwell yet, so this option is not -+ recommended for distros. At some point all legacy drivers will be -+ deprecated but not before all userspace firmware/topology/UCM files -+ are made available to downstream distros. -+ Say Y if you want to enable SOF on Broadwell - If unsure select "N". - - config SND_SOC_SOF_BROADWELL -diff --git a/sound/soc/stm/stm32_spdifrx.c b/sound/soc/stm/stm32_spdifrx.c -index cd4b235fce57..e53fb4bd66b3 100644 ---- a/sound/soc/stm/stm32_spdifrx.c -+++ b/sound/soc/stm/stm32_spdifrx.c -@@ -12,7 +12,6 @@ - #include - #include - #include --#include - #include - #include - -@@ -220,6 +219,7 @@ - * @slave_config: dma slave channel runtime config pointer - * @phys_addr: SPDIFRX registers physical base address - * @lock: synchronization enabling lock -+ * @irq_lock: prevent race condition with IRQ on stream state - * @cs: channel status buffer - * @ub: user data buffer - * @irq: SPDIFRX interrupt line -@@ -240,6 +240,7 @@ struct stm32_spdifrx_data { - struct dma_slave_config slave_config; - dma_addr_t phys_addr; - spinlock_t lock; /* Sync enabling lock */ -+ spinlock_t irq_lock; /* Prevent race condition on stream state */ - unsigned char cs[SPDIFRX_CS_BYTES_NB]; - unsigned char ub[SPDIFRX_UB_BYTES_NB]; - int irq; -@@ -320,6 +321,7 @@ static void stm32_spdifrx_dma_ctrl_stop(struct stm32_spdifrx_data *spdifrx) - static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) - { - int cr, cr_mask, imr, ret; -+ unsigned long flags; - - /* Enable IRQs */ - imr = SPDIFRX_IMR_IFEIE | SPDIFRX_IMR_SYNCDIE | SPDIFRX_IMR_PERRIE; -@@ -327,7 +329,7 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) - if (ret) - return ret; - -- spin_lock(&spdifrx->lock); -+ spin_lock_irqsave(&spdifrx->lock, flags); - - spdifrx->refcount++; - -@@ -360,7 +362,7 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) - "Failed to start synchronization\n"); - } - -- spin_unlock(&spdifrx->lock); -+ spin_unlock_irqrestore(&spdifrx->lock, flags); - - return ret; - } -@@ -368,11 +370,12 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) - static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx) - { - int cr, cr_mask, reg; -+ unsigned long flags; - -- spin_lock(&spdifrx->lock); -+ spin_lock_irqsave(&spdifrx->lock, flags); - - if (--spdifrx->refcount) { -- spin_unlock(&spdifrx->lock); -+ spin_unlock_irqrestore(&spdifrx->lock, flags); - return; - } - -@@ -391,7 +394,7 @@ static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx) - regmap_read(spdifrx->regmap, STM32_SPDIFRX_DR, ®); - regmap_read(spdifrx->regmap, STM32_SPDIFRX_CSR, ®); - -- spin_unlock(&spdifrx->lock); -+ spin_unlock_irqrestore(&spdifrx->lock, flags); - } - - static int stm32_spdifrx_dma_ctrl_register(struct device *dev, -@@ -478,8 +481,6 @@ static int stm32_spdifrx_get_ctrl_data(struct stm32_spdifrx_data *spdifrx) - memset(spdifrx->cs, 0, SPDIFRX_CS_BYTES_NB); - memset(spdifrx->ub, 0, SPDIFRX_UB_BYTES_NB); - -- pinctrl_pm_select_default_state(&spdifrx->pdev->dev); -- - ret = stm32_spdifrx_dma_ctrl_start(spdifrx); - if (ret < 0) - return ret; -@@ -511,7 +512,6 @@ static int stm32_spdifrx_get_ctrl_data(struct stm32_spdifrx_data *spdifrx) - - end: - clk_disable_unprepare(spdifrx->kclk); -- pinctrl_pm_select_sleep_state(&spdifrx->pdev->dev); - - return ret; - } -@@ -663,7 +663,6 @@ static const struct regmap_config stm32_h7_spdifrx_regmap_conf = { - static irqreturn_t stm32_spdifrx_isr(int irq, void *devid) - { - struct stm32_spdifrx_data *spdifrx = (struct stm32_spdifrx_data *)devid; -- struct snd_pcm_substream *substream = spdifrx->substream; - struct platform_device *pdev = spdifrx->pdev; - unsigned int cr, mask, sr, imr; - unsigned int flags; -@@ -731,14 +730,19 @@ static irqreturn_t stm32_spdifrx_isr(int irq, void *devid) - regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR, - SPDIFRX_CR_SPDIFEN_MASK, cr); - -- if (substream) -- snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED); -+ spin_lock(&spdifrx->irq_lock); -+ if (spdifrx->substream) -+ snd_pcm_stop(spdifrx->substream, -+ SNDRV_PCM_STATE_DISCONNECTED); -+ spin_unlock(&spdifrx->irq_lock); - - return IRQ_HANDLED; - } - -- if (err_xrun && substream) -- snd_pcm_stop_xrun(substream); -+ spin_lock(&spdifrx->irq_lock); -+ if (err_xrun && spdifrx->substream) -+ snd_pcm_stop_xrun(spdifrx->substream); -+ spin_unlock(&spdifrx->irq_lock); - - return IRQ_HANDLED; - } -@@ -747,9 +751,12 @@ static int stm32_spdifrx_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *cpu_dai) - { - struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai); -+ unsigned long flags; - int ret; - -+ spin_lock_irqsave(&spdifrx->irq_lock, flags); - spdifrx->substream = substream; -+ spin_unlock_irqrestore(&spdifrx->irq_lock, flags); - - ret = clk_prepare_enable(spdifrx->kclk); - if (ret) -@@ -825,8 +832,12 @@ static void stm32_spdifrx_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *cpu_dai) - { - struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai); -+ unsigned long flags; - -+ spin_lock_irqsave(&spdifrx->irq_lock, flags); - spdifrx->substream = NULL; -+ spin_unlock_irqrestore(&spdifrx->irq_lock, flags); -+ - clk_disable_unprepare(spdifrx->kclk); - } - -@@ -930,6 +941,7 @@ static int stm32_spdifrx_probe(struct platform_device *pdev) - spdifrx->pdev = pdev; - init_completion(&spdifrx->cs_completion); - spin_lock_init(&spdifrx->lock); -+ spin_lock_init(&spdifrx->irq_lock); - - platform_set_drvdata(pdev, spdifrx); - -diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile -index 56ce6292071b..33e2638ef7f0 100644 ---- a/tools/lib/bpf/Makefile -+++ b/tools/lib/bpf/Makefile -@@ -215,7 +215,7 @@ check_abi: $(OUTPUT)libbpf.so - "versioned symbols in $^ ($(VERSIONED_SYM_COUNT))." \ - "Please make sure all LIBBPF_API symbols are" \ - "versioned in $(VERSION_SCRIPT)." >&2; \ -- readelf -s --wide $(OUTPUT)libbpf-in.o | \ -+ readelf -s --wide $(BPF_IN_SHARED) | \ - cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \ - awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$8}'| \ - sort -u > $(OUTPUT)libbpf_global_syms.tmp; \ -diff --git a/tools/pci/pcitest.c b/tools/pci/pcitest.c -index cb1e51fcc84e..32b7c6f9043d 100644 ---- a/tools/pci/pcitest.c -+++ b/tools/pci/pcitest.c -@@ -129,6 +129,7 @@ static int run_test(struct pci_test *test) - } - - fflush(stdout); -+ close(fd); - return (ret < 0) ? ret : 1 - ret; /* return 0 if test succeeded */ - } - -diff --git a/tools/perf/pmu-events/arch/s390/cf_z14/extended.json b/tools/perf/pmu-events/arch/s390/cf_z14/extended.json -index 68618152ea2c..89e070727e1b 100644 ---- a/tools/perf/pmu-events/arch/s390/cf_z14/extended.json -+++ b/tools/perf/pmu-events/arch/s390/cf_z14/extended.json -@@ -4,7 +4,7 @@ - "EventCode": "128", - "EventName": "L1D_RO_EXCL_WRITES", - "BriefDescription": "L1D Read-only Exclusive Writes", -- "PublicDescription": "L1D_RO_EXCL_WRITES A directory write to the Level-1 Data cache where the line was originally in a Read-Only state in the cache but has been updated to be in the Exclusive state that allows stores to the cache line" -+ "PublicDescription": "A directory write to the Level-1 Data cache where the line was originally in a Read-Only state in the cache but has been updated to be in the Exclusive state that allows stores to the cache line" - }, - { - "Unit": "CPU-M-CF", -diff --git a/tools/testing/selftests/firmware/fw_lib.sh b/tools/testing/selftests/firmware/fw_lib.sh -index b879305a766d..5b8c0fedee76 100755 ---- a/tools/testing/selftests/firmware/fw_lib.sh -+++ b/tools/testing/selftests/firmware/fw_lib.sh -@@ -34,6 +34,12 @@ test_modprobe() - - check_mods() - { -+ local uid=$(id -u) -+ if [ $uid -ne 0 ]; then -+ echo "skip all tests: must be run as root" >&2 -+ exit $ksft_skip -+ fi -+ - trap "test_modprobe" EXIT - if [ ! -d $DIR ]; then - modprobe test_firmware -diff --git a/tools/testing/selftests/net/forwarding/loopback.sh b/tools/testing/selftests/net/forwarding/loopback.sh -index 6e4626ae71b0..8f4057310b5b 100755 ---- a/tools/testing/selftests/net/forwarding/loopback.sh -+++ b/tools/testing/selftests/net/forwarding/loopback.sh -@@ -1,6 +1,9 @@ - #!/bin/bash - # SPDX-License-Identifier: GPL-2.0 - -+# Kselftest framework requirement - SKIP code is 4. -+ksft_skip=4 -+ - ALL_TESTS="loopback_test" - NUM_NETIFS=2 - source tc_common.sh -@@ -72,6 +75,11 @@ setup_prepare() - - h1_create - h2_create -+ -+ if ethtool -k $h1 | grep loopback | grep -q fixed; then -+ log_test "SKIP: dev $h1 does not support loopback feature" -+ exit $ksft_skip -+ fi - } - - cleanup() -diff --git a/tools/testing/selftests/rseq/settings b/tools/testing/selftests/rseq/settings -new file mode 100644 -index 000000000000..e7b9417537fb ---- /dev/null -+++ b/tools/testing/selftests/rseq/settings -@@ -0,0 +1 @@ -+timeout=0