diff options
author | Mike Pagano <mpagano@gentoo.org> | 2020-07-22 08:52:36 -0400 |
---|---|---|
committer | Mike Pagano <mpagano@gentoo.org> | 2020-07-22 08:52:36 -0400 |
commit | 6aff9f53f3aab7bf9f94b27166bcba9cd6b6887c (patch) | |
tree | 211f0f9d766648087ecc481ba554a80c64539036 | |
parent | Linux patch 5.4.52 (diff) | |
download | linux-patches-6aff9f53f3aab7bf9f94b27166bcba9cd6b6887c.tar.gz linux-patches-6aff9f53f3aab7bf9f94b27166bcba9cd6b6887c.tar.bz2 linux-patches-6aff9f53f3aab7bf9f94b27166bcba9cd6b6887c.zip |
Linux patch 5.4.535.4-53
Signed-off-by: Mike Pagano <mpagano@gentoo.org>
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1052_linux-5.4.53.patch | 8089 |
2 files changed, 8093 insertions, 0 deletions
diff --git a/0000_README b/0000_README index cc016787..855b8b40 100644 --- a/0000_README +++ b/0000_README @@ -251,6 +251,10 @@ Patch: 1051_linux-5.4.52.patch From: http://www.kernel.org Desc: Linux 5.4.52 +Patch: 1052_linux-5.4.53.patch +From: http://www.kernel.org +Desc: Linux 5.4.53 + 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/1052_linux-5.4.53.patch b/1052_linux-5.4.53.patch new file mode 100644 index 00000000..a3d633cc --- /dev/null +++ b/1052_linux-5.4.53.patch @@ -0,0 +1,8089 @@ +diff --git a/Documentation/devicetree/bindings/mailbox/xlnx,zynqmp-ipi-mailbox.txt b/Documentation/devicetree/bindings/mailbox/xlnx,zynqmp-ipi-mailbox.txt +index 4438432bfe9b..ad76edccf881 100644 +--- a/Documentation/devicetree/bindings/mailbox/xlnx,zynqmp-ipi-mailbox.txt ++++ b/Documentation/devicetree/bindings/mailbox/xlnx,zynqmp-ipi-mailbox.txt +@@ -87,7 +87,7 @@ Example: + ranges; + + /* APU<->RPU0 IPI mailbox controller */ +- ipi_mailbox_rpu0: mailbox@ff90400 { ++ ipi_mailbox_rpu0: mailbox@ff990400 { + reg = <0xff990400 0x20>, + <0xff990420 0x20>, + <0xff990080 0x20>, +diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt +index 66780a47ad85..c977a3ba2f35 100644 +--- a/Documentation/devicetree/bindings/usb/dwc3.txt ++++ b/Documentation/devicetree/bindings/usb/dwc3.txt +@@ -75,6 +75,8 @@ Optional properties: + from P0 to P1/P2/P3 without delay. + - snps,dis-tx-ipgap-linecheck-quirk: when set, disable u2mac linestate check + during HS transmit. ++ - snps,parkmode-disable-ss-quirk: when set, all SuperSpeed bus instances in ++ park mode are disabled. + - snps,dis_metastability_quirk: when set, disable metastability workaround. + CAUTION: use only if you are absolutely sure of it. + - snps,is-utmi-l1-suspend: true when DWC3 asserts output signal +diff --git a/Makefile b/Makefile +index 435d27be54c9..d33b312a14e3 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 52 ++SUBLEVEL = 53 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/alpha/configs/defconfig b/arch/alpha/configs/defconfig +index f4ec420d7f2d..3a132c91d45b 100644 +--- a/arch/alpha/configs/defconfig ++++ b/arch/alpha/configs/defconfig +@@ -36,7 +36,6 @@ CONFIG_BLK_DEV_CY82C693=y + CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_SCSI_AIC7XXX=m + CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 + # CONFIG_AIC7XXX_DEBUG_ENABLE is not set +diff --git a/arch/arm/boot/dts/am437x-l4.dtsi b/arch/arm/boot/dts/am437x-l4.dtsi +index 59770dd3785e..bbe15775fccd 100644 +--- a/arch/arm/boot/dts/am437x-l4.dtsi ++++ b/arch/arm/boot/dts/am437x-l4.dtsi +@@ -1576,8 +1576,9 @@ + reg-names = "rev"; + ti,hwmods = "d_can0"; + /* Domains (P, C): per_pwrdm, l4ls_clkdm */ +- clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN0_CLKCTRL 0>; +- clock-names = "fck"; ++ clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN0_CLKCTRL 0>, ++ <&dcan0_fck>; ++ clock-names = "fck", "osc"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0xcc000 0x2000>; +@@ -1585,6 +1586,8 @@ + dcan0: can@0 { + compatible = "ti,am4372-d_can", "ti,am3352-d_can"; + reg = <0x0 0x2000>; ++ clocks = <&dcan0_fck>; ++ clock-names = "fck"; + syscon-raminit = <&scm_conf 0x644 0>; + interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>; + status = "disabled"; +@@ -1597,8 +1600,9 @@ + reg-names = "rev"; + ti,hwmods = "d_can1"; + /* Domains (P, C): per_pwrdm, l4ls_clkdm */ +- clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN1_CLKCTRL 0>; +- clock-names = "fck"; ++ clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN1_CLKCTRL 0>, ++ <&dcan1_fck>; ++ clock-names = "fck", "osc"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0x0 0xd0000 0x2000>; +@@ -1606,6 +1610,8 @@ + dcan1: can@0 { + compatible = "ti,am4372-d_can", "ti,am3352-d_can"; + reg = <0x0 0x2000>; ++ clocks = <&dcan1_fck>; ++ clock-name = "fck"; + syscon-raminit = <&scm_conf 0x644 1>; + interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>; + status = "disabled"; +diff --git a/arch/arm/boot/dts/mt7623n-rfb-emmc.dts b/arch/arm/boot/dts/mt7623n-rfb-emmc.dts +index b7606130ade9..0447748f9fa0 100644 +--- a/arch/arm/boot/dts/mt7623n-rfb-emmc.dts ++++ b/arch/arm/boot/dts/mt7623n-rfb-emmc.dts +@@ -138,6 +138,7 @@ + mac@1 { + compatible = "mediatek,eth-mac"; + reg = <1>; ++ phy-mode = "rgmii"; + phy-handle = <&phy5>; + }; + +diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi +index 4f3993cc0227..451030897220 100644 +--- a/arch/arm/boot/dts/socfpga.dtsi ++++ b/arch/arm/boot/dts/socfpga.dtsi +@@ -710,7 +710,7 @@ + }; + }; + +- L2: l2-cache@fffef000 { ++ L2: cache-controller@fffef000 { + compatible = "arm,pl310-cache"; + reg = <0xfffef000 0x1000>; + interrupts = <0 38 0x04>; +diff --git a/arch/arm/boot/dts/socfpga_arria10.dtsi b/arch/arm/boot/dts/socfpga_arria10.dtsi +index 2a86e72d9791..906bfb580e9e 100644 +--- a/arch/arm/boot/dts/socfpga_arria10.dtsi ++++ b/arch/arm/boot/dts/socfpga_arria10.dtsi +@@ -636,7 +636,7 @@ + reg = <0xffcfb100 0x80>; + }; + +- L2: l2-cache@fffff000 { ++ L2: cache-controller@fffff000 { + compatible = "arm,pl310-cache"; + reg = <0xfffff000 0x1000>; + interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>; +diff --git a/arch/arm/configs/rpc_defconfig b/arch/arm/configs/rpc_defconfig +index 3b82b64950d9..c090643b1ecb 100644 +--- a/arch/arm/configs/rpc_defconfig ++++ b/arch/arm/configs/rpc_defconfig +@@ -32,7 +32,6 @@ CONFIG_BLK_DEV_RAM=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_LOGGING=y +diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig +index 73ed73a8785a..153009130dab 100644 +--- a/arch/arm/configs/s3c2410_defconfig ++++ b/arch/arm/configs/s3c2410_defconfig +@@ -202,7 +202,6 @@ CONFIG_EEPROM_AT24=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_CHR_DEV_SCH=m + CONFIG_SCSI_CONSTANTS=y +diff --git a/arch/arm/include/asm/clocksource.h b/arch/arm/include/asm/clocksource.h +index 0b350a7e26f3..afb7a59828fe 100644 +--- a/arch/arm/include/asm/clocksource.h ++++ b/arch/arm/include/asm/clocksource.h +@@ -1,8 +1,17 @@ + #ifndef _ASM_CLOCKSOURCE_H + #define _ASM_CLOCKSOURCE_H + ++enum vdso_arch_clockmode { ++ /* vdso clocksource not usable */ ++ VDSO_CLOCKMODE_NONE, ++ /* vdso clocksource usable */ ++ VDSO_CLOCKMODE_ARCHTIMER, ++ VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT = VDSO_CLOCKMODE_ARCHTIMER, ++}; ++ + struct arch_clocksource_data { +- bool vdso_direct; /* Usable for direct VDSO access? */ ++ /* Usable for direct VDSO access? */ ++ enum vdso_arch_clockmode clock_mode; + }; + + #endif +diff --git a/arch/arm/kernel/vdso.c b/arch/arm/kernel/vdso.c +index f00e45fa62c4..6c69a5548ba2 100644 +--- a/arch/arm/kernel/vdso.c ++++ b/arch/arm/kernel/vdso.c +@@ -281,7 +281,7 @@ static bool tk_is_cntvct(const struct timekeeper *tk) + if (!IS_ENABLED(CONFIG_ARM_ARCH_TIMER)) + return false; + +- if (!tk->tkr_mono.clock->archdata.vdso_direct) ++ if (tk->tkr_mono.clock->archdata.clock_mode != VDSO_CLOCKMODE_ARCHTIMER) + return false; + + return true; +diff --git a/arch/arm/mach-at91/pm_suspend.S b/arch/arm/mach-at91/pm_suspend.S +index ed57c879d4e1..2591cba61937 100644 +--- a/arch/arm/mach-at91/pm_suspend.S ++++ b/arch/arm/mach-at91/pm_suspend.S +@@ -268,6 +268,10 @@ ENDPROC(at91_backup_mode) + orr tmp1, tmp1, #AT91_PMC_KEY + str tmp1, [pmc, #AT91_CKGR_MOR] + ++ /* Quirk for SAM9X60's PMC */ ++ nop ++ nop ++ + wait_mckrdy + + /* Enable the crystal oscillator */ +diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c +index f1a6ece8108e..78247e6f4a72 100644 +--- a/arch/arm/mach-omap2/omap-iommu.c ++++ b/arch/arm/mach-omap2/omap-iommu.c +@@ -11,14 +11,43 @@ + + #include "omap_hwmod.h" + #include "omap_device.h" ++#include "clockdomain.h" + #include "powerdomain.h" + ++static void omap_iommu_dra7_emu_swsup_config(struct platform_device *pdev, ++ bool enable) ++{ ++ static struct clockdomain *emu_clkdm; ++ static DEFINE_SPINLOCK(emu_lock); ++ static atomic_t count; ++ struct device_node *np = pdev->dev.of_node; ++ ++ if (!of_device_is_compatible(np, "ti,dra7-dsp-iommu")) ++ return; ++ ++ if (!emu_clkdm) { ++ emu_clkdm = clkdm_lookup("emu_clkdm"); ++ if (WARN_ON_ONCE(!emu_clkdm)) ++ return; ++ } ++ ++ spin_lock(&emu_lock); ++ ++ if (enable && (atomic_inc_return(&count) == 1)) ++ clkdm_deny_idle(emu_clkdm); ++ else if (!enable && (atomic_dec_return(&count) == 0)) ++ clkdm_allow_idle(emu_clkdm); ++ ++ spin_unlock(&emu_lock); ++} ++ + int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, bool request, + u8 *pwrst) + { + struct powerdomain *pwrdm; + struct omap_device *od; + u8 next_pwrst; ++ int ret = 0; + + od = to_omap_device(pdev); + if (!od) +@@ -31,13 +60,21 @@ int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, bool request, + if (!pwrdm) + return -EINVAL; + +- if (request) ++ if (request) { + *pwrst = pwrdm_read_next_pwrst(pwrdm); ++ omap_iommu_dra7_emu_swsup_config(pdev, true); ++ } + + if (*pwrst > PWRDM_POWER_RET) +- return 0; ++ goto out; + + next_pwrst = request ? PWRDM_POWER_ON : *pwrst; + +- return pwrdm_set_next_pwrst(pwrdm, next_pwrst); ++ ret = pwrdm_set_next_pwrst(pwrdm, next_pwrst); ++ ++out: ++ if (!request) ++ omap_iommu_dra7_emu_swsup_config(pdev, false); ++ ++ return ret; + } +diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c +index 247e3f8acffe..ca07e310d9ed 100644 +--- a/arch/arm/mach-omap2/pdata-quirks.c ++++ b/arch/arm/mach-omap2/pdata-quirks.c +@@ -44,6 +44,17 @@ struct pdata_init { + static struct of_dev_auxdata omap_auxdata_lookup[]; + static struct twl4030_gpio_platform_data twl_gpio_auxdata; + ++#if IS_ENABLED(CONFIG_OMAP_IOMMU) ++int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, bool request, ++ u8 *pwrst); ++#else ++static inline int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, ++ bool request, u8 *pwrst) ++{ ++ return 0; ++} ++#endif ++ + #ifdef CONFIG_MACH_NOKIA_N8X0 + static void __init omap2420_n8x0_legacy_init(void) + { +@@ -311,16 +322,6 @@ static void __init omap3_pandora_legacy_init(void) + } + #endif /* CONFIG_ARCH_OMAP3 */ + +-#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) +-static struct iommu_platform_data omap4_iommu_pdata = { +- .reset_name = "mmu_cache", +- .assert_reset = omap_device_assert_hardreset, +- .deassert_reset = omap_device_deassert_hardreset, +- .device_enable = omap_device_enable, +- .device_idle = omap_device_idle, +-}; +-#endif +- + #if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) + static struct wkup_m3_platform_data wkup_m3_data = { + .reset_name = "wkup_m3", +@@ -336,6 +337,10 @@ static void __init omap5_uevm_legacy_init(void) + #endif + + #ifdef CONFIG_SOC_DRA7XX ++static struct iommu_platform_data dra7_ipu1_dsp_iommu_pdata = { ++ .set_pwrdm_constraint = omap_iommu_set_pwrdm_constraint, ++}; ++ + static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc1; + static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc2; + static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc3; +@@ -543,10 +548,6 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = { + &wkup_m3_data), + #endif + #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) +- OF_DEV_AUXDATA("ti,omap4-iommu", 0x4a066000, "4a066000.mmu", +- &omap4_iommu_pdata), +- OF_DEV_AUXDATA("ti,omap4-iommu", 0x55082000, "55082000.mmu", +- &omap4_iommu_pdata), + OF_DEV_AUXDATA("ti,omap4-smartreflex-iva", 0x4a0db000, + "4a0db000.smartreflex", &omap_sr_pdata[OMAP_SR_IVA]), + OF_DEV_AUXDATA("ti,omap4-smartreflex-core", 0x4a0dd000, +@@ -561,6 +562,12 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = { + &dra7_hsmmc_data_mmc2), + OF_DEV_AUXDATA("ti,dra7-hsmmc", 0x480ad000, "480ad000.mmc", + &dra7_hsmmc_data_mmc3), ++ OF_DEV_AUXDATA("ti,dra7-dsp-iommu", 0x40d01000, "40d01000.mmu", ++ &dra7_ipu1_dsp_iommu_pdata), ++ OF_DEV_AUXDATA("ti,dra7-dsp-iommu", 0x41501000, "41501000.mmu", ++ &dra7_ipu1_dsp_iommu_pdata), ++ OF_DEV_AUXDATA("ti,dra7-iommu", 0x58882000, "58882000.mmu", ++ &dra7_ipu1_dsp_iommu_pdata), + #endif + /* Common auxdata */ + OF_DEV_AUXDATA("ti,sysc", 0, NULL, &ti_sysc_pdata), +diff --git a/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi b/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi +index d1fc9c2055f4..9498d1de730c 100644 +--- a/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi ++++ b/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi +@@ -77,7 +77,7 @@ + method = "smc"; + }; + +- intc: intc@fffc1000 { ++ intc: interrupt-controller@fffc1000 { + compatible = "arm,gic-400", "arm,cortex-a15-gic"; + #interrupt-cells = <3>; + interrupt-controller; +@@ -302,7 +302,7 @@ + status = "disabled"; + }; + +- nand: nand@ffb90000 { ++ nand: nand-controller@ffb90000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "altr,socfpga-denali-nand"; +@@ -445,7 +445,7 @@ + clock-names = "timer"; + }; + +- uart0: serial0@ffc02000 { ++ uart0: serial@ffc02000 { + compatible = "snps,dw-apb-uart"; + reg = <0xffc02000 0x100>; + interrupts = <0 108 4>; +@@ -456,7 +456,7 @@ + status = "disabled"; + }; + +- uart1: serial1@ffc02100 { ++ uart1: serial@ffc02100 { + compatible = "snps,dw-apb-uart"; + reg = <0xffc02100 0x100>; + interrupts = <0 109 4>; +diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +index 2199a54c720c..1234bc797429 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +@@ -2381,6 +2381,7 @@ + dr_mode = "host"; + snps,dis_u2_susphy_quirk; + snps,quirk-frame-length-adjustment; ++ snps,parkmode-disable-ss-quirk; + }; + }; + +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s805x-libretech-ac.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s805x-libretech-ac.dts +index 82b1c4851147..e034bbff8e66 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s805x-libretech-ac.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s805x-libretech-ac.dts +@@ -9,7 +9,7 @@ + + #include <dt-bindings/input/input.h> + +-#include "meson-gxl-s905x.dtsi" ++#include "meson-gxl-s805x.dtsi" + + / { + compatible = "libretech,aml-s805x-ac", "amlogic,s805x", +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s805x-p241.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s805x-p241.dts +index 3a1484e5b8e1..fbc687c9ff83 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s805x-p241.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s805x-p241.dts +@@ -9,7 +9,7 @@ + + #include <dt-bindings/input/input.h> + +-#include "meson-gxl-s905x.dtsi" ++#include "meson-gxl-s805x.dtsi" + + / { + compatible = "amlogic,p241", "amlogic,s805x", "amlogic,meson-gxl"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi +new file mode 100644 +index 000000000000..f9d705648426 +--- /dev/null ++++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi +@@ -0,0 +1,24 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++/* ++ * Copyright (c) 2020 BayLibre SAS ++ * Author: Neil Armstrong <narmstrong@baylibre.com> ++ */ ++ ++#include "meson-gxl-s905x.dtsi" ++ ++/ { ++ compatible = "amlogic,s805x", "amlogic,meson-gxl"; ++}; ++ ++/* The S805X Package doesn't seem to handle the 744MHz OPP correctly */ ++&mali { ++ assigned-clocks = <&clkc CLKID_MALI_0_SEL>, ++ <&clkc CLKID_MALI_0>, ++ <&clkc CLKID_MALI>; /* Glitch free mux */ ++ assigned-clock-parents = <&clkc CLKID_FCLK_DIV3>, ++ <0>, /* Do Nothing */ ++ <&clkc CLKID_MALI_0>; ++ assigned-clock-rates = <0>, /* Do Nothing */ ++ <666666666>, ++ <0>; /* Do Nothing */ ++}; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi +index 49ff0a7d0210..e3cfa24dca5a 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi +@@ -288,6 +288,11 @@ + }; + }; + ++&hwrng { ++ clocks = <&clkc CLKID_RNG0>; ++ clock-names = "core"; ++}; ++ + &i2c_A { + clocks = <&clkc CLKID_I2C>; + }; +diff --git a/arch/arm64/include/asm/alternative.h b/arch/arm64/include/asm/alternative.h +index 5e5dc05d63a0..12f0eb56a1cc 100644 +--- a/arch/arm64/include/asm/alternative.h ++++ b/arch/arm64/include/asm/alternative.h +@@ -73,11 +73,11 @@ static inline void apply_alternatives_module(void *start, size_t length) { } + ".pushsection .altinstructions,\"a\"\n" \ + ALTINSTR_ENTRY(feature) \ + ".popsection\n" \ +- ".pushsection .altinstr_replacement, \"a\"\n" \ ++ ".subsection 1\n" \ + "663:\n\t" \ + newinstr "\n" \ + "664:\n\t" \ +- ".popsection\n\t" \ ++ ".previous\n\t" \ + ".org . - (664b-663b) + (662b-661b)\n\t" \ + ".org . - (662b-661b) + (664b-663b)\n" \ + ".endif\n" +@@ -117,9 +117,9 @@ static inline void apply_alternatives_module(void *start, size_t length) { } + 662: .pushsection .altinstructions, "a" + altinstruction_entry 661b, 663f, \cap, 662b-661b, 664f-663f + .popsection +- .pushsection .altinstr_replacement, "ax" ++ .subsection 1 + 663: \insn2 +-664: .popsection ++664: .previous + .org . - (664b-663b) + (662b-661b) + .org . - (662b-661b) + (664b-663b) + .endif +@@ -160,7 +160,7 @@ static inline void apply_alternatives_module(void *start, size_t length) { } + .pushsection .altinstructions, "a" + altinstruction_entry 663f, 661f, \cap, 664f-663f, 662f-661f + .popsection +- .pushsection .altinstr_replacement, "ax" ++ .subsection 1 + .align 2 /* So GAS knows label 661 is suitably aligned */ + 661: + .endm +@@ -179,9 +179,9 @@ static inline void apply_alternatives_module(void *start, size_t length) { } + .macro alternative_else + 662: + .if .Lasm_alt_mode==0 +- .pushsection .altinstr_replacement, "ax" ++ .subsection 1 + .else +- .popsection ++ .previous + .endif + 663: + .endm +@@ -192,7 +192,7 @@ static inline void apply_alternatives_module(void *start, size_t length) { } + .macro alternative_endif + 664: + .if .Lasm_alt_mode==0 +- .popsection ++ .previous + .endif + .org . - (664b-663b) + (662b-661b) + .org . - (662b-661b) + (664b-663b) +diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h +index 7ae54d7d333a..9f0ec21d6327 100644 +--- a/arch/arm64/include/asm/arch_timer.h ++++ b/arch/arm64/include/asm/arch_timer.h +@@ -58,6 +58,7 @@ struct arch_timer_erratum_workaround { + u64 (*read_cntvct_el0)(void); + int (*set_next_event_phys)(unsigned long, struct clock_event_device *); + int (*set_next_event_virt)(unsigned long, struct clock_event_device *); ++ bool disable_compat_vdso; + }; + + DECLARE_PER_CPU(const struct arch_timer_erratum_workaround *, +diff --git a/arch/arm64/include/asm/clocksource.h b/arch/arm64/include/asm/clocksource.h +index 0ece64a26c8c..0c7910447235 100644 +--- a/arch/arm64/include/asm/clocksource.h ++++ b/arch/arm64/include/asm/clocksource.h +@@ -2,8 +2,11 @@ + #ifndef _ASM_CLOCKSOURCE_H + #define _ASM_CLOCKSOURCE_H + ++#include <asm/vdso/clocksource.h> ++ + struct arch_clocksource_data { +- bool vdso_direct; /* Usable for direct VDSO access? */ ++ /* Usable for direct VDSO access? */ ++ enum vdso_arch_clockmode clock_mode; + }; + + #endif +diff --git a/arch/arm64/include/asm/debug-monitors.h b/arch/arm64/include/asm/debug-monitors.h +index 7619f473155f..d825e3585e28 100644 +--- a/arch/arm64/include/asm/debug-monitors.h ++++ b/arch/arm64/include/asm/debug-monitors.h +@@ -109,6 +109,8 @@ void disable_debug_monitors(enum dbg_active_el el); + + void user_rewind_single_step(struct task_struct *task); + void user_fastforward_single_step(struct task_struct *task); ++void user_regs_reset_single_step(struct user_pt_regs *regs, ++ struct task_struct *task); + + void kernel_enable_single_step(struct pt_regs *regs); + void kernel_disable_single_step(void); +diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h +index 65299a2dcf9c..cfc0672013f6 100644 +--- a/arch/arm64/include/asm/syscall.h ++++ b/arch/arm64/include/asm/syscall.h +@@ -34,6 +34,10 @@ static inline long syscall_get_error(struct task_struct *task, + struct pt_regs *regs) + { + unsigned long error = regs->regs[0]; ++ ++ if (is_compat_thread(task_thread_info(task))) ++ error = sign_extend64(error, 31); ++ + return IS_ERR_VALUE(error) ? error : 0; + } + +@@ -47,7 +51,13 @@ static inline void syscall_set_return_value(struct task_struct *task, + struct pt_regs *regs, + int error, long val) + { +- regs->regs[0] = (long) error ? error : val; ++ if (error) ++ val = error; ++ ++ if (is_compat_thread(task_thread_info(task))) ++ val = lower_32_bits(val); ++ ++ regs->regs[0] = val; + } + + #define SYSCALL_MAX_ARGS 6 +diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h +index f0cec4160136..4e3ed702bec7 100644 +--- a/arch/arm64/include/asm/thread_info.h ++++ b/arch/arm64/include/asm/thread_info.h +@@ -91,6 +91,7 @@ void arch_release_task_struct(struct task_struct *tsk); + #define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU) + #define _TIF_UPROBE (1 << TIF_UPROBE) + #define _TIF_FSCHECK (1 << TIF_FSCHECK) ++#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) + #define _TIF_32BIT (1 << TIF_32BIT) + #define _TIF_SVE (1 << TIF_SVE) + +diff --git a/arch/arm64/include/asm/vdso/clocksource.h b/arch/arm64/include/asm/vdso/clocksource.h +new file mode 100644 +index 000000000000..8019f616e1f7 +--- /dev/null ++++ b/arch/arm64/include/asm/vdso/clocksource.h +@@ -0,0 +1,14 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef __ASM_VDSOCLOCKSOURCE_H ++#define __ASM_VDSOCLOCKSOURCE_H ++ ++enum vdso_arch_clockmode { ++ /* vdso clocksource not usable */ ++ VDSO_CLOCKMODE_NONE, ++ /* vdso clocksource for both 32 and 64bit tasks */ ++ VDSO_CLOCKMODE_ARCHTIMER, ++ /* vdso clocksource for 64bit tasks only */ ++ VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT, ++}; ++ ++#endif +diff --git a/arch/arm64/include/asm/vdso/compat_gettimeofday.h b/arch/arm64/include/asm/vdso/compat_gettimeofday.h +index c50ee1b7d5cd..413d42e197c7 100644 +--- a/arch/arm64/include/asm/vdso/compat_gettimeofday.h ++++ b/arch/arm64/include/asm/vdso/compat_gettimeofday.h +@@ -10,6 +10,7 @@ + #include <asm/unistd.h> + #include <uapi/linux/time.h> + ++#include <asm/vdso/clocksource.h> + #include <asm/vdso/compat_barrier.h> + + #define __VDSO_USE_SYSCALL ULLONG_MAX +@@ -117,10 +118,10 @@ static __always_inline u64 __arch_get_hw_counter(s32 clock_mode) + u64 res; + + /* +- * clock_mode == 0 implies that vDSO are enabled otherwise ++ * clock_mode == ARCHTIMER implies that vDSO are enabled otherwise + * fallback on syscall. + */ +- if (clock_mode) ++ if (clock_mode != VDSO_CLOCKMODE_ARCHTIMER) + return __VDSO_USE_SYSCALL; + + /* +diff --git a/arch/arm64/include/asm/vdso/gettimeofday.h b/arch/arm64/include/asm/vdso/gettimeofday.h +index b08f476b72b4..ff83b8b574fc 100644 +--- a/arch/arm64/include/asm/vdso/gettimeofday.h ++++ b/arch/arm64/include/asm/vdso/gettimeofday.h +@@ -10,6 +10,8 @@ + #include <asm/unistd.h> + #include <uapi/linux/time.h> + ++#include <asm/vdso/clocksource.h> ++ + #define __VDSO_USE_SYSCALL ULLONG_MAX + + #define VDSO_HAS_CLOCK_GETRES 1 +@@ -71,10 +73,10 @@ static __always_inline u64 __arch_get_hw_counter(s32 clock_mode) + u64 res; + + /* +- * clock_mode == 0 implies that vDSO are enabled otherwise ++ * clock_mode != NONE implies that vDSO are enabled otherwise + * fallback on syscall. + */ +- if (clock_mode) ++ if (clock_mode == VDSO_CLOCKMODE_NONE) + return __VDSO_USE_SYSCALL; + + /* +diff --git a/arch/arm64/include/asm/vdso/vsyscall.h b/arch/arm64/include/asm/vdso/vsyscall.h +index 0c20a7c1bee5..e50f26741946 100644 +--- a/arch/arm64/include/asm/vdso/vsyscall.h ++++ b/arch/arm64/include/asm/vdso/vsyscall.h +@@ -24,9 +24,7 @@ struct vdso_data *__arm64_get_k_vdso_data(void) + static __always_inline + int __arm64_get_clock_mode(struct timekeeper *tk) + { +- u32 use_syscall = !tk->tkr_mono.clock->archdata.vdso_direct; +- +- return use_syscall; ++ return tk->tkr_mono.clock->archdata.clock_mode; + } + #define __arch_get_clock_mode __arm64_get_clock_mode + +diff --git a/arch/arm64/kernel/alternative.c b/arch/arm64/kernel/alternative.c +index d1757ef1b1e7..73039949b5ce 100644 +--- a/arch/arm64/kernel/alternative.c ++++ b/arch/arm64/kernel/alternative.c +@@ -43,20 +43,8 @@ bool alternative_is_applied(u16 cpufeature) + */ + static bool branch_insn_requires_update(struct alt_instr *alt, unsigned long pc) + { +- unsigned long replptr; +- +- if (kernel_text_address(pc)) +- return true; +- +- replptr = (unsigned long)ALT_REPL_PTR(alt); +- if (pc >= replptr && pc <= (replptr + alt->alt_len)) +- return false; +- +- /* +- * Branching into *another* alternate sequence is doomed, and +- * we're not even trying to fix it up. +- */ +- BUG(); ++ unsigned long replptr = (unsigned long)ALT_REPL_PTR(alt); ++ return !(pc >= replptr && pc <= (replptr + alt->alt_len)); + } + + #define align_down(x, a) ((unsigned long)(x) & ~(((unsigned long)(a)) - 1)) +diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c +index 48222a4760c2..7569deb1eac1 100644 +--- a/arch/arm64/kernel/debug-monitors.c ++++ b/arch/arm64/kernel/debug-monitors.c +@@ -141,17 +141,20 @@ postcore_initcall(debug_monitors_init); + /* + * Single step API and exception handling. + */ +-static void set_regs_spsr_ss(struct pt_regs *regs) ++static void set_user_regs_spsr_ss(struct user_pt_regs *regs) + { + regs->pstate |= DBG_SPSR_SS; + } +-NOKPROBE_SYMBOL(set_regs_spsr_ss); ++NOKPROBE_SYMBOL(set_user_regs_spsr_ss); + +-static void clear_regs_spsr_ss(struct pt_regs *regs) ++static void clear_user_regs_spsr_ss(struct user_pt_regs *regs) + { + regs->pstate &= ~DBG_SPSR_SS; + } +-NOKPROBE_SYMBOL(clear_regs_spsr_ss); ++NOKPROBE_SYMBOL(clear_user_regs_spsr_ss); ++ ++#define set_regs_spsr_ss(r) set_user_regs_spsr_ss(&(r)->user_regs) ++#define clear_regs_spsr_ss(r) clear_user_regs_spsr_ss(&(r)->user_regs) + + static DEFINE_SPINLOCK(debug_hook_lock); + static LIST_HEAD(user_step_hook); +@@ -404,6 +407,15 @@ void user_fastforward_single_step(struct task_struct *task) + clear_regs_spsr_ss(task_pt_regs(task)); + } + ++void user_regs_reset_single_step(struct user_pt_regs *regs, ++ struct task_struct *task) ++{ ++ if (test_tsk_thread_flag(task, TIF_SINGLESTEP)) ++ set_user_regs_spsr_ss(regs); ++ else ++ clear_user_regs_spsr_ss(regs); ++} ++ + /* Kernel API */ + void kernel_enable_single_step(struct pt_regs *regs) + { +diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c +index 8d2d9d5b418f..30b877f8b85e 100644 +--- a/arch/arm64/kernel/ptrace.c ++++ b/arch/arm64/kernel/ptrace.c +@@ -1819,12 +1819,23 @@ static void tracehook_report_syscall(struct pt_regs *regs, + saved_reg = regs->regs[regno]; + regs->regs[regno] = dir; + +- if (dir == PTRACE_SYSCALL_EXIT) ++ if (dir == PTRACE_SYSCALL_ENTER) { ++ if (tracehook_report_syscall_entry(regs)) ++ forget_syscall(regs); ++ regs->regs[regno] = saved_reg; ++ } else if (!test_thread_flag(TIF_SINGLESTEP)) { + tracehook_report_syscall_exit(regs, 0); +- else if (tracehook_report_syscall_entry(regs)) +- forget_syscall(regs); ++ regs->regs[regno] = saved_reg; ++ } else { ++ regs->regs[regno] = saved_reg; + +- regs->regs[regno] = saved_reg; ++ /* ++ * Signal a pseudo-step exception since we are stepping but ++ * tracer modifications to the registers may have rewound the ++ * state machine. ++ */ ++ tracehook_report_syscall_exit(regs, 1); ++ } + } + + int syscall_trace_enter(struct pt_regs *regs) +@@ -1852,12 +1863,14 @@ int syscall_trace_enter(struct pt_regs *regs) + + void syscall_trace_exit(struct pt_regs *regs) + { ++ unsigned long flags = READ_ONCE(current_thread_info()->flags); ++ + audit_syscall_exit(regs); + +- if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) ++ if (flags & _TIF_SYSCALL_TRACEPOINT) + trace_sys_exit(regs, regs_return_value(regs)); + +- if (test_thread_flag(TIF_SYSCALL_TRACE)) ++ if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP)) + tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT); + + rseq_syscall(regs); +@@ -1935,8 +1948,8 @@ static int valid_native_regs(struct user_pt_regs *regs) + */ + int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task) + { +- if (!test_tsk_thread_flag(task, TIF_SINGLESTEP)) +- regs->pstate &= ~DBG_SPSR_SS; ++ /* https://lore.kernel.org/lkml/20191118131525.GA4180@willie-the-truck */ ++ user_regs_reset_single_step(regs, task); + + if (is_compat_thread(task_thread_info(task))) + return valid_compat_regs(regs); +diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c +index dd2cdc0d5be2..ddb757b2c3e5 100644 +--- a/arch/arm64/kernel/signal.c ++++ b/arch/arm64/kernel/signal.c +@@ -782,7 +782,6 @@ static void setup_restart_syscall(struct pt_regs *regs) + */ + static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) + { +- struct task_struct *tsk = current; + sigset_t *oldset = sigmask_to_save(); + int usig = ksig->sig; + int ret; +@@ -806,14 +805,8 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) + */ + ret |= !valid_user_regs(®s->user_regs, current); + +- /* +- * Fast forward the stepping logic so we step into the signal +- * handler. +- */ +- if (!ret) +- user_fastforward_single_step(tsk); +- +- signal_setup_done(ret, ksig, 0); ++ /* Step into the signal handler if we are stepping */ ++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP)); + } + + /* +diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c +index 871c739f060a..1457a0ba83db 100644 +--- a/arch/arm64/kernel/syscall.c ++++ b/arch/arm64/kernel/syscall.c +@@ -50,6 +50,9 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno, + ret = do_ni_syscall(regs, scno); + } + ++ if (is_compat_task()) ++ ret = lower_32_bits(ret); ++ + regs->regs[0] = ret; + } + +@@ -121,7 +124,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, + if (!has_syscall_work(flags) && !IS_ENABLED(CONFIG_DEBUG_RSEQ)) { + local_daif_mask(); + flags = current_thread_info()->flags; +- if (!has_syscall_work(flags)) { ++ if (!has_syscall_work(flags) && !(flags & _TIF_SINGLESTEP)) { + /* + * We're off to userspace, where interrupts are + * always enabled after we restore the flags from +diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S +index e1af25dbc57e..8d0374ffdd2d 100644 +--- a/arch/arm64/kernel/vmlinux.lds.S ++++ b/arch/arm64/kernel/vmlinux.lds.S +@@ -172,9 +172,6 @@ SECTIONS + *(.altinstructions) + __alt_instructions_end = .; + } +- .altinstr_replacement : { +- *(.altinstr_replacement) +- } + + . = ALIGN(PAGE_SIZE); + __inittext_end = .; +diff --git a/arch/ia64/configs/zx1_defconfig b/arch/ia64/configs/zx1_defconfig +index 8c92e095f8bb..d42f79a33e91 100644 +--- a/arch/ia64/configs/zx1_defconfig ++++ b/arch/ia64/configs/zx1_defconfig +@@ -35,7 +35,6 @@ CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_CHR_DEV_OSST=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_LOGGING=y +diff --git a/arch/m68k/configs/amiga_defconfig b/arch/m68k/configs/amiga_defconfig +index 9a33c1c006a1..cf8103fa2f34 100644 +--- a/arch/m68k/configs/amiga_defconfig ++++ b/arch/m68k/configs/amiga_defconfig +@@ -334,7 +334,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/apollo_defconfig b/arch/m68k/configs/apollo_defconfig +index 7fdbc797a05d..5636288a4b45 100644 +--- a/arch/m68k/configs/apollo_defconfig ++++ b/arch/m68k/configs/apollo_defconfig +@@ -319,7 +319,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/atari_defconfig b/arch/m68k/configs/atari_defconfig +index f1763405a539..015a7f401ffd 100644 +--- a/arch/m68k/configs/atari_defconfig ++++ b/arch/m68k/configs/atari_defconfig +@@ -334,7 +334,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/bvme6000_defconfig b/arch/m68k/configs/bvme6000_defconfig +index 91154d6acb31..1209430e61e1 100644 +--- a/arch/m68k/configs/bvme6000_defconfig ++++ b/arch/m68k/configs/bvme6000_defconfig +@@ -316,7 +316,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/hp300_defconfig b/arch/m68k/configs/hp300_defconfig +index c398c4a94d95..a41b16067f5c 100644 +--- a/arch/m68k/configs/hp300_defconfig ++++ b/arch/m68k/configs/hp300_defconfig +@@ -318,7 +318,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/mac_defconfig b/arch/m68k/configs/mac_defconfig +index 350d004559be..8af104a8c000 100644 +--- a/arch/m68k/configs/mac_defconfig ++++ b/arch/m68k/configs/mac_defconfig +@@ -325,7 +325,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/multi_defconfig b/arch/m68k/configs/multi_defconfig +index b838dd820348..354ff30e22c9 100644 +--- a/arch/m68k/configs/multi_defconfig ++++ b/arch/m68k/configs/multi_defconfig +@@ -358,7 +358,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/mvme147_defconfig b/arch/m68k/configs/mvme147_defconfig +index 3f8dd61559cf..eac7685cea42 100644 +--- a/arch/m68k/configs/mvme147_defconfig ++++ b/arch/m68k/configs/mvme147_defconfig +@@ -315,7 +315,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/mvme16x_defconfig b/arch/m68k/configs/mvme16x_defconfig +index ae3b2d4f636c..0f38c4a3c87a 100644 +--- a/arch/m68k/configs/mvme16x_defconfig ++++ b/arch/m68k/configs/mvme16x_defconfig +@@ -316,7 +316,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/q40_defconfig b/arch/m68k/configs/q40_defconfig +index cd61ef14b582..6ede6869db1c 100644 +--- a/arch/m68k/configs/q40_defconfig ++++ b/arch/m68k/configs/q40_defconfig +@@ -324,7 +324,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/sun3_defconfig b/arch/m68k/configs/sun3_defconfig +index 151f5371cd3d..8644c4789938 100644 +--- a/arch/m68k/configs/sun3_defconfig ++++ b/arch/m68k/configs/sun3_defconfig +@@ -313,7 +313,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/configs/sun3x_defconfig b/arch/m68k/configs/sun3x_defconfig +index 1dcb0ee1fe98..f2fd0da2346e 100644 +--- a/arch/m68k/configs/sun3x_defconfig ++++ b/arch/m68k/configs/sun3x_defconfig +@@ -313,7 +313,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SAS_ATTRS=m +diff --git a/arch/m68k/kernel/setup_no.c b/arch/m68k/kernel/setup_no.c +index 3c5def10d486..caa260f877f2 100644 +--- a/arch/m68k/kernel/setup_no.c ++++ b/arch/m68k/kernel/setup_no.c +@@ -139,7 +139,8 @@ void __init setup_arch(char **cmdline_p) + pr_debug("MEMORY -> ROMFS=0x%p-0x%06lx MEM=0x%06lx-0x%06lx\n ", + __bss_stop, memory_start, memory_start, memory_end); + +- memblock_add(memory_start, memory_end - memory_start); ++ memblock_add(_rambase, memory_end - _rambase); ++ memblock_reserve(_rambase, memory_start - _rambase); + + /* Keep a copy of command line */ + *cmdline_p = &command_line[0]; +diff --git a/arch/m68k/mm/mcfmmu.c b/arch/m68k/mm/mcfmmu.c +index 6cb1e41d58d0..70a5f55ea664 100644 +--- a/arch/m68k/mm/mcfmmu.c ++++ b/arch/m68k/mm/mcfmmu.c +@@ -164,7 +164,7 @@ void __init cf_bootmem_alloc(void) + m68k_memory[0].addr = _rambase; + m68k_memory[0].size = _ramend - _rambase; + +- memblock_add(m68k_memory[0].addr, m68k_memory[0].size); ++ memblock_add_node(m68k_memory[0].addr, m68k_memory[0].size, 0); + + /* compute total pages in system */ + num_pages = PFN_DOWN(_ramend - _rambase); +diff --git a/arch/mips/configs/bigsur_defconfig b/arch/mips/configs/bigsur_defconfig +index f14ad0538f4e..eea9b613bb74 100644 +--- a/arch/mips/configs/bigsur_defconfig ++++ b/arch/mips/configs/bigsur_defconfig +@@ -112,7 +112,6 @@ CONFIG_BLK_DEV_TC86C001=m + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_CHR_DEV_SCH=m + CONFIG_ATA=y +diff --git a/arch/mips/configs/fuloong2e_defconfig b/arch/mips/configs/fuloong2e_defconfig +index 7a7af706e898..c5f66b7f2b22 100644 +--- a/arch/mips/configs/fuloong2e_defconfig ++++ b/arch/mips/configs/fuloong2e_defconfig +@@ -99,7 +99,6 @@ CONFIG_CDROM_PKTCDVD=m + CONFIG_ATA_OVER_ETH=m + CONFIG_BLK_DEV_SD=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + # CONFIG_SCSI_LOWLEVEL is not set +diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig +index 82d942a6026e..638d7cf5ef01 100644 +--- a/arch/mips/configs/ip27_defconfig ++++ b/arch/mips/configs/ip27_defconfig +@@ -99,7 +99,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_BLK_DEV_SR=m +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_CHR_DEV_SCH=m + CONFIG_SCSI_CONSTANTS=y +diff --git a/arch/mips/configs/ip32_defconfig b/arch/mips/configs/ip32_defconfig +index 370884018aad..7b1fab518317 100644 +--- a/arch/mips/configs/ip32_defconfig ++++ b/arch/mips/configs/ip32_defconfig +@@ -50,7 +50,6 @@ CONFIG_RAID_ATTRS=y + CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_LOGGING=y +diff --git a/arch/mips/configs/jazz_defconfig b/arch/mips/configs/jazz_defconfig +index 328d4dfeb4cb..982b990469af 100644 +--- a/arch/mips/configs/jazz_defconfig ++++ b/arch/mips/configs/jazz_defconfig +@@ -191,7 +191,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=m +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SCAN_ASYNC=y + CONFIG_SCSI_FC_ATTRS=y +diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig +index 59eedf55419d..211bd3d6e6cb 100644 +--- a/arch/mips/configs/malta_defconfig ++++ b/arch/mips/configs/malta_defconfig +@@ -239,7 +239,6 @@ CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_CHR_DEV_OSST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_LOGGING=y +diff --git a/arch/mips/configs/malta_kvm_defconfig b/arch/mips/configs/malta_kvm_defconfig +index 8ef612552a19..62b1969b4f55 100644 +--- a/arch/mips/configs/malta_kvm_defconfig ++++ b/arch/mips/configs/malta_kvm_defconfig +@@ -247,7 +247,6 @@ CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_CHR_DEV_OSST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_LOGGING=y +diff --git a/arch/mips/configs/malta_kvm_guest_defconfig b/arch/mips/configs/malta_kvm_guest_defconfig +index d2a008c9907c..9185e0a0aa45 100644 +--- a/arch/mips/configs/malta_kvm_guest_defconfig ++++ b/arch/mips/configs/malta_kvm_guest_defconfig +@@ -245,7 +245,6 @@ CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_CHR_DEV_OSST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_LOGGING=y +diff --git a/arch/mips/configs/maltaup_xpa_defconfig b/arch/mips/configs/maltaup_xpa_defconfig +index 970df6d42728..636311d67a53 100644 +--- a/arch/mips/configs/maltaup_xpa_defconfig ++++ b/arch/mips/configs/maltaup_xpa_defconfig +@@ -245,7 +245,6 @@ CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_CHR_DEV_OSST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_LOGGING=y +diff --git a/arch/mips/configs/rm200_defconfig b/arch/mips/configs/rm200_defconfig +index 2c7adea7638f..30d7c3db884e 100644 +--- a/arch/mips/configs/rm200_defconfig ++++ b/arch/mips/configs/rm200_defconfig +@@ -203,7 +203,6 @@ CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=m +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SCAN_ASYNC=y + CONFIG_SCSI_FC_ATTRS=y +diff --git a/arch/powerpc/configs/85xx-hw.config b/arch/powerpc/configs/85xx-hw.config +index 9575a38c9155..b507df6ac69f 100644 +--- a/arch/powerpc/configs/85xx-hw.config ++++ b/arch/powerpc/configs/85xx-hw.config +@@ -2,7 +2,6 @@ CONFIG_AQUANTIA_PHY=y + CONFIG_AT803X_PHY=y + CONFIG_ATA=y + CONFIG_BLK_DEV_SD=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_BLK_DEV_SR=y + CONFIG_BROADCOM_PHY=y + CONFIG_C293_PCIE=y +diff --git a/arch/powerpc/configs/amigaone_defconfig b/arch/powerpc/configs/amigaone_defconfig +index cf94d28d0e31..340140160c7b 100644 +--- a/arch/powerpc/configs/amigaone_defconfig ++++ b/arch/powerpc/configs/amigaone_defconfig +@@ -47,7 +47,6 @@ CONFIG_BLK_DEV_RAM=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SYM53C8XX_2=y +diff --git a/arch/powerpc/configs/chrp32_defconfig b/arch/powerpc/configs/chrp32_defconfig +index 9ff493dd8439..6c5a4414e9ee 100644 +--- a/arch/powerpc/configs/chrp32_defconfig ++++ b/arch/powerpc/configs/chrp32_defconfig +@@ -45,7 +45,6 @@ CONFIG_BLK_DEV_RAM=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SYM53C8XX_2=y +diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig +index fbfcc85e4dc0..a68c7f3af10e 100644 +--- a/arch/powerpc/configs/g5_defconfig ++++ b/arch/powerpc/configs/g5_defconfig +@@ -62,7 +62,6 @@ CONFIG_CDROM_PKTCDVD=m + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SPI_ATTRS=y +diff --git a/arch/powerpc/configs/maple_defconfig b/arch/powerpc/configs/maple_defconfig +index 2975e64629aa..161351a18517 100644 +--- a/arch/powerpc/configs/maple_defconfig ++++ b/arch/powerpc/configs/maple_defconfig +@@ -41,7 +41,6 @@ CONFIG_BLK_DEV_RAM_SIZE=8192 + # CONFIG_SCSI_PROC_FS is not set + CONFIG_BLK_DEV_SD=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_IPR=y + CONFIG_ATA=y +diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig +index 4b6d31d4474e..08b7f4cef243 100644 +--- a/arch/powerpc/configs/pasemi_defconfig ++++ b/arch/powerpc/configs/pasemi_defconfig +@@ -60,7 +60,6 @@ CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_CHR_DEV_OSST=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_CHR_DEV_SCH=y + CONFIG_SCSI_CONSTANTS=y +diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig +index 4e6e95f92646..5cad09f93562 100644 +--- a/arch/powerpc/configs/pmac32_defconfig ++++ b/arch/powerpc/configs/pmac32_defconfig +@@ -119,7 +119,6 @@ CONFIG_BLK_DEV_RAM=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_FC_ATTRS=y +diff --git a/arch/powerpc/configs/powernv_defconfig b/arch/powerpc/configs/powernv_defconfig +index 6658cceb928c..2a7c53cc2f83 100644 +--- a/arch/powerpc/configs/powernv_defconfig ++++ b/arch/powerpc/configs/powernv_defconfig +@@ -111,7 +111,6 @@ CONFIG_BLK_DEV_NVME=y + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=m +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SCAN_ASYNC=y +diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig +index b250e6f5a7ca..5569d36066dc 100644 +--- a/arch/powerpc/configs/ppc64_defconfig ++++ b/arch/powerpc/configs/ppc64_defconfig +@@ -110,7 +110,6 @@ CONFIG_VIRTIO_BLK=m + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_FC_ATTRS=y +diff --git a/arch/powerpc/configs/ppc64e_defconfig b/arch/powerpc/configs/ppc64e_defconfig +index 0d746774c2bd..33a01a9e86be 100644 +--- a/arch/powerpc/configs/ppc64e_defconfig ++++ b/arch/powerpc/configs/ppc64e_defconfig +@@ -60,7 +60,6 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_FC_ATTRS=y +diff --git a/arch/powerpc/configs/ppc6xx_defconfig b/arch/powerpc/configs/ppc6xx_defconfig +index 9dca4cffa623..1372a1a7517a 100644 +--- a/arch/powerpc/configs/ppc6xx_defconfig ++++ b/arch/powerpc/configs/ppc6xx_defconfig +@@ -372,7 +372,6 @@ CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_CHR_DEV_OSST=m + CONFIG_BLK_DEV_SR=m +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_CHR_DEV_SCH=m + CONFIG_SCSI_ENCLOSURE=m +diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig +index 26126b4d4de3..d58686a66388 100644 +--- a/arch/powerpc/configs/pseries_defconfig ++++ b/arch/powerpc/configs/pseries_defconfig +@@ -97,7 +97,6 @@ CONFIG_VIRTIO_BLK=m + CONFIG_BLK_DEV_SD=y + CONFIG_CHR_DEV_ST=m + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_FC_ATTRS=y +diff --git a/arch/powerpc/configs/skiroot_defconfig b/arch/powerpc/configs/skiroot_defconfig +index 1253482a67c0..2e25b264f70f 100644 +--- a/arch/powerpc/configs/skiroot_defconfig ++++ b/arch/powerpc/configs/skiroot_defconfig +@@ -83,7 +83,6 @@ CONFIG_EEPROM_AT24=m + # CONFIG_OCXL is not set + CONFIG_BLK_DEV_SD=m + CONFIG_BLK_DEV_SR=m +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SCAN_ASYNC=y +diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c +index 3f91ccaa9c74..4ea0cca52e16 100644 +--- a/arch/powerpc/kernel/paca.c ++++ b/arch/powerpc/kernel/paca.c +@@ -86,7 +86,7 @@ static void *__init alloc_shared_lppaca(unsigned long size, unsigned long align, + * This is very early in boot, so no harm done if the kernel crashes at + * this point. + */ +- BUG_ON(shared_lppaca_size >= shared_lppaca_total_size); ++ BUG_ON(shared_lppaca_size > shared_lppaca_total_size); + + return ptr; + } +diff --git a/arch/powerpc/mm/book3s64/pkeys.c b/arch/powerpc/mm/book3s64/pkeys.c +index ae7fca40e5b3..66f307e873dc 100644 +--- a/arch/powerpc/mm/book3s64/pkeys.c ++++ b/arch/powerpc/mm/book3s64/pkeys.c +@@ -367,12 +367,14 @@ static bool pkey_access_permitted(int pkey, bool write, bool execute) + return true; + + pkey_shift = pkeyshift(pkey); +- if (execute && !(read_iamr() & (IAMR_EX_BIT << pkey_shift))) +- return true; ++ if (execute) ++ return !(read_iamr() & (IAMR_EX_BIT << pkey_shift)); ++ ++ amr = read_amr(); ++ if (write) ++ return !(amr & (AMR_WR_BIT << pkey_shift)); + +- amr = read_amr(); /* Delay reading amr until absolutely needed */ +- return ((!write && !(amr & (AMR_RD_BIT << pkey_shift))) || +- (write && !(amr & (AMR_WR_BIT << pkey_shift)))); ++ return !(amr & (AMR_RD_BIT << pkey_shift)); + } + + bool arch_pte_access_permitted(u64 pte, bool write, bool execute) +diff --git a/arch/riscv/include/asm/thread_info.h b/arch/riscv/include/asm/thread_info.h +index 905372d7eeb8..3df9a82bdbfd 100644 +--- a/arch/riscv/include/asm/thread_info.h ++++ b/arch/riscv/include/asm/thread_info.h +@@ -12,7 +12,11 @@ + #include <linux/const.h> + + /* thread information allocation */ ++#ifdef CONFIG_64BIT ++#define THREAD_SIZE_ORDER (2) ++#else + #define THREAD_SIZE_ORDER (1) ++#endif + #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) + + #ifndef __ASSEMBLY__ +diff --git a/arch/sh/configs/sh03_defconfig b/arch/sh/configs/sh03_defconfig +index e5beb625ab88..87db9a84b5ec 100644 +--- a/arch/sh/configs/sh03_defconfig ++++ b/arch/sh/configs/sh03_defconfig +@@ -46,7 +46,6 @@ CONFIG_BLK_DEV_IDETAPE=m + CONFIG_SCSI=m + CONFIG_BLK_DEV_SD=m + CONFIG_BLK_DEV_SR=m +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_NETDEVICES=y + CONFIG_NET_ETHERNET=y +diff --git a/arch/sparc/configs/sparc64_defconfig b/arch/sparc/configs/sparc64_defconfig +index 6c325d53a20a..bde4d21a8ac8 100644 +--- a/arch/sparc/configs/sparc64_defconfig ++++ b/arch/sparc/configs/sparc64_defconfig +@@ -73,7 +73,6 @@ CONFIG_RAID_ATTRS=m + CONFIG_SCSI=y + CONFIG_BLK_DEV_SD=y + CONFIG_BLK_DEV_SR=m +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=m + CONFIG_SCSI_MULTI_LUN=y + CONFIG_SCSI_CONSTANTS=y +diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig +index 59ce9ed58430..18806b4fb26a 100644 +--- a/arch/x86/configs/i386_defconfig ++++ b/arch/x86/configs/i386_defconfig +@@ -137,7 +137,6 @@ CONFIG_CONNECTOR=y + CONFIG_BLK_DEV_LOOP=y + CONFIG_BLK_DEV_SD=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SPI_ATTRS=y +diff --git a/arch/x86/configs/x86_64_defconfig b/arch/x86/configs/x86_64_defconfig +index d0a5ffeae8df..3087c5e351e7 100644 +--- a/arch/x86/configs/x86_64_defconfig ++++ b/arch/x86/configs/x86_64_defconfig +@@ -136,7 +136,6 @@ CONFIG_CONNECTOR=y + CONFIG_BLK_DEV_LOOP=y + CONFIG_BLK_DEV_SD=y + CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y + CONFIG_CHR_DEV_SG=y + CONFIG_SCSI_CONSTANTS=y + CONFIG_SCSI_SPI_ATTRS=y +diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h +index 44c48e34d799..00eac7f1529b 100644 +--- a/arch/x86/include/asm/fpu/internal.h ++++ b/arch/x86/include/asm/fpu/internal.h +@@ -619,6 +619,11 @@ static inline void switch_fpu_finish(struct fpu *new_fpu) + * MXCSR and XCR definitions: + */ + ++static inline void ldmxcsr(u32 mxcsr) ++{ ++ asm volatile("ldmxcsr %0" :: "m" (mxcsr)); ++} ++ + extern unsigned int mxcsr_feature_mask; + + #define XCR_XFEATURE_ENABLED_MASK 0x00000000 +diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c +index 2c5676b0a6e7..18c0dca08163 100644 +--- a/arch/x86/kernel/apic/vector.c ++++ b/arch/x86/kernel/apic/vector.c +@@ -446,12 +446,10 @@ static int x86_vector_activate(struct irq_domain *dom, struct irq_data *irqd, + trace_vector_activate(irqd->irq, apicd->is_managed, + apicd->can_reserve, reserve); + +- /* Nothing to do for fixed assigned vectors */ +- if (!apicd->can_reserve && !apicd->is_managed) +- return 0; +- + raw_spin_lock_irqsave(&vector_lock, flags); +- if (reserve || irqd_is_managed_and_shutdown(irqd)) ++ if (!apicd->can_reserve && !apicd->is_managed) ++ assign_irq_vector_any_locked(irqd); ++ else if (reserve || irqd_is_managed_and_shutdown(irqd)) + vector_assign_managed_shutdown(irqd); + else if (apicd->is_managed) + ret = activate_managed(irqd); +@@ -769,20 +767,10 @@ void lapic_offline(void) + static int apic_set_affinity(struct irq_data *irqd, + const struct cpumask *dest, bool force) + { +- struct apic_chip_data *apicd = apic_chip_data(irqd); + int err; + +- /* +- * Core code can call here for inactive interrupts. For inactive +- * interrupts which use managed or reservation mode there is no +- * point in going through the vector assignment right now as the +- * activation will assign a vector which fits the destination +- * cpumask. Let the core code store the destination mask and be +- * done with it. +- */ +- if (!irqd_is_activated(irqd) && +- (apicd->is_managed || apicd->can_reserve)) +- return IRQ_SET_MASK_OK; ++ if (WARN_ON_ONCE(!irqd_is_activated(irqd))) ++ return -EIO; + + raw_spin_lock(&vector_lock); + cpumask_and(vector_searchmask, dest, cpu_online_mask); +diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c +index 12c70840980e..cd8839027f66 100644 +--- a/arch/x86/kernel/fpu/core.c ++++ b/arch/x86/kernel/fpu/core.c +@@ -101,6 +101,12 @@ void kernel_fpu_begin(void) + copy_fpregs_to_fpstate(¤t->thread.fpu); + } + __cpu_invalidate_fpregs_state(); ++ ++ if (boot_cpu_has(X86_FEATURE_XMM)) ++ ldmxcsr(MXCSR_DEFAULT); ++ ++ if (boot_cpu_has(X86_FEATURE_FPU)) ++ asm volatile ("fninit"); + } + EXPORT_SYMBOL_GPL(kernel_fpu_begin); + +diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c +index c94fec268ef2..755eb26cbec0 100644 +--- a/arch/x86/kernel/fpu/xstate.c ++++ b/arch/x86/kernel/fpu/xstate.c +@@ -1017,7 +1017,7 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of + copy_part(offsetof(struct fxregs_state, st_space), 128, + &xsave->i387.st_space, &kbuf, &offset_start, &count); + if (header.xfeatures & XFEATURE_MASK_SSE) +- copy_part(xstate_offsets[XFEATURE_MASK_SSE], 256, ++ copy_part(xstate_offsets[XFEATURE_SSE], 256, + &xsave->i387.xmm_space, &kbuf, &offset_start, &count); + /* + * Fill xsave->i387.sw_reserved value for ptrace frame: +diff --git a/block/blk-merge.c b/block/blk-merge.c +index 48e6725b32ee..93cff719b066 100644 +--- a/block/blk-merge.c ++++ b/block/blk-merge.c +@@ -157,17 +157,20 @@ static inline unsigned get_max_io_size(struct request_queue *q, + return sectors & (lbs - 1); + } + +-static unsigned get_max_segment_size(const struct request_queue *q, +- unsigned offset) ++static inline unsigned get_max_segment_size(const struct request_queue *q, ++ struct page *start_page, ++ unsigned long offset) + { + unsigned long mask = queue_segment_boundary(q); + +- /* default segment boundary mask means no boundary limit */ +- if (mask == BLK_SEG_BOUNDARY_MASK) +- return queue_max_segment_size(q); ++ offset = mask & (page_to_phys(start_page) + offset); + +- return min_t(unsigned long, mask - (mask & offset) + 1, +- queue_max_segment_size(q)); ++ /* ++ * overflow may be triggered in case of zero page physical address ++ * on 32bit arch, use queue's max segment size when that happens. ++ */ ++ return min_not_zero(mask - offset + 1, ++ (unsigned long)queue_max_segment_size(q)); + } + + /** +@@ -201,7 +204,8 @@ static bool bvec_split_segs(const struct request_queue *q, + unsigned seg_size = 0; + + while (len && *nsegs < max_segs) { +- seg_size = get_max_segment_size(q, bv->bv_offset + total_len); ++ seg_size = get_max_segment_size(q, bv->bv_page, ++ bv->bv_offset + total_len); + seg_size = min(seg_size, len); + + (*nsegs)++; +@@ -404,7 +408,8 @@ static unsigned blk_bvec_map_sg(struct request_queue *q, + + while (nbytes > 0) { + unsigned offset = bvec->bv_offset + total; +- unsigned len = min(get_max_segment_size(q, offset), nbytes); ++ unsigned len = min(get_max_segment_size(q, bvec->bv_page, ++ offset), nbytes); + struct page *page = bvec->bv_page; + + /* +diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c +index b3f2ba483992..121f4c1e0697 100644 +--- a/block/blk-mq-debugfs.c ++++ b/block/blk-mq-debugfs.c +@@ -125,6 +125,9 @@ static const char *const blk_queue_flag_name[] = { + QUEUE_FLAG_NAME(REGISTERED), + QUEUE_FLAG_NAME(SCSI_PASSTHROUGH), + QUEUE_FLAG_NAME(QUIESCED), ++ QUEUE_FLAG_NAME(PCI_P2PDMA), ++ QUEUE_FLAG_NAME(ZONE_RESETALL), ++ QUEUE_FLAG_NAME(RQ_ALLOC_TIME), + }; + #undef QUEUE_FLAG_NAME + +diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c +index d7f43d4ea925..e5fae4e838c0 100644 +--- a/crypto/asymmetric_keys/public_key.c ++++ b/crypto/asymmetric_keys/public_key.c +@@ -119,6 +119,7 @@ static int software_key_query(const struct kernel_pkey_params *params, + if (IS_ERR(tfm)) + return PTR_ERR(tfm); + ++ ret = -ENOMEM; + key = kmalloc(pkey->keylen + sizeof(u32) * 2 + pkey->paramlen, + GFP_KERNEL); + if (!key) +diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c +index e63fd7bfd3a5..5bcb4c01ec5f 100644 +--- a/drivers/acpi/video_detect.c ++++ b/drivers/acpi/video_detect.c +@@ -336,6 +336,25 @@ static const struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"), + }, + }, ++ { ++ .callback = video_detect_force_native, ++ .ident = "Acer Aspire 5738z", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Acer"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"), ++ DMI_MATCH(DMI_BOARD_NAME, "JV50"), ++ }, ++ }, ++ { ++ /* https://bugzilla.kernel.org/show_bug.cgi?id=207835 */ ++ .callback = video_detect_force_native, ++ .ident = "Acer TravelMate 5735Z", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Acer"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5735Z"), ++ DMI_MATCH(DMI_BOARD_NAME, "BA51_MV"), ++ }, ++ }, + + /* + * Desktops which falsely report a backlight and which our heuristics +diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c +index e72843fe41df..e16afa27700d 100644 +--- a/drivers/base/regmap/regmap-debugfs.c ++++ b/drivers/base/regmap/regmap-debugfs.c +@@ -457,29 +457,31 @@ static ssize_t regmap_cache_only_write_file(struct file *file, + { + struct regmap *map = container_of(file->private_data, + struct regmap, cache_only); +- ssize_t result; +- bool was_enabled, require_sync = false; ++ bool new_val, require_sync = false; + int err; + +- map->lock(map->lock_arg); ++ err = kstrtobool_from_user(user_buf, count, &new_val); ++ /* Ignore malforned data like debugfs_write_file_bool() */ ++ if (err) ++ return count; + +- was_enabled = map->cache_only; ++ err = debugfs_file_get(file->f_path.dentry); ++ if (err) ++ return err; + +- result = debugfs_write_file_bool(file, user_buf, count, ppos); +- if (result < 0) { +- map->unlock(map->lock_arg); +- return result; +- } ++ map->lock(map->lock_arg); + +- if (map->cache_only && !was_enabled) { ++ if (new_val && !map->cache_only) { + dev_warn(map->dev, "debugfs cache_only=Y forced\n"); + add_taint(TAINT_USER, LOCKDEP_STILL_OK); +- } else if (!map->cache_only && was_enabled) { ++ } else if (!new_val && map->cache_only) { + dev_warn(map->dev, "debugfs cache_only=N forced: syncing cache\n"); + require_sync = true; + } ++ map->cache_only = new_val; + + map->unlock(map->lock_arg); ++ debugfs_file_put(file->f_path.dentry); + + if (require_sync) { + err = regcache_sync(map); +@@ -487,7 +489,7 @@ static ssize_t regmap_cache_only_write_file(struct file *file, + dev_err(map->dev, "Failed to sync cache %d\n", err); + } + +- return result; ++ return count; + } + + static const struct file_operations regmap_cache_only_fops = { +@@ -502,28 +504,32 @@ static ssize_t regmap_cache_bypass_write_file(struct file *file, + { + struct regmap *map = container_of(file->private_data, + struct regmap, cache_bypass); +- ssize_t result; +- bool was_enabled; ++ bool new_val; ++ int err; + +- map->lock(map->lock_arg); ++ err = kstrtobool_from_user(user_buf, count, &new_val); ++ /* Ignore malforned data like debugfs_write_file_bool() */ ++ if (err) ++ return count; + +- was_enabled = map->cache_bypass; ++ err = debugfs_file_get(file->f_path.dentry); ++ if (err) ++ return err; + +- result = debugfs_write_file_bool(file, user_buf, count, ppos); +- if (result < 0) +- goto out; ++ map->lock(map->lock_arg); + +- if (map->cache_bypass && !was_enabled) { ++ if (new_val && !map->cache_bypass) { + dev_warn(map->dev, "debugfs cache_bypass=Y forced\n"); + add_taint(TAINT_USER, LOCKDEP_STILL_OK); +- } else if (!map->cache_bypass && was_enabled) { ++ } else if (!new_val && map->cache_bypass) { + dev_warn(map->dev, "debugfs cache_bypass=N forced\n"); + } ++ map->cache_bypass = new_val; + +-out: + map->unlock(map->lock_arg); ++ debugfs_file_put(file->f_path.dentry); + +- return result; ++ return count; + } + + static const struct file_operations regmap_cache_bypass_fops = { +diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c +index 1bf4a908a0bd..36d49159140f 100644 +--- a/drivers/block/zram/zram_drv.c ++++ b/drivers/block/zram/zram_drv.c +@@ -2023,7 +2023,8 @@ static ssize_t hot_add_show(struct class *class, + return ret; + return scnprintf(buf, PAGE_SIZE, "%d\n", ret); + } +-static CLASS_ATTR_RO(hot_add); ++static struct class_attribute class_attr_hot_add = ++ __ATTR(hot_add, 0400, hot_add_show, NULL); + + static ssize_t hot_remove_store(struct class *class, + struct class_attribute *attr, +diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c +index 553c0e279621..f8bc052cd853 100644 +--- a/drivers/bus/ti-sysc.c ++++ b/drivers/bus/ti-sysc.c +@@ -70,11 +70,13 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = { + * @child_needs_resume: runtime resume needed for child on resume from suspend + * @disable_on_idle: status flag used for disabling modules with resets + * @idle_work: work structure used to perform delayed idle on a module +- * @clk_enable_quirk: module specific clock enable quirk +- * @clk_disable_quirk: module specific clock disable quirk ++ * @pre_reset_quirk: module specific pre-reset quirk ++ * @post_reset_quirk: module specific post-reset quirk + * @reset_done_quirk: module specific reset done quirk + * @module_enable_quirk: module specific enable quirk + * @module_disable_quirk: module specific disable quirk ++ * @module_unlock_quirk: module specific sysconfig unlock quirk ++ * @module_lock_quirk: module specific sysconfig lock quirk + */ + struct sysc { + struct device *dev; +@@ -97,11 +99,13 @@ struct sysc { + unsigned int needs_resume:1; + unsigned int child_needs_resume:1; + struct delayed_work idle_work; +- void (*clk_enable_quirk)(struct sysc *sysc); +- void (*clk_disable_quirk)(struct sysc *sysc); ++ void (*pre_reset_quirk)(struct sysc *sysc); ++ void (*post_reset_quirk)(struct sysc *sysc); + void (*reset_done_quirk)(struct sysc *sysc); + void (*module_enable_quirk)(struct sysc *sysc); + void (*module_disable_quirk)(struct sysc *sysc); ++ void (*module_unlock_quirk)(struct sysc *sysc); ++ void (*module_lock_quirk)(struct sysc *sysc); + }; + + static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np, +@@ -182,6 +186,34 @@ static u32 sysc_read_sysstatus(struct sysc *ddata) + return sysc_read(ddata, offset); + } + ++/* Poll on reset status */ ++static int sysc_wait_softreset(struct sysc *ddata) ++{ ++ u32 sysc_mask, syss_done, rstval; ++ int syss_offset, error = 0; ++ ++ syss_offset = ddata->offsets[SYSC_SYSSTATUS]; ++ sysc_mask = BIT(ddata->cap->regbits->srst_shift); ++ ++ if (ddata->cfg.quirks & SYSS_QUIRK_RESETDONE_INVERTED) ++ syss_done = 0; ++ else ++ syss_done = ddata->cfg.syss_mask; ++ ++ if (syss_offset >= 0) { ++ error = readx_poll_timeout_atomic(sysc_read_sysstatus, ddata, ++ rstval, (rstval & ddata->cfg.syss_mask) == ++ syss_done, 100, MAX_MODULE_SOFTRESET_WAIT); ++ ++ } else if (ddata->cfg.quirks & SYSC_QUIRK_RESET_STATUS) { ++ error = readx_poll_timeout_atomic(sysc_read_sysconfig, ddata, ++ rstval, !(rstval & sysc_mask), ++ 100, MAX_MODULE_SOFTRESET_WAIT); ++ } ++ ++ return error; ++} ++ + static int sysc_add_named_clock_from_child(struct sysc *ddata, + const char *name, + const char *optfck_name) +@@ -863,6 +895,22 @@ static void sysc_show_registers(struct sysc *ddata) + buf); + } + ++/** ++ * sysc_write_sysconfig - handle sysconfig quirks for register write ++ * @ddata: device driver data ++ * @value: register value ++ */ ++static void sysc_write_sysconfig(struct sysc *ddata, u32 value) ++{ ++ if (ddata->module_unlock_quirk) ++ ddata->module_unlock_quirk(ddata); ++ ++ sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], value); ++ ++ if (ddata->module_lock_quirk) ++ ddata->module_lock_quirk(ddata); ++} ++ + #define SYSC_IDLE_MASK (SYSC_NR_IDLEMODES - 1) + #define SYSC_CLOCACT_ICK 2 + +@@ -872,8 +920,34 @@ static int sysc_enable_module(struct device *dev) + struct sysc *ddata; + const struct sysc_regbits *regbits; + u32 reg, idlemodes, best_mode; ++ int error; + + ddata = dev_get_drvdata(dev); ++ ++ /* ++ * Some modules like DSS reset automatically on idle. Enable optional ++ * reset clocks and wait for OCP softreset to complete. ++ */ ++ if (ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_IN_RESET) { ++ error = sysc_enable_opt_clocks(ddata); ++ if (error) { ++ dev_err(ddata->dev, ++ "Optional clocks failed for enable: %i\n", ++ error); ++ return error; ++ } ++ } ++ error = sysc_wait_softreset(ddata); ++ if (error) ++ dev_warn(ddata->dev, "OCP softreset timed out\n"); ++ if (ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_IN_RESET) ++ sysc_disable_opt_clocks(ddata); ++ ++ /* ++ * Some subsystem private interconnects, like DSS top level module, ++ * need only the automatic OCP softreset handling with no sysconfig ++ * register bits to configure. ++ */ + if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV) + return 0; + +@@ -912,7 +986,7 @@ static int sysc_enable_module(struct device *dev) + + reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift); + reg |= best_mode << regbits->sidle_shift; +- sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); ++ sysc_write_sysconfig(ddata, reg); + + set_midle: + /* Set MIDLE mode */ +@@ -931,14 +1005,14 @@ set_midle: + + reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift); + reg |= best_mode << regbits->midle_shift; +- sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); ++ sysc_write_sysconfig(ddata, reg); + + set_autoidle: + /* Autoidle bit must enabled separately if available */ + if (regbits->autoidle_shift >= 0 && + ddata->cfg.sysc_val & BIT(regbits->autoidle_shift)) { + reg |= 1 << regbits->autoidle_shift; +- sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); ++ sysc_write_sysconfig(ddata, reg); + } + + /* Flush posted write */ +@@ -999,7 +1073,7 @@ static int sysc_disable_module(struct device *dev) + + reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift); + reg |= best_mode << regbits->midle_shift; +- sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); ++ sysc_write_sysconfig(ddata, reg); + + set_sidle: + /* Set SIDLE mode */ +@@ -1022,7 +1096,7 @@ set_sidle: + if (regbits->autoidle_shift >= 0 && + ddata->cfg.sysc_val & BIT(regbits->autoidle_shift)) + reg |= 1 << regbits->autoidle_shift; +- sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); ++ sysc_write_sysconfig(ddata, reg); + + /* Flush posted write */ + sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]); +@@ -1171,7 +1245,8 @@ static int __maybe_unused sysc_noirq_suspend(struct device *dev) + + ddata = dev_get_drvdata(dev); + +- if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE) ++ if (ddata->cfg.quirks & ++ (SYSC_QUIRK_LEGACY_IDLE | SYSC_QUIRK_NO_IDLE)) + return 0; + + return pm_runtime_force_suspend(dev); +@@ -1183,7 +1258,8 @@ static int __maybe_unused sysc_noirq_resume(struct device *dev) + + ddata = dev_get_drvdata(dev); + +- if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE) ++ if (ddata->cfg.quirks & ++ (SYSC_QUIRK_LEGACY_IDLE | SYSC_QUIRK_NO_IDLE)) + return 0; + + return pm_runtime_force_resume(dev); +@@ -1231,16 +1307,16 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { + SYSC_QUIRK_LEGACY_IDLE), + SYSC_QUIRK("sham", 0, 0x100, 0x110, 0x114, 0x40000c03, 0xffffffff, + SYSC_QUIRK_LEGACY_IDLE), +- SYSC_QUIRK("smartreflex", 0, -1, 0x24, -1, 0x00000000, 0xffffffff, ++ SYSC_QUIRK("smartreflex", 0, -ENODEV, 0x24, -ENODEV, 0x00000000, 0xffffffff, + SYSC_QUIRK_LEGACY_IDLE), +- SYSC_QUIRK("smartreflex", 0, -1, 0x38, -1, 0x00000000, 0xffffffff, ++ SYSC_QUIRK("smartreflex", 0, -ENODEV, 0x38, -ENODEV, 0x00000000, 0xffffffff, + SYSC_QUIRK_LEGACY_IDLE), + SYSC_QUIRK("timer", 0, 0, 0x10, 0x14, 0x00000015, 0xffffffff, + 0), + /* Some timers on omap4 and later */ +- SYSC_QUIRK("timer", 0, 0, 0x10, -1, 0x50002100, 0xffffffff, ++ SYSC_QUIRK("timer", 0, 0, 0x10, -ENODEV, 0x50002100, 0xffffffff, + 0), +- SYSC_QUIRK("timer", 0, 0, 0x10, -1, 0x4fff1301, 0xffff00ff, ++ SYSC_QUIRK("timer", 0, 0, 0x10, -ENODEV, 0x4fff1301, 0xffff00ff, + 0), + SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000046, 0xffffffff, + SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE), +@@ -1253,19 +1329,27 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { + SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE), + + /* Quirks that need to be set based on the module address */ +- SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -1, 0x50000800, 0xffffffff, ++ SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -ENODEV, 0x50000800, 0xffffffff, + SYSC_QUIRK_EXT_OPT_CLOCK | SYSC_QUIRK_NO_RESET_ON_INIT | + SYSC_QUIRK_SWSUP_SIDLE), + + /* Quirks that need to be set based on detected module */ +- SYSC_QUIRK("aess", 0, 0, 0x10, -1, 0x40000000, 0xffffffff, ++ SYSC_QUIRK("aess", 0, 0, 0x10, -ENODEV, 0x40000000, 0xffffffff, + SYSC_MODULE_QUIRK_AESS), +- SYSC_QUIRK("dcan", 0x48480000, 0x20, -1, -1, 0xa3170504, 0xffffffff, ++ SYSC_QUIRK("dcan", 0x48480000, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff, + SYSC_QUIRK_CLKDM_NOAUTO), +- SYSC_QUIRK("dwc3", 0x48880000, 0, 0x10, -1, 0x500a0200, 0xffffffff, ++ SYSC_QUIRK("dss", 0x4832a000, 0, 0x10, 0x14, 0x00000020, 0xffffffff, ++ SYSC_QUIRK_OPT_CLKS_IN_RESET), ++ SYSC_QUIRK("dss", 0x58000000, 0, -ENODEV, 0x14, 0x00000040, 0xffffffff, ++ SYSC_QUIRK_OPT_CLKS_IN_RESET), ++ SYSC_QUIRK("dss", 0x58000000, 0, -ENODEV, 0x14, 0x00000061, 0xffffffff, ++ SYSC_QUIRK_OPT_CLKS_IN_RESET), ++ SYSC_QUIRK("dwc3", 0x48880000, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff, + SYSC_QUIRK_CLKDM_NOAUTO), +- SYSC_QUIRK("dwc3", 0x488c0000, 0, 0x10, -1, 0x500a0200, 0xffffffff, ++ SYSC_QUIRK("dwc3", 0x488c0000, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff, + SYSC_QUIRK_CLKDM_NOAUTO), ++ SYSC_QUIRK("hdmi", 0, 0, 0x10, -ENODEV, 0x50030200, 0xffffffff, ++ SYSC_QUIRK_OPT_CLKS_NEEDED), + SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff, + SYSC_MODULE_QUIRK_HDQ1W), + SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff, +@@ -1278,12 +1362,18 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { + SYSC_MODULE_QUIRK_I2C), + SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0, + SYSC_MODULE_QUIRK_I2C), +- SYSC_QUIRK("gpu", 0x50000000, 0x14, -1, -1, 0x00010201, 0xffffffff, 0), +- SYSC_QUIRK("gpu", 0x50000000, 0xfe00, 0xfe10, -1, 0x40000000 , 0xffffffff, ++ SYSC_QUIRK("gpu", 0x50000000, 0x14, -ENODEV, -ENODEV, 0x00010201, 0xffffffff, 0), ++ SYSC_QUIRK("gpu", 0x50000000, 0xfe00, 0xfe10, -ENODEV, 0x40000000 , 0xffffffff, + SYSC_MODULE_QUIRK_SGX), ++ SYSC_QUIRK("rtc", 0, 0x74, 0x78, -ENODEV, 0x4eb01908, 0xffff00f0, ++ SYSC_MODULE_QUIRK_RTC_UNLOCK), ++ SYSC_QUIRK("tptc", 0, 0, 0x10, -ENODEV, 0x40006c00, 0xffffefff, ++ SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), ++ SYSC_QUIRK("tptc", 0, 0, -ENODEV, -ENODEV, 0x40007c00, 0xffffffff, ++ SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), + SYSC_QUIRK("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000050, + 0xffffffff, SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), +- SYSC_QUIRK("usb_otg_hs", 0, 0, 0x10, -1, 0x4ea2080d, 0xffffffff, ++ SYSC_QUIRK("usb_otg_hs", 0, 0, 0x10, -ENODEV, 0x4ea2080d, 0xffffffff, + SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), + SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0, + SYSC_MODULE_QUIRK_WDT), +@@ -1292,57 +1382,68 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { + SYSC_MODULE_QUIRK_WDT | SYSC_QUIRK_SWSUP_SIDLE), + + #ifdef DEBUG +- SYSC_QUIRK("adc", 0, 0, 0x10, -1, 0x47300001, 0xffffffff, 0), +- SYSC_QUIRK("atl", 0, 0, -1, -1, 0x0a070100, 0xffffffff, 0), +- SYSC_QUIRK("cm", 0, 0, -1, -1, 0x40000301, 0xffffffff, 0), +- SYSC_QUIRK("control", 0, 0, 0x10, -1, 0x40000900, 0xffffffff, 0), ++ SYSC_QUIRK("adc", 0, 0, 0x10, -ENODEV, 0x47300001, 0xffffffff, 0), ++ SYSC_QUIRK("atl", 0, 0, -ENODEV, -ENODEV, 0x0a070100, 0xffffffff, 0), ++ SYSC_QUIRK("cm", 0, 0, -ENODEV, -ENODEV, 0x40000301, 0xffffffff, 0), ++ SYSC_QUIRK("control", 0, 0, 0x10, -ENODEV, 0x40000900, 0xffffffff, 0), + SYSC_QUIRK("cpgmac", 0, 0x1200, 0x1208, 0x1204, 0x4edb1902, + 0xffff00f0, 0), +- SYSC_QUIRK("dcan", 0, 0x20, -1, -1, 0xa3170504, 0xffffffff, 0), +- SYSC_QUIRK("dcan", 0, 0x20, -1, -1, 0x4edb1902, 0xffffffff, 0), +- SYSC_QUIRK("dmic", 0, 0, 0x10, -1, 0x50010000, 0xffffffff, 0), +- SYSC_QUIRK("dwc3", 0, 0, 0x10, -1, 0x500a0200, 0xffffffff, 0), ++ SYSC_QUIRK("dcan", 0, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff, 0), ++ SYSC_QUIRK("dcan", 0, 0x20, -ENODEV, -ENODEV, 0x4edb1902, 0xffffffff, 0), ++ SYSC_QUIRK("dispc", 0x4832a400, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0), ++ SYSC_QUIRK("dispc", 0x58001000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0), ++ SYSC_QUIRK("dispc", 0x58001000, 0, 0x10, 0x14, 0x00000051, 0xffffffff, 0), ++ SYSC_QUIRK("dmic", 0, 0, 0x10, -ENODEV, 0x50010000, 0xffffffff, 0), ++ SYSC_QUIRK("dsi", 0x58004000, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0), ++ SYSC_QUIRK("dsi", 0x58005000, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0), ++ SYSC_QUIRK("dsi", 0x58005000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0), ++ SYSC_QUIRK("dsi", 0x58009000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0), ++ SYSC_QUIRK("dwc3", 0, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff, 0), + SYSC_QUIRK("d2d", 0x4a0b6000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0), + SYSC_QUIRK("d2d", 0x4a0cd000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0), +- SYSC_QUIRK("epwmss", 0, 0, 0x4, -1, 0x47400001, 0xffffffff, 0), +- SYSC_QUIRK("gpu", 0, 0x1fc00, 0x1fc10, -1, 0, 0, 0), +- SYSC_QUIRK("gpu", 0, 0xfe00, 0xfe10, -1, 0x40000000 , 0xffffffff, 0), ++ SYSC_QUIRK("epwmss", 0, 0, 0x4, -ENODEV, 0x47400001, 0xffffffff, 0), ++ SYSC_QUIRK("gpu", 0, 0x1fc00, 0x1fc10, -ENODEV, 0, 0, 0), ++ SYSC_QUIRK("gpu", 0, 0xfe00, 0xfe10, -ENODEV, 0x40000000 , 0xffffffff, 0), ++ SYSC_QUIRK("hdmi", 0, 0, 0x10, -ENODEV, 0x50031d00, 0xffffffff, 0), + SYSC_QUIRK("hsi", 0, 0, 0x10, 0x14, 0x50043101, 0xffffffff, 0), +- SYSC_QUIRK("iss", 0, 0, 0x10, -1, 0x40000101, 0xffffffff, 0), +- SYSC_QUIRK("lcdc", 0, 0, 0x54, -1, 0x4f201000, 0xffffffff, 0), +- SYSC_QUIRK("mcasp", 0, 0, 0x4, -1, 0x44306302, 0xffffffff, 0), +- SYSC_QUIRK("mcasp", 0, 0, 0x4, -1, 0x44307b02, 0xffffffff, 0), +- SYSC_QUIRK("mcbsp", 0, -1, 0x8c, -1, 0, 0, 0), +- SYSC_QUIRK("mcspi", 0, 0, 0x10, -1, 0x40300a0b, 0xffff00ff, 0), ++ SYSC_QUIRK("iss", 0, 0, 0x10, -ENODEV, 0x40000101, 0xffffffff, 0), ++ SYSC_QUIRK("lcdc", 0, 0, 0x54, -ENODEV, 0x4f201000, 0xffffffff, 0), ++ SYSC_QUIRK("mcasp", 0, 0, 0x4, -ENODEV, 0x44306302, 0xffffffff, 0), ++ SYSC_QUIRK("mcasp", 0, 0, 0x4, -ENODEV, 0x44307b02, 0xffffffff, 0), ++ SYSC_QUIRK("mcbsp", 0, -ENODEV, 0x8c, -ENODEV, 0, 0, 0), ++ SYSC_QUIRK("mcspi", 0, 0, 0x10, -ENODEV, 0x40300a0b, 0xffff00ff, 0), + SYSC_QUIRK("mcspi", 0, 0, 0x110, 0x114, 0x40300a0b, 0xffffffff, 0), +- SYSC_QUIRK("mailbox", 0, 0, 0x10, -1, 0x00000400, 0xffffffff, 0), +- SYSC_QUIRK("m3", 0, 0, -1, -1, 0x5f580105, 0x0fff0f00, 0), ++ SYSC_QUIRK("mailbox", 0, 0, 0x10, -ENODEV, 0x00000400, 0xffffffff, 0), ++ SYSC_QUIRK("m3", 0, 0, -ENODEV, -ENODEV, 0x5f580105, 0x0fff0f00, 0), + SYSC_QUIRK("ocp2scp", 0, 0, 0x10, 0x14, 0x50060005, 0xfffffff0, 0), +- SYSC_QUIRK("ocp2scp", 0, 0, -1, -1, 0x50060007, 0xffffffff, 0), +- SYSC_QUIRK("padconf", 0, 0, 0x10, -1, 0x4fff0800, 0xffffffff, 0), +- SYSC_QUIRK("padconf", 0, 0, -1, -1, 0x40001100, 0xffffffff, 0), +- SYSC_QUIRK("prcm", 0, 0, -1, -1, 0x40000100, 0xffffffff, 0), +- SYSC_QUIRK("prcm", 0, 0, -1, -1, 0x00004102, 0xffffffff, 0), +- SYSC_QUIRK("prcm", 0, 0, -1, -1, 0x40000400, 0xffffffff, 0), +- SYSC_QUIRK("scm", 0, 0, 0x10, -1, 0x40000900, 0xffffffff, 0), +- SYSC_QUIRK("scm", 0, 0, -1, -1, 0x4e8b0100, 0xffffffff, 0), +- SYSC_QUIRK("scm", 0, 0, -1, -1, 0x4f000100, 0xffffffff, 0), +- SYSC_QUIRK("scm", 0, 0, -1, -1, 0x40000900, 0xffffffff, 0), +- SYSC_QUIRK("scrm", 0, 0, -1, -1, 0x00000010, 0xffffffff, 0), +- SYSC_QUIRK("sdio", 0, 0, 0x10, -1, 0x40202301, 0xffff0ff0, 0), ++ SYSC_QUIRK("ocp2scp", 0, 0, -ENODEV, -ENODEV, 0x50060007, 0xffffffff, 0), ++ SYSC_QUIRK("padconf", 0, 0, 0x10, -ENODEV, 0x4fff0800, 0xffffffff, 0), ++ SYSC_QUIRK("padconf", 0, 0, -ENODEV, -ENODEV, 0x40001100, 0xffffffff, 0), ++ SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x40000100, 0xffffffff, 0), ++ SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x00004102, 0xffffffff, 0), ++ SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x40000400, 0xffffffff, 0), ++ SYSC_QUIRK("rfbi", 0x4832a800, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0), ++ SYSC_QUIRK("rfbi", 0x58002000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0), ++ SYSC_QUIRK("scm", 0, 0, 0x10, -ENODEV, 0x40000900, 0xffffffff, 0), ++ SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x4e8b0100, 0xffffffff, 0), ++ SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x4f000100, 0xffffffff, 0), ++ SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x40000900, 0xffffffff, 0), ++ SYSC_QUIRK("scrm", 0, 0, -ENODEV, -ENODEV, 0x00000010, 0xffffffff, 0), ++ SYSC_QUIRK("sdio", 0, 0, 0x10, -ENODEV, 0x40202301, 0xffff0ff0, 0), + SYSC_QUIRK("sdio", 0, 0x2fc, 0x110, 0x114, 0x31010000, 0xffffffff, 0), + SYSC_QUIRK("sdma", 0, 0, 0x2c, 0x28, 0x00010900, 0xffffffff, 0), +- SYSC_QUIRK("slimbus", 0, 0, 0x10, -1, 0x40000902, 0xffffffff, 0), +- SYSC_QUIRK("slimbus", 0, 0, 0x10, -1, 0x40002903, 0xffffffff, 0), +- SYSC_QUIRK("spinlock", 0, 0, 0x10, -1, 0x50020000, 0xffffffff, 0), +- SYSC_QUIRK("rng", 0, 0x1fe0, 0x1fe4, -1, 0x00000020, 0xffffffff, 0), +- SYSC_QUIRK("rtc", 0, 0x74, 0x78, -1, 0x4eb01908, 0xffff00f0, 0), +- SYSC_QUIRK("timer32k", 0, 0, 0x4, -1, 0x00000060, 0xffffffff, 0), ++ SYSC_QUIRK("slimbus", 0, 0, 0x10, -ENODEV, 0x40000902, 0xffffffff, 0), ++ SYSC_QUIRK("slimbus", 0, 0, 0x10, -ENODEV, 0x40002903, 0xffffffff, 0), ++ SYSC_QUIRK("spinlock", 0, 0, 0x10, -ENODEV, 0x50020000, 0xffffffff, 0), ++ SYSC_QUIRK("rng", 0, 0x1fe0, 0x1fe4, -ENODEV, 0x00000020, 0xffffffff, 0), ++ SYSC_QUIRK("timer32k", 0, 0, 0x4, -ENODEV, 0x00000060, 0xffffffff, 0), ++ SYSC_QUIRK("tpcc", 0, 0, -ENODEV, -ENODEV, 0x40014c00, 0xffffffff, 0), + SYSC_QUIRK("usbhstll", 0, 0, 0x10, 0x14, 0x00000004, 0xffffffff, 0), + SYSC_QUIRK("usbhstll", 0, 0, 0x10, 0x14, 0x00000008, 0xffffffff, 0), + SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, 0x14, 0x50700100, 0xffffffff, 0), +- SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, -1, 0x50700101, 0xffffffff, 0), +- SYSC_QUIRK("vfpe", 0, 0, 0x104, -1, 0x4d001200, 0xffffffff, 0), ++ SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, -ENODEV, 0x50700101, 0xffffffff, 0), ++ SYSC_QUIRK("venc", 0x58003000, 0, -ENODEV, -ENODEV, 0x00000002, 0xffffffff, 0), ++ SYSC_QUIRK("vfpe", 0, 0, 0x104, -ENODEV, 0x4d001200, 0xffffffff, 0), + #endif + }; + +@@ -1364,16 +1465,13 @@ static void sysc_init_early_quirks(struct sysc *ddata) + if (q->base != ddata->module_pa) + continue; + +- if (q->rev_offset >= 0 && +- q->rev_offset != ddata->offsets[SYSC_REVISION]) ++ if (q->rev_offset != ddata->offsets[SYSC_REVISION]) + continue; + +- if (q->sysc_offset >= 0 && +- q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG]) ++ if (q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG]) + continue; + +- if (q->syss_offset >= 0 && +- q->syss_offset != ddata->offsets[SYSC_SYSSTATUS]) ++ if (q->syss_offset != ddata->offsets[SYSC_SYSSTATUS]) + continue; + + ddata->name = q->name; +@@ -1393,16 +1491,13 @@ static void sysc_init_revision_quirks(struct sysc *ddata) + if (q->base && q->base != ddata->module_pa) + continue; + +- if (q->rev_offset >= 0 && +- q->rev_offset != ddata->offsets[SYSC_REVISION]) ++ if (q->rev_offset != ddata->offsets[SYSC_REVISION]) + continue; + +- if (q->sysc_offset >= 0 && +- q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG]) ++ if (q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG]) + continue; + +- if (q->syss_offset >= 0 && +- q->syss_offset != ddata->offsets[SYSC_SYSSTATUS]) ++ if (q->syss_offset != ddata->offsets[SYSC_SYSSTATUS]) + continue; + + if (q->revision == ddata->revision || +@@ -1433,7 +1528,7 @@ static void sysc_module_enable_quirk_aess(struct sysc *ddata) + sysc_write(ddata, offset, 1); + } + +-/* I2C needs extra enable bit toggling for reset */ ++/* I2C needs to be disabled for reset */ + static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable) + { + int offset; +@@ -1454,14 +1549,48 @@ static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable) + sysc_write(ddata, offset, val); + } + +-static void sysc_clk_enable_quirk_i2c(struct sysc *ddata) ++static void sysc_pre_reset_quirk_i2c(struct sysc *ddata) ++{ ++ sysc_clk_quirk_i2c(ddata, false); ++} ++ ++static void sysc_post_reset_quirk_i2c(struct sysc *ddata) + { + sysc_clk_quirk_i2c(ddata, true); + } + +-static void sysc_clk_disable_quirk_i2c(struct sysc *ddata) ++/* RTC on am3 and 4 needs to be unlocked and locked for sysconfig */ ++static void sysc_quirk_rtc(struct sysc *ddata, bool lock) + { +- sysc_clk_quirk_i2c(ddata, false); ++ u32 val, kick0_val = 0, kick1_val = 0; ++ unsigned long flags; ++ int error; ++ ++ if (!lock) { ++ kick0_val = 0x83e70b13; ++ kick1_val = 0x95a4f1e0; ++ } ++ ++ local_irq_save(flags); ++ /* RTC_STATUS BUSY bit may stay active for 1/32768 seconds (~30 usec) */ ++ error = readl_poll_timeout_atomic(ddata->module_va + 0x44, val, ++ !(val & BIT(0)), 100, 50); ++ if (error) ++ dev_warn(ddata->dev, "rtc busy timeout\n"); ++ /* Now we have ~15 microseconds to read/write various registers */ ++ sysc_write(ddata, 0x6c, kick0_val); ++ sysc_write(ddata, 0x70, kick1_val); ++ local_irq_restore(flags); ++} ++ ++static void sysc_module_unlock_quirk_rtc(struct sysc *ddata) ++{ ++ sysc_quirk_rtc(ddata, false); ++} ++ ++static void sysc_module_lock_quirk_rtc(struct sysc *ddata) ++{ ++ sysc_quirk_rtc(ddata, true); + } + + /* 36xx SGX needs a quirk for to bypass OCP IPG interrupt logic */ +@@ -1503,14 +1632,14 @@ static void sysc_init_module_quirks(struct sysc *ddata) + return; + + if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_HDQ1W) { +- ddata->clk_disable_quirk = sysc_pre_reset_quirk_hdq1w; ++ ddata->pre_reset_quirk = sysc_pre_reset_quirk_hdq1w; + + return; + } + + if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_I2C) { +- ddata->clk_enable_quirk = sysc_clk_enable_quirk_i2c; +- ddata->clk_disable_quirk = sysc_clk_disable_quirk_i2c; ++ ddata->pre_reset_quirk = sysc_pre_reset_quirk_i2c; ++ ddata->post_reset_quirk = sysc_post_reset_quirk_i2c; + + return; + } +@@ -1518,6 +1647,13 @@ static void sysc_init_module_quirks(struct sysc *ddata) + if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_AESS) + ddata->module_enable_quirk = sysc_module_enable_quirk_aess; + ++ if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_RTC_UNLOCK) { ++ ddata->module_unlock_quirk = sysc_module_unlock_quirk_rtc; ++ ddata->module_lock_quirk = sysc_module_lock_quirk_rtc; ++ ++ return; ++ } ++ + if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_SGX) + ddata->module_enable_quirk = sysc_module_enable_quirk_sgx; + +@@ -1611,11 +1747,10 @@ static int sysc_rstctrl_reset_deassert(struct sysc *ddata, bool reset) + */ + static int sysc_reset(struct sysc *ddata) + { +- int sysc_offset, syss_offset, sysc_val, rstval, error = 0; +- u32 sysc_mask, syss_done; ++ int sysc_offset, sysc_val, error; ++ u32 sysc_mask; + + sysc_offset = ddata->offsets[SYSC_SYSCONFIG]; +- syss_offset = ddata->offsets[SYSC_SYSSTATUS]; + + if (ddata->legacy_mode || sysc_offset < 0 || + ddata->cap->regbits->srst_shift < 0 || +@@ -1624,13 +1759,8 @@ static int sysc_reset(struct sysc *ddata) + + sysc_mask = BIT(ddata->cap->regbits->srst_shift); + +- if (ddata->cfg.quirks & SYSS_QUIRK_RESETDONE_INVERTED) +- syss_done = 0; +- else +- syss_done = ddata->cfg.syss_mask; +- +- if (ddata->clk_disable_quirk) +- ddata->clk_disable_quirk(ddata); ++ if (ddata->pre_reset_quirk) ++ ddata->pre_reset_quirk(ddata); + + sysc_val = sysc_read_sysconfig(ddata); + sysc_val |= sysc_mask; +@@ -1640,21 +1770,12 @@ static int sysc_reset(struct sysc *ddata) + usleep_range(ddata->cfg.srst_udelay, + ddata->cfg.srst_udelay * 2); + +- if (ddata->clk_enable_quirk) +- ddata->clk_enable_quirk(ddata); ++ if (ddata->post_reset_quirk) ++ ddata->post_reset_quirk(ddata); + +- /* Poll on reset status */ +- if (syss_offset >= 0) { +- error = readx_poll_timeout(sysc_read_sysstatus, ddata, rstval, +- (rstval & ddata->cfg.syss_mask) == +- syss_done, +- 100, MAX_MODULE_SOFTRESET_WAIT); +- +- } else if (ddata->cfg.quirks & SYSC_QUIRK_RESET_STATUS) { +- error = readx_poll_timeout(sysc_read_sysconfig, ddata, rstval, +- !(rstval & sysc_mask), +- 100, MAX_MODULE_SOFTRESET_WAIT); +- } ++ error = sysc_wait_softreset(ddata); ++ if (error) ++ dev_warn(ddata->dev, "OCP softreset timed out\n"); + + if (ddata->reset_done_quirk) + ddata->reset_done_quirk(ddata); +diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c +index bdcf8f25cd0d..63f6bed78d89 100644 +--- a/drivers/char/tpm/tpm_tis_core.c ++++ b/drivers/char/tpm/tpm_tis_core.c +@@ -1006,7 +1006,7 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, + + return 0; + out_err: +- if ((chip->ops != NULL) && (chip->ops->clk_enable != NULL)) ++ if (chip->ops->clk_enable != NULL) + chip->ops->clk_enable(chip, false); + + tpm_tis_remove(chip); +diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c +index 3259426f01dc..9ebce2c12c43 100644 +--- a/drivers/char/virtio_console.c ++++ b/drivers/char/virtio_console.c +@@ -2118,6 +2118,7 @@ static struct virtio_device_id id_table[] = { + { VIRTIO_ID_CONSOLE, VIRTIO_DEV_ANY_ID }, + { 0 }, + }; ++MODULE_DEVICE_TABLE(virtio, id_table); + + static unsigned int features[] = { + VIRTIO_CONSOLE_F_SIZE, +@@ -2130,6 +2131,7 @@ static struct virtio_device_id rproc_serial_id_table[] = { + #endif + { 0 }, + }; ++MODULE_DEVICE_TABLE(virtio, rproc_serial_id_table); + + static unsigned int rproc_serial_features[] = { + }; +@@ -2282,6 +2284,5 @@ static void __exit fini(void) + module_init(init); + module_exit(fini); + +-MODULE_DEVICE_TABLE(virtio, id_table); + MODULE_DESCRIPTION("Virtio console driver"); + MODULE_LICENSE("GPL"); +diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c +index 675cab6fa781..7015974f24b4 100644 +--- a/drivers/clk/clk-ast2600.c ++++ b/drivers/clk/clk-ast2600.c +@@ -130,6 +130,18 @@ static const struct clk_div_table ast2600_eclk_div_table[] = { + { 0 } + }; + ++static const struct clk_div_table ast2600_emmc_extclk_div_table[] = { ++ { 0x0, 2 }, ++ { 0x1, 4 }, ++ { 0x2, 6 }, ++ { 0x3, 8 }, ++ { 0x4, 10 }, ++ { 0x5, 12 }, ++ { 0x6, 14 }, ++ { 0x7, 16 }, ++ { 0 } ++}; ++ + static const struct clk_div_table ast2600_mac_div_table[] = { + { 0x0, 4 }, + { 0x1, 4 }, +@@ -389,6 +401,11 @@ static struct clk_hw *aspeed_g6_clk_hw_register_gate(struct device *dev, + return hw; + } + ++static const char *const emmc_extclk_parent_names[] = { ++ "emmc_extclk_hpll_in", ++ "mpll", ++}; ++ + static const char * const vclk_parent_names[] = { + "dpll", + "d1pll", +@@ -458,16 +475,32 @@ static int aspeed_g6_clk_probe(struct platform_device *pdev) + return PTR_ERR(hw); + aspeed_g6_clk_data->hws[ASPEED_CLK_UARTX] = hw; + +- /* EMMC ext clock divider */ +- hw = clk_hw_register_gate(dev, "emmc_extclk_gate", "hpll", 0, +- scu_g6_base + ASPEED_G6_CLK_SELECTION1, 15, 0, +- &aspeed_g6_clk_lock); ++ /* EMMC ext clock */ ++ hw = clk_hw_register_fixed_factor(dev, "emmc_extclk_hpll_in", "hpll", ++ 0, 1, 2); + if (IS_ERR(hw)) + return PTR_ERR(hw); +- hw = clk_hw_register_divider_table(dev, "emmc_extclk", "emmc_extclk_gate", 0, +- scu_g6_base + ASPEED_G6_CLK_SELECTION1, 12, 3, 0, +- ast2600_div_table, +- &aspeed_g6_clk_lock); ++ ++ hw = clk_hw_register_mux(dev, "emmc_extclk_mux", ++ emmc_extclk_parent_names, ++ ARRAY_SIZE(emmc_extclk_parent_names), 0, ++ scu_g6_base + ASPEED_G6_CLK_SELECTION1, 11, 1, ++ 0, &aspeed_g6_clk_lock); ++ if (IS_ERR(hw)) ++ return PTR_ERR(hw); ++ ++ hw = clk_hw_register_gate(dev, "emmc_extclk_gate", "emmc_extclk_mux", ++ 0, scu_g6_base + ASPEED_G6_CLK_SELECTION1, ++ 15, 0, &aspeed_g6_clk_lock); ++ if (IS_ERR(hw)) ++ return PTR_ERR(hw); ++ ++ hw = clk_hw_register_divider_table(dev, "emmc_extclk", ++ "emmc_extclk_gate", 0, ++ scu_g6_base + ++ ASPEED_G6_CLK_SELECTION1, 12, ++ 3, 0, ast2600_emmc_extclk_div_table, ++ &aspeed_g6_clk_lock); + if (IS_ERR(hw)) + return PTR_ERR(hw); + aspeed_g6_clk_data->hws[ASPEED_CLK_EMMC] = hw; +diff --git a/drivers/clk/mvebu/Kconfig b/drivers/clk/mvebu/Kconfig +index 415e6906a113..76cd06f4ed62 100644 +--- a/drivers/clk/mvebu/Kconfig ++++ b/drivers/clk/mvebu/Kconfig +@@ -42,6 +42,7 @@ config ARMADA_AP806_SYSCON + + config ARMADA_AP_CPU_CLK + bool ++ select ARMADA_AP_CP_HELPER + + config ARMADA_CP110_SYSCON + bool +diff --git a/drivers/clk/qcom/gcc-sm8150.c b/drivers/clk/qcom/gcc-sm8150.c +index e3959ff5cb55..fad42897a7a7 100644 +--- a/drivers/clk/qcom/gcc-sm8150.c ++++ b/drivers/clk/qcom/gcc-sm8150.c +@@ -1615,6 +1615,36 @@ static struct clk_branch gcc_gpu_cfg_ahb_clk = { + }, + }; + ++static struct clk_branch gcc_gpu_gpll0_clk_src = { ++ .clkr = { ++ .enable_reg = 0x52004, ++ .enable_mask = BIT(15), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_gpu_gpll0_clk_src", ++ .parent_hws = (const struct clk_hw *[]){ ++ &gpll0.clkr.hw }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_gpu_gpll0_div_clk_src = { ++ .clkr = { ++ .enable_reg = 0x52004, ++ .enable_mask = BIT(16), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_gpu_gpll0_div_clk_src", ++ .parent_hws = (const struct clk_hw *[]){ ++ &gcc_gpu_gpll0_clk_src.clkr.hw }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ + static struct clk_branch gcc_gpu_iref_clk = { + .halt_reg = 0x8c010, + .halt_check = BRANCH_HALT, +@@ -1697,6 +1727,36 @@ static struct clk_branch gcc_npu_cfg_ahb_clk = { + }, + }; + ++static struct clk_branch gcc_npu_gpll0_clk_src = { ++ .clkr = { ++ .enable_reg = 0x52004, ++ .enable_mask = BIT(18), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_npu_gpll0_clk_src", ++ .parent_hws = (const struct clk_hw *[]){ ++ &gpll0.clkr.hw }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_npu_gpll0_div_clk_src = { ++ .clkr = { ++ .enable_reg = 0x52004, ++ .enable_mask = BIT(19), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_npu_gpll0_div_clk_src", ++ .parent_hws = (const struct clk_hw *[]){ ++ &gcc_npu_gpll0_clk_src.clkr.hw }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ + static struct clk_branch gcc_npu_trig_clk = { + .halt_reg = 0x4d00c, + .halt_check = BRANCH_VOTED, +@@ -2811,6 +2871,45 @@ static struct clk_branch gcc_ufs_card_phy_aux_hw_ctl_clk = { + }, + }; + ++/* external clocks so add BRANCH_HALT_SKIP */ ++static struct clk_branch gcc_ufs_card_rx_symbol_0_clk = { ++ .halt_check = BRANCH_HALT_SKIP, ++ .clkr = { ++ .enable_reg = 0x7501c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_ufs_card_rx_symbol_0_clk", ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++/* external clocks so add BRANCH_HALT_SKIP */ ++static struct clk_branch gcc_ufs_card_rx_symbol_1_clk = { ++ .halt_check = BRANCH_HALT_SKIP, ++ .clkr = { ++ .enable_reg = 0x750ac, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_ufs_card_rx_symbol_1_clk", ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++/* external clocks so add BRANCH_HALT_SKIP */ ++static struct clk_branch gcc_ufs_card_tx_symbol_0_clk = { ++ .halt_check = BRANCH_HALT_SKIP, ++ .clkr = { ++ .enable_reg = 0x75018, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_ufs_card_tx_symbol_0_clk", ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ + static struct clk_branch gcc_ufs_card_unipro_core_clk = { + .halt_reg = 0x75058, + .halt_check = BRANCH_HALT, +@@ -2991,6 +3090,45 @@ static struct clk_branch gcc_ufs_phy_phy_aux_hw_ctl_clk = { + }, + }; + ++/* external clocks so add BRANCH_HALT_SKIP */ ++static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = { ++ .halt_check = BRANCH_HALT_SKIP, ++ .clkr = { ++ .enable_reg = 0x7701c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_ufs_phy_rx_symbol_0_clk", ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++/* external clocks so add BRANCH_HALT_SKIP */ ++static struct clk_branch gcc_ufs_phy_rx_symbol_1_clk = { ++ .halt_check = BRANCH_HALT_SKIP, ++ .clkr = { ++ .enable_reg = 0x770ac, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_ufs_phy_rx_symbol_1_clk", ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++/* external clocks so add BRANCH_HALT_SKIP */ ++static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = { ++ .halt_check = BRANCH_HALT_SKIP, ++ .clkr = { ++ .enable_reg = 0x77018, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_ufs_phy_tx_symbol_0_clk", ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ + static struct clk_branch gcc_ufs_phy_unipro_core_clk = { + .halt_reg = 0x77058, + .halt_check = BRANCH_HALT, +@@ -3331,12 +3469,16 @@ static struct clk_regmap *gcc_sm8150_clocks[] = { + [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, + [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr, + [GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr, ++ [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr, ++ [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr, + [GCC_GPU_IREF_CLK] = &gcc_gpu_iref_clk.clkr, + [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr, + [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr, + [GCC_NPU_AT_CLK] = &gcc_npu_at_clk.clkr, + [GCC_NPU_AXI_CLK] = &gcc_npu_axi_clk.clkr, + [GCC_NPU_CFG_AHB_CLK] = &gcc_npu_cfg_ahb_clk.clkr, ++ [GCC_NPU_GPLL0_CLK_SRC] = &gcc_npu_gpll0_clk_src.clkr, ++ [GCC_NPU_GPLL0_DIV_CLK_SRC] = &gcc_npu_gpll0_div_clk_src.clkr, + [GCC_NPU_TRIG_CLK] = &gcc_npu_trig_clk.clkr, + [GCC_PCIE0_PHY_REFGEN_CLK] = &gcc_pcie0_phy_refgen_clk.clkr, + [GCC_PCIE1_PHY_REFGEN_CLK] = &gcc_pcie1_phy_refgen_clk.clkr, +@@ -3441,6 +3583,9 @@ static struct clk_regmap *gcc_sm8150_clocks[] = { + [GCC_UFS_CARD_PHY_AUX_CLK_SRC] = &gcc_ufs_card_phy_aux_clk_src.clkr, + [GCC_UFS_CARD_PHY_AUX_HW_CTL_CLK] = + &gcc_ufs_card_phy_aux_hw_ctl_clk.clkr, ++ [GCC_UFS_CARD_RX_SYMBOL_0_CLK] = &gcc_ufs_card_rx_symbol_0_clk.clkr, ++ [GCC_UFS_CARD_RX_SYMBOL_1_CLK] = &gcc_ufs_card_rx_symbol_1_clk.clkr, ++ [GCC_UFS_CARD_TX_SYMBOL_0_CLK] = &gcc_ufs_card_tx_symbol_0_clk.clkr, + [GCC_UFS_CARD_UNIPRO_CORE_CLK] = &gcc_ufs_card_unipro_core_clk.clkr, + [GCC_UFS_CARD_UNIPRO_CORE_CLK_SRC] = + &gcc_ufs_card_unipro_core_clk_src.clkr, +@@ -3458,6 +3603,9 @@ static struct clk_regmap *gcc_sm8150_clocks[] = { + [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr, + [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr, + [GCC_UFS_PHY_PHY_AUX_HW_CTL_CLK] = &gcc_ufs_phy_phy_aux_hw_ctl_clk.clkr, ++ [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr, ++ [GCC_UFS_PHY_RX_SYMBOL_1_CLK] = &gcc_ufs_phy_rx_symbol_1_clk.clkr, ++ [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr, + [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr, + [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] = + &gcc_ufs_phy_unipro_core_clk_src.clkr, +diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c +index 9a5464c625b4..4be83b4de2a0 100644 +--- a/drivers/clocksource/arm_arch_timer.c ++++ b/drivers/clocksource/arm_arch_timer.c +@@ -69,7 +69,7 @@ static enum arch_timer_ppi_nr arch_timer_uses_ppi = ARCH_TIMER_VIRT_PPI; + static bool arch_timer_c3stop; + static bool arch_timer_mem_use_virtual; + static bool arch_counter_suspend_stop; +-static bool vdso_default = true; ++static enum vdso_arch_clockmode vdso_default = VDSO_CLOCKMODE_ARCHTIMER; + + static cpumask_t evtstrm_available = CPU_MASK_NONE; + static bool evtstrm_enable = IS_ENABLED(CONFIG_ARM_ARCH_TIMER_EVTSTREAM); +@@ -476,6 +476,14 @@ static const struct arch_timer_erratum_workaround ool_workarounds[] = { + .set_next_event_virt = erratum_set_next_event_tval_virt, + }, + #endif ++#ifdef CONFIG_ARM64_ERRATUM_1418040 ++ { ++ .match_type = ate_match_local_cap_id, ++ .id = (void *)ARM64_WORKAROUND_1418040, ++ .desc = "ARM erratum 1418040", ++ .disable_compat_vdso = true, ++ }, ++#endif + }; + + typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *, +@@ -560,8 +568,11 @@ void arch_timer_enable_workaround(const struct arch_timer_erratum_workaround *wa + * change both the default value and the vdso itself. + */ + if (wa->read_cntvct_el0) { +- clocksource_counter.archdata.vdso_direct = false; +- vdso_default = false; ++ clocksource_counter.archdata.clock_mode = VDSO_CLOCKMODE_NONE; ++ vdso_default = VDSO_CLOCKMODE_NONE; ++ } else if (wa->disable_compat_vdso && vdso_default != VDSO_CLOCKMODE_NONE) { ++ vdso_default = VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT; ++ clocksource_counter.archdata.clock_mode = vdso_default; + } + } + +@@ -979,7 +990,7 @@ static void __init arch_counter_register(unsigned type) + } + + arch_timer_read_counter = rd; +- clocksource_counter.archdata.vdso_direct = vdso_default; ++ clocksource_counter.archdata.clock_mode = vdso_default; + } else { + arch_timer_read_counter = arch_counter_get_cntvct_mem; + } +diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig +index 06b2b3fa5206..0952f059d967 100644 +--- a/drivers/crypto/Kconfig ++++ b/drivers/crypto/Kconfig +@@ -491,11 +491,9 @@ if CRYPTO_DEV_UX500 + endif # if CRYPTO_DEV_UX500 + + config CRYPTO_DEV_ATMEL_AUTHENC +- tristate "Support for Atmel IPSEC/SSL hw accelerator" ++ bool "Support for Atmel IPSEC/SSL hw accelerator" + depends on ARCH_AT91 || COMPILE_TEST +- select CRYPTO_AUTHENC +- select CRYPTO_DEV_ATMEL_AES +- select CRYPTO_DEV_ATMEL_SHA ++ depends on CRYPTO_DEV_ATMEL_AES + help + Some Atmel processors can combine the AES and SHA hw accelerators + to enhance support of IPSEC/SSL. +@@ -508,6 +506,8 @@ config CRYPTO_DEV_ATMEL_AES + select CRYPTO_AES + select CRYPTO_AEAD + select CRYPTO_BLKCIPHER ++ select CRYPTO_AUTHENC if CRYPTO_DEV_ATMEL_AUTHENC ++ select CRYPTO_DEV_ATMEL_SHA if CRYPTO_DEV_ATMEL_AUTHENC + help + Some Atmel processors have AES hw accelerator. + Select this if you want to use the Atmel module for +diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c +index 0425984db118..62d9825a49e9 100644 +--- a/drivers/dma/dmatest.c ++++ b/drivers/dma/dmatest.c +@@ -1168,6 +1168,8 @@ static int dmatest_run_set(const char *val, const struct kernel_param *kp) + } else if (dmatest_run) { + if (!is_threaded_test_pending(info)) { + pr_info("No channels configured, continue with any\n"); ++ if (!is_threaded_test_run(info)) ++ stop_threaded_test(info); + add_threaded_test(info); + } + start_threaded_tests(info); +diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c +index 21cb2a58dbd2..a1b56f52db2f 100644 +--- a/drivers/dma/dw/core.c ++++ b/drivers/dma/dw/core.c +@@ -118,16 +118,11 @@ static void dwc_initialize(struct dw_dma_chan *dwc) + { + struct dw_dma *dw = to_dw_dma(dwc->chan.device); + +- if (test_bit(DW_DMA_IS_INITIALIZED, &dwc->flags)) +- return; +- + dw->initialize_chan(dwc); + + /* Enable interrupts */ + channel_set_bit(dw, MASK.XFER, dwc->mask); + channel_set_bit(dw, MASK.ERROR, dwc->mask); +- +- set_bit(DW_DMA_IS_INITIALIZED, &dwc->flags); + } + + /*----------------------------------------------------------------------*/ +@@ -954,8 +949,6 @@ static void dwc_issue_pending(struct dma_chan *chan) + + void do_dw_dma_off(struct dw_dma *dw) + { +- unsigned int i; +- + dma_writel(dw, CFG, 0); + + channel_clear_bit(dw, MASK.XFER, dw->all_chan_mask); +@@ -966,9 +959,6 @@ void do_dw_dma_off(struct dw_dma *dw) + + while (dma_readl(dw, CFG) & DW_CFG_DMA_EN) + cpu_relax(); +- +- for (i = 0; i < dw->dma.chancnt; i++) +- clear_bit(DW_DMA_IS_INITIALIZED, &dw->chan[i].flags); + } + + void do_dw_dma_on(struct dw_dma *dw) +@@ -1032,8 +1022,6 @@ static void dwc_free_chan_resources(struct dma_chan *chan) + /* Clear custom channel configuration */ + memset(&dwc->dws, 0, sizeof(struct dw_dma_slave)); + +- clear_bit(DW_DMA_IS_INITIALIZED, &dwc->flags); +- + /* Disable interrupts */ + channel_clear_bit(dw, MASK.XFER, dwc->mask); + channel_clear_bit(dw, MASK.BLOCK, dwc->mask); +diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h +index 5eaa2902ed39..6ff7063a8a2f 100644 +--- a/drivers/dma/fsl-edma-common.h ++++ b/drivers/dma/fsl-edma-common.h +@@ -33,7 +33,7 @@ + #define EDMA_TCD_ATTR_DSIZE_16BIT BIT(0) + #define EDMA_TCD_ATTR_DSIZE_32BIT BIT(1) + #define EDMA_TCD_ATTR_DSIZE_64BIT (BIT(0) | BIT(1)) +-#define EDMA_TCD_ATTR_DSIZE_32BYTE (BIT(3) | BIT(0)) ++#define EDMA_TCD_ATTR_DSIZE_32BYTE (BIT(2) | BIT(0)) + #define EDMA_TCD_ATTR_SSIZE_8BIT 0 + #define EDMA_TCD_ATTR_SSIZE_16BIT (EDMA_TCD_ATTR_DSIZE_16BIT << 8) + #define EDMA_TCD_ATTR_SSIZE_32BIT (EDMA_TCD_ATTR_DSIZE_32BIT << 8) +diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c +index b626c06ac2e0..6760ae4b2956 100644 +--- a/drivers/dma/fsl-edma.c ++++ b/drivers/dma/fsl-edma.c +@@ -45,6 +45,13 @@ static irqreturn_t fsl_edma_tx_handler(int irq, void *dev_id) + fsl_chan = &fsl_edma->chans[ch]; + + spin_lock(&fsl_chan->vchan.lock); ++ ++ if (!fsl_chan->edesc) { ++ /* terminate_all called before */ ++ spin_unlock(&fsl_chan->vchan.lock); ++ continue; ++ } ++ + if (!fsl_chan->edesc->iscyclic) { + list_del(&fsl_chan->edesc->vdesc.node); + vchan_cookie_complete(&fsl_chan->edesc->vdesc); +diff --git a/drivers/dma/mcf-edma.c b/drivers/dma/mcf-edma.c +index e15bd15a9ef6..e12b754e6398 100644 +--- a/drivers/dma/mcf-edma.c ++++ b/drivers/dma/mcf-edma.c +@@ -35,6 +35,13 @@ static irqreturn_t mcf_edma_tx_handler(int irq, void *dev_id) + mcf_chan = &mcf_edma->chans[ch]; + + spin_lock(&mcf_chan->vchan.lock); ++ ++ if (!mcf_chan->edesc) { ++ /* terminate_all called before */ ++ spin_unlock(&mcf_chan->vchan.lock); ++ continue; ++ } ++ + if (!mcf_chan->edesc->iscyclic) { + list_del(&mcf_chan->edesc->vdesc.node); + vchan_cookie_complete(&mcf_chan->edesc->vdesc); +diff --git a/drivers/dma/sh/usb-dmac.c b/drivers/dma/sh/usb-dmac.c +index b218a013c260..8f7ceb698226 100644 +--- a/drivers/dma/sh/usb-dmac.c ++++ b/drivers/dma/sh/usb-dmac.c +@@ -586,6 +586,8 @@ static void usb_dmac_isr_transfer_end(struct usb_dmac_chan *chan) + desc->residue = usb_dmac_get_current_residue(chan, desc, + desc->sg_index - 1); + desc->done_cookie = desc->vd.tx.cookie; ++ desc->vd.tx_result.result = DMA_TRANS_NOERROR; ++ desc->vd.tx_result.residue = desc->residue; + vchan_cookie_complete(&desc->vd); + + /* Restart the next transfer if this driver has a next desc */ +diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c +index 81f5103dccb6..9a24dce3c262 100644 +--- a/drivers/gpio/gpio-pca953x.c ++++ b/drivers/gpio/gpio-pca953x.c +@@ -398,6 +398,7 @@ static const struct regmap_config pca953x_ai_i2c_regmap = { + .writeable_reg = pca953x_writeable_register, + .volatile_reg = pca953x_volatile_register, + ++ .disable_locking = true, + .cache_type = REGCACHE_RBTREE, + .max_register = 0x7f, + }; +diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +index 23fc16dc92b4..465351184bc3 100644 +--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +@@ -286,30 +286,20 @@ static uint64_t sdma_v5_0_ring_get_rptr(struct amdgpu_ring *ring) + static uint64_t sdma_v5_0_ring_get_wptr(struct amdgpu_ring *ring) + { + struct amdgpu_device *adev = ring->adev; +- u64 *wptr = NULL; +- uint64_t local_wptr = 0; ++ u64 wptr; + + if (ring->use_doorbell) { + /* XXX check if swapping is necessary on BE */ +- wptr = ((u64 *)&adev->wb.wb[ring->wptr_offs]); +- DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", *wptr); +- *wptr = (*wptr) >> 2; +- DRM_DEBUG("wptr/doorbell after shift == 0x%016llx\n", *wptr); ++ wptr = READ_ONCE(*((u64 *)&adev->wb.wb[ring->wptr_offs])); ++ DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr); + } else { +- u32 lowbit, highbit; +- +- wptr = &local_wptr; +- lowbit = RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR)) >> 2; +- highbit = RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2; +- +- DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n", +- ring->me, highbit, lowbit); +- *wptr = highbit; +- *wptr = (*wptr) << 32; +- *wptr |= lowbit; ++ wptr = RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI)); ++ wptr = wptr << 32; ++ wptr |= RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR)); ++ DRM_DEBUG("wptr before shift [%i] wptr == 0x%016llx\n", ring->me, wptr); + } + +- return *wptr; ++ return wptr >> 2; + } + + /** +diff --git a/drivers/gpu/drm/exynos/exynos_drm_dma.c b/drivers/gpu/drm/exynos/exynos_drm_dma.c +index 619f81435c1b..58b89ec11b0e 100644 +--- a/drivers/gpu/drm/exynos/exynos_drm_dma.c ++++ b/drivers/gpu/drm/exynos/exynos_drm_dma.c +@@ -61,7 +61,7 @@ static int drm_iommu_attach_device(struct drm_device *drm_dev, + struct device *subdrv_dev, void **dma_priv) + { + struct exynos_drm_private *priv = drm_dev->dev_private; +- int ret; ++ int ret = 0; + + if (get_dma_ops(priv->dma_dev) != get_dma_ops(subdrv_dev)) { + DRM_DEV_ERROR(subdrv_dev, "Device %s lacks support for IOMMU\n", +@@ -92,7 +92,7 @@ static int drm_iommu_attach_device(struct drm_device *drm_dev, + if (ret) + clear_dma_max_seg_size(subdrv_dev); + +- return 0; ++ return ret; + } + + /* +diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c b/drivers/gpu/drm/exynos/exynos_drm_mic.c +index b78e8c5ba553..2aff986add89 100644 +--- a/drivers/gpu/drm/exynos/exynos_drm_mic.c ++++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c +@@ -268,8 +268,10 @@ static void mic_pre_enable(struct drm_bridge *bridge) + goto unlock; + + ret = pm_runtime_get_sync(mic->dev); +- if (ret < 0) ++ if (ret < 0) { ++ pm_runtime_put_noidle(mic->dev); + goto unlock; ++ } + + mic_set_path(mic, 1); + +diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c +index 66f6d1a897f2..c169f0f70f3a 100644 +--- a/drivers/gpu/drm/i915/gt/intel_lrc.c ++++ b/drivers/gpu/drm/i915/gt/intel_lrc.c +@@ -3751,6 +3751,7 @@ intel_execlists_create_virtual(struct i915_gem_context *ctx, + intel_engine_init_active(&ve->base, ENGINE_VIRTUAL); + + intel_engine_init_execlists(&ve->base); ++ ve->base.breadcrumbs.irq_armed = true; /* fake HW, used for irq_work */ + + ve->base.cops = &virtual_context_ops; + ve->base.request_alloc = execlists_request_alloc; +diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c +index 25f78196b964..689b07bc91c4 100644 +--- a/drivers/gpu/drm/i915/gvt/handlers.c ++++ b/drivers/gpu/drm/i915/gvt/handlers.c +@@ -3103,8 +3103,8 @@ static int init_skl_mmio_info(struct intel_gvt *gvt) + MMIO_DFH(GEN9_WM_CHICKEN3, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS, + NULL, NULL); + +- MMIO_D(GAMT_CHKN_BIT_REG, D_KBL); +- MMIO_D(GEN9_CTX_PREEMPT_REG, D_KBL | D_SKL); ++ MMIO_D(GAMT_CHKN_BIT_REG, D_KBL | D_CFL); ++ MMIO_D(GEN9_CTX_PREEMPT_REG, D_SKL_PLUS); + + return 0; + } +diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +index edf7989d7a8e..99d449ce4a07 100644 +--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c ++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +@@ -2185,7 +2185,6 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc, + + dpu_enc = to_dpu_encoder_virt(enc); + +- mutex_init(&dpu_enc->enc_lock); + ret = dpu_encoder_setup_display(dpu_enc, dpu_kms, disp_info); + if (ret) + goto fail; +@@ -2200,7 +2199,6 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc, + 0); + + +- mutex_init(&dpu_enc->rc_lock); + INIT_DELAYED_WORK(&dpu_enc->delayed_off_work, + dpu_encoder_off_work); + dpu_enc->idle_timeout = IDLE_TIMEOUT; +@@ -2245,6 +2243,8 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev, + + spin_lock_init(&dpu_enc->enc_spinlock); + dpu_enc->enabled = false; ++ mutex_init(&dpu_enc->enc_lock); ++ mutex_init(&dpu_enc->rc_lock); + + return &dpu_enc->base; + } +diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c b/drivers/gpu/drm/msm/msm_submitqueue.c +index 001fbf537440..a1d94be7883a 100644 +--- a/drivers/gpu/drm/msm/msm_submitqueue.c ++++ b/drivers/gpu/drm/msm/msm_submitqueue.c +@@ -71,8 +71,10 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx, + queue->flags = flags; + + if (priv->gpu) { +- if (prio >= priv->gpu->nr_rings) ++ if (prio >= priv->gpu->nr_rings) { ++ kfree(queue); + return -EINVAL; ++ } + + queue->prio = prio; + } +diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c +index 27c80c9e2b83..0f7eafedfe8f 100644 +--- a/drivers/gpu/drm/sun4i/sun4i_tcon.c ++++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c +@@ -1504,6 +1504,8 @@ const struct of_device_id sun4i_tcon_of_table[] = { + { .compatible = "allwinner,sun6i-a31-tcon", .data = &sun6i_a31_quirks }, + { .compatible = "allwinner,sun6i-a31s-tcon", .data = &sun6i_a31s_quirks }, + { .compatible = "allwinner,sun7i-a20-tcon", .data = &sun7i_a20_quirks }, ++ { .compatible = "allwinner,sun7i-a20-tcon0", .data = &sun7i_a20_quirks }, ++ { .compatible = "allwinner,sun7i-a20-tcon1", .data = &sun7i_a20_quirks }, + { .compatible = "allwinner,sun8i-a23-tcon", .data = &sun8i_a33_quirks }, + { .compatible = "allwinner,sun8i-a33-tcon", .data = &sun8i_a33_quirks }, + { .compatible = "allwinner,sun8i-a83t-tcon-lcd", .data = &sun8i_a83t_lcd_quirks }, +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index c552a6bc627e..73e4590ea9c9 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -620,6 +620,7 @@ + #define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081 0xa081 + #define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2 0xa0c2 + #define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096 0xa096 ++#define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A293 0xa293 + + #define USB_VENDOR_ID_IMATION 0x0718 + #define USB_DEVICE_ID_DISC_STAKKA 0xd000 +@@ -995,6 +996,8 @@ + #define USB_DEVICE_ID_ROCCAT_RYOS_MK_PRO 0x3232 + #define USB_DEVICE_ID_ROCCAT_SAVU 0x2d5a + ++#define USB_VENDOR_ID_SAI 0x17dd ++ + #define USB_VENDOR_ID_SAITEK 0x06a3 + #define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17 + #define USB_DEVICE_ID_SAITEK_PS1000 0x0621 +diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c +index cd9193078525..60cf80606282 100644 +--- a/drivers/hid/hid-logitech-hidpp.c ++++ b/drivers/hid/hid-logitech-hidpp.c +@@ -2964,7 +2964,7 @@ static int hi_res_scroll_enable(struct hidpp_device *hidpp) + multiplier = 1; + + hidpp->vertical_wheel_counter.wheel_multiplier = multiplier; +- hid_info(hidpp->hid_dev, "multiplier = %d\n", multiplier); ++ hid_dbg(hidpp->hid_dev, "wheel multiplier = %d\n", multiplier); + return 0; + } + +diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c +index 34138667f8af..abd86903875f 100644 +--- a/drivers/hid/hid-magicmouse.c ++++ b/drivers/hid/hid-magicmouse.c +@@ -535,6 +535,12 @@ static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hd + __set_bit(MSC_RAW, input->mscbit); + } + ++ /* ++ * hid-input may mark device as using autorepeat, but neither ++ * the trackpad, nor the mouse actually want it. ++ */ ++ __clear_bit(EV_REP, input->evbit); ++ + return 0; + } + +diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c +index 168fdaa1999f..a49fa2b047cb 100644 +--- a/drivers/hid/hid-quirks.c ++++ b/drivers/hid/hid-quirks.c +@@ -88,6 +88,7 @@ static const struct hid_device_id hid_quirks[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096), HID_QUIRK_NO_INIT_REPORTS }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A293), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, +@@ -400,9 +401,6 @@ static const struct hid_device_id hid_have_special_driver[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) }, + { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2) }, + #endif +-#if IS_ENABLED(CONFIG_HID_ITE) +- { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, +-#endif + #if IS_ENABLED(CONFIG_HID_ICADE) + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) }, + #endif +@@ -842,6 +840,7 @@ static const struct hid_device_id hid_ignore_list[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_PETZL, USB_DEVICE_ID_PETZL_HEADLAMP) }, + { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_SAI, USB_DEVICE_ID_CYPRESS_HIDCOM) }, + #if IS_ENABLED(CONFIG_MOUSE_SYNAPTICS_USB) + { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_INT_TP) }, +diff --git a/drivers/hwmon/emc2103.c b/drivers/hwmon/emc2103.c +index 491a570e8e50..924c02c1631d 100644 +--- a/drivers/hwmon/emc2103.c ++++ b/drivers/hwmon/emc2103.c +@@ -443,7 +443,7 @@ static ssize_t pwm1_enable_store(struct device *dev, + } + + result = read_u8_from_i2c(client, REG_FAN_CONF1, &conf_reg); +- if (result) { ++ if (result < 0) { + count = result; + goto err; + } +diff --git a/drivers/hwtracing/intel_th/core.c b/drivers/hwtracing/intel_th/core.c +index ca232ec565e8..c9ac3dc65113 100644 +--- a/drivers/hwtracing/intel_th/core.c ++++ b/drivers/hwtracing/intel_th/core.c +@@ -1021,15 +1021,30 @@ int intel_th_set_output(struct intel_th_device *thdev, + { + struct intel_th_device *hub = to_intel_th_hub(thdev); + struct intel_th_driver *hubdrv = to_intel_th_driver(hub->dev.driver); ++ int ret; + + /* In host mode, this is up to the external debugger, do nothing. */ + if (hub->host_mode) + return 0; + +- if (!hubdrv->set_output) +- return -ENOTSUPP; ++ /* ++ * hub is instantiated together with the source device that ++ * calls here, so guaranteed to be present. ++ */ ++ hubdrv = to_intel_th_driver(hub->dev.driver); ++ if (!hubdrv || !try_module_get(hubdrv->driver.owner)) ++ return -EINVAL; ++ ++ if (!hubdrv->set_output) { ++ ret = -ENOTSUPP; ++ goto out; ++ } ++ ++ ret = hubdrv->set_output(hub, master); + +- return hubdrv->set_output(hub, master); ++out: ++ module_put(hubdrv->driver.owner); ++ return ret; + } + EXPORT_SYMBOL_GPL(intel_th_set_output); + +diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c +index 86aa6a46bcba..0d26484d6795 100644 +--- a/drivers/hwtracing/intel_th/pci.c ++++ b/drivers/hwtracing/intel_th/pci.c +@@ -229,11 +229,21 @@ static const struct pci_device_id intel_th_pci_id_table[] = { + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa0a6), + .driver_data = (kernel_ulong_t)&intel_th_2x, + }, ++ { ++ /* Tiger Lake PCH-H */ ++ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x43a6), ++ .driver_data = (kernel_ulong_t)&intel_th_2x, ++ }, + { + /* Jasper Lake PCH */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), + .driver_data = (kernel_ulong_t)&intel_th_2x, + }, ++ { ++ /* Jasper Lake CPU */ ++ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4e29), ++ .driver_data = (kernel_ulong_t)&intel_th_2x, ++ }, + { + /* Elkhart Lake CPU */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4529), +@@ -244,6 +254,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), + .driver_data = (kernel_ulong_t)&intel_th_2x, + }, ++ { ++ /* Emmitsburg PCH */ ++ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1bcc), ++ .driver_data = (kernel_ulong_t)&intel_th_2x, ++ }, + { 0 }, + }; + +diff --git a/drivers/hwtracing/intel_th/sth.c b/drivers/hwtracing/intel_th/sth.c +index 3a1f4e650378..a1529f571491 100644 +--- a/drivers/hwtracing/intel_th/sth.c ++++ b/drivers/hwtracing/intel_th/sth.c +@@ -161,9 +161,7 @@ static int sth_stm_link(struct stm_data *stm_data, unsigned int master, + { + struct sth_device *sth = container_of(stm_data, struct sth_device, stm); + +- intel_th_set_output(to_intel_th_device(sth->dev), master); +- +- return 0; ++ return intel_th_set_output(to_intel_th_device(sth->dev), master); + } + + static int intel_th_sw_init(struct sth_device *sth) +diff --git a/drivers/i2c/busses/i2c-eg20t.c b/drivers/i2c/busses/i2c-eg20t.c +index bb810dee8fb5..73f139690e4e 100644 +--- a/drivers/i2c/busses/i2c-eg20t.c ++++ b/drivers/i2c/busses/i2c-eg20t.c +@@ -180,6 +180,7 @@ static const struct pci_device_id pch_pcidev_id[] = { + { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_I2C), 1, }, + {0,} + }; ++MODULE_DEVICE_TABLE(pci, pch_pcidev_id); + + static irqreturn_t pch_i2c_handler(int irq, void *pData); + +diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c +index 00e100fc845a..813bca7cfc3e 100644 +--- a/drivers/iio/accel/mma8452.c ++++ b/drivers/iio/accel/mma8452.c +@@ -1685,10 +1685,13 @@ static int mma8452_probe(struct i2c_client *client, + + ret = mma8452_set_freefall_mode(data, false); + if (ret < 0) +- goto buffer_cleanup; ++ goto unregister_device; + + return 0; + ++unregister_device: ++ iio_device_unregister(indio_dev); ++ + buffer_cleanup: + iio_triggered_buffer_cleanup(indio_dev); + +diff --git a/drivers/iio/adc/ad7780.c b/drivers/iio/adc/ad7780.c +index 217a5a5c3c6d..7e741294de7b 100644 +--- a/drivers/iio/adc/ad7780.c ++++ b/drivers/iio/adc/ad7780.c +@@ -309,7 +309,7 @@ static int ad7780_probe(struct spi_device *spi) + + ret = ad7780_init_gpios(&spi->dev, st); + if (ret) +- goto error_cleanup_buffer_and_trigger; ++ return ret; + + st->reg = devm_regulator_get(&spi->dev, "avdd"); + if (IS_ERR(st->reg)) +diff --git a/drivers/iio/health/afe4403.c b/drivers/iio/health/afe4403.c +index dc22dc363a99..29104656a537 100644 +--- a/drivers/iio/health/afe4403.c ++++ b/drivers/iio/health/afe4403.c +@@ -63,6 +63,7 @@ static const struct reg_field afe4403_reg_fields[] = { + * @regulator: Pointer to the regulator for the IC + * @trig: IIO trigger for this device + * @irq: ADC_RDY line interrupt number ++ * @buffer: Used to construct data layout to push into IIO buffer. + */ + struct afe4403_data { + struct device *dev; +@@ -72,6 +73,8 @@ struct afe4403_data { + struct regulator *regulator; + struct iio_trigger *trig; + int irq; ++ /* Ensure suitable alignment for timestamp */ ++ s32 buffer[8] __aligned(8); + }; + + enum afe4403_chan_id { +@@ -309,7 +312,6 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private) + struct iio_dev *indio_dev = pf->indio_dev; + struct afe4403_data *afe = iio_priv(indio_dev); + int ret, bit, i = 0; +- s32 buffer[8]; + u8 tx[4] = {AFE440X_CONTROL0, 0x0, 0x0, AFE440X_CONTROL0_READ}; + u8 rx[3]; + +@@ -326,9 +328,9 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private) + if (ret) + goto err; + +- buffer[i++] = (rx[0] << 16) | +- (rx[1] << 8) | +- (rx[2]); ++ afe->buffer[i++] = (rx[0] << 16) | ++ (rx[1] << 8) | ++ (rx[2]); + } + + /* Disable reading from the device */ +@@ -337,7 +339,8 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private) + if (ret) + goto err; + +- iio_push_to_buffers_with_timestamp(indio_dev, buffer, pf->timestamp); ++ iio_push_to_buffers_with_timestamp(indio_dev, afe->buffer, ++ pf->timestamp); + err: + iio_trigger_notify_done(indio_dev->trig); + +diff --git a/drivers/iio/health/afe4404.c b/drivers/iio/health/afe4404.c +index e728bbb21ca8..cebb1fd4d0b1 100644 +--- a/drivers/iio/health/afe4404.c ++++ b/drivers/iio/health/afe4404.c +@@ -83,6 +83,7 @@ static const struct reg_field afe4404_reg_fields[] = { + * @regulator: Pointer to the regulator for the IC + * @trig: IIO trigger for this device + * @irq: ADC_RDY line interrupt number ++ * @buffer: Used to construct a scan to push to the iio buffer. + */ + struct afe4404_data { + struct device *dev; +@@ -91,6 +92,7 @@ struct afe4404_data { + struct regulator *regulator; + struct iio_trigger *trig; + int irq; ++ s32 buffer[10] __aligned(8); + }; + + enum afe4404_chan_id { +@@ -328,17 +330,17 @@ static irqreturn_t afe4404_trigger_handler(int irq, void *private) + struct iio_dev *indio_dev = pf->indio_dev; + struct afe4404_data *afe = iio_priv(indio_dev); + int ret, bit, i = 0; +- s32 buffer[10]; + + for_each_set_bit(bit, indio_dev->active_scan_mask, + indio_dev->masklength) { + ret = regmap_read(afe->regmap, afe4404_channel_values[bit], +- &buffer[i++]); ++ &afe->buffer[i++]); + if (ret) + goto err; + } + +- iio_push_to_buffers_with_timestamp(indio_dev, buffer, pf->timestamp); ++ iio_push_to_buffers_with_timestamp(indio_dev, afe->buffer, ++ pf->timestamp); + err: + iio_trigger_notify_done(indio_dev->trig); + +diff --git a/drivers/iio/humidity/hdc100x.c b/drivers/iio/humidity/hdc100x.c +index dcf5a5bdfaa8..7618cdf59efd 100644 +--- a/drivers/iio/humidity/hdc100x.c ++++ b/drivers/iio/humidity/hdc100x.c +@@ -38,6 +38,11 @@ struct hdc100x_data { + + /* integration time of the sensor */ + int adc_int_us[2]; ++ /* Ensure natural alignment of timestamp */ ++ struct { ++ __be16 channels[2]; ++ s64 ts __aligned(8); ++ } scan; + }; + + /* integration time in us */ +@@ -319,7 +324,6 @@ static irqreturn_t hdc100x_trigger_handler(int irq, void *p) + struct i2c_client *client = data->client; + int delay = data->adc_int_us[0] + data->adc_int_us[1]; + int ret; +- s16 buf[8]; /* 2x s16 + padding + 8 byte timestamp */ + + /* dual read starts at temp register */ + mutex_lock(&data->lock); +@@ -330,13 +334,13 @@ static irqreturn_t hdc100x_trigger_handler(int irq, void *p) + } + usleep_range(delay, delay + 1000); + +- ret = i2c_master_recv(client, (u8 *)buf, 4); ++ ret = i2c_master_recv(client, (u8 *)data->scan.channels, 4); + if (ret < 0) { + dev_err(&client->dev, "cannot read sensor data\n"); + goto err; + } + +- iio_push_to_buffers_with_timestamp(indio_dev, buf, ++ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, + iio_get_time_ns(indio_dev)); + err: + mutex_unlock(&data->lock); +diff --git a/drivers/iio/humidity/hts221.h b/drivers/iio/humidity/hts221.h +index 7d6771f7cf47..b2eb5abeaccd 100644 +--- a/drivers/iio/humidity/hts221.h ++++ b/drivers/iio/humidity/hts221.h +@@ -14,8 +14,6 @@ + + #include <linux/iio/iio.h> + +-#define HTS221_DATA_SIZE 2 +- + enum hts221_sensor_type { + HTS221_SENSOR_H, + HTS221_SENSOR_T, +@@ -39,6 +37,11 @@ struct hts221_hw { + + bool enabled; + u8 odr; ++ /* Ensure natural alignment of timestamp */ ++ struct { ++ __le16 channels[2]; ++ s64 ts __aligned(8); ++ } scan; + }; + + extern const struct dev_pm_ops hts221_pm_ops; +diff --git a/drivers/iio/humidity/hts221_buffer.c b/drivers/iio/humidity/hts221_buffer.c +index 81d50a861c22..49dcd36d8838 100644 +--- a/drivers/iio/humidity/hts221_buffer.c ++++ b/drivers/iio/humidity/hts221_buffer.c +@@ -162,7 +162,6 @@ static const struct iio_buffer_setup_ops hts221_buffer_ops = { + + static irqreturn_t hts221_buffer_handler_thread(int irq, void *p) + { +- u8 buffer[ALIGN(2 * HTS221_DATA_SIZE, sizeof(s64)) + sizeof(s64)]; + struct iio_poll_func *pf = p; + struct iio_dev *iio_dev = pf->indio_dev; + struct hts221_hw *hw = iio_priv(iio_dev); +@@ -172,18 +171,20 @@ static irqreturn_t hts221_buffer_handler_thread(int irq, void *p) + /* humidity data */ + ch = &iio_dev->channels[HTS221_SENSOR_H]; + err = regmap_bulk_read(hw->regmap, ch->address, +- buffer, HTS221_DATA_SIZE); ++ &hw->scan.channels[0], ++ sizeof(hw->scan.channels[0])); + if (err < 0) + goto out; + + /* temperature data */ + ch = &iio_dev->channels[HTS221_SENSOR_T]; + err = regmap_bulk_read(hw->regmap, ch->address, +- buffer + HTS221_DATA_SIZE, HTS221_DATA_SIZE); ++ &hw->scan.channels[1], ++ sizeof(hw->scan.channels[1])); + if (err < 0) + goto out; + +- iio_push_to_buffers_with_timestamp(iio_dev, buffer, ++ iio_push_to_buffers_with_timestamp(iio_dev, &hw->scan, + iio_get_time_ns(iio_dev)); + + out: +diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c +index 524a686077ca..485b2e6748c5 100644 +--- a/drivers/iio/industrialio-core.c ++++ b/drivers/iio/industrialio-core.c +@@ -130,6 +130,8 @@ static const char * const iio_modifier_names[] = { + [IIO_MOD_PM2P5] = "pm2p5", + [IIO_MOD_PM4] = "pm4", + [IIO_MOD_PM10] = "pm10", ++ [IIO_MOD_ETHANOL] = "ethanol", ++ [IIO_MOD_H2] = "h2", + }; + + /* relies on pairs of these shared then separate */ +diff --git a/drivers/iio/magnetometer/ak8974.c b/drivers/iio/magnetometer/ak8974.c +index d32996702110..87c15a63c1a4 100644 +--- a/drivers/iio/magnetometer/ak8974.c ++++ b/drivers/iio/magnetometer/ak8974.c +@@ -185,6 +185,11 @@ struct ak8974 { + bool drdy_irq; + struct completion drdy_complete; + bool drdy_active_low; ++ /* Ensure timestamp is naturally aligned */ ++ struct { ++ __le16 channels[3]; ++ s64 ts __aligned(8); ++ } scan; + }; + + static const char ak8974_reg_avdd[] = "avdd"; +@@ -581,7 +586,6 @@ static void ak8974_fill_buffer(struct iio_dev *indio_dev) + { + struct ak8974 *ak8974 = iio_priv(indio_dev); + int ret; +- __le16 hw_values[8]; /* Three axes + 64bit padding */ + + pm_runtime_get_sync(&ak8974->i2c->dev); + mutex_lock(&ak8974->lock); +@@ -591,13 +595,13 @@ static void ak8974_fill_buffer(struct iio_dev *indio_dev) + dev_err(&ak8974->i2c->dev, "error triggering measure\n"); + goto out_unlock; + } +- ret = ak8974_getresult(ak8974, hw_values); ++ ret = ak8974_getresult(ak8974, ak8974->scan.channels); + if (ret) { + dev_err(&ak8974->i2c->dev, "error getting measures\n"); + goto out_unlock; + } + +- iio_push_to_buffers_with_timestamp(indio_dev, hw_values, ++ iio_push_to_buffers_with_timestamp(indio_dev, &ak8974->scan, + iio_get_time_ns(indio_dev)); + + out_unlock: +@@ -764,19 +768,21 @@ static int ak8974_probe(struct i2c_client *i2c, + ak8974->map = devm_regmap_init_i2c(i2c, &ak8974_regmap_config); + if (IS_ERR(ak8974->map)) { + dev_err(&i2c->dev, "failed to allocate register map\n"); ++ pm_runtime_put_noidle(&i2c->dev); ++ pm_runtime_disable(&i2c->dev); + return PTR_ERR(ak8974->map); + } + + ret = ak8974_set_power(ak8974, AK8974_PWR_ON); + if (ret) { + dev_err(&i2c->dev, "could not power on\n"); +- goto power_off; ++ goto disable_pm; + } + + ret = ak8974_detect(ak8974); + if (ret) { + dev_err(&i2c->dev, "neither AK8974 nor AMI30x found\n"); +- goto power_off; ++ goto disable_pm; + } + + ret = ak8974_selftest(ak8974); +@@ -786,14 +792,9 @@ static int ak8974_probe(struct i2c_client *i2c, + ret = ak8974_reset(ak8974); + if (ret) { + dev_err(&i2c->dev, "AK8974 reset failed\n"); +- goto power_off; ++ goto disable_pm; + } + +- pm_runtime_set_autosuspend_delay(&i2c->dev, +- AK8974_AUTOSUSPEND_DELAY); +- pm_runtime_use_autosuspend(&i2c->dev); +- pm_runtime_put(&i2c->dev); +- + indio_dev->dev.parent = &i2c->dev; + indio_dev->channels = ak8974_channels; + indio_dev->num_channels = ARRAY_SIZE(ak8974_channels); +@@ -846,6 +847,11 @@ no_irq: + goto cleanup_buffer; + } + ++ pm_runtime_set_autosuspend_delay(&i2c->dev, ++ AK8974_AUTOSUSPEND_DELAY); ++ pm_runtime_use_autosuspend(&i2c->dev); ++ pm_runtime_put(&i2c->dev); ++ + return 0; + + cleanup_buffer: +@@ -854,7 +860,6 @@ disable_pm: + pm_runtime_put_noidle(&i2c->dev); + pm_runtime_disable(&i2c->dev); + ak8974_set_power(ak8974, AK8974_PWR_OFF); +-power_off: + regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs); + + return ret; +diff --git a/drivers/iio/pressure/ms5611_core.c b/drivers/iio/pressure/ms5611_core.c +index 2f598ad91621..f5db9fa086f3 100644 +--- a/drivers/iio/pressure/ms5611_core.c ++++ b/drivers/iio/pressure/ms5611_core.c +@@ -212,16 +212,21 @@ static irqreturn_t ms5611_trigger_handler(int irq, void *p) + struct iio_poll_func *pf = p; + struct iio_dev *indio_dev = pf->indio_dev; + struct ms5611_state *st = iio_priv(indio_dev); +- s32 buf[4]; /* s32 (pressure) + s32 (temp) + 2 * s32 (timestamp) */ ++ /* Ensure buffer elements are naturally aligned */ ++ struct { ++ s32 channels[2]; ++ s64 ts __aligned(8); ++ } scan; + int ret; + + mutex_lock(&st->lock); +- ret = ms5611_read_temp_and_pressure(indio_dev, &buf[1], &buf[0]); ++ ret = ms5611_read_temp_and_pressure(indio_dev, &scan.channels[1], ++ &scan.channels[0]); + mutex_unlock(&st->lock); + if (ret < 0) + goto err; + +- iio_push_to_buffers_with_timestamp(indio_dev, buf, ++ iio_push_to_buffers_with_timestamp(indio_dev, &scan, + iio_get_time_ns(indio_dev)); + + err: +diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c +index 9d0d07930236..7f2e5a8942a4 100644 +--- a/drivers/iio/pressure/zpa2326.c ++++ b/drivers/iio/pressure/zpa2326.c +@@ -664,8 +664,10 @@ static int zpa2326_resume(const struct iio_dev *indio_dev) + int err; + + err = pm_runtime_get_sync(indio_dev->dev.parent); +- if (err < 0) ++ if (err < 0) { ++ pm_runtime_put(indio_dev->dev.parent); + return err; ++ } + + if (err > 0) { + /* +diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c +index 96edc5c30204..09e29c6cb66d 100644 +--- a/drivers/infiniband/hw/mlx5/qp.c ++++ b/drivers/infiniband/hw/mlx5/qp.c +@@ -1463,6 +1463,8 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, + u16 uid = to_mpd(pd)->uid; + u32 out[MLX5_ST_SZ_DW(create_tir_out)] = {}; + ++ if (!qp->sq.wqe_cnt && !qp->rq.wqe_cnt) ++ return -EINVAL; + if (qp->sq.wqe_cnt) { + err = create_raw_packet_qp_tis(dev, qp, sq, tdn, pd); + if (err) +diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h +index 7e048b557462..858a26302198 100644 +--- a/drivers/input/serio/i8042-x86ia64io.h ++++ b/drivers/input/serio/i8042-x86ia64io.h +@@ -425,6 +425,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "076804U"), + }, + }, ++ { ++ /* Lenovo XiaoXin Air 12 */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "80UN"), ++ }, ++ }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), +diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c +index 0403102e807e..37b35ab97beb 100644 +--- a/drivers/input/touchscreen/goodix.c ++++ b/drivers/input/touchscreen/goodix.c +@@ -168,6 +168,22 @@ static const struct dmi_system_id nine_bytes_report[] = { + {} + }; + ++/* ++ * Those tablets have their x coordinate inverted ++ */ ++static const struct dmi_system_id inverted_x_screen[] = { ++#if defined(CONFIG_DMI) && defined(CONFIG_X86) ++ { ++ .ident = "Cube I15-TC", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Cube"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "I15-TC") ++ }, ++ }, ++#endif ++ {} ++}; ++ + /** + * goodix_i2c_read - read data from a register of the i2c slave device. + * +@@ -780,6 +796,12 @@ static int goodix_configure_dev(struct goodix_ts_data *ts) + "Non-standard 9-bytes report format quirk\n"); + } + ++ if (dmi_check_system(inverted_x_screen)) { ++ ts->prop.invert_x = true; ++ dev_dbg(&ts->client->dev, ++ "Applying 'inverted x screen' quirk\n"); ++ } ++ + error = input_mt_init_slots(ts->input_dev, ts->max_touch_num, + INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED); + if (error) { +diff --git a/drivers/input/touchscreen/mms114.c b/drivers/input/touchscreen/mms114.c +index fca908ba4841..fb28fd2d6f1c 100644 +--- a/drivers/input/touchscreen/mms114.c ++++ b/drivers/input/touchscreen/mms114.c +@@ -54,6 +54,7 @@ + enum mms_type { + TYPE_MMS114 = 114, + TYPE_MMS152 = 152, ++ TYPE_MMS345L = 345, + }; + + struct mms114_data { +@@ -250,6 +251,15 @@ static int mms114_get_version(struct mms114_data *data) + int error; + + switch (data->type) { ++ case TYPE_MMS345L: ++ error = __mms114_read_reg(data, MMS152_FW_REV, 3, buf); ++ if (error) ++ return error; ++ ++ dev_info(dev, "TSP FW Rev: bootloader 0x%x / core 0x%x / config 0x%x\n", ++ buf[0], buf[1], buf[2]); ++ break; ++ + case TYPE_MMS152: + error = __mms114_read_reg(data, MMS152_FW_REV, 3, buf); + if (error) +@@ -287,8 +297,8 @@ static int mms114_setup_regs(struct mms114_data *data) + if (error < 0) + return error; + +- /* MMS152 has no configuration or power on registers */ +- if (data->type == TYPE_MMS152) ++ /* Only MMS114 has configuration and power on registers */ ++ if (data->type != TYPE_MMS114) + return 0; + + error = mms114_set_active(data, true); +@@ -598,6 +608,9 @@ static const struct of_device_id mms114_dt_match[] = { + }, { + .compatible = "melfas,mms152", + .data = (void *)TYPE_MMS152, ++ }, { ++ .compatible = "melfas,mms345l", ++ .data = (void *)TYPE_MMS345L, + }, + { } + }; +diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig +index e3842eabcfdd..390568afee9f 100644 +--- a/drivers/iommu/Kconfig ++++ b/drivers/iommu/Kconfig +@@ -205,7 +205,7 @@ config INTEL_IOMMU_DEBUGFS + + config INTEL_IOMMU_SVM + bool "Support for Shared Virtual Memory with Intel IOMMU" +- depends on INTEL_IOMMU && X86 ++ depends on INTEL_IOMMU && X86_64 + select PCI_PASID + select MMU_NOTIFIER + help +diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c +index ab4144ea1f11..d6cd5537126c 100644 +--- a/drivers/misc/atmel-ssc.c ++++ b/drivers/misc/atmel-ssc.c +@@ -10,7 +10,7 @@ + #include <linux/clk.h> + #include <linux/err.h> + #include <linux/io.h> +-#include <linux/spinlock.h> ++#include <linux/mutex.h> + #include <linux/atmel-ssc.h> + #include <linux/slab.h> + #include <linux/module.h> +@@ -20,7 +20,7 @@ + #include "../../sound/soc/atmel/atmel_ssc_dai.h" + + /* Serialize access to ssc_list and user count */ +-static DEFINE_SPINLOCK(user_lock); ++static DEFINE_MUTEX(user_lock); + static LIST_HEAD(ssc_list); + + struct ssc_device *ssc_request(unsigned int ssc_num) +@@ -28,7 +28,7 @@ struct ssc_device *ssc_request(unsigned int ssc_num) + int ssc_valid = 0; + struct ssc_device *ssc; + +- spin_lock(&user_lock); ++ mutex_lock(&user_lock); + list_for_each_entry(ssc, &ssc_list, list) { + if (ssc->pdev->dev.of_node) { + if (of_alias_get_id(ssc->pdev->dev.of_node, "ssc") +@@ -44,18 +44,18 @@ struct ssc_device *ssc_request(unsigned int ssc_num) + } + + if (!ssc_valid) { +- spin_unlock(&user_lock); ++ mutex_unlock(&user_lock); + pr_err("ssc: ssc%d platform device is missing\n", ssc_num); + return ERR_PTR(-ENODEV); + } + + if (ssc->user) { +- spin_unlock(&user_lock); ++ mutex_unlock(&user_lock); + dev_dbg(&ssc->pdev->dev, "module busy\n"); + return ERR_PTR(-EBUSY); + } + ssc->user++; +- spin_unlock(&user_lock); ++ mutex_unlock(&user_lock); + + clk_prepare(ssc->clk); + +@@ -67,14 +67,14 @@ void ssc_free(struct ssc_device *ssc) + { + bool disable_clk = true; + +- spin_lock(&user_lock); ++ mutex_lock(&user_lock); + if (ssc->user) + ssc->user--; + else { + disable_clk = false; + dev_dbg(&ssc->pdev->dev, "device already free\n"); + } +- spin_unlock(&user_lock); ++ mutex_unlock(&user_lock); + + if (disable_clk) + clk_unprepare(ssc->clk); +@@ -237,9 +237,9 @@ static int ssc_probe(struct platform_device *pdev) + return -ENXIO; + } + +- spin_lock(&user_lock); ++ mutex_lock(&user_lock); + list_add_tail(&ssc->list, &ssc_list); +- spin_unlock(&user_lock); ++ mutex_unlock(&user_lock); + + platform_set_drvdata(pdev, ssc); + +@@ -258,9 +258,9 @@ static int ssc_remove(struct platform_device *pdev) + + ssc_sound_dai_remove(ssc); + +- spin_lock(&user_lock); ++ mutex_lock(&user_lock); + list_del(&ssc->list); +- spin_unlock(&user_lock); ++ mutex_unlock(&user_lock); + + return 0; + } +diff --git a/drivers/misc/habanalabs/goya/goya_security.c b/drivers/misc/habanalabs/goya/goya_security.c +index d6ec12b3e692..08fc89ea0a0c 100644 +--- a/drivers/misc/habanalabs/goya/goya_security.c ++++ b/drivers/misc/habanalabs/goya/goya_security.c +@@ -695,7 +695,6 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + mask |= 1 << ((mmTPC0_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC0_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2); + mask |= 1 << ((mmTPC0_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2); +- mask |= 1 << ((mmTPC0_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC0_CFG_TPC_STALL & 0x7F) >> 2); + mask |= 1 << ((mmTPC0_CFG_MSS_CONFIG & 0x7F) >> 2); + mask |= 1 << ((mmTPC0_CFG_TPC_INTR_CAUSE & 0x7F) >> 2); +@@ -875,6 +874,16 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + goya_pb_set_block(hdev, mmTPC1_RD_REGULATOR_BASE); + goya_pb_set_block(hdev, mmTPC1_WR_REGULATOR_BASE); + ++ pb_addr = (mmTPC1_CFG_SEMAPHORE & ~0xFFF) + PROT_BITS_OFFS; ++ word_offset = ((mmTPC1_CFG_SEMAPHORE & PROT_BITS_OFFS) >> 7) << 2; ++ ++ mask = 1 << ((mmTPC1_CFG_SEMAPHORE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC1_CFG_VFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC1_CFG_SFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC1_CFG_STATUS & 0x7F) >> 2); ++ ++ WREG32(pb_addr + word_offset, ~mask); ++ + pb_addr = (mmTPC1_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF) + PROT_BITS_OFFS; + word_offset = ((mmTPC1_CFG_CFG_BASE_ADDRESS_HIGH & + PROT_BITS_OFFS) >> 7) << 2; +@@ -882,6 +891,10 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + mask |= 1 << ((mmTPC1_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC1_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2); + mask |= 1 << ((mmTPC1_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC1_CFG_TPC_STALL & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC1_CFG_MSS_CONFIG & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC1_CFG_TPC_INTR_CAUSE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC1_CFG_TPC_INTR_MASK & 0x7F) >> 2); + + WREG32(pb_addr + word_offset, ~mask); + +@@ -1057,6 +1070,16 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + goya_pb_set_block(hdev, mmTPC2_RD_REGULATOR_BASE); + goya_pb_set_block(hdev, mmTPC2_WR_REGULATOR_BASE); + ++ pb_addr = (mmTPC2_CFG_SEMAPHORE & ~0xFFF) + PROT_BITS_OFFS; ++ word_offset = ((mmTPC2_CFG_SEMAPHORE & PROT_BITS_OFFS) >> 7) << 2; ++ ++ mask = 1 << ((mmTPC2_CFG_SEMAPHORE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC2_CFG_VFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC2_CFG_SFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC2_CFG_STATUS & 0x7F) >> 2); ++ ++ WREG32(pb_addr + word_offset, ~mask); ++ + pb_addr = (mmTPC2_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF) + PROT_BITS_OFFS; + word_offset = ((mmTPC2_CFG_CFG_BASE_ADDRESS_HIGH & + PROT_BITS_OFFS) >> 7) << 2; +@@ -1064,6 +1087,10 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + mask |= 1 << ((mmTPC2_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC2_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2); + mask |= 1 << ((mmTPC2_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC2_CFG_TPC_STALL & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC2_CFG_MSS_CONFIG & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC2_CFG_TPC_INTR_CAUSE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC2_CFG_TPC_INTR_MASK & 0x7F) >> 2); + + WREG32(pb_addr + word_offset, ~mask); + +@@ -1239,6 +1266,16 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + goya_pb_set_block(hdev, mmTPC3_RD_REGULATOR_BASE); + goya_pb_set_block(hdev, mmTPC3_WR_REGULATOR_BASE); + ++ pb_addr = (mmTPC3_CFG_SEMAPHORE & ~0xFFF) + PROT_BITS_OFFS; ++ word_offset = ((mmTPC3_CFG_SEMAPHORE & PROT_BITS_OFFS) >> 7) << 2; ++ ++ mask = 1 << ((mmTPC3_CFG_SEMAPHORE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC3_CFG_VFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC3_CFG_SFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC3_CFG_STATUS & 0x7F) >> 2); ++ ++ WREG32(pb_addr + word_offset, ~mask); ++ + pb_addr = (mmTPC3_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF) + PROT_BITS_OFFS; + word_offset = ((mmTPC3_CFG_CFG_BASE_ADDRESS_HIGH + & PROT_BITS_OFFS) >> 7) << 2; +@@ -1246,6 +1283,10 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + mask |= 1 << ((mmTPC3_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC3_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2); + mask |= 1 << ((mmTPC3_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC3_CFG_TPC_STALL & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC3_CFG_MSS_CONFIG & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC3_CFG_TPC_INTR_CAUSE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC3_CFG_TPC_INTR_MASK & 0x7F) >> 2); + + WREG32(pb_addr + word_offset, ~mask); + +@@ -1421,6 +1462,16 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + goya_pb_set_block(hdev, mmTPC4_RD_REGULATOR_BASE); + goya_pb_set_block(hdev, mmTPC4_WR_REGULATOR_BASE); + ++ pb_addr = (mmTPC4_CFG_SEMAPHORE & ~0xFFF) + PROT_BITS_OFFS; ++ word_offset = ((mmTPC4_CFG_SEMAPHORE & PROT_BITS_OFFS) >> 7) << 2; ++ ++ mask = 1 << ((mmTPC4_CFG_SEMAPHORE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC4_CFG_VFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC4_CFG_SFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC4_CFG_STATUS & 0x7F) >> 2); ++ ++ WREG32(pb_addr + word_offset, ~mask); ++ + pb_addr = (mmTPC4_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF) + PROT_BITS_OFFS; + word_offset = ((mmTPC4_CFG_CFG_BASE_ADDRESS_HIGH & + PROT_BITS_OFFS) >> 7) << 2; +@@ -1428,6 +1479,10 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + mask |= 1 << ((mmTPC4_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC4_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2); + mask |= 1 << ((mmTPC4_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC4_CFG_TPC_STALL & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC4_CFG_MSS_CONFIG & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC4_CFG_TPC_INTR_CAUSE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC4_CFG_TPC_INTR_MASK & 0x7F) >> 2); + + WREG32(pb_addr + word_offset, ~mask); + +@@ -1603,6 +1658,16 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + goya_pb_set_block(hdev, mmTPC5_RD_REGULATOR_BASE); + goya_pb_set_block(hdev, mmTPC5_WR_REGULATOR_BASE); + ++ pb_addr = (mmTPC5_CFG_SEMAPHORE & ~0xFFF) + PROT_BITS_OFFS; ++ word_offset = ((mmTPC5_CFG_SEMAPHORE & PROT_BITS_OFFS) >> 7) << 2; ++ ++ mask = 1 << ((mmTPC5_CFG_SEMAPHORE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC5_CFG_VFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC5_CFG_SFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC5_CFG_STATUS & 0x7F) >> 2); ++ ++ WREG32(pb_addr + word_offset, ~mask); ++ + pb_addr = (mmTPC5_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF) + PROT_BITS_OFFS; + word_offset = ((mmTPC5_CFG_CFG_BASE_ADDRESS_HIGH & + PROT_BITS_OFFS) >> 7) << 2; +@@ -1610,6 +1675,10 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + mask |= 1 << ((mmTPC5_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC5_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2); + mask |= 1 << ((mmTPC5_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC5_CFG_TPC_STALL & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC5_CFG_MSS_CONFIG & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC5_CFG_TPC_INTR_CAUSE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC5_CFG_TPC_INTR_MASK & 0x7F) >> 2); + + WREG32(pb_addr + word_offset, ~mask); + +@@ -1785,6 +1854,16 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + goya_pb_set_block(hdev, mmTPC6_RD_REGULATOR_BASE); + goya_pb_set_block(hdev, mmTPC6_WR_REGULATOR_BASE); + ++ pb_addr = (mmTPC6_CFG_SEMAPHORE & ~0xFFF) + PROT_BITS_OFFS; ++ word_offset = ((mmTPC6_CFG_SEMAPHORE & PROT_BITS_OFFS) >> 7) << 2; ++ ++ mask = 1 << ((mmTPC6_CFG_SEMAPHORE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC6_CFG_VFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC6_CFG_SFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC6_CFG_STATUS & 0x7F) >> 2); ++ ++ WREG32(pb_addr + word_offset, ~mask); ++ + pb_addr = (mmTPC6_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF) + PROT_BITS_OFFS; + word_offset = ((mmTPC6_CFG_CFG_BASE_ADDRESS_HIGH & + PROT_BITS_OFFS) >> 7) << 2; +@@ -1792,6 +1871,10 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + mask |= 1 << ((mmTPC6_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC6_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2); + mask |= 1 << ((mmTPC6_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC6_CFG_TPC_STALL & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC6_CFG_MSS_CONFIG & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC6_CFG_TPC_INTR_CAUSE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC6_CFG_TPC_INTR_MASK & 0x7F) >> 2); + + WREG32(pb_addr + word_offset, ~mask); + +@@ -1967,6 +2050,16 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + goya_pb_set_block(hdev, mmTPC7_RD_REGULATOR_BASE); + goya_pb_set_block(hdev, mmTPC7_WR_REGULATOR_BASE); + ++ pb_addr = (mmTPC7_CFG_SEMAPHORE & ~0xFFF) + PROT_BITS_OFFS; ++ word_offset = ((mmTPC7_CFG_SEMAPHORE & PROT_BITS_OFFS) >> 7) << 2; ++ ++ mask = 1 << ((mmTPC7_CFG_SEMAPHORE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC7_CFG_VFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC7_CFG_SFLAGS & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC7_CFG_STATUS & 0x7F) >> 2); ++ ++ WREG32(pb_addr + word_offset, ~mask); ++ + pb_addr = (mmTPC7_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF) + PROT_BITS_OFFS; + word_offset = ((mmTPC7_CFG_CFG_BASE_ADDRESS_HIGH & + PROT_BITS_OFFS) >> 7) << 2; +@@ -1974,6 +2067,10 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev) + mask |= 1 << ((mmTPC7_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2); + mask |= 1 << ((mmTPC7_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2); + mask |= 1 << ((mmTPC7_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC7_CFG_TPC_STALL & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC7_CFG_MSS_CONFIG & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC7_CFG_TPC_INTR_CAUSE & 0x7F) >> 2); ++ mask |= 1 << ((mmTPC7_CFG_TPC_INTR_MASK & 0x7F) >> 2); + + WREG32(pb_addr + word_offset, ~mask); + +diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c +index 53bb394ccba6..cef97a7eb8b6 100644 +--- a/drivers/misc/mei/bus.c ++++ b/drivers/misc/mei/bus.c +@@ -745,9 +745,8 @@ static int mei_cl_device_remove(struct device *dev) + + mei_cl_bus_module_put(cldev); + module_put(THIS_MODULE); +- dev->driver = NULL; +- return ret; + ++ return ret; + } + + static ssize_t name_show(struct device *dev, struct device_attribute *a, +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index c37e70dbe250..7e4bc9124efd 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -168,6 +168,8 @@ static struct variant_data variant_ux500 = { + .cmdreg_srsp = MCI_CPSM_RESPONSE, + .datalength_bits = 24, + .datactrl_blocksz = 11, ++ .datactrl_any_blocksz = true, ++ .dma_power_of_2 = true, + .datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN, + .st_sdio = true, + .st_clkdiv = true, +@@ -201,6 +203,8 @@ static struct variant_data variant_ux500v2 = { + .datactrl_mask_ddrmode = MCI_DPSM_ST_DDRMODE, + .datalength_bits = 24, + .datactrl_blocksz = 11, ++ .datactrl_any_blocksz = true, ++ .dma_power_of_2 = true, + .datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN, + .st_sdio = true, + .st_clkdiv = true, +@@ -260,6 +264,7 @@ static struct variant_data variant_stm32_sdmmc = { + .datacnt_useless = true, + .datalength_bits = 25, + .datactrl_blocksz = 14, ++ .datactrl_any_blocksz = true, + .stm32_idmabsize_mask = GENMASK(12, 5), + .init = sdmmc_variant_init, + }; +@@ -279,6 +284,7 @@ static struct variant_data variant_qcom = { + .data_cmd_enable = MCI_CPSM_QCOM_DATCMD, + .datalength_bits = 24, + .datactrl_blocksz = 11, ++ .datactrl_any_blocksz = true, + .pwrreg_powerup = MCI_PWR_UP, + .f_max = 208000000, + .explicit_mclk_control = true, +@@ -447,10 +453,11 @@ void mmci_dma_setup(struct mmci_host *host) + static int mmci_validate_data(struct mmci_host *host, + struct mmc_data *data) + { ++ struct variant_data *variant = host->variant; ++ + if (!data) + return 0; +- +- if (!is_power_of_2(data->blksz)) { ++ if (!is_power_of_2(data->blksz) && !variant->datactrl_any_blocksz) { + dev_err(mmc_dev(host->mmc), + "unsupported block size (%d bytes)\n", data->blksz); + return -EINVAL; +@@ -515,7 +522,9 @@ int mmci_dma_start(struct mmci_host *host, unsigned int datactrl) + "Submit MMCI DMA job, sglen %d blksz %04x blks %04x flags %08x\n", + data->sg_len, data->blksz, data->blocks, data->flags); + +- host->ops->dma_start(host, &datactrl); ++ ret = host->ops->dma_start(host, &datactrl); ++ if (ret) ++ return ret; + + /* Trigger the DMA transfer */ + mmci_write_datactrlreg(host, datactrl); +@@ -822,6 +831,18 @@ static int _mmci_dmae_prep_data(struct mmci_host *host, struct mmc_data *data, + if (data->blksz * data->blocks <= variant->fifosize) + return -EINVAL; + ++ /* ++ * This is necessary to get SDIO working on the Ux500. We do not yet ++ * know if this is a bug in: ++ * - The Ux500 DMA controller (DMA40) ++ * - The MMCI DMA interface on the Ux500 ++ * some power of two blocks (such as 64 bytes) are sent regularly ++ * during SDIO traffic and those work fine so for these we enable DMA ++ * transfers. ++ */ ++ if (host->variant->dma_power_of_2 && !is_power_of_2(data->blksz)) ++ return -EINVAL; ++ + device = chan->device; + nr_sg = dma_map_sg(device->dev, data->sg, data->sg_len, + mmc_get_dma_dir(data)); +@@ -872,9 +893,14 @@ int mmci_dmae_prep_data(struct mmci_host *host, + int mmci_dmae_start(struct mmci_host *host, unsigned int *datactrl) + { + struct mmci_dmae_priv *dmae = host->dma_priv; ++ int ret; + + host->dma_in_progress = true; +- dmaengine_submit(dmae->desc_current); ++ ret = dma_submit_error(dmaengine_submit(dmae->desc_current)); ++ if (ret < 0) { ++ host->dma_in_progress = false; ++ return ret; ++ } + dma_async_issue_pending(dmae->cur); + + *datactrl |= MCI_DPSM_DMAENABLE; +diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h +index 833236ecb31e..89ab73343cf3 100644 +--- a/drivers/mmc/host/mmci.h ++++ b/drivers/mmc/host/mmci.h +@@ -278,7 +278,11 @@ struct mmci_host; + * @stm32_clkdiv: true if using a STM32-specific clock divider algorithm + * @datactrl_mask_ddrmode: ddr mode mask in datactrl register. + * @datactrl_mask_sdio: SDIO enable mask in datactrl register +- * @datactrl_blksz: block size in power of two ++ * @datactrl_blocksz: block size in power of two ++ * @datactrl_any_blocksz: true if block any block sizes are accepted by ++ * hardware, such as with some SDIO traffic that send ++ * odd packets. ++ * @dma_power_of_2: DMA only works with blocks that are a power of 2. + * @datactrl_first: true if data must be setup before send command + * @datacnt_useless: true if you could not use datacnt register to read + * remaining data +@@ -323,6 +327,8 @@ struct variant_data { + unsigned int datactrl_mask_ddrmode; + unsigned int datactrl_mask_sdio; + unsigned int datactrl_blocksz; ++ u8 datactrl_any_blocksz:1; ++ u8 dma_power_of_2:1; + u8 datactrl_first:1; + u8 datacnt_useless:1; + u8 st_sdio:1; +diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c +index 50514fedbc76..136f9737713d 100644 +--- a/drivers/mmc/host/sdhci.c ++++ b/drivers/mmc/host/sdhci.c +@@ -152,7 +152,7 @@ static void sdhci_set_card_detection(struct sdhci_host *host, bool enable) + u32 present; + + if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) || +- !mmc_card_is_removable(host->mmc)) ++ !mmc_card_is_removable(host->mmc) || mmc_can_gpio_cd(host->mmc)) + return; + + if (enable) { +diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +index 4fef20724175..e9ad8bb82f44 100644 +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -537,8 +537,9 @@ static int brcmnand_revision_init(struct brcmnand_controller *ctrl) + } else { + ctrl->cs_offsets = brcmnand_cs_offsets; + +- /* v5.0 and earlier has a different CS0 offset layout */ +- if (ctrl->nand_version <= 0x0500) ++ /* v3.3-5.0 have a different CS0 offset layout */ ++ if (ctrl->nand_version >= 0x0303 && ++ ctrl->nand_version <= 0x0500) + ctrl->cs0_offsets = brcmnand_cs_offsets_cs0; + } + +@@ -1790,28 +1791,31 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, + static int brcmstb_nand_verify_erased_page(struct mtd_info *mtd, + struct nand_chip *chip, void *buf, u64 addr) + { +- int i, sas; +- void *oob = chip->oob_poi; ++ struct mtd_oob_region ecc; ++ int i; + int bitflips = 0; + int page = addr >> chip->page_shift; + int ret; ++ void *ecc_bytes; + void *ecc_chunk; + + if (!buf) + buf = nand_get_data_buf(chip); + +- sas = mtd->oobsize / chip->ecc.steps; +- + /* read without ecc for verification */ + ret = chip->ecc.read_page_raw(chip, buf, true, page); + if (ret) + return ret; + +- for (i = 0; i < chip->ecc.steps; i++, oob += sas) { ++ for (i = 0; i < chip->ecc.steps; i++) { + ecc_chunk = buf + chip->ecc.size * i; +- ret = nand_check_erased_ecc_chunk(ecc_chunk, +- chip->ecc.size, +- oob, sas, NULL, 0, ++ ++ mtd_ooblayout_ecc(mtd, i, &ecc); ++ ecc_bytes = chip->oob_poi + ecc.offset; ++ ++ ret = nand_check_erased_ecc_chunk(ecc_chunk, chip->ecc.size, ++ ecc_bytes, ecc.length, ++ NULL, 0, + chip->ecc.strength); + if (ret < 0) + return ret; +diff --git a/drivers/mtd/nand/raw/marvell_nand.c b/drivers/mtd/nand/raw/marvell_nand.c +index fc49e13d81ec..ee4afa17d8a3 100644 +--- a/drivers/mtd/nand/raw/marvell_nand.c ++++ b/drivers/mtd/nand/raw/marvell_nand.c +@@ -707,7 +707,7 @@ static int marvell_nfc_wait_op(struct nand_chip *chip, unsigned int timeout_ms) + * In case the interrupt was not served in the required time frame, + * check if the ISR was not served or if something went actually wrong. + */ +- if (ret && !pending) { ++ if (!ret && !pending) { + dev_err(nfc->dev, "Timeout waiting for RB signal\n"); + return -ETIMEDOUT; + } +@@ -2664,7 +2664,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc, + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { + dev_err(dev, "failed to register mtd device: %d\n", ret); +- nand_release(chip); ++ nand_cleanup(chip); + return ret; + } + +@@ -2673,6 +2673,16 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc, + return 0; + } + ++static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc) ++{ ++ struct marvell_nand_chip *entry, *temp; ++ ++ list_for_each_entry_safe(entry, temp, &nfc->chips, node) { ++ nand_release(&entry->chip); ++ list_del(&entry->node); ++ } ++} ++ + static int marvell_nand_chips_init(struct device *dev, struct marvell_nfc *nfc) + { + struct device_node *np = dev->of_node; +@@ -2707,21 +2717,16 @@ static int marvell_nand_chips_init(struct device *dev, struct marvell_nfc *nfc) + ret = marvell_nand_chip_init(dev, nfc, nand_np); + if (ret) { + of_node_put(nand_np); +- return ret; ++ goto cleanup_chips; + } + } + + return 0; +-} + +-static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc) +-{ +- struct marvell_nand_chip *entry, *temp; ++cleanup_chips: ++ marvell_nand_chips_cleanup(nfc); + +- list_for_each_entry_safe(entry, temp, &nfc->chips, node) { +- nand_release(&entry->chip); +- list_del(&entry->node); +- } ++ return ret; + } + + static int marvell_nfc_init_dma(struct marvell_nfc *nfc) +diff --git a/drivers/mtd/nand/raw/nand_timings.c b/drivers/mtd/nand/raw/nand_timings.c +index f64b06a71dfa..f12b7a7844c9 100644 +--- a/drivers/mtd/nand/raw/nand_timings.c ++++ b/drivers/mtd/nand/raw/nand_timings.c +@@ -314,10 +314,9 @@ int onfi_fill_data_interface(struct nand_chip *chip, + /* microseconds -> picoseconds */ + timings->tPROG_max = 1000000ULL * ONFI_DYN_TIMING_MAX; + timings->tBERS_max = 1000000ULL * ONFI_DYN_TIMING_MAX; +- timings->tR_max = 1000000ULL * 200000000ULL; + +- /* nanoseconds -> picoseconds */ +- timings->tCCS_min = 1000UL * 500000; ++ timings->tR_max = 200000000; ++ timings->tCCS_min = 500000; + } + + return 0; +diff --git a/drivers/mtd/nand/raw/oxnas_nand.c b/drivers/mtd/nand/raw/oxnas_nand.c +index 0429d218fd9f..23c222b6c40e 100644 +--- a/drivers/mtd/nand/raw/oxnas_nand.c ++++ b/drivers/mtd/nand/raw/oxnas_nand.c +@@ -32,6 +32,7 @@ struct oxnas_nand_ctrl { + void __iomem *io_base; + struct clk *clk; + struct nand_chip *chips[OXNAS_NAND_MAX_CHIPS]; ++ unsigned int nchips; + }; + + static uint8_t oxnas_nand_read_byte(struct nand_chip *chip) +@@ -79,9 +80,9 @@ static int oxnas_nand_probe(struct platform_device *pdev) + struct nand_chip *chip; + struct mtd_info *mtd; + struct resource *res; +- int nchips = 0; + int count = 0; + int err = 0; ++ int i; + + /* Allocate memory for the device structure (and zero it) */ + oxnas = devm_kzalloc(&pdev->dev, sizeof(*oxnas), +@@ -143,12 +144,12 @@ static int oxnas_nand_probe(struct platform_device *pdev) + if (err) + goto err_cleanup_nand; + +- oxnas->chips[nchips] = chip; +- ++nchips; ++ oxnas->chips[oxnas->nchips] = chip; ++ ++oxnas->nchips; + } + + /* Exit if no chips found */ +- if (!nchips) { ++ if (!oxnas->nchips) { + err = -ENODEV; + goto err_clk_unprepare; + } +@@ -161,6 +162,13 @@ err_cleanup_nand: + nand_cleanup(chip); + err_release_child: + of_node_put(nand_np); ++ ++ for (i = 0; i < oxnas->nchips; i++) { ++ chip = oxnas->chips[i]; ++ WARN_ON(mtd_device_unregister(nand_to_mtd(chip))); ++ nand_cleanup(chip); ++ } ++ + err_clk_unprepare: + clk_disable_unprepare(oxnas->clk); + return err; +@@ -169,9 +177,13 @@ err_clk_unprepare: + static int oxnas_nand_remove(struct platform_device *pdev) + { + struct oxnas_nand_ctrl *oxnas = platform_get_drvdata(pdev); ++ struct nand_chip *chip; ++ int i; + +- if (oxnas->chips[0]) +- nand_release(oxnas->chips[0]); ++ for (i = 0; i < oxnas->nchips; i++) { ++ chip = oxnas->chips[i]; ++ nand_release(chip); ++ } + + clk_disable_unprepare(oxnas->clk); + +diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c +index 9502db66092e..b16aea0e3999 100644 +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -1116,6 +1116,8 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) + set_bit(0, priv->cfp.used); + set_bit(0, priv->cfp.unique); + ++ /* Balance of_node_put() done by of_find_node_by_name() */ ++ of_node_get(dn); + ports = of_find_node_by_name(dn, "ports"); + if (ports) { + bcm_sf2_identify_ports(priv, ports); +diff --git a/drivers/net/dsa/microchip/ksz8795.c b/drivers/net/dsa/microchip/ksz8795.c +index 84c4319e3b31..8d50aacd19e5 100644 +--- a/drivers/net/dsa/microchip/ksz8795.c ++++ b/drivers/net/dsa/microchip/ksz8795.c +@@ -1270,6 +1270,9 @@ static int ksz8795_switch_init(struct ksz_device *dev) + /* set the real number of ports */ + dev->ds->num_ports = dev->port_cnt; + ++ /* set the real number of ports */ ++ dev->ds->num_ports = dev->port_cnt; ++ + return 0; + } + +diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c +index 3afb596d8e43..f600874e2476 100644 +--- a/drivers/net/dsa/microchip/ksz9477.c ++++ b/drivers/net/dsa/microchip/ksz9477.c +@@ -515,6 +515,9 @@ static int ksz9477_port_vlan_filtering(struct dsa_switch *ds, int port, + PORT_VLAN_LOOKUP_VID_0, false); + } + ++ /* set the real number of ports */ ++ dev->ds->num_ports = dev->port_cnt; ++ + return 0; + } + +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c +index 6f340695e6bd..774e48b3f904 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c +@@ -1597,7 +1597,7 @@ void hw_atl_rpfl3l4_ipv6_src_addr_set(struct aq_hw_s *aq_hw, u8 location, + for (i = 0; i < 4; ++i) + aq_hw_write_reg(aq_hw, + HW_ATL_RPF_L3_SRCA_ADR(location + i), +- ipv6_src[i]); ++ ipv6_src[3 - i]); + } + + void hw_atl_rpfl3l4_ipv6_dest_addr_set(struct aq_hw_s *aq_hw, u8 location, +@@ -1608,7 +1608,7 @@ void hw_atl_rpfl3l4_ipv6_dest_addr_set(struct aq_hw_s *aq_hw, u8 location, + for (i = 0; i < 4; ++i) + aq_hw_write_reg(aq_hw, + HW_ATL_RPF_L3_DSTA_ADR(location + i), +- ipv6_dest[i]); ++ ipv6_dest[3 - i]); + } + + u32 hw_atl_sem_ram_get(struct aq_hw_s *self) +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h +index 35887ad89025..dd8d591404be 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h +@@ -2564,7 +2564,7 @@ + */ + + /* Register address for bitfield pif_rpf_l3_da0_i[31:0] */ +-#define HW_ATL_RPF_L3_DSTA_ADR(location) (0x000053B0 + (location) * 0x4) ++#define HW_ATL_RPF_L3_DSTA_ADR(filter) (0x000053D0 + (filter) * 0x4) + /* Bitmask for bitfield l3_da0[1F:0] */ + #define HW_ATL_RPF_L3_DSTA_MSK 0xFFFFFFFFu + /* Inverted bitmask for bitfield l3_da0[1F:0] */ +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index 01ed4d4296db..a5c4d4d66df3 100644 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -3708,7 +3708,7 @@ static int at91ether_open(struct net_device *dev) + + ret = at91ether_start(dev); + if (ret) +- return ret; ++ goto pm_exit; + + /* Enable MAC interrupts */ + macb_writel(lp, IER, MACB_BIT(RCOMP) | +@@ -3725,6 +3725,10 @@ static int at91ether_open(struct net_device *dev) + netif_start_queue(dev); + + return 0; ++ ++pm_exit: ++ pm_runtime_put_sync(&lp->pdev->dev); ++ return ret; + } + + /* Close the interface */ +diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c +index ffdb7b113f17..ccb2abd18d6c 100644 +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -3206,7 +3206,7 @@ static int mvneta_config_interface(struct mvneta_port *pp, + MVNETA_HSGMII_SERDES_PROTO); + break; + default: +- return -EINVAL; ++ break; + } + } + +@@ -4496,10 +4496,18 @@ static void mvneta_conf_mbus_windows(struct mvneta_port *pp, + } + + /* Power up the port */ +-static void mvneta_port_power_up(struct mvneta_port *pp, int phy_mode) ++static int mvneta_port_power_up(struct mvneta_port *pp, int phy_mode) + { + /* MAC Cause register should be cleared */ + mvreg_write(pp, MVNETA_UNIT_INTR_CAUSE, 0); ++ ++ if (phy_mode != PHY_INTERFACE_MODE_QSGMII && ++ phy_mode != PHY_INTERFACE_MODE_SGMII && ++ !phy_interface_mode_is_8023z(phy_mode) && ++ !phy_interface_mode_is_rgmii(phy_mode)) ++ return -EINVAL; ++ ++ return 0; + } + + /* Device initialization routine */ +@@ -4683,7 +4691,11 @@ static int mvneta_probe(struct platform_device *pdev) + if (err < 0) + goto err_netdev; + +- mvneta_port_power_up(pp, phy_mode); ++ err = mvneta_port_power_up(pp, pp->phy_interface); ++ if (err < 0) { ++ dev_err(&pdev->dev, "can't power up port\n"); ++ return err; ++ } + + /* Armada3700 network controller does not support per-cpu + * operation, so only single NAPI should be initialized. +@@ -4836,7 +4848,11 @@ static int mvneta_resume(struct device *device) + } + } + mvneta_defaults_set(pp); +- mvneta_port_power_up(pp, pp->phy_interface); ++ err = mvneta_port_power_up(pp, pp->phy_interface); ++ if (err < 0) { ++ dev_err(device, "can't power up port\n"); ++ return err; ++ } + + netif_device_attach(dev); + +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +index 134640412d7b..d5b0bf54f961 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c ++++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +@@ -1187,6 +1187,7 @@ static int ionic_init_nic_features(struct ionic_lif *lif) + + netdev->hw_features |= netdev->hw_enc_features; + netdev->features |= netdev->hw_features; ++ netdev->vlan_features |= netdev->features & ~NETIF_F_VLAN_FEATURES; + + netdev->priv_flags |= IFF_UNICAST_FLT; + +diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +index 02cdbb22d335..18d88b424828 100644 +--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c ++++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +@@ -47,15 +47,23 @@ static int rmnet_unregister_real_device(struct net_device *real_dev) + return 0; + } + +-static int rmnet_register_real_device(struct net_device *real_dev) ++static int rmnet_register_real_device(struct net_device *real_dev, ++ struct netlink_ext_ack *extack) + { + struct rmnet_port *port; + int rc, entry; + + ASSERT_RTNL(); + +- if (rmnet_is_real_dev_registered(real_dev)) ++ if (rmnet_is_real_dev_registered(real_dev)) { ++ port = rmnet_get_port_rtnl(real_dev); ++ if (port->rmnet_mode != RMNET_EPMODE_VND) { ++ NL_SET_ERR_MSG_MOD(extack, "bridge device already exists"); ++ return -EINVAL; ++ } ++ + return 0; ++ } + + port = kzalloc(sizeof(*port), GFP_ATOMIC); + if (!port) +@@ -134,7 +142,7 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, + + mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]); + +- err = rmnet_register_real_device(real_dev); ++ err = rmnet_register_real_device(real_dev, extack); + if (err) + goto err0; + +@@ -416,13 +424,10 @@ int rmnet_add_bridge(struct net_device *rmnet_dev, + if (port->nr_rmnet_devs > 1) + return -EINVAL; + +- if (port->rmnet_mode != RMNET_EPMODE_VND) +- return -EINVAL; +- + if (rmnet_is_real_dev_registered(slave_dev)) + return -EBUSY; + +- err = rmnet_register_real_device(slave_dev); ++ err = rmnet_register_real_device(slave_dev, extack); + if (err) + return -EBUSY; + +diff --git a/drivers/net/phy/sfp-bus.c b/drivers/net/phy/sfp-bus.c +index b23fc41896ef..816e59fe68f5 100644 +--- a/drivers/net/phy/sfp-bus.c ++++ b/drivers/net/phy/sfp-bus.c +@@ -9,6 +9,12 @@ + + #include "sfp.h" + ++struct sfp_quirk { ++ const char *vendor; ++ const char *part; ++ void (*modes)(const struct sfp_eeprom_id *id, unsigned long *modes); ++}; ++ + /** + * struct sfp_bus - internal representation of a sfp bus + */ +@@ -21,6 +27,7 @@ struct sfp_bus { + const struct sfp_socket_ops *socket_ops; + struct device *sfp_dev; + struct sfp *sfp; ++ const struct sfp_quirk *sfp_quirk; + + const struct sfp_upstream_ops *upstream_ops; + void *upstream; +@@ -30,6 +37,71 @@ struct sfp_bus { + bool started; + }; + ++static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id, ++ unsigned long *modes) ++{ ++ phylink_set(modes, 2500baseX_Full); ++} ++ ++static const struct sfp_quirk sfp_quirks[] = { ++ { ++ // Alcatel Lucent G-010S-P can operate at 2500base-X, but ++ // incorrectly report 2500MBd NRZ in their EEPROM ++ .vendor = "ALCATELLUCENT", ++ .part = "G010SP", ++ .modes = sfp_quirk_2500basex, ++ }, { ++ // Alcatel Lucent G-010S-A can operate at 2500base-X, but ++ // report 3.2GBd NRZ in their EEPROM ++ .vendor = "ALCATELLUCENT", ++ .part = "3FE46541AA", ++ .modes = sfp_quirk_2500basex, ++ }, { ++ // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd ++ // NRZ in their EEPROM ++ .vendor = "HUAWEI", ++ .part = "MA5671A", ++ .modes = sfp_quirk_2500basex, ++ }, ++}; ++ ++static size_t sfp_strlen(const char *str, size_t maxlen) ++{ ++ size_t size, i; ++ ++ /* Trailing characters should be filled with space chars */ ++ for (i = 0, size = 0; i < maxlen; i++) ++ if (str[i] != ' ') ++ size = i + 1; ++ ++ return size; ++} ++ ++static bool sfp_match(const char *qs, const char *str, size_t len) ++{ ++ if (!qs) ++ return true; ++ if (strlen(qs) != len) ++ return false; ++ return !strncmp(qs, str, len); ++} ++ ++static const struct sfp_quirk *sfp_lookup_quirk(const struct sfp_eeprom_id *id) ++{ ++ const struct sfp_quirk *q; ++ unsigned int i; ++ size_t vs, ps; ++ ++ vs = sfp_strlen(id->base.vendor_name, ARRAY_SIZE(id->base.vendor_name)); ++ ps = sfp_strlen(id->base.vendor_pn, ARRAY_SIZE(id->base.vendor_pn)); ++ ++ for (i = 0, q = sfp_quirks; i < ARRAY_SIZE(sfp_quirks); i++, q++) ++ if (sfp_match(q->vendor, id->base.vendor_name, vs) && ++ sfp_match(q->part, id->base.vendor_pn, ps)) ++ return q; ++ ++ return NULL; ++} + /** + * sfp_parse_port() - Parse the EEPROM base ID, setting the port type + * @bus: a pointer to the &struct sfp_bus structure for the sfp module +@@ -233,6 +305,9 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id, + phylink_set(modes, 1000baseX_Full); + } + ++ if (bus->sfp_quirk) ++ bus->sfp_quirk->modes(id, modes); ++ + bitmap_or(support, support, modes, __ETHTOOL_LINK_MODE_MASK_NBITS); + + phylink_set(support, Autoneg); +@@ -553,6 +628,8 @@ int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id) + const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus); + int ret = 0; + ++ bus->sfp_quirk = sfp_lookup_quirk(id); ++ + if (ops && ops->module_insert) + ret = ops->module_insert(bus->upstream, id); + +@@ -566,6 +643,8 @@ void sfp_module_remove(struct sfp_bus *bus) + + if (ops && ops->module_remove) + ops->module_remove(bus->upstream); ++ ++ bus->sfp_quirk = NULL; + } + EXPORT_SYMBOL_GPL(sfp_module_remove); + +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 4a2c7355be63..e57d59b0a7ae 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1370,6 +1370,7 @@ static const struct usb_device_id products[] = { + {QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */ + {QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */ + {QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */ ++ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0195, 4)}, /* Quectel EG95 */ + {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */ + {QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)}, /* Fibocom NL678 series */ + {QMI_FIXED_INTF(0x0489, 0xe0b4, 0)}, /* Foxconn T77W968 LTE */ +diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c +index c34a6df712ad..26ddb4cc675a 100644 +--- a/drivers/of/of_mdio.c ++++ b/drivers/of/of_mdio.c +@@ -265,10 +265,15 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) + child, addr); + + if (of_mdiobus_child_is_phy(child)) { ++ /* -ENODEV is the return code that PHYLIB has ++ * standardized on to indicate that bus ++ * scanning should continue. ++ */ + rc = of_mdiobus_register_phy(mdio, child, addr); +- if (rc && rc != -ENODEV) ++ if (!rc) ++ break; ++ if (rc != -ENODEV) + goto unregister; +- break; + } + } + } +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 689f0280c038..08f7b1ed8c62 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -802,7 +802,9 @@ static inline bool platform_pci_need_resume(struct pci_dev *dev) + + static inline bool platform_pci_bridge_d3(struct pci_dev *dev) + { +- return pci_platform_pm ? pci_platform_pm->bridge_d3(dev) : false; ++ if (pci_platform_pm && pci_platform_pm->bridge_d3) ++ return pci_platform_pm->bridge_d3(dev); ++ return false; + } + + /** +diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c +index 856927382248..e5842e48a5e0 100644 +--- a/drivers/phy/allwinner/phy-sun4i-usb.c ++++ b/drivers/phy/allwinner/phy-sun4i-usb.c +@@ -545,13 +545,14 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work) + struct sun4i_usb_phy_data *data = + container_of(work, struct sun4i_usb_phy_data, detect.work); + struct phy *phy0 = data->phys[0].phy; +- struct sun4i_usb_phy *phy = phy_get_drvdata(phy0); ++ struct sun4i_usb_phy *phy; + bool force_session_end, id_notify = false, vbus_notify = false; + int id_det, vbus_det; + +- if (phy0 == NULL) ++ if (!phy0) + return; + ++ phy = phy_get_drvdata(phy0); + id_det = sun4i_usb_phy0_get_id_det(data); + vbus_det = sun4i_usb_phy0_get_vbus_det(data); + +diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig +index 90cf4691b8c3..9ea30fcb4428 100644 +--- a/drivers/scsi/Kconfig ++++ b/drivers/scsi/Kconfig +@@ -114,15 +114,6 @@ config BLK_DEV_SR + <file:Documentation/scsi/scsi.txt>. + The module will be called sr_mod. + +-config BLK_DEV_SR_VENDOR +- bool "Enable vendor-specific extensions (for SCSI CDROM)" +- depends on BLK_DEV_SR +- help +- This enables the usage of vendor specific SCSI commands. This is +- required to support multisession CDs with old NEC/TOSHIBA cdrom +- drives (and HP Writers). If you have such a drive and get the first +- session only, try saying Y here; everybody else says N. +- + config CHR_DEV_SG + tristate "SCSI generic support" + depends on SCSI +diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c +index 3d48024082ba..5bcef9769740 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c ++++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c +@@ -3787,10 +3787,8 @@ static irqreturn_t megasas_isr_fusion(int irq, void *devp) + if (instance->mask_interrupts) + return IRQ_NONE; + +-#if defined(ENABLE_IRQ_POLL) + if (irq_context->irq_poll_scheduled) + return IRQ_HANDLED; +-#endif + + if (!instance->msix_vectors) { + mfiStatus = instance->instancet->clear_intr(instance); +diff --git a/drivers/scsi/sr_vendor.c b/drivers/scsi/sr_vendor.c +index e3b0ce25162b..b9db2ec6d036 100644 +--- a/drivers/scsi/sr_vendor.c ++++ b/drivers/scsi/sr_vendor.c +@@ -66,9 +66,6 @@ + + void sr_vendor_init(Scsi_CD *cd) + { +-#ifndef CONFIG_BLK_DEV_SR_VENDOR +- cd->vendor = VENDOR_SCSI3; +-#else + const char *vendor = cd->device->vendor; + const char *model = cd->device->model; + +@@ -100,7 +97,6 @@ void sr_vendor_init(Scsi_CD *cd) + cd->vendor = VENDOR_TOSHIBA; + + } +-#endif + } + + +@@ -114,10 +110,8 @@ int sr_set_blocklength(Scsi_CD *cd, int blocklength) + struct ccs_modesel_head *modesel; + int rc, density = 0; + +-#ifdef CONFIG_BLK_DEV_SR_VENDOR + if (cd->vendor == VENDOR_TOSHIBA) + density = (blocklength > 2048) ? 0x81 : 0x83; +-#endif + + buffer = kmalloc(512, GFP_KERNEL | GFP_DMA); + if (!buffer) +@@ -205,7 +199,6 @@ int sr_cd_check(struct cdrom_device_info *cdi) + } + break; + +-#ifdef CONFIG_BLK_DEV_SR_VENDOR + case VENDOR_NEC:{ + unsigned long min, sec, frame; + cgc.cmd[0] = 0xde; +@@ -298,7 +291,6 @@ int sr_cd_check(struct cdrom_device_info *cdi) + sector = buffer[11] + (buffer[10] << 8) + + (buffer[9] << 16) + (buffer[8] << 24); + break; +-#endif /* CONFIG_BLK_DEV_SR_VENDOR */ + + default: + /* should not happen */ +diff --git a/drivers/slimbus/core.c b/drivers/slimbus/core.c +index 526e3215d8fe..63ee96eb58c6 100644 +--- a/drivers/slimbus/core.c ++++ b/drivers/slimbus/core.c +@@ -283,6 +283,7 @@ EXPORT_SYMBOL_GPL(slim_register_controller); + /* slim_remove_device: Remove the effect of slim_add_device() */ + static void slim_remove_device(struct slim_device *sbdev) + { ++ of_node_put(sbdev->dev.of_node); + device_unregister(&sbdev->dev); + } + +diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c +index e278fc11fe5c..0ba1f465db12 100644 +--- a/drivers/soc/qcom/rpmh-rsc.c ++++ b/drivers/soc/qcom/rpmh-rsc.c +@@ -148,7 +148,7 @@ int rpmh_rsc_invalidate(struct rsc_drv *drv) + static struct tcs_group *get_tcs_for_msg(struct rsc_drv *drv, + const struct tcs_request *msg) + { +- int type, ret; ++ int type; + struct tcs_group *tcs; + + switch (msg->state) { +@@ -169,19 +169,10 @@ static struct tcs_group *get_tcs_for_msg(struct rsc_drv *drv, + * If we are making an active request on a RSC that does not have a + * dedicated TCS for active state use, then re-purpose a wake TCS to + * send active votes. +- * NOTE: The driver must be aware that this RSC does not have a +- * dedicated AMC, and therefore would invalidate the sleep and wake +- * TCSes before making an active state request. + */ + tcs = get_tcs_of_type(drv, type); +- if (msg->state == RPMH_ACTIVE_ONLY_STATE && !tcs->num_tcs) { ++ if (msg->state == RPMH_ACTIVE_ONLY_STATE && !tcs->num_tcs) + tcs = get_tcs_of_type(drv, WAKE_TCS); +- if (tcs->num_tcs) { +- ret = rpmh_rsc_invalidate(drv); +- if (ret) +- return ERR_PTR(ret); +- } +- } + + return tcs; + } +@@ -201,6 +192,42 @@ static const struct tcs_request *get_req_from_tcs(struct rsc_drv *drv, + return NULL; + } + ++static void __tcs_set_trigger(struct rsc_drv *drv, int tcs_id, bool trigger) ++{ ++ u32 enable; ++ ++ /* ++ * HW req: Clear the DRV_CONTROL and enable TCS again ++ * While clearing ensure that the AMC mode trigger is cleared ++ * and then the mode enable is cleared. ++ */ ++ enable = read_tcs_reg(drv, RSC_DRV_CONTROL, tcs_id, 0); ++ enable &= ~TCS_AMC_MODE_TRIGGER; ++ write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); ++ enable &= ~TCS_AMC_MODE_ENABLE; ++ write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); ++ ++ if (trigger) { ++ /* Enable the AMC mode on the TCS and then trigger the TCS */ ++ enable = TCS_AMC_MODE_ENABLE; ++ write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); ++ enable |= TCS_AMC_MODE_TRIGGER; ++ write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); ++ } ++} ++ ++static void enable_tcs_irq(struct rsc_drv *drv, int tcs_id, bool enable) ++{ ++ u32 data; ++ ++ data = read_tcs_reg(drv, RSC_DRV_IRQ_ENABLE, 0, 0); ++ if (enable) ++ data |= BIT(tcs_id); ++ else ++ data &= ~BIT(tcs_id); ++ write_tcs_reg(drv, RSC_DRV_IRQ_ENABLE, 0, data); ++} ++ + /** + * tcs_tx_done: TX Done interrupt handler + */ +@@ -237,6 +264,14 @@ static irqreturn_t tcs_tx_done(int irq, void *p) + } + + trace_rpmh_tx_done(drv, i, req, err); ++ ++ /* ++ * If wake tcs was re-purposed for sending active ++ * votes, clear AMC trigger & enable modes and ++ * disable interrupt for this TCS ++ */ ++ if (!drv->tcs[ACTIVE_TCS].num_tcs) ++ __tcs_set_trigger(drv, i, false); + skip: + /* Reclaim the TCS */ + write_tcs_reg(drv, RSC_DRV_CMD_ENABLE, i, 0); +@@ -244,6 +279,13 @@ skip: + write_tcs_reg(drv, RSC_DRV_IRQ_CLEAR, 0, BIT(i)); + spin_lock(&drv->lock); + clear_bit(i, drv->tcs_in_use); ++ /* ++ * Disable interrupt for WAKE TCS to avoid being ++ * spammed with interrupts coming when the solver ++ * sends its wake votes. ++ */ ++ if (!drv->tcs[ACTIVE_TCS].num_tcs) ++ enable_tcs_irq(drv, i, false); + spin_unlock(&drv->lock); + if (req) + rpmh_tx_done(req, err); +@@ -285,28 +327,6 @@ static void __tcs_buffer_write(struct rsc_drv *drv, int tcs_id, int cmd_id, + write_tcs_reg(drv, RSC_DRV_CMD_ENABLE, tcs_id, cmd_enable); + } + +-static void __tcs_trigger(struct rsc_drv *drv, int tcs_id) +-{ +- u32 enable; +- +- /* +- * HW req: Clear the DRV_CONTROL and enable TCS again +- * While clearing ensure that the AMC mode trigger is cleared +- * and then the mode enable is cleared. +- */ +- enable = read_tcs_reg(drv, RSC_DRV_CONTROL, tcs_id, 0); +- enable &= ~TCS_AMC_MODE_TRIGGER; +- write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); +- enable &= ~TCS_AMC_MODE_ENABLE; +- write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); +- +- /* Enable the AMC mode on the TCS and then trigger the TCS */ +- enable = TCS_AMC_MODE_ENABLE; +- write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); +- enable |= TCS_AMC_MODE_TRIGGER; +- write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); +-} +- + static int check_for_req_inflight(struct rsc_drv *drv, struct tcs_group *tcs, + const struct tcs_request *msg) + { +@@ -377,10 +397,20 @@ static int tcs_write(struct rsc_drv *drv, const struct tcs_request *msg) + + tcs->req[tcs_id - tcs->offset] = msg; + set_bit(tcs_id, drv->tcs_in_use); ++ if (msg->state == RPMH_ACTIVE_ONLY_STATE && tcs->type != ACTIVE_TCS) { ++ /* ++ * Clear previously programmed WAKE commands in selected ++ * repurposed TCS to avoid triggering them. tcs->slots will be ++ * cleaned from rpmh_flush() by invoking rpmh_rsc_invalidate() ++ */ ++ write_tcs_reg_sync(drv, RSC_DRV_CMD_ENABLE, tcs_id, 0); ++ write_tcs_reg_sync(drv, RSC_DRV_CMD_WAIT_FOR_CMPL, tcs_id, 0); ++ enable_tcs_irq(drv, tcs_id, true); ++ } + spin_unlock(&drv->lock); + + __tcs_buffer_write(drv, tcs_id, 0, msg); +- __tcs_trigger(drv, tcs_id); ++ __tcs_set_trigger(drv, tcs_id, true); + + done_write: + spin_unlock_irqrestore(&tcs->lock, flags); +diff --git a/drivers/soc/qcom/rpmh.c b/drivers/soc/qcom/rpmh.c +index 035091fd44b8..ae2d1590a611 100644 +--- a/drivers/soc/qcom/rpmh.c ++++ b/drivers/soc/qcom/rpmh.c +@@ -119,6 +119,7 @@ static struct cache_req *cache_rpm_request(struct rpmh_ctrlr *ctrlr, + { + struct cache_req *req; + unsigned long flags; ++ u32 old_sleep_val, old_wake_val; + + spin_lock_irqsave(&ctrlr->cache_lock, flags); + req = __find_req(ctrlr, cmd->addr); +@@ -133,26 +134,27 @@ static struct cache_req *cache_rpm_request(struct rpmh_ctrlr *ctrlr, + + req->addr = cmd->addr; + req->sleep_val = req->wake_val = UINT_MAX; +- INIT_LIST_HEAD(&req->list); + list_add_tail(&req->list, &ctrlr->cache); + + existing: ++ old_sleep_val = req->sleep_val; ++ old_wake_val = req->wake_val; ++ + switch (state) { + case RPMH_ACTIVE_ONLY_STATE: +- if (req->sleep_val != UINT_MAX) +- req->wake_val = cmd->data; +- break; + case RPMH_WAKE_ONLY_STATE: + req->wake_val = cmd->data; + break; + case RPMH_SLEEP_STATE: + req->sleep_val = cmd->data; + break; +- default: +- break; + } + +- ctrlr->dirty = true; ++ ctrlr->dirty = (req->sleep_val != old_sleep_val || ++ req->wake_val != old_wake_val) && ++ req->sleep_val != UINT_MAX && ++ req->wake_val != UINT_MAX; ++ + unlock: + spin_unlock_irqrestore(&ctrlr->cache_lock, flags); + +@@ -287,6 +289,7 @@ static void cache_batch(struct rpmh_ctrlr *ctrlr, struct batch_cache_req *req) + + spin_lock_irqsave(&ctrlr->cache_lock, flags); + list_add_tail(&req->list, &ctrlr->batch_cache); ++ ctrlr->dirty = true; + spin_unlock_irqrestore(&ctrlr->cache_lock, flags); + } + +@@ -314,18 +317,6 @@ static int flush_batch(struct rpmh_ctrlr *ctrlr) + return ret; + } + +-static void invalidate_batch(struct rpmh_ctrlr *ctrlr) +-{ +- struct batch_cache_req *req, *tmp; +- unsigned long flags; +- +- spin_lock_irqsave(&ctrlr->cache_lock, flags); +- list_for_each_entry_safe(req, tmp, &ctrlr->batch_cache, list) +- kfree(req); +- INIT_LIST_HEAD(&ctrlr->batch_cache); +- spin_unlock_irqrestore(&ctrlr->cache_lock, flags); +-} +- + /** + * rpmh_write_batch: Write multiple sets of RPMH commands and wait for the + * batch to finish. +@@ -465,6 +456,13 @@ int rpmh_flush(const struct device *dev) + return 0; + } + ++ /* Invalidate the TCSes first to avoid stale data */ ++ do { ++ ret = rpmh_rsc_invalidate(ctrlr_to_drv(ctrlr)); ++ } while (ret == -EAGAIN); ++ if (ret) ++ return ret; ++ + /* First flush the cached batch requests */ + ret = flush_batch(ctrlr); + if (ret) +@@ -496,25 +494,25 @@ int rpmh_flush(const struct device *dev) + EXPORT_SYMBOL(rpmh_flush); + + /** +- * rpmh_invalidate: Invalidate all sleep and active sets +- * sets. ++ * rpmh_invalidate: Invalidate sleep and wake sets in batch_cache + * + * @dev: The device making the request + * +- * Invalidate the sleep and active values in the TCS blocks. ++ * Invalidate the sleep and wake values in batch_cache. + */ + int rpmh_invalidate(const struct device *dev) + { + struct rpmh_ctrlr *ctrlr = get_rpmh_ctrlr(dev); +- int ret; ++ struct batch_cache_req *req, *tmp; ++ unsigned long flags; + +- invalidate_batch(ctrlr); ++ spin_lock_irqsave(&ctrlr->cache_lock, flags); ++ list_for_each_entry_safe(req, tmp, &ctrlr->batch_cache, list) ++ kfree(req); ++ INIT_LIST_HEAD(&ctrlr->batch_cache); + ctrlr->dirty = true; ++ spin_unlock_irqrestore(&ctrlr->cache_lock, flags); + +- do { +- ret = rpmh_rsc_invalidate(ctrlr_to_drv(ctrlr)); +- } while (ret == -EAGAIN); +- +- return ret; ++ return 0; + } + EXPORT_SYMBOL(rpmh_invalidate); +diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c +index a39ea5061dc5..176696f8f38d 100644 +--- a/drivers/soc/qcom/socinfo.c ++++ b/drivers/soc/qcom/socinfo.c +@@ -428,6 +428,8 @@ static int qcom_socinfo_probe(struct platform_device *pdev) + qs->attr.family = "Snapdragon"; + qs->attr.machine = socinfo_machine(&pdev->dev, + le32_to_cpu(info->id)); ++ qs->attr.soc_id = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%u", ++ le32_to_cpu(info->id)); + qs->attr.revision = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%u.%u", + SOCINFO_MAJOR(le32_to_cpu(info->ver)), + SOCINFO_MINOR(le32_to_cpu(info->ver))); +diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c +index d1839707128a..243af8198d1c 100644 +--- a/drivers/soundwire/intel.c ++++ b/drivers/soundwire/intel.c +@@ -842,8 +842,9 @@ static int intel_create_dai(struct sdw_cdns *cdns, + + /* TODO: Read supported rates/formats from hardware */ + for (i = off; i < (off + num); i++) { +- dais[i].name = kasprintf(GFP_KERNEL, "SDW%d Pin%d", +- cdns->instance, i); ++ dais[i].name = devm_kasprintf(cdns->dev, GFP_KERNEL, ++ "SDW%d Pin%d", ++ cdns->instance, i); + if (!dais[i].name) + return -ENOMEM; + +diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c +index 3e0e27731922..c7560d7d1627 100644 +--- a/drivers/spi/spi-fsl-dspi.c ++++ b/drivers/spi/spi-fsl-dspi.c +@@ -1184,20 +1184,7 @@ static int dspi_remove(struct platform_device *pdev) + + static void dspi_shutdown(struct platform_device *pdev) + { +- struct spi_controller *ctlr = platform_get_drvdata(pdev); +- struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr); +- +- /* Disable RX and TX */ +- regmap_update_bits(dspi->regmap, SPI_MCR, +- SPI_MCR_DIS_TXF | SPI_MCR_DIS_RXF, +- SPI_MCR_DIS_TXF | SPI_MCR_DIS_RXF); +- +- /* Stop Running */ +- regmap_update_bits(dspi->regmap, SPI_MCR, SPI_MCR_HALT, SPI_MCR_HALT); +- +- dspi_release_dma(dspi); +- clk_disable_unprepare(dspi->clk); +- spi_unregister_controller(dspi->ctlr); ++ dspi_remove(pdev); + } + + static struct platform_driver fsl_dspi_driver = { +diff --git a/drivers/spi/spi-sprd-adi.c b/drivers/spi/spi-sprd-adi.c +index 9613cfe3c0a2..09f983524d51 100644 +--- a/drivers/spi/spi-sprd-adi.c ++++ b/drivers/spi/spi-sprd-adi.c +@@ -384,9 +384,9 @@ static int sprd_adi_restart_handler(struct notifier_block *this, + sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOCK, WDG_UNLOCK_KEY); + + /* Load the watchdog timeout value, 50ms is always enough. */ ++ sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOAD_HIGH, 0); + sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOAD_LOW, + WDG_LOAD_VAL & WDG_LOAD_MASK); +- sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOAD_HIGH, 0); + + /* Start the watchdog to reset system */ + sprd_adi_read(sadi, sadi->slave_pbase + REG_WDG_CTRL, &val); +diff --git a/drivers/spi/spi-sun6i.c b/drivers/spi/spi-sun6i.c +index ec7967be9e2f..956df79035d5 100644 +--- a/drivers/spi/spi-sun6i.c ++++ b/drivers/spi/spi-sun6i.c +@@ -198,7 +198,7 @@ static int sun6i_spi_transfer_one(struct spi_master *master, + struct spi_transfer *tfr) + { + struct sun6i_spi *sspi = spi_master_get_devdata(master); +- unsigned int mclk_rate, div, timeout; ++ unsigned int mclk_rate, div, div_cdr1, div_cdr2, timeout; + unsigned int start, end, tx_time; + unsigned int trig_level; + unsigned int tx_len = 0; +@@ -287,14 +287,12 @@ static int sun6i_spi_transfer_one(struct spi_master *master, + * First try CDR2, and if we can't reach the expected + * frequency, fall back to CDR1. + */ +- div = mclk_rate / (2 * tfr->speed_hz); +- if (div <= (SUN6I_CLK_CTL_CDR2_MASK + 1)) { +- if (div > 0) +- div--; +- +- reg = SUN6I_CLK_CTL_CDR2(div) | SUN6I_CLK_CTL_DRS; ++ div_cdr1 = DIV_ROUND_UP(mclk_rate, tfr->speed_hz); ++ div_cdr2 = DIV_ROUND_UP(div_cdr1, 2); ++ if (div_cdr2 <= (SUN6I_CLK_CTL_CDR2_MASK + 1)) { ++ reg = SUN6I_CLK_CTL_CDR2(div_cdr2 - 1) | SUN6I_CLK_CTL_DRS; + } else { +- div = ilog2(mclk_rate) - ilog2(tfr->speed_hz); ++ div = min(SUN6I_CLK_CTL_CDR1_MASK, order_base_2(div_cdr1)); + reg = SUN6I_CLK_CTL_CDR1(div); + } + +diff --git a/drivers/staging/comedi/drivers/addi_apci_1500.c b/drivers/staging/comedi/drivers/addi_apci_1500.c +index 45ad4ba92f94..689acd69a1b9 100644 +--- a/drivers/staging/comedi/drivers/addi_apci_1500.c ++++ b/drivers/staging/comedi/drivers/addi_apci_1500.c +@@ -456,9 +456,9 @@ static int apci1500_di_cfg_trig(struct comedi_device *dev, + unsigned int lo_mask = data[5] << shift; + unsigned int chan_mask = hi_mask | lo_mask; + unsigned int old_mask = (1 << shift) - 1; +- unsigned int pm = devpriv->pm[trig] & old_mask; +- unsigned int pt = devpriv->pt[trig] & old_mask; +- unsigned int pp = devpriv->pp[trig] & old_mask; ++ unsigned int pm; ++ unsigned int pt; ++ unsigned int pp; + + if (trig > 1) { + dev_dbg(dev->class_dev, +@@ -471,6 +471,10 @@ static int apci1500_di_cfg_trig(struct comedi_device *dev, + return -EINVAL; + } + ++ pm = devpriv->pm[trig] & old_mask; ++ pt = devpriv->pt[trig] & old_mask; ++ pp = devpriv->pp[trig] & old_mask; ++ + switch (data[2]) { + case COMEDI_DIGITAL_TRIG_DISABLE: + /* clear trigger configuration */ +diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c +index 6b9865c786ba..c37886a26712 100644 +--- a/drivers/thermal/cpu_cooling.c ++++ b/drivers/thermal/cpu_cooling.c +@@ -210,11 +210,11 @@ static u32 cpu_power_to_freq(struct cpufreq_cooling_device *cpufreq_cdev, + int i; + struct freq_table *freq_table = cpufreq_cdev->freq_table; + +- for (i = 1; i <= cpufreq_cdev->max_level; i++) +- if (power > freq_table[i].power) ++ for (i = 0; i < cpufreq_cdev->max_level; i++) ++ if (power >= freq_table[i].power) + break; + +- return freq_table[i - 1].frequency; ++ return freq_table[i].frequency; + } + + /** +diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c +index bb6754a5342c..85511c1160b7 100644 +--- a/drivers/thermal/imx_thermal.c ++++ b/drivers/thermal/imx_thermal.c +@@ -656,7 +656,7 @@ MODULE_DEVICE_TABLE(of, of_imx_thermal_match); + static int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data) + { + struct device_node *np; +- int ret; ++ int ret = 0; + + data->policy = cpufreq_cpu_get(0); + if (!data->policy) { +@@ -671,11 +671,12 @@ static int imx_thermal_register_legacy_cooling(struct imx_thermal_data *data) + if (IS_ERR(data->cdev)) { + ret = PTR_ERR(data->cdev); + cpufreq_cpu_put(data->policy); +- return ret; + } + } + +- return 0; ++ of_node_put(np); ++ ++ return ret; + } + + static void imx_thermal_unregister_legacy_cooling(struct imx_thermal_data *data) +diff --git a/drivers/thermal/intel/int340x_thermal/int3403_thermal.c b/drivers/thermal/intel/int340x_thermal/int3403_thermal.c +index a7bbd8584ae2..e7b6f6f256a9 100644 +--- a/drivers/thermal/intel/int340x_thermal/int3403_thermal.c ++++ b/drivers/thermal/intel/int340x_thermal/int3403_thermal.c +@@ -74,7 +74,7 @@ static void int3403_notify(acpi_handle handle, + THERMAL_TRIP_CHANGED); + break; + default: +- dev_err(&priv->pdev->dev, "Unsupported event [0x%x]\n", event); ++ dev_dbg(&priv->pdev->dev, "Unsupported event [0x%x]\n", event); + break; + } + } +diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c +index d6fabd0a7da6..2783973b101c 100644 +--- a/drivers/thermal/mtk_thermal.c ++++ b/drivers/thermal/mtk_thermal.c +@@ -594,8 +594,7 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) + u32 raw; + + for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { +- raw = readl(mt->thermal_base + +- conf->msr[conf->bank_data[bank->id].sensors[i]]); ++ raw = readl(mt->thermal_base + conf->msr[i]); + + temp = raw_to_mcelsius(mt, + conf->bank_data[bank->id].sensors[i], +@@ -736,8 +735,7 @@ static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, + + for (i = 0; i < conf->bank_data[num].num_sensors; i++) + writel(conf->sensor_mux_values[conf->bank_data[num].sensors[i]], +- mt->thermal_base + +- conf->adcpnp[conf->bank_data[num].sensors[i]]); ++ mt->thermal_base + conf->adcpnp[i]); + + writel((1 << conf->bank_data[num].num_sensors) - 1, + controller_base + TEMP_MONCTL0); +diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c +index e34525970682..5d483e996514 100644 +--- a/drivers/tty/serial/mxs-auart.c ++++ b/drivers/tty/serial/mxs-auart.c +@@ -1701,21 +1701,21 @@ static int mxs_auart_probe(struct platform_device *pdev) + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + ret = irq; +- goto out_disable_clks; ++ goto out_iounmap; + } + + s->port.irq = irq; + ret = devm_request_irq(&pdev->dev, irq, mxs_auart_irq_handle, 0, + dev_name(&pdev->dev), s); + if (ret) +- goto out_disable_clks; ++ goto out_iounmap; + + platform_set_drvdata(pdev, s); + + ret = mxs_auart_init_gpios(s, &pdev->dev); + if (ret) { + dev_err(&pdev->dev, "Failed to initialize GPIOs.\n"); +- goto out_disable_clks; ++ goto out_iounmap; + } + + /* +@@ -1723,7 +1723,7 @@ static int mxs_auart_probe(struct platform_device *pdev) + */ + ret = mxs_auart_request_gpio_irq(s); + if (ret) +- goto out_disable_clks; ++ goto out_iounmap; + + auart_port[s->port.line] = s; + +@@ -1749,6 +1749,9 @@ out_free_qpio_irq: + mxs_auart_free_gpio_irq(s); + auart_port[pdev->id] = NULL; + ++out_iounmap: ++ iounmap(s->port.membase); ++ + out_disable_clks: + if (is_asm9260_auart(s)) { + clk_disable_unprepare(s->clk); +@@ -1764,6 +1767,7 @@ static int mxs_auart_remove(struct platform_device *pdev) + uart_remove_one_port(&auart_driver, &s->port); + auart_port[pdev->id] = NULL; + mxs_auart_free_gpio_irq(s); ++ iounmap(s->port.membase); + if (is_asm9260_auart(s)) { + clk_disable_unprepare(s->clk); + clk_disable_unprepare(s->clk_ahb); +diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c +index 3cb9aacfe0b2..fe098cf14e6a 100644 +--- a/drivers/tty/serial/xilinx_uartps.c ++++ b/drivers/tty/serial/xilinx_uartps.c +@@ -1445,7 +1445,6 @@ static int cdns_uart_probe(struct platform_device *pdev) + cdns_uart_uart_driver.nr = CDNS_UART_NR_PORTS; + #ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE + cdns_uart_uart_driver.cons = &cdns_uart_console; +- cdns_uart_console.index = id; + #endif + + rc = uart_register_driver(&cdns_uart_uart_driver); +diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c +index 1303b165055b..538adf9c47bb 100644 +--- a/drivers/uio/uio_pdrv_genirq.c ++++ b/drivers/uio/uio_pdrv_genirq.c +@@ -152,9 +152,9 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev) + priv->pdev = pdev; + + if (!uioinfo->irq) { +- ret = platform_get_irq(pdev, 0); ++ ret = platform_get_irq_optional(pdev, 0); + uioinfo->irq = ret; +- if (ret == -ENXIO && pdev->dev.of_node) ++ if (ret == -ENXIO) + uioinfo->irq = UIO_IRQ_NONE; + else if (ret < 0) { + dev_err(&pdev->dev, "failed to get IRQ\n"); +diff --git a/drivers/usb/c67x00/c67x00-sched.c b/drivers/usb/c67x00/c67x00-sched.c +index 633c52de3bb3..9865750bc31e 100644 +--- a/drivers/usb/c67x00/c67x00-sched.c ++++ b/drivers/usb/c67x00/c67x00-sched.c +@@ -486,7 +486,7 @@ c67x00_giveback_urb(struct c67x00_hcd *c67x00, struct urb *urb, int status) + c67x00_release_urb(c67x00, urb); + usb_hcd_unlink_urb_from_ep(c67x00_hcd_to_hcd(c67x00), urb); + spin_unlock(&c67x00->lock); +- usb_hcd_giveback_urb(c67x00_hcd_to_hcd(c67x00), urb, urbp->status); ++ usb_hcd_giveback_urb(c67x00_hcd_to_hcd(c67x00), urb, status); + spin_lock(&c67x00->lock); + } + +diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c +index 98ee575ee500..b7da2a273c45 100644 +--- a/drivers/usb/chipidea/core.c ++++ b/drivers/usb/chipidea/core.c +@@ -1261,6 +1261,29 @@ static void ci_controller_suspend(struct ci_hdrc *ci) + enable_irq(ci->irq); + } + ++/* ++ * Handle the wakeup interrupt triggered by extcon connector ++ * We need to call ci_irq again for extcon since the first ++ * interrupt (wakeup int) only let the controller be out of ++ * low power mode, but not handle any interrupts. ++ */ ++static void ci_extcon_wakeup_int(struct ci_hdrc *ci) ++{ ++ struct ci_hdrc_cable *cable_id, *cable_vbus; ++ u32 otgsc = hw_read_otgsc(ci, ~0); ++ ++ cable_id = &ci->platdata->id_extcon; ++ cable_vbus = &ci->platdata->vbus_extcon; ++ ++ if (!IS_ERR(cable_id->edev) && ci->is_otg && ++ (otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS)) ++ ci_irq(ci->irq, ci); ++ ++ if (!IS_ERR(cable_vbus->edev) && ci->is_otg && ++ (otgsc & OTGSC_BSVIE) && (otgsc & OTGSC_BSVIS)) ++ ci_irq(ci->irq, ci); ++} ++ + static int ci_controller_resume(struct device *dev) + { + struct ci_hdrc *ci = dev_get_drvdata(dev); +@@ -1293,6 +1316,7 @@ static int ci_controller_resume(struct device *dev) + enable_irq(ci->irq); + if (ci_otg_is_fsm_mode(ci)) + ci_otg_fsm_wakeup_by_srp(ci); ++ ci_extcon_wakeup_int(ci); + } + + return 0; +diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c +index 15e55808cf4e..4e14c4f7fed7 100644 +--- a/drivers/usb/dwc2/platform.c ++++ b/drivers/usb/dwc2/platform.c +@@ -337,7 +337,8 @@ static void dwc2_driver_shutdown(struct platform_device *dev) + { + struct dwc2_hsotg *hsotg = platform_get_drvdata(dev); + +- disable_irq(hsotg->irq); ++ dwc2_disable_global_interrupts(hsotg); ++ synchronize_irq(hsotg->irq); + } + + /** +diff --git a/drivers/usb/gadget/function/f_uac1_legacy.c b/drivers/usb/gadget/function/f_uac1_legacy.c +index 6677ae932de0..06ee6e901808 100644 +--- a/drivers/usb/gadget/function/f_uac1_legacy.c ++++ b/drivers/usb/gadget/function/f_uac1_legacy.c +@@ -336,7 +336,9 @@ static int f_audio_out_ep_complete(struct usb_ep *ep, struct usb_request *req) + + /* Copy buffer is full, add it to the play_queue */ + if (audio_buf_size - copy_buf->actual < req->actual) { ++ spin_lock_irq(&audio->lock); + list_add_tail(©_buf->list, &audio->play_queue); ++ spin_unlock_irq(&audio->lock); + schedule_work(&audio->playback_work); + copy_buf = f_audio_buffer_alloc(audio_buf_size); + if (IS_ERR(copy_buf)) +diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c +index 58e5b015d40e..bebe814f55e6 100644 +--- a/drivers/usb/gadget/udc/atmel_usba_udc.c ++++ b/drivers/usb/gadget/udc/atmel_usba_udc.c +@@ -870,7 +870,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) + u32 status; + + DBG(DBG_GADGET | DBG_QUEUE, "ep_dequeue: %s, req %p\n", +- ep->ep.name, req); ++ ep->ep.name, _req); + + spin_lock_irqsave(&udc->lock, flags); + +diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c +index e9a49007cce4..e4fc3f66d43b 100644 +--- a/drivers/usb/host/ehci-platform.c ++++ b/drivers/usb/host/ehci-platform.c +@@ -455,10 +455,6 @@ static int ehci_platform_resume(struct device *dev) + + ehci_resume(hcd, priv->reset_on_resume); + +- pm_runtime_disable(dev); +- pm_runtime_set_active(dev); +- pm_runtime_enable(dev); +- + if (priv->quirk_poll) + quirk_poll_init(priv); + +diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c +index 4a8456f12a73..7addfc2cbadc 100644 +--- a/drivers/usb/host/ohci-platform.c ++++ b/drivers/usb/host/ohci-platform.c +@@ -299,11 +299,6 @@ static int ohci_platform_resume(struct device *dev) + } + + ohci_resume(hcd, false); +- +- pm_runtime_disable(dev); +- pm_runtime_set_active(dev); +- pm_runtime_enable(dev); +- + return 0; + } + #endif /* CONFIG_PM_SLEEP */ +diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c +index 60d06e9b600f..52c625c02341 100644 +--- a/drivers/usb/host/xhci-plat.c ++++ b/drivers/usb/host/xhci-plat.c +@@ -410,15 +410,7 @@ static int __maybe_unused xhci_plat_resume(struct device *dev) + if (ret) + return ret; + +- ret = xhci_resume(xhci, 0); +- if (ret) +- return ret; +- +- pm_runtime_disable(dev); +- pm_runtime_set_active(dev); +- pm_runtime_enable(dev); +- +- return 0; ++ return xhci_resume(xhci, 0); + } + + static int __maybe_unused xhci_plat_runtime_suspend(struct device *dev) +diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c +index dcdd541b3291..390bc4b25045 100644 +--- a/drivers/usb/serial/ch341.c ++++ b/drivers/usb/serial/ch341.c +@@ -81,6 +81,7 @@ + + static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x4348, 0x5523) }, ++ { USB_DEVICE(0x1a86, 0x7522) }, + { USB_DEVICE(0x1a86, 0x7523) }, + { USB_DEVICE(0x1a86, 0x5523) }, + { }, +diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c +index 216edd5826ca..ecda82198798 100644 +--- a/drivers/usb/serial/cypress_m8.c ++++ b/drivers/usb/serial/cypress_m8.c +@@ -59,6 +59,7 @@ static const struct usb_device_id id_table_earthmate[] = { + + static const struct usb_device_id id_table_cyphidcomrs232[] = { + { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, ++ { USB_DEVICE(VENDOR_ID_SAI, PRODUCT_ID_CYPHIDCOM) }, + { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, + { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, + { } /* Terminating entry */ +@@ -73,6 +74,7 @@ static const struct usb_device_id id_table_combined[] = { + { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, + { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, + { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, ++ { USB_DEVICE(VENDOR_ID_SAI, PRODUCT_ID_CYPHIDCOM) }, + { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, + { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, + { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, +diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h +index 35e223751c0e..16b7410ad057 100644 +--- a/drivers/usb/serial/cypress_m8.h ++++ b/drivers/usb/serial/cypress_m8.h +@@ -25,6 +25,9 @@ + #define VENDOR_ID_CYPRESS 0x04b4 + #define PRODUCT_ID_CYPHIDCOM 0x5500 + ++/* Simply Automated HID->COM UPB PIM (using Cypress PID 0x5500) */ ++#define VENDOR_ID_SAI 0x17dd ++ + /* FRWD Dongle - a GPS sports watch */ + #define VENDOR_ID_FRWD 0x6737 + #define PRODUCT_ID_CYPHIDCOM_FRWD 0x0001 +diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c +index d5bff69b1769..b8dfeb4fb2ed 100644 +--- a/drivers/usb/serial/iuu_phoenix.c ++++ b/drivers/usb/serial/iuu_phoenix.c +@@ -697,14 +697,16 @@ static int iuu_uart_write(struct tty_struct *tty, struct usb_serial_port *port, + struct iuu_private *priv = usb_get_serial_port_data(port); + unsigned long flags; + +- if (count > 256) +- return -ENOMEM; +- + spin_lock_irqsave(&priv->lock, flags); + ++ count = min(count, 256 - priv->writelen); ++ if (count == 0) ++ goto out; ++ + /* fill the buffer */ + memcpy(priv->writebuf + priv->writelen, buf, count); + priv->writelen += count; ++out: + spin_unlock_irqrestore(&priv->lock, flags); + + return count; +diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c +index 254a8bbeea67..9b7cee98ea60 100644 +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -245,6 +245,7 @@ static void option_instat_callback(struct urb *urb); + /* These Quectel products use Quectel's vendor ID */ + #define QUECTEL_PRODUCT_EC21 0x0121 + #define QUECTEL_PRODUCT_EC25 0x0125 ++#define QUECTEL_PRODUCT_EG95 0x0195 + #define QUECTEL_PRODUCT_BG96 0x0296 + #define QUECTEL_PRODUCT_EP06 0x0306 + #define QUECTEL_PRODUCT_EM12 0x0512 +@@ -1097,6 +1098,8 @@ static const struct usb_device_id option_ids[] = { + .driver_info = RSVD(4) }, + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25), + .driver_info = RSVD(4) }, ++ { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95), ++ .driver_info = RSVD(4) }, + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), + .driver_info = RSVD(4) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff), +@@ -2028,6 +2031,9 @@ static const struct usb_device_id option_ids[] = { + .driver_info = RSVD(4) | RSVD(5) }, + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff), /* Fibocom NL678 series */ + .driver_info = RSVD(6) }, ++ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */ ++ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */ ++ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) }, /* GosunCn GM500 ECM/NCM */ + { } /* Terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, option_ids); +diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c +index 2307b0329aec..95bfdb8ac8a2 100644 +--- a/drivers/virt/vboxguest/vboxguest_core.c ++++ b/drivers/virt/vboxguest/vboxguest_core.c +@@ -1443,7 +1443,7 @@ static int vbg_ioctl_change_guest_capabilities(struct vbg_dev *gdev, + or_mask = caps->u.in.or_mask; + not_mask = caps->u.in.not_mask; + +- if ((or_mask | not_mask) & ~VMMDEV_EVENT_VALID_EVENT_MASK) ++ if ((or_mask | not_mask) & ~VMMDEV_GUEST_CAPABILITIES_MASK) + return -EINVAL; + + ret = vbg_set_session_capabilities(gdev, session, or_mask, not_mask, +@@ -1519,7 +1519,8 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data) + + /* For VMMDEV_REQUEST hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT */ + if (req_no_size == VBG_IOCTL_VMMDEV_REQUEST(0) || +- req == VBG_IOCTL_VMMDEV_REQUEST_BIG) ++ req == VBG_IOCTL_VMMDEV_REQUEST_BIG || ++ req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT) + return vbg_ioctl_vmmrequest(gdev, session, data); + + if (hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT) +@@ -1557,6 +1558,7 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data) + case VBG_IOCTL_HGCM_CALL(0): + return vbg_ioctl_hgcm_call(gdev, session, f32bit, data); + case VBG_IOCTL_LOG(0): ++ case VBG_IOCTL_LOG_ALT(0): + return vbg_ioctl_log(data); + } + +diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h +index 4188c12b839f..77c3a9c8255d 100644 +--- a/drivers/virt/vboxguest/vboxguest_core.h ++++ b/drivers/virt/vboxguest/vboxguest_core.h +@@ -15,6 +15,21 @@ + #include <linux/vboxguest.h> + #include "vmmdev.h" + ++/* ++ * The mainline kernel version (this version) of the vboxguest module ++ * contained a bug where it defined VBGL_IOCTL_VMMDEV_REQUEST_BIG and ++ * VBGL_IOCTL_LOG using _IOC(_IOC_READ | _IOC_WRITE, 'V', ...) instead ++ * of _IO(V, ...) as the out of tree VirtualBox upstream version does. ++ * ++ * These _ALT definitions keep compatibility with the wrong defines the ++ * mainline kernel version used for a while. ++ * Note the VirtualBox userspace bits have always been built against ++ * VirtualBox upstream's headers, so this is likely not necessary. But ++ * we must never break our ABI so we keep these around to be 100% sure. ++ */ ++#define VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT _IOC(_IOC_READ | _IOC_WRITE, 'V', 3, 0) ++#define VBG_IOCTL_LOG_ALT(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 9, s) ++ + struct vbg_session; + + /** VBox guest memory balloon. */ +diff --git a/drivers/virt/vboxguest/vboxguest_linux.c b/drivers/virt/vboxguest/vboxguest_linux.c +index 6e8c0f1c1056..32c2c52f7e84 100644 +--- a/drivers/virt/vboxguest/vboxguest_linux.c ++++ b/drivers/virt/vboxguest/vboxguest_linux.c +@@ -131,7 +131,8 @@ static long vbg_misc_device_ioctl(struct file *filp, unsigned int req, + * the need for a bounce-buffer and another copy later on. + */ + is_vmmdev_req = (req & ~IOCSIZE_MASK) == VBG_IOCTL_VMMDEV_REQUEST(0) || +- req == VBG_IOCTL_VMMDEV_REQUEST_BIG; ++ req == VBG_IOCTL_VMMDEV_REQUEST_BIG || ++ req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT; + + if (is_vmmdev_req) + buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT, +diff --git a/drivers/virt/vboxguest/vmmdev.h b/drivers/virt/vboxguest/vmmdev.h +index 6337b8d75d96..21f408120e3f 100644 +--- a/drivers/virt/vboxguest/vmmdev.h ++++ b/drivers/virt/vboxguest/vmmdev.h +@@ -206,6 +206,8 @@ VMMDEV_ASSERT_SIZE(vmmdev_mask, 24 + 8); + * not. + */ + #define VMMDEV_GUEST_SUPPORTS_GRAPHICS BIT(2) ++/* The mask of valid capabilities, for sanity checking. */ ++#define VMMDEV_GUEST_CAPABILITIES_MASK 0x00000007U + + /** struct vmmdev_hypervisorinfo - Hypervisor info structure. */ + struct vmmdev_hypervisorinfo { +diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c +index fe1552cc8a0a..eafc49de4d7f 100644 +--- a/fs/cifs/transport.c ++++ b/fs/cifs/transport.c +@@ -528,7 +528,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits, + const int timeout, const int flags, + unsigned int *instance) + { +- int rc; ++ long rc; + int *credits; + int optype; + long int t; +diff --git a/fs/fuse/file.c b/fs/fuse/file.c +index 66214707a945..f8d8a8e34b80 100644 +--- a/fs/fuse/file.c ++++ b/fs/fuse/file.c +@@ -18,6 +18,7 @@ + #include <linux/swap.h> + #include <linux/falloc.h> + #include <linux/uio.h> ++#include <linux/fs.h> + + static struct page **fuse_pages_alloc(unsigned int npages, gfp_t flags, + struct fuse_page_desc **desc) +@@ -2148,10 +2149,8 @@ static int fuse_writepages(struct address_space *mapping, + + err = write_cache_pages(mapping, wbc, fuse_writepages_fill, &data); + if (data.wpa) { +- /* Ignore errors if we can write at least one page */ + WARN_ON(!data.wpa->ia.ap.num_pages); + fuse_writepages_send(&data); +- err = 0; + } + if (data.ff) + fuse_file_put(data.ff, false, false); +@@ -2760,7 +2759,16 @@ long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg, + struct iovec *iov = iov_page; + + iov->iov_base = (void __user *)arg; +- iov->iov_len = _IOC_SIZE(cmd); ++ ++ switch (cmd) { ++ case FS_IOC_GETFLAGS: ++ case FS_IOC_SETFLAGS: ++ iov->iov_len = sizeof(int); ++ break; ++ default: ++ iov->iov_len = _IOC_SIZE(cmd); ++ break; ++ } + + if (_IOC_DIR(cmd) & _IOC_WRITE) { + in_iov = iov; +diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c +index 16aec32f7f3d..5dca643a257c 100644 +--- a/fs/fuse/inode.c ++++ b/fs/fuse/inode.c +@@ -121,10 +121,12 @@ static void fuse_evict_inode(struct inode *inode) + } + } + +-static int fuse_remount_fs(struct super_block *sb, int *flags, char *data) ++static int fuse_reconfigure(struct fs_context *fc) + { ++ struct super_block *sb = fc->root->d_sb; ++ + sync_filesystem(sb); +- if (*flags & SB_MANDLOCK) ++ if (fc->sb_flags & SB_MANDLOCK) + return -EINVAL; + + return 0; +@@ -473,6 +475,13 @@ static int fuse_parse_param(struct fs_context *fc, struct fs_parameter *param) + struct fuse_fs_context *ctx = fc->fs_private; + int opt; + ++ /* ++ * Ignore options coming from mount(MS_REMOUNT) for backward ++ * compatibility. ++ */ ++ if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) ++ return 0; ++ + opt = fs_parse(fc, &fuse_fs_parameters, param, &result); + if (opt < 0) + return opt; +@@ -815,7 +824,6 @@ static const struct super_operations fuse_super_operations = { + .evict_inode = fuse_evict_inode, + .write_inode = fuse_write_inode, + .drop_inode = generic_delete_inode, +- .remount_fs = fuse_remount_fs, + .put_super = fuse_put_super, + .umount_begin = fuse_umount_begin, + .statfs = fuse_statfs, +@@ -1289,6 +1297,7 @@ static int fuse_get_tree(struct fs_context *fc) + static const struct fs_context_operations fuse_context_ops = { + .free = fuse_free_fc, + .parse_param = fuse_parse_param, ++ .reconfigure = fuse_reconfigure, + .get_tree = fuse_get_tree, + }; + +diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c +index c26c864590cc..e0c55765b06d 100644 +--- a/fs/gfs2/ops_fstype.c ++++ b/fs/gfs2/ops_fstype.c +@@ -1168,7 +1168,17 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc) + goto fail_per_node; + } + +- if (!sb_rdonly(sb)) { ++ if (sb_rdonly(sb)) { ++ struct gfs2_holder freeze_gh; ++ ++ error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, ++ GL_EXACT, &freeze_gh); ++ if (error) { ++ fs_err(sdp, "can't make FS RO: %d\n", error); ++ goto fail_per_node; ++ } ++ gfs2_glock_dq_uninit(&freeze_gh); ++ } else { + error = gfs2_make_fs_rw(sdp); + if (error) { + fs_err(sdp, "can't make FS RW: %d\n", error); +diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c +index 33c17c69aeaa..1a1bd2fe6e98 100644 +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -774,6 +774,14 @@ static void nfs4_slot_sequence_acked(struct nfs4_slot *slot, + slot->seq_nr_last_acked = seqnr; + } + ++static void nfs4_probe_sequence(struct nfs_client *client, const struct cred *cred, ++ struct nfs4_slot *slot) ++{ ++ struct rpc_task *task = _nfs41_proc_sequence(client, cred, slot, true); ++ if (!IS_ERR(task)) ++ rpc_put_task_async(task); ++} ++ + static int nfs41_sequence_process(struct rpc_task *task, + struct nfs4_sequence_res *res) + { +@@ -790,6 +798,7 @@ static int nfs41_sequence_process(struct rpc_task *task, + goto out; + + session = slot->table->session; ++ clp = session->clp; + + trace_nfs4_sequence_done(session, res); + +@@ -804,7 +813,6 @@ static int nfs41_sequence_process(struct rpc_task *task, + nfs4_slot_sequence_acked(slot, slot->seq_nr); + /* Update the slot's sequence and clientid lease timer */ + slot->seq_done = 1; +- clp = session->clp; + do_renew_lease(clp, res->sr_timestamp); + /* Check sequence flags */ + nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags, +@@ -852,10 +860,18 @@ static int nfs41_sequence_process(struct rpc_task *task, + /* + * Were one or more calls using this slot interrupted? + * If the server never received the request, then our +- * transmitted slot sequence number may be too high. ++ * transmitted slot sequence number may be too high. However, ++ * if the server did receive the request then it might ++ * accidentally give us a reply with a mismatched operation. ++ * We can sort this out by sending a lone sequence operation ++ * to the server on the same slot. + */ + if ((s32)(slot->seq_nr - slot->seq_nr_last_acked) > 1) { + slot->seq_nr--; ++ if (task->tk_msg.rpc_proc != &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE]) { ++ nfs4_probe_sequence(clp, task->tk_msg.rpc_cred, slot); ++ res->sr_slot = NULL; ++ } + goto retry_nowait; + } + /* +diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c +index 73c9775215b3..11dd8177770d 100644 +--- a/fs/overlayfs/export.c ++++ b/fs/overlayfs/export.c +@@ -482,7 +482,7 @@ static struct dentry *ovl_lookup_real_inode(struct super_block *sb, + if (IS_ERR_OR_NULL(this)) + return this; + +- if (WARN_ON(ovl_dentry_real_at(this, layer->idx) != real)) { ++ if (ovl_dentry_real_at(this, layer->idx) != real) { + dput(this); + this = ERR_PTR(-EIO); + } +diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c +index 15e4fa288475..7a08a576f7b2 100644 +--- a/fs/overlayfs/file.c ++++ b/fs/overlayfs/file.c +@@ -21,13 +21,16 @@ static char ovl_whatisit(struct inode *inode, struct inode *realinode) + return 'm'; + } + ++/* No atime modificaton nor notify on underlying */ ++#define OVL_OPEN_FLAGS (O_NOATIME | FMODE_NONOTIFY) ++ + static struct file *ovl_open_realfile(const struct file *file, + struct inode *realinode) + { + struct inode *inode = file_inode(file); + struct file *realfile; + const struct cred *old_cred; +- int flags = file->f_flags | O_NOATIME | FMODE_NONOTIFY; ++ int flags = file->f_flags | OVL_OPEN_FLAGS; + + old_cred = ovl_override_creds(inode->i_sb); + realfile = open_with_fake_path(&file->f_path, flags, realinode, +@@ -48,8 +51,7 @@ static int ovl_change_flags(struct file *file, unsigned int flags) + struct inode *inode = file_inode(file); + int err; + +- /* No atime modificaton on underlying */ +- flags |= O_NOATIME | FMODE_NONOTIFY; ++ flags |= OVL_OPEN_FLAGS; + + /* If some flag changed that cannot be changed then something's amiss */ + if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK)) +@@ -102,7 +104,7 @@ static int ovl_real_fdget_meta(const struct file *file, struct fd *real, + } + + /* Did the flags change since open? */ +- if (unlikely((file->f_flags ^ real->file->f_flags) & ~O_NOATIME)) ++ if (unlikely((file->f_flags ^ real->file->f_flags) & ~OVL_OPEN_FLAGS)) + return ovl_change_flags(real->file, file->f_flags); + + return 0; +diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c +index 7621ff176d15..d6b724beb304 100644 +--- a/fs/overlayfs/super.c ++++ b/fs/overlayfs/super.c +@@ -1258,6 +1258,18 @@ static bool ovl_lower_uuid_ok(struct ovl_fs *ofs, const uuid_t *uuid) + if (!ofs->config.nfs_export && !ofs->upper_mnt) + return true; + ++ /* ++ * We allow using single lower with null uuid for index and nfs_export ++ * for example to support those features with single lower squashfs. ++ * To avoid regressions in setups of overlay with re-formatted lower ++ * squashfs, do not allow decoding origin with lower null uuid unless ++ * user opted-in to one of the new features that require following the ++ * lower inode of non-dir upper. ++ */ ++ if (!ofs->config.index && !ofs->config.metacopy && !ofs->config.xino && ++ uuid_is_null(uuid)) ++ return false; ++ + for (i = 0; i < ofs->numlowerfs; i++) { + /* + * We use uuid to associate an overlay lower file handle with a +@@ -1344,14 +1356,23 @@ static int ovl_get_lower_layers(struct super_block *sb, struct ovl_fs *ofs, + if (err < 0) + goto out; + ++ /* ++ * Check if lower root conflicts with this overlay layers before ++ * checking if it is in-use as upperdir/workdir of "another" ++ * mount, because we do not bother to check in ovl_is_inuse() if ++ * the upperdir/workdir is in fact in-use by our ++ * upperdir/workdir. ++ */ + err = ovl_setup_trap(sb, stack[i].dentry, &trap, "lowerdir"); + if (err) + goto out; + + if (ovl_is_inuse(stack[i].dentry)) { + err = ovl_report_in_use(ofs, "lowerdir"); +- if (err) ++ if (err) { ++ iput(trap); + goto out; ++ } + } + + mnt = clone_private_mount(&stack[i]); +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index bff1def62eed..d5338b9ee550 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -592,6 +592,7 @@ struct request_queue { + u64 write_hints[BLK_MAX_WRITE_HINTS]; + }; + ++/* Keep blk_queue_flag_name[] in sync with the definitions below */ + #define QUEUE_FLAG_STOPPED 0 /* queue is stopped */ + #define QUEUE_FLAG_DYING 1 /* queue being torn down */ + #define QUEUE_FLAG_NOMERGES 3 /* disable merge attempts */ +diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h +index 430e219e3aba..1ccfa3779e18 100644 +--- a/include/linux/cgroup-defs.h ++++ b/include/linux/cgroup-defs.h +@@ -797,7 +797,9 @@ struct sock_cgroup_data { + union { + #ifdef __LITTLE_ENDIAN + struct { +- u8 is_data; ++ u8 is_data : 1; ++ u8 no_refcnt : 1; ++ u8 unused : 6; + u8 padding; + u16 prioidx; + u32 classid; +@@ -807,7 +809,9 @@ struct sock_cgroup_data { + u32 classid; + u16 prioidx; + u8 padding; +- u8 is_data; ++ u8 unused : 6; ++ u8 no_refcnt : 1; ++ u8 is_data : 1; + } __packed; + #endif + u64 val; +diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h +index 57577075d204..202852383ae9 100644 +--- a/include/linux/cgroup.h ++++ b/include/linux/cgroup.h +@@ -822,6 +822,7 @@ extern spinlock_t cgroup_sk_update_lock; + + void cgroup_sk_alloc_disable(void); + void cgroup_sk_alloc(struct sock_cgroup_data *skcd); ++void cgroup_sk_clone(struct sock_cgroup_data *skcd); + void cgroup_sk_free(struct sock_cgroup_data *skcd); + + static inline struct cgroup *sock_cgroup_ptr(struct sock_cgroup_data *skcd) +@@ -835,7 +836,7 @@ static inline struct cgroup *sock_cgroup_ptr(struct sock_cgroup_data *skcd) + */ + v = READ_ONCE(skcd->val); + +- if (v & 1) ++ if (v & 3) + return &cgrp_dfl_root.cgrp; + + return (struct cgroup *)(unsigned long)v ?: &cgrp_dfl_root.cgrp; +@@ -847,6 +848,7 @@ static inline struct cgroup *sock_cgroup_ptr(struct sock_cgroup_data *skcd) + #else /* CONFIG_CGROUP_DATA */ + + static inline void cgroup_sk_alloc(struct sock_cgroup_data *skcd) {} ++static inline void cgroup_sk_clone(struct sock_cgroup_data *skcd) {} + static inline void cgroup_sk_free(struct sock_cgroup_data *skcd) {} + + #endif /* CONFIG_CGROUP_DATA */ +diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h +index b05e855f1ddd..41a518336673 100644 +--- a/include/linux/if_vlan.h ++++ b/include/linux/if_vlan.h +@@ -25,6 +25,8 @@ + #define VLAN_ETH_DATA_LEN 1500 /* Max. octets in payload */ + #define VLAN_ETH_FRAME_LEN 1518 /* Max. octets in frame sans FCS */ + ++#define VLAN_MAX_DEPTH 8 /* Max. number of nested VLAN tags parsed */ ++ + /* + * struct vlan_hdr - vlan header + * @h_vlan_TCI: priority and VLAN ID +@@ -577,10 +579,10 @@ static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) + * Returns the EtherType of the packet, regardless of whether it is + * vlan encapsulated (normal or hardware accelerated) or not. + */ +-static inline __be16 __vlan_get_protocol(struct sk_buff *skb, __be16 type, ++static inline __be16 __vlan_get_protocol(const struct sk_buff *skb, __be16 type, + int *depth) + { +- unsigned int vlan_depth = skb->mac_len; ++ unsigned int vlan_depth = skb->mac_len, parse_depth = VLAN_MAX_DEPTH; + + /* if type is 802.1Q/AD then the header should already be + * present at mac_len - VLAN_HLEN (if mac_len > 0), or at +@@ -595,13 +597,12 @@ static inline __be16 __vlan_get_protocol(struct sk_buff *skb, __be16 type, + vlan_depth = ETH_HLEN; + } + do { +- struct vlan_hdr *vh; ++ struct vlan_hdr vhdr, *vh; + +- if (unlikely(!pskb_may_pull(skb, +- vlan_depth + VLAN_HLEN))) ++ vh = skb_header_pointer(skb, vlan_depth, sizeof(vhdr), &vhdr); ++ if (unlikely(!vh || !--parse_depth)) + return 0; + +- vh = (struct vlan_hdr *)(skb->data + vlan_depth); + type = vh->h_vlan_encapsulated_proto; + vlan_depth += VLAN_HLEN; + } while (eth_type_vlan(type)); +@@ -620,11 +621,25 @@ static inline __be16 __vlan_get_protocol(struct sk_buff *skb, __be16 type, + * Returns the EtherType of the packet, regardless of whether it is + * vlan encapsulated (normal or hardware accelerated) or not. + */ +-static inline __be16 vlan_get_protocol(struct sk_buff *skb) ++static inline __be16 vlan_get_protocol(const struct sk_buff *skb) + { + return __vlan_get_protocol(skb, skb->protocol, NULL); + } + ++/* A getter for the SKB protocol field which will handle VLAN tags consistently ++ * whether VLAN acceleration is enabled or not. ++ */ ++static inline __be16 skb_protocol(const struct sk_buff *skb, bool skip_vlan) ++{ ++ if (!skip_vlan) ++ /* VLAN acceleration strips the VLAN header from the skb and ++ * moves it to skb->vlan_proto ++ */ ++ return skb_vlan_tag_present(skb) ? skb->vlan_proto : skb->protocol; ++ ++ return vlan_get_protocol(skb); ++} ++ + static inline void vlan_set_encap_proto(struct sk_buff *skb, + struct vlan_hdr *vhdr) + { +diff --git a/include/linux/input/elan-i2c-ids.h b/include/linux/input/elan-i2c-ids.h +index 1ecb6b45812c..520858d12680 100644 +--- a/include/linux/input/elan-i2c-ids.h ++++ b/include/linux/input/elan-i2c-ids.h +@@ -67,8 +67,15 @@ static const struct acpi_device_id elan_acpi_id[] = { + { "ELAN062B", 0 }, + { "ELAN062C", 0 }, + { "ELAN062D", 0 }, ++ { "ELAN062E", 0 }, /* Lenovo V340 Whiskey Lake U */ ++ { "ELAN062F", 0 }, /* Lenovo V340 Comet Lake U */ + { "ELAN0631", 0 }, + { "ELAN0632", 0 }, ++ { "ELAN0633", 0 }, /* Lenovo S145 */ ++ { "ELAN0634", 0 }, /* Lenovo V340 Ice lake */ ++ { "ELAN0635", 0 }, /* Lenovo V1415-IIL */ ++ { "ELAN0636", 0 }, /* Lenovo V1415-Dali */ ++ { "ELAN0637", 0 }, /* Lenovo V1415-IGLR */ + { "ELAN1000", 0 }, + { } + }; +diff --git a/include/linux/platform_data/ti-sysc.h b/include/linux/platform_data/ti-sysc.h +index 2cbde6542849..5fcc9bc9e751 100644 +--- a/include/linux/platform_data/ti-sysc.h ++++ b/include/linux/platform_data/ti-sysc.h +@@ -49,6 +49,7 @@ struct sysc_regbits { + s8 emufree_shift; + }; + ++#define SYSC_MODULE_QUIRK_RTC_UNLOCK BIT(22) + #define SYSC_QUIRK_CLKDM_NOAUTO BIT(21) + #define SYSC_QUIRK_FORCE_MSTANDBY BIT(20) + #define SYSC_MODULE_QUIRK_AESS BIT(19) +diff --git a/include/net/dst.h b/include/net/dst.h +index 3448cf865ede..433f7c1ce8a9 100644 +--- a/include/net/dst.h ++++ b/include/net/dst.h +@@ -401,7 +401,15 @@ static inline struct neighbour *dst_neigh_lookup(const struct dst_entry *dst, co + static inline struct neighbour *dst_neigh_lookup_skb(const struct dst_entry *dst, + struct sk_buff *skb) + { +- struct neighbour *n = dst->ops->neigh_lookup(dst, skb, NULL); ++ struct neighbour *n = NULL; ++ ++ /* The packets from tunnel devices (eg bareudp) may have only ++ * metadata in the dst pointer of skb. Hence a pointer check of ++ * neigh_lookup is needed. ++ */ ++ if (dst->ops->neigh_lookup) ++ n = dst->ops->neigh_lookup(dst, skb, NULL); ++ + return IS_ERR(n) ? NULL : n; + } + +diff --git a/include/net/genetlink.h b/include/net/genetlink.h +index 9292f1c588b7..2d9e67a69cbe 100644 +--- a/include/net/genetlink.h ++++ b/include/net/genetlink.h +@@ -35,12 +35,6 @@ struct genl_info; + * do additional, common, filtering and return an error + * @post_doit: called after an operation's doit callback, it may + * undo operations done by pre_doit, for example release locks +- * @mcast_bind: a socket bound to the given multicast group (which +- * is given as the offset into the groups array) +- * @mcast_unbind: a socket was unbound from the given multicast group. +- * Note that unbind() will not be called symmetrically if the +- * generic netlink family is removed while there are still open +- * sockets. + * @attrbuf: buffer to store parsed attributes (private) + * @mcgrps: multicast groups used by this family + * @n_mcgrps: number of multicast groups +@@ -64,8 +58,6 @@ struct genl_family { + void (*post_doit)(const struct genl_ops *ops, + struct sk_buff *skb, + struct genl_info *info); +- int (*mcast_bind)(struct net *net, int group); +- void (*mcast_unbind)(struct net *net, int group); + struct nlattr ** attrbuf; /* private */ + const struct genl_ops * ops; + const struct genl_multicast_group *mcgrps; +diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h +index 0f0d1efe06dd..e1eaf1780288 100644 +--- a/include/net/inet_ecn.h ++++ b/include/net/inet_ecn.h +@@ -4,6 +4,7 @@ + + #include <linux/ip.h> + #include <linux/skbuff.h> ++#include <linux/if_vlan.h> + + #include <net/inet_sock.h> + #include <net/dsfield.h> +@@ -172,7 +173,7 @@ static inline void ipv6_copy_dscp(unsigned int dscp, struct ipv6hdr *inner) + + static inline int INET_ECN_set_ce(struct sk_buff *skb) + { +- switch (skb->protocol) { ++ switch (skb_protocol(skb, true)) { + case cpu_to_be16(ETH_P_IP): + if (skb_network_header(skb) + sizeof(struct iphdr) <= + skb_tail_pointer(skb)) +@@ -191,7 +192,7 @@ static inline int INET_ECN_set_ce(struct sk_buff *skb) + + static inline int INET_ECN_set_ect1(struct sk_buff *skb) + { +- switch (skb->protocol) { ++ switch (skb_protocol(skb, true)) { + case cpu_to_be16(ETH_P_IP): + if (skb_network_header(skb) + sizeof(struct iphdr) <= + skb_tail_pointer(skb)) +@@ -272,12 +273,16 @@ static inline int IP_ECN_decapsulate(const struct iphdr *oiph, + { + __u8 inner; + +- if (skb->protocol == htons(ETH_P_IP)) ++ switch (skb_protocol(skb, true)) { ++ case htons(ETH_P_IP): + inner = ip_hdr(skb)->tos; +- else if (skb->protocol == htons(ETH_P_IPV6)) ++ break; ++ case htons(ETH_P_IPV6): + inner = ipv6_get_dsfield(ipv6_hdr(skb)); +- else ++ break; ++ default: + return 0; ++ } + + return INET_ECN_decapsulate(skb, oiph->tos, inner); + } +@@ -287,12 +292,16 @@ static inline int IP6_ECN_decapsulate(const struct ipv6hdr *oipv6h, + { + __u8 inner; + +- if (skb->protocol == htons(ETH_P_IP)) ++ switch (skb_protocol(skb, true)) { ++ case htons(ETH_P_IP): + inner = ip_hdr(skb)->tos; +- else if (skb->protocol == htons(ETH_P_IPV6)) ++ break; ++ case htons(ETH_P_IPV6): + inner = ipv6_get_dsfield(ipv6_hdr(skb)); +- else ++ break; ++ default: + return 0; ++ } + + return INET_ECN_decapsulate(skb, ipv6_get_dsfield(oipv6h), inner); + } +diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h +index 6a70845bd9ab..cee1c084e9f4 100644 +--- a/include/net/pkt_sched.h ++++ b/include/net/pkt_sched.h +@@ -128,17 +128,6 @@ static inline void qdisc_run(struct Qdisc *q) + } + } + +-static inline __be16 tc_skb_protocol(const struct sk_buff *skb) +-{ +- /* We need to take extra care in case the skb came via +- * vlan accelerated path. In that case, use skb->vlan_proto +- * as the original vlan header was already stripped. +- */ +- if (skb_vlan_tag_present(skb)) +- return skb->vlan_proto; +- return skb->protocol; +-} +- + /* Calculate maximal size of packet seen by hard_start_xmit + routine of this device. + */ +diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h +index ba9efdc848f9..059b6e45a028 100644 +--- a/include/trace/events/rxrpc.h ++++ b/include/trace/events/rxrpc.h +@@ -400,7 +400,7 @@ enum rxrpc_tx_point { + EM(rxrpc_cong_begin_retransmission, " Retrans") \ + EM(rxrpc_cong_cleared_nacks, " Cleared") \ + EM(rxrpc_cong_new_low_nack, " NewLowN") \ +- EM(rxrpc_cong_no_change, "") \ ++ EM(rxrpc_cong_no_change, " -") \ + EM(rxrpc_cong_progress, " Progres") \ + EM(rxrpc_cong_retransmit_again, " ReTxAgn") \ + EM(rxrpc_cong_rtt_window_end, " RttWinE") \ +diff --git a/include/uapi/linux/vboxguest.h b/include/uapi/linux/vboxguest.h +index 9cec58a6a5ea..f79d7abe27db 100644 +--- a/include/uapi/linux/vboxguest.h ++++ b/include/uapi/linux/vboxguest.h +@@ -103,7 +103,7 @@ VMMDEV_ASSERT_SIZE(vbg_ioctl_driver_version_info, 24 + 20); + + + /* IOCTL to perform a VMM Device request larger then 1KB. */ +-#define VBG_IOCTL_VMMDEV_REQUEST_BIG _IOC(_IOC_READ | _IOC_WRITE, 'V', 3, 0) ++#define VBG_IOCTL_VMMDEV_REQUEST_BIG _IO('V', 3) + + + /** VBG_IOCTL_HGCM_CONNECT data structure. */ +@@ -198,7 +198,7 @@ struct vbg_ioctl_log { + } u; + }; + +-#define VBG_IOCTL_LOG(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 9, s) ++#define VBG_IOCTL_LOG(s) _IO('V', 9) + + + /** VBG_IOCTL_WAIT_FOR_EVENTS data structure. */ +diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c +index 7c9e97553a00..35faf082a709 100644 +--- a/kernel/cgroup/cgroup.c ++++ b/kernel/cgroup/cgroup.c +@@ -6379,18 +6379,8 @@ void cgroup_sk_alloc_disable(void) + + void cgroup_sk_alloc(struct sock_cgroup_data *skcd) + { +- if (cgroup_sk_alloc_disabled) +- return; +- +- /* Socket clone path */ +- if (skcd->val) { +- /* +- * We might be cloning a socket which is left in an empty +- * cgroup and the cgroup might have already been rmdir'd. +- * Don't use cgroup_get_live(). +- */ +- cgroup_get(sock_cgroup_ptr(skcd)); +- cgroup_bpf_get(sock_cgroup_ptr(skcd)); ++ if (cgroup_sk_alloc_disabled) { ++ skcd->no_refcnt = 1; + return; + } + +@@ -6415,10 +6405,27 @@ void cgroup_sk_alloc(struct sock_cgroup_data *skcd) + rcu_read_unlock(); + } + ++void cgroup_sk_clone(struct sock_cgroup_data *skcd) ++{ ++ if (skcd->val) { ++ if (skcd->no_refcnt) ++ return; ++ /* ++ * We might be cloning a socket which is left in an empty ++ * cgroup and the cgroup might have already been rmdir'd. ++ * Don't use cgroup_get_live(). ++ */ ++ cgroup_get(sock_cgroup_ptr(skcd)); ++ cgroup_bpf_get(sock_cgroup_ptr(skcd)); ++ } ++} ++ + void cgroup_sk_free(struct sock_cgroup_data *skcd) + { + struct cgroup *cgrp = sock_cgroup_ptr(skcd); + ++ if (skcd->no_refcnt) ++ return; + cgroup_bpf_put(cgrp); + cgroup_put(cgrp); + } +diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c +index b304c17d53a3..df73685de114 100644 +--- a/kernel/irq/manage.c ++++ b/kernel/irq/manage.c +@@ -194,9 +194,9 @@ void irq_set_thread_affinity(struct irq_desc *desc) + set_bit(IRQTF_AFFINITY, &action->thread_flags); + } + ++#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK + static void irq_validate_effective_affinity(struct irq_data *data) + { +-#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK + const struct cpumask *m = irq_data_get_effective_affinity_mask(data); + struct irq_chip *chip = irq_data_get_irq_chip(data); + +@@ -204,9 +204,19 @@ static void irq_validate_effective_affinity(struct irq_data *data) + return; + pr_warn_once("irq_chip %s did not update eff. affinity mask of irq %u\n", + chip->name, data->irq); +-#endif + } + ++static inline void irq_init_effective_affinity(struct irq_data *data, ++ const struct cpumask *mask) ++{ ++ cpumask_copy(irq_data_get_effective_affinity_mask(data), mask); ++} ++#else ++static inline void irq_validate_effective_affinity(struct irq_data *data) { } ++static inline void irq_init_effective_affinity(struct irq_data *data, ++ const struct cpumask *mask) { } ++#endif ++ + int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, + bool force) + { +@@ -265,6 +275,26 @@ static int irq_try_set_affinity(struct irq_data *data, + return ret; + } + ++static bool irq_set_affinity_deactivated(struct irq_data *data, ++ const struct cpumask *mask, bool force) ++{ ++ struct irq_desc *desc = irq_data_to_desc(data); ++ ++ /* ++ * If the interrupt is not yet activated, just store the affinity ++ * mask and do not call the chip driver at all. On activation the ++ * driver has to make sure anyway that the interrupt is in a ++ * useable state so startup works. ++ */ ++ if (!IS_ENABLED(CONFIG_IRQ_DOMAIN_HIERARCHY) || irqd_is_activated(data)) ++ return false; ++ ++ cpumask_copy(desc->irq_common_data.affinity, mask); ++ irq_init_effective_affinity(data, mask); ++ irqd_set(data, IRQD_AFFINITY_SET); ++ return true; ++} ++ + int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, + bool force) + { +@@ -275,6 +305,9 @@ int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, + if (!chip || !chip->irq_set_affinity) + return -EINVAL; + ++ if (irq_set_affinity_deactivated(data, mask, force)) ++ return 0; ++ + if (irq_can_move_pcntxt(data) && !irqd_is_setaffinity_pending(data)) { + ret = irq_try_set_affinity(data, mask, force); + } else { +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 8b3e99d095ae..38ae3cf9d173 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -2889,6 +2889,7 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) + * Silence PROVE_RCU. + */ + raw_spin_lock_irqsave(&p->pi_lock, flags); ++ rseq_migrate(p); + /* + * We're setting the CPU for the first time, we don't migrate, + * so use __set_task_cpu(). +@@ -2953,6 +2954,7 @@ void wake_up_new_task(struct task_struct *p) + * as we're not fully set-up yet. + */ + p->recent_used_cpu = task_cpu(p); ++ rseq_migrate(p); + __set_task_cpu(p, select_task_rq(p, task_cpu(p), SD_BALANCE_FORK, 0)); + #endif + rq = __task_rq_lock(p, &rf); +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index 2f81e4ae844e..9b16080093be 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -3824,7 +3824,11 @@ static inline void update_misfit_status(struct task_struct *p, struct rq *rq) + return; + } + +- rq->misfit_task_load = task_h_load(p); ++ /* ++ * Make sure that misfit_task_load will not be null even if ++ * task_h_load() returns 0. ++ */ ++ rq->misfit_task_load = max_t(unsigned long, task_h_load(p), 1); + } + + #else /* CONFIG_SMP */ +@@ -7407,7 +7411,15 @@ static int detach_tasks(struct lb_env *env) + if (!can_migrate_task(p, env)) + goto next; + +- load = task_h_load(p); ++ /* ++ * Depending of the number of CPUs and tasks and the ++ * cgroup hierarchy, task_h_load() can return a null ++ * value. Make sure that env->imbalance decreases ++ * otherwise detach_tasks() will stop only after ++ * detaching up to loop_max tasks. ++ */ ++ load = max_t(unsigned long, task_h_load(p), 1); ++ + + if (sched_feat(LB_MIN) && load < 16 && !env->sd->nr_balance_failed) + goto next; +diff --git a/kernel/time/timer.c b/kernel/time/timer.c +index 4820823515e9..1e9b81a930c0 100644 +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -522,8 +522,8 @@ static int calc_wheel_index(unsigned long expires, unsigned long clk) + * Force expire obscene large timeouts to expire at the + * capacity limit of the wheel. + */ +- if (expires >= WHEEL_TIMEOUT_CUTOFF) +- expires = WHEEL_TIMEOUT_MAX; ++ if (delta >= WHEEL_TIMEOUT_CUTOFF) ++ expires = clk + WHEEL_TIMEOUT_MAX; + + idx = calc_index(expires, LVL_DEPTH - 1); + } +@@ -585,7 +585,15 @@ trigger_dyntick_cpu(struct timer_base *base, struct timer_list *timer) + * Set the next expiry time and kick the CPU so it can reevaluate the + * wheel: + */ +- base->next_expiry = timer->expires; ++ if (time_before(timer->expires, base->clk)) { ++ /* ++ * Prevent from forward_timer_base() moving the base->clk ++ * backward ++ */ ++ base->next_expiry = base->clk; ++ } else { ++ base->next_expiry = timer->expires; ++ } + wake_up_nohz_cpu(base->cpu); + } + +@@ -897,10 +905,13 @@ static inline void forward_timer_base(struct timer_base *base) + * If the next expiry value is > jiffies, then we fast forward to + * jiffies otherwise we forward to the next expiry value. + */ +- if (time_after(base->next_expiry, jnow)) ++ if (time_after(base->next_expiry, jnow)) { + base->clk = jnow; +- else ++ } else { ++ if (WARN_ON_ONCE(time_before(base->next_expiry, base->clk))) ++ return; + base->clk = base->next_expiry; ++ } + #endif + } + +diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c +index ad12fe3fca8c..ee2902b51d45 100644 +--- a/net/bridge/br_multicast.c ++++ b/net/bridge/br_multicast.c +@@ -1007,7 +1007,7 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, + nsrcs_offset = len + offsetof(struct mld2_grec, grec_nsrcs); + + if (skb_transport_offset(skb) + ipv6_transport_len(skb) < +- nsrcs_offset + sizeof(_nsrcs)) ++ nsrcs_offset + sizeof(__nsrcs)) + return -EINVAL; + + _nsrcs = skb_header_pointer(skb, nsrcs_offset, +diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c +index e513b8876d13..a8481da37f1a 100644 +--- a/net/ceph/osd_client.c ++++ b/net/ceph/osd_client.c +@@ -445,6 +445,7 @@ static void target_copy(struct ceph_osd_request_target *dest, + dest->size = src->size; + dest->min_size = src->min_size; + dest->sort_bitwise = src->sort_bitwise; ++ dest->recovery_deletes = src->recovery_deletes; + + dest->flags = src->flags; + dest->paused = src->paused; +diff --git a/net/core/filter.c b/net/core/filter.c +index a0a492f7cf9c..bd1e46d61d8a 100644 +--- a/net/core/filter.c ++++ b/net/core/filter.c +@@ -5730,12 +5730,16 @@ BPF_CALL_1(bpf_skb_ecn_set_ce, struct sk_buff *, skb) + { + unsigned int iphdr_len; + +- if (skb->protocol == cpu_to_be16(ETH_P_IP)) ++ switch (skb_protocol(skb, true)) { ++ case cpu_to_be16(ETH_P_IP): + iphdr_len = sizeof(struct iphdr); +- else if (skb->protocol == cpu_to_be16(ETH_P_IPV6)) ++ break; ++ case cpu_to_be16(ETH_P_IPV6): + iphdr_len = sizeof(struct ipv6hdr); +- else ++ break; ++ default: + return 0; ++ } + + if (skb_headlen(skb) < iphdr_len) + return 0; +diff --git a/net/core/sock.c b/net/core/sock.c +index 078791a6649a..33a232974374 100644 +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -1837,7 +1837,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) + /* sk->sk_memcg will be populated at accept() time */ + newsk->sk_memcg = NULL; + +- cgroup_sk_alloc(&newsk->sk_cgrp_data); ++ cgroup_sk_clone(&newsk->sk_cgrp_data); + + rcu_read_lock(); + filter = rcu_dereference(sk->sk_filter); +diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c +index ac95ba78b903..73f46cb5e51d 100644 +--- a/net/ipv4/icmp.c ++++ b/net/ipv4/icmp.c +@@ -427,7 +427,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb) + + ipcm_init(&ipc); + inet->tos = ip_hdr(skb)->tos; +- sk->sk_mark = mark; ++ ipc.sockc.mark = mark; + daddr = ipc.addr = ip_hdr(skb)->saddr; + saddr = fib_compute_spec_dst(skb); + +@@ -709,10 +709,10 @@ void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info, + icmp_param.skb = skb_in; + icmp_param.offset = skb_network_offset(skb_in); + inet_sk(sk)->tos = tos; +- sk->sk_mark = mark; + ipcm_init(&ipc); + ipc.addr = iph->saddr; + ipc.opt = &icmp_param.replyopts.opt; ++ ipc.sockc.mark = mark; + + rt = icmp_route_lookup(net, &fl4, skb_in, iph, saddr, tos, mark, + type, code, &icmp_param); +diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c +index b268ee1c1b44..b36c4a3159e5 100644 +--- a/net/ipv4/ip_output.c ++++ b/net/ipv4/ip_output.c +@@ -1704,7 +1704,7 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, + sk->sk_protocol = ip_hdr(skb)->protocol; + sk->sk_bound_dev_if = arg->bound_dev_if; + sk->sk_sndbuf = sysctl_wmem_default; +- sk->sk_mark = fl4.flowi4_mark; ++ ipc.sockc.mark = fl4.flowi4_mark; + err = ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, + len, 0, &ipc, &rt, MSG_DONTWAIT); + if (unlikely(err)) { +diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c +index 535427292194..df6fbefe44d4 100644 +--- a/net/ipv4/ping.c ++++ b/net/ipv4/ping.c +@@ -786,6 +786,9 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + inet_sk_flowi_flags(sk), faddr, saddr, 0, 0, + sk->sk_uid); + ++ fl4.fl4_icmp_type = user_icmph.type; ++ fl4.fl4_icmp_code = user_icmph.code; ++ + security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); + rt = ip_route_output_flow(net, &fl4, sk); + if (IS_ERR(rt)) { +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index fe3cdeddd097..840901154210 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -2631,6 +2631,9 @@ int tcp_disconnect(struct sock *sk, int flags) + tp->window_clamp = 0; + tp->delivered = 0; + tp->delivered_ce = 0; ++ if (icsk->icsk_ca_ops->release) ++ icsk->icsk_ca_ops->release(sk); ++ memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv)); + tcp_set_ca_state(sk, TCP_CA_Open); + tp->is_sack_reneg = 0; + tcp_clear_retrans(tp); +@@ -3085,10 +3088,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, + #ifdef CONFIG_TCP_MD5SIG + case TCP_MD5SIG: + case TCP_MD5SIG_EXT: +- if ((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)) +- err = tp->af_specific->md5_parse(sk, optname, optval, optlen); +- else +- err = -EINVAL; ++ err = tp->af_specific->md5_parse(sk, optname, optval, optlen); + break; + #endif + case TCP_USER_TIMEOUT: +@@ -3844,10 +3844,13 @@ EXPORT_SYMBOL(tcp_md5_hash_skb_data); + + int tcp_md5_hash_key(struct tcp_md5sig_pool *hp, const struct tcp_md5sig_key *key) + { ++ u8 keylen = READ_ONCE(key->keylen); /* paired with WRITE_ONCE() in tcp_md5_do_add */ + struct scatterlist sg; + +- sg_init_one(&sg, key->key, key->keylen); +- ahash_request_set_crypt(hp->md5_req, &sg, NULL, key->keylen); ++ sg_init_one(&sg, key->key, keylen); ++ ahash_request_set_crypt(hp->md5_req, &sg, NULL, keylen); ++ ++ /* tcp_md5_do_add() might change key->key under us */ + return crypto_ahash_update(hp->md5_req); + } + EXPORT_SYMBOL(tcp_md5_hash_key); +diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c +index c445a81d144e..d7a1f2ef6c52 100644 +--- a/net/ipv4/tcp_cong.c ++++ b/net/ipv4/tcp_cong.c +@@ -197,7 +197,7 @@ static void tcp_reinit_congestion_control(struct sock *sk, + icsk->icsk_ca_setsockopt = 1; + memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv)); + +- if (sk->sk_state != TCP_CLOSE) ++ if (!((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) + tcp_init_congestion_control(sk); + } + +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index 3e63dc9c3eba..6d331307beca 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -4564,6 +4564,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) + + if (unlikely(tcp_try_rmem_schedule(sk, skb, skb->truesize))) { + NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPOFODROP); ++ sk->sk_data_ready(sk); + tcp_drop(sk, skb); + return; + } +@@ -4807,6 +4808,7 @@ queue_and_out: + sk_forced_mem_schedule(sk, skb->truesize); + else if (tcp_try_rmem_schedule(sk, skb, skb->truesize)) { + NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPRCVQDROP); ++ sk->sk_data_ready(sk); + goto drop; + } + +diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c +index eda64871f983..35f963690a70 100644 +--- a/net/ipv4/tcp_ipv4.c ++++ b/net/ipv4/tcp_ipv4.c +@@ -1077,9 +1077,18 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr, + + key = tcp_md5_do_lookup_exact(sk, addr, family, prefixlen); + if (key) { +- /* Pre-existing entry - just update that one. */ ++ /* Pre-existing entry - just update that one. ++ * Note that the key might be used concurrently. ++ */ + memcpy(key->key, newkey, newkeylen); +- key->keylen = newkeylen; ++ ++ /* Pairs with READ_ONCE() in tcp_md5_hash_key(). ++ * Also note that a reader could catch new key->keylen value ++ * but old key->key[], this is the reason we use __GFP_ZERO ++ * at sock_kmalloc() time below these lines. ++ */ ++ WRITE_ONCE(key->keylen, newkeylen); ++ + return 0; + } + +@@ -1095,7 +1104,7 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr, + rcu_assign_pointer(tp->md5sig_info, md5sig); + } + +- key = sock_kmalloc(sk, sizeof(*key), gfp); ++ key = sock_kmalloc(sk, sizeof(*key), gfp | __GFP_ZERO); + if (!key) + return -ENOMEM; + if (!tcp_alloc_md5sig_pool()) { +diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c +index c8d03c1b4c6b..5dc7485c4076 100644 +--- a/net/ipv4/tcp_output.c ++++ b/net/ipv4/tcp_output.c +@@ -662,7 +662,8 @@ static unsigned int tcp_synack_options(const struct sock *sk, + unsigned int mss, struct sk_buff *skb, + struct tcp_out_options *opts, + const struct tcp_md5sig_key *md5, +- struct tcp_fastopen_cookie *foc) ++ struct tcp_fastopen_cookie *foc, ++ enum tcp_synack_type synack_type) + { + struct inet_request_sock *ireq = inet_rsk(req); + unsigned int remaining = MAX_TCP_OPTION_SPACE; +@@ -677,7 +678,8 @@ static unsigned int tcp_synack_options(const struct sock *sk, + * rather than TS in order to fit in better with old, + * buggy kernels, but that was deemed to be unnecessary. + */ +- ireq->tstamp_ok &= !ireq->sack_ok; ++ if (synack_type != TCP_SYNACK_COOKIE) ++ ireq->tstamp_ok &= !ireq->sack_ok; + } + #endif + +@@ -3326,7 +3328,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, + #endif + skb_set_hash(skb, tcp_rsk(req)->txhash, PKT_HASH_TYPE_L4); + tcp_header_size = tcp_synack_options(sk, req, mss, skb, &opts, md5, +- foc) + sizeof(*th); ++ foc, synack_type) + sizeof(*th); + + skb_push(skb, tcp_header_size); + skb_reset_transport_header(skb); +diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c +index 62c997201970..7d3a3894f785 100644 +--- a/net/ipv6/icmp.c ++++ b/net/ipv6/icmp.c +@@ -535,7 +535,6 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, + if (!sk) + goto out_bh_enable; + +- sk->sk_mark = mark; + np = inet6_sk(sk); + + if (!icmpv6_xrlim_allow(sk, type, &fl6)) +@@ -552,6 +551,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, + fl6.flowi6_oif = np->ucast_oif; + + ipcm6_init_sk(&ipc6, np); ++ ipc6.sockc.mark = mark; + fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel); + + dst = icmpv6_route_lookup(net, skb, sk, &fl6); +@@ -720,7 +720,6 @@ static void icmpv6_echo_reply(struct sk_buff *skb) + sk = icmpv6_xmit_lock(net); + if (!sk) + goto out_bh_enable; +- sk->sk_mark = mark; + np = inet6_sk(sk); + + if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr)) +@@ -748,6 +747,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) + ipcm6_init_sk(&ipc6, np); + ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst); + ipc6.tclass = ipv6_get_dsfield(ipv6_hdr(skb)); ++ ipc6.sockc.mark = mark; + + if (ip6_append_data(sk, icmpv6_getfrag, &msg, + skb->len + sizeof(struct icmp6hdr), +diff --git a/net/ipv6/route.c b/net/ipv6/route.c +index 3b4af0a8bca6..94ade43d5a45 100644 +--- a/net/ipv6/route.c ++++ b/net/ipv6/route.c +@@ -431,9 +431,12 @@ void fib6_select_path(const struct net *net, struct fib6_result *res, + struct fib6_info *sibling, *next_sibling; + struct fib6_info *match = res->f6i; + +- if ((!match->fib6_nsiblings && !match->nh) || have_oif_match) ++ if (!match->nh && (!match->fib6_nsiblings || have_oif_match)) + goto out; + ++ if (match->nh && have_oif_match && res->nh) ++ return; ++ + /* We might have already computed the hash for ICMPv6 errors. In such + * case it will always be non-zero. Otherwise now is the time to do it. + */ +@@ -3406,7 +3409,7 @@ static bool fib6_is_reject(u32 flags, struct net_device *dev, int addr_type) + if ((flags & RTF_REJECT) || + (dev && (dev->flags & IFF_LOOPBACK) && + !(addr_type & IPV6_ADDR_LOOPBACK) && +- !(flags & RTF_LOCAL))) ++ !(flags & (RTF_ANYCAST | RTF_LOCAL)))) + return true; + + return false; +diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c +index 6dc3bfa12b1e..95805a6331be 100644 +--- a/net/l2tp/l2tp_core.c ++++ b/net/l2tp/l2tp_core.c +@@ -1030,6 +1030,7 @@ static void l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb, + + /* Queue the packet to IP for output */ + skb->ignore_df = 1; ++ skb_dst_drop(skb); + #if IS_ENABLED(CONFIG_IPV6) + if (l2tp_sk_is_v6(tunnel->sock)) + error = inet6_csk_xmit(tunnel->sock, skb, NULL); +@@ -1101,10 +1102,6 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len + goto out_unlock; + } + +- /* Get routing info from the tunnel socket */ +- skb_dst_drop(skb); +- skb_dst_set(skb, sk_dst_check(sk, 0)); +- + inet = inet_sk(sk); + fl = &inet->cork.fl; + switch (tunnel->encap) { +diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c +index c74f44dfaa22..5abb7f9b7ee5 100644 +--- a/net/llc/af_llc.c ++++ b/net/llc/af_llc.c +@@ -273,6 +273,10 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr) + + if (!sock_flag(sk, SOCK_ZAPPED)) + goto out; ++ if (!addr->sllc_arphrd) ++ addr->sllc_arphrd = ARPHRD_ETHER; ++ if (addr->sllc_arphrd != ARPHRD_ETHER) ++ goto out; + rc = -ENODEV; + if (sk->sk_bound_dev_if) { + llc->dev = dev_get_by_index(&init_net, sk->sk_bound_dev_if); +@@ -328,7 +332,9 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen) + if (unlikely(!sock_flag(sk, SOCK_ZAPPED) || addrlen != sizeof(*addr))) + goto out; + rc = -EAFNOSUPPORT; +- if (unlikely(addr->sllc_family != AF_LLC)) ++ if (!addr->sllc_arphrd) ++ addr->sllc_arphrd = ARPHRD_ETHER; ++ if (unlikely(addr->sllc_family != AF_LLC || addr->sllc_arphrd != ARPHRD_ETHER)) + goto out; + dprintk("%s: binding %02X\n", __func__, addr->sllc_sap); + rc = -ENODEV; +@@ -336,8 +342,6 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen) + if (sk->sk_bound_dev_if) { + llc->dev = dev_get_by_index_rcu(&init_net, sk->sk_bound_dev_if); + if (llc->dev) { +- if (!addr->sllc_arphrd) +- addr->sllc_arphrd = llc->dev->type; + if (is_zero_ether_addr(addr->sllc_mac)) + memcpy(addr->sllc_mac, llc->dev->dev_addr, + IFHWADDRLEN); +diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c +index efccd1ac9a66..102b8d6b5612 100644 +--- a/net/netlink/genetlink.c ++++ b/net/netlink/genetlink.c +@@ -989,60 +989,11 @@ static struct genl_family genl_ctrl __ro_after_init = { + .netnsok = true, + }; + +-static int genl_bind(struct net *net, int group) +-{ +- struct genl_family *f; +- int err = -ENOENT; +- unsigned int id; +- +- down_read(&cb_lock); +- +- idr_for_each_entry(&genl_fam_idr, f, id) { +- if (group >= f->mcgrp_offset && +- group < f->mcgrp_offset + f->n_mcgrps) { +- int fam_grp = group - f->mcgrp_offset; +- +- if (!f->netnsok && net != &init_net) +- err = -ENOENT; +- else if (f->mcast_bind) +- err = f->mcast_bind(net, fam_grp); +- else +- err = 0; +- break; +- } +- } +- up_read(&cb_lock); +- +- return err; +-} +- +-static void genl_unbind(struct net *net, int group) +-{ +- struct genl_family *f; +- unsigned int id; +- +- down_read(&cb_lock); +- +- idr_for_each_entry(&genl_fam_idr, f, id) { +- if (group >= f->mcgrp_offset && +- group < f->mcgrp_offset + f->n_mcgrps) { +- int fam_grp = group - f->mcgrp_offset; +- +- if (f->mcast_unbind) +- f->mcast_unbind(net, fam_grp); +- break; +- } +- } +- up_read(&cb_lock); +-} +- + static int __net_init genl_pernet_init(struct net *net) + { + struct netlink_kernel_cfg cfg = { + .input = genl_rcv, + .flags = NL_CFG_F_NONROOT_RECV, +- .bind = genl_bind, +- .unbind = genl_unbind, + }; + + /* we'll bump the group number right afterwards */ +diff --git a/net/sched/act_connmark.c b/net/sched/act_connmark.c +index 2b43cacf82af..1a8f2f85ea1a 100644 +--- a/net/sched/act_connmark.c ++++ b/net/sched/act_connmark.c +@@ -43,17 +43,20 @@ static int tcf_connmark_act(struct sk_buff *skb, const struct tc_action *a, + tcf_lastuse_update(&ca->tcf_tm); + bstats_update(&ca->tcf_bstats, skb); + +- if (skb->protocol == htons(ETH_P_IP)) { ++ switch (skb_protocol(skb, true)) { ++ case htons(ETH_P_IP): + if (skb->len < sizeof(struct iphdr)) + goto out; + + proto = NFPROTO_IPV4; +- } else if (skb->protocol == htons(ETH_P_IPV6)) { ++ break; ++ case htons(ETH_P_IPV6): + if (skb->len < sizeof(struct ipv6hdr)) + goto out; + + proto = NFPROTO_IPV6; +- } else { ++ break; ++ default: + goto out; + } + +diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c +index d3cfad88dc3a..428b1ae00123 100644 +--- a/net/sched/act_csum.c ++++ b/net/sched/act_csum.c +@@ -587,7 +587,7 @@ static int tcf_csum_act(struct sk_buff *skb, const struct tc_action *a, + goto drop; + + update_flags = params->update_flags; +- protocol = tc_skb_protocol(skb); ++ protocol = skb_protocol(skb, false); + again: + switch (protocol) { + case cpu_to_be16(ETH_P_IP): +diff --git a/net/sched/act_ct.c b/net/sched/act_ct.c +index 0586546c20d7..e0060aefbf9d 100644 +--- a/net/sched/act_ct.c ++++ b/net/sched/act_ct.c +@@ -100,7 +100,7 @@ static u8 tcf_ct_skb_nf_family(struct sk_buff *skb) + { + u8 family = NFPROTO_UNSPEC; + +- switch (skb->protocol) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + family = NFPROTO_IPV4; + break; +@@ -222,6 +222,7 @@ static int ct_nat_execute(struct sk_buff *skb, struct nf_conn *ct, + const struct nf_nat_range2 *range, + enum nf_nat_manip_type maniptype) + { ++ __be16 proto = skb_protocol(skb, true); + int hooknum, err = NF_ACCEPT; + + /* See HOOK2MANIP(). */ +@@ -233,14 +234,13 @@ static int ct_nat_execute(struct sk_buff *skb, struct nf_conn *ct, + switch (ctinfo) { + case IP_CT_RELATED: + case IP_CT_RELATED_REPLY: +- if (skb->protocol == htons(ETH_P_IP) && ++ if (proto == htons(ETH_P_IP) && + ip_hdr(skb)->protocol == IPPROTO_ICMP) { + if (!nf_nat_icmp_reply_translation(skb, ct, ctinfo, + hooknum)) + err = NF_DROP; + goto out; +- } else if (IS_ENABLED(CONFIG_IPV6) && +- skb->protocol == htons(ETH_P_IPV6)) { ++ } else if (IS_ENABLED(CONFIG_IPV6) && proto == htons(ETH_P_IPV6)) { + __be16 frag_off; + u8 nexthdr = ipv6_hdr(skb)->nexthdr; + int hdrlen = ipv6_skip_exthdr(skb, +@@ -993,4 +993,3 @@ MODULE_AUTHOR("Yossi Kuperman <yossiku@mellanox.com>"); + MODULE_AUTHOR("Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>"); + MODULE_DESCRIPTION("Connection tracking action"); + MODULE_LICENSE("GPL v2"); +- +diff --git a/net/sched/act_ctinfo.c b/net/sched/act_ctinfo.c +index f45995a6237a..a91fcee810ef 100644 +--- a/net/sched/act_ctinfo.c ++++ b/net/sched/act_ctinfo.c +@@ -96,19 +96,22 @@ static int tcf_ctinfo_act(struct sk_buff *skb, const struct tc_action *a, + action = READ_ONCE(ca->tcf_action); + + wlen = skb_network_offset(skb); +- if (tc_skb_protocol(skb) == htons(ETH_P_IP)) { ++ switch (skb_protocol(skb, true)) { ++ case htons(ETH_P_IP): + wlen += sizeof(struct iphdr); + if (!pskb_may_pull(skb, wlen)) + goto out; + + proto = NFPROTO_IPV4; +- } else if (tc_skb_protocol(skb) == htons(ETH_P_IPV6)) { ++ break; ++ case htons(ETH_P_IPV6): + wlen += sizeof(struct ipv6hdr); + if (!pskb_may_pull(skb, wlen)) + goto out; + + proto = NFPROTO_IPV6; +- } else { ++ break; ++ default: + goto out; + } + +diff --git a/net/sched/act_mpls.c b/net/sched/act_mpls.c +index db570d2bd0e0..f786775699b5 100644 +--- a/net/sched/act_mpls.c ++++ b/net/sched/act_mpls.c +@@ -82,7 +82,7 @@ static int tcf_mpls_act(struct sk_buff *skb, const struct tc_action *a, + goto drop; + break; + case TCA_MPLS_ACT_PUSH: +- new_lse = tcf_mpls_get_lse(NULL, p, !eth_p_mpls(skb->protocol)); ++ new_lse = tcf_mpls_get_lse(NULL, p, !eth_p_mpls(skb_protocol(skb, true))); + if (skb_mpls_push(skb, new_lse, p->tcfm_proto, mac_len, + skb->dev && skb->dev->type == ARPHRD_ETHER)) + goto drop; +diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c +index 6a8d3337c577..f98b2791ecec 100644 +--- a/net/sched/act_skbedit.c ++++ b/net/sched/act_skbedit.c +@@ -41,7 +41,7 @@ static int tcf_skbedit_act(struct sk_buff *skb, const struct tc_action *a, + if (params->flags & SKBEDIT_F_INHERITDSFIELD) { + int wlen = skb_network_offset(skb); + +- switch (tc_skb_protocol(skb)) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + wlen += sizeof(struct iphdr); + if (!pskb_may_pull(skb, wlen)) +diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c +index 68c8fc6f535c..d7604417367d 100644 +--- a/net/sched/cls_api.c ++++ b/net/sched/cls_api.c +@@ -1571,7 +1571,7 @@ int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp, + reclassify: + #endif + for (; tp; tp = rcu_dereference_bh(tp->next)) { +- __be16 protocol = tc_skb_protocol(skb); ++ __be16 protocol = skb_protocol(skb, false); + int err; + + if (tp->protocol != protocol && +diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c +index 80ae7b9fa90a..ab53a93b2f2b 100644 +--- a/net/sched/cls_flow.c ++++ b/net/sched/cls_flow.c +@@ -80,7 +80,7 @@ static u32 flow_get_dst(const struct sk_buff *skb, const struct flow_keys *flow) + if (dst) + return ntohl(dst); + +- return addr_fold(skb_dst(skb)) ^ (__force u16) tc_skb_protocol(skb); ++ return addr_fold(skb_dst(skb)) ^ (__force u16)skb_protocol(skb, true); + } + + static u32 flow_get_proto(const struct sk_buff *skb, +@@ -104,7 +104,7 @@ static u32 flow_get_proto_dst(const struct sk_buff *skb, + if (flow->ports.ports) + return ntohs(flow->ports.dst); + +- return addr_fold(skb_dst(skb)) ^ (__force u16) tc_skb_protocol(skb); ++ return addr_fold(skb_dst(skb)) ^ (__force u16)skb_protocol(skb, true); + } + + static u32 flow_get_iif(const struct sk_buff *skb) +@@ -151,7 +151,7 @@ static u32 flow_get_nfct(const struct sk_buff *skb) + static u32 flow_get_nfct_src(const struct sk_buff *skb, + const struct flow_keys *flow) + { +- switch (tc_skb_protocol(skb)) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + return ntohl(CTTUPLE(skb, src.u3.ip)); + case htons(ETH_P_IPV6): +@@ -164,7 +164,7 @@ fallback: + static u32 flow_get_nfct_dst(const struct sk_buff *skb, + const struct flow_keys *flow) + { +- switch (tc_skb_protocol(skb)) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + return ntohl(CTTUPLE(skb, dst.u3.ip)); + case htons(ETH_P_IPV6): +diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c +index 1d270540e74d..c5a0f2c2635e 100644 +--- a/net/sched/cls_flower.c ++++ b/net/sched/cls_flower.c +@@ -310,7 +310,7 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp, + /* skb_flow_dissect() does not set n_proto in case an unknown + * protocol, so do it rather here. + */ +- skb_key.basic.n_proto = skb->protocol; ++ skb_key.basic.n_proto = skb_protocol(skb, false); + skb_flow_dissect_tunnel_info(skb, &mask->dissector, &skb_key); + skb_flow_dissect_ct(skb, &mask->dissector, &skb_key, + fl_ct_info_to_flower_map, +diff --git a/net/sched/em_ipset.c b/net/sched/em_ipset.c +index df00566d327d..c95cf86fb431 100644 +--- a/net/sched/em_ipset.c ++++ b/net/sched/em_ipset.c +@@ -59,7 +59,7 @@ static int em_ipset_match(struct sk_buff *skb, struct tcf_ematch *em, + }; + int ret, network_offset; + +- switch (tc_skb_protocol(skb)) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + state.pf = NFPROTO_IPV4; + if (!pskb_network_may_pull(skb, sizeof(struct iphdr))) +diff --git a/net/sched/em_ipt.c b/net/sched/em_ipt.c +index 9fff6480acc6..e2c157df3f8b 100644 +--- a/net/sched/em_ipt.c ++++ b/net/sched/em_ipt.c +@@ -212,7 +212,7 @@ static int em_ipt_match(struct sk_buff *skb, struct tcf_ematch *em, + struct nf_hook_state state; + int ret; + +- switch (tc_skb_protocol(skb)) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + if (!pskb_network_may_pull(skb, sizeof(struct iphdr))) + return 0; +diff --git a/net/sched/em_meta.c b/net/sched/em_meta.c +index 3177dcb17316..ad007cdcec97 100644 +--- a/net/sched/em_meta.c ++++ b/net/sched/em_meta.c +@@ -195,7 +195,7 @@ META_COLLECTOR(int_priority) + META_COLLECTOR(int_protocol) + { + /* Let userspace take care of the byte ordering */ +- dst->value = tc_skb_protocol(skb); ++ dst->value = skb_protocol(skb, false); + } + + META_COLLECTOR(int_pkttype) +diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c +index f4f9b8cdbffb..6385995dc700 100644 +--- a/net/sched/sch_atm.c ++++ b/net/sched/sch_atm.c +@@ -553,16 +553,16 @@ static int atm_tc_init(struct Qdisc *sch, struct nlattr *opt, + if (!p->link.q) + p->link.q = &noop_qdisc; + pr_debug("atm_tc_init: link (%p) qdisc %p\n", &p->link, p->link.q); ++ p->link.vcc = NULL; ++ p->link.sock = NULL; ++ p->link.common.classid = sch->handle; ++ p->link.ref = 1; + + err = tcf_block_get(&p->link.block, &p->link.filter_list, sch, + extack); + if (err) + return err; + +- p->link.vcc = NULL; +- p->link.sock = NULL; +- p->link.common.classid = sch->handle; +- p->link.ref = 1; + tasklet_init(&p->task, sch_atm_dequeue, (unsigned long)sch); + return 0; + } +diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c +index 5d605bab9afc..896c0562cb42 100644 +--- a/net/sched/sch_cake.c ++++ b/net/sched/sch_cake.c +@@ -592,7 +592,7 @@ static void cake_update_flowkeys(struct flow_keys *keys, + struct nf_conntrack_tuple tuple = {}; + bool rev = !skb->_nfct; + +- if (tc_skb_protocol(skb) != htons(ETH_P_IP)) ++ if (skb_protocol(skb, true) != htons(ETH_P_IP)) + return; + + if (!nf_ct_get_tuple_skb(&tuple, skb)) +@@ -1521,7 +1521,7 @@ static u8 cake_handle_diffserv(struct sk_buff *skb, bool wash) + u16 *buf, buf_; + u8 dscp; + +- switch (tc_skb_protocol(skb)) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + buf = skb_header_pointer(skb, offset, sizeof(buf_), &buf_); + if (unlikely(!buf)) +diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c +index 05605b30bef3..2b88710994d7 100644 +--- a/net/sched/sch_dsmark.c ++++ b/net/sched/sch_dsmark.c +@@ -210,7 +210,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch, + if (p->set_tc_index) { + int wlen = skb_network_offset(skb); + +- switch (tc_skb_protocol(skb)) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + wlen += sizeof(struct iphdr); + if (!pskb_may_pull(skb, wlen) || +@@ -303,7 +303,7 @@ static struct sk_buff *dsmark_dequeue(struct Qdisc *sch) + index = skb->tc_index & (p->indices - 1); + pr_debug("index %d->%d\n", skb->tc_index, index); + +- switch (tc_skb_protocol(skb)) { ++ switch (skb_protocol(skb, true)) { + case htons(ETH_P_IP): + ipv4_change_dsfield(ip_hdr(skb), p->mv[index].mask, + p->mv[index].value); +@@ -320,7 +320,7 @@ static struct sk_buff *dsmark_dequeue(struct Qdisc *sch) + */ + if (p->mv[index].mask != 0xff || p->mv[index].value) + pr_warn("%s: unsupported protocol %d\n", +- __func__, ntohs(tc_skb_protocol(skb))); ++ __func__, ntohs(skb_protocol(skb, true))); + break; + } + +diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c +index 689ef6f3ded8..2f1f0a378408 100644 +--- a/net/sched/sch_teql.c ++++ b/net/sched/sch_teql.c +@@ -239,7 +239,7 @@ __teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, + char haddr[MAX_ADDR_LEN]; + + neigh_ha_snapshot(haddr, n, dev); +- err = dev_hard_header(skb, dev, ntohs(tc_skb_protocol(skb)), ++ err = dev_hard_header(skb, dev, ntohs(skb_protocol(skb, false)), + haddr, NULL, skb->len); + + if (err < 0) +diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c +index c56e6cfc4a62..21970185485f 100644 +--- a/net/sunrpc/xprtrdma/rpc_rdma.c ++++ b/net/sunrpc/xprtrdma/rpc_rdma.c +@@ -71,7 +71,7 @@ static unsigned int rpcrdma_max_call_header_size(unsigned int maxsegs) + size = RPCRDMA_HDRLEN_MIN; + + /* Maximum Read list size */ +- size = maxsegs * rpcrdma_readchunk_maxsz * sizeof(__be32); ++ size += maxsegs * rpcrdma_readchunk_maxsz * sizeof(__be32); + + /* Minimal Read chunk size */ + size += sizeof(__be32); /* segment count */ +@@ -96,7 +96,7 @@ static unsigned int rpcrdma_max_reply_header_size(unsigned int maxsegs) + size = RPCRDMA_HDRLEN_MIN; + + /* Maximum Write list size */ +- size = sizeof(__be32); /* segment count */ ++ size += sizeof(__be32); /* segment count */ + size += maxsegs * rpcrdma_segment_maxsz * sizeof(__be32); + size += sizeof(__be32); /* list discriminator */ + +diff --git a/security/apparmor/match.c b/security/apparmor/match.c +index 6ccd3734a841..43669403f755 100644 +--- a/security/apparmor/match.c ++++ b/security/apparmor/match.c +@@ -97,6 +97,9 @@ static struct table_header *unpack_table(char *blob, size_t bsize) + th.td_flags == YYTD_DATA8)) + goto out; + ++ /* if we have a table it must have some entries */ ++ if (th.td_lolen == 0) ++ goto out; + tsize = table_size(th.td_lolen, th.td_flags); + if (bsize < tsize) + goto out; +@@ -198,6 +201,8 @@ static int verify_dfa(struct aa_dfa *dfa) + + state_count = dfa->tables[YYTD_ID_BASE]->td_lolen; + trans_count = dfa->tables[YYTD_ID_NXT]->td_lolen; ++ if (state_count == 0) ++ goto out; + for (i = 0; i < state_count; i++) { + if (!(BASE_TABLE(dfa)[i] & MATCH_FLAG_DIFF_ENCODE) && + (DEFAULT_TABLE(dfa)[i] >= state_count)) +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index 160e00e8007a..6ffdf3d2d526 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -6117,6 +6117,8 @@ enum { + ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS, + ALC269VC_FIXUP_ACER_HEADSET_MIC, + ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE, ++ ALC289_FIXUP_ASUS_G401, ++ ALC256_FIXUP_ACER_MIC_NO_PRESENCE, + }; + + static const struct hda_fixup alc269_fixups[] = { +@@ -7082,7 +7084,7 @@ static const struct hda_fixup alc269_fixups[] = { + { } + }, + .chained = true, +- .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC ++ .chain_id = ALC269_FIXUP_HEADSET_MIC + }, + [ALC294_FIXUP_ASUS_HEADSET_MIC] = { + .type = HDA_FIXUP_PINS, +@@ -7091,7 +7093,7 @@ static const struct hda_fixup alc269_fixups[] = { + { } + }, + .chained = true, +- .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC ++ .chain_id = ALC269_FIXUP_HEADSET_MIC + }, + [ALC294_FIXUP_ASUS_SPK] = { + .type = HDA_FIXUP_VERBS, +@@ -7099,6 +7101,8 @@ static const struct hda_fixup alc269_fixups[] = { + /* Set EAPD high */ + { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 }, + { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 }, ++ { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f }, ++ { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 }, + { } + }, + .chained = true, +@@ -7324,6 +7328,22 @@ static const struct hda_fixup alc269_fixups[] = { + .chained = true, + .chain_id = ALC269_FIXUP_HEADSET_MIC + }, ++ [ALC289_FIXUP_ASUS_G401] = { ++ .type = HDA_FIXUP_PINS, ++ .v.pins = (const struct hda_pintbl[]) { ++ { 0x19, 0x03a11020 }, /* headset mic with jack detect */ ++ { } ++ }, ++ }, ++ [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = { ++ .type = HDA_FIXUP_PINS, ++ .v.pins = (const struct hda_pintbl[]) { ++ { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */ ++ { } ++ }, ++ .chained = true, ++ .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE ++ }, + }; + + static const struct snd_pci_quirk alc269_fixup_tbl[] = { +@@ -7352,6 +7372,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), + SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC), + SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC), ++ SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), + SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), + SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X), +@@ -7495,6 +7516,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { + SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK), + SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC), + SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC), ++ SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE), + SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE), + SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), +@@ -7504,6 +7526,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { + SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), + SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC), ++ SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_G401), + SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2), + SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC), + SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC), +diff --git a/sound/usb/card.c b/sound/usb/card.c +index f9a64e9526f5..230d862cfa3a 100644 +--- a/sound/usb/card.c ++++ b/sound/usb/card.c +@@ -659,10 +659,14 @@ static int usb_audio_probe(struct usb_interface *intf, + goto __error; + } + +- /* we are allowed to call snd_card_register() many times */ +- err = snd_card_register(chip->card); +- if (err < 0) +- goto __error; ++ /* we are allowed to call snd_card_register() many times, but first ++ * check to see if a device needs to skip it or do anything special ++ */ ++ if (!snd_usb_registration_quirk(chip, ifnum)) { ++ err = snd_card_register(chip->card); ++ if (err < 0) ++ goto __error; ++ } + + if (quirk && quirk->shares_media_device) { + /* don't want to fail when snd_media_device_create() fails */ +diff --git a/sound/usb/clock.c b/sound/usb/clock.c +index a48313dfa967..b118cf97607f 100644 +--- a/sound/usb/clock.c ++++ b/sound/usb/clock.c +@@ -151,16 +151,15 @@ static int uac_clock_selector_set_val(struct snd_usb_audio *chip, int selector_i + return ret; + } + +-/* +- * Assume the clock is valid if clock source supports only one single sample +- * rate, the terminal is connected directly to it (there is no clock selector) +- * and clock type is internal. This is to deal with some Denon DJ controllers +- * that always reports that clock is invalid. +- */ + static bool uac_clock_source_is_valid_quirk(struct snd_usb_audio *chip, + struct audioformat *fmt, + int source_id) + { ++ bool ret = false; ++ int count; ++ unsigned char data; ++ struct usb_device *dev = chip->dev; ++ + if (fmt->protocol == UAC_VERSION_2) { + struct uac_clock_source_descriptor *cs_desc = + snd_usb_find_clock_source(chip->ctrl_intf, source_id); +@@ -168,13 +167,51 @@ static bool uac_clock_source_is_valid_quirk(struct snd_usb_audio *chip, + if (!cs_desc) + return false; + +- return (fmt->nr_rates == 1 && +- (fmt->clock & 0xff) == cs_desc->bClockID && +- (cs_desc->bmAttributes & 0x3) != +- UAC_CLOCK_SOURCE_TYPE_EXT); ++ /* ++ * Assume the clock is valid if clock source supports only one ++ * single sample rate, the terminal is connected directly to it ++ * (there is no clock selector) and clock type is internal. ++ * This is to deal with some Denon DJ controllers that always ++ * reports that clock is invalid. ++ */ ++ if (fmt->nr_rates == 1 && ++ (fmt->clock & 0xff) == cs_desc->bClockID && ++ (cs_desc->bmAttributes & 0x3) != ++ UAC_CLOCK_SOURCE_TYPE_EXT) ++ return true; ++ } ++ ++ /* ++ * MOTU MicroBook IIc ++ * Sample rate changes takes more than 2 seconds for this device. Clock ++ * validity request returns false during that period. ++ */ ++ if (chip->usb_id == USB_ID(0x07fd, 0x0004)) { ++ count = 0; ++ ++ while ((!ret) && (count < 50)) { ++ int err; ++ ++ msleep(100); ++ ++ err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, ++ USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, ++ UAC2_CS_CONTROL_CLOCK_VALID << 8, ++ snd_usb_ctrl_intf(chip) | (source_id << 8), ++ &data, sizeof(data)); ++ if (err < 0) { ++ dev_warn(&dev->dev, ++ "%s(): cannot get clock validity for id %d\n", ++ __func__, source_id); ++ return false; ++ } ++ ++ ret = !!data; ++ count++; ++ } + } + +- return false; ++ return ret; + } + + static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, +diff --git a/sound/usb/line6/capture.c b/sound/usb/line6/capture.c +index 82abef3fe90d..4b6e99e055dc 100644 +--- a/sound/usb/line6/capture.c ++++ b/sound/usb/line6/capture.c +@@ -287,6 +287,8 @@ int line6_create_audio_in_urbs(struct snd_line6_pcm *line6pcm) + urb->interval = LINE6_ISO_INTERVAL; + urb->error_count = 0; + urb->complete = audio_in_callback; ++ if (usb_urb_ep_type_check(urb)) ++ return -EINVAL; + } + + return 0; +diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c +index 4f096685ed65..0caf53f5764c 100644 +--- a/sound/usb/line6/driver.c ++++ b/sound/usb/line6/driver.c +@@ -820,7 +820,7 @@ void line6_disconnect(struct usb_interface *interface) + if (WARN_ON(usbdev != line6->usbdev)) + return; + +- cancel_delayed_work(&line6->startup_work); ++ cancel_delayed_work_sync(&line6->startup_work); + + if (line6->urb_listen != NULL) + line6_stop_listen(line6); +diff --git a/sound/usb/line6/playback.c b/sound/usb/line6/playback.c +index 2e8ead3f9bc2..797ced329b79 100644 +--- a/sound/usb/line6/playback.c ++++ b/sound/usb/line6/playback.c +@@ -432,6 +432,8 @@ int line6_create_audio_out_urbs(struct snd_line6_pcm *line6pcm) + urb->interval = LINE6_ISO_INTERVAL; + urb->error_count = 0; + urb->complete = audio_out_callback; ++ if (usb_urb_ep_type_check(urb)) ++ return -EINVAL; + } + + return 0; +diff --git a/sound/usb/midi.c b/sound/usb/midi.c +index b737f0ec77d0..0cb4142b05f6 100644 +--- a/sound/usb/midi.c ++++ b/sound/usb/midi.c +@@ -1499,6 +1499,8 @@ void snd_usbmidi_disconnect(struct list_head *p) + spin_unlock_irq(&umidi->disc_lock); + up_write(&umidi->disc_rwsem); + ++ del_timer_sync(&umidi->error_timer); ++ + for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { + struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; + if (ep->out) +@@ -1525,7 +1527,6 @@ void snd_usbmidi_disconnect(struct list_head *p) + ep->in = NULL; + } + } +- del_timer_sync(&umidi->error_timer); + } + EXPORT_SYMBOL(snd_usbmidi_disconnect); + +@@ -2282,16 +2283,22 @@ void snd_usbmidi_input_stop(struct list_head *p) + } + EXPORT_SYMBOL(snd_usbmidi_input_stop); + +-static void snd_usbmidi_input_start_ep(struct snd_usb_midi_in_endpoint *ep) ++static void snd_usbmidi_input_start_ep(struct snd_usb_midi *umidi, ++ struct snd_usb_midi_in_endpoint *ep) + { + unsigned int i; ++ unsigned long flags; + + if (!ep) + return; + for (i = 0; i < INPUT_URBS; ++i) { + struct urb *urb = ep->urbs[i]; +- urb->dev = ep->umidi->dev; +- snd_usbmidi_submit_urb(urb, GFP_KERNEL); ++ spin_lock_irqsave(&umidi->disc_lock, flags); ++ if (!atomic_read(&urb->use_count)) { ++ urb->dev = ep->umidi->dev; ++ snd_usbmidi_submit_urb(urb, GFP_ATOMIC); ++ } ++ spin_unlock_irqrestore(&umidi->disc_lock, flags); + } + } + +@@ -2307,7 +2314,7 @@ void snd_usbmidi_input_start(struct list_head *p) + if (umidi->input_running || !umidi->opened[1]) + return; + for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) +- snd_usbmidi_input_start_ep(umidi->endpoints[i].in); ++ snd_usbmidi_input_start_ep(umidi, umidi->endpoints[i].in); + umidi->input_running = 1; + } + EXPORT_SYMBOL(snd_usbmidi_input_start); +diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c +index d5706b8b68a1..086244c70743 100644 +--- a/sound/usb/pcm.c ++++ b/sound/usb/pcm.c +@@ -344,7 +344,12 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, + ep = 0x81; + ifnum = 1; + goto add_sync_ep_from_ifnum; +- case USB_ID(0x07fd, 0x0004): /* MOTU MicroBook II */ ++ case USB_ID(0x07fd, 0x0004): /* MOTU MicroBook II/IIc */ ++ /* MicroBook IIc */ ++ if (altsd->bInterfaceClass == USB_CLASS_AUDIO) ++ return 0; ++ ++ /* MicroBook II */ + ep = 0x84; + ifnum = 0; + goto add_sync_ep_from_ifnum; +diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h +index 8d1805d9e5a7..562179492a33 100644 +--- a/sound/usb/quirks-table.h ++++ b/sound/usb/quirks-table.h +@@ -2776,90 +2776,6 @@ YAMAHA_DEVICE(0x7010, "UB99"), + .type = QUIRK_MIDI_NOVATION + } + }, +-{ +- /* +- * Focusrite Scarlett Solo 2nd generation +- * Reports that playback should use Synch: Synchronous +- * while still providing a feedback endpoint. Synchronous causes +- * snapping on some sample rates. +- * Force it to use Synch: Asynchronous. +- */ +- USB_DEVICE(0x1235, 0x8205), +- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { +- .ifnum = QUIRK_ANY_INTERFACE, +- .type = QUIRK_COMPOSITE, +- .data = (const struct snd_usb_audio_quirk[]) { +- { +- .ifnum = 1, +- .type = QUIRK_AUDIO_FIXED_ENDPOINT, +- .data = & (const struct audioformat) { +- .formats = SNDRV_PCM_FMTBIT_S32_LE, +- .channels = 2, +- .iface = 1, +- .altsetting = 1, +- .altset_idx = 1, +- .attributes = 0, +- .endpoint = 0x01, +- .ep_attr = USB_ENDPOINT_XFER_ISOC | +- USB_ENDPOINT_SYNC_ASYNC, +- .protocol = UAC_VERSION_2, +- .rates = SNDRV_PCM_RATE_44100 | +- SNDRV_PCM_RATE_48000 | +- SNDRV_PCM_RATE_88200 | +- SNDRV_PCM_RATE_96000 | +- SNDRV_PCM_RATE_176400 | +- SNDRV_PCM_RATE_192000, +- .rate_min = 44100, +- .rate_max = 192000, +- .nr_rates = 6, +- .rate_table = (unsigned int[]) { +- 44100, 48000, 88200, +- 96000, 176400, 192000 +- }, +- .clock = 41 +- } +- }, +- { +- .ifnum = 2, +- .type = QUIRK_AUDIO_FIXED_ENDPOINT, +- .data = & (const struct audioformat) { +- .formats = SNDRV_PCM_FMTBIT_S32_LE, +- .channels = 2, +- .iface = 2, +- .altsetting = 1, +- .altset_idx = 1, +- .attributes = 0, +- .endpoint = 0x82, +- .ep_attr = USB_ENDPOINT_XFER_ISOC | +- USB_ENDPOINT_SYNC_ASYNC | +- USB_ENDPOINT_USAGE_IMPLICIT_FB, +- .protocol = UAC_VERSION_2, +- .rates = SNDRV_PCM_RATE_44100 | +- SNDRV_PCM_RATE_48000 | +- SNDRV_PCM_RATE_88200 | +- SNDRV_PCM_RATE_96000 | +- SNDRV_PCM_RATE_176400 | +- SNDRV_PCM_RATE_192000, +- .rate_min = 44100, +- .rate_max = 192000, +- .nr_rates = 6, +- .rate_table = (unsigned int[]) { +- 44100, 48000, 88200, +- 96000, 176400, 192000 +- }, +- .clock = 41 +- } +- }, +- { +- .ifnum = 3, +- .type = QUIRK_IGNORE_INTERFACE +- }, +- { +- .ifnum = -1 +- } +- } +- } +-}, + + /* Access Music devices */ + { +@@ -3492,7 +3408,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), + }, + /* MOTU Microbook II */ + { +- USB_DEVICE(0x07fd, 0x0004), ++ USB_DEVICE_VENDOR_SPEC(0x07fd, 0x0004), + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { + .vendor_name = "MOTU", + .product_name = "MicroBookII", +diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c +index bf5083a20b6d..a8bb953cc468 100644 +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -1316,7 +1316,15 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, + case USB_ID(0x2466, 0x8010): /* Fractal Audio Axe-Fx 3 */ + return snd_usb_axefx3_boot_quirk(dev); + case USB_ID(0x07fd, 0x0004): /* MOTU MicroBook II */ +- return snd_usb_motu_microbookii_boot_quirk(dev); ++ /* ++ * For some reason interface 3 with vendor-spec class is ++ * detected on MicroBook IIc. ++ */ ++ if (get_iface_desc(intf->altsetting)->bInterfaceClass == ++ USB_CLASS_VENDOR_SPEC && ++ get_iface_desc(intf->altsetting)->bInterfaceNumber < 3) ++ return snd_usb_motu_microbookii_boot_quirk(dev); ++ break; + } + + return 0; +@@ -1764,5 +1772,62 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip, + else + fp->ep_attr |= USB_ENDPOINT_SYNC_SYNC; + break; ++ case USB_ID(0x07fd, 0x0004): /* MOTU MicroBook IIc */ ++ /* ++ * MaxPacketsOnly attribute is erroneously set in endpoint ++ * descriptors. As a result this card produces noise with ++ * all sample rates other than 96 KHz. ++ */ ++ fp->attributes &= ~UAC_EP_CS_ATTR_FILL_MAX; ++ break; ++ case USB_ID(0x1235, 0x8202): /* Focusrite Scarlett 2i2 2nd gen */ ++ case USB_ID(0x1235, 0x8205): /* Focusrite Scarlett Solo 2nd gen */ ++ /* ++ * Reports that playback should use Synch: Synchronous ++ * while still providing a feedback endpoint. ++ * Synchronous causes snapping on some sample rates. ++ * Force it to use Synch: Asynchronous. ++ */ ++ if (stream == SNDRV_PCM_STREAM_PLAYBACK) { ++ fp->ep_attr &= ~USB_ENDPOINT_SYNCTYPE; ++ fp->ep_attr |= USB_ENDPOINT_SYNC_ASYNC; ++ } ++ break; + } + } ++ ++/* ++ * registration quirk: ++ * the registration is skipped if a device matches with the given ID, ++ * unless the interface reaches to the defined one. This is for delaying ++ * the registration until the last known interface, so that the card and ++ * devices appear at the same time. ++ */ ++ ++struct registration_quirk { ++ unsigned int usb_id; /* composed via USB_ID() */ ++ unsigned int interface; /* the interface to trigger register */ ++}; ++ ++#define REG_QUIRK_ENTRY(vendor, product, iface) \ ++ { .usb_id = USB_ID(vendor, product), .interface = (iface) } ++ ++static const struct registration_quirk registration_quirks[] = { ++ REG_QUIRK_ENTRY(0x0951, 0x16d8, 2), /* Kingston HyperX AMP */ ++ REG_QUIRK_ENTRY(0x0951, 0x16ed, 2), /* Kingston HyperX Cloud Alpha S */ ++ REG_QUIRK_ENTRY(0x0951, 0x16ea, 2), /* Kingston HyperX Cloud Flight S */ ++ { 0 } /* terminator */ ++}; ++ ++/* return true if skipping registration */ ++bool snd_usb_registration_quirk(struct snd_usb_audio *chip, int iface) ++{ ++ const struct registration_quirk *q; ++ ++ for (q = registration_quirks; q->usb_id; q++) ++ if (chip->usb_id == q->usb_id) ++ return iface != q->interface; ++ ++ /* Register as normal */ ++ return false; ++} +diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h +index df0355843a4c..c76cf24a640a 100644 +--- a/sound/usb/quirks.h ++++ b/sound/usb/quirks.h +@@ -51,4 +51,6 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip, + struct audioformat *fp, + int stream); + ++bool snd_usb_registration_quirk(struct snd_usb_audio *chip, int iface); ++ + #endif /* __USBAUDIO_QUIRKS_H */ +diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c +index ebdd130557fb..5156aa971fbb 100644 +--- a/tools/perf/util/stat.c ++++ b/tools/perf/util/stat.c +@@ -367,8 +367,10 @@ int perf_stat_process_counter(struct perf_stat_config *config, + * interval mode, otherwise overall avg running + * averages will be shown for each interval. + */ +- if (config->interval) +- init_stats(ps->res_stats); ++ if (config->interval) { ++ for (i = 0; i < 3; i++) ++ init_stats(&ps->res_stats[i]); ++ } + + if (counter->per_pkg) + zero_per_pkg(counter); +diff --git a/tools/testing/selftests/net/fib_nexthops.sh b/tools/testing/selftests/net/fib_nexthops.sh +index 6560ed796ac4..09830b88ec8c 100755 +--- a/tools/testing/selftests/net/fib_nexthops.sh ++++ b/tools/testing/selftests/net/fib_nexthops.sh +@@ -512,6 +512,19 @@ ipv6_fcnal_runtime() + run_cmd "$IP nexthop add id 86 via 2001:db8:91::2 dev veth1" + run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81" + ++ # rpfilter and default route ++ $IP nexthop flush >/dev/null 2>&1 ++ run_cmd "ip netns exec me ip6tables -t mangle -I PREROUTING 1 -m rpfilter --invert -j DROP" ++ run_cmd "$IP nexthop add id 91 via 2001:db8:91::2 dev veth1" ++ run_cmd "$IP nexthop add id 92 via 2001:db8:92::2 dev veth3" ++ run_cmd "$IP nexthop add id 93 group 91/92" ++ run_cmd "$IP -6 ro add default nhid 91" ++ run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" ++ log_test $? 0 "Nexthop with default route and rpfilter" ++ run_cmd "$IP -6 ro replace default nhid 93" ++ run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" ++ log_test $? 0 "Nexthop with multipath default route and rpfilter" ++ + # TO-DO: + # existing route with old nexthop; append route with new nexthop + # existing route with old nexthop; replace route with new |