commit:     fbbced41b640f7fefb595a3efe650ed76693308f
Author:     Arisu Tachibana <alicef <AT> gentoo <DOT> org>
AuthorDate: Sun Dec 14 05:47:35 2025 +0000
Commit:     Arisu Tachibana <alicef <AT> gentoo <DOT> org>
CommitDate: Sun Dec 14 05:47:35 2025 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=fbbced41

Linux patch 6.17.12

Signed-off-by: Arisu Tachibana <alicef <AT> gentoo.org>

 0000_README              |    4 +
 1011_linux-6.17.12.patch | 2050 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2054 insertions(+)

diff --git a/0000_README b/0000_README
index a335c725..a6c25877 100644
--- a/0000_README
+++ b/0000_README
@@ -87,6 +87,10 @@ Patch:  1010_linux-6.17.11.patch
 From:   https://www.kernel.org
 Desc:   Linux 6.17.11
 
+Patch:  1011_linux-6.17.12.patch
+From:   https://www.kernel.org
+Desc:   Linux 6.17.12
+
 Patch:  1510_fs-enable-link-security-restrictions-by-default.patch
 From:   
http://sources.debian.net/src/linux/3.16.7-ckt4-3/debian/patches/debian/fs-enable-link-security-restrictions-by-default.patch/
 Desc:   Enable link security restrictions by default.

