commit:     3628dcd5601148478929fb78d0ecbb2f0bc0b637
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Sep 18 18:04:33 2024 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Sep 18 18:04:33 2024 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=3628dcd5

Linux patch 6.1.111

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

 0000_README              |    4 +
 1110_linux-6.1.111.patch | 2123 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2127 insertions(+)

diff --git a/0000_README b/0000_README
index 4375fd0f..f2f39ba5 100644
--- a/0000_README
+++ b/0000_README
@@ -487,6 +487,10 @@ Patch:  1109_linux-6.1.110.patch
 From:   https://www.kernel.org
 Desc:   Linux 6.1.110
 
+Patch:  1110_linux-6.1.111.patch
+From:   https://www.kernel.org
+Desc:   Linux 6.1.111
+
 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/1110_linux-6.1.111.patch b/1110_linux-6.1.111.patch
new file mode 100644
index 00000000..61cbffda
--- /dev/null
+++ b/1110_linux-6.1.111.patch
@@ -0,0 +1,2123 @@
+diff --git a/Makefile b/Makefile
+index 0e055579c7211f..d2ff3ff026255a 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 1
+-SUBLEVEL = 110
++SUBLEVEL = 111
+ EXTRAVERSION =
+ NAME = Curry Ramen
+ 
+diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock-pi-e.dts 
b/arch/arm64/boot/dts/rockchip/rk3328-rock-pi-e.dts
+index d9905a08c6ce86..66443d52cd34d8 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3328-rock-pi-e.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3328-rock-pi-e.dts
+@@ -332,7 +332,7 @@ led_pin: led-pin {
+ 
+       pmic {
+               pmic_int_l: pmic-int-l {
+-                      rockchip,pins = <2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;
++                      rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+       };
+ 
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi 
b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
+index 937a15005eb0e9..e089e0c26a72d1 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
+@@ -119,6 +119,22 @@ &emmc_phy {
+       drive-impedance-ohm = <33>;
+ };
+ 
++&gpio3 {
++      /*
++       * The Qseven BIOS_DISABLE signal on the RK3399-Q7 keeps the on-module
++       * eMMC and SPI flash powered-down initially (in fact it keeps the
++       * reset signal asserted). BIOS_DISABLE_OVERRIDE pin allows to override
++       * that signal so that eMMC and SPI can be used regardless of the state
++       * of the signal.
++       */
++      bios-disable-override-hog {
++              gpios = <RK_PD5 GPIO_ACTIVE_LOW>;
++              gpio-hog;
++              line-name = "bios_disable_override";
++              output-high;
++      };
++};
++
+ &gmac {
+       assigned-clocks = <&cru SCLK_RMII_SRC>;
+       assigned-clock-parents = <&clkin_gmac>;
+@@ -374,6 +390,7 @@ vdd_cpu_b: regulator@60 {
+ 
+ &i2s0 {
+       pinctrl-0 = <&i2s0_2ch_bus>;
++      pinctrl-1 = <&i2s0_2ch_bus_bclk_off>;
+       rockchip,playback-channels = <2>;
+       rockchip,capture-channels = <2>;
+       status = "okay";
+@@ -382,8 +399,8 @@ &i2s0 {
+ /*
+  * As Q7 does not specify neither a global nor a RX clock for I2S these
+  * signals are not used. Furthermore I2S0_LRCK_RX is used as GPIO.
+- * Therefore we have to redefine the i2s0_2ch_bus definition to prevent
+- * conflicts.
++ * Therefore we have to redefine the i2s0_2ch_bus and i2s0_2ch_bus_bclk_off
++ * definitions to prevent conflicts.
+  */
+ &i2s0_2ch_bus {
+       rockchip,pins =
+@@ -393,6 +410,14 @@ &i2s0_2ch_bus {
+               <3 RK_PD7 1 &pcfg_pull_none>;
+ };
+ 
++&i2s0_2ch_bus_bclk_off {
++      rockchip,pins =
++              <3 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>,
++              <3 RK_PD2 1 &pcfg_pull_none>,
++              <3 RK_PD3 1 &pcfg_pull_none>,
++              <3 RK_PD7 1 &pcfg_pull_none>;
++};
++
+ &io_domains {
+       status = "okay";
+       bt656-supply = <&vcc_1v8>;
+@@ -408,9 +433,14 @@ &pcie_clkreqn_cpm {
+ 
+ &pinctrl {
+       pinctrl-names = "default";
+-      pinctrl-0 = <&q7_thermal_pin>;
++      pinctrl-0 = <&q7_thermal_pin &bios_disable_override_hog_pin>;
+ 
+       gpios {
++              bios_disable_override_hog_pin: bios-disable-override-hog-pin {
++                      rockchip,pins =
++                              <3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_down>;
++              };
++
+               q7_thermal_pin: q7-thermal-pin {
+                       rockchip,pins =
+                               <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
+diff --git a/arch/powerpc/kernel/setup-common.c 
b/arch/powerpc/kernel/setup-common.c
+index 59b4ac57bfaf7d..56f6b958926d7c 100644
+--- a/arch/powerpc/kernel/setup-common.c
++++ b/arch/powerpc/kernel/setup-common.c
+@@ -948,6 +948,7 @@ void __init setup_arch(char **cmdline_p)
+       mem_topology_setup();
+       /* Set max_mapnr before paging_init() */
+       set_max_mapnr(max_pfn);
++      high_memory = (void *)__va(max_low_pfn * PAGE_SIZE);
+ 
+       /*
+        * 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 c7599b1737099a..40f4a31f001c2d 100644
+--- a/arch/powerpc/mm/mem.c
++++ b/arch/powerpc/mm/mem.c
+@@ -287,8 +287,6 @@ void __init mem_init(void)
+       swiotlb_init(ppc_swiotlb_enable, ppc_swiotlb_flags);
+ #endif
+ 
+-      high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
+-
+       kasan_late_init();
+ 
+       memblock_free_all();
+diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h
+index b58a5b782e5dcc..0be48441d0f295 100644
+--- a/drivers/cxl/cxlmem.h
++++ b/drivers/cxl/cxlmem.h
+@@ -293,7 +293,7 @@ enum cxl_opcode {
+                 0x3b, 0x3f, 0x17)
+ 
+ #define DEFINE_CXL_VENDOR_DEBUG_UUID                                          
 \
+-      UUID_INIT(0xe1819d9, 0x11a9, 0x400c, 0x81, 0x1f, 0xd6, 0x07, 0x19,     \
++      UUID_INIT(0x5e1819d9, 0x11a9, 0x400c, 0x81, 0x1f, 0xd6, 0x07, 0x19,     
\
+                 0x40, 0x3d, 0x86)
+ 
+ struct cxl_mbox_get_supported_logs {
+diff --git a/drivers/dma-buf/heaps/cma_heap.c 
b/drivers/dma-buf/heaps/cma_heap.c
+index 28fb04eccdd0ca..ec2a2a1560a472 100644
+--- a/drivers/dma-buf/heaps/cma_heap.c
++++ b/drivers/dma-buf/heaps/cma_heap.c
+@@ -165,7 +165,7 @@ static vm_fault_t cma_heap_vm_fault(struct vm_fault *vmf)
+       struct vm_area_struct *vma = vmf->vma;
+       struct cma_heap_buffer *buffer = vma->vm_private_data;
+ 
+-      if (vmf->pgoff > buffer->pagecount)
++      if (vmf->pgoff >= buffer->pagecount)
+               return VM_FAULT_SIGBUS;
+ 
+       vmf->page = buffer->pages[vmf->pgoff];
+diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h 
b/drivers/gpu/drm/amd/include/atomfirmware.h
+index 6ea596a8a03dfe..dea810c9b8fb1f 100644
+--- a/drivers/gpu/drm/amd/include/atomfirmware.h
++++ b/drivers/gpu/drm/amd/include/atomfirmware.h
+@@ -1005,7 +1005,7 @@ struct display_object_info_table_v1_4
+   uint16_t  supporteddevices;
+   uint8_t   number_of_path;
+   uint8_t   reserved;
+-  struct    atom_display_object_path_v2 display_path[8];   //the real number 
of this included in the structure is calculated by using the (whole structure 
size - the header size- number_of_path)/size of atom_display_object_path
++  struct    atom_display_object_path_v2 display_path[];   //the real number 
of this included in the structure is calculated by using the (whole structure 
size - the header size- number_of_path)/size of atom_display_object_path
+ };
+ 
+ struct display_object_info_table_v1_5 {
+@@ -1015,7 +1015,7 @@ struct display_object_info_table_v1_5 {
+       uint8_t reserved;
+       // the real number of this included in the structure is calculated by 
using the
+       // (whole structure size - the header size- number_of_path)/size of 
atom_display_object_path
+-      struct atom_display_object_path_v3 display_path[8];
++      struct atom_display_object_path_v3 display_path[];
+ };
+ 
+ /* 
+diff --git a/drivers/gpu/drm/drm_panel_orientation_quirks.c 
b/drivers/gpu/drm/drm_panel_orientation_quirks.c
+index 039da0d1a613b7..5b2506c65e9520 100644
+--- a/drivers/gpu/drm/drm_panel_orientation_quirks.c
++++ b/drivers/gpu/drm/drm_panel_orientation_quirks.c
+@@ -208,6 +208,18 @@ static const struct dmi_system_id orientation_data[] = {
+                 DMI_MATCH(DMI_BOARD_NAME, "KUN"),
+               },
+               .driver_data = (void *)&lcd1600x2560_rightside_up,
++      }, {    /* AYN Loki Max */
++              .matches = {
++                      DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ayn"),
++                      DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Loki Max"),
++              },
++              .driver_data = (void *)&lcd1080x1920_leftside_up,
++      }, {    /* AYN Loki Zero */
++              .matches = {
++                      DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ayn"),
++                      DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Loki Zero"),
++              },
++              .driver_data = (void *)&lcd1080x1920_leftside_up,
+       }, {    /* Chuwi HiBook (CWI514) */
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"),
+diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+index fecdc7ea78ebdf..56df4c4a8a1a84 100644
+--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
++++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+@@ -2603,9 +2603,9 @@ static void prepare_context_registration_info_v70(struct 
intel_context *ce,
+               ce->parallel.guc.wqi_tail = 0;
+               ce->parallel.guc.wqi_head = 0;
+ 
+-              wq_desc_offset = i915_ggtt_offset(ce->state) +
++              wq_desc_offset = (u64)i915_ggtt_offset(ce->state) +
+                                __get_parent_scratch_offset(ce);
+-              wq_base_offset = i915_ggtt_offset(ce->state) +
++              wq_base_offset = (u64)i915_ggtt_offset(ce->state) +
+                                __get_wq_offset(ce);
+               info->wq_desc_lo = lower_32_bits(wq_desc_offset);
+               info->wq_desc_hi = upper_32_bits(wq_desc_offset);
+diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c 
b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+index dfd4eec217859e..c4ad70eb1d923f 100644
+--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
++++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+@@ -99,7 +99,7 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const 
char *fwname,
+                * was a bad idea, and is only provided for backwards
+                * compatibility for older targets.
+                */
+-              return -ENODEV;
++              return -ENOENT;
+       }
+ 
+       if (IS_ERR(fw)) {
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 1395270a30cb0d..3359a24ca2419d 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -506,6 +506,8 @@
+ #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
+ 
+ #define I2C_VENDOR_ID_GOODIX          0x27c6
++#define I2C_DEVICE_ID_GOODIX_01E8     0x01e8
++#define I2C_DEVICE_ID_GOODIX_01E9     0x01e9
+ #define I2C_DEVICE_ID_GOODIX_01F0     0x01f0
+ 
+ #define USB_VENDOR_ID_GOODTOUCH               0x1aad
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 17efe6e2a1a44c..8ef41d6e71d421 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1442,6 +1442,30 @@ static int mt_event(struct hid_device *hid, struct 
hid_field *field,
+       return 0;
+ }
+ 
++static __u8 *mt_report_fixup(struct hid_device *hdev, __u8 *rdesc,
++                           unsigned int *size)
++{
++      if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
++          (hdev->product == I2C_DEVICE_ID_GOODIX_01E8 ||
++           hdev->product == I2C_DEVICE_ID_GOODIX_01E9)) {
++              if (rdesc[607] == 0x15) {
++                      rdesc[607] = 0x25;
++                      dev_info(
++                              &hdev->dev,
++                              "GT7868Q report descriptor fixup is 
applied.\n");
++              } else {
++                      dev_info(
++                              &hdev->dev,
++                              "The byte is not expected for fixing the report 
descriptor. \
++It's possible that the touchpad firmware is not suitable for applying the 
fix. \
++got: %x\n",
++                              rdesc[607]);
++              }
++      }
++
++      return rdesc;
++}
++
+ static void mt_report(struct hid_device *hid, struct hid_report *report)
+ {
+       struct mt_device *td = hid_get_drvdata(hid);
+@@ -2038,6 +2062,14 @@ static const struct hid_device_id mt_devices[] = {
+               MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
+                       USB_DEVICE_ID_GAMETEL_MT_MODE) },
+ 
++      /* Goodix GT7868Q devices */
++      { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
++        HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
++                   I2C_DEVICE_ID_GOODIX_01E8) },
++      { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
++        HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
++                   I2C_DEVICE_ID_GOODIX_01E8) },
++
+       /* GoodTouch panels */
+       { .driver_data = MT_CLS_NSMU,
+               MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
+@@ -2273,6 +2305,7 @@ static struct hid_driver mt_driver = {
+       .feature_mapping = mt_feature_mapping,
+       .usage_table = mt_grabbed_usages,
+       .event = mt_event,
++      .report_fixup = mt_report_fixup,
+       .report = mt_report,
+ #ifdef CONFIG_PM
+       .suspend = mt_suspend,
+diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h
+index 10fb17879f8ed9..0bbb8ae9341c31 100644
+--- a/drivers/hwmon/pmbus/pmbus.h
++++ b/drivers/hwmon/pmbus/pmbus.h
+@@ -409,6 +409,12 @@ enum pmbus_sensor_classes {
+ enum pmbus_data_format { linear = 0, ieee754, direct, vid };
+ enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv };
+ 
++/* PMBus revision identifiers */
++#define PMBUS_REV_10 0x00     /* PMBus revision 1.0 */
++#define PMBUS_REV_11 0x11     /* PMBus revision 1.1 */
++#define PMBUS_REV_12 0x22     /* PMBus revision 1.2 */
++#define PMBUS_REV_13 0x33     /* PMBus revision 1.3 */
++
+ struct pmbus_driver_info {
+       int pages;              /* Total number of pages */
+       u8 phases[PMBUS_PAGES]; /* Number of phases per page */
+diff --git a/drivers/hwmon/pmbus/pmbus_core.c 
b/drivers/hwmon/pmbus/pmbus_core.c
+index 7ec04934747e12..4b73c7b27e9aae 100644
+--- a/drivers/hwmon/pmbus/pmbus_core.c
++++ b/drivers/hwmon/pmbus/pmbus_core.c
+@@ -84,6 +84,8 @@ struct pmbus_data {
+ 
+       u32 flags;              /* from platform data */
+ 
++      u8 revision;    /* The PMBus revision the device is compliant with */
++
+       int exponent[PMBUS_PAGES];
+                               /* linear mode: exponent for output voltages */
+ 
+@@ -1093,9 +1095,14 @@ static int pmbus_get_boolean(struct i2c_client *client, 
struct pmbus_boolean *b,
+ 
+       regval = status & mask;
+       if (regval) {
+-              ret = _pmbus_write_byte_data(client, page, reg, regval);
+-              if (ret)
+-                      goto unlock;
++              if (data->revision >= PMBUS_REV_12) {
++                      ret = _pmbus_write_byte_data(client, page, reg, regval);
++                      if (ret)
++                              goto unlock;
++              } else {
++                      pmbus_clear_fault_page(client, page);
++              }
++
+       }
+       if (s1 && s2) {
+               s64 v1, v2;
+@@ -2639,6 +2646,10 @@ static int pmbus_init_common(struct i2c_client *client, 
struct pmbus_data *data,
+                       data->flags |= PMBUS_WRITE_PROTECTED | 
PMBUS_SKIP_STATUS_CHECK;
+       }
+ 
++      ret = i2c_smbus_read_byte_data(client, PMBUS_REVISION);
++      if (ret >= 0)
++              data->revision = ret;
++
+       if (data->info->pages)
+               pmbus_clear_faults(client);
+       else
+diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
+index b6749af4626205..d8c90a23a10144 100644
+--- a/drivers/input/mouse/synaptics.c
++++ b/drivers/input/mouse/synaptics.c
+@@ -189,6 +189,7 @@ static const char * const smbus_pnp_ids[] = {
+       "LEN2054", /* E480 */
+       "LEN2055", /* E580 */
+       "LEN2068", /* T14 Gen 1 */
++      "SYN3015", /* HP EliteBook 840 G2 */
+       "SYN3052", /* HP EliteBook 840 G4 */
+       "SYN3221", /* HP 15-ay000 */
+       "SYN323d", /* HP Spectre X360 13-w013dx */
+diff --git a/drivers/input/serio/i8042-acpipnpio.h 
b/drivers/input/serio/i8042-acpipnpio.h
+index e9eb9554dd7bdc..bad238f69a7afd 100644
+--- a/drivers/input/serio/i8042-acpipnpio.h
++++ b/drivers/input/serio/i8042-acpipnpio.h
+@@ -627,6 +627,15 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] 
__initconst = {
+               },
+               .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
++      {
++              /* Fujitsu Lifebook E756 */
++              /* https://bugzilla.suse.com/show_bug.cgi?id=1229056 */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E756"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
++      },
+       {
+               /* Fujitsu Lifebook E5411 */
+               .matches = {
+diff --git a/drivers/input/touchscreen/ads7846.c 
b/drivers/input/touchscreen/ads7846.c
+index bed68a68f3303c..1f206c75c6cff7 100644
+--- a/drivers/input/touchscreen/ads7846.c
++++ b/drivers/input/touchscreen/ads7846.c
+@@ -810,7 +810,7 @@ static void ads7846_read_state(struct ads7846 *ts)
+               m = &ts->msg[msg_idx];
+               error = spi_sync(ts->spi, m);
+               if (error) {
+-                      dev_err(&ts->spi->dev, "spi_sync --> %d\n", error);
++                      dev_err_ratelimited(&ts->spi->dev, "spi_sync --> %d\n", 
error);
+                       packet->ignore = true;
+                       return;
+               }
+diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
+index 696365f8f3b5fe..e0ffac93f900ee 100644
+--- a/drivers/md/dm-integrity.c
++++ b/drivers/md/dm-integrity.c
+@@ -2175,6 +2175,7 @@ static void dm_integrity_map_continue(struct 
dm_integrity_io *dio, bool from_map
+       struct bio *bio = dm_bio_from_per_bio_data(dio, sizeof(struct 
dm_integrity_io));
+       unsigned int journal_section, journal_entry;
+       unsigned int journal_read_pos;
++      sector_t recalc_sector;
+       struct completion read_comp;
+       bool discard_retried = false;
+       bool need_sync_io = ic->internal_hash && dio->op == REQ_OP_READ;
+@@ -2308,6 +2309,7 @@ static void dm_integrity_map_continue(struct 
dm_integrity_io *dio, bool from_map
+                       goto lock_retry;
+               }
+       }
++      recalc_sector = le64_to_cpu(ic->sb->recalc_sector);
+       spin_unlock_irq(&ic->endio_wait.lock);
+ 
+       if (unlikely(journal_read_pos != NOT_FOUND)) {
+@@ -2362,7 +2364,7 @@ static void dm_integrity_map_continue(struct 
dm_integrity_io *dio, bool from_map
+       if (need_sync_io) {
+               wait_for_completion_io(&read_comp);
+               if (ic->sb->flags & cpu_to_le32(SB_FLAG_RECALCULATING) &&
+-                  dio->range.logical_sector + dio->range.n_sectors > 
le64_to_cpu(ic->sb->recalc_sector))
++                  dio->range.logical_sector + dio->range.n_sectors > 
recalc_sector)
+                       goto skip_check;
+               if (ic->mode == 'B') {
+                       if (!block_bitmap_op(ic, ic->recalc_bitmap, 
dio->range.logical_sector,
+diff --git a/drivers/misc/eeprom/digsy_mtc_eeprom.c 
b/drivers/misc/eeprom/digsy_mtc_eeprom.c
+index f1f766b709657b..4eddc5ba1af9c8 100644
+--- a/drivers/misc/eeprom/digsy_mtc_eeprom.c
++++ b/drivers/misc/eeprom/digsy_mtc_eeprom.c
+@@ -42,7 +42,7 @@ static void digsy_mtc_op_finish(void *p)
+ }
+ 
+ struct eeprom_93xx46_platform_data digsy_mtc_eeprom_data = {
+-      .flags          = EE_ADDR8,
++      .flags          = EE_ADDR8 | EE_SIZE1K,
+       .prepare        = digsy_mtc_op_prepare,
+       .finish         = digsy_mtc_op_finish,
+ };
+diff --git a/drivers/net/ethernet/faraday/ftgmac100.h 
b/drivers/net/ethernet/faraday/ftgmac100.h
+index 63b3e02fab162e..4968f6f0bdbc25 100644
+--- a/drivers/net/ethernet/faraday/ftgmac100.h
++++ b/drivers/net/ethernet/faraday/ftgmac100.h
+@@ -84,7 +84,7 @@
+                           FTGMAC100_INT_RPKT_BUF)
+ 
+ /* All the interrupts we care about */
+-#define FTGMAC100_INT_ALL (FTGMAC100_INT_RPKT_BUF  |  \
++#define FTGMAC100_INT_ALL (FTGMAC100_INT_RXTX  |  \
+                          FTGMAC100_INT_BAD)
+ 
+ /*
+diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c 
b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+index 19506f2be4d401..6f5c22861dc9c2 100644
+--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
++++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+@@ -2275,12 +2275,12 @@ static netdev_tx_t
+ dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
+ {
+       const int queue_mapping = skb_get_queue_mapping(skb);
+-      bool nonlinear = skb_is_nonlinear(skb);
+       struct rtnl_link_stats64 *percpu_stats;
+       struct dpaa_percpu_priv *percpu_priv;
+       struct netdev_queue *txq;
+       struct dpaa_priv *priv;
+       struct qm_fd fd;
++      bool nonlinear;
+       int offset = 0;
+       int err = 0;
+ 
+@@ -2290,6 +2290,13 @@ dpaa_start_xmit(struct sk_buff *skb, struct net_device 
*net_dev)
+ 
+       qm_fd_clear_fd(&fd);
+ 
++      /* Packet data is always read as 32-bit words, so zero out any part of
++       * the skb which might be sent if we have to pad the packet
++       */
++      if (__skb_put_padto(skb, ETH_ZLEN, false))
++              goto enomem;
++
++      nonlinear = skb_is_nonlinear(skb);
+       if (!nonlinear) {
+               /* We're going to store the skb backpointer at the beginning
+                * of the data buffer, so we need a privately owned skb
+diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c 
b/drivers/net/ethernet/intel/ice/ice_switch.c
+index 735f995a3a6879..dc4ce3bd412d2c 100644
+--- a/drivers/net/ethernet/intel/ice/ice_switch.c
++++ b/drivers/net/ethernet/intel/ice/ice_switch.c
+@@ -3061,7 +3061,7 @@ ice_add_update_vsi_list(struct ice_hw *hw,
+ 
+               /* A rule already exists with the new VSI being added */
+               if (test_bit(vsi_handle, m_entry->vsi_list_info->vsi_map))
+-                      return 0;
++                      return -EEXIST;
+ 
+               /* Update the previously created VSI list set with
+                * the new VSI ID passed in
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
+index 76bd41058f3a9b..f2f719a952f8d5 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -34,6 +34,7 @@
+ #include <linux/bpf_trace.h>
+ #include <linux/pm_runtime.h>
+ #include <linux/etherdevice.h>
++#include <linux/lockdep.h>
+ #ifdef CONFIG_IGB_DCA
+ #include <linux/dca.h>
+ #endif
+@@ -2915,8 +2916,11 @@ static int igb_xdp(struct net_device *dev, struct 
netdev_bpf *xdp)
+       }
+ }
+ 
++/* This function assumes __netif_tx_lock is held by the caller. */
+ static void igb_xdp_ring_update_tail(struct igb_ring *ring)
+ {
++      lockdep_assert_held(&txring_txq(ring)->_xmit_lock);
++
+       /* Force memory writes to complete before letting h/w know there
+        * are new descriptors to fetch.
+        */
+@@ -3001,11 +3005,11 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
+               nxmit++;
+       }
+ 
+-      __netif_tx_unlock(nq);
+-
+       if (unlikely(flags & XDP_XMIT_FLUSH))
+               igb_xdp_ring_update_tail(tx_ring);
+ 
++      __netif_tx_unlock(nq);
++
+       return nxmit;
+ }
+ 
+@@ -8829,12 +8833,14 @@ static void igb_put_rx_buffer(struct igb_ring *rx_ring,
+ 
+ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
+ {
++      unsigned int total_bytes = 0, total_packets = 0;
+       struct igb_adapter *adapter = q_vector->adapter;
+       struct igb_ring *rx_ring = q_vector->rx.ring;
+-      struct sk_buff *skb = rx_ring->skb;
+-      unsigned int total_bytes = 0, total_packets = 0;
+       u16 cleaned_count = igb_desc_unused(rx_ring);
++      struct sk_buff *skb = rx_ring->skb;
++      int cpu = smp_processor_id();
+       unsigned int xdp_xmit = 0;
++      struct netdev_queue *nq;
+       struct xdp_buff xdp;
+       u32 frame_sz = 0;
+       int rx_buf_pgcnt;
+@@ -8962,7 +8968,10 @@ static int igb_clean_rx_irq(struct igb_q_vector 
*q_vector, const int budget)
+       if (xdp_xmit & IGB_XDP_TX) {
+               struct igb_ring *tx_ring = igb_xdp_tx_queue_mapping(adapter);
+ 
++              nq = txring_txq(tx_ring);
++              __netif_tx_lock(nq, cpu);
+               igb_xdp_ring_update_tail(tx_ring);
++              __netif_tx_unlock(nq);
+       }
+ 
+       u64_stats_update_begin(&rx_ring->rx_syncp);
+diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c
+index 1732ec3c3dbdc4..a718207988f2c4 100644
+--- a/drivers/net/ethernet/jme.c
++++ b/drivers/net/ethernet/jme.c
+@@ -946,15 +946,13 @@ jme_udpsum(struct sk_buff *skb)
+       if (skb->protocol != htons(ETH_P_IP))
+               return csum;
+       skb_set_network_header(skb, ETH_HLEN);
+-      if ((ip_hdr(skb)->protocol != IPPROTO_UDP) ||
+-          (skb->len < (ETH_HLEN +
+-                      (ip_hdr(skb)->ihl << 2) +
+-                      sizeof(struct udphdr)))) {
++
++      if (ip_hdr(skb)->protocol != IPPROTO_UDP ||
++          skb->len < (ETH_HLEN + ip_hdrlen(skb) + sizeof(struct udphdr))) {
+               skb_reset_network_header(skb);
+               return csum;
+       }
+-      skb_set_transport_header(skb,
+-                      ETH_HLEN + (ip_hdr(skb)->ihl << 2));
++      skb_set_transport_header(skb, ETH_HLEN + ip_hdrlen(skb));
+       csum = udp_hdr(skb)->check;
+       skb_reset_transport_header(skb);
+       skb_reset_network_header(skb);
+diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h 
b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
+index a3ae21398ca74e..fc0f3398a556bb 100644
+--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
++++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
+@@ -286,6 +286,21 @@ struct nix_mark_format {
+       u32 *cfg;
+ };
+ 
++/* smq(flush) to tl1 cir/pir info */
++struct nix_smq_tree_ctx {
++      u16 schq;
++      u64 cir_off;
++      u64 cir_val;
++      u64 pir_off;
++      u64 pir_val;
++};
++
++/* smq flush context */
++struct nix_smq_flush_ctx {
++      int smq;
++      struct nix_smq_tree_ctx smq_tree_ctx[NIX_TXSCH_LVL_CNT];
++};
++
+ struct npc_pkind {
+       struct rsrc_bmap rsrc;
+       u32     *pfchan_map;
+diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c 
b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
+index ef526408b0bd28..7ed0eb9bd4ed2f 100644
+--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
++++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
+@@ -2121,13 +2121,127 @@ int rvu_mbox_handler_nix_txsch_alloc(struct rvu *rvu,
+       return rc;
+ }
+ 
++static void nix_smq_flush_fill_ctx(struct rvu *rvu, int blkaddr, int smq,
++                                 struct nix_smq_flush_ctx *smq_flush_ctx)
++{
++      struct nix_smq_tree_ctx *smq_tree_ctx;
++      u64 parent_off, regval;
++      u16 schq;
++      int lvl;
++
++      smq_flush_ctx->smq = smq;
++
++      schq = smq;
++      for (lvl = NIX_TXSCH_LVL_SMQ; lvl <= NIX_TXSCH_LVL_TL1; lvl++) {
++              smq_tree_ctx = &smq_flush_ctx->smq_tree_ctx[lvl];
++              smq_tree_ctx->schq = schq;
++              if (lvl == NIX_TXSCH_LVL_TL1) {
++                      smq_tree_ctx->cir_off = NIX_AF_TL1X_CIR(schq);
++                      smq_tree_ctx->pir_off = 0;
++                      smq_tree_ctx->pir_val = 0;
++                      parent_off = 0;
++              } else if (lvl == NIX_TXSCH_LVL_TL2) {
++                      smq_tree_ctx->cir_off = NIX_AF_TL2X_CIR(schq);
++                      smq_tree_ctx->pir_off = NIX_AF_TL2X_PIR(schq);
++                      parent_off = NIX_AF_TL2X_PARENT(schq);
++              } else if (lvl == NIX_TXSCH_LVL_TL3) {
++                      smq_tree_ctx->cir_off = NIX_AF_TL3X_CIR(schq);
++                      smq_tree_ctx->pir_off = NIX_AF_TL3X_PIR(schq);
++                      parent_off = NIX_AF_TL3X_PARENT(schq);
++              } else if (lvl == NIX_TXSCH_LVL_TL4) {
++                      smq_tree_ctx->cir_off = NIX_AF_TL4X_CIR(schq);
++                      smq_tree_ctx->pir_off = NIX_AF_TL4X_PIR(schq);
++                      parent_off = NIX_AF_TL4X_PARENT(schq);
++              } else if (lvl == NIX_TXSCH_LVL_MDQ) {
++                      smq_tree_ctx->cir_off = NIX_AF_MDQX_CIR(schq);
++                      smq_tree_ctx->pir_off = NIX_AF_MDQX_PIR(schq);
++                      parent_off = NIX_AF_MDQX_PARENT(schq);
++              }
++              /* save cir/pir register values */
++              smq_tree_ctx->cir_val = rvu_read64(rvu, blkaddr, 
smq_tree_ctx->cir_off);
++              if (smq_tree_ctx->pir_off)
++                      smq_tree_ctx->pir_val = rvu_read64(rvu, blkaddr, 
smq_tree_ctx->pir_off);
++
++              /* get parent txsch node */
++              if (parent_off) {
++                      regval = rvu_read64(rvu, blkaddr, parent_off);
++                      schq = (regval >> 16) & 0x1FF;
++              }
++      }
++}
++
++static void nix_smq_flush_enadis_xoff(struct rvu *rvu, int blkaddr,
++                                    struct nix_smq_flush_ctx *smq_flush_ctx, 
bool enable)
++{
++      struct nix_txsch *txsch;
++      struct nix_hw *nix_hw;
++      int tl2, tl2_schq;
++      u64 regoff;
++
++      nix_hw = get_nix_hw(rvu->hw, blkaddr);
++      if (!nix_hw)
++              return;
++
++      /* loop through all TL2s with matching PF_FUNC */
++      txsch = &nix_hw->txsch[NIX_TXSCH_LVL_TL2];
++      tl2_schq = smq_flush_ctx->smq_tree_ctx[NIX_TXSCH_LVL_TL2].schq;
++      for (tl2 = 0; tl2 < txsch->schq.max; tl2++) {
++              /* skip the smq(flush) TL2 */
++              if (tl2 == tl2_schq)
++                      continue;
++              /* skip unused TL2s */
++              if (TXSCH_MAP_FLAGS(txsch->pfvf_map[tl2]) & NIX_TXSCHQ_FREE)
++                      continue;
++              /* skip if PF_FUNC doesn't match */
++              if ((TXSCH_MAP_FUNC(txsch->pfvf_map[tl2]) & 
~RVU_PFVF_FUNC_MASK) !=
++                  (TXSCH_MAP_FUNC(txsch->pfvf_map[tl2_schq] &
++                                  ~RVU_PFVF_FUNC_MASK)))
++                      continue;
++              /* enable/disable XOFF */
++              regoff = NIX_AF_TL2X_SW_XOFF(tl2);
++              if (enable)
++                      rvu_write64(rvu, blkaddr, regoff, 0x1);
++              else
++                      rvu_write64(rvu, blkaddr, regoff, 0x0);
++      }
++}
++
++static void nix_smq_flush_enadis_rate(struct rvu *rvu, int blkaddr,
++                                    struct nix_smq_flush_ctx *smq_flush_ctx, 
bool enable)
++{
++      u64 cir_off, pir_off, cir_val, pir_val;
++      struct nix_smq_tree_ctx *smq_tree_ctx;
++      int lvl;
++
++      for (lvl = NIX_TXSCH_LVL_SMQ; lvl <= NIX_TXSCH_LVL_TL1; lvl++) {
++              smq_tree_ctx = &smq_flush_ctx->smq_tree_ctx[lvl];
++              cir_off = smq_tree_ctx->cir_off;
++              cir_val = smq_tree_ctx->cir_val;
++              pir_off = smq_tree_ctx->pir_off;
++              pir_val = smq_tree_ctx->pir_val;
++
++              if (enable) {
++                      rvu_write64(rvu, blkaddr, cir_off, cir_val);
++                      if (lvl != NIX_TXSCH_LVL_TL1)
++                              rvu_write64(rvu, blkaddr, pir_off, pir_val);
++              } else {
++                      rvu_write64(rvu, blkaddr, cir_off, 0x0);
++                      if (lvl != NIX_TXSCH_LVL_TL1)
++                              rvu_write64(rvu, blkaddr, pir_off, 0x0);
++              }
++      }
++}
++
+ static int nix_smq_flush(struct rvu *rvu, int blkaddr,
+                        int smq, u16 pcifunc, int nixlf)
+ {
++      struct nix_smq_flush_ctx *smq_flush_ctx;
++      int err, restore_tx_en = 0, i;
+       int pf = rvu_get_pf(pcifunc);
+       u8 cgx_id = 0, lmac_id = 0;
+-      int err, restore_tx_en = 0;
+-      u64 cfg;
++      u16 tl2_tl3_link_schq;
++      u8 link, link_level;
++      u64 cfg, bmap = 0;
+ 
+       /* enable cgx tx if disabled */
+       if (is_pf_cgxmapped(rvu, pf)) {
+@@ -2136,22 +2250,69 @@ static int nix_smq_flush(struct rvu *rvu, int blkaddr,
+                                                  lmac_id, true);
+       }
+ 
+-      cfg = rvu_read64(rvu, blkaddr, NIX_AF_SMQX_CFG(smq));
+-      /* Do SMQ flush and set enqueue xoff */
+-      cfg |= BIT_ULL(50) | BIT_ULL(49);
+-      rvu_write64(rvu, blkaddr, NIX_AF_SMQX_CFG(smq), cfg);
++      /* XOFF all TL2s whose parent TL1 matches SMQ tree TL1 */
++      smq_flush_ctx = kzalloc(sizeof(*smq_flush_ctx), GFP_KERNEL);
++      if (!smq_flush_ctx)
++              return -ENOMEM;
++      nix_smq_flush_fill_ctx(rvu, blkaddr, smq, smq_flush_ctx);
++      nix_smq_flush_enadis_xoff(rvu, blkaddr, smq_flush_ctx, true);
++      nix_smq_flush_enadis_rate(rvu, blkaddr, smq_flush_ctx, false);
+ 
+       /* Disable backpressure from physical link,
+        * otherwise SMQ flush may stall.
+        */
+       rvu_cgx_enadis_rx_bp(rvu, pf, false);
+ 
++      link_level = rvu_read64(rvu, blkaddr, NIX_AF_PSE_CHANNEL_LEVEL) & 0x01 ?
++                      NIX_TXSCH_LVL_TL3 : NIX_TXSCH_LVL_TL2;
++      tl2_tl3_link_schq = smq_flush_ctx->smq_tree_ctx[link_level].schq;
++      link = smq_flush_ctx->smq_tree_ctx[NIX_TXSCH_LVL_TL1].schq;
++
++      /* SMQ set enqueue xoff */
++      cfg = rvu_read64(rvu, blkaddr, NIX_AF_SMQX_CFG(smq));
++      cfg |= BIT_ULL(50);
++      rvu_write64(rvu, blkaddr, NIX_AF_SMQX_CFG(smq), cfg);
++
++      /* Clear all NIX_AF_TL3_TL2_LINK_CFG[ENA] for the TL3/TL2 queue */
++      for (i = 0; i < (rvu->hw->cgx_links + rvu->hw->lbk_links); i++) {
++              cfg = rvu_read64(rvu, blkaddr,
++                               NIX_AF_TL3_TL2X_LINKX_CFG(tl2_tl3_link_schq, 
link));
++              if (!(cfg & BIT_ULL(12)))
++                      continue;
++              bmap |= (1 << i);
++              cfg &= ~BIT_ULL(12);
++              rvu_write64(rvu, blkaddr,
++                          NIX_AF_TL3_TL2X_LINKX_CFG(tl2_tl3_link_schq, link), 
cfg);
++      }
++
++      /* Do SMQ flush and set enqueue xoff */
++      cfg = rvu_read64(rvu, blkaddr, NIX_AF_SMQX_CFG(smq));
++      cfg |= BIT_ULL(50) | BIT_ULL(49);
++      rvu_write64(rvu, blkaddr, NIX_AF_SMQX_CFG(smq), cfg);
++
+       /* Wait for flush to complete */
+       err = rvu_poll_reg(rvu, blkaddr,
+                          NIX_AF_SMQX_CFG(smq), BIT_ULL(49), true);
+       if (err)
+-              dev_err(rvu->dev,
+-                      "NIXLF%d: SMQ%d flush failed\n", nixlf, smq);
++              dev_info(rvu->dev,
++                       "NIXLF%d: SMQ%d flush failed, txlink might be busy\n",
++                       nixlf, smq);
++
++      /* Set NIX_AF_TL3_TL2_LINKX_CFG[ENA] for the TL3/TL2 queue */
++      for (i = 0; i < (rvu->hw->cgx_links + rvu->hw->lbk_links); i++) {
++              if (!(bmap & (1 << i)))
++                      continue;
++              cfg = rvu_read64(rvu, blkaddr,
++                               NIX_AF_TL3_TL2X_LINKX_CFG(tl2_tl3_link_schq, 
link));
++              cfg |= BIT_ULL(12);
++              rvu_write64(rvu, blkaddr,
++                          NIX_AF_TL3_TL2X_LINKX_CFG(tl2_tl3_link_schq, link), 
cfg);
++      }
++
++      /* clear XOFF on TL2s */
++      nix_smq_flush_enadis_rate(rvu, blkaddr, smq_flush_ctx, true);
++      nix_smq_flush_enadis_xoff(rvu, blkaddr, smq_flush_ctx, false);
++      kfree(smq_flush_ctx);
+ 
+       rvu_cgx_enadis_rx_bp(rvu, pf, true);
+       /* restore cgx tx state */
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+index 3ee61987266c49..8cb127a6fabfed 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+@@ -136,6 +136,10 @@ void mlx5e_build_ptys2ethtool_map(void)
+                                      
ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT);
+       MLX5_BUILD_PTYS2ETHTOOL_CONFIG(MLX5E_100GBASE_LR4, legacy,
+                                      
ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT);
++      MLX5_BUILD_PTYS2ETHTOOL_CONFIG(MLX5E_100BASE_TX, legacy,
++                                     ETHTOOL_LINK_MODE_100baseT_Full_BIT);
++      MLX5_BUILD_PTYS2ETHTOOL_CONFIG(MLX5E_1000BASE_T, legacy,
++                                     ETHTOOL_LINK_MODE_1000baseT_Full_BIT);
+       MLX5_BUILD_PTYS2ETHTOOL_CONFIG(MLX5E_10GBASE_T, legacy,
+                                      ETHTOOL_LINK_MODE_10000baseT_Full_BIT);
+       MLX5_BUILD_PTYS2ETHTOOL_CONFIG(MLX5E_25GBASE_CR, legacy,
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c 
b/drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c
+index fabe49a35a5c96..a47e93caccb10c 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c
+@@ -321,7 +321,7 @@ int mlx5_eswitch_set_vepa(struct mlx5_eswitch *esw, u8 
setting)
+               return -EPERM;
+ 
+       mutex_lock(&esw->state_lock);
+-      if (esw->mode != MLX5_ESWITCH_LEGACY) {
++      if (esw->mode != MLX5_ESWITCH_LEGACY || !mlx5_esw_is_fdb_created(esw)) {
+               err = -EOPNOTSUPP;
+               goto out;
+       }
+@@ -341,7 +341,7 @@ int mlx5_eswitch_get_vepa(struct mlx5_eswitch *esw, u8 
*setting)
+       if (!mlx5_esw_allowed(esw))
+               return -EPERM;
+ 
+-      if (esw->mode != MLX5_ESWITCH_LEGACY)
++      if (esw->mode != MLX5_ESWITCH_LEGACY || !mlx5_esw_is_fdb_created(esw))
+               return -EOPNOTSUPP;
+ 
+       *setting = esw->fdb_table.legacy.vepa_uplink_rule ? 1 : 0;
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c 
b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c
+index 75015d370922e6..a7400ed4956e6a 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c
+@@ -311,6 +311,25 @@ static int esw_qos_set_group_max_rate(struct mlx5_eswitch 
*esw,
+       return err;
+ }
+ 
++static bool esw_qos_element_type_supported(struct mlx5_core_dev *dev, int 
type)
++{
++      switch (type) {
++      case SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR:
++              return MLX5_CAP_QOS(dev, esw_element_type) &
++                     ELEMENT_TYPE_CAP_MASK_TSAR;
++      case SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT:
++              return MLX5_CAP_QOS(dev, esw_element_type) &
++                     ELEMENT_TYPE_CAP_MASK_VPORT;
++      case SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT_TC:
++              return MLX5_CAP_QOS(dev, esw_element_type) &
++                     ELEMENT_TYPE_CAP_MASK_VPORT_TC;
++      case SCHEDULING_CONTEXT_ELEMENT_TYPE_PARA_VPORT_TC:
++              return MLX5_CAP_QOS(dev, esw_element_type) &
++                     ELEMENT_TYPE_CAP_MASK_PARA_VPORT_TC;
++      }
++      return false;
++}
++
+ static int esw_qos_vport_create_sched_element(struct mlx5_eswitch *esw,
+                                             struct mlx5_vport *vport,
+                                             u32 max_rate, u32 bw_share)
+@@ -322,6 +341,9 @@ static int esw_qos_vport_create_sched_element(struct 
mlx5_eswitch *esw,
+       void *vport_elem;
+       int err;
+ 
++      if (!esw_qos_element_type_supported(dev, 
SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT))
++              return -EOPNOTSUPP;
++
+       parent_tsar_ix = group ? group->tsar_ix : esw->qos.root_tsar_ix;
+       MLX5_SET(scheduling_context, sched_ctx, element_type,
+                SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT);
+@@ -420,6 +442,7 @@ __esw_qos_create_rate_group(struct mlx5_eswitch *esw, 
struct netlink_ext_ack *ex
+ {
+       u32 tsar_ctx[MLX5_ST_SZ_DW(scheduling_context)] = {};
+       struct mlx5_esw_rate_group *group;
++      __be32 *attr;
+       u32 divider;
+       int err;
+ 
+@@ -427,6 +450,12 @@ __esw_qos_create_rate_group(struct mlx5_eswitch *esw, 
struct netlink_ext_ack *ex
+       if (!group)
+               return ERR_PTR(-ENOMEM);
+ 
++      MLX5_SET(scheduling_context, tsar_ctx, element_type,
++               SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR);
++
++      attr = MLX5_ADDR_OF(scheduling_context, tsar_ctx, element_attributes);
++      *attr = cpu_to_be32(TSAR_ELEMENT_TSAR_TYPE_DWRR << 16);
++
+       MLX5_SET(scheduling_context, tsar_ctx, parent_element_id,
+                esw->qos.root_tsar_ix);
+       err = mlx5_create_scheduling_element_cmd(esw->dev,
+@@ -525,25 +554,6 @@ static int esw_qos_destroy_rate_group(struct mlx5_eswitch 
*esw,
+       return err;
+ }
+ 
+-static bool esw_qos_element_type_supported(struct mlx5_core_dev *dev, int 
type)
+-{
+-      switch (type) {
+-      case SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR:
+-              return MLX5_CAP_QOS(dev, esw_element_type) &
+-                     ELEMENT_TYPE_CAP_MASK_TASR;
+-      case SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT:
+-              return MLX5_CAP_QOS(dev, esw_element_type) &
+-                     ELEMENT_TYPE_CAP_MASK_VPORT;
+-      case SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT_TC:
+-              return MLX5_CAP_QOS(dev, esw_element_type) &
+-                     ELEMENT_TYPE_CAP_MASK_VPORT_TC;
+-      case SCHEDULING_CONTEXT_ELEMENT_TYPE_PARA_VPORT_TC:
+-              return MLX5_CAP_QOS(dev, esw_element_type) &
+-                     ELEMENT_TYPE_CAP_MASK_PARA_VPORT_TC;
+-      }
+-      return false;
+-}
+-
+ static int esw_qos_create(struct mlx5_eswitch *esw, struct netlink_ext_ack 
*extack)
+ {
+       u32 tsar_ctx[MLX5_ST_SZ_DW(scheduling_context)] = {};
+@@ -554,7 +564,8 @@ static int esw_qos_create(struct mlx5_eswitch *esw, struct 
netlink_ext_ack *exta
+       if (!MLX5_CAP_GEN(dev, qos) || !MLX5_CAP_QOS(dev, esw_scheduling))
+               return -EOPNOTSUPP;
+ 
+-      if (!esw_qos_element_type_supported(dev, 
SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR))
++      if (!esw_qos_element_type_supported(dev, 
SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR) ||
++          !(MLX5_CAP_QOS(dev, esw_tsar_type) & TSAR_TYPE_CAP_MASK_DWRR))
+               return -EOPNOTSUPP;
+ 
+       MLX5_SET(scheduling_context, tsar_ctx, element_type,
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c 
b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+index 67849b1c0bb71e..76af59cfdd0e64 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+@@ -2025,6 +2025,7 @@ static const struct pci_device_id mlx5_core_pci_table[] 
= {
+       { PCI_VDEVICE(MELLANOX, 0x101f) },                      /* ConnectX-6 
LX */
+       { PCI_VDEVICE(MELLANOX, 0x1021) },                      /* ConnectX-7 */
+       { PCI_VDEVICE(MELLANOX, 0x1023) },                      /* ConnectX-8 */
++      { PCI_VDEVICE(MELLANOX, 0x1025) },                      /* ConnectX-9 */
+       { PCI_VDEVICE(MELLANOX, 0xa2d2) },                      /* BlueField 
integrated ConnectX-5 network controller */
+       { PCI_VDEVICE(MELLANOX, 0xa2d3), MLX5_PCI_DEV_IS_VF},   /* BlueField 
integrated ConnectX-5 network controller VF */
+       { PCI_VDEVICE(MELLANOX, 0xa2d6) },                      /* BlueField-2 
integrated ConnectX-6 Dx network controller */
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/qos.c 
b/drivers/net/ethernet/mellanox/mlx5/core/qos.c
+index 8bce730b5c5bef..db2bd3ad63ba36 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/qos.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/qos.c
+@@ -28,6 +28,9 @@ int mlx5_qos_create_leaf_node(struct mlx5_core_dev *mdev, 
u32 parent_id,
+ {
+       u32 sched_ctx[MLX5_ST_SZ_DW(scheduling_context)] = {0};
+ 
++      if (!(MLX5_CAP_QOS(mdev, nic_element_type) & 
ELEMENT_TYPE_CAP_MASK_QUEUE_GROUP))
++              return -EOPNOTSUPP;
++
+       MLX5_SET(scheduling_context, sched_ctx, parent_element_id, parent_id);
+       MLX5_SET(scheduling_context, sched_ctx, element_type,
+                SCHEDULING_CONTEXT_ELEMENT_TYPE_QUEUE_GROUP);
+@@ -44,6 +47,10 @@ int mlx5_qos_create_inner_node(struct mlx5_core_dev *mdev, 
u32 parent_id,
+       u32 sched_ctx[MLX5_ST_SZ_DW(scheduling_context)] = {0};
+       void *attr;
+ 
++      if (!(MLX5_CAP_QOS(mdev, nic_element_type) & 
ELEMENT_TYPE_CAP_MASK_TSAR) ||
++          !(MLX5_CAP_QOS(mdev, nic_tsar_type) & TSAR_TYPE_CAP_MASK_DWRR))
++              return -EOPNOTSUPP;
++
+       MLX5_SET(scheduling_context, sched_ctx, parent_element_id, parent_id);
+       MLX5_SET(scheduling_context, sched_ctx, element_type,
+                SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR);
+diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet.h 
b/drivers/net/ethernet/xilinx/xilinx_axienet.h
+index 503c32413474a2..deb94c26c605b0 100644
+--- a/drivers/net/ethernet/xilinx/xilinx_axienet.h
++++ b/drivers/net/ethernet/xilinx/xilinx_axienet.h
+@@ -419,6 +419,8 @@ struct axidma_bd {
+  * @tx_bytes: TX byte count for statistics
+  * @tx_stat_sync: Synchronization object for TX stats
+  * @dma_err_task: Work structure to process Axi DMA errors
++ * @stopping:   Set when @dma_err_task shouldn't do anything because we are
++ *              about to stop the device.
+  * @tx_irq:   Axidma TX IRQ number
+  * @rx_irq:   Axidma RX IRQ number
+  * @eth_irq:  Ethernet core IRQ number
+@@ -481,6 +483,7 @@ struct axienet_local {
+       struct u64_stats_sync tx_stat_sync;
+ 
+       struct work_struct dma_err_task;
++      bool stopping;
+ 
+       int tx_irq;
+       int rx_irq;
+diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c 
b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+index 59d1cfbf7d6b78..b631d80de33707 100644
+--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
++++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+@@ -1161,6 +1161,7 @@ static int axienet_open(struct net_device *ndev)
+       phylink_start(lp->phylink);
+ 
+       /* Enable worker thread for Axi DMA error handling */
++      lp->stopping = false;
+       INIT_WORK(&lp->dma_err_task, axienet_dma_err_handler);
+ 
+       napi_enable(&lp->napi_rx);
+@@ -1216,6 +1217,9 @@ static int axienet_stop(struct net_device *ndev)
+ 
+       dev_dbg(&ndev->dev, "axienet_close()\n");
+ 
++      WRITE_ONCE(lp->stopping, true);
++      flush_work(&lp->dma_err_task);
++
+       napi_disable(&lp->napi_tx);
+       napi_disable(&lp->napi_rx);
+ 
+@@ -1760,6 +1764,10 @@ static void axienet_dma_err_handler(struct work_struct 
*work)
+                                               dma_err_task);
+       struct net_device *ndev = lp->ndev;
+ 
++      /* Don't bother if we are going to stop anyway */
++      if (READ_ONCE(lp->stopping))
++              return;
++
+       napi_disable(&lp->napi_tx);
+       napi_disable(&lp->napi_rx);
+ 
+diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c
+index 897b979ec03c81..3b5fcaf0dd36db 100644
+--- a/drivers/net/phy/vitesse.c
++++ b/drivers/net/phy/vitesse.c
+@@ -237,16 +237,6 @@ static int vsc739x_config_init(struct phy_device *phydev)
+       return 0;
+ }
+ 
+-static int vsc73xx_config_aneg(struct phy_device *phydev)
+-{
+-      /* The VSC73xx switches does not like to be instructed to
+-       * do autonegotiation in any way, it prefers that you just go
+-       * with the power-on/reset defaults. Writing some registers will
+-       * just make autonegotiation permanently fail.
+-       */
+-      return 0;
+-}
+-
+ /* This adds a skew for both TX and RX clocks, so the skew should only be
+  * applied to "rgmii-id" interfaces. It may not work as expected
+  * on "rgmii-txid", "rgmii-rxid" or "rgmii" interfaces.
+@@ -444,7 +434,6 @@ static struct phy_driver vsc82xx_driver[] = {
+       .phy_id_mask    = 0x000ffff0,
+       /* PHY_GBIT_FEATURES */
+       .config_init    = vsc738x_config_init,
+-      .config_aneg    = vsc73xx_config_aneg,
+       .read_page      = vsc73xx_read_page,
+       .write_page     = vsc73xx_write_page,
+ }, {
+@@ -453,7 +442,6 @@ static struct phy_driver vsc82xx_driver[] = {
+       .phy_id_mask    = 0x000ffff0,
+       /* PHY_GBIT_FEATURES */
+       .config_init    = vsc738x_config_init,
+-      .config_aneg    = vsc73xx_config_aneg,
+       .read_page      = vsc73xx_read_page,
+       .write_page     = vsc73xx_write_page,
+ }, {
+@@ -462,7 +450,6 @@ static struct phy_driver vsc82xx_driver[] = {
+       .phy_id_mask    = 0x000ffff0,
+       /* PHY_GBIT_FEATURES */
+       .config_init    = vsc739x_config_init,
+-      .config_aneg    = vsc73xx_config_aneg,
+       .read_page      = vsc73xx_read_page,
+       .write_page     = vsc73xx_write_page,
+ }, {
+@@ -471,7 +458,6 @@ static struct phy_driver vsc82xx_driver[] = {
+       .phy_id_mask    = 0x000ffff0,
+       /* PHY_GBIT_FEATURES */
+       .config_init    = vsc739x_config_init,
+-      .config_aneg    = vsc73xx_config_aneg,
+       .read_page      = vsc73xx_read_page,
+       .write_page     = vsc73xx_write_page,
+ }, {
+diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c
+index 13381d87eeb095..17844c07305c39 100644
+--- a/drivers/net/usb/ipheth.c
++++ b/drivers/net/usb/ipheth.c
+@@ -253,13 +253,14 @@ static int ipheth_carrier_set(struct ipheth_device *dev)
+                       0x02, /* index */
+                       dev->ctrl_buf, IPHETH_CTRL_BUF_SIZE,
+                       IPHETH_CTRL_TIMEOUT);
+-      if (retval < 0) {
++      if (retval <= 0) {
+               dev_err(&dev->intf->dev, "%s: usb_control_msg: %d\n",
+                       __func__, retval);
+               return retval;
+       }
+ 
+-      if (dev->ctrl_buf[0] == IPHETH_CARRIER_ON) {
++      if ((retval == 1 && dev->ctrl_buf[0] == IPHETH_CARRIER_ON) ||
++          (retval >= 2 && dev->ctrl_buf[1] == IPHETH_CARRIER_ON)) {
+               netif_carrier_on(dev->net);
+               if (dev->tx_urb->status != -EINPROGRESS)
+                       netif_wake_queue(dev->net);
+diff --git a/drivers/pinctrl/intel/pinctrl-meteorlake.c 
b/drivers/pinctrl/intel/pinctrl-meteorlake.c
+index 9576dcd1cb2997..84ea62cb86c6ea 100644
+--- a/drivers/pinctrl/intel/pinctrl-meteorlake.c
++++ b/drivers/pinctrl/intel/pinctrl-meteorlake.c
+@@ -395,6 +395,7 @@ static const struct intel_pinctrl_soc_data mtlp_soc_data = 
{
+ };
+ 
+ static const struct acpi_device_id mtl_pinctrl_acpi_match[] = {
++      { "INTC105E", (kernel_ulong_t)&mtlp_soc_data },
+       { "INTC1083", (kernel_ulong_t)&mtlp_soc_data },
+       { }
+ };
+diff --git a/drivers/platform/surface/surface_aggregator_registry.c 
b/drivers/platform/surface/surface_aggregator_registry.c
+index 023f126121d7d0..fafb0bb49f7f62 100644
+--- a/drivers/platform/surface/surface_aggregator_registry.c
++++ b/drivers/platform/surface/surface_aggregator_registry.c
+@@ -298,7 +298,7 @@ static const struct software_node *ssam_node_group_sp8[] = 
{
+       NULL,
+ };
+ 
+-/* Devices for Surface Pro 9 */
++/* Devices for Surface Pro 9 and 10 */
+ static const struct software_node *ssam_node_group_sp9[] = {
+       &ssam_node_root,
+       &ssam_node_hub_kip,
+@@ -337,6 +337,9 @@ static const struct acpi_device_id 
ssam_platform_hub_match[] = {
+       /* Surface Pro 9 */
+       { "MSHW0343", (unsigned long)ssam_node_group_sp9 },
+ 
++      /* Surface Pro 10 */
++      { "MSHW0510", (unsigned long)ssam_node_group_sp9 },
++
+       /* Surface Book 2 */
+       { "MSHW0107", (unsigned long)ssam_node_group_gen5 },
+ 
+@@ -367,6 +370,9 @@ static const struct acpi_device_id 
ssam_platform_hub_match[] = {
+       /* Surface Laptop Go 2 */
+       { "MSHW0290", (unsigned long)ssam_node_group_slg1 },
+ 
++      /* Surface Laptop Go 3 */
++      { "MSHW0440", (unsigned long)ssam_node_group_slg1 },
++
+       /* Surface Laptop Studio */
+       { "MSHW0123", (unsigned long)ssam_node_group_sls },
+ 
+diff --git a/drivers/platform/x86/panasonic-laptop.c 
b/drivers/platform/x86/panasonic-laptop.c
+index ad3083f9946d4d..ac7fb7a8fd592e 100644
+--- a/drivers/platform/x86/panasonic-laptop.c
++++ b/drivers/platform/x86/panasonic-laptop.c
+@@ -337,7 +337,8 @@ static int acpi_pcc_retrieve_biosdata(struct pcc_acpi *pcc)
+       }
+ 
+       if (pcc->num_sifr < hkey->package.count) {
+-              pr_err("SQTY reports bad SINF length\n");
++              pr_err("SQTY reports bad SINF length SQTY: %lu SINF-pkg-count: 
%u\n",
++                     pcc->num_sifr, hkey->package.count);
+               status = AE_ERROR;
+               goto end;
+       }
+@@ -773,6 +774,24 @@ static DEVICE_ATTR_RW(dc_brightness);
+ static DEVICE_ATTR_RW(current_brightness);
+ static DEVICE_ATTR_RW(cdpower);
+ 
++static umode_t pcc_sysfs_is_visible(struct kobject *kobj, struct attribute 
*attr, int idx)
++{
++      struct device *dev = kobj_to_dev(kobj);
++      struct acpi_device *acpi = to_acpi_device(dev);
++      struct pcc_acpi *pcc = acpi_driver_data(acpi);
++
++      if (attr == &dev_attr_mute.attr)
++              return (pcc->num_sifr > SINF_MUTE) ? attr->mode : 0;
++
++      if (attr == &dev_attr_eco_mode.attr)
++              return (pcc->num_sifr > SINF_ECO_MODE) ? attr->mode : 0;
++
++      if (attr == &dev_attr_current_brightness.attr)
++              return (pcc->num_sifr > SINF_CUR_BRIGHT) ? attr->mode : 0;
++
++      return attr->mode;
++}
++
+ static struct attribute *pcc_sysfs_entries[] = {
+       &dev_attr_numbatt.attr,
+       &dev_attr_lcdtype.attr,
+@@ -787,8 +806,9 @@ static struct attribute *pcc_sysfs_entries[] = {
+ };
+ 
+ static const struct attribute_group pcc_attr_group = {
+-      .name   = NULL,         /* put in device directory */
+-      .attrs  = pcc_sysfs_entries,
++      .name           = NULL,         /* put in device directory */
++      .attrs          = pcc_sysfs_entries,
++      .is_visible     = pcc_sysfs_is_visible,
+ };
+ 
+ 
+@@ -941,12 +961,15 @@ static int acpi_pcc_hotkey_resume(struct device *dev)
+       if (!pcc)
+               return -EINVAL;
+ 
+-      acpi_pcc_write_sset(pcc, SINF_MUTE, pcc->mute);
+-      acpi_pcc_write_sset(pcc, SINF_ECO_MODE, pcc->eco_mode);
++      if (pcc->num_sifr > SINF_MUTE)
++              acpi_pcc_write_sset(pcc, SINF_MUTE, pcc->mute);
++      if (pcc->num_sifr > SINF_ECO_MODE)
++              acpi_pcc_write_sset(pcc, SINF_ECO_MODE, pcc->eco_mode);
+       acpi_pcc_write_sset(pcc, SINF_STICKY_KEY, pcc->sticky_key);
+       acpi_pcc_write_sset(pcc, SINF_AC_CUR_BRIGHT, pcc->ac_brightness);
+       acpi_pcc_write_sset(pcc, SINF_DC_CUR_BRIGHT, pcc->dc_brightness);
+-      acpi_pcc_write_sset(pcc, SINF_CUR_BRIGHT, pcc->current_brightness);
++      if (pcc->num_sifr > SINF_CUR_BRIGHT)
++              acpi_pcc_write_sset(pcc, SINF_CUR_BRIGHT, 
pcc->current_brightness);
+ 
+       return 0;
+ }
+@@ -963,11 +986,21 @@ static int acpi_pcc_hotkey_add(struct acpi_device 
*device)
+ 
+       num_sifr = acpi_pcc_get_sqty(device);
+ 
+-      if (num_sifr < 0 || num_sifr > 255) {
+-              pr_err("num_sifr out of range");
++      /*
++       * pcc->sinf is expected to at least have the AC+DC brightness entries.
++       * Accesses to higher SINF entries are checked against num_sifr.
++       */
++      if (num_sifr <= SINF_DC_CUR_BRIGHT || num_sifr > 255) {
++              pr_err("num_sifr %d out of range %d - 255\n", num_sifr, 
SINF_DC_CUR_BRIGHT + 1);
+               return -ENODEV;
+       }
+ 
++      /*
++       * Some DSDT-s have an off-by-one bug where the SINF package count is
++       * one higher than the SQTY reported value, allocate 1 entry extra.
++       */
++      num_sifr++;
++
+       pcc = kzalloc(sizeof(struct pcc_acpi), GFP_KERNEL);
+       if (!pcc) {
+               pr_err("Couldn't allocate mem for pcc");
+@@ -1020,11 +1053,14 @@ static int acpi_pcc_hotkey_add(struct acpi_device 
*device)
+       acpi_pcc_write_sset(pcc, SINF_STICKY_KEY, 0);
+       pcc->sticky_key = 0;
+ 
+-      pcc->eco_mode = pcc->sinf[SINF_ECO_MODE];
+-      pcc->mute = pcc->sinf[SINF_MUTE];
+       pcc->ac_brightness = pcc->sinf[SINF_AC_CUR_BRIGHT];
+       pcc->dc_brightness = pcc->sinf[SINF_DC_CUR_BRIGHT];
+-      pcc->current_brightness = pcc->sinf[SINF_CUR_BRIGHT];
++      if (pcc->num_sifr > SINF_MUTE)
++              pcc->mute = pcc->sinf[SINF_MUTE];
++      if (pcc->num_sifr > SINF_ECO_MODE)
++              pcc->eco_mode = pcc->sinf[SINF_ECO_MODE];
++      if (pcc->num_sifr > SINF_CUR_BRIGHT)
++              pcc->current_brightness = pcc->sinf[SINF_CUR_BRIGHT];
+ 
+       /* add sysfs attributes */
+       result = sysfs_create_group(&device->dev.kobj, &pcc_attr_group);
+diff --git a/drivers/soc/ti/omap_prm.c b/drivers/soc/ti/omap_prm.c
+index 913b964374a444..33ef58195955db 100644
+--- a/drivers/soc/ti/omap_prm.c
++++ b/drivers/soc/ti/omap_prm.c
+@@ -696,6 +696,8 @@ static int omap_prm_domain_init(struct device *dev, struct 
omap_prm *prm)
+       data = prm->data;
+       name = devm_kasprintf(dev, GFP_KERNEL, "prm_%s",
+                             data->name);
++      if (!name)
++              return -ENOMEM;
+ 
+       prmd->dev = dev;
+       prmd->prm = prm;
+diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c
+index 2a245f3b7738f6..2624441d2fa92c 100644
+--- a/drivers/soundwire/stream.c
++++ b/drivers/soundwire/stream.c
+@@ -1272,18 +1272,18 @@ struct sdw_dpn_prop *sdw_get_slave_dpn_prop(struct 
sdw_slave *slave,
+                                           unsigned int port_num)
+ {
+       struct sdw_dpn_prop *dpn_prop;
+-      unsigned long mask;
++      u8 num_ports;
+       int i;
+ 
+       if (direction == SDW_DATA_DIR_TX) {
+-              mask = slave->prop.source_ports;
++              num_ports = hweight32(slave->prop.source_ports);
+               dpn_prop = slave->prop.src_dpn_prop;
+       } else {
+-              mask = slave->prop.sink_ports;
++              num_ports = hweight32(slave->prop.sink_ports);
+               dpn_prop = slave->prop.sink_dpn_prop;
+       }
+ 
+-      for_each_set_bit(i, &mask, 32) {
++      for (i = 0; i < num_ports; i++) {
+               if (dpn_prop[i].num == port_num)
+                       return &dpn_prop[i];
+       }
+diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c
+index 7b76dcd11e2bb5..17b5299c18c731 100644
+--- a/drivers/spi/spi-geni-qcom.c
++++ b/drivers/spi/spi-geni-qcom.c
+@@ -954,22 +954,24 @@ static int spi_geni_probe(struct platform_device *pdev)
+       spin_lock_init(&mas->lock);
+       pm_runtime_use_autosuspend(&pdev->dev);
+       pm_runtime_set_autosuspend_delay(&pdev->dev, 250);
+-      pm_runtime_enable(dev);
++      ret = devm_pm_runtime_enable(dev);
++      if (ret)
++              return ret;
+ 
+       ret = geni_icc_get(&mas->se, NULL);
+       if (ret)
+-              goto spi_geni_probe_runtime_disable;
++              return ret;
+       /* Set the bus quota to a reasonable value for register access */
+       mas->se.icc_paths[GENI_TO_CORE].avg_bw = Bps_to_icc(CORE_2X_50_MHZ);
+       mas->se.icc_paths[CPU_TO_GENI].avg_bw = GENI_DEFAULT_BW;
+ 
+       ret = geni_icc_set_bw(&mas->se);
+       if (ret)
+-              goto spi_geni_probe_runtime_disable;
++              return ret;
+ 
+       ret = spi_geni_init(mas);
+       if (ret)
+-              goto spi_geni_probe_runtime_disable;
++              return ret;
+ 
+       /*
+        * check the mode supported and set_cs for fifo mode only
+@@ -998,12 +1000,10 @@ static int spi_geni_probe(struct platform_device *pdev)
+       free_irq(mas->irq, spi);
+ spi_geni_release_dma:
+       spi_geni_release_dma_chan(mas);
+-spi_geni_probe_runtime_disable:
+-      pm_runtime_disable(dev);
+       return ret;
+ }
+ 
+-static int spi_geni_remove(struct platform_device *pdev)
++static void spi_geni_remove(struct platform_device *pdev)
+ {
+       struct spi_master *spi = platform_get_drvdata(pdev);
+       struct spi_geni_master *mas = spi_master_get_devdata(spi);
+@@ -1011,11 +1011,9 @@ static int spi_geni_remove(struct platform_device *pdev)
+       /* Unregister _before_ disabling pm_runtime() so we stop transfers */
+       spi_unregister_master(spi);
+ 
+-      spi_geni_release_dma_chan(mas);
+-
+       free_irq(mas->irq, spi);
+-      pm_runtime_disable(&pdev->dev);
+-      return 0;
++
++      spi_geni_release_dma_chan(mas);
+ }
+ 
+ static int __maybe_unused spi_geni_runtime_suspend(struct device *dev)
+@@ -1097,7 +1095,7 @@ MODULE_DEVICE_TABLE(of, spi_geni_dt_match);
+ 
+ static struct platform_driver spi_geni_driver = {
+       .probe  = spi_geni_probe,
+-      .remove = spi_geni_remove,
++      .remove_new = spi_geni_remove,
+       .driver = {
+               .name = "geni_spi",
+               .pm = &spi_geni_pm_ops,
+diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
+index afecf69d3cebaa..c1a96daadbf642 100644
+--- a/drivers/spi/spi-nxp-fspi.c
++++ b/drivers/spi/spi-nxp-fspi.c
+@@ -754,14 +754,15 @@ static void nxp_fspi_fill_txfifo(struct nxp_fspi *f,
+       if (i < op->data.nbytes) {
+               u32 data = 0;
+               int j;
++              int remaining = op->data.nbytes - i;
+               /* Wait for TXFIFO empty */
+               ret = fspi_readl_poll_tout(f, f->iobase + FSPI_INTR,
+                                          FSPI_INTR_IPTXWE, 0,
+                                          POLL_TOUT, true);
+               WARN_ON(ret);
+ 
+-              for (j = 0; j < ALIGN(op->data.nbytes - i, 4); j += 4) {
+-                      memcpy(&data, buf + i + j, 4);
++              for (j = 0; j < ALIGN(remaining, 4); j += 4) {
++                      memcpy(&data, buf + i + j, min_t(int, 4, remaining - 
j));
+                       fspi_writel(f, data, base + FSPI_TFDR + j);
+               }
+               fspi_writel(f, FSPI_INTR_IPTXWE, base + FSPI_INTR);
+diff --git a/drivers/staging/media/atomisp/pci/sh_css_frac.h 
b/drivers/staging/media/atomisp/pci/sh_css_frac.h
+index 8f08df5c88cc36..569a2f59e5519f 100644
+--- a/drivers/staging/media/atomisp/pci/sh_css_frac.h
++++ b/drivers/staging/media/atomisp/pci/sh_css_frac.h
+@@ -30,12 +30,24 @@
+ #define uISP_VAL_MAX                ((unsigned int)((1 << uISP_REG_BIT) - 1))
+ 
+ /* a:fraction bits for 16bit precision, b:fraction bits for ISP precision */
+-#define sDIGIT_FITTING(v, a, b) \
+-      min_t(int, max_t(int, (((v) >> sSHIFT) >> max(sFRACTION_BITS_FITTING(a) 
- (b), 0)), \
+-        sISP_VAL_MIN), sISP_VAL_MAX)
+-#define uDIGIT_FITTING(v, a, b) \
+-      min((unsigned int)max((unsigned)(((v) >> uSHIFT) \
+-      >> max((int)(uFRACTION_BITS_FITTING(a) - (b)), 0)), \
+-        uISP_VAL_MIN), uISP_VAL_MAX)
++static inline int sDIGIT_FITTING(int v, int a, int b)
++{
++      int fit_shift = sFRACTION_BITS_FITTING(a) - b;
++
++      v >>= sSHIFT;
++      v >>= fit_shift > 0 ? fit_shift : 0;
++
++      return clamp_t(int, v, sISP_VAL_MIN, sISP_VAL_MAX);
++}
++
++static inline unsigned int uDIGIT_FITTING(unsigned int v, int a, int b)
++{
++      int fit_shift = uFRACTION_BITS_FITTING(a) - b;
++
++      v >>= uSHIFT;
++      v >>= fit_shift > 0 ? fit_shift : 0;
++
++      return clamp_t(unsigned int, v, uISP_VAL_MIN, uISP_VAL_MAX);
++}
+ 
+ #endif /* __SH_CSS_FRAC_H */
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index e5017b2ade573c..894887640c4360 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -4379,6 +4379,7 @@ static int __btrfs_unlink_inode(struct 
btrfs_trans_handle *trans,
+ 
+       btrfs_i_size_write(dir, dir->vfs_inode.i_size - name->len * 2);
+       inode_inc_iversion(&inode->vfs_inode);
++      inode_set_ctime_current(&inode->vfs_inode);
+       inode_inc_iversion(&dir->vfs_inode);
+       inode->vfs_inode.i_ctime = current_time(&inode->vfs_inode);
+       dir->vfs_inode.i_mtime = inode->vfs_inode.i_ctime;
+diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
+index ead8a0e06abf9a..2ba4d221bf9d5b 100644
+--- a/fs/nfs/delegation.c
++++ b/fs/nfs/delegation.c
+@@ -627,6 +627,9 @@ static int nfs_server_return_marked_delegations(struct 
nfs_server *server,
+                               prev = delegation;
+                       continue;
+               }
++              inode = nfs_delegation_grab_inode(delegation);
++              if (inode == NULL)
++                      continue;
+ 
+               if (prev) {
+                       struct inode *tmp = nfs_delegation_grab_inode(prev);
+@@ -637,12 +640,6 @@ static int nfs_server_return_marked_delegations(struct 
nfs_server *server,
+                       }
+               }
+ 
+-              inode = nfs_delegation_grab_inode(delegation);
+-              if (inode == NULL) {
+-                      rcu_read_unlock();
+-                      iput(to_put);
+-                      goto restart;
+-              }
+               delegation = nfs_start_delegation_return_locked(NFS_I(inode));
+               rcu_read_unlock();
+ 
+@@ -1164,7 +1161,6 @@ static int nfs_server_reap_unclaimed_delegations(struct 
nfs_server *server,
+       struct inode *inode;
+ restart:
+       rcu_read_lock();
+-restart_locked:
+       list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
+               if (test_bit(NFS_DELEGATION_INODE_FREEING,
+                                       &delegation->flags) ||
+@@ -1175,7 +1171,7 @@ static int nfs_server_reap_unclaimed_delegations(struct 
nfs_server *server,
+                       continue;
+               inode = nfs_delegation_grab_inode(delegation);
+               if (inode == NULL)
+-                      goto restart_locked;
++                      continue;
+               delegation = nfs_start_delegation_return_locked(NFS_I(inode));
+               rcu_read_unlock();
+               if (delegation != NULL) {
+@@ -1296,7 +1292,6 @@ static int nfs_server_reap_expired_delegations(struct 
nfs_server *server,
+       nfs4_stateid stateid;
+ restart:
+       rcu_read_lock();
+-restart_locked:
+       list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
+               if (test_bit(NFS_DELEGATION_INODE_FREEING,
+                                       &delegation->flags) ||
+@@ -1307,7 +1302,7 @@ static int nfs_server_reap_expired_delegations(struct 
nfs_server *server,
+                       continue;
+               inode = nfs_delegation_grab_inode(delegation);
+               if (inode == NULL)
+-                      goto restart_locked;
++                      continue;
+               spin_lock(&delegation->lock);
+               cred = get_cred_rcu(delegation->cred);
+               nfs4_stateid_copy(&stateid, &delegation->stateid);
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 467e9439ededba..1e97de7c8c204b 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -9850,13 +9850,16 @@ static void nfs4_layoutreturn_done(struct rpc_task 
*task, void *calldata)
+               fallthrough;
+       default:
+               task->tk_status = 0;
++              lrp->res.lrs_present = 0;
+               fallthrough;
+       case 0:
+               break;
+       case -NFS4ERR_DELAY:
+-              if (nfs4_async_handle_error(task, server, NULL, NULL) != 
-EAGAIN)
+-                      break;
+-              goto out_restart;
++              if (nfs4_async_handle_error(task, server, NULL, NULL) ==
++                  -EAGAIN)
++                      goto out_restart;
++              lrp->res.lrs_present = 0;
++              break;
+       }
+       return;
+ out_restart:
+diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
+index 8c1f47ca5dc536..c96d2e76156e8b 100644
+--- a/fs/nfs/pnfs.c
++++ b/fs/nfs/pnfs.c
+@@ -1172,10 +1172,9 @@ void pnfs_layoutreturn_free_lsegs(struct 
pnfs_layout_hdr *lo,
+       LIST_HEAD(freeme);
+ 
+       spin_lock(&inode->i_lock);
+-      if (!pnfs_layout_is_valid(lo) ||
+-          !nfs4_stateid_match_other(&lo->plh_stateid, arg_stateid))
++      if (!nfs4_stateid_match_other(&lo->plh_stateid, arg_stateid))
+               goto out_unlock;
+-      if (stateid) {
++      if (stateid && pnfs_layout_is_valid(lo)) {
+               u32 seq = be32_to_cpu(arg_stateid->seqid);
+ 
+               pnfs_mark_matching_lsegs_invalid(lo, &freeme, range, seq);
+diff --git a/fs/ntfs3/attrlist.c b/fs/ntfs3/attrlist.c
+index 723e49ec83ce77..82bd9b5d9bd801 100644
+--- a/fs/ntfs3/attrlist.c
++++ b/fs/ntfs3/attrlist.c
+@@ -29,7 +29,7 @@ static inline bool al_is_valid_le(const struct ntfs_inode 
*ni,
+ void al_destroy(struct ntfs_inode *ni)
+ {
+       run_close(&ni->attr_list.run);
+-      kfree(ni->attr_list.le);
++      kvfree(ni->attr_list.le);
+       ni->attr_list.le = NULL;
+       ni->attr_list.size = 0;
+       ni->attr_list.dirty = false;
+@@ -318,7 +318,7 @@ int al_add_le(struct ntfs_inode *ni, enum ATTR_TYPE type, 
const __le16 *name,
+               memcpy(ptr, al->le, off);
+               memcpy(Add2Ptr(ptr, off + sz), le, old_size - off);
+               le = Add2Ptr(ptr, off);
+-              kfree(al->le);
++              kvfree(al->le);
+               al->le = ptr;
+       } else {
+               memmove(Add2Ptr(le, sz), le, old_size - off);
+diff --git a/fs/ntfs3/bitmap.c b/fs/ntfs3/bitmap.c
+index 70d9d08fc61bc1..8dbd8e70c2956e 100644
+--- a/fs/ntfs3/bitmap.c
++++ b/fs/ntfs3/bitmap.c
+@@ -124,7 +124,7 @@ void wnd_close(struct wnd_bitmap *wnd)
+ {
+       struct rb_node *node, *next;
+ 
+-      kfree(wnd->free_bits);
++      kvfree(wnd->free_bits);
+       run_close(&wnd->run);
+ 
+       node = rb_first(&wnd->start_tree);
+@@ -1333,7 +1333,7 @@ int wnd_extend(struct wnd_bitmap *wnd, size_t new_bits)
+               memcpy(new_free, wnd->free_bits, wnd->nwnd * sizeof(short));
+               memset(new_free + wnd->nwnd, 0,
+                      (new_wnd - wnd->nwnd) * sizeof(short));
+-              kfree(wnd->free_bits);
++              kvfree(wnd->free_bits);
+               wnd->free_bits = new_free;
+       }
+ 
+diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
+index 7bfdc91fae1ed1..b3299cda596227 100644
+--- a/fs/ntfs3/frecord.c
++++ b/fs/ntfs3/frecord.c
+@@ -773,7 +773,7 @@ static int ni_try_remove_attr_list(struct ntfs_inode *ni)
+       run_deallocate(sbi, &ni->attr_list.run, true);
+       run_close(&ni->attr_list.run);
+       ni->attr_list.size = 0;
+-      kfree(ni->attr_list.le);
++      kvfree(ni->attr_list.le);
+       ni->attr_list.le = NULL;
+       ni->attr_list.dirty = false;
+ 
+@@ -924,7 +924,7 @@ int ni_create_attr_list(struct ntfs_inode *ni)
+       goto out;
+ 
+ out1:
+-      kfree(ni->attr_list.le);
++      kvfree(ni->attr_list.le);
+       ni->attr_list.le = NULL;
+       ni->attr_list.size = 0;
+       return err;
+diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c
+index 667ff92f5afc5b..eee54214f4a3db 100644
+--- a/fs/ntfs3/super.c
++++ b/fs/ntfs3/super.c
+@@ -441,7 +441,7 @@ static noinline void put_ntfs(struct ntfs_sb_info *sbi)
+ {
+       kfree(sbi->new_rec);
+       kvfree(ntfs_put_shared(sbi->upcase));
+-      kfree(sbi->def_table);
++      kvfree(sbi->def_table);
+ 
+       wnd_close(&sbi->mft.bitmap);
+       wnd_close(&sbi->used.bitmap);
+diff --git a/fs/smb/server/mgmt/share_config.c 
b/fs/smb/server/mgmt/share_config.c
+index e0a6b758094fc5..d8d03070ae44b4 100644
+--- a/fs/smb/server/mgmt/share_config.c
++++ b/fs/smb/server/mgmt/share_config.c
+@@ -15,6 +15,7 @@
+ #include "share_config.h"
+ #include "user_config.h"
+ #include "user_session.h"
++#include "../connection.h"
+ #include "../transport_ipc.h"
+ #include "../misc.h"
+ 
+@@ -120,12 +121,13 @@ static int parse_veto_list(struct ksmbd_share_config 
*share,
+       return 0;
+ }
+ 
+-static struct ksmbd_share_config *share_config_request(struct unicode_map *um,
++static struct ksmbd_share_config *share_config_request(struct ksmbd_work 
*work,
+                                                      const char *name)
+ {
+       struct ksmbd_share_config_response *resp;
+       struct ksmbd_share_config *share = NULL;
+       struct ksmbd_share_config *lookup;
++      struct unicode_map *um = work->conn->um;
+       int ret;
+ 
+       resp = ksmbd_ipc_share_config_request(name);
+@@ -181,7 +183,14 @@ static struct ksmbd_share_config 
*share_config_request(struct unicode_map *um,
+                                     KSMBD_SHARE_CONFIG_VETO_LIST(resp),
+                                     resp->veto_list_sz);
+               if (!ret && share->path) {
++                      if (__ksmbd_override_fsids(work, share)) {
++                              kill_share(share);
++                              share = NULL;
++                              goto out;
++                      }
++
+                       ret = kern_path(share->path, 0, &share->vfs_path);
++                      ksmbd_revert_fsids(work);
+                       if (ret) {
+                               ksmbd_debug(SMB, "failed to access '%s'\n",
+                                           share->path);
+@@ -214,7 +223,7 @@ static struct ksmbd_share_config 
*share_config_request(struct unicode_map *um,
+       return share;
+ }
+ 
+-struct ksmbd_share_config *ksmbd_share_config_get(struct unicode_map *um,
++struct ksmbd_share_config *ksmbd_share_config_get(struct ksmbd_work *work,
+                                                 const char *name)
+ {
+       struct ksmbd_share_config *share;
+@@ -227,7 +236,7 @@ struct ksmbd_share_config *ksmbd_share_config_get(struct 
unicode_map *um,
+ 
+       if (share)
+               return share;
+-      return share_config_request(um, name);
++      return share_config_request(work, name);
+ }
+ 
+ bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,
+diff --git a/fs/smb/server/mgmt/share_config.h 
b/fs/smb/server/mgmt/share_config.h
+index 5f591751b92365..d4ac2dd4de2040 100644
+--- a/fs/smb/server/mgmt/share_config.h
++++ b/fs/smb/server/mgmt/share_config.h
+@@ -11,6 +11,8 @@
+ #include <linux/path.h>
+ #include <linux/unicode.h>
+ 
++struct ksmbd_work;
++
+ struct ksmbd_share_config {
+       char                    *name;
+       char                    *path;
+@@ -68,7 +70,7 @@ static inline void ksmbd_share_config_put(struct 
ksmbd_share_config *share)
+       __ksmbd_share_config_put(share);
+ }
+ 
+-struct ksmbd_share_config *ksmbd_share_config_get(struct unicode_map *um,
++struct ksmbd_share_config *ksmbd_share_config_get(struct ksmbd_work *work,
+                                                 const char *name);
+ bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,
+                              const char *filename);
+diff --git a/fs/smb/server/mgmt/tree_connect.c 
b/fs/smb/server/mgmt/tree_connect.c
+index d2c81a8a11dda1..94a52a75014a43 100644
+--- a/fs/smb/server/mgmt/tree_connect.c
++++ b/fs/smb/server/mgmt/tree_connect.c
+@@ -16,17 +16,18 @@
+ #include "user_session.h"
+ 
+ struct ksmbd_tree_conn_status
+-ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
+-                      const char *share_name)
++ksmbd_tree_conn_connect(struct ksmbd_work *work, const char *share_name)
+ {
+       struct ksmbd_tree_conn_status status = {-ENOENT, NULL};
+       struct ksmbd_tree_connect_response *resp = NULL;
+       struct ksmbd_share_config *sc;
+       struct ksmbd_tree_connect *tree_conn = NULL;
+       struct sockaddr *peer_addr;
++      struct ksmbd_conn *conn = work->conn;
++      struct ksmbd_session *sess = work->sess;
+       int ret;
+ 
+-      sc = ksmbd_share_config_get(conn->um, share_name);
++      sc = ksmbd_share_config_get(work, share_name);
+       if (!sc)
+               return status;
+ 
+@@ -61,7 +62,7 @@ ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct 
ksmbd_session *sess,
+               struct ksmbd_share_config *new_sc;
+ 
+               ksmbd_share_config_del(sc);
+-              new_sc = ksmbd_share_config_get(conn->um, share_name);
++              new_sc = ksmbd_share_config_get(work, share_name);
+               if (!new_sc) {
+                       pr_err("Failed to update stale share config\n");
+                       status.ret = -ESTALE;
+diff --git a/fs/smb/server/mgmt/tree_connect.h 
b/fs/smb/server/mgmt/tree_connect.h
+index 6377a70b811c89..a42cdd05104114 100644
+--- a/fs/smb/server/mgmt/tree_connect.h
++++ b/fs/smb/server/mgmt/tree_connect.h
+@@ -13,6 +13,7 @@
+ struct ksmbd_share_config;
+ struct ksmbd_user;
+ struct ksmbd_conn;
++struct ksmbd_work;
+ 
+ enum {
+       TREE_NEW = 0,
+@@ -50,8 +51,7 @@ static inline int test_tree_conn_flag(struct 
ksmbd_tree_connect *tree_conn,
+ struct ksmbd_session;
+ 
+ struct ksmbd_tree_conn_status
+-ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
+-                      const char *share_name);
++ksmbd_tree_conn_connect(struct ksmbd_work *work, const char *share_name);
+ void ksmbd_tree_connect_put(struct ksmbd_tree_connect *tcon);
+ 
+ int ksmbd_tree_conn_disconnect(struct ksmbd_session *sess,
+diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
+index 898622b52b48e8..dc8f1e7ce2fa96 100644
+--- a/fs/smb/server/smb2pdu.c
++++ b/fs/smb/server/smb2pdu.c
+@@ -1975,7 +1975,7 @@ int smb2_tree_connect(struct ksmbd_work *work)
+       ksmbd_debug(SMB, "tree connect request for tree %s treename %s\n",
+                   name, treename);
+ 
+-      status = ksmbd_tree_conn_connect(conn, sess, name);
++      status = ksmbd_tree_conn_connect(work, name);
+       if (status.ret == KSMBD_TREE_CONN_STATUS_OK)
+               rsp->hdr.Id.SyncId.TreeId = cpu_to_le32(status.tree_conn->id);
+       else
+@@ -3482,7 +3482,7 @@ int smb2_open(struct ksmbd_work *work)
+       kfree(name);
+       kfree(lc);
+ 
+-      return 0;
++      return rc;
+ }
+ 
+ static int readdir_info_level_struct_sz(int info_level)
+@@ -5326,6 +5326,11 @@ int smb2_query_info(struct ksmbd_work *work)
+ 
+       ksmbd_debug(SMB, "GOT query info request\n");
+ 
++      if (ksmbd_override_fsids(work)) {
++              rc = -ENOMEM;
++              goto err_out;
++      }
++
+       switch (req->InfoType) {
+       case SMB2_O_INFO_FILE:
+               ksmbd_debug(SMB, "GOT SMB2_O_INFO_FILE\n");
+@@ -5344,6 +5349,7 @@ int smb2_query_info(struct ksmbd_work *work)
+                           req->InfoType);
+               rc = -EOPNOTSUPP;
+       }
++      ksmbd_revert_fsids(work);
+ 
+       if (!rc) {
+               rsp->StructureSize = cpu_to_le16(9);
+@@ -5353,6 +5359,7 @@ int smb2_query_info(struct ksmbd_work *work)
+                                       le32_to_cpu(rsp->OutputBufferLength));
+       }
+ 
++err_out:
+       if (rc < 0) {
+               if (rc == -EACCES)
+                       rsp->hdr.Status = STATUS_ACCESS_DENIED;
+diff --git a/fs/smb/server/smb_common.c b/fs/smb/server/smb_common.c
+index e90a1e8c1951db..bdcdc0fc9cad5e 100644
+--- a/fs/smb/server/smb_common.c
++++ b/fs/smb/server/smb_common.c
+@@ -729,10 +729,10 @@ bool is_asterisk(char *p)
+       return p && p[0] == '*';
+ }
+ 
+-int ksmbd_override_fsids(struct ksmbd_work *work)
++int __ksmbd_override_fsids(struct ksmbd_work *work,
++              struct ksmbd_share_config *share)
+ {
+       struct ksmbd_session *sess = work->sess;
+-      struct ksmbd_share_config *share = work->tcon->share_conf;
+       struct cred *cred;
+       struct group_info *gi;
+       unsigned int uid;
+@@ -772,6 +772,11 @@ int ksmbd_override_fsids(struct ksmbd_work *work)
+       return 0;
+ }
+ 
++int ksmbd_override_fsids(struct ksmbd_work *work)
++{
++      return __ksmbd_override_fsids(work, work->tcon->share_conf);
++}
++
+ void ksmbd_revert_fsids(struct ksmbd_work *work)
+ {
+       const struct cred *cred;
+diff --git a/fs/smb/server/smb_common.h b/fs/smb/server/smb_common.h
+index f1092519c0c288..4a3148b0167f54 100644
+--- a/fs/smb/server/smb_common.h
++++ b/fs/smb/server/smb_common.h
+@@ -447,6 +447,8 @@ int ksmbd_extract_shortname(struct ksmbd_conn *conn,
+ int ksmbd_smb_negotiate_common(struct ksmbd_work *work, unsigned int command);
+ 
+ int ksmbd_smb_check_shared_mode(struct file *filp, struct ksmbd_file 
*curr_fp);
++int __ksmbd_override_fsids(struct ksmbd_work *work,
++                         struct ksmbd_share_config *share);
+ int ksmbd_override_fsids(struct ksmbd_work *work);
+ void ksmbd_revert_fsids(struct ksmbd_work *work);
+ 
+diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
+index b2aee17a34d775..271c5a87751fe3 100644
+--- a/include/linux/mlx5/mlx5_ifc.h
++++ b/include/linux/mlx5/mlx5_ifc.h
+@@ -973,7 +973,8 @@ struct mlx5_ifc_qos_cap_bits {
+ 
+       u8         max_tsar_bw_share[0x20];
+ 
+-      u8         reserved_at_100[0x20];
++      u8         nic_element_type[0x10];
++      u8         nic_tsar_type[0x10];
+ 
+       u8         reserved_at_120[0x3];
+       u8         log_meter_aso_granularity[0x5];
+@@ -3742,10 +3743,11 @@ enum {
+ };
+ 
+ enum {
+-      ELEMENT_TYPE_CAP_MASK_TASR              = 1 << 0,
++      ELEMENT_TYPE_CAP_MASK_TSAR              = 1 << 0,
+       ELEMENT_TYPE_CAP_MASK_VPORT             = 1 << 1,
+       ELEMENT_TYPE_CAP_MASK_VPORT_TC          = 1 << 2,
+       ELEMENT_TYPE_CAP_MASK_PARA_VPORT_TC     = 1 << 3,
++      ELEMENT_TYPE_CAP_MASK_QUEUE_GROUP       = 1 << 4,
+ };
+ 
+ struct mlx5_ifc_scheduling_context_bits {
+@@ -4444,6 +4446,12 @@ enum {
+       TSAR_ELEMENT_TSAR_TYPE_ETS = 0x2,
+ };
+ 
++enum {
++      TSAR_TYPE_CAP_MASK_DWRR         = 1 << 0,
++      TSAR_TYPE_CAP_MASK_ROUND_ROBIN  = 1 << 1,
++      TSAR_TYPE_CAP_MASK_ETS          = 1 << 2,
++};
++
+ struct mlx5_ifc_tsar_element_bits {
+       u8         reserved_at_0[0x8];
+       u8         tsar_type[0x8];
+diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
+index 823e28042f4107..62613d4d84b718 100644
+--- a/include/linux/virtio_net.h
++++ b/include/linux/virtio_net.h
+@@ -161,7 +161,8 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff 
*skb,
+                       break;
+               case SKB_GSO_TCPV4:
+               case SKB_GSO_TCPV6:
+-                      if (skb->csum_offset != offsetof(struct tcphdr, check))
++                      if (skb->ip_summed == CHECKSUM_PARTIAL &&
++                          skb->csum_offset != offsetof(struct tcphdr, check))
+                               return -EINVAL;
+                       break;
+               }
+diff --git a/mm/memory.c b/mm/memory.c
+index 73085e36aabac5..da9fed5e602530 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -2480,11 +2480,7 @@ static inline int remap_p4d_range(struct mm_struct *mm, 
pgd_t *pgd,
+       return 0;
+ }
+ 
+-/*
+- * Variant of remap_pfn_range that does not call track_pfn_remap.  The caller
+- * must have pre-validated the caching bits of the pgprot_t.
+- */
+-int remap_pfn_range_notrack(struct vm_area_struct *vma, unsigned long addr,
++static int remap_pfn_range_internal(struct vm_area_struct *vma, unsigned long 
addr,
+               unsigned long pfn, unsigned long size, pgprot_t prot)
+ {
+       pgd_t *pgd;
+@@ -2537,6 +2533,27 @@ int remap_pfn_range_notrack(struct vm_area_struct *vma, 
unsigned long addr,
+       return 0;
+ }
+ 
++/*
++ * Variant of remap_pfn_range that does not call track_pfn_remap.  The caller
++ * must have pre-validated the caching bits of the pgprot_t.
++ */
++int remap_pfn_range_notrack(struct vm_area_struct *vma, unsigned long addr,
++              unsigned long pfn, unsigned long size, pgprot_t prot)
++{
++      int error = remap_pfn_range_internal(vma, addr, pfn, size, prot);
++
++      if (!error)
++              return 0;
++
++      /*
++       * A partial pfn range mapping is dangerous: it does not
++       * maintain page reference counts, and callers may free
++       * pages due to the error. So zap it early.
++       */
++      zap_page_range_single(vma, addr, size, NULL);
++      return error;
++}
++
+ /**
+  * remap_pfn_range - remap kernel memory to userspace
+  * @vma: user vma to map to
+diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c
+index 7bcc933103e2d4..c29c976a259659 100644
+--- a/net/ipv4/fou.c
++++ b/net/ipv4/fou.c
+@@ -334,11 +334,11 @@ static struct sk_buff *gue_gro_receive(struct sock *sk,
+       struct gro_remcsum grc;
+       u8 proto;
+ 
++      skb_gro_remcsum_init(&grc);
++
+       if (!fou)
+               goto out;
+ 
+-      skb_gro_remcsum_init(&grc);
+-
+       off = skb_gro_offset(skb);
+       len = off + sizeof(*guehdr);
+ 
+diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
+index f001e15474029f..03c1500eae7e07 100644
+--- a/net/mptcp/pm_netlink.c
++++ b/net/mptcp/pm_netlink.c
+@@ -349,15 +349,21 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
+ {
+       struct mptcp_pm_add_entry *entry;
+       struct sock *sk = (struct sock *)msk;
++      struct timer_list *add_timer = NULL;
+ 
+       spin_lock_bh(&msk->pm.lock);
+       entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
+-      if (entry && (!check_id || entry->addr.id == addr->id))
++      if (entry && (!check_id || entry->addr.id == addr->id)) {
+               entry->retrans_times = ADD_ADDR_RETRANS_MAX;
++              add_timer = &entry->add_timer;
++      }
++      if (!check_id && entry)
++              list_del(&entry->list);
+       spin_unlock_bh(&msk->pm.lock);
+ 
+-      if (entry && (!check_id || entry->addr.id == addr->id))
+-              sk_stop_timer_sync(sk, &entry->add_timer);
++      /* no lock, because sk_stop_timer_sync() is calling del_timer_sync() */
++      if (add_timer)
++              sk_stop_timer_sync(sk, add_timer);
+ 
+       return entry;
+ }
+@@ -1488,7 +1494,6 @@ static bool remove_anno_list_by_saddr(struct mptcp_sock 
*msk,
+ 
+       entry = mptcp_pm_del_add_timer(msk, addr, false);
+       if (entry) {
+-              list_del(&entry->list);
+               kfree(entry);
+               return true;
+       }
+diff --git a/net/netfilter/nft_socket.c b/net/netfilter/nft_socket.c
+index f28324fd8d7183..0f37738e4b26a4 100644
+--- a/net/netfilter/nft_socket.c
++++ b/net/netfilter/nft_socket.c
+@@ -110,13 +110,13 @@ static void nft_socket_eval(const struct nft_expr *expr,
+                       *dest = READ_ONCE(sk->sk_mark);
+               } else {
+                       regs->verdict.code = NFT_BREAK;
+-                      return;
++                      goto out_put_sk;
+               }
+               break;
+       case NFT_SOCKET_WILDCARD:
+               if (!sk_fullsock(sk)) {
+                       regs->verdict.code = NFT_BREAK;
+-                      return;
++                      goto out_put_sk;
+               }
+               nft_socket_wildcard(pkt, regs, sk, dest);
+               break;
+@@ -124,7 +124,7 @@ static void nft_socket_eval(const struct nft_expr *expr,
+       case NFT_SOCKET_CGROUPV2:
+               if (!nft_sock_get_eval_cgroupv2(dest, sk, pkt, priv->level)) {
+                       regs->verdict.code = NFT_BREAK;
+-                      return;
++                      goto out_put_sk;
+               }
+               break;
+ #endif
+@@ -133,6 +133,7 @@ static void nft_socket_eval(const struct nft_expr *expr,
+               regs->verdict.code = NFT_BREAK;
+       }
+ 
++out_put_sk:
+       if (sk != skb->sk)
+               sock_gen_put(sk);
+ }
+diff --git a/scripts/kconfig/merge_config.sh b/scripts/kconfig/merge_config.sh
+index e5b46980c22ae7..72da3b8d6f307b 100755
+--- a/scripts/kconfig/merge_config.sh
++++ b/scripts/kconfig/merge_config.sh
+@@ -160,6 +160,8 @@ for ORIG_MERGE_FILE in $MERGE_LIST ; do
+                       sed -i "/$CFG[ =]/d" $MERGE_FILE
+               fi
+       done
++      # In case the previous file lacks a new line at the end
++      echo >> $TMP_FILE
+       cat $MERGE_FILE >> $TMP_FILE
+ done
+ 
+diff --git a/sound/soc/meson/axg-card.c b/sound/soc/meson/axg-card.c
+index cbbaa55d92a662..4553a1bb87d4a5 100644
+--- a/sound/soc/meson/axg-card.c
++++ b/sound/soc/meson/axg-card.c
+@@ -104,7 +104,7 @@ static int axg_card_add_tdm_loopback(struct snd_soc_card 
*card,
+                                    int *index)
+ {
+       struct meson_card *priv = snd_soc_card_get_drvdata(card);
+-      struct snd_soc_dai_link *pad = &card->dai_link[*index];
++      struct snd_soc_dai_link *pad;
+       struct snd_soc_dai_link *lb;
+       struct snd_soc_dai_link_component *dlc;
+       int ret;
+@@ -114,6 +114,7 @@ static int axg_card_add_tdm_loopback(struct snd_soc_card 
*card,
+       if (ret)
+               return ret;
+ 
++      pad = &card->dai_link[*index];
+       lb = &card->dai_link[*index + 1];
+ 
+       lb->name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-lb", pad->name);
+diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c 
b/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c
+index 2cf0c7a3fe2326..cef5d35951711b 100644
+--- a/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c
++++ b/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c
+@@ -1909,7 +1909,7 @@ static void unix_inet_redir_to_connected(int family, int 
type, int sock_mapfd,
+       if (err)
+               return;
+ 
+-      if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0, sfd))
++      if (socketpair(AF_UNIX, type | SOCK_NONBLOCK, 0, sfd))
+               goto close_cli0;
+       c1 = sfd[0], p1 = sfd[1];
+ 
+@@ -1944,7 +1944,6 @@ static void unix_inet_redir_to_connected(int family, int 
type, int sock_mapfd,
+ close_cli0:
+       xclose(c0);
+       xclose(p0);
+-
+ }
+ 
+ static void unix_inet_skb_redir_to_connected(struct test_sockmap_listen *skel,

Reply via email to