commit:     b6b4af36aa8079ef0c7c6cf9c05b3c1a59be66e0
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Nov  8 14:02:18 2023 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Nov  8 14:02:18 2023 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=b6b4af36

Linux patch 6.1.62

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README             |    4 +
 1061_linux-6.1.62.patch | 1798 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1802 insertions(+)

diff --git a/0000_README b/0000_README
index 78a774ef..3a96d6b9 100644
--- a/0000_README
+++ b/0000_README
@@ -287,6 +287,10 @@ Patch:  1060_linux-6.1.61.patch
 From:   https://www.kernel.org
 Desc:   Linux 6.1.61
 
+Patch:  1061_linux-6.1.62.patch
+From:   https://www.kernel.org
+Desc:   Linux 6.1.62
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1061_linux-6.1.62.patch b/1061_linux-6.1.62.patch
new file mode 100644
index 00000000..9c94ec46
--- /dev/null
+++ b/1061_linux-6.1.62.patch
@@ -0,0 +1,1798 @@
+diff --git a/Makefile b/Makefile
+index 635474f38aaa9..2e7bc3cc1c177 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 1
+-SUBLEVEL = 61
++SUBLEVEL = 62
+ EXTRAVERSION =
+ NAME = Curry Ramen
+ 
+diff --git a/arch/loongarch/mm/init.c b/arch/loongarch/mm/init.c
+index c7e9c96719fa3..f42a3be5f28d7 100644
+--- a/arch/loongarch/mm/init.c
++++ b/arch/loongarch/mm/init.c
+@@ -68,11 +68,11 @@ void copy_user_highpage(struct page *to, struct page *from,
+ {
+       void *vfrom, *vto;
+ 
+-      vto = kmap_atomic(to);
+-      vfrom = kmap_atomic(from);
++      vfrom = kmap_local_page(from);
++      vto = kmap_local_page(to);
+       copy_page(vto, vfrom);
+-      kunmap_atomic(vfrom);
+-      kunmap_atomic(vto);
++      kunmap_local(vfrom);
++      kunmap_local(vto);
+       /* Make sure this page is cleared on other CPU's too before using it */
+       smp_wmb();
+ }
+@@ -228,6 +228,7 @@ pgd_t swapper_pg_dir[_PTRS_PER_PGD] 
__section(".bss..swapper_pg_dir");
+ pgd_t invalid_pg_dir[_PTRS_PER_PGD] __page_aligned_bss;
+ #ifndef __PAGETABLE_PUD_FOLDED
+ pud_t invalid_pud_table[PTRS_PER_PUD] __page_aligned_bss;
++EXPORT_SYMBOL(invalid_pud_table);
+ #endif
+ #ifndef __PAGETABLE_PMD_FOLDED
+ pmd_t invalid_pmd_table[PTRS_PER_PMD] __page_aligned_bss;
+diff --git a/arch/powerpc/kernel/head_85xx.S b/arch/powerpc/kernel/head_85xx.S
+index 52c0ab416326a..0e16aea7853b8 100644
+--- a/arch/powerpc/kernel/head_85xx.S
++++ b/arch/powerpc/kernel/head_85xx.S
+@@ -394,7 +394,7 @@ interrupt_base:
+ #ifdef CONFIG_PPC_FPU
+       FP_UNAVAILABLE_EXCEPTION
+ #else
+-      EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, 
unknown_exception)
++      EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, 
emulation_assist_interrupt)
+ #endif
+ 
+       /* System Call Interrupt */
+diff --git a/arch/powerpc/kernel/setup-common.c 
b/arch/powerpc/kernel/setup-common.c
+index efb301a4987ca..59b4ac57bfaf7 100644
+--- a/arch/powerpc/kernel/setup-common.c
++++ b/arch/powerpc/kernel/setup-common.c
+@@ -946,6 +946,8 @@ void __init setup_arch(char **cmdline_p)
+ 
+       /* Parse memory topology */
+       mem_topology_setup();
++      /* Set max_mapnr before paging_init() */
++      set_max_mapnr(max_pfn);
+ 
+       /*
+        * Release secondary cpus out of their spinloops at 0x60 now that
+diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
+index 84d171953ba44..c7599b1737099 100644
+--- a/arch/powerpc/mm/mem.c
++++ b/arch/powerpc/mm/mem.c
+@@ -288,7 +288,6 @@ void __init mem_init(void)
+ #endif
+ 
+       high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
+-      set_max_mapnr(max_pfn);
+ 
+       kasan_late_init();
+ 
+diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
+index c871a6d6364ca..4194aa4c5f0e0 100644
+--- a/arch/x86/kvm/svm/svm.c
++++ b/arch/x86/kvm/svm/svm.c
+@@ -822,8 +822,7 @@ void svm_set_x2apic_msr_interception(struct vcpu_svm *svm, 
bool intercept)
+       if (intercept == svm->x2avic_msrs_intercepted)
+               return;
+ 
+-      if (avic_mode != AVIC_MODE_X2 ||
+-          !apic_x2apic_mode(svm->vcpu.arch.apic))
++      if (avic_mode != AVIC_MODE_X2)
+               return;
+ 
+       for (i = 0; i < MAX_DIRECT_ACCESS_MSRS; i++) {
+diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c
+index 3b09fdc507e04..594b016e76efc 100644
+--- a/drivers/dma/ste_dma40.c
++++ b/drivers/dma/ste_dma40.c
+@@ -3697,6 +3697,7 @@ static int __init d40_probe(struct platform_device *pdev)
+               regulator_disable(base->lcpa_regulator);
+               regulator_put(base->lcpa_regulator);
+       }
++      pm_runtime_disable(base->dev);
+ 
+       kfree(base->lcla_pool.alloc_map);
+       kfree(base->lookup_log_chans);
+diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
+index b43e5e6ddaf6e..b7c0e8cc0764f 100644
+--- a/drivers/firmware/efi/efi.c
++++ b/drivers/firmware/efi/efi.c
+@@ -245,9 +245,13 @@ static __init int efivar_ssdt_load(void)
+               if (status == EFI_NOT_FOUND) {
+                       break;
+               } else if (status == EFI_BUFFER_TOO_SMALL) {
+-                      name = krealloc(name, name_size, GFP_KERNEL);
+-                      if (!name)
++                      efi_char16_t *name_tmp =
++                              krealloc(name, name_size, GFP_KERNEL);
++                      if (!name_tmp) {
++                              kfree(name);
+                               return -ENOMEM;
++                      }
++                      name = name_tmp;
+                       continue;
+               }
+ 
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+index d2139ac121595..1ed2142a6e7bf 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+@@ -47,7 +47,6 @@ const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM] 
= {
+ bool amdgpu_ctx_priority_is_valid(int32_t ctx_prio)
+ {
+       switch (ctx_prio) {
+-      case AMDGPU_CTX_PRIORITY_UNSET:
+       case AMDGPU_CTX_PRIORITY_VERY_LOW:
+       case AMDGPU_CTX_PRIORITY_LOW:
+       case AMDGPU_CTX_PRIORITY_NORMAL:
+@@ -55,6 +54,7 @@ bool amdgpu_ctx_priority_is_valid(int32_t ctx_prio)
+       case AMDGPU_CTX_PRIORITY_VERY_HIGH:
+               return true;
+       default:
++      case AMDGPU_CTX_PRIORITY_UNSET:
+               return false;
+       }
+ }
+@@ -64,7 +64,8 @@ amdgpu_ctx_to_drm_sched_prio(int32_t ctx_prio)
+ {
+       switch (ctx_prio) {
+       case AMDGPU_CTX_PRIORITY_UNSET:
+-              return DRM_SCHED_PRIORITY_UNSET;
++              pr_warn_once("AMD-->DRM context priority value UNSET-->NORMAL");
++              return DRM_SCHED_PRIORITY_NORMAL;
+ 
+       case AMDGPU_CTX_PRIORITY_VERY_LOW:
+               return DRM_SCHED_PRIORITY_MIN;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
+index 7bd8e33b14be5..e8b3e9520cf6e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
+@@ -400,7 +400,10 @@ amdgpu_dma_buf_move_notify(struct dma_buf_attachment 
*attach)
+                               continue;
+               }
+ 
+-              r = amdgpu_vm_clear_freed(adev, vm, NULL);
++              /* Reserve fences for two SDMA page table updates */
++              r = dma_resv_reserve_fences(resv, 2);
++              if (!r)
++                      r = amdgpu_vm_clear_freed(adev, vm, NULL);
+               if (!r)
+                       r = amdgpu_vm_handle_moved(adev, vm);
+ 
+diff --git a/drivers/gpu/drm/ttm/ttm_device.c 
b/drivers/gpu/drm/ttm/ttm_device.c
+index b84f74807ca13..ec9ddaad56a05 100644
+--- a/drivers/gpu/drm/ttm/ttm_device.c
++++ b/drivers/gpu/drm/ttm/ttm_device.c
+@@ -239,10 +239,6 @@ void ttm_device_fini(struct ttm_device *bdev)
+       struct ttm_resource_manager *man;
+       unsigned i;
+ 
+-      man = ttm_manager_type(bdev, TTM_PL_SYSTEM);
+-      ttm_resource_manager_set_used(man, false);
+-      ttm_set_driver_manager(bdev, TTM_PL_SYSTEM, NULL);
+-
+       mutex_lock(&ttm_global_mutex);
+       list_del(&bdev->device_list);
+       mutex_unlock(&ttm_global_mutex);
+@@ -252,6 +248,10 @@ void ttm_device_fini(struct ttm_device *bdev)
+       if (ttm_bo_delayed_delete(bdev, true))
+               pr_debug("Delayed destroy list was clean\n");
+ 
++      man = ttm_manager_type(bdev, TTM_PL_SYSTEM);
++      ttm_resource_manager_set_used(man, false);
++      ttm_set_driver_manager(bdev, TTM_PL_SYSTEM, NULL);
++
+       spin_lock(&bdev->lru_lock);
+       for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i)
+               if (list_empty(&man->lru[0]))
+diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c 
b/drivers/hwtracing/coresight/coresight-tmc-etr.c
+index 1be0e5e0e80b2..c88a6afb29512 100644
+--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
++++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
+@@ -610,7 +610,8 @@ static int tmc_etr_alloc_flat_buf(struct tmc_drvdata 
*drvdata,
+ 
+       flat_buf->vaddr = dma_alloc_noncoherent(real_dev, etr_buf->size,
+                                               &flat_buf->daddr,
+-                                              DMA_FROM_DEVICE, GFP_KERNEL);
++                                              DMA_FROM_DEVICE,
++                                              GFP_KERNEL | __GFP_NOWARN);
+       if (!flat_buf->vaddr) {
+               kfree(flat_buf);
+               return -ENOMEM;
+diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
+index d2c9f4cbd00c6..e43e93ac2798a 100644
+--- a/drivers/input/mouse/synaptics.c
++++ b/drivers/input/mouse/synaptics.c
+@@ -1753,6 +1753,7 @@ static int synaptics_create_intertouch(struct psmouse 
*psmouse,
+               psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) &&
+               !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10);
+       const struct rmi_device_platform_data pdata = {
++              .reset_delay_ms = 30,
+               .sensor_pdata = {
+                       .sensor_type = rmi_sensor_touchpad,
+                       .axis_align.flip_y = true,
+diff --git a/drivers/input/rmi4/rmi_smbus.c b/drivers/input/rmi4/rmi_smbus.c
+index c130468541b7d..7080c2ddbaf2b 100644
+--- a/drivers/input/rmi4/rmi_smbus.c
++++ b/drivers/input/rmi4/rmi_smbus.c
+@@ -235,12 +235,29 @@ static void rmi_smb_clear_state(struct rmi_smb_xport 
*rmi_smb)
+ 
+ static int rmi_smb_enable_smbus_mode(struct rmi_smb_xport *rmi_smb)
+ {
+-      int retval;
++      struct i2c_client *client = rmi_smb->client;
++      int smbus_version;
++
++      /*
++       * psmouse driver resets the controller, we only need to wait
++       * to give the firmware chance to fully reinitialize.
++       */
++      if (rmi_smb->xport.pdata.reset_delay_ms)
++              msleep(rmi_smb->xport.pdata.reset_delay_ms);
+ 
+       /* we need to get the smbus version to activate the touchpad */
+-      retval = rmi_smb_get_version(rmi_smb);
+-      if (retval < 0)
+-              return retval;
++      smbus_version = rmi_smb_get_version(rmi_smb);
++      if (smbus_version < 0)
++              return smbus_version;
++
++      rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Smbus version is %d",
++              smbus_version);
++
++      if (smbus_version != 2 && smbus_version != 3) {
++              dev_err(&client->dev, "Unrecognized SMB version %d\n",
++                              smbus_version);
++              return -ENODEV;
++      }
+ 
+       return 0;
+ }
+@@ -253,11 +270,10 @@ static int rmi_smb_reset(struct rmi_transport_dev 
*xport, u16 reset_addr)
+       rmi_smb_clear_state(rmi_smb);
+ 
+       /*
+-       * we do not call the actual reset command, it has to be handled in
+-       * PS/2 or there will be races between PS/2 and SMBus.
+-       * PS/2 should ensure that a psmouse_reset is called before
+-       * intializing the device and after it has been removed to be in a known
+-       * state.
++       * We do not call the actual reset command, it has to be handled in
++       * PS/2 or there will be races between PS/2 and SMBus. PS/2 should
++       * ensure that a psmouse_reset is called before initializing the
++       * device and after it has been removed to be in a known state.
+        */
+       return rmi_smb_enable_smbus_mode(rmi_smb);
+ }
+@@ -273,7 +289,6 @@ static int rmi_smb_probe(struct i2c_client *client,
+ {
+       struct rmi_device_platform_data *pdata = dev_get_platdata(&client->dev);
+       struct rmi_smb_xport *rmi_smb;
+-      int smbus_version;
+       int error;
+ 
+       if (!pdata) {
+@@ -312,18 +327,9 @@ static int rmi_smb_probe(struct i2c_client *client,
+       rmi_smb->xport.proto_name = "smb";
+       rmi_smb->xport.ops = &rmi_smb_ops;
+ 
+-      smbus_version = rmi_smb_get_version(rmi_smb);
+-      if (smbus_version < 0)
+-              return smbus_version;
+-
+-      rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Smbus version is %d",
+-              smbus_version);
+-
+-      if (smbus_version != 2 && smbus_version != 3) {
+-              dev_err(&client->dev, "Unrecognized SMB version %d\n",
+-                              smbus_version);
+-              return -ENODEV;
+-      }
++      error = rmi_smb_enable_smbus_mode(rmi_smb);
++      if (error)
++              return error;
+ 
+       i2c_set_clientdata(client, rmi_smb);
+ 
+diff --git a/drivers/irqchip/irq-riscv-intc.c 
b/drivers/irqchip/irq-riscv-intc.c
+index 499e5f81b3fe3..4b66850978e6e 100644
+--- a/drivers/irqchip/irq-riscv-intc.c
++++ b/drivers/irqchip/irq-riscv-intc.c
+@@ -110,8 +110,16 @@ static int __init riscv_intc_init(struct device_node 
*node,
+        * for each INTC DT node. We only need to do INTC initialization
+        * for the INTC DT node belonging to boot CPU (or boot HART).
+        */
+-      if (riscv_hartid_to_cpuid(hartid) != smp_processor_id())
++      if (riscv_hartid_to_cpuid(hartid) != smp_processor_id()) {
++              /*
++               * The INTC nodes of each CPU are suppliers for downstream
++               * interrupt controllers (such as PLIC, IMSIC and APLIC
++               * direct-mode) so we should mark an INTC node as initialized
++               * if we are not creating IRQ domain for it.
++               */
++              fwnode_dev_initialized(of_fwnode_handle(node), true);
+               return 0;
++      }
+ 
+       intc_domain = irq_domain_add_linear(node, BITS_PER_LONG,
+                                           &riscv_intc_domain_ops, NULL);
+diff --git a/drivers/irqchip/irq-stm32-exti.c 
b/drivers/irqchip/irq-stm32-exti.c
+index 8bbb2b114636c..dc6f67decb022 100644
+--- a/drivers/irqchip/irq-stm32-exti.c
++++ b/drivers/irqchip/irq-stm32-exti.c
+@@ -458,6 +458,7 @@ static const struct irq_domain_ops irq_exti_domain_ops = {
+       .map    = irq_map_generic_chip,
+       .alloc  = stm32_exti_alloc,
+       .free   = stm32_exti_free,
++      .xlate  = irq_domain_xlate_twocell,
+ };
+ 
+ static void stm32_irq_ack(struct irq_data *d)
+diff --git a/drivers/misc/pci_endpoint_test.c 
b/drivers/misc/pci_endpoint_test.c
+index d1e2f22537dbe..55dc16d8f6adb 100644
+--- a/drivers/misc/pci_endpoint_test.c
++++ b/drivers/misc/pci_endpoint_test.c
+@@ -71,6 +71,7 @@
+ #define PCI_DEVICE_ID_TI_AM654                        0xb00c
+ #define PCI_DEVICE_ID_TI_J7200                        0xb00f
+ #define PCI_DEVICE_ID_TI_AM64                 0xb010
++#define PCI_DEVICE_ID_TI_J721S2               0xb013
+ #define PCI_DEVICE_ID_LS1088A                 0x80c0
+ 
+ #define is_am654_pci_dev(pdev)                \
+@@ -1004,6 +1005,9 @@ static const struct pci_device_id 
pci_endpoint_test_tbl[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_AM64),
+         .driver_data = (kernel_ulong_t)&j721e_data,
+       },
++      { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721S2),
++        .driver_data = (kernel_ulong_t)&j721e_data,
++      },
+       { }
+ };
+ MODULE_DEVICE_TABLE(pci, pci_endpoint_test_tbl);
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c 
b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+index 8d719f82854a9..76de55306c4d0 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+@@ -3816,6 +3816,8 @@ int t4_load_phy_fw(struct adapter *adap, int win,
+                FW_PARAMS_PARAM_Z_V(FW_PARAMS_PARAM_DEV_PHYFW_DOWNLOAD));
+       ret = t4_set_params_timeout(adap, adap->mbox, adap->pf, 0, 1,
+                                   &param, &val, 30000);
++      if (ret)
++              return ret;
+ 
+       /* If we have version number support, then check to see that the new
+        * firmware got loaded properly.
+diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
+index c34974f7dfd26..345e341d22338 100644
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -3655,6 +3655,8 @@ static void r8153b_ups_en(struct r8152 *tp, bool enable)
+                       int i;
+ 
+                       for (i = 0; i < 500; i++) {
++                              if (test_bit(RTL8152_UNPLUG, &tp->flags))
++                                      return;
+                               if (ocp_read_word(tp, MCU_TYPE_PLA, 
PLA_BOOT_CTRL) &
+                                   AUTOLOAD_DONE)
+                                       break;
+@@ -3695,6 +3697,8 @@ static void r8153c_ups_en(struct r8152 *tp, bool enable)
+                       int i;
+ 
+                       for (i = 0; i < 500; i++) {
++                              if (test_bit(RTL8152_UNPLUG, &tp->flags))
++                                      return;
+                               if (ocp_read_word(tp, MCU_TYPE_PLA, 
PLA_BOOT_CTRL) &
+                                   AUTOLOAD_DONE)
+                                       break;
+@@ -4058,6 +4062,9 @@ static int rtl_phy_patch_request(struct r8152 *tp, bool 
request, bool wait)
+       for (i = 0; wait && i < 5000; i++) {
+               u32 ocp_data;
+ 
++              if (test_bit(RTL8152_UNPLUG, &tp->flags))
++                      break;
++
+               usleep_range(1000, 2000);
+               ocp_data = ocp_reg_read(tp, OCP_PHY_PATCH_STAT);
+               if ((ocp_data & PATCH_READY) ^ check)
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 472fa2c8ebcec..30e7c627f21a7 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -595,7 +595,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 
PCI_DEVICE_ID_ATI_RS100,   quirk_ati_
+ /*
+  * In the AMD NL platform, this device ([1022:7912]) has a class code of
+  * PCI_CLASS_SERIAL_USB_XHCI (0x0c0330), which means the xhci driver will
+- * claim it.
++ * claim it. The same applies on the VanGogh platform device ([1022:163a]).
+  *
+  * But the dwc3 driver is a more specific driver for this device, and we'd
+  * prefer to use it instead of xhci. To prevent xhci from claiming the
+@@ -603,7 +603,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 
PCI_DEVICE_ID_ATI_RS100,   quirk_ati_
+  * defines as "USB device (not host controller)". The dwc3 driver can then
+  * claim it based on its Vendor and Device ID.
+  */
+-static void quirk_amd_nl_class(struct pci_dev *pdev)
++static void quirk_amd_dwc_class(struct pci_dev *pdev)
+ {
+       u32 class = pdev->class;
+ 
+@@ -613,7 +613,9 @@ static void quirk_amd_nl_class(struct pci_dev *pdev)
+                class, pdev->class);
+ }
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB,
+-              quirk_amd_nl_class);
++              quirk_amd_dwc_class);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VANGOGH_USB,
++              quirk_amd_dwc_class);
+ 
+ /*
+  * Synopsys USB 3.x host HAPS platform has a class code of
+diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c 
b/drivers/platform/mellanox/mlxbf-tmfifo.c
+index a04ff89a7ec44..9925a6d94affc 100644
+--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
++++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
+@@ -588,24 +588,25 @@ static void mlxbf_tmfifo_rxtx_word(struct 
mlxbf_tmfifo_vring *vring,
+ 
+       if (vring->cur_len + sizeof(u64) <= len) {
+               /* The whole word. */
+-              if (!IS_VRING_DROP(vring)) {
+-                      if (is_rx)
++              if (is_rx) {
++                      if (!IS_VRING_DROP(vring))
+                               memcpy(addr + vring->cur_len, &data,
+                                      sizeof(u64));
+-                      else
+-                              memcpy(&data, addr + vring->cur_len,
+-                                     sizeof(u64));
++              } else {
++                      memcpy(&data, addr + vring->cur_len,
++                             sizeof(u64));
+               }
+               vring->cur_len += sizeof(u64);
+       } else {
+               /* Leftover bytes. */
+-              if (!IS_VRING_DROP(vring)) {
+-                      if (is_rx)
++              if (is_rx) {
++                      if (!IS_VRING_DROP(vring))
+                               memcpy(addr + vring->cur_len, &data,
+                                      len - vring->cur_len);
+-                      else
+-                              memcpy(&data, addr + vring->cur_len,
+-                                     len - vring->cur_len);
++              } else {
++                      data = 0;
++                      memcpy(&data, addr + vring->cur_len,
++                             len - vring->cur_len);
+               }
+               vring->cur_len = len;
+       }
+diff --git a/drivers/power/supply/power_supply_core.c 
b/drivers/power/supply/power_supply_core.c
+index 7871ab5e979c0..ac88c9636b663 100644
+--- a/drivers/power/supply/power_supply_core.c
++++ b/drivers/power/supply/power_supply_core.c
+@@ -29,7 +29,7 @@
+ struct class *power_supply_class;
+ EXPORT_SYMBOL_GPL(power_supply_class);
+ 
+-ATOMIC_NOTIFIER_HEAD(power_supply_notifier);
++BLOCKING_NOTIFIER_HEAD(power_supply_notifier);
+ EXPORT_SYMBOL_GPL(power_supply_notifier);
+ 
+ static struct device_type power_supply_dev_type;
+@@ -97,7 +97,7 @@ static void power_supply_changed_work(struct work_struct 
*work)
+               class_for_each_device(power_supply_class, NULL, psy,
+                                     __power_supply_changed_work);
+               power_supply_update_leds(psy);
+-              atomic_notifier_call_chain(&power_supply_notifier,
++              blocking_notifier_call_chain(&power_supply_notifier,
+                               PSY_EVENT_PROP_CHANGED, psy);
+               kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);
+               spin_lock_irqsave(&psy->changed_lock, flags);
+@@ -1112,13 +1112,13 @@ static void power_supply_dev_release(struct device 
*dev)
+ 
+ int power_supply_reg_notifier(struct notifier_block *nb)
+ {
+-      return atomic_notifier_chain_register(&power_supply_notifier, nb);
++      return blocking_notifier_chain_register(&power_supply_notifier, nb);
+ }
+ EXPORT_SYMBOL_GPL(power_supply_reg_notifier);
+ 
+ void power_supply_unreg_notifier(struct notifier_block *nb)
+ {
+-      atomic_notifier_chain_unregister(&power_supply_notifier, nb);
++      blocking_notifier_chain_unregister(&power_supply_notifier, nb);
+ }
+ EXPORT_SYMBOL_GPL(power_supply_unreg_notifier);
+ 
+diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c 
b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+index 8e24ebcebfe52..2ea3bdc638177 100644
+--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
++++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+@@ -12914,8 +12914,10 @@ _mpt3sas_init(void)
+       mpt3sas_ctl_init(hbas_to_enumerate);
+ 
+       error = pci_register_driver(&mpt3sas_driver);
+-      if (error)
++      if (error) {
++              mpt3sas_ctl_exit(hbas_to_enumerate);
+               scsih_exit();
++      }
+ 
+       return error;
+ }
+diff --git a/drivers/spi/spi-npcm-fiu.c b/drivers/spi/spi-npcm-fiu.c
+index 49f6424e35af0..0624f52880705 100644
+--- a/drivers/spi/spi-npcm-fiu.c
++++ b/drivers/spi/spi-npcm-fiu.c
+@@ -353,8 +353,9 @@ static int npcm_fiu_uma_read(struct spi_mem *mem,
+               uma_cfg |= ilog2(op->cmd.buswidth);
+               uma_cfg |= ilog2(op->addr.buswidth)
+                       << NPCM_FIU_UMA_CFG_ADBPCK_SHIFT;
+-              uma_cfg |= ilog2(op->dummy.buswidth)
+-                      << NPCM_FIU_UMA_CFG_DBPCK_SHIFT;
++              if (op->dummy.nbytes)
++                      uma_cfg |= ilog2(op->dummy.buswidth)
++                              << NPCM_FIU_UMA_CFG_DBPCK_SHIFT;
+               uma_cfg |= ilog2(op->data.buswidth)
+                       << NPCM_FIU_UMA_CFG_RDBPCK_SHIFT;
+               uma_cfg |= op->dummy.nbytes << NPCM_FIU_UMA_CFG_DBSIZ_SHIFT;
+diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
+index 4b43589304704..6b6abce6b69f4 100644
+--- a/drivers/tty/n_gsm.c
++++ b/drivers/tty/n_gsm.c
+@@ -3404,6 +3404,8 @@ static int gsm_modem_upd_via_msc(struct gsm_dlci *dlci, 
u8 brk)
+ 
+ static int gsm_modem_update(struct gsm_dlci *dlci, u8 brk)
+ {
++      if (dlci->gsm->dead)
++              return -EL2HLT;
+       if (dlci->adaption == 2) {
+               /* Send convergence layer type 2 empty data frame. */
+               gsm_modem_upd_via_data(dlci, brk);
+diff --git a/drivers/tty/serial/8250/8250_pci.c 
b/drivers/tty/serial/8250/8250_pci.c
+index 0ea89df6702f6..38fb7126ab0ef 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -2447,6 +2447,153 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
+               .init                   = pci_oxsemi_tornado_init,
+               .setup          = pci_oxsemi_tornado_setup,
+       },
++      /*
++       * Brainboxes devices - all Oxsemi based
++       */
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4027,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4028,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4029,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4019,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4016,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4015,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x400A,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x400E,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x400C,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x400B,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x400F,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4010,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4011,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x401D,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x401E,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4013,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4017,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTASHIELD,
++              .device         = 0x4018,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .init           = pci_oxsemi_tornado_init,
++              .setup          = pci_oxsemi_tornado_setup,
++      },
+       {
+               .vendor         = PCI_VENDOR_ID_INTEL,
+               .device         = 0x8811,
+@@ -4931,6 +5078,12 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               0, 0,
+               pbn_b1_bt_1_115200 },
+ 
++      /*
++       * IntaShield IS-100
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0D60,
++              PCI_ANY_ID, PCI_ANY_ID, 0, 0,
++              pbn_b2_1_115200 },
+       /*
+        * IntaShield IS-200
+        */
+@@ -4943,6 +5096,27 @@ static const struct pci_device_id serial_pci_tbl[] = {
+       {       PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS400,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,    /* 135a.0dc0 */
+               pbn_b2_4_115200 },
++      /*
++       * IntaShield IX-100
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x4027,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_oxsemi_1_15625000 },
++      /*
++       * IntaShield IX-200
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x4028,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_oxsemi_2_15625000 },
++      /*
++       * IntaShield IX-400
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x4029,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_oxsemi_4_15625000 },
+       /* Brainboxes Devices */
+       /*
+       * Brainboxes UC-101
+@@ -4958,10 +5132,14 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+               pbn_b2_1_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0AA2,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_1_115200 },
+       /*
+-       * Brainboxes UC-257
++       * Brainboxes UC-253/UC-734
+        */
+-      {       PCI_VENDOR_ID_INTASHIELD, 0x0861,
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0CA1,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+               pbn_b2_2_115200 },
+@@ -4997,6 +5175,14 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+               pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x08E2,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x08E3,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
+       /*
+        * Brainboxes UC-310
+        */
+@@ -5007,6 +5193,14 @@ static const struct pci_device_id serial_pci_tbl[] = {
+       /*
+        * Brainboxes UC-313
+        */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x08A1,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x08A2,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
+       {       PCI_VENDOR_ID_INTASHIELD, 0x08A3,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+@@ -5021,6 +5215,10 @@ static const struct pci_device_id serial_pci_tbl[] = {
+       /*
+        * Brainboxes UC-346
+        */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0B01,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_4_115200 },
+       {       PCI_VENDOR_ID_INTASHIELD, 0x0B02,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+@@ -5032,6 +5230,10 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+               pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0A82,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
+       {       PCI_VENDOR_ID_INTASHIELD, 0x0A83,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+@@ -5044,12 +5246,94 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               0, 0,
+               pbn_b2_4_115200 },
+       /*
+-       * Brainboxes UC-420/431
++       * Brainboxes UC-420
+        */
+       {       PCI_VENDOR_ID_INTASHIELD, 0x0921,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+               pbn_b2_4_115200 },
++      /*
++       * Brainboxes UC-607
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x09A1,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x09A2,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x09A3,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      /*
++       * Brainboxes UC-836
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0D41,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_4_115200 },
++      /*
++       * Brainboxes UP-189
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0AC1,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0AC2,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0AC3,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      /*
++       * Brainboxes UP-200
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0B21,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0B22,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0B23,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      /*
++       * Brainboxes UP-869
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0C01,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0C02,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0C03,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      /*
++       * Brainboxes UP-880
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0C21,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0C22,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0C23,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_2_115200 },
+       /*
+        * Brainboxes PX-101
+        */
+@@ -5082,7 +5366,7 @@ static const struct pci_device_id serial_pci_tbl[] = {
+       {       PCI_VENDOR_ID_INTASHIELD, 0x4015,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+-              pbn_oxsemi_4_15625000 },
++              pbn_oxsemi_2_15625000 },
+       /*
+        * Brainboxes PX-260/PX-701
+        */
+@@ -5090,6 +5374,13 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+               pbn_oxsemi_4_15625000 },
++      /*
++       * Brainboxes PX-275/279
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x0E41,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b2_8_115200 },
+       /*
+        * Brainboxes PX-310
+        */
+@@ -5137,16 +5428,38 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               0, 0,
+               pbn_oxsemi_4_15625000 },
+       /*
+-       * Brainboxes PX-803
++       * Brainboxes PX-475
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x401D,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_oxsemi_1_15625000 },
++      /*
++       * Brainboxes PX-803/PX-857
+        */
+       {       PCI_VENDOR_ID_INTASHIELD, 0x4009,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+-              pbn_b0_1_115200 },
++              pbn_b0_2_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x4018,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_oxsemi_2_15625000 },
+       {       PCI_VENDOR_ID_INTASHIELD, 0x401E,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+-              pbn_oxsemi_1_15625000 },
++              pbn_oxsemi_2_15625000 },
++      /*
++       * Brainboxes PX-820
++       */
++      {       PCI_VENDOR_ID_INTASHIELD, 0x4002,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_b0_4_115200 },
++      {       PCI_VENDOR_ID_INTASHIELD, 0x4013,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0,
++              pbn_oxsemi_4_15625000 },
+       /*
+        * Brainboxes PX-846
+        */
+diff --git a/drivers/usb/gadget/legacy/raw_gadget.c 
b/drivers/usb/gadget/legacy/raw_gadget.c
+index e549022642e56..ea106ad665a1f 100644
+--- a/drivers/usb/gadget/legacy/raw_gadget.c
++++ b/drivers/usb/gadget/legacy/raw_gadget.c
+@@ -663,12 +663,12 @@ static int raw_process_ep0_io(struct raw_dev *dev, 
struct usb_raw_ep_io *io,
+       if (WARN_ON(in && dev->ep0_out_pending)) {
+               ret = -ENODEV;
+               dev->state = STATE_DEV_FAILED;
+-              goto out_done;
++              goto out_unlock;
+       }
+       if (WARN_ON(!in && dev->ep0_in_pending)) {
+               ret = -ENODEV;
+               dev->state = STATE_DEV_FAILED;
+-              goto out_done;
++              goto out_unlock;
+       }
+ 
+       dev->req->buf = data;
+@@ -683,7 +683,7 @@ static int raw_process_ep0_io(struct raw_dev *dev, struct 
usb_raw_ep_io *io,
+                               "fail, usb_ep_queue returned %d\n", ret);
+               spin_lock_irqsave(&dev->lock, flags);
+               dev->state = STATE_DEV_FAILED;
+-              goto out_done;
++              goto out_queue_failed;
+       }
+ 
+       ret = wait_for_completion_interruptible(&dev->ep0_done);
+@@ -692,13 +692,16 @@ static int raw_process_ep0_io(struct raw_dev *dev, 
struct usb_raw_ep_io *io,
+               usb_ep_dequeue(dev->gadget->ep0, dev->req);
+               wait_for_completion(&dev->ep0_done);
+               spin_lock_irqsave(&dev->lock, flags);
+-              goto out_done;
++              if (dev->ep0_status == -ECONNRESET)
++                      dev->ep0_status = -EINTR;
++              goto out_interrupted;
+       }
+ 
+       spin_lock_irqsave(&dev->lock, flags);
+-      ret = dev->ep0_status;
+ 
+-out_done:
++out_interrupted:
++      ret = dev->ep0_status;
++out_queue_failed:
+       dev->ep0_urb_queued = false;
+ out_unlock:
+       spin_unlock_irqrestore(&dev->lock, flags);
+@@ -1067,7 +1070,7 @@ static int raw_process_ep_io(struct raw_dev *dev, struct 
usb_raw_ep_io *io,
+                               "fail, usb_ep_queue returned %d\n", ret);
+               spin_lock_irqsave(&dev->lock, flags);
+               dev->state = STATE_DEV_FAILED;
+-              goto out_done;
++              goto out_queue_failed;
+       }
+ 
+       ret = wait_for_completion_interruptible(&done);
+@@ -1076,13 +1079,16 @@ static int raw_process_ep_io(struct raw_dev *dev, 
struct usb_raw_ep_io *io,
+               usb_ep_dequeue(ep->ep, ep->req);
+               wait_for_completion(&done);
+               spin_lock_irqsave(&dev->lock, flags);
+-              goto out_done;
++              if (ep->status == -ECONNRESET)
++                      ep->status = -EINTR;
++              goto out_interrupted;
+       }
+ 
+       spin_lock_irqsave(&dev->lock, flags);
+-      ret = ep->status;
+ 
+-out_done:
++out_interrupted:
++      ret = ep->status;
++out_queue_failed:
+       ep->urb_queued = false;
+ out_unlock:
+       spin_unlock_irqrestore(&dev->lock, flags);
+diff --git a/drivers/usb/storage/unusual_cypress.h 
b/drivers/usb/storage/unusual_cypress.h
+index 0547daf116a26..5df40759d77ad 100644
+--- a/drivers/usb/storage/unusual_cypress.h
++++ b/drivers/usb/storage/unusual_cypress.h
+@@ -19,7 +19,7 @@ UNUSUAL_DEV(  0x04b4, 0x6831, 0x0000, 0x9999,
+               "Cypress ISD-300LP",
+               USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0),
+ 
+-UNUSUAL_DEV( 0x14cd, 0x6116, 0x0160, 0x0160,
++UNUSUAL_DEV( 0x14cd, 0x6116, 0x0150, 0x0160,
+               "Super Top",
+               "USB 2.0  SATA BRIDGE",
+               USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0),
+diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
+index ad4d0314d27fa..5e9d0c695fdb7 100644
+--- a/drivers/usb/typec/tcpm/tcpm.c
++++ b/drivers/usb/typec/tcpm/tcpm.c
+@@ -1616,6 +1616,9 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct 
typec_altmode *adev,
+                       if (PD_VDO_VID(p[0]) != USB_SID_PD)
+                               break;
+ 
++                      if (IS_ERR_OR_NULL(port->partner))
++                              break;
++
+                       if (PD_VDO_SVDM_VER(p[0]) < svdm_version) {
+                               typec_partner_set_svdm_version(port->partner,
+                                                              
PD_VDO_SVDM_VER(p[0]));
+diff --git a/drivers/video/fbdev/aty/atyfb_base.c 
b/drivers/video/fbdev/aty/atyfb_base.c
+index b3463d1371520..faaa64fa5dfe9 100644
+--- a/drivers/video/fbdev/aty/atyfb_base.c
++++ b/drivers/video/fbdev/aty/atyfb_base.c
+@@ -3447,11 +3447,15 @@ static int atyfb_setup_generic(struct pci_dev *pdev, 
struct fb_info *info,
+       }
+ 
+       info->fix.mmio_start = raddr;
++#if defined(__i386__) || defined(__ia64__)
+       /*
+        * By using strong UC we force the MTRR to never have an
+        * effect on the MMIO region on both non-PAT and PAT systems.
+        */
+       par->ati_regbase = ioremap_uc(info->fix.mmio_start, 0x1000);
++#else
++      par->ati_regbase = ioremap(info->fix.mmio_start, 0x1000);
++#endif
+       if (par->ati_regbase == NULL)
+               return -ENOMEM;
+ 
+diff --git a/drivers/video/fbdev/omap/omapfb_main.c 
b/drivers/video/fbdev/omap/omapfb_main.c
+index 17cda57656838..5ea7c52baa5a8 100644
+--- a/drivers/video/fbdev/omap/omapfb_main.c
++++ b/drivers/video/fbdev/omap/omapfb_main.c
+@@ -1643,13 +1643,13 @@ static int omapfb_do_probe(struct platform_device 
*pdev,
+       }
+       fbdev->int_irq = platform_get_irq(pdev, 0);
+       if (fbdev->int_irq < 0) {
+-              r = ENXIO;
++              r = -ENXIO;
+               goto cleanup;
+       }
+ 
+       fbdev->ext_irq = platform_get_irq(pdev, 1);
+       if (fbdev->ext_irq < 0) {
+-              r = ENXIO;
++              r = -ENXIO;
+               goto cleanup;
+       }
+ 
+diff --git a/drivers/video/fbdev/uvesafb.c b/drivers/video/fbdev/uvesafb.c
+index 0e3cabbec4b40..a85463db9f986 100644
+--- a/drivers/video/fbdev/uvesafb.c
++++ b/drivers/video/fbdev/uvesafb.c
+@@ -1935,10 +1935,10 @@ static void uvesafb_exit(void)
+               }
+       }
+ 
+-      cn_del_callback(&uvesafb_cn_id);
+       driver_remove_file(&uvesafb_driver.driver, &driver_attr_v86d);
+       platform_device_unregister(uvesafb_device);
+       platform_driver_unregister(&uvesafb_driver);
++      cn_del_callback(&uvesafb_cn_id);
+ }
+ 
+ module_exit(uvesafb_exit);
+diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
+index f6a7fd47efd7a..82874be945248 100644
+--- a/fs/ceph/mds_client.c
++++ b/fs/ceph/mds_client.c
+@@ -709,8 +709,8 @@ int ceph_wait_on_conflict_unlink(struct dentry *dentry)
+               if (!d_same_name(udentry, pdentry, &dname))
+                       goto next;
+ 
++              found = dget_dlock(udentry);
+               spin_unlock(&udentry->d_lock);
+-              found = dget(udentry);
+               break;
+ next:
+               spin_unlock(&udentry->d_lock);
+diff --git a/fs/ntfs3/attrib.c b/fs/ntfs3/attrib.c
+index 63169529b52c4..2215179c925b3 100644
+--- a/fs/ntfs3/attrib.c
++++ b/fs/ntfs3/attrib.c
+@@ -1658,10 +1658,8 @@ repack:
+                       le_b = NULL;
+                       attr_b = ni_find_attr(ni, NULL, &le_b, ATTR_DATA, NULL,
+                                             0, NULL, &mi_b);
+-                      if (!attr_b) {
+-                              err = -ENOENT;
+-                              goto out;
+-                      }
++                      if (!attr_b)
++                              return -ENOENT;
+ 
+                       attr = attr_b;
+                       le = le_b;
+diff --git a/fs/ntfs3/attrlist.c b/fs/ntfs3/attrlist.c
+index 81c22df27c725..0c6a68e71e7d4 100644
+--- a/fs/ntfs3/attrlist.c
++++ b/fs/ntfs3/attrlist.c
+@@ -52,7 +52,8 @@ int ntfs_load_attr_list(struct ntfs_inode *ni, struct ATTRIB 
*attr)
+ 
+       if (!attr->non_res) {
+               lsize = le32_to_cpu(attr->res.data_size);
+-              le = kmalloc(al_aligned(lsize), GFP_NOFS | __GFP_NOWARN);
++              /* attr is resident: lsize < record_size (1K or 4K) */
++              le = kvmalloc(al_aligned(lsize), GFP_KERNEL);
+               if (!le) {
+                       err = -ENOMEM;
+                       goto out;
+@@ -80,7 +81,17 @@ int ntfs_load_attr_list(struct ntfs_inode *ni, struct 
ATTRIB *attr)
+               if (err < 0)
+                       goto out;
+ 
+-              le = kmalloc(al_aligned(lsize), GFP_NOFS | __GFP_NOWARN);
++              /* attr is nonresident.
++               * The worst case:
++               * 1T (2^40) extremely fragmented file.
++               * cluster = 4K (2^12) => 2^28 fragments
++               * 2^9 fragments per one record => 2^19 records
++               * 2^5 bytes of ATTR_LIST_ENTRY per one record => 2^24 bytes.
++               *
++               * the result is 16M bytes per attribute list.
++               * Use kvmalloc to allocate in range [several Kbytes - dozen 
Mbytes]
++               */
++              le = kvmalloc(al_aligned(lsize), GFP_KERNEL);
+               if (!le) {
+                       err = -ENOMEM;
+                       goto out;
+diff --git a/fs/ntfs3/bitmap.c b/fs/ntfs3/bitmap.c
+index e0cdc91d88a85..c055bbdfe0f7c 100644
+--- a/fs/ntfs3/bitmap.c
++++ b/fs/ntfs3/bitmap.c
+@@ -662,7 +662,8 @@ int wnd_init(struct wnd_bitmap *wnd, struct super_block 
*sb, size_t nbits)
+               wnd->bits_last = wbits;
+ 
+       wnd->free_bits =
+-              kcalloc(wnd->nwnd, sizeof(u16), GFP_NOFS | __GFP_NOWARN);
++              kvmalloc_array(wnd->nwnd, sizeof(u16), GFP_KERNEL | __GFP_ZERO);
++
+       if (!wnd->free_bits)
+               return -ENOMEM;
+ 
+diff --git a/fs/ntfs3/dir.c b/fs/ntfs3/dir.c
+index fb438d6040409..d4d9f4ffb6d9a 100644
+--- a/fs/ntfs3/dir.c
++++ b/fs/ntfs3/dir.c
+@@ -309,7 +309,11 @@ static inline int ntfs_filldir(struct ntfs_sb_info *sbi, 
struct ntfs_inode *ni,
+               return 0;
+       }
+ 
+-      dt_type = (fname->dup.fa & FILE_ATTRIBUTE_DIRECTORY) ? DT_DIR : DT_REG;
++      /* NTFS: symlinks are "dir + reparse" or "file + reparse" */
++      if (fname->dup.fa & FILE_ATTRIBUTE_REPARSE_POINT)
++              dt_type = DT_LNK;
++      else
++              dt_type = (fname->dup.fa & FILE_ATTRIBUTE_DIRECTORY) ? DT_DIR : 
DT_REG;
+ 
+       return !dir_emit(ctx, (s8 *)name, name_len, ino, dt_type);
+ }
+diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
+index dda13e1f1b330..bb7e33c240737 100644
+--- a/fs/ntfs3/frecord.c
++++ b/fs/ntfs3/frecord.c
+@@ -2149,7 +2149,7 @@ out1:
+ 
+       for (i = 0; i < pages_per_frame; i++) {
+               pg = pages[i];
+-              if (i == idx)
++              if (i == idx || !pg)
+                       continue;
+               unlock_page(pg);
+               put_page(pg);
+@@ -3198,6 +3198,12 @@ static bool ni_update_parent(struct ntfs_inode *ni, 
struct NTFS_DUP_INFO *dup,
+               if (!fname || !memcmp(&fname->dup, dup, sizeof(fname->dup)))
+                       continue;
+ 
++              /* Check simple case when parent inode equals current inode. */
++              if (ino_get(&fname->home) == ni->vfs_inode.i_ino) {
++                      ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
++                      continue;
++              }
++
+               /* ntfs_iget5 may sleep. */
+               dir = ntfs_iget5(sb, &fname->home, NULL);
+               if (IS_ERR(dir)) {
+diff --git a/fs/ntfs3/fslog.c b/fs/ntfs3/fslog.c
+index 00faf41d8f97d..710cb5aa5a65b 100644
+--- a/fs/ntfs3/fslog.c
++++ b/fs/ntfs3/fslog.c
+@@ -2169,8 +2169,10 @@ file_is_valid:
+ 
+                       if (!page) {
+                               page = kmalloc(log->page_size, GFP_NOFS);
+-                              if (!page)
+-                                      return -ENOMEM;
++                              if (!page) {
++                                      err = -ENOMEM;
++                                      goto out;
++                              }
+                       }
+ 
+                       /*
+diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c
+index 9c0fc3a29d0c9..873b1434a9989 100644
+--- a/fs/ntfs3/fsntfs.c
++++ b/fs/ntfs3/fsntfs.c
+@@ -953,18 +953,11 @@ out:
+       if (err)
+               return err;
+ 
+-      mark_inode_dirty(&ni->vfs_inode);
++      mark_inode_dirty_sync(&ni->vfs_inode);
+       /* verify(!ntfs_update_mftmirr()); */
+ 
+-      /*
+-       * If we used wait=1, sync_inode_metadata waits for the io for the
+-       * inode to finish. It hangs when media is removed.
+-       * So wait=0 is sent down to sync_inode_metadata
+-       * and filemap_fdatawrite is used for the data blocks.
+-       */
+-      err = sync_inode_metadata(&ni->vfs_inode, 0);
+-      if (!err)
+-              err = filemap_fdatawrite(ni->vfs_inode.i_mapping);
++      /* write mft record on disk. */
++      err = _ni_write_inode(&ni->vfs_inode, 1);
+ 
+       return err;
+ }
+diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
+index 8e2fe0f69203b..6066eea3f61cb 100644
+--- a/fs/ntfs3/super.c
++++ b/fs/ntfs3/super.c
+@@ -1141,7 +1141,7 @@ static int ntfs_fill_super(struct super_block *sb, 
struct fs_context *fc)
+               goto put_inode_out;
+       }
+       bytes = inode->i_size;
+-      sbi->def_table = t = kmalloc(bytes, GFP_NOFS | __GFP_NOWARN);
++      sbi->def_table = t = kvmalloc(bytes, GFP_KERNEL);
+       if (!t) {
+               err = -ENOMEM;
+               goto put_inode_out;
+diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
+index 2ae4fd62e01c4..17e7e3145a058 100644
+--- a/include/drm/gpu_scheduler.h
++++ b/include/drm/gpu_scheduler.h
+@@ -55,8 +55,7 @@ enum drm_sched_priority {
+       DRM_SCHED_PRIORITY_HIGH,
+       DRM_SCHED_PRIORITY_KERNEL,
+ 
+-      DRM_SCHED_PRIORITY_COUNT,
+-      DRM_SCHED_PRIORITY_UNSET = -2
++      DRM_SCHED_PRIORITY_COUNT
+ };
+ 
+ /**
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index 95f33dadb2be2..b76ff08506181 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -568,6 +568,7 @@
+ #define PCI_DEVICE_ID_AMD_19H_M60H_DF_F3 0x14e3
+ #define PCI_DEVICE_ID_AMD_19H_M70H_DF_F3 0x14f3
+ #define PCI_DEVICE_ID_AMD_19H_M78H_DF_F3 0x12fb
++#define PCI_DEVICE_ID_AMD_VANGOGH_USB 0x163a
+ #define PCI_DEVICE_ID_AMD_CNB17H_F3   0x1703
+ #define PCI_DEVICE_ID_AMD_LANCE               0x2000
+ #define PCI_DEVICE_ID_AMD_LANCE_HOME  0x2001
+diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
+index aa2c4a7c4826d..a10428884e6a5 100644
+--- a/include/linux/power_supply.h
++++ b/include/linux/power_supply.h
+@@ -766,7 +766,7 @@ struct power_supply_battery_info {
+       int bti_resistance_tolerance;
+ };
+ 
+-extern struct atomic_notifier_head power_supply_notifier;
++extern struct blocking_notifier_head power_supply_notifier;
+ extern int power_supply_reg_notifier(struct notifier_block *nb);
+ extern void power_supply_unreg_notifier(struct notifier_block *nb);
+ #if IS_ENABLED(CONFIG_POWER_SUPPLY)
+diff --git a/io_uring/rw.c b/io_uring/rw.c
+index 0218fae12eddc..0133db648d8e9 100644
+--- a/io_uring/rw.c
++++ b/io_uring/rw.c
+@@ -326,7 +326,7 @@ static int kiocb_done(struct io_kiocb *req, ssize_t ret,
+       struct io_rw *rw = io_kiocb_to_cmd(req, struct io_rw);
+       unsigned final_ret = io_fixup_rw_res(req, ret);
+ 
+-      if (req->flags & REQ_F_CUR_POS)
++      if (ret >= 0 && req->flags & REQ_F_CUR_POS)
+               req->file->f_pos = rw->kiocb.ki_pos;
+       if (ret >= 0 && (rw->kiocb.ki_complete == io_complete_rw)) {
+               if (!__io_complete_rw_common(req, ret)) {
+diff --git a/mm/mempolicy.c b/mm/mempolicy.c
+index bfe2d1d50fbee..84e11c2caae42 100644
+--- a/mm/mempolicy.c
++++ b/mm/mempolicy.c
+@@ -1525,8 +1525,10 @@ SYSCALL_DEFINE4(set_mempolicy_home_node, unsigned long, 
start, unsigned long, le
+               /*
+                * Only update home node if there is an existing vma policy
+                */
+-              if (!new)
++              if (!new) {
++                      prev = vma;
+                       continue;
++              }
+ 
+               /*
+                * If any vma in the range got policy other than MPOL_BIND
+diff --git a/mm/mmap.c b/mm/mmap.c
+index 8ffe3f87f7ba9..c0f9575493deb 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -519,6 +519,7 @@ inline int vma_expand(struct ma_state *mas, struct 
vm_area_struct *vma,
+       struct anon_vma *anon_vma = vma->anon_vma;
+       struct file *file = vma->vm_file;
+       bool remove_next = false;
++      struct vm_area_struct *anon_dup = NULL;
+ 
+       if (next && (vma != next) && (end == next->vm_end)) {
+               remove_next = true;
+@@ -530,6 +531,8 @@ inline int vma_expand(struct ma_state *mas, struct 
vm_area_struct *vma,
+                       error = anon_vma_clone(vma, next);
+                       if (error)
+                               return error;
++
++                      anon_dup = vma;
+               }
+       }
+ 
+@@ -602,6 +605,9 @@ inline int vma_expand(struct ma_state *mas, struct 
vm_area_struct *vma,
+       return 0;
+ 
+ nomem:
++      if (anon_dup)
++              unlink_anon_vmas(anon_dup);
++
+       return -ENOMEM;
+ }
+ 
+@@ -629,6 +635,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long 
start,
+       int remove_next = 0;
+       MA_STATE(mas, &mm->mm_mt, 0, 0);
+       struct vm_area_struct *exporter = NULL, *importer = NULL;
++      struct vm_area_struct *anon_dup = NULL;
+ 
+       if (next && !insert) {
+               if (end >= next->vm_end) {
+@@ -709,11 +716,17 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned 
long start,
+                       error = anon_vma_clone(importer, exporter);
+                       if (error)
+                               return error;
++
++                      anon_dup = importer;
+               }
+       }
+ 
+-      if (mas_preallocate(&mas, vma, GFP_KERNEL))
++      if (mas_preallocate(&mas, vma, GFP_KERNEL)) {
++              if (anon_dup)
++                      unlink_anon_vmas(anon_dup);
++
+               return -ENOMEM;
++      }
+ 
+       vma_adjust_trans_huge(orig_vma, start, end, adjust_next);
+       if (file) {
+diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
+index 5e3dbe2652dbd..5c783199b4999 100644
+--- a/net/netfilter/nf_tables_api.c
++++ b/net/netfilter/nf_tables_api.c
+@@ -7324,6 +7324,16 @@ nla_put_failure:
+       return -1;
+ }
+ 
++static void audit_log_obj_reset(const struct nft_table *table,
++                              unsigned int base_seq, unsigned int nentries)
++{
++      char *buf = kasprintf(GFP_ATOMIC, "%s:%u", table->name, base_seq);
++
++      audit_log_nfcfg(buf, table->family, nentries,
++                      AUDIT_NFT_OP_OBJ_RESET, GFP_ATOMIC);
++      kfree(buf);
++}
++
+ struct nft_obj_filter {
+       char            *table;
+       u32             type;
+@@ -7338,8 +7348,10 @@ static int nf_tables_dump_obj(struct sk_buff *skb, 
struct netlink_callback *cb)
+       struct net *net = sock_net(skb->sk);
+       int family = nfmsg->nfgen_family;
+       struct nftables_pernet *nft_net;
++      unsigned int entries = 0;
+       struct nft_object *obj;
+       bool reset = false;
++      int rc = 0;
+ 
+       if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET)
+               reset = true;
+@@ -7352,6 +7364,7 @@ static int nf_tables_dump_obj(struct sk_buff *skb, 
struct netlink_callback *cb)
+               if (family != NFPROTO_UNSPEC && family != table->family)
+                       continue;
+ 
++              entries = 0;
+               list_for_each_entry_rcu(obj, &table->objects, list) {
+                       if (!nft_is_active(net, obj))
+                               goto cont;
+@@ -7367,34 +7380,27 @@ static int nf_tables_dump_obj(struct sk_buff *skb, 
struct netlink_callback *cb)
+                           filter->type != NFT_OBJECT_UNSPEC &&
+                           obj->ops->type->type != filter->type)
+                               goto cont;
+-                      if (reset) {
+-                              char *buf = kasprintf(GFP_ATOMIC,
+-                                                    "%s:%u",
+-                                                    table->name,
+-                                                    nft_net->base_seq);
+-
+-                              audit_log_nfcfg(buf,
+-                                              family,
+-                                              obj->handle,
+-                                              AUDIT_NFT_OP_OBJ_RESET,
+-                                              GFP_ATOMIC);
+-                              kfree(buf);
+-                      }
+ 
+-                      if (nf_tables_fill_obj_info(skb, net, 
NETLINK_CB(cb->skb).portid,
+-                                                  cb->nlh->nlmsg_seq,
+-                                                  NFT_MSG_NEWOBJ,
+-                                                  NLM_F_MULTI | NLM_F_APPEND,
+-                                                  table->family, table,
+-                                                  obj, reset) < 0)
+-                              goto done;
++                      rc = nf_tables_fill_obj_info(skb, net,
++                                                   NETLINK_CB(cb->skb).portid,
++                                                   cb->nlh->nlmsg_seq,
++                                                   NFT_MSG_NEWOBJ,
++                                                   NLM_F_MULTI | NLM_F_APPEND,
++                                                   table->family, table,
++                                                   obj, reset);
++                      if (rc < 0)
++                              break;
+ 
++                      entries++;
+                       nl_dump_check_consistent(cb, nlmsg_hdr(skb));
+ cont:
+                       idx++;
+               }
++              if (reset && entries)
++                      audit_log_obj_reset(table, nft_net->base_seq, entries);
++              if (rc < 0)
++                      break;
+       }
+-done:
+       rcu_read_unlock();
+ 
+       cb->args[0] = idx;
+@@ -7499,7 +7505,7 @@ static int nf_tables_getobj(struct sk_buff *skb, const 
struct nfnl_info *info,
+ 
+               audit_log_nfcfg(buf,
+                               family,
+-                              obj->handle,
++                              1,
+                               AUDIT_NFT_OP_OBJ_RESET,
+                               GFP_ATOMIC);
+               kfree(buf);
+diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
+index d97eb280cb2e8..c5ff699e30469 100644
+--- a/net/netfilter/nfnetlink_log.c
++++ b/net/netfilter/nfnetlink_log.c
+@@ -690,8 +690,8 @@ nfulnl_log_packet(struct net *net,
+       unsigned int plen = 0;
+       struct nfnl_log_net *log = nfnl_log_pernet(net);
+       const struct nfnl_ct_hook *nfnl_ct = NULL;
++      enum ip_conntrack_info ctinfo = 0;
+       struct nf_conn *ct = NULL;
+-      enum ip_conntrack_info ctinfo;
+ 
+       if (li_user && li_user->type == NF_LOG_TYPE_ULOG)
+               li = li_user;
+diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
+index ba93e2a6bdbb4..04448bfb4d3db 100644
+--- a/net/sched/cls_u32.c
++++ b/net/sched/cls_u32.c
+@@ -364,7 +364,7 @@ static int u32_init(struct tcf_proto *tp)
+       idr_init(&root_ht->handle_idr);
+ 
+       if (tp_c == NULL) {
+-              tp_c = kzalloc(struct_size(tp_c, hlist->ht, 1), GFP_KERNEL);
++              tp_c = kzalloc(sizeof(*tp_c), GFP_KERNEL);
+               if (tp_c == NULL) {
+                       kfree(root_ht);
+                       return -ENOBUFS;
+diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c
+index 2873420c9aca8..bc03b5692983c 100644
+--- a/sound/hda/intel-dsp-config.c
++++ b/sound/hda/intel-dsp-config.c
+@@ -343,6 +343,12 @@ static const struct config_entry config_table[] = {
+                                       DMI_MATCH(DMI_SYS_VENDOR, "Google"),
+                               }
+                       },
++                      {
++                              .ident = "Google firmware",
++                              .matches = {
++                                      DMI_MATCH(DMI_BIOS_VERSION, "Google"),
++                              }
++                      },
+                       {}
+               }
+       },
+diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
+index 620ecbfa4a7a8..f86fc7cd104d4 100644
+--- a/sound/soc/codecs/rt5645.c
++++ b/sound/soc/codecs/rt5645.c
+@@ -3251,6 +3251,8 @@ int rt5645_set_jack_detect(struct snd_soc_component 
*component,
+                               RT5645_GP1_PIN_IRQ, RT5645_GP1_PIN_IRQ);
+               regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1,
+                               RT5645_DIG_GATE_CTRL, RT5645_DIG_GATE_CTRL);
++              regmap_update_bits(rt5645->regmap, RT5645_DEPOP_M1,
++                              RT5645_HP_CB_MASK, RT5645_HP_CB_PU);
+       }
+       rt5645_irq(0, rt5645);
+ 
+diff --git a/sound/soc/codecs/tas2780.c b/sound/soc/codecs/tas2780.c
+index afdf0c863aa10..a2d27410bbefa 100644
+--- a/sound/soc/codecs/tas2780.c
++++ b/sound/soc/codecs/tas2780.c
+@@ -39,7 +39,7 @@ static void tas2780_reset(struct tas2780_priv *tas2780)
+               usleep_range(2000, 2050);
+       }
+ 
+-      snd_soc_component_write(tas2780->component, TAS2780_SW_RST,
++      ret = snd_soc_component_write(tas2780->component, TAS2780_SW_RST,
+                               TAS2780_RST);
+       if (ret)
+               dev_err(tas2780->dev, "%s:errCode:0x%x Reset error!\n",
+diff --git a/sound/soc/codecs/tlv320adc3xxx.c 
b/sound/soc/codecs/tlv320adc3xxx.c
+index 52bb557247244..6bd6da01aafac 100644
+--- a/sound/soc/codecs/tlv320adc3xxx.c
++++ b/sound/soc/codecs/tlv320adc3xxx.c
+@@ -293,7 +293,7 @@
+ #define ADC3XXX_BYPASS_RPGA           0x80
+ 
+ /* MICBIAS control bits */
+-#define ADC3XXX_MICBIAS_MASK          0x2
++#define ADC3XXX_MICBIAS_MASK          0x3
+ #define ADC3XXX_MICBIAS1_SHIFT                5
+ #define ADC3XXX_MICBIAS2_SHIFT                3
+ 
+@@ -1099,7 +1099,7 @@ static int adc3xxx_parse_dt_micbias(struct adc3xxx 
*adc3xxx,
+       unsigned int val;
+ 
+       if (!of_property_read_u32(np, propname, &val)) {
+-              if (val >= ADC3XXX_MICBIAS_AVDD) {
++              if (val > ADC3XXX_MICBIAS_AVDD) {
+                       dev_err(dev, "Invalid property value for '%s'\n", 
propname);
+                       return -EINVAL;
+               }
+diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
+index fbb682747f598..a8bc4e45816df 100644
+--- a/sound/soc/generic/simple-card.c
++++ b/sound/soc/generic/simple-card.c
+@@ -678,10 +678,12 @@ static int asoc_simple_probe(struct platform_device 
*pdev)
+               struct snd_soc_dai_link *dai_link = priv->dai_link;
+               struct simple_dai_props *dai_props = priv->dai_props;
+ 
++              ret = -EINVAL;
++
+               cinfo = dev->platform_data;
+               if (!cinfo) {
+                       dev_err(dev, "no info for asoc-simple-card\n");
+-                      return -EINVAL;
++                      goto err;
+               }
+ 
+               if (!cinfo->name ||
+@@ -690,7 +692,7 @@ static int asoc_simple_probe(struct platform_device *pdev)
+                   !cinfo->platform ||
+                   !cinfo->cpu_dai.name) {
+                       dev_err(dev, "insufficient asoc_simple_card_info 
settings\n");
+-                      return -EINVAL;
++                      goto err;
+               }
+ 
+               cpus                    = dai_link->cpus;
+diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c
+index 643fd1036d60b..05fb4e20e8a40 100644
+--- a/sound/soc/sof/sof-pci-dev.c
++++ b/sound/soc/sof/sof-pci-dev.c
+@@ -141,6 +141,13 @@ static const struct dmi_system_id 
community_key_platforms[] = {
+                       DMI_MATCH(DMI_PRODUCT_FAMILY, "Google"),
+               }
+       },
++      {
++              .ident = "Google firmware",
++              .callback = chromebook_use_community_key,
++              .matches = {
++                      DMI_MATCH(DMI_BIOS_VERSION, "Google"),
++              }
++      },
+       {},
+ };
+ 
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 6129a62316422..f458328f9ec42 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2218,6 +2218,8 @@ static const struct usb_audio_quirk_flags_table 
quirk_flags_table[] = {
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x2ab6, /* T+A devices */
+                  QUIRK_FLAG_DSD_RAW),
++      VENDOR_FLG(0x2afd, /* McIntosh Laboratory, Inc. */
++                 QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x2d87, /* Cayin device */
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3336, /* HEM devices */
+diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
+index 6612b00949e70..ca08e6dc8b232 100644
+--- a/tools/perf/util/evlist.c
++++ b/tools/perf/util/evlist.c
+@@ -252,6 +252,9 @@ static struct evsel *evlist__dummy_event(struct evlist 
*evlist)
+               .type   = PERF_TYPE_SOFTWARE,
+               .config = PERF_COUNT_SW_DUMMY,
+               .size   = sizeof(attr), /* to capture ABI version */
++              /* Avoid frequency mode for dummy events to avoid associated 
timers. */
++              .freq = 0,
++              .sample_period = 1,
+       };
+ 
+       return evsel__new_idx(&attr, evlist->core.nr_entries);
+@@ -278,8 +281,6 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, 
bool system_wide)
+       evsel->core.attr.exclude_kernel = 1;
+       evsel->core.attr.exclude_guest = 1;
+       evsel->core.attr.exclude_hv = 1;
+-      evsel->core.attr.freq = 0;
+-      evsel->core.attr.sample_period = 1;
+       evsel->core.system_wide = system_wide;
+       evsel->no_aux_samples = true;
+       evsel->name = strdup("dummy:u");
+diff --git a/tools/testing/selftests/netfilter/nft_audit.sh 
b/tools/testing/selftests/netfilter/nft_audit.sh
+index 5267c88496d51..99ed5bd6e8402 100755
+--- a/tools/testing/selftests/netfilter/nft_audit.sh
++++ b/tools/testing/selftests/netfilter/nft_audit.sh
+@@ -99,6 +99,12 @@ do_test 'nft add counter t1 c1' \
+ do_test 'nft add counter t2 c1; add counter t2 c2' \
+ 'table=t2 family=2 entries=2 op=nft_register_obj'
+ 
++for ((i = 3; i <= 500; i++)); do
++      echo "add counter t2 c$i"
++done >$rulefile
++do_test "nft -f $rulefile" \
++'table=t2 family=2 entries=498 op=nft_register_obj'
++
+ # adding/updating quotas
+ 
+ do_test 'nft add quota t1 q1 { 10 bytes }' \
+@@ -107,6 +113,12 @@ do_test 'nft add quota t1 q1 { 10 bytes }' \
+ do_test 'nft add quota t2 q1 { 10 bytes }; add quota t2 q2 { 10 bytes }' \
+ 'table=t2 family=2 entries=2 op=nft_register_obj'
+ 
++for ((i = 3; i <= 500; i++)); do
++      echo "add quota t2 q$i { 10 bytes }"
++done >$rulefile
++do_test "nft -f $rulefile" \
++'table=t2 family=2 entries=498 op=nft_register_obj'
++
+ # changing the quota value triggers obj update path
+ do_test 'nft add quota t1 q1 { 20 bytes }' \
+ 'table=t1 family=2 entries=1 op=nft_register_obj'
+@@ -156,6 +168,40 @@ done
+ do_test 'nft reset set t1 s' \
+ 'table=t1 family=2 entries=3 op=nft_reset_setelem'
+ 
++# resetting counters
++
++do_test 'nft reset counter t1 c1' \
++'table=t1 family=2 entries=1 op=nft_reset_obj'
++
++do_test 'nft reset counters t1' \
++'table=t1 family=2 entries=1 op=nft_reset_obj'
++
++do_test 'nft reset counters t2' \
++'table=t2 family=2 entries=342 op=nft_reset_obj
++table=t2 family=2 entries=158 op=nft_reset_obj'
++
++do_test 'nft reset counters' \
++'table=t1 family=2 entries=1 op=nft_reset_obj
++table=t2 family=2 entries=341 op=nft_reset_obj
++table=t2 family=2 entries=159 op=nft_reset_obj'
++
++# resetting quotas
++
++do_test 'nft reset quota t1 q1' \
++'table=t1 family=2 entries=1 op=nft_reset_obj'
++
++do_test 'nft reset quotas t1' \
++'table=t1 family=2 entries=1 op=nft_reset_obj'
++
++do_test 'nft reset quotas t2' \
++'table=t2 family=2 entries=315 op=nft_reset_obj
++table=t2 family=2 entries=185 op=nft_reset_obj'
++
++do_test 'nft reset quotas' \
++'table=t1 family=2 entries=1 op=nft_reset_obj
++table=t2 family=2 entries=314 op=nft_reset_obj
++table=t2 family=2 entries=186 op=nft_reset_obj'
++
+ # deleting rules
+ 
+ readarray -t handles < <(nft -a list chain t1 c1 | \

Reply via email to