diff --git a/patch/kernel/sunxi-current/patch-5.10.6-7.patch b/patch/kernel/sunxi-current/patch-5.10.6-7.patch deleted file mode 100644 index 4907b5ff7c..0000000000 --- a/patch/kernel/sunxi-current/patch-5.10.6-7.patch +++ /dev/null @@ -1,5134 +0,0 @@ -diff --git a/Makefile b/Makefile -index 2b3f0d06b0054..9b6c90eed5e9c 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0 - VERSION = 5 - PATCHLEVEL = 10 --SUBLEVEL = 6 -+SUBLEVEL = 7 - EXTRAVERSION = - NAME = Kleptomaniac Octopus - -@@ -450,7 +450,7 @@ LEX = flex - YACC = bison - AWK = awk - INSTALLKERNEL := installkernel --DEPMOD = /sbin/depmod -+DEPMOD = depmod - PERL = perl - PYTHON = python - PYTHON3 = python3 -diff --git a/arch/alpha/include/asm/local64.h b/arch/alpha/include/asm/local64.h -deleted file mode 100644 -index 36c93b5cc239b..0000000000000 ---- a/arch/alpha/include/asm/local64.h -+++ /dev/null -@@ -1 +0,0 @@ --#include -diff --git a/arch/arc/include/asm/Kbuild b/arch/arc/include/asm/Kbuild -index 81f4edec0c2a9..3c1afa524b9c2 100644 ---- a/arch/arc/include/asm/Kbuild -+++ b/arch/arc/include/asm/Kbuild -@@ -1,7 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0 - generic-y += extable.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += parport.h - generic-y += user.h -diff --git a/arch/arm/boot/dts/omap3-n950-n9.dtsi b/arch/arm/boot/dts/omap3-n950-n9.dtsi -index 11d41e86f814d..7dde9fbb06d33 100644 ---- a/arch/arm/boot/dts/omap3-n950-n9.dtsi -+++ b/arch/arm/boot/dts/omap3-n950-n9.dtsi -@@ -494,3 +494,11 @@ - clock-names = "sysclk"; - }; - }; -+ -+&aes1_target { -+ status = "disabled"; -+}; -+ -+&aes2_target { -+ status = "disabled"; -+}; -diff --git a/arch/arm/include/asm/Kbuild b/arch/arm/include/asm/Kbuild -index 383635b68763c..f1398b9267c08 100644 ---- a/arch/arm/include/asm/Kbuild -+++ b/arch/arm/include/asm/Kbuild -@@ -2,7 +2,6 @@ - generic-y += early_ioremap.h - generic-y += extable.h - generic-y += flat.h --generic-y += local64.h - generic-y += parport.h - generic-y += seccomp.h - -diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile -index 6a87d592bd001..485b7dbd4f9e3 100644 ---- a/arch/arm64/Makefile -+++ b/arch/arm64/Makefile -@@ -10,7 +10,7 @@ - # - # Copyright (C) 1995-2001 by Russell King - --LDFLAGS_vmlinux :=--no-undefined -X -z norelro -+LDFLAGS_vmlinux :=--no-undefined -X - - ifeq ($(CONFIG_RELOCATABLE), y) - # Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour -@@ -110,16 +110,20 @@ KBUILD_CPPFLAGS += -mbig-endian - CHECKFLAGS += -D__AARCH64EB__ - # Prefer the baremetal ELF build target, but not all toolchains include - # it so fall back to the standard linux version if needed. --KBUILD_LDFLAGS += -EB $(call ld-option, -maarch64elfb, -maarch64linuxb) -+KBUILD_LDFLAGS += -EB $(call ld-option, -maarch64elfb, -maarch64linuxb -z norelro) - UTS_MACHINE := aarch64_be - else - KBUILD_CPPFLAGS += -mlittle-endian - CHECKFLAGS += -D__AARCH64EL__ - # Same as above, prefer ELF but fall back to linux target if needed. --KBUILD_LDFLAGS += -EL $(call ld-option, -maarch64elf, -maarch64linux) -+KBUILD_LDFLAGS += -EL $(call ld-option, -maarch64elf, -maarch64linux -z norelro) - UTS_MACHINE := aarch64 - endif - -+ifeq ($(CONFIG_LD_IS_LLD), y) -+KBUILD_LDFLAGS += -z norelro -+endif -+ - CHECKFLAGS += -D__aarch64__ - - ifeq ($(CONFIG_DYNAMIC_FTRACE_WITH_REGS),y) -diff --git a/arch/arm64/include/asm/Kbuild b/arch/arm64/include/asm/Kbuild -index ff9cbb6312128..07ac208edc894 100644 ---- a/arch/arm64/include/asm/Kbuild -+++ b/arch/arm64/include/asm/Kbuild -@@ -1,6 +1,5 @@ - # SPDX-License-Identifier: GPL-2.0 - generic-y += early_ioremap.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += qrwlock.h - generic-y += qspinlock.h -diff --git a/arch/csky/include/asm/Kbuild b/arch/csky/include/asm/Kbuild -index 64876e59e2ef9..2a5a4d94fafad 100644 ---- a/arch/csky/include/asm/Kbuild -+++ b/arch/csky/include/asm/Kbuild -@@ -2,7 +2,6 @@ - generic-y += asm-offsets.h - generic-y += gpio.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += qrwlock.h - generic-y += seccomp.h - generic-y += user.h -diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild -index ddf04f32b5467..60ee7f0d60a8f 100644 ---- a/arch/h8300/include/asm/Kbuild -+++ b/arch/h8300/include/asm/Kbuild -@@ -2,7 +2,6 @@ - generic-y += asm-offsets.h - generic-y += extable.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += parport.h - generic-y += spinlock.h -diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild -index 373964bb177e4..3ece3c93fe086 100644 ---- a/arch/hexagon/include/asm/Kbuild -+++ b/arch/hexagon/include/asm/Kbuild -@@ -2,5 +2,4 @@ - generic-y += extable.h - generic-y += iomap.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h -diff --git a/arch/ia64/include/asm/local64.h b/arch/ia64/include/asm/local64.h -deleted file mode 100644 -index 36c93b5cc239b..0000000000000 ---- a/arch/ia64/include/asm/local64.h -+++ /dev/null -@@ -1 +0,0 @@ --#include -diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild -index 1bff55aa2d54e..0dbf9c5c6faeb 100644 ---- a/arch/m68k/include/asm/Kbuild -+++ b/arch/m68k/include/asm/Kbuild -@@ -2,6 +2,5 @@ - generated-y += syscall_table.h - generic-y += extable.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += spinlock.h -diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild -index 63bce836b9f10..29b0e557aa7c5 100644 ---- a/arch/microblaze/include/asm/Kbuild -+++ b/arch/microblaze/include/asm/Kbuild -@@ -2,7 +2,6 @@ - generated-y += syscall_table.h - generic-y += extable.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += parport.h - generic-y += syscalls.h -diff --git a/arch/mips/include/asm/Kbuild b/arch/mips/include/asm/Kbuild -index 198b3bafdac97..95b4fa7bd0d1f 100644 ---- a/arch/mips/include/asm/Kbuild -+++ b/arch/mips/include/asm/Kbuild -@@ -6,7 +6,6 @@ generated-y += syscall_table_64_n64.h - generated-y += syscall_table_64_o32.h - generic-y += export.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += parport.h - generic-y += qrwlock.h -diff --git a/arch/nds32/include/asm/Kbuild b/arch/nds32/include/asm/Kbuild -index ff1e94299317d..82a4453c9c2d5 100644 ---- a/arch/nds32/include/asm/Kbuild -+++ b/arch/nds32/include/asm/Kbuild -@@ -4,6 +4,5 @@ generic-y += cmpxchg.h - generic-y += export.h - generic-y += gpio.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += parport.h - generic-y += user.h -diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild -index e3ee5c0bfe80f..a1bd2adc63e3a 100644 ---- a/arch/parisc/include/asm/Kbuild -+++ b/arch/parisc/include/asm/Kbuild -@@ -3,7 +3,6 @@ generated-y += syscall_table_32.h - generated-y += syscall_table_64.h - generated-y += syscall_table_c32.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += seccomp.h - generic-y += user.h -diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild -index 90cd5c53af666..e1f9b4ea1c537 100644 ---- a/arch/powerpc/include/asm/Kbuild -+++ b/arch/powerpc/include/asm/Kbuild -@@ -5,7 +5,6 @@ generated-y += syscall_table_c32.h - generated-y += syscall_table_spu.h - generic-y += export.h - generic-y += kvm_types.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += qrwlock.h - generic-y += vtime.h -diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S -index 6db90cdf11da8..f887f9d5b9e84 100644 ---- a/arch/powerpc/kernel/vmlinux.lds.S -+++ b/arch/powerpc/kernel/vmlinux.lds.S -@@ -85,7 +85,7 @@ SECTIONS - ALIGN_FUNCTION(); - #endif - /* careful! __ftr_alt_* sections need to be close to .text */ -- *(.text.hot TEXT_MAIN .text.fixup .text.unlikely .fixup __ftr_alt_* .ref.text); -+ *(.text.hot .text.hot.* TEXT_MAIN .text.fixup .text.unlikely .text.unlikely.* .fixup __ftr_alt_* .ref.text); - #ifdef CONFIG_PPC64 - *(.tramp.ftrace.text); - #endif -diff --git a/arch/riscv/include/asm/Kbuild b/arch/riscv/include/asm/Kbuild -index 59dd7be550054..445ccc97305a5 100644 ---- a/arch/riscv/include/asm/Kbuild -+++ b/arch/riscv/include/asm/Kbuild -@@ -3,6 +3,5 @@ generic-y += early_ioremap.h - generic-y += extable.h - generic-y += flat.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += user.h - generic-y += vmlinux.lds.h -diff --git a/arch/s390/include/asm/Kbuild b/arch/s390/include/asm/Kbuild -index 319efa0e6d024..1a18d7b82f86d 100644 ---- a/arch/s390/include/asm/Kbuild -+++ b/arch/s390/include/asm/Kbuild -@@ -7,5 +7,4 @@ generated-y += unistd_nr.h - generic-y += asm-offsets.h - generic-y += export.h - generic-y += kvm_types.h --generic-y += local64.h - generic-y += mcs_spinlock.h -diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild -index 7435182ef8465..fc44d9c88b419 100644 ---- a/arch/sh/include/asm/Kbuild -+++ b/arch/sh/include/asm/Kbuild -@@ -1,6 +1,5 @@ - # SPDX-License-Identifier: GPL-2.0 - generated-y += syscall_table.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += parport.h -diff --git a/arch/sparc/include/asm/Kbuild b/arch/sparc/include/asm/Kbuild -index 5269a704801fa..3688fdae50e45 100644 ---- a/arch/sparc/include/asm/Kbuild -+++ b/arch/sparc/include/asm/Kbuild -@@ -6,5 +6,4 @@ generated-y += syscall_table_64.h - generated-y += syscall_table_c32.h - generic-y += export.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h -diff --git a/arch/x86/include/asm/local64.h b/arch/x86/include/asm/local64.h -deleted file mode 100644 -index 36c93b5cc239b..0000000000000 ---- a/arch/x86/include/asm/local64.h -+++ /dev/null -@@ -1 +0,0 @@ --#include -diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c -index 23ad8e953dfb1..a29997e6cf9e6 100644 ---- a/arch/x86/kernel/cpu/mtrr/generic.c -+++ b/arch/x86/kernel/cpu/mtrr/generic.c -@@ -167,9 +167,6 @@ static u8 mtrr_type_lookup_variable(u64 start, u64 end, u64 *partial_end, - *repeat = 0; - *uniform = 1; - -- /* Make end inclusive instead of exclusive */ -- end--; -- - prev_match = MTRR_TYPE_INVALID; - for (i = 0; i < num_var_ranges; ++i) { - unsigned short start_state, end_state, inclusive; -@@ -261,6 +258,9 @@ u8 mtrr_type_lookup(u64 start, u64 end, u8 *uniform) - int repeat; - u64 partial_end; - -+ /* Make end inclusive instead of exclusive */ -+ end--; -+ - if (!mtrr_state_set) - return MTRR_TYPE_INVALID; - -diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c -index f3418428682b1..5a59e3315b340 100644 ---- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c -+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c -@@ -525,89 +525,70 @@ static void rdtgroup_remove(struct rdtgroup *rdtgrp) - kfree(rdtgrp); - } - --struct task_move_callback { -- struct callback_head work; -- struct rdtgroup *rdtgrp; --}; -- --static void move_myself(struct callback_head *head) -+static void _update_task_closid_rmid(void *task) - { -- struct task_move_callback *callback; -- struct rdtgroup *rdtgrp; -- -- callback = container_of(head, struct task_move_callback, work); -- rdtgrp = callback->rdtgrp; -- - /* -- * If resource group was deleted before this task work callback -- * was invoked, then assign the task to root group and free the -- * resource group. -+ * If the task is still current on this CPU, update PQR_ASSOC MSR. -+ * Otherwise, the MSR is updated when the task is scheduled in. - */ -- if (atomic_dec_and_test(&rdtgrp->waitcount) && -- (rdtgrp->flags & RDT_DELETED)) { -- current->closid = 0; -- current->rmid = 0; -- rdtgroup_remove(rdtgrp); -- } -- -- if (unlikely(current->flags & PF_EXITING)) -- goto out; -- -- preempt_disable(); -- /* update PQR_ASSOC MSR to make resource group go into effect */ -- resctrl_sched_in(); -- preempt_enable(); -+ if (task == current) -+ resctrl_sched_in(); -+} - --out: -- kfree(callback); -+static void update_task_closid_rmid(struct task_struct *t) -+{ -+ if (IS_ENABLED(CONFIG_SMP) && task_curr(t)) -+ smp_call_function_single(task_cpu(t), _update_task_closid_rmid, t, 1); -+ else -+ _update_task_closid_rmid(t); - } - - static int __rdtgroup_move_task(struct task_struct *tsk, - struct rdtgroup *rdtgrp) - { -- struct task_move_callback *callback; -- int ret; -- -- callback = kzalloc(sizeof(*callback), GFP_KERNEL); -- if (!callback) -- return -ENOMEM; -- callback->work.func = move_myself; -- callback->rdtgrp = rdtgrp; -+ /* If the task is already in rdtgrp, no need to move the task. */ -+ if ((rdtgrp->type == RDTCTRL_GROUP && tsk->closid == rdtgrp->closid && -+ tsk->rmid == rdtgrp->mon.rmid) || -+ (rdtgrp->type == RDTMON_GROUP && tsk->rmid == rdtgrp->mon.rmid && -+ tsk->closid == rdtgrp->mon.parent->closid)) -+ return 0; - - /* -- * Take a refcount, so rdtgrp cannot be freed before the -- * callback has been invoked. -+ * Set the task's closid/rmid before the PQR_ASSOC MSR can be -+ * updated by them. -+ * -+ * For ctrl_mon groups, move both closid and rmid. -+ * For monitor groups, can move the tasks only from -+ * their parent CTRL group. - */ -- atomic_inc(&rdtgrp->waitcount); -- ret = task_work_add(tsk, &callback->work, TWA_RESUME); -- if (ret) { -- /* -- * Task is exiting. Drop the refcount and free the callback. -- * No need to check the refcount as the group cannot be -- * deleted before the write function unlocks rdtgroup_mutex. -- */ -- atomic_dec(&rdtgrp->waitcount); -- kfree(callback); -- rdt_last_cmd_puts("Task exited\n"); -- } else { -- /* -- * For ctrl_mon groups move both closid and rmid. -- * For monitor groups, can move the tasks only from -- * their parent CTRL group. -- */ -- if (rdtgrp->type == RDTCTRL_GROUP) { -- tsk->closid = rdtgrp->closid; -+ -+ if (rdtgrp->type == RDTCTRL_GROUP) { -+ tsk->closid = rdtgrp->closid; -+ tsk->rmid = rdtgrp->mon.rmid; -+ } else if (rdtgrp->type == RDTMON_GROUP) { -+ if (rdtgrp->mon.parent->closid == tsk->closid) { - tsk->rmid = rdtgrp->mon.rmid; -- } else if (rdtgrp->type == RDTMON_GROUP) { -- if (rdtgrp->mon.parent->closid == tsk->closid) { -- tsk->rmid = rdtgrp->mon.rmid; -- } else { -- rdt_last_cmd_puts("Can't move task to different control group\n"); -- ret = -EINVAL; -- } -+ } else { -+ rdt_last_cmd_puts("Can't move task to different control group\n"); -+ return -EINVAL; - } - } -- return ret; -+ -+ /* -+ * Ensure the task's closid and rmid are written before determining if -+ * the task is current that will decide if it will be interrupted. -+ */ -+ barrier(); -+ -+ /* -+ * By now, the task's closid and rmid are set. If the task is current -+ * on a CPU, the PQR_ASSOC MSR needs to be updated to make the resource -+ * group go into effect. If the task is not current, the MSR will be -+ * updated when the task is scheduled in. -+ */ -+ update_task_closid_rmid(tsk); -+ -+ return 0; - } - - static bool is_closid_match(struct task_struct *t, struct rdtgroup *r) -diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h -index 9c4a9c8e43d90..581925e476d6c 100644 ---- a/arch/x86/kvm/mmu.h -+++ b/arch/x86/kvm/mmu.h -@@ -49,7 +49,7 @@ static inline u64 rsvd_bits(int s, int e) - if (e < s) - return 0; - -- return ((1ULL << (e - s + 1)) - 1) << s; -+ return ((2ULL << (e - s)) - 1) << s; - } - - void kvm_mmu_set_mmio_spte_mask(u64 mmio_value, u64 access_mask); -diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c -index 7a6ae9e90bd70..52f36c8790862 100644 ---- a/arch/x86/kvm/mmu/mmu.c -+++ b/arch/x86/kvm/mmu/mmu.c -@@ -3485,16 +3485,16 @@ static bool mmio_info_in_cache(struct kvm_vcpu *vcpu, u64 addr, bool direct) - * Return the level of the lowest level SPTE added to sptes. - * That SPTE may be non-present. - */ --static int get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes) -+static int get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes, int *root_level) - { - struct kvm_shadow_walk_iterator iterator; -- int leaf = vcpu->arch.mmu->root_level; -+ int leaf = -1; - u64 spte; - -- - walk_shadow_page_lockless_begin(vcpu); - -- for (shadow_walk_init(&iterator, vcpu, addr); -+ for (shadow_walk_init(&iterator, vcpu, addr), -+ *root_level = iterator.level; - shadow_walk_okay(&iterator); - __shadow_walk_next(&iterator, spte)) { - leaf = iterator.level; -@@ -3504,7 +3504,6 @@ static int get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes) - - if (!is_shadow_present_pte(spte)) - break; -- - } - - walk_shadow_page_lockless_end(vcpu); -@@ -3517,9 +3516,7 @@ static bool get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep) - { - u64 sptes[PT64_ROOT_MAX_LEVEL]; - struct rsvd_bits_validate *rsvd_check; -- int root = vcpu->arch.mmu->shadow_root_level; -- int leaf; -- int level; -+ int root, leaf, level; - bool reserved = false; - - if (!VALID_PAGE(vcpu->arch.mmu->root_hpa)) { -@@ -3528,9 +3525,14 @@ static bool get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep) - } - - if (is_tdp_mmu_root(vcpu->kvm, vcpu->arch.mmu->root_hpa)) -- leaf = kvm_tdp_mmu_get_walk(vcpu, addr, sptes); -+ leaf = kvm_tdp_mmu_get_walk(vcpu, addr, sptes, &root); - else -- leaf = get_walk(vcpu, addr, sptes); -+ leaf = get_walk(vcpu, addr, sptes, &root); -+ -+ if (unlikely(leaf < 0)) { -+ *sptep = 0ull; -+ return reserved; -+ } - - rsvd_check = &vcpu->arch.mmu->shadow_zero_check; - -diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c -index 84c8f06bec261..b9265a585ea3c 100644 ---- a/arch/x86/kvm/mmu/tdp_mmu.c -+++ b/arch/x86/kvm/mmu/tdp_mmu.c -@@ -42,7 +42,48 @@ void kvm_mmu_uninit_tdp_mmu(struct kvm *kvm) - WARN_ON(!list_empty(&kvm->arch.tdp_mmu_roots)); - } - --#define for_each_tdp_mmu_root(_kvm, _root) \ -+static void tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root) -+{ -+ if (kvm_mmu_put_root(kvm, root)) -+ kvm_tdp_mmu_free_root(kvm, root); -+} -+ -+static inline bool tdp_mmu_next_root_valid(struct kvm *kvm, -+ struct kvm_mmu_page *root) -+{ -+ lockdep_assert_held(&kvm->mmu_lock); -+ -+ if (list_entry_is_head(root, &kvm->arch.tdp_mmu_roots, link)) -+ return false; -+ -+ kvm_mmu_get_root(kvm, root); -+ return true; -+ -+} -+ -+static inline struct kvm_mmu_page *tdp_mmu_next_root(struct kvm *kvm, -+ struct kvm_mmu_page *root) -+{ -+ struct kvm_mmu_page *next_root; -+ -+ next_root = list_next_entry(root, link); -+ tdp_mmu_put_root(kvm, root); -+ return next_root; -+} -+ -+/* -+ * Note: this iterator gets and puts references to the roots it iterates over. -+ * This makes it safe to release the MMU lock and yield within the loop, but -+ * if exiting the loop early, the caller must drop the reference to the most -+ * recent root. (Unless keeping a live reference is desirable.) -+ */ -+#define for_each_tdp_mmu_root_yield_safe(_kvm, _root) \ -+ for (_root = list_first_entry(&_kvm->arch.tdp_mmu_roots, \ -+ typeof(*_root), link); \ -+ tdp_mmu_next_root_valid(_kvm, _root); \ -+ _root = tdp_mmu_next_root(_kvm, _root)) -+ -+#define for_each_tdp_mmu_root(_kvm, _root) \ - list_for_each_entry(_root, &_kvm->arch.tdp_mmu_roots, link) - - bool is_tdp_mmu_root(struct kvm *kvm, hpa_t hpa) -@@ -439,18 +480,9 @@ bool kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, gfn_t start, gfn_t end) - struct kvm_mmu_page *root; - bool flush = false; - -- for_each_tdp_mmu_root(kvm, root) { -- /* -- * Take a reference on the root so that it cannot be freed if -- * this thread releases the MMU lock and yields in this loop. -- */ -- kvm_mmu_get_root(kvm, root); -- -+ for_each_tdp_mmu_root_yield_safe(kvm, root) - flush |= zap_gfn_range(kvm, root, start, end, true); - -- kvm_mmu_put_root(kvm, root); -- } -- - return flush; - } - -@@ -609,13 +641,7 @@ static int kvm_tdp_mmu_handle_hva_range(struct kvm *kvm, unsigned long start, - int ret = 0; - int as_id; - -- for_each_tdp_mmu_root(kvm, root) { -- /* -- * Take a reference on the root so that it cannot be freed if -- * this thread releases the MMU lock and yields in this loop. -- */ -- kvm_mmu_get_root(kvm, root); -- -+ for_each_tdp_mmu_root_yield_safe(kvm, root) { - as_id = kvm_mmu_page_as_id(root); - slots = __kvm_memslots(kvm, as_id); - kvm_for_each_memslot(memslot, slots) { -@@ -637,8 +663,6 @@ static int kvm_tdp_mmu_handle_hva_range(struct kvm *kvm, unsigned long start, - ret |= handler(kvm, memslot, root, gfn_start, - gfn_end, data); - } -- -- kvm_mmu_put_root(kvm, root); - } - - return ret; -@@ -826,21 +850,13 @@ bool kvm_tdp_mmu_wrprot_slot(struct kvm *kvm, struct kvm_memory_slot *slot, - int root_as_id; - bool spte_set = false; - -- for_each_tdp_mmu_root(kvm, root) { -+ for_each_tdp_mmu_root_yield_safe(kvm, root) { - root_as_id = kvm_mmu_page_as_id(root); - if (root_as_id != slot->as_id) - continue; - -- /* -- * Take a reference on the root so that it cannot be freed if -- * this thread releases the MMU lock and yields in this loop. -- */ -- kvm_mmu_get_root(kvm, root); -- - spte_set |= wrprot_gfn_range(kvm, root, slot->base_gfn, - slot->base_gfn + slot->npages, min_level); -- -- kvm_mmu_put_root(kvm, root); - } - - return spte_set; -@@ -894,21 +910,13 @@ bool kvm_tdp_mmu_clear_dirty_slot(struct kvm *kvm, struct kvm_memory_slot *slot) - int root_as_id; - bool spte_set = false; - -- for_each_tdp_mmu_root(kvm, root) { -+ for_each_tdp_mmu_root_yield_safe(kvm, root) { - root_as_id = kvm_mmu_page_as_id(root); - if (root_as_id != slot->as_id) - continue; - -- /* -- * Take a reference on the root so that it cannot be freed if -- * this thread releases the MMU lock and yields in this loop. -- */ -- kvm_mmu_get_root(kvm, root); -- - spte_set |= clear_dirty_gfn_range(kvm, root, slot->base_gfn, - slot->base_gfn + slot->npages); -- -- kvm_mmu_put_root(kvm, root); - } - - return spte_set; -@@ -1017,21 +1025,13 @@ bool kvm_tdp_mmu_slot_set_dirty(struct kvm *kvm, struct kvm_memory_slot *slot) - int root_as_id; - bool spte_set = false; - -- for_each_tdp_mmu_root(kvm, root) { -+ for_each_tdp_mmu_root_yield_safe(kvm, root) { - root_as_id = kvm_mmu_page_as_id(root); - if (root_as_id != slot->as_id) - continue; - -- /* -- * Take a reference on the root so that it cannot be freed if -- * this thread releases the MMU lock and yields in this loop. -- */ -- kvm_mmu_get_root(kvm, root); -- - spte_set |= set_dirty_gfn_range(kvm, root, slot->base_gfn, - slot->base_gfn + slot->npages); -- -- kvm_mmu_put_root(kvm, root); - } - return spte_set; - } -@@ -1077,21 +1077,13 @@ void kvm_tdp_mmu_zap_collapsible_sptes(struct kvm *kvm, - struct kvm_mmu_page *root; - int root_as_id; - -- for_each_tdp_mmu_root(kvm, root) { -+ for_each_tdp_mmu_root_yield_safe(kvm, root) { - root_as_id = kvm_mmu_page_as_id(root); - if (root_as_id != slot->as_id) - continue; - -- /* -- * Take a reference on the root so that it cannot be freed if -- * this thread releases the MMU lock and yields in this loop. -- */ -- kvm_mmu_get_root(kvm, root); -- - zap_collapsible_spte_range(kvm, root, slot->base_gfn, - slot->base_gfn + slot->npages); -- -- kvm_mmu_put_root(kvm, root); - } - } - -@@ -1148,12 +1140,15 @@ bool kvm_tdp_mmu_write_protect_gfn(struct kvm *kvm, - * Return the level of the lowest level SPTE added to sptes. - * That SPTE may be non-present. - */ --int kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes) -+int kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes, -+ int *root_level) - { - struct tdp_iter iter; - struct kvm_mmu *mmu = vcpu->arch.mmu; -- int leaf = vcpu->arch.mmu->shadow_root_level; - gfn_t gfn = addr >> PAGE_SHIFT; -+ int leaf = -1; -+ -+ *root_level = vcpu->arch.mmu->shadow_root_level; - - tdp_mmu_for_each_pte(iter, mmu, gfn, gfn + 1) { - leaf = iter.level; -diff --git a/arch/x86/kvm/mmu/tdp_mmu.h b/arch/x86/kvm/mmu/tdp_mmu.h -index 556e065503f69..cbbdbadd1526f 100644 ---- a/arch/x86/kvm/mmu/tdp_mmu.h -+++ b/arch/x86/kvm/mmu/tdp_mmu.h -@@ -44,5 +44,7 @@ void kvm_tdp_mmu_zap_collapsible_sptes(struct kvm *kvm, - bool kvm_tdp_mmu_write_protect_gfn(struct kvm *kvm, - struct kvm_memory_slot *slot, gfn_t gfn); - --int kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes); -+int kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes, -+ int *root_level); -+ - #endif /* __KVM_X86_MMU_TDP_MMU_H */ -diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c -index dfd82f51ba66b..f6a9e2e366425 100644 ---- a/arch/x86/mm/pgtable.c -+++ b/arch/x86/mm/pgtable.c -@@ -829,6 +829,8 @@ int pud_free_pmd_page(pud_t *pud, unsigned long addr) - } - - free_page((unsigned long)pmd_sv); -+ -+ pgtable_pmd_page_dtor(virt_to_page(pmd)); - free_page((unsigned long)pmd); - - return 1; -diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild -index c59c42a1221a8..adefb1636f7ae 100644 ---- a/arch/xtensa/include/asm/Kbuild -+++ b/arch/xtensa/include/asm/Kbuild -@@ -2,7 +2,6 @@ - generated-y += syscall_table.h - generic-y += extable.h - generic-y += kvm_para.h --generic-y += local64.h - generic-y += mcs_spinlock.h - generic-y += param.h - generic-y += qrwlock.h -diff --git a/block/blk-core.c b/block/blk-core.c -index 2db8bda43b6e6..2d53e2ff48ff8 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -424,11 +425,11 @@ EXPORT_SYMBOL(blk_cleanup_queue); - /** - * blk_queue_enter() - try to increase q->q_usage_counter - * @q: request queue pointer -- * @flags: BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PREEMPT -+ * @flags: BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PM - */ - int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags) - { -- const bool pm = flags & BLK_MQ_REQ_PREEMPT; -+ const bool pm = flags & BLK_MQ_REQ_PM; - - while (true) { - bool success = false; -@@ -440,7 +441,8 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags) - * responsible for ensuring that that counter is - * globally visible before the queue is unfrozen. - */ -- if (pm || !blk_queue_pm_only(q)) { -+ if ((pm && queue_rpm_status(q) != RPM_SUSPENDED) || -+ !blk_queue_pm_only(q)) { - success = true; - } else { - percpu_ref_put(&q->q_usage_counter); -@@ -465,8 +467,7 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags) - - wait_event(q->mq_freeze_wq, - (!q->mq_freeze_depth && -- (pm || (blk_pm_request_resume(q), -- !blk_queue_pm_only(q)))) || -+ blk_pm_resume_queue(pm, q)) || - blk_queue_dying(q)); - if (blk_queue_dying(q)) - return -ENODEV; -@@ -630,7 +631,7 @@ struct request *blk_get_request(struct request_queue *q, unsigned int op, - struct request *req; - - WARN_ON_ONCE(op & REQ_NOWAIT); -- WARN_ON_ONCE(flags & ~(BLK_MQ_REQ_NOWAIT | BLK_MQ_REQ_PREEMPT)); -+ WARN_ON_ONCE(flags & ~(BLK_MQ_REQ_NOWAIT | BLK_MQ_REQ_PM)); - - req = blk_mq_alloc_request(q, op, flags); - if (!IS_ERR(req) && q->mq_ops->initialize_rq_fn) -diff --git a/block/blk-iocost.c b/block/blk-iocost.c -index bbe86d1199dc5..7e963b457f2ec 100644 ---- a/block/blk-iocost.c -+++ b/block/blk-iocost.c -@@ -2525,8 +2525,8 @@ static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio) - bool use_debt, ioc_locked; - unsigned long flags; - -- /* bypass IOs if disabled or for root cgroup */ -- if (!ioc->enabled || !iocg->level) -+ /* bypass IOs if disabled, still initializing, or for root cgroup */ -+ if (!ioc->enabled || !iocg || !iocg->level) - return; - - /* calculate the absolute vtime cost */ -@@ -2653,14 +2653,14 @@ static void ioc_rqos_merge(struct rq_qos *rqos, struct request *rq, - struct bio *bio) - { - struct ioc_gq *iocg = blkg_to_iocg(bio->bi_blkg); -- struct ioc *ioc = iocg->ioc; -+ struct ioc *ioc = rqos_to_ioc(rqos); - sector_t bio_end = bio_end_sector(bio); - struct ioc_now now; - u64 vtime, abs_cost, cost; - unsigned long flags; - -- /* bypass if disabled or for root cgroup */ -- if (!ioc->enabled || !iocg->level) -+ /* bypass if disabled, still initializing, or for root cgroup */ -+ if (!ioc->enabled || !iocg || !iocg->level) - return; - - abs_cost = calc_vtime_cost(bio, iocg, true); -@@ -2837,6 +2837,12 @@ static int blk_iocost_init(struct request_queue *q) - ioc_refresh_params(ioc, true); - spin_unlock_irq(&ioc->lock); - -+ /* -+ * rqos must be added before activation to allow iocg_pd_init() to -+ * lookup the ioc from q. This means that the rqos methods may get -+ * called before policy activation completion, can't assume that the -+ * target bio has an iocg associated and need to test for NULL iocg. -+ */ - rq_qos_add(q, rqos); - ret = blkcg_activate_policy(q, &blkcg_policy_iocost); - if (ret) { -diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c -index 3094542e12ae0..4d6e83e5b4429 100644 ---- a/block/blk-mq-debugfs.c -+++ b/block/blk-mq-debugfs.c -@@ -129,6 +129,7 @@ static const char *const blk_queue_flag_name[] = { - QUEUE_FLAG_NAME(PCI_P2PDMA), - QUEUE_FLAG_NAME(ZONE_RESETALL), - QUEUE_FLAG_NAME(RQ_ALLOC_TIME), -+ QUEUE_FLAG_NAME(NOWAIT), - }; - #undef QUEUE_FLAG_NAME - -@@ -297,7 +298,6 @@ static const char *const rqf_name[] = { - RQF_NAME(MIXED_MERGE), - RQF_NAME(MQ_INFLIGHT), - RQF_NAME(DONTPREP), -- RQF_NAME(PREEMPT), - RQF_NAME(FAILED), - RQF_NAME(QUIET), - RQF_NAME(ELVPRIV), -diff --git a/block/blk-mq.c b/block/blk-mq.c -index 55bcee5dc0320..2a1eff60c7975 100644 ---- a/block/blk-mq.c -+++ b/block/blk-mq.c -@@ -292,8 +292,8 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data, - rq->mq_hctx = data->hctx; - rq->rq_flags = 0; - rq->cmd_flags = data->cmd_flags; -- if (data->flags & BLK_MQ_REQ_PREEMPT) -- rq->rq_flags |= RQF_PREEMPT; -+ if (data->flags & BLK_MQ_REQ_PM) -+ rq->rq_flags |= RQF_PM; - if (blk_queue_io_stat(data->q)) - rq->rq_flags |= RQF_IO_STAT; - INIT_LIST_HEAD(&rq->queuelist); -diff --git a/block/blk-pm.h b/block/blk-pm.h -index ea5507d23e759..a2283cc9f716d 100644 ---- a/block/blk-pm.h -+++ b/block/blk-pm.h -@@ -6,11 +6,14 @@ - #include - - #ifdef CONFIG_PM --static inline void blk_pm_request_resume(struct request_queue *q) -+static inline int blk_pm_resume_queue(const bool pm, struct request_queue *q) - { -- if (q->dev && (q->rpm_status == RPM_SUSPENDED || -- q->rpm_status == RPM_SUSPENDING)) -- pm_request_resume(q->dev); -+ if (!q->dev || !blk_queue_pm_only(q)) -+ return 1; /* Nothing to do */ -+ if (pm && q->rpm_status != RPM_SUSPENDED) -+ return 1; /* Request allowed */ -+ pm_request_resume(q->dev); -+ return 0; - } - - static inline void blk_pm_mark_last_busy(struct request *rq) -@@ -44,8 +47,9 @@ static inline void blk_pm_put_request(struct request *rq) - --rq->q->nr_pending; - } - #else --static inline void blk_pm_request_resume(struct request_queue *q) -+static inline int blk_pm_resume_queue(const bool pm, struct request_queue *q) - { -+ return 1; - } - - static inline void blk_pm_mark_last_busy(struct request *rq) -diff --git a/crypto/asymmetric_keys/asym_tpm.c b/crypto/asymmetric_keys/asym_tpm.c -index 378b18b9bc342..84a5d6af9609e 100644 ---- a/crypto/asymmetric_keys/asym_tpm.c -+++ b/crypto/asymmetric_keys/asym_tpm.c -@@ -354,7 +354,7 @@ static uint32_t derive_pub_key(const void *pub_key, uint32_t len, uint8_t *buf) - memcpy(cur, e, sizeof(e)); - cur += sizeof(e); - /* Zero parameters to satisfy set_pub_key ABI. */ -- memset(cur, 0, SETKEY_PARAMS_SIZE); -+ memzero_explicit(cur, SETKEY_PARAMS_SIZE); - - return cur - buf; - } -diff --git a/crypto/ecdh.c b/crypto/ecdh.c -index d56b8603dec95..96f80c8f8e304 100644 ---- a/crypto/ecdh.c -+++ b/crypto/ecdh.c -@@ -39,7 +39,8 @@ static int ecdh_set_secret(struct crypto_kpp *tfm, const void *buf, - struct ecdh params; - unsigned int ndigits; - -- if (crypto_ecdh_decode_key(buf, len, ¶ms) < 0) -+ if (crypto_ecdh_decode_key(buf, len, ¶ms) < 0 || -+ params.key_size > sizeof(ctx->private_key)) - return -EINVAL; - - ndigits = ecdh_supported_curve(params.curve_id); -diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c -index 65a3886f68c9e..5f0472c18bcbd 100644 ---- a/drivers/atm/idt77252.c -+++ b/drivers/atm/idt77252.c -@@ -3607,7 +3607,7 @@ static int idt77252_init_one(struct pci_dev *pcidev, - - if ((err = dma_set_mask_and_coherent(&pcidev->dev, DMA_BIT_MASK(32)))) { - printk("idt77252: can't enable DMA for PCI device at %s\n", pci_name(pcidev)); -- return err; -+ goto err_out_disable_pdev; - } - - card = kzalloc(sizeof(struct idt77252_dev), GFP_KERNEL); -diff --git a/drivers/base/core.c b/drivers/base/core.c -index e8cb66093f211..a6187f6380d8d 100644 ---- a/drivers/base/core.c -+++ b/drivers/base/core.c -@@ -4278,7 +4278,7 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode) - if (fwnode_is_primary(fn)) { - dev->fwnode = fn->secondary; - if (!(parent && fn == parent->fwnode)) -- fn->secondary = ERR_PTR(-ENODEV); -+ fn->secondary = NULL; - } else { - dev->fwnode = NULL; - } -diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c -index 376164cdf2ea9..78d635f1d1567 100644 ---- a/drivers/bluetooth/hci_h5.c -+++ b/drivers/bluetooth/hci_h5.c -@@ -251,12 +251,8 @@ static int h5_close(struct hci_uart *hu) - if (h5->vnd && h5->vnd->close) - h5->vnd->close(h5); - -- if (hu->serdev) -- serdev_device_close(hu->serdev); -- -- kfree_skb(h5->rx_skb); -- kfree(h5); -- h5 = NULL; -+ if (!hu->serdev) -+ kfree(h5); - - return 0; - } -diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c -index 844967f98866a..922416b3aaceb 100644 ---- a/drivers/dma-buf/dma-buf.c -+++ b/drivers/dma-buf/dma-buf.c -@@ -76,10 +76,6 @@ static void dma_buf_release(struct dentry *dentry) - - dmabuf->ops->release(dmabuf); - -- mutex_lock(&db_list.lock); -- list_del(&dmabuf->list_node); -- mutex_unlock(&db_list.lock); -- - if (dmabuf->resv == (struct dma_resv *)&dmabuf[1]) - dma_resv_fini(dmabuf->resv); - -@@ -88,6 +84,22 @@ static void dma_buf_release(struct dentry *dentry) - kfree(dmabuf); - } - -+static int dma_buf_file_release(struct inode *inode, struct file *file) -+{ -+ struct dma_buf *dmabuf; -+ -+ if (!is_dma_buf_file(file)) -+ return -EINVAL; -+ -+ dmabuf = file->private_data; -+ -+ mutex_lock(&db_list.lock); -+ list_del(&dmabuf->list_node); -+ mutex_unlock(&db_list.lock); -+ -+ return 0; -+} -+ - static const struct dentry_operations dma_buf_dentry_ops = { - .d_dname = dmabuffs_dname, - .d_release = dma_buf_release, -@@ -413,6 +425,7 @@ static void dma_buf_show_fdinfo(struct seq_file *m, struct file *file) - } - - static const struct file_operations dma_buf_fops = { -+ .release = dma_buf_file_release, - .mmap = dma_buf_mmap_internal, - .llseek = dma_buf_llseek, - .poll = dma_buf_poll, -diff --git a/drivers/dma/idxd/sysfs.c b/drivers/dma/idxd/sysfs.c -index 07a5db06a29ad..fb97c9f319a55 100644 ---- a/drivers/dma/idxd/sysfs.c -+++ b/drivers/dma/idxd/sysfs.c -@@ -379,7 +379,7 @@ int idxd_register_driver(void) - return 0; - - drv_fail: -- for (; i > 0; i--) -+ while (--i >= 0) - driver_unregister(&idxd_drvs[i]->drv); - return rc; - } -@@ -1639,7 +1639,7 @@ int idxd_register_bus_type(void) - return 0; - - bus_err: -- for (; i > 0; i--) -+ while (--i >= 0) - bus_unregister(idxd_bus_types[i]); - return rc; - } -diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c -index bcc80f428172b..bd3046e5a9348 100644 ---- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c -+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c -@@ -1046,7 +1046,7 @@ static void reloc_gpu_flush(struct i915_execbuffer *eb, struct reloc_cache *cach - GEM_BUG_ON(cache->rq_size >= obj->base.size / sizeof(u32)); - cache->rq_cmd[cache->rq_size] = MI_BATCH_BUFFER_END; - -- __i915_gem_object_flush_map(obj, 0, sizeof(u32) * (cache->rq_size + 1)); -+ i915_gem_object_flush_map(obj); - i915_gem_object_unpin_map(obj); - - intel_gt_chipset_flush(cache->rq->engine->gt); -@@ -1296,6 +1296,8 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb, - goto err_pool; - } - -+ memset32(cmd, 0, pool->obj->base.size / sizeof(u32)); -+ - batch = i915_vma_instance(pool->obj, vma->vm, NULL); - if (IS_ERR(batch)) { - err = PTR_ERR(batch); -diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c -index e88970256e8ef..e7362ec22aded 100644 ---- a/drivers/gpu/drm/i915/i915_cmd_parser.c -+++ b/drivers/gpu/drm/i915/i915_cmd_parser.c -@@ -1166,7 +1166,7 @@ static u32 *copy_batch(struct drm_i915_gem_object *dst_obj, - } - } - if (IS_ERR(src)) { -- unsigned long x, n; -+ unsigned long x, n, remain; - void *ptr; - - /* -@@ -1177,14 +1177,15 @@ static u32 *copy_batch(struct drm_i915_gem_object *dst_obj, - * We don't care about copying too much here as we only - * validate up to the end of the batch. - */ -+ remain = length; - if (!(dst_obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ)) -- length = round_up(length, -+ remain = round_up(remain, - boot_cpu_data.x86_clflush_size); - - ptr = dst; - x = offset_in_page(offset); -- for (n = offset >> PAGE_SHIFT; length; n++) { -- int len = min(length, PAGE_SIZE - x); -+ for (n = offset >> PAGE_SHIFT; remain; n++) { -+ int len = min(remain, PAGE_SIZE - x); - - src = kmap_atomic(i915_gem_object_get_page(src_obj, n)); - if (needs_clflush) -@@ -1193,13 +1194,15 @@ static u32 *copy_batch(struct drm_i915_gem_object *dst_obj, - kunmap_atomic(src); - - ptr += len; -- length -= len; -+ remain -= len; - x = 0; - } - } - - i915_gem_object_unpin_pages(src_obj); - -+ memset32(dst + length, 0, (dst_obj->base.size - length) / sizeof(u32)); -+ - /* dst_obj is returned with vmap pinned */ - return dst; - } -@@ -1392,11 +1395,6 @@ static unsigned long *alloc_whitelist(u32 batch_length) - - #define LENGTH_BIAS 2 - --static bool shadow_needs_clflush(struct drm_i915_gem_object *obj) --{ -- return !(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE); --} -- - /** - * intel_engine_cmd_parser() - parse a batch buffer for privilege violations - * @engine: the engine on which the batch is to execute -@@ -1539,16 +1537,9 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine, - ret = 0; /* allow execution */ - } - } -- -- if (shadow_needs_clflush(shadow->obj)) -- drm_clflush_virt_range(batch_end, 8); - } - -- if (shadow_needs_clflush(shadow->obj)) { -- void *ptr = page_mask_bits(shadow->obj->mm.mapping); -- -- drm_clflush_virt_range(ptr, (void *)(cmd + 1) - ptr); -- } -+ i915_gem_object_flush_map(shadow->obj); - - if (!IS_ERR_OR_NULL(jump_whitelist)) - kfree(jump_whitelist); -diff --git a/drivers/hwmon/amd_energy.c b/drivers/hwmon/amd_energy.c -index 3197cda7bcd9f..f22154863c98a 100644 ---- a/drivers/hwmon/amd_energy.c -+++ b/drivers/hwmon/amd_energy.c -@@ -222,7 +222,7 @@ static int amd_create_sensor(struct device *dev, - */ - cpus = num_present_cpus() / num_siblings; - -- s_config = devm_kcalloc(dev, cpus + sockets, -+ s_config = devm_kcalloc(dev, cpus + sockets + 1, - sizeof(u32), GFP_KERNEL); - if (!s_config) - return -ENOMEM; -@@ -254,6 +254,7 @@ static int amd_create_sensor(struct device *dev, - scnprintf(label_l[i], 10, "Esocket%u", (i - cpus)); - } - -+ s_config[i] = 0; - return 0; - } - -diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c -index 2162bc80f09e0..013ad33fbbc81 100644 ---- a/drivers/ide/ide-atapi.c -+++ b/drivers/ide/ide-atapi.c -@@ -223,7 +223,6 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq) - sense_rq->rq_disk = rq->rq_disk; - sense_rq->cmd_flags = REQ_OP_DRV_IN; - ide_req(sense_rq)->type = ATA_PRIV_SENSE; -- sense_rq->rq_flags |= RQF_PREEMPT; - - req->cmd[0] = GPCMD_REQUEST_SENSE; - req->cmd[4] = cmd_len; -diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c -index 1a53c7a752244..4867b67b60d69 100644 ---- a/drivers/ide/ide-io.c -+++ b/drivers/ide/ide-io.c -@@ -515,15 +515,10 @@ repeat: - * above to return us whatever is in the queue. Since we call - * ide_do_request() ourselves, we end up taking requests while - * the queue is blocked... -- * -- * We let requests forced at head of queue with ide-preempt -- * though. I hope that doesn't happen too much, hopefully not -- * unless the subdriver triggers such a thing in its own PM -- * state machine. - */ - if ((drive->dev_flags & IDE_DFLAG_BLOCKED) && - ata_pm_request(rq) == 0 && -- (rq->rq_flags & RQF_PREEMPT) == 0) { -+ (rq->rq_flags & RQF_PM) == 0) { - /* there should be no pending command at this point */ - ide_unlock_port(hwif); - goto plug_device; -diff --git a/drivers/ide/ide-pm.c b/drivers/ide/ide-pm.c -index 192e6c65d34e7..82ab308f1aafe 100644 ---- a/drivers/ide/ide-pm.c -+++ b/drivers/ide/ide-pm.c -@@ -77,7 +77,7 @@ int generic_ide_resume(struct device *dev) - } - - memset(&rqpm, 0, sizeof(rqpm)); -- rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, BLK_MQ_REQ_PREEMPT); -+ rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, BLK_MQ_REQ_PM); - ide_req(rq)->type = ATA_PRIV_PM_RESUME; - ide_req(rq)->special = &rqpm; - rqpm.pm_step = IDE_PM_START_RESUME; -diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c -index 3242ebd0bca36..4a10c9ff368c5 100644 ---- a/drivers/iommu/intel/svm.c -+++ b/drivers/iommu/intel/svm.c -@@ -142,7 +142,7 @@ static void intel_flush_svm_range_dev (struct intel_svm *svm, struct intel_svm_d - } - desc.qw2 = 0; - desc.qw3 = 0; -- qi_submit_sync(svm->iommu, &desc, 1, 0); -+ qi_submit_sync(sdev->iommu, &desc, 1, 0); - - if (sdev->dev_iotlb) { - desc.qw0 = QI_DEV_EIOTLB_PASID(svm->pasid) | -@@ -166,7 +166,7 @@ static void intel_flush_svm_range_dev (struct intel_svm *svm, struct intel_svm_d - } - desc.qw2 = 0; - desc.qw3 = 0; -- qi_submit_sync(svm->iommu, &desc, 1, 0); -+ qi_submit_sync(sdev->iommu, &desc, 1, 0); - } - } - -@@ -211,7 +211,7 @@ static void intel_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) - */ - rcu_read_lock(); - list_for_each_entry_rcu(sdev, &svm->devs, list) -- intel_pasid_tear_down_entry(svm->iommu, sdev->dev, -+ intel_pasid_tear_down_entry(sdev->iommu, sdev->dev, - svm->pasid, true); - rcu_read_unlock(); - -@@ -363,6 +363,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev, - } - sdev->dev = dev; - sdev->sid = PCI_DEVID(info->bus, info->devfn); -+ sdev->iommu = iommu; - - /* Only count users if device has aux domains */ - if (iommu_dev_feature_enabled(dev, IOMMU_DEV_FEAT_AUX)) -@@ -546,6 +547,7 @@ intel_svm_bind_mm(struct device *dev, unsigned int flags, - goto out; - } - sdev->dev = dev; -+ sdev->iommu = iommu; - - ret = intel_iommu_enable_pasid(iommu, dev); - if (ret) { -@@ -575,7 +577,6 @@ intel_svm_bind_mm(struct device *dev, unsigned int flags, - kfree(sdev); - goto out; - } -- svm->iommu = iommu; - - if (pasid_max > intel_pasid_max_id) - pasid_max = intel_pasid_max_id; -diff --git a/drivers/md/bcache/features.c b/drivers/md/bcache/features.c -index 6469223f0b777..d636b7b2d070c 100644 ---- a/drivers/md/bcache/features.c -+++ b/drivers/md/bcache/features.c -@@ -17,7 +17,7 @@ struct feature { - }; - - static struct feature feature_list[] = { -- {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_LARGE_BUCKET, -+ {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE, - "large_bucket"}, - {0, 0, 0 }, - }; -diff --git a/drivers/md/bcache/features.h b/drivers/md/bcache/features.h -index a1653c4780416..84fc2c0f01015 100644 ---- a/drivers/md/bcache/features.h -+++ b/drivers/md/bcache/features.h -@@ -13,11 +13,15 @@ - - /* Feature set definition */ - /* Incompat feature set */ --#define BCH_FEATURE_INCOMPAT_LARGE_BUCKET 0x0001 /* 32bit bucket size */ -+/* 32bit bucket size, obsoleted */ -+#define BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET 0x0001 -+/* real bucket size is (1 << bucket_size) */ -+#define BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE 0x0002 - --#define BCH_FEATURE_COMPAT_SUUP 0 --#define BCH_FEATURE_RO_COMPAT_SUUP 0 --#define BCH_FEATURE_INCOMPAT_SUUP BCH_FEATURE_INCOMPAT_LARGE_BUCKET -+#define BCH_FEATURE_COMPAT_SUPP 0 -+#define BCH_FEATURE_RO_COMPAT_SUPP 0 -+#define BCH_FEATURE_INCOMPAT_SUPP (BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET| \ -+ BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE) - - #define BCH_HAS_COMPAT_FEATURE(sb, mask) \ - ((sb)->feature_compat & (mask)) -@@ -77,7 +81,23 @@ static inline void bch_clear_feature_##name(struct cache_sb *sb) \ - ~BCH##_FEATURE_INCOMPAT_##flagname; \ - } - --BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LARGE_BUCKET); -+BCH_FEATURE_INCOMPAT_FUNCS(obso_large_bucket, OBSO_LARGE_BUCKET); -+BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LOG_LARGE_BUCKET_SIZE); -+ -+static inline bool bch_has_unknown_compat_features(struct cache_sb *sb) -+{ -+ return ((sb->feature_compat & ~BCH_FEATURE_COMPAT_SUPP) != 0); -+} -+ -+static inline bool bch_has_unknown_ro_compat_features(struct cache_sb *sb) -+{ -+ return ((sb->feature_ro_compat & ~BCH_FEATURE_RO_COMPAT_SUPP) != 0); -+} -+ -+static inline bool bch_has_unknown_incompat_features(struct cache_sb *sb) -+{ -+ return ((sb->feature_incompat & ~BCH_FEATURE_INCOMPAT_SUPP) != 0); -+} - - int bch_print_cache_set_feature_compat(struct cache_set *c, char *buf, int size); - int bch_print_cache_set_feature_ro_compat(struct cache_set *c, char *buf, int size); -diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c -index 46a00134a36ae..aa4531c2ce0df 100644 ---- a/drivers/md/bcache/super.c -+++ b/drivers/md/bcache/super.c -@@ -64,9 +64,25 @@ static unsigned int get_bucket_size(struct cache_sb *sb, struct cache_sb_disk *s - { - unsigned int bucket_size = le16_to_cpu(s->bucket_size); - -- if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES && -- bch_has_feature_large_bucket(sb)) -- bucket_size |= le16_to_cpu(s->bucket_size_hi) << 16; -+ if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES) { -+ if (bch_has_feature_large_bucket(sb)) { -+ unsigned int max, order; -+ -+ max = sizeof(unsigned int) * BITS_PER_BYTE - 1; -+ order = le16_to_cpu(s->bucket_size); -+ /* -+ * bcache tool will make sure the overflow won't -+ * happen, an error message here is enough. -+ */ -+ if (order > max) -+ pr_err("Bucket size (1 << %u) overflows\n", -+ order); -+ bucket_size = 1 << order; -+ } else if (bch_has_feature_obso_large_bucket(sb)) { -+ bucket_size += -+ le16_to_cpu(s->obso_bucket_size_hi) << 16; -+ } -+ } - - return bucket_size; - } -@@ -228,6 +244,20 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev, - sb->feature_compat = le64_to_cpu(s->feature_compat); - sb->feature_incompat = le64_to_cpu(s->feature_incompat); - sb->feature_ro_compat = le64_to_cpu(s->feature_ro_compat); -+ -+ /* Check incompatible features */ -+ err = "Unsupported compatible feature found"; -+ if (bch_has_unknown_compat_features(sb)) -+ goto err; -+ -+ err = "Unsupported read-only compatible feature found"; -+ if (bch_has_unknown_ro_compat_features(sb)) -+ goto err; -+ -+ err = "Unsupported incompatible feature found"; -+ if (bch_has_unknown_incompat_features(sb)) -+ goto err; -+ - err = read_super_common(sb, bdev, s); - if (err) - goto err; -diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c -index ff0bea1554f9b..3b320f3d48b30 100644 ---- a/drivers/net/bareudp.c -+++ b/drivers/net/bareudp.c -@@ -380,7 +380,7 @@ static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev, - goto free_dst; - - min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len + -- BAREUDP_BASE_HLEN + info->options_len + sizeof(struct iphdr); -+ BAREUDP_BASE_HLEN + info->options_len + sizeof(struct ipv6hdr); - - err = skb_cow_head(skb, min_headroom); - if (unlikely(err)) -@@ -534,6 +534,7 @@ static void bareudp_setup(struct net_device *dev) - SET_NETDEV_DEVTYPE(dev, &bareudp_type); - dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM; - dev->features |= NETIF_F_RXCSUM; -+ dev->features |= NETIF_F_LLTX; - dev->features |= NETIF_F_GSO_SOFTWARE; - dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXCSUM; - dev->hw_features |= NETIF_F_GSO_SOFTWARE; -diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c -index 09701c17f3f63..4b36d89bec061 100644 ---- a/drivers/net/dsa/lantiq_gswip.c -+++ b/drivers/net/dsa/lantiq_gswip.c -@@ -92,9 +92,7 @@ - GSWIP_MDIO_PHY_FDUP_MASK) - - /* GSWIP MII Registers */ --#define GSWIP_MII_CFG0 0x00 --#define GSWIP_MII_CFG1 0x02 --#define GSWIP_MII_CFG5 0x04 -+#define GSWIP_MII_CFGp(p) (0x2 * (p)) - #define GSWIP_MII_CFG_EN BIT(14) - #define GSWIP_MII_CFG_LDCLKDIS BIT(12) - #define GSWIP_MII_CFG_MODE_MIIP 0x0 -@@ -392,17 +390,9 @@ static void gswip_mii_mask(struct gswip_priv *priv, u32 clear, u32 set, - static void gswip_mii_mask_cfg(struct gswip_priv *priv, u32 clear, u32 set, - int port) - { -- switch (port) { -- case 0: -- gswip_mii_mask(priv, clear, set, GSWIP_MII_CFG0); -- break; -- case 1: -- gswip_mii_mask(priv, clear, set, GSWIP_MII_CFG1); -- break; -- case 5: -- gswip_mii_mask(priv, clear, set, GSWIP_MII_CFG5); -- break; -- } -+ /* There's no MII_CFG register for the CPU port */ -+ if (!dsa_is_cpu_port(priv->ds, port)) -+ gswip_mii_mask(priv, clear, set, GSWIP_MII_CFGp(port)); - } - - static void gswip_mii_mask_pcdu(struct gswip_priv *priv, u32 clear, u32 set, -@@ -822,9 +812,8 @@ static int gswip_setup(struct dsa_switch *ds) - gswip_mdio_mask(priv, 0xff, 0x09, GSWIP_MDIO_MDC_CFG1); - - /* Disable the xMII link */ -- gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_EN, 0, 0); -- gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_EN, 0, 1); -- gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_EN, 0, 5); -+ for (i = 0; i < priv->hw_info->max_ports; i++) -+ gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_EN, 0, i); - - /* enable special tag insertion on cpu port */ - gswip_switch_mask(priv, 0, GSWIP_FDMA_PCTRL_STEN, -@@ -1541,9 +1530,7 @@ static void gswip_phylink_mac_link_up(struct dsa_switch *ds, int port, - { - struct gswip_priv *priv = ds->priv; - -- /* Enable the xMII interface only for the external PHY */ -- if (interface != PHY_INTERFACE_MODE_INTERNAL) -- gswip_mii_mask_cfg(priv, 0, GSWIP_MII_CFG_EN, port); -+ gswip_mii_mask_cfg(priv, 0, GSWIP_MII_CFG_EN, port); - } - - static void gswip_get_strings(struct dsa_switch *ds, int port, u32 stringset, -diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c -index 0fdd19d99d99f..b1ae9eb8f2479 100644 ---- a/drivers/net/ethernet/broadcom/bcmsysport.c -+++ b/drivers/net/ethernet/broadcom/bcmsysport.c -@@ -2577,6 +2577,7 @@ static int bcm_sysport_probe(struct platform_device *pdev) - NETIF_F_HW_VLAN_CTAG_TX; - dev->hw_features |= dev->features; - dev->vlan_features |= dev->features; -+ dev->max_mtu = UMAC_MAX_MTU_SIZE; - - /* Request the WOL interrupt and advertise suspend if available */ - priv->wol_irq_disabled = 1; -diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c -index 0af0af2b70fe4..033bfab24ef2f 100644 ---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c -+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c -@@ -6790,8 +6790,10 @@ static int bnxt_hwrm_func_backing_store_qcaps(struct bnxt *bp) - ctx->tqm_fp_rings_count = resp->tqm_fp_rings_count; - if (!ctx->tqm_fp_rings_count) - ctx->tqm_fp_rings_count = bp->max_q; -+ else if (ctx->tqm_fp_rings_count > BNXT_MAX_TQM_FP_RINGS) -+ ctx->tqm_fp_rings_count = BNXT_MAX_TQM_FP_RINGS; - -- tqm_rings = ctx->tqm_fp_rings_count + 1; -+ tqm_rings = ctx->tqm_fp_rings_count + BNXT_MAX_TQM_SP_RINGS; - ctx_pg = kcalloc(tqm_rings, sizeof(*ctx_pg), GFP_KERNEL); - if (!ctx_pg) { - kfree(ctx); -@@ -6925,7 +6927,8 @@ static int bnxt_hwrm_func_backing_store_cfg(struct bnxt *bp, u32 enables) - pg_attr = &req.tqm_sp_pg_size_tqm_sp_lvl, - pg_dir = &req.tqm_sp_page_dir, - ena = FUNC_BACKING_STORE_CFG_REQ_ENABLES_TQM_SP; -- i < 9; i++, num_entries++, pg_attr++, pg_dir++, ena <<= 1) { -+ i < BNXT_MAX_TQM_RINGS; -+ i++, num_entries++, pg_attr++, pg_dir++, ena <<= 1) { - if (!(enables & ena)) - continue; - -@@ -12887,10 +12890,10 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev, - */ - static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev) - { -+ pci_ers_result_t result = PCI_ERS_RESULT_DISCONNECT; - struct net_device *netdev = pci_get_drvdata(pdev); - struct bnxt *bp = netdev_priv(netdev); - int err = 0, off; -- pci_ers_result_t result = PCI_ERS_RESULT_DISCONNECT; - - netdev_info(bp->dev, "PCI Slot Reset\n"); - -@@ -12919,22 +12922,8 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev) - pci_save_state(pdev); - - err = bnxt_hwrm_func_reset(bp); -- if (!err) { -- err = bnxt_hwrm_func_qcaps(bp); -- if (!err && netif_running(netdev)) -- err = bnxt_open(netdev); -- } -- bnxt_ulp_start(bp, err); -- if (!err) { -- bnxt_reenable_sriov(bp); -+ if (!err) - result = PCI_ERS_RESULT_RECOVERED; -- } -- } -- -- if (result != PCI_ERS_RESULT_RECOVERED) { -- if (netif_running(netdev)) -- dev_close(netdev); -- pci_disable_device(pdev); - } - - rtnl_unlock(); -@@ -12952,10 +12941,21 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev) - static void bnxt_io_resume(struct pci_dev *pdev) - { - struct net_device *netdev = pci_get_drvdata(pdev); -+ struct bnxt *bp = netdev_priv(netdev); -+ int err; - -+ netdev_info(bp->dev, "PCI Slot Resume\n"); - rtnl_lock(); - -- netif_device_attach(netdev); -+ err = bnxt_hwrm_func_qcaps(bp); -+ if (!err && netif_running(netdev)) -+ err = bnxt_open(netdev); -+ -+ bnxt_ulp_start(bp, err); -+ if (!err) { -+ bnxt_reenable_sriov(bp); -+ netif_device_attach(netdev); -+ } - - rtnl_unlock(); - } -diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h -index 47b3c31278798..e4e926c65118a 100644 ---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h -+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h -@@ -1435,6 +1435,11 @@ struct bnxt_ctx_pg_info { - struct bnxt_ctx_pg_info **ctx_pg_tbl; - }; - -+#define BNXT_MAX_TQM_SP_RINGS 1 -+#define BNXT_MAX_TQM_FP_RINGS 8 -+#define BNXT_MAX_TQM_RINGS \ -+ (BNXT_MAX_TQM_SP_RINGS + BNXT_MAX_TQM_FP_RINGS) -+ - struct bnxt_ctx_mem_info { - u32 qp_max_entries; - u16 qp_min_qp1_entries; -@@ -1473,7 +1478,7 @@ struct bnxt_ctx_mem_info { - struct bnxt_ctx_pg_info stat_mem; - struct bnxt_ctx_pg_info mrav_mem; - struct bnxt_ctx_pg_info tim_mem; -- struct bnxt_ctx_pg_info *tqm_mem[9]; -+ struct bnxt_ctx_pg_info *tqm_mem[BNXT_MAX_TQM_RINGS]; - }; - - struct bnxt_fw_health { -diff --git a/drivers/net/ethernet/ethoc.c b/drivers/net/ethernet/ethoc.c -index 0981fe9652e50..3d9b0b161e241 100644 ---- a/drivers/net/ethernet/ethoc.c -+++ b/drivers/net/ethernet/ethoc.c -@@ -1211,7 +1211,7 @@ static int ethoc_probe(struct platform_device *pdev) - ret = mdiobus_register(priv->mdio); - if (ret) { - dev_err(&netdev->dev, "failed to register MDIO bus\n"); -- goto free2; -+ goto free3; - } - - ret = ethoc_mdio_probe(netdev); -@@ -1243,6 +1243,7 @@ error2: - netif_napi_del(&priv->napi); - error: - mdiobus_unregister(priv->mdio); -+free3: - mdiobus_free(priv->mdio); - free2: - clk_disable_unprepare(priv->clk); -diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c -index ba8869c3d891c..6d853f018d531 100644 ---- a/drivers/net/ethernet/freescale/ucc_geth.c -+++ b/drivers/net/ethernet/freescale/ucc_geth.c -@@ -3889,6 +3889,7 @@ static int ucc_geth_probe(struct platform_device* ofdev) - INIT_WORK(&ugeth->timeout_work, ucc_geth_timeout_work); - netif_napi_add(dev, &ugeth->napi, ucc_geth_poll, 64); - dev->mtu = 1500; -+ dev->max_mtu = 1518; - - ugeth->msg_enable = netif_msg_init(debug.msg_enable, UGETH_MSG_DEFAULT); - ugeth->phy_interface = phy_interface; -@@ -3934,12 +3935,12 @@ static int ucc_geth_remove(struct platform_device* ofdev) - struct device_node *np = ofdev->dev.of_node; - - unregister_netdev(dev); -- free_netdev(dev); - ucc_geth_memclean(ugeth); - if (of_phy_is_fixed_link(np)) - of_phy_deregister_fixed_link(np); - of_node_put(ugeth->ug_info->tbi_node); - of_node_put(ugeth->ug_info->phy_node); -+ free_netdev(dev); - - return 0; - } -diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c -index 7165da0ee9aa5..a6e3f07caf99c 100644 ---- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c -+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c -@@ -415,6 +415,10 @@ static void __lb_other_process(struct hns_nic_ring_data *ring_data, - /* for mutl buffer*/ - new_skb = skb_copy(skb, GFP_ATOMIC); - dev_kfree_skb_any(skb); -+ if (!new_skb) { -+ netdev_err(ndev, "skb alloc failed\n"); -+ return; -+ } - skb = new_skb; - - check_ok = 0; -diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c -index da9450f187176..e2540cc00d34e 100644 ---- a/drivers/net/ethernet/ibm/ibmvnic.c -+++ b/drivers/net/ethernet/ibm/ibmvnic.c -@@ -932,6 +932,7 @@ static void release_resources(struct ibmvnic_adapter *adapter) - release_rx_pools(adapter); - - release_napi(adapter); -+ release_login_buffer(adapter); - release_login_rsp_buffer(adapter); - } - -@@ -2247,8 +2248,7 @@ static void __ibmvnic_reset(struct work_struct *work) - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(60 * HZ); - } -- } else if (!(rwi->reset_reason == VNIC_RESET_FATAL && -- adapter->from_passive_init)) { -+ } else { - rc = do_reset(adapter, rwi, reset_state); - } - kfree(rwi); -@@ -2869,9 +2869,7 @@ static int reset_one_sub_crq_queue(struct ibmvnic_adapter *adapter, - int rc; - - if (!scrq) { -- netdev_dbg(adapter->netdev, -- "Invalid scrq reset. irq (%d) or msgs (%p).\n", -- scrq->irq, scrq->msgs); -+ netdev_dbg(adapter->netdev, "Invalid scrq reset.\n"); - return -EINVAL; - } - -@@ -3768,7 +3766,9 @@ static int send_login(struct ibmvnic_adapter *adapter) - return -1; - } - -+ release_login_buffer(adapter); - release_login_rsp_buffer(adapter); -+ - client_data_len = vnic_client_data_len(adapter); - - buffer_size = -diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h -index ba7a0f8f69376..5b2143f4b1f85 100644 ---- a/drivers/net/ethernet/intel/e1000e/e1000.h -+++ b/drivers/net/ethernet/intel/e1000e/e1000.h -@@ -436,6 +436,7 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca); - #define FLAG2_DFLT_CRC_STRIPPING BIT(12) - #define FLAG2_CHECK_RX_HWTSTAMP BIT(13) - #define FLAG2_CHECK_SYSTIM_OVERFLOW BIT(14) -+#define FLAG2_ENABLE_S0IX_FLOWS BIT(15) - - #define E1000_RX_DESC_PS(R, i) \ - (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) -diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c -index 03215b0aee4bd..06442e6bef731 100644 ---- a/drivers/net/ethernet/intel/e1000e/ethtool.c -+++ b/drivers/net/ethernet/intel/e1000e/ethtool.c -@@ -23,6 +23,13 @@ struct e1000_stats { - int stat_offset; - }; - -+static const char e1000e_priv_flags_strings[][ETH_GSTRING_LEN] = { -+#define E1000E_PRIV_FLAGS_S0IX_ENABLED BIT(0) -+ "s0ix-enabled", -+}; -+ -+#define E1000E_PRIV_FLAGS_STR_LEN ARRAY_SIZE(e1000e_priv_flags_strings) -+ - #define E1000_STAT(str, m) { \ - .stat_string = str, \ - .type = E1000_STATS, \ -@@ -1776,6 +1783,8 @@ static int e1000e_get_sset_count(struct net_device __always_unused *netdev, - return E1000_TEST_LEN; - case ETH_SS_STATS: - return E1000_STATS_LEN; -+ case ETH_SS_PRIV_FLAGS: -+ return E1000E_PRIV_FLAGS_STR_LEN; - default: - return -EOPNOTSUPP; - } -@@ -2097,6 +2106,10 @@ static void e1000_get_strings(struct net_device __always_unused *netdev, - p += ETH_GSTRING_LEN; - } - break; -+ case ETH_SS_PRIV_FLAGS: -+ memcpy(data, e1000e_priv_flags_strings, -+ E1000E_PRIV_FLAGS_STR_LEN * ETH_GSTRING_LEN); -+ break; - } - } - -@@ -2305,6 +2318,37 @@ static int e1000e_get_ts_info(struct net_device *netdev, - return 0; - } - -+static u32 e1000e_get_priv_flags(struct net_device *netdev) -+{ -+ struct e1000_adapter *adapter = netdev_priv(netdev); -+ u32 priv_flags = 0; -+ -+ if (adapter->flags2 & FLAG2_ENABLE_S0IX_FLOWS) -+ priv_flags |= E1000E_PRIV_FLAGS_S0IX_ENABLED; -+ -+ return priv_flags; -+} -+ -+static int e1000e_set_priv_flags(struct net_device *netdev, u32 priv_flags) -+{ -+ struct e1000_adapter *adapter = netdev_priv(netdev); -+ unsigned int flags2 = adapter->flags2; -+ -+ flags2 &= ~FLAG2_ENABLE_S0IX_FLOWS; -+ if (priv_flags & E1000E_PRIV_FLAGS_S0IX_ENABLED) { -+ struct e1000_hw *hw = &adapter->hw; -+ -+ if (hw->mac.type < e1000_pch_cnp) -+ return -EINVAL; -+ flags2 |= FLAG2_ENABLE_S0IX_FLOWS; -+ } -+ -+ if (flags2 != adapter->flags2) -+ adapter->flags2 = flags2; -+ -+ return 0; -+} -+ - static const struct ethtool_ops e1000_ethtool_ops = { - .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS, - .get_drvinfo = e1000_get_drvinfo, -@@ -2336,6 +2380,8 @@ static const struct ethtool_ops e1000_ethtool_ops = { - .set_eee = e1000e_set_eee, - .get_link_ksettings = e1000_get_link_ksettings, - .set_link_ksettings = e1000_set_link_ksettings, -+ .get_priv_flags = e1000e_get_priv_flags, -+ .set_priv_flags = e1000e_set_priv_flags, - }; - - void e1000e_set_ethtool_ops(struct net_device *netdev) -diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c -index 9aa6fad8ed477..6fb46682b058a 100644 ---- a/drivers/net/ethernet/intel/e1000e/ich8lan.c -+++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c -@@ -1240,6 +1240,9 @@ static s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force) - return 0; - - if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID) { -+ struct e1000_adapter *adapter = hw->adapter; -+ bool firmware_bug = false; -+ - if (force) { - /* Request ME un-configure ULP mode in the PHY */ - mac_reg = er32(H2ME); -@@ -1248,16 +1251,24 @@ static s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force) - ew32(H2ME, mac_reg); - } - -- /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */ -+ /* Poll up to 2.5 seconds for ME to clear ULP_CFG_DONE. -+ * If this takes more than 1 second, show a warning indicating a -+ * firmware bug -+ */ - while (er32(FWSM) & E1000_FWSM_ULP_CFG_DONE) { -- if (i++ == 30) { -+ if (i++ == 250) { - ret_val = -E1000_ERR_PHY; - goto out; - } -+ if (i > 100 && !firmware_bug) -+ firmware_bug = true; - - usleep_range(10000, 11000); - } -- e_dbg("ULP_CONFIG_DONE cleared after %dmsec\n", i * 10); -+ if (firmware_bug) -+ e_warn("ULP_CONFIG_DONE took %dmsec. This is a firmware bug\n", i * 10); -+ else -+ e_dbg("ULP_CONFIG_DONE cleared after %dmsec\n", i * 10); - - if (force) { - mac_reg = er32(H2ME); -diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c -index 128ab6898070e..e9b82c209c2df 100644 ---- a/drivers/net/ethernet/intel/e1000e/netdev.c -+++ b/drivers/net/ethernet/intel/e1000e/netdev.c -@@ -103,45 +103,6 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = { - {0, NULL} - }; - --struct e1000e_me_supported { -- u16 device_id; /* supported device ID */ --}; -- --static const struct e1000e_me_supported me_supported[] = { -- {E1000_DEV_ID_PCH_LPT_I217_LM}, -- {E1000_DEV_ID_PCH_LPTLP_I218_LM}, -- {E1000_DEV_ID_PCH_I218_LM2}, -- {E1000_DEV_ID_PCH_I218_LM3}, -- {E1000_DEV_ID_PCH_SPT_I219_LM}, -- {E1000_DEV_ID_PCH_SPT_I219_LM2}, -- {E1000_DEV_ID_PCH_LBG_I219_LM3}, -- {E1000_DEV_ID_PCH_SPT_I219_LM4}, -- {E1000_DEV_ID_PCH_SPT_I219_LM5}, -- {E1000_DEV_ID_PCH_CNP_I219_LM6}, -- {E1000_DEV_ID_PCH_CNP_I219_LM7}, -- {E1000_DEV_ID_PCH_ICP_I219_LM8}, -- {E1000_DEV_ID_PCH_ICP_I219_LM9}, -- {E1000_DEV_ID_PCH_CMP_I219_LM10}, -- {E1000_DEV_ID_PCH_CMP_I219_LM11}, -- {E1000_DEV_ID_PCH_CMP_I219_LM12}, -- {E1000_DEV_ID_PCH_TGP_I219_LM13}, -- {E1000_DEV_ID_PCH_TGP_I219_LM14}, -- {E1000_DEV_ID_PCH_TGP_I219_LM15}, -- {0} --}; -- --static bool e1000e_check_me(u16 device_id) --{ -- struct e1000e_me_supported *id; -- -- for (id = (struct e1000e_me_supported *)me_supported; -- id->device_id; id++) -- if (device_id == id->device_id) -- return true; -- -- return false; --} -- - /** - * __ew32_prepare - prepare to write to MAC CSR register on certain parts - * @hw: pointer to the HW structure -@@ -6962,7 +6923,6 @@ static __maybe_unused int e1000e_pm_suspend(struct device *dev) - struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev)); - struct e1000_adapter *adapter = netdev_priv(netdev); - struct pci_dev *pdev = to_pci_dev(dev); -- struct e1000_hw *hw = &adapter->hw; - int rc; - - e1000e_flush_lpic(pdev); -@@ -6970,13 +6930,13 @@ static __maybe_unused int e1000e_pm_suspend(struct device *dev) - e1000e_pm_freeze(dev); - - rc = __e1000_shutdown(pdev, false); -- if (rc) -+ if (rc) { - e1000e_pm_thaw(dev); -- -- /* Introduce S0ix implementation */ -- if (hw->mac.type >= e1000_pch_cnp && -- !e1000e_check_me(hw->adapter->pdev->device)) -- e1000e_s0ix_entry_flow(adapter); -+ } else { -+ /* Introduce S0ix implementation */ -+ if (adapter->flags2 & FLAG2_ENABLE_S0IX_FLOWS) -+ e1000e_s0ix_entry_flow(adapter); -+ } - - return rc; - } -@@ -6986,12 +6946,10 @@ static __maybe_unused int e1000e_pm_resume(struct device *dev) - struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev)); - struct e1000_adapter *adapter = netdev_priv(netdev); - struct pci_dev *pdev = to_pci_dev(dev); -- struct e1000_hw *hw = &adapter->hw; - int rc; - - /* Introduce S0ix implementation */ -- if (hw->mac.type >= e1000_pch_cnp && -- !e1000e_check_me(hw->adapter->pdev->device)) -+ if (adapter->flags2 & FLAG2_ENABLE_S0IX_FLOWS) - e1000e_s0ix_exit_flow(adapter); - - rc = __e1000_resume(pdev); -@@ -7655,6 +7613,9 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) - if (!(adapter->flags & FLAG_HAS_AMT)) - e1000e_get_hw_control(adapter); - -+ if (hw->mac.type >= e1000_pch_cnp) -+ adapter->flags2 |= FLAG2_ENABLE_S0IX_FLOWS; -+ - strlcpy(netdev->name, "eth%d", sizeof(netdev->name)); - err = register_netdev(netdev); - if (err) -diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h -index d231a2cdd98ff..118473dfdcbd2 100644 ---- a/drivers/net/ethernet/intel/i40e/i40e.h -+++ b/drivers/net/ethernet/intel/i40e/i40e.h -@@ -120,6 +120,7 @@ enum i40e_state_t { - __I40E_RESET_INTR_RECEIVED, - __I40E_REINIT_REQUESTED, - __I40E_PF_RESET_REQUESTED, -+ __I40E_PF_RESET_AND_REBUILD_REQUESTED, - __I40E_CORE_RESET_REQUESTED, - __I40E_GLOBAL_RESET_REQUESTED, - __I40E_EMP_RESET_INTR_RECEIVED, -@@ -146,6 +147,8 @@ enum i40e_state_t { - }; - - #define I40E_PF_RESET_FLAG BIT_ULL(__I40E_PF_RESET_REQUESTED) -+#define I40E_PF_RESET_AND_REBUILD_FLAG \ -+ BIT_ULL(__I40E_PF_RESET_AND_REBUILD_REQUESTED) - - /* VSI state flags */ - enum i40e_vsi_state_t { -diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c -index 1337686bd0998..1db482d310c2d 100644 ---- a/drivers/net/ethernet/intel/i40e/i40e_main.c -+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c -@@ -36,6 +36,8 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf); - static void i40e_determine_queue_usage(struct i40e_pf *pf); - static int i40e_setup_pf_filter_control(struct i40e_pf *pf); - static void i40e_prep_for_reset(struct i40e_pf *pf, bool lock_acquired); -+static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit, -+ bool lock_acquired); - static int i40e_reset(struct i40e_pf *pf); - static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired); - static int i40e_setup_misc_vector_for_recovery_mode(struct i40e_pf *pf); -@@ -8536,6 +8538,14 @@ void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags, bool lock_acquired) - "FW LLDP is disabled\n" : - "FW LLDP is enabled\n"); - -+ } else if (reset_flags & I40E_PF_RESET_AND_REBUILD_FLAG) { -+ /* Request a PF Reset -+ * -+ * Resets PF and reinitializes PFs VSI. -+ */ -+ i40e_prep_for_reset(pf, lock_acquired); -+ i40e_reset_and_rebuild(pf, true, lock_acquired); -+ - } else if (reset_flags & BIT_ULL(__I40E_REINIT_REQUESTED)) { - int v; - -diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c -index 1b5390ec3d78a..61968e9174dab 100644 ---- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c -+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c -@@ -1772,7 +1772,7 @@ int i40e_pci_sriov_configure(struct pci_dev *pdev, int num_vfs) - if (num_vfs) { - if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) { - pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; -- i40e_do_reset_safe(pf, I40E_PF_RESET_FLAG); -+ i40e_do_reset_safe(pf, I40E_PF_RESET_AND_REBUILD_FLAG); - } - ret = i40e_pci_sriov_enable(pdev, num_vfs); - goto sriov_configure_out; -@@ -1781,7 +1781,7 @@ int i40e_pci_sriov_configure(struct pci_dev *pdev, int num_vfs) - if (!pci_vfs_assigned(pf->pdev)) { - i40e_free_vfs(pf); - pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED; -- i40e_do_reset_safe(pf, I40E_PF_RESET_FLAG); -+ i40e_do_reset_safe(pf, I40E_PF_RESET_AND_REBUILD_FLAG); - } else { - dev_warn(&pdev->dev, "Unable to free VFs because some are assigned to VMs.\n"); - ret = -EINVAL; -diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c -index 95543dfd4fe77..0a867d64d4675 100644 ---- a/drivers/net/ethernet/intel/iavf/iavf_main.c -+++ b/drivers/net/ethernet/intel/iavf/iavf_main.c -@@ -1834,11 +1834,9 @@ static int iavf_init_get_resources(struct iavf_adapter *adapter) - netif_tx_stop_all_queues(netdev); - if (CLIENT_ALLOWED(adapter)) { - err = iavf_lan_add_device(adapter); -- if (err) { -- rtnl_unlock(); -+ if (err) - dev_info(&pdev->dev, "Failed to add VF to client API service list: %d\n", - err); -- } - } - dev_info(&pdev->dev, "MAC address: %pM\n", adapter->hw.mac.addr); - if (netdev->features & NETIF_F_GRO) -diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c -index 4a9041ee1b391..c3e429445b83d 100644 ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -5232,7 +5232,7 @@ static int mvneta_probe(struct platform_device *pdev) - err = mvneta_port_power_up(pp, pp->phy_interface); - if (err < 0) { - dev_err(&pdev->dev, "can't power up port\n"); -- return err; -+ goto err_netdev; - } - - /* Armada3700 network controller does not support per-cpu -diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -index cea886c5bcb57..2026c923b5855 100644 ---- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -@@ -1231,7 +1231,7 @@ static void mvpp22_gop_init_rgmii(struct mvpp2_port *port) - - regmap_read(priv->sysctrl_base, GENCONF_CTRL0, &val); - if (port->gop_id == 2) -- val |= GENCONF_CTRL0_PORT0_RGMII | GENCONF_CTRL0_PORT1_RGMII; -+ val |= GENCONF_CTRL0_PORT0_RGMII; - else if (port->gop_id == 3) - val |= GENCONF_CTRL0_PORT1_RGMII_MII; - regmap_write(priv->sysctrl_base, GENCONF_CTRL0, val); -@@ -2370,17 +2370,18 @@ static void mvpp2_rx_pkts_coal_set(struct mvpp2_port *port, - static void mvpp2_tx_pkts_coal_set(struct mvpp2_port *port, - struct mvpp2_tx_queue *txq) - { -- unsigned int thread = mvpp2_cpu_to_thread(port->priv, get_cpu()); -+ unsigned int thread; - u32 val; - - if (txq->done_pkts_coal > MVPP2_TXQ_THRESH_MASK) - txq->done_pkts_coal = MVPP2_TXQ_THRESH_MASK; - - val = (txq->done_pkts_coal << MVPP2_TXQ_THRESH_OFFSET); -- mvpp2_thread_write(port->priv, thread, MVPP2_TXQ_NUM_REG, txq->id); -- mvpp2_thread_write(port->priv, thread, MVPP2_TXQ_THRESH_REG, val); -- -- put_cpu(); -+ /* PKT-coalescing registers are per-queue + per-thread */ -+ for (thread = 0; thread < MVPP2_MAX_THREADS; thread++) { -+ mvpp2_thread_write(port->priv, thread, MVPP2_TXQ_NUM_REG, txq->id); -+ mvpp2_thread_write(port->priv, thread, MVPP2_TXQ_THRESH_REG, val); -+ } - } - - static u32 mvpp2_usec_to_cycles(u32 usec, unsigned long clk_hz) -diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c -index 5692c6087bbb0..a30eb90ba3d28 100644 ---- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c -+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c -@@ -405,6 +405,38 @@ static int mvpp2_prs_tcam_first_free(struct mvpp2 *priv, unsigned char start, - return -EINVAL; - } - -+/* Drop flow control pause frames */ -+static void mvpp2_prs_drop_fc(struct mvpp2 *priv) -+{ -+ unsigned char da[ETH_ALEN] = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x01 }; -+ struct mvpp2_prs_entry pe; -+ unsigned int len; -+ -+ memset(&pe, 0, sizeof(pe)); -+ -+ /* For all ports - drop flow control frames */ -+ pe.index = MVPP2_PE_FC_DROP; -+ mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC); -+ -+ /* Set match on DA */ -+ len = ETH_ALEN; -+ while (len--) -+ mvpp2_prs_tcam_data_byte_set(&pe, len, da[len], 0xff); -+ -+ mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_DROP_MASK, -+ MVPP2_PRS_RI_DROP_MASK); -+ -+ mvpp2_prs_sram_bits_set(&pe, MVPP2_PRS_SRAM_LU_GEN_BIT, 1); -+ mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_FLOWS); -+ -+ /* Mask all ports */ -+ mvpp2_prs_tcam_port_map_set(&pe, MVPP2_PRS_PORT_MASK); -+ -+ /* Update shadow table and hw entry */ -+ mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_MAC); -+ mvpp2_prs_hw_write(priv, &pe); -+} -+ - /* Enable/disable dropping all mac da's */ - static void mvpp2_prs_mac_drop_all_set(struct mvpp2 *priv, int port, bool add) - { -@@ -1162,6 +1194,7 @@ static void mvpp2_prs_mac_init(struct mvpp2 *priv) - mvpp2_prs_hw_write(priv, &pe); - - /* Create dummy entries for drop all and promiscuous modes */ -+ mvpp2_prs_drop_fc(priv); - mvpp2_prs_mac_drop_all_set(priv, 0, false); - mvpp2_prs_mac_promisc_set(priv, 0, MVPP2_PRS_L2_UNI_CAST, false); - mvpp2_prs_mac_promisc_set(priv, 0, MVPP2_PRS_L2_MULTI_CAST, false); -@@ -1647,8 +1680,9 @@ static int mvpp2_prs_pppoe_init(struct mvpp2 *priv) - mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_IP6); - mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP6, - MVPP2_PRS_RI_L3_PROTO_MASK); -- /* Skip eth_type + 4 bytes of IPv6 header */ -- mvpp2_prs_sram_shift_set(&pe, MVPP2_ETH_TYPE_LEN + 4, -+ /* Jump to DIP of IPV6 header */ -+ mvpp2_prs_sram_shift_set(&pe, MVPP2_ETH_TYPE_LEN + 8 + -+ MVPP2_MAX_L3_ADDR_SIZE, - MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD); - /* Set L3 offset */ - mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3, -diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h -index e22f6c85d3803..4b68dd3747338 100644 ---- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h -+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h -@@ -129,7 +129,7 @@ - #define MVPP2_PE_VID_EDSA_FLTR_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 7) - #define MVPP2_PE_VLAN_DBL (MVPP2_PRS_TCAM_SRAM_SIZE - 6) - #define MVPP2_PE_VLAN_NONE (MVPP2_PRS_TCAM_SRAM_SIZE - 5) --/* reserved */ -+#define MVPP2_PE_FC_DROP (MVPP2_PRS_TCAM_SRAM_SIZE - 4) - #define MVPP2_PE_MAC_MC_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 3) - #define MVPP2_PE_MAC_UC_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 2) - #define MVPP2_PE_MAC_NON_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 1) -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h b/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h -index 07ee1d236ab3e..2ed17913af80e 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h -@@ -366,6 +366,15 @@ struct mlx5e_swp_spec { - u8 tun_l4_proto; - }; - -+static inline void mlx5e_eseg_swp_offsets_add_vlan(struct mlx5_wqe_eth_seg *eseg) -+{ -+ /* SWP offsets are in 2-bytes words */ -+ eseg->swp_outer_l3_offset += VLAN_HLEN / 2; -+ eseg->swp_outer_l4_offset += VLAN_HLEN / 2; -+ eseg->swp_inner_l3_offset += VLAN_HLEN / 2; -+ eseg->swp_inner_l4_offset += VLAN_HLEN / 2; -+} -+ - static inline void - mlx5e_set_eseg_swp(struct sk_buff *skb, struct mlx5_wqe_eth_seg *eseg, - struct mlx5e_swp_spec *swp_spec) -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h -index 899b98aca0d3f..1fae7fab8297e 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h -@@ -51,7 +51,7 @@ static inline bool mlx5_geneve_tx_allowed(struct mlx5_core_dev *mdev) - } - - static inline void --mlx5e_tx_tunnel_accel(struct sk_buff *skb, struct mlx5_wqe_eth_seg *eseg) -+mlx5e_tx_tunnel_accel(struct sk_buff *skb, struct mlx5_wqe_eth_seg *eseg, u16 ihs) - { - struct mlx5e_swp_spec swp_spec = {}; - unsigned int offset = 0; -@@ -85,6 +85,8 @@ mlx5e_tx_tunnel_accel(struct sk_buff *skb, struct mlx5_wqe_eth_seg *eseg) - } - - mlx5e_set_eseg_swp(skb, eseg, &swp_spec); -+ if (skb_vlan_tag_present(skb) && ihs) -+ mlx5e_eseg_swp_offsets_add_vlan(eseg); - } - - #else -@@ -163,7 +165,7 @@ static inline unsigned int mlx5e_accel_tx_ids_len(struct mlx5e_txqsq *sq, - - static inline bool mlx5e_accel_tx_eseg(struct mlx5e_priv *priv, - struct sk_buff *skb, -- struct mlx5_wqe_eth_seg *eseg) -+ struct mlx5_wqe_eth_seg *eseg, u16 ihs) - { - #ifdef CONFIG_MLX5_EN_IPSEC - if (xfrm_offload(skb)) -@@ -172,7 +174,7 @@ static inline bool mlx5e_accel_tx_eseg(struct mlx5e_priv *priv, - - #if IS_ENABLED(CONFIG_GENEVE) - if (skb->encapsulation) -- mlx5e_tx_tunnel_accel(skb, eseg); -+ mlx5e_tx_tunnel_accel(skb, eseg, ihs); - #endif - - return true; -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c -index d97203cf6a007..38a23d209b33b 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c -@@ -615,9 +615,9 @@ void mlx5e_tx_mpwqe_ensure_complete(struct mlx5e_txqsq *sq) - - static bool mlx5e_txwqe_build_eseg(struct mlx5e_priv *priv, struct mlx5e_txqsq *sq, - struct sk_buff *skb, struct mlx5e_accel_tx_state *accel, -- struct mlx5_wqe_eth_seg *eseg) -+ struct mlx5_wqe_eth_seg *eseg, u16 ihs) - { -- if (unlikely(!mlx5e_accel_tx_eseg(priv, skb, eseg))) -+ if (unlikely(!mlx5e_accel_tx_eseg(priv, skb, eseg, ihs))) - return false; - - mlx5e_txwqe_build_eseg_csum(sq, skb, accel, eseg); -@@ -647,7 +647,8 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev) - if (mlx5e_tx_skb_supports_mpwqe(skb, &attr)) { - struct mlx5_wqe_eth_seg eseg = {}; - -- if (unlikely(!mlx5e_txwqe_build_eseg(priv, sq, skb, &accel, &eseg))) -+ if (unlikely(!mlx5e_txwqe_build_eseg(priv, sq, skb, &accel, &eseg, -+ attr.ihs))) - return NETDEV_TX_OK; - - mlx5e_sq_xmit_mpwqe(sq, skb, &eseg, netdev_xmit_more()); -@@ -664,7 +665,7 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev) - /* May update the WQE, but may not post other WQEs. */ - mlx5e_accel_tx_finish(sq, wqe, &accel, - (struct mlx5_wqe_inline_seg *)(wqe->data + wqe_attr.ds_cnt_inl)); -- if (unlikely(!mlx5e_txwqe_build_eseg(priv, sq, skb, &accel, &wqe->eth))) -+ if (unlikely(!mlx5e_txwqe_build_eseg(priv, sq, skb, &accel, &wqe->eth, attr.ihs))) - return NETDEV_TX_OK; - - mlx5e_sq_xmit_wqe(sq, skb, &attr, &wqe_attr, wqe, pi, netdev_xmit_more()); -diff --git a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c -index b3d2250c77d04..a81feffb09b8b 100644 ---- a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c -+++ b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c -@@ -337,7 +337,7 @@ void ionic_rx_fill(struct ionic_queue *q) - unsigned int i, j; - unsigned int len; - -- len = netdev->mtu + ETH_HLEN; -+ len = netdev->mtu + ETH_HLEN + VLAN_HLEN; - nfrags = round_up(len, PAGE_SIZE) / PAGE_SIZE; - - for (i = ionic_q_space_avail(q); i; i--) { -diff --git a/drivers/net/ethernet/qlogic/qede/qede_fp.c b/drivers/net/ethernet/qlogic/qede/qede_fp.c -index a2494bf850079..ca0ee29a57b50 100644 ---- a/drivers/net/ethernet/qlogic/qede/qede_fp.c -+++ b/drivers/net/ethernet/qlogic/qede/qede_fp.c -@@ -1799,6 +1799,11 @@ netdev_features_t qede_features_check(struct sk_buff *skb, - ntohs(udp_hdr(skb)->dest) != gnv_port)) - return features & ~(NETIF_F_CSUM_MASK | - NETIF_F_GSO_MASK); -+ } else if (l4_proto == IPPROTO_IPIP) { -+ /* IPIP tunnels are unknown to the device or at least unsupported natively, -+ * offloads for them can't be done trivially, so disable them for such skb. -+ */ -+ return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); - } - } - -diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c -index 85d9c3e30c699..762cabf16157b 100644 ---- a/drivers/net/ethernet/realtek/r8169_main.c -+++ b/drivers/net/ethernet/realtek/r8169_main.c -@@ -2243,7 +2243,8 @@ static void rtl_pll_power_down(struct rtl8169_private *tp) - } - - switch (tp->mac_version) { -- case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_33: -+ case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26: -+ case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_33: - case RTL_GIGA_MAC_VER_37: - case RTL_GIGA_MAC_VER_39: - case RTL_GIGA_MAC_VER_43: -@@ -2269,7 +2270,8 @@ static void rtl_pll_power_down(struct rtl8169_private *tp) - static void rtl_pll_power_up(struct rtl8169_private *tp) - { - switch (tp->mac_version) { -- case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_33: -+ case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26: -+ case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_33: - case RTL_GIGA_MAC_VER_37: - case RTL_GIGA_MAC_VER_39: - case RTL_GIGA_MAC_VER_43: -diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c -index 81ee0a071b4e9..e5234bb02dafd 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c -@@ -725,6 +725,8 @@ static SIMPLE_DEV_PM_OPS(intel_eth_pm_ops, intel_eth_pci_suspend, - #define PCI_DEVICE_ID_INTEL_EHL_PSE1_RGMII1G_ID 0x4bb0 - #define PCI_DEVICE_ID_INTEL_EHL_PSE1_SGMII1G_ID 0x4bb1 - #define PCI_DEVICE_ID_INTEL_EHL_PSE1_SGMII2G5_ID 0x4bb2 -+#define PCI_DEVICE_ID_INTEL_TGLH_SGMII1G_0_ID 0x43ac -+#define PCI_DEVICE_ID_INTEL_TGLH_SGMII1G_1_ID 0x43a2 - #define PCI_DEVICE_ID_INTEL_TGL_SGMII1G_ID 0xa0ac - - static const struct pci_device_id intel_eth_pci_id_table[] = { -@@ -739,6 +741,8 @@ static const struct pci_device_id intel_eth_pci_id_table[] = { - { PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII1G_ID, &ehl_pse1_sgmii1g_info) }, - { PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII2G5_ID, &ehl_pse1_sgmii1g_info) }, - { PCI_DEVICE_DATA(INTEL, TGL_SGMII1G_ID, &tgl_sgmii1g_info) }, -+ { PCI_DEVICE_DATA(INTEL, TGLH_SGMII1G_0_ID, &tgl_sgmii1g_info) }, -+ { PCI_DEVICE_DATA(INTEL, TGLH_SGMII1G_1_ID, &tgl_sgmii1g_info) }, - {} - }; - MODULE_DEVICE_TABLE(pci, intel_eth_pci_id_table); -diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -index 6d6bd77bb6afc..9ddadae8e4c51 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -@@ -135,7 +135,7 @@ static int meson8b_init_rgmii_tx_clk(struct meson8b_dwmac *dwmac) - struct device *dev = dwmac->dev; - static const struct clk_parent_data mux_parents[] = { - { .fw_name = "clkin0", }, -- { .fw_name = "clkin1", }, -+ { .index = -1, }, - }; - static const struct clk_div_table div_table[] = { - { .div = 2, .val = 2, }, -diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c -index d1fc7955d4227..43222a34cba06 100644 ---- a/drivers/net/ethernet/ti/cpts.c -+++ b/drivers/net/ethernet/ti/cpts.c -@@ -599,6 +599,7 @@ void cpts_unregister(struct cpts *cpts) - - ptp_clock_unregister(cpts->clock); - cpts->clock = NULL; -+ cpts->phc_index = -1; - - cpts_write32(cpts, 0, int_enable); - cpts_write32(cpts, 0, control); -@@ -784,6 +785,7 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs, - cpts->cc.read = cpts_systim_read; - cpts->cc.mask = CLOCKSOURCE_MASK(32); - cpts->info = cpts_info; -+ cpts->phc_index = -1; - - if (n_ext_ts) - cpts->info.n_ext_ts = n_ext_ts; -diff --git a/drivers/net/tun.c b/drivers/net/tun.c -index cd06cae760356..1ac80756e5afa 100644 ---- a/drivers/net/tun.c -+++ b/drivers/net/tun.c -@@ -1401,7 +1401,7 @@ static struct sk_buff *tun_napi_alloc_frags(struct tun_file *tfile, - int i; - - if (it->nr_segs > MAX_SKB_FRAGS + 1) -- return ERR_PTR(-ENOMEM); -+ return ERR_PTR(-EMSGSIZE); - - local_bh_disable(); - skb = napi_get_frags(&tfile->napi); -diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c -index e04f588538ccb..5dc1365dc1f9a 100644 ---- a/drivers/net/usb/cdc_ncm.c -+++ b/drivers/net/usb/cdc_ncm.c -@@ -1863,9 +1863,6 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb) - * USB_CDC_NOTIFY_NETWORK_CONNECTION notification shall be - * sent by device after USB_CDC_NOTIFY_SPEED_CHANGE. - */ -- netif_info(dev, link, dev->net, -- "network connection: %sconnected\n", -- !!event->wValue ? "" : "dis"); - usbnet_link_change(dev, !!event->wValue, 0); - break; - -diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c -index fc378ff56775b..21120b4e5637d 100644 ---- a/drivers/net/usb/qmi_wwan.c -+++ b/drivers/net/usb/qmi_wwan.c -@@ -1036,6 +1036,7 @@ static const struct usb_device_id products[] = { - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ -+ {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */ - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ - - /* 3. Combined interface devices matching on interface number */ -diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c -index 34bb95dd92392..038ce4e5e84ba 100644 ---- a/drivers/net/virtio_net.c -+++ b/drivers/net/virtio_net.c -@@ -2093,14 +2093,16 @@ static int virtnet_set_channels(struct net_device *dev, - - get_online_cpus(); - err = _virtnet_set_queues(vi, queue_pairs); -- if (!err) { -- netif_set_real_num_tx_queues(dev, queue_pairs); -- netif_set_real_num_rx_queues(dev, queue_pairs); -- -- virtnet_set_affinity(vi); -+ if (err) { -+ put_online_cpus(); -+ goto err; - } -+ virtnet_set_affinity(vi); - put_online_cpus(); - -+ netif_set_real_num_tx_queues(dev, queue_pairs); -+ netif_set_real_num_rx_queues(dev, queue_pairs); -+ err: - return err; - } - -diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c -index 64f8556513369..261b53fc8e04c 100644 ---- a/drivers/net/wan/hdlc_ppp.c -+++ b/drivers/net/wan/hdlc_ppp.c -@@ -569,6 +569,13 @@ static void ppp_timer(struct timer_list *t) - unsigned long flags; - - spin_lock_irqsave(&ppp->lock, flags); -+ /* mod_timer could be called after we entered this function but -+ * before we got the lock. -+ */ -+ if (timer_pending(&proto->timer)) { -+ spin_unlock_irqrestore(&ppp->lock, flags); -+ return; -+ } - switch (proto->state) { - case STOPPING: - case REQ_SENT: -diff --git a/drivers/net/wireless/realtek/rtlwifi/core.c b/drivers/net/wireless/realtek/rtlwifi/core.c -index a7259dbc953da..965bd95890459 100644 ---- a/drivers/net/wireless/realtek/rtlwifi/core.c -+++ b/drivers/net/wireless/realtek/rtlwifi/core.c -@@ -78,7 +78,6 @@ static void rtl_fw_do_work(const struct firmware *firmware, void *context, - - rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, - "Firmware callback routine entered!\n"); -- complete(&rtlpriv->firmware_loading_complete); - if (!firmware) { - if (rtlpriv->cfg->alt_fw_name) { - err = request_firmware(&firmware, -@@ -91,13 +90,13 @@ static void rtl_fw_do_work(const struct firmware *firmware, void *context, - } - pr_err("Selected firmware is not available\n"); - rtlpriv->max_fw_size = 0; -- return; -+ goto exit; - } - found_alt: - if (firmware->size > rtlpriv->max_fw_size) { - pr_err("Firmware is too big!\n"); - release_firmware(firmware); -- return; -+ goto exit; - } - if (!is_wow) { - memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, -@@ -109,6 +108,9 @@ found_alt: - rtlpriv->rtlhal.wowlan_fwsize = firmware->size; - } - release_firmware(firmware); -+ -+exit: -+ complete(&rtlpriv->firmware_loading_complete); - } - - void rtl_fw_cb(const struct firmware *firmware, void *context) -diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c -index 2d17137f8ff3b..31d7a6ddc9db7 100644 ---- a/drivers/scsi/scsi_lib.c -+++ b/drivers/scsi/scsi_lib.c -@@ -249,7 +249,8 @@ int __scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, - - req = blk_get_request(sdev->request_queue, - data_direction == DMA_TO_DEVICE ? -- REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN, BLK_MQ_REQ_PREEMPT); -+ REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN, -+ rq_flags & RQF_PM ? BLK_MQ_REQ_PM : 0); - if (IS_ERR(req)) - return ret; - rq = scsi_req(req); -@@ -1203,6 +1204,8 @@ static blk_status_t - scsi_device_state_check(struct scsi_device *sdev, struct request *req) - { - switch (sdev->sdev_state) { -+ case SDEV_CREATED: -+ return BLK_STS_OK; - case SDEV_OFFLINE: - case SDEV_TRANSPORT_OFFLINE: - /* -@@ -1229,18 +1232,18 @@ scsi_device_state_check(struct scsi_device *sdev, struct request *req) - return BLK_STS_RESOURCE; - case SDEV_QUIESCE: - /* -- * If the devices is blocked we defer normal commands. -+ * If the device is blocked we only accept power management -+ * commands. - */ -- if (req && !(req->rq_flags & RQF_PREEMPT)) -+ if (req && WARN_ON_ONCE(!(req->rq_flags & RQF_PM))) - return BLK_STS_RESOURCE; - return BLK_STS_OK; - default: - /* - * For any other not fully online state we only allow -- * special commands. In particular any user initiated -- * command is not allowed. -+ * power management commands. - */ -- if (req && !(req->rq_flags & RQF_PREEMPT)) -+ if (req && !(req->rq_flags & RQF_PM)) - return BLK_STS_IOERR; - return BLK_STS_OK; - } -@@ -2508,15 +2511,13 @@ void sdev_evt_send_simple(struct scsi_device *sdev, - EXPORT_SYMBOL_GPL(sdev_evt_send_simple); - - /** -- * scsi_device_quiesce - Block user issued commands. -+ * scsi_device_quiesce - Block all commands except power management. - * @sdev: scsi device to quiesce. - * - * This works by trying to transition to the SDEV_QUIESCE state - * (which must be a legal transition). When the device is in this -- * state, only special requests will be accepted, all others will -- * be deferred. Since special requests may also be requeued requests, -- * a successful return doesn't guarantee the device will be -- * totally quiescent. -+ * state, only power management requests will be accepted, all others will -+ * be deferred. - * - * Must be called with user context, may sleep. - * -@@ -2578,12 +2579,12 @@ void scsi_device_resume(struct scsi_device *sdev) - * device deleted during suspend) - */ - mutex_lock(&sdev->state_mutex); -+ if (sdev->sdev_state == SDEV_QUIESCE) -+ scsi_device_set_state(sdev, SDEV_RUNNING); - if (sdev->quiesced_by) { - sdev->quiesced_by = NULL; - blk_clear_pm_only(sdev->request_queue); - } -- if (sdev->sdev_state == SDEV_QUIESCE) -- scsi_device_set_state(sdev, SDEV_RUNNING); - mutex_unlock(&sdev->state_mutex); - } - EXPORT_SYMBOL(scsi_device_resume); -diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c -index f3d5b1bbd5aa7..c37dd15d16d24 100644 ---- a/drivers/scsi/scsi_transport_spi.c -+++ b/drivers/scsi/scsi_transport_spi.c -@@ -117,12 +117,16 @@ static int spi_execute(struct scsi_device *sdev, const void *cmd, - sshdr = &sshdr_tmp; - - for(i = 0; i < DV_RETRIES; i++) { -+ /* -+ * The purpose of the RQF_PM flag below is to bypass the -+ * SDEV_QUIESCE state. -+ */ - result = scsi_execute(sdev, cmd, dir, buffer, bufflen, sense, - sshdr, DV_TIMEOUT, /* retries */ 1, - REQ_FAILFAST_DEV | - REQ_FAILFAST_TRANSPORT | - REQ_FAILFAST_DRIVER, -- 0, NULL); -+ RQF_PM, NULL); - if (driver_byte(result) != DRIVER_SENSE || - sshdr->sense_key != UNIT_ATTENTION) - break; -@@ -1005,23 +1009,26 @@ spi_dv_device(struct scsi_device *sdev) - */ - lock_system_sleep(); - -+ if (scsi_autopm_get_device(sdev)) -+ goto unlock_system_sleep; -+ - if (unlikely(spi_dv_in_progress(starget))) -- goto unlock; -+ goto put_autopm; - - if (unlikely(scsi_device_get(sdev))) -- goto unlock; -+ goto put_autopm; - - spi_dv_in_progress(starget) = 1; - - buffer = kzalloc(len, GFP_KERNEL); - - if (unlikely(!buffer)) -- goto out_put; -+ goto put_sdev; - - /* We need to verify that the actual device will quiesce; the - * later target quiesce is just a nice to have */ - if (unlikely(scsi_device_quiesce(sdev))) -- goto out_free; -+ goto free_buffer; - - scsi_target_quiesce(starget); - -@@ -1041,12 +1048,16 @@ spi_dv_device(struct scsi_device *sdev) - - spi_initial_dv(starget) = 1; - -- out_free: -+free_buffer: - kfree(buffer); -- out_put: -+ -+put_sdev: - spi_dv_in_progress(starget) = 0; - scsi_device_put(sdev); --unlock: -+put_autopm: -+ scsi_autopm_put_device(sdev); -+ -+unlock_system_sleep: - unlock_system_sleep(); - } - EXPORT_SYMBOL(spi_dv_device); -diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c -index df3a564c3e334..fadd566025b86 100644 ---- a/drivers/scsi/ufs/ufshcd-pci.c -+++ b/drivers/scsi/ufs/ufshcd-pci.c -@@ -148,6 +148,8 @@ static int ufs_intel_common_init(struct ufs_hba *hba) - { - struct intel_host *host; - -+ hba->caps |= UFSHCD_CAP_RPM_AUTOSUSPEND; -+ - host = devm_kzalloc(hba->dev, sizeof(*host), GFP_KERNEL); - if (!host) - return -ENOMEM; -@@ -163,6 +165,41 @@ static void ufs_intel_common_exit(struct ufs_hba *hba) - intel_ltr_hide(hba->dev); - } - -+static int ufs_intel_resume(struct ufs_hba *hba, enum ufs_pm_op op) -+{ -+ /* -+ * To support S4 (suspend-to-disk) with spm_lvl other than 5, the base -+ * address registers must be restored because the restore kernel can -+ * have used different addresses. -+ */ -+ ufshcd_writel(hba, lower_32_bits(hba->utrdl_dma_addr), -+ REG_UTP_TRANSFER_REQ_LIST_BASE_L); -+ ufshcd_writel(hba, upper_32_bits(hba->utrdl_dma_addr), -+ REG_UTP_TRANSFER_REQ_LIST_BASE_H); -+ ufshcd_writel(hba, lower_32_bits(hba->utmrdl_dma_addr), -+ REG_UTP_TASK_REQ_LIST_BASE_L); -+ ufshcd_writel(hba, upper_32_bits(hba->utmrdl_dma_addr), -+ REG_UTP_TASK_REQ_LIST_BASE_H); -+ -+ if (ufshcd_is_link_hibern8(hba)) { -+ int ret = ufshcd_uic_hibern8_exit(hba); -+ -+ if (!ret) { -+ ufshcd_set_link_active(hba); -+ } else { -+ dev_err(hba->dev, "%s: hibern8 exit failed %d\n", -+ __func__, ret); -+ /* -+ * Force reset and restore. Any other actions can lead -+ * to an unrecoverable state. -+ */ -+ ufshcd_set_link_off(hba); -+ } -+ } -+ -+ return 0; -+} -+ - static int ufs_intel_ehl_init(struct ufs_hba *hba) - { - hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8; -@@ -174,6 +211,7 @@ static struct ufs_hba_variant_ops ufs_intel_cnl_hba_vops = { - .init = ufs_intel_common_init, - .exit = ufs_intel_common_exit, - .link_startup_notify = ufs_intel_link_startup_notify, -+ .resume = ufs_intel_resume, - }; - - static struct ufs_hba_variant_ops ufs_intel_ehl_hba_vops = { -@@ -181,6 +219,7 @@ static struct ufs_hba_variant_ops ufs_intel_ehl_hba_vops = { - .init = ufs_intel_ehl_init, - .exit = ufs_intel_common_exit, - .link_startup_notify = ufs_intel_link_startup_notify, -+ .resume = ufs_intel_resume, - }; - - #ifdef CONFIG_PM_SLEEP -@@ -207,6 +246,30 @@ static int ufshcd_pci_resume(struct device *dev) - { - return ufshcd_system_resume(dev_get_drvdata(dev)); - } -+ -+/** -+ * ufshcd_pci_poweroff - suspend-to-disk poweroff function -+ * @dev: pointer to PCI device handle -+ * -+ * Returns 0 if successful -+ * Returns non-zero otherwise -+ */ -+static int ufshcd_pci_poweroff(struct device *dev) -+{ -+ struct ufs_hba *hba = dev_get_drvdata(dev); -+ int spm_lvl = hba->spm_lvl; -+ int ret; -+ -+ /* -+ * For poweroff we need to set the UFS device to PowerDown mode. -+ * Force spm_lvl to ensure that. -+ */ -+ hba->spm_lvl = 5; -+ ret = ufshcd_system_suspend(hba); -+ hba->spm_lvl = spm_lvl; -+ return ret; -+} -+ - #endif /* !CONFIG_PM_SLEEP */ - - #ifdef CONFIG_PM -@@ -302,8 +365,14 @@ ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) - } - - static const struct dev_pm_ops ufshcd_pci_pm_ops = { -- SET_SYSTEM_SLEEP_PM_OPS(ufshcd_pci_suspend, -- ufshcd_pci_resume) -+#ifdef CONFIG_PM_SLEEP -+ .suspend = ufshcd_pci_suspend, -+ .resume = ufshcd_pci_resume, -+ .freeze = ufshcd_pci_suspend, -+ .thaw = ufshcd_pci_resume, -+ .poweroff = ufshcd_pci_poweroff, -+ .restore = ufshcd_pci_resume, -+#endif - SET_RUNTIME_PM_OPS(ufshcd_pci_runtime_suspend, - ufshcd_pci_runtime_resume, - ufshcd_pci_runtime_idle) -diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c -index 911aba3e7675c..02f161468daf5 100644 ---- a/drivers/scsi/ufs/ufshcd.c -+++ b/drivers/scsi/ufs/ufshcd.c -@@ -3620,7 +3620,7 @@ static int ufshcd_dme_enable(struct ufs_hba *hba) - ret = ufshcd_send_uic_cmd(hba, &uic_cmd); - if (ret) - dev_err(hba->dev, -- "dme-reset: error code %d\n", ret); -+ "dme-enable: error code %d\n", ret); - - return ret; - } -@@ -7093,7 +7093,6 @@ static inline void ufshcd_blk_pm_runtime_init(struct scsi_device *sdev) - static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) - { - int ret = 0; -- struct scsi_device *sdev_rpmb; - struct scsi_device *sdev_boot; - - hba->sdev_ufs_device = __scsi_add_device(hba->host, 0, 0, -@@ -7106,14 +7105,14 @@ static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) - ufshcd_blk_pm_runtime_init(hba->sdev_ufs_device); - scsi_device_put(hba->sdev_ufs_device); - -- sdev_rpmb = __scsi_add_device(hba->host, 0, 0, -+ hba->sdev_rpmb = __scsi_add_device(hba->host, 0, 0, - ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_RPMB_WLUN), NULL); -- if (IS_ERR(sdev_rpmb)) { -- ret = PTR_ERR(sdev_rpmb); -+ if (IS_ERR(hba->sdev_rpmb)) { -+ ret = PTR_ERR(hba->sdev_rpmb); - goto remove_sdev_ufs_device; - } -- ufshcd_blk_pm_runtime_init(sdev_rpmb); -- scsi_device_put(sdev_rpmb); -+ ufshcd_blk_pm_runtime_init(hba->sdev_rpmb); -+ scsi_device_put(hba->sdev_rpmb); - - sdev_boot = __scsi_add_device(hba->host, 0, 0, - ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_BOOT_WLUN), NULL); -@@ -7637,6 +7636,63 @@ out: - return ret; - } - -+static int -+ufshcd_send_request_sense(struct ufs_hba *hba, struct scsi_device *sdp); -+ -+static int ufshcd_clear_ua_wlun(struct ufs_hba *hba, u8 wlun) -+{ -+ struct scsi_device *sdp; -+ unsigned long flags; -+ int ret = 0; -+ -+ spin_lock_irqsave(hba->host->host_lock, flags); -+ if (wlun == UFS_UPIU_UFS_DEVICE_WLUN) -+ sdp = hba->sdev_ufs_device; -+ else if (wlun == UFS_UPIU_RPMB_WLUN) -+ sdp = hba->sdev_rpmb; -+ else -+ BUG_ON(1); -+ if (sdp) { -+ ret = scsi_device_get(sdp); -+ if (!ret && !scsi_device_online(sdp)) { -+ ret = -ENODEV; -+ scsi_device_put(sdp); -+ } -+ } else { -+ ret = -ENODEV; -+ } -+ spin_unlock_irqrestore(hba->host->host_lock, flags); -+ if (ret) -+ goto out_err; -+ -+ ret = ufshcd_send_request_sense(hba, sdp); -+ scsi_device_put(sdp); -+out_err: -+ if (ret) -+ dev_err(hba->dev, "%s: UAC clear LU=%x ret = %d\n", -+ __func__, wlun, ret); -+ return ret; -+} -+ -+static int ufshcd_clear_ua_wluns(struct ufs_hba *hba) -+{ -+ int ret = 0; -+ -+ if (!hba->wlun_dev_clr_ua) -+ goto out; -+ -+ ret = ufshcd_clear_ua_wlun(hba, UFS_UPIU_UFS_DEVICE_WLUN); -+ if (!ret) -+ ret = ufshcd_clear_ua_wlun(hba, UFS_UPIU_RPMB_WLUN); -+ if (!ret) -+ hba->wlun_dev_clr_ua = false; -+out: -+ if (ret) -+ dev_err(hba->dev, "%s: Failed to clear UAC WLUNS ret = %d\n", -+ __func__, ret); -+ return ret; -+} -+ - /** - * ufshcd_probe_hba - probe hba to detect device and initialize - * @hba: per-adapter instance -@@ -7756,6 +7812,8 @@ out: - pm_runtime_put_sync(hba->dev); - ufshcd_exit_clk_scaling(hba); - ufshcd_hba_exit(hba); -+ } else { -+ ufshcd_clear_ua_wluns(hba); - } - } - -diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h -index cd51553e522da..6c62a281c8631 100644 ---- a/drivers/scsi/ufs/ufshcd.h -+++ b/drivers/scsi/ufs/ufshcd.h -@@ -683,6 +683,7 @@ struct ufs_hba { - * "UFS device" W-LU. - */ - struct scsi_device *sdev_ufs_device; -+ struct scsi_device *sdev_rpmb; - - enum ufs_dev_pwr_mode curr_dev_pwr_mode; - enum uic_link_state uic_link_state; -diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c -index d99231c737fbf..80d74cce2a010 100644 ---- a/drivers/staging/comedi/comedi_fops.c -+++ b/drivers/staging/comedi/comedi_fops.c -@@ -2987,7 +2987,9 @@ static int put_compat_cmd(struct comedi32_cmd_struct __user *cmd32, - v32.chanlist_len = cmd->chanlist_len; - v32.data = ptr_to_compat(cmd->data); - v32.data_len = cmd->data_len; -- return copy_to_user(cmd32, &v32, sizeof(v32)); -+ if (copy_to_user(cmd32, &v32, sizeof(v32))) -+ return -EFAULT; -+ return 0; - } - - /* Handle 32-bit COMEDI_CMD ioctl. */ -diff --git a/drivers/staging/mt7621-dma/mtk-hsdma.c b/drivers/staging/mt7621-dma/mtk-hsdma.c -index 354536783e1ce..5ad55ca620229 100644 ---- a/drivers/staging/mt7621-dma/mtk-hsdma.c -+++ b/drivers/staging/mt7621-dma/mtk-hsdma.c -@@ -712,7 +712,7 @@ static int mtk_hsdma_probe(struct platform_device *pdev) - ret = dma_async_device_register(dd); - if (ret) { - dev_err(&pdev->dev, "failed to register dma device\n"); -- return ret; -+ goto err_uninit_hsdma; - } - - ret = of_dma_controller_register(pdev->dev.of_node, -@@ -728,6 +728,8 @@ static int mtk_hsdma_probe(struct platform_device *pdev) - - err_unregister: - dma_async_device_unregister(dd); -+err_uninit_hsdma: -+ mtk_hsdma_uninit(hsdma); - return ret; - } - -diff --git a/drivers/target/target_core_xcopy.c b/drivers/target/target_core_xcopy.c -index 44e15d7fb2f09..66d6f1d06f219 100644 ---- a/drivers/target/target_core_xcopy.c -+++ b/drivers/target/target_core_xcopy.c -@@ -46,60 +46,83 @@ static int target_xcopy_gen_naa_ieee(struct se_device *dev, unsigned char *buf) - return 0; - } - --struct xcopy_dev_search_info { -- const unsigned char *dev_wwn; -- struct se_device *found_dev; --}; -- -+/** -+ * target_xcopy_locate_se_dev_e4_iter - compare XCOPY NAA device identifiers -+ * -+ * @se_dev: device being considered for match -+ * @dev_wwn: XCOPY requested NAA dev_wwn -+ * @return: 1 on match, 0 on no-match -+ */ - static int target_xcopy_locate_se_dev_e4_iter(struct se_device *se_dev, -- void *data) -+ const unsigned char *dev_wwn) - { -- struct xcopy_dev_search_info *info = data; - unsigned char tmp_dev_wwn[XCOPY_NAA_IEEE_REGEX_LEN]; - int rc; - -- if (!se_dev->dev_attrib.emulate_3pc) -+ if (!se_dev->dev_attrib.emulate_3pc) { -+ pr_debug("XCOPY: emulate_3pc disabled on se_dev %p\n", se_dev); - return 0; -+ } - - memset(&tmp_dev_wwn[0], 0, XCOPY_NAA_IEEE_REGEX_LEN); - target_xcopy_gen_naa_ieee(se_dev, &tmp_dev_wwn[0]); - -- rc = memcmp(&tmp_dev_wwn[0], info->dev_wwn, XCOPY_NAA_IEEE_REGEX_LEN); -- if (rc != 0) -- return 0; -- -- info->found_dev = se_dev; -- pr_debug("XCOPY 0xe4: located se_dev: %p\n", se_dev); -- -- rc = target_depend_item(&se_dev->dev_group.cg_item); -+ rc = memcmp(&tmp_dev_wwn[0], dev_wwn, XCOPY_NAA_IEEE_REGEX_LEN); - if (rc != 0) { -- pr_err("configfs_depend_item attempt failed: %d for se_dev: %p\n", -- rc, se_dev); -- return rc; -+ pr_debug("XCOPY: skip non-matching: %*ph\n", -+ XCOPY_NAA_IEEE_REGEX_LEN, tmp_dev_wwn); -+ return 0; - } -+ pr_debug("XCOPY 0xe4: located se_dev: %p\n", se_dev); - -- pr_debug("Called configfs_depend_item for se_dev: %p se_dev->se_dev_group: %p\n", -- se_dev, &se_dev->dev_group); - return 1; - } - --static int target_xcopy_locate_se_dev_e4(const unsigned char *dev_wwn, -- struct se_device **found_dev) -+static int target_xcopy_locate_se_dev_e4(struct se_session *sess, -+ const unsigned char *dev_wwn, -+ struct se_device **_found_dev, -+ struct percpu_ref **_found_lun_ref) - { -- struct xcopy_dev_search_info info; -- int ret; -- -- memset(&info, 0, sizeof(info)); -- info.dev_wwn = dev_wwn; -- -- ret = target_for_each_device(target_xcopy_locate_se_dev_e4_iter, &info); -- if (ret == 1) { -- *found_dev = info.found_dev; -- return 0; -- } else { -- pr_debug_ratelimited("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n"); -- return -EINVAL; -+ struct se_dev_entry *deve; -+ struct se_node_acl *nacl; -+ struct se_lun *this_lun = NULL; -+ struct se_device *found_dev = NULL; -+ -+ /* cmd with NULL sess indicates no associated $FABRIC_MOD */ -+ if (!sess) -+ goto err_out; -+ -+ pr_debug("XCOPY 0xe4: searching for: %*ph\n", -+ XCOPY_NAA_IEEE_REGEX_LEN, dev_wwn); -+ -+ nacl = sess->se_node_acl; -+ rcu_read_lock(); -+ hlist_for_each_entry_rcu(deve, &nacl->lun_entry_hlist, link) { -+ struct se_device *this_dev; -+ int rc; -+ -+ this_lun = rcu_dereference(deve->se_lun); -+ this_dev = rcu_dereference_raw(this_lun->lun_se_dev); -+ -+ rc = target_xcopy_locate_se_dev_e4_iter(this_dev, dev_wwn); -+ if (rc) { -+ if (percpu_ref_tryget_live(&this_lun->lun_ref)) -+ found_dev = this_dev; -+ break; -+ } - } -+ rcu_read_unlock(); -+ if (found_dev == NULL) -+ goto err_out; -+ -+ pr_debug("lun_ref held for se_dev: %p se_dev->se_dev_group: %p\n", -+ found_dev, &found_dev->dev_group); -+ *_found_dev = found_dev; -+ *_found_lun_ref = &this_lun->lun_ref; -+ return 0; -+err_out: -+ pr_debug_ratelimited("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n"); -+ return -EINVAL; - } - - static int target_xcopy_parse_tiddesc_e4(struct se_cmd *se_cmd, struct xcopy_op *xop, -@@ -246,12 +269,16 @@ static int target_xcopy_parse_target_descriptors(struct se_cmd *se_cmd, - - switch (xop->op_origin) { - case XCOL_SOURCE_RECV_OP: -- rc = target_xcopy_locate_se_dev_e4(xop->dst_tid_wwn, -- &xop->dst_dev); -+ rc = target_xcopy_locate_se_dev_e4(se_cmd->se_sess, -+ xop->dst_tid_wwn, -+ &xop->dst_dev, -+ &xop->remote_lun_ref); - break; - case XCOL_DEST_RECV_OP: -- rc = target_xcopy_locate_se_dev_e4(xop->src_tid_wwn, -- &xop->src_dev); -+ rc = target_xcopy_locate_se_dev_e4(se_cmd->se_sess, -+ xop->src_tid_wwn, -+ &xop->src_dev, -+ &xop->remote_lun_ref); - break; - default: - pr_err("XCOPY CSCD descriptor IDs not found in CSCD list - " -@@ -391,18 +418,12 @@ static int xcopy_pt_get_cmd_state(struct se_cmd *se_cmd) - - static void xcopy_pt_undepend_remotedev(struct xcopy_op *xop) - { -- struct se_device *remote_dev; -- - if (xop->op_origin == XCOL_SOURCE_RECV_OP) -- remote_dev = xop->dst_dev; -+ pr_debug("putting dst lun_ref for %p\n", xop->dst_dev); - else -- remote_dev = xop->src_dev; -- -- pr_debug("Calling configfs_undepend_item for" -- " remote_dev: %p remote_dev->dev_group: %p\n", -- remote_dev, &remote_dev->dev_group.cg_item); -+ pr_debug("putting src lun_ref for %p\n", xop->src_dev); - -- target_undepend_item(&remote_dev->dev_group.cg_item); -+ percpu_ref_put(xop->remote_lun_ref); - } - - static void xcopy_pt_release_cmd(struct se_cmd *se_cmd) -diff --git a/drivers/target/target_core_xcopy.h b/drivers/target/target_core_xcopy.h -index c56a1bde9417b..e5f20005179a8 100644 ---- a/drivers/target/target_core_xcopy.h -+++ b/drivers/target/target_core_xcopy.h -@@ -27,6 +27,7 @@ struct xcopy_op { - struct se_device *dst_dev; - unsigned char dst_tid_wwn[XCOPY_NAA_IEEE_REGEX_LEN]; - unsigned char local_dev_wwn[XCOPY_NAA_IEEE_REGEX_LEN]; -+ struct percpu_ref *remote_lun_ref; - - sector_t src_lba; - sector_t dst_lba; -diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c -index 5e07a0a86d110..ee565bdb44d65 100644 ---- a/drivers/usb/chipidea/ci_hdrc_imx.c -+++ b/drivers/usb/chipidea/ci_hdrc_imx.c -@@ -139,9 +139,13 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev) - misc_pdev = of_find_device_by_node(args.np); - of_node_put(args.np); - -- if (!misc_pdev || !platform_get_drvdata(misc_pdev)) -+ if (!misc_pdev) - return ERR_PTR(-EPROBE_DEFER); - -+ if (!platform_get_drvdata(misc_pdev)) { -+ put_device(&misc_pdev->dev); -+ return ERR_PTR(-EPROBE_DEFER); -+ } - data->dev = &misc_pdev->dev; - - /* -diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c -index f52f1bc0559f9..781905745812e 100644 ---- a/drivers/usb/class/cdc-acm.c -+++ b/drivers/usb/class/cdc-acm.c -@@ -1895,6 +1895,10 @@ static const struct usb_device_id acm_ids[] = { - { USB_DEVICE(0x04d8, 0xfd08), - .driver_info = IGNORE_DEVICE, - }, -+ -+ { USB_DEVICE(0x04d8, 0xf58b), -+ .driver_info = IGNORE_DEVICE, -+ }, - #endif - - /*Samsung phone in firmware update mode */ -diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c -index 02d0cfd23bb29..508b1c3f8b731 100644 ---- a/drivers/usb/class/cdc-wdm.c -+++ b/drivers/usb/class/cdc-wdm.c -@@ -465,13 +465,23 @@ static int service_outstanding_interrupt(struct wdm_device *desc) - if (!desc->resp_count || !--desc->resp_count) - goto out; - -+ if (test_bit(WDM_DISCONNECTING, &desc->flags)) { -+ rv = -ENODEV; -+ goto out; -+ } -+ if (test_bit(WDM_RESETTING, &desc->flags)) { -+ rv = -EIO; -+ goto out; -+ } -+ - set_bit(WDM_RESPONDING, &desc->flags); - spin_unlock_irq(&desc->iuspin); - rv = usb_submit_urb(desc->response, GFP_KERNEL); - spin_lock_irq(&desc->iuspin); - if (rv) { -- dev_err(&desc->intf->dev, -- "usb_submit_urb failed with result %d\n", rv); -+ if (!test_bit(WDM_DISCONNECTING, &desc->flags)) -+ dev_err(&desc->intf->dev, -+ "usb_submit_urb failed with result %d\n", rv); - - /* make sure the next notification trigger a submit */ - clear_bit(WDM_RESPONDING, &desc->flags); -@@ -1027,9 +1037,9 @@ static void wdm_disconnect(struct usb_interface *intf) - wake_up_all(&desc->wait); - mutex_lock(&desc->rlock); - mutex_lock(&desc->wlock); -- kill_urbs(desc); - cancel_work_sync(&desc->rxwork); - cancel_work_sync(&desc->service_outs_intr); -+ kill_urbs(desc); - mutex_unlock(&desc->wlock); - mutex_unlock(&desc->rlock); - -diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c -index 67cbd42421bee..134dc2005ce97 100644 ---- a/drivers/usb/class/usblp.c -+++ b/drivers/usb/class/usblp.c -@@ -274,8 +274,25 @@ static int usblp_ctrl_msg(struct usblp *usblp, int request, int type, int dir, i - #define usblp_reset(usblp)\ - usblp_ctrl_msg(usblp, USBLP_REQ_RESET, USB_TYPE_CLASS, USB_DIR_OUT, USB_RECIP_OTHER, 0, NULL, 0) - --#define usblp_hp_channel_change_request(usblp, channel, buffer) \ -- usblp_ctrl_msg(usblp, USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST, USB_TYPE_VENDOR, USB_DIR_IN, USB_RECIP_INTERFACE, channel, buffer, 1) -+static int usblp_hp_channel_change_request(struct usblp *usblp, int channel, u8 *new_channel) -+{ -+ u8 *buf; -+ int ret; -+ -+ buf = kzalloc(1, GFP_KERNEL); -+ if (!buf) -+ return -ENOMEM; -+ -+ ret = usblp_ctrl_msg(usblp, USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST, -+ USB_TYPE_VENDOR, USB_DIR_IN, USB_RECIP_INTERFACE, -+ channel, buf, 1); -+ if (ret == 0) -+ *new_channel = buf[0]; -+ -+ kfree(buf); -+ -+ return ret; -+} - - /* - * See the description for usblp_select_alts() below for the usage -diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h -index 2f95f08ca5119..1b241f937d8f4 100644 ---- a/drivers/usb/dwc3/core.h -+++ b/drivers/usb/dwc3/core.h -@@ -285,6 +285,7 @@ - - /* Global USB2 PHY Vendor Control Register */ - #define DWC3_GUSB2PHYACC_NEWREGREQ BIT(25) -+#define DWC3_GUSB2PHYACC_DONE BIT(24) - #define DWC3_GUSB2PHYACC_BUSY BIT(23) - #define DWC3_GUSB2PHYACC_WRITE BIT(22) - #define DWC3_GUSB2PHYACC_ADDR(n) (n << 16) -diff --git a/drivers/usb/dwc3/dwc3-meson-g12a.c b/drivers/usb/dwc3/dwc3-meson-g12a.c -index 417e05381b5d0..bdf1f98dfad8c 100644 ---- a/drivers/usb/dwc3/dwc3-meson-g12a.c -+++ b/drivers/usb/dwc3/dwc3-meson-g12a.c -@@ -754,7 +754,7 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev) - - ret = priv->drvdata->setup_regmaps(priv, base); - if (ret) -- return ret; -+ goto err_disable_clks; - - if (priv->vbus) { - ret = regulator_enable(priv->vbus); -diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c -index 78cb4db8a6e45..ee44321fee386 100644 ---- a/drivers/usb/dwc3/gadget.c -+++ b/drivers/usb/dwc3/gadget.c -@@ -1763,6 +1763,8 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, - list_for_each_entry_safe(r, t, &dep->started_list, list) - dwc3_gadget_move_cancelled_request(r); - -+ dep->flags &= ~DWC3_EP_WAIT_TRANSFER_COMPLETE; -+ - goto out; - } - } -@@ -2083,6 +2085,7 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) - - static void dwc3_gadget_disable_irq(struct dwc3 *dwc); - static void __dwc3_gadget_stop(struct dwc3 *dwc); -+static int __dwc3_gadget_start(struct dwc3 *dwc); - - static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) - { -@@ -2145,6 +2148,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) - dwc->ev_buf->lpos = (dwc->ev_buf->lpos + count) % - dwc->ev_buf->length; - } -+ } else { -+ __dwc3_gadget_start(dwc); - } - - ret = dwc3_gadget_run_stop(dwc, is_on, false); -@@ -2319,10 +2324,6 @@ static int dwc3_gadget_start(struct usb_gadget *g, - } - - dwc->gadget_driver = driver; -- -- if (pm_runtime_active(dwc->dev)) -- __dwc3_gadget_start(dwc); -- - spin_unlock_irqrestore(&dwc->lock, flags); - - return 0; -@@ -2348,13 +2349,6 @@ static int dwc3_gadget_stop(struct usb_gadget *g) - unsigned long flags; - - spin_lock_irqsave(&dwc->lock, flags); -- -- if (pm_runtime_suspended(dwc->dev)) -- goto out; -- -- __dwc3_gadget_stop(dwc); -- --out: - dwc->gadget_driver = NULL; - spin_unlock_irqrestore(&dwc->lock, flags); - -diff --git a/drivers/usb/dwc3/ulpi.c b/drivers/usb/dwc3/ulpi.c -index aa213c9815f67..f23f4c9a557e9 100644 ---- a/drivers/usb/dwc3/ulpi.c -+++ b/drivers/usb/dwc3/ulpi.c -@@ -7,6 +7,8 @@ - * Author: Heikki Krogerus - */ - -+#include -+#include - #include - - #include "core.h" -@@ -17,14 +19,28 @@ - DWC3_GUSB2PHYACC_ADDR(ULPI_ACCESS_EXTENDED) | \ - DWC3_GUSB2PHYACC_EXTEND_ADDR(a) : DWC3_GUSB2PHYACC_ADDR(a)) - --static int dwc3_ulpi_busyloop(struct dwc3 *dwc) -+#define DWC3_ULPI_BASE_DELAY DIV_ROUND_UP(NSEC_PER_SEC, 60000000L) -+ -+static int dwc3_ulpi_busyloop(struct dwc3 *dwc, u8 addr, bool read) - { -- unsigned int count = 1000; -+ unsigned long ns = 5L * DWC3_ULPI_BASE_DELAY; -+ unsigned int count = 10000; - u32 reg; - -+ if (addr >= ULPI_EXT_VENDOR_SPECIFIC) -+ ns += DWC3_ULPI_BASE_DELAY; -+ -+ if (read) -+ ns += DWC3_ULPI_BASE_DELAY; -+ -+ reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); -+ if (reg & DWC3_GUSB2PHYCFG_SUSPHY) -+ usleep_range(1000, 1200); -+ - while (count--) { -+ ndelay(ns); - reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYACC(0)); -- if (!(reg & DWC3_GUSB2PHYACC_BUSY)) -+ if (reg & DWC3_GUSB2PHYACC_DONE) - return 0; - cpu_relax(); - } -@@ -38,16 +54,10 @@ static int dwc3_ulpi_read(struct device *dev, u8 addr) - u32 reg; - int ret; - -- reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); -- if (reg & DWC3_GUSB2PHYCFG_SUSPHY) { -- reg &= ~DWC3_GUSB2PHYCFG_SUSPHY; -- dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); -- } -- - reg = DWC3_GUSB2PHYACC_NEWREGREQ | DWC3_ULPI_ADDR(addr); - dwc3_writel(dwc->regs, DWC3_GUSB2PHYACC(0), reg); - -- ret = dwc3_ulpi_busyloop(dwc); -+ ret = dwc3_ulpi_busyloop(dwc, addr, true); - if (ret) - return ret; - -@@ -61,17 +71,11 @@ static int dwc3_ulpi_write(struct device *dev, u8 addr, u8 val) - struct dwc3 *dwc = dev_get_drvdata(dev); - u32 reg; - -- reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); -- if (reg & DWC3_GUSB2PHYCFG_SUSPHY) { -- reg &= ~DWC3_GUSB2PHYCFG_SUSPHY; -- dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); -- } -- - reg = DWC3_GUSB2PHYACC_NEWREGREQ | DWC3_ULPI_ADDR(addr); - reg |= DWC3_GUSB2PHYACC_WRITE | val; - dwc3_writel(dwc->regs, DWC3_GUSB2PHYACC(0), reg); - -- return dwc3_ulpi_busyloop(dwc); -+ return dwc3_ulpi_busyloop(dwc, addr, false); - } - - static const struct ulpi_ops dwc3_ulpi_ops = { -diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig -index 7e47e6223089c..2d152571a7de8 100644 ---- a/drivers/usb/gadget/Kconfig -+++ b/drivers/usb/gadget/Kconfig -@@ -265,6 +265,7 @@ config USB_CONFIGFS_NCM - depends on NET - select USB_U_ETHER - select USB_F_NCM -+ select CRC32 - help - NCM is an advanced protocol for Ethernet encapsulation, allows - grouping of several ethernet frames into one USB transfer and -@@ -314,6 +315,7 @@ config USB_CONFIGFS_EEM - depends on NET - select USB_U_ETHER - select USB_F_EEM -+ select CRC32 - help - CDC EEM is a newer USB standard that is somewhat simpler than CDC ECM - and therefore can be supported by more hardware. Technically ECM and -diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c -index c6d455f2bb928..1a556a628971f 100644 ---- a/drivers/usb/gadget/composite.c -+++ b/drivers/usb/gadget/composite.c -@@ -392,8 +392,11 @@ int usb_function_deactivate(struct usb_function *function) - - spin_lock_irqsave(&cdev->lock, flags); - -- if (cdev->deactivations == 0) -+ if (cdev->deactivations == 0) { -+ spin_unlock_irqrestore(&cdev->lock, flags); - status = usb_gadget_deactivate(cdev->gadget); -+ spin_lock_irqsave(&cdev->lock, flags); -+ } - if (status == 0) - cdev->deactivations++; - -@@ -424,8 +427,11 @@ int usb_function_activate(struct usb_function *function) - status = -EINVAL; - else { - cdev->deactivations--; -- if (cdev->deactivations == 0) -+ if (cdev->deactivations == 0) { -+ spin_unlock_irqrestore(&cdev->lock, flags); - status = usb_gadget_activate(cdev->gadget); -+ spin_lock_irqsave(&cdev->lock, flags); -+ } - } - - spin_unlock_irqrestore(&cdev->lock, flags); -diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c -index 56051bb973498..36ffb43f9c1a0 100644 ---- a/drivers/usb/gadget/configfs.c -+++ b/drivers/usb/gadget/configfs.c -@@ -221,9 +221,16 @@ static ssize_t gadget_dev_desc_bcdUSB_store(struct config_item *item, - - static ssize_t gadget_dev_desc_UDC_show(struct config_item *item, char *page) - { -- char *udc_name = to_gadget_info(item)->composite.gadget_driver.udc_name; -+ struct gadget_info *gi = to_gadget_info(item); -+ char *udc_name; -+ int ret; -+ -+ mutex_lock(&gi->lock); -+ udc_name = gi->composite.gadget_driver.udc_name; -+ ret = sprintf(page, "%s\n", udc_name ?: ""); -+ mutex_unlock(&gi->lock); - -- return sprintf(page, "%s\n", udc_name ?: ""); -+ return ret; - } - - static int unregister_gadget(struct gadget_info *gi) -@@ -1248,9 +1255,9 @@ static void purge_configs_funcs(struct gadget_info *gi) - - cfg = container_of(c, struct config_usb_cfg, c); - -- list_for_each_entry_safe(f, tmp, &c->functions, list) { -+ list_for_each_entry_safe_reverse(f, tmp, &c->functions, list) { - -- list_move_tail(&f->list, &cfg->func_list); -+ list_move(&f->list, &cfg->func_list); - if (f->unbind) { - dev_dbg(&gi->cdev.gadget->dev, - "unbind function '%s'/%p\n", -@@ -1536,7 +1543,7 @@ static const struct usb_gadget_driver configfs_driver_template = { - .suspend = configfs_composite_suspend, - .resume = configfs_composite_resume, - -- .max_speed = USB_SPEED_SUPER, -+ .max_speed = USB_SPEED_SUPER_PLUS, - .driver = { - .owner = THIS_MODULE, - .name = "configfs-gadget", -@@ -1576,7 +1583,7 @@ static struct config_group *gadgets_make( - gi->composite.unbind = configfs_do_nothing; - gi->composite.suspend = NULL; - gi->composite.resume = NULL; -- gi->composite.max_speed = USB_SPEED_SUPER; -+ gi->composite.max_speed = USB_SPEED_SUPER_PLUS; - - spin_lock_init(&gi->spinlock); - mutex_init(&gi->lock); -diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c -index 64a4112068fc8..2f1eb2e81d306 100644 ---- a/drivers/usb/gadget/function/f_printer.c -+++ b/drivers/usb/gadget/function/f_printer.c -@@ -1162,6 +1162,7 @@ fail_tx_reqs: - printer_req_free(dev->in_ep, req); - } - -+ usb_free_all_descriptors(f); - return ret; - - } -diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c -index 3633df6d7610f..5d960b6603b6f 100644 ---- a/drivers/usb/gadget/function/f_uac2.c -+++ b/drivers/usb/gadget/function/f_uac2.c -@@ -271,7 +271,7 @@ static struct usb_endpoint_descriptor fs_epout_desc = { - - .bEndpointAddress = USB_DIR_OUT, - .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, -- .wMaxPacketSize = cpu_to_le16(1023), -+ /* .wMaxPacketSize = DYNAMIC */ - .bInterval = 1, - }; - -@@ -280,7 +280,7 @@ static struct usb_endpoint_descriptor hs_epout_desc = { - .bDescriptorType = USB_DT_ENDPOINT, - - .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, -- .wMaxPacketSize = cpu_to_le16(1024), -+ /* .wMaxPacketSize = DYNAMIC */ - .bInterval = 4, - }; - -@@ -348,7 +348,7 @@ static struct usb_endpoint_descriptor fs_epin_desc = { - - .bEndpointAddress = USB_DIR_IN, - .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, -- .wMaxPacketSize = cpu_to_le16(1023), -+ /* .wMaxPacketSize = DYNAMIC */ - .bInterval = 1, - }; - -@@ -357,7 +357,7 @@ static struct usb_endpoint_descriptor hs_epin_desc = { - .bDescriptorType = USB_DT_ENDPOINT, - - .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, -- .wMaxPacketSize = cpu_to_le16(1024), -+ /* .wMaxPacketSize = DYNAMIC */ - .bInterval = 4, - }; - -@@ -444,12 +444,28 @@ struct cntrl_range_lay3 { - __le32 dRES; - } __packed; - --static void set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, -+static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, - struct usb_endpoint_descriptor *ep_desc, -- unsigned int factor, bool is_playback) -+ enum usb_device_speed speed, bool is_playback) - { - int chmask, srate, ssize; -- u16 max_packet_size; -+ u16 max_size_bw, max_size_ep; -+ unsigned int factor; -+ -+ switch (speed) { -+ case USB_SPEED_FULL: -+ max_size_ep = 1023; -+ factor = 1000; -+ break; -+ -+ case USB_SPEED_HIGH: -+ max_size_ep = 1024; -+ factor = 8000; -+ break; -+ -+ default: -+ return -EINVAL; -+ } - - if (is_playback) { - chmask = uac2_opts->p_chmask; -@@ -461,10 +477,12 @@ static void set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, - ssize = uac2_opts->c_ssize; - } - -- max_packet_size = num_channels(chmask) * ssize * -+ max_size_bw = num_channels(chmask) * ssize * - DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))); -- ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_packet_size, -- le16_to_cpu(ep_desc->wMaxPacketSize))); -+ ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw, -+ max_size_ep)); -+ -+ return 0; - } - - /* Use macro to overcome line length limitation */ -@@ -670,10 +688,33 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) - } - - /* Calculate wMaxPacketSize according to audio bandwidth */ -- set_ep_max_packet_size(uac2_opts, &fs_epin_desc, 1000, true); -- set_ep_max_packet_size(uac2_opts, &fs_epout_desc, 1000, false); -- set_ep_max_packet_size(uac2_opts, &hs_epin_desc, 8000, true); -- set_ep_max_packet_size(uac2_opts, &hs_epout_desc, 8000, false); -+ ret = set_ep_max_packet_size(uac2_opts, &fs_epin_desc, USB_SPEED_FULL, -+ true); -+ if (ret < 0) { -+ dev_err(dev, "%s:%d Error!\n", __func__, __LINE__); -+ return ret; -+ } -+ -+ ret = set_ep_max_packet_size(uac2_opts, &fs_epout_desc, USB_SPEED_FULL, -+ false); -+ if (ret < 0) { -+ dev_err(dev, "%s:%d Error!\n", __func__, __LINE__); -+ return ret; -+ } -+ -+ ret = set_ep_max_packet_size(uac2_opts, &hs_epin_desc, USB_SPEED_HIGH, -+ true); -+ if (ret < 0) { -+ dev_err(dev, "%s:%d Error!\n", __func__, __LINE__); -+ return ret; -+ } -+ -+ ret = set_ep_max_packet_size(uac2_opts, &hs_epout_desc, USB_SPEED_HIGH, -+ false); -+ if (ret < 0) { -+ dev_err(dev, "%s:%d Error!\n", __func__, __LINE__); -+ return ret; -+ } - - if (EPOUT_EN(uac2_opts)) { - agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc); -diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c -index 31ea76adcc0db..c019f2b0c0af3 100644 ---- a/drivers/usb/gadget/function/u_ether.c -+++ b/drivers/usb/gadget/function/u_ether.c -@@ -45,9 +45,10 @@ - #define UETH__VERSION "29-May-2008" - - /* Experiments show that both Linux and Windows hosts allow up to 16k -- * frame sizes. Set the max size to 15k+52 to prevent allocating 32k -+ * frame sizes. Set the max MTU size to 15k+52 to prevent allocating 32k - * blocks and still have efficient handling. */ --#define GETHER_MAX_ETH_FRAME_LEN 15412 -+#define GETHER_MAX_MTU_SIZE 15412 -+#define GETHER_MAX_ETH_FRAME_LEN (GETHER_MAX_MTU_SIZE + ETH_HLEN) - - struct eth_dev { - /* lock is held while accessing port_usb -@@ -786,7 +787,7 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g, - - /* MTU range: 14 - 15412 */ - net->min_mtu = ETH_HLEN; -- net->max_mtu = GETHER_MAX_ETH_FRAME_LEN; -+ net->max_mtu = GETHER_MAX_MTU_SIZE; - - dev->gadget = g; - SET_NETDEV_DEV(net, &g->dev); -@@ -848,7 +849,7 @@ struct net_device *gether_setup_name_default(const char *netname) - - /* MTU range: 14 - 15412 */ - net->min_mtu = ETH_HLEN; -- net->max_mtu = GETHER_MAX_ETH_FRAME_LEN; -+ net->max_mtu = GETHER_MAX_MTU_SIZE; - - return net; - } -diff --git a/drivers/usb/gadget/legacy/acm_ms.c b/drivers/usb/gadget/legacy/acm_ms.c -index 59be2d8417c9c..e8033e5f0c18e 100644 ---- a/drivers/usb/gadget/legacy/acm_ms.c -+++ b/drivers/usb/gadget/legacy/acm_ms.c -@@ -200,8 +200,10 @@ static int acm_ms_bind(struct usb_composite_dev *cdev) - struct usb_descriptor_header *usb_desc; - - usb_desc = usb_otg_descriptor_alloc(gadget); -- if (!usb_desc) -+ if (!usb_desc) { -+ status = -ENOMEM; - goto fail_string_ids; -+ } - usb_otg_descriptor_init(gadget, usb_desc); - otg_desc[0] = usb_desc; - otg_desc[1] = NULL; -diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c -index 99c1ebe86f6a2..016937579ed97 100644 ---- a/drivers/usb/gadget/udc/dummy_hcd.c -+++ b/drivers/usb/gadget/udc/dummy_hcd.c -@@ -2114,9 +2114,21 @@ static int dummy_hub_control( - dum_hcd->port_status &= ~USB_PORT_STAT_POWER; - set_link_state(dum_hcd); - break; -- default: -+ case USB_PORT_FEAT_ENABLE: -+ case USB_PORT_FEAT_C_ENABLE: -+ case USB_PORT_FEAT_C_SUSPEND: -+ /* Not allowed for USB-3 */ -+ if (hcd->speed == HCD_USB3) -+ goto error; -+ fallthrough; -+ case USB_PORT_FEAT_C_CONNECTION: -+ case USB_PORT_FEAT_C_RESET: - dum_hcd->port_status &= ~(1 << wValue); - set_link_state(dum_hcd); -+ break; -+ default: -+ /* Disallow INDICATOR and C_OVER_CURRENT */ -+ goto error; - } - break; - case GetHubDescriptor: -@@ -2277,18 +2289,17 @@ static int dummy_hub_control( - */ - dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50); - fallthrough; -+ case USB_PORT_FEAT_C_CONNECTION: -+ case USB_PORT_FEAT_C_RESET: -+ case USB_PORT_FEAT_C_ENABLE: -+ case USB_PORT_FEAT_C_SUSPEND: -+ /* Not allowed for USB-3, and ignored for USB-2 */ -+ if (hcd->speed == HCD_USB3) -+ goto error; -+ break; - default: -- if (hcd->speed == HCD_USB3) { -- if ((dum_hcd->port_status & -- USB_SS_PORT_STAT_POWER) != 0) { -- dum_hcd->port_status |= (1 << wValue); -- } -- } else -- if ((dum_hcd->port_status & -- USB_PORT_STAT_POWER) != 0) { -- dum_hcd->port_status |= (1 << wValue); -- } -- set_link_state(dum_hcd); -+ /* Disallow TEST, INDICATOR, and C_OVER_CURRENT */ -+ goto error; - } - break; - case GetPortErrorCount: -diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c -index d4a8d0efbbc4d..73f1373d517a2 100644 ---- a/drivers/usb/host/xhci.c -+++ b/drivers/usb/host/xhci.c -@@ -4646,19 +4646,19 @@ static u16 xhci_calculate_u1_timeout(struct xhci_hcd *xhci, - { - unsigned long long timeout_ns; - -+ if (xhci->quirks & XHCI_INTEL_HOST) -+ timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc); -+ else -+ timeout_ns = udev->u1_params.sel; -+ - /* Prevent U1 if service interval is shorter than U1 exit latency */ - if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) { -- if (xhci_service_interval_to_ns(desc) <= udev->u1_params.mel) { -+ if (xhci_service_interval_to_ns(desc) <= timeout_ns) { - dev_dbg(&udev->dev, "Disable U1, ESIT shorter than exit latency\n"); - return USB3_LPM_DISABLED; - } - } - -- if (xhci->quirks & XHCI_INTEL_HOST) -- timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc); -- else -- timeout_ns = udev->u1_params.sel; -- - /* The U1 timeout is encoded in 1us intervals. - * Don't return a timeout of zero, because that's USB3_LPM_DISABLED. - */ -@@ -4710,19 +4710,19 @@ static u16 xhci_calculate_u2_timeout(struct xhci_hcd *xhci, - { - unsigned long long timeout_ns; - -+ if (xhci->quirks & XHCI_INTEL_HOST) -+ timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc); -+ else -+ timeout_ns = udev->u2_params.sel; -+ - /* Prevent U2 if service interval is shorter than U2 exit latency */ - if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) { -- if (xhci_service_interval_to_ns(desc) <= udev->u2_params.mel) { -+ if (xhci_service_interval_to_ns(desc) <= timeout_ns) { - dev_dbg(&udev->dev, "Disable U2, ESIT shorter than exit latency\n"); - return USB3_LPM_DISABLED; - } - } - -- if (xhci->quirks & XHCI_INTEL_HOST) -- timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc); -- else -- timeout_ns = udev->u2_params.sel; -- - /* The U2 timeout is encoded in 256us intervals */ - timeout_ns = DIV_ROUND_UP_ULL(timeout_ns, 256 * 1000); - /* If the necessary timeout value is bigger than what we can set in the -diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c -index e3165d79b5f64..6c3d760bd4dd8 100644 ---- a/drivers/usb/misc/yurex.c -+++ b/drivers/usb/misc/yurex.c -@@ -495,6 +495,9 @@ static ssize_t yurex_write(struct file *file, const char __user *user_buffer, - timeout = schedule_timeout(YUREX_WRITE_TIMEOUT); - finish_wait(&dev->waitq, &wait); - -+ /* make sure URB is idle after timeout or (spurious) CMD_ACK */ -+ usb_kill_urb(dev->cntl_urb); -+ - mutex_unlock(&dev->io_mutex); - - if (retval < 0) { -diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c -index b4ba79123d9da..c14205190e7a7 100644 ---- a/drivers/usb/serial/iuu_phoenix.c -+++ b/drivers/usb/serial/iuu_phoenix.c -@@ -532,23 +532,29 @@ static int iuu_uart_flush(struct usb_serial_port *port) - struct device *dev = &port->dev; - int i; - int status; -- u8 rxcmd = IUU_UART_RX; -+ u8 *rxcmd; - struct iuu_private *priv = usb_get_serial_port_data(port); - - if (iuu_led(port, 0xF000, 0, 0, 0xFF) < 0) - return -EIO; - -+ rxcmd = kmalloc(1, GFP_KERNEL); -+ if (!rxcmd) -+ return -ENOMEM; -+ -+ rxcmd[0] = IUU_UART_RX; -+ - for (i = 0; i < 2; i++) { -- status = bulk_immediate(port, &rxcmd, 1); -+ status = bulk_immediate(port, rxcmd, 1); - if (status != IUU_OPERATION_OK) { - dev_dbg(dev, "%s - uart_flush_write error\n", __func__); -- return status; -+ goto out_free; - } - - status = read_immediate(port, &priv->len, 1); - if (status != IUU_OPERATION_OK) { - dev_dbg(dev, "%s - uart_flush_read error\n", __func__); -- return status; -+ goto out_free; - } - - if (priv->len > 0) { -@@ -556,12 +562,16 @@ static int iuu_uart_flush(struct usb_serial_port *port) - status = read_immediate(port, priv->buf, priv->len); - if (status != IUU_OPERATION_OK) { - dev_dbg(dev, "%s - uart_flush_read error\n", __func__); -- return status; -+ goto out_free; - } - } - } - dev_dbg(dev, "%s - uart_flush_read OK!\n", __func__); - iuu_led(port, 0, 0xF000, 0, 0xFF); -+ -+out_free: -+ kfree(rxcmd); -+ - return status; - } - -diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c -index 39ed3ad323651..aec32bf06e018 100644 ---- a/drivers/usb/serial/keyspan_pda.c -+++ b/drivers/usb/serial/keyspan_pda.c -@@ -555,10 +555,8 @@ exit: - static void keyspan_pda_write_bulk_callback(struct urb *urb) - { - struct usb_serial_port *port = urb->context; -- struct keyspan_pda_private *priv; - - set_bit(0, &port->write_urbs_free); -- priv = usb_get_serial_port_data(port); - - /* queue up a wakeup at scheduler time */ - usb_serial_port_softint(port); -diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c -index 2c21e34235bbb..3fe959104311b 100644 ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -1117,6 +1117,8 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0xff, 0xff), - .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0, 0) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0620, 0xff, 0xff, 0x30) }, /* EM160R-GL */ -+ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0620, 0xff, 0, 0) }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x30) }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10), -@@ -2057,6 +2059,7 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff), /* Fibocom NL678 series */ - .driver_info = RSVD(6) }, - { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ -+ { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */ - { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */ - { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */ - { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) }, /* GosunCn GM500 ECM/NCM */ -diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h -index 870e9cf3d5dc4..f9677a5ec31b2 100644 ---- a/drivers/usb/storage/unusual_uas.h -+++ b/drivers/usb/storage/unusual_uas.h -@@ -90,6 +90,13 @@ UNUSUAL_DEV(0x152d, 0x0578, 0x0000, 0x9999, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_BROKEN_FUA), - -+/* Reported-by: Thinh Nguyen */ -+UNUSUAL_DEV(0x154b, 0xf00b, 0x0000, 0x9999, -+ "PNY", -+ "Pro Elite SSD", -+ USB_SC_DEVICE, USB_PR_DEVICE, NULL, -+ US_FL_NO_ATA_1X), -+ - /* Reported-by: Thinh Nguyen */ - UNUSUAL_DEV(0x154b, 0xf00d, 0x0000, 0x9999, - "PNY", -diff --git a/drivers/usb/typec/mux/intel_pmc_mux.c b/drivers/usb/typec/mux/intel_pmc_mux.c -index d7f63b74c6b14..17896bd87fc3f 100644 ---- a/drivers/usb/typec/mux/intel_pmc_mux.c -+++ b/drivers/usb/typec/mux/intel_pmc_mux.c -@@ -202,10 +202,21 @@ static int - pmc_usb_mux_dp_hpd(struct pmc_usb_port *port, struct typec_displayport_data *dp) - { - u8 msg[2] = { }; -+ int ret; - - msg[0] = PMC_USB_DP_HPD; - msg[0] |= port->usb3_port << PMC_USB_MSG_USB3_PORT_SHIFT; - -+ /* Configure HPD first if HPD,IRQ comes together */ -+ if (!IOM_PORT_HPD_ASSERTED(port->iom_status) && -+ dp->status & DP_STATUS_IRQ_HPD && -+ dp->status & DP_STATUS_HPD_STATE) { -+ msg[1] = PMC_USB_DP_HPD_LVL; -+ ret = pmc_usb_command(port, msg, sizeof(msg)); -+ if (ret) -+ return ret; -+ } -+ - if (dp->status & DP_STATUS_IRQ_HPD) - msg[1] = PMC_USB_DP_HPD_IRQ; - -diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c -index 66cde5e5f7964..3209b5ddd30c9 100644 ---- a/drivers/usb/usbip/vhci_hcd.c -+++ b/drivers/usb/usbip/vhci_hcd.c -@@ -396,6 +396,8 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, - default: - usbip_dbg_vhci_rh(" ClearPortFeature: default %x\n", - wValue); -+ if (wValue >= 32) -+ goto error; - vhci_hcd->port_status[rhport] &= ~(1 << wValue); - break; - } -diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c -index 531a00d703cdf..c8784dfafdd73 100644 ---- a/drivers/vhost/net.c -+++ b/drivers/vhost/net.c -@@ -863,6 +863,7 @@ static void handle_tx_zerocopy(struct vhost_net *net, struct socket *sock) - size_t len, total_len = 0; - int err; - struct vhost_net_ubuf_ref *ubufs; -+ struct ubuf_info *ubuf; - bool zcopy_used; - int sent_pkts = 0; - -@@ -895,9 +896,7 @@ static void handle_tx_zerocopy(struct vhost_net *net, struct socket *sock) - - /* use msg_control to pass vhost zerocopy ubuf info to skb */ - if (zcopy_used) { -- struct ubuf_info *ubuf; - ubuf = nvq->ubuf_info + nvq->upend_idx; -- - vq->heads[nvq->upend_idx].id = cpu_to_vhost32(vq, head); - vq->heads[nvq->upend_idx].len = VHOST_DMA_IN_PROGRESS; - ubuf->callback = vhost_zerocopy_callback; -@@ -927,7 +926,8 @@ static void handle_tx_zerocopy(struct vhost_net *net, struct socket *sock) - err = sock->ops->sendmsg(sock, &msg, len); - if (unlikely(err < 0)) { - if (zcopy_used) { -- vhost_net_ubuf_put(ubufs); -+ if (vq->heads[ubuf->desc].len == VHOST_DMA_IN_PROGRESS) -+ vhost_net_ubuf_put(ubufs); - nvq->upend_idx = ((unsigned)nvq->upend_idx - 1) - % UIO_MAXIOV; - } -diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c -index 87bd37b70738e..faed0e96cec23 100644 ---- a/fs/btrfs/qgroup.c -+++ b/fs/btrfs/qgroup.c -@@ -3564,16 +3564,6 @@ static int try_flush_qgroup(struct btrfs_root *root) - int ret; - bool can_commit = true; - -- /* -- * We don't want to run flush again and again, so if there is a running -- * one, we won't try to start a new flush, but exit directly. -- */ -- if (test_and_set_bit(BTRFS_ROOT_QGROUP_FLUSHING, &root->state)) { -- wait_event(root->qgroup_flush_wait, -- !test_bit(BTRFS_ROOT_QGROUP_FLUSHING, &root->state)); -- return 0; -- } -- - /* - * If current process holds a transaction, we shouldn't flush, as we - * assume all space reservation happens before a transaction handle is -@@ -3588,6 +3578,26 @@ static int try_flush_qgroup(struct btrfs_root *root) - current->journal_info != BTRFS_SEND_TRANS_STUB) - can_commit = false; - -+ /* -+ * We don't want to run flush again and again, so if there is a running -+ * one, we won't try to start a new flush, but exit directly. -+ */ -+ if (test_and_set_bit(BTRFS_ROOT_QGROUP_FLUSHING, &root->state)) { -+ /* -+ * We are already holding a transaction, thus we can block other -+ * threads from flushing. So exit right now. This increases -+ * the chance of EDQUOT for heavy load and near limit cases. -+ * But we can argue that if we're already near limit, EDQUOT is -+ * unavoidable anyway. -+ */ -+ if (!can_commit) -+ return 0; -+ -+ wait_event(root->qgroup_flush_wait, -+ !test_bit(BTRFS_ROOT_QGROUP_FLUSHING, &root->state)); -+ return 0; -+ } -+ - ret = btrfs_start_delalloc_snapshot(root); - if (ret < 0) - goto out; -diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c -index 340c76a12ce10..9e08ddb629685 100644 ---- a/fs/btrfs/send.c -+++ b/fs/btrfs/send.c -@@ -236,6 +236,7 @@ struct waiting_dir_move { - * after this directory is moved, we can try to rmdir the ino rmdir_ino. - */ - u64 rmdir_ino; -+ u64 rmdir_gen; - bool orphanized; - }; - -@@ -316,7 +317,7 @@ static int is_waiting_for_move(struct send_ctx *sctx, u64 ino); - static struct waiting_dir_move * - get_waiting_dir_move(struct send_ctx *sctx, u64 ino); - --static int is_waiting_for_rm(struct send_ctx *sctx, u64 dir_ino); -+static int is_waiting_for_rm(struct send_ctx *sctx, u64 dir_ino, u64 gen); - - static int need_send_hole(struct send_ctx *sctx) - { -@@ -2299,7 +2300,7 @@ static int get_cur_path(struct send_ctx *sctx, u64 ino, u64 gen, - - fs_path_reset(name); - -- if (is_waiting_for_rm(sctx, ino)) { -+ if (is_waiting_for_rm(sctx, ino, gen)) { - ret = gen_unique_name(sctx, ino, gen, name); - if (ret < 0) - goto out; -@@ -2858,8 +2859,8 @@ out: - return ret; - } - --static struct orphan_dir_info * --add_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino) -+static struct orphan_dir_info *add_orphan_dir_info(struct send_ctx *sctx, -+ u64 dir_ino, u64 dir_gen) - { - struct rb_node **p = &sctx->orphan_dirs.rb_node; - struct rb_node *parent = NULL; -@@ -2868,20 +2869,23 @@ add_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino) - while (*p) { - parent = *p; - entry = rb_entry(parent, struct orphan_dir_info, node); -- if (dir_ino < entry->ino) { -+ if (dir_ino < entry->ino) - p = &(*p)->rb_left; -- } else if (dir_ino > entry->ino) { -+ else if (dir_ino > entry->ino) - p = &(*p)->rb_right; -- } else { -+ else if (dir_gen < entry->gen) -+ p = &(*p)->rb_left; -+ else if (dir_gen > entry->gen) -+ p = &(*p)->rb_right; -+ else - return entry; -- } - } - - odi = kmalloc(sizeof(*odi), GFP_KERNEL); - if (!odi) - return ERR_PTR(-ENOMEM); - odi->ino = dir_ino; -- odi->gen = 0; -+ odi->gen = dir_gen; - odi->last_dir_index_offset = 0; - - rb_link_node(&odi->node, parent, p); -@@ -2889,8 +2893,8 @@ add_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino) - return odi; - } - --static struct orphan_dir_info * --get_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino) -+static struct orphan_dir_info *get_orphan_dir_info(struct send_ctx *sctx, -+ u64 dir_ino, u64 gen) - { - struct rb_node *n = sctx->orphan_dirs.rb_node; - struct orphan_dir_info *entry; -@@ -2901,15 +2905,19 @@ get_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino) - n = n->rb_left; - else if (dir_ino > entry->ino) - n = n->rb_right; -+ else if (gen < entry->gen) -+ n = n->rb_left; -+ else if (gen > entry->gen) -+ n = n->rb_right; - else - return entry; - } - return NULL; - } - --static int is_waiting_for_rm(struct send_ctx *sctx, u64 dir_ino) -+static int is_waiting_for_rm(struct send_ctx *sctx, u64 dir_ino, u64 gen) - { -- struct orphan_dir_info *odi = get_orphan_dir_info(sctx, dir_ino); -+ struct orphan_dir_info *odi = get_orphan_dir_info(sctx, dir_ino, gen); - - return odi != NULL; - } -@@ -2954,7 +2962,7 @@ static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 dir_gen, - key.type = BTRFS_DIR_INDEX_KEY; - key.offset = 0; - -- odi = get_orphan_dir_info(sctx, dir); -+ odi = get_orphan_dir_info(sctx, dir, dir_gen); - if (odi) - key.offset = odi->last_dir_index_offset; - -@@ -2985,7 +2993,7 @@ static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 dir_gen, - - dm = get_waiting_dir_move(sctx, loc.objectid); - if (dm) { -- odi = add_orphan_dir_info(sctx, dir); -+ odi = add_orphan_dir_info(sctx, dir, dir_gen); - if (IS_ERR(odi)) { - ret = PTR_ERR(odi); - goto out; -@@ -2993,12 +3001,13 @@ static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 dir_gen, - odi->gen = dir_gen; - odi->last_dir_index_offset = found_key.offset; - dm->rmdir_ino = dir; -+ dm->rmdir_gen = dir_gen; - ret = 0; - goto out; - } - - if (loc.objectid > send_progress) { -- odi = add_orphan_dir_info(sctx, dir); -+ odi = add_orphan_dir_info(sctx, dir, dir_gen); - if (IS_ERR(odi)) { - ret = PTR_ERR(odi); - goto out; -@@ -3038,6 +3047,7 @@ static int add_waiting_dir_move(struct send_ctx *sctx, u64 ino, bool orphanized) - return -ENOMEM; - dm->ino = ino; - dm->rmdir_ino = 0; -+ dm->rmdir_gen = 0; - dm->orphanized = orphanized; - - while (*p) { -@@ -3183,7 +3193,7 @@ static int path_loop(struct send_ctx *sctx, struct fs_path *name, - while (ino != BTRFS_FIRST_FREE_OBJECTID) { - fs_path_reset(name); - -- if (is_waiting_for_rm(sctx, ino)) -+ if (is_waiting_for_rm(sctx, ino, gen)) - break; - if (is_waiting_for_move(sctx, ino)) { - if (*ancestor_ino == 0) -@@ -3223,6 +3233,7 @@ static int apply_dir_move(struct send_ctx *sctx, struct pending_dir_move *pm) - u64 parent_ino, parent_gen; - struct waiting_dir_move *dm = NULL; - u64 rmdir_ino = 0; -+ u64 rmdir_gen; - u64 ancestor; - bool is_orphan; - int ret; -@@ -3237,6 +3248,7 @@ static int apply_dir_move(struct send_ctx *sctx, struct pending_dir_move *pm) - dm = get_waiting_dir_move(sctx, pm->ino); - ASSERT(dm); - rmdir_ino = dm->rmdir_ino; -+ rmdir_gen = dm->rmdir_gen; - is_orphan = dm->orphanized; - free_waiting_dir_move(sctx, dm); - -@@ -3273,6 +3285,7 @@ static int apply_dir_move(struct send_ctx *sctx, struct pending_dir_move *pm) - dm = get_waiting_dir_move(sctx, pm->ino); - ASSERT(dm); - dm->rmdir_ino = rmdir_ino; -+ dm->rmdir_gen = rmdir_gen; - } - goto out; - } -@@ -3291,7 +3304,7 @@ static int apply_dir_move(struct send_ctx *sctx, struct pending_dir_move *pm) - struct orphan_dir_info *odi; - u64 gen; - -- odi = get_orphan_dir_info(sctx, rmdir_ino); -+ odi = get_orphan_dir_info(sctx, rmdir_ino, rmdir_gen); - if (!odi) { - /* already deleted */ - goto finish; -diff --git a/include/asm-generic/Kbuild b/include/asm-generic/Kbuild -index e78bbb9a07e90..d1300c6e0a471 100644 ---- a/include/asm-generic/Kbuild -+++ b/include/asm-generic/Kbuild -@@ -34,6 +34,7 @@ mandatory-y += kmap_types.h - mandatory-y += kprobes.h - mandatory-y += linkage.h - mandatory-y += local.h -+mandatory-y += local64.h - mandatory-y += mm-arch-hooks.h - mandatory-y += mmiowb.h - mandatory-y += mmu.h -diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h -index 794b2a33a2c36..f8ea27423d1d8 100644 ---- a/include/linux/blk-mq.h -+++ b/include/linux/blk-mq.h -@@ -446,8 +446,8 @@ enum { - BLK_MQ_REQ_NOWAIT = (__force blk_mq_req_flags_t)(1 << 0), - /* allocate from reserved pool */ - BLK_MQ_REQ_RESERVED = (__force blk_mq_req_flags_t)(1 << 1), -- /* set RQF_PREEMPT */ -- BLK_MQ_REQ_PREEMPT = (__force blk_mq_req_flags_t)(1 << 3), -+ /* set RQF_PM */ -+ BLK_MQ_REQ_PM = (__force blk_mq_req_flags_t)(1 << 2), - }; - - struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op, -diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h -index 033eb5f73b654..542471b76f410 100644 ---- a/include/linux/blkdev.h -+++ b/include/linux/blkdev.h -@@ -79,9 +79,6 @@ typedef __u32 __bitwise req_flags_t; - #define RQF_MQ_INFLIGHT ((__force req_flags_t)(1 << 6)) - /* don't call prep for this one */ - #define RQF_DONTPREP ((__force req_flags_t)(1 << 7)) --/* set for "ide_preempt" requests and also for requests for which the SCSI -- "quiesce" state must be ignored. */ --#define RQF_PREEMPT ((__force req_flags_t)(1 << 8)) - /* vaguely specified driver internal error. Ignored by the block layer */ - #define RQF_FAILED ((__force req_flags_t)(1 << 10)) - /* don't warn about errors */ -@@ -430,8 +427,7 @@ struct request_queue { - unsigned long queue_flags; - /* - * Number of contexts that have called blk_set_pm_only(). If this -- * counter is above zero then only RQF_PM and RQF_PREEMPT requests are -- * processed. -+ * counter is above zero then only RQF_PM requests are processed. - */ - atomic_t pm_only; - -@@ -696,6 +692,18 @@ static inline bool queue_is_mq(struct request_queue *q) - return q->mq_ops; - } - -+#ifdef CONFIG_PM -+static inline enum rpm_status queue_rpm_status(struct request_queue *q) -+{ -+ return q->rpm_status; -+} -+#else -+static inline enum rpm_status queue_rpm_status(struct request_queue *q) -+{ -+ return RPM_ACTIVE; -+} -+#endif -+ - static inline enum blk_zoned_model - blk_queue_zoned_model(struct request_queue *q) - { -diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h -index d956987ed032d..94522685a0d94 100644 ---- a/include/linux/intel-iommu.h -+++ b/include/linux/intel-iommu.h -@@ -758,6 +758,7 @@ struct intel_svm_dev { - struct list_head list; - struct rcu_head rcu; - struct device *dev; -+ struct intel_iommu *iommu; - struct svm_dev_ops *ops; - struct iommu_sva sva; - u32 pasid; -@@ -771,7 +772,6 @@ struct intel_svm { - struct mmu_notifier notifier; - struct mm_struct *mm; - -- struct intel_iommu *iommu; - unsigned int flags; - u32 pasid; - int gpasid; /* In case that guest PASID is different from host PASID */ -diff --git a/include/net/red.h b/include/net/red.h -index fc455445f4b22..932f0d79d60cb 100644 ---- a/include/net/red.h -+++ b/include/net/red.h -@@ -168,12 +168,14 @@ static inline void red_set_vars(struct red_vars *v) - v->qcount = -1; - } - --static inline bool red_check_params(u32 qth_min, u32 qth_max, u8 Wlog) -+static inline bool red_check_params(u32 qth_min, u32 qth_max, u8 Wlog, u8 Scell_log) - { - if (fls(qth_min) + Wlog > 32) - return false; - if (fls(qth_max) + Wlog > 32) - return false; -+ if (Scell_log >= 32) -+ return false; - if (qth_max < qth_min) - return false; - return true; -diff --git a/include/uapi/linux/bcache.h b/include/uapi/linux/bcache.h -index 52e8bcb339811..cf7399f03b712 100644 ---- a/include/uapi/linux/bcache.h -+++ b/include/uapi/linux/bcache.h -@@ -213,7 +213,7 @@ struct cache_sb_disk { - __le16 keys; - }; - __le64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */ -- __le16 bucket_size_hi; -+ __le16 obso_bucket_size_hi; /* obsoleted */ - }; - - /* -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 437935e7a1991..0695c7895c892 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -3728,17 +3728,24 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq) - * is updated and visible. - */ - if (!freezable || !workqueue_freezing) { -+ bool kick = false; -+ - pwq->max_active = wq->saved_max_active; - - while (!list_empty(&pwq->delayed_works) && -- pwq->nr_active < pwq->max_active) -+ pwq->nr_active < pwq->max_active) { - pwq_activate_first_delayed(pwq); -+ kick = true; -+ } - - /* - * Need to kick a worker after thawed or an unbound wq's -- * max_active is bumped. It's a slow path. Do it always. -+ * max_active is bumped. In realtime scenarios, always kicking a -+ * worker will cause interference on the isolated cpu cores, so -+ * let's kick iff work items were activated. - */ -- wake_up_worker(pwq->pool); -+ if (kick) -+ wake_up_worker(pwq->pool); - } else { - pwq->max_active = 0; - } -diff --git a/lib/genalloc.c b/lib/genalloc.c -index 7f1244b5294a8..dab97bb69df63 100644 ---- a/lib/genalloc.c -+++ b/lib/genalloc.c -@@ -81,14 +81,14 @@ static int clear_bits_ll(unsigned long *addr, unsigned long mask_to_clear) - * users set the same bit, one user will return remain bits, otherwise - * return 0. - */ --static int bitmap_set_ll(unsigned long *map, int start, int nr) -+static int bitmap_set_ll(unsigned long *map, unsigned long start, unsigned long nr) - { - unsigned long *p = map + BIT_WORD(start); -- const int size = start + nr; -+ const unsigned long size = start + nr; - int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); - unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start); - -- while (nr - bits_to_set >= 0) { -+ while (nr >= bits_to_set) { - if (set_bits_ll(p, mask_to_set)) - return nr; - nr -= bits_to_set; -@@ -116,14 +116,15 @@ static int bitmap_set_ll(unsigned long *map, int start, int nr) - * users clear the same bit, one user will return remain bits, - * otherwise return 0. - */ --static int bitmap_clear_ll(unsigned long *map, int start, int nr) -+static unsigned long -+bitmap_clear_ll(unsigned long *map, unsigned long start, unsigned long nr) - { - unsigned long *p = map + BIT_WORD(start); -- const int size = start + nr; -+ const unsigned long size = start + nr; - int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG); - unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start); - -- while (nr - bits_to_clear >= 0) { -+ while (nr >= bits_to_clear) { - if (clear_bits_ll(p, mask_to_clear)) - return nr; - nr -= bits_to_clear; -@@ -183,8 +184,8 @@ int gen_pool_add_owner(struct gen_pool *pool, unsigned long virt, phys_addr_t ph - size_t size, int nid, void *owner) - { - struct gen_pool_chunk *chunk; -- int nbits = size >> pool->min_alloc_order; -- int nbytes = sizeof(struct gen_pool_chunk) + -+ unsigned long nbits = size >> pool->min_alloc_order; -+ unsigned long nbytes = sizeof(struct gen_pool_chunk) + - BITS_TO_LONGS(nbits) * sizeof(long); - - chunk = vzalloc_node(nbytes, nid); -@@ -242,7 +243,7 @@ void gen_pool_destroy(struct gen_pool *pool) - struct list_head *_chunk, *_next_chunk; - struct gen_pool_chunk *chunk; - int order = pool->min_alloc_order; -- int bit, end_bit; -+ unsigned long bit, end_bit; - - list_for_each_safe(_chunk, _next_chunk, &pool->chunks) { - chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk); -@@ -278,7 +279,7 @@ unsigned long gen_pool_alloc_algo_owner(struct gen_pool *pool, size_t size, - struct gen_pool_chunk *chunk; - unsigned long addr = 0; - int order = pool->min_alloc_order; -- int nbits, start_bit, end_bit, remain; -+ unsigned long nbits, start_bit, end_bit, remain; - - #ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG - BUG_ON(in_nmi()); -@@ -487,7 +488,7 @@ void gen_pool_free_owner(struct gen_pool *pool, unsigned long addr, size_t size, - { - struct gen_pool_chunk *chunk; - int order = pool->min_alloc_order; -- int start_bit, nbits, remain; -+ unsigned long start_bit, nbits, remain; - - #ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG - BUG_ON(in_nmi()); -@@ -755,7 +756,7 @@ unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size, - index = bitmap_find_next_zero_area(map, size, start, nr, 0); - - while (index < size) { -- int next_bit = find_next_bit(map, size, index + nr); -+ unsigned long next_bit = find_next_bit(map, size, index + nr); - if ((next_bit - index) < len) { - len = next_bit - index; - start_bit = index; -diff --git a/mm/page-writeback.c b/mm/page-writeback.c -index 586042472ac90..eb34d204d4ee7 100644 ---- a/mm/page-writeback.c -+++ b/mm/page-writeback.c -@@ -2826,7 +2826,7 @@ EXPORT_SYMBOL(__test_set_page_writeback); - */ - void wait_on_page_writeback(struct page *page) - { -- if (PageWriteback(page)) { -+ while (PageWriteback(page)) { - trace_wait_on_page_writeback(page, page_mapping(page)); - wait_on_page_bit(page, PG_writeback); - } -diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c -index 94fff0700bdd3..b4562f9d074cf 100644 ---- a/net/core/net-sysfs.c -+++ b/net/core/net-sysfs.c -@@ -1317,8 +1317,8 @@ static const struct attribute_group dql_group = { - static ssize_t xps_cpus_show(struct netdev_queue *queue, - char *buf) - { -+ int cpu, len, ret, num_tc = 1, tc = 0; - struct net_device *dev = queue->dev; -- int cpu, len, num_tc = 1, tc = 0; - struct xps_dev_maps *dev_maps; - cpumask_var_t mask; - unsigned long index; -@@ -1328,22 +1328,31 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue, - - index = get_netdev_queue_index(queue); - -+ if (!rtnl_trylock()) -+ return restart_syscall(); -+ - if (dev->num_tc) { - /* Do not allow XPS on subordinate device directly */ - num_tc = dev->num_tc; -- if (num_tc < 0) -- return -EINVAL; -+ if (num_tc < 0) { -+ ret = -EINVAL; -+ goto err_rtnl_unlock; -+ } - - /* If queue belongs to subordinate dev use its map */ - dev = netdev_get_tx_queue(dev, index)->sb_dev ? : dev; - - tc = netdev_txq_to_tc(dev, index); -- if (tc < 0) -- return -EINVAL; -+ if (tc < 0) { -+ ret = -EINVAL; -+ goto err_rtnl_unlock; -+ } - } - -- if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) -- return -ENOMEM; -+ if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) { -+ ret = -ENOMEM; -+ goto err_rtnl_unlock; -+ } - - rcu_read_lock(); - dev_maps = rcu_dereference(dev->xps_cpus_map); -@@ -1366,9 +1375,15 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue, - } - rcu_read_unlock(); - -+ rtnl_unlock(); -+ - len = snprintf(buf, PAGE_SIZE, "%*pb\n", cpumask_pr_args(mask)); - free_cpumask_var(mask); - return len < PAGE_SIZE ? len : -EINVAL; -+ -+err_rtnl_unlock: -+ rtnl_unlock(); -+ return ret; - } - - static ssize_t xps_cpus_store(struct netdev_queue *queue, -@@ -1396,7 +1411,13 @@ static ssize_t xps_cpus_store(struct netdev_queue *queue, - return err; - } - -+ if (!rtnl_trylock()) { -+ free_cpumask_var(mask); -+ return restart_syscall(); -+ } -+ - err = netif_set_xps_queue(dev, mask, index); -+ rtnl_unlock(); - - free_cpumask_var(mask); - -@@ -1408,22 +1429,29 @@ static struct netdev_queue_attribute xps_cpus_attribute __ro_after_init - - static ssize_t xps_rxqs_show(struct netdev_queue *queue, char *buf) - { -+ int j, len, ret, num_tc = 1, tc = 0; - struct net_device *dev = queue->dev; - struct xps_dev_maps *dev_maps; - unsigned long *mask, index; -- int j, len, num_tc = 1, tc = 0; - - index = get_netdev_queue_index(queue); - -+ if (!rtnl_trylock()) -+ return restart_syscall(); -+ - if (dev->num_tc) { - num_tc = dev->num_tc; - tc = netdev_txq_to_tc(dev, index); -- if (tc < 0) -- return -EINVAL; -+ if (tc < 0) { -+ ret = -EINVAL; -+ goto err_rtnl_unlock; -+ } - } - mask = bitmap_zalloc(dev->num_rx_queues, GFP_KERNEL); -- if (!mask) -- return -ENOMEM; -+ if (!mask) { -+ ret = -ENOMEM; -+ goto err_rtnl_unlock; -+ } - - rcu_read_lock(); - dev_maps = rcu_dereference(dev->xps_rxqs_map); -@@ -1449,10 +1477,16 @@ static ssize_t xps_rxqs_show(struct netdev_queue *queue, char *buf) - out_no_maps: - rcu_read_unlock(); - -+ rtnl_unlock(); -+ - len = bitmap_print_to_pagebuf(false, buf, mask, dev->num_rx_queues); - bitmap_free(mask); - - return len < PAGE_SIZE ? len : -EINVAL; -+ -+err_rtnl_unlock: -+ rtnl_unlock(); -+ return ret; - } - - static ssize_t xps_rxqs_store(struct netdev_queue *queue, const char *buf, -@@ -1478,10 +1512,17 @@ static ssize_t xps_rxqs_store(struct netdev_queue *queue, const char *buf, - return err; - } - -+ if (!rtnl_trylock()) { -+ bitmap_free(mask); -+ return restart_syscall(); -+ } -+ - cpus_read_lock(); - err = __netif_set_xps_queue(dev, mask, index, true); - cpus_read_unlock(); - -+ rtnl_unlock(); -+ - bitmap_free(mask); - return err ? : len; - } -diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c -index cdf6ec5aa45de..84bb707bd88d8 100644 ---- a/net/ipv4/fib_frontend.c -+++ b/net/ipv4/fib_frontend.c -@@ -292,7 +292,7 @@ __be32 fib_compute_spec_dst(struct sk_buff *skb) - .flowi4_iif = LOOPBACK_IFINDEX, - .flowi4_oif = l3mdev_master_ifindex_rcu(dev), - .daddr = ip_hdr(skb)->saddr, -- .flowi4_tos = RT_TOS(ip_hdr(skb)->tos), -+ .flowi4_tos = ip_hdr(skb)->tos & IPTOS_RT_MASK, - .flowi4_scope = scope, - .flowi4_mark = vmark ? skb->mark : 0, - }; -diff --git a/net/ipv4/gre_demux.c b/net/ipv4/gre_demux.c -index 66fdbfe5447cd..5d1e6fe9d8387 100644 ---- a/net/ipv4/gre_demux.c -+++ b/net/ipv4/gre_demux.c -@@ -128,7 +128,7 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, - * to 0 and sets the configured key in the - * inner erspan header field - */ -- if (greh->protocol == htons(ETH_P_ERSPAN) || -+ if ((greh->protocol == htons(ETH_P_ERSPAN) && hdr_len != 4) || - greh->protocol == htons(ETH_P_ERSPAN2)) { - struct erspan_base_hdr *ershdr; - -diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c -index 563b62b76a5f1..c576a63d09db1 100644 ---- a/net/ipv4/netfilter/arp_tables.c -+++ b/net/ipv4/netfilter/arp_tables.c -@@ -1379,7 +1379,7 @@ static int compat_get_entries(struct net *net, - xt_compat_lock(NFPROTO_ARP); - t = xt_find_table_lock(net, NFPROTO_ARP, get.name); - if (!IS_ERR(t)) { -- const struct xt_table_info *private = t->private; -+ const struct xt_table_info *private = xt_table_get_private_protected(t); - struct xt_table_info info; - - ret = compat_table_info(private, &info); -diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c -index 6e2851f8d3a3f..e8f6f9d862376 100644 ---- a/net/ipv4/netfilter/ip_tables.c -+++ b/net/ipv4/netfilter/ip_tables.c -@@ -1589,7 +1589,7 @@ compat_get_entries(struct net *net, struct compat_ipt_get_entries __user *uptr, - xt_compat_lock(AF_INET); - t = xt_find_table_lock(net, AF_INET, get.name); - if (!IS_ERR(t)) { -- const struct xt_table_info *private = t->private; -+ const struct xt_table_info *private = xt_table_get_private_protected(t); - struct xt_table_info info; - ret = compat_table_info(private, &info); - if (!ret && get.size == info.size) -diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c -index c4f532f4d3118..0d453fa9e327b 100644 ---- a/net/ipv6/netfilter/ip6_tables.c -+++ b/net/ipv6/netfilter/ip6_tables.c -@@ -1598,7 +1598,7 @@ compat_get_entries(struct net *net, struct compat_ip6t_get_entries __user *uptr, - xt_compat_lock(AF_INET6); - t = xt_find_table_lock(net, AF_INET6, get.name); - if (!IS_ERR(t)) { -- const struct xt_table_info *private = t->private; -+ const struct xt_table_info *private = xt_table_get_private_protected(t); - struct xt_table_info info; - ret = compat_table_info(private, &info); - if (!ret && get.size == info.size) -diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c -index 5b1f4ec66dd98..888ccc2d4e34b 100644 ---- a/net/ncsi/ncsi-rsp.c -+++ b/net/ncsi/ncsi-rsp.c -@@ -1120,7 +1120,7 @@ int ncsi_rcv_rsp(struct sk_buff *skb, struct net_device *dev, - int payload, i, ret; - - /* Find the NCSI device */ -- nd = ncsi_find_dev(dev); -+ nd = ncsi_find_dev(orig_dev); - ndp = nd ? TO_NCSI_DEV_PRIV(nd) : NULL; - if (!ndp) - return -ENODEV; -diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h -index 521e970be4028..7d01086b38f0f 100644 ---- a/net/netfilter/ipset/ip_set_hash_gen.h -+++ b/net/netfilter/ipset/ip_set_hash_gen.h -@@ -143,20 +143,6 @@ htable_size(u8 hbits) - return hsize * sizeof(struct hbucket *) + sizeof(struct htable); - } - --/* Compute htable_bits from the user input parameter hashsize */ --static u8 --htable_bits(u32 hashsize) --{ -- /* Assume that hashsize == 2^htable_bits */ -- u8 bits = fls(hashsize - 1); -- -- if (jhash_size(bits) != hashsize) -- /* Round up to the first 2^n value */ -- bits = fls(hashsize); -- -- return bits; --} -- - #ifdef IP_SET_HASH_WITH_NETS - #if IPSET_NET_COUNT > 1 - #define __CIDR(cidr, i) (cidr[i]) -@@ -1520,7 +1506,11 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, - if (!h) - return -ENOMEM; - -- hbits = htable_bits(hashsize); -+ /* Compute htable_bits from the user input parameter hashsize. -+ * Assume that hashsize == 2^htable_bits, -+ * otherwise round up to the first 2^n value. -+ */ -+ hbits = fls(hashsize - 1); - hsize = htable_size(hbits); - if (hsize == 0) { - kfree(h); -diff --git a/net/netfilter/nft_dynset.c b/net/netfilter/nft_dynset.c -index 9af4f93c7f0e1..4990f7cbfafdf 100644 ---- a/net/netfilter/nft_dynset.c -+++ b/net/netfilter/nft_dynset.c -@@ -123,7 +123,7 @@ static int nft_dynset_init(const struct nft_ctx *ctx, - u32 flags = ntohl(nla_get_be32(tb[NFTA_DYNSET_FLAGS])); - - if (flags & ~NFT_DYNSET_F_INV) -- return -EINVAL; -+ return -EOPNOTSUPP; - if (flags & NFT_DYNSET_F_INV) - priv->invert = true; - } -@@ -156,7 +156,7 @@ static int nft_dynset_init(const struct nft_ctx *ctx, - timeout = 0; - if (tb[NFTA_DYNSET_TIMEOUT] != NULL) { - if (!(set->flags & NFT_SET_TIMEOUT)) -- return -EINVAL; -+ return -EOPNOTSUPP; - - err = nf_msecs_to_jiffies64(tb[NFTA_DYNSET_TIMEOUT], &timeout); - if (err) -@@ -170,7 +170,7 @@ static int nft_dynset_init(const struct nft_ctx *ctx, - - if (tb[NFTA_DYNSET_SREG_DATA] != NULL) { - if (!(set->flags & NFT_SET_MAP)) -- return -EINVAL; -+ return -EOPNOTSUPP; - if (set->dtype == NFT_DATA_VERDICT) - return -EOPNOTSUPP; - -diff --git a/net/netfilter/xt_RATEEST.c b/net/netfilter/xt_RATEEST.c -index 37253d399c6b8..0d5c422f87452 100644 ---- a/net/netfilter/xt_RATEEST.c -+++ b/net/netfilter/xt_RATEEST.c -@@ -115,6 +115,9 @@ static int xt_rateest_tg_checkentry(const struct xt_tgchk_param *par) - } cfg; - int ret; - -+ if (strnlen(info->name, sizeof(est->name)) >= sizeof(est->name)) -+ return -ENAMETOOLONG; -+ - net_get_random_once(&jhash_rnd, sizeof(jhash_rnd)); - - mutex_lock(&xn->hash_lock); -diff --git a/net/sched/sch_choke.c b/net/sched/sch_choke.c -index bd618b00d3193..50f680f03a547 100644 ---- a/net/sched/sch_choke.c -+++ b/net/sched/sch_choke.c -@@ -362,7 +362,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt, - - ctl = nla_data(tb[TCA_CHOKE_PARMS]); - -- if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog)) -+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, ctl->Scell_log)) - return -EINVAL; - - if (ctl->limit > CHOKE_MAX_QUEUE) -diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c -index 8599c6f31b057..e0bc77533acc3 100644 ---- a/net/sched/sch_gred.c -+++ b/net/sched/sch_gred.c -@@ -480,7 +480,7 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp, - struct gred_sched *table = qdisc_priv(sch); - struct gred_sched_data *q = table->tab[dp]; - -- if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog)) { -+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, ctl->Scell_log)) { - NL_SET_ERR_MSG_MOD(extack, "invalid RED parameters"); - return -EINVAL; - } -diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c -index e89fab6ccb34f..b4ae34d7aa965 100644 ---- a/net/sched/sch_red.c -+++ b/net/sched/sch_red.c -@@ -250,7 +250,7 @@ static int __red_change(struct Qdisc *sch, struct nlattr **tb, - max_P = tb[TCA_RED_MAX_P] ? nla_get_u32(tb[TCA_RED_MAX_P]) : 0; - - ctl = nla_data(tb[TCA_RED_PARMS]); -- if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog)) -+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, ctl->Scell_log)) - return -EINVAL; - - err = red_get_flags(ctl->flags, TC_RED_HISTORIC_FLAGS, -diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c -index bca2be57d9fc1..b25e51440623b 100644 ---- a/net/sched/sch_sfq.c -+++ b/net/sched/sch_sfq.c -@@ -647,7 +647,7 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt) - } - - if (ctl_v1 && !red_check_params(ctl_v1->qth_min, ctl_v1->qth_max, -- ctl_v1->Wlog)) -+ ctl_v1->Wlog, ctl_v1->Scell_log)) - return -EINVAL; - if (ctl_v1 && ctl_v1->qth_min) { - p = kmalloc(sizeof(*p), GFP_KERNEL); -diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c -index c6653ee7f701b..c966c05a0be92 100644 ---- a/net/sched/sch_taprio.c -+++ b/net/sched/sch_taprio.c -@@ -1604,8 +1604,9 @@ static void taprio_reset(struct Qdisc *sch) - - hrtimer_cancel(&q->advance_timer); - if (q->qdiscs) { -- for (i = 0; i < dev->num_tx_queues && q->qdiscs[i]; i++) -- qdisc_reset(q->qdiscs[i]); -+ for (i = 0; i < dev->num_tx_queues; i++) -+ if (q->qdiscs[i]) -+ qdisc_reset(q->qdiscs[i]); - } - sch->qstats.backlog = 0; - sch->q.qlen = 0; -@@ -1625,7 +1626,7 @@ static void taprio_destroy(struct Qdisc *sch) - taprio_disable_offload(dev, q, NULL); - - if (q->qdiscs) { -- for (i = 0; i < dev->num_tx_queues && q->qdiscs[i]; i++) -+ for (i = 0; i < dev->num_tx_queues; i++) - qdisc_put(q->qdiscs[i]); - - kfree(q->qdiscs); -diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c -index 62504471fd207..189cfbbcccc04 100644 ---- a/net/xdp/xsk.c -+++ b/net/xdp/xsk.c -@@ -772,6 +772,10 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len) - } - } - -+ /* FQ and CQ are now owned by the buffer pool and cleaned up with it. */ -+ xs->fq_tmp = NULL; -+ xs->cq_tmp = NULL; -+ - xs->dev = dev; - xs->zc = xs->umem->zc; - xs->queue_id = qid; -diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c -index d5adeee9d5d91..46c2ae7d91d15 100644 ---- a/net/xdp/xsk_buff_pool.c -+++ b/net/xdp/xsk_buff_pool.c -@@ -75,8 +75,6 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs, - - pool->fq = xs->fq_tmp; - pool->cq = xs->cq_tmp; -- xs->fq_tmp = NULL; -- xs->cq_tmp = NULL; - - for (i = 0; i < pool->free_heads_cnt; i++) { - xskb = &pool->heads[i]; -diff --git a/scripts/depmod.sh b/scripts/depmod.sh -index e083bcae343f3..3643b4f896ede 100755 ---- a/scripts/depmod.sh -+++ b/scripts/depmod.sh -@@ -15,6 +15,8 @@ if ! test -r System.map ; then - exit 0 - fi - -+# legacy behavior: "depmod" in /sbin, no /sbin in PATH -+PATH="$PATH:/sbin" - if [ -z $(command -v $DEPMOD) ]; then - echo "Warning: 'make modules_install' requires $DEPMOD. Please install it." >&2 - echo "This is probably in the kmod package." >&2 -diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c -index 6852668f1bcb4..770ad25f1907c 100644 ---- a/sound/pci/hda/hda_intel.c -+++ b/sound/pci/hda/hda_intel.c -@@ -2220,8 +2220,6 @@ static const struct snd_pci_quirk power_save_denylist[] = { - SND_PCI_QUIRK(0x1849, 0x7662, "Asrock H81M-HDS", 0), - /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ - SND_PCI_QUIRK(0x1043, 0x8733, "Asus Prime X370-Pro", 0), -- /* https://bugzilla.redhat.com/show_bug.cgi?id=1581607 */ -- SND_PCI_QUIRK(0x1558, 0x3501, "Clevo W35xSS_370SS", 0), - /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ - SND_PCI_QUIRK(0x1558, 0x6504, "Clevo W65_67SB", 0), - /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ -diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c -index be5000dd15853..d49cc4409d59c 100644 ---- a/sound/pci/hda/patch_conexant.c -+++ b/sound/pci/hda/patch_conexant.c -@@ -1070,6 +1070,7 @@ static int patch_conexant_auto(struct hda_codec *codec) - static const struct hda_device_id snd_hda_id_conexant[] = { - HDA_CODEC_ENTRY(0x14f11f86, "CX8070", patch_conexant_auto), - HDA_CODEC_ENTRY(0x14f12008, "CX8200", patch_conexant_auto), -+ HDA_CODEC_ENTRY(0x14f120d0, "CX11970", patch_conexant_auto), - HDA_CODEC_ENTRY(0x14f15045, "CX20549 (Venice)", patch_conexant_auto), - HDA_CODEC_ENTRY(0x14f15047, "CX20551 (Waikiki)", patch_conexant_auto), - HDA_CODEC_ENTRY(0x14f15051, "CX20561 (Hermosa)", patch_conexant_auto), -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index 006af6541dada..3c1d2a3fb1a4f 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -6289,6 +6289,7 @@ enum { - ALC221_FIXUP_HP_FRONT_MIC, - ALC292_FIXUP_TPT460, - ALC298_FIXUP_SPK_VOLUME, -+ ALC298_FIXUP_LENOVO_SPK_VOLUME, - ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, - ALC269_FIXUP_ATIV_BOOK_8, - ALC221_FIXUP_HP_MIC_NO_PRESENCE, -@@ -7119,6 +7120,10 @@ static const struct hda_fixup alc269_fixups[] = { - .chained = true, - .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, - }, -+ [ALC298_FIXUP_LENOVO_SPK_VOLUME] = { -+ .type = HDA_FIXUP_FUNC, -+ .v.func = alc298_fixup_speaker_volume, -+ }, - [ALC295_FIXUP_DISABLE_DAC3] = { - .type = HDA_FIXUP_FUNC, - .v.func = alc295_fixup_disable_dac3, -@@ -7959,11 +7964,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { - SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), - SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), - SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED), -+ SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT), - SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED), - SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED), - SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED), -+ SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED), - SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), -@@ -8021,6 +8028,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { - SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC), - SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE), - SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), -+ SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), -+ SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), - SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE), - SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC), - SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET), -@@ -8126,6 +8135,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { - SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), - SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), - SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), -+ SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME), - SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), - SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI), -diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c -index 7ef8f3105cdb7..0ab40a8a68fb5 100644 ---- a/sound/pci/hda/patch_via.c -+++ b/sound/pci/hda/patch_via.c -@@ -1002,6 +1002,7 @@ static const struct hda_verb vt1802_init_verbs[] = { - enum { - VIA_FIXUP_INTMIC_BOOST, - VIA_FIXUP_ASUS_G75, -+ VIA_FIXUP_POWER_SAVE, - }; - - static void via_fixup_intmic_boost(struct hda_codec *codec, -@@ -1011,6 +1012,13 @@ static void via_fixup_intmic_boost(struct hda_codec *codec, - override_mic_boost(codec, 0x30, 0, 2, 40); - } - -+static void via_fixup_power_save(struct hda_codec *codec, -+ const struct hda_fixup *fix, int action) -+{ -+ if (action == HDA_FIXUP_ACT_PRE_PROBE) -+ codec->power_save_node = 0; -+} -+ - static const struct hda_fixup via_fixups[] = { - [VIA_FIXUP_INTMIC_BOOST] = { - .type = HDA_FIXUP_FUNC, -@@ -1025,11 +1033,16 @@ static const struct hda_fixup via_fixups[] = { - { } - } - }, -+ [VIA_FIXUP_POWER_SAVE] = { -+ .type = HDA_FIXUP_FUNC, -+ .v.func = via_fixup_power_save, -+ }, - }; - - static const struct snd_pci_quirk vt2002p_fixups[] = { - SND_PCI_QUIRK(0x1043, 0x1487, "Asus G75", VIA_FIXUP_ASUS_G75), - SND_PCI_QUIRK(0x1043, 0x8532, "Asus X202E", VIA_FIXUP_INTMIC_BOOST), -+ SND_PCI_QUIRK(0x1558, 0x3501, "Clevo W35xSS_370SS", VIA_FIXUP_POWER_SAVE), - {} - }; - -diff --git a/sound/usb/midi.c b/sound/usb/midi.c -index c8213652470c4..0c23fa6d8525d 100644 ---- a/sound/usb/midi.c -+++ b/sound/usb/midi.c -@@ -1889,6 +1889,8 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi *umidi, - ms_ep = find_usb_ms_endpoint_descriptor(hostep); - if (!ms_ep) - continue; -+ if (ms_ep->bNumEmbMIDIJack > 0x10) -+ continue; - if (usb_endpoint_dir_out(ep)) { - if (endpoints[epidx].out_ep) { - if (++epidx >= MIDI_MAX_ENDPOINTS) { -@@ -2141,6 +2143,8 @@ static int snd_usbmidi_detect_roland(struct snd_usb_midi *umidi, - cs_desc[1] == USB_DT_CS_INTERFACE && - cs_desc[2] == 0xf1 && - cs_desc[3] == 0x02) { -+ if (cs_desc[4] > 0x10 || cs_desc[5] > 0x10) -+ continue; - endpoint->in_cables = (1 << cs_desc[4]) - 1; - endpoint->out_cables = (1 << cs_desc[5]) - 1; - return snd_usbmidi_detect_endpoints(umidi, endpoint, 1); -diff --git a/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh b/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh -index 4d900bc1f76c6..5c7700212f753 100755 ---- a/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh -+++ b/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh -@@ -230,7 +230,7 @@ switch_create() - __mlnx_qos -i $swp4 --pfc=0,1,0,0,0,0,0,0 >/dev/null - # PG0 will get autoconfigured to Xoff, give PG1 arbitrarily 100K, which - # is (-2*MTU) about 80K of delay provision. -- __mlnx_qos -i $swp3 --buffer_size=0,$_100KB,0,0,0,0,0,0 >/dev/null -+ __mlnx_qos -i $swp4 --buffer_size=0,$_100KB,0,0,0,0,0,0 >/dev/null - - # bridges - # ------- -diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile -index 691893afc15d8..e63f316327080 100644 ---- a/tools/testing/selftests/vm/Makefile -+++ b/tools/testing/selftests/vm/Makefile -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0 - # Makefile for vm selftests - uname_M := $(shell uname -m 2>/dev/null || echo not) --MACHINE ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/') -+MACHINE ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/' -e 's/ppc64.*/ppc64/') - - # Without this, failed build products remain, with up-to-date timestamps, - # thus tricking Make (and you!) into believing that All Is Well, in subsequent -@@ -39,7 +39,7 @@ TEST_GEN_FILES += transhuge-stress - TEST_GEN_FILES += userfaultfd - TEST_GEN_FILES += khugepaged - --ifeq ($(ARCH),x86_64) -+ifeq ($(MACHINE),x86_64) - CAN_BUILD_I386 := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_32bit_program.c -m32) - CAN_BUILD_X86_64 := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_64bit_program.c) - CAN_BUILD_WITH_NOPIE := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_program.c -no-pie) -@@ -61,13 +61,13 @@ TEST_GEN_FILES += $(BINARIES_64) - endif - else - --ifneq (,$(findstring $(ARCH),powerpc)) -+ifneq (,$(findstring $(MACHINE),ppc64)) - TEST_GEN_FILES += protection_keys - endif - - endif - --ifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64)) -+ifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 riscv64 s390x sh64 sparc64 x86_64)) - TEST_GEN_FILES += va_128TBswitch - TEST_GEN_FILES += virtual_address_range - TEST_GEN_FILES += write_to_hugetlbfs -@@ -82,7 +82,7 @@ include ../lib.mk - - $(OUTPUT)/hmm-tests: LDLIBS += -lhugetlbfs -lpthread - --ifeq ($(ARCH),x86_64) -+ifeq ($(MACHINE),x86_64) - BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32)) - BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64)) - -diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c -index 2541a17ff1c45..3083fb53861df 100644 ---- a/virt/kvm/kvm_main.c -+++ b/virt/kvm/kvm_main.c -@@ -482,9 +482,8 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, - kvm->mmu_notifier_count++; - need_tlb_flush = kvm_unmap_hva_range(kvm, range->start, range->end, - range->flags); -- need_tlb_flush |= kvm->tlbs_dirty; - /* we've to flush the tlb before the pages can be freed */ -- if (need_tlb_flush) -+ if (need_tlb_flush || kvm->tlbs_dirty) - kvm_flush_remote_tlbs(kvm); - - spin_unlock(&kvm->mmu_lock);