diff --git a/1011_linux-6.17.12.patch b/1011_linux-6.17.12.patch
new file mode 100644
index 00000000..bd4db1bb
--- /dev/null
+++ b/1011_linux-6.17.12.patch
@@ -0,0 +1,2050 @@
+diff --git a/Documentation/devicetree/bindings/serial/renesas,rsci.yaml 
b/Documentation/devicetree/bindings/serial/renesas,rsci.yaml
+index f50d8e02f47643..6b1f827a335b37 100644
+--- a/Documentation/devicetree/bindings/serial/renesas,rsci.yaml
++++ b/Documentation/devicetree/bindings/serial/renesas,rsci.yaml
+@@ -54,8 +54,6 @@ properties:
+   power-domains:
+     maxItems: 1
+ 
+-  uart-has-rtscts: false
+-
+ required:
+   - compatible
+   - reg
+diff --git a/Documentation/process/2.Process.rst 
b/Documentation/process/2.Process.rst
+index ef3b116492df08..f4fc0da8999d90 100644
+--- a/Documentation/process/2.Process.rst
++++ b/Documentation/process/2.Process.rst
+@@ -104,8 +104,10 @@ kernels go out with a handful of known regressions 
though, hopefully, none
+ of them are serious.
+ 
+ Once a stable release is made, its ongoing maintenance is passed off to the
+-"stable team," currently Greg Kroah-Hartman. The stable team will release
+-occasional updates to the stable release using the 5.x.y numbering scheme.
++"stable team," currently consists of Greg Kroah-Hartman and Sasha Levin. The
++stable team will release occasional updates to the stable release using the
++5.x.y numbering scheme.
++
+ To be considered for an update release, a patch must (1) fix a significant
+ bug, and (2) already be merged into the mainline for the next development
+ kernel. Kernels will typically receive stable updates for a little more
+diff --git a/Makefile b/Makefile
+index d977c277e44ffc..49052b0058545b 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 17
+-SUBLEVEL = 11
++SUBLEVEL = 12
+ EXTRAVERSION =
+ NAME = Baby Opossum Posse
+ 
+diff --git a/arch/arm64/include/asm/alternative.h 
b/arch/arm64/include/asm/alternative.h
+index 00d97b8a757f42..51746005239bca 100644
+--- a/arch/arm64/include/asm/alternative.h
++++ b/arch/arm64/include/asm/alternative.h
+@@ -26,9 +26,12 @@ void __init apply_alternatives_all(void);
+ bool alternative_is_applied(u16 cpucap);
+ 
+ #ifdef CONFIG_MODULES
+-void apply_alternatives_module(void *start, size_t length);
++int apply_alternatives_module(void *start, size_t length);
+ #else
+-static inline void apply_alternatives_module(void *start, size_t length) { }
++static inline int apply_alternatives_module(void *start, size_t length)
++{
++      return 0;
++}
+ #endif
+ 
+ void alt_cb_patch_nops(struct alt_instr *alt, __le32 *origptr,
+diff --git a/arch/arm64/kernel/alternative.c b/arch/arm64/kernel/alternative.c
+index 8ff6610af49664..f5ec7e7c1d3fdb 100644
+--- a/arch/arm64/kernel/alternative.c
++++ b/arch/arm64/kernel/alternative.c
+@@ -139,9 +139,9 @@ static noinstr void clean_dcache_range_nopatch(u64 start, 
u64 end)
+       } while (cur += d_size, cur < end);
+ }
+ 
+-static void __apply_alternatives(const struct alt_region *region,
+-                               bool is_module,
+-                               unsigned long *cpucap_mask)
++static int __apply_alternatives(const struct alt_region *region,
++                              bool is_module,
++                              unsigned long *cpucap_mask)
+ {
+       struct alt_instr *alt;
+       __le32 *origptr, *updptr;
+@@ -166,10 +166,13 @@ static void __apply_alternatives(const struct alt_region 
*region,
+               updptr = is_module ? origptr : lm_alias(origptr);
+               nr_inst = alt->orig_len / AARCH64_INSN_SIZE;
+ 
+-              if (ALT_HAS_CB(alt))
++              if (ALT_HAS_CB(alt)) {
+                       alt_cb  = ALT_REPL_PTR(alt);
+-              else
++                      if (is_module && !core_kernel_text((unsigned 
long)alt_cb))
++                              return -ENOEXEC;
++              } else {
+                       alt_cb = patch_alternative;
++              }
+ 
+               alt_cb(alt, origptr, updptr, nr_inst);
+ 
+@@ -193,6 +196,8 @@ static void __apply_alternatives(const struct alt_region 
*region,
+               bitmap_and(applied_alternatives, applied_alternatives,
+                          system_cpucaps, ARM64_NCAPS);
+       }
++
++      return 0;
+ }
+ 
+ static void __init apply_alternatives_vdso(void)
+@@ -277,7 +282,7 @@ void __init apply_boot_alternatives(void)
+ }
+ 
+ #ifdef CONFIG_MODULES
+-void apply_alternatives_module(void *start, size_t length)
++int apply_alternatives_module(void *start, size_t length)
+ {
+       struct alt_region region = {
+               .begin  = start,
+@@ -287,7 +292,7 @@ void apply_alternatives_module(void *start, size_t length)
+ 
+       bitmap_fill(all_capabilities, ARM64_NCAPS);
+ 
+-      __apply_alternatives(&region, true, &all_capabilities[0]);
++      return __apply_alternatives(&region, true, &all_capabilities[0]);
+ }
+ #endif
+ 
+diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c
+index d6d443c4a01aca..0b15c57285add7 100644
+--- a/arch/arm64/kernel/module.c
++++ b/arch/arm64/kernel/module.c
+@@ -489,8 +489,13 @@ int module_finalize(const Elf_Ehdr *hdr,
+       int ret;
+ 
+       s = find_section(hdr, sechdrs, ".altinstructions");
+-      if (s)
+-              apply_alternatives_module((void *)s->sh_addr, s->sh_size);
++      if (s) {
++              ret = apply_alternatives_module((void *)s->sh_addr, s->sh_size);
++              if (ret < 0) {
++                      pr_err("module %s: error occurred when applying 
alternatives\n", me->name);
++                      return ret;
++              }
++      }
+ 
+       if (scs_is_dynamic()) {
+               s = find_section(hdr, sechdrs, ".init.eh_frame");
+diff --git a/arch/loongarch/kernel/machine_kexec.c 
b/arch/loongarch/kernel/machine_kexec.c
+index f9381800e291cc..8ef4e4595d61a3 100644
+--- a/arch/loongarch/kernel/machine_kexec.c
++++ b/arch/loongarch/kernel/machine_kexec.c
+@@ -249,6 +249,7 @@ void machine_crash_shutdown(struct pt_regs *regs)
+ #ifdef CONFIG_SMP
+       crash_smp_send_stop();
+ #endif
++      machine_kexec_mask_interrupts();
+       cpumask_set_cpu(crashing_cpu, &cpus_in_crash);
+ 
+       pr_info("Starting crashdump kernel...\n");
+@@ -286,6 +287,7 @@ void machine_kexec(struct kimage *image)
+ 
+       /* We do not want to be bothered. */
+       local_irq_disable();
++      machine_kexec_mask_interrupts();
+ 
+       pr_notice("EFI boot flag 0x%lx\n", efi_boot);
+       pr_notice("Command line at 0x%lx\n", cmdline_ptr);
+diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
+index 7e87e7d9ba5aeb..ae4c6c176922a0 100644
+--- a/arch/x86/include/asm/kvm_host.h
++++ b/arch/x86/include/asm/kvm_host.h
+@@ -2123,6 +2123,11 @@ u64 vcpu_tsc_khz(struct kvm_vcpu *vcpu);
+  *                         the gfn, i.e. retrying the instruction will hit a
+  *                         !PRESENT fault, which results in a new shadow page
+  *                         and sends KVM back to square one.
++ *
++ * EMULTYPE_SKIP_SOFT_INT - Set in combination with EMULTYPE_SKIP to only skip
++ *                          an instruction if it could generate a given 
software
++ *                          interrupt, which must be encoded via
++ *                          EMULTYPE_SET_SOFT_INT_VECTOR().
+  */
+ #define EMULTYPE_NO_DECODE        (1 << 0)
+ #define EMULTYPE_TRAP_UD          (1 << 1)
+@@ -2133,6 +2138,10 @@ u64 vcpu_tsc_khz(struct kvm_vcpu *vcpu);
+ #define EMULTYPE_PF               (1 << 6)
+ #define EMULTYPE_COMPLETE_USER_EXIT (1 << 7)
+ #define EMULTYPE_WRITE_PF_TO_SP           (1 << 8)
++#define EMULTYPE_SKIP_SOFT_INT            (1 << 9)
++
++#define EMULTYPE_SET_SOFT_INT_VECTOR(v)       ((u32)((v) & 0xff) << 16)
++#define EMULTYPE_GET_SOFT_INT_VECTOR(e)       (((e) >> 16) & 0xff)
+ 
+ static inline bool kvm_can_emulate_event_vectoring(int emul_type)
+ {
+diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
+index 30c143cc6bf418..ccf57f00054287 100644
+--- a/arch/x86/kvm/svm/svm.c
++++ b/arch/x86/kvm/svm/svm.c
+@@ -280,6 +280,7 @@ static void svm_set_interrupt_shadow(struct kvm_vcpu 
*vcpu, int mask)
+ }
+ 
+ static int __svm_skip_emulated_instruction(struct kvm_vcpu *vcpu,
++                                         int emul_type,
+                                          bool commit_side_effects)
+ {
+       struct vcpu_svm *svm = to_svm(vcpu);
+@@ -301,7 +302,7 @@ static int __svm_skip_emulated_instruction(struct kvm_vcpu 
*vcpu,
+               if (unlikely(!commit_side_effects))
+                       old_rflags = svm->vmcb->save.rflags;
+ 
+-              if (!kvm_emulate_instruction(vcpu, EMULTYPE_SKIP))
++              if (!kvm_emulate_instruction(vcpu, emul_type))
+                       return 0;
+ 
+               if (unlikely(!commit_side_effects))
+@@ -319,11 +320,13 @@ done:
+ 
+ static int svm_skip_emulated_instruction(struct kvm_vcpu *vcpu)
+ {
+-      return __svm_skip_emulated_instruction(vcpu, true);
++      return __svm_skip_emulated_instruction(vcpu, EMULTYPE_SKIP, true);
+ }
+ 
+-static int svm_update_soft_interrupt_rip(struct kvm_vcpu *vcpu)
++static int svm_update_soft_interrupt_rip(struct kvm_vcpu *vcpu, u8 vector)
+ {
++      const int emul_type = EMULTYPE_SKIP | EMULTYPE_SKIP_SOFT_INT |
++                            EMULTYPE_SET_SOFT_INT_VECTOR(vector);
+       unsigned long rip, old_rip = kvm_rip_read(vcpu);
+       struct vcpu_svm *svm = to_svm(vcpu);
+ 
+@@ -339,7 +342,7 @@ static int svm_update_soft_interrupt_rip(struct kvm_vcpu 
*vcpu)
+        * in use, the skip must not commit any side effects such as clearing
+        * the interrupt shadow or RFLAGS.RF.
+        */
+-      if (!__svm_skip_emulated_instruction(vcpu, !nrips))
++      if (!__svm_skip_emulated_instruction(vcpu, emul_type, !nrips))
+               return -EIO;
+ 
+       rip = kvm_rip_read(vcpu);
+@@ -375,7 +378,7 @@ static void svm_inject_exception(struct kvm_vcpu *vcpu)
+       kvm_deliver_exception_payload(vcpu, ex);
+ 
+       if (kvm_exception_is_soft(ex->vector) &&
+-          svm_update_soft_interrupt_rip(vcpu))
++          svm_update_soft_interrupt_rip(vcpu, ex->vector))
+               return;
+ 
+       svm->vmcb->control.event_inj = ex->vector
+@@ -3662,11 +3665,12 @@ static bool svm_set_vnmi_pending(struct kvm_vcpu *vcpu)
+ 
+ static void svm_inject_irq(struct kvm_vcpu *vcpu, bool reinjected)
+ {
++      struct kvm_queued_interrupt *intr = &vcpu->arch.interrupt;
+       struct vcpu_svm *svm = to_svm(vcpu);
+       u32 type;
+ 
+-      if (vcpu->arch.interrupt.soft) {
+-              if (svm_update_soft_interrupt_rip(vcpu))
++      if (intr->soft) {
++              if (svm_update_soft_interrupt_rip(vcpu, intr->nr))
+                       return;
+ 
+               type = SVM_EVTINJ_TYPE_SOFT;
+@@ -3674,12 +3678,10 @@ static void svm_inject_irq(struct kvm_vcpu *vcpu, bool 
reinjected)
+               type = SVM_EVTINJ_TYPE_INTR;
+       }
+ 
+-      trace_kvm_inj_virq(vcpu->arch.interrupt.nr,
+-                         vcpu->arch.interrupt.soft, reinjected);
++      trace_kvm_inj_virq(intr->nr, intr->soft, reinjected);
+       ++vcpu->stat.irq_injections;
+ 
+-      svm->vmcb->control.event_inj = vcpu->arch.interrupt.nr |
+-                                     SVM_EVTINJ_VALID | type;
++      svm->vmcb->control.event_inj = intr->nr | SVM_EVTINJ_VALID | type;
+ }
+ 
+ void svm_complete_interrupt_delivery(struct kvm_vcpu *vcpu, int delivery_mode,
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 0bfab634c5912c..c91fc5062ad834 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -9021,6 +9021,23 @@ static bool is_vmware_backdoor_opcode(struct 
x86_emulate_ctxt *ctxt)
+       return false;
+ }
+ 
++static bool is_soft_int_instruction(struct x86_emulate_ctxt *ctxt,
++                                  int emulation_type)
++{
++      u8 vector = EMULTYPE_GET_SOFT_INT_VECTOR(emulation_type);
++
++      switch (ctxt->b) {
++      case 0xcc:
++              return vector == BP_VECTOR;
++      case 0xcd:
++              return vector == ctxt->src.val;
++      case 0xce:
++              return vector == OF_VECTOR;
++      default:
++              return false;
++      }
++}
++
+ /*
+  * Decode an instruction for emulation.  The caller is responsible for 
handling
+  * code breakpoints.  Note, manually detecting code breakpoints is unnecessary
+@@ -9131,6 +9148,10 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, 
gpa_t cr2_or_gpa,
+        * injecting single-step #DBs.
+        */
+       if (emulation_type & EMULTYPE_SKIP) {
++              if (emulation_type & EMULTYPE_SKIP_SOFT_INT &&
++                  !is_soft_int_instruction(ctxt, emulation_type))
++                      return 0;
++
+               if (ctxt->mode != X86EMUL_MODE_PROT64)
+                       ctxt->eip = (u32)ctxt->_eip;
+               else
+diff --git a/crypto/zstd.c b/crypto/zstd.c
+index ac318d333b6847..32a339b74f34cf 100644
+--- a/crypto/zstd.c
++++ b/crypto/zstd.c
+@@ -75,11 +75,6 @@ static int zstd_init(struct crypto_acomp *acomp_tfm)
+       return ret;
+ }
+ 
+-static void zstd_exit(struct crypto_acomp *acomp_tfm)
+-{
+-      crypto_acomp_free_streams(&zstd_streams);
+-}
+-
+ static int zstd_compress_one(struct acomp_req *req, struct zstd_ctx *ctx,
+                            const void *src, void *dst, unsigned int *dlen)
+ {
+@@ -297,7 +292,6 @@ static struct acomp_alg zstd_acomp = {
+               .cra_module = THIS_MODULE,
+       },
+       .init = zstd_init,
+-      .exit = zstd_exit,
+       .compress = zstd_compress,
+       .decompress = zstd_decompress,
+ };
+@@ -310,6 +304,7 @@ static int __init zstd_mod_init(void)
+ static void __exit zstd_mod_fini(void)
+ {
+       crypto_unregister_acomp(&zstd_acomp);
++      crypto_acomp_free_streams(&zstd_streams);
+ }
+ 
+ module_init(zstd_mod_init);
+diff --git a/drivers/acpi/acpi_mrrm.c b/drivers/acpi/acpi_mrrm.c
+index a6dbf623e5571f..6d69554c940ed2 100644
+--- a/drivers/acpi/acpi_mrrm.c
++++ b/drivers/acpi/acpi_mrrm.c
+@@ -152,26 +152,49 @@ ATTRIBUTE_GROUPS(memory_range);
+ 
+ static __init int add_boot_memory_ranges(void)
+ {
+-      struct kobject *pkobj, *kobj;
++      struct kobject *pkobj, *kobj, **kobjs;
+       int ret = -EINVAL;
+-      char *name;
++      char name[16];
++      int i;
+ 
+       pkobj = kobject_create_and_add("memory_ranges", acpi_kobj);
++      if (!pkobj)
++              return -ENOMEM;
+ 
+-      for (int i = 0; i < mrrm_mem_entry_num; i++) {
+-              name = kasprintf(GFP_KERNEL, "range%d", i);
+-              if (!name) {
+-                      ret = -ENOMEM;
+-                      break;
+-              }
++      kobjs = kcalloc(mrrm_mem_entry_num, sizeof(*kobjs), GFP_KERNEL);
++      if (!kobjs) {
++              kobject_put(pkobj);
++              return -ENOMEM;
++      }
+ 
++      for (i = 0; i < mrrm_mem_entry_num; i++) {
++              scnprintf(name, sizeof(name), "range%d", i);
+               kobj = kobject_create_and_add(name, pkobj);
++              if (!kobj) {
++                      ret = -ENOMEM;
++                      goto cleanup;
++              }
+ 
+               ret = sysfs_create_groups(kobj, memory_range_groups);
+-              if (ret)
+-                      return ret;
++              if (ret) {
++                      kobject_put(kobj);
++                      goto cleanup;
++              }
++              kobjs[i] = kobj;
+       }
+ 
++      kfree(kobjs);
++      return 0;
++
++cleanup:
++      for (int j = 0; j < i; j++) {
++              if (kobjs[j]) {
++                      sysfs_remove_groups(kobjs[j], memory_range_groups);
++                      kobject_put(kobjs[j]);
++              }
++      }
++      kfree(kobjs);
++      kobject_put(pkobj);
+       return ret;
+ }
+ 
+diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c
+index 1d4a7887abccfb..52794db2739bfc 100644
+--- a/drivers/bluetooth/btrtl.c
++++ b/drivers/bluetooth/btrtl.c
+@@ -50,7 +50,7 @@
+ 
+ #define       RTL_CHIP_SUBVER (&(struct rtl_vendor_cmd) {{0x10, 0x38, 0x04, 
0x28, 0x80}})
+ #define       RTL_CHIP_REV    (&(struct rtl_vendor_cmd) {{0x10, 0x3A, 0x04, 
0x28, 0x80}})
+-#define       RTL_SEC_PROJ    (&(struct rtl_vendor_cmd) {{0x10, 0xA4, 0x0D, 
0x00, 0xb0}})
++#define       RTL_SEC_PROJ    (&(struct rtl_vendor_cmd) {{0x10, 0xA4, 0xAD, 
0x00, 0xb0}})
+ 
+ #define RTL_PATCH_SNIPPETS            0x01
+ #define RTL_PATCH_DUMMY_HEADER                0x02
+@@ -534,7 +534,6 @@ static int rtlbt_parse_firmware_v2(struct hci_dev *hdev,
+ {
+       struct rtl_epatch_header_v2 *hdr;
+       int rc;
+-      u8 reg_val[2];
+       u8 key_id;
+       u32 num_sections;
+       struct rtl_section *section;
+@@ -549,14 +548,7 @@ static int rtlbt_parse_firmware_v2(struct hci_dev *hdev,
+               .len  = btrtl_dev->fw_len - 7, /* Cut the tail */
+       };
+ 
+-      rc = btrtl_vendor_read_reg16(hdev, RTL_SEC_PROJ, reg_val);
+-      if (rc < 0)
+-              return -EIO;
+-      key_id = reg_val[0];
+-
+-      rtl_dev_dbg(hdev, "%s: key id %u", __func__, key_id);
+-
+-      btrtl_dev->key_id = key_id;
++      key_id = btrtl_dev->key_id;
+ 
+       hdr = rtl_iov_pull_data(&iov, sizeof(*hdr));
+       if (!hdr)
+@@ -1070,6 +1062,8 @@ struct btrtl_device_info *btrtl_initialize(struct 
hci_dev *hdev,
+       u16 hci_rev, lmp_subver;
+       u8 hci_ver, lmp_ver, chip_type = 0;
+       int ret;
++      int rc;
++      u8 key_id;
+       u8 reg_val[2];
+ 
+       btrtl_dev = kzalloc(sizeof(*btrtl_dev), GFP_KERNEL);
+@@ -1180,6 +1174,14 @@ next:
+               goto err_free;
+       }
+ 
++      rc = btrtl_vendor_read_reg16(hdev, RTL_SEC_PROJ, reg_val);
++      if (rc < 0)
++              goto err_free;
++
++      key_id = reg_val[0];
++      btrtl_dev->key_id = key_id;
++      rtl_dev_info(hdev, "%s: key id %u", __func__, key_id);
++
+       btrtl_dev->fw_len = -EIO;
+       if (lmp_subver == RTL_ROM_LMP_8852A && hci_rev == 0x000c) {
+               snprintf(fw_name, sizeof(fw_name), "%s_v2.bin",
+@@ -1202,7 +1204,7 @@ next:
+               goto err_free;
+       }
+ 
+-      if (btrtl_dev->ic_info->cfg_name) {
++      if (btrtl_dev->ic_info->cfg_name && !btrtl_dev->key_id) {
+               if (postfix) {
+                       snprintf(cfg_name, sizeof(cfg_name), "%s-%s.bin",
+                                btrtl_dev->ic_info->cfg_name, postfix);
+diff --git a/drivers/comedi/comedi_fops.c b/drivers/comedi/comedi_fops.c
+index 7e2f2b1a1c362e..b2e62e04afd994 100644
+--- a/drivers/comedi/comedi_fops.c
++++ b/drivers/comedi/comedi_fops.c
+@@ -3023,7 +3023,12 @@ static int compat_chaninfo(struct file *file, unsigned 
long arg)
+       chaninfo.rangelist = compat_ptr(chaninfo32.rangelist);
+ 
+       mutex_lock(&dev->mutex);
+-      err = do_chaninfo_ioctl(dev, &chaninfo);
++      if (!dev->attached) {
++              dev_dbg(dev->class_dev, "no driver attached\n");
++              err = -ENODEV;
++      } else {
++              err = do_chaninfo_ioctl(dev, &chaninfo);
++      }
+       mutex_unlock(&dev->mutex);
+       return err;
+ }
+@@ -3044,7 +3049,12 @@ static int compat_rangeinfo(struct file *file, unsigned 
long arg)
+       rangeinfo.range_ptr = compat_ptr(rangeinfo32.range_ptr);
+ 
+       mutex_lock(&dev->mutex);
+-      err = do_rangeinfo_ioctl(dev, &rangeinfo);
++      if (!dev->attached) {
++              dev_dbg(dev->class_dev, "no driver attached\n");
++              err = -ENODEV;
++      } else {
++              err = do_rangeinfo_ioctl(dev, &rangeinfo);
++      }
+       mutex_unlock(&dev->mutex);
+       return err;
+ }
+@@ -3120,7 +3130,12 @@ static int compat_cmd(struct file *file, unsigned long 
arg)
+               return rc;
+ 
+       mutex_lock(&dev->mutex);
+-      rc = do_cmd_ioctl(dev, &cmd, &copy, file);
++      if (!dev->attached) {
++              dev_dbg(dev->class_dev, "no driver attached\n");
++              rc = -ENODEV;
++      } else {
++              rc = do_cmd_ioctl(dev, &cmd, &copy, file);
++      }
+       mutex_unlock(&dev->mutex);
+       if (copy) {
+               /* Special case: copy cmd back to user. */
+@@ -3145,7 +3160,12 @@ static int compat_cmdtest(struct file *file, unsigned 
long arg)
+               return rc;
+ 
+       mutex_lock(&dev->mutex);
+-      rc = do_cmdtest_ioctl(dev, &cmd, &copy, file);
++      if (!dev->attached) {
++              dev_dbg(dev->class_dev, "no driver attached\n");
++              rc = -ENODEV;
++      } else {
++              rc = do_cmdtest_ioctl(dev, &cmd, &copy, file);
++      }
+       mutex_unlock(&dev->mutex);
+       if (copy) {
+               err = put_compat_cmd(compat_ptr(arg), &cmd);
+@@ -3205,7 +3225,12 @@ static int compat_insnlist(struct file *file, unsigned 
long arg)
+       }
+ 
+       mutex_lock(&dev->mutex);
+-      rc = do_insnlist_ioctl(dev, insns, insnlist32.n_insns, file);
++      if (!dev->attached) {
++              dev_dbg(dev->class_dev, "no driver attached\n");
++              rc = -ENODEV;
++      } else {
++              rc = do_insnlist_ioctl(dev, insns, insnlist32.n_insns, file);
++      }
+       mutex_unlock(&dev->mutex);
+       kfree(insns);
+       return rc;
+@@ -3224,7 +3249,12 @@ static int compat_insn(struct file *file, unsigned long 
arg)
+               return rc;
+ 
+       mutex_lock(&dev->mutex);
+-      rc = do_insn_ioctl(dev, &insn, file);
++      if (!dev->attached) {
++              dev_dbg(dev->class_dev, "no driver attached\n");
++              rc = -ENODEV;
++      } else {
++              rc = do_insn_ioctl(dev, &insn, file);
++      }
+       mutex_unlock(&dev->mutex);
+       return rc;
+ }
+diff --git a/drivers/comedi/drivers/c6xdigio.c 
b/drivers/comedi/drivers/c6xdigio.c
+index 14b90d1c64dc1c..8a38d97d463b2e 100644
+--- a/drivers/comedi/drivers/c6xdigio.c
++++ b/drivers/comedi/drivers/c6xdigio.c
+@@ -249,9 +249,6 @@ static int c6xdigio_attach(struct comedi_device *dev,
+       if (ret)
+               return ret;
+ 
+-      /*  Make sure that PnP ports get activated */
+-      pnp_register_driver(&c6xdigio_pnp_driver);
+-
+       s = &dev->subdevices[0];
+       /* pwm output subdevice */
+       s->type         = COMEDI_SUBD_PWM;
+@@ -278,19 +275,46 @@ static int c6xdigio_attach(struct comedi_device *dev,
+       return 0;
+ }
+ 
+-static void c6xdigio_detach(struct comedi_device *dev)
+-{
+-      comedi_legacy_detach(dev);
+-      pnp_unregister_driver(&c6xdigio_pnp_driver);
+-}
+-
+ static struct comedi_driver c6xdigio_driver = {
+       .driver_name    = "c6xdigio",
+       .module         = THIS_MODULE,
+       .attach         = c6xdigio_attach,
+-      .detach         = c6xdigio_detach,
++      .detach         = comedi_legacy_detach,
+ };
+-module_comedi_driver(c6xdigio_driver);
++
++static bool c6xdigio_pnp_registered = false;
++
++static int __init c6xdigio_module_init(void)
++{
++      int ret;
++
++      ret = comedi_driver_register(&c6xdigio_driver);
++      if (ret)
++              return ret;
++
++      if (IS_ENABLED(CONFIG_PNP)) {
++              /*  Try to activate the PnP ports */
++              ret = pnp_register_driver(&c6xdigio_pnp_driver);
++              if (ret) {
++                      pr_warn("failed to register pnp driver - err %d\n",
++                              ret);
++                      ret = 0;        /* ignore the error. */
++              } else {
++                      c6xdigio_pnp_registered = true;
++              }
++      }
++
++      return 0;
++}
++module_init(c6xdigio_module_init);
++
++static void __exit c6xdigio_module_exit(void)
++{
++      if (c6xdigio_pnp_registered)
++              pnp_unregister_driver(&c6xdigio_pnp_driver);
++      comedi_driver_unregister(&c6xdigio_driver);
++}
++module_exit(c6xdigio_module_exit);
+ 
+ MODULE_AUTHOR("Comedi https://www.comedi.org";);
+ MODULE_DESCRIPTION("Comedi driver for the C6x_DIGIO DSP daughter card");
+diff --git a/drivers/comedi/drivers/multiq3.c 
b/drivers/comedi/drivers/multiq3.c
+index 07ff5383da9976..ac369e9a262d72 100644
+--- a/drivers/comedi/drivers/multiq3.c
++++ b/drivers/comedi/drivers/multiq3.c
+@@ -67,6 +67,11 @@
+ #define MULTIQ3_TRSFRCNTR_OL          0x10    /* xfer CNTR to OL (x and y) */
+ #define MULTIQ3_EFLAG_RESET           0x06    /* reset E bit of flag reg */
+ 
++/*
++ * Limit on the number of optional encoder channels
++ */
++#define MULTIQ3_MAX_ENC_CHANS         8
++
+ static void multiq3_set_ctrl(struct comedi_device *dev, unsigned int bits)
+ {
+       /*
+@@ -312,6 +317,10 @@ static int multiq3_attach(struct comedi_device *dev,
+       s->insn_read    = multiq3_encoder_insn_read;
+       s->insn_config  = multiq3_encoder_insn_config;
+ 
++      /* sanity check for number of encoder channels */
++      if (s->n_chan > MULTIQ3_MAX_ENC_CHANS)
++              s->n_chan = MULTIQ3_MAX_ENC_CHANS;
++
+       for (i = 0; i < s->n_chan; i++)
+               multiq3_encoder_reset(dev, i);
+ 
+diff --git a/drivers/comedi/drivers/pcl818.c b/drivers/comedi/drivers/pcl818.c
+index 4127adcfb22955..06fe06396f23ab 100644
+--- a/drivers/comedi/drivers/pcl818.c
++++ b/drivers/comedi/drivers/pcl818.c
+@@ -1111,10 +1111,9 @@ static void pcl818_detach(struct comedi_device *dev)
+ {
+       struct pcl818_private *devpriv = dev->private;
+ 
+-      if (devpriv) {
+-              pcl818_ai_cancel(dev, dev->read_subdev);
++      if (devpriv)
+               pcl818_reset(dev);
+-      }
++
+       pcl818_free_dma(dev);
+       comedi_legacy_detach(dev);
+ }
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+index 827507cfed7aab..fab6e7721c8037 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+@@ -3688,6 +3688,8 @@ svm_range_set_attr(struct kfd_process *p, struct 
mm_struct *mm,
+               svm_range_apply_attrs(p, prange, nattr, attrs, &update_mapping);
+               /* TODO: unmap ranges from GPU that lost access */
+       }
++      update_mapping |= !p->xnack_enabled && !list_empty(&remap_list);
++
+       list_for_each_entry_safe(prange, next, &remove_list, update_list) {
+               pr_debug("unlink old 0x%p prange 0x%p [0x%lx 0x%lx]\n",
+                        prange->svms, prange, prange->start,
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c
+index 7de20e56082c87..fd4e76486f2d1b 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c
+@@ -32,22 +32,22 @@ enum vmw_bo_dirty_method {
+ 
+ /**
+  * struct vmw_bo_dirty - Dirty information for buffer objects
++ * @ref_count: Reference count for this structure. Must be first member!
+  * @start: First currently dirty bit
+  * @end: Last currently dirty bit + 1
+  * @method: The currently used dirty method
+  * @change_count: Number of consecutive method change triggers
+- * @ref_count: Reference count for this structure
+  * @bitmap_size: The size of the bitmap in bits. Typically equal to the
+  * nuber of pages in the bo.
+  * @bitmap: A bitmap where each bit represents a page. A set bit means a
+  * dirty page.
+  */
+ struct vmw_bo_dirty {
++      struct   kref ref_count;
+       unsigned long start;
+       unsigned long end;
+       enum vmw_bo_dirty_method method;
+       unsigned int change_count;
+-      unsigned int ref_count;
+       unsigned long bitmap_size;
+       unsigned long bitmap[];
+ };
+@@ -221,7 +221,7 @@ int vmw_bo_dirty_add(struct vmw_bo *vbo)
+       int ret;
+ 
+       if (dirty) {
+-              dirty->ref_count++;
++              kref_get(&dirty->ref_count);
+               return 0;
+       }
+ 
+@@ -235,7 +235,7 @@ int vmw_bo_dirty_add(struct vmw_bo *vbo)
+       dirty->bitmap_size = num_pages;
+       dirty->start = dirty->bitmap_size;
+       dirty->end = 0;
+-      dirty->ref_count = 1;
++      kref_init(&dirty->ref_count);
+       if (num_pages < PAGE_SIZE / sizeof(pte_t)) {
+               dirty->method = VMW_BO_DIRTY_PAGETABLE;
+       } else {
+@@ -274,10 +274,8 @@ void vmw_bo_dirty_release(struct vmw_bo *vbo)
+ {
+       struct vmw_bo_dirty *dirty = vbo->dirty;
+ 
+-      if (dirty && --dirty->ref_count == 0) {
+-              kvfree(dirty);
++      if (dirty && kref_put(&dirty->ref_count, (void *)kvfree))
+               vbo->dirty = NULL;
+-      }
+ }
+ 
+ /**
+diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
+index 61404d7a43ee1e..57da4f86a9fa7f 100644
+--- a/drivers/hid/hid-apple.c
++++ b/drivers/hid/hid-apple.c
+@@ -355,6 +355,7 @@ static const struct apple_key_translation 
swapped_fn_leftctrl_keys[] = {
+ 
+ static const struct apple_non_apple_keyboard non_apple_keyboards[] = {
+       { "SONiX USB DEVICE" },
++      { "SONiX AK870 PRO" },
+       { "Keychron" },
+       { "AONE" },
+       { "GANSS" },
+diff --git a/drivers/hid/hid-elecom.c b/drivers/hid/hid-elecom.c
+index 69771fd3500605..981d1b6e96589c 100644
+--- a/drivers/hid/hid-elecom.c
++++ b/drivers/hid/hid-elecom.c
+@@ -75,7 +75,8 @@ static const __u8 *elecom_report_fixup(struct hid_device 
*hdev, __u8 *rdesc,
+                */
+               mouse_button_fixup(hdev, rdesc, *rsize, 20, 28, 22, 14, 8);
+               break;
+-      case USB_DEVICE_ID_ELECOM_M_XT3URBK:
++      case USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB:
++      case USB_DEVICE_ID_ELECOM_M_XT3URBK_018F:
+       case USB_DEVICE_ID_ELECOM_M_XT3DRBK:
+       case USB_DEVICE_ID_ELECOM_M_XT4DRBK:
+               /*
+@@ -119,7 +120,8 @@ static const __u8 *elecom_report_fixup(struct hid_device 
*hdev, __u8 *rdesc,
+ static const struct hid_device_id elecom_devices[] = {
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, 
USB_DEVICE_ID_ELECOM_BM084) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, 
USB_DEVICE_ID_ELECOM_M_XGL20DLBK) },
+-      { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK) 
},
++      { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, 
USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, 
USB_DEVICE_ID_ELECOM_M_XT3URBK_018F) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK) 
},
+       { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT4DRBK) 
},
+       { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) 
},
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 52ae7c29f9e085..c4589075a5ed68 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -449,7 +449,8 @@
+ #define USB_VENDOR_ID_ELECOM          0x056e
+ #define USB_DEVICE_ID_ELECOM_BM084    0x0061
+ #define USB_DEVICE_ID_ELECOM_M_XGL20DLBK      0x00e6
+-#define USB_DEVICE_ID_ELECOM_M_XT3URBK        0x00fb
++#define USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB   0x00fb
++#define USB_DEVICE_ID_ELECOM_M_XT3URBK_018F   0x018f
+ #define USB_DEVICE_ID_ELECOM_M_XT3DRBK        0x00fc
+ #define USB_DEVICE_ID_ELECOM_M_XT4DRBK        0x00fd
+ #define USB_DEVICE_ID_ELECOM_M_DT1URBK        0x00fe
+@@ -718,6 +719,7 @@
+ #define USB_DEVICE_ID_ITE_LENOVO_YOGA2  0x8350
+ #define I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720  0x837a
+ #define USB_DEVICE_ID_ITE_LENOVO_YOGA900      0x8396
++#define I2C_DEVICE_ID_ITE_LENOVO_YOGA_SLIM_7X_KEYBOARD        0x8987
+ #define USB_DEVICE_ID_ITE8595         0x8595
+ #define USB_DEVICE_ID_ITE_MEDION_E1239T       0xce50
+ 
+diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
+index 2c743e35c1d333..bc7de9ef45ecd2 100644
+--- a/drivers/hid/hid-input.c
++++ b/drivers/hid/hid-input.c
+@@ -386,10 +386,11 @@ static const struct hid_device_id hid_battery_quirks[] = 
{
+       { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, 
I2C_DEVICE_ID_CHROMEBOOK_TROGDOR_POMPOM),
+         HID_BATTERY_QUIRK_AVOID_QUERY },
+       /*
+-       * Elan I2C-HID touchscreens seem to all report a non present battery,
+-       * set HID_BATTERY_QUIRK_IGNORE for all Elan I2C-HID devices.
++       * Elan HID touchscreens seem to all report a non present battery,
++       * set HID_BATTERY_QUIRK_IGNORE for all Elan I2C and USB HID devices.
+        */
+       { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), 
HID_BATTERY_QUIRK_IGNORE },
++      { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), 
HID_BATTERY_QUIRK_IGNORE },
+       {}
+ };
+ 
+diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
+index 654879814f97aa..9cc3e029e9f613 100644
+--- a/drivers/hid/hid-lenovo.c
++++ b/drivers/hid/hid-lenovo.c
+@@ -148,6 +148,14 @@ static const __u8 
lenovo_tpIIbtkbd_need_fixup_collection[] = {
+       0x81, 0x01,             /*   Input (Const,Array,Abs,No 
Wrap,Linear,Preferred State,No Null Position) */
+ };
+ 
++static const __u8 lenovo_yoga7x_kbd_need_fixup_collection[] = {
++      0x15, 0x00,     // Logical Minimum (0)
++      0x25, 0x65,     // Logical Maximum (101)
++      0x05, 0x07,     // Usage Page (Keyboard)
++      0x19, 0x00,     // Usage Minimum (0)
++      0x29, 0xDD,     // Usage Maximum (221)
++};
++
+ static const __u8 *lenovo_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+               unsigned int *rsize)
+ {
+@@ -177,6 +185,13 @@ static const __u8 *lenovo_report_fixup(struct hid_device 
*hdev, __u8 *rdesc,
+                       rdesc[260] = 0x01; /* report count (2) = 0x01 */
+               }
+               break;
++      case I2C_DEVICE_ID_ITE_LENOVO_YOGA_SLIM_7X_KEYBOARD:
++              if (*rsize == 176 &&
++                  memcmp(&rdesc[52], lenovo_yoga7x_kbd_need_fixup_collection,
++                        sizeof(lenovo_yoga7x_kbd_need_fixup_collection)) == 
0) {
++                      rdesc[55] = rdesc[61]; // logical maximum = usage 
maximum
++              }
++              break;
+       }
+       return rdesc;
+ }
+@@ -1538,6 +1553,8 @@ static const struct hid_device_id lenovo_devices[] = {
+                    USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X12_TAB) },
+       { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
+                    USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X12_TAB2) },
++      { HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC,
++                   USB_VENDOR_ID_ITE, 
I2C_DEVICE_ID_ITE_LENOVO_YOGA_SLIM_7X_KEYBOARD) },
+       { }
+ };
+ 
+diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
+index 22760ac50f2d9d..c89a015686c07e 100644
+--- a/drivers/hid/hid-quirks.c
++++ b/drivers/hid/hid-quirks.c
+@@ -410,7 +410,8 @@ static const struct hid_device_id 
hid_have_special_driver[] = {
+ #if IS_ENABLED(CONFIG_HID_ELECOM)
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, 
USB_DEVICE_ID_ELECOM_BM084) },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, 
USB_DEVICE_ID_ELECOM_M_XGL20DLBK) },
+-      { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK) 
},
++      { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, 
USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, 
USB_DEVICE_ID_ELECOM_M_XT3URBK_018F) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK) 
},
+       { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT4DRBK) 
},
+       { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) 
},
+diff --git a/drivers/iio/adc/ad4080.c b/drivers/iio/adc/ad4080.c
+index 6e61787ed3213f..e15310fcd21a36 100644
+--- a/drivers/iio/adc/ad4080.c
++++ b/drivers/iio/adc/ad4080.c
+@@ -125,7 +125,7 @@
+ 
+ /* Miscellaneous Definitions */
+ #define AD4080_SPI_READ                                               BIT(7)
+-#define AD4080_CHIP_ID                                                
GENMASK(2, 0)
++#define AD4080_CHIP_ID                                                0x0050
+ 
+ #define AD4080_LVDS_CNV_CLK_CNT_MAX                           7
+ 
+@@ -445,7 +445,8 @@ static int ad4080_setup(struct iio_dev *indio_dev)
+ {
+       struct ad4080_state *st = iio_priv(indio_dev);
+       struct device *dev = regmap_get_device(st->regmap);
+-      unsigned int id;
++      __le16 id_le;
++      u16 id;
+       int ret;
+ 
+       ret = regmap_write(st->regmap, AD4080_REG_INTERFACE_CONFIG_A,
+@@ -458,10 +459,12 @@ static int ad4080_setup(struct iio_dev *indio_dev)
+       if (ret)
+               return ret;
+ 
+-      ret = regmap_read(st->regmap, AD4080_REG_CHIP_TYPE, &id);
++      ret = regmap_bulk_read(st->regmap, AD4080_REG_PRODUCT_ID_L, &id_le,
++                             sizeof(id_le));
+       if (ret)
+               return ret;
+ 
++      id = le16_to_cpu(id_le);
+       if (id != AD4080_CHIP_ID)
+               dev_info(dev, "Unrecognized CHIP_ID 0x%X\n", id);
+ 
+diff --git a/drivers/net/wireless/realtek/rtl8xxxu/core.c 
b/drivers/net/wireless/realtek/rtl8xxxu/core.c
+index 018f5afcd50d26..5648f32003613d 100644
+--- a/drivers/net/wireless/realtek/rtl8xxxu/core.c
++++ b/drivers/net/wireless/realtek/rtl8xxxu/core.c
+@@ -8113,6 +8113,9 @@ static const struct usb_device_id dev_table[] = {
+ /* TP-Link TL-WN823N V2 */
+ {USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0135, 0xff, 0xff, 0xff),
+       .driver_info = (unsigned long)&rtl8192fu_fops},
++/* D-Link AN3U rev. A1 */
++{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3328, 0xff, 0xff, 0xff),
++      .driver_info = (unsigned long)&rtl8192fu_fops},
+ #ifdef CONFIG_RTL8XXXU_UNTESTED
+ /* Still supported by rtlwifi */
+ {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8176, 0xff, 0xff, 
0xff),
+diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822cu.c 
b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c
+index 324fd5c8bfd440..755f76840b1210 100644
+--- a/drivers/net/wireless/realtek/rtw88/rtw8822cu.c
++++ b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c
+@@ -21,6 +21,8 @@ static const struct usb_device_id rtw_8822cu_id_table[] = {
+         .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) },
+       { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff),
+         .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, /* Alpha - 
Alpha */
++      { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3329, 0xff, 0xff, 0xff),
++        .driver_info = (kernel_ulong_t)&(rtw8822c_hw_spec) }, /* D-Link AC13U 
rev. A1 */
+       {},
+ };
+ MODULE_DEVICE_TABLE(usb, rtw_8822cu_id_table);
+diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
+index 5714d499328222..28c598008124c9 100644
+--- a/drivers/nvme/host/core.c
++++ b/drivers/nvme/host/core.c
+@@ -4896,7 +4896,6 @@ void nvme_remove_admin_tag_set(struct nvme_ctrl *ctrl)
+        */
+       nvme_stop_keep_alive(ctrl);
+       blk_mq_destroy_queue(ctrl->admin_q);
+-      blk_put_queue(ctrl->admin_q);
+       if (ctrl->ops->flags & NVME_F_FABRICS) {
+               blk_mq_destroy_queue(ctrl->fabrics_q);
+               blk_put_queue(ctrl->fabrics_q);
+@@ -5040,6 +5039,8 @@ static void nvme_free_ctrl(struct device *dev)
+               container_of(dev, struct nvme_ctrl, ctrl_device);
+       struct nvme_subsystem *subsys = ctrl->subsys;
+ 
++      if (ctrl->admin_q)
++              blk_put_queue(ctrl->admin_q);
+       if (!subsys || ctrl->instance != subsys->instance)
+               ida_free(&nvme_instance_ida, ctrl->instance);
+       nvme_free_cels(ctrl);
+diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c 
b/drivers/pinctrl/qcom/pinctrl-msm.c
+index 83eb075b6bfa17..3d6601dc6fcc56 100644
+--- a/drivers/pinctrl/qcom/pinctrl-msm.c
++++ b/drivers/pinctrl/qcom/pinctrl-msm.c
+@@ -215,7 +215,7 @@ static int msm_pinmux_set_mux(struct pinctrl_dev *pctldev,
+        */
+       if (d && i != gpio_func &&
+           !test_and_set_bit(d->hwirq, pctrl->disabled_for_mux))
+-              disable_irq(irq);
++              disable_irq_nosync(irq);
+ 
+       raw_spin_lock_irqsave(&pctrl->lock, flags);
+ 
+diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
+index 13eb22b35aa8f8..d848afc91f87dd 100644
+--- a/drivers/platform/x86/acer-wmi.c
++++ b/drivers/platform/x86/acer-wmi.c
+@@ -102,6 +102,7 @@ MODULE_ALIAS("wmi:676AA15E-6A47-4D9F-A2CC-1E6D18D14026");
+ 
+ enum acer_wmi_event_ids {
+       WMID_HOTKEY_EVENT = 0x1,
++      WMID_BACKLIGHT_EVENT = 0x4,
+       WMID_ACCEL_OR_KBD_DOCK_EVENT = 0x5,
+       WMID_GAMING_TURBO_KEY_EVENT = 0x7,
+       WMID_AC_EVENT = 0x8,
+@@ -2369,6 +2370,9 @@ static void acer_wmi_notify(union acpi_object *obj, void 
*context)
+                       sparse_keymap_report_event(acer_wmi_input_dev, 
scancode, 1, true);
+               }
+               break;
++      case WMID_BACKLIGHT_EVENT:
++              /* Already handled by acpi-video */
++              break;
+       case WMID_ACCEL_OR_KBD_DOCK_EVENT:
+               acer_gsensor_event();
+               acer_kbd_dock_event(&return_value);
+diff --git a/drivers/platform/x86/amd/pmc/pmc-quirks.c 
b/drivers/platform/x86/amd/pmc/pmc-quirks.c
+index d63aaad7ef5998..404e62ad293a98 100644
+--- a/drivers/platform/x86/amd/pmc/pmc-quirks.c
++++ b/drivers/platform/x86/amd/pmc/pmc-quirks.c
+@@ -122,6 +122,14 @@ static const struct dmi_system_id fwbug_list[] = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "21A1"),
+               }
+       },
++      {
++              .ident = "ROG Xbox Ally RC73YA",
++              .driver_data = &quirk_spurious_8042,
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_BOARD_NAME, "RC73YA"),
++              }
++      },
+       /* https://bugzilla.kernel.org/show_bug.cgi?id=218024 */
+       {
+               .ident = "V14 G4 AMN",
+@@ -204,6 +212,23 @@ static const struct dmi_system_id fwbug_list[] = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "82ND"),
+               }
+       },
++      /* https://gitlab.freedesktop.org/drm/amd/-/issues/4618 */
++      {
++              .ident = "Lenovo Legion Go 2",
++              .driver_data = &quirk_s2idle_bug,
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "83N0"),
++              }
++      },
++      {
++              .ident = "Lenovo Legion Go 2",
++              .driver_data = &quirk_s2idle_bug,
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "83N1"),
++              }
++      },
+       /* https://gitlab.freedesktop.org/drm/amd/-/issues/2684 */
+       {
+               .ident = "HP Laptop 15s-eq2xxx",
+diff --git a/drivers/platform/x86/amd/pmc/pmc.c 
b/drivers/platform/x86/amd/pmc/pmc.c
+index bd318fd02ccf4a..cae3fcafd4d7bb 100644
+--- a/drivers/platform/x86/amd/pmc/pmc.c
++++ b/drivers/platform/x86/amd/pmc/pmc.c
+@@ -106,6 +106,7 @@ static void amd_pmc_get_ip_info(struct amd_pmc_dev *dev)
+       switch (dev->cpu_id) {
+       case AMD_CPU_ID_PCO:
+       case AMD_CPU_ID_RN:
++      case AMD_CPU_ID_VG:
+       case AMD_CPU_ID_YC:
+       case AMD_CPU_ID_CB:
+               dev->num_ips = 12;
+@@ -517,6 +518,7 @@ static int amd_pmc_get_os_hint(struct amd_pmc_dev *dev)
+       case AMD_CPU_ID_PCO:
+               return MSG_OS_HINT_PCO;
+       case AMD_CPU_ID_RN:
++      case AMD_CPU_ID_VG:
+       case AMD_CPU_ID_YC:
+       case AMD_CPU_ID_CB:
+       case AMD_CPU_ID_PS:
+@@ -717,6 +719,7 @@ static const struct pci_device_id pmc_pci_ids[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_RV) },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_SP) },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_SHP) },
++      { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_VG) },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_ROOT) },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M60H_ROOT) },
+       { }
+diff --git a/drivers/platform/x86/amd/pmc/pmc.h 
b/drivers/platform/x86/amd/pmc/pmc.h
+index 62f3e51020fdf1..fe3f53eb59558e 100644
+--- a/drivers/platform/x86/amd/pmc/pmc.h
++++ b/drivers/platform/x86/amd/pmc/pmc.h
+@@ -156,6 +156,7 @@ void amd_mp2_stb_deinit(struct amd_pmc_dev *dev);
+ #define AMD_CPU_ID_RN                 0x1630
+ #define AMD_CPU_ID_PCO                        AMD_CPU_ID_RV
+ #define AMD_CPU_ID_CZN                        AMD_CPU_ID_RN
++#define AMD_CPU_ID_VG                 0x1645
+ #define AMD_CPU_ID_YC                 0x14B5
+ #define AMD_CPU_ID_CB                 0x14D8
+ #define AMD_CPU_ID_PS                 0x14E8
+diff --git a/drivers/platform/x86/hp/hp-wmi.c 
b/drivers/platform/x86/hp/hp-wmi.c
+index 8b3533d6ba091a..ad9d9f97960f2b 100644
+--- a/drivers/platform/x86/hp/hp-wmi.c
++++ b/drivers/platform/x86/hp/hp-wmi.c
+@@ -92,9 +92,11 @@ static const char * const victus_thermal_profile_boards[] = 
{
+       "8A25"
+ };
+ 
+-/* DMI Board names of Victus 16-r1000 and Victus 16-s1000 laptops */
++/* DMI Board names of Victus 16-r and Victus 16-s laptops */
+ static const char * const victus_s_thermal_profile_boards[] = {
+-      "8C99", "8C9C"
++      "8BBE", "8BD4", "8BD5",
++      "8C78", "8C99", "8C9C",
++      "8D41",
+ };
+ 
+ enum hp_wmi_radio {
+diff --git a/drivers/platform/x86/huawei-wmi.c 
b/drivers/platform/x86/huawei-wmi.c
+index c3772df34679f5..8a4c54089ace31 100644
+--- a/drivers/platform/x86/huawei-wmi.c
++++ b/drivers/platform/x86/huawei-wmi.c
+@@ -81,6 +81,10 @@ static const struct key_entry huawei_wmi_keymap[] = {
+       { KE_KEY,    0x289, { KEY_WLAN } },
+       // Huawei |M| key
+       { KE_KEY,    0x28a, { KEY_CONFIG } },
++      // HONOR YOYO key
++      { KE_KEY,    0x28b, { KEY_NOTIFICATION_CENTER } },
++      // HONOR print screen
++      { KE_KEY,    0x28e, { KEY_PRINT } },
+       // Keyboard backlit
+       { KE_IGNORE, 0x293, { KEY_KBDILLUMTOGGLE } },
+       { KE_IGNORE, 0x294, { KEY_KBDILLUMUP } },
+diff --git a/drivers/platform/x86/intel/hid.c 
b/drivers/platform/x86/intel/hid.c
+index f25a427cccdace..9c07a7faf18fee 100644
+--- a/drivers/platform/x86/intel/hid.c
++++ b/drivers/platform/x86/intel/hid.c
+@@ -55,6 +55,7 @@ static const struct acpi_device_id intel_hid_ids[] = {
+       { "INTC10CB" },
+       { "INTC10CC" },
+       { "INTC10F1" },
++      { "INTC10F2" },
+       { }
+ };
+ MODULE_DEVICE_TABLE(acpi, intel_hid_ids);
+diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c 
b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c
+index 2a6897035150c4..0dfc552b280246 100644
+--- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c
++++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c
+@@ -256,6 +256,10 @@ static const struct x86_cpu_id intel_uncore_cpu_ids[] = {
+       X86_MATCH_VFM(INTEL_ARROWLAKE, NULL),
+       X86_MATCH_VFM(INTEL_ARROWLAKE_H, NULL),
+       X86_MATCH_VFM(INTEL_LUNARLAKE_M, NULL),
++      X86_MATCH_VFM(INTEL_PANTHERLAKE_L, NULL),
++      X86_MATCH_VFM(INTEL_WILDCATLAKE_L, NULL),
++      X86_MATCH_VFM(INTEL_NOVALAKE, NULL),
++      X86_MATCH_VFM(INTEL_NOVALAKE_L, NULL),
+       {}
+ };
+ MODULE_DEVICE_TABLE(x86cpu, intel_uncore_cpu_ids);
+diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
+index 155ddeb8fcd460..bbf1fd4fe1e925 100644
+--- a/drivers/spi/spi-imx.c
++++ b/drivers/spi/spi-imx.c
+@@ -519,9 +519,15 @@ static void mx51_ecspi_trigger(struct spi_imx_data 
*spi_imx)
+ {
+       u32 reg;
+ 
+-      reg = readl(spi_imx->base + MX51_ECSPI_CTRL);
+-      reg |= MX51_ECSPI_CTRL_XCH;
+-      writel(reg, spi_imx->base + MX51_ECSPI_CTRL);
++      if (spi_imx->usedma) {
++              reg = readl(spi_imx->base + MX51_ECSPI_DMA);
++              reg |= MX51_ECSPI_DMA_TEDEN | MX51_ECSPI_DMA_RXDEN;
++              writel(reg, spi_imx->base + MX51_ECSPI_DMA);
++      } else {
++              reg = readl(spi_imx->base + MX51_ECSPI_CTRL);
++              reg |= MX51_ECSPI_CTRL_XCH;
++              writel(reg, spi_imx->base + MX51_ECSPI_CTRL);
++      }
+ }
+ 
+ static void mx51_ecspi_disable(struct spi_imx_data *spi_imx)
+@@ -759,7 +765,6 @@ static void mx51_setup_wml(struct spi_imx_data *spi_imx)
+       writel(MX51_ECSPI_DMA_RX_WML(spi_imx->wml - 1) |
+               MX51_ECSPI_DMA_TX_WML(tx_wml) |
+               MX51_ECSPI_DMA_RXT_WML(spi_imx->wml) |
+-              MX51_ECSPI_DMA_TEDEN | MX51_ECSPI_DMA_RXDEN |
+               MX51_ECSPI_DMA_RXTDEN, spi_imx->base + MX51_ECSPI_DMA);
+ }
+ 
+@@ -1520,6 +1525,8 @@ static int spi_imx_dma_transfer(struct spi_imx_data 
*spi_imx,
+       reinit_completion(&spi_imx->dma_tx_completion);
+       dma_async_issue_pending(controller->dma_tx);
+ 
++      spi_imx->devtype_data->trigger(spi_imx);
++
+       transfer_timeout = spi_imx_calculate_timeout(spi_imx, transfer->len);
+ 
+       /* Wait SDMA to finish the data transfer.*/
+diff --git a/drivers/spi/spi-xilinx.c b/drivers/spi/spi-xilinx.c
+index d59cc8a1848466..c86dc56f38b456 100644
+--- a/drivers/spi/spi-xilinx.c
++++ b/drivers/spi/spi-xilinx.c
+@@ -300,7 +300,7 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, 
struct spi_transfer *t)
+ 
+               /* Read out all the data from the Rx FIFO */
+               rx_words = n_words;
+-              stalled = 10;
++              stalled = 32;
+               while (rx_words) {
+                       if (rx_words == n_words && !(stalled--) &&
+                           !(sr & XSPI_SR_TX_EMPTY_MASK) &&
+diff --git a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c 
b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
+index 53d4c113b19c8c..df35c616e71ff0 100644
+--- a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
++++ b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
+@@ -140,22 +140,24 @@ u8 *rtw_get_ie(u8 *pbuf, signed int index, signed int 
*len, signed int limit)
+       signed int tmp, i;
+       u8 *p;
+ 
+-      if (limit < 1)
++      if (limit < 2)
+               return NULL;
+ 
+       p = pbuf;
+       i = 0;
+       *len = 0;
+-      while (1) {
++      while (i + 2 <= limit) {
++              tmp = *(p + 1);
++              if (i + 2 + tmp > limit)
++                      break;
++
+               if (*p == index) {
+-                      *len = *(p + 1);
++                      *len = tmp;
+                       return p;
+               }
+-              tmp = *(p + 1);
++
+               p += (tmp + 2);
+               i += (tmp + 2);
+-              if (i >= limit)
+-                      break;
+       }
+       return NULL;
+ }
+diff --git a/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c 
b/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
+index bc980d21d50e24..32aa168bcb075f 100644
+--- a/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
++++ b/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
+@@ -579,9 +579,11 @@ unsigned int OnBeacon(struct adapter *padapter, union 
recv_frame *precv_frame)
+ 
+       p = rtw_get_ie(pframe + sizeof(struct ieee80211_hdr_3addr) + 
_BEACON_IE_OFFSET_, WLAN_EID_EXT_SUPP_RATES, &ielen, precv_frame->u.hdr.len - 
sizeof(struct ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_);
+       if (p && ielen > 0) {
+-              if ((*(p + 1 + ielen) == 0x2D) && (*(p + 2 + ielen) != 0x2D))
+-                      /* Invalid value 0x2D is detected in Extended Supported 
Rates (ESR) IE. Try to fix the IE length to avoid failed Beacon parsing. */
+-                      *(p + 1) = ielen - 1;
++              if (p + 2 + ielen < pframe + len) {
++                      if ((*(p + 1 + ielen) == 0x2D) && (*(p + 2 + ielen) != 
0x2D))
++                              /* Invalid value 0x2D is detected in Extended 
Supported Rates (ESR) IE. Try to fix the IE length to avoid failed Beacon 
parsing. */
++                              *(p + 1) = ielen - 1;
++              }
+       }
+ 
+       if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
+@@ -1033,6 +1035,9 @@ unsigned int OnAssocReq(struct adapter *padapter, union 
recv_frame *precv_frame)
+               status = WLAN_STATUS_CHALLENGE_FAIL;
+               goto OnAssocReqFail;
+       } else {
++              if (ie_len > sizeof(supportRate))
++                      ie_len = sizeof(supportRate);
++
+               memcpy(supportRate, p+2, ie_len);
+               supportRateNum = ie_len;
+ 
+@@ -1040,7 +1045,7 @@ unsigned int OnAssocReq(struct adapter *padapter, union 
recv_frame *precv_frame)
+                               pkt_len - WLAN_HDR_A3_LEN - ie_offset);
+               if (p) {
+ 
+-                      if (supportRateNum <= sizeof(supportRate)) {
++                      if (supportRateNum + ie_len <= sizeof(supportRate)) {
+                               memcpy(supportRate+supportRateNum, p+2, ie_len);
+                               supportRateNum += ie_len;
+                       }
+diff --git a/drivers/tty/serial/8250/8250_pci.c 
b/drivers/tty/serial/8250/8250_pci.c
+index 152f914c599dc5..12e8ceffab65f2 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -95,6 +95,11 @@
+ #define PCI_DEVICE_ID_MOXA_CP138E_A   0x1381
+ #define PCI_DEVICE_ID_MOXA_CP168EL_A  0x1683
+ 
++#define PCI_DEVICE_ID_ADDIDATA_CPCI7500        0x7003
++#define PCI_DEVICE_ID_ADDIDATA_CPCI7500_NG     0x7024
++#define PCI_DEVICE_ID_ADDIDATA_CPCI7420_NG     0x7025
++#define PCI_DEVICE_ID_ADDIDATA_CPCI7300_NG     0x7026
++
+ /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
+ #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584       0x1584
+ #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588       0x1588
+@@ -5996,6 +6001,38 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               0,
+               pbn_ADDIDATA_PCIe_8_3906250 },
+ 
++      {       PCI_VENDOR_ID_ADDIDATA,
++              PCI_DEVICE_ID_ADDIDATA_CPCI7500,
++              PCI_ANY_ID,
++              PCI_ANY_ID,
++              0,
++              0,
++              pbn_b0_4_115200 },
++
++      {       PCI_VENDOR_ID_ADDIDATA,
++              PCI_DEVICE_ID_ADDIDATA_CPCI7500_NG,
++              PCI_ANY_ID,
++              PCI_ANY_ID,
++              0,
++              0,
++              pbn_b0_4_115200 },
++
++      {       PCI_VENDOR_ID_ADDIDATA,
++              PCI_DEVICE_ID_ADDIDATA_CPCI7420_NG,
++              PCI_ANY_ID,
++              PCI_ANY_ID,
++              0,
++              0,
++              pbn_b0_2_115200 },
++
++      {       PCI_VENDOR_ID_ADDIDATA,
++              PCI_DEVICE_ID_ADDIDATA_CPCI7300_NG,
++              PCI_ANY_ID,
++              PCI_ANY_ID,
++              0,
++              0,
++              pbn_b0_1_115200 },
++
+       {       PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
+               PCI_VENDOR_ID_IBM, 0x0299,
+               0, 0, pbn_b0_bt_2_115200 },
+diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
+index 62bb62b82cbe58..1db4af6fe59096 100644
+--- a/drivers/tty/serial/sh-sci.c
++++ b/drivers/tty/serial/sh-sci.c
+@@ -1024,8 +1024,16 @@ static int sci_handle_fifo_overrun(struct uart_port 
*port)
+ 
+       status = s->ops->read_reg(port, s->params->overrun_reg);
+       if (status & s->params->overrun_mask) {
+-              status &= ~s->params->overrun_mask;
+-              s->ops->write_reg(port, s->params->overrun_reg, status);
++              if (s->type == SCI_PORT_RSCI) {
++                      /*
++                       * All of the CFCLR_*C clearing bits match the 
corresponding
++                       * CSR_*status bits. So, reuse the overrun mask for 
clearing.
++                       */
++                      s->ops->clear_SCxSR(port, s->params->overrun_mask);
++              } else {
++                      status &= ~s->params->overrun_mask;
++                      s->ops->write_reg(port, s->params->overrun_reg, status);
++              }
+ 
+               port->icount.overrun++;
+ 
+diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c
+index 44f5b58beec922..aa6b4c4ad5ecbe 100644
+--- a/drivers/usb/serial/belkin_sa.c
++++ b/drivers/usb/serial/belkin_sa.c
+@@ -435,7 +435,7 @@ static int belkin_sa_tiocmset(struct tty_struct *tty,
+       struct belkin_sa_private *priv = usb_get_serial_port_data(port);
+       unsigned long control_state;
+       unsigned long flags;
+-      int retval;
++      int retval = 0;
+       int rts = 0;
+       int dtr = 0;
+ 
+@@ -452,26 +452,32 @@ static int belkin_sa_tiocmset(struct tty_struct *tty,
+       }
+       if (clear & TIOCM_RTS) {
+               control_state &= ~TIOCM_RTS;
+-              rts = 0;
++              rts = 1;
+       }
+       if (clear & TIOCM_DTR) {
+               control_state &= ~TIOCM_DTR;
+-              dtr = 0;
++              dtr = 1;
+       }
+ 
+       priv->control_state = control_state;
+       spin_unlock_irqrestore(&priv->lock, flags);
+ 
+-      retval = BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST, rts);
+-      if (retval < 0) {
+-              dev_err(&port->dev, "Set RTS error %d\n", retval);
+-              goto exit;
++      if (rts) {
++              retval = BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST,
++                                      !!(control_state & TIOCM_RTS));
++              if (retval < 0) {
++                      dev_err(&port->dev, "Set RTS error %d\n", retval);
++                      goto exit;
++              }
+       }
+ 
+-      retval = BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, dtr);
+-      if (retval < 0) {
+-              dev_err(&port->dev, "Set DTR error %d\n", retval);
+-              goto exit;
++      if (dtr) {
++              retval = BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST,
++                                      !!(control_state & TIOCM_DTR));
++              if (retval < 0) {
++                      dev_err(&port->dev, "Set DTR error %d\n", retval);
++                      goto exit;
++              }
+       }
+ exit:
+       return retval;
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index b37fa31f56943d..9993a5123344e3 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -628,10 +628,8 @@ static const struct usb_device_id id_table_combined[] = {
+       { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
+-      { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_TIAO_UMPA_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_NT_ORIONLXM_PID, 1) },
+       { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLX_PLUS_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_NT_ORION_IO_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONMX_PID) },
+@@ -842,24 +840,17 @@ static const struct usb_device_id id_table_combined[] = {
+       { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
+-      { USB_DEVICE(FTDI_VID, CYBER_CORTEX_AV_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, CYBER_CORTEX_AV_PID, 1) },
+       { USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID, 1) },
+       { USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID, 1) 
},
+       { USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_TINY_PID, 1) },
+       { USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_TINY_H_PID, 1) 
},
+-      { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(FIC_VID, FIC_NEO1973_DEBUG_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_OOCDLINK_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_TURTELIZER_PID, 1) },
+       { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
+       { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_SCU18) },
+       { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
+@@ -901,17 +892,14 @@ static const struct usb_device_id id_table_combined[] = {
+       { USB_DEVICE(ATMEL_VID, STK541_PID) },
+       { USB_DEVICE(DE_VID, STB_PID) },
+       { USB_DEVICE(DE_VID, WHT_PID) },
+-      { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(ADI_VID, ADI_GNICE_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(ADI_VID, ADI_GNICEPLUS_PID, 1) },
+       { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
+                                       USB_CLASS_VENDOR_SPEC,
+                                       USB_SUBCLASS_VENDOR_SPEC, 0x00) },
+       { USB_DEVICE_INTERFACE_NUMBER(ACTEL_VID, 
MICROSEMI_ARROW_SF2PLUS_BOARD_PID, 2) },
+       { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
+-      { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(MARVELL_VID, MARVELL_SHEEVAPLUG_PID, 1) },
+       { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
+       { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
+       { USB_DEVICE(FTDI_VID, PI_C865_PID) },
+@@ -934,10 +922,8 @@ static const struct usb_device_id id_table_combined[] = {
+       { USB_DEVICE(PI_VID, PI_1016_PID) },
+       { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
+       { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
+-      { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, MARVELL_OPENRD_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, TI_XDS100V2_PID, 1) },
+       { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
+       { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
+       { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
+@@ -946,18 +932,14 @@ static const struct usb_device_id id_table_combined[] = {
+       { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
+       { USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
+       { USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
+-      { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, XVERVE_SIGNALYZER_ST_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID, 1) 
},
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID, 1) },
+       { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
+               .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+       { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
+       { USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
+-      { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(IONICS_VID, IONICS_PLUGCOMPUTER_PID, 1) },
+       { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
+@@ -972,15 +954,12 @@ static const struct usb_device_id id_table_combined[] = {
+       { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_FHE_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
+-      { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(ST_VID, ST_STMCLT_2232_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(QIHARDWARE_VID, 
MILKYMISTONE_JTAGSERIAL_PID, 1) },
++      { USB_DEVICE_INTERFACE_NUMBER(ST_VID, ST_STMCLT_2232_PID, 1) },
+       { USB_DEVICE(ST_VID, ST_STMCLT_4232_PID),
+               .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
+       { USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
+-      { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, 
FTDI_DISTORTEC_JTAG_LOCK_PICK_PID, 1) },
+       { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
+       /* Crucible Devices */
+       { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
+@@ -1055,8 +1034,7 @@ static const struct usb_device_id id_table_combined[] = {
+       { USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) },
+       { USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) },
+       { USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) },
+-      { USB_DEVICE(TI_VID, TI_CC3200_LAUNCHPAD_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(TI_VID, TI_CC3200_LAUNCHPAD_PID, 1) },
+       { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_BT_USB_PID) },
+       { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_WL_USB_PID) },
+       { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) },
+@@ -1076,10 +1054,8 @@ static const struct usb_device_id id_table_combined[] = 
{
+       { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ODIN_PID) },
+       { USB_DEVICE_INTERFACE_NUMBER(UBLOX_VID, UBLOX_EVK_M101_PID, 2) },
+       /* FreeCalypso USB adapters */
+-      { USB_DEVICE(FTDI_VID, FTDI_FALCONIA_JTAG_BUF_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+-      { USB_DEVICE(FTDI_VID, FTDI_FALCONIA_JTAG_UNBUF_PID),
+-              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_FALCONIA_JTAG_BUF_PID, 1) 
},
++      { USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_FALCONIA_JTAG_UNBUF_PID, 
1) },
+       /* GMC devices */
+       { USB_DEVICE(GMC_VID, GMC_Z216C_PID) },
+       /* Altera USB Blaster 3 */
+diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
+index 464433be203443..96ea571c436a71 100644
+--- a/drivers/usb/serial/kobil_sct.c
++++ b/drivers/usb/serial/kobil_sct.c
+@@ -418,7 +418,7 @@ static int kobil_tiocmset(struct tty_struct *tty,
+       struct usb_serial_port *port = tty->driver_data;
+       struct device *dev = &port->dev;
+       struct kobil_private *priv;
+-      int result;
++      int result = 0;
+       int dtr = 0;
+       int rts = 0;
+ 
+@@ -435,12 +435,12 @@ static int kobil_tiocmset(struct tty_struct *tty,
+       if (set & TIOCM_DTR)
+               dtr = 1;
+       if (clear & TIOCM_RTS)
+-              rts = 0;
++              rts = 1;
+       if (clear & TIOCM_DTR)
+-              dtr = 0;
++              dtr = 1;
+ 
+-      if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) {
+-              if (dtr != 0)
++      if (dtr && priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) {
++              if (set & TIOCM_DTR)
+                       dev_dbg(dev, "%s - Setting DTR\n", __func__);
+               else
+                       dev_dbg(dev, "%s - Clearing DTR\n", __func__);
+@@ -448,13 +448,13 @@ static int kobil_tiocmset(struct tty_struct *tty,
+                         usb_sndctrlpipe(port->serial->dev, 0),
+                         SUSBCRequest_SetStatusLinesOrQueues,
+                         USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
+-                        ((dtr != 0) ? SUSBCR_SSL_SETDTR : SUSBCR_SSL_CLRDTR),
++                        ((set & TIOCM_DTR) ? SUSBCR_SSL_SETDTR : 
SUSBCR_SSL_CLRDTR),
+                         0,
+                         NULL,
+                         0,
+                         KOBIL_TIMEOUT);
+-      } else {
+-              if (rts != 0)
++      } else if (rts) {
++              if (set & TIOCM_RTS)
+                       dev_dbg(dev, "%s - Setting RTS\n", __func__);
+               else
+                       dev_dbg(dev, "%s - Clearing RTS\n", __func__);
+@@ -462,7 +462,7 @@ static int kobil_tiocmset(struct tty_struct *tty,
+                       usb_sndctrlpipe(port->serial->dev, 0),
+                       SUSBCRequest_SetStatusLinesOrQueues,
+                       USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
+-                      ((rts != 0) ? SUSBCR_SSL_SETRTS : SUSBCR_SSL_CLRRTS),
++                      ((set & TIOCM_RTS) ? SUSBCR_SSL_SETRTS : 
SUSBCR_SSL_CLRRTS),
+                       0,
+                       NULL,
+                       0,
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index e9400727ad36eb..4c0e5a3ab557b2 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -1433,17 +1433,31 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10b3, 0xff, 0xff, 
0x60) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c0, 0xff),    /* 
Telit FE910C04 (rmnet) */
+         .driver_info = RSVD(0) | NCTRL(3) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c1, 0xff),    /* 
Telit FE910C04 (RNDIS) */
++        .driver_info = NCTRL(4) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c2, 0xff),    /* 
Telit FE910C04 (MBIM) */
++        .driver_info = NCTRL(4) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c3, 0xff),    /* 
Telit FE910C04 (ECM) */
++        .driver_info = NCTRL(4) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c4, 0xff),    /* 
Telit FE910C04 (rmnet) */
+         .driver_info = RSVD(0) | NCTRL(3) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c5, 0xff),    /* 
Telit FE910C04 (RNDIS) */
++        .driver_info = NCTRL(4) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c6, 0xff),    /* 
Telit FE910C04 (MBIM) */
++        .driver_info = NCTRL(4) },
++      { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 
0x30),     /* Telit FE910C04 (ECM) */
++        .driver_info = NCTRL(4) },
++      { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 
0x40) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c8, 0xff),    /* 
Telit FE910C04 (rmnet) */
+         .driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c9, 0xff),    /* 
Telit FE910C04 (MBIM) */
++        .driver_info = NCTRL(3) | RSVD(4) | RSVD(5) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10cb, 0xff),    /* 
Telit FE910C04 (RNDIS) */
++        .driver_info = NCTRL(3) | RSVD(4) | RSVD(5) },
+       { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d0, 0xff, 0xff, 
0x30),     /* Telit FN990B (rmnet) */
+         .driver_info = NCTRL(5) },
+       { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d0, 0xff, 0xff, 
0x40) },
+       { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d0, 0xff, 0xff, 
0x60) },
+-      { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 
0x30),     /* Telit FE910C04 (ECM) */
+-        .driver_info = NCTRL(4) },
+-      { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 
0x40) },
+       { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d1, 0xff, 0xff, 
0x30),     /* Telit FN990B (MBIM) */
+         .driver_info = NCTRL(6) },
+       { USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d1, 0xff, 0xff, 
0x40) },
+@@ -2376,6 +2390,8 @@ static const struct usb_device_id option_ids[] = {
+         .driver_info = RSVD(3) },
+       { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0f0, 0xff),                     
/* Foxconn T99W373 MBIM */
+         .driver_info = RSVD(3) },
++      { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe123, 0xff),                     
/* Foxconn T99W760 MBIM */
++        .driver_info = RSVD(3) },
+       { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe145, 0xff),                     
/* Foxconn T99W651 RNDIS */
+         .driver_info = RSVD(5) | RSVD(6) },
+       { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe15f, 0xff),                     
/* Foxconn T99W709 */
+diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c
+index 1d41ce477df58b..984b365df04608 100644
+--- a/fs/bfs/inode.c
++++ b/fs/bfs/inode.c
+@@ -61,7 +61,19 @@ struct inode *bfs_iget(struct super_block *sb, unsigned 
long ino)
+       off = (ino - BFS_ROOT_INO) % BFS_INODES_PER_BLOCK;
+       di = (struct bfs_inode *)bh->b_data + off;
+ 
+-      inode->i_mode = 0x0000FFFF & le32_to_cpu(di->i_mode);
++      /*
++       * https://martin.hinner.info/fs/bfs/bfs-structure.html explains that
++       * BFS in SCO UnixWare environment used only lower 9 bits of di->i_mode
++       * value. This means that, although bfs_write_inode() saves whole
++       * inode->i_mode bits (which include S_IFMT bits and S_IS{UID,GID,VTX}
++       * bits), middle 7 bits of di->i_mode value can be garbage when these
++       * bits were not saved by bfs_write_inode().
++       * Since we can't tell whether middle 7 bits are garbage, use only
++       * lower 12 bits (i.e. tolerate S_IS{UID,GID,VTX} bits possibly being
++       * garbage) and reconstruct S_IFMT bits for Linux environment from
++       * di->i_vtype value.
++       */
++      inode->i_mode = 0x00000FFF & le32_to_cpu(di->i_mode);
+       if (le32_to_cpu(di->i_vtype) == BFS_VDIR) {
+               inode->i_mode |= S_IFDIR;
+               inode->i_op = &bfs_dir_inops;
+@@ -71,6 +83,11 @@ struct inode *bfs_iget(struct super_block *sb, unsigned 
long ino)
+               inode->i_op = &bfs_file_inops;
+               inode->i_fop = &bfs_file_operations;
+               inode->i_mapping->a_ops = &bfs_aops;
++      } else {
++              brelse(bh);
++              printf("Unknown vtype=%u %s:%08lx\n",
++                     le32_to_cpu(di->i_vtype), inode->i_sb->s_id, ino);
++              goto error;
+       }
+ 
+       BFS_I(inode)->i_sblock =  le32_to_cpu(di->i_sblock);
+diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
+index 1b094a4f386632..1f6bc05593df16 100644
+--- a/fs/ext4/inline.c
++++ b/fs/ext4/inline.c
+@@ -418,7 +418,12 @@ static int ext4_prepare_inline_data(handle_t *handle, 
struct inode *inode,
+               return -ENOSPC;
+ 
+       ext4_write_lock_xattr(inode, &no_expand);
+-
++      /*
++       * ei->i_inline_size may have changed since the initial check
++       * if other xattrs were added. Recalculate to ensure
++       * ext4_update_inline_data() validates against current capacity.
++       */
++      (void) ext4_find_inline_data_nolock(inode);
+       if (ei->i_inline_off)
+               ret = ext4_update_inline_data(handle, inode, len);
+       else
+@@ -446,9 +451,13 @@ static int ext4_destroy_inline_data_nolock(handle_t 
*handle,
+       if (!ei->i_inline_off)
+               return 0;
+ 
++      down_write(&ei->i_data_sem);
++
+       error = ext4_get_inode_loc(inode, &is.iloc);
+-      if (error)
++      if (error) {
++              up_write(&ei->i_data_sem);
+               return error;
++      }
+ 
+       error = ext4_xattr_ibody_find(inode, &i, &is);
+       if (error)
+@@ -487,6 +496,7 @@ out:
+       brelse(is.iloc.bh);
+       if (error == -ENODATA)
+               error = 0;
++      up_write(&ei->i_data_sem);
+       return error;
+ }
+ 
+diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
+index 3e510564de6ee8..9ce626ac947e30 100644
+--- a/fs/jbd2/transaction.c
++++ b/fs/jbd2/transaction.c
+@@ -1284,14 +1284,23 @@ int jbd2_journal_get_create_access(handle_t *handle, 
struct buffer_head *bh)
+        * committing transaction's lists, but it HAS to be in Forget state in
+        * that case: the transaction must have deleted the buffer for it to be
+        * reused here.
++       * In the case of file system data inconsistency, for example, if the
++       * block bitmap of a referenced block is not set, it can lead to the
++       * situation where a block being committed is allocated and used again.
++       * As a result, the following condition will not be satisfied, so here
++       * we directly trigger a JBD abort instead of immediately invoking
++       * bugon.
+        */
+       spin_lock(&jh->b_state_lock);
+-      J_ASSERT_JH(jh, (jh->b_transaction == transaction ||
+-              jh->b_transaction == NULL ||
+-              (jh->b_transaction == journal->j_committing_transaction &&
+-                        jh->b_jlist == BJ_Forget)));
++      if (!(jh->b_transaction == transaction || jh->b_transaction == NULL ||
++            (jh->b_transaction == journal->j_committing_transaction &&
++             jh->b_jlist == BJ_Forget)) || jh->b_next_transaction != NULL) {
++              err = -EROFS;
++              spin_unlock(&jh->b_state_lock);
++              jbd2_journal_abort(journal, err);
++              goto out;
++      }
+ 
+-      J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
+       J_ASSERT_JH(jh, buffer_locked(jh2bh(jh)));
+ 
+       if (jh->b_transaction == NULL) {
+diff --git a/fs/smb/client/fs_context.c b/fs/smb/client/fs_context.c
+index c9cd00b96cde15..44dc5e24482e85 100644
+--- a/fs/smb/client/fs_context.c
++++ b/fs/smb/client/fs_context.c
+@@ -1472,7 +1472,7 @@ static int smb3_fs_context_parse_param(struct fs_context 
*fc,
+                       break;
+               }
+ 
+-              if (strnlen(param->string, CIFS_MAX_USERNAME_LEN) >
++              if (strnlen(param->string, CIFS_MAX_USERNAME_LEN) ==
+                   CIFS_MAX_USERNAME_LEN) {
+                       pr_warn("username too long\n");
+                       goto cifs_parse_mount_err;
+diff --git a/fs/smb/server/transport_ipc.c b/fs/smb/server/transport_ipc.c
+index 2c08cccfa6809f..2dbabe2d800554 100644
+--- a/fs/smb/server/transport_ipc.c
++++ b/fs/smb/server/transport_ipc.c
+@@ -553,12 +553,16 @@ static void *ipc_msg_send_request(struct ksmbd_ipc_msg 
*msg, unsigned int handle
+       up_write(&ipc_msg_table_lock);
+ 
+       ret = ipc_msg_send(msg);
+-      if (ret)
++      if (ret) {
++              down_write(&ipc_msg_table_lock);
+               goto out;
++      }
+ 
+       ret = wait_event_interruptible_timeout(entry.wait,
+                                              entry.response != NULL,
+                                              IPC_WAIT_TIMEOUT);
++
++      down_write(&ipc_msg_table_lock);
+       if (entry.response) {
+               ret = ipc_validate_msg(&entry);
+               if (ret) {
+@@ -567,7 +571,6 @@ static void *ipc_msg_send_request(struct ksmbd_ipc_msg 
*msg, unsigned int handle
+               }
+       }
+ out:
+-      down_write(&ipc_msg_table_lock);
+       hash_del(&entry.ipc_table_hlist);
+       up_write(&ipc_msg_table_lock);
+       return entry.response;
+diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c
+index 87b03d2e41dbbe..2338b3adfb55ff 100644
+--- a/kernel/locking/spinlock_debug.c
++++ b/kernel/locking/spinlock_debug.c
+@@ -184,8 +184,8 @@ void do_raw_read_unlock(rwlock_t *lock)
+ static inline void debug_write_lock_before(rwlock_t *lock)
+ {
+       RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic");
+-      RWLOCK_BUG_ON(lock->owner == current, lock, "recursion");
+-      RWLOCK_BUG_ON(lock->owner_cpu == raw_smp_processor_id(),
++      RWLOCK_BUG_ON(READ_ONCE(lock->owner) == current, lock, "recursion");
++      RWLOCK_BUG_ON(READ_ONCE(lock->owner_cpu) == raw_smp_processor_id(),
+                                                       lock, "cpu recursion");
+ }
+ 
+diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
+index 1e4740de66c283..9592579db949d4 100644
+--- a/kernel/sched/ext.c
++++ b/kernel/sched/ext.c
+@@ -5377,8 +5377,8 @@ void __init init_sched_ext_class(void)
+               BUG_ON(!zalloc_cpumask_var_node(&rq->scx.cpus_to_kick_if_idle, 
GFP_KERNEL, n));
+               BUG_ON(!zalloc_cpumask_var_node(&rq->scx.cpus_to_preempt, 
GFP_KERNEL, n));
+               BUG_ON(!zalloc_cpumask_var_node(&rq->scx.cpus_to_wait, 
GFP_KERNEL, n));
+-              init_irq_work(&rq->scx.deferred_irq_work, deferred_irq_workfn);
+-              init_irq_work(&rq->scx.kick_cpus_irq_work, 
kick_cpus_irq_workfn);
++              rq->scx.deferred_irq_work = 
IRQ_WORK_INIT_HARD(deferred_irq_workfn);
++              rq->scx.kick_cpus_irq_work = 
IRQ_WORK_INIT_HARD(kick_cpus_irq_workfn);
+ 
+               if (cpu_online(cpu))
+                       cpu_rq(cpu)->scx.flags |= SCX_RQ_ONLINE;
+diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
+index cbeb7e83313100..59cfacb8a5bbdc 100644
+--- a/kernel/trace/ftrace.c
++++ b/kernel/trace/ftrace.c
+@@ -1971,7 +1971,8 @@ static void ftrace_hash_rec_enable_modify(struct 
ftrace_ops *ops)
+  */
+ static int __ftrace_hash_update_ipmodify(struct ftrace_ops *ops,
+                                        struct ftrace_hash *old_hash,
+-                                       struct ftrace_hash *new_hash)
++                                       struct ftrace_hash *new_hash,
++                                       bool update_target)
+ {
+       struct ftrace_page *pg;
+       struct dyn_ftrace *rec, *end = NULL;
+@@ -2006,10 +2007,13 @@ static int __ftrace_hash_update_ipmodify(struct 
ftrace_ops *ops,
+               if (rec->flags & FTRACE_FL_DISABLED)
+                       continue;
+ 
+-              /* We need to update only differences of filter_hash */
++              /*
++               * Unless we are updating the target of a direct function,
++               * we only need to update differences of filter_hash
++               */
+               in_old = !!ftrace_lookup_ip(old_hash, rec->ip);
+               in_new = !!ftrace_lookup_ip(new_hash, rec->ip);
+-              if (in_old == in_new)
++              if (!update_target && (in_old == in_new))
+                       continue;
+ 
+               if (in_new) {
+@@ -2020,7 +2024,16 @@ static int __ftrace_hash_update_ipmodify(struct 
ftrace_ops *ops,
+                               if (is_ipmodify)
+                                       goto rollback;
+ 
+-                              FTRACE_WARN_ON(rec->flags & FTRACE_FL_DIRECT);
++                              /*
++                               * If this is called by __modify_ftrace_direct()
++                               * then it is only changing where the direct
++                               * pointer is jumping to, and the record already
++                               * points to a direct trampoline. If it isn't,
++                               * then it is a bug to update ipmodify on a 
direct
++                               * caller.
++                               */
++                              FTRACE_WARN_ON(!update_target &&
++                                             (rec->flags & FTRACE_FL_DIRECT));
+ 
+                               /*
+                                * Another ops with IPMODIFY is already
+@@ -2076,7 +2089,7 @@ static int ftrace_hash_ipmodify_enable(struct ftrace_ops 
*ops)
+       if (ftrace_hash_empty(hash))
+               hash = NULL;
+ 
+-      return __ftrace_hash_update_ipmodify(ops, EMPTY_HASH, hash);
++      return __ftrace_hash_update_ipmodify(ops, EMPTY_HASH, hash, false);
+ }
+ 
+ /* Disabling always succeeds */
+@@ -2087,7 +2100,7 @@ static void ftrace_hash_ipmodify_disable(struct 
ftrace_ops *ops)
+       if (ftrace_hash_empty(hash))
+               hash = NULL;
+ 
+-      __ftrace_hash_update_ipmodify(ops, hash, EMPTY_HASH);
++      __ftrace_hash_update_ipmodify(ops, hash, EMPTY_HASH, false);
+ }
+ 
+ static int ftrace_hash_ipmodify_update(struct ftrace_ops *ops,
+@@ -2101,7 +2114,7 @@ static int ftrace_hash_ipmodify_update(struct ftrace_ops 
*ops,
+       if (ftrace_hash_empty(new_hash))
+               new_hash = NULL;
+ 
+-      return __ftrace_hash_update_ipmodify(ops, old_hash, new_hash);
++      return __ftrace_hash_update_ipmodify(ops, old_hash, new_hash, false);
+ }
+ 
+ static void print_ip_ins(const char *fmt, const unsigned char *p)
+@@ -6114,7 +6127,7 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_direct);
+ static int
+ __modify_ftrace_direct(struct ftrace_ops *ops, unsigned long addr)
+ {
+-      struct ftrace_hash *hash;
++      struct ftrace_hash *hash = ops->func_hash->filter_hash;
+       struct ftrace_func_entry *entry, *iter;
+       static struct ftrace_ops tmp_ops = {
+               .func           = ftrace_stub,
+@@ -6134,13 +6147,21 @@ __modify_ftrace_direct(struct ftrace_ops *ops, 
unsigned long addr)
+       if (err)
+               return err;
+ 
++      /*
++       * Call __ftrace_hash_update_ipmodify() here, so that we can call
++       * ops->ops_func for the ops. This is needed because the above
++       * register_ftrace_function_nolock() worked on tmp_ops.
++       */
++      err = __ftrace_hash_update_ipmodify(ops, hash, hash, true);
++      if (err)
++              goto out;
++
+       /*
+        * Now the ftrace_ops_list_func() is called to do the direct callers.
+        * We can safely change the direct functions attached to each entry.
+        */
+       mutex_lock(&ftrace_lock);
+ 
+-      hash = ops->func_hash->filter_hash;
+       size = 1 << hash->size_bits;
+       for (i = 0; i < size; i++) {
+               hlist_for_each_entry(iter, &hash->buckets[i], hlist) {
+@@ -6155,6 +6176,7 @@ __modify_ftrace_direct(struct ftrace_ops *ops, unsigned 
long addr)
+ 
+       mutex_unlock(&ftrace_lock);
+ 
++out:
+       /* Removing the tmp_ops will add the updated direct callers to the 
functions */
+       unregister_ftrace_function(&tmp_ops);
+ 
+diff --git a/samples/vfs/test-statx.c b/samples/vfs/test-statx.c
+index 49c7a46cee0739..424a6fa15723cb 100644
+--- a/samples/vfs/test-statx.c
++++ b/samples/vfs/test-statx.c
+@@ -19,6 +19,12 @@
+ #include <time.h>
+ #include <sys/syscall.h>
+ #include <sys/types.h>
++
++// Work around glibc header silliness
++#undef AT_RENAME_NOREPLACE
++#undef AT_RENAME_EXCHANGE
++#undef AT_RENAME_WHITEOUT
++
+ #include <linux/stat.h>
+ #include <linux/fcntl.h>
+ #define statx foo
+diff --git a/samples/watch_queue/watch_test.c 
b/samples/watch_queue/watch_test.c
+index 8c6cb57d5cfc5b..24cf7d7a197258 100644
+--- a/samples/watch_queue/watch_test.c
++++ b/samples/watch_queue/watch_test.c
+@@ -16,6 +16,12 @@
+ #include <errno.h>
+ #include <sys/ioctl.h>
+ #include <limits.h>
++
++// Work around glibc header silliness
++#undef AT_RENAME_NOREPLACE
++#undef AT_RENAME_EXCHANGE
++#undef AT_RENAME_WHITEOUT
++
+ #include <linux/watch_queue.h>
+ #include <linux/unistd.h>
+ #include <linux/keyctl.h>
+diff --git a/sound/hda/codecs/realtek/alc269.c 
b/sound/hda/codecs/realtek/alc269.c
+index 796f555dd381dc..5e0c0f1e231b8a 100644
+--- a/sound/hda/codecs/realtek/alc269.c
++++ b/sound/hda/codecs/realtek/alc269.c
+@@ -6685,6 +6685,15 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x8e60, "HP Trekker ", 
ALC287_FIXUP_CS35L41_I2C_2),
+       SND_PCI_QUIRK(0x103c, 0x8e61, "HP Trekker ", 
ALC287_FIXUP_CS35L41_I2C_2),
+       SND_PCI_QUIRK(0x103c, 0x8e62, "HP Trekker ", 
ALC287_FIXUP_CS35L41_I2C_2),
++      SND_PCI_QUIRK(0x103c, 0x8ed5, "HP Merino13X", 
ALC245_FIXUP_TAS2781_SPI_2),
++      SND_PCI_QUIRK(0x103c, 0x8ed6, "HP Merino13", 
ALC245_FIXUP_TAS2781_SPI_2),
++      SND_PCI_QUIRK(0x103c, 0x8ed7, "HP Merino14", 
ALC245_FIXUP_TAS2781_SPI_2),
++      SND_PCI_QUIRK(0x103c, 0x8ed8, "HP Merino16", 
ALC245_FIXUP_TAS2781_SPI_2),
++      SND_PCI_QUIRK(0x103c, 0x8ed9, "HP Merino14W", 
ALC245_FIXUP_TAS2781_SPI_2),
++      SND_PCI_QUIRK(0x103c, 0x8eda, "HP Merino16W", 
ALC245_FIXUP_TAS2781_SPI_2),
++      SND_PCI_QUIRK(0x103c, 0x8f40, "HP Lampas14", ALC287_FIXUP_TAS2781_I2C),
++      SND_PCI_QUIRK(0x103c, 0x8f41, "HP Lampas16", ALC287_FIXUP_TAS2781_I2C),
++      SND_PCI_QUIRK(0x103c, 0x8f42, "HP LampasW14", ALC287_FIXUP_TAS2781_I2C),
+       SND_PCI_QUIRK(0x1043, 0x1032, "ASUS VivoBook X513EA", 
ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1043, 0x1034, "ASUS GU605C", 
ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
+       SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
+diff --git a/sound/soc/sdca/sdca_functions.c b/sound/soc/sdca/sdca_functions.c
+index 13f68f7b6dd6af..0ccb6775f4de3d 100644
+--- a/sound/soc/sdca/sdca_functions.c
++++ b/sound/soc/sdca/sdca_functions.c
+@@ -894,7 +894,8 @@ static int find_sdca_entity_control(struct device *dev, 
struct sdca_entity *enti
+               return ret;
+       }
+ 
+-      control->values = devm_kzalloc(dev, hweight64(control->cn_list), 
GFP_KERNEL);
++      control->values = devm_kcalloc(dev, hweight64(control->cn_list),
++                                     sizeof(int), GFP_KERNEL);
+       if (!control->values)
+               return -ENOMEM;
+ 
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index b04f52adb1f484..70f9e0cc28faca 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2022,6 +2022,8 @@ u64 snd_usb_interface_dsd_format_quirks(struct 
snd_usb_audio *chip,
+       case USB_ID(0x16d0, 0x09d8): /* NuPrime IDA-8 */
+       case USB_ID(0x16d0, 0x09db): /* NuPrime Audio DAC-9 */
+       case USB_ID(0x16d0, 0x09dd): /* Encore mDSD */
++      case USB_ID(0x16d0, 0x0ab1): /* PureAudio APA DAC */
++      case USB_ID(0x16d0, 0xeca1): /* PureAudio Lotus DAC5, DAC5 SE, DAC5 Pro 
*/
+       case USB_ID(0x1db5, 0x0003): /* Bryston BDA3 */
+       case USB_ID(0x20a0, 0x4143): /* WaveIO USB Audio 2.0 */
+       case USB_ID(0x22e1, 0xca01): /* HDTA Serenade DSD */
+@@ -2289,6 +2291,10 @@ static const struct usb_audio_quirk_flags_table 
quirk_flags_table[] = {
+                  QUIRK_FLAG_IGNORE_CLOCK_SOURCE),
+       DEVICE_FLG(0x1686, 0x00dd, /* Zoom R16/24 */
+                  QUIRK_FLAG_TX_LENGTH | QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x16d0, 0x0ab1, /* PureAudio APA DAC */
++                 QUIRK_FLAG_DSD_RAW),
++      DEVICE_FLG(0x16d0, 0xeca1, /* PureAudio Lotus DAC5, DAC5 SE and DAC5 
Pro */
++                 QUIRK_FLAG_DSD_RAW),
+       DEVICE_FLG(0x17aa, 0x1046, /* Lenovo ThinkStation P620 Rear Line-in, 
Line-out and Microphone */
+                  QUIRK_FLAG_DISABLE_AUTOSUSPEND),
+       DEVICE_FLG(0x17aa, 0x104d, /* Lenovo ThinkStation P620 Internal Speaker 
+ Front Headset */

Reply via email to