From e867773d15cfaf94c5b5ee980b16cd7a9684e813 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Sun, 2 Feb 2020 23:54:59 +0100 Subject: [PATCH 01/54] Enable Ubuntu Focal in expert mode. It can be build now. --- lib/main.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/main.sh b/lib/main.sh index dca8aac7f0..7ce11bd995 100644 --- a/lib/main.sh +++ b/lib/main.sh @@ -300,8 +300,7 @@ if [[ $KERNEL_ONLY != yes && -z $RELEASE ]]; then distro_menu "xenial" distro_menu "bionic" distro_menu "eoan" - # chroot completly broken atm, disable for now - # distro_menu "focal" + distro_menu "focal" RELEASE=$(dialog --stdout --title "Choose a release" --backtitle "$backtitle" \ --menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}") From 70c3a79c3e257d3a154f37563029aac32c093a04 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Sun, 2 Feb 2020 23:56:32 +0100 Subject: [PATCH 02/54] Backend / repository management fixes and improvements --- lib/build-all-ng.sh | 6 ++++-- lib/general.sh | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/lib/build-all-ng.sh b/lib/build-all-ng.sh index b4750a79ac..29f46509ce 100644 --- a/lib/build-all-ng.sh +++ b/lib/build-all-ng.sh @@ -226,14 +226,16 @@ function build_all() # small optimisation. we only (try to) build needed kernels if [[ $KERNEL_ONLY == yes ]]; then - array_contains ARRAY "${BOARDFAMILY}${BRANCH}${BUILD_STABILITY}" && continue + LINUXFAMILY="${BOARDFAMILY}" + source "${SRC}/config/sources/families/${BOARDFAMILY}.conf" 2> /dev/null + array_contains ARRAY "${LINUXFAMILY}${BRANCH}${BUILD_STABILITY}" && continue elif [[ $BUILD_IMAGE == no ]] ; then continue fi - ARRAY+=("${BOARDFAMILY}${BRANCH}${BUILD_STABILITY}") + ARRAY+=("${LINUXFAMILY}${BRANCH}${BUILD_STABILITY}") BUILD_DESKTOP="no" BUILD_MINIMAL="no" diff --git a/lib/general.sh b/lib/general.sh index b908b25996..765330bf8e 100644 --- a/lib/general.sh +++ b/lib/general.sh @@ -574,7 +574,7 @@ repo-manipulate() { serve) # display repository content display_alert "Serving content" "common utils" "ext" - aptly serve -listen=$(ip -f inet addr | grep -Po 'inet \K[\d.]+' | grep -v 127.0.0.1):8080 -config="${SCRIPTPATH}"config/${REPO_CONFIG} + aptly serve -listen=$(ip -f inet addr | grep -Po 'inet \K[\d.]+' | grep -v 127.0.0.1 | head -1):8080 -config="${SCRIPTPATH}"config/${REPO_CONFIG} exit 0 ;; show) @@ -589,6 +589,41 @@ repo-manipulate() { echo "done." exit 0 ;; + + unique) + IFS=$'\n' + while true; do + LIST=() + for release in "${DISTROS[@]}"; do + LIST+=( $(aptly repo show -with-packages -config="${SCRIPTPATH}"config/${REPO_CONFIG} "${release}" | tail -n +7) ) + LIST+=( $(aptly repo show -with-packages -config="${SCRIPTPATH}"config/${REPO_CONFIG} "${release}-desktop" | tail -n +7) ) + done + LIST+=( $(aptly repo show -with-packages -config="${SCRIPTPATH}"config/${REPO_CONFIG} utils | tail -n +7) ) + LIST=( $(echo "${LIST[@]}" | tr ' ' '\n' | sort -u)) + new_list=() + # create a human readable menu + for ((n=0;n<$((${#LIST[@]}));n++)); + do + new_list+=( "${LIST[$n]}" ) + new_list+=( "" ) + done + LIST=("${new_list[@]}") + LIST_LENGTH=$((${#LIST[@]}/2)); + exec 3>&1 + TARGET_VERSION=$(dialog --cancel-label "Cancel" --backtitle "BACKTITLE" --no-collapse --title "Switch from and reboot" --clear --menu "Delete" $((9+${LIST_LENGTH})) 82 65 "${LIST[@]}" 2>&1 1>&3) + exitstatus=$?; + exec 3>&- + if [[ $exitstatus -eq 0 ]]; then + for release in "${DISTROS[@]}"; do + aptly repo remove -config="${SCRIPTPATH}"config/${REPO_CONFIG} "${release}" "$TARGET_VERSION" + aptly repo remove -config="${SCRIPTPATH}"config/${REPO_CONFIG} "${release}-desktop" "$TARGET_VERSION" + done + aptly repo remove -config="${SCRIPTPATH}"config/${REPO_CONFIG} "utils" "$TARGET_VERSION" + else + exit 1 + fi + done + ;; update) # display full help test # run repository update @@ -599,6 +634,7 @@ repo-manipulate() { ;; purge) for release in "${DISTROS[@]}"; do + aptly repo remove -config=${BLTPATH}config/aptly.conf "${release}" 'Name (% linux-*dev*)' repo-remove-old-packages "$release" "armhf" "3" repo-remove-old-packages "$release" "arm64" "3" repo-remove-old-packages "$release" "all" "3" From 18b24717be9639b65b86db3dbcf2b42fe73ca12c Mon Sep 17 00:00:00 2001 From: tonymac32 Date: Sun, 2 Feb 2020 18:26:14 -0500 Subject: [PATCH 03/54] [ rockchip64 ] rk3328 and renegade sound and dts clean Adds k5.5 audio pipeline dts entries, adds audio to Renegade, cleans up some dts mess in renegade - Note: PulseAudio seems to need to toggle a couple times before audio will play. That is not addressed in this patch. --- .../add-RK3328-audio-path.patch | 66 +++++ .../rk3328-audio-and-renegade-supplies.patch | 268 ++++++++++++++++++ 2 files changed, 334 insertions(+) create mode 100644 patch/kernel/rockchip64-current/add-RK3328-audio-path.patch create mode 100644 patch/kernel/rockchip64-current/rk3328-audio-and-renegade-supplies.patch diff --git a/patch/kernel/rockchip64-current/add-RK3328-audio-path.patch b/patch/kernel/rockchip64-current/add-RK3328-audio-path.patch new file mode 100644 index 0000000000..4ca6577208 --- /dev/null +++ b/patch/kernel/rockchip64-current/add-RK3328-audio-path.patch @@ -0,0 +1,66 @@ +From 29e8976e604f15838a71959ab853a802617113f9 Mon Sep 17 00:00:00 2001 +From: Robin Murphy +Date: Mon, 14 Oct 2019 23:19:05 +0100 +Subject: [PATCH] arm64: dts: rockchip: Add RK3328 audio pipelines + +The audio pipelines for HDMI and the analog codec are internal to the +SoC, so it makes sense to describe them at that level such that boards +need only enable the respective nodes for outputs they implement. + +Signed-off-by: Robin Murphy +Link: https://lore.kernel.org/r/a09c8d795e7a66fb7bc47af2b6580f6e8dbec91e.1571090991.git.robin.murphy@arm.com +Signed-off-by: Heiko Stuebner +--- + arch/arm64/boot/dts/rockchip/rk3328.dtsi | 32 ++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +index 31cc1541f1f59..91306ebed4da2 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -142,6 +142,22 @@ + }; + }; + ++ analog_sound: analog-sound { ++ compatible = "simple-audio-card"; ++ simple-audio-card,format = "i2s"; ++ simple-audio-card,mclk-fs = <256>; ++ simple-audio-card,name = "Analog"; ++ status = "disabled"; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&i2s1>; ++ }; ++ ++ simple-audio-card,codec { ++ sound-dai = <&codec>; ++ }; ++ }; ++ + arm-pmu { + compatible = "arm,cortex-a53-pmu"; + interrupts = , +@@ -156,6 +172,22 @@ + ports = <&vop_out>; + }; + ++ hdmi_sound: hdmi-sound { ++ compatible = "simple-audio-card"; ++ simple-audio-card,format = "i2s"; ++ simple-audio-card,mclk-fs = <128>; ++ simple-audio-card,name = "HDMI"; ++ status = "disabled"; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&i2s0>; ++ }; ++ ++ simple-audio-card,codec { ++ sound-dai = <&hdmi>; ++ }; ++ }; ++ + psci { + compatible = "arm,psci-1.0", "arm,psci-0.2"; + method = "smc"; diff --git a/patch/kernel/rockchip64-current/rk3328-audio-and-renegade-supplies.patch b/patch/kernel/rockchip64-current/rk3328-audio-and-renegade-supplies.patch new file mode 100644 index 0000000000..b5806e0792 --- /dev/null +++ b/patch/kernel/rockchip64-current/rk3328-audio-and-renegade-supplies.patch @@ -0,0 +1,268 @@ +diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +index f4b6799a8..a1041ec3e 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +@@ -21,32 +21,24 @@ + #clock-cells = <0>; + }; + +- dc_12v: dc-12v { +- compatible = "regulator-fixed"; +- regulator-name = "dc_12v"; +- regulator-always-on; +- regulator-boot-on; +- regulator-min-microvolt = <12000000>; +- regulator-max-microvolt = <12000000>; +- }; +- + vcc_sd: sdmmc-regulator { + compatible = "regulator-fixed"; +- gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; ++ gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0m1_gpio>; ++ regulator-boot-on; + regulator-name = "vcc_sd"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_io>; + }; + +- vcc_sdio: sdmmcio-regulator { ++ vccio_sd: sdmmcio-regulator { + compatible = "regulator-gpio"; + gpios = <&grf_gpio 0 GPIO_ACTIVE_HIGH>; + states = <1800000 0x1 + 3300000 0x0>; +- regulator-name = "vcc_sdio"; ++ regulator-name = "vccio_sd"; + regulator-type = "voltage"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; +@@ -68,11 +60,8 @@ + vcc_sys: vcc-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc_sys"; +- regulator-always-on; +- regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; +- vin-supply = <&dc_12v>; + }; + + vcc_phy: vcc-phy-regulator { +@@ -82,6 +71,13 @@ + regulator-boot-on; + }; + ++ ir-receiver { ++ compatible = "gpio-ir-receiver"; ++ gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>; ++ pinctrl-0 = <&ir_int>; ++ pinctrl-names = "default"; ++ }; ++ + leds { + compatible = "gpio-leds"; + +@@ -103,6 +99,15 @@ + }; + }; + ++&analog_sound { ++ simple-audio-card,name = "TRS Jack"; ++ status = "okay"; ++}; ++ ++&codec { ++ status = "okay"; ++}; ++ + &cpu0 { + cpu-supply = <&vdd_arm>; + }; +@@ -122,7 +127,6 @@ + &emmc { + bus-width = <8>; + cap-mmc-highspeed; +- max-frequency = <150000000>; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + non-removable; +@@ -152,6 +156,10 @@ + status = "okay"; + }; + ++&gpu { ++ mali-supply = <&vdd_logic>; ++}; ++ + &hdmi { + status = "okay"; + }; +@@ -160,6 +168,10 @@ + status = "okay"; + }; + ++&hdmi_sound { ++ status = "okay"; ++}; ++ + &i2c1 { + status = "okay"; + +@@ -187,8 +199,9 @@ + regulators { + vdd_logic: DCDC_REG1 { + regulator-name = "vdd_logic"; +- regulator-min-microvolt = <712500>; +- regulator-max-microvolt = <1450000>; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <1150000>; ++ regulator-ramp-delay = <12500>; + regulator-always-on; + regulator-boot-on; + regulator-state-mem { +@@ -199,8 +212,9 @@ + + vdd_arm: DCDC_REG2 { + regulator-name = "vdd_arm"; +- regulator-min-microvolt = <712500>; +- regulator-max-microvolt = <1450000>; ++ regulator-min-microvolt = <950000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <12500>; + regulator-always-on; + regulator-boot-on; + regulator-state-mem { +@@ -269,12 +283,20 @@ + }; + }; + ++&i2s0 { ++ status = "okay"; ++}; ++ ++&i2s1 { ++ status = "okay"; ++}; ++ + &io_domains { + status = "okay"; + + vccio1-supply = <&vcc_io>; + vccio2-supply = <&vcc18_emmc>; +- vccio3-supply = <&vcc_sdio>; ++ vccio3-supply = <&vccio_sd>; + vccio4-supply = <&vcc_18>; + vccio5-supply = <&vcc_io>; + vccio6-supply = <&vcc_io>; +@@ -282,6 +304,12 @@ + }; + + &pinctrl { ++ ir { ++ ir_int: ir-int { ++ rockchip,pins = <2 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ + pmic { + pmic_int_l: pmic-int-l { + rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; +@@ -308,11 +336,26 @@ + sd-uhs-sdr50; + sd-uhs-sdr104; + vmmc-supply = <&vcc_sd>; +- vqmmc-supply = <&vcc_sdio>; ++ vqmmc-supply = <&vccio_sd>; ++ status = "okay"; ++}; ++ ++&spdif { ++ pinctrl-0 = <&spdifm0_tx>; ++ status = "okay"; ++}; ++ ++&spdif_out { ++ status = "okay"; ++}; ++ ++&spdif_sound { + status = "okay"; + }; + + &tsadc { ++ rockchip,hw-tshut-mode = <0>; ++ rockchip,hw-tshut-polarity = <0>; + status = "okay"; + }; + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +index eedc25132..5c62f0116 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -198,6 +198,26 @@ + method = "smc"; + }; + ++ spdif_out: spdif-out { ++ compatible = "linux,spdif-dit"; ++ #sound-dai-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spdif_sound: spdif-sound { ++ compatible = "simple-audio-card"; ++ simple-audio-card,name = "SPDIF"; ++ status = "disabled"; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&spdif>; ++ }; ++ ++ simple-audio-card,codec { ++ sound-dai = <&spdif_out>; ++ }; ++ }; ++ + timer { + compatible = "arm,armv8-timer"; + interrupts = , +@@ -319,6 +339,12 @@ + }; + }; + ++ ++ pd_gpu@RK3328_PD_GPU { ++ reg = ; ++ clocks = <&cru ACLK_GPU>; ++ }; ++ + reboot-mode { + compatible = "syscon-reboot-mode"; + offset = <0x5c8>; +@@ -609,6 +635,7 @@ + "ppmmu1"; + clocks = <&cru ACLK_GPU>, <&cru ACLK_GPU>; + clock-names = "bus", "core"; ++ power-domains = <&power RK3328_PD_GPU>; + resets = <&cru SRST_GPU_A>; + }; + +@@ -781,6 +808,7 @@ + <&cru ACLK_BUS_PRE>, <&cru HCLK_BUS_PRE>, + <&cru PCLK_BUS_PRE>, <&cru ACLK_PERI_PRE>, + <&cru HCLK_PERI>, <&cru PCLK_PERI>, ++ <&cru ACLK_GPU>, + <&cru SCLK_RTC32K>; + assigned-clock-parents = + <&cru HDMIPHY>, <&cru PLL_APLL>, +@@ -802,6 +830,7 @@ + <150000000>, <75000000>, + <75000000>, <150000000>, + <75000000>, <75000000>, ++ <500000000>, + <32768>; + }; + From 7084a2d457e97d99636e46f3d91a14dfe51fe8ed Mon Sep 17 00:00:00 2001 From: tonymac32 Date: Mon, 3 Feb 2020 00:28:23 -0500 Subject: [PATCH 04/54] [ rockchip64 ] Rock64 add audio --- .../board-rock64-add-audio.patch | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 patch/kernel/rockchip64-current/board-rock64-add-audio.patch diff --git a/patch/kernel/rockchip64-current/board-rock64-add-audio.patch b/patch/kernel/rockchip64-current/board-rock64-add-audio.patch new file mode 100644 index 0000000000..8799c0a6f6 --- /dev/null +++ b/patch/kernel/rockchip64-current/board-rock64-add-audio.patch @@ -0,0 +1,90 @@ +diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +index f97446924..d9a1cb24a 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +@@ -83,34 +83,14 @@ + linux,default-trigger = "heartbeat"; + }; + }; ++}; + +- sound { +- compatible = "audio-graph-card"; +- label = "rockchip,rk3328"; +- dais = <&i2s1_p0 +- &spdif_p0>; +- }; +- +- spdif-dit { +- compatible = "linux,spdif-dit"; +- #sound-dai-cells = <0>; +- +- port { +- dit_p0_0: endpoint { +- remote-endpoint = <&spdif_p0_0>; +- }; +- }; +- }; ++&analog_sound { ++ status = "okay"; + }; + + &codec { + status = "okay"; +- +- port@0 { +- codec_p0_0: endpoint { +- remote-endpoint = <&i2s1_p0_0>; +- }; +- }; + }; + + &cpu0 { +@@ -166,6 +146,10 @@ + status = "okay"; + }; + ++&hdmi_sound { ++ stratus = "okay"; ++}; ++ + &i2c1 { + status = "okay"; + +@@ -277,16 +261,12 @@ + }; + }; + +-&i2s1 { ++&i2s0 { + status = "okay"; ++}; + +- i2s1_p0: port { +- i2s1_p0_0: endpoint { +- dai-format = "i2s"; +- mclk-fs = <256>; +- remote-endpoint = <&codec_p0_0>; +- }; +- }; ++&i2s1 { ++ status = "okay"; + }; + + &io_domains { +@@ -336,12 +316,10 @@ + &spdif { + pinctrl-0 = <&spdifm0_tx>; + status = "okay"; ++}; + +- spdif_p0: port { +- spdif_p0_0: endpoint { +- remote-endpoint = <&dit_p0_0>; +- }; +- }; ++&spdif_sound { ++ status = "okay"; + }; + + &spi0 { From 64e494384b546be7ba35b32a1ab904389fed4e35 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Mon, 3 Feb 2020 12:14:40 -0500 Subject: [PATCH 05/54] add UART2 to BPiM2Ultra and BPiM2Berry --- .../add-uart2-bpim2ultra-bpim2berry.patch | 34 +++++++++++++++++++ .../add-uart2_pi_pins-to-sun8i-r40.patch | 16 +++++++++ 2 files changed, 50 insertions(+) create mode 100644 patch/kernel/sunxi-dev/add-uart2-bpim2ultra-bpim2berry.patch create mode 100644 patch/kernel/sunxi-dev/add-uart2_pi_pins-to-sun8i-r40.patch diff --git a/patch/kernel/sunxi-dev/add-uart2-bpim2ultra-bpim2berry.patch b/patch/kernel/sunxi-dev/add-uart2-bpim2ultra-bpim2berry.patch new file mode 100644 index 0000000000..a542185502 --- /dev/null +++ b/patch/kernel/sunxi-dev/add-uart2-bpim2ultra-bpim2berry.patch @@ -0,0 +1,34 @@ +diff --git a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts +index 42d62d1..4a8362e 100644 +--- a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts ++++ b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts +@@ -305,6 +305,12 @@ + status = "okay"; + }; + ++&uart2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart2_pi_pins>; ++ status = "okay"; ++}; ++ + &uart3 { + pinctrl-names = "default"; + pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>; +diff --git a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts +index 15c22b0..5c0b7ba 100644 +--- a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts ++++ b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts +@@ -280,6 +280,12 @@ + status = "okay"; + }; + ++&uart2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart2_pi_pins>; ++ status = "okay"; ++}; ++ + &uart3 { + pinctrl-names = "default"; + pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>; diff --git a/patch/kernel/sunxi-dev/add-uart2_pi_pins-to-sun8i-r40.patch b/patch/kernel/sunxi-dev/add-uart2_pi_pins-to-sun8i-r40.patch new file mode 100644 index 0000000000..9aca99a7c7 --- /dev/null +++ b/patch/kernel/sunxi-dev/add-uart2_pi_pins-to-sun8i-r40.patch @@ -0,0 +1,16 @@ +diff --git a/arch/arm/boot/dts/sun8i-r40.dtsi b/arch/arm/boot/dts/sun8i-r40.dtsi +index 421dfbb..ae64248 100644 +--- a/arch/arm/boot/dts/sun8i-r40.dtsi ++++ b/arch/arm/boot/dts/sun8i-r40.dtsi +@@ -403,6 +420,11 @@ + function = "uart0"; + }; + ++ uart2_pi_pins: uart2-pi-pins { ++ pins = "PI18", "PI19"; ++ function = "uart2"; ++ }; ++ + uart3_pg_pins: uart3-pg-pins { + pins = "PG6", "PG7"; + function = "uart3"; From bfdedeee112d5399fc7a5a8ab0ca2b94926d0070 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Tue, 4 Feb 2020 15:57:49 +0100 Subject: [PATCH 06/54] Cosmetic fix. Wrong coloring on welcome screen. --- packages/bsp/common/etc/update-motd.d/10-armbian-header | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bsp/common/etc/update-motd.d/10-armbian-header b/packages/bsp/common/etc/update-motd.d/10-armbian-header index 28ab0c9973..f3f2b4f257 100755 --- a/packages/bsp/common/etc/update-motd.d/10-armbian-header +++ b/packages/bsp/common/etc/update-motd.d/10-armbian-header @@ -41,4 +41,4 @@ if [[ -n $DISTRIBUTION_STATUS && $DISTRIBUTION_STATUS != supported ]]; then UNSUPPORTED_TEXT+="unsupported ($DISTRIBUTION_CODENAME) userspace!" fi -[[ -n $UNSUPPORTED_TEXT ]] && echo -e "\e[0;91mNo end-user support: \x1B[0m$UNSUPPORTED_TEXT \e[0;91m\n" +[[ -n $UNSUPPORTED_TEXT ]] && echo -e "\e[0;91mNo end-user support: \x1B[0m$UNSUPPORTED_TEXT\n" From 0ca5a8dd29dc71628457cc371ed190a532a3b349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Pe=C4=8Dovnik?= Date: Tue, 4 Feb 2020 18:25:30 +0100 Subject: [PATCH 07/54] Bugfix - Network manager randomizing MAC (#1780) --- lib/makeboarddeb.sh | 4 ---- packages/bsp/10-override-random-mac.conf | 2 -- .../conf.d/10-override-wifi-random-mac-disable.conf | 5 +++++ .../conf.d/20-override-wifi-powersave-disable.conf} | 0 4 files changed, 5 insertions(+), 6 deletions(-) delete mode 100644 packages/bsp/10-override-random-mac.conf create mode 100644 packages/bsp/common/etc/NetworkManager/conf.d/10-override-wifi-random-mac-disable.conf rename packages/bsp/{zz-override-wifi-powersave-off.conf => common/etc/NetworkManager/conf.d/20-override-wifi-powersave-disable.conf} (100%) diff --git a/lib/makeboarddeb.sh b/lib/makeboarddeb.sh index a104c96c1a..abf0612cee 100644 --- a/lib/makeboarddeb.sh +++ b/lib/makeboarddeb.sh @@ -285,10 +285,6 @@ fi cp "${SRC}"/packages/bsp/mpv/mpv_mainline.conf "${destination}"/etc/mpv/mpv.conf fi - # disable power savings on wireless connections by default - mkdir -p "${destination}"/usr/lib/NetworkManager/conf.d/ - cp "${SRC}"/packages/bsp/zz-override-wifi-powersave-off.conf "${destination}"/usr/lib/NetworkManager/conf.d/ - # execute $LINUXFAMILY-specific tweaks [[ $(type -t family_tweaks_bsp) == function ]] && family_tweaks_bsp diff --git a/packages/bsp/10-override-random-mac.conf b/packages/bsp/10-override-random-mac.conf deleted file mode 100644 index 0763348bdb..0000000000 --- a/packages/bsp/10-override-random-mac.conf +++ /dev/null @@ -1,2 +0,0 @@ -[device] -wifi.scan-rand-mac-address=no diff --git a/packages/bsp/common/etc/NetworkManager/conf.d/10-override-wifi-random-mac-disable.conf b/packages/bsp/common/etc/NetworkManager/conf.d/10-override-wifi-random-mac-disable.conf new file mode 100644 index 0000000000..4875dd5d40 --- /dev/null +++ b/packages/bsp/common/etc/NetworkManager/conf.d/10-override-wifi-random-mac-disable.conf @@ -0,0 +1,5 @@ +[connection] +wifi.mac-address-randomization=1 + +[device] +wifi.scan-rand-mac-address=no diff --git a/packages/bsp/zz-override-wifi-powersave-off.conf b/packages/bsp/common/etc/NetworkManager/conf.d/20-override-wifi-powersave-disable.conf similarity index 100% rename from packages/bsp/zz-override-wifi-powersave-off.conf rename to packages/bsp/common/etc/NetworkManager/conf.d/20-override-wifi-powersave-disable.conf From 871c2e89cc39a37ac9cc52095ba938706b0944e0 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Tue, 4 Feb 2020 20:07:07 +0100 Subject: [PATCH 08/54] Bugfix: Modern Ubuntu versions have broken command-not-found. Removing. https://bugs.launchpad.net/command-not-found/+bug/1824000 --- lib/configuration.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/configuration.sh b/lib/configuration.sh index 2a1db0a0f4..678c709caa 100644 --- a/lib/configuration.sh +++ b/lib/configuration.sh @@ -163,7 +163,7 @@ if [[ "$BUILD_MINIMAL" != "yes" ]]; then PACKAGE_LIST_ADDITIONAL="$PACKAGE_LIST_ADDITIONAL alsa-utils btrfs-progs dosfstools iotop iozone3 stress screen \ ntfs-3g vim pciutils evtest pv libfuse2 libdigest-sha-perl \ libproc-processtable-perl aptitude dnsutils f3 haveged hdparm rfkill vlan bash-completion \ - hostapd git ethtool unzip ifenslave command-not-found libpam-systemd iperf3 \ + hostapd git ethtool unzip ifenslave libpam-systemd iperf3 \ software-properties-common libnss-myhostname f2fs-tools avahi-autoipd iputils-arping qrencode sunxi-tools" fi @@ -189,7 +189,7 @@ case $RELEASE in xenial) DEBOOTSTRAP_COMPONENTS="main" DEBOOTSTRAP_LIST+=" btrfs-tools" - [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db sysbench" + [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db sysbench command-not-found" PACKAGE_LIST_DESKTOP+=" paman libgcr-3-common gcj-jre-headless paprefs numix-icon-theme libgnome2-perl \ pulseaudio-module-gconf onboard" PACKAGE_LIST_DESKTOP_RECOMMENDS+=" chromium-browser language-selector-gnome system-config-printer-common \ @@ -199,7 +199,7 @@ case $RELEASE in stretch) DEBOOTSTRAP_COMPONENTS="main" DEBOOTSTRAP_LIST+=" rng-tools" - [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr sysbench" + [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr sysbench command-not-found" PACKAGE_LIST_DESKTOP+=" paman libgcr-3-common gcj-jre-headless paprefs dbus-x11 libgnome2-perl pulseaudio-module-gconf onboard" PACKAGE_LIST_DESKTOP_RECOMMENDS+=" chromium system-config-printer-common system-config-printer leafpad mirage" ;; @@ -207,7 +207,7 @@ case $RELEASE in bionic) DEBOOTSTRAP_COMPONENTS="main,universe" DEBOOTSTRAP_LIST+=" rng-tools" - [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr networkd-dispatcher" + [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr networkd-dispatcher command-not-found" PACKAGE_LIST_DESKTOP+=" xserver-xorg-input-all paprefs dbus-x11 libgnome2-perl pulseaudio-module-gconf onboard" PACKAGE_LIST_DESKTOP_RECOMMENDS+=" chromium-browser system-config-printer-common system-config-printer \ language-selector-gnome leafpad mirage" @@ -216,7 +216,7 @@ case $RELEASE in buster) DEBOOTSTRAP_COMPONENTS="main" DEBOOTSTRAP_LIST+=" rng-tools" - [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr networkd-dispatcher" + [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr networkd-dispatcher command-not-found" PACKAGE_LIST_DESKTOP+=" paprefs dbus-x11 numix-icon-theme onboard" PACKAGE_LIST_DESKTOP_RECOMMENDS+=" chromium system-config-printer-common system-config-printer mirage" ;; @@ -224,7 +224,7 @@ case $RELEASE in bullseye) DEBOOTSTRAP_COMPONENTS="main" DEBOOTSTRAP_LIST+=" rng-tools" - [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr networkd-dispatcher" + [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr networkd-dispatcher command-not-found" PACKAGE_LIST_DESKTOP+=" paprefs dbus-x11 numix-icon-theme" PACKAGE_LIST_DESKTOP_RECOMMENDS+=" firefox-esr system-config-printer-common system-config-printer" ;; From d84f81e40f68d09fea921c9b81454788bad907cd Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Tue, 4 Feb 2020 20:34:29 +0100 Subject: [PATCH 09/54] Bugfix: Wireguard tools on Bullseye were installing not needed dkms package --- lib/distributions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/distributions.sh b/lib/distributions.sh index 94d6b7c71b..8531828f9d 100644 --- a/lib/distributions.sh +++ b/lib/distributions.sh @@ -225,7 +225,7 @@ install_common() if [[ $WIREGUARD == yes ]]; then # install wireguard tools - chroot "${SDCARD}" /bin/bash -c "apt -y -qq install wireguard-tools" >> "${DEST}"/debug/install.log 2>&1 + chroot "${SDCARD}" /bin/bash -c "apt -y -qq install wireguard-tools --no-install-recommends" >> "${DEST}"/debug/install.log 2>&1 fi # install board support package From 4a40aaebd8e1a16f020dcbf43a86085370c58146 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Tue, 4 Feb 2020 23:47:08 +0100 Subject: [PATCH 10/54] Bugfix: wrong association for several headers packages. apt linux-headers were installing random package instead of telling that linux-header package does not exists. --- patch/misc/general-packaging-4.14.y.patch | 2 +- patch/misc/general-packaging-4.4.y-rk3399.patch | 4 ++-- patch/misc/general-packaging-4.4.y-rockchip64.patch | 4 ++-- patch/misc/general-packaging-4.4.y.patch | 4 ++-- patch/misc/general-packaging-4.9.y.patch | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/patch/misc/general-packaging-4.14.y.patch b/patch/misc/general-packaging-4.14.y.patch index 25632c6cc6..3b69a66ee0 100644 --- a/patch/misc/general-packaging-4.14.y.patch +++ b/patch/misc/general-packaging-4.14.y.patch @@ -210,7 +210,7 @@ index 8c4bc5a2c..30bc0cffb 100644 + Package: $libc_headers_packagename Section: devel - Provides: linux-kernel-headers + Provides: $libc_headers_packagename @@ -354,7 +450,7 @@ EOF if [ "$ARCH" != "um" ]; then diff --git a/patch/misc/general-packaging-4.4.y-rk3399.patch b/patch/misc/general-packaging-4.4.y-rk3399.patch index ea50a1e4c4..630518b909 100644 --- a/patch/misc/general-packaging-4.4.y-rk3399.patch +++ b/patch/misc/general-packaging-4.4.y-rk3399.patch @@ -194,7 +194,7 @@ index 6c3b038e..f4166fbe 100755 Package: $kernel_headers_packagename -Provides: linux-headers, linux-headers-2.6 -+Provides: linux-headers ++Provides: $kernel_headers_packagename Architecture: any +Depends: make, gcc, libc6-dev, libssl-dev Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} @@ -216,7 +216,7 @@ index 6c3b038e..f4166fbe 100755 + Package: $libc_headers_packagename Section: devel - Provides: linux-kernel-headers + Provides: $libc_headers_packagename @@ -374,7 +477,7 @@ EOF if [ "$ARCH" != "um" ]; then diff --git a/patch/misc/general-packaging-4.4.y-rockchip64.patch b/patch/misc/general-packaging-4.4.y-rockchip64.patch index 1e0ebbbfd5..ecb5855de3 100644 --- a/patch/misc/general-packaging-4.4.y-rockchip64.patch +++ b/patch/misc/general-packaging-4.4.y-rockchip64.patch @@ -194,7 +194,7 @@ index 6c3b038e..f4166fbe 100755 Package: $kernel_headers_packagename -Provides: linux-headers, linux-headers-rockchip, linux-headers-rockchip-4.4 -+Provides: linux-headers ++Provides: $kernel_headers_packagename Architecture: any +Depends: make, gcc, libc6-dev, libssl-dev Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} @@ -216,7 +216,7 @@ index 6c3b038e..f4166fbe 100755 + Package: $libc_headers_packagename Section: devel - Provides: linux-kernel-headers + Provides: $libc_headers_packagename @@ -374,7 +477,7 @@ EOF if [ "$ARCH" != "um" ]; then diff --git a/patch/misc/general-packaging-4.4.y.patch b/patch/misc/general-packaging-4.4.y.patch index 93c4cc86a3..a6b43acaca 100644 --- a/patch/misc/general-packaging-4.4.y.patch +++ b/patch/misc/general-packaging-4.4.y.patch @@ -187,7 +187,7 @@ index 6c3b038e..977a0624 100755 Package: $kernel_headers_packagename -Provides: linux-headers, linux-headers-2.6 -+Provides: linux-headers ++Provides: $kernel_headers_packagename Architecture: any +Depends: make, gcc, libc6-dev, libssl-dev Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} @@ -208,7 +208,7 @@ index 6c3b038e..977a0624 100755 + Package: $libc_headers_packagename Section: devel - Provides: linux-kernel-headers + Provides: $libc_headers_packagename Architecture: any Description: Linux support headers for userspace development This package provides userspaces headers from the Linux kernel. These headers diff --git a/patch/misc/general-packaging-4.9.y.patch b/patch/misc/general-packaging-4.9.y.patch index 73d332c84e..a81d3e586e 100644 --- a/patch/misc/general-packaging-4.9.y.patch +++ b/patch/misc/general-packaging-4.9.y.patch @@ -174,7 +174,7 @@ index 0a2a7372..87edac65 100755 Package: $kernel_headers_packagename -Provides: linux-headers, linux-headers-2.6 -+Provides: linux-headers ++Provides: $kernel_headers_packagename Architecture: any +Depends: make, gcc, libc6-dev, libssl-dev Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} @@ -196,7 +196,7 @@ index 0a2a7372..87edac65 100755 + Package: $libc_headers_packagename Section: devel - Provides: linux-kernel-headers + Provides: $libc_headers_packagename @@ -383,7 +482,7 @@ EOF if [ "$ARCH" != "um" ]; then From a186fd498404fdae7d3a25dec64f014c590027d6 Mon Sep 17 00:00:00 2001 From: Piotr Szczepanik Date: Wed, 5 Feb 2020 00:19:00 +0100 Subject: [PATCH 11/54] Switched rockchip64-dev to mainline kernel 5.5.y (#1781) --- .../families/include/rockchip64_common.inc | 4 +- .../rockchip64-dev/add-board-orangepi-4.patch | 4 +- .../add-rk3328-usb3-phy-driver.patch | 1504 +++++++++++++++++ ...s-rockpro64-change-rx_delay-for-gmac.patch | 26 + .../board-renegade-add-HDMI-nodes.patch | 45 - .../board-renegade-add-LEDs.patch | 30 - .../board-renegade-add-enable-usb3.patch | 30 - .../board-renegade-dts-cleanup.patch | 55 +- ...oard-rk3328-roc-cc-dts-set-otg-host.patch} | 5 +- ...oc-rk3399-pc-add-sound-pcie-supplies.patch | 62 + ...oard-roc-rk3399-pc-fix-disable-hs400.patch | 6 +- ...roc-rk3399-pc-fix-fusb302-compatible.patch | 22 + .../board-roc-rk3399-pc-fix-regulator.patch | 24 - .../board-rock64-add-audio.patch | 90 + ...d-rockpro64-remove-duplicate-spi-nor.patch | 21 - .../rockchip64-dev/fix-rockpro64-emmc.patch | 18 +- .../rockchip64-dev/fix-spi1-flash-speed.patch | 12 +- .../general-add-overlay-configfs.patch | 430 +++++ .../rockchip64-dev/orangepi-rk3399-dts.patch | 938 ---------- .../rk3328-audio-and-renegade-supplies.patch | 264 +++ .../rk3328-sd-drive-level-8ma.patch.disabled | 45 - 21 files changed, 2427 insertions(+), 1208 deletions(-) create mode 100755 patch/kernel/rockchip64-dev/add-rk3328-usb3-phy-driver.patch create mode 100644 patch/kernel/rockchip64-dev/ayufan-dts-rockpro64-change-rx_delay-for-gmac.patch delete mode 100644 patch/kernel/rockchip64-dev/board-renegade-add-HDMI-nodes.patch delete mode 100644 patch/kernel/rockchip64-dev/board-renegade-add-LEDs.patch delete mode 100644 patch/kernel/rockchip64-dev/board-renegade-add-enable-usb3.patch rename patch/kernel/rockchip64-dev/{board-renegade-add-otg-host.patch => board-rk3328-roc-cc-dts-set-otg-host.patch} (83%) create mode 100644 patch/kernel/rockchip64-dev/board-roc-rk3399-pc-add-sound-pcie-supplies.patch create mode 100644 patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-fusb302-compatible.patch delete mode 100644 patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-regulator.patch create mode 100644 patch/kernel/rockchip64-dev/board-rock64-add-audio.patch delete mode 100644 patch/kernel/rockchip64-dev/board-rockpro64-remove-duplicate-spi-nor.patch create mode 100644 patch/kernel/rockchip64-dev/general-add-overlay-configfs.patch delete mode 100644 patch/kernel/rockchip64-dev/orangepi-rk3399-dts.patch create mode 100644 patch/kernel/rockchip64-dev/rk3328-audio-and-renegade-supplies.patch delete mode 100644 patch/kernel/rockchip64-dev/rk3328-sd-drive-level-8ma.patch.disabled diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc index 28e77fcb75..e03ff53513 100644 --- a/config/sources/families/include/rockchip64_common.inc +++ b/config/sources/families/include/rockchip64_common.inc @@ -50,10 +50,8 @@ case $BRANCH in dev) - KERNELSOURCE='https://github.com/ayufan-rock64/linux-mainline-kernel' - KERNELBRANCH='tag:5.4.0-rc1-1120-ayufan' - KERNELDIR='linux-rockchip64' KERNELPATCHDIR='rockchip64-'$BRANCH + KERNELBRANCH="branch:linux-5.5.y" LINUXFAMILY=rockchip64 LINUXCONFIG='linux-rockchip64-'$BRANCH diff --git a/patch/kernel/rockchip64-dev/add-board-orangepi-4.patch b/patch/kernel/rockchip64-dev/add-board-orangepi-4.patch index e365e693e6..e63c40f25e 100644 --- a/patch/kernel/rockchip64-dev/add-board-orangepi-4.patch +++ b/patch/kernel/rockchip64-dev/add-board-orangepi-4.patch @@ -1,5 +1,5 @@ diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile -index d687b146e..6d49a3f7a 100644 +index aed41ff1d..92d796a33 100644 --- a/arch/arm64/boot/dts/rockchip/Makefile +++ b/arch/arm64/boot/dts/rockchip/Makefile @@ -26,6 +26,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb @@ -7,9 +7,9 @@ index d687b146e..6d49a3f7a 100644 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi-4.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pinebook-pro.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4.dtb diff --git a/arch/arm64/boot/dts/rockchip/rk3399-orangepi-4.dts b/arch/arm64/boot/dts/rockchip/rk3399-orangepi-4.dts new file mode 100644 index 00000000..17010305 diff --git a/patch/kernel/rockchip64-dev/add-rk3328-usb3-phy-driver.patch b/patch/kernel/rockchip64-dev/add-rk3328-usb3-phy-driver.patch new file mode 100755 index 0000000000..7ac1a2e432 --- /dev/null +++ b/patch/kernel/rockchip64-dev/add-rk3328-usb3-phy-driver.patch @@ -0,0 +1,1504 @@ +Add the rockchip innosilicon usb3 phy driver, supporting devices such as the rk3328. +Pulled from: +https://github.com/FireflyTeam/kernel/blob/roc-rk3328-cc/drivers/phy/rockchip/phy-rockchip-inno-usb3.c + +Signed-off-by: Peter Geis +--- + drivers/phy/rockchip/Kconfig | 9 + + drivers/phy/rockchip/Makefile | 1 + + drivers/phy/rockchip/phy-rockchip-inno-usb3.c | 1107 +++++++++++++++++ + 3 files changed, 1117 insertions(+) + create mode 100644 drivers/phy/rockchip/phy-rockchip-inno-usb3.c + +diff --git a/drivers/phy/rockchip/Kconfig b/drivers/phy/rockchip/Kconfig +index c454c90cd99e..766407939d4a 100644 +--- a/drivers/phy/rockchip/Kconfig ++++ b/drivers/phy/rockchip/Kconfig +@@ -35,6 +35,15 @@ config PHY_ROCKCHIP_INNO_USB2 + help + Support for Rockchip USB2.0 PHY with Innosilicon IP block. + ++config PHY_ROCKCHIP_INNO_USB3 ++ tristate "Rockchip INNO USB 3.0 PHY Driver" ++ depends on (ARCH_ROCKCHIP || COMPILE_TEST) && OF ++ depends on USB_SUPPORT ++ select GENERIC_PHY ++ select USB_PHY ++ help ++ Support for Rockchip USB 3.0 PHY with Innosilicon IP block. ++ + config PHY_ROCKCHIP_PCIE + tristate "Rockchip PCIe PHY Driver" + depends on (ARCH_ROCKCHIP && OF) || COMPILE_TEST +diff --git a/drivers/phy/rockchip/Makefile b/drivers/phy/rockchip/Makefile +index fd21cbaf40dd..d7b3d16c19ae 100644 +--- a/drivers/phy/rockchip/Makefile ++++ b/drivers/phy/rockchip/Makefile +@@ -3,6 +3,7 @@ obj-$(CONFIG_PHY_ROCKCHIP_DP) += phy-rockchip-dp.o + obj-$(CONFIG_PHY_ROCKCHIP_EMMC) += phy-rockchip-emmc.o + obj-$(CONFIG_PHY_ROCKCHIP_INNO_HDMI) += phy-rockchip-inno-hdmi.o + obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2) += phy-rockchip-inno-usb2.o ++obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB3) += phy-rockchip-inno-usb3.o + obj-$(CONFIG_PHY_ROCKCHIP_PCIE) += phy-rockchip-pcie.o + obj-$(CONFIG_PHY_ROCKCHIP_TYPEC) += phy-rockchip-typec.o + obj-$(CONFIG_PHY_ROCKCHIP_USB) += phy-rockchip-usb.o +diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb3.c b/drivers/phy/rockchip/phy-rockchip-inno-usb3.c +new file mode 100644 +index 000000000000..31fee8f3a705 +--- /dev/null ++++ b/drivers/phy/rockchip/phy-rockchip-inno-usb3.c +@@ -0,0 +1,1107 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* ++ * Rockchip USB 3.0 PHY with Innosilicon IP block driver ++ * ++ * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define U3PHY_PORT_NUM 2 ++#define BIT_WRITEABLE_SHIFT 16 ++#define SCHEDULE_DELAY (60 * HZ) ++ ++#define U3PHY_APB_RST BIT(0) ++#define U3PHY_POR_RST BIT(1) ++#define U3PHY_MAC_RST BIT(2) ++ ++struct rockchip_u3phy; ++struct rockchip_u3phy_port; ++ ++enum rockchip_u3phy_type { ++ U3PHY_TYPE_PIPE, ++ U3PHY_TYPE_UTMI, ++}; ++ ++enum rockchip_u3phy_pipe_pwr { ++ PIPE_PWR_P0 = 0, ++ PIPE_PWR_P1 = 1, ++ PIPE_PWR_P2 = 2, ++ PIPE_PWR_P3 = 3, ++ PIPE_PWR_MAX = 4, ++}; ++ ++enum rockchip_u3phy_rest_req { ++ U3_POR_RSTN = 0, ++ U2_POR_RSTN = 1, ++ PIPE_MAC_RSTN = 2, ++ UTMI_MAC_RSTN = 3, ++ PIPE_APB_RSTN = 4, ++ UTMI_APB_RSTN = 5, ++ U3PHY_RESET_MAX = 6, ++}; ++ ++enum rockchip_u3phy_utmi_state { ++ PHY_UTMI_HS_ONLINE = 0, ++ PHY_UTMI_DISCONNECT = 1, ++ PHY_UTMI_CONNECT = 2, ++ PHY_UTMI_FS_LS_ONLINE = 4, ++}; ++ ++/* ++ * @rvalue: reset value ++ * @dvalue: desired value ++ */ ++struct u3phy_reg { ++ unsigned int offset; ++ unsigned int bitend; ++ unsigned int bitstart; ++ unsigned int rvalue; ++ unsigned int dvalue; ++}; ++ ++struct rockchip_u3phy_grfcfg { ++ struct u3phy_reg um_suspend; ++ struct u3phy_reg ls_det_en; ++ struct u3phy_reg ls_det_st; ++ struct u3phy_reg um_ls; ++ struct u3phy_reg um_hstdct; ++ struct u3phy_reg u2_only_ctrl; ++ struct u3phy_reg u3_disable; ++ struct u3phy_reg pp_pwr_st; ++ struct u3phy_reg pp_pwr_en[PIPE_PWR_MAX]; ++}; ++ ++/** ++ * struct rockchip_u3phy_apbcfg: usb3-phy apb configuration. ++ * @u2_pre_emp: usb2-phy pre-emphasis tuning. ++ * @u2_pre_emp_sth: usb2-phy pre-emphasis strength tuning. ++ * @u2_odt_tuning: usb2-phy odt 45ohm tuning. ++ */ ++struct rockchip_u3phy_apbcfg { ++ unsigned int u2_pre_emp; ++ unsigned int u2_pre_emp_sth; ++ unsigned int u2_odt_tuning; ++}; ++ ++struct rockchip_u3phy_cfg { ++ unsigned int reg; ++ const struct rockchip_u3phy_grfcfg grfcfg; ++ ++ int (*phy_pipe_power)(struct rockchip_u3phy *u3phy, ++ struct rockchip_u3phy_port *u3phy_port, ++ bool on); ++ int (*phy_tuning)(struct rockchip_u3phy *u3phy, ++ struct rockchip_u3phy_port *u3phy_port, ++ struct device_node *child_np); ++}; ++ ++struct rockchip_u3phy_port { ++ struct phy *phy; ++ void __iomem *base; ++ unsigned int index; ++ unsigned char type; ++ bool suspended; ++ bool refclk_25m_quirk; ++ struct mutex mutex; /* mutex for updating register */ ++ struct delayed_work um_sm_work; ++}; ++ ++struct rockchip_u3phy { ++ struct device *dev; ++ struct regmap *u3phy_grf; ++ struct regmap *grf; ++ int um_ls_irq; ++ struct clk **clks; ++ int num_clocks; ++ struct dentry *root; ++ struct gpio_desc *vbus_drv_gpio; ++ struct reset_control *rsts[U3PHY_RESET_MAX]; ++ struct rockchip_u3phy_apbcfg apbcfg; ++ const struct rockchip_u3phy_cfg *cfgs; ++ struct rockchip_u3phy_port ports[U3PHY_PORT_NUM]; ++ struct usb_phy usb_phy; ++}; ++ ++static inline int param_write(void __iomem *base, ++ const struct u3phy_reg *reg, bool desired) ++{ ++ unsigned int val, mask; ++ unsigned int tmp = desired ? reg->dvalue : reg->rvalue; ++ int ret = 0; ++ ++ mask = GENMASK(reg->bitend, reg->bitstart); ++ val = (tmp << reg->bitstart) | (mask << BIT_WRITEABLE_SHIFT); ++ ret = regmap_write(base, reg->offset, val); ++ ++ return ret; ++} ++ ++static inline bool param_exped(void __iomem *base, ++ const struct u3phy_reg *reg, ++ unsigned int value) ++{ ++ int ret; ++ unsigned int tmp, orig; ++ unsigned int mask = GENMASK(reg->bitend, reg->bitstart); ++ ++ ret = regmap_read(base, reg->offset, &orig); ++ if (ret) ++ return false; ++ ++ tmp = (orig & mask) >> reg->bitstart; ++ return tmp == value; ++} ++ ++static int rockchip_u3phy_usb2_only_show(struct seq_file *s, void *unused) ++{ ++ struct rockchip_u3phy *u3phy = s->private; ++ ++ if (param_exped(u3phy->u3phy_grf, &u3phy->cfgs->grfcfg.u2_only_ctrl, 1)) ++ dev_info(u3phy->dev, "u2\n"); ++ else ++ dev_info(u3phy->dev, "u3\n"); ++ ++ return 0; ++} ++ ++static int rockchip_u3phy_usb2_only_open(struct inode *inode, ++ struct file *file) ++{ ++ return single_open(file, rockchip_u3phy_usb2_only_show, ++ inode->i_private); ++} ++ ++static ssize_t rockchip_u3phy_usb2_only_write(struct file *file, ++ const char __user *ubuf, ++ size_t count, loff_t *ppos) ++{ ++ struct seq_file *s = file->private_data; ++ struct rockchip_u3phy *u3phy = s->private; ++ struct rockchip_u3phy_port *u3phy_port; ++ char buf[32]; ++ u8 index; ++ ++ if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) ++ return -EFAULT; ++ ++ if (!strncmp(buf, "u3", 2) && ++ param_exped(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.u2_only_ctrl, 1)) { ++ dev_info(u3phy->dev, "Set usb3.0 and usb2.0 mode successfully\n"); ++ ++ gpiod_set_value_cansleep(u3phy->vbus_drv_gpio, 0); ++ ++ param_write(u3phy->grf, ++ &u3phy->cfgs->grfcfg.u3_disable, false); ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.u2_only_ctrl, false); ++ ++ for (index = 0; index < U3PHY_PORT_NUM; index++) { ++ u3phy_port = &u3phy->ports[index]; ++ /* enable u3 rx termimation */ ++ if (u3phy_port->type == U3PHY_TYPE_PIPE) ++ writel(0x30, u3phy_port->base + 0xd8); ++ } ++ ++ atomic_notifier_call_chain(&u3phy->usb_phy.notifier, 0, NULL); ++ ++ gpiod_set_value_cansleep(u3phy->vbus_drv_gpio, 1); ++ } else if (!strncmp(buf, "u2", 2) && ++ param_exped(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.u2_only_ctrl, 0)) { ++ dev_info(u3phy->dev, "Set usb2.0 only mode successfully\n"); ++ ++ gpiod_set_value_cansleep(u3phy->vbus_drv_gpio, 0); ++ ++ param_write(u3phy->grf, ++ &u3phy->cfgs->grfcfg.u3_disable, true); ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.u2_only_ctrl, true); ++ ++ for (index = 0; index < U3PHY_PORT_NUM; index++) { ++ u3phy_port = &u3phy->ports[index]; ++ /* disable u3 rx termimation */ ++ if (u3phy_port->type == U3PHY_TYPE_PIPE) ++ writel(0x20, u3phy_port->base + 0xd8); ++ } ++ ++ atomic_notifier_call_chain(&u3phy->usb_phy.notifier, 0, NULL); ++ ++ gpiod_set_value_cansleep(u3phy->vbus_drv_gpio, 1); ++ } else { ++ dev_info(u3phy->dev, "Same or illegal mode\n"); ++ } ++ ++ return count; ++} ++ ++static const struct file_operations rockchip_u3phy_usb2_only_fops = { ++ .open = rockchip_u3phy_usb2_only_open, ++ .write = rockchip_u3phy_usb2_only_write, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++ ++int rockchip_u3phy_debugfs_init(struct rockchip_u3phy *u3phy) ++{ ++ struct dentry *root; ++ struct dentry *file; ++ int ret; ++ ++ root = debugfs_create_dir(dev_name(u3phy->dev), NULL); ++ if (!root) { ++ ret = -ENOMEM; ++ goto err0; ++ } ++ ++ u3phy->root = root; ++ ++ file = debugfs_create_file("u3phy_mode", 0644, root, ++ u3phy, &rockchip_u3phy_usb2_only_fops); ++ if (!file) { ++ ret = -ENOMEM; ++ goto err1; ++ } ++ return 0; ++ ++err1: ++ debugfs_remove_recursive(root); ++err0: ++ return ret; ++} ++ ++static const char *get_rest_name(enum rockchip_u3phy_rest_req rst) ++{ ++ switch (rst) { ++ case U2_POR_RSTN: ++ return "u3phy-u2-por"; ++ case U3_POR_RSTN: ++ return "u3phy-u3-por"; ++ case PIPE_MAC_RSTN: ++ return "u3phy-pipe-mac"; ++ case UTMI_MAC_RSTN: ++ return "u3phy-utmi-mac"; ++ case UTMI_APB_RSTN: ++ return "u3phy-utmi-apb"; ++ case PIPE_APB_RSTN: ++ return "u3phy-pipe-apb"; ++ default: ++ return "invalid"; ++ } ++} ++ ++static void rockchip_u3phy_rest_deassert(struct rockchip_u3phy *u3phy, ++ unsigned int flag) ++{ ++ int rst; ++ ++ if (flag & U3PHY_APB_RST) { ++ dev_dbg(u3phy->dev, "deassert APB bus interface reset\n"); ++ for (rst = PIPE_APB_RSTN; rst <= UTMI_APB_RSTN; rst++) { ++ if (u3phy->rsts[rst]) ++ reset_control_deassert(u3phy->rsts[rst]); ++ } ++ } ++ ++ if (flag & U3PHY_POR_RST) { ++ usleep_range(12, 15); ++ dev_dbg(u3phy->dev, "deassert u2 and u3 phy power on reset\n"); ++ for (rst = U3_POR_RSTN; rst <= U2_POR_RSTN; rst++) { ++ if (u3phy->rsts[rst]) ++ reset_control_deassert(u3phy->rsts[rst]); ++ } ++ } ++ ++ if (flag & U3PHY_MAC_RST) { ++ usleep_range(1200, 1500); ++ dev_dbg(u3phy->dev, "deassert pipe and utmi MAC reset\n"); ++ for (rst = PIPE_MAC_RSTN; rst <= UTMI_MAC_RSTN; rst++) ++ if (u3phy->rsts[rst]) ++ reset_control_deassert(u3phy->rsts[rst]); ++ } ++} ++ ++static void rockchip_u3phy_rest_assert(struct rockchip_u3phy *u3phy) ++{ ++ int rst; ++ ++ dev_dbg(u3phy->dev, "assert u3phy reset\n"); ++ for (rst = 0; rst < U3PHY_RESET_MAX; rst++) ++ if (u3phy->rsts[rst]) ++ reset_control_assert(u3phy->rsts[rst]); ++} ++ ++static int rockchip_u3phy_clk_enable(struct rockchip_u3phy *u3phy) ++{ ++ int ret, clk; ++ ++ for (clk = 0; clk < u3phy->num_clocks && u3phy->clks[clk]; clk++) { ++ ret = clk_prepare_enable(u3phy->clks[clk]); ++ if (ret) ++ goto err_disable_clks; ++ } ++ return 0; ++ ++err_disable_clks: ++ while (--clk >= 0) ++ clk_disable_unprepare(u3phy->clks[clk]); ++ return ret; ++} ++ ++static void rockchip_u3phy_clk_disable(struct rockchip_u3phy *u3phy) ++{ ++ int clk; ++ ++ for (clk = u3phy->num_clocks - 1; clk >= 0; clk--) ++ if (u3phy->clks[clk]) ++ clk_disable_unprepare(u3phy->clks[clk]); ++} ++ ++static int rockchip_u3phy_init(struct phy *phy) ++{ ++ return 0; ++} ++ ++static int rockchip_u3phy_exit(struct phy *phy) ++{ ++ return 0; ++} ++ ++static int rockchip_u3phy_power_on(struct phy *phy) ++{ ++ struct rockchip_u3phy_port *u3phy_port = phy_get_drvdata(phy); ++ struct rockchip_u3phy *u3phy = dev_get_drvdata(phy->dev.parent); ++ int ret; ++ ++ dev_info(&u3phy_port->phy->dev, "u3phy %s power on\n", ++ (u3phy_port->type == U3PHY_TYPE_UTMI) ? "u2" : "u3"); ++ ++ if (!u3phy_port->suspended) ++ return 0; ++ ++ ret = rockchip_u3phy_clk_enable(u3phy); ++ if (ret) ++ return ret; ++ ++ if (u3phy_port->type == U3PHY_TYPE_UTMI) { ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.um_suspend, false); ++ } else { ++ /* current in p2 ? */ ++ if (param_exped(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.pp_pwr_st, PIPE_PWR_P2)) ++ goto done; ++ ++ if (u3phy->cfgs->phy_pipe_power) { ++ dev_dbg(u3phy->dev, "do pipe power up\n"); ++ u3phy->cfgs->phy_pipe_power(u3phy, u3phy_port, true); ++ } ++ ++ /* exit to p0 */ ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.pp_pwr_en[PIPE_PWR_P0], true); ++ usleep_range(90, 100); ++ ++ /* enter to p2 from p0 */ ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.pp_pwr_en[PIPE_PWR_P2], ++ false); ++ udelay(3); ++ } ++ ++done: ++ u3phy_port->suspended = false; ++ return 0; ++} ++ ++static int rockchip_u3phy_power_off(struct phy *phy) ++{ ++ struct rockchip_u3phy_port *u3phy_port = phy_get_drvdata(phy); ++ struct rockchip_u3phy *u3phy = dev_get_drvdata(phy->dev.parent); ++ ++ dev_info(&u3phy_port->phy->dev, "u3phy %s power off\n", ++ (u3phy_port->type == U3PHY_TYPE_UTMI) ? "u2" : "u3"); ++ ++ if (u3phy_port->suspended) ++ return 0; ++ ++ if (u3phy_port->type == U3PHY_TYPE_UTMI) { ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.um_suspend, true); ++ } else { ++ /* current in p3 ? */ ++ if (param_exped(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.pp_pwr_st, PIPE_PWR_P3)) ++ goto done; ++ ++ /* exit to p0 */ ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.pp_pwr_en[PIPE_PWR_P0], true); ++ udelay(2); ++ ++ /* enter to p3 from p0 */ ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.pp_pwr_en[PIPE_PWR_P3], true); ++ udelay(6); ++ ++ if (u3phy->cfgs->phy_pipe_power) { ++ dev_dbg(u3phy->dev, "do pipe power down\n"); ++ u3phy->cfgs->phy_pipe_power(u3phy, u3phy_port, false); ++ } ++ } ++ ++done: ++ rockchip_u3phy_clk_disable(u3phy); ++ u3phy_port->suspended = true; ++ return 0; ++} ++ ++static __maybe_unused ++struct phy *rockchip_u3phy_xlate(struct device *dev, ++ struct of_phandle_args *args) ++{ ++ struct rockchip_u3phy *u3phy = dev_get_drvdata(dev); ++ struct rockchip_u3phy_port *u3phy_port = NULL; ++ struct device_node *phy_np = args->np; ++ int index; ++ ++ if (args->args_count != 1) { ++ dev_err(dev, "invalid number of cells in 'phy' property\n"); ++ return ERR_PTR(-EINVAL); ++ } ++ ++ for (index = 0; index < U3PHY_PORT_NUM; index++) { ++ if (phy_np == u3phy->ports[index].phy->dev.of_node) { ++ u3phy_port = &u3phy->ports[index]; ++ break; ++ } ++ } ++ ++ if (!u3phy_port) { ++ dev_err(dev, "failed to find appropriate phy\n"); ++ return ERR_PTR(-EINVAL); ++ } ++ ++ return u3phy_port->phy; ++} ++ ++static struct phy_ops rockchip_u3phy_ops = { ++ .init = rockchip_u3phy_init, ++ .exit = rockchip_u3phy_exit, ++ .power_on = rockchip_u3phy_power_on, ++ .power_off = rockchip_u3phy_power_off, ++ .owner = THIS_MODULE, ++}; ++ ++/* ++ * The function manage host-phy port state and suspend/resume phy port ++ * to save power automatically. ++ * ++ * we rely on utmi_linestate and utmi_hostdisconnect to identify whether ++ * devices is disconnect or not. Besides, we do not need care it is FS/LS ++ * disconnected or HS disconnected, actually, we just only need get the ++ * device is disconnected at last through rearm the delayed work, ++ * to suspend the phy port in _PHY_STATE_DISCONNECT_ case. ++ */ ++static void rockchip_u3phy_um_sm_work(struct work_struct *work) ++{ ++ struct rockchip_u3phy_port *u3phy_port = ++ container_of(work, struct rockchip_u3phy_port, um_sm_work.work); ++ struct rockchip_u3phy *u3phy = ++ dev_get_drvdata(u3phy_port->phy->dev.parent); ++ unsigned int sh = u3phy->cfgs->grfcfg.um_hstdct.bitend - ++ u3phy->cfgs->grfcfg.um_hstdct.bitstart + 1; ++ unsigned int ul, uhd, state; ++ unsigned int ul_mask, uhd_mask; ++ int ret; ++ ++ mutex_lock(&u3phy_port->mutex); ++ ++ ret = regmap_read(u3phy->u3phy_grf, ++ u3phy->cfgs->grfcfg.um_ls.offset, &ul); ++ if (ret < 0) ++ goto next_schedule; ++ ++ ret = regmap_read(u3phy->u3phy_grf, ++ u3phy->cfgs->grfcfg.um_hstdct.offset, &uhd); ++ if (ret < 0) ++ goto next_schedule; ++ ++ uhd_mask = GENMASK(u3phy->cfgs->grfcfg.um_hstdct.bitend, ++ u3phy->cfgs->grfcfg.um_hstdct.bitstart); ++ ul_mask = GENMASK(u3phy->cfgs->grfcfg.um_ls.bitend, ++ u3phy->cfgs->grfcfg.um_ls.bitstart); ++ ++ /* stitch on um_ls and um_hstdct as phy state */ ++ state = ((uhd & uhd_mask) >> u3phy->cfgs->grfcfg.um_hstdct.bitstart) | ++ (((ul & ul_mask) >> u3phy->cfgs->grfcfg.um_ls.bitstart) << sh); ++ ++ switch (state) { ++ case PHY_UTMI_HS_ONLINE: ++ dev_dbg(&u3phy_port->phy->dev, "HS online\n"); ++ break; ++ case PHY_UTMI_FS_LS_ONLINE: ++ /* ++ * For FS/LS device, the online state share with connect state ++ * from um_ls and um_hstdct register, so we distinguish ++ * them via suspended flag. ++ * ++ * Plus, there are two cases, one is D- Line pull-up, and D+ ++ * line pull-down, the state is 4; another is D+ line pull-up, ++ * and D- line pull-down, the state is 2. ++ */ ++ if (!u3phy_port->suspended) { ++ /* D- line pull-up, D+ line pull-down */ ++ dev_dbg(&u3phy_port->phy->dev, "FS/LS online\n"); ++ break; ++ } ++ /* fall through */ ++ case PHY_UTMI_CONNECT: ++ if (u3phy_port->suspended) { ++ dev_dbg(&u3phy_port->phy->dev, "Connected\n"); ++ rockchip_u3phy_power_on(u3phy_port->phy); ++ u3phy_port->suspended = false; ++ } else { ++ /* D+ line pull-up, D- line pull-down */ ++ dev_dbg(&u3phy_port->phy->dev, "FS/LS online\n"); ++ } ++ break; ++ case PHY_UTMI_DISCONNECT: ++ if (!u3phy_port->suspended) { ++ dev_dbg(&u3phy_port->phy->dev, "Disconnected\n"); ++ rockchip_u3phy_power_off(u3phy_port->phy); ++ u3phy_port->suspended = true; ++ } ++ ++ /* ++ * activate the linestate detection to get the next device ++ * plug-in irq. ++ */ ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.ls_det_st, true); ++ param_write(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.ls_det_en, true); ++ ++ /* ++ * we don't need to rearm the delayed work when the phy port ++ * is suspended. ++ */ ++ mutex_unlock(&u3phy_port->mutex); ++ return; ++ default: ++ dev_dbg(&u3phy_port->phy->dev, "unknown phy state\n"); ++ break; ++ } ++ ++next_schedule: ++ mutex_unlock(&u3phy_port->mutex); ++ schedule_delayed_work(&u3phy_port->um_sm_work, SCHEDULE_DELAY); ++} ++ ++static irqreturn_t rockchip_u3phy_um_ls_irq(int irq, void *data) ++{ ++ struct rockchip_u3phy_port *u3phy_port = data; ++ struct rockchip_u3phy *u3phy = ++ dev_get_drvdata(u3phy_port->phy->dev.parent); ++ ++ if (!param_exped(u3phy->u3phy_grf, ++ &u3phy->cfgs->grfcfg.ls_det_st, ++ u3phy->cfgs->grfcfg.ls_det_st.dvalue)) ++ return IRQ_NONE; ++ ++ dev_dbg(u3phy->dev, "utmi linestate interrupt\n"); ++ mutex_lock(&u3phy_port->mutex); ++ ++ /* disable linestate detect irq and clear its status */ ++ param_write(u3phy->u3phy_grf, &u3phy->cfgs->grfcfg.ls_det_en, false); ++ param_write(u3phy->u3phy_grf, &u3phy->cfgs->grfcfg.ls_det_st, true); ++ ++ mutex_unlock(&u3phy_port->mutex); ++ ++ /* ++ * In this case for host phy, a new device is plugged in, meanwhile, ++ * if the phy port is suspended, we need rearm the work to resume it ++ * and mange its states; otherwise, we just return irq handled. ++ */ ++ if (u3phy_port->suspended) { ++ dev_dbg(u3phy->dev, "schedule utmi sm work\n"); ++ rockchip_u3phy_um_sm_work(&u3phy_port->um_sm_work.work); ++ } ++ ++ return IRQ_HANDLED; ++} ++ ++static int rockchip_u3phy_parse_dt(struct rockchip_u3phy *u3phy, ++ struct platform_device *pdev) ++ ++{ ++ struct device *dev = &pdev->dev; ++ struct device_node *np = dev->of_node; ++ int ret, i, clk; ++ ++ u3phy->um_ls_irq = platform_get_irq_byname(pdev, "linestate"); ++ if (u3phy->um_ls_irq < 0) { ++ dev_err(dev, "get utmi linestate irq failed\n"); ++ return -ENXIO; ++ } ++ ++ u3phy->vbus_drv_gpio = devm_gpiod_get_optional(dev, "vbus-drv", ++ GPIOD_OUT_HIGH); ++ ++ if (!u3phy->vbus_drv_gpio) { ++ dev_warn(&pdev->dev, "vbus_drv is not assigned\n"); ++ } else if (IS_ERR(u3phy->vbus_drv_gpio)) { ++ dev_err(&pdev->dev, "failed to get vbus_drv\n"); ++ return PTR_ERR(u3phy->vbus_drv_gpio); ++ } ++ ++ u3phy->num_clocks = of_clk_get_parent_count(np); ++ if (u3phy->num_clocks == 0) ++ dev_warn(&pdev->dev, "no clks found in dt\n"); ++ ++ u3phy->clks = devm_kcalloc(dev, u3phy->num_clocks, ++ sizeof(struct clk *), GFP_KERNEL); ++ ++ for (clk = 0; clk < u3phy->num_clocks; clk++) { ++ u3phy->clks[clk] = of_clk_get(np, clk); ++ if (IS_ERR(u3phy->clks[clk])) { ++ ret = PTR_ERR(u3phy->clks[clk]); ++ if (ret == -EPROBE_DEFER) ++ goto err_put_clks; ++ dev_err(&pdev->dev, "failed to get clks, %i\n", ++ ret); ++ u3phy->clks[clk] = NULL; ++ break; ++ } ++ } ++ ++ for (i = 0; i < U3PHY_RESET_MAX; i++) { ++ u3phy->rsts[i] = devm_reset_control_get(dev, get_rest_name(i)); ++ if (IS_ERR(u3phy->rsts[i])) { ++ dev_info(dev, "no %s reset control specified\n", ++ get_rest_name(i)); ++ u3phy->rsts[i] = NULL; ++ } ++ } ++ ++ return 0; ++ ++err_put_clks: ++ while (--clk >= 0) ++ clk_put(u3phy->clks[clk]); ++ return ret; ++} ++ ++static int rockchip_u3phy_port_init(struct rockchip_u3phy *u3phy, ++ struct rockchip_u3phy_port *u3phy_port, ++ struct device_node *child_np) ++{ ++ struct resource res; ++ struct phy *phy; ++ int ret; ++ ++ dev_dbg(u3phy->dev, "u3phy port initialize\n"); ++ ++ mutex_init(&u3phy_port->mutex); ++ u3phy_port->suspended = true; /* initial status */ ++ ++ phy = devm_phy_create(u3phy->dev, child_np, &rockchip_u3phy_ops); ++ if (IS_ERR(phy)) { ++ dev_err(u3phy->dev, "failed to create phy\n"); ++ return PTR_ERR(phy); ++ } ++ ++ u3phy_port->phy = phy; ++ ++ ret = of_address_to_resource(child_np, 0, &res); ++ if (ret) { ++ dev_err(u3phy->dev, "failed to get address resource(np-%s)\n", ++ child_np->name); ++ return ret; ++ } ++ ++ u3phy_port->base = devm_ioremap_resource(&u3phy_port->phy->dev, &res); ++ if (IS_ERR(u3phy_port->base)) { ++ dev_err(u3phy->dev, "failed to remap phy regs\n"); ++ return PTR_ERR(u3phy_port->base); ++ } ++ ++ if (!of_node_cmp(child_np->name, "pipe")) { ++ u3phy_port->type = U3PHY_TYPE_PIPE; ++ u3phy_port->refclk_25m_quirk = ++ of_property_read_bool(child_np, ++ "rockchip,refclk-25m-quirk"); ++ } else { ++ u3phy_port->type = U3PHY_TYPE_UTMI; ++ INIT_DELAYED_WORK(&u3phy_port->um_sm_work, ++ rockchip_u3phy_um_sm_work); ++ ++ ret = devm_request_threaded_irq(u3phy->dev, u3phy->um_ls_irq, ++ NULL, rockchip_u3phy_um_ls_irq, ++ IRQF_ONESHOT, "rockchip_u3phy", ++ u3phy_port); ++ if (ret) { ++ dev_err(u3phy->dev, "failed to request utmi linestate irq handle\n"); ++ return ret; ++ } ++ } ++ ++ if (u3phy->cfgs->phy_tuning) { ++ dev_dbg(u3phy->dev, "do u3phy tuning\n"); ++ ret = u3phy->cfgs->phy_tuning(u3phy, u3phy_port, child_np); ++ if (ret) ++ return ret; ++ } ++ ++ phy_set_drvdata(u3phy_port->phy, u3phy_port); ++ return 0; ++} ++ ++static int rockchip_u3phy_on_init(struct usb_phy *usb_phy) ++{ ++ struct rockchip_u3phy *u3phy = ++ container_of(usb_phy, struct rockchip_u3phy, usb_phy); ++ ++ rockchip_u3phy_rest_deassert(u3phy, U3PHY_POR_RST | U3PHY_MAC_RST); ++ return 0; ++} ++ ++static void rockchip_u3phy_on_shutdown(struct usb_phy *usb_phy) ++{ ++ struct rockchip_u3phy *u3phy = ++ container_of(usb_phy, struct rockchip_u3phy, usb_phy); ++ int rst; ++ ++ for (rst = 0; rst < U3PHY_RESET_MAX; rst++) ++ if (u3phy->rsts[rst] && rst != UTMI_APB_RSTN && ++ rst != PIPE_APB_RSTN) ++ reset_control_assert(u3phy->rsts[rst]); ++ udelay(1); ++} ++ ++static int rockchip_u3phy_on_disconnect(struct usb_phy *usb_phy, ++ enum usb_device_speed speed) ++{ ++ struct rockchip_u3phy *u3phy = ++ container_of(usb_phy, struct rockchip_u3phy, usb_phy); ++ ++ dev_info(u3phy->dev, "%s device has disconnected\n", ++ (speed == USB_SPEED_SUPER) ? "U3" : "UW/U2/U1.1/U1"); ++ ++ if (speed == USB_SPEED_SUPER) ++ atomic_notifier_call_chain(&usb_phy->notifier, 0, NULL); ++ ++ return 0; ++} ++ ++static int rockchip_u3phy_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct device_node *np = dev->of_node; ++ struct device_node *child_np; ++ struct phy_provider *provider; ++ struct rockchip_u3phy *u3phy; ++ const struct rockchip_u3phy_cfg *phy_cfgs; ++ const struct of_device_id *match; ++ unsigned int reg[2]; ++ int index, ret; ++ ++ match = of_match_device(dev->driver->of_match_table, dev); ++ if (!match || !match->data) { ++ dev_err(dev, "phy-cfgs are not assigned!\n"); ++ return -EINVAL; ++ } ++ ++ u3phy = devm_kzalloc(dev, sizeof(*u3phy), GFP_KERNEL); ++ if (!u3phy) ++ return -ENOMEM; ++ ++ u3phy->u3phy_grf = ++ syscon_regmap_lookup_by_phandle(np, "rockchip,u3phygrf"); ++ if (IS_ERR(u3phy->u3phy_grf)) ++ return PTR_ERR(u3phy->u3phy_grf); ++ ++ u3phy->grf = ++ syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); ++ if (IS_ERR(u3phy->grf)) { ++ dev_err(dev, "Missing rockchip,grf property\n"); ++ return PTR_ERR(u3phy->grf); ++ } ++ ++ if (of_property_read_u32_array(np, "reg", reg, 2)) { ++ dev_err(dev, "the reg property is not assigned in %s node\n", ++ np->name); ++ return -EINVAL; ++ } ++ ++ u3phy->dev = dev; ++ phy_cfgs = match->data; ++ platform_set_drvdata(pdev, u3phy); ++ ++ /* find out a proper config which can be matched with dt. */ ++ index = 0; ++ while (phy_cfgs[index].reg) { ++ if (phy_cfgs[index].reg == reg[1]) { ++ u3phy->cfgs = &phy_cfgs[index]; ++ break; ++ } ++ ++ ++index; ++ } ++ ++ if (!u3phy->cfgs) { ++ dev_err(dev, "no phy-cfgs can be matched with %s node\n", ++ np->name); ++ return -EINVAL; ++ } ++ ++ ret = rockchip_u3phy_parse_dt(u3phy, pdev); ++ if (ret) { ++ dev_err(dev, "parse dt failed, ret(%d)\n", ret); ++ return ret; ++ } ++ ++ ret = rockchip_u3phy_clk_enable(u3phy); ++ if (ret) { ++ dev_err(dev, "clk enable failed, ret(%d)\n", ret); ++ return ret; ++ } ++ ++ rockchip_u3phy_rest_assert(u3phy); ++ rockchip_u3phy_rest_deassert(u3phy, U3PHY_APB_RST | U3PHY_POR_RST); ++ ++ index = 0; ++ for_each_available_child_of_node(np, child_np) { ++ struct rockchip_u3phy_port *u3phy_port = &u3phy->ports[index]; ++ ++ u3phy_port->index = index; ++ ret = rockchip_u3phy_port_init(u3phy, u3phy_port, child_np); ++ if (ret) { ++ dev_err(dev, "u3phy port init failed,ret(%d)\n", ret); ++ goto put_child; ++ } ++ ++ /* to prevent out of boundary */ ++ if (++index >= U3PHY_PORT_NUM) ++ break; ++ } ++ ++ provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); ++ if (IS_ERR_OR_NULL(provider)) ++ goto put_child; ++ ++ rockchip_u3phy_rest_deassert(u3phy, U3PHY_MAC_RST); ++ rockchip_u3phy_clk_disable(u3phy); ++ ++ u3phy->usb_phy.dev = dev; ++ u3phy->usb_phy.init = rockchip_u3phy_on_init; ++ u3phy->usb_phy.shutdown = rockchip_u3phy_on_shutdown; ++ u3phy->usb_phy.notify_disconnect = rockchip_u3phy_on_disconnect; ++ usb_add_phy(&u3phy->usb_phy, USB_PHY_TYPE_USB3); ++ ATOMIC_INIT_NOTIFIER_HEAD(&u3phy->usb_phy.notifier); ++ ++ rockchip_u3phy_debugfs_init(u3phy); ++ ++ dev_info(dev, "Rockchip u3phy initialized successfully\n"); ++ return 0; ++ ++put_child: ++ of_node_put(child_np); ++ return ret; ++} ++ ++static int rk3328_u3phy_pipe_power(struct rockchip_u3phy *u3phy, ++ struct rockchip_u3phy_port *u3phy_port, ++ bool on) ++{ ++ unsigned int reg; ++ ++ if (on) { ++ reg = readl(u3phy_port->base + 0x1a8); ++ reg &= ~BIT(4); /* ldo power up */ ++ writel(reg, u3phy_port->base + 0x1a8); ++ ++ reg = readl(u3phy_port->base + 0x044); ++ reg &= ~BIT(4); /* bg power on */ ++ writel(reg, u3phy_port->base + 0x044); ++ ++ reg = readl(u3phy_port->base + 0x150); ++ reg |= BIT(6); /* tx bias enable */ ++ writel(reg, u3phy_port->base + 0x150); ++ ++ reg = readl(u3phy_port->base + 0x080); ++ reg &= ~BIT(2); /* tx cm power up */ ++ writel(reg, u3phy_port->base + 0x080); ++ ++ reg = readl(u3phy_port->base + 0x0c0); ++ /* tx obs enable and rx cm enable */ ++ reg |= (BIT(3) | BIT(4)); ++ writel(reg, u3phy_port->base + 0x0c0); ++ ++ udelay(1); ++ } else { ++ reg = readl(u3phy_port->base + 0x1a8); ++ reg |= BIT(4); /* ldo power down */ ++ writel(reg, u3phy_port->base + 0x1a8); ++ ++ reg = readl(u3phy_port->base + 0x044); ++ reg |= BIT(4); /* bg power down */ ++ writel(reg, u3phy_port->base + 0x044); ++ ++ reg = readl(u3phy_port->base + 0x150); ++ reg &= ~BIT(6); /* tx bias disable */ ++ writel(reg, u3phy_port->base + 0x150); ++ ++ reg = readl(u3phy_port->base + 0x080); ++ reg |= BIT(2); /* tx cm power down */ ++ writel(reg, u3phy_port->base + 0x080); ++ ++ reg = readl(u3phy_port->base + 0x0c0); ++ /* tx obs disable and rx cm disable */ ++ reg &= ~(BIT(3) | BIT(4)); ++ writel(reg, u3phy_port->base + 0x0c0); ++ } ++ ++ return 0; ++} ++ ++static int rk3328_u3phy_tuning(struct rockchip_u3phy *u3phy, ++ struct rockchip_u3phy_port *u3phy_port, ++ struct device_node *child_np) ++{ ++ if (u3phy_port->type == U3PHY_TYPE_UTMI) { ++ /* ++ * For rk3328 SoC, pre-emphasis and pre-emphasis strength must ++ * be written as one fixed value as below. ++ * ++ * Dissimilarly, the odt 45ohm value should be flexibly tuninged ++ * for the different boards to adjust HS eye height, so its ++ * value can be assigned in DT in code design. ++ */ ++ ++ /* {bits[2:0]=111}: always enable pre-emphasis */ ++ u3phy->apbcfg.u2_pre_emp = 0x0f; ++ ++ /* {bits[5:3]=000}: pre-emphasis strength as the weakest */ ++ u3phy->apbcfg.u2_pre_emp_sth = 0x41; ++ ++ /* {bits[4:0]=10101}: odt 45ohm tuning */ ++ u3phy->apbcfg.u2_odt_tuning = 0xb5; ++ /* optional override of the odt 45ohm tuning */ ++ of_property_read_u32(child_np, "rockchip,odt-val-tuning", ++ &u3phy->apbcfg.u2_odt_tuning); ++ ++ writel(u3phy->apbcfg.u2_pre_emp, u3phy_port->base + 0x030); ++ writel(u3phy->apbcfg.u2_pre_emp_sth, u3phy_port->base + 0x040); ++ writel(u3phy->apbcfg.u2_odt_tuning, u3phy_port->base + 0x11c); ++ } else if (u3phy_port->type == U3PHY_TYPE_PIPE) { ++ if (u3phy_port->refclk_25m_quirk) { ++ dev_dbg(u3phy->dev, "switch to 25m refclk\n"); ++ /* ref clk switch to 25M */ ++ writel(0x64, u3phy_port->base + 0x11c); ++ writel(0x64, u3phy_port->base + 0x028); ++ writel(0x01, u3phy_port->base + 0x020); ++ writel(0x21, u3phy_port->base + 0x030); ++ writel(0x06, u3phy_port->base + 0x108); ++ writel(0x00, u3phy_port->base + 0x118); ++ } else { ++ /* configure for 24M ref clk */ ++ writel(0x80, u3phy_port->base + 0x10c); ++ writel(0x01, u3phy_port->base + 0x118); ++ writel(0x38, u3phy_port->base + 0x11c); ++ writel(0x83, u3phy_port->base + 0x020); ++ writel(0x02, u3phy_port->base + 0x108); ++ } ++ ++ /* Enable SSC */ ++ udelay(3); ++ writel(0x08, u3phy_port->base + 0x000); ++ writel(0x0c, u3phy_port->base + 0x120); ++ ++ /* Tuning Rx for compliance RJTL test */ ++ writel(0x70, u3phy_port->base + 0x150); ++ writel(0x12, u3phy_port->base + 0x0c8); ++ writel(0x05, u3phy_port->base + 0x148); ++ writel(0x08, u3phy_port->base + 0x068); ++ writel(0xf0, u3phy_port->base + 0x1c4); ++ writel(0xff, u3phy_port->base + 0x070); ++ writel(0x0f, u3phy_port->base + 0x06c); ++ writel(0xe0, u3phy_port->base + 0x060); ++ ++ /* ++ * Tuning Tx to increase the bias current ++ * used in TX driver and RX EQ, it can ++ * also increase the voltage of LFPS. ++ */ ++ writel(0x08, u3phy_port->base + 0x180); ++ } else { ++ dev_err(u3phy->dev, "invalid u3phy port type\n"); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static const struct rockchip_u3phy_cfg rk3328_u3phy_cfgs[] = { ++ { ++ .reg = 0xff470000, ++ .grfcfg = { ++ .um_suspend = { 0x0004, 15, 0, 0x1452, 0x15d1 }, ++ .u2_only_ctrl = { 0x0020, 15, 15, 0, 1 }, ++ .um_ls = { 0x0030, 5, 4, 0, 1 }, ++ .um_hstdct = { 0x0030, 7, 7, 0, 1 }, ++ .ls_det_en = { 0x0040, 0, 0, 0, 1 }, ++ .ls_det_st = { 0x0044, 0, 0, 0, 1 }, ++ .pp_pwr_st = { 0x0034, 14, 13, 0, 0}, ++ .pp_pwr_en = { {0x0020, 14, 0, 0x0014, 0x0005}, ++ {0x0020, 14, 0, 0x0014, 0x000d}, ++ {0x0020, 14, 0, 0x0014, 0x0015}, ++ {0x0020, 14, 0, 0x0014, 0x001d} }, ++ .u3_disable = { 0x04c4, 15, 0, 0x1100, 0x101}, ++ }, ++ .phy_pipe_power = rk3328_u3phy_pipe_power, ++ .phy_tuning = rk3328_u3phy_tuning, ++ }, ++ { /* sentinel */ } ++}; ++ ++static const struct of_device_id rockchip_u3phy_dt_match[] = { ++ { .compatible = "rockchip,rk3328-u3phy", .data = &rk3328_u3phy_cfgs }, ++ {} ++}; ++MODULE_DEVICE_TABLE(of, rockchip_u3phy_dt_match); ++ ++static struct platform_driver rockchip_u3phy_driver = { ++ .probe = rockchip_u3phy_probe, ++ .driver = { ++ .name = "rockchip-u3phy", ++ .of_match_table = rockchip_u3phy_dt_match, ++ }, ++}; ++module_platform_driver(rockchip_u3phy_driver); ++ ++MODULE_AUTHOR("Frank Wang "); ++MODULE_AUTHOR("William Wu "); ++MODULE_DESCRIPTION("Rockchip USB 3.0 PHY driver"); ++MODULE_LICENSE("GPL v2"); + +diff --git a/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb3.yaml b/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb3.yaml +new file mode 100644 +index 000000000000..f4f28625173a +--- /dev/null ++++ b/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb3.yaml +@@ -0,0 +1,157 @@ ++# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: "http://devicetree.org/schemas/phy/phy-rockchip-inno-usb3.yaml#" ++$schema: "http://devicetree.org/meta-schemas/core.yaml#" ++ ++title: ROCKCHIP USB 3.0 PHY WITH INNO IP BLOCK ++ ++maintainers: ++ ++properties: ++ compatible: ++ enum: ++ - rockchip,rk3328-u3phy ++ ++ reg: ++ - description: the base address of the USB 3.0 PHY ++ ++ interrupts: ++ maxItems: 1 ++ ++ interrupt-names: ++ items: ++ - const: linestate ++ description: host/otg linestate interrupt ++ ++ clocks: ++ maxItems: 2 ++ ++ clock-names: ++ items: ++ - const: u3phy-otg ++ description: USB 3.0 PHY UTMI ++ - const: u3phy-pipe ++ description: USB 3.0 PHY Pipe ++ ++ resets: ++ maxItems: 6 ++ ++ reset-names: ++ items: ++ - const: u3phy-u2-por ++ description: USB 2.0 logic of USB 3.0 PHY ++ - const: u3phy-u3-por ++ description: USB 3.0 logic of USB 3.0 PHY ++ - const: u3phy-pipe-mac ++ description: USB 3.0 PHY pipe MAC ++ - const: u3phy-utmi-mac ++ description: USB 3.0 PHY utmi MAC ++ - const: u3phy-utmi-apb ++ description: USB 3.0 PHY utmi apb ++ - const: u3phy-pipe-apb ++ description: USB 3.0 PHY pipe apb ++ ++ "#phy-cells": ++ const: 1 ++ ++ rockchip,u3phygrf: ++ $ref: /schemas/types.yaml#/definitions/phandle-array ++ type: array ++ - description: phandle to the syscon managing the ++ "USB 3.0 PHY general register files". ++ ++ vbus-drv-gpios: ++ $ref: /schemas/types.yaml#/definitions/phandle-array ++ type: array ++ - description: phandle for gpio vbus supply ++ ++required: ++ - compatible ++ - reg ++ - interrupts ++ - interrupt-names ++ - clocks ++ - clock-names ++ - resets ++ - reset-names ++ - "#phy-cells" ++ - rockchip,u3phygrf ++ ++patternProperties: ++ "^u3phy_utmi@[0-9a-f]+$": ++ type: object ++ ++ properties: ++ - description: USB 2.0 utmi phy. ++ ++ rockchip,odt-val-tuning: ++ type: boolean ++ - description: specify 45ohm ODT tuning value. ++ ++ "phy-cells": ++ const: 0 ++ ++ required: ++ - reg ++ - "#phy-cells" ++ ++patternProperties: ++ "^u3phy_pipe@[0-9a-f]+$": ++ type: object ++ ++ properties: ++ - description: USB 3.0 pipe phy. ++ ++ rockchip,refclk-25m-quirk : ++ ++ - description: phy reference clock changed to 25m quirk. ++ ++ "phy-cells": ++ const: 0 ++ ++ required: ++ - reg ++ - "#phy-cells" ++ ++examples: ++ ++usb3phy_grf: syscon@ff460000 { ++ compatible = "rockchip,usb3phy-grf", "syscon"; ++ reg = <0x0 0xff460000 0x0 0x1000>; ++}; ++ ++... ++ ++u3phy: usb3-phy@ff470000 { ++ compatible = "rockchip,rk3328-u3phy"; ++ reg = <0x0 0xff470000 0x0 0x0>; ++ rockchip,u3phygrf = <&usb3phy_grf>; ++ interrupts = ; ++ interrupt-names = "linestate"; ++ clocks = <&cru PCLK_USB3PHY_OTG>, <&cru PCLK_USB3PHY_PIPE>; ++ clock-names = "u3phy-otg", "u3phy-pipe"; ++ resets = <&cru SRST_USB3PHY_U2>, ++ <&cru SRST_USB3PHY_U3>, ++ <&cru SRST_USB3PHY_PIPE>, ++ <&cru SRST_USB3OTG_UTMI>, ++ <&cru SRST_USB3PHY_OTG_P>, ++ <&cru SRST_USB3PHY_PIPE_P>; ++ reset-names = "u3phy-u2-por", "u3phy-u3-por", ++ "u3phy-pipe-mac", "u3phy-utmi-mac", ++ "u3phy-utmi-apb", "u3phy-pipe-apb"; ++ vbus-drv-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ranges; ++ ++ u3phy_utmi: utmi@ff470000 { ++ reg = <0x0 0xff470000 0x0 0x8000>; ++ #phy-cells = <0>; ++ }; ++ ++ u3phy_pipe: pipe@ff478000 { ++ reg = <0x0 0xff478000 0x0 0x8000>; ++ #phy-cells = <0>; ++ }; ++}; +diff --git a/Documentation/devicetree/bindings/soc/rockchip/grf.txt b/Documentation/devicetree/bindings/soc/rockchip/grf.txt +index ada5435ce2c3..5f2f19344cc7 100644 +--- a/Documentation/devicetree/bindings/soc/rockchip/grf.txt ++++ b/Documentation/devicetree/bindings/soc/rockchip/grf.txt +@@ -34,6 +34,8 @@ Required Properties: + - "rockchip,rk3328-usb2phy-grf", "syscon": for rk3328 + - compatible: USBGRF should be one of the following: + - "rockchip,rv1108-usbgrf", "syscon": for rv1108 ++- compatible: USB3PHYGRF should be one of the following: ++ - "rockchip,u3phy-grf", "syscon" + - reg: physical base address of the controller and length of memory mapped + region. + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +index 31cc1541f1f5..072e988ad655 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -805,6 +805,47 @@ + }; + }; + ++ usb3phy_grf: syscon@ff460000 { ++ compatible = "rockchip,usb3phy-grf", "syscon"; ++ reg = <0x0 0xff460000 0x0 0x1000>; ++ }; ++ ++ u3phy: usb3-phy@ff470000 { ++ compatible = "rockchip,rk3328-u3phy"; ++ reg = <0x0 0xff470000 0x0 0x0>; ++ rockchip,u3phygrf = <&usb3phy_grf>; ++ rockchip,grf = <&grf>; ++ interrupts = ; ++ interrupt-names = "linestate"; ++ clocks = <&cru PCLK_USB3PHY_OTG>, <&cru PCLK_USB3PHY_PIPE>; ++ clock-names = "u3phy-otg", "u3phy-pipe"; ++ resets = <&cru SRST_USB3PHY_U2>, ++ <&cru SRST_USB3PHY_U3>, ++ <&cru SRST_USB3PHY_PIPE>, ++ <&cru SRST_USB3OTG_UTMI>, ++ <&cru SRST_USB3PHY_OTG_P>, ++ <&cru SRST_USB3PHY_PIPE_P>; ++ reset-names = "u3phy-u2-por", "u3phy-u3-por", ++ "u3phy-pipe-mac", "u3phy-utmi-mac", ++ "u3phy-utmi-apb", "u3phy-pipe-apb"; ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ranges; ++ status = "disabled"; ++ ++ u3phy_utmi: utmi@ff470000 { ++ reg = <0x0 0xff470000 0x0 0x8000>; ++ #phy-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ u3phy_pipe: pipe@ff478000 { ++ reg = <0x0 0xff478000 0x0 0x8000>; ++ #phy-cells = <0>; ++ status = "disabled"; ++ }; ++ }; ++ + sdmmc: dwmmc@ff500000 { + compatible = "rockchip,rk3328-dw-mshc", "rockchip,rk3288-dw-mshc"; + reg = <0x0 0xff500000 0x0 0x4000>; +@@ -936,6 +977,37 @@ + status = "disabled"; + }; + ++ usbdrd3: usb@ff600000 { ++ compatible = "rockchip,rk3328-dwc3", "rockchip,rk3399-dwc3"; ++ clocks = <&cru SCLK_USB3OTG_REF>, <&cru ACLK_USB3OTG>, ++ <&cru SCLK_USB3OTG_SUSPEND>; ++ clock-names = "ref", "bus_early", ++ "suspend"; ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ranges; ++ clock-ranges; ++ status = "disabled"; ++ ++ usbdrd_dwc3: dwc3@ff600000 { ++ compatible = "snps,dwc3"; ++ reg = <0x0 0xff600000 0x0 0x100000>; ++ interrupts = ; ++ dr_mode = "otg"; ++ phys = <&u3phy_utmi>, <&u3phy_pipe>; ++ phy-names = "usb2-phy", "usb3-phy"; ++ phy_type = "utmi_wide"; ++ snps,dis_enblslpm_quirk; ++ snps,dis-u2-freeclk-exists-quirk; ++ snps,dis_u2_susphy_quirk; ++ snps,dis_u3_susphy_quirk; ++ snps,dis-del-phy-power-chg-quirk; ++ snps,dis-tx-ipgap-linecheck-quirk; ++ snps,xhci-trb-ent-quirk; ++ status = "disabled"; ++ }; ++ }; ++ + gic: interrupt-controller@ff811000 { + compatible = "arm,gic-400"; + #interrupt-cells = <3>; + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +index bb40c163b05d..f300f3d0f02e 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +@@ -328,6 +328,18 @@ + status = "okay"; + }; + ++&u3phy { ++ status = "okay"; ++}; ++ ++&u3phy_utmi { ++ status = "okay"; ++}; ++ ++&u3phy_pipe { ++ status = "okay"; ++}; ++ + &uart2 { + status = "okay"; + }; +@@ -344,6 +356,15 @@ + status = "okay"; + }; + ++&usbdrd3 { ++ status = "okay"; ++}; ++ ++&usbdrd_dwc3 { ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ + &vop { + status = "okay"; + }; + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +index 62936b432..f97446924 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +@@ -383,6 +383,18 @@ + status = "okay"; + }; + ++&u3phy { ++ status = "okay"; ++}; ++ ++&u3phy_utmi { ++ status = "okay"; ++}; ++ ++&u3phy_pipe { ++ status = "okay"; ++}; ++ + &usb_host0_ehci { + status = "okay"; + }; +@@ -391,6 +403,15 @@ + status = "okay"; + }; + ++&usbdrd3 { ++ status = "okay"; ++}; ++ ++&usbdrd_dwc3 { ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ + &vop { + status = "okay"; + }; diff --git a/patch/kernel/rockchip64-dev/ayufan-dts-rockpro64-change-rx_delay-for-gmac.patch b/patch/kernel/rockchip64-dev/ayufan-dts-rockpro64-change-rx_delay-for-gmac.patch new file mode 100644 index 0000000000..7dea04d2a1 --- /dev/null +++ b/patch/kernel/rockchip64-dev/ayufan-dts-rockpro64-change-rx_delay-for-gmac.patch @@ -0,0 +1,26 @@ +From 57825a7190ac09a1e273cab12e797010fcb7a1c9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= +Date: Sun, 30 Dec 2018 13:32:47 +0100 +Subject: [PATCH] ayufan: dts: rockpro64: change rx_delay for gmac + +Change-Id: Ib3899f684188aa1ed1545717af004bba53fe0e07 +--- + arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts +index cdab3089046c..0db9de46ff16 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts +@@ -249,7 +249,7 @@ + snps,reset-active-low; + snps,reset-delays-us = <0 10000 50000>; + tx_delay = <0x28>; +- rx_delay = <0x11>; ++ rx_delay = <0x20>; + status = "okay"; + }; + +-- +2.20.1 + diff --git a/patch/kernel/rockchip64-dev/board-renegade-add-HDMI-nodes.patch b/patch/kernel/rockchip64-dev/board-renegade-add-HDMI-nodes.patch deleted file mode 100644 index 56ed1db594..0000000000 --- a/patch/kernel/rockchip64-dev/board-renegade-add-HDMI-nodes.patch +++ /dev/null @@ -1,45 +0,0 @@ -From a6694d42593994487c55738e790a3728b1a07706 Mon Sep 17 00:00:00 2001 -From: Levin Du -Date: Wed, 15 Aug 2018 17:39:46 +0800 -Subject: [PATCH] arm64: dts: rockchip: enable HDMI display nodes on - roc-rk3328-cc - -Enable necessary nodes to get output on the hdmi port of the board. - -Signed-off-by: Heiko Stuebner -Signed-off-by: Levin Du ---- - arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -index 6ba67963eaf5..8e85f07092bb 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -@@ -112,6 +112,14 @@ - status = "okay"; - }; - -+&hdmi { -+ status = "okay"; -+}; -+ -+&hdmiphy { -+ status = "okay"; -+}; -+ - &i2c1 { - status = "okay"; - -@@ -304,3 +312,11 @@ - dr_mode = "host"; - status = "okay"; - }; -+ -+&vop { -+ status = "okay"; -+}; -+ -+&vop_mmu { -+ status = "okay"; -+}; diff --git a/patch/kernel/rockchip64-dev/board-renegade-add-LEDs.patch b/patch/kernel/rockchip64-dev/board-renegade-add-LEDs.patch deleted file mode 100644 index 45fc06ea89..0000000000 --- a/patch/kernel/rockchip64-dev/board-renegade-add-LEDs.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -index 33c44e857..171c377f8 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -@@ -81,6 +81,25 @@ - regulator-always-on; - regulator-boot-on; - }; -+ -+ leds { -+ compatible = "gpio-leds"; -+ power { -+ label = "firefly:blue:power"; -+ linux,default-trigger = "heartbeat"; -+ gpios = <&rk805 1 GPIO_ACTIVE_LOW>; -+ default-state = "on"; -+ mode = <0x23>; -+ }; -+ -+ user { -+ label = "firefly:yellow:user"; -+ linux,default-trigger = "mmc1"; -+ gpios = <&rk805 0 GPIO_ACTIVE_LOW>; -+ default-state = "off"; -+ mode = <0x05>; -+ }; -+ }; - }; - - &cpu0 { diff --git a/patch/kernel/rockchip64-dev/board-renegade-add-enable-usb3.patch b/patch/kernel/rockchip64-dev/board-renegade-add-enable-usb3.patch deleted file mode 100644 index 1285dba635..0000000000 --- a/patch/kernel/rockchip64-dev/board-renegade-add-enable-usb3.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 41ae689ad428568a22f06fcb248f20af52770afe Mon Sep 17 00:00:00 2001 -From: Levin Du -Date: Wed, 15 Aug 2018 17:22:37 +0800 -Subject: [PATCH] arm64: dts: rockchip: enable usb3 for roc-rk3328-cc board - -Enable the USB 3.0 OTG controller and set as static xHCI host controller to -support USB 3.0 HOST. - -Signed-off-by: Levin Du ---- - arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -index 99d0d9912950..6ba67963eaf5 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -@@ -295,3 +295,12 @@ - &usb_host0_ohci { - status = "okay"; - }; -+ -+&usbdrd3 { -+ status = "okay"; -+}; -+ -+&usbdrd_dwc3 { -+ dr_mode = "host"; -+ status = "okay"; -+}; diff --git a/patch/kernel/rockchip64-dev/board-renegade-dts-cleanup.patch b/patch/kernel/rockchip64-dev/board-renegade-dts-cleanup.patch index 6bab9fe1ea..533debc6b7 100644 --- a/patch/kernel/rockchip64-dev/board-renegade-dts-cleanup.patch +++ b/patch/kernel/rockchip64-dev/board-renegade-dts-cleanup.patch @@ -1,5 +1,5 @@ diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -index 994e7bdb3..11454de93 100644 +index a1041ec3e..bb8748553 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts @@ -14,6 +14,21 @@ @@ -24,14 +24,14 @@ index 994e7bdb3..11454de93 100644 gmac_clkin: external-gmac-clock { compatible = "fixed-clock"; clock-frequency = <125000000>; -@@ -81,28 +96,21 @@ - regulator-always-on; - regulator-boot-on; +@@ -77,26 +92,6 @@ + pinctrl-0 = <&ir_int>; + pinctrl-names = "default"; }; -+}; - +- - leds { - compatible = "gpio-leds"; +- - power { - label = "firefly:blue:power"; - linux,default-trigger = "heartbeat"; @@ -39,10 +39,7 @@ index 994e7bdb3..11454de93 100644 - default-state = "on"; - mode = <0x23>; - }; -+&cpu0 { -+ cpu-supply = <&vdd_arm>; -+}; - +- - user { - label = "firefly:yellow:user"; - linux,default-trigger = "mmc1"; @@ -51,42 +48,6 @@ index 994e7bdb3..11454de93 100644 - mode = <0x05>; - }; - }; -+&cpu1 { -+ cpu-supply = <&vdd_arm>; }; --&cpu0 { -+&cpu2 { -+ cpu-supply = <&vdd_arm>; -+}; -+ -+&cpu3 { - cpu-supply = <&vdd_arm>; - }; - -@@ -326,19 +334,20 @@ - status = "okay"; - }; - --&vop { -+&usbdrd3 { - status = "okay"; - }; - --&vop_mmu { -+&usbdrd_dwc3 { -+ dr_mode = "host"; - status = "okay"; - }; - --&usbdrd3 { -+&vop { - status = "okay"; - }; - --&usbdrd_dwc3 { -- dr_mode = "host"; -+&vop_mmu { - status = "okay"; - }; -+ + &analog_sound { diff --git a/patch/kernel/rockchip64-dev/board-renegade-add-otg-host.patch b/patch/kernel/rockchip64-dev/board-rk3328-roc-cc-dts-set-otg-host.patch similarity index 83% rename from patch/kernel/rockchip64-dev/board-renegade-add-otg-host.patch rename to patch/kernel/rockchip64-dev/board-rk3328-roc-cc-dts-set-otg-host.patch index e35d08ad2e..4ef09d037d 100644 --- a/patch/kernel/rockchip64-dev/board-renegade-add-otg-host.patch +++ b/patch/kernel/rockchip64-dev/board-rk3328-roc-cc-dts-set-otg-host.patch @@ -1,12 +1,11 @@ diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -index 730d6cf8e..994e7bdb3 100644 +index f300f3d0f..f4b6799a8 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts -@@ -313,6 +313,8 @@ +@@ -345,6 +345,7 @@ }; &usb20_otg { -+ + dr_mode = "host"; status = "okay"; }; diff --git a/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-add-sound-pcie-supplies.patch b/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-add-sound-pcie-supplies.patch new file mode 100644 index 0000000000..9959b52baf --- /dev/null +++ b/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-add-sound-pcie-supplies.patch @@ -0,0 +1,62 @@ +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi +index 5affe5b6c..646c9af02 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi +@@ -188,6 +225,10 @@ + status = "okay"; + }; + ++&hdmi_sound { ++ status = "okay"; ++}; ++ + &i2c0 { + clock-frequency = <400000>; + i2c-scl-rising-time-ns = <168>; +@@ -584,6 +652,16 @@ + status = "okay"; + }; + ++&spi1 { ++ status = "okay"; ++ ++ flash@0 { ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ spi-max-frequency = <10000000>; ++ }; ++}; ++ + &tcphy0 { + status = "okay"; + }; +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc-mezzanine.dts b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc-mezzanine.dts +index d6b3042cf..e9bf3290c 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc-mezzanine.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc-mezzanine.dts +@@ -11,6 +11,16 @@ + model = "Firefly ROC-RK3399-PC Mezzanine Board"; + compatible = "firefly,roc-rk3399-pc-mezzanine", "rockchip,rk3399"; + ++ vcca_0v9: vcca-0v9 { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcca_0v9"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ + vcc3v3_ngff: vcc3v3-ngff { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_ngff"; +@@ -50,6 +60,8 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pcie_perst>; + vpcie3v3-supply = <&vcc3v3_pcie>; ++ vpcie1v8-supply = <&vcc1v8_pmu>; ++ vpcie3v3-supply = <&vcca_0v9>; + status = "okay"; + }; + diff --git a/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-disable-hs400.patch b/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-disable-hs400.patch index 70153b3dde..a80ea83a7e 100644 --- a/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-disable-hs400.patch +++ b/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-disable-hs400.patch @@ -5,10 +5,10 @@ See: https://lkml.org/lkml/2019/11/11/203 https://lkml.org/lkml/2019/11/15/444 -diff --git a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dts b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dts +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi index 19f7732d7..bef364a09 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dts +--- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi @@ -646,8 +646,7 @@ &sdhci { diff --git a/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-fusb302-compatible.patch b/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-fusb302-compatible.patch new file mode 100644 index 0000000000..3d1eeb0379 --- /dev/null +++ b/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-fusb302-compatible.patch @@ -0,0 +1,22 @@ +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi +index 646c9af02..13eda9d0b 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi +@@ -475,7 +475,7 @@ + status = "okay"; + + fusb1: usb-typec@22 { +- compatible = "fcs,fusb302"; ++ compatible = "fairchild,fusb302"; + reg = <0x22>; + interrupt-parent = <&gpio1>; + interrupts = <1 IRQ_TYPE_LEVEL_LOW>; +@@ -492,7 +492,7 @@ + status = "okay"; + + fusb0: usb-typec@22 { +- compatible = "fcs,fusb302"; ++ compatible = "fairchild,fusb302"; + reg = <0x22>; + interrupt-parent = <&gpio1>; + interrupts = <2 IRQ_TYPE_LEVEL_LOW>; diff --git a/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-regulator.patch b/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-regulator.patch deleted file mode 100644 index da812d1448..0000000000 --- a/patch/kernel/rockchip64-dev/board-roc-rk3399-pc-fix-regulator.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dts -@@ -113,6 +113,10 @@ - - vcc_sys: vcc-sys { - compatible = "regulator-fixed"; -+ enable-active-high; -+ gpio = <&gpio2 RK_PA6 GPIO_ACTIVE_HIGH>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&vcc_sys_en>; - regulator-name = "vcc_sys"; - regulator-always-on; - regulator-boot-on; -@@ -521,6 +525,10 @@ - rockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; - }; - -+ vcc_sys_en: vcc-sys-en { -+ rockchip,pins = <2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ - hub_rst: hub-rst { - rockchip,pins = <2 RK_PA4 RK_FUNC_GPIO &pcfg_output_high>; - }; diff --git a/patch/kernel/rockchip64-dev/board-rock64-add-audio.patch b/patch/kernel/rockchip64-dev/board-rock64-add-audio.patch new file mode 100644 index 0000000000..8799c0a6f6 --- /dev/null +++ b/patch/kernel/rockchip64-dev/board-rock64-add-audio.patch @@ -0,0 +1,90 @@ +diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +index f97446924..d9a1cb24a 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +@@ -83,34 +83,14 @@ + linux,default-trigger = "heartbeat"; + }; + }; ++}; + +- sound { +- compatible = "audio-graph-card"; +- label = "rockchip,rk3328"; +- dais = <&i2s1_p0 +- &spdif_p0>; +- }; +- +- spdif-dit { +- compatible = "linux,spdif-dit"; +- #sound-dai-cells = <0>; +- +- port { +- dit_p0_0: endpoint { +- remote-endpoint = <&spdif_p0_0>; +- }; +- }; +- }; ++&analog_sound { ++ status = "okay"; + }; + + &codec { + status = "okay"; +- +- port@0 { +- codec_p0_0: endpoint { +- remote-endpoint = <&i2s1_p0_0>; +- }; +- }; + }; + + &cpu0 { +@@ -166,6 +146,10 @@ + status = "okay"; + }; + ++&hdmi_sound { ++ stratus = "okay"; ++}; ++ + &i2c1 { + status = "okay"; + +@@ -277,16 +261,12 @@ + }; + }; + +-&i2s1 { ++&i2s0 { + status = "okay"; ++}; + +- i2s1_p0: port { +- i2s1_p0_0: endpoint { +- dai-format = "i2s"; +- mclk-fs = <256>; +- remote-endpoint = <&codec_p0_0>; +- }; +- }; ++&i2s1 { ++ status = "okay"; + }; + + &io_domains { +@@ -336,12 +316,10 @@ + &spdif { + pinctrl-0 = <&spdifm0_tx>; + status = "okay"; ++}; + +- spdif_p0: port { +- spdif_p0_0: endpoint { +- remote-endpoint = <&dit_p0_0>; +- }; +- }; ++&spdif_sound { ++ status = "okay"; + }; + + &spi0 { diff --git a/patch/kernel/rockchip64-dev/board-rockpro64-remove-duplicate-spi-nor.patch b/patch/kernel/rockchip64-dev/board-rockpro64-remove-duplicate-spi-nor.patch deleted file mode 100644 index 236f8e3bc9..0000000000 --- a/patch/kernel/rockchip64-dev/board-rockpro64-remove-duplicate-spi-nor.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts -index f04cd5c..ed3ebdf 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts -+++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts -@@ -757,16 +757,6 @@ - status = "okay"; - }; - --&spi1 { -- status = "okay"; -- -- flash@0 { -- compatible = "jedec,spi-nor"; -- reg = <0>; -- spi-max-frequency = <10000000>; -- }; --}; -- - &tcphy0 { - status = "okay"; - }; diff --git a/patch/kernel/rockchip64-dev/fix-rockpro64-emmc.patch b/patch/kernel/rockchip64-dev/fix-rockpro64-emmc.patch index a4b7ea0dfb..66f5bc5093 100644 --- a/patch/kernel/rockchip64-dev/fix-rockpro64-emmc.patch +++ b/patch/kernel/rockchip64-dev/fix-rockpro64-emmc.patch @@ -1,24 +1,20 @@ diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts -index 4cbca4d..7421b71 100644 +index 714616618..b1fb824f3 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts +++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts -@@ -15,7 +15,7 @@ +@@ -15,6 +15,7 @@ compatible = "pine64,rockpro64", "rockchip,rk3399"; chosen { -- bootargs = "earlycon=uart8250,mmio32,0xff1a0000"; + bootargs = "mmc_cmdqueue=0 earlycon=uart8250,mmio32,0xff1a0000"; stdout-path = "serial2:1500000n8"; }; -@@ -721,8 +721,10 @@ - //mmc-hs400-1_8v; - mmc-hs200-1_8v; - //mmc-hs400-enhanced-strobe; +@@ -635,6 +636,7 @@ + + &sdhci { + bus-width = <8>; + keep-power-in-suspend; -+ supports-emmc; + mmc-hs200-1_8v; non-removable; status = "okay"; - }; - - &tcphy0 { diff --git a/patch/kernel/rockchip64-dev/fix-spi1-flash-speed.patch b/patch/kernel/rockchip64-dev/fix-spi1-flash-speed.patch index 39760697a9..61c91878f2 100644 --- a/patch/kernel/rockchip64-dev/fix-spi1-flash-speed.patch +++ b/patch/kernel/rockchip64-dev/fix-spi1-flash-speed.patch @@ -1,13 +1,13 @@ diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts -index 4cbca4d..1a19ae1 100644 +index 49050de8c..714616618 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts +++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts -@@ -821,7 +890,7 @@ - #size-cells = <1>; +@@ -646,7 +646,7 @@ + flash@0 { compatible = "jedec,spi-nor"; - reg = <0x0>; + reg = <0>; - spi-max-frequency = <10000000>; + spi-max-frequency = <3000000>; - status = "okay"; - m25p,fast-read; + }; + }; diff --git a/patch/kernel/rockchip64-dev/general-add-overlay-configfs.patch b/patch/kernel/rockchip64-dev/general-add-overlay-configfs.patch new file mode 100644 index 0000000000..cc68eadccd --- /dev/null +++ b/patch/kernel/rockchip64-dev/general-add-overlay-configfs.patch @@ -0,0 +1,430 @@ +Below patch is a squash of following 4 commits borrowed from ayufan's +https://github.com/ayufan-rock64/linux-mainline-kernel repo: + +From cc22206776d61948f6984a4f03d8013eb4f92984 Mon Sep 17 00:00:00 2001 +From: Pantelis Antoniou +Date: Wed, 3 Dec 2014 13:23:28 +0200 +Subject: [PATCH] OF: DT-Overlay configfs interface + +This is a port of Pantelis Antoniou's v3 port that makes use of the +new upstreamed configfs support for binary attributes. + +Original commit message: + +Add a runtime interface to using configfs for generic device tree overlay +usage. With it its possible to use device tree overlays without having +to use a per-platform overlay manager. + +Please see Documentation/devicetree/configfs-overlays.txt for more info. + +Changes since v2: +- Removed ifdef CONFIG_OF_OVERLAY (since for now it's required) +- Created a documentation entry +- Slight rewording in Kconfig + +Changes since v1: +- of_resolve() -> of_resolve_phandles(). + +Originally-signed-off-by: Pantelis Antoniou +Signed-off-by: Phil Elwell + +DT configfs: Fix build errors on other platforms + +Signed-off-by: Phil Elwell + +DT configfs: fix build error + +There is an error when compiling rpi-4.6.y branch: + CC drivers/of/configfs.o +drivers/of/configfs.c:291:21: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types] + .default_groups = of_cfs_def_groups, + ^ +drivers/of/configfs.c:291:21: note: (near initialization for 'of_cfs_subsys.su_group.default_groups.next') + +The .default_groups is linked list since commit +1ae1602de028acaa42a0f6ff18d19756f8e825c6. +This commit uses configfs_add_default_group to fix this problem. + +Change-Id: Id4903c9725ebc355aadd067bbc32047db622ce61 +Signed-off-by: Slawomir Stepien + +From 7cfb967c52d374ddcb0fc9194f38d1d5f9d8cdd8 Mon Sep 17 00:00:00 2001 +From: popcornmix +Date: Sun, 3 Dec 2017 21:43:03 +0000 +Subject: [PATCH] configfs: New of_overlay API + +From 8637321fabb045fe8617360ef1b058978b0d8457 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Mon, 4 Dec 2017 14:07:40 +0000 +Subject: [PATCH] SQUASH: config_fs: of_overlay_apply takes a pointer + +Signed-off-by: Phil Elwell + +From 274dfabb947ca32116a429c582c74aaee6ff1b5b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= +Date: Mon, 14 May 2018 11:28:09 +0200 +Subject: [PATCH] ayufan: fix overlayfs to compile on 4.17 kernel + +Change-Id: I421887697d2ba6e52aba9100100b7664760e2001 + +diff --git a/Documentation/devicetree/configfs-overlays.txt b/Documentation/devicetree/configfs-overlays.txt +new file mode 100644 +index 0000000000000..5fa43e0643072 +--- /dev/null ++++ b/Documentation/devicetree/configfs-overlays.txt +@@ -0,0 +1,31 @@ ++Howto use the configfs overlay interface. ++ ++A device-tree configfs entry is created in /config/device-tree/overlays ++and and it is manipulated using standard file system I/O. ++Note that this is a debug level interface, for use by developers and ++not necessarily something accessed by normal users due to the ++security implications of having direct access to the kernel's device tree. ++ ++* To create an overlay you mkdir the directory: ++ ++ # mkdir /config/device-tree/overlays/foo ++ ++* Either you echo the overlay firmware file to the path property file. ++ ++ # echo foo.dtbo >/config/device-tree/overlays/foo/path ++ ++* Or you cat the contents of the overlay to the dtbo file ++ ++ # cat foo.dtbo >/config/device-tree/overlays/foo/dtbo ++ ++The overlay file will be applied, and devices will be created/destroyed ++as required. ++ ++To remove it simply rmdir the directory. ++ ++ # rmdir /config/device-tree/overlays/foo ++ ++The rationalle of the dual interface (firmware & direct copy) is that each is ++better suited to different use patterns. The firmware interface is what's ++intended to be used by hardware managers in the kernel, while the copy interface ++make sense for developers (since it avoids problems with namespaces). +diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig +index 37c2ccbefecdc..d3fc81a40c0e7 100644 +--- a/drivers/of/Kconfig ++++ b/drivers/of/Kconfig +@@ -103,4 +103,11 @@ config OF_OVERLAY + config OF_NUMA + bool + ++config OF_CONFIGFS ++ bool "Device Tree Overlay ConfigFS interface" ++ select CONFIGFS_FS ++ select OF_OVERLAY ++ help ++ Enable a simple user-space driven DT overlay interface. ++ + endif # OF +diff --git a/drivers/of/Makefile b/drivers/of/Makefile +index 663a4af0cccd5..b00a95adf5199 100644 +--- a/drivers/of/Makefile ++++ b/drivers/of/Makefile +@@ -1,6 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + obj-y = base.o device.o platform.o property.o + obj-$(CONFIG_OF_KOBJ) += kobj.o ++obj-$(CONFIG_OF_CONFIGFS) += configfs.o + obj-$(CONFIG_OF_DYNAMIC) += dynamic.o + obj-$(CONFIG_OF_FLATTREE) += fdt.o + obj-$(CONFIG_OF_EARLY_FLATTREE) += fdt_address.o +diff --git a/drivers/of/configfs.c b/drivers/of/configfs.c +new file mode 100644 +index 000000000..5dd509e8f +--- /dev/null ++++ b/drivers/of/configfs.c +@@ -0,0 +1,290 @@ ++/* ++ * Configfs entries for device-tree ++ * ++ * Copyright (C) 2013 - Pantelis Antoniou ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "of_private.h" ++ ++struct cfs_overlay_item { ++ struct config_item item; ++ ++ char path[PATH_MAX]; ++ ++ const struct firmware *fw; ++ struct device_node *overlay; ++ int ov_id; ++ ++ void *dtbo; ++ int dtbo_size; ++}; ++ ++static int create_overlay(struct cfs_overlay_item *overlay, void *blob, u32 blob_size) ++{ ++ int err; ++ ++ err = of_overlay_fdt_apply(blob, blob_size, &overlay->ov_id); ++ if (err < 0) { ++ pr_err("%s: Failed to create overlay (err=%d)\n", ++ __func__, err); ++ goto out_err; ++ } ++ ++out_err: ++ return err; ++} ++ ++static inline struct cfs_overlay_item *to_cfs_overlay_item( ++ struct config_item *item) ++{ ++ return item ? container_of(item, struct cfs_overlay_item, item) : NULL; ++} ++ ++static ssize_t cfs_overlay_item_path_show(struct config_item *item, ++ char *page) ++{ ++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item); ++ return sprintf(page, "%s\n", overlay->path); ++} ++ ++static ssize_t cfs_overlay_item_path_store(struct config_item *item, ++ const char *page, size_t count) ++{ ++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item); ++ const char *p = page; ++ char *s; ++ int err; ++ ++ /* if it's set do not allow changes */ ++ if (overlay->path[0] != '\0' || overlay->dtbo_size > 0) ++ return -EPERM; ++ ++ /* copy to path buffer (and make sure it's always zero terminated */ ++ count = snprintf(overlay->path, sizeof(overlay->path) - 1, "%s", p); ++ overlay->path[sizeof(overlay->path) - 1] = '\0'; ++ ++ /* strip trailing newlines */ ++ s = overlay->path + strlen(overlay->path); ++ while (s > overlay->path && *--s == '\n') ++ *s = '\0'; ++ ++ pr_debug("%s: path is '%s'\n", __func__, overlay->path); ++ ++ err = request_firmware(&overlay->fw, overlay->path, NULL); ++ if (err != 0) ++ goto out_err; ++ ++ err = create_overlay(overlay, (void *)overlay->fw->data, overlay->fw->size); ++ if (err != 0) ++ goto out_err; ++ ++ return count; ++ ++out_err: ++ ++ release_firmware(overlay->fw); ++ overlay->fw = NULL; ++ ++ overlay->path[0] = '\0'; ++ return err; ++} ++ ++static ssize_t cfs_overlay_item_status_show(struct config_item *item, ++ char *page) ++{ ++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item); ++ ++ return sprintf(page, "%s\n", ++ overlay->ov_id >= 0 ? "applied" : "unapplied"); ++} ++ ++CONFIGFS_ATTR(cfs_overlay_item_, path); ++CONFIGFS_ATTR_RO(cfs_overlay_item_, status); ++ ++static struct configfs_attribute *cfs_overlay_attrs[] = { ++ &cfs_overlay_item_attr_path, ++ &cfs_overlay_item_attr_status, ++ NULL, ++}; ++ ++ssize_t cfs_overlay_item_dtbo_read(struct config_item *item, ++ void *buf, size_t max_count) ++{ ++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item); ++ ++ pr_debug("%s: buf=%p max_count=%zu\n", __func__, ++ buf, max_count); ++ ++ if (overlay->dtbo == NULL) ++ return 0; ++ ++ /* copy if buffer provided */ ++ if (buf != NULL) { ++ /* the buffer must be large enough */ ++ if (overlay->dtbo_size > max_count) ++ return -ENOSPC; ++ ++ memcpy(buf, overlay->dtbo, overlay->dtbo_size); ++ } ++ ++ return overlay->dtbo_size; ++} ++ ++ssize_t cfs_overlay_item_dtbo_write(struct config_item *item, ++ const void *buf, size_t count) ++{ ++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item); ++ int err; ++ ++ /* if it's set do not allow changes */ ++ if (overlay->path[0] != '\0' || overlay->dtbo_size > 0) ++ return -EPERM; ++ ++ /* copy the contents */ ++ overlay->dtbo = kmemdup(buf, count, GFP_KERNEL); ++ if (overlay->dtbo == NULL) ++ return -ENOMEM; ++ ++ overlay->dtbo_size = count; ++ ++ err = create_overlay(overlay, overlay->dtbo, overlay->dtbo_size); ++ if (err != 0) ++ goto out_err; ++ ++ return count; ++ ++out_err: ++ kfree(overlay->dtbo); ++ overlay->dtbo = NULL; ++ overlay->dtbo_size = 0; ++ ++ return err; ++} ++ ++CONFIGFS_BIN_ATTR(cfs_overlay_item_, dtbo, NULL, SZ_1M); ++ ++static struct configfs_bin_attribute *cfs_overlay_bin_attrs[] = { ++ &cfs_overlay_item_attr_dtbo, ++ NULL, ++}; ++ ++static void cfs_overlay_release(struct config_item *item) ++{ ++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item); ++ ++ if (overlay->ov_id >= 0) ++ of_overlay_remove(&overlay->ov_id); ++ if (overlay->fw) ++ release_firmware(overlay->fw); ++ /* kfree with NULL is safe */ ++ kfree(overlay->dtbo); ++ kfree(overlay); ++} ++ ++static struct configfs_item_operations cfs_overlay_item_ops = { ++ .release = cfs_overlay_release, ++}; ++ ++static struct config_item_type cfs_overlay_type = { ++ .ct_item_ops = &cfs_overlay_item_ops, ++ .ct_attrs = cfs_overlay_attrs, ++ .ct_bin_attrs = cfs_overlay_bin_attrs, ++ .ct_owner = THIS_MODULE, ++}; ++ ++static struct config_item *cfs_overlay_group_make_item( ++ struct config_group *group, const char *name) ++{ ++ struct cfs_overlay_item *overlay; ++ ++ overlay = kzalloc(sizeof(*overlay), GFP_KERNEL); ++ if (!overlay) ++ return ERR_PTR(-ENOMEM); ++ overlay->ov_id = -1; ++ ++ config_item_init_type_name(&overlay->item, name, &cfs_overlay_type); ++ return &overlay->item; ++} ++ ++static void cfs_overlay_group_drop_item(struct config_group *group, ++ struct config_item *item) ++{ ++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item); ++ ++ config_item_put(&overlay->item); ++} ++ ++static struct configfs_group_operations overlays_ops = { ++ .make_item = cfs_overlay_group_make_item, ++ .drop_item = cfs_overlay_group_drop_item, ++}; ++ ++static struct config_item_type overlays_type = { ++ .ct_group_ops = &overlays_ops, ++ .ct_owner = THIS_MODULE, ++}; ++ ++static struct configfs_group_operations of_cfs_ops = { ++ /* empty - we don't allow anything to be created */ ++}; ++ ++static struct config_item_type of_cfs_type = { ++ .ct_group_ops = &of_cfs_ops, ++ .ct_owner = THIS_MODULE, ++}; ++ ++struct config_group of_cfs_overlay_group; ++ ++static struct configfs_subsystem of_cfs_subsys = { ++ .su_group = { ++ .cg_item = { ++ .ci_namebuf = "device-tree", ++ .ci_type = &of_cfs_type, ++ }, ++ }, ++ .su_mutex = __MUTEX_INITIALIZER(of_cfs_subsys.su_mutex), ++}; ++ ++static int __init of_cfs_init(void) ++{ ++ int ret; ++ ++ pr_info("%s\n", __func__); ++ ++ config_group_init(&of_cfs_subsys.su_group); ++ config_group_init_type_name(&of_cfs_overlay_group, "overlays", ++ &overlays_type); ++ configfs_add_default_group(&of_cfs_overlay_group, ++ &of_cfs_subsys.su_group); ++ ++ ret = configfs_register_subsystem(&of_cfs_subsys); ++ if (ret != 0) { ++ pr_err("%s: failed to register subsys\n", __func__); ++ goto out; ++ } ++ pr_info("%s: OK\n", __func__); ++out: ++ return ret; ++} ++late_initcall(of_cfs_init); diff --git a/patch/kernel/rockchip64-dev/orangepi-rk3399-dts.patch b/patch/kernel/rockchip64-dev/orangepi-rk3399-dts.patch deleted file mode 100644 index ec19b51ce9..0000000000 --- a/patch/kernel/rockchip64-dev/orangepi-rk3399-dts.patch +++ /dev/null @@ -1,938 +0,0 @@ -diff --git a/arch/arm64/boot/dts/rockchip/rk3399-orangepi.dts b/arch/arm64/boot/dts/rockchip/rk3399-orangepi.dts -new file mode 100644 -index 000000000000..9a7887220551 ---- /dev/null -+++ b/arch/arm64/boot/dts/rockchip/rk3399-orangepi.dts -@@ -0,0 +1,932 @@ -+/* -+ * Copyright (c) 2016 Fuzhou Rockchip Electronics Co., Ltd -+ * -+ * This file is dual-licensed: you can use it either under the terms -+ * of the GPL or the X11 license, at your option. Note that this dual -+ * licensing only applies to this file, and not this project as a -+ * whole. -+ * -+ * a) This file is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of the -+ * License, or (at your option) any later version. -+ * -+ * This file is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Or, alternatively, -+ * -+ * b) Permission is hereby granted, free of charge, to any person -+ * obtaining a copy of this software and associated documentation -+ * files (the "Software"), to deal in the Software without -+ * restriction, including without limitation the rights to use, -+ * copy, modify, merge, publish, distribute, sublicense, and/or -+ * sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following -+ * conditions: -+ * -+ * The above copyright notice and this permission notice shall be -+ * included in all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -+ * OTHER DEALINGS IN THE SOFTWARE. -+ */ -+ -+/dts-v1/; -+#include "dt-bindings/pwm/pwm.h" -+#include "rk3399.dtsi" -+#include "rk3399-opp.dtsi" -+#include -+ -+/ { -+ model = "OrangePi board based on Rockchip RK3399"; -+ compatible = "xulung,orangepi-rk3399", -+ "rockchip,rk3399"; -+ -+ chosen { -+ bootargs = "mmc_cmdqueue=0 earlycon=uart8250,mmio32,0xff1a0000"; -+ stdout-path = "serial2:1500000n8"; -+ }; -+ -+ cpuinfo { -+ compatible = "rockchip,cpuinfo"; -+ }; -+ -+ mach: board { -+ compatible = "xulung,board"; -+ machine = "ORANGEPI-RK3399"; -+ hwrev = <255>; -+ model = "OrangePi Series"; -+ }; -+ -+ clkin_gmac: external-gmac-clock { -+ compatible = "fixed-clock"; -+ clock-frequency = <125000000>; -+ clock-output-names = "clkin_gmac"; -+ #clock-cells = <0>; -+ }; -+ -+ vcc3v3_sys: vcc3v3-sys { -+ compatible = "regulator-fixed"; -+ regulator-name = "vcc3v3_sys"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ }; -+ -+ vcc5v0_sys: vcc5v0-sys { -+ compatible = "regulator-fixed"; -+ regulator-name = "vcc5v0_sys"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ }; -+ -+ vccadc_ref: vccadc-ref { -+ compatible = "regulator-fixed"; -+ regulator-name = "vcc1v8_sys"; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ }; -+ -+ vcc_phy: vcc-phy-regulator { -+ compatible = "regulator-fixed"; -+ regulator-name = "vcc_phy"; -+ regulator-always-on; -+ regulator-boot-on; -+ }; -+ -+ vcc_lcd: vcc-lcd { -+ compatible = "regulator-fixed"; -+ regulator-name = "vcc_lcd"; -+ gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>; -+ startup-delay-us = <20000>; -+ enable-active-high; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-boot-on; -+ vin-supply = <&vcc5v0_sys>; -+ }; -+ -+ vdd_log: vdd-log { -+ compatible = "pwm-regulator"; -+ pwms = <&pwm2 0 25000 1>; -+ regulator-name = "vdd_log"; -+ regulator-min-microvolt = <800000>; -+ regulator-max-microvolt = <1400000>; -+ regulator-always-on; -+ regulator-boot-on; -+ -+ /* for rockchip boot on */ -+ rockchip,pwm_id = <2>; -+ rockchip,pwm_voltage = <1000000>; -+ }; -+ -+ vcc5v0_host: vcc5v0-host-regulator { -+ compatible = "regulator-fixed"; -+ enable-active-high; -+ gpio = <&gpio4 RK_PD1 GPIO_ACTIVE_HIGH>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&vcc5v0_host_en>; -+ regulator-name = "vcc5v0_host"; -+ vin-supply = <&vcc5v0_sys>; -+ }; -+ -+ dw_hdmi_audio: dw-hdmi-audio { -+ status = "disabled"; -+ compatible = "rockchip,dw-hdmi-audio"; -+ #sound-dai-cells = <0>; -+ }; -+ -+ hdmi_sound: hdmi-sound { -+ status = "okay"; -+ compatible = "simple-audio-card"; -+ simple-audio-card,format = "i2s"; -+ simple-audio-card,mclk-fs = <256>; -+ simple-audio-card,name = "rockchip,hdmi"; -+ -+ simple-audio-card,cpu { -+ sound-dai = <&i2s2>; -+ }; -+ simple-audio-card,codec { -+ sound-dai = <&hdmi>; -+ }; -+ }; -+ -+ spdif-sound { -+ status = "okay"; -+ compatible = "simple-audio-card"; -+ simple-audio-card,name = "ROCKCHIP,SPDIF"; -+ simple-audio-card,cpu { -+ sound-dai = <&spdif>; -+ }; -+ simple-audio-card,codec { -+ sound-dai = <&spdif_out>; -+ }; -+ }; -+ -+ spdif_out: spdif-out { -+ status = "okay"; -+ compatible = "linux,spdif-dit"; -+ #sound-dai-cells = <0>; -+ }; -+ -+ pwm_bl: backlight { -+ status = "disabled"; -+ compatible = "pwm-backlight"; -+ pwms = <&pwm0 0 25000 0>; -+ brightness-levels = < -+ 0 1 2 3 4 5 6 7 -+ 8 9 10 11 12 13 14 15 -+ 16 17 18 19 20 21 22 23 -+ 24 25 26 27 28 29 30 31 -+ 32 33 34 35 36 37 38 39 -+ 40 41 42 43 44 45 46 47 -+ 48 49 50 51 52 53 54 55 -+ 56 57 58 59 60 61 62 63 -+ 64 65 66 67 68 69 70 71 -+ 72 73 74 75 76 77 78 79 -+ 80 81 82 83 84 85 86 87 -+ 88 89 90 91 92 93 94 95 -+ 96 97 98 99 100 101 102 103 -+ 104 105 106 107 108 109 110 111 -+ 112 113 114 115 116 117 118 119 -+ 120 121 122 123 124 125 126 127 -+ 128 129 130 131 132 133 134 135 -+ 136 137 138 139 140 141 142 143 -+ 144 145 146 147 148 149 150 151 -+ 152 153 154 155 156 157 158 159 -+ 160 161 162 163 164 165 166 167 -+ 168 169 170 171 172 173 174 175 -+ 176 177 178 179 180 181 182 183 -+ 184 185 186 187 188 189 190 191 -+ 192 193 194 195 196 197 198 199 -+ 200 201 202 203 204 205 206 207 -+ 208 209 210 211 212 213 214 215 -+ 216 217 218 219 220 221 222 223 -+ 224 225 226 227 228 229 230 231 -+ 232 233 234 235 236 237 238 239 -+ 240 241 242 243 244 245 246 247 -+ 248 249 250 251 252 253 254 255>; -+ default-brightness-level = <200>; -+ }; -+ -+ gpio-keys { -+ compatible = "gpio-keys"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ autorepeat; -+ -+ pinctrl-names = "default"; -+ pinctrl-0 = <&power_key>; -+ -+ button@0 { -+ gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; -+ linux,code = ; -+ label = "GPIO Key Power"; -+ linux,input-type = <1>; -+ gpio-key,wakeup = <1>; -+ debounce-interval = <100>; -+ }; -+ }; -+ -+ adc-keys { -+ compatible = "adc-keys"; -+ io-channels = <&saradc 1>; -+ io-channel-names = "buttons"; -+ poll-interval = <100>; -+ keyup-threshold-microvolt = <1800000>; -+ -+ button-up { -+ label = "Volume Up"; -+ linux,code = ; -+ press-threshold-microvolt = <100000>; -+ }; -+ -+ button-down { -+ label = "Volume Down"; -+ linux,code = ; -+ press-threshold-microvolt = <300000>; -+ }; -+ }; -+ -+ leds: gpio-leds { -+ compatible = "gpio-leds"; -+ pinctrl-names = "default"; -+ pinctrl-0 =<&leds_gpio>; -+ -+ led@1 { -+ gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; -+ label = "status_led"; -+ linux,default-trigger = "heartbeat"; -+ linux,default-trigger-delay-ms = <0>; -+ }; -+ }; -+ -+ sdio_pwrseq: sdio-pwrseq { -+ compatible = "mmc-pwrseq-simple"; -+ clocks = <&rk808 1>; -+ clock-names = "ext_clock"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&wifi_enable_h>; -+ -+ /* -+ * On the module itself this is one of these (depending -+ * on the actual card populated): -+ * - SDIO_RESET_L_WL_REG_ON -+ * - PDN (power down when low) -+ */ -+ reset-gpios = <&gpio0 10 GPIO_ACTIVE_LOW>; /* GPIO0_B2 */ -+ }; -+ -+ wireless-wlan { -+ compatible = "wlan-platdata"; -+ rockchip,grf = <&grf>; -+ wifi_chip_type = "ap6354"; -+ sdio_vref = <1800>; -+ WIFI,host_wake_irq = <&gpio0 3 GPIO_ACTIVE_HIGH>; /* GPIO0_a3 */ -+ status = "okay"; -+ }; -+ -+ wireless-bluetooth { -+ compatible = "bluetooth-platdata"; -+ clocks = <&rk808 1>; -+ clock-names = "ext_clock"; -+ //wifi-bt-power-toggle; -+ uart_rts_gpios = <&gpio2 19 GPIO_ACTIVE_LOW>; /* GPIO2_C3 */ -+ pinctrl-names = "default", "rts_gpio"; -+ pinctrl-0 = <&uart0_rts>; -+ pinctrl-1 = <&uart0_gpios>; -+ //BT,power_gpio = <&gpio3 19 GPIO_ACTIVE_HIGH>; /* GPIOx_xx */ -+ BT,reset_gpio = <&gpio0 9 GPIO_ACTIVE_HIGH>; /* GPIO0_B1 */ -+ BT,wake_gpio = <&gpio2 26 GPIO_ACTIVE_HIGH>; /* GPIO2_D2 */ -+ BT,wake_host_irq = <&gpio0 4 GPIO_ACTIVE_HIGH>; /* GPIO0_A4 */ -+ status = "okay"; -+ }; -+}; -+ -+&cpu_l0 { -+ cpu-supply = <&vdd_cpu_l>; -+}; -+ -+&cpu_l1 { -+ cpu-supply = <&vdd_cpu_l>; -+}; -+ -+&cpu_l2 { -+ cpu-supply = <&vdd_cpu_l>; -+}; -+ -+&cpu_l3 { -+ cpu-supply = <&vdd_cpu_l>; -+}; -+ -+&cpu_b0 { -+ cpu-supply = <&vdd_cpu_b>; -+}; -+ -+&cpu_b1 { -+ cpu-supply = <&vdd_cpu_b>; -+}; -+ -+&gmac { -+ phy-supply = <&vcc_phy>; -+ phy-mode = "rgmii"; -+ clock_in_out = "input"; -+ snps,reset-gpio = <&gpio3 15 GPIO_ACTIVE_LOW>; -+ snps,reset-active-low; -+ snps,reset-delays-us = <0 10000 50000>; -+ assigned-clocks = <&cru SCLK_RMII_SRC>; -+ assigned-clock-parents = <&clkin_gmac>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&rgmii_pins>; -+ tx_delay = <0x28>; -+ rx_delay = <0x11>; -+ status = "okay"; -+}; -+ -+&uart0 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart0_xfer &uart0_cts>; -+ status = "okay"; -+}; -+ -+&uart2 { -+ status = "okay"; -+}; -+ -+&vopb { -+ status = "okay"; -+}; -+ -+&vopb_mmu { -+ status = "okay"; -+}; -+ -+&vopl { -+ status = "okay"; -+}; -+ -+&vopl_mmu { -+ status = "okay"; -+}; -+ -+&hdmi { -+ /* remove the hdmi_cec, reused by edp_hpd */ -+ pinctrl-0 = <&hdmi_i2c_xfer>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ #sound-dai-cells = <0>; -+ status = "okay"; -+ ddc-i2c-bus = <&i2c7>; -+}; -+ -+&i2c0 { -+ status = "okay"; -+ i2c-scl-rising-time-ns = <160>; -+ i2c-scl-falling-time-ns = <30>; -+ clock-frequency = <400000>; -+ -+ vdd_cpu_b: syr827@40 { -+ compatible = "silergy,syr827"; -+ reg = <0x40>; -+ vin-supply = <&vcc3v3_sys>; -+ regulator-compatible = "fan53555-reg"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&vsel1_gpio>; -+ vsel-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>; -+ regulator-name = "vdd_cpu_b"; -+ regulator-min-microvolt = <712500>; -+ regulator-max-microvolt = <1500000>; -+ regulator-ramp-delay = <1000>; -+ fcs,suspend-voltage-selector = <1>; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-initial-state = <3>; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ vdd_gpu: syr828@41 { -+ compatible = "silergy,syr828"; -+ reg = <0x41>; -+ vin-supply = <&vcc3v3_sys>; -+ regulator-compatible = "fan53555-reg"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&vsel2_gpio>; -+ vsel-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>; -+ regulator-name = "vdd_gpu"; -+ regulator-min-microvolt = <712500>; -+ regulator-max-microvolt = <1500000>; -+ regulator-ramp-delay = <1000>; -+ fcs,suspend-voltage-selector = <1>; -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-initial-state = <3>; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ rk808: pmic@1b { -+ compatible = "rockchip,rk808"; -+ reg = <0x1b>; -+ interrupt-parent = <&gpio1>; -+ interrupts = <21 IRQ_TYPE_LEVEL_LOW>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pmic_int_l>; -+ rockchip,system-power-controller; -+ wakeup-source; -+ #clock-cells = <1>; -+ clock-output-names = "xin32k", "rk808-clkout2"; -+ -+ vcc1-supply = <&vcc3v3_sys>; -+ vcc2-supply = <&vcc3v3_sys>; -+ vcc3-supply = <&vcc3v3_sys>; -+ vcc4-supply = <&vcc3v3_sys>; -+ vcc6-supply = <&vcc3v3_sys>; -+ vcc7-supply = <&vcc3v3_sys>; -+ vcc8-supply = <&vcc3v3_sys>; -+ vcc9-supply = <&vcc3v3_sys>; -+ vcc10-supply = <&vcc3v3_sys>; -+ vcc11-supply = <&vcc3v3_sys>; -+ vcc12-supply = <&vcc3v3_sys>; -+ vddio-supply = <&vcc_3v0>; -+ -+ regulators { -+ vdd_center: DCDC_REG1 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <750000>; -+ regulator-max-microvolt = <1350000>; -+ regulator-ramp-delay = <6001>; -+ regulator-name = "vdd_center"; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ vdd_cpu_l: DCDC_REG2 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <750000>; -+ regulator-max-microvolt = <1350000>; -+ regulator-ramp-delay = <6001>; -+ regulator-name = "vdd_cpu_l"; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ vcc_ddr: DCDC_REG3 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-name = "vcc_ddr"; -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ }; -+ }; -+ -+ vcc_1v8: DCDC_REG4 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ regulator-name = "vcc_1v8"; -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1800000>; -+ }; -+ }; -+ -+ vcc1v8_dvp: LDO_REG1 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ regulator-name = "vcc1v8_dvp"; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ vcc3v0_tp: LDO_REG2 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <3000000>; -+ regulator-max-microvolt = <3000000>; -+ regulator-name = "vcc3v0_tp"; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ vcc1v8_pmu: LDO_REG3 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ regulator-name = "vcc1v8_pmu"; -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1800000>; -+ }; -+ }; -+ -+ vcc_sd: LDO_REG4 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-name = "vcc_sd"; -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <3300000>; -+ }; -+ }; -+ -+ vcca3v0_codec: LDO_REG5 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <3000000>; -+ regulator-max-microvolt = <3000000>; -+ regulator-name = "vcca3v0_codec"; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ vcc_1v5: LDO_REG6 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1500000>; -+ regulator-max-microvolt = <1500000>; -+ regulator-name = "vcc_1v5"; -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <1500000>; -+ }; -+ }; -+ -+ vcca1v8_codec: LDO_REG7 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ regulator-name = "vcca1v8_codec"; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ vcc_3v0: LDO_REG8 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-min-microvolt = <3000000>; -+ regulator-max-microvolt = <3000000>; -+ regulator-name = "vcc_3v0"; -+ regulator-state-mem { -+ regulator-on-in-suspend; -+ regulator-suspend-microvolt = <3000000>; -+ }; -+ }; -+ -+ vcc3v3_s3: SWITCH_REG1 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-name = "vcc3v3_s3"; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ -+ vcc3v3_s0: SWITCH_REG2 { -+ regulator-always-on; -+ regulator-boot-on; -+ regulator-name = "vcc3v3_s0"; -+ regulator-state-mem { -+ regulator-off-in-suspend; -+ }; -+ }; -+ }; -+ }; -+}; -+ -+&i2c1 { -+ status = "okay"; -+ i2c-scl-rising-time-ns = <150>; -+ i2c-scl-falling-time-ns = <30>; -+ clock-frequency = <200000>; -+}; -+ -+&i2c2 { -+ status = "okay"; -+}; -+ -+&i2c4 { -+ status = "okay"; -+ i2c-scl-rising-time-ns = <160>; -+ i2c-scl-falling-time-ns = <30>; -+ clock-frequency = <400000>; -+ -+ fusb0: fusb30x@22 { -+ compatible = "fairchild,fusb302"; -+ reg = <0x22>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&fusb0_int>; -+ int-n-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; -+ vbus-5v-gpios = <&gpio4 26 GPIO_ACTIVE_HIGH>; -+ status = "okay"; -+ }; -+ -+ gt9xx: goodix_ts@5d { -+ compatible = "goodix,gt9xx"; -+ reg = <0x5d>; -+ interrupt-parent = <&gpio1>; -+ interrupts = <20 IRQ_TYPE_EDGE_FALLING>; -+ goodix,irq-gpio = <&gpio1 20 GPIO_ACTIVE_HIGH>; -+ goodix,rst-gpio = <&gpio1 13 GPIO_ACTIVE_LOW>; -+ status = "okay"; -+ }; -+ -+ /* -+ onewire_ts@2f { -+ compatible = "onewire"; -+ reg = <0x2f>; -+ interrupt-parent = <&gpio1>; -+ interrupts = <20 IRQ_TYPE_EDGE_FALLING>; -+ }; */ -+}; -+ -+&i2c7 { -+ status = "okay"; -+}; -+ -+&spdif { -+ status = "okay"; -+ pinctrl-0 = <&spdif_bus>; -+ i2c-scl-rising-time-ns = <450>; -+ i2c-scl-falling-time-ns = <15>; -+ #sound-dai-cells = <0>; -+}; -+ -+&i2s0 { -+ status = "okay"; -+ rockchip,i2s-broken-burst-len; -+ rockchip,playback-channels = <8>; -+ rockchip,capture-channels = <8>; -+ #sound-dai-cells = <0>; -+}; -+ -+&i2s2 { -+ #sound-dai-cells = <0>; -+ status = "okay"; -+}; -+ -+&io_domains { -+ status = "okay"; -+ -+ bt656-supply = <&vcc1v8_dvp>; /* bt656_gpio2ab_ms */ -+ audio-supply = <&vcca1v8_codec>; /* audio_gpio3d4a_ms */ -+ sdmmc-supply = <&vcc_sd>; /* sdmmc_gpio4b_ms */ -+ gpio1830-supply = <&vcc_3v0>; /* gpio1833_gpio4cd_ms */ -+}; -+ -+&pmu_io_domains { -+ status = "okay"; -+ pmu1830-supply = <&vcc_3v0>; -+}; -+ -+&pcie_phy { -+ status = "disabled"; -+}; -+ -+&pcie0 { -+ status = "disabled"; -+ ep-gpios = <&gpio2 4 GPIO_ACTIVE_HIGH>; -+ num-lanes = <4>; -+}; -+ -+&pwm_bl { -+ status = "okay"; -+ enable-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>; -+}; -+ -+&pwm0 { -+ status = "okay"; -+}; -+ -+&pwm1 { -+ status = "okay"; -+}; -+ -+&pwm2 { -+ status = "okay"; -+}; -+ -+&saradc { -+ status = "okay"; -+ vref-supply = <&vccadc_ref>; /* TBD */ -+}; -+ -+&sdhci { -+ bus-width = <8>; -+ mmc-hs400-1_8v; -+ supports-emmc; -+ non-removable; -+ keep-power-in-suspend; -+ mmc-hs400-enhanced-strobe; -+ status = "okay"; -+}; -+ -+&emmc_phy { -+ status = "okay"; -+}; -+ -+&sdio0 { -+ clock-frequency = <50000000>; -+ clock-freq-min-max = <200000 50000000>; -+ supports-sdio; -+ bus-width = <4>; -+ disable-wp; -+ cap-sd-highspeed; -+ cap-sdio-irq; -+ keep-power-in-suspend; -+ mmc-pwrseq = <&sdio_pwrseq>; -+ non-removable; -+ num-slots = <1>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>; -+ sd-uhs-sdr104; -+ status = "okay"; -+}; -+ -+&sdmmc { -+ clock-frequency = <150000000>; -+ clock-freq-min-max = <100000 150000000>; -+ supports-sd; -+ bus-width = <4>; -+ cap-mmc-highspeed; -+ cap-sd-highspeed; -+ disable-wp; -+ num-slots = <1>; -+ //sd-uhs-sdr104; -+ vqmmc-supply = <&vcc_sd>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>; -+ status = "okay"; -+}; -+ -+&tsadc { -+ /* tshut mode 0:CRU 1:GPIO */ -+ rockchip,hw-tshut-mode = <1>; -+ /* tshut polarity 0:LOW 1:HIGH */ -+ rockchip,hw-tshut-polarity = <1>; -+ status = "okay"; -+}; -+ -+&tcphy0 { -+ extcon = <&fusb0>; -+ status = "okay"; -+}; -+ -+&tcphy1 { -+ status = "okay"; -+}; -+ -+&u2phy0 { -+ status = "okay"; -+ extcon = <&fusb0>; -+ -+ u2phy0_otg: otg-port { -+ status = "okay"; -+ }; -+ -+ u2phy0_host: host-port { -+ phy-supply = <&vcc5v0_host>; -+ status = "okay"; -+ }; -+}; -+ -+&u2phy1 { -+ status = "okay"; -+ -+ u2phy1_otg: otg-port { -+ status = "okay"; -+ }; -+ -+ u2phy1_host: host-port { -+ phy-supply = <&vcc5v0_host>; -+ status = "okay"; -+ }; -+}; -+ -+&usbdrd3_0 { -+ status = "okay"; -+ extcon = <&fusb0>; -+}; -+ -+&usbdrd3_1 { -+ status = "okay"; -+}; -+ -+&usbdrd_dwc3_0 { -+ status = "okay"; -+}; -+ -+&usbdrd_dwc3_1 { -+ status = "okay"; -+ dr_mode = "host"; -+}; -+ -+&usb_host0_ehci { -+ status = "okay"; -+}; -+ -+&usb_host0_ohci { -+ status = "okay"; -+}; -+ -+&usb_host1_ehci { -+ status = "okay"; -+}; -+ -+&usb_host1_ohci { -+ status = "okay"; -+}; -+ -+&pinctrl { -+ pmic { -+ pmic_int_l: pmic-int-l { -+ rockchip,pins = <1 21 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ -+ vsel1_gpio: vsel1-gpio { -+ rockchip,pins = <1 17 RK_FUNC_GPIO &pcfg_pull_down>; -+ }; -+ vsel2_gpio: vsel2-gpio { -+ rockchip,pins = <1 14 RK_FUNC_GPIO &pcfg_pull_down>; -+ }; -+ }; -+ -+ usb2 { -+ vcc5v0_host_en: vcc5v0-host-en { -+ rockchip,pins = <4 25 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+ -+ fusb30x { -+ fusb0_int: fusb0-int { -+ rockchip,pins = <1 2 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+ -+ sdio-pwrseq { -+ wifi_enable_h: wifi-enable-h { -+ rockchip,pins = <0 10 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+ -+ wireless-bluetooth { -+ uart0_gpios: uart0-gpios { -+ rockchip,pins = <2 19 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+ -+ rockchip-key { -+ power_key: power-key { -+ rockchip,pins = <0 5 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+ -+ lcd-panel { -+ lcd_panel_reset: lcd-panel-reset { -+ rockchip,pins = <4 30 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+ -+ headphone { -+ hp_det: hp-det { -+ rockchip,pins = <4 28 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ }; -+ -+ gpio-leds { -+ leds_gpio: leds-gpio { -+ rockchip,pins = <0 13 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ }; -+}; diff --git a/patch/kernel/rockchip64-dev/rk3328-audio-and-renegade-supplies.patch b/patch/kernel/rockchip64-dev/rk3328-audio-and-renegade-supplies.patch new file mode 100644 index 0000000000..e871945cc5 --- /dev/null +++ b/patch/kernel/rockchip64-dev/rk3328-audio-and-renegade-supplies.patch @@ -0,0 +1,264 @@ +diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +index f4b6799a8..a1041ec3e 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +@@ -21,33 +21,24 @@ + #clock-cells = <0>; + }; + +- dc_12v: dc-12v { +- compatible = "regulator-fixed"; +- regulator-name = "dc_12v"; +- regulator-always-on; +- regulator-boot-on; +- regulator-min-microvolt = <12000000>; +- regulator-max-microvolt = <12000000>; +- }; +- + vcc_sd: sdmmc-regulator { + compatible = "regulator-fixed"; +- gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; ++ gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0m1_gpio>; + regulator-boot-on; + regulator-name = "vcc_sd"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_io>; + }; + +- vcc_sdio: sdmmcio-regulator { ++ vccio_sd: sdmmcio-regulator { + compatible = "regulator-gpio"; + gpios = <&grf_gpio 0 GPIO_ACTIVE_HIGH>; + states = <1800000 0x1 + 3300000 0x0>; +- regulator-name = "vcc_sdio"; ++ regulator-name = "vccio_sd"; + regulator-type = "voltage"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; +@@ -68,11 +60,8 @@ + vcc_sys: vcc-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc_sys"; +- regulator-always-on; +- regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; +- vin-supply = <&dc_12v>; + }; + + vcc_phy: vcc-phy-regulator { +@@ -82,7 +71,24 @@ + regulator-always-on; + regulator-boot-on; + }; +-}; ++ ++ ir-receiver { ++ compatible = "gpio-ir-receiver"; ++ gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>; ++ pinctrl-0 = <&ir_int>; ++ pinctrl-names = "default"; ++ }; ++}; ++ ++&analog_sound { ++ simple-audio-card,name = "TRS Jack"; ++ status = "okay"; ++}; ++ ++&codec { ++ status = "okay"; ++}; ++ + + &cpu0 { + cpu-supply = <&vdd_arm>; +@@ -122,7 +127,6 @@ + &emmc { + bus-width = <8>; + cap-mmc-highspeed; +- max-frequency = <150000000>; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + non-removable; +@@ -152,6 +156,10 @@ + status = "okay"; + }; + ++&gpu { ++ mali-supply = <&vdd_logic>; ++}; ++ + &hdmi { + status = "okay"; + }; +@@ -160,6 +168,10 @@ + status = "okay"; + }; + ++&hdmi_sound { ++ status = "okay"; ++}; ++ + &i2c1 { + status = "okay"; + +@@ -187,8 +199,9 @@ + regulators { + vdd_logic: DCDC_REG1 { + regulator-name = "vdd_logic"; +- regulator-min-microvolt = <712500>; +- regulator-max-microvolt = <1450000>; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <1150000>; ++ regulator-ramp-delay = <12500>; + regulator-always-on; + regulator-boot-on; + regulator-state-mem { +@@ -199,8 +212,9 @@ + + vdd_arm: DCDC_REG2 { + regulator-name = "vdd_arm"; +- regulator-min-microvolt = <712500>; +- regulator-max-microvolt = <1450000>; ++ regulator-min-microvolt = <950000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <12500>; + regulator-always-on; + regulator-boot-on; + regulator-state-mem { +@@ -269,12 +283,20 @@ + }; + }; + ++&i2s0 { ++ status = "okay"; ++}; ++ ++&i2s1 { ++ status = "okay"; ++}; ++ + &io_domains { + status = "okay"; + + vccio1-supply = <&vcc_io>; + vccio2-supply = <&vcc18_emmc>; +- vccio3-supply = <&vcc_sdio>; ++ vccio3-supply = <&vccio_sd>; + vccio4-supply = <&vcc_18>; + vccio5-supply = <&vcc_io>; + vccio6-supply = <&vcc_io>; +@@ -282,6 +304,12 @@ + }; + + &pinctrl { ++ ir { ++ ir_int: ir-int { ++ rockchip,pins = <2 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ + pmic { + pmic_int_l: pmic-int-l { + rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; +@@ -308,11 +336,26 @@ + sd-uhs-sdr50; + sd-uhs-sdr104; + vmmc-supply = <&vcc_sd>; +- vqmmc-supply = <&vcc_sdio>; ++ vqmmc-supply = <&vccio_sd>; ++ status = "okay"; ++}; ++ ++&spdif { ++ pinctrl-0 = <&spdifm0_tx>; ++ status = "okay"; ++}; ++ ++&spdif_out { ++ status = "okay"; ++}; ++ ++&spdif_sound { + status = "okay"; + }; + + &tsadc { ++ rockchip,hw-tshut-mode = <0>; ++ rockchip,hw-tshut-polarity = <0>; + status = "okay"; + }; + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +index eedc25132..5c62f0116 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -198,6 +198,26 @@ + method = "smc"; + }; + ++ spdif_out: spdif-out { ++ compatible = "linux,spdif-dit"; ++ #sound-dai-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spdif_sound: spdif-sound { ++ compatible = "simple-audio-card"; ++ simple-audio-card,name = "SPDIF"; ++ status = "disabled"; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&spdif>; ++ }; ++ ++ simple-audio-card,codec { ++ sound-dai = <&spdif_out>; ++ }; ++ }; ++ + timer { + compatible = "arm,armv8-timer"; + interrupts = , +@@ -319,6 +339,12 @@ + }; + }; + ++ ++ pd_gpu@RK3328_PD_GPU { ++ reg = ; ++ clocks = <&cru ACLK_GPU>; ++ }; ++ + reboot-mode { + compatible = "syscon-reboot-mode"; + offset = <0x5c8>; +@@ -609,6 +635,7 @@ + "ppmmu1"; + clocks = <&cru ACLK_GPU>, <&cru ACLK_GPU>; + clock-names = "bus", "core"; ++ power-domains = <&power RK3328_PD_GPU>; + resets = <&cru SRST_GPU_A>; + }; + +@@ -781,6 +808,7 @@ + <&cru ACLK_BUS_PRE>, <&cru HCLK_BUS_PRE>, + <&cru PCLK_BUS_PRE>, <&cru ACLK_PERI_PRE>, + <&cru HCLK_PERI>, <&cru PCLK_PERI>, ++ <&cru ACLK_GPU>, + <&cru SCLK_RTC32K>; + assigned-clock-parents = + <&cru HDMIPHY>, <&cru PLL_APLL>, +@@ -802,6 +830,7 @@ + <150000000>, <75000000>, + <75000000>, <150000000>, + <75000000>, <75000000>, ++ <500000000>, + <32768>; + }; + diff --git a/patch/kernel/rockchip64-dev/rk3328-sd-drive-level-8ma.patch.disabled b/patch/kernel/rockchip64-dev/rk3328-sd-drive-level-8ma.patch.disabled deleted file mode 100644 index e3944ebc6a..0000000000 --- a/patch/kernel/rockchip64-dev/rk3328-sd-drive-level-8ma.patch.disabled +++ /dev/null @@ -1,45 +0,0 @@ -diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -index 6fa62cab2..d1ba2f5b9 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi -+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -@@ -1462,30 +1462,30 @@ - - sdmmc0 { - sdmmc0_clk: sdmmc0-clk { -- rockchip,pins = <1 RK_PA6 1 &pcfg_pull_none_4ma>; -+ rockchip,pins = <1 RK_PA6 1 &pcfg_pull_none_8ma>; - }; - - sdmmc0_cmd: sdmmc0-cmd { -- rockchip,pins = <1 RK_PA4 1 &pcfg_pull_up_4ma>; -+ rockchip,pins = <1 RK_PA4 1 &pcfg_pull_up_8ma>; - }; - - sdmmc0_dectn: sdmmc0-dectn { -- rockchip,pins = <1 RK_PA5 1 &pcfg_pull_up_4ma>; -+ rockchip,pins = <1 RK_PA5 1 &pcfg_pull_up_8ma>; - }; - - sdmmc0_wrprt: sdmmc0-wrprt { -- rockchip,pins = <1 RK_PA7 1 &pcfg_pull_up_4ma>; -+ rockchip,pins = <1 RK_PA7 1 &pcfg_pull_up_8ma>; - }; - - sdmmc0_bus1: sdmmc0-bus1 { -- rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up_4ma>; -+ rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up_8ma>; - }; - - sdmmc0_bus4: sdmmc0-bus4 { -- rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up_4ma>, -- <1 RK_PA1 1 &pcfg_pull_up_4ma>, -- <1 RK_PA2 1 &pcfg_pull_up_4ma>, -- <1 RK_PA3 1 &pcfg_pull_up_4ma>; -+ rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up_8ma>, -+ <1 RK_PA1 1 &pcfg_pull_up_8ma>, -+ <1 RK_PA2 1 &pcfg_pull_up_8ma>, -+ <1 RK_PA3 1 &pcfg_pull_up_8ma>; - }; - - sdmmc0_gpio: sdmmc0-gpio { - From 008f3fd47cfbd7ea3e30f54f6e8406a4035b9f07 Mon Sep 17 00:00:00 2001 From: Paolo Date: Wed, 5 Feb 2020 00:37:02 +0100 Subject: [PATCH 12/54] [xt-q8l-v10] fixed act8846 regulator against kernel 5.4, enabled eMMC DDR mode (#1778) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added ALSA configuration bits for rk3288 HDMI and SPDIF to allow pulseaudio show proper sound device/profile/mapping names instead of just "Built-in Audio" for all of them * Added ALSA device description in asound.conf to provide correct labels for PulseAudio for RK3288 devices when SPDIF and DW-I2S-HDMI simple audio cards are exposed Removed unnecessary ALSA configuration files previously added from rockchip.conf * Fixed cpu operating points tables and raised a bit (+5°C) cooling for non-critical temperatures for xt-q8l-v10 in dev and next kernel flavours * Fixed again cpu opp table * Removed whole cpu opp table and retouch only necessary operating points * Enabled gpiomem driver for xt-q8l-v10 in next kernel flavour * Added debounce delay and card detect gpio pins for sdmmc card holder for xt-q8l-v10 board * Added card-detect and debounce delay for sdmmc for xt-q8l-v10 board in next kernel flavour too * Fixed missing comment in xt-q8l-v10 device tree patch * Added gpiomem to xt-q8l-v10 board for dev kernel * Fixed FAN53555/Silergy patches to accomodate changes in u-boot v2019.04 * Changed property property flags for USB regulators in u-boot and kernel: kernel is now informed that bootloader is going to turn the USB power on * Fixed indentation in rk3288-xt-q8l-v10.dts, raised debounce delay to sdmmc, added vbus-supply to USB host, removed some unneeded properties * Added working DDR52 mode for eMMC on xt-q8l-v10 * Removed regulator-off-in-suspend for some xt-q8l-v10 regulators due to changed in act8865.c driver which causes the regulators to be misconfigured * Adjusted targets for xt-q8l-v10 (provides bionic desktop + buster server) * Removed all regular-state-mem nodes in xt-q8l-v10 device tree because the change in act8865.c affects also non-off entries * Brought xt-q8l-v10 device tree from rockchip-current to rockchip-dev --- config/targets.conf | 6 +- .../xt-q8l-v10-add-device-tree.patch | 332 +++++++++++------- .../xt-q8l-v10-add-device-tree.patch | 332 +++++++++++------- 3 files changed, 416 insertions(+), 254 deletions(-) diff --git a/config/targets.conf b/config/targets.conf index f810e8aaf5..29949cdafa 100644 --- a/config/targets.conf +++ b/config/targets.conf @@ -620,10 +620,8 @@ tritium-h5 current bionic cli stable yes # xt-q8l-v10 -xt-q8l-v10 legacy buster cli stable yes -xt-q8l-v10 legacy bionic desktop stable yes -xt-q8l-v10 current bionic minimal stable yes -xt-q8l-v10 current bullseye minimal stable yes +xt-q8l-v10 current bionic desktop stable yes +xt-q8l-v10 current buster minimal stable yes # Z28 pro diff --git a/patch/kernel/rockchip-current/xt-q8l-v10-add-device-tree.patch b/patch/kernel/rockchip-current/xt-q8l-v10-add-device-tree.patch index 4a3517698f..d60aeb7f0a 100644 --- a/patch/kernel/rockchip-current/xt-q8l-v10-add-device-tree.patch +++ b/patch/kernel/rockchip-current/xt-q8l-v10-add-device-tree.patch @@ -1,6 +1,9 @@ +diff --git a/arch/arm/boot/dts/rk3288-xt-q8l-v10.dts b/arch/arm/boot/dts/rk3288-xt-q8l-v10.dts +new file mode 100644 +index 000000000..539e445b4 --- /dev/null -+++ b/arch/arm/boot/dts/rk3288-xt-q8l-v10.dts 2019-08-03 13:55:48.719992666 +0000 -@@ -0,0 +1,982 @@ ++++ b/arch/arm/boot/dts/rk3288-xt-q8l-v10.dts +@@ -0,0 +1,1061 @@ +/* + * Copyright (c) 2014, 2015 FUKAUMI Naoki + * 2018 Paolo Sabatino @@ -53,7 +56,7 @@ + model = "XT-Q8L-V10-RK3288"; + compatible = "generic,xt-q8l-v10-rk3288", "rockchip,rk3288"; + -+ memory { ++ memory@0 { + reg = <0x0 0x0 0x0 0x80000000>; + device_type = "memory"; + }; @@ -83,7 +86,7 @@ + clock-frequency = <125000000>; + clock-output-names = "ext_gmac"; + }; -+ ++ + /* + * Handle the IR receiver using the gpio-ir-receiver kernel module. + * This works flawlessy, the original xt-q8l-v10 remote uses a NEC @@ -97,13 +100,13 @@ + pinctrl-0 = <&ir_int>; + linux,rc-map-name = "rc-xt-q8l-v10"; + wakeup-source; -+ }; ++ }; + + keys: gpio-keys { + compatible = "gpio-keys"; + #address-cells = <1>; + #size-cells = <0>; -+ ++ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key>; + @@ -115,7 +118,7 @@ + wakeup-source; + debounce-interval = <100>; + }; -+ ++ + }; + + leds { @@ -127,7 +130,7 @@ + so while there is mass storage access it turns red and + when it is idle is blue + */ -+ gpios = <&gpio7 2 GPIO_ACTIVE_LOW>; ++ gpios = <&gpio7 2 GPIO_ACTIVE_LOW>; + label = "power"; + linux,default-trigger = "mmc0"; + pinctrl-names = "default"; @@ -162,7 +165,12 @@ + regulator-name = "vcc_flash"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; ++ /*gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_LOW>; ++ states = <1800000 0>, ++ <3300000 1>; ++ */ + vin-supply = <&vcc_io>; ++ startup-delay-us = <100000>; + }; + + vcc_host_5v: usb-host-regulator { @@ -171,8 +179,8 @@ + regulator-name = "vcc_host_5v"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; -+ regulator-boot-on; -+ enable-active-high; ++ regulator-boot-on; ++ enable-active-high; + vin-supply = <&vcc_sys>; + }; + @@ -200,6 +208,13 @@ + post-power-on-delay-ms = <100>; + }; + ++ emmc_pwrseq: emmc-pwrseq { ++ compatible = "mmc-pwrseq-emmc"; ++ pinctrl-0 = <&emmc_reset>; ++ pinctrl-names = "default"; ++ reset-gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_LOW>; ++ }; ++ + /* + * Sound taken from tinkerboard device tree, adapted to q8. + */ @@ -217,27 +232,27 @@ + sound-dai = <&i2s>; + }; + }; -+ -+ soundcard-spdif { -+ compatible = "simple-audio-card"; -+ simple-audio-card,name = "SPDIF"; -+ simple-audio-card,dai-link@1 { -+ -+ cpu { -+ sound-dai = <&spdif>; -+ }; -+ -+ codec { -+ sound-dai = <&spdif_out>; -+ }; -+ -+ }; -+ }; + -+ spdif_out: spdif-out { -+ compatible = "linux,spdif-dit"; -+ #sound-dai-cells = <0>; -+ }; ++ soundcard-spdif { ++ compatible = "simple-audio-card"; ++ simple-audio-card,name = "SPDIF"; ++ simple-audio-card,dai-link@1 { ++ ++ cpu { ++ sound-dai = <&spdif>; ++ }; ++ ++ codec { ++ sound-dai = <&spdif_out>; ++ }; ++ ++ }; ++ }; ++ ++ spdif_out: spdif-out { ++ compatible = "linux,spdif-dit"; ++ #sound-dai-cells = <0>; ++ }; + +}; + @@ -303,8 +318,8 @@ + regulator-boot-on; + vin-supply = <&vcc_sys>; + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; + }; + + vdd_gpu: syr828@41 { @@ -318,8 +333,8 @@ + regulator-always-on; + vin-supply = <&vcc_sys>; + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; + }; + + hym8563: hym8563@51 { @@ -351,7 +366,7 @@ + wakeup-source; + + regulators { -+ ++ + /* + * Regulator controlling DDR memory - always on + */ @@ -360,9 +375,12 @@ + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -374,9 +392,12 @@ + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -390,9 +411,12 @@ + regulator-min-microvolt = <1100000>; + regulator-max-microvolt = <1100000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -405,9 +429,12 @@ + regulator-min-microvolt = <2000000>; + regulator-max-microvolt = <2000000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -416,13 +443,16 @@ + */ + vccio_sd: REG5 { + regulator-name = "vccio_sd"; -+ regulator-min-microvolt = <1800000>; ++ regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; ++ regulator-on-in-suspend; + regulator-suspend-microvolt = <3300000>; -+ }; ++ }; ++ */ + }; + + /* @@ -434,9 +464,12 @@ + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -449,9 +482,14 @@ + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; ++ ++ /* ++ The regulator can be set off in suspend, but kernel 5.4 modifications ++ to enable suspend for ACT8865 device break the ACT8846 + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; ++ */ + }; + + /* @@ -463,9 +501,14 @@ + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; // Turn this on to get SPDIF! ++ ++ /* ++ The regulator can be set off in suspend, but kernel 5.4 modifications ++ to enable suspend for ACT8865 device break the ACT8846 + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; ++ */ + }; + + /* @@ -475,9 +518,13 @@ + regulator-name = "vcc_lan"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; ++ ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -489,9 +536,13 @@ + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + regulator-always-on; ++ ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -503,9 +554,13 @@ + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; ++ ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -518,9 +573,14 @@ + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; ++ ++ /* ++ The regulator can be set off in suspend, but kernel 5.4 modifications ++ to enable suspend for ACT8865 device break the ACT8846 + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; ++ */ + }; + }; + }; @@ -535,7 +595,7 @@ +}; + +&i2c4 { -+ ++ + /* + * Here should go the RK1000 audio codec parts, but seems that + * there is no driver in linux kernel at the moment, so we can't @@ -545,7 +605,7 @@ + * http://dl.radxa.com/rock/docs/hw/ds/RK1000-S%20DATASHEET%20V14.pdf + */ + status = "okay"; -+ ++ +}; + +&i2c5 { @@ -575,12 +635,12 @@ + bias-pull-up; + drive-strength = <8>; + }; -+ ++ + pcfg_pull_up_drv_8ma: pcfg-pull-up-drv-8ma { + bias-pull-up; + drive-strength = <8>; + }; -+ ++ + pcfg_pull_none_8ma: pcfg-pull-none-8ma { + bias-disable; + drive-strength = <8>; @@ -594,18 +654,18 @@ + pcfg_wl_int: pcfg-wl-int { + bias-pull-up; + }; -+ ++ + act8846 { -+ ++ + /* + * Original q8 device tree says: + * - gpio0 11 HIGH -> power hold -+ * - gpio7 1 LOW -> possibly pmic-vsel, we don't care -+ */ ++ * - gpio7 1 LOW -> possibly pmic-vsel, we don't care ++ */ + pmic_vsel: pmic-vsel { + rockchip,pins = <7 1 RK_FUNC_GPIO &pcfg_output_low>; + }; -+ ++ + pwr_hold: pwr-hold { + rockchip,pins = <0 11 RK_FUNC_GPIO &pcfg_pull_up>; + }; @@ -650,7 +710,7 @@ + }; + + sdmmc { -+ ++ + /* + * Copied from firefly board definition to give more drive to + * the sdmmc pins. The Q8 seems to be quite able to drive @@ -701,14 +761,22 @@ + }; + + }; -+ -+ ++ ++ + wireless-bluetooth { + uart0_gpios: uart0-gpios { + rockchip,pins = <4 19 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + ++ emmc { ++ ++ emmc_reset: emmc-reset { ++ rockchip,pins = <3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ }; ++ +}; + +&saradc { @@ -717,24 +785,34 @@ +}; + +&emmc { -+ ++ + /* -+ * eMMC seems to be 52Mhz device on q8 devices, so set it here -+ * vmmc-supply and vqmmc-supply are removed because they hang -+ * u-boot >= v2018.03 -+ * From the original q8l firmware and eMMC datasheet it also should -+ * support DDR highspeed mode, but using mmc-ddr-3_3v or mmc-ddr-1_8v -+ * properties are not working ++ * eMMC is a 52Mhz DDR device on q8 devices, so set it here. ++ * Setting default-sample-rate to 180 degrees is very important, ++ * otherwise the eMMC is not stable and may not be able to negotiate ++ * the right clock. ++ * Despite the code already seems to use 180 degree phase when ++ * MMC + 8bit bus is set, we need to set default phase here too. ++ * ++ * Huge hint came from this patch: ++ * https://patchwork.kernel.org/patch/11129183/ ++ * + */ -+ clock-frequency = <50000000>; -+ + broken-cd; + bus-width = <8>; + cap-mmc-highspeed; ++ + disable-wp; + non-removable; + pinctrl-names = "default"; -+ pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_pwr>, <&emmc_bus8>; ++ pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_bus8>; ++ ++ vmmc-supply = <&vcc_io>; ++ vqmmc-supply = <&vcc_flash>; ++ ++ mmc-pwrseq = <&emmc_pwrseq>; ++ mmc-ddr-1_8v; ++ rockchip,default-sample-phase = <180>; + + status = "okay"; +}; @@ -746,9 +824,7 @@ + cap-mmc-highspeed; + cap-sd-highspeed; + cd-gpios = <&gpio6 RK_PC6 GPIO_ACTIVE_LOW>; -+ cd-debounce-delay-ms = <200>; -+ post-power-on-delay-ms = <50>; -+ supports-cqe; ++ cd-debounce-delay-ms = <500>; + disable-wp; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc_clk>, <&sdmmc_cmd>, <&sdmmc_cd>, <&sdmmc_bus4>; @@ -766,33 +842,33 @@ +&sdio0 { + #address-cells = <1>; + #size-cells = <0>; -+ ++ + bus-width = <4>; + mmc-pwrseq = <&sdio0_pwrseq>; -+ ++ + vmmc-supply = <&vcc_io>; -+ vqmmc-supply = <&vcc_18>; // This must be the same as in io_domains, ++ vqmmc-supply = <&vcc_18>; // This must be the same as in io_domains, + // otherwise the mmc1 device won't be detected properly -+ -+// clock-frequency = <50000000>; -+// max-frequency = <50000000>; ++ ++ // clock-frequency = <50000000>; ++ // max-frequency = <50000000>; + + pinctrl-names = "default"; -+ pinctrl-0 = <&sdio0_bus4>, <&sdio0_cmd>, <&sdio0_clk>, <&sdio0_int>; -+ ++ pinctrl-0 = <&sdio0_bus4>, <&sdio0_cmd>, <&sdio0_clk>, <&sdio0_int>; ++ + cap-sdio-irq; + no-mmc; + no-sd; + cap-sd-highspeed; // required, otherwise does not work! -+ supports-sdio; ++ supports-sdio; + non-removable; -+ ++ + keep-power-in-suspend; + disable-wp; -+ -+ ++ ++ + status = "okay"; -+ ++ + brcmf: bcrmf@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; @@ -800,8 +876,8 @@ + interrupts = <30 IRQ_TYPE_LEVEL_LOW>; + interrupt-names = "host-wake"; + status = "okay"; -+ }; -+ ++ }; ++ + //sd-uhs-sdr104; // required to be disabled, otherwise the device get + // detected, but there is no communication + @@ -823,13 +899,13 @@ + * These dmas described here for uarts are present in original q8 board + * dts, so I replicate them here because documentation says that serial + * ports can have dmas. -+ * note: ++ * note: + * - uart0 is the serial port connected to the bluetooth module -+ * - uart2 is the onboard serial port -+ * ++ * - uart2 is the onboard serial port ++ * + * As ok kernel 4.19 DMA for serial ports is disabled because it makes + * the ports unusable -+ * ++ * + */ +&uart0 { + pinctrl-names = "default"; @@ -873,31 +949,25 @@ + * specify the proper resources for all the phys though. + * The reference patch which works in conjuction with the reset lines: + * https://patchwork.kernel.org/patch/9469811/ -+ * ++ * + */ +&usbphy { + status = "okay"; +}; -+ -+&usbphy0 { -+ vbus-supply = <&vcc_otg_5v>; -+}; -+ -+&usbphy2 { -+ vbus-supply = <&vcc_host_5v>; -+}; + +&usb_host0_ehci { -+ dr_mode = "host"; -+ reg = <0x0 0xff500000 0x0 0x20000>; -+ status = "disable"; ++ dr_mode = "host"; ++ reg = <0x0 0xff500000 0x0 0x20000>; ++ status = "disable"; +}; + +&usb_host1 { ++ vbus-supply = <&vcc_host_5v>; + status = "okay"; +}; + +&usb_otg { ++ vbus-supply = <&vcc_otg_5v>; + status = "okay"; +}; + @@ -924,18 +994,10 @@ + status = "okay"; +}; + -+//&vpu_service { -+// status = "okay"; -+//}; -+ +&hevc_mmu { + status = "okay"; +}; + -+//&hevc_service { -+// status = "okay"; -+//}; -+ +&wdt { + status = "okay"; +}; @@ -978,8 +1040,28 @@ + opp-1608000000 { + opp-microvolt = <1300000>; + }; ++ ++ /* ++ Remove the overclocking/turbo frequencies ++ */ ++ /delete-node/ opp@1704000000; ++ /delete-node/ opp@1800000000; ++ /delete-node/ opp@1896000000; ++ /delete-node/ opp@1920000000; ++ /delete-node/ opp@1992000000; ++ /delete-node/ opp@2016000000; ++ /delete-node/ opp@2040000000; ++ /delete-node/ opp@2064000000; ++ /delete-node/ opp@2088000000; ++ /delete-node/ opp@2112000000; ++ /delete-node/ opp@2136000000; ++ /delete-node/ opp@2160000000; ++ /delete-node/ opp@2184000000; ++ /delete-node/ opp@2208000000; ++ ++ +}; + +&gpiomem { -+ status = "okay"; ++ status = "okay"; +}; diff --git a/patch/kernel/rockchip-dev/xt-q8l-v10-add-device-tree.patch b/patch/kernel/rockchip-dev/xt-q8l-v10-add-device-tree.patch index 4a3517698f..d60aeb7f0a 100644 --- a/patch/kernel/rockchip-dev/xt-q8l-v10-add-device-tree.patch +++ b/patch/kernel/rockchip-dev/xt-q8l-v10-add-device-tree.patch @@ -1,6 +1,9 @@ +diff --git a/arch/arm/boot/dts/rk3288-xt-q8l-v10.dts b/arch/arm/boot/dts/rk3288-xt-q8l-v10.dts +new file mode 100644 +index 000000000..539e445b4 --- /dev/null -+++ b/arch/arm/boot/dts/rk3288-xt-q8l-v10.dts 2019-08-03 13:55:48.719992666 +0000 -@@ -0,0 +1,982 @@ ++++ b/arch/arm/boot/dts/rk3288-xt-q8l-v10.dts +@@ -0,0 +1,1061 @@ +/* + * Copyright (c) 2014, 2015 FUKAUMI Naoki + * 2018 Paolo Sabatino @@ -53,7 +56,7 @@ + model = "XT-Q8L-V10-RK3288"; + compatible = "generic,xt-q8l-v10-rk3288", "rockchip,rk3288"; + -+ memory { ++ memory@0 { + reg = <0x0 0x0 0x0 0x80000000>; + device_type = "memory"; + }; @@ -83,7 +86,7 @@ + clock-frequency = <125000000>; + clock-output-names = "ext_gmac"; + }; -+ ++ + /* + * Handle the IR receiver using the gpio-ir-receiver kernel module. + * This works flawlessy, the original xt-q8l-v10 remote uses a NEC @@ -97,13 +100,13 @@ + pinctrl-0 = <&ir_int>; + linux,rc-map-name = "rc-xt-q8l-v10"; + wakeup-source; -+ }; ++ }; + + keys: gpio-keys { + compatible = "gpio-keys"; + #address-cells = <1>; + #size-cells = <0>; -+ ++ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key>; + @@ -115,7 +118,7 @@ + wakeup-source; + debounce-interval = <100>; + }; -+ ++ + }; + + leds { @@ -127,7 +130,7 @@ + so while there is mass storage access it turns red and + when it is idle is blue + */ -+ gpios = <&gpio7 2 GPIO_ACTIVE_LOW>; ++ gpios = <&gpio7 2 GPIO_ACTIVE_LOW>; + label = "power"; + linux,default-trigger = "mmc0"; + pinctrl-names = "default"; @@ -162,7 +165,12 @@ + regulator-name = "vcc_flash"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; ++ /*gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_LOW>; ++ states = <1800000 0>, ++ <3300000 1>; ++ */ + vin-supply = <&vcc_io>; ++ startup-delay-us = <100000>; + }; + + vcc_host_5v: usb-host-regulator { @@ -171,8 +179,8 @@ + regulator-name = "vcc_host_5v"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; -+ regulator-boot-on; -+ enable-active-high; ++ regulator-boot-on; ++ enable-active-high; + vin-supply = <&vcc_sys>; + }; + @@ -200,6 +208,13 @@ + post-power-on-delay-ms = <100>; + }; + ++ emmc_pwrseq: emmc-pwrseq { ++ compatible = "mmc-pwrseq-emmc"; ++ pinctrl-0 = <&emmc_reset>; ++ pinctrl-names = "default"; ++ reset-gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_LOW>; ++ }; ++ + /* + * Sound taken from tinkerboard device tree, adapted to q8. + */ @@ -217,27 +232,27 @@ + sound-dai = <&i2s>; + }; + }; -+ -+ soundcard-spdif { -+ compatible = "simple-audio-card"; -+ simple-audio-card,name = "SPDIF"; -+ simple-audio-card,dai-link@1 { -+ -+ cpu { -+ sound-dai = <&spdif>; -+ }; -+ -+ codec { -+ sound-dai = <&spdif_out>; -+ }; -+ -+ }; -+ }; + -+ spdif_out: spdif-out { -+ compatible = "linux,spdif-dit"; -+ #sound-dai-cells = <0>; -+ }; ++ soundcard-spdif { ++ compatible = "simple-audio-card"; ++ simple-audio-card,name = "SPDIF"; ++ simple-audio-card,dai-link@1 { ++ ++ cpu { ++ sound-dai = <&spdif>; ++ }; ++ ++ codec { ++ sound-dai = <&spdif_out>; ++ }; ++ ++ }; ++ }; ++ ++ spdif_out: spdif-out { ++ compatible = "linux,spdif-dit"; ++ #sound-dai-cells = <0>; ++ }; + +}; + @@ -303,8 +318,8 @@ + regulator-boot-on; + vin-supply = <&vcc_sys>; + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; + }; + + vdd_gpu: syr828@41 { @@ -318,8 +333,8 @@ + regulator-always-on; + vin-supply = <&vcc_sys>; + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; + }; + + hym8563: hym8563@51 { @@ -351,7 +366,7 @@ + wakeup-source; + + regulators { -+ ++ + /* + * Regulator controlling DDR memory - always on + */ @@ -360,9 +375,12 @@ + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -374,9 +392,12 @@ + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -390,9 +411,12 @@ + regulator-min-microvolt = <1100000>; + regulator-max-microvolt = <1100000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -405,9 +429,12 @@ + regulator-min-microvolt = <2000000>; + regulator-max-microvolt = <2000000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -416,13 +443,16 @@ + */ + vccio_sd: REG5 { + regulator-name = "vccio_sd"; -+ regulator-min-microvolt = <1800000>; ++ regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; ++ regulator-on-in-suspend; + regulator-suspend-microvolt = <3300000>; -+ }; ++ }; ++ */ + }; + + /* @@ -434,9 +464,12 @@ + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + regulator-always-on; ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -449,9 +482,14 @@ + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; ++ ++ /* ++ The regulator can be set off in suspend, but kernel 5.4 modifications ++ to enable suspend for ACT8865 device break the ACT8846 + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; ++ */ + }; + + /* @@ -463,9 +501,14 @@ + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; // Turn this on to get SPDIF! ++ ++ /* ++ The regulator can be set off in suspend, but kernel 5.4 modifications ++ to enable suspend for ACT8865 device break the ACT8846 + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; ++ */ + }; + + /* @@ -475,9 +518,13 @@ + regulator-name = "vcc_lan"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; ++ ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -489,9 +536,13 @@ + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + regulator-always-on; ++ ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -503,9 +554,13 @@ + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; ++ ++ /* ++ * Broken in kernel 5.4 + regulator-state-mem { -+ regulator-on-in-suspend; -+ }; ++ regulator-on-in-suspend; ++ }; ++ */ + }; + + /* @@ -518,9 +573,14 @@ + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-always-on; ++ ++ /* ++ The regulator can be set off in suspend, but kernel 5.4 modifications ++ to enable suspend for ACT8865 device break the ACT8846 + regulator-state-mem { -+ regulator-off-in-suspend; -+ }; ++ regulator-off-in-suspend; ++ }; ++ */ + }; + }; + }; @@ -535,7 +595,7 @@ +}; + +&i2c4 { -+ ++ + /* + * Here should go the RK1000 audio codec parts, but seems that + * there is no driver in linux kernel at the moment, so we can't @@ -545,7 +605,7 @@ + * http://dl.radxa.com/rock/docs/hw/ds/RK1000-S%20DATASHEET%20V14.pdf + */ + status = "okay"; -+ ++ +}; + +&i2c5 { @@ -575,12 +635,12 @@ + bias-pull-up; + drive-strength = <8>; + }; -+ ++ + pcfg_pull_up_drv_8ma: pcfg-pull-up-drv-8ma { + bias-pull-up; + drive-strength = <8>; + }; -+ ++ + pcfg_pull_none_8ma: pcfg-pull-none-8ma { + bias-disable; + drive-strength = <8>; @@ -594,18 +654,18 @@ + pcfg_wl_int: pcfg-wl-int { + bias-pull-up; + }; -+ ++ + act8846 { -+ ++ + /* + * Original q8 device tree says: + * - gpio0 11 HIGH -> power hold -+ * - gpio7 1 LOW -> possibly pmic-vsel, we don't care -+ */ ++ * - gpio7 1 LOW -> possibly pmic-vsel, we don't care ++ */ + pmic_vsel: pmic-vsel { + rockchip,pins = <7 1 RK_FUNC_GPIO &pcfg_output_low>; + }; -+ ++ + pwr_hold: pwr-hold { + rockchip,pins = <0 11 RK_FUNC_GPIO &pcfg_pull_up>; + }; @@ -650,7 +710,7 @@ + }; + + sdmmc { -+ ++ + /* + * Copied from firefly board definition to give more drive to + * the sdmmc pins. The Q8 seems to be quite able to drive @@ -701,14 +761,22 @@ + }; + + }; -+ -+ ++ ++ + wireless-bluetooth { + uart0_gpios: uart0-gpios { + rockchip,pins = <4 19 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + ++ emmc { ++ ++ emmc_reset: emmc-reset { ++ rockchip,pins = <3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ }; ++ +}; + +&saradc { @@ -717,24 +785,34 @@ +}; + +&emmc { -+ ++ + /* -+ * eMMC seems to be 52Mhz device on q8 devices, so set it here -+ * vmmc-supply and vqmmc-supply are removed because they hang -+ * u-boot >= v2018.03 -+ * From the original q8l firmware and eMMC datasheet it also should -+ * support DDR highspeed mode, but using mmc-ddr-3_3v or mmc-ddr-1_8v -+ * properties are not working ++ * eMMC is a 52Mhz DDR device on q8 devices, so set it here. ++ * Setting default-sample-rate to 180 degrees is very important, ++ * otherwise the eMMC is not stable and may not be able to negotiate ++ * the right clock. ++ * Despite the code already seems to use 180 degree phase when ++ * MMC + 8bit bus is set, we need to set default phase here too. ++ * ++ * Huge hint came from this patch: ++ * https://patchwork.kernel.org/patch/11129183/ ++ * + */ -+ clock-frequency = <50000000>; -+ + broken-cd; + bus-width = <8>; + cap-mmc-highspeed; ++ + disable-wp; + non-removable; + pinctrl-names = "default"; -+ pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_pwr>, <&emmc_bus8>; ++ pinctrl-0 = <&emmc_clk>, <&emmc_cmd>, <&emmc_bus8>; ++ ++ vmmc-supply = <&vcc_io>; ++ vqmmc-supply = <&vcc_flash>; ++ ++ mmc-pwrseq = <&emmc_pwrseq>; ++ mmc-ddr-1_8v; ++ rockchip,default-sample-phase = <180>; + + status = "okay"; +}; @@ -746,9 +824,7 @@ + cap-mmc-highspeed; + cap-sd-highspeed; + cd-gpios = <&gpio6 RK_PC6 GPIO_ACTIVE_LOW>; -+ cd-debounce-delay-ms = <200>; -+ post-power-on-delay-ms = <50>; -+ supports-cqe; ++ cd-debounce-delay-ms = <500>; + disable-wp; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc_clk>, <&sdmmc_cmd>, <&sdmmc_cd>, <&sdmmc_bus4>; @@ -766,33 +842,33 @@ +&sdio0 { + #address-cells = <1>; + #size-cells = <0>; -+ ++ + bus-width = <4>; + mmc-pwrseq = <&sdio0_pwrseq>; -+ ++ + vmmc-supply = <&vcc_io>; -+ vqmmc-supply = <&vcc_18>; // This must be the same as in io_domains, ++ vqmmc-supply = <&vcc_18>; // This must be the same as in io_domains, + // otherwise the mmc1 device won't be detected properly -+ -+// clock-frequency = <50000000>; -+// max-frequency = <50000000>; ++ ++ // clock-frequency = <50000000>; ++ // max-frequency = <50000000>; + + pinctrl-names = "default"; -+ pinctrl-0 = <&sdio0_bus4>, <&sdio0_cmd>, <&sdio0_clk>, <&sdio0_int>; -+ ++ pinctrl-0 = <&sdio0_bus4>, <&sdio0_cmd>, <&sdio0_clk>, <&sdio0_int>; ++ + cap-sdio-irq; + no-mmc; + no-sd; + cap-sd-highspeed; // required, otherwise does not work! -+ supports-sdio; ++ supports-sdio; + non-removable; -+ ++ + keep-power-in-suspend; + disable-wp; -+ -+ ++ ++ + status = "okay"; -+ ++ + brcmf: bcrmf@1 { + reg = <1>; + compatible = "brcm,bcm4329-fmac"; @@ -800,8 +876,8 @@ + interrupts = <30 IRQ_TYPE_LEVEL_LOW>; + interrupt-names = "host-wake"; + status = "okay"; -+ }; -+ ++ }; ++ + //sd-uhs-sdr104; // required to be disabled, otherwise the device get + // detected, but there is no communication + @@ -823,13 +899,13 @@ + * These dmas described here for uarts are present in original q8 board + * dts, so I replicate them here because documentation says that serial + * ports can have dmas. -+ * note: ++ * note: + * - uart0 is the serial port connected to the bluetooth module -+ * - uart2 is the onboard serial port -+ * ++ * - uart2 is the onboard serial port ++ * + * As ok kernel 4.19 DMA for serial ports is disabled because it makes + * the ports unusable -+ * ++ * + */ +&uart0 { + pinctrl-names = "default"; @@ -873,31 +949,25 @@ + * specify the proper resources for all the phys though. + * The reference patch which works in conjuction with the reset lines: + * https://patchwork.kernel.org/patch/9469811/ -+ * ++ * + */ +&usbphy { + status = "okay"; +}; -+ -+&usbphy0 { -+ vbus-supply = <&vcc_otg_5v>; -+}; -+ -+&usbphy2 { -+ vbus-supply = <&vcc_host_5v>; -+}; + +&usb_host0_ehci { -+ dr_mode = "host"; -+ reg = <0x0 0xff500000 0x0 0x20000>; -+ status = "disable"; ++ dr_mode = "host"; ++ reg = <0x0 0xff500000 0x0 0x20000>; ++ status = "disable"; +}; + +&usb_host1 { ++ vbus-supply = <&vcc_host_5v>; + status = "okay"; +}; + +&usb_otg { ++ vbus-supply = <&vcc_otg_5v>; + status = "okay"; +}; + @@ -924,18 +994,10 @@ + status = "okay"; +}; + -+//&vpu_service { -+// status = "okay"; -+//}; -+ +&hevc_mmu { + status = "okay"; +}; + -+//&hevc_service { -+// status = "okay"; -+//}; -+ +&wdt { + status = "okay"; +}; @@ -978,8 +1040,28 @@ + opp-1608000000 { + opp-microvolt = <1300000>; + }; ++ ++ /* ++ Remove the overclocking/turbo frequencies ++ */ ++ /delete-node/ opp@1704000000; ++ /delete-node/ opp@1800000000; ++ /delete-node/ opp@1896000000; ++ /delete-node/ opp@1920000000; ++ /delete-node/ opp@1992000000; ++ /delete-node/ opp@2016000000; ++ /delete-node/ opp@2040000000; ++ /delete-node/ opp@2064000000; ++ /delete-node/ opp@2088000000; ++ /delete-node/ opp@2112000000; ++ /delete-node/ opp@2136000000; ++ /delete-node/ opp@2160000000; ++ /delete-node/ opp@2184000000; ++ /delete-node/ opp@2208000000; ++ ++ +}; + +&gpiomem { -+ status = "okay"; ++ status = "okay"; +}; From b90e7fa9a4bcb8cdf75462348e45d775a8f59406 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Wed, 5 Feb 2020 08:48:33 +0100 Subject: [PATCH 13/54] Bugfix: fixing yet another wrong fixed refference to linux-image in Rockchip packaging script --- patch/misc/general-packaging-4.4.y.patch | 45 ++++++++++++++++-------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/patch/misc/general-packaging-4.4.y.patch b/patch/misc/general-packaging-4.4.y.patch index a6b43acaca..ecfbeb6729 100644 --- a/patch/misc/general-packaging-4.4.y.patch +++ b/patch/misc/general-packaging-4.4.y.patch @@ -2,7 +2,7 @@ diff --git a/scripts/package/builddeb b/scripts/package/builddeb index 6c3b038e..977a0624 100755 --- a/scripts/package/builddeb +++ b/scripts/package/builddeb -@@ -27,6 +27,28 @@ create_package() { +@@ -27,6 +27,28 @@ chown -R root:root "$pdir" chmod -R go-w "$pdir" @@ -31,7 +31,7 @@ index 6c3b038e..977a0624 100755 # Create the package dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir" dpkg --build "$pdir" .. -@@ -50,8 +72,11 @@ set_debarch() { +@@ -50,8 +72,11 @@ mips*) debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; arm64) @@ -44,7 +44,7 @@ index 6c3b038e..977a0624 100755 if grep -q CONFIG_AEABI=y $KCONFIG_CONFIG; then if grep -q CONFIG_VFP=y $KCONFIG_CONFIG; then debarch=armhf -@@ -93,11 +118,13 @@ tmpdir="$objtree/debian/tmp" +@@ -93,11 +118,13 @@ fwdir="$objtree/debian/fwtmp" kernel_headers_dir="$objtree/debian/hdrtmp" libc_headers_dir="$objtree/debian/headertmp" @@ -62,7 +62,7 @@ index 6c3b038e..977a0624 100755 dbg_packagename=$packagename-dbg debarch= forcearch= -@@ -124,7 +151,9 @@ esac +@@ -124,7 +151,9 @@ BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" # Setup the directory structure @@ -73,7 +73,7 @@ index 6c3b038e..977a0624 100755 mkdir -m 755 -p "$tmpdir/DEBIAN" mkdir -p "$tmpdir/lib" "$tmpdir/boot" mkdir -p "$fwdir/lib/firmware/$version/" -@@ -183,6 +212,11 @@ if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then +@@ -183,6 +212,11 @@ fi fi @@ -85,7 +85,7 @@ index 6c3b038e..977a0624 100755 if [ "$ARCH" != "um" ]; then $MAKE headers_check KBUILD_SRC= $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr" -@@ -195,21 +229,23 @@ fi +@@ -195,21 +229,23 @@ # so do we; recent versions of dracut and initramfs-tools will obey this. debhookdir=${KDEB_HOOKDIR:-/etc/kernel} if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then @@ -111,7 +111,7 @@ index 6c3b038e..977a0624 100755 export INITRD=$want_initrd test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d -@@ -218,6 +254,53 @@ EOF +@@ -218,6 +254,53 @@ chmod 755 "$tmpdir/DEBIAN/$script" done @@ -165,7 +165,25 @@ index 6c3b038e..977a0624 100755 # Try to determine maintainer and email values if [ -n "$DEBEMAIL" ]; then email=$DEBEMAIL -@@ -328,16 +411,25 @@ fi +@@ -293,7 +376,7 @@ + cat <> debian/control + + Package: $packagename +-Provides: linux-image, linux-image-2.6, linux-modules-$version ++Provides: $packagename + Architecture: any + Description: User Mode Linux kernel, version $version + User-mode Linux is a port of the Linux kernel to its own system call +@@ -310,7 +393,7 @@ + cat <> debian/control + + Package: $packagename +-Provides: linux-image, linux-image-2.6, linux-modules-$version ++Provides: $packagename + Suggests: $fwpackagename + Architecture: any + Description: Linux kernel, version $version +@@ -328,17 +411,26 @@ (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" destdir=$kernel_headers_dir/usr/src/linux-headers-$version mkdir -p "$destdir" @@ -192,7 +210,8 @@ index 6c3b038e..977a0624 100755 +Depends: make, gcc, libc6-dev, libssl-dev Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} -@@ -363,10 +455,20 @@ fi + . +@@ -363,6 +457,16 @@ cat <> debian/control @@ -208,12 +227,8 @@ index 6c3b038e..977a0624 100755 + Package: $libc_headers_packagename Section: devel - Provides: $libc_headers_packagename - Architecture: any - Description: Linux support headers for userspace development - This package provides userspaces headers from the Linux kernel. These headers - are used by the installed headers for GNU glibc and other system libraries. -@@ -374,7 +476,7 @@ EOF + Provides: linux-kernel-headers +@@ -374,7 +478,7 @@ if [ "$ARCH" != "um" ]; then create_package "$kernel_headers_packagename" "$kernel_headers_dir" From 1a587bfa71fa04ed9432b005749242da6188df96 Mon Sep 17 00:00:00 2001 From: Piotr Szczepanik Date: Wed, 5 Feb 2020 20:27:03 +0100 Subject: [PATCH 14/54] Updated rockchip64-dev config with latest kernel --- config/kernel/linux-rockchip64-dev.config | 383 ++++++++++++++-------- 1 file changed, 248 insertions(+), 135 deletions(-) diff --git a/config/kernel/linux-rockchip64-dev.config b/config/kernel/linux-rockchip64-dev.config index af24aa03ac..41a60388e6 100644 --- a/config/kernel/linux-rockchip64-dev.config +++ b/config/kernel/linux-rockchip64-dev.config @@ -1,16 +1,17 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.3.0-rc4 Kernel Configuration +# Linux/arm64 5.5.2 Kernel Configuration # # -# Compiler: aarch64-linux-gnu-gcc (Linaro GCC 7.4-2019.02) 7.4.1 20181213 [linaro-7.4-2019.02 revision 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4] +# Compiler: aarch64-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0 # CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=70401 +CONFIG_GCC_VERSION=80300 CONFIG_CLANG_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y @@ -21,7 +22,6 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set -# CONFIG_HEADER_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -127,6 +127,7 @@ CONFIG_GENERIC_SCHED_CLOCK=y # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_CC_HAS_INT128=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_NUMA_BALANCING=y CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y @@ -182,7 +183,6 @@ CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y -# CONFIG_SYSCTL_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y @@ -254,6 +254,7 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CSUM=y CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_SMP=y @@ -288,6 +289,7 @@ CONFIG_ARCH_PROC_KCORE_TEXT=y # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set CONFIG_ARCH_ROCKCHIP=y +# CONFIG_ARCH_S32 is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_STRATIX10 is not set # CONFIG_ARCH_SYNQUACER is not set @@ -322,12 +324,15 @@ CONFIG_ARM64_ERRATUM_1024718=y CONFIG_ARM64_ERRATUM_1418040=y CONFIG_ARM64_ERRATUM_1165522=y CONFIG_ARM64_ERRATUM_1286807=y +CONFIG_ARM64_ERRATUM_1319367=y CONFIG_ARM64_ERRATUM_1463225=y +CONFIG_ARM64_ERRATUM_1542419=y # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23144 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set # CONFIG_CAVIUM_ERRATUM_30115 is not set +CONFIG_CAVIUM_TX2_ERRATUM_219=y # CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y # CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set @@ -347,6 +352,7 @@ CONFIG_ARM64_VA_BITS=48 CONFIG_ARM64_PA_BITS_48=y CONFIG_ARM64_PA_BITS=48 # CONFIG_CPU_BIG_ENDIAN is not set +CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_SCHED_MC=y # CONFIG_SCHED_SMT is not set CONFIG_NR_CPUS=8 @@ -388,6 +394,7 @@ CONFIG_HARDEN_EL2_VECTORS=y CONFIG_ARM64_SSBD=y CONFIG_RODATA_FULL_DEFAULT_ENABLED=y # CONFIG_ARM64_SW_TTBR0_PAN is not set +CONFIG_ARM64_TAGGED_ADDR_ABI=y CONFIG_COMPAT=y CONFIG_KUSER_HELPERS=y CONFIG_ARMV8_DEPRECATED=y @@ -429,7 +436,6 @@ CONFIG_ARM64_SVE=y # Boot options # CONFIG_CMDLINE="" -# CONFIG_CMDLINE_FORCE is not set CONFIG_EFI_STUB=y CONFIG_EFI=y CONFIG_DMI=y @@ -483,6 +489,7 @@ CONFIG_DT_IDLE_STATES=y # ARM CPU Idle Drivers # CONFIG_ARM_CPUIDLE=y +# CONFIG_ARM_PSCI_CPUIDLE is not set # end of ARM CPU Idle Drivers # end of CPU Idle @@ -593,6 +600,7 @@ CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_AES_ARM64_CE_BLK=y # CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set # CONFIG_CRYPTO_CHACHA20_NEON is not set +# CONFIG_CRYPTO_POLY1305_NEON is not set CONFIG_CRYPTO_NHPOLY1305_NEON=m # CONFIG_CRYPTO_AES_ARM64_BS is not set @@ -607,6 +615,7 @@ CONFIG_JUMP_LABEL=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y @@ -617,6 +626,7 @@ CONFIG_ARCH_HAS_KEEPINITRD=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y @@ -650,10 +660,11 @@ CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_ARCH_MMAP_RND_BITS=18 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 +CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_HAVE_COPY_THREAD_TLS=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y -CONFIG_64BIT_TIME=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y @@ -661,7 +672,6 @@ CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y -CONFIG_REFCOUNT_FULL=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y CONFIG_ARCH_USE_MEMREMAP_PROT=y # CONFIG_LOCK_EVENT_COUNTS is not set @@ -687,10 +697,13 @@ CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +# CONFIG_UNUSED_SYMBOLS is not set # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_SCSI_REQUEST=y +CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y @@ -700,6 +713,7 @@ CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_CGROUP_IOLATENCY is not set +# CONFIG_BLK_CGROUP_IOCOST is not set CONFIG_BLK_DEBUG_FS=y # CONFIG_BLK_SED_OPAL is not set @@ -776,6 +790,7 @@ CONFIG_COMPACTION=y CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_BOUNCE=y CONFIG_MMU_NOTIFIER=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 @@ -805,6 +820,7 @@ CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_FRAME_VECTOR=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_BENCHMARK is not set +# CONFIG_READ_ONLY_THP_FOR_FS is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y # end of Memory Management options @@ -824,6 +840,7 @@ CONFIG_UNIX_SCM=y # CONFIG_UNIX_DIAG is not set CONFIG_TLS=m CONFIG_TLS_DEVICE=y +# CONFIG_TLS_TOE is not set CONFIG_XFRM=y CONFIG_XFRM_OFFLOAD=y CONFIG_XFRM_ALGO=y @@ -1401,6 +1418,7 @@ CONFIG_NET_ACT_CT=m CONFIG_NET_IFE_SKBMARK=m CONFIG_NET_IFE_SKBPRIO=m CONFIG_NET_IFE_SKBTCINDEX=m +# CONFIG_NET_TC_SKB_EXT is not set CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y @@ -1542,7 +1560,6 @@ CONFIG_PCIEAER=y # CONFIG_PCIEAER_INJECT is not set # CONFIG_PCIE_ECRC is not set CONFIG_PCIEASPM=y -# CONFIG_PCIEASPM_DEBUG is not set # CONFIG_PCIEASPM_DEFAULT is not set # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_POWER_SUPERSAVE is not set @@ -1570,14 +1587,6 @@ CONFIG_HOTPLUG_PCI=y # # PCI controller drivers # - -# -# Cadence PCIe controllers support -# -# CONFIG_PCIE_CADENCE_HOST is not set -# CONFIG_PCIE_CADENCE_EP is not set -# end of Cadence PCIe controllers support - # CONFIG_PCI_FTPCI100 is not set # CONFIG_PCI_HOST_GENERIC is not set # CONFIG_PCIE_XILINX is not set @@ -1597,7 +1606,15 @@ CONFIG_PCIE_ROCKCHIP_EP=y # CONFIG_PCI_HISI is not set # CONFIG_PCIE_KIRIN is not set # CONFIG_PCI_MESON is not set +# CONFIG_PCIE_AL is not set # end of DesignWare PCI Core Support + +# +# Cadence PCIe controllers support +# +# CONFIG_PCIE_CADENCE_PLAT_HOST is not set +# CONFIG_PCIE_CADENCE_PLAT_EP is not set +# end of Cadence PCIe controllers support # end of PCI controller drivers # @@ -1634,6 +1651,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +CONFIG_FW_CACHE=y # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y @@ -1662,6 +1680,7 @@ CONFIG_GENERIC_ARCH_TOPOLOGY=y # CONFIG_ARM_CCI=y CONFIG_BRCMSTB_GISB_ARB=y +# CONFIG_MOXTET is not set # CONFIG_SIMPLE_PM_BUS is not set CONFIG_VEXPRESS_CONFIG=y # end of Bus devices @@ -1670,13 +1689,13 @@ CONFIG_CONNECTOR=m # CONFIG_GNSS is not set CONFIG_MTD=y # CONFIG_MTD_TESTS is not set -# CONFIG_MTD_CMDLINE_PARTS is not set -CONFIG_MTD_OF_PARTS=y -# CONFIG_MTD_AR7_PARTS is not set # # Partition parsers # +# CONFIG_MTD_AR7_PARTS is not set +# CONFIG_MTD_CMDLINE_PARTS is not set +CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set # end of Partition parsers @@ -1732,7 +1751,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set -CONFIG_MTD_M25P80=y # CONFIG_MTD_MCHP23K256 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set @@ -1782,6 +1800,7 @@ CONFIG_OF_CONFIGFS=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set +CONFIG_CDROM=m # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set CONFIG_ZRAM=m CONFIG_ZRAM_WRITEBACK=y @@ -1791,6 +1810,7 @@ CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_DRBD=m +# CONFIG_DRBD_FAULT_INJECTION is not set CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_SKD is not set # CONFIG_BLK_DEV_SX8 is not set @@ -1812,6 +1832,7 @@ CONFIG_VIRTIO_BLK=y CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y CONFIG_NVME_MULTIPATH=y +CONFIG_NVME_HWMON=y CONFIG_NVME_FABRICS=m CONFIG_NVME_FC=m # CONFIG_NVME_TCP is not set @@ -1828,7 +1849,6 @@ CONFIG_NVME_TARGET_FC=m # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set -# CONFIG_SGI_IOC4 is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set @@ -1877,39 +1897,7 @@ CONFIG_EEPROM_93CX6=m # # Intel MIC & related support # - -# -# Intel MIC Bus Driver -# - -# -# SCIF Bus Driver -# - -# -# VOP Bus Driver -# # CONFIG_VOP_BUS is not set - -# -# Intel MIC Host Driver -# - -# -# Intel MIC Card Driver -# - -# -# SCIF Driver -# - -# -# Intel MIC Coprocessor State Management (COSM) Drivers -# - -# -# VOP Driver -# # end of Intel MIC & related support # CONFIG_GENWQE is not set @@ -2134,6 +2122,7 @@ CONFIG_DM_CACHE=m # CONFIG_DM_CACHE_SMQ is not set # CONFIG_DM_WRITECACHE is not set CONFIG_DM_ERA=m +# CONFIG_DM_CLONE is not set CONFIG_DM_MIRROR=m CONFIG_DM_LOG_USERSPACE=m CONFIG_DM_RAID=m @@ -2144,6 +2133,7 @@ CONFIG_DM_DELAY=m CONFIG_DM_UEVENT=y CONFIG_DM_FLAKEY=m CONFIG_DM_VERITY=m +# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set CONFIG_DM_VERITY_FEC=y CONFIG_DM_SWITCH=m CONFIG_DM_LOG_WRITES=m @@ -2191,10 +2181,6 @@ CONFIG_VIRTIO_NET=y # CONFIG_NET_VRF is not set # CONFIG_ARCNET is not set -# -# CAIF transport drivers -# - # # Distributed Switch Architecture drivers # @@ -2283,8 +2269,6 @@ CONFIG_HNS=y CONFIG_HNS_DSAF=y CONFIG_HNS_ENET=y # CONFIG_HNS3 is not set -CONFIG_NET_VENDOR_HP=y -# CONFIG_HP100 is not set CONFIG_NET_VENDOR_HUAWEI=y # CONFIG_HINIC is not set CONFIG_NET_VENDOR_I825XX=y @@ -2346,10 +2330,11 @@ CONFIG_NET_VENDOR_OKI=y CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set +CONFIG_NET_VENDOR_PENSANDO=y +# CONFIG_IONIC is not set CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set -# CONFIG_QLGE is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_QUALCOMM=y @@ -2407,6 +2392,8 @@ CONFIG_NET_VENDOR_VIA=y CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set +CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_AXI_EMAC is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set CONFIG_MDIO_DEVICE=y @@ -2423,7 +2410,7 @@ CONFIG_MDIO_I2C=m CONFIG_MDIO_MSCC_MIIM=m # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_THUNDER is not set -CONFIG_PHYLINK=m +CONFIG_PHYLINK=y CONFIG_PHYLIB=y CONFIG_SWPHY=y # CONFIG_LED_TRIGGER_PHY is not set @@ -2432,10 +2419,10 @@ CONFIG_SWPHY=y # MII PHY device drivers # CONFIG_SFP=m +# CONFIG_ADIN_PHY is not set # CONFIG_AMD_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m -CONFIG_AT803X_PHY=m # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_BROADCOM_PHY is not set @@ -2446,6 +2433,7 @@ CONFIG_AT803X_PHY=m CONFIG_DP83TC811_PHY=m # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set +# CONFIG_DP83869_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_ICPLUS_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set @@ -2459,6 +2447,7 @@ CONFIG_MICROCHIP_T1_PHY=m # CONFIG_MICROSEMI_PHY is not set # CONFIG_NATIONAL_PHY is not set CONFIG_NXP_TJA11XX_PHY=m +CONFIG_AT803X_PHY=m # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=y # CONFIG_RENESAS_PHY is not set @@ -2549,6 +2538,7 @@ CONFIG_ATH9K_PCI=y CONFIG_ATH9K_RFKILL=y # CONFIG_ATH9K_CHANNEL_CONTEXT is not set CONFIG_ATH9K_PCOEM=y +# CONFIG_ATH9K_PCI_NO_EEPROM is not set CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set # CONFIG_ATH9K_HWRNG is not set @@ -2655,6 +2645,7 @@ CONFIG_WLCORE_SDIO=m CONFIG_WILINK_PLATFORM_DATA=y CONFIG_RTL8822BU=m CONFIG_RTL8188EU=m +CONFIG_RTL8821CU=m CONFIG_RTL8812AU=m CONFIG_WLAN_VENDOR_ZYDAS=y # CONFIG_USB_ZD1201 is not set @@ -2875,7 +2866,6 @@ CONFIG_INPUT_RK805_PWRKEY=y # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y -# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set @@ -2939,10 +2929,10 @@ CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_RSA is not set +CONFIG_SERIAL_8250_DWLIB=y CONFIG_SERIAL_8250_FSL=y CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set -# CONFIG_SERIAL_8250_MOXA is not set CONFIG_SERIAL_OF_PLATFORM=y # @@ -2969,6 +2959,7 @@ CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # end of Serial drivers @@ -2995,6 +2986,8 @@ CONFIG_DEVPORT=y # CONFIG_XILLYBUS is not set # end of Character devices +# CONFIG_RANDOM_TRUST_BOOTLOADER is not set + # # I2C support # @@ -3147,6 +3140,7 @@ CONFIG_PTP_1588_CLOCK=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # +# CONFIG_PTP_1588_CLOCK_IDTCM is not set # end of PTP clock support CONFIG_PINCTRL=y @@ -3165,6 +3159,7 @@ CONFIG_PINCTRL_STMFX=m CONFIG_PINCTRL_MAX77620=y CONFIG_PINCTRL_RK805=m # CONFIG_PINCTRL_OCELOT is not set +# CONFIG_PINCTRL_EQUILIBRIUM is not set CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y @@ -3253,6 +3248,7 @@ CONFIG_W1_MASTER_MATROX=m # CONFIG_W1_MASTER_DS2482 is not set # CONFIG_W1_MASTER_DS1WM is not set CONFIG_W1_MASTER_GPIO=m +# CONFIG_W1_MASTER_SGI is not set # end of 1-wire Bus Masters # @@ -3267,10 +3263,12 @@ CONFIG_W1_SLAVE_DS2413=m CONFIG_W1_SLAVE_DS2406=m CONFIG_W1_SLAVE_DS2423=m # CONFIG_W1_SLAVE_DS2805 is not set +# CONFIG_W1_SLAVE_DS2430 is not set CONFIG_W1_SLAVE_DS2431=m CONFIG_W1_SLAVE_DS2433=m # CONFIG_W1_SLAVE_DS2433_CRC is not set # CONFIG_W1_SLAVE_DS2438 is not set +# CONFIG_W1_SLAVE_DS250X is not set # CONFIG_W1_SLAVE_DS2780 is not set # CONFIG_W1_SLAVE_DS2781 is not set # CONFIG_W1_SLAVE_DS28E04 is not set @@ -3313,6 +3311,7 @@ CONFIG_BATTERY_BQ27XXX_HDQ=m # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set CONFIG_BATTERY_MAX1721X=m +# CONFIG_CHARGER_ISP1704 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set @@ -3352,6 +3351,7 @@ CONFIG_HWMON=y # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AS370 is not set # CONFIG_SENSORS_ASC7621 is not set CONFIG_SENSORS_ARM_SCPI=y # CONFIG_SENSORS_ASPEED is not set @@ -3375,6 +3375,8 @@ CONFIG_SENSORS_ARM_SCPI=y # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set @@ -3443,7 +3445,6 @@ CONFIG_SENSORS_PWM_FAN=m # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set @@ -3457,6 +3458,7 @@ CONFIG_SENSORS_INA2XX=m # CONFIG_SENSORS_TMP108 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP513 is not set # CONFIG_SENSORS_VEXPRESS is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set @@ -3480,12 +3482,10 @@ CONFIG_THERMAL_OF=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set -# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set -CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y # CONFIG_CLOCK_THERMAL is not set # CONFIG_DEVFREQ_THERMAL is not set @@ -3555,8 +3555,7 @@ CONFIG_MFD_CORE=y # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set -CONFIG_MFD_CROS_EC=y -# CONFIG_MFD_CROS_EC_CHARDEV is not set +CONFIG_MFD_CROS_EC_DEV=y # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set @@ -3692,6 +3691,7 @@ CONFIG_REGULATOR_S2MPS11=y # CONFIG_REGULATOR_S5M8767 is not set CONFIG_REGULATOR_SLG51000=m # CONFIG_REGULATOR_SY8106A is not set +# CONFIG_REGULATOR_SY8824X is not set # CONFIG_REGULATOR_TPS51632 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set @@ -3748,6 +3748,7 @@ CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=m +CONFIG_VIDEO_V4L2_I2C=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_VIDEO_TUNER=m @@ -4044,9 +4045,11 @@ CONFIG_VIDEO_CX25840=m # # Camera sensor devices # +# CONFIG_VIDEO_HI556 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set +# CONFIG_VIDEO_IMX290 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX355 is not set CONFIG_VIDEO_OV2640=m @@ -4058,6 +4061,7 @@ CONFIG_VIDEO_OV2640=m # CONFIG_VIDEO_OV5647 is not set # CONFIG_VIDEO_OV6650 is not set # CONFIG_VIDEO_OV5670 is not set +# CONFIG_VIDEO_OV5675 is not set # CONFIG_VIDEO_OV5695 is not set # CONFIG_VIDEO_OV7251 is not set # CONFIG_VIDEO_OV772X is not set @@ -4368,6 +4372,7 @@ CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set @@ -4394,6 +4399,7 @@ CONFIG_DRM_I2C_SIL164=m # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set CONFIG_DRM_KOMEDA=m +# CONFIG_DRM_KOMEDA_ERROR_PRINT is not set # end of ARM devices # CONFIG_DRM_RADEON is not set @@ -4442,12 +4448,16 @@ CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D=m # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04=m # CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set +# CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set +# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO=m # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS=m # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set CONFIG_DRM_PANEL_RAYDIUM_RM68200=m CONFIG_DRM_PANEL_ROCKTECH_JH057N00900=m # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set @@ -4458,9 +4468,13 @@ CONFIG_DRM_PANEL_SAMSUNG_S6E63M0=m # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set +# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set CONFIG_DRM_PANEL_SITRONIX_ST7701=m # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set +# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set +# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set +# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set CONFIG_DRM_PANEL_TPO_TPG110=m CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA=m # end of Display Panels @@ -4502,9 +4516,15 @@ CONFIG_DRM_DW_MIPI_DSI=m # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_HISI_HIBMC is not set CONFIG_DRM_HISI_KIRIN=y -CONFIG_HISI_KIRIN_DW_DSI=y # CONFIG_DRM_MXSFB is not set -# CONFIG_DRM_TINYDRM is not set +# CONFIG_DRM_GM12U320 is not set +# CONFIG_TINYDRM_HX8357D is not set +# CONFIG_TINYDRM_ILI9225 is not set +# CONFIG_TINYDRM_ILI9341 is not set +# CONFIG_TINYDRM_MI0283QT is not set +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_ST7586 is not set +# CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_XEN is not set CONFIG_DRM_LIMA=m @@ -4599,7 +4619,7 @@ CONFIG_LCD_CLASS_DEVICE=m CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=m # CONFIG_BACKLIGHT_PWM is not set -# CONFIG_BACKLIGHT_PM8941_WLED is not set +# CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set @@ -4662,12 +4682,15 @@ CONFIG_SND_DRIVERS=y # CONFIG_SND_MPU401 is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set +# CONFIG_SND_ALS300 is not set +# CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set +# CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set @@ -4689,17 +4712,23 @@ CONFIG_SND_PCI=y # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set +# CONFIG_SND_EMU10K1 is not set +# CONFIG_SND_EMU10K1X is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set +# CONFIG_SND_ES1938 is not set +# CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set +# CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set +# CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set @@ -4708,6 +4737,8 @@ CONFIG_SND_PCI=y # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SE6X is not set +# CONFIG_SND_SONICVIBES is not set +# CONFIG_SND_TRIDENT is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set @@ -4793,6 +4824,8 @@ CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set +# CONFIG_SND_SOC_ADAU7118_HW is not set +# CONFIG_SND_SOC_ADAU7118_I2C is not set # CONFIG_SND_SOC_AK4104 is not set CONFIG_SND_SOC_AK4118=m CONFIG_SND_SOC_AK4458=m @@ -4825,6 +4858,7 @@ CONFIG_SND_SOC_CS4341=m # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_CX2072X is not set +# CONFIG_SND_SOC_DA7213 is not set CONFIG_SND_SOC_DA7219=y CONFIG_SND_SOC_DMIC=y CONFIG_SND_SOC_HDMI_CODEC=y @@ -4879,6 +4913,8 @@ CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS2562 is not set +# CONFIG_SND_SOC_TAS2770 is not set # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set @@ -4894,6 +4930,7 @@ CONFIG_SND_SOC_TDA7419=m CONFIG_SND_SOC_TS3A227E=y # CONFIG_SND_SOC_TSCS42XX is not set # CONFIG_SND_SOC_TSCS454 is not set +# CONFIG_SND_SOC_UDA1334 is not set # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set # CONFIG_SND_SOC_WM8524 is not set @@ -4962,6 +4999,7 @@ CONFIG_HID_CHICONY=y CONFIG_HID_MACALLY=m # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CMEDIA is not set +# CONFIG_HID_CREATIVE_SB0540 is not set CONFIG_HID_CYPRESS=y # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set @@ -5055,6 +5093,9 @@ CONFIG_USB_HID=y CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y +# CONFIG_USB_LED_TRIG is not set +CONFIG_USB_ULPI_BUS=y +# CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y @@ -5072,7 +5113,6 @@ CONFIG_USB_OTG=y # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 # CONFIG_USB_MON is not set -# CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers @@ -5146,6 +5186,7 @@ CONFIG_USBIP_VHCI_NR_HCS=1 CONFIG_USBIP_HOST=m CONFIG_USBIP_VUDC=m # CONFIG_USBIP_DEBUG is not set +# CONFIG_USB_CDNS3 is not set # CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y # CONFIG_USB_DWC3_ULPI is not set @@ -5246,7 +5287,6 @@ CONFIG_USB_EMI62=m CONFIG_USB_EMI26=m CONFIG_USB_ADUTUX=m CONFIG_USB_SEVSEG=m -CONFIG_USB_RIO500=m CONFIG_USB_LEGOTOWER=m CONFIG_USB_LCD=m CONFIG_USB_CYPRESS_CY7C63=m @@ -5273,6 +5313,7 @@ CONFIG_USB_CHAOSKEY=m # # USB Physical Layer drivers # +CONFIG_USB_PHY=y # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set @@ -5358,6 +5399,7 @@ CONFIG_TYPEC_RT1711H=m CONFIG_TYPEC_FUSB302=m CONFIG_TYPEC_UCSI=m # CONFIG_UCSI_CCG is not set +# CONFIG_TYPEC_HD3SS3220 is not set CONFIG_TYPEC_TPS6598X=m # @@ -5374,9 +5416,6 @@ CONFIG_TYPEC_DP_ALTMODE=m # end of USB Type-C Alternate Mode drivers CONFIG_USB_ROLE_SWITCH=y -# CONFIG_USB_LED_TRIG is not set -CONFIG_USB_ULPI_BUS=y -# CONFIG_UWB is not set CONFIG_MMC=y CONFIG_PWRSEQ_EMMC=y CONFIG_PWRSEQ_SIMPLE=y @@ -5396,10 +5435,12 @@ CONFIG_MMC_SDHCI_IO_ACCESSORS=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_OF_ARASAN=y +# CONFIG_MMC_SDHCI_OF_ASPEED is not set # CONFIG_MMC_SDHCI_OF_AT91 is not set # CONFIG_MMC_SDHCI_OF_DWCMSHC is not set CONFIG_MMC_SDHCI_CADENCE=y # CONFIG_MMC_SDHCI_F_SDH30 is not set +# CONFIG_MMC_SDHCI_MILBEAUT is not set # CONFIG_MMC_TIFM_SD is not set CONFIG_MMC_SPI=y # CONFIG_MMC_CB710 is not set @@ -5434,6 +5475,7 @@ CONFIG_LEDS_CLASS=y # CONFIG_LEDS_BCM6328 is not set # CONFIG_LEDS_BCM6358 is not set CONFIG_LEDS_CR0014114=m +# CONFIG_LEDS_EL15203000 is not set # CONFIG_LEDS_LM3530 is not set CONFIG_LEDS_LM3532=m # CONFIG_LEDS_LM3642 is not set @@ -5647,6 +5689,7 @@ CONFIG_QCOM_HIDMA=y # CONFIG_DW_DMAC_PCI is not set CONFIG_DW_EDMA=m CONFIG_DW_EDMA_PCIE=m +# CONFIG_SF_PDMA is not set # # DMA Clients @@ -5661,6 +5704,7 @@ CONFIG_DMA_ENGINE_RAID=y CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set +# CONFIG_DMABUF_SELFTESTS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -5712,6 +5756,7 @@ CONFIG_XEN_AUTO_XLATE=y CONFIG_XEN_FRONT_PGDIR_SHBUF=m # end of Xen driver support +# CONFIG_GREYBUS is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set @@ -5809,7 +5854,6 @@ CONFIG_FUSB_30X=m # CONFIG_WILC1000_SPI is not set # CONFIG_MOST is not set # CONFIG_KS7010 is not set -# CONFIG_GREYBUS is not set # CONFIG_PI433 is not set # @@ -5819,16 +5863,30 @@ CONFIG_FUSB_30X=m # end of Gasket devices # CONFIG_XIL_AXIS_FIFO is not set -# CONFIG_EROFS_FS is not set CONFIG_FIELDBUS_DEV=m CONFIG_HMS_ANYBUSS_BUS=m # CONFIG_ARCX_ANYBUS_CONTROLLER is not set # CONFIG_HMS_PROFINET is not set +# CONFIG_USB_WUSB_CBAF is not set +# CONFIG_UWB is not set +# CONFIG_EXFAT_FS is not set +# CONFIG_QLGE is not set +CONFIG_NET_VENDOR_HP=y +# CONFIG_HP100 is not set +# CONFIG_WFX is not set # CONFIG_GOLDFISH is not set +CONFIG_MFD_CROS_EC=y CONFIG_CHROME_PLATFORMS=y +CONFIG_CROS_EC=y # CONFIG_CROS_EC_I2C is not set # CONFIG_CROS_EC_SPI is not set CONFIG_CROS_EC_PROTO=y +CONFIG_CROS_EC_CHARDEV=y +CONFIG_CROS_EC_LIGHTBAR=y +CONFIG_CROS_EC_VBC=y +CONFIG_CROS_EC_DEBUGFS=y +CONFIG_CROS_EC_SENSORHUB=y +CONFIG_CROS_EC_SYSFS=y # CONFIG_MELLANOX_PLATFORM is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y @@ -5948,6 +6006,7 @@ CONFIG_ARM_SMMU_V3=y # # NXP/Freescale QorIQ SoC drivers # +# CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # @@ -5955,13 +6014,6 @@ CONFIG_ARM_SMMU_V3=y # # end of i.MX SoC drivers -# -# IXP4xx SoC drivers -# -# CONFIG_IXP4XX_QMGR is not set -# CONFIG_IXP4XX_NPE is not set -# end of IXP4xx SoC drivers - # # Qualcomm SoC drivers # @@ -6039,7 +6091,6 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set -# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set # CONFIG_IIO_ST_ACCEL_3AXIS is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set @@ -6064,6 +6115,7 @@ CONFIG_AD_SIGMA_DELTA=m CONFIG_AD7124=m # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set +# CONFIG_AD7292 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set CONFIG_AD7606=m @@ -6262,9 +6314,12 @@ CONFIG_FXAS21002C_SPI=m # Inertial measurement units # # CONFIG_ADIS16400 is not set +# CONFIG_ADIS16460 is not set # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set +# CONFIG_FXOS8700_I2C is not set +# CONFIG_FXOS8700_SPI is not set # CONFIG_KMX61 is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set @@ -6275,6 +6330,7 @@ CONFIG_FXAS21002C_SPI=m # Light sensors # # CONFIG_ADJD_S311 is not set +# CONFIG_ADUX1020 is not set # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set @@ -6295,6 +6351,7 @@ CONFIG_FXAS21002C_SPI=m CONFIG_LV0104CS=m # CONFIG_MAX44000 is not set CONFIG_MAX44009=m +# CONFIG_NOA1305 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set CONFIG_SI1133=m @@ -6310,6 +6367,7 @@ CONFIG_SI1133=m # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set CONFIG_VCNL4035=m +# CONFIG_VEML6030 is not set # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set @@ -6356,6 +6414,7 @@ CONFIG_SENSORS_RM3100_SPI=m # CONFIG_AD5272=m # CONFIG_DS1803 is not set +# CONFIG_MAX5432 is not set # CONFIG_MAX5481 is not set # CONFIG_MAX5487 is not set CONFIG_MCP4018=m @@ -6418,6 +6477,7 @@ CONFIG_MB1232=m # # Temperature sensors # +# CONFIG_LTC2983 is not set # CONFIG_MAXIM_THERMOCOUPLE is not set # CONFIG_MLX90614 is not set CONFIG_MLX90632=m @@ -6479,6 +6539,8 @@ CONFIG_PHY_ROCKCHIP_DP=m CONFIG_PHY_ROCKCHIP_EMMC=y CONFIG_PHY_ROCKCHIP_INNO_HDMI=m CONFIG_PHY_ROCKCHIP_INNO_USB2=y +# CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set +CONFIG_PHY_ROCKCHIP_INNO_USB3=m CONFIG_PHY_ROCKCHIP_PCIE=m CONFIG_PHY_ROCKCHIP_TYPEC=m CONFIG_PHY_ROCKCHIP_USB=m @@ -6514,6 +6576,7 @@ CONFIG_RAS=y CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_ROCKCHIP_EFUSE=y +CONFIG_ROCKCHIP_OTP=y # # HW tracing support @@ -6596,6 +6659,7 @@ CONFIG_EXPORTFS_BLOCK_OPS=y CONFIG_FILE_LOCKING=y CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set +# CONFIG_FS_VERITY is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y @@ -6613,6 +6677,7 @@ CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=y CONFIG_CUSE=y +# CONFIG_VIRTIO_FS is not set CONFIG_OVERLAY_FS=y # CONFIG_OVERLAY_FS_REDIRECT_DIR is not set CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y @@ -6727,6 +6792,7 @@ CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" # CONFIG_PSTORE_RAM is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set +# CONFIG_EROFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y @@ -6755,7 +6821,6 @@ CONFIG_NFSD_BLOCKLAYOUT=y CONFIG_NFSD_SCSILAYOUT=y CONFIG_NFSD_FLEXFILELAYOUT=y CONFIG_NFSD_V4_SECURITY_LABEL=y -# CONFIG_NFSD_FAULT_INJECTION is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y @@ -6839,13 +6904,13 @@ CONFIG_NLS_ISO8859_1=y CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set +CONFIG_IO_WQ=y # end of File systems # # Security options # CONFIG_KEYS=y -CONFIG_KEYS_COMPAT=y # CONFIG_KEYS_REQUEST_CACHE is not set # CONFIG_PERSISTENT_KEYRINGS is not set # CONFIG_BIG_KEYS is not set @@ -6866,6 +6931,7 @@ CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_SECURITY_LOADPIN is not set # CONFIG_SECURITY_YAMA is not set # CONFIG_SECURITY_SAFESETID is not set +# CONFIG_SECURITY_LOCKDOWN_LSM is not set CONFIG_INTEGRITY=y # CONFIG_INTEGRITY_SIGNATURE is not set CONFIG_INTEGRITY_AUDIT=y @@ -6905,8 +6971,8 @@ CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_BLKCIPHER=y -CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y @@ -6939,6 +7005,7 @@ CONFIG_CRYPTO_DH=y CONFIG_CRYPTO_ECC=y CONFIG_CRYPTO_ECDH=y CONFIG_CRYPTO_ECRDSA=m +# CONFIG_CRYPTO_CURVE25519 is not set # # Authenticated Encryption with Associated Data @@ -6947,10 +7014,7 @@ CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_CHACHA20POLY1305=y CONFIG_CRYPTO_AEGIS128=m -CONFIG_CRYPTO_AEGIS128L=m -CONFIG_CRYPTO_AEGIS256=m -CONFIG_CRYPTO_MORUS640=m -# CONFIG_CRYPTO_MORUS1280 is not set +CONFIG_CRYPTO_AEGIS128_SIMD=y CONFIG_CRYPTO_SEQIV=y CONFIG_CRYPTO_ECHAINIV=y @@ -6969,6 +7033,7 @@ CONFIG_CRYPTO_XTS=m CONFIG_CRYPTO_KEYWRAP=y CONFIG_CRYPTO_NHPOLY1305=m CONFIG_CRYPTO_ADIANTUM=m +CONFIG_CRYPTO_ESSIV=m # # Hash modes @@ -6983,7 +7048,9 @@ CONFIG_CRYPTO_VMAC=y # CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y -# CONFIG_CRYPTO_XXHASH is not set +CONFIG_CRYPTO_XXHASH=y +CONFIG_CRYPTO_BLAKE2B=y +# CONFIG_CRYPTO_BLAKE2S is not set CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_POLY1305=y @@ -7009,7 +7076,6 @@ CONFIG_CRYPTO_WP512=y CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=y CONFIG_CRYPTO_ANUBIS=y -CONFIG_CRYPTO_LIB_ARC4=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_BLOWFISH=y CONFIG_CRYPTO_BLOWFISH_COMMON=y @@ -7056,6 +7122,22 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=m +# CONFIG_CRYPTO_LIB_BLAKE2S is not set +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA256=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set @@ -7064,8 +7146,13 @@ CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set CONFIG_CRYPTO_DEV_ROCKCHIP=m CONFIG_CRYPTO_DEV_VIRTIO=m +# CONFIG_CRYPTO_DEV_SAFEXCEL is not set CONFIG_CRYPTO_DEV_CCREE=m CONFIG_CRYPTO_DEV_HISI_SEC=m +# CONFIG_CRYPTO_DEV_HISI_SEC2 is not set +# CONFIG_CRYPTO_DEV_HISI_ZIP is not set +# CONFIG_CRYPTO_DEV_HISI_HPRE is not set +# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y @@ -7154,6 +7241,7 @@ CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=y CONFIG_TEXTSEARCH_BM=y CONFIG_TEXTSEARCH_FSM=y +CONFIG_INTERVAL_TREE=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y @@ -7168,9 +7256,8 @@ CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y -CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN=y -CONFIG_ARCH_HAS_DMA_MMAP_PGPROT=y CONFIG_SWIOTLB=y +CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_REMAP=y CONFIG_DMA_DIRECT_REMAP=y CONFIG_DMA_CMA=y @@ -7191,17 +7278,15 @@ CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y +CONFIG_LRU_CACHE=m CONFIG_CLZ_TAB=y # CONFIG_IRQ_POLL is not set CONFIG_MPILIB=y -CONFIG_DIMLIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_COMPAT_VDSO=y -CONFIG_CROSS_COMPILE_COMPAT_VDSO="" CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y @@ -7226,6 +7311,8 @@ CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_DYNAMIC_DEBUG is not set +CONFIG_SYMBOLIC_ERRNAME=y +CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options # @@ -7236,10 +7323,8 @@ CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set -# CONFIG_UNUSED_SYMBOLS is not set -CONFIG_DEBUG_FS=y # CONFIG_HEADERS_INSTALL is not set -# CONFIG_OPTIMIZE_INLINING is not set +CONFIG_OPTIMIZE_INLINING=y # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y @@ -7247,9 +7332,20 @@ CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options +# +# Generic Kernel Debugging Instruments +# CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_DEBUG_FS=y +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y +# CONFIG_UBSAN is not set +CONFIG_UBSAN_ALIGNMENT=y +# end of Generic Kernel Debugging Instruments + CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y @@ -7267,6 +7363,7 @@ CONFIG_DEBUG_MISC=y CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set @@ -7279,26 +7376,27 @@ CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_KASAN_STACK=1 # end of Memory Debugging -CONFIG_ARCH_HAS_KCOV=y -CONFIG_CC_HAS_SANCOV_TRACE_PC=y -# CONFIG_KCOV is not set # CONFIG_DEBUG_SHIRQ is not set # -# Debug Lockups and Hangs +# Debug Oops, Lockups and Hangs # -# CONFIG_SOFTLOCKUP_DETECTOR is not set -# CONFIG_DETECT_HUNG_TASK is not set -# CONFIG_WQ_WATCHDOG is not set -# end of Debug Lockups and Hangs - # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 +# CONFIG_SOFTLOCKUP_DETECTOR is not set +# CONFIG_DETECT_HUNG_TASK is not set +# CONFIG_WQ_WATCHDOG is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y # CONFIG_SCHEDSTATS is not set -# CONFIG_SCHED_STACK_END_CHECK is not set +# end of Scheduler Debugging + # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_DEBUG_PREEMPT=y @@ -7324,11 +7422,17 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_HAVE_DEBUG_BUGVERBOSE=y -CONFIG_DEBUG_BUGVERBOSE=y + +# +# Debug kernel data structures +# # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Debug kernel data structures + # CONFIG_DEBUG_CREDENTIALS is not set # @@ -7344,17 +7448,41 @@ CONFIG_RCU_CPU_STALL_TIMEOUT=21 # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -# CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set +# CONFIG_SAMPLES is not set +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +# CONFIG_STRICT_DEVMEM is not set + +# +# arm64 Debugging +# +# CONFIG_ARM64_PTDUMP_DEBUGFS is not set +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set +# CONFIG_DEBUG_WX is not set +# CONFIG_DEBUG_ALIGN_RODATA is not set +# CONFIG_ARM64_RELOC_TEST is not set +# CONFIG_CORESIGHT is not set +# end of arm64 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set @@ -7394,20 +7522,5 @@ CONFIG_TEST_VMALLOC=m CONFIG_TEST_STACKINIT=m # CONFIG_TEST_MEMINIT is not set CONFIG_MEMTEST=y -# CONFIG_BUG_ON_DATA_CORRUPTION is not set -# CONFIG_SAMPLES is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y -# CONFIG_UBSAN is not set -CONFIG_UBSAN_ALIGNMENT=y -CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y -# CONFIG_STRICT_DEVMEM is not set -# CONFIG_ARM64_PTDUMP_DEBUGFS is not set -# CONFIG_PID_IN_CONTEXTIDR is not set -# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set -# CONFIG_DEBUG_WX is not set -# CONFIG_DEBUG_ALIGN_RODATA is not set -# CONFIG_ARM64_RELOC_TEST is not set -# CONFIG_CORESIGHT is not set +# end of Kernel Testing and Coverage # end of Kernel hacking From 94f27962e1a2b843b71ffaf85032d1e5398a8aa2 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Wed, 5 Feb 2020 17:08:43 -0500 Subject: [PATCH 15/54] add more UARTs and SPIs to R40 --- ... => add-more-uart-pins-to-sun8i-r40.patch} | 24 +++ ...add-more-uarts-bpim2ultra-bpim2berry.patch | 84 ++++++++ .../add-spi0-spi1-to-sun8i-r40.patch | 70 +++++++ .../add-uart2-bpim2ultra-bpim2berry.patch | 34 ---- .../sunxi-dev/general-sunxi-overlays.patch | 188 +++++++++++++++++- 5 files changed, 364 insertions(+), 36 deletions(-) rename patch/kernel/sunxi-dev/{add-uart2_pi_pins-to-sun8i-r40.patch => add-more-uart-pins-to-sun8i-r40.patch} (51%) create mode 100644 patch/kernel/sunxi-dev/add-more-uarts-bpim2ultra-bpim2berry.patch create mode 100644 patch/kernel/sunxi-dev/add-spi0-spi1-to-sun8i-r40.patch delete mode 100644 patch/kernel/sunxi-dev/add-uart2-bpim2ultra-bpim2berry.patch diff --git a/patch/kernel/sunxi-dev/add-uart2_pi_pins-to-sun8i-r40.patch b/patch/kernel/sunxi-dev/add-more-uart-pins-to-sun8i-r40.patch similarity index 51% rename from patch/kernel/sunxi-dev/add-uart2_pi_pins-to-sun8i-r40.patch rename to patch/kernel/sunxi-dev/add-more-uart-pins-to-sun8i-r40.patch index 9aca99a7c7..f0e9abd162 100644 --- a/patch/kernel/sunxi-dev/add-uart2_pi_pins-to-sun8i-r40.patch +++ b/patch/kernel/sunxi-dev/add-more-uart-pins-to-sun8i-r40.patch @@ -14,3 +14,27 @@ index 421dfbb..ae64248 100644 uart3_pg_pins: uart3-pg-pins { pins = "PG6", "PG7"; function = "uart3"; +@@ -412,6 +463,23 @@ + pins = "PG8", "PG9"; + function = "uart3"; + }; ++ ++ uart4_ph_pins: uart4-ph-pins { ++ pins = "PH4", "PH5"; ++ function = "uart4"; ++ }; ++ ++ ++ uart5_ph_pins: uart5-ph-pins { ++ pins = "PH6", "PH7"; ++ function = "uart5"; ++ }; ++ ++ uart7_pi_pins: uart7-pi-pins { ++ pins = "PI20", "PI21"; ++ function = "uart7"; ++ }; ++ + }; + + wdt: watchdog@1c20c90 { diff --git a/patch/kernel/sunxi-dev/add-more-uarts-bpim2ultra-bpim2berry.patch b/patch/kernel/sunxi-dev/add-more-uarts-bpim2ultra-bpim2berry.patch new file mode 100644 index 0000000000..a8c17a8e0a --- /dev/null +++ b/patch/kernel/sunxi-dev/add-more-uarts-bpim2ultra-bpim2berry.patch @@ -0,0 +1,84 @@ +diff --git a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts +index 42d62d1..35bba4e 100644 +--- a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts ++++ b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts +@@ -305,6 +305,12 @@ + status = "okay"; + }; + ++&uart2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart2_pi_pins>; ++ status = "disabled"; ++}; ++ + &uart3 { + pinctrl-names = "default"; + pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>; +@@ -324,6 +330,24 @@ + }; + }; + ++&uart4 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart4_ph_pins>; ++ status = "disabled"; ++}; ++ ++&uart5 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart5_ph_pins>; ++ status = "disabled"; ++}; ++ ++&uart7 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart7_pi_pins>; ++ status = "disabled"; ++}; ++ + &usbphy { + usb1_vbus-supply = <®_vcc5v0>; + usb2_vbus-supply = <®_vcc5v0>; +diff --git a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts +index 15c22b0..967833c 100644 +--- a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts ++++ b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts +@@ -280,6 +280,12 @@ + status = "okay"; + }; + ++&uart2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart2_pi_pins>; ++ status = "disabled"; ++}; ++ + &uart3 { + pinctrl-names = "default"; + pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>; +@@ -299,6 +305,24 @@ + }; + }; + ++&uart4 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart4_ph_pins>; ++ status = "disabled"; ++}; ++ ++&uart5 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart5_ph_pins>; ++ status = "disabled"; ++}; ++ ++&uart7 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart7_pi_pins>; ++ status = "disabled"; ++}; ++ + &usbphy { + usb1_vbus-supply = <®_vcc5v0>; + status = "okay"; diff --git a/patch/kernel/sunxi-dev/add-spi0-spi1-to-sun8i-r40.patch b/patch/kernel/sunxi-dev/add-spi0-spi1-to-sun8i-r40.patch new file mode 100644 index 0000000000..12b46aa3fe --- /dev/null +++ b/patch/kernel/sunxi-dev/add-spi0-spi1-to-sun8i-r40.patch @@ -0,0 +1,70 @@ +diff --git a/arch/arm/boot/dts/sun8i-r40.dtsi b/arch/arm/boot/dts/sun8i-r40.dtsi +index 421dfbb..979c12a 100644 +--- a/arch/arm/boot/dts/sun8i-r40.dtsi ++++ b/arch/arm/boot/dts/sun8i-r40.dtsi +@@ -398,6 +415,26 @@ + bias-pull-up; + }; + ++ spi0_pins: spi0-pins { ++ pins = "PC0", "PC1", "PC2"; ++ function = "spi0"; ++ }; ++ ++ spi0_cs_pin: spi0-cs-pin { ++ pins = "PC23"; ++ function = "spi0"; ++ }; ++ ++ spi1_pins: spi1-pins { ++ pins = "PI17", "PI18", "PI19", "PI16"; ++ function = "spi1"; ++ }; ++ ++ spi1_cs_pin: spi1-cs-pin { ++ pins = "PI16"; ++ function = "spi1"; ++ }; ++ + uart0_pb_pins: uart0-pb-pins { + pins = "PB22", "PB23"; + function = "uart0"; +@@ -414,6 +446,38 @@ + }; + }; + ++ spi0: spi@1c05000 { ++ compatible = "allwinner,sun8i-r40-spi", "allwinner,sun8i-h3-spi"; ++ reg = <0x01c05000 0x1000>; ++ interrupts = ; ++ clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>; ++ clock-names = "ahb", "mod"; ++// dmas = <&dma 23>, <&dma 23>; ++// dma-names = "rx", "tx"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins>, <&spi0_cs_pin>; ++ resets = <&ccu RST_BUS_SPI0>; ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ spi1: spi@1c06000 { ++ compatible = "allwinner,sun8i-r40-spi", "allwinner,sun8i-h3-spi"; ++ reg = <0x01c06000 0x1000>; ++ interrupts = ; ++ clocks = <&ccu CLK_BUS_SPI1>, <&ccu CLK_SPI1>; ++ clock-names = "ahb", "mod"; ++// dmas = <&dma 24>, <&dma 24>; ++// dma-names = "rx", "tx"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi1_pins>, <&spi1_cs_pin>; ++ resets = <&ccu RST_BUS_SPI1>; ++ status = "disabled"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ + wdt: watchdog@1c20c90 { + compatible = "allwinner,sun4i-a10-wdt"; + reg = <0x01c20c90 0x10>; diff --git a/patch/kernel/sunxi-dev/add-uart2-bpim2ultra-bpim2berry.patch b/patch/kernel/sunxi-dev/add-uart2-bpim2ultra-bpim2berry.patch deleted file mode 100644 index a542185502..0000000000 --- a/patch/kernel/sunxi-dev/add-uart2-bpim2ultra-bpim2berry.patch +++ /dev/null @@ -1,34 +0,0 @@ -diff --git a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts -index 42d62d1..4a8362e 100644 ---- a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts -+++ b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts -@@ -305,6 +305,12 @@ - status = "okay"; - }; - -+&uart2 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart2_pi_pins>; -+ status = "okay"; -+}; -+ - &uart3 { - pinctrl-names = "default"; - pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>; -diff --git a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts -index 15c22b0..5c0b7ba 100644 ---- a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts -+++ b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts -@@ -280,6 +280,12 @@ - status = "okay"; - }; - -+&uart2 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart2_pi_pins>; -+ status = "okay"; -+}; -+ - &uart3 { - pinctrl-names = "default"; - pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>; diff --git a/patch/kernel/sunxi-dev/general-sunxi-overlays.patch b/patch/kernel/sunxi-dev/general-sunxi-overlays.patch index 5d00263c03..39a387d921 100644 --- a/patch/kernel/sunxi-dev/general-sunxi-overlays.patch +++ b/patch/kernel/sunxi-dev/general-sunxi-overlays.patch @@ -13,7 +13,7 @@ new file mode 100644 index 0000000..39d6a27 --- /dev/null +++ b/arch/arm/boot/dts/overlay/Makefile -@@ -0,0 +1,89 @@ +@@ -0,0 +1,95 @@ +# SPDX-License-Identifier: GPL-2.0 +dtbo-$(CONFIG_MACH_SUN4I) += \ + sun4i-a10-analog-codec.dtbo \ @@ -92,7 +92,13 @@ index 0000000..39d6a27 + sun8i-h3-usbhost1.dtbo \ + sun8i-h3-usbhost2.dtbo \ + sun8i-h3-usbhost3.dtbo \ -+ sun8i-h3-w1-gpio.dtbo ++ sun8i-h3-w1-gpio.dtbo \ ++ sun8i-r40-spi-spidev0.dtbo \ ++ sun8i-r40-spi-spidev1.dtbo \ ++ sun8i-r40-uart2.dtbo \ ++ sun8i-r40-uart4.dtbo \ ++ sun8i-r40-uart5.dtbo \ ++ sun8i-r40-uart7.dtbo + +scr-$(CONFIG_MACH_SUN4I) += sun4i-a10-fixup.scr +scr-$(CONFIG_MACH_SUN5I) += sun5i-a13-fixup.scr @@ -4520,6 +4526,184 @@ index 0000000..f4ccb7f + }; + }; +}; +diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-spi-spidev0.dts b/arch/arm/boot/dts/overlay/sun8i-r40-spi-spidev0.dts +new file mode 100644 +index 0000000..734a9a8 +--- /dev/null ++++ b/arch/arm/boot/dts/overlay/sun8i-r40-spi-spidev0.dts +@@ -0,0 +1,27 @@ ++/dts-v1/; ++/ { ++ compatible = "allwinner,sun8i-r40"; ++ fragment@0 { ++ target-path = "/aliases"; ++ __overlay__ { ++ spi0 = "/soc/spi@1c05000"; ++ }; ++ }; ++ fragment@1 { ++ target = <0xffffffff>; ++ __overlay__ { ++ #address-cells = <0x00000001>; ++ #size-cells = <0x00000000>; ++ status = "okay"; ++ spidev@0 { ++ compatible = "spidev"; ++ status = "okay"; ++ reg = <0x00000000>; ++ spi-max-frequency = <0x000f4240>; ++ }; ++ }; ++ }; ++ __fixups__ { ++ spi0 = "/fragment@1:target:0"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-spi-spidev1.dts b/arch/arm/boot/dts/overlay/sun8i-r40-spi-spidev1.dts +new file mode 100644 +index 0000000..d1d637c +--- /dev/null ++++ b/arch/arm/boot/dts/overlay/sun8i-r40-spi-spidev1.dts +@@ -0,0 +1,27 @@ ++/dts-v1/; ++/ { ++ compatible = "allwinner,sun8i-r40"; ++ fragment@0 { ++ target-path = "/aliases"; ++ __overlay__ { ++ spi1 = "/soc/spi@1c06000"; ++ }; ++ }; ++ fragment@1 { ++ target = <0xffffffff>; ++ __overlay__ { ++ #address-cells = <0x00000001>; ++ #size-cells = <0x00000000>; ++ status = "okay"; ++ spidev@0 { ++ compatible = "spidev"; ++ status = "okay"; ++ reg = <0x00000000>; ++ spi-max-frequency = <0x000f4240>; ++ }; ++ }; ++ }; ++ __fixups__ { ++ spi1 = "/fragment@1:target:0"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-uart2.dts b/arch/arm/boot/dts/overlay/sun8i-r40-uart2.dts +new file mode 100644 +index 0000000..65e946d +--- /dev/null ++++ b/arch/arm/boot/dts/overlay/sun8i-r40-uart2.dts +@@ -0,0 +1,22 @@ ++/dts-v1/; ++/ { ++ compatible = "allwinner,sun8i-r40"; ++ fragment@0 { ++ target-path = "/aliases"; ++ __overlay__ { ++ serial2 = "/soc/serial@1c28800"; ++ }; ++ }; ++ fragment@1 { ++ target = <0xffffffff>; ++ __overlay__ { ++ pinctrl-names = "default"; ++ pinctrl-0 = <0xffffffff>; ++ status = "okay"; ++ }; ++ }; ++ __fixups__ { ++ uart2 = "/fragment@1:target:0"; ++ uart2_pi_pins = "/fragment@1/__overlay__:pinctrl-0:0"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-uart4.dts b/arch/arm/boot/dts/overlay/sun8i-r40-uart4.dts +new file mode 100644 +index 0000000..65e946d +--- /dev/null ++++ b/arch/arm/boot/dts/overlay/sun8i-r40-uart4.dts +@@ -0,0 +1,22 @@ ++/dts-v1/; ++/ { ++ compatible = "allwinner,sun8i-r40"; ++ fragment@0 { ++ target-path = "/aliases"; ++ __overlay__ { ++ serial4 = "/soc/serial@1c29000"; ++ }; ++ }; ++ fragment@1 { ++ target = <0xffffffff>; ++ __overlay__ { ++ pinctrl-names = "default"; ++ pinctrl-0 = <0xffffffff>; ++ status = "okay"; ++ }; ++ }; ++ __fixups__ { ++ uart4 = "/fragment@1:target:0"; ++ uart4_ph_pins = "/fragment@1/__overlay__:pinctrl-0:0"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-uart5.dts b/arch/arm/boot/dts/overlay/sun8i-r40-uart5.dts +new file mode 100644 +index 0000000..65e946d +--- /dev/null ++++ b/arch/arm/boot/dts/overlay/sun8i-r40-uart5.dts +@@ -0,0 +1,22 @@ ++/dts-v1/; ++/ { ++ compatible = "allwinner,sun8i-r40"; ++ fragment@0 { ++ target-path = "/aliases"; ++ __overlay__ { ++ serial5 = "/soc/serial@1c29400"; ++ }; ++ }; ++ fragment@1 { ++ target = <0xffffffff>; ++ __overlay__ { ++ pinctrl-names = "default"; ++ pinctrl-0 = <0xffffffff>; ++ status = "okay"; ++ }; ++ }; ++ __fixups__ { ++ uart5 = "/fragment@1:target:0"; ++ uart5_ph_pins = "/fragment@1/__overlay__:pinctrl-0:0"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-uart7.dts b/arch/arm/boot/dts/overlay/sun8i-r40-uart7.dts +new file mode 100644 +index 0000000..65e946d +--- /dev/null ++++ b/arch/arm/boot/dts/overlay/sun8i-r40-uart7.dts +@@ -0,0 +1,22 @@ ++/dts-v1/; ++/ { ++ compatible = "allwinner,sun8i-r40"; ++ fragment@0 { ++ target-path = "/aliases"; ++ __overlay__ { ++ serial7 = "/soc/serial@1c29c00"; ++ }; ++ }; ++ fragment@1 { ++ target = <0xffffffff>; ++ __overlay__ { ++ pinctrl-names = "default"; ++ pinctrl-0 = <0xffffffff>; ++ status = "okay"; ++ }; ++ }; ++ __fixups__ { ++ uart7 = "/fragment@1:target:0"; ++ uart7_pi_pins = "/fragment@1/__overlay__:pinctrl-0:0"; ++ }; ++}; diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile index fa35163..89df4ff 100644 --- a/arch/arm64/boot/dts/allwinner/Makefile From d7de341d5cc9687a46ab3ffa1a08e0c0a488ef6d Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Wed, 5 Feb 2020 17:14:42 -0500 Subject: [PATCH 16/54] don't overwrite OVERLAY_PREFIX if already defined --- config/sources/families/sun8i.conf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/sources/families/sun8i.conf b/config/sources/families/sun8i.conf index a06e305861..992489746e 100644 --- a/config/sources/families/sun8i.conf +++ b/config/sources/families/sun8i.conf @@ -1,5 +1,8 @@ source "${BASH_SOURCE%/*}/include/sunxi_common.inc" -OVERLAY_PREFIX='sun8i-h3' + +if [[ -z ${OVERLAY_PREFIX} ]]; then + OVERLAY_PREFIX='sun8i-h3' +fi [[ -z $CPUMIN ]] && CPUMIN=480000 [[ -z $CPUMAX ]] && CPUMAX=1400000 From a5a61f54b8605401564a0eb913c750e07dca5767 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Wed, 5 Feb 2020 17:15:35 -0500 Subject: [PATCH 17/54] change OVERLAY_PREFIX for R40 --- config/boards/bananapim2ultra.csc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/boards/bananapim2ultra.csc b/config/boards/bananapim2ultra.csc index 15457c991a..b631f60fa2 100644 --- a/config/boards/bananapim2ultra.csc +++ b/config/boards/bananapim2ultra.csc @@ -2,5 +2,5 @@ BOARD_NAME="Banana Pi M2U" BOARDFAMILY="sun8i" BOOTCONFIG="Bananapi_M2_Ultra_defconfig" -OVERLAY_PREFIX="" +OVERLAY_PREFIX="sun8i-r40" KERNEL_TARGET="current,dev" From eaf3dab9dc18731fc0dfa8ad7177173d9aba0632 Mon Sep 17 00:00:00 2001 From: 5kft <5kft@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:16:04 -0800 Subject: [PATCH 18/54] [ sunxi-current ] add upstream patches --- config/kernel/linux-sunxi-current.config | 2 +- config/kernel/linux-sunxi64-current.config | 2 +- .../patch-5.4.16-17-modified.patch | 4040 +++++++++++++++++ .../sunxi-current/patch-5.4.17-18.patch | 3992 ++++++++++++++++ 4 files changed, 8034 insertions(+), 2 deletions(-) create mode 100644 patch/kernel/sunxi-current/patch-5.4.16-17-modified.patch create mode 100644 patch/kernel/sunxi-current/patch-5.4.17-18.patch diff --git a/config/kernel/linux-sunxi-current.config b/config/kernel/linux-sunxi-current.config index ff43f8dd37..027c349fda 100644 --- a/config/kernel/linux-sunxi-current.config +++ b/config/kernel/linux-sunxi-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.4.16 Kernel Configuration +# Linux/arm 5.4.18 Kernel Configuration # # diff --git a/config/kernel/linux-sunxi64-current.config b/config/kernel/linux-sunxi64-current.config index 485d1d1eae..032427b257 100644 --- a/config/kernel/linux-sunxi64-current.config +++ b/config/kernel/linux-sunxi64-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.4.16 Kernel Configuration +# Linux/arm64 5.4.18 Kernel Configuration # # diff --git a/patch/kernel/sunxi-current/patch-5.4.16-17-modified.patch b/patch/kernel/sunxi-current/patch-5.4.16-17-modified.patch new file mode 100644 index 0000000000..b35a9137b6 --- /dev/null +++ b/patch/kernel/sunxi-current/patch-5.4.16-17-modified.patch @@ -0,0 +1,4040 @@ +diff --git a/Makefile b/Makefile +index e16d2e58ed4b..a363a539a092 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 16 ++SUBLEVEL = 17 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/arc/plat-eznps/Kconfig b/arch/arc/plat-eznps/Kconfig +index a376a50d3fea..a931d0a256d0 100644 +--- a/arch/arc/plat-eznps/Kconfig ++++ b/arch/arc/plat-eznps/Kconfig +@@ -7,7 +7,7 @@ + menuconfig ARC_PLAT_EZNPS + bool "\"EZchip\" ARC dev platform" + select CPU_BIG_ENDIAN +- select CLKSRC_NPS ++ select CLKSRC_NPS if !PHYS_ADDR_T_64BIT + select EZNPS_GIC + select EZCHIP_NPS_MANAGEMENT_ENET if ETHERNET + help +diff --git a/arch/arm/configs/aspeed_g5_defconfig b/arch/arm/configs/aspeed_g5_defconfig +index 597536cc9573..b87508c7056c 100644 +--- a/arch/arm/configs/aspeed_g5_defconfig ++++ b/arch/arm/configs/aspeed_g5_defconfig +@@ -139,6 +139,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=6 + CONFIG_SERIAL_8250_EXTENDED=y + CONFIG_SERIAL_8250_ASPEED_VUART=y + CONFIG_SERIAL_8250_SHARE_IRQ=y ++CONFIG_SERIAL_8250_DW=y + CONFIG_SERIAL_OF_PLATFORM=y + CONFIG_ASPEED_KCS_IPMI_BMC=y + CONFIG_ASPEED_BT_IPMI_BMC=y +diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c +index 43487f035385..7a7e425616b5 100644 +--- a/arch/arm64/kvm/debug.c ++++ b/arch/arm64/kvm/debug.c +@@ -101,7 +101,7 @@ void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu) + void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) + { + bool trap_debug = !(vcpu->arch.flags & KVM_ARM64_DEBUG_DIRTY); +- unsigned long mdscr; ++ unsigned long mdscr, orig_mdcr_el2 = vcpu->arch.mdcr_el2; + + trace_kvm_arm_setup_debug(vcpu, vcpu->guest_debug); + +@@ -197,6 +197,10 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) + if (vcpu_read_sys_reg(vcpu, MDSCR_EL1) & (DBG_MDSCR_KDE | DBG_MDSCR_MDE)) + vcpu->arch.flags |= KVM_ARM64_DEBUG_DIRTY; + ++ /* Write mdcr_el2 changes since vcpu_load on VHE systems */ ++ if (has_vhe() && orig_mdcr_el2 != vcpu->arch.mdcr_el2) ++ write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2); ++ + trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2); + trace_kvm_arm_set_dreg32("MDSCR_EL1", vcpu_read_sys_reg(vcpu, MDSCR_EL1)); + } +diff --git a/arch/um/include/asm/common.lds.S b/arch/um/include/asm/common.lds.S +index d7086b985f27..4049f2c46387 100644 +--- a/arch/um/include/asm/common.lds.S ++++ b/arch/um/include/asm/common.lds.S +@@ -83,8 +83,8 @@ + __preinit_array_end = .; + } + .init_array : { +- /* dummy - we call this ourselves */ + __init_array_start = .; ++ *(.init_array) + __init_array_end = .; + } + .fini_array : { +diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S +index c69d69ee96be..f5001481010c 100644 +--- a/arch/um/kernel/dyn.lds.S ++++ b/arch/um/kernel/dyn.lds.S +@@ -103,6 +103,7 @@ SECTIONS + be empty, which isn't pretty. */ + . = ALIGN(32 / 8); + .preinit_array : { *(.preinit_array) } ++ .init_array : { *(.init_array) } + .fini_array : { *(.fini_array) } + .data : { + INIT_TASK_DATA(KERNEL_STACK_SIZE) +diff --git a/crypto/af_alg.c b/crypto/af_alg.c +index 0dceaabc6321..3d8e53010cda 100644 +--- a/crypto/af_alg.c ++++ b/crypto/af_alg.c +@@ -134,11 +134,13 @@ void af_alg_release_parent(struct sock *sk) + sk = ask->parent; + ask = alg_sk(sk); + +- lock_sock(sk); ++ local_bh_disable(); ++ bh_lock_sock(sk); + ask->nokey_refcnt -= nokey; + if (!last) + last = !--ask->refcnt; +- release_sock(sk); ++ bh_unlock_sock(sk); ++ local_bh_enable(); + + if (last) + sock_put(sk); +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index 543792e0ebf0..81bbea7f2ba6 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -362,11 +362,12 @@ err: + + static void __exit pcrypt_exit(void) + { ++ crypto_unregister_template(&pcrypt_tmpl); ++ + pcrypt_fini_padata(pencrypt); + pcrypt_fini_padata(pdecrypt); + + kset_unregister(pcrypt_kset); +- crypto_unregister_template(&pcrypt_tmpl); + } + + subsys_initcall(pcrypt_init); +diff --git a/drivers/android/binder.c b/drivers/android/binder.c +index 976a69420c16..254f87b627fe 100644 +--- a/drivers/android/binder.c ++++ b/drivers/android/binder.c +@@ -5203,10 +5203,11 @@ err_bad_arg: + + static int binder_open(struct inode *nodp, struct file *filp) + { +- struct binder_proc *proc; ++ struct binder_proc *proc, *itr; + struct binder_device *binder_dev; + struct binderfs_info *info; + struct dentry *binder_binderfs_dir_entry_proc = NULL; ++ bool existing_pid = false; + + binder_debug(BINDER_DEBUG_OPEN_CLOSE, "%s: %d:%d\n", __func__, + current->group_leader->pid, current->pid); +@@ -5239,19 +5240,24 @@ static int binder_open(struct inode *nodp, struct file *filp) + filp->private_data = proc; + + mutex_lock(&binder_procs_lock); ++ hlist_for_each_entry(itr, &binder_procs, proc_node) { ++ if (itr->pid == proc->pid) { ++ existing_pid = true; ++ break; ++ } ++ } + hlist_add_head(&proc->proc_node, &binder_procs); + mutex_unlock(&binder_procs_lock); + +- if (binder_debugfs_dir_entry_proc) { ++ if (binder_debugfs_dir_entry_proc && !existing_pid) { + char strbuf[11]; + + snprintf(strbuf, sizeof(strbuf), "%u", proc->pid); + /* +- * proc debug entries are shared between contexts, so +- * this will fail if the process tries to open the driver +- * again with a different context. The priting code will +- * anyway print all contexts that a given PID has, so this +- * is not a problem. ++ * proc debug entries are shared between contexts. ++ * Only create for the first PID to avoid debugfs log spamming ++ * The printing code will anyway print all contexts for a given ++ * PID so this is not a problem. + */ + proc->debugfs_entry = debugfs_create_file(strbuf, 0444, + binder_debugfs_dir_entry_proc, +@@ -5259,19 +5265,16 @@ static int binder_open(struct inode *nodp, struct file *filp) + &proc_fops); + } + +- if (binder_binderfs_dir_entry_proc) { ++ if (binder_binderfs_dir_entry_proc && !existing_pid) { + char strbuf[11]; + struct dentry *binderfs_entry; + + snprintf(strbuf, sizeof(strbuf), "%u", proc->pid); + /* + * Similar to debugfs, the process specific log file is shared +- * between contexts. If the file has already been created for a +- * process, the following binderfs_create_file() call will +- * fail with error code EEXIST if another context of the same +- * process invoked binder_open(). This is ok since same as +- * debugfs, the log file will contain information on all +- * contexts of a given PID. ++ * between contexts. Only create for the first PID. ++ * This is ok since same as debugfs, the log file will contain ++ * information on all contexts of a given PID. + */ + binderfs_entry = binderfs_create_file(binder_binderfs_dir_entry_proc, + strbuf, &proc_fops, (void *)(unsigned long)proc->pid); +@@ -5281,10 +5284,8 @@ static int binder_open(struct inode *nodp, struct file *filp) + int error; + + error = PTR_ERR(binderfs_entry); +- if (error != -EEXIST) { +- pr_warn("Unable to create file %s in binderfs (error %d)\n", +- strbuf, error); +- } ++ pr_warn("Unable to create file %s in binderfs (error %d)\n", ++ strbuf, error); + } + } + +diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c +index b23d1e4bad33..9d0d65efcd94 100644 +--- a/drivers/atm/eni.c ++++ b/drivers/atm/eni.c +@@ -374,7 +374,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + here = (eni_vcc->descr+skip) & (eni_vcc->words-1); + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci + << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1); + if (!eff) size += skip; +@@ -447,7 +447,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + if (size != eff) { + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | + (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + if (!j || j > 2*RX_DMA_BUF) { + printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n"); +diff --git a/drivers/base/component.c b/drivers/base/component.c +index 532a3a5d8f63..1fdbd6ff2058 100644 +--- a/drivers/base/component.c ++++ b/drivers/base/component.c +@@ -102,11 +102,11 @@ static int component_devices_show(struct seq_file *s, void *data) + seq_printf(s, "%-40s %20s\n", "device name", "status"); + seq_puts(s, "-------------------------------------------------------------\n"); + for (i = 0; i < match->num; i++) { +- struct device *d = (struct device *)match->compare[i].data; ++ struct component *component = match->compare[i].component; + +- seq_printf(s, "%-40s %20s\n", dev_name(d), +- match->compare[i].component ? +- "registered" : "not registered"); ++ seq_printf(s, "%-40s %20s\n", ++ component ? dev_name(component->dev) : "(unknown)", ++ component ? (component->bound ? "bound" : "not bound") : "not registered"); + } + mutex_unlock(&component_mutex); + +diff --git a/drivers/base/test/test_async_driver_probe.c b/drivers/base/test/test_async_driver_probe.c +index f4b1d8e54daf..3bb7beb127a9 100644 +--- a/drivers/base/test/test_async_driver_probe.c ++++ b/drivers/base/test/test_async_driver_probe.c +@@ -44,7 +44,8 @@ static int test_probe(struct platform_device *pdev) + * performing an async init on that node. + */ + if (dev->driver->probe_type == PROBE_PREFER_ASYNCHRONOUS) { +- if (dev_to_node(dev) != numa_node_id()) { ++ if (IS_ENABLED(CONFIG_NUMA) && ++ dev_to_node(dev) != numa_node_id()) { + dev_warn(dev, "NUMA node mismatch %d != %d\n", + dev_to_node(dev), numa_node_id()); + atomic_inc(&warnings); +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 04cf767d0708..4e7ef35f1c8f 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -2585,7 +2585,7 @@ static void btusb_mtk_wmt_recv(struct urb *urb) + * and being processed the events from there then. + */ + if (test_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags)) { +- data->evt_skb = skb_clone(skb, GFP_KERNEL); ++ data->evt_skb = skb_clone(skb, GFP_ATOMIC); + if (!data->evt_skb) + goto err_out; + } +diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c +index abbf281ee337..d9846265a5cd 100644 +--- a/drivers/bus/ti-sysc.c ++++ b/drivers/bus/ti-sysc.c +@@ -923,6 +923,9 @@ set_midle: + return -EINVAL; + } + ++ if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_MSTANDBY) ++ best_mode = SYSC_IDLE_NO; ++ + reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift); + reg |= best_mode << regbits->midle_shift; + sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); +@@ -984,6 +987,10 @@ static int sysc_disable_module(struct device *dev) + return ret; + } + ++ if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_MSTANDBY) || ++ ddata->cfg.quirks & (SYSC_QUIRK_FORCE_MSTANDBY)) ++ best_mode = SYSC_IDLE_FORCE; ++ + reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift); + reg |= best_mode << regbits->midle_shift; + sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); +@@ -1242,6 +1249,8 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { + SYSC_QUIRK_SWSUP_SIDLE), + + /* Quirks that need to be set based on detected module */ ++ SYSC_QUIRK("aess", 0, 0, 0x10, -1, 0x40000000, 0xffffffff, ++ SYSC_MODULE_QUIRK_AESS), + SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff, + SYSC_MODULE_QUIRK_HDQ1W), + SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff, +@@ -1257,6 +1266,10 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { + SYSC_QUIRK("gpu", 0x50000000, 0x14, -1, -1, 0x00010201, 0xffffffff, 0), + SYSC_QUIRK("gpu", 0x50000000, 0xfe00, 0xfe10, -1, 0x40000000 , 0xffffffff, + SYSC_MODULE_QUIRK_SGX), ++ 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_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), + SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0, + SYSC_MODULE_QUIRK_WDT), + /* Watchdog on am3 and am4 */ +@@ -1266,7 +1279,6 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { + #ifdef DEBUG + SYSC_QUIRK("adc", 0, 0, 0x10, -1, 0x47300001, 0xffffffff, 0), + SYSC_QUIRK("atl", 0, 0, -1, -1, 0x0a070100, 0xffffffff, 0), +- SYSC_QUIRK("aess", 0, 0, 0x10, -1, 0x40000000, 0xffffffff, 0), + SYSC_QUIRK("cm", 0, 0, -1, -1, 0x40000301, 0xffffffff, 0), + SYSC_QUIRK("control", 0, 0, 0x10, -1, 0x40000900, 0xffffffff, 0), + SYSC_QUIRK("cpgmac", 0, 0x1200, 0x1208, 0x1204, 0x4edb1902, +@@ -1315,8 +1327,6 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { + 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("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000050, +- 0xffffffff, 0), + SYSC_QUIRK("vfpe", 0, 0, 0x104, -1, 0x4d001200, 0xffffffff, 0), + #endif + }; +@@ -1400,6 +1410,14 @@ static void sysc_clk_enable_quirk_hdq1w(struct sysc *ddata) + sysc_write(ddata, offset, val); + } + ++/* AESS (Audio Engine SubSystem) needs autogating set after enable */ ++static void sysc_module_enable_quirk_aess(struct sysc *ddata) ++{ ++ int offset = 0x7c; /* AESS_AUTO_GATING_ENABLE */ ++ ++ sysc_write(ddata, offset, 1); ++} ++ + /* I2C needs extra enable bit toggling for reset */ + static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable) + { +@@ -1482,6 +1500,9 @@ static void sysc_init_module_quirks(struct sysc *ddata) + return; + } + ++ if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_AESS) ++ ddata->module_enable_quirk = sysc_module_enable_quirk_aess; ++ + if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_SGX) + ddata->module_enable_quirk = sysc_module_enable_quirk_sgx; + +diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c +index db22777d59b4..62930351ccd9 100644 +--- a/drivers/crypto/caam/ctrl.c ++++ b/drivers/crypto/caam/ctrl.c +@@ -685,11 +685,9 @@ static int caam_probe(struct platform_device *pdev) + of_node_put(np); + + if (!ctrlpriv->mc_en) +- clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK | MCFGR_LONG_PTR, ++ clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK, + MCFGR_AWCACHE_CACH | MCFGR_AWCACHE_BUFF | +- MCFGR_WDENABLE | MCFGR_LARGE_BURST | +- (sizeof(dma_addr_t) == sizeof(u64) ? +- MCFGR_LONG_PTR : 0)); ++ MCFGR_WDENABLE | MCFGR_LARGE_BURST); + + handle_imx6_err005766(&ctrl->mcr); + +diff --git a/drivers/crypto/chelsio/chcr_algo.c b/drivers/crypto/chelsio/chcr_algo.c +index 38ee38b37ae6..01dd418bdadc 100644 +--- a/drivers/crypto/chelsio/chcr_algo.c ++++ b/drivers/crypto/chelsio/chcr_algo.c +@@ -3194,9 +3194,6 @@ static int chcr_gcm_setauthsize(struct crypto_aead *tfm, unsigned int authsize) + aeadctx->mayverify = VERIFY_SW; + break; + default: +- +- crypto_tfm_set_flags((struct crypto_tfm *) tfm, +- CRYPTO_TFM_RES_BAD_KEY_LEN); + return -EINVAL; + } + return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); +@@ -3221,8 +3218,6 @@ static int chcr_4106_4309_setauthsize(struct crypto_aead *tfm, + aeadctx->mayverify = VERIFY_HW; + break; + default: +- crypto_tfm_set_flags((struct crypto_tfm *)tfm, +- CRYPTO_TFM_RES_BAD_KEY_LEN); + return -EINVAL; + } + return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); +@@ -3263,8 +3258,6 @@ static int chcr_ccm_setauthsize(struct crypto_aead *tfm, + aeadctx->mayverify = VERIFY_HW; + break; + default: +- crypto_tfm_set_flags((struct crypto_tfm *)tfm, +- CRYPTO_TFM_RES_BAD_KEY_LEN); + return -EINVAL; + } + return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); +@@ -3289,8 +3282,7 @@ static int chcr_ccm_common_setkey(struct crypto_aead *aead, + ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; + mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256; + } else { +- crypto_tfm_set_flags((struct crypto_tfm *)aead, +- CRYPTO_TFM_RES_BAD_KEY_LEN); ++ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); + aeadctx->enckey_len = 0; + return -EINVAL; + } +@@ -3328,8 +3320,7 @@ static int chcr_aead_rfc4309_setkey(struct crypto_aead *aead, const u8 *key, + int error; + + if (keylen < 3) { +- crypto_tfm_set_flags((struct crypto_tfm *)aead, +- CRYPTO_TFM_RES_BAD_KEY_LEN); ++ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); + aeadctx->enckey_len = 0; + return -EINVAL; + } +@@ -3379,8 +3370,7 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key, + } else if (keylen == AES_KEYSIZE_256) { + ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; + } else { +- crypto_tfm_set_flags((struct crypto_tfm *)aead, +- CRYPTO_TFM_RES_BAD_KEY_LEN); ++ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); + pr_err("GCM: Invalid key length %d\n", keylen); + ret = -EINVAL; + goto out; +diff --git a/drivers/crypto/vmx/aes_xts.c b/drivers/crypto/vmx/aes_xts.c +index d59e736882f6..9fee1b1532a4 100644 +--- a/drivers/crypto/vmx/aes_xts.c ++++ b/drivers/crypto/vmx/aes_xts.c +@@ -84,6 +84,9 @@ static int p8_aes_xts_crypt(struct skcipher_request *req, int enc) + u8 tweak[AES_BLOCK_SIZE]; + int ret; + ++ if (req->cryptlen < AES_BLOCK_SIZE) ++ return -EINVAL; ++ + if (!crypto_simd_usable() || (req->cryptlen % XTS_BLOCK_SIZE) != 0) { + struct skcipher_request *subreq = skcipher_request_ctx(req); + +diff --git a/drivers/extcon/extcon-intel-cht-wc.c b/drivers/extcon/extcon-intel-cht-wc.c +index 9d32150e68db..771f6f4cf92e 100644 +--- a/drivers/extcon/extcon-intel-cht-wc.c ++++ b/drivers/extcon/extcon-intel-cht-wc.c +@@ -338,6 +338,7 @@ static int cht_wc_extcon_probe(struct platform_device *pdev) + struct intel_soc_pmic *pmic = dev_get_drvdata(pdev->dev.parent); + struct cht_wc_extcon_data *ext; + unsigned long mask = ~(CHT_WC_PWRSRC_VBUS | CHT_WC_PWRSRC_USBID_MASK); ++ int pwrsrc_sts, id; + int irq, ret; + + irq = platform_get_irq(pdev, 0); +@@ -387,8 +388,19 @@ static int cht_wc_extcon_probe(struct platform_device *pdev) + goto disable_sw_control; + } + +- /* Route D+ and D- to PMIC for initial charger detection */ +- cht_wc_extcon_set_phymux(ext, MUX_SEL_PMIC); ++ ret = regmap_read(ext->regmap, CHT_WC_PWRSRC_STS, &pwrsrc_sts); ++ if (ret) { ++ dev_err(ext->dev, "Error reading pwrsrc status: %d\n", ret); ++ goto disable_sw_control; ++ } ++ ++ /* ++ * If no USB host or device connected, route D+ and D- to PMIC for ++ * initial charger detection ++ */ ++ id = cht_wc_extcon_get_id(ext, pwrsrc_sts); ++ if (id != INTEL_USB_ID_GND) ++ cht_wc_extcon_set_phymux(ext, MUX_SEL_PMIC); + + /* Get initial state */ + cht_wc_extcon_pwrsrc_event(ext); +diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig +index ceb908f7dbe5..f9263426af03 100644 +--- a/drivers/gpio/Kconfig ++++ b/drivers/gpio/Kconfig +@@ -1120,6 +1120,7 @@ config GPIO_MADERA + config GPIO_MAX77620 + tristate "GPIO support for PMIC MAX77620 and MAX20024" + depends on MFD_MAX77620 ++ select GPIOLIB_IRQCHIP + help + GPIO driver for MAX77620 and MAX20024 PMIC from Maxim Semiconductor. + MAX77620 PMIC has 8 pins that can be configured as GPIOs. The +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +index 33a1099e2f33..bb9a2771a0f9 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +@@ -1023,6 +1023,7 @@ static const struct pci_device_id pciidlist[] = { + + /* Navi12 */ + {0x1002, 0x7360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12|AMD_EXP_HW_SUPPORT}, ++ {0x1002, 0x7362, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12|AMD_EXP_HW_SUPPORT}, + + {0, 0, 0} + }; +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index 4e9c15c409ba..360c87ba4595 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -3266,27 +3266,21 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing) + return color_space; + } + +-static void reduce_mode_colour_depth(struct dc_crtc_timing *timing_out) +-{ +- if (timing_out->display_color_depth <= COLOR_DEPTH_888) +- return; +- +- timing_out->display_color_depth--; +-} +- +-static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_out, +- const struct drm_display_info *info) ++static bool adjust_colour_depth_from_display_info( ++ struct dc_crtc_timing *timing_out, ++ const struct drm_display_info *info) + { ++ enum dc_color_depth depth = timing_out->display_color_depth; + int normalized_clk; +- if (timing_out->display_color_depth <= COLOR_DEPTH_888) +- return; + do { + normalized_clk = timing_out->pix_clk_100hz / 10; + /* YCbCr 4:2:0 requires additional adjustment of 1/2 */ + if (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420) + normalized_clk /= 2; + /* Adjusting pix clock following on HDMI spec based on colour depth */ +- switch (timing_out->display_color_depth) { ++ switch (depth) { ++ case COLOR_DEPTH_888: ++ break; + case COLOR_DEPTH_101010: + normalized_clk = (normalized_clk * 30) / 24; + break; +@@ -3297,14 +3291,15 @@ static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_ + normalized_clk = (normalized_clk * 48) / 24; + break; + default: +- return; ++ /* The above depths are the only ones valid for HDMI. */ ++ return false; + } +- if (normalized_clk <= info->max_tmds_clock) +- return; +- reduce_mode_colour_depth(timing_out); +- +- } while (timing_out->display_color_depth > COLOR_DEPTH_888); +- ++ if (normalized_clk <= info->max_tmds_clock) { ++ timing_out->display_color_depth = depth; ++ return true; ++ } ++ } while (--depth > COLOR_DEPTH_666); ++ return false; + } + + static void fill_stream_properties_from_drm_display_mode( +@@ -3370,8 +3365,14 @@ static void fill_stream_properties_from_drm_display_mode( + + stream->out_transfer_func->type = TF_TYPE_PREDEFINED; + stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB; +- if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) +- adjust_colour_depth_from_display_info(timing_out, info); ++ if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) { ++ if (!adjust_colour_depth_from_display_info(timing_out, info) && ++ drm_mode_is_420_also(info, mode_in) && ++ timing_out->pixel_encoding != PIXEL_ENCODING_YCBCR420) { ++ timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420; ++ adjust_colour_depth_from_display_info(timing_out, info); ++ } ++ } + } + + static void fill_audio_info(struct audio_info *audio_info, +diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c +index 8063b1d567b1..e6e4c841fb06 100644 +--- a/drivers/hid/hid-asus.c ++++ b/drivers/hid/hid-asus.c +@@ -261,7 +261,8 @@ static int asus_event(struct hid_device *hdev, struct hid_field *field, + struct hid_usage *usage, __s32 value) + { + if ((usage->hid & HID_USAGE_PAGE) == 0xff310000 && +- (usage->hid & HID_USAGE) != 0x00 && !usage->type) { ++ (usage->hid & HID_USAGE) != 0x00 && ++ (usage->hid & HID_USAGE) != 0xff && !usage->type) { + hid_warn(hdev, "Unmapped Asus vendor usagepage code 0x%02x\n", + usage->hid & HID_USAGE); + } +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index 6273e7178e78..5fc82029a03b 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -631,6 +631,7 @@ + #define USB_VENDOR_ID_ITE 0x048d + #define USB_DEVICE_ID_ITE_LENOVO_YOGA 0x8386 + #define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350 ++#define I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720 0x837a + #define USB_DEVICE_ID_ITE_LENOVO_YOGA900 0x8396 + #define USB_DEVICE_ID_ITE8595 0x8595 + +@@ -730,6 +731,7 @@ + #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 + #define USB_DEVICE_ID_LG_MELFAS_MT 0x6007 + #define I2C_DEVICE_ID_LG_8001 0x8001 ++#define I2C_DEVICE_ID_LG_7010 0x7010 + + #define USB_VENDOR_ID_LOGITECH 0x046d + #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e +@@ -1098,6 +1100,7 @@ + #define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10 + #define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3 + #define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3 ++#define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968 + #define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710 + #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5 0x81a7 + +diff --git a/drivers/hid/hid-ite.c b/drivers/hid/hid-ite.c +index a45f2352618d..c436e12feb23 100644 +--- a/drivers/hid/hid-ite.c ++++ b/drivers/hid/hid-ite.c +@@ -40,6 +40,9 @@ static int ite_event(struct hid_device *hdev, struct hid_field *field, + static const struct hid_device_id ite_devices[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, + { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, ++ /* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */ ++ { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, ++ USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, + { } + }; + MODULE_DEVICE_TABLE(hid, ite_devices); +diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c +index 3cfeb1629f79..362805ddf377 100644 +--- a/drivers/hid/hid-multitouch.c ++++ b/drivers/hid/hid-multitouch.c +@@ -1019,7 +1019,7 @@ static int mt_process_slot(struct mt_device *td, struct input_dev *input, + tool = MT_TOOL_DIAL; + else if (unlikely(!confidence_state)) { + tool = MT_TOOL_PALM; +- if (!active && ++ if (!active && mt && + input_mt_is_active(&mt->slots[slotnum])) { + /* + * The non-confidence was reported for +@@ -1985,6 +1985,9 @@ static const struct hid_device_id mt_devices[] = { + { .driver_data = MT_CLS_LG, + HID_USB_DEVICE(USB_VENDOR_ID_LG, + USB_DEVICE_ID_LG_MELFAS_MT) }, ++ { .driver_data = MT_CLS_LG, ++ HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC, ++ USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) }, + + /* MosArt panels */ + { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, +diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c +index 9a35af1e2662..fa58a7cbb3ff 100644 +--- a/drivers/hid/hid-quirks.c ++++ b/drivers/hid/hid-quirks.c +@@ -174,6 +174,7 @@ static const struct hid_device_id hid_quirks[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD2, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_XIN_MO_DUAL_ARCADE), HID_QUIRK_MULTI_INPUT }, + + { 0 } + }; +diff --git a/drivers/hid/hid-steam.c b/drivers/hid/hid-steam.c +index 8dae0f9b819e..6286204d4c56 100644 +--- a/drivers/hid/hid-steam.c ++++ b/drivers/hid/hid-steam.c +@@ -768,8 +768,12 @@ static int steam_probe(struct hid_device *hdev, + + if (steam->quirks & STEAM_QUIRK_WIRELESS) { + hid_info(hdev, "Steam wireless receiver connected"); ++ /* If using a wireless adaptor ask for connection status */ ++ steam->connected = false; + steam_request_conn_status(steam); + } else { ++ /* A wired connection is always present */ ++ steam->connected = true; + ret = steam_register(steam); + if (ret) { + hid_err(hdev, +diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c +index ac44bf752ff1..479934f7d241 100644 +--- a/drivers/hid/i2c-hid/i2c-hid-core.c ++++ b/drivers/hid/i2c-hid/i2c-hid-core.c +@@ -49,6 +49,8 @@ + #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1) + #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4) + #define I2C_HID_QUIRK_RESET_ON_RESUME BIT(5) ++#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(6) ++ + + /* flags */ + #define I2C_HID_STARTED 0 +@@ -177,6 +179,8 @@ static const struct i2c_hid_quirks { + I2C_HID_QUIRK_BOGUS_IRQ }, + { USB_VENDOR_ID_ALPS_JP, HID_ANY_ID, + I2C_HID_QUIRK_RESET_ON_RESUME }, ++ { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, ++ I2C_HID_QUIRK_BAD_INPUT_SIZE }, + { 0, 0 } + }; + +@@ -498,9 +502,15 @@ static void i2c_hid_get_input(struct i2c_hid *ihid) + } + + if ((ret_size > size) || (ret_size < 2)) { +- dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", +- __func__, size, ret_size); +- return; ++ if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { ++ ihid->inbuf[0] = size & 0xff; ++ ihid->inbuf[1] = size >> 8; ++ ret_size = size; ++ } else { ++ dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", ++ __func__, size, ret_size); ++ return; ++ } + } + + i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); +diff --git a/drivers/hid/intel-ish-hid/ipc/hw-ish.h b/drivers/hid/intel-ish-hid/ipc/hw-ish.h +index 6c1e6110867f..1fb294ca463e 100644 +--- a/drivers/hid/intel-ish-hid/ipc/hw-ish.h ++++ b/drivers/hid/intel-ish-hid/ipc/hw-ish.h +@@ -24,7 +24,9 @@ + #define ICL_MOBILE_DEVICE_ID 0x34FC + #define SPT_H_DEVICE_ID 0xA135 + #define CML_LP_DEVICE_ID 0x02FC ++#define CMP_H_DEVICE_ID 0x06FC + #define EHL_Ax_DEVICE_ID 0x4BB3 ++#define TGL_LP_DEVICE_ID 0xA0FC + + #define REVISION_ID_CHT_A0 0x6 + #define REVISION_ID_CHT_Ax_SI 0x0 +diff --git a/drivers/hid/intel-ish-hid/ipc/pci-ish.c b/drivers/hid/intel-ish-hid/ipc/pci-ish.c +index 784dcc8c7022..f491d8b4e24c 100644 +--- a/drivers/hid/intel-ish-hid/ipc/pci-ish.c ++++ b/drivers/hid/intel-ish-hid/ipc/pci-ish.c +@@ -34,7 +34,9 @@ static const struct pci_device_id ish_pci_tbl[] = { + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ICL_MOBILE_DEVICE_ID)}, + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, SPT_H_DEVICE_ID)}, + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, CML_LP_DEVICE_ID)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, CMP_H_DEVICE_ID)}, + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, EHL_Ax_DEVICE_ID)}, ++ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, TGL_LP_DEVICE_ID)}, + {0, } + }; + MODULE_DEVICE_TABLE(pci, ish_pci_tbl); +diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c +index ccb74529bc78..d99a9d407671 100644 +--- a/drivers/hid/wacom_wac.c ++++ b/drivers/hid/wacom_wac.c +@@ -2096,14 +2096,16 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field + (hdev->product == 0x34d || hdev->product == 0x34e || /* MobileStudio Pro */ + hdev->product == 0x357 || hdev->product == 0x358 || /* Intuos Pro 2 */ + hdev->product == 0x392 || /* Intuos Pro 2 */ +- hdev->product == 0x398 || hdev->product == 0x399)) { /* MobileStudio Pro */ ++ hdev->product == 0x398 || hdev->product == 0x399 || /* MobileStudio Pro */ ++ hdev->product == 0x3AA)) { /* MobileStudio Pro */ + value = (field->logical_maximum - value); + + if (hdev->product == 0x357 || hdev->product == 0x358 || + hdev->product == 0x392) + value = wacom_offset_rotation(input, usage, value, 3, 16); + else if (hdev->product == 0x34d || hdev->product == 0x34e || +- hdev->product == 0x398 || hdev->product == 0x399) ++ hdev->product == 0x398 || hdev->product == 0x399 || ++ hdev->product == 0x3AA) + value = wacom_offset_rotation(input, usage, value, 1, 2); + } + else { +diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c +index e493242c266e..0339ecdd06bd 100644 +--- a/drivers/iio/adc/stm32-dfsdm-adc.c ++++ b/drivers/iio/adc/stm32-dfsdm-adc.c +@@ -1204,6 +1204,8 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev, + + stm32_dfsdm_stop_conv(adc); + ++ stm32_dfsdm_process_data(adc, res); ++ + stop_dfsdm: + stm32_dfsdm_stop_dfsdm(adc->dfsdm); + +diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c +index c0acbb5d2ffb..b21f72dd473c 100644 +--- a/drivers/iio/gyro/st_gyro_core.c ++++ b/drivers/iio/gyro/st_gyro_core.c +@@ -139,7 +139,6 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = { + [2] = LSM330DLC_GYRO_DEV_NAME, + [3] = L3G4IS_GYRO_DEV_NAME, + [4] = LSM330_GYRO_DEV_NAME, +- [5] = LSM9DS0_GYRO_DEV_NAME, + }, + .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, + .odr = { +@@ -209,6 +208,80 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = { + .multi_read_bit = true, + .bootime = 2, + }, ++ { ++ .wai = 0xd4, ++ .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, ++ .sensors_supported = { ++ [0] = LSM9DS0_GYRO_DEV_NAME, ++ }, ++ .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, ++ .odr = { ++ .addr = 0x20, ++ .mask = GENMASK(7, 6), ++ .odr_avl = { ++ { .hz = 95, .value = 0x00, }, ++ { .hz = 190, .value = 0x01, }, ++ { .hz = 380, .value = 0x02, }, ++ { .hz = 760, .value = 0x03, }, ++ }, ++ }, ++ .pw = { ++ .addr = 0x20, ++ .mask = BIT(3), ++ .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE, ++ .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE, ++ }, ++ .enable_axis = { ++ .addr = ST_SENSORS_DEFAULT_AXIS_ADDR, ++ .mask = ST_SENSORS_DEFAULT_AXIS_MASK, ++ }, ++ .fs = { ++ .addr = 0x23, ++ .mask = GENMASK(5, 4), ++ .fs_avl = { ++ [0] = { ++ .num = ST_GYRO_FS_AVL_245DPS, ++ .value = 0x00, ++ .gain = IIO_DEGREE_TO_RAD(8750), ++ }, ++ [1] = { ++ .num = ST_GYRO_FS_AVL_500DPS, ++ .value = 0x01, ++ .gain = IIO_DEGREE_TO_RAD(17500), ++ }, ++ [2] = { ++ .num = ST_GYRO_FS_AVL_2000DPS, ++ .value = 0x02, ++ .gain = IIO_DEGREE_TO_RAD(70000), ++ }, ++ }, ++ }, ++ .bdu = { ++ .addr = 0x23, ++ .mask = BIT(7), ++ }, ++ .drdy_irq = { ++ .int2 = { ++ .addr = 0x22, ++ .mask = BIT(3), ++ }, ++ /* ++ * The sensor has IHL (active low) and open ++ * drain settings, but only for INT1 and not ++ * for the DRDY line on INT2. ++ */ ++ .stat_drdy = { ++ .addr = ST_SENSORS_DEFAULT_STAT_ADDR, ++ .mask = GENMASK(2, 0), ++ }, ++ }, ++ .sim = { ++ .addr = 0x23, ++ .value = BIT(0), ++ }, ++ .multi_read_bit = true, ++ .bootime = 2, ++ }, + { + .wai = 0xd7, + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, +diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c +index dd555078258c..454695b372c8 100644 +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -226,71 +226,61 @@ static struct iommu_dev_data *search_dev_data(u16 devid) + return NULL; + } + +-static int __last_alias(struct pci_dev *pdev, u16 alias, void *data) ++static int clone_alias(struct pci_dev *pdev, u16 alias, void *data) + { +- *(u16 *)data = alias; +- return 0; +-} +- +-static u16 get_alias(struct device *dev) +-{ +- struct pci_dev *pdev = to_pci_dev(dev); +- u16 devid, ivrs_alias, pci_alias; +- +- /* The callers make sure that get_device_id() does not fail here */ +- devid = get_device_id(dev); ++ u16 devid = pci_dev_id(pdev); + +- /* For ACPI HID devices, we simply return the devid as such */ +- if (!dev_is_pci(dev)) +- return devid; ++ if (devid == alias) ++ return 0; + +- ivrs_alias = amd_iommu_alias_table[devid]; ++ amd_iommu_rlookup_table[alias] = ++ amd_iommu_rlookup_table[devid]; ++ memcpy(amd_iommu_dev_table[alias].data, ++ amd_iommu_dev_table[devid].data, ++ sizeof(amd_iommu_dev_table[alias].data)); + +- pci_for_each_dma_alias(pdev, __last_alias, &pci_alias); ++ return 0; ++} + +- if (ivrs_alias == pci_alias) +- return ivrs_alias; ++static void clone_aliases(struct pci_dev *pdev) ++{ ++ if (!pdev) ++ return; + + /* +- * DMA alias showdown +- * +- * The IVRS is fairly reliable in telling us about aliases, but it +- * can't know about every screwy device. If we don't have an IVRS +- * reported alias, use the PCI reported alias. In that case we may +- * still need to initialize the rlookup and dev_table entries if the +- * alias is to a non-existent device. ++ * The IVRS alias stored in the alias table may not be ++ * part of the PCI DMA aliases if it's bus differs ++ * from the original device. + */ +- if (ivrs_alias == devid) { +- if (!amd_iommu_rlookup_table[pci_alias]) { +- amd_iommu_rlookup_table[pci_alias] = +- amd_iommu_rlookup_table[devid]; +- memcpy(amd_iommu_dev_table[pci_alias].data, +- amd_iommu_dev_table[devid].data, +- sizeof(amd_iommu_dev_table[pci_alias].data)); +- } ++ clone_alias(pdev, amd_iommu_alias_table[pci_dev_id(pdev)], NULL); + +- return pci_alias; +- } ++ pci_for_each_dma_alias(pdev, clone_alias, NULL); ++} + +- pci_info(pdev, "Using IVRS reported alias %02x:%02x.%d " +- "for device [%04x:%04x], kernel reported alias " +- "%02x:%02x.%d\n", PCI_BUS_NUM(ivrs_alias), PCI_SLOT(ivrs_alias), +- PCI_FUNC(ivrs_alias), pdev->vendor, pdev->device, +- PCI_BUS_NUM(pci_alias), PCI_SLOT(pci_alias), +- PCI_FUNC(pci_alias)); ++static struct pci_dev *setup_aliases(struct device *dev) ++{ ++ struct pci_dev *pdev = to_pci_dev(dev); ++ u16 ivrs_alias; ++ ++ /* For ACPI HID devices, there are no aliases */ ++ if (!dev_is_pci(dev)) ++ return NULL; + + /* +- * If we don't have a PCI DMA alias and the IVRS alias is on the same +- * bus, then the IVRS table may know about a quirk that we don't. ++ * Add the IVRS alias to the pci aliases if it is on the same ++ * bus. The IVRS table may know about a quirk that we don't. + */ +- if (pci_alias == devid && ++ ivrs_alias = amd_iommu_alias_table[pci_dev_id(pdev)]; ++ if (ivrs_alias != pci_dev_id(pdev) && + PCI_BUS_NUM(ivrs_alias) == pdev->bus->number) { + pci_add_dma_alias(pdev, ivrs_alias & 0xff); + pci_info(pdev, "Added PCI DMA alias %02x.%d\n", + PCI_SLOT(ivrs_alias), PCI_FUNC(ivrs_alias)); + } + +- return ivrs_alias; ++ clone_aliases(pdev); ++ ++ return pdev; + } + + static struct iommu_dev_data *find_dev_data(u16 devid) +@@ -428,7 +418,7 @@ static int iommu_init_device(struct device *dev) + if (!dev_data) + return -ENOMEM; + +- dev_data->alias = get_alias(dev); ++ dev_data->pdev = setup_aliases(dev); + + /* + * By default we use passthrough mode for IOMMUv2 capable device. +@@ -453,20 +443,16 @@ static int iommu_init_device(struct device *dev) + + static void iommu_ignore_device(struct device *dev) + { +- u16 alias; + int devid; + + devid = get_device_id(dev); + if (devid < 0) + return; + +- alias = get_alias(dev); +- ++ amd_iommu_rlookup_table[devid] = NULL; + memset(&amd_iommu_dev_table[devid], 0, sizeof(struct dev_table_entry)); +- memset(&amd_iommu_dev_table[alias], 0, sizeof(struct dev_table_entry)); + +- amd_iommu_rlookup_table[devid] = NULL; +- amd_iommu_rlookup_table[alias] = NULL; ++ setup_aliases(dev); + } + + static void iommu_uninit_device(struct device *dev) +@@ -1236,6 +1222,13 @@ static int device_flush_iotlb(struct iommu_dev_data *dev_data, + return iommu_queue_command(iommu, &cmd); + } + ++static int device_flush_dte_alias(struct pci_dev *pdev, u16 alias, void *data) ++{ ++ struct amd_iommu *iommu = data; ++ ++ return iommu_flush_dte(iommu, alias); ++} ++ + /* + * Command send function for invalidating a device table entry + */ +@@ -1246,14 +1239,22 @@ static int device_flush_dte(struct iommu_dev_data *dev_data) + int ret; + + iommu = amd_iommu_rlookup_table[dev_data->devid]; +- alias = dev_data->alias; + +- ret = iommu_flush_dte(iommu, dev_data->devid); +- if (!ret && alias != dev_data->devid) +- ret = iommu_flush_dte(iommu, alias); ++ if (dev_data->pdev) ++ ret = pci_for_each_dma_alias(dev_data->pdev, ++ device_flush_dte_alias, iommu); ++ else ++ ret = iommu_flush_dte(iommu, dev_data->devid); + if (ret) + return ret; + ++ alias = amd_iommu_alias_table[dev_data->devid]; ++ if (alias != dev_data->devid) { ++ ret = iommu_flush_dte(iommu, alias); ++ if (ret) ++ return ret; ++ } ++ + if (dev_data->ats.enabled) + ret = device_flush_iotlb(dev_data, 0, ~0UL); + +@@ -2035,11 +2036,9 @@ static void do_attach(struct iommu_dev_data *dev_data, + struct protection_domain *domain) + { + struct amd_iommu *iommu; +- u16 alias; + bool ats; + + iommu = amd_iommu_rlookup_table[dev_data->devid]; +- alias = dev_data->alias; + ats = dev_data->ats.enabled; + + /* Update data structures */ +@@ -2052,8 +2051,7 @@ static void do_attach(struct iommu_dev_data *dev_data, + + /* Update device table */ + set_dte_entry(dev_data->devid, domain, ats, dev_data->iommu_v2); +- if (alias != dev_data->devid) +- set_dte_entry(alias, domain, ats, dev_data->iommu_v2); ++ clone_aliases(dev_data->pdev); + + device_flush_dte(dev_data); + } +@@ -2062,17 +2060,14 @@ static void do_detach(struct iommu_dev_data *dev_data) + { + struct protection_domain *domain = dev_data->domain; + struct amd_iommu *iommu; +- u16 alias; + + iommu = amd_iommu_rlookup_table[dev_data->devid]; +- alias = dev_data->alias; + + /* Update data structures */ + dev_data->domain = NULL; + list_del(&dev_data->list); + clear_dte_entry(dev_data->devid); +- if (alias != dev_data->devid) +- clear_dte_entry(alias); ++ clone_aliases(dev_data->pdev); + + /* Flush the DTE entry */ + device_flush_dte(dev_data); +@@ -2384,13 +2379,7 @@ static void update_device_table(struct protection_domain *domain) + list_for_each_entry(dev_data, &domain->dev_list, list) { + set_dte_entry(dev_data->devid, domain, dev_data->ats.enabled, + dev_data->iommu_v2); +- +- if (dev_data->devid == dev_data->alias) +- continue; +- +- /* There is an alias, update device table entry for it */ +- set_dte_entry(dev_data->alias, domain, dev_data->ats.enabled, +- dev_data->iommu_v2); ++ clone_aliases(dev_data->pdev); + } + } + +@@ -3752,7 +3741,20 @@ static void set_remap_table_entry(struct amd_iommu *iommu, u16 devid, + iommu_flush_dte(iommu, devid); + } + +-static struct irq_remap_table *alloc_irq_table(u16 devid) ++static int set_remap_table_entry_alias(struct pci_dev *pdev, u16 alias, ++ void *data) ++{ ++ struct irq_remap_table *table = data; ++ ++ irq_lookup_table[alias] = table; ++ set_dte_irq_entry(alias, table); ++ ++ iommu_flush_dte(amd_iommu_rlookup_table[alias], alias); ++ ++ return 0; ++} ++ ++static struct irq_remap_table *alloc_irq_table(u16 devid, struct pci_dev *pdev) + { + struct irq_remap_table *table = NULL; + struct irq_remap_table *new_table = NULL; +@@ -3798,7 +3800,12 @@ static struct irq_remap_table *alloc_irq_table(u16 devid) + table = new_table; + new_table = NULL; + +- set_remap_table_entry(iommu, devid, table); ++ if (pdev) ++ pci_for_each_dma_alias(pdev, set_remap_table_entry_alias, ++ table); ++ else ++ set_remap_table_entry(iommu, devid, table); ++ + if (devid != alias) + set_remap_table_entry(iommu, alias, table); + +@@ -3815,7 +3822,8 @@ out_unlock: + return table; + } + +-static int alloc_irq_index(u16 devid, int count, bool align) ++static int alloc_irq_index(u16 devid, int count, bool align, ++ struct pci_dev *pdev) + { + struct irq_remap_table *table; + int index, c, alignment = 1; +@@ -3825,7 +3833,7 @@ static int alloc_irq_index(u16 devid, int count, bool align) + if (!iommu) + return -ENODEV; + +- table = alloc_irq_table(devid); ++ table = alloc_irq_table(devid, pdev); + if (!table) + return -ENODEV; + +@@ -4258,7 +4266,7 @@ static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq, + struct irq_remap_table *table; + struct amd_iommu *iommu; + +- table = alloc_irq_table(devid); ++ table = alloc_irq_table(devid, NULL); + if (table) { + if (!table->min_index) { + /* +@@ -4275,11 +4283,15 @@ static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq, + } else { + index = -ENOMEM; + } +- } else { ++ } else if (info->type == X86_IRQ_ALLOC_TYPE_MSI || ++ info->type == X86_IRQ_ALLOC_TYPE_MSIX) { + bool align = (info->type == X86_IRQ_ALLOC_TYPE_MSI); + +- index = alloc_irq_index(devid, nr_irqs, align); ++ index = alloc_irq_index(devid, nr_irqs, align, info->msi_dev); ++ } else { ++ index = alloc_irq_index(devid, nr_irqs, false, NULL); + } ++ + if (index < 0) { + pr_warn("Failed to allocate IRTE\n"); + ret = index; +diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h +index 17bd5a349119..fc956479b94e 100644 +--- a/drivers/iommu/amd_iommu_types.h ++++ b/drivers/iommu/amd_iommu_types.h +@@ -639,8 +639,8 @@ struct iommu_dev_data { + struct list_head list; /* For domain->dev_list */ + struct llist_node dev_data_list; /* For global dev_data_list */ + struct protection_domain *domain; /* Domain the device is bound to */ ++ struct pci_dev *pdev; + u16 devid; /* PCI Device ID */ +- u16 alias; /* Alias Device ID */ + bool iommu_v2; /* Device can make use of IOMMUv2 */ + bool passthrough; /* Device is identity mapped */ + struct { +diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c +index 51456e7f264f..c68a1f072c31 100644 +--- a/drivers/iommu/dma-iommu.c ++++ b/drivers/iommu/dma-iommu.c +@@ -1177,7 +1177,6 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) + { + struct device *dev = msi_desc_to_dev(desc); + struct iommu_domain *domain = iommu_get_domain_for_dev(dev); +- struct iommu_dma_cookie *cookie; + struct iommu_dma_msi_page *msi_page; + static DEFINE_MUTEX(msi_prepare_lock); /* see below */ + +@@ -1186,8 +1185,6 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) + return 0; + } + +- cookie = domain->iova_cookie; +- + /* + * In fact the whole prepare operation should already be serialised by + * irq_domain_mutex further up the callchain, but that's pretty subtle +diff --git a/drivers/media/usb/dvb-usb-v2/dvbsky.c b/drivers/media/usb/dvb-usb-v2/dvbsky.c +index 617a306f6815..dc380c0c9536 100644 +--- a/drivers/media/usb/dvb-usb-v2/dvbsky.c ++++ b/drivers/media/usb/dvb-usb-v2/dvbsky.c +@@ -792,6 +792,9 @@ static const struct usb_device_id dvbsky_id_table[] = { + { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C, + &mygica_t230c_props, "MyGica Mini DVB-T2 USB Stick T230C", + RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, ++ { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C_LITE, ++ &mygica_t230c_props, "MyGica Mini DVB-T2 USB Stick T230C Lite", ++ NULL) }, + { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C2, + &mygica_t230c_props, "MyGica Mini DVB-T2 USB Stick T230C v2", + RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, +diff --git a/drivers/mfd/intel-lpss-pci.c b/drivers/mfd/intel-lpss-pci.c +index 1767f30a1676..b33030e3385c 100644 +--- a/drivers/mfd/intel-lpss-pci.c ++++ b/drivers/mfd/intel-lpss-pci.c +@@ -140,7 +140,7 @@ static const struct intel_lpss_platform_info cnl_i2c_info = { + }; + + static const struct pci_device_id intel_lpss_pci_ids[] = { +- /* CML */ ++ /* CML-LP */ + { PCI_VDEVICE(INTEL, 0x02a8), (kernel_ulong_t)&spt_uart_info }, + { PCI_VDEVICE(INTEL, 0x02a9), (kernel_ulong_t)&spt_uart_info }, + { PCI_VDEVICE(INTEL, 0x02aa), (kernel_ulong_t)&spt_info }, +@@ -153,6 +153,17 @@ static const struct pci_device_id intel_lpss_pci_ids[] = { + { PCI_VDEVICE(INTEL, 0x02ea), (kernel_ulong_t)&cnl_i2c_info }, + { PCI_VDEVICE(INTEL, 0x02eb), (kernel_ulong_t)&cnl_i2c_info }, + { PCI_VDEVICE(INTEL, 0x02fb), (kernel_ulong_t)&spt_info }, ++ /* CML-H */ ++ { PCI_VDEVICE(INTEL, 0x06a8), (kernel_ulong_t)&spt_uart_info }, ++ { PCI_VDEVICE(INTEL, 0x06a9), (kernel_ulong_t)&spt_uart_info }, ++ { PCI_VDEVICE(INTEL, 0x06aa), (kernel_ulong_t)&spt_info }, ++ { PCI_VDEVICE(INTEL, 0x06ab), (kernel_ulong_t)&spt_info }, ++ { PCI_VDEVICE(INTEL, 0x06c7), (kernel_ulong_t)&spt_uart_info }, ++ { PCI_VDEVICE(INTEL, 0x06e8), (kernel_ulong_t)&cnl_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x06e9), (kernel_ulong_t)&cnl_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x06ea), (kernel_ulong_t)&cnl_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x06eb), (kernel_ulong_t)&cnl_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x06fb), (kernel_ulong_t)&spt_info }, + /* BXT A-Step */ + { PCI_VDEVICE(INTEL, 0x0aac), (kernel_ulong_t)&bxt_i2c_info }, + { PCI_VDEVICE(INTEL, 0x0aae), (kernel_ulong_t)&bxt_i2c_info }, +diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c +index c681f6fab342..a9793ea6933b 100644 +--- a/drivers/misc/mei/hdcp/mei_hdcp.c ++++ b/drivers/misc/mei/hdcp/mei_hdcp.c +@@ -758,11 +758,38 @@ static const struct component_master_ops mei_component_master_ops = { + .unbind = mei_component_master_unbind, + }; + ++/** ++ * mei_hdcp_component_match - compare function for matching mei hdcp. ++ * ++ * The function checks if the driver is i915, the subcomponent is HDCP ++ * and the grand parent of hdcp and the parent of i915 are the same ++ * PCH device. ++ * ++ * @dev: master device ++ * @subcomponent: subcomponent to match (I915_COMPONENT_HDCP) ++ * @data: compare data (mei hdcp device) ++ * ++ * Return: ++ * * 1 - if components match ++ * * 0 - otherwise ++ */ + static int mei_hdcp_component_match(struct device *dev, int subcomponent, + void *data) + { +- return !strcmp(dev->driver->name, "i915") && +- subcomponent == I915_COMPONENT_HDCP; ++ struct device *base = data; ++ ++ if (strcmp(dev->driver->name, "i915") || ++ subcomponent != I915_COMPONENT_HDCP) ++ return 0; ++ ++ base = base->parent; ++ if (!base) ++ return 0; ++ ++ base = base->parent; ++ dev = dev->parent; ++ ++ return (base && dev && dev == base); + } + + static int mei_hdcp_probe(struct mei_cl_device *cldev, +@@ -786,7 +813,7 @@ static int mei_hdcp_probe(struct mei_cl_device *cldev, + + master_match = NULL; + component_match_add_typed(&cldev->dev, &master_match, +- mei_hdcp_component_match, comp_master); ++ mei_hdcp_component_match, &cldev->dev); + if (IS_ERR_OR_NULL(master_match)) { + ret = -ENOMEM; + goto err_exit; +diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h +index b359f06f05e7..69d9b1736bf9 100644 +--- a/drivers/misc/mei/hw-me-regs.h ++++ b/drivers/misc/mei/hw-me-regs.h +@@ -81,8 +81,12 @@ + + #define MEI_DEV_ID_CMP_LP 0x02e0 /* Comet Point LP */ + #define MEI_DEV_ID_CMP_LP_3 0x02e4 /* Comet Point LP 3 (iTouch) */ ++ + #define MEI_DEV_ID_CMP_V 0xA3BA /* Comet Point Lake V */ + ++#define MEI_DEV_ID_CMP_H 0x06e0 /* Comet Lake H */ ++#define MEI_DEV_ID_CMP_H_3 0x06e4 /* Comet Lake H 3 (iTouch) */ ++ + #define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */ + + #define MEI_DEV_ID_TGP_LP 0xA0E0 /* Tiger Lake Point LP */ +diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c +index ce43415a536c..309cb8a23381 100644 +--- a/drivers/misc/mei/pci-me.c ++++ b/drivers/misc/mei/pci-me.c +@@ -99,6 +99,8 @@ static const struct pci_device_id mei_me_pci_tbl[] = { + {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_LP, MEI_ME_PCH12_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_LP_3, MEI_ME_PCH8_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_V, MEI_ME_PCH12_CFG)}, ++ {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H, MEI_ME_PCH12_CFG)}, ++ {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H_3, MEI_ME_PCH8_CFG)}, + + {MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)}, + +diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c +index 642a9667db4d..c9ea365c248c 100644 +--- a/drivers/mmc/host/sdhci-pci-core.c ++++ b/drivers/mmc/host/sdhci-pci-core.c +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1598,11 +1599,59 @@ static int amd_probe(struct sdhci_pci_chip *chip) + return 0; + } + ++static u32 sdhci_read_present_state(struct sdhci_host *host) ++{ ++ return sdhci_readl(host, SDHCI_PRESENT_STATE); ++} ++ ++void amd_sdhci_reset(struct sdhci_host *host, u8 mask) ++{ ++ struct sdhci_pci_slot *slot = sdhci_priv(host); ++ struct pci_dev *pdev = slot->chip->pdev; ++ u32 present_state; ++ ++ /* ++ * SDHC 0x7906 requires a hard reset to clear all internal state. ++ * Otherwise it can get into a bad state where the DATA lines are always ++ * read as zeros. ++ */ ++ if (pdev->device == 0x7906 && (mask & SDHCI_RESET_ALL)) { ++ pci_clear_master(pdev); ++ ++ pci_save_state(pdev); ++ ++ pci_set_power_state(pdev, PCI_D3cold); ++ pr_debug("%s: power_state=%u\n", mmc_hostname(host->mmc), ++ pdev->current_state); ++ pci_set_power_state(pdev, PCI_D0); ++ ++ pci_restore_state(pdev); ++ ++ /* ++ * SDHCI_RESET_ALL says the card detect logic should not be ++ * reset, but since we need to reset the entire controller ++ * we should wait until the card detect logic has stabilized. ++ * ++ * This normally takes about 40ms. ++ */ ++ readx_poll_timeout( ++ sdhci_read_present_state, ++ host, ++ present_state, ++ present_state & SDHCI_CD_STABLE, ++ 10000, ++ 100000 ++ ); ++ } ++ ++ return sdhci_reset(host, mask); ++} ++ + static const struct sdhci_ops amd_sdhci_pci_ops = { + .set_clock = sdhci_set_clock, + .enable_dma = sdhci_pci_enable_dma, + .set_bus_width = sdhci_set_bus_width, +- .reset = sdhci_reset, ++ .reset = amd_sdhci_reset, + .set_uhs_signaling = sdhci_set_uhs_signaling, + }; + +@@ -1681,6 +1730,8 @@ static const struct pci_device_id pci_ids[] = { + SDHCI_PCI_DEVICE(INTEL, CML_EMMC, intel_glk_emmc), + SDHCI_PCI_DEVICE(INTEL, CML_SD, intel_byt_sd), + SDHCI_PCI_DEVICE(INTEL, CMLH_SD, intel_byt_sd), ++ SDHCI_PCI_DEVICE(INTEL, JSL_EMMC, intel_glk_emmc), ++ SDHCI_PCI_DEVICE(INTEL, JSL_SD, intel_byt_sd), + SDHCI_PCI_DEVICE(O2, 8120, o2), + SDHCI_PCI_DEVICE(O2, 8220, o2), + SDHCI_PCI_DEVICE(O2, 8221, o2), +diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h +index 558202fe64c6..981bbbe63aff 100644 +--- a/drivers/mmc/host/sdhci-pci.h ++++ b/drivers/mmc/host/sdhci-pci.h +@@ -55,6 +55,8 @@ + #define PCI_DEVICE_ID_INTEL_CML_EMMC 0x02c4 + #define PCI_DEVICE_ID_INTEL_CML_SD 0x02f5 + #define PCI_DEVICE_ID_INTEL_CMLH_SD 0x06f5 ++#define PCI_DEVICE_ID_INTEL_JSL_EMMC 0x4dc4 ++#define PCI_DEVICE_ID_INTEL_JSL_SD 0x4df8 + + #define PCI_DEVICE_ID_SYSKONNECT_8000 0x8000 + #define PCI_DEVICE_ID_VIA_95D0 0x95d0 +diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c +index d797912e665a..b233756345f8 100644 +--- a/drivers/net/can/m_can/tcan4x5x.c ++++ b/drivers/net/can/m_can/tcan4x5x.c +@@ -164,6 +164,28 @@ static void tcan4x5x_check_wake(struct tcan4x5x_priv *priv) + } + } + ++static int tcan4x5x_reset(struct tcan4x5x_priv *priv) ++{ ++ int ret = 0; ++ ++ if (priv->reset_gpio) { ++ gpiod_set_value(priv->reset_gpio, 1); ++ ++ /* tpulse_width minimum 30us */ ++ usleep_range(30, 100); ++ gpiod_set_value(priv->reset_gpio, 0); ++ } else { ++ ret = regmap_write(priv->regmap, TCAN4X5X_CONFIG, ++ TCAN4X5X_SW_RESET); ++ if (ret) ++ return ret; ++ } ++ ++ usleep_range(700, 1000); ++ ++ return ret; ++} ++ + static int regmap_spi_gather_write(void *context, const void *reg, + size_t reg_len, const void *val, + size_t val_len) +@@ -341,6 +363,7 @@ static int tcan4x5x_init(struct m_can_classdev *cdev) + static int tcan4x5x_parse_config(struct m_can_classdev *cdev) + { + struct tcan4x5x_priv *tcan4x5x = cdev->device_data; ++ int ret; + + tcan4x5x->device_wake_gpio = devm_gpiod_get(cdev->dev, "device-wake", + GPIOD_OUT_HIGH); +@@ -354,7 +377,9 @@ static int tcan4x5x_parse_config(struct m_can_classdev *cdev) + if (IS_ERR(tcan4x5x->reset_gpio)) + tcan4x5x->reset_gpio = NULL; + +- usleep_range(700, 1000); ++ ret = tcan4x5x_reset(tcan4x5x); ++ if (ret) ++ return ret; + + tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev, + "device-state", +diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c +index 97ab0dd25552..1a7710c399d7 100644 +--- a/drivers/net/ethernet/broadcom/b44.c ++++ b/drivers/net/ethernet/broadcom/b44.c +@@ -1519,8 +1519,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + int ethaddr_bytes = ETH_ALEN; + + memset(ppattern + offset, 0xff, magicsync); +- for (j = 0; j < magicsync; j++) +- set_bit(len++, (unsigned long *) pmask); ++ for (j = 0; j < magicsync; j++) { ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; ++ } + + for (j = 0; j < B44_MAX_PATTERNS; j++) { + if ((B44_PATTERN_SIZE - len) >= ETH_ALEN) +@@ -1532,7 +1534,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + for (k = 0; k< ethaddr_bytes; k++) { + ppattern[offset + magicsync + + (j * ETH_ALEN) + k] = macaddr[k]; +- set_bit(len++, (unsigned long *) pmask); ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; + } + } + return len - 1; +diff --git a/drivers/net/ethernet/google/gve/gve_rx.c b/drivers/net/ethernet/google/gve/gve_rx.c +index edec61dfc868..9f52e72ff641 100644 +--- a/drivers/net/ethernet/google/gve/gve_rx.c ++++ b/drivers/net/ethernet/google/gve/gve_rx.c +@@ -418,8 +418,6 @@ bool gve_clean_rx_done(struct gve_rx_ring *rx, int budget, + rx->cnt = cnt; + rx->fill_cnt += work_done; + +- /* restock desc ring slots */ +- dma_wmb(); /* Ensure descs are visible before ringing doorbell */ + gve_rx_write_doorbell(priv, rx); + return gve_rx_work_pending(rx); + } +diff --git a/drivers/net/ethernet/google/gve/gve_tx.c b/drivers/net/ethernet/google/gve/gve_tx.c +index f4889431f9b7..d0244feb0301 100644 +--- a/drivers/net/ethernet/google/gve/gve_tx.c ++++ b/drivers/net/ethernet/google/gve/gve_tx.c +@@ -487,10 +487,6 @@ netdev_tx_t gve_tx(struct sk_buff *skb, struct net_device *dev) + * may have added descriptors without ringing the doorbell. + */ + +- /* Ensure tx descs from a prior gve_tx are visible before +- * ringing doorbell. +- */ +- dma_wmb(); + gve_tx_put_doorbell(priv, tx->q_resources, tx->req); + return NETDEV_TX_BUSY; + } +@@ -505,8 +501,6 @@ netdev_tx_t gve_tx(struct sk_buff *skb, struct net_device *dev) + if (!netif_xmit_stopped(tx->netdev_txq) && netdev_xmit_more()) + return NETDEV_TX_OK; + +- /* Ensure tx descs are visible before ringing doorbell */ +- dma_wmb(); + gve_tx_put_doorbell(priv, tx->q_resources, tx->req); + return NETDEV_TX_OK; + } +diff --git a/drivers/net/ethernet/mellanox/mlxsw/minimal.c b/drivers/net/ethernet/mellanox/mlxsw/minimal.c +index 471b0ca6d69a..55dfba990e6e 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/minimal.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/minimal.c +@@ -204,8 +204,8 @@ mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u8 local_port, u8 module) + + err_register_netdev: + mlxsw_m->ports[local_port] = NULL; +- free_netdev(dev); + err_dev_addr_get: ++ free_netdev(dev); + err_alloc_etherdev: + mlxsw_core_port_fini(mlxsw_m->core, local_port); + return err; +diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c +index 41ddd8fff2a7..8bd2912bf713 100644 +--- a/drivers/net/ethernet/socionext/netsec.c ++++ b/drivers/net/ethernet/socionext/netsec.c +@@ -928,7 +928,6 @@ static int netsec_process_rx(struct netsec_priv *priv, int budget) + struct netsec_rx_pkt_info rx_info; + enum dma_data_direction dma_dir; + struct bpf_prog *xdp_prog; +- struct sk_buff *skb = NULL; + u16 xdp_xmit = 0; + u32 xdp_act = 0; + int done = 0; +@@ -942,7 +941,8 @@ static int netsec_process_rx(struct netsec_priv *priv, int budget) + struct netsec_de *de = dring->vaddr + (DESC_SZ * idx); + struct netsec_desc *desc = &dring->desc[idx]; + struct page *page = virt_to_page(desc->addr); +- u32 xdp_result = XDP_PASS; ++ u32 xdp_result = NETSEC_XDP_PASS; ++ struct sk_buff *skb = NULL; + u16 pkt_len, desc_len; + dma_addr_t dma_handle; + struct xdp_buff xdp; +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 1b3520d0e59e..06dd65c419c4 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -105,6 +105,7 @@ MODULE_PARM_DESC(chain_mode, "To use chain instead of ring mode"); + static irqreturn_t stmmac_interrupt(int irq, void *dev_id); + + #ifdef CONFIG_DEBUG_FS ++static const struct net_device_ops stmmac_netdev_ops; + static void stmmac_init_fs(struct net_device *dev); + static void stmmac_exit_fs(struct net_device *dev); + #endif +@@ -4175,6 +4176,34 @@ static int stmmac_dma_cap_show(struct seq_file *seq, void *v) + } + DEFINE_SHOW_ATTRIBUTE(stmmac_dma_cap); + ++/* Use network device events to rename debugfs file entries. ++ */ ++static int stmmac_device_event(struct notifier_block *unused, ++ unsigned long event, void *ptr) ++{ ++ struct net_device *dev = netdev_notifier_info_to_dev(ptr); ++ struct stmmac_priv *priv = netdev_priv(dev); ++ ++ if (dev->netdev_ops != &stmmac_netdev_ops) ++ goto done; ++ ++ switch (event) { ++ case NETDEV_CHANGENAME: ++ if (priv->dbgfs_dir) ++ priv->dbgfs_dir = debugfs_rename(stmmac_fs_dir, ++ priv->dbgfs_dir, ++ stmmac_fs_dir, ++ dev->name); ++ break; ++ } ++done: ++ return NOTIFY_DONE; ++} ++ ++static struct notifier_block stmmac_notifier = { ++ .notifier_call = stmmac_device_event, ++}; ++ + static void stmmac_init_fs(struct net_device *dev) + { + struct stmmac_priv *priv = netdev_priv(dev); +@@ -4189,12 +4218,15 @@ static void stmmac_init_fs(struct net_device *dev) + /* Entry to report the DMA HW features */ + debugfs_create_file("dma_cap", 0444, priv->dbgfs_dir, dev, + &stmmac_dma_cap_fops); ++ ++ register_netdevice_notifier(&stmmac_notifier); + } + + static void stmmac_exit_fs(struct net_device *dev) + { + struct stmmac_priv *priv = netdev_priv(dev); + ++ unregister_netdevice_notifier(&stmmac_notifier); + debugfs_remove_recursive(priv->dbgfs_dir); + } + #endif /* CONFIG_DEBUG_FS */ +diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c +index e2e679a01b65..77ccf3672ede 100644 +--- a/drivers/net/wan/sdla.c ++++ b/drivers/net/wan/sdla.c +@@ -708,7 +708,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, + + spin_lock_irqsave(&sdla_lock, flags); + SDLA_WINDOW(dev, addr); +- pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK)); ++ pbuf = (void *)(dev->mem_start + (addr & SDLA_ADDR_MASK)); + __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len); + SDLA_WINDOW(dev, addr); + pbuf->opp_flag = 1; +diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c +index fb649d85b8fc..dd0c32379375 100644 +--- a/drivers/net/wireless/ath/ath9k/hif_usb.c ++++ b/drivers/net/wireless/ath/ath9k/hif_usb.c +@@ -1216,7 +1216,7 @@ err_fw: + static int send_eject_command(struct usb_interface *interface) + { + struct usb_device *udev = interface_to_usbdev(interface); +- struct usb_host_interface *iface_desc = &interface->altsetting[0]; ++ struct usb_host_interface *iface_desc = interface->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +index 06f3c01f10b3..7cdfde9b3dea 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +@@ -1348,7 +1348,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + goto fail; + } + +- desc = &intf->altsetting[0].desc; ++ desc = &intf->cur_altsetting->desc; + if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || + (desc->bInterfaceSubClass != 2) || + (desc->bInterfaceProtocol != 0xff)) { +@@ -1361,7 +1361,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + + num_of_eps = desc->bNumEndpoints; + for (ep = 0; ep < num_of_eps; ep++) { +- endpoint = &intf->altsetting[0].endpoint[ep].desc; ++ endpoint = &intf->cur_altsetting->endpoint[ep].desc; + endpoint_num = usb_endpoint_num(endpoint); + if (!usb_endpoint_xfer_bulk(endpoint)) + continue; +diff --git a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c +index 40a8b941ad5c..8c79b963bcff 100644 +--- a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c ++++ b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c +@@ -1608,9 +1608,9 @@ static int ezusb_probe(struct usb_interface *interface, + /* set up the endpoint information */ + /* check out the endpoints */ + +- iface_desc = &interface->altsetting[0].desc; ++ iface_desc = &interface->cur_altsetting->desc; + for (i = 0; i < iface_desc->bNumEndpoints; ++i) { +- ep = &interface->altsetting[0].endpoint[i].desc; ++ ep = &interface->cur_altsetting->endpoint[i].desc; + + if (usb_endpoint_is_bulk_in(ep)) { + /* we found a bulk in endpoint */ +diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +index e7d96ac673b7..3499b211dad5 100644 +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +@@ -5915,7 +5915,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv, + u8 dir, xtype, num; + int ret = 0; + +- host_interface = &interface->altsetting[0]; ++ host_interface = interface->cur_altsetting; + interface_desc = &host_interface->desc; + endpoints = interface_desc->bNumEndpoints; + +diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c +index f84250bdb8cf..6f8d5f9a9f7e 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_hal.c ++++ b/drivers/net/wireless/rsi/rsi_91x_hal.c +@@ -622,6 +622,7 @@ static int bl_cmd(struct rsi_hw *adapter, u8 cmd, u8 exp_resp, char *str) + bl_start_cmd_timer(adapter, timeout); + status = bl_write_cmd(adapter, cmd, exp_resp, ®out_val); + if (status < 0) { ++ bl_stop_cmd_timer(adapter); + rsi_dbg(ERR_ZONE, + "%s: Command %s (%0x) writing failed..\n", + __func__, str, cmd); +@@ -737,10 +738,9 @@ static int ping_pong_write(struct rsi_hw *adapter, u8 cmd, u8 *addr, u32 size) + } + + status = bl_cmd(adapter, cmd_req, cmd_resp, str); +- if (status) { +- bl_stop_cmd_timer(adapter); ++ if (status) + return status; +- } ++ + return 0; + } + +@@ -828,10 +828,9 @@ static int auto_fw_upgrade(struct rsi_hw *adapter, u8 *flash_content, + + status = bl_cmd(adapter, EOF_REACHED, FW_LOADING_SUCCESSFUL, + "EOF_REACHED"); +- if (status) { +- bl_stop_cmd_timer(adapter); ++ if (status) + return status; +- } ++ + rsi_dbg(INFO_ZONE, "FW loading is done and FW is running..\n"); + return 0; + } +@@ -849,6 +848,7 @@ static int rsi_hal_prepare_fwload(struct rsi_hw *adapter) + ®out_val, + RSI_COMMON_REG_SIZE); + if (status < 0) { ++ bl_stop_cmd_timer(adapter); + rsi_dbg(ERR_ZONE, + "%s: REGOUT read failed\n", __func__); + return status; +diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c +index 23a1d00b5f38..d6cdabef264d 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_usb.c ++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c +@@ -16,6 +16,7 @@ + */ + + #include ++#include + #include + #include "rsi_usb.h" + #include "rsi_hal.h" +@@ -29,7 +30,7 @@ MODULE_PARM_DESC(dev_oper_mode, + "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n" + "6[AP + BT classic], 14[AP + BT classic + BT LE]"); + +-static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num); ++static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t flags); + + /** + * rsi_usb_card_write() - This function writes to the USB Card. +@@ -117,7 +118,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface, + __le16 buffer_size; + int ii, bin_found = 0, bout_found = 0; + +- iface_desc = &(interface->altsetting[0]); ++ iface_desc = interface->cur_altsetting; + + for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) { + endpoint = &(iface_desc->endpoint[ii].desc); +@@ -285,20 +286,29 @@ static void rsi_rx_done_handler(struct urb *urb) + status = 0; + + out: +- if (rsi_rx_urb_submit(dev->priv, rx_cb->ep_num)) ++ if (rsi_rx_urb_submit(dev->priv, rx_cb->ep_num, GFP_ATOMIC)) + rsi_dbg(ERR_ZONE, "%s: Failed in urb submission", __func__); + + if (status) + dev_kfree_skb(rx_cb->rx_skb); + } + ++static void rsi_rx_urb_kill(struct rsi_hw *adapter, u8 ep_num) ++{ ++ struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; ++ struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1]; ++ struct urb *urb = rx_cb->rx_urb; ++ ++ usb_kill_urb(urb); ++} ++ + /** + * rsi_rx_urb_submit() - This function submits the given URB to the USB stack. + * @adapter: Pointer to the adapter structure. + * + * Return: 0 on success, a negative error code on failure. + */ +-static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num) ++static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t mem_flags) + { + struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; + struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1]; +@@ -328,9 +338,11 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num) + rsi_rx_done_handler, + rx_cb); + +- status = usb_submit_urb(urb, GFP_KERNEL); +- if (status) ++ status = usb_submit_urb(urb, mem_flags); ++ if (status) { + rsi_dbg(ERR_ZONE, "%s: Failed in urb submission\n", __func__); ++ dev_kfree_skb(skb); ++ } + + return status; + } +@@ -816,17 +828,20 @@ static int rsi_probe(struct usb_interface *pfunction, + rsi_dbg(INIT_ZONE, "%s: Device Init Done\n", __func__); + } + +- status = rsi_rx_urb_submit(adapter, WLAN_EP); ++ status = rsi_rx_urb_submit(adapter, WLAN_EP, GFP_KERNEL); + if (status) + goto err1; + + if (adapter->priv->coex_mode > 1) { +- status = rsi_rx_urb_submit(adapter, BT_EP); ++ status = rsi_rx_urb_submit(adapter, BT_EP, GFP_KERNEL); + if (status) +- goto err1; ++ goto err_kill_wlan_urb; + } + + return 0; ++ ++err_kill_wlan_urb: ++ rsi_rx_urb_kill(adapter, WLAN_EP); + err1: + rsi_deinit_usb_interface(adapter); + err: +@@ -857,6 +872,10 @@ static void rsi_disconnect(struct usb_interface *pfunction) + adapter->priv->bt_adapter = NULL; + } + ++ if (adapter->priv->coex_mode > 1) ++ rsi_rx_urb_kill(adapter, BT_EP); ++ rsi_rx_urb_kill(adapter, WLAN_EP); ++ + rsi_reset_card(adapter); + rsi_deinit_usb_interface(adapter); + rsi_91x_deinit(adapter); +diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c +index 7b5c2fe5bd4d..8ff0374126e4 100644 +--- a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c ++++ b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c +@@ -1263,7 +1263,7 @@ static void print_id(struct usb_device *udev) + static int eject_installer(struct usb_interface *intf) + { + struct usb_device *udev = interface_to_usbdev(intf); +- struct usb_host_interface *iface_desc = &intf->altsetting[0]; ++ struct usb_host_interface *iface_desc = intf->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c +index 1593b8494ebb..2f88b1ff7ada 100644 +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -4080,6 +4080,40 @@ static void quirk_mic_x200_dma_alias(struct pci_dev *pdev) + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2260, quirk_mic_x200_dma_alias); + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2264, quirk_mic_x200_dma_alias); + ++/* ++ * Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices ++ * exposing computational units via Non Transparent Bridges (NTB, PEX 87xx). ++ * ++ * Similarly to MIC x200, we need to add DMA aliases to allow buffer access ++ * when IOMMU is enabled. These aliases allow computational unit access to ++ * host memory. These aliases mark the whole VCA device as one IOMMU ++ * group. ++ * ++ * All possible slot numbers (0x20) are used, since we are unable to tell ++ * what slot is used on other side. This quirk is intended for both host ++ * and computational unit sides. The VCA devices have up to five functions ++ * (four for DMA channels and one additional). ++ */ ++static void quirk_pex_vca_alias(struct pci_dev *pdev) ++{ ++ const unsigned int num_pci_slots = 0x20; ++ unsigned int slot; ++ ++ for (slot = 0; slot < num_pci_slots; slot++) { ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x0)); ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x1)); ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x2)); ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x3)); ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x4)); ++ } ++} ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2954, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2955, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2956, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2958, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2959, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x295A, quirk_pex_vca_alias); ++ + /* + * The IOMMU and interrupt controller on Broadcom Vulcan/Cavium ThunderX2 are + * associated not at the root bus, but at a bridge below. This quirk avoids +diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c +index ce7345745b42..2a3966d059e7 100644 +--- a/drivers/perf/fsl_imx8_ddr_perf.c ++++ b/drivers/perf/fsl_imx8_ddr_perf.c +@@ -45,7 +45,8 @@ + static DEFINE_IDA(ddr_ida); + + /* DDR Perf hardware feature */ +-#define DDR_CAP_AXI_ID_FILTER 0x1 /* support AXI ID filter */ ++#define DDR_CAP_AXI_ID_FILTER 0x1 /* support AXI ID filter */ ++#define DDR_CAP_AXI_ID_FILTER_ENHANCED 0x3 /* support enhanced AXI ID filter */ + + struct fsl_ddr_devtype_data { + unsigned int quirks; /* quirks needed for different DDR Perf core */ +@@ -178,6 +179,36 @@ static const struct attribute_group *attr_groups[] = { + NULL, + }; + ++static bool ddr_perf_is_filtered(struct perf_event *event) ++{ ++ return event->attr.config == 0x41 || event->attr.config == 0x42; ++} ++ ++static u32 ddr_perf_filter_val(struct perf_event *event) ++{ ++ return event->attr.config1; ++} ++ ++static bool ddr_perf_filters_compatible(struct perf_event *a, ++ struct perf_event *b) ++{ ++ if (!ddr_perf_is_filtered(a)) ++ return true; ++ if (!ddr_perf_is_filtered(b)) ++ return true; ++ return ddr_perf_filter_val(a) == ddr_perf_filter_val(b); ++} ++ ++static bool ddr_perf_is_enhanced_filtered(struct perf_event *event) ++{ ++ unsigned int filt; ++ struct ddr_pmu *pmu = to_ddr_pmu(event->pmu); ++ ++ filt = pmu->devtype_data->quirks & DDR_CAP_AXI_ID_FILTER_ENHANCED; ++ return (filt == DDR_CAP_AXI_ID_FILTER_ENHANCED) && ++ ddr_perf_is_filtered(event); ++} ++ + static u32 ddr_perf_alloc_counter(struct ddr_pmu *pmu, int event) + { + int i; +@@ -209,27 +240,17 @@ static void ddr_perf_free_counter(struct ddr_pmu *pmu, int counter) + + static u32 ddr_perf_read_counter(struct ddr_pmu *pmu, int counter) + { +- return readl_relaxed(pmu->base + COUNTER_READ + counter * 4); +-} +- +-static bool ddr_perf_is_filtered(struct perf_event *event) +-{ +- return event->attr.config == 0x41 || event->attr.config == 0x42; +-} ++ struct perf_event *event = pmu->events[counter]; ++ void __iomem *base = pmu->base; + +-static u32 ddr_perf_filter_val(struct perf_event *event) +-{ +- return event->attr.config1; +-} +- +-static bool ddr_perf_filters_compatible(struct perf_event *a, +- struct perf_event *b) +-{ +- if (!ddr_perf_is_filtered(a)) +- return true; +- if (!ddr_perf_is_filtered(b)) +- return true; +- return ddr_perf_filter_val(a) == ddr_perf_filter_val(b); ++ /* ++ * return bytes instead of bursts from ddr transaction for ++ * axid-read and axid-write event if PMU core supports enhanced ++ * filter. ++ */ ++ base += ddr_perf_is_enhanced_filtered(event) ? COUNTER_DPCR1 : ++ COUNTER_READ; ++ return readl_relaxed(base + counter * 4); + } + + static int ddr_perf_event_init(struct perf_event *event) +diff --git a/drivers/phy/motorola/phy-cpcap-usb.c b/drivers/phy/motorola/phy-cpcap-usb.c +index 9a38741d3546..5baf64dfb24d 100644 +--- a/drivers/phy/motorola/phy-cpcap-usb.c ++++ b/drivers/phy/motorola/phy-cpcap-usb.c +@@ -115,7 +115,7 @@ struct cpcap_usb_ints_state { + enum cpcap_gpio_mode { + CPCAP_DM_DP, + CPCAP_MDM_RX_TX, +- CPCAP_UNKNOWN, ++ CPCAP_UNKNOWN_DISABLED, /* Seems to disable USB lines */ + CPCAP_OTG_DM_DP, + }; + +@@ -381,7 +381,8 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) + { + int error; + +- error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); ++ /* Disable lines to prevent glitches from waking up mdm6600 */ ++ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); + if (error) + goto out_err; + +@@ -408,6 +409,11 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) + if (error) + goto out_err; + ++ /* Enable UART mode */ ++ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); ++ if (error) ++ goto out_err; ++ + return 0; + + out_err: +@@ -420,7 +426,8 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) + { + int error; + +- error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); ++ /* Disable lines to prevent glitches from waking up mdm6600 */ ++ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); + if (error) + return error; + +@@ -460,6 +467,11 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) + if (error) + goto out_err; + ++ /* Enable USB mode */ ++ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); ++ if (error) ++ goto out_err; ++ + return 0; + + out_err: +diff --git a/drivers/phy/qualcomm/phy-qcom-qmp.c b/drivers/phy/qualcomm/phy-qcom-qmp.c +index 39e8deb8001e..27dd20a7fe13 100644 +--- a/drivers/phy/qualcomm/phy-qcom-qmp.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp.c +@@ -66,7 +66,7 @@ + /* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */ + #define CLAMP_EN BIT(0) /* enables i/o clamp_n */ + +-#define PHY_INIT_COMPLETE_TIMEOUT 1000 ++#define PHY_INIT_COMPLETE_TIMEOUT 10000 + #define POWER_DOWN_DELAY_US_MIN 10 + #define POWER_DOWN_DELAY_US_MAX 11 + +diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c +index d27be2836bc2..74e988f839e8 100644 +--- a/drivers/platform/x86/dell-laptop.c ++++ b/drivers/platform/x86/dell-laptop.c +@@ -33,6 +33,7 @@ + + struct quirk_entry { + bool touchpad_led; ++ bool kbd_led_not_present; + bool kbd_led_levels_off_1; + bool kbd_missing_ac_tag; + +@@ -73,6 +74,10 @@ static struct quirk_entry quirk_dell_latitude_e6410 = { + .kbd_led_levels_off_1 = true, + }; + ++static struct quirk_entry quirk_dell_inspiron_1012 = { ++ .kbd_led_not_present = true, ++}; ++ + static struct platform_driver platform_driver = { + .driver = { + .name = "dell-laptop", +@@ -310,6 +315,24 @@ static const struct dmi_system_id dell_quirks[] __initconst = { + }, + .driver_data = &quirk_dell_latitude_e6410, + }, ++ { ++ .callback = dmi_matched, ++ .ident = "Dell Inspiron 1012", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"), ++ }, ++ .driver_data = &quirk_dell_inspiron_1012, ++ }, ++ { ++ .callback = dmi_matched, ++ .ident = "Dell Inspiron 1018", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1018"), ++ }, ++ .driver_data = &quirk_dell_inspiron_1012, ++ }, + { } + }; + +@@ -1493,6 +1516,9 @@ static void kbd_init(void) + { + int ret; + ++ if (quirks && quirks->kbd_led_not_present) ++ return; ++ + ret = kbd_init_info(); + kbd_init_tokens(); + +diff --git a/drivers/power/supply/ingenic-battery.c b/drivers/power/supply/ingenic-battery.c +index 35816d4b3012..2748715c4c75 100644 +--- a/drivers/power/supply/ingenic-battery.c ++++ b/drivers/power/supply/ingenic-battery.c +@@ -100,10 +100,17 @@ static int ingenic_battery_set_scale(struct ingenic_battery *bat) + return -EINVAL; + } + +- return iio_write_channel_attribute(bat->channel, +- scale_raw[best_idx], +- scale_raw[best_idx + 1], +- IIO_CHAN_INFO_SCALE); ++ /* Only set scale if there is more than one (fractional) entry */ ++ if (scale_len > 2) { ++ ret = iio_write_channel_attribute(bat->channel, ++ scale_raw[best_idx], ++ scale_raw[best_idx + 1], ++ IIO_CHAN_INFO_SCALE); ++ if (ret) ++ return ret; ++ } ++ ++ return 0; + } + + static enum power_supply_property ingenic_battery_properties[] = { +diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c +index 45972056ed8c..11cac7e10663 100644 +--- a/drivers/spi/spi-dw.c ++++ b/drivers/spi/spi-dw.c +@@ -172,9 +172,11 @@ static inline u32 rx_max(struct dw_spi *dws) + + static void dw_writer(struct dw_spi *dws) + { +- u32 max = tx_max(dws); ++ u32 max; + u16 txw = 0; + ++ spin_lock(&dws->buf_lock); ++ max = tx_max(dws); + while (max--) { + /* Set the tx word if the transfer's original "tx" is not null */ + if (dws->tx_end - dws->len) { +@@ -186,13 +188,16 @@ static void dw_writer(struct dw_spi *dws) + dw_write_io_reg(dws, DW_SPI_DR, txw); + dws->tx += dws->n_bytes; + } ++ spin_unlock(&dws->buf_lock); + } + + static void dw_reader(struct dw_spi *dws) + { +- u32 max = rx_max(dws); ++ u32 max; + u16 rxw; + ++ spin_lock(&dws->buf_lock); ++ max = rx_max(dws); + while (max--) { + rxw = dw_read_io_reg(dws, DW_SPI_DR); + /* Care rx only if the transfer's original "rx" is not null */ +@@ -204,6 +209,7 @@ static void dw_reader(struct dw_spi *dws) + } + dws->rx += dws->n_bytes; + } ++ spin_unlock(&dws->buf_lock); + } + + static void int_error_stop(struct dw_spi *dws, const char *msg) +@@ -276,18 +282,20 @@ static int dw_spi_transfer_one(struct spi_controller *master, + { + struct dw_spi *dws = spi_controller_get_devdata(master); + struct chip_data *chip = spi_get_ctldata(spi); ++ unsigned long flags; + u8 imask = 0; + u16 txlevel = 0; + u32 cr0; + int ret; + + dws->dma_mapped = 0; +- ++ spin_lock_irqsave(&dws->buf_lock, flags); + dws->tx = (void *)transfer->tx_buf; + dws->tx_end = dws->tx + transfer->len; + dws->rx = transfer->rx_buf; + dws->rx_end = dws->rx + transfer->len; + dws->len = transfer->len; ++ spin_unlock_irqrestore(&dws->buf_lock, flags); + + spi_enable_chip(dws, 0); + +@@ -471,6 +479,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) + dws->type = SSI_MOTO_SPI; + dws->dma_inited = 0; + dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR); ++ spin_lock_init(&dws->buf_lock); + + spi_controller_set_devdata(master, dws); + +diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h +index c9c15881e982..f3a2f157a2b1 100644 +--- a/drivers/spi/spi-dw.h ++++ b/drivers/spi/spi-dw.h +@@ -120,6 +120,7 @@ struct dw_spi { + size_t len; + void *tx; + void *tx_end; ++ spinlock_t buf_lock; + void *rx; + void *rx_end; + int dma_mapped; +diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c +index 9f92165fe09f..2fd843b18297 100644 +--- a/drivers/spi/spi-pxa2xx.c ++++ b/drivers/spi/spi-pxa2xx.c +@@ -1461,6 +1461,10 @@ static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = { + { PCI_VDEVICE(INTEL, 0x02aa), LPSS_CNL_SSP }, + { PCI_VDEVICE(INTEL, 0x02ab), LPSS_CNL_SSP }, + { PCI_VDEVICE(INTEL, 0x02fb), LPSS_CNL_SSP }, ++ /* CML-H */ ++ { PCI_VDEVICE(INTEL, 0x06aa), LPSS_CNL_SSP }, ++ { PCI_VDEVICE(INTEL, 0x06ab), LPSS_CNL_SSP }, ++ { PCI_VDEVICE(INTEL, 0x06fb), LPSS_CNL_SSP }, + /* TGL-LP */ + { PCI_VDEVICE(INTEL, 0xa0aa), LPSS_CNL_SSP }, + { PCI_VDEVICE(INTEL, 0xa0ab), LPSS_CNL_SSP }, +diff --git a/drivers/staging/most/net/net.c b/drivers/staging/most/net/net.c +index 26a31854c636..c48956f0ef29 100644 +--- a/drivers/staging/most/net/net.c ++++ b/drivers/staging/most/net/net.c +@@ -81,6 +81,11 @@ static int skb_to_mamac(const struct sk_buff *skb, struct mbo *mbo) + unsigned int payload_len = skb->len - ETH_HLEN; + unsigned int mdp_len = payload_len + MDP_HDR_LEN; + ++ if (mdp_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mdp_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mdp_len); +@@ -128,6 +133,11 @@ static int skb_to_mep(const struct sk_buff *skb, struct mbo *mbo) + u8 *buff = mbo->virt_address; + unsigned int mep_len = skb->len + MEP_HDR_LEN; + ++ if (mep_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mep_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mep_len); +diff --git a/drivers/staging/mt7621-pci/pci-mt7621.c b/drivers/staging/mt7621-pci/pci-mt7621.c +index 6b98827da57f..3633c924848e 100644 +--- a/drivers/staging/mt7621-pci/pci-mt7621.c ++++ b/drivers/staging/mt7621-pci/pci-mt7621.c +@@ -29,15 +29,14 @@ + #include + #include + #include ++#include + #include + #include + + #include "../../pci/pci.h" + + /* sysctl */ +-#define MT7621_CHIP_REV_ID 0x0c + #define MT7621_GPIO_MODE 0x60 +-#define CHIP_REV_MT7621_E2 0x0101 + + /* MediaTek specific configuration registers */ + #define PCIE_FTS_NUM 0x70c +@@ -126,6 +125,8 @@ struct mt7621_pcie_port { + * @ports: pointer to PCIe port information + * @perst: gpio reset + * @rst: pointer to pcie reset ++ * @resets_inverted: depends on chip revision ++ * reset lines are inverted. + */ + struct mt7621_pcie { + void __iomem *base; +@@ -140,6 +141,7 @@ struct mt7621_pcie { + struct list_head ports; + struct gpio_desc *perst; + struct reset_control *rst; ++ bool resets_inverted; + }; + + static inline u32 pcie_read(struct mt7621_pcie *pcie, u32 reg) +@@ -229,9 +231,9 @@ static inline void mt7621_pcie_port_clk_disable(struct mt7621_pcie_port *port) + + static inline void mt7621_control_assert(struct mt7621_pcie_port *port) + { +- u32 chip_rev_id = rt_sysc_r32(MT7621_CHIP_REV_ID); ++ struct mt7621_pcie *pcie = port->pcie; + +- if ((chip_rev_id & 0xFFFF) == CHIP_REV_MT7621_E2) ++ if (pcie->resets_inverted) + reset_control_assert(port->pcie_rst); + else + reset_control_deassert(port->pcie_rst); +@@ -239,9 +241,9 @@ static inline void mt7621_control_assert(struct mt7621_pcie_port *port) + + static inline void mt7621_control_deassert(struct mt7621_pcie_port *port) + { +- u32 chip_rev_id = rt_sysc_r32(MT7621_CHIP_REV_ID); ++ struct mt7621_pcie *pcie = port->pcie; + +- if ((chip_rev_id & 0xFFFF) == CHIP_REV_MT7621_E2) ++ if (pcie->resets_inverted) + reset_control_deassert(port->pcie_rst); + else + reset_control_assert(port->pcie_rst); +@@ -641,9 +643,14 @@ static int mt7621_pcie_register_host(struct pci_host_bridge *host, + return pci_host_probe(host); + } + ++static const struct soc_device_attribute mt7621_pci_quirks_match[] = { ++ { .soc_id = "mt7621", .revision = "E2" } ++}; ++ + static int mt7621_pci_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; ++ const struct soc_device_attribute *attr; + struct mt7621_pcie *pcie; + struct pci_host_bridge *bridge; + int err; +@@ -661,6 +668,10 @@ static int mt7621_pci_probe(struct platform_device *pdev) + platform_set_drvdata(pdev, pcie); + INIT_LIST_HEAD(&pcie->ports); + ++ attr = soc_device_match(mt7621_pci_quirks_match); ++ if (attr) ++ pcie->resets_inverted = true; ++ + err = mt7621_pcie_parse_dt(pcie); + if (err) { + dev_err(dev, "Parsing DT failed\n"); +diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h +index 50e1c8918040..e2fabe818b19 100644 +--- a/drivers/staging/vt6656/device.h ++++ b/drivers/staging/vt6656/device.h +@@ -52,6 +52,8 @@ + #define RATE_AUTO 12 + + #define MAX_RATE 12 ++#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ ++ BIT(RATE_5M) | BIT(RATE_11M)) + + /* + * device specific +diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c +index f40947955675..af215860be4c 100644 +--- a/drivers/staging/vt6656/int.c ++++ b/drivers/staging/vt6656/int.c +@@ -99,9 +99,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) + + info->status.rates[0].count = tx_retry; + +- if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) { ++ if (!(tsr & TSR_TMO)) { + info->status.rates[0].idx = idx; +- info->flags |= IEEE80211_TX_STAT_ACK; ++ ++ if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) ++ info->flags |= IEEE80211_TX_STAT_ACK; + } + + ieee80211_tx_status_irqsafe(priv->hw, context->skb); +diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c +index c26882e2bb80..69a48383611f 100644 +--- a/drivers/staging/vt6656/main_usb.c ++++ b/drivers/staging/vt6656/main_usb.c +@@ -1016,6 +1016,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); + ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); + ieee80211_hw_set(priv->hw, SUPPORTS_PS); ++ ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK); + + priv->hw->max_signal = 100; + +diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c +index 4e9cfacf75f2..ab6141f361af 100644 +--- a/drivers/staging/vt6656/rxtx.c ++++ b/drivers/staging/vt6656/rxtx.c +@@ -278,11 +278,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context, + PK_TYPE_11B, &buf->b); + + /* Get Duration and TimeStamp */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration_a = dur; +- buf->duration_b = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration_a = hdr->duration_id; ++ buf->duration_b = hdr->duration_id; + } else { + buf->duration_a = vnt_get_duration_le(priv, + tx_context->pkt_type, need_ack); +@@ -371,10 +369,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context, + tx_context->pkt_type, &buf->ab); + + /* Get Duration and TimeStampOff */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration = hdr->duration_id; + } else { + buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); +@@ -815,10 +811,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) + if (info->band == NL80211_BAND_5GHZ) { + pkt_type = PK_TYPE_11A; + } else { +- if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) +- pkt_type = PK_TYPE_11GB; +- else +- pkt_type = PK_TYPE_11GA; ++ if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { ++ if (priv->basic_rates & VNT_B_RATES) ++ pkt_type = PK_TYPE_11GB; ++ else ++ pkt_type = PK_TYPE_11GA; ++ } else { ++ pkt_type = PK_TYPE_11A; ++ } + } + } else { + pkt_type = PK_TYPE_11B; +diff --git a/drivers/staging/wlan-ng/prism2mgmt.c b/drivers/staging/wlan-ng/prism2mgmt.c +index 7350fe5d96a3..a8860d2aee68 100644 +--- a/drivers/staging/wlan-ng/prism2mgmt.c ++++ b/drivers/staging/wlan-ng/prism2mgmt.c +@@ -959,7 +959,7 @@ int prism2mgmt_flashdl_state(struct wlandevice *wlandev, void *msgp) + } + } + +- return 0; ++ return result; + } + + /*---------------------------------------------------------------- +diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c b/drivers/tty/serial/8250/8250_bcm2835aux.c +index 8ce700c1a7fc..4997c519ebb3 100644 +--- a/drivers/tty/serial/8250/8250_bcm2835aux.c ++++ b/drivers/tty/serial/8250/8250_bcm2835aux.c +@@ -113,7 +113,7 @@ static int bcm2835aux_serial_remove(struct platform_device *pdev) + { + struct bcm2835aux_data *data = platform_get_drvdata(pdev); + +- serial8250_unregister_port(data->uart.port.line); ++ serial8250_unregister_port(data->line); + clk_disable_unprepare(data->clk); + + return 0; +diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c +index 34f602c3a882..9d8c660dc289 100644 +--- a/drivers/tty/serial/imx.c ++++ b/drivers/tty/serial/imx.c +@@ -700,22 +700,33 @@ static void imx_uart_start_tx(struct uart_port *port) + } + } + +-static irqreturn_t imx_uart_rtsint(int irq, void *dev_id) ++static irqreturn_t __imx_uart_rtsint(int irq, void *dev_id) + { + struct imx_port *sport = dev_id; + u32 usr1; + +- spin_lock(&sport->port.lock); +- + imx_uart_writel(sport, USR1_RTSD, USR1); + usr1 = imx_uart_readl(sport, USR1) & USR1_RTSS; + uart_handle_cts_change(&sport->port, !!usr1); + wake_up_interruptible(&sport->port.state->port.delta_msr_wait); + +- spin_unlock(&sport->port.lock); + return IRQ_HANDLED; + } + ++static irqreturn_t imx_uart_rtsint(int irq, void *dev_id) ++{ ++ struct imx_port *sport = dev_id; ++ irqreturn_t ret; ++ ++ spin_lock(&sport->port.lock); ++ ++ ret = __imx_uart_rtsint(irq, dev_id); ++ ++ spin_unlock(&sport->port.lock); ++ ++ return ret; ++} ++ + static irqreturn_t imx_uart_txint(int irq, void *dev_id) + { + struct imx_port *sport = dev_id; +@@ -726,14 +737,12 @@ static irqreturn_t imx_uart_txint(int irq, void *dev_id) + return IRQ_HANDLED; + } + +-static irqreturn_t imx_uart_rxint(int irq, void *dev_id) ++static irqreturn_t __imx_uart_rxint(int irq, void *dev_id) + { + struct imx_port *sport = dev_id; + unsigned int rx, flg, ignored = 0; + struct tty_port *port = &sport->port.state->port; + +- spin_lock(&sport->port.lock); +- + while (imx_uart_readl(sport, USR2) & USR2_RDR) { + u32 usr2; + +@@ -792,11 +801,25 @@ static irqreturn_t imx_uart_rxint(int irq, void *dev_id) + } + + out: +- spin_unlock(&sport->port.lock); + tty_flip_buffer_push(port); ++ + return IRQ_HANDLED; + } + ++static irqreturn_t imx_uart_rxint(int irq, void *dev_id) ++{ ++ struct imx_port *sport = dev_id; ++ irqreturn_t ret; ++ ++ spin_lock(&sport->port.lock); ++ ++ ret = __imx_uart_rxint(irq, dev_id); ++ ++ spin_unlock(&sport->port.lock); ++ ++ return ret; ++} ++ + static void imx_uart_clear_rx_errors(struct imx_port *sport); + + /* +@@ -855,6 +878,8 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) + unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4; + irqreturn_t ret = IRQ_NONE; + ++ spin_lock(&sport->port.lock); ++ + usr1 = imx_uart_readl(sport, USR1); + usr2 = imx_uart_readl(sport, USR2); + ucr1 = imx_uart_readl(sport, UCR1); +@@ -888,27 +913,25 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) + usr2 &= ~USR2_ORE; + + if (usr1 & (USR1_RRDY | USR1_AGTIM)) { +- imx_uart_rxint(irq, dev_id); ++ __imx_uart_rxint(irq, dev_id); + ret = IRQ_HANDLED; + } + + if ((usr1 & USR1_TRDY) || (usr2 & USR2_TXDC)) { +- imx_uart_txint(irq, dev_id); ++ imx_uart_transmit_buffer(sport); + ret = IRQ_HANDLED; + } + + if (usr1 & USR1_DTRD) { + imx_uart_writel(sport, USR1_DTRD, USR1); + +- spin_lock(&sport->port.lock); + imx_uart_mctrl_check(sport); +- spin_unlock(&sport->port.lock); + + ret = IRQ_HANDLED; + } + + if (usr1 & USR1_RTSD) { +- imx_uart_rtsint(irq, dev_id); ++ __imx_uart_rtsint(irq, dev_id); + ret = IRQ_HANDLED; + } + +@@ -923,6 +946,8 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) + ret = IRQ_HANDLED; + } + ++ spin_unlock(&sport->port.lock); ++ + return ret; + } + +diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c +index 97d6ae3c4df2..cede7a8e3605 100644 +--- a/drivers/usb/dwc3/core.c ++++ b/drivers/usb/dwc3/core.c +@@ -1209,6 +1209,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) + /* do nothing */ + break; + } ++ ++ /* de-assert DRVVBUS for HOST and OTG mode */ ++ dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE); + } + + static void dwc3_get_properties(struct dwc3 *dwc) +diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c +index 294276f7deb9..7051611229c9 100644 +--- a/drivers/usb/dwc3/dwc3-pci.c ++++ b/drivers/usb/dwc3/dwc3-pci.c +@@ -34,6 +34,7 @@ + #define PCI_DEVICE_ID_INTEL_GLK 0x31aa + #define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee + #define PCI_DEVICE_ID_INTEL_CNPH 0xa36e ++#define PCI_DEVICE_ID_INTEL_CNPV 0xa3b0 + #define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee + #define PCI_DEVICE_ID_INTEL_EHLLP 0x4b7e + #define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee +@@ -342,6 +343,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = { + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPH), + (kernel_ulong_t) &dwc3_pci_intel_properties, }, + ++ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPV), ++ (kernel_ulong_t) &dwc3_pci_intel_properties, }, ++ + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICLLP), + (kernel_ulong_t) &dwc3_pci_intel_properties, }, + +diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c +index dc172513a4aa..b8e24ccba9f3 100644 +--- a/drivers/usb/host/xhci-tegra.c ++++ b/drivers/usb/host/xhci-tegra.c +@@ -1413,6 +1413,7 @@ MODULE_FIRMWARE("nvidia/tegra210/xusb.bin"); + + static const char * const tegra186_supply_names[] = { + }; ++MODULE_FIRMWARE("nvidia/tegra186/xusb.bin"); + + static const struct tegra_xusb_phy_type tegra186_phy_types[] = { + { .name = "usb3", .num = 3, }, +diff --git a/drivers/usb/musb/jz4740.c b/drivers/usb/musb/jz4740.c +index 5261f8dfedec..e3b8c84ccdb8 100644 +--- a/drivers/usb/musb/jz4740.c ++++ b/drivers/usb/musb/jz4740.c +@@ -75,14 +75,17 @@ static struct musb_hdrc_platform_data jz4740_musb_platform_data = { + static int jz4740_musb_init(struct musb *musb) + { + struct device *dev = musb->controller->parent; ++ int err; + + if (dev->of_node) + musb->xceiv = devm_usb_get_phy_by_phandle(dev, "phys", 0); + else + musb->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); + if (IS_ERR(musb->xceiv)) { +- dev_err(dev, "No transceiver configured\n"); +- return PTR_ERR(musb->xceiv); ++ err = PTR_ERR(musb->xceiv); ++ if (err != -EPROBE_DEFER) ++ dev_err(dev, "No transceiver configured: %d", err); ++ return err; + } + + /* Silicon does not implement ConfigData register. +diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c +index 302eb9530859..627bea7e6cfb 100644 +--- a/drivers/usb/serial/ir-usb.c ++++ b/drivers/usb/serial/ir-usb.c +@@ -45,9 +45,10 @@ static int buffer_size; + static int xbof = -1; + + static int ir_startup (struct usb_serial *serial); +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port); +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size); ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count); ++static int ir_write_room(struct tty_struct *tty); ++static void ir_write_bulk_callback(struct urb *urb); + static void ir_process_read_urb(struct urb *urb); + static void ir_set_termios(struct tty_struct *tty, + struct usb_serial_port *port, struct ktermios *old_termios); +@@ -77,8 +78,9 @@ static struct usb_serial_driver ir_device = { + .num_ports = 1, + .set_termios = ir_set_termios, + .attach = ir_startup, +- .open = ir_open, +- .prepare_write_buffer = ir_prepare_write_buffer, ++ .write = ir_write, ++ .write_room = ir_write_room, ++ .write_bulk_callback = ir_write_bulk_callback, + .process_read_urb = ir_process_read_urb, + }; + +@@ -195,6 +197,9 @@ static int ir_startup(struct usb_serial *serial) + struct usb_irda_cs_descriptor *irda_desc; + int rates; + ++ if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1) ++ return -ENODEV; ++ + irda_desc = irda_usb_find_class_desc(serial, 0); + if (!irda_desc) { + dev_err(&serial->dev->dev, +@@ -251,35 +256,102 @@ static int ir_startup(struct usb_serial *serial) + return 0; + } + +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port) ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count) + { +- int i; ++ struct urb *urb = NULL; ++ unsigned long flags; ++ int ret; + +- for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) +- port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET; ++ if (port->bulk_out_size == 0) ++ return -EINVAL; + +- /* Start reading from the device */ +- return usb_serial_generic_open(tty, port); +-} ++ if (count == 0) ++ return 0; + +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size) +-{ +- unsigned char *buf = dest; +- int count; ++ count = min(count, port->bulk_out_size - 1); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ if (__test_and_clear_bit(0, &port->write_urbs_free)) { ++ urb = port->write_urbs[0]; ++ port->tx_bytes += count; ++ } ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ if (!urb) ++ return 0; + + /* + * The first byte of the packet we send to the device contains an +- * inbound header which indicates an additional number of BOFs and ++ * outbound header which indicates an additional number of BOFs and + * a baud rate change. + * + * See section 5.4.2.2 of the USB IrDA spec. + */ +- *buf = ir_xbof | ir_baud; ++ *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud; ++ ++ memcpy(urb->transfer_buffer + 1, buf, count); ++ ++ urb->transfer_buffer_length = count + 1; ++ urb->transfer_flags = URB_ZERO_PACKET; ++ ++ ret = usb_submit_urb(urb, GFP_ATOMIC); ++ if (ret) { ++ dev_err(&port->dev, "failed to submit write urb: %d\n", ret); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= count; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ return ret; ++ } ++ ++ return count; ++} ++ ++static void ir_write_bulk_callback(struct urb *urb) ++{ ++ struct usb_serial_port *port = urb->context; ++ int status = urb->status; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= urb->transfer_buffer_length - 1; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ switch (status) { ++ case 0: ++ break; ++ case -ENOENT: ++ case -ECONNRESET: ++ case -ESHUTDOWN: ++ dev_dbg(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ case -EPIPE: ++ dev_err(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ default: ++ dev_err(&port->dev, "nonzero write-urb status: %d\n", status); ++ break; ++ } ++ ++ usb_serial_port_softint(port); ++} ++ ++static int ir_write_room(struct tty_struct *tty) ++{ ++ struct usb_serial_port *port = tty->driver_data; ++ int count = 0; ++ ++ if (port->bulk_out_size == 0) ++ return 0; ++ ++ if (test_bit(0, &port->write_urbs_free)) ++ count = port->bulk_out_size - 1; + +- count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1, +- &port->lock); +- return count + 1; ++ return count; + } + + static void ir_process_read_urb(struct urb *urb) +@@ -332,34 +404,34 @@ static void ir_set_termios(struct tty_struct *tty, + + switch (baud) { + case 2400: +- ir_baud = USB_IRDA_BR_2400; ++ ir_baud = USB_IRDA_LS_2400; + break; + case 9600: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + break; + case 19200: +- ir_baud = USB_IRDA_BR_19200; ++ ir_baud = USB_IRDA_LS_19200; + break; + case 38400: +- ir_baud = USB_IRDA_BR_38400; ++ ir_baud = USB_IRDA_LS_38400; + break; + case 57600: +- ir_baud = USB_IRDA_BR_57600; ++ ir_baud = USB_IRDA_LS_57600; + break; + case 115200: +- ir_baud = USB_IRDA_BR_115200; ++ ir_baud = USB_IRDA_LS_115200; + break; + case 576000: +- ir_baud = USB_IRDA_BR_576000; ++ ir_baud = USB_IRDA_LS_576000; + break; + case 1152000: +- ir_baud = USB_IRDA_BR_1152000; ++ ir_baud = USB_IRDA_LS_1152000; + break; + case 4000000: +- ir_baud = USB_IRDA_BR_4000000; ++ ir_baud = USB_IRDA_LS_4000000; + break; + default: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + baud = 9600; + } + +diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h +index d0bdebd87ce3..1b23741036ee 100644 +--- a/drivers/usb/storage/unusual_uas.h ++++ b/drivers/usb/storage/unusual_uas.h +@@ -87,12 +87,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999, + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_IGNORE_UAS), + +-/* Reported-by: Takeo Nakayama */ ++/* ++ * Initially Reported-by: Takeo Nakayama ++ * UAS Ignore Reported by Steven Ellis ++ */ + UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, + "JMicron", + "JMS566", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, +- US_FL_NO_REPORT_OPCODES), ++ US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS), + + /* Reported-by: Hans de Goede */ + UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, +diff --git a/drivers/usb/typec/tcpm/fusb302.c b/drivers/usb/typec/tcpm/fusb302.c +index ed8655c6af8c..b498960ff72b 100644 +--- a/drivers/usb/typec/tcpm/fusb302.c ++++ b/drivers/usb/typec/tcpm/fusb302.c +@@ -1666,7 +1666,7 @@ static const struct property_entry port_props[] = { + PROPERTY_ENTRY_STRING("try-power-role", "sink"), + PROPERTY_ENTRY_U32_ARRAY("source-pdos", src_pdo), + PROPERTY_ENTRY_U32_ARRAY("sink-pdos", snk_pdo), +- PROPERTY_ENTRY_U32("op-sink-microwatt", 2500), ++ PROPERTY_ENTRY_U32("op-sink-microwatt", 2500000), + { } + }; + +diff --git a/drivers/usb/typec/tcpm/wcove.c b/drivers/usb/typec/tcpm/wcove.c +index edc271da14f4..9b745f432c91 100644 +--- a/drivers/usb/typec/tcpm/wcove.c ++++ b/drivers/usb/typec/tcpm/wcove.c +@@ -597,7 +597,7 @@ static const struct property_entry wcove_props[] = { + PROPERTY_ENTRY_STRING("try-power-role", "sink"), + PROPERTY_ENTRY_U32_ARRAY("source-pdos", src_pdo), + PROPERTY_ENTRY_U32_ARRAY("sink-pdos", snk_pdo), +- PROPERTY_ENTRY_U32("op-sink-microwatt", 15000), ++ PROPERTY_ENTRY_U32("op-sink-microwatt", 15000000), + { } + }; + +diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig +index 4c761abc5688..e2745f686196 100644 +--- a/drivers/watchdog/Kconfig ++++ b/drivers/watchdog/Kconfig +@@ -687,6 +687,7 @@ config MAX63XX_WATCHDOG + config MAX77620_WATCHDOG + tristate "Maxim Max77620 Watchdog Timer" + depends on MFD_MAX77620 || COMPILE_TEST ++ select WATCHDOG_CORE + help + This is the driver for the Max77620 watchdog timer. + Say 'Y' here to enable the watchdog timer support for +diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c +index 1cccf8eb1c5d..8e6dfe76f9c9 100644 +--- a/drivers/watchdog/orion_wdt.c ++++ b/drivers/watchdog/orion_wdt.c +@@ -602,7 +602,7 @@ static int orion_wdt_probe(struct platform_device *pdev) + set_bit(WDOG_HW_RUNNING, &dev->wdt.status); + + /* Request the IRQ only after the watchdog is disabled */ +- irq = platform_get_irq(pdev, 0); ++ irq = platform_get_irq_optional(pdev, 0); + if (irq > 0) { + /* + * Not all supported platforms specify an interrupt for the +@@ -617,7 +617,7 @@ static int orion_wdt_probe(struct platform_device *pdev) + } + + /* Optional 2nd interrupt for pretimeout */ +- irq = platform_get_irq(pdev, 1); ++ irq = platform_get_irq_optional(pdev, 1); + if (irq > 0) { + orion_wdt_info.options |= WDIOF_PRETIMEOUT; + ret = devm_request_irq(&pdev->dev, irq, orion_wdt_pre_irq, +diff --git a/drivers/watchdog/rn5t618_wdt.c b/drivers/watchdog/rn5t618_wdt.c +index 234876047431..6e524c8e26a8 100644 +--- a/drivers/watchdog/rn5t618_wdt.c ++++ b/drivers/watchdog/rn5t618_wdt.c +@@ -188,6 +188,7 @@ static struct platform_driver rn5t618_wdt_driver = { + + module_platform_driver(rn5t618_wdt_driver); + ++MODULE_ALIAS("platform:rn5t618-wdt"); + MODULE_AUTHOR("Beniamino Galvani "); + MODULE_DESCRIPTION("RN5T618 watchdog driver"); + MODULE_LICENSE("GPL v2"); +diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h +index f55e53486e74..53611d7e9d28 100644 +--- a/fs/cifs/cifsglob.h ++++ b/fs/cifs/cifsglob.h +@@ -1538,6 +1538,7 @@ struct mid_q_entry { + mid_callback_t *callback; /* call completion callback */ + mid_handle_t *handle; /* call handle mid callback */ + void *callback_data; /* general purpose pointer for callback */ ++ struct task_struct *creator; + void *resp_buf; /* pointer to received SMB header */ + unsigned int resp_buf_size; + int mid_state; /* wish this were enum but can not pass to wait_event */ +diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c +index 766974fe637a..14265b4bbcc0 100644 +--- a/fs/cifs/smb2misc.c ++++ b/fs/cifs/smb2misc.c +@@ -750,7 +750,7 @@ __smb2_handle_cancelled_close(struct cifs_tcon *tcon, __u64 persistent_fid, + { + struct close_cancelled_open *cancelled; + +- cancelled = kzalloc(sizeof(*cancelled), GFP_KERNEL); ++ cancelled = kzalloc(sizeof(*cancelled), GFP_ATOMIC); + if (!cancelled) + return -ENOMEM; + +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index b5c1cba3e6a1..662256fa2a18 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -1461,7 +1461,9 @@ smb2_ioctl_query_info(const unsigned int xid, + COMPOUND_FID, COMPOUND_FID, + qi.info_type, true, buffer, + qi.output_buffer_length, +- CIFSMaxBufSize); ++ CIFSMaxBufSize - ++ MAX_SMB2_CREATE_RESPONSE_SIZE - ++ MAX_SMB2_CLOSE_RESPONSE_SIZE); + } + } else if (qi.flags == PASSTHRU_SET_INFO) { + /* Can eventually relax perm check since server enforces too */ +@@ -2634,7 +2636,10 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, + + rc = SMB2_ioctl_init(tcon, &rqst[1], fid.persistent_fid, + fid.volatile_fid, FSCTL_GET_REPARSE_POINT, +- true /* is_fctl */, NULL, 0, CIFSMaxBufSize); ++ true /* is_fctl */, NULL, 0, ++ CIFSMaxBufSize - ++ MAX_SMB2_CREATE_RESPONSE_SIZE - ++ MAX_SMB2_CLOSE_RESPONSE_SIZE); + if (rc) + goto querty_exit; + +diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c +index 148d7942c796..805652969065 100644 +--- a/fs/cifs/smb2transport.c ++++ b/fs/cifs/smb2transport.c +@@ -599,6 +599,8 @@ smb2_mid_entry_alloc(const struct smb2_sync_hdr *shdr, + * The default is for the mid to be synchronous, so the + * default callback just wakes up the current task. + */ ++ get_task_struct(current); ++ temp->creator = current; + temp->callback = cifs_wake_up_task; + temp->callback_data = current; + +diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c +index 755434d5e4e7..e67a43fd037c 100644 +--- a/fs/cifs/transport.c ++++ b/fs/cifs/transport.c +@@ -76,6 +76,8 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server) + * The default is for the mid to be synchronous, so the + * default callback just wakes up the current task. + */ ++ get_task_struct(current); ++ temp->creator = current; + temp->callback = cifs_wake_up_task; + temp->callback_data = current; + +@@ -158,6 +160,7 @@ static void _cifs_mid_q_entry_release(struct kref *refcount) + } + } + #endif ++ put_task_struct(midEntry->creator); + + mempool_free(midEntry, cifs_mid_poolp); + } +diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c +index 87846aad594b..8fd45eb89424 100644 +--- a/fs/debugfs/file.c ++++ b/fs/debugfs/file.c +@@ -142,18 +142,21 @@ EXPORT_SYMBOL_GPL(debugfs_file_put); + * We also need to exclude any file that has ways to write or alter it as root + * can bypass the permissions check. + */ +-static bool debugfs_is_locked_down(struct inode *inode, +- struct file *filp, +- const struct file_operations *real_fops) ++static int debugfs_locked_down(struct inode *inode, ++ struct file *filp, ++ const struct file_operations *real_fops) + { + if ((inode->i_mode & 07777) == 0444 && + !(filp->f_mode & FMODE_WRITE) && + !real_fops->unlocked_ioctl && + !real_fops->compat_ioctl && + !real_fops->mmap) +- return false; ++ return 0; + +- return security_locked_down(LOCKDOWN_DEBUGFS); ++ if (security_locked_down(LOCKDOWN_DEBUGFS)) ++ return -EPERM; ++ ++ return 0; + } + + static int open_proxy_open(struct inode *inode, struct file *filp) +@@ -168,7 +171,7 @@ static int open_proxy_open(struct inode *inode, struct file *filp) + + real_fops = debugfs_real_fops(filp); + +- r = debugfs_is_locked_down(inode, filp, real_fops); ++ r = debugfs_locked_down(inode, filp, real_fops); + if (r) + goto out; + +@@ -298,7 +301,7 @@ static int full_proxy_open(struct inode *inode, struct file *filp) + + real_fops = debugfs_real_fops(filp); + +- r = debugfs_is_locked_down(inode, filp, real_fops); ++ r = debugfs_locked_down(inode, filp, real_fops); + if (r) + goto out; + +diff --git a/include/linux/platform_data/ti-sysc.h b/include/linux/platform_data/ti-sysc.h +index b5b7a3423ca8..8cfe570fdece 100644 +--- a/include/linux/platform_data/ti-sysc.h ++++ b/include/linux/platform_data/ti-sysc.h +@@ -49,6 +49,8 @@ struct sysc_regbits { + s8 emufree_shift; + }; + ++#define SYSC_QUIRK_FORCE_MSTANDBY BIT(20) ++#define SYSC_MODULE_QUIRK_AESS BIT(19) + #define SYSC_MODULE_QUIRK_SGX BIT(18) + #define SYSC_MODULE_QUIRK_HDQ1W BIT(17) + #define SYSC_MODULE_QUIRK_I2C BIT(16) +diff --git a/include/linux/power/smartreflex.h b/include/linux/power/smartreflex.h +index d0b37e937037..971c9264179e 100644 +--- a/include/linux/power/smartreflex.h ++++ b/include/linux/power/smartreflex.h +@@ -293,6 +293,9 @@ struct omap_sr_data { + struct voltagedomain *voltdm; + }; + ++ ++extern struct omap_sr_data omap_sr_pdata[OMAP_SR_NR]; ++ + #ifdef CONFIG_POWER_AVS_OMAP + + /* Smartreflex module enable/disable interface */ +diff --git a/include/linux/usb/irda.h b/include/linux/usb/irda.h +index 396d2b043e64..556a801efce3 100644 +--- a/include/linux/usb/irda.h ++++ b/include/linux/usb/irda.h +@@ -119,11 +119,22 @@ struct usb_irda_cs_descriptor { + * 6 - 115200 bps + * 7 - 576000 bps + * 8 - 1.152 Mbps +- * 9 - 5 mbps ++ * 9 - 4 Mbps + * 10..15 - Reserved + */ + #define USB_IRDA_STATUS_LINK_SPEED 0x0f + ++#define USB_IRDA_LS_NO_CHANGE 0 ++#define USB_IRDA_LS_2400 1 ++#define USB_IRDA_LS_9600 2 ++#define USB_IRDA_LS_19200 3 ++#define USB_IRDA_LS_38400 4 ++#define USB_IRDA_LS_57600 5 ++#define USB_IRDA_LS_115200 6 ++#define USB_IRDA_LS_576000 7 ++#define USB_IRDA_LS_1152000 8 ++#define USB_IRDA_LS_4000000 9 ++ + /* The following is a 4-bit value used only for + * outbound header: + * +diff --git a/include/media/dvb-usb-ids.h b/include/media/dvb-usb-ids.h +index 7ce4e8332421..1409230ad3a4 100644 +--- a/include/media/dvb-usb-ids.h ++++ b/include/media/dvb-usb-ids.h +@@ -389,6 +389,7 @@ + #define USB_PID_MYGICA_T230 0xc688 + #define USB_PID_MYGICA_T230C 0xc689 + #define USB_PID_MYGICA_T230C2 0xc68a ++#define USB_PID_MYGICA_T230C_LITE 0xc699 + #define USB_PID_ELGATO_EYETV_DIVERSITY 0x0011 + #define USB_PID_ELGATO_EYETV_DTT 0x0021 + #define USB_PID_ELGATO_EYETV_DTT_2 0x003f +diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h +index e553fc80eb23..9976ad2f54fd 100644 +--- a/include/net/pkt_cls.h ++++ b/include/net/pkt_cls.h +@@ -141,31 +141,38 @@ __cls_set_class(unsigned long *clp, unsigned long cl) + return xchg(clp, cl); + } + +-static inline unsigned long +-cls_set_class(struct Qdisc *q, unsigned long *clp, unsigned long cl) ++static inline void ++__tcf_bind_filter(struct Qdisc *q, struct tcf_result *r, unsigned long base) + { +- unsigned long old_cl; ++ unsigned long cl; + +- sch_tree_lock(q); +- old_cl = __cls_set_class(clp, cl); +- sch_tree_unlock(q); +- return old_cl; ++ cl = q->ops->cl_ops->bind_tcf(q, base, r->classid); ++ cl = __cls_set_class(&r->class, cl); ++ if (cl) ++ q->ops->cl_ops->unbind_tcf(q, cl); + } + + static inline void + tcf_bind_filter(struct tcf_proto *tp, struct tcf_result *r, unsigned long base) + { + struct Qdisc *q = tp->chain->block->q; +- unsigned long cl; + + /* Check q as it is not set for shared blocks. In that case, + * setting class is not supported. + */ + if (!q) + return; +- cl = q->ops->cl_ops->bind_tcf(q, base, r->classid); +- cl = cls_set_class(q, &r->class, cl); +- if (cl) ++ sch_tree_lock(q); ++ __tcf_bind_filter(q, r, base); ++ sch_tree_unlock(q); ++} ++ ++static inline void ++__tcf_unbind_filter(struct Qdisc *q, struct tcf_result *r) ++{ ++ unsigned long cl; ++ ++ if ((cl = __cls_set_class(&r->class, 0)) != 0) + q->ops->cl_ops->unbind_tcf(q, cl); + } + +@@ -173,12 +180,10 @@ static inline void + tcf_unbind_filter(struct tcf_proto *tp, struct tcf_result *r) + { + struct Qdisc *q = tp->chain->block->q; +- unsigned long cl; + + if (!q) + return; +- if ((cl = __cls_set_class(&r->class, 0)) != 0) +- q->ops->cl_ops->unbind_tcf(q, cl); ++ __tcf_unbind_filter(q, r); + } + + struct tcf_exts { +diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h +index 32e418dba133..d334e4609dd4 100644 +--- a/include/net/sch_generic.h ++++ b/include/net/sch_generic.h +@@ -318,7 +318,8 @@ struct tcf_proto_ops { + void *type_data); + void (*hw_del)(struct tcf_proto *tp, + void *type_data); +- void (*bind_class)(void *, u32, unsigned long); ++ void (*bind_class)(void *, u32, unsigned long, ++ void *, unsigned long); + void * (*tmplt_create)(struct net *net, + struct tcf_chain *chain, + struct nlattr **tca, +diff --git a/include/net/udp.h b/include/net/udp.h +index bad74f780831..8f163d674f07 100644 +--- a/include/net/udp.h ++++ b/include/net/udp.h +@@ -476,6 +476,9 @@ static inline struct sk_buff *udp_rcv_segment(struct sock *sk, + if (!inet_get_convert_csum(sk)) + features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; + ++ if (skb->pkt_type == PACKET_LOOPBACK) ++ skb->ip_summed = CHECKSUM_PARTIAL; ++ + /* the GSO CB lays after the UDP one, no need to save and restore any + * CB fragment + */ +diff --git a/init/Kconfig b/init/Kconfig +index b4daad2bac23..0328b53d09ad 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -54,6 +54,7 @@ config CC_DISABLE_WARN_MAYBE_UNINITIALIZED + + config CONSTRUCTORS + bool ++ depends on !UML + + config IRQ_WORK + bool +diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig +index 060e8e726755..3941a9c48f83 100644 +--- a/kernel/gcov/Kconfig ++++ b/kernel/gcov/Kconfig +@@ -4,7 +4,7 @@ menu "GCOV-based kernel profiling" + config GCOV_KERNEL + bool "Enable gcov-based kernel profiling" + depends on DEBUG_FS +- select CONSTRUCTORS ++ select CONSTRUCTORS if !UML + default n + ---help--- + This option enables gcov-based code profiling (e.g. for code coverage +diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c +index fc34fd1668d6..3737d32ad11a 100644 +--- a/net/ipv4/nexthop.c ++++ b/net/ipv4/nexthop.c +@@ -322,7 +322,9 @@ static size_t nh_nlmsg_size_single(struct nexthop *nh) + + static size_t nh_nlmsg_size(struct nexthop *nh) + { +- size_t sz = nla_total_size(4); /* NHA_ID */ ++ size_t sz = NLMSG_ALIGN(sizeof(struct nhmsg)); ++ ++ sz += nla_total_size(4); /* NHA_ID */ + + if (nh->is_group) + sz += nh_nlmsg_size_grp(nh); +diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c +index 86bd133b4fa0..96d54e5bf7bc 100644 +--- a/net/rxrpc/input.c ++++ b/net/rxrpc/input.c +@@ -413,7 +413,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + { + struct rxrpc_skb_priv *sp = rxrpc_skb(skb); + enum rxrpc_call_state state; +- unsigned int j; ++ unsigned int j, nr_subpackets; + rxrpc_serial_t serial = sp->hdr.serial, ack_serial = 0; + rxrpc_seq_t seq0 = sp->hdr.seq, hard_ack; + bool immediate_ack = false, jumbo_bad = false; +@@ -457,7 +457,8 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + call->ackr_prev_seq = seq0; + hard_ack = READ_ONCE(call->rx_hard_ack); + +- if (sp->nr_subpackets > 1) { ++ nr_subpackets = sp->nr_subpackets; ++ if (nr_subpackets > 1) { + if (call->nr_jumbo_bad > 3) { + ack = RXRPC_ACK_NOSPACE; + ack_serial = serial; +@@ -465,11 +466,11 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + } + } + +- for (j = 0; j < sp->nr_subpackets; j++) { ++ for (j = 0; j < nr_subpackets; j++) { + rxrpc_serial_t serial = sp->hdr.serial + j; + rxrpc_seq_t seq = seq0 + j; + unsigned int ix = seq & RXRPC_RXTX_BUFF_MASK; +- bool terminal = (j == sp->nr_subpackets - 1); ++ bool terminal = (j == nr_subpackets - 1); + bool last = terminal && (sp->rx_flags & RXRPC_SKB_INCL_LAST); + u8 flags, annotation = j; + +@@ -506,7 +507,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + } + + if (call->rxtx_buffer[ix]) { +- rxrpc_input_dup_data(call, seq, sp->nr_subpackets > 1, ++ rxrpc_input_dup_data(call, seq, nr_subpackets > 1, + &jumbo_bad); + if (ack != RXRPC_ACK_DUPLICATE) { + ack = RXRPC_ACK_DUPLICATE; +@@ -564,6 +565,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + * ring. + */ + skb = NULL; ++ sp = NULL; + } + + if (last) { +diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c +index 4aafbe3d435c..f256a7c69093 100644 +--- a/net/sched/cls_basic.c ++++ b/net/sched/cls_basic.c +@@ -263,12 +263,17 @@ skip: + } + } + +-static void basic_bind_class(void *fh, u32 classid, unsigned long cl) ++static void basic_bind_class(void *fh, u32 classid, unsigned long cl, void *q, ++ unsigned long base) + { + struct basic_filter *f = fh; + +- if (f && f->res.classid == classid) +- f->res.class = cl; ++ if (f && f->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &f->res, base); ++ else ++ __tcf_unbind_filter(q, &f->res); ++ } + } + + static int basic_dump(struct net *net, struct tcf_proto *tp, void *fh, +diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c +index 8229ed4a67be..6e3e63db0e01 100644 +--- a/net/sched/cls_bpf.c ++++ b/net/sched/cls_bpf.c +@@ -631,12 +631,17 @@ nla_put_failure: + return -1; + } + +-static void cls_bpf_bind_class(void *fh, u32 classid, unsigned long cl) ++static void cls_bpf_bind_class(void *fh, u32 classid, unsigned long cl, ++ void *q, unsigned long base) + { + struct cls_bpf_prog *prog = fh; + +- if (prog && prog->res.classid == classid) +- prog->res.class = cl; ++ if (prog && prog->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &prog->res, base); ++ else ++ __tcf_unbind_filter(q, &prog->res); ++ } + } + + static void cls_bpf_walk(struct tcf_proto *tp, struct tcf_walker *arg, +diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c +index 5cf8163710c8..7394e01c0c9c 100644 +--- a/net/sched/cls_flower.c ++++ b/net/sched/cls_flower.c +@@ -2511,12 +2511,17 @@ nla_put_failure: + return -EMSGSIZE; + } + +-static void fl_bind_class(void *fh, u32 classid, unsigned long cl) ++static void fl_bind_class(void *fh, u32 classid, unsigned long cl, void *q, ++ unsigned long base) + { + struct cls_fl_filter *f = fh; + +- if (f && f->res.classid == classid) +- f->res.class = cl; ++ if (f && f->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &f->res, base); ++ else ++ __tcf_unbind_filter(q, &f->res); ++ } + } + + static bool fl_delete_empty(struct tcf_proto *tp) +diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c +index c9496c920d6f..ec945294626a 100644 +--- a/net/sched/cls_fw.c ++++ b/net/sched/cls_fw.c +@@ -419,12 +419,17 @@ nla_put_failure: + return -1; + } + +-static void fw_bind_class(void *fh, u32 classid, unsigned long cl) ++static void fw_bind_class(void *fh, u32 classid, unsigned long cl, void *q, ++ unsigned long base) + { + struct fw_filter *f = fh; + +- if (f && f->res.classid == classid) +- f->res.class = cl; ++ if (f && f->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &f->res, base); ++ else ++ __tcf_unbind_filter(q, &f->res); ++ } + } + + static struct tcf_proto_ops cls_fw_ops __read_mostly = { +diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c +index 7fc2eb62aa98..039cc86974f4 100644 +--- a/net/sched/cls_matchall.c ++++ b/net/sched/cls_matchall.c +@@ -393,12 +393,17 @@ nla_put_failure: + return -1; + } + +-static void mall_bind_class(void *fh, u32 classid, unsigned long cl) ++static void mall_bind_class(void *fh, u32 classid, unsigned long cl, void *q, ++ unsigned long base) + { + struct cls_mall_head *head = fh; + +- if (head && head->res.classid == classid) +- head->res.class = cl; ++ if (head && head->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &head->res, base); ++ else ++ __tcf_unbind_filter(q, &head->res); ++ } + } + + static struct tcf_proto_ops cls_mall_ops __read_mostly = { +diff --git a/net/sched/cls_route.c b/net/sched/cls_route.c +index 2d9e0b4484ea..6f8786b06bde 100644 +--- a/net/sched/cls_route.c ++++ b/net/sched/cls_route.c +@@ -641,12 +641,17 @@ nla_put_failure: + return -1; + } + +-static void route4_bind_class(void *fh, u32 classid, unsigned long cl) ++static void route4_bind_class(void *fh, u32 classid, unsigned long cl, void *q, ++ unsigned long base) + { + struct route4_filter *f = fh; + +- if (f && f->res.classid == classid) +- f->res.class = cl; ++ if (f && f->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &f->res, base); ++ else ++ __tcf_unbind_filter(q, &f->res); ++ } + } + + static struct tcf_proto_ops cls_route4_ops __read_mostly = { +diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h +index 2f3c03b25d5d..c22624131949 100644 +--- a/net/sched/cls_rsvp.h ++++ b/net/sched/cls_rsvp.h +@@ -738,12 +738,17 @@ nla_put_failure: + return -1; + } + +-static void rsvp_bind_class(void *fh, u32 classid, unsigned long cl) ++static void rsvp_bind_class(void *fh, u32 classid, unsigned long cl, void *q, ++ unsigned long base) + { + struct rsvp_filter *f = fh; + +- if (f && f->res.classid == classid) +- f->res.class = cl; ++ if (f && f->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &f->res, base); ++ else ++ __tcf_unbind_filter(q, &f->res); ++ } + } + + static struct tcf_proto_ops RSVP_OPS __read_mostly = { +diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c +index e573e5a5c794..3d4a1280352f 100644 +--- a/net/sched/cls_tcindex.c ++++ b/net/sched/cls_tcindex.c +@@ -654,12 +654,17 @@ nla_put_failure: + return -1; + } + +-static void tcindex_bind_class(void *fh, u32 classid, unsigned long cl) ++static void tcindex_bind_class(void *fh, u32 classid, unsigned long cl, ++ void *q, unsigned long base) + { + struct tcindex_filter_result *r = fh; + +- if (r && r->res.classid == classid) +- r->res.class = cl; ++ if (r && r->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &r->res, base); ++ else ++ __tcf_unbind_filter(q, &r->res); ++ } + } + + static struct tcf_proto_ops cls_tcindex_ops __read_mostly = { +diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c +index a0e6fac613de..e15ff335953d 100644 +--- a/net/sched/cls_u32.c ++++ b/net/sched/cls_u32.c +@@ -1255,12 +1255,17 @@ static int u32_reoffload(struct tcf_proto *tp, bool add, flow_setup_cb_t *cb, + return 0; + } + +-static void u32_bind_class(void *fh, u32 classid, unsigned long cl) ++static void u32_bind_class(void *fh, u32 classid, unsigned long cl, void *q, ++ unsigned long base) + { + struct tc_u_knode *n = fh; + +- if (n && n->res.classid == classid) +- n->res.class = cl; ++ if (n && n->res.classid == classid) { ++ if (cl) ++ __tcf_bind_filter(q, &n->res, base); ++ else ++ __tcf_unbind_filter(q, &n->res); ++ } + } + + static int u32_dump(struct net *net, struct tcf_proto *tp, void *fh, +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index d0140a92694a..dd3b8c11a2e0 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -238,6 +238,9 @@ static int tcf_em_validate(struct tcf_proto *tp, + goto errout; + + if (em->ops->change) { ++ err = -EINVAL; ++ if (em_hdr->flags & TCF_EM_SIMPLE) ++ goto errout; + err = em->ops->change(net, data, data_len, em); + if (err < 0) + goto errout; +diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c +index 1047825d9f48..50794125bf02 100644 +--- a/net/sched/sch_api.c ++++ b/net/sched/sch_api.c +@@ -1891,8 +1891,9 @@ static int tclass_del_notify(struct net *net, + + struct tcf_bind_args { + struct tcf_walker w; +- u32 classid; ++ unsigned long base; + unsigned long cl; ++ u32 classid; + }; + + static int tcf_node_bind(struct tcf_proto *tp, void *n, struct tcf_walker *arg) +@@ -1903,28 +1904,30 @@ static int tcf_node_bind(struct tcf_proto *tp, void *n, struct tcf_walker *arg) + struct Qdisc *q = tcf_block_q(tp->chain->block); + + sch_tree_lock(q); +- tp->ops->bind_class(n, a->classid, a->cl); ++ tp->ops->bind_class(n, a->classid, a->cl, q, a->base); + sch_tree_unlock(q); + } + return 0; + } + +-static void tc_bind_tclass(struct Qdisc *q, u32 portid, u32 clid, +- unsigned long new_cl) ++struct tc_bind_class_args { ++ struct qdisc_walker w; ++ unsigned long new_cl; ++ u32 portid; ++ u32 clid; ++}; ++ ++static int tc_bind_class_walker(struct Qdisc *q, unsigned long cl, ++ struct qdisc_walker *w) + { ++ struct tc_bind_class_args *a = (struct tc_bind_class_args *)w; + const struct Qdisc_class_ops *cops = q->ops->cl_ops; + struct tcf_block *block; + struct tcf_chain *chain; +- unsigned long cl; + +- cl = cops->find(q, portid); +- if (!cl) +- return; +- if (!cops->tcf_block) +- return; + block = cops->tcf_block(q, cl, NULL); + if (!block) +- return; ++ return 0; + for (chain = tcf_get_next_chain(block, NULL); + chain; + chain = tcf_get_next_chain(block, chain)) { +@@ -1935,11 +1938,29 @@ static void tc_bind_tclass(struct Qdisc *q, u32 portid, u32 clid, + struct tcf_bind_args arg = {}; + + arg.w.fn = tcf_node_bind; +- arg.classid = clid; +- arg.cl = new_cl; ++ arg.classid = a->clid; ++ arg.base = cl; ++ arg.cl = a->new_cl; + tp->ops->walk(tp, &arg.w, true); + } + } ++ ++ return 0; ++} ++ ++static void tc_bind_tclass(struct Qdisc *q, u32 portid, u32 clid, ++ unsigned long new_cl) ++{ ++ const struct Qdisc_class_ops *cops = q->ops->cl_ops; ++ struct tc_bind_class_args args = {}; ++ ++ if (!cops->tcf_block) ++ return; ++ args.portid = portid; ++ args.clid = clid; ++ args.new_cl = new_cl; ++ args.w.fn = tc_bind_class_walker; ++ q->ops->cl_ops->walk(q, &args.w); + } + + #else +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index d293488dc3dd..68832f52c1ad 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -7563,20 +7563,6 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { + {0x19, 0x02a11020}, + {0x1a, 0x02a11030}, + {0x21, 0x0221101f}), +- SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, +- {0x12, 0x90a60140}, +- {0x14, 0x90170110}, +- {0x21, 0x02211020}), +- SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, +- {0x12, 0x90a60140}, +- {0x14, 0x90170150}, +- {0x21, 0x02211020}), +- SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, +- {0x21, 0x02211020}), +- SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, +- {0x12, 0x40000000}, +- {0x14, 0x90170110}, +- {0x21, 0x02211020}), + SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, + {0x14, 0x90170110}, + {0x21, 0x02211020}), +@@ -7901,6 +7887,9 @@ static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = { + SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, + {0x19, 0x40000000}, + {0x1a, 0x40000000}), ++ SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, ++ {0x19, 0x40000000}, ++ {0x1a, 0x40000000}), + {} + }; + +diff --git a/sound/soc/fsl/fsl_audmix.c b/sound/soc/fsl/fsl_audmix.c +index a1db1bce330f..5faecbeb5497 100644 +--- a/sound/soc/fsl/fsl_audmix.c ++++ b/sound/soc/fsl/fsl_audmix.c +@@ -505,15 +505,20 @@ static int fsl_audmix_probe(struct platform_device *pdev) + ARRAY_SIZE(fsl_audmix_dai)); + if (ret) { + dev_err(dev, "failed to register ASoC DAI\n"); +- return ret; ++ goto err_disable_pm; + } + + priv->pdev = platform_device_register_data(dev, mdrv, 0, NULL, 0); + if (IS_ERR(priv->pdev)) { + ret = PTR_ERR(priv->pdev); + dev_err(dev, "failed to register platform %s: %d\n", mdrv, ret); ++ goto err_disable_pm; + } + ++ return 0; ++ ++err_disable_pm: ++ pm_runtime_disable(dev); + return ret; + } + +@@ -521,6 +526,8 @@ static int fsl_audmix_remove(struct platform_device *pdev) + { + struct fsl_audmix *priv = dev_get_drvdata(&pdev->dev); + ++ pm_runtime_disable(&pdev->dev); ++ + if (priv->pdev) + platform_device_unregister(priv->pdev); + +diff --git a/sound/soc/intel/boards/cht_bsw_rt5645.c b/sound/soc/intel/boards/cht_bsw_rt5645.c +index 8879c3be29d5..c68a5b85a4a0 100644 +--- a/sound/soc/intel/boards/cht_bsw_rt5645.c ++++ b/sound/soc/intel/boards/cht_bsw_rt5645.c +@@ -48,6 +48,7 @@ struct cht_mc_private { + #define CHT_RT5645_SSP2_AIF2 BIT(16) /* default is using AIF1 */ + #define CHT_RT5645_SSP0_AIF1 BIT(17) + #define CHT_RT5645_SSP0_AIF2 BIT(18) ++#define CHT_RT5645_PMC_PLT_CLK_0 BIT(19) + + static unsigned long cht_rt5645_quirk = 0; + +@@ -59,6 +60,8 @@ static void log_quirks(struct device *dev) + dev_info(dev, "quirk SSP0_AIF1 enabled"); + if (cht_rt5645_quirk & CHT_RT5645_SSP0_AIF2) + dev_info(dev, "quirk SSP0_AIF2 enabled"); ++ if (cht_rt5645_quirk & CHT_RT5645_PMC_PLT_CLK_0) ++ dev_info(dev, "quirk PMC_PLT_CLK_0 enabled"); + } + + static int platform_clock_control(struct snd_soc_dapm_widget *w, +@@ -226,15 +229,21 @@ static int cht_aif1_hw_params(struct snd_pcm_substream *substream, + return 0; + } + +-/* uncomment when we have a real quirk + static int cht_rt5645_quirk_cb(const struct dmi_system_id *id) + { + cht_rt5645_quirk = (unsigned long)id->driver_data; + return 1; + } +-*/ + + static const struct dmi_system_id cht_rt5645_quirk_table[] = { ++ { ++ /* Strago family Chromebooks */ ++ .callback = cht_rt5645_quirk_cb, ++ .matches = { ++ DMI_MATCH(DMI_PRODUCT_FAMILY, "Intel_Strago"), ++ }, ++ .driver_data = (void *)CHT_RT5645_PMC_PLT_CLK_0, ++ }, + { + }, + }; +@@ -526,6 +535,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev) + int dai_index = 0; + int ret_val = 0; + int i; ++ const char *mclk_name; + + drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL); + if (!drv) +@@ -662,11 +672,15 @@ static int snd_cht_mc_probe(struct platform_device *pdev) + if (ret_val) + return ret_val; + +- drv->mclk = devm_clk_get(&pdev->dev, "pmc_plt_clk_3"); ++ if (cht_rt5645_quirk & CHT_RT5645_PMC_PLT_CLK_0) ++ mclk_name = "pmc_plt_clk_0"; ++ else ++ mclk_name = "pmc_plt_clk_3"; ++ ++ drv->mclk = devm_clk_get(&pdev->dev, mclk_name); + if (IS_ERR(drv->mclk)) { +- dev_err(&pdev->dev, +- "Failed to get MCLK from pmc_plt_clk_3: %ld\n", +- PTR_ERR(drv->mclk)); ++ dev_err(&pdev->dev, "Failed to get MCLK from %s: %ld\n", ++ mclk_name, PTR_ERR(drv->mclk)); + return PTR_ERR(drv->mclk); + } + +diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c +index fd2d22ddc81b..7ccbca47240d 100644 +--- a/sound/soc/soc-topology.c ++++ b/sound/soc/soc-topology.c +@@ -548,12 +548,12 @@ static void remove_link(struct snd_soc_component *comp, + if (dobj->ops && dobj->ops->link_unload) + dobj->ops->link_unload(comp, dobj); + ++ list_del(&dobj->list); ++ snd_soc_remove_dai_link(comp->card, link); ++ + kfree(link->name); + kfree(link->stream_name); + kfree(link->cpus->dai_name); +- +- list_del(&dobj->list); +- snd_soc_remove_dai_link(comp->card, link); + kfree(link); + } + +diff --git a/sound/soc/sof/intel/hda-dai.c b/sound/soc/sof/intel/hda-dai.c +index 8796f385be76..896d21984b73 100644 +--- a/sound/soc/sof/intel/hda-dai.c ++++ b/sound/soc/sof/intel/hda-dai.c +@@ -216,6 +216,8 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream, + link_dev = hda_link_stream_assign(bus, substream); + if (!link_dev) + return -EBUSY; ++ ++ snd_soc_dai_set_dma_data(dai, substream, (void *)link_dev); + } + + stream_tag = hdac_stream(link_dev)->stream_tag; +@@ -228,8 +230,6 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream, + if (ret < 0) + return ret; + +- snd_soc_dai_set_dma_data(dai, substream, (void *)link_dev); +- + link = snd_hdac_ext_bus_get_link(bus, codec_dai->component->name); + if (!link) + return -EINVAL; +@@ -361,6 +361,13 @@ static int hda_link_hw_free(struct snd_pcm_substream *substream, + bus = hstream->bus; + rtd = snd_pcm_substream_chip(substream); + link_dev = snd_soc_dai_get_dma_data(dai, substream); ++ ++ if (!link_dev) { ++ dev_dbg(dai->dev, ++ "%s: link_dev is not assigned\n", __func__); ++ return -EINVAL; ++ } ++ + hda_stream = hstream_to_sof_hda_stream(link_dev); + + /* free the link DMA channel in the FW */ +diff --git a/sound/soc/sof/ipc.c b/sound/soc/sof/ipc.c +index 086eeeab8679..7b6d69783e16 100644 +--- a/sound/soc/sof/ipc.c ++++ b/sound/soc/sof/ipc.c +@@ -834,6 +834,9 @@ void snd_sof_ipc_free(struct snd_sof_dev *sdev) + { + struct snd_sof_ipc *ipc = sdev->ipc; + ++ if (!ipc) ++ return; ++ + /* disable sending of ipc's */ + mutex_lock(&ipc->tx_mutex); + ipc->disable_ipc_tx = true; +diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h +index 54a50699bbfd..9f77cbaac01c 100644 +--- a/tools/testing/selftests/bpf/bpf_helpers.h ++++ b/tools/testing/selftests/bpf/bpf_helpers.h +@@ -3,7 +3,7 @@ + #define __BPF_HELPERS__ + + #define __uint(name, val) int (*name)[val] +-#define __type(name, val) val *name ++#define __type(name, val) typeof(val) *name + + /* helper macro to print out debug messages */ + #define bpf_printk(fmt, ...) \ +diff --git a/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c b/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c +index f8ffa3f3d44b..6cc4479ac9df 100644 +--- a/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c ++++ b/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c +@@ -47,12 +47,11 @@ struct { + * issue and avoid complicated C programming massaging. + * This is an acceptable workaround since there is one entry here. + */ +-typedef __u64 raw_stack_trace_t[2 * MAX_STACK_RAWTP]; + struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(max_entries, 1); + __type(key, __u32); +- __type(value, raw_stack_trace_t); ++ __type(value, __u64[2 * MAX_STACK_RAWTP]); + } rawdata_map SEC(".maps"); + + SEC("raw_tracepoint/sys_enter") diff --git a/patch/kernel/sunxi-current/patch-5.4.17-18.patch b/patch/kernel/sunxi-current/patch-5.4.17-18.patch new file mode 100644 index 0000000000..aa79549ab6 --- /dev/null +++ b/patch/kernel/sunxi-current/patch-5.4.17-18.patch @@ -0,0 +1,3992 @@ +diff --git a/Documentation/ABI/testing/sysfs-class-devfreq b/Documentation/ABI/testing/sysfs-class-devfreq +index 01196e19afca..75897e2fde43 100644 +--- a/Documentation/ABI/testing/sysfs-class-devfreq ++++ b/Documentation/ABI/testing/sysfs-class-devfreq +@@ -7,6 +7,13 @@ Description: + The name of devfreq object denoted as ... is same as the + name of device using devfreq. + ++What: /sys/class/devfreq/.../name ++Date: November 2019 ++Contact: Chanwoo Choi ++Description: ++ The /sys/class/devfreq/.../name shows the name of device ++ of the corresponding devfreq object. ++ + What: /sys/class/devfreq/.../governor + Date: September 2011 + Contact: MyungJoo Ham +diff --git a/Makefile b/Makefile +index a363a539a092..b6c151fd5227 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 17 ++SUBLEVEL = 18 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi b/arch/arm/boot/dts/am335x-boneblack-common.dtsi +index 7ad079861efd..91f93bc89716 100644 +--- a/arch/arm/boot/dts/am335x-boneblack-common.dtsi ++++ b/arch/arm/boot/dts/am335x-boneblack-common.dtsi +@@ -131,6 +131,11 @@ + }; + + / { ++ memory@80000000 { ++ device_type = "memory"; ++ reg = <0x80000000 0x20000000>; /* 512 MB */ ++ }; ++ + clk_mcasp0_fixed: clk_mcasp0_fixed { + #clock-cells = <0>; + compatible = "fixed-clock"; +diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts +index 078cb473fa7d..a6fbc088daa8 100644 +--- a/arch/arm/boot/dts/am43x-epos-evm.dts ++++ b/arch/arm/boot/dts/am43x-epos-evm.dts +@@ -848,6 +848,7 @@ + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi0_pins_default>; + pinctrl-1 = <&spi0_pins_sleep>; ++ ti,pindir-d0-out-d1-in = <1>; + }; + + &spi1 { +@@ -855,6 +856,7 @@ + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_pins_default>; + pinctrl-1 = <&spi1_pins_sleep>; ++ ti,pindir-d0-out-d1-in = <1>; + }; + + &usb2_phy1 { +diff --git a/arch/arm/boot/dts/am571x-idk.dts b/arch/arm/boot/dts/am571x-idk.dts +index 9d6a872c2b23..10105a497c1a 100644 +--- a/arch/arm/boot/dts/am571x-idk.dts ++++ b/arch/arm/boot/dts/am571x-idk.dts +@@ -170,10 +170,6 @@ + gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>; + }; + +-&pcie1_ep { +- gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; +-}; +- + &mmc1 { + pinctrl-names = "default", "hs"; + pinctrl-0 = <&mmc1_pins_default_no_clk_pu>; +diff --git a/arch/arm/boot/dts/am572x-idk-common.dtsi b/arch/arm/boot/dts/am572x-idk-common.dtsi +index a064f13b3880..ddf123620e96 100644 +--- a/arch/arm/boot/dts/am572x-idk-common.dtsi ++++ b/arch/arm/boot/dts/am572x-idk-common.dtsi +@@ -147,10 +147,6 @@ + gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; + }; + +-&pcie1_ep { +- gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; +-}; +- + &mailbox5 { + status = "okay"; + mbox_ipu1_ipc3x: mbox_ipu1_ipc3x { +diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi +index bc76f1705c0f..a813a0cf3ff3 100644 +--- a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi ++++ b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi +@@ -29,6 +29,27 @@ + reg = <0x0 0x80000000 0x0 0x80000000>; + }; + ++ main_12v0: fixedregulator-main_12v0 { ++ /* main supply */ ++ compatible = "regulator-fixed"; ++ regulator-name = "main_12v0"; ++ regulator-min-microvolt = <12000000>; ++ regulator-max-microvolt = <12000000>; ++ regulator-always-on; ++ regulator-boot-on; ++ }; ++ ++ evm_5v0: fixedregulator-evm_5v0 { ++ /* Output of TPS54531D */ ++ compatible = "regulator-fixed"; ++ regulator-name = "evm_5v0"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ vin-supply = <&main_12v0>; ++ regulator-always-on; ++ regulator-boot-on; ++ }; ++ + vdd_3v3: fixedregulator-vdd_3v3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_3v3"; +@@ -547,10 +568,6 @@ + gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; + }; + +-&pcie1_ep { +- gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; +-}; +- + &mcasp3 { + #sound-dai-cells = <0>; + assigned-clocks = <&l4per2_clkctrl DRA7_L4PER2_MCASP3_CLKCTRL 24>; +diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts +index fb928503ad45..d9be511f054f 100644 +--- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts ++++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts +@@ -101,7 +101,7 @@ + initial-mode = <1>; /* initialize in HUB mode */ + disabled-ports = <1>; + intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */ +- reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */ ++ reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */ + connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */ + refclk-frequency = <19200000>; + }; +diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S +index ae5020302de4..6607fa817bba 100644 +--- a/arch/arm/kernel/hyp-stub.S ++++ b/arch/arm/kernel/hyp-stub.S +@@ -146,10 +146,9 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE + #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER) + @ make CNTP_* and CNTPCT accessible from PL1 + mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 +- lsr r7, #16 +- and r7, #0xf +- cmp r7, #1 +- bne 1f ++ ubfx r7, r7, #16, #4 ++ teq r7, #0 ++ beq 1f + mrc p15, 4, r7, c14, c1, 0 @ CNTHCTL + orr r7, r7, #3 @ PL1PCEN | PL1PCTEN + mcr p15, 4, r7, c14, c1, 0 @ CNTHCTL +diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile +index 1f012c506434..cd3414898d10 100644 +--- a/arch/arm64/boot/Makefile ++++ b/arch/arm64/boot/Makefile +@@ -16,7 +16,7 @@ + + OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S + +-targets := Image Image.gz ++targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo + + $(obj)/Image: vmlinux FORCE + $(call if_changed,objcopy) +diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +index 3435aaa4e8db..5d6a8dafe8dc 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +@@ -361,6 +361,8 @@ + + bluetooth { + compatible = "brcm,bcm43438-bt"; ++ interrupt-parent = <&gpio_intc>; ++ interrupts = <95 IRQ_TYPE_LEVEL_HIGH>; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; +diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c +index a6c9f49c6612..a5f3e50fe976 100644 +--- a/arch/parisc/kernel/drivers.c ++++ b/arch/parisc/kernel/drivers.c +@@ -889,8 +889,8 @@ static void print_parisc_device(struct parisc_device *dev) + static int count; + + print_pa_hwpath(dev, hw_path); +- pr_info("%d. %s at 0x%px [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", +- ++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type, ++ pr_info("%d. %s at %pap [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", ++ ++count, dev->name, &(dev->hpa.start), hw_path, dev->id.hw_type, + dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); + + if (dev->num_addrs) { +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi +index e1a961f05dcd..baa0c503e741 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi +@@ -63,6 +63,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy0: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi +index c288f3c6c637..93095600e808 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi +@@ -60,6 +60,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy6: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi +index 94f3e7175012..ff4bd38f0645 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi +@@ -63,6 +63,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy1: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi +index 94a76982d214..1fa38ed6f59e 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi +@@ -60,6 +60,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy7: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi +index b5ff5f71c6b8..a8cc9780c0c4 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy0: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi +index ee44182c6348..8b8bd70c9382 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy1: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi +index f05f0d775039..619c880b54d8 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe5000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy2: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi +index a9114ec51075..d7ebb73a400d 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe7000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy3: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi +index 44dd00ac7367..b151d696a069 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe9000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy4: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi +index 5b1b84b58602..adc0ae0013a3 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xeb000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy5: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi +index 0e1daaef9e74..435047e0e250 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi +@@ -60,6 +60,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy14: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi +index 68c5ef779266..c098657cca0a 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi +@@ -60,6 +60,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy15: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi +index 605363cc1117..9d06824815f3 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy8: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi +index 1955dfa13634..70e947730c4b 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy9: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi +index 2c1476454ee0..ad96e6529595 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe5000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy10: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi +index b8b541ff5fb0..034bc4b71f7a 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe7000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy11: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi +index 4b2cfddd1b15..93ca23d82b39 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe9000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy12: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi +index 0a52ddf7cc17..23b3117a2fd2 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xeb000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy13: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile +index 49a5852fd07d..33b16f4212f7 100644 +--- a/arch/riscv/kernel/vdso/Makefile ++++ b/arch/riscv/kernel/vdso/Makefile +@@ -58,7 +58,8 @@ quiet_cmd_vdsold = VDSOLD $@ + cmd_vdsold = $(CC) $(KBUILD_CFLAGS) $(call cc-option, -no-pie) -nostdlib -nostartfiles $(SYSCFLAGS_$(@F)) \ + -Wl,-T,$(filter-out FORCE,$^) -o $@.tmp && \ + $(CROSS_COMPILE)objcopy \ +- $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ ++ $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ && \ ++ rm $@.tmp + + # install commands for the unstripped file + quiet_cmd_vdso_install = INSTALL $@ +diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c +index dbaa1b088a30..c37cb12d0ef6 100644 +--- a/arch/x86/events/intel/uncore_snb.c ++++ b/arch/x86/events/intel/uncore_snb.c +@@ -15,6 +15,7 @@ + #define PCI_DEVICE_ID_INTEL_SKL_HQ_IMC 0x1910 + #define PCI_DEVICE_ID_INTEL_SKL_SD_IMC 0x190f + #define PCI_DEVICE_ID_INTEL_SKL_SQ_IMC 0x191f ++#define PCI_DEVICE_ID_INTEL_SKL_E3_IMC 0x1918 + #define PCI_DEVICE_ID_INTEL_KBL_Y_IMC 0x590c + #define PCI_DEVICE_ID_INTEL_KBL_U_IMC 0x5904 + #define PCI_DEVICE_ID_INTEL_KBL_UQ_IMC 0x5914 +@@ -657,6 +658,10 @@ static const struct pci_device_id skl_uncore_pci_ids[] = { + PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_SQ_IMC), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, ++ { /* IMC */ ++ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_E3_IMC), ++ .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), ++ }, + { /* IMC */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KBL_Y_IMC), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), +@@ -826,6 +831,7 @@ static const struct imc_uncore_pci_dev desktop_imc_pci_ids[] = { + IMC_DEV(SKL_HQ_IMC, &skl_uncore_pci_driver), /* 6th Gen Core H Quad Core */ + IMC_DEV(SKL_SD_IMC, &skl_uncore_pci_driver), /* 6th Gen Core S Dual Core */ + IMC_DEV(SKL_SQ_IMC, &skl_uncore_pci_driver), /* 6th Gen Core S Quad Core */ ++ IMC_DEV(SKL_E3_IMC, &skl_uncore_pci_driver), /* Xeon E3 V5 Gen Core processor */ + IMC_DEV(KBL_Y_IMC, &skl_uncore_pci_driver), /* 7th Gen Core Y */ + IMC_DEV(KBL_U_IMC, &skl_uncore_pci_driver), /* 7th Gen Core U */ + IMC_DEV(KBL_UQ_IMC, &skl_uncore_pci_driver), /* 7th Gen Core U Quad Core */ +diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c +index 011644802ce7..ad20220af303 100644 +--- a/arch/x86/events/intel/uncore_snbep.c ++++ b/arch/x86/events/intel/uncore_snbep.c +@@ -369,11 +369,6 @@ + #define SNR_M2M_PCI_PMON_BOX_CTL 0x438 + #define SNR_M2M_PCI_PMON_UMASK_EXT 0xff + +-/* SNR PCIE3 */ +-#define SNR_PCIE3_PCI_PMON_CTL0 0x508 +-#define SNR_PCIE3_PCI_PMON_CTR0 0x4e8 +-#define SNR_PCIE3_PCI_PMON_BOX_CTL 0x4e4 +- + /* SNR IMC */ + #define SNR_IMC_MMIO_PMON_FIXED_CTL 0x54 + #define SNR_IMC_MMIO_PMON_FIXED_CTR 0x38 +@@ -4328,27 +4323,12 @@ static struct intel_uncore_type snr_uncore_m2m = { + .format_group = &snr_m2m_uncore_format_group, + }; + +-static struct intel_uncore_type snr_uncore_pcie3 = { +- .name = "pcie3", +- .num_counters = 4, +- .num_boxes = 1, +- .perf_ctr_bits = 48, +- .perf_ctr = SNR_PCIE3_PCI_PMON_CTR0, +- .event_ctl = SNR_PCIE3_PCI_PMON_CTL0, +- .event_mask = SNBEP_PMON_RAW_EVENT_MASK, +- .box_ctl = SNR_PCIE3_PCI_PMON_BOX_CTL, +- .ops = &ivbep_uncore_pci_ops, +- .format_group = &ivbep_uncore_format_group, +-}; +- + enum { + SNR_PCI_UNCORE_M2M, +- SNR_PCI_UNCORE_PCIE3, + }; + + static struct intel_uncore_type *snr_pci_uncores[] = { + [SNR_PCI_UNCORE_M2M] = &snr_uncore_m2m, +- [SNR_PCI_UNCORE_PCIE3] = &snr_uncore_pcie3, + NULL, + }; + +@@ -4357,10 +4337,6 @@ static const struct pci_device_id snr_uncore_pci_ids[] = { + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a), + .driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 0, SNR_PCI_UNCORE_M2M, 0), + }, +- { /* PCIe3 */ +- PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x334a), +- .driver_data = UNCORE_PCI_DEV_FULL_DATA(4, 0, SNR_PCI_UNCORE_PCIE3, 0), +- }, + { /* end: all zeroes */ } + }; + +diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c +index dac7209a0708..954fd048ad9b 100644 +--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c ++++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c +@@ -1970,7 +1970,7 @@ static int rdt_get_tree(struct fs_context *fc) + + if (rdt_mon_capable) { + ret = mongroup_create_dir(rdtgroup_default.kn, +- NULL, "mon_groups", ++ &rdtgroup_default, "mon_groups", + &kn_mongrp); + if (ret < 0) + goto out_info; +@@ -2205,7 +2205,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp) + list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) { + free_rmid(sentry->mon.rmid); + list_del(&sentry->mon.crdtgrp_list); +- kfree(sentry); ++ ++ if (atomic_read(&sentry->waitcount) != 0) ++ sentry->flags = RDT_DELETED; ++ else ++ kfree(sentry); + } + } + +@@ -2243,7 +2247,11 @@ static void rmdir_all_sub(void) + + kernfs_remove(rdtgrp->kn); + list_del(&rdtgrp->rdtgroup_list); +- kfree(rdtgrp); ++ ++ if (atomic_read(&rdtgrp->waitcount) != 0) ++ rdtgrp->flags = RDT_DELETED; ++ else ++ kfree(rdtgrp); + } + /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */ + update_closid_rmid(cpu_online_mask, &rdtgroup_default); +@@ -2446,7 +2454,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn, + /* + * Create the mon_data directory first. + */ +- ret = mongroup_create_dir(parent_kn, NULL, "mon_data", &kn); ++ ret = mongroup_create_dir(parent_kn, prgrp, "mon_data", &kn); + if (ret) + return ret; + +@@ -2645,7 +2653,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, + uint files = 0; + int ret; + +- prdtgrp = rdtgroup_kn_lock_live(prgrp_kn); ++ prdtgrp = rdtgroup_kn_lock_live(parent_kn); + if (!prdtgrp) { + ret = -ENODEV; + goto out_unlock; +@@ -2718,7 +2726,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, + kernfs_activate(kn); + + /* +- * The caller unlocks the prgrp_kn upon success. ++ * The caller unlocks the parent_kn upon success. + */ + return 0; + +@@ -2729,7 +2737,7 @@ out_destroy: + out_free_rgrp: + kfree(rdtgrp); + out_unlock: +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -2767,7 +2775,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn, + */ + list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list); + +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -2810,7 +2818,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, + * Create an empty mon_groups directory to hold the subset + * of tasks and cpus to monitor. + */ +- ret = mongroup_create_dir(kn, NULL, "mon_groups", NULL); ++ ret = mongroup_create_dir(kn, rdtgrp, "mon_groups", NULL); + if (ret) { + rdt_last_cmd_puts("kernfs subdir error\n"); + goto out_del_list; +@@ -2826,7 +2834,7 @@ out_id_free: + out_common_fail: + mkdir_rdt_prepare_clean(rdtgrp); + out_unlock: +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -2952,13 +2960,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp, + closid_free(rdtgrp->closid); + free_rmid(rdtgrp->mon.rmid); + ++ rdtgroup_ctrl_remove(kn, rdtgrp); ++ + /* + * Free all the child monitor group rmids. + */ + free_all_child_rdtgrp(rdtgrp); + +- rdtgroup_ctrl_remove(kn, rdtgrp); +- + return 0; + } + +diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c +index 4f24e46ebe7c..56db949a7b70 100644 +--- a/drivers/char/ttyprintk.c ++++ b/drivers/char/ttyprintk.c +@@ -15,10 +15,11 @@ + #include + #include + #include ++#include + + struct ttyprintk_port { + struct tty_port port; +- struct mutex port_write_mutex; ++ spinlock_t spinlock; + }; + + static struct ttyprintk_port tpk_port; +@@ -99,11 +100,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp) + static void tpk_close(struct tty_struct *tty, struct file *filp) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + /* flush tpk_printk buffer */ + tpk_printk(NULL, 0); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + tty_port_close(&tpkp->port, tty, filp); + } +@@ -115,13 +117,14 @@ static int tpk_write(struct tty_struct *tty, + const unsigned char *buf, int count) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + int ret; + + + /* exclusive use of tpk_printk within this tty */ +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + ret = tpk_printk(buf, count); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + return ret; + } +@@ -171,7 +174,7 @@ static int __init ttyprintk_init(void) + { + int ret = -ENOMEM; + +- mutex_init(&tpk_port.port_write_mutex); ++ spin_lock_init(&tpk_port.spinlock); + + ttyprintk_driver = tty_alloc_driver(1, + TTY_DRIVER_RESET_TERMIOS | +diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c +index a60a1be937ad..b4a95cbbda98 100644 +--- a/drivers/clk/mmp/clk-of-mmp2.c ++++ b/drivers/clk/mmp/clk-of-mmp2.c +@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock); + static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; + + static DEFINE_SPINLOCK(timer_lock); +-static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"}; ++static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; + + static DEFINE_SPINLOCK(reset_lock); + +diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c +index 45a1ed3fe674..ab194143e06c 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c ++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c +@@ -23,9 +23,9 @@ + */ + + static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k", +- "pll-periph0", "iosc" }; ++ "iosc", "pll-periph0" }; + static const struct ccu_mux_var_prediv ar100_r_apb2_predivs[] = { +- { .index = 2, .shift = 0, .width = 5 }, ++ { .index = 3, .shift = 0, .width = 5 }, + }; + + static struct ccu_div ar100_clk = { +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.c b/drivers/clk/sunxi-ng/ccu-sun8i-r.c +index 4646fdc61053..4c8c491b87c2 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-r.c ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.c +@@ -51,19 +51,7 @@ static struct ccu_div ar100_clk = { + + static CLK_FIXED_FACTOR_HW(ahb0_clk, "ahb0", &ar100_clk.common.hw, 1, 1, 0); + +-static struct ccu_div apb0_clk = { +- .div = _SUNXI_CCU_DIV_FLAGS(0, 2, CLK_DIVIDER_POWER_OF_TWO), +- +- .common = { +- .reg = 0x0c, +- .hw.init = CLK_HW_INIT_HW("apb0", +- &ahb0_clk.hw, +- &ccu_div_ops, +- 0), +- }, +-}; +- +-static SUNXI_CCU_M(a83t_apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0); ++static SUNXI_CCU_M(apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0); + + /* + * Define the parent as an array that can be reused to save space +@@ -127,7 +115,7 @@ static struct ccu_mp a83t_ir_clk = { + + static struct ccu_common *sun8i_a83t_r_ccu_clks[] = { + &ar100_clk.common, +- &a83t_apb0_clk.common, ++ &apb0_clk.common, + &apb0_pio_clk.common, + &apb0_ir_clk.common, + &apb0_timer_clk.common, +@@ -167,7 +155,7 @@ static struct clk_hw_onecell_data sun8i_a83t_r_hw_clks = { + .hws = { + [CLK_AR100] = &ar100_clk.common.hw, + [CLK_AHB0] = &ahb0_clk.hw, +- [CLK_APB0] = &a83t_apb0_clk.common.hw, ++ [CLK_APB0] = &apb0_clk.common.hw, + [CLK_APB0_PIO] = &apb0_pio_clk.common.hw, + [CLK_APB0_IR] = &apb0_ir_clk.common.hw, + [CLK_APB0_TIMER] = &apb0_timer_clk.common.hw, +@@ -282,9 +270,6 @@ static void __init sunxi_r_ccu_init(struct device_node *node, + + static void __init sun8i_a83t_r_ccu_setup(struct device_node *node) + { +- /* Fix apb0 bus gate parents here */ +- apb0_gate_parent[0] = &a83t_apb0_clk.common.hw; +- + sunxi_r_ccu_init(node, &sun8i_a83t_r_ccu_desc); + } + CLK_OF_DECLARE(sun8i_a83t_r_ccu, "allwinner,sun8i-a83t-r-ccu", +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +index 5c779eec454b..0e36ca3bf3d5 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +@@ -618,7 +618,7 @@ static struct clk_hw_onecell_data sun8i_v3s_hw_clks = { + [CLK_MBUS] = &mbus_clk.common.hw, + [CLK_MIPI_CSI] = &mipi_csi_clk.common.hw, + }, +- .num = CLK_NUMBER, ++ .num = CLK_PLL_DDR1 + 1, + }; + + static struct clk_hw_onecell_data sun8i_v3_hw_clks = { +@@ -700,7 +700,7 @@ static struct clk_hw_onecell_data sun8i_v3_hw_clks = { + [CLK_MBUS] = &mbus_clk.common.hw, + [CLK_MIPI_CSI] = &mipi_csi_clk.common.hw, + }, +- .num = CLK_NUMBER, ++ .num = CLK_I2S0 + 1, + }; + + static struct ccu_reset_map sun8i_v3s_ccu_resets[] = { +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h +index b0160d305a67..108eeeedcbf7 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h +@@ -51,6 +51,4 @@ + + #define CLK_PLL_DDR1 74 + +-#define CLK_NUMBER (CLK_I2S0 + 1) +- + #endif /* _CCU_SUN8I_H3_H_ */ +diff --git a/drivers/cpuidle/governors/teo.c b/drivers/cpuidle/governors/teo.c +index 703047434ee1..c71773c88890 100644 +--- a/drivers/cpuidle/governors/teo.c ++++ b/drivers/cpuidle/governors/teo.c +@@ -234,7 +234,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + struct teo_cpu *cpu_data = per_cpu_ptr(&teo_cpus, dev->cpu); + int latency_req = cpuidle_governor_latency_req(dev->cpu); + unsigned int duration_us, hits, misses, early_hits; +- int max_early_idx, constraint_idx, idx, i; ++ int max_early_idx, prev_max_early_idx, constraint_idx, idx, i; + ktime_t delta_tick; + + if (dev->last_state_idx >= 0) { +@@ -251,6 +251,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + misses = 0; + early_hits = 0; + max_early_idx = -1; ++ prev_max_early_idx = -1; + constraint_idx = drv->state_count; + idx = -1; + +@@ -303,6 +304,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + */ + if (!(tick_nohz_tick_stopped() && + drv->states[idx].target_residency < TICK_USEC)) { ++ prev_max_early_idx = max_early_idx; + early_hits = cpu_data->states[i].early_hits; + max_early_idx = idx; + } +@@ -329,6 +331,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + if (early_hits < cpu_data->states[i].early_hits && + !(tick_nohz_tick_stopped() && + drv->states[i].target_residency < TICK_USEC)) { ++ prev_max_early_idx = max_early_idx; + early_hits = cpu_data->states[i].early_hits; + max_early_idx = i; + } +@@ -342,9 +345,19 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + * "early hits" metric, but if that cannot be determined, just use the + * state selected so far. + */ +- if (hits <= misses && max_early_idx >= 0) { +- idx = max_early_idx; +- duration_us = drv->states[idx].target_residency; ++ if (hits <= misses) { ++ /* ++ * The current candidate state is not suitable, so take the one ++ * whose "early hits" metric is the maximum for the range of ++ * shallower states. ++ */ ++ if (idx == max_early_idx) ++ max_early_idx = prev_max_early_idx; ++ ++ if (max_early_idx >= 0) { ++ idx = max_early_idx; ++ duration_us = drv->states[idx].target_residency; ++ } + } + + /* +diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c +index c64d20fdc187..174795ecbd3b 100644 +--- a/drivers/devfreq/devfreq.c ++++ b/drivers/devfreq/devfreq.c +@@ -1112,6 +1112,14 @@ err_out: + } + EXPORT_SYMBOL(devfreq_remove_governor); + ++static ssize_t name_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct devfreq *devfreq = to_devfreq(dev); ++ return sprintf(buf, "%s\n", dev_name(devfreq->dev.parent)); ++} ++static DEVICE_ATTR_RO(name); ++ + static ssize_t governor_show(struct device *dev, + struct device_attribute *attr, char *buf) + { +@@ -1440,6 +1448,7 @@ static ssize_t trans_stat_show(struct device *dev, + static DEVICE_ATTR_RO(trans_stat); + + static struct attribute *devfreq_attrs[] = { ++ &dev_attr_name.attr, + &dev_attr_governor.attr, + &dev_attr_available_governors.attr, + &dev_attr_cur_freq.attr, +diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c +index f918fca9ada3..cb6e3a5f509c 100644 +--- a/drivers/input/evdev.c ++++ b/drivers/input/evdev.c +@@ -484,10 +484,7 @@ static int evdev_open(struct inode *inode, struct file *file) + struct evdev_client *client; + int error; + +- client = kzalloc(struct_size(client, buffer, bufsize), +- GFP_KERNEL | __GFP_NOWARN); +- if (!client) +- client = vzalloc(struct_size(client, buffer, bufsize)); ++ client = kvzalloc(struct_size(client, buffer, bufsize), GFP_KERNEL); + if (!client) + return -ENOMEM; + +diff --git a/drivers/input/misc/max77650-onkey.c b/drivers/input/misc/max77650-onkey.c +index 4d875f2ac13d..ee55f22dbca5 100644 +--- a/drivers/input/misc/max77650-onkey.c ++++ b/drivers/input/misc/max77650-onkey.c +@@ -108,9 +108,16 @@ static int max77650_onkey_probe(struct platform_device *pdev) + return input_register_device(onkey->input); + } + ++static const struct of_device_id max77650_onkey_of_match[] = { ++ { .compatible = "maxim,max77650-onkey" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, max77650_onkey_of_match); ++ + static struct platform_driver max77650_onkey_driver = { + .driver = { + .name = "max77650-onkey", ++ .of_match_table = max77650_onkey_of_match, + }, + .probe = max77650_onkey_probe, + }; +diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c +index 4c2d0b3c6dad..a0d4b725c917 100644 +--- a/drivers/leds/leds-max77650.c ++++ b/drivers/leds/leds-max77650.c +@@ -135,9 +135,16 @@ err_node_put: + return rv; + } + ++static const struct of_device_id max77650_led_of_match[] = { ++ { .compatible = "maxim,max77650-led" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, max77650_led_of_match); ++ + static struct platform_driver max77650_led_driver = { + .driver = { + .name = "max77650-led", ++ .of_match_table = max77650_led_of_match, + }, + .probe = max77650_led_probe, + }; +diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c +index 1696bfd23ad1..69201bdf7f4c 100644 +--- a/drivers/md/dm-thin.c ++++ b/drivers/md/dm-thin.c +@@ -3420,10 +3420,6 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) + if (r) + goto out_flags_changed; + +- dm_pool_register_pre_commit_callback(pt->pool->pmd, +- metadata_pre_commit_callback, +- pt); +- + pt->callbacks.congested_fn = pool_is_congested; + dm_table_add_target_callbacks(ti->table, &pt->callbacks); + +@@ -3587,6 +3583,9 @@ static int pool_preresume(struct dm_target *ti) + if (r) + return r; + ++ dm_pool_register_pre_commit_callback(pool->pmd, ++ metadata_pre_commit_callback, pt); ++ + r = maybe_resize_data_dev(ti, &need_commit1); + if (r) + return r; +diff --git a/drivers/media/usb/dvb-usb/af9005.c b/drivers/media/usb/dvb-usb/af9005.c +index ac93e88d7038..89b4b5d84cdf 100644 +--- a/drivers/media/usb/dvb-usb/af9005.c ++++ b/drivers/media/usb/dvb-usb/af9005.c +@@ -554,7 +554,7 @@ static int af9005_boot_packet(struct usb_device *udev, int type, u8 *reply, + u8 *buf, int size) + { + u16 checksum; +- int act_len, i, ret; ++ int act_len = 0, i, ret; + + memset(buf, 0, size); + buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff); +diff --git a/drivers/media/usb/dvb-usb/digitv.c b/drivers/media/usb/dvb-usb/digitv.c +index dd5bb230cec1..99a39339d45d 100644 +--- a/drivers/media/usb/dvb-usb/digitv.c ++++ b/drivers/media/usb/dvb-usb/digitv.c +@@ -230,18 +230,22 @@ static struct rc_map_table rc_map_digitv_table[] = { + + static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + { +- int i; ++ int ret, i; + u8 key[5]; + u8 b[4] = { 0 }; + + *event = 0; + *state = REMOTE_NO_KEY_PRESSED; + +- digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4); ++ ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4); ++ if (ret) ++ return ret; + + /* Tell the device we've read the remote. Not sure how necessary + this is, but the Nebula SDK does it. */ +- digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0); ++ ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0); ++ if (ret) ++ return ret; + + /* if something is inside the buffer, simulate key press */ + if (key[1] != 0) +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-urb.c b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +index c1b4e94a37f8..2aabf90d8697 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-urb.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +@@ -12,7 +12,7 @@ + int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, + u16 rlen, int delay_ms) + { +- int actlen,ret = -ENOMEM; ++ int actlen = 0, ret = -ENOMEM; + + if (!d || wbuf == NULL || wlen == 0) + return -EINVAL; +diff --git a/drivers/media/usb/dvb-usb/vp7045.c b/drivers/media/usb/dvb-usb/vp7045.c +index 80c1cf05384b..2baf57216d19 100644 +--- a/drivers/media/usb/dvb-usb/vp7045.c ++++ b/drivers/media/usb/dvb-usb/vp7045.c +@@ -96,10 +96,14 @@ static int vp7045_power_ctrl(struct dvb_usb_device *d, int onoff) + + static int vp7045_rc_query(struct dvb_usb_device *d) + { ++ int ret; + u8 key; +- vp7045_usb_op(d,RC_VAL_READ,NULL,0,&key,1,20); + +- deb_rc("remote query key: %x %d\n",key,key); ++ ret = vp7045_usb_op(d, RC_VAL_READ, NULL, 0, &key, 1, 20); ++ if (ret) ++ return ret; ++ ++ deb_rc("remote query key: %x\n", key); + + if (key != 0x44) { + /* +@@ -115,15 +119,18 @@ static int vp7045_rc_query(struct dvb_usb_device *d) + + static int vp7045_read_eeprom(struct dvb_usb_device *d,u8 *buf, int len, int offset) + { +- int i = 0; +- u8 v,br[2]; ++ int i, ret; ++ u8 v, br[2]; + for (i=0; i < len; i++) { + v = offset + i; +- vp7045_usb_op(d,GET_EE_VALUE,&v,1,br,2,5); ++ ret = vp7045_usb_op(d, GET_EE_VALUE, &v, 1, br, 2, 5); ++ if (ret) ++ return ret; ++ + buf[i] = br[1]; + } +- deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ",offset, i); +- debug_dump(buf,i,deb_info); ++ deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ", offset, i); ++ debug_dump(buf, i, deb_info); + return 0; + } + +diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c +index 4add2b12d330..c1b307bbe540 100644 +--- a/drivers/media/usb/gspca/gspca.c ++++ b/drivers/media/usb/gspca/gspca.c +@@ -1461,7 +1461,7 @@ int gspca_dev_probe2(struct usb_interface *intf, + pr_err("couldn't kzalloc gspca struct\n"); + return -ENOMEM; + } +- gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); ++ gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL); + if (!gspca_dev->usb_buf) { + pr_err("out of memory\n"); + ret = -ENOMEM; +diff --git a/drivers/misc/lkdtm/bugs.c b/drivers/misc/lkdtm/bugs.c +index 7284a22b1a09..4d5a512769e9 100644 +--- a/drivers/misc/lkdtm/bugs.c ++++ b/drivers/misc/lkdtm/bugs.c +@@ -274,7 +274,7 @@ void lkdtm_STACK_GUARD_PAGE_TRAILING(void) + + void lkdtm_UNSET_SMEP(void) + { +-#ifdef CONFIG_X86_64 ++#if IS_ENABLED(CONFIG_X86_64) && !IS_ENABLED(CONFIG_UML) + #define MOV_CR4_DEPTH 64 + void (*direct_write_cr4)(unsigned long val); + unsigned char *insn; +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +index fb8ade9a05a9..2ce96cc1bad4 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +@@ -70,8 +70,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos) + static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = seq_tab_get_idx(seq->private, *pos + 1); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +index 1a407d3c1d67..e6fe2870137b 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +@@ -682,8 +682,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos) + static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = l2t_get_idx(seq, *pos); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c +index 41c6fa200e74..e1901874c19f 100644 +--- a/drivers/net/ethernet/freescale/fman/fman_memac.c ++++ b/drivers/net/ethernet/freescale/fman/fman_memac.c +@@ -110,7 +110,7 @@ do { \ + /* Interface Mode Register (IF_MODE) */ + + #define IF_MODE_MASK 0x00000003 /* 30-31 Mask on i/f mode bits */ +-#define IF_MODE_XGMII 0x00000000 /* 30-31 XGMII (10G) interface */ ++#define IF_MODE_10G 0x00000000 /* 30-31 10G interface */ + #define IF_MODE_GMII 0x00000002 /* 30-31 GMII (1G) interface */ + #define IF_MODE_RGMII 0x00000004 + #define IF_MODE_RGMII_AUTO 0x00008000 +@@ -440,7 +440,7 @@ static int init(struct memac_regs __iomem *regs, struct memac_cfg *cfg, + tmp = 0; + switch (phy_if) { + case PHY_INTERFACE_MODE_XGMII: +- tmp |= IF_MODE_XGMII; ++ tmp |= IF_MODE_10G; + break; + default: + tmp |= IF_MODE_GMII; +diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c b/drivers/net/ethernet/freescale/xgmac_mdio.c +index e03b30c60dcf..c82c85ef5fb3 100644 +--- a/drivers/net/ethernet/freescale/xgmac_mdio.c ++++ b/drivers/net/ethernet/freescale/xgmac_mdio.c +@@ -49,6 +49,7 @@ struct tgec_mdio_controller { + struct mdio_fsl_priv { + struct tgec_mdio_controller __iomem *mdio_base; + bool is_little_endian; ++ bool has_a011043; + }; + + static u32 xgmac_read32(void __iomem *regs, +@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) + return ret; + + /* Return all Fs if nothing was there */ +- if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) { ++ if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && ++ !priv->has_a011043) { + dev_err(&bus->dev, + "Error while reading PHY%d reg at %d.%hhu\n", + phy_id, dev_addr, regnum); +@@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) + priv->is_little_endian = of_property_read_bool(pdev->dev.of_node, + "little-endian"); + ++ priv->has_a011043 = of_property_read_bool(pdev->dev.of_node, ++ "fsl,erratum-a011043"); ++ + ret = of_mdiobus_register(bus, np); + if (ret) { + dev_err(&pdev->dev, "cannot register MDIO bus\n"); +diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h +index 6c51b1bad8c4..37a2314d3e6b 100644 +--- a/drivers/net/ethernet/intel/e1000e/e1000.h ++++ b/drivers/net/ethernet/intel/e1000e/e1000.h +@@ -185,13 +185,12 @@ struct e1000_phy_regs { + + /* board specific private data structure */ + struct e1000_adapter { ++ struct timer_list watchdog_timer; + struct timer_list phy_info_timer; + struct timer_list blink_timer; + + struct work_struct reset_task; +- struct delayed_work watchdog_task; +- +- struct workqueue_struct *e1000_workqueue; ++ struct work_struct watchdog_task; + + const struct e1000_info *ei; + +diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c +index d7d56e42a6aa..c27ed7363768 100644 +--- a/drivers/net/ethernet/intel/e1000e/netdev.c ++++ b/drivers/net/ethernet/intel/e1000e/netdev.c +@@ -1780,8 +1780,7 @@ static irqreturn_t e1000_intr_msi(int __always_unused irq, void *data) + } + /* guard against interrupt when we're going down */ + if (!test_bit(__E1000_DOWN, &adapter->state)) +- mod_delayed_work(adapter->e1000_workqueue, +- &adapter->watchdog_task, HZ); ++ mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + + /* Reset on uncorrectable ECC error */ +@@ -1861,8 +1860,7 @@ static irqreturn_t e1000_intr(int __always_unused irq, void *data) + } + /* guard against interrupt when we're going down */ + if (!test_bit(__E1000_DOWN, &adapter->state)) +- mod_delayed_work(adapter->e1000_workqueue, +- &adapter->watchdog_task, HZ); ++ mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + + /* Reset on uncorrectable ECC error */ +@@ -1907,8 +1905,7 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data) + hw->mac.get_link_status = true; + /* guard against interrupt when we're going down */ + if (!test_bit(__E1000_DOWN, &adapter->state)) +- mod_delayed_work(adapter->e1000_workqueue, +- &adapter->watchdog_task, HZ); ++ mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + + if (!test_bit(__E1000_DOWN, &adapter->state)) +@@ -4281,6 +4278,7 @@ void e1000e_down(struct e1000_adapter *adapter, bool reset) + + napi_synchronize(&adapter->napi); + ++ del_timer_sync(&adapter->watchdog_timer); + del_timer_sync(&adapter->phy_info_timer); + + spin_lock(&adapter->stats64_lock); +@@ -5152,11 +5150,25 @@ static void e1000e_check_82574_phy_workaround(struct e1000_adapter *adapter) + } + } + ++/** ++ * e1000_watchdog - Timer Call-back ++ * @data: pointer to adapter cast into an unsigned long ++ **/ ++static void e1000_watchdog(struct timer_list *t) ++{ ++ struct e1000_adapter *adapter = from_timer(adapter, t, watchdog_timer); ++ ++ /* Do the rest outside of interrupt context */ ++ schedule_work(&adapter->watchdog_task); ++ ++ /* TODO: make this use queue_delayed_work() */ ++} ++ + static void e1000_watchdog_task(struct work_struct *work) + { + struct e1000_adapter *adapter = container_of(work, + struct e1000_adapter, +- watchdog_task.work); ++ watchdog_task); + struct net_device *netdev = adapter->netdev; + struct e1000_mac_info *mac = &adapter->hw.mac; + struct e1000_phy_info *phy = &adapter->hw.phy; +@@ -5404,9 +5416,8 @@ link_up: + + /* Reset the timer */ + if (!test_bit(__E1000_DOWN, &adapter->state)) +- queue_delayed_work(adapter->e1000_workqueue, +- &adapter->watchdog_task, +- round_jiffies(2 * HZ)); ++ mod_timer(&adapter->watchdog_timer, ++ round_jiffies(jiffies + 2 * HZ)); + } + + #define E1000_TX_FLAGS_CSUM 0x00000001 +@@ -7259,21 +7270,11 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + goto err_eeprom; + } + +- adapter->e1000_workqueue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, +- e1000e_driver_name); +- +- if (!adapter->e1000_workqueue) { +- err = -ENOMEM; +- goto err_workqueue; +- } +- +- INIT_DELAYED_WORK(&adapter->watchdog_task, e1000_watchdog_task); +- queue_delayed_work(adapter->e1000_workqueue, &adapter->watchdog_task, +- 0); +- ++ timer_setup(&adapter->watchdog_timer, e1000_watchdog, 0); + timer_setup(&adapter->phy_info_timer, e1000_update_phy_info, 0); + + INIT_WORK(&adapter->reset_task, e1000_reset_task); ++ INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); + INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround); + INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task); + INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang); +@@ -7367,9 +7368,6 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + return 0; + + err_register: +- flush_workqueue(adapter->e1000_workqueue); +- destroy_workqueue(adapter->e1000_workqueue); +-err_workqueue: + if (!(adapter->flags & FLAG_HAS_AMT)) + e1000e_release_hw_control(adapter); + err_eeprom: +@@ -7407,26 +7405,22 @@ static void e1000_remove(struct pci_dev *pdev) + { + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev_priv(netdev); +- bool down = test_bit(__E1000_DOWN, &adapter->state); + + e1000e_ptp_remove(adapter); + + /* The timers may be rescheduled, so explicitly disable them + * from being rescheduled. + */ +- if (!down) +- set_bit(__E1000_DOWN, &adapter->state); ++ set_bit(__E1000_DOWN, &adapter->state); ++ del_timer_sync(&adapter->watchdog_timer); + del_timer_sync(&adapter->phy_info_timer); + + cancel_work_sync(&adapter->reset_task); ++ cancel_work_sync(&adapter->watchdog_task); + cancel_work_sync(&adapter->downshift_task); + cancel_work_sync(&adapter->update_phy_task); + cancel_work_sync(&adapter->print_hang_task); + +- cancel_delayed_work(&adapter->watchdog_task); +- flush_workqueue(adapter->e1000_workqueue); +- destroy_workqueue(adapter->e1000_workqueue); +- + if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) { + cancel_work_sync(&adapter->tx_hwtstamp_work); + if (adapter->tx_hwtstamp_skb) { +@@ -7435,9 +7429,6 @@ static void e1000_remove(struct pci_dev *pdev) + } + } + +- /* Don't lie to e1000_close() down the road. */ +- if (!down) +- clear_bit(__E1000_DOWN, &adapter->state); + unregister_netdev(netdev); + + if (pci_dev_run_wake(pdev)) +diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +index 3d2440838822..3515ace0f020 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +@@ -2322,6 +2322,22 @@ static int i40e_ctrl_vf_rx_rings(struct i40e_vsi *vsi, unsigned long q_map, + return ret; + } + ++/** ++ * i40e_vc_validate_vqs_bitmaps - validate Rx/Tx queue bitmaps from VIRTHCHNL ++ * @vqs: virtchnl_queue_select structure containing bitmaps to validate ++ * ++ * Returns true if validation was successful, else false. ++ */ ++static bool i40e_vc_validate_vqs_bitmaps(struct virtchnl_queue_select *vqs) ++{ ++ if ((!vqs->rx_queues && !vqs->tx_queues) || ++ vqs->rx_queues >= BIT(I40E_MAX_VF_QUEUES) || ++ vqs->tx_queues >= BIT(I40E_MAX_VF_QUEUES)) ++ return false; ++ ++ return true; ++} ++ + /** + * i40e_vc_enable_queues_msg + * @vf: pointer to the VF info +@@ -2347,7 +2363,7 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg) + goto error_param; + } + +- if ((0 == vqs->rx_queues) && (0 == vqs->tx_queues)) { ++ if (i40e_vc_validate_vqs_bitmaps(vqs)) { + aq_ret = I40E_ERR_PARAM; + goto error_param; + } +@@ -2409,9 +2425,7 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf *vf, u8 *msg) + goto error_param; + } + +- if ((vqs->rx_queues == 0 && vqs->tx_queues == 0) || +- vqs->rx_queues > I40E_MAX_VF_QUEUES || +- vqs->tx_queues > I40E_MAX_VF_QUEUES) { ++ if (i40e_vc_validate_vqs_bitmaps(vqs)) { + aq_ret = I40E_ERR_PARAM; + goto error_param; + } +diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h +index 29de3ae96ef2..bd1b1ed323f4 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf.h ++++ b/drivers/net/ethernet/intel/iavf/iavf.h +@@ -415,4 +415,6 @@ void iavf_enable_channels(struct iavf_adapter *adapter); + void iavf_disable_channels(struct iavf_adapter *adapter); + void iavf_add_cloud_filter(struct iavf_adapter *adapter); + void iavf_del_cloud_filter(struct iavf_adapter *adapter); ++struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, ++ const u8 *macaddr); + #endif /* _IAVF_H_ */ +diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c +index 821987da5698..8e16be960e96 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_main.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c +@@ -743,9 +743,8 @@ iavf_mac_filter *iavf_find_filter(struct iavf_adapter *adapter, + * + * Returns ptr to the filter object or NULL when no memory available. + **/ +-static struct +-iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, +- const u8 *macaddr) ++struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, ++ const u8 *macaddr) + { + struct iavf_mac_filter *f; + +@@ -2065,9 +2064,9 @@ static void iavf_reset_task(struct work_struct *work) + struct virtchnl_vf_resource *vfres = adapter->vf_res; + struct net_device *netdev = adapter->netdev; + struct iavf_hw *hw = &adapter->hw; ++ struct iavf_mac_filter *f, *ftmp; + struct iavf_vlan_filter *vlf; + struct iavf_cloud_filter *cf; +- struct iavf_mac_filter *f; + u32 reg_val; + int i = 0, err; + bool running; +@@ -2181,6 +2180,16 @@ continue_reset: + + spin_lock_bh(&adapter->mac_vlan_list_lock); + ++ /* Delete filter for the current MAC address, it could have ++ * been changed by the PF via administratively set MAC. ++ * Will be re-added via VIRTCHNL_OP_GET_VF_RESOURCES. ++ */ ++ list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) { ++ if (ether_addr_equal(f->macaddr, adapter->hw.mac.addr)) { ++ list_del(&f->list); ++ kfree(f); ++ } ++ } + /* re-add all MAC filters */ + list_for_each_entry(f, &adapter->mac_filter_list, list) { + f->add = true; +diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +index c46770eba320..1ab9cb339acb 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +@@ -1359,6 +1359,9 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, + ether_addr_copy(netdev->perm_addr, + adapter->hw.mac.addr); + } ++ spin_lock_bh(&adapter->mac_vlan_list_lock); ++ iavf_add_filter(adapter, adapter->hw.mac.addr); ++ spin_unlock_bh(&adapter->mac_vlan_list_lock); + iavf_process_config(adapter); + } + break; +diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c +index 8a6ef3514129..438b42ce2cd9 100644 +--- a/drivers/net/ethernet/intel/igb/e1000_82575.c ++++ b/drivers/net/ethernet/intel/igb/e1000_82575.c +@@ -530,7 +530,7 @@ static s32 igb_set_sfp_media_type_82575(struct e1000_hw *hw) + dev_spec->module_plugged = true; + if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) { + hw->phy.media_type = e1000_media_type_internal_serdes; +- } else if (eth_flags->e100_base_fx) { ++ } else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { + dev_spec->sgmii_active = true; + hw->phy.media_type = e1000_media_type_internal_serdes; + } else if (eth_flags->e1000_base_t) { +@@ -657,14 +657,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw) + break; + } + +- /* do not change link mode for 100BaseFX */ +- if (dev_spec->eth_flags.e100_base_fx) +- break; +- + /* change current link mode setting */ + ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK; + +- if (hw->phy.media_type == e1000_media_type_copper) ++ if (dev_spec->sgmii_active) + ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII; + else + ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES; +diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c +index 3182b059bf55..8959418776f6 100644 +--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c ++++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c +@@ -181,7 +181,7 @@ static int igb_get_link_ksettings(struct net_device *netdev, + advertising &= ~ADVERTISED_1000baseKX_Full; + } + } +- if (eth_flags->e100_base_fx) { ++ if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { + supported |= SUPPORTED_100baseT_Full; + advertising |= ADVERTISED_100baseT_Full; + } +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +index c6404abf2dd1..a26f9fb95ac0 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +@@ -5239,7 +5239,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + struct ixgbe_hw *hw = &adapter->hw; + struct hlist_node *node2; + struct ixgbe_fdir_filter *filter; +- u64 action; ++ u8 queue; + + spin_lock(&adapter->fdir_perfect_lock); + +@@ -5248,17 +5248,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + + hlist_for_each_entry_safe(filter, node2, + &adapter->fdir_filter_list, fdir_node) { +- action = filter->action; +- if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) +- action = +- (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; ++ if (filter->action == IXGBE_FDIR_DROP_QUEUE) { ++ queue = IXGBE_FDIR_DROP_QUEUE; ++ } else { ++ u32 ring = ethtool_get_flow_spec_ring(filter->action); ++ u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); ++ ++ if (!vf && (ring >= adapter->num_rx_queues)) { ++ e_err(drv, "FDIR restore failed without VF, ring: %u\n", ++ ring); ++ continue; ++ } else if (vf && ++ ((vf > adapter->num_vfs) || ++ ring >= adapter->num_rx_queues_per_pool)) { ++ e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", ++ vf, ring); ++ continue; ++ } ++ ++ /* Map the ring onto the absolute queue index */ ++ if (!vf) ++ queue = adapter->rx_ring[ring]->reg_idx; ++ else ++ queue = ((vf - 1) * ++ adapter->num_rx_queues_per_pool) + ring; ++ } + + ixgbe_fdir_write_perfect_filter_82599(hw, +- &filter->filter, +- filter->sw_idx, +- (action == IXGBE_FDIR_DROP_QUEUE) ? +- IXGBE_FDIR_DROP_QUEUE : +- adapter->rx_ring[action]->reg_idx); ++ &filter->filter, filter->sw_idx, queue); + } + + spin_unlock(&adapter->fdir_perfect_lock); +diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +index 076f2da36f27..64ec0e7c64b4 100644 +--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c ++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +@@ -2081,11 +2081,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev) + struct ixgbe_hw *hw = &adapter->hw; + int count = 0; + +- if ((netdev_uc_count(netdev)) > 10) { +- pr_err("Too many unicast filters - No Space\n"); +- return -ENOSPC; +- } +- + if (!netdev_uc_empty(netdev)) { + struct netdev_hw_addr *ha; + +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +index a496390b8632..07f9067affc6 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +@@ -2043,6 +2043,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, + break; + } + entry += p_hdr->size; ++ cond_resched(); + } + p_dev->ahw->reset.seq_index = index; + } +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +index afa10a163da1..f34ae8c75bc5 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, + addr += 16; + reg_read -= 16; + ret += 16; ++ cond_resched(); + } + out: + mutex_unlock(&adapter->ahw->mem_lock); +@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) + buf_offset += entry->hdr.cap_size; + entry_offset += entry->hdr.offset; + buffer = fw_dump->data + buf_offset; ++ cond_resched(); + } + + fw_dump->clr = 1; +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 4196c0e32740..9485c8d1de8a 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1062,6 +1062,7 @@ static const struct usb_device_id products[] = { + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ ++ {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ + + /* 3. Combined interface devices matching on interface number */ + {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ +diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c +index 9e4b7a400284..6912624eed4a 100644 +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -29,7 +29,7 @@ + #define NETNEXT_VERSION "10" + + /* Information for net */ +-#define NET_VERSION "10" ++#define NET_VERSION "11" + + #define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION + #define DRIVER_AUTHOR "Realtek linux nic maintainers " +@@ -63,6 +63,7 @@ + #define PLA_LED_FEATURE 0xdd92 + #define PLA_PHYAR 0xde00 + #define PLA_BOOT_CTRL 0xe004 ++#define PLA_LWAKE_CTRL_REG 0xe007 + #define PLA_GPHY_INTR_IMR 0xe022 + #define PLA_EEE_CR 0xe040 + #define PLA_EEEP_CR 0xe080 +@@ -90,6 +91,7 @@ + #define PLA_TALLYCNT 0xe890 + #define PLA_SFF_STS_7 0xe8de + #define PLA_PHYSTATUS 0xe908 ++#define PLA_CONFIG6 0xe90a /* CONFIG6 */ + #define PLA_BP_BA 0xfc26 + #define PLA_BP_0 0xfc28 + #define PLA_BP_1 0xfc2a +@@ -102,6 +104,7 @@ + #define PLA_BP_EN 0xfc38 + + #define USB_USB2PHY 0xb41e ++#define USB_SSPHYLINK1 0xb426 + #define USB_SSPHYLINK2 0xb428 + #define USB_U2P3_CTRL 0xb460 + #define USB_CSR_DUMMY1 0xb464 +@@ -286,6 +289,9 @@ + #define LINK_ON_WAKE_EN 0x0010 + #define LINK_OFF_WAKE_EN 0x0008 + ++/* PLA_CONFIG6 */ ++#define LANWAKE_CLR_EN BIT(0) ++ + /* PLA_CONFIG5 */ + #define BWF_EN 0x0040 + #define MWF_EN 0x0020 +@@ -298,6 +304,7 @@ + /* PLA_PHY_PWR */ + #define TX_10M_IDLE_EN 0x0080 + #define PFM_PWM_SWITCH 0x0040 ++#define TEST_IO_OFF BIT(4) + + /* PLA_MAC_PWR_CTRL */ + #define D3_CLK_GATED_EN 0x00004000 +@@ -310,6 +317,7 @@ + #define MAC_CLK_SPDWN_EN BIT(15) + + /* PLA_MAC_PWR_CTRL3 */ ++#define PLA_MCU_SPDWN_EN BIT(14) + #define PKT_AVAIL_SPDWN_EN 0x0100 + #define SUSPEND_SPDWN_EN 0x0004 + #define U1U2_SPDWN_EN 0x0002 +@@ -340,6 +348,9 @@ + /* PLA_BOOT_CTRL */ + #define AUTOLOAD_DONE 0x0002 + ++/* PLA_LWAKE_CTRL_REG */ ++#define LANWAKE_PIN BIT(7) ++ + /* PLA_SUSPEND_FLAG */ + #define LINK_CHG_EVENT BIT(0) + +@@ -353,6 +364,9 @@ + #define USB2PHY_SUSPEND 0x0001 + #define USB2PHY_L1 0x0002 + ++/* USB_SSPHYLINK1 */ ++#define DELAY_PHY_PWR_CHG BIT(1) ++ + /* USB_SSPHYLINK2 */ + #define pwd_dn_scale_mask 0x3ffe + #define pwd_dn_scale(x) ((x) << 1) +@@ -3175,7 +3189,6 @@ static void rtl8153b_runtime_enable(struct r8152 *tp, bool enable) + r8153b_ups_en(tp, false); + r8153_queue_wake(tp, false); + rtl_runtime_suspend_enable(tp, false); +- r8153_u2p3en(tp, true); + r8153b_u1u2en(tp, true); + } + } +@@ -3703,7 +3716,6 @@ static void r8153b_hw_phy_cfg(struct r8152 *tp) + + r8153_aldps_en(tp, true); + r8152b_enable_fc(tp); +- r8153_u2p3en(tp, true); + + set_bit(PHY_RESET, &tp->flags); + } +@@ -4004,6 +4016,8 @@ static void rtl8152_down(struct r8152 *tp) + + static void rtl8153_up(struct r8152 *tp) + { ++ u32 ocp_data; ++ + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + return; + +@@ -4011,6 +4025,19 @@ static void rtl8153_up(struct r8152 *tp) + r8153_u2p3en(tp, false); + r8153_aldps_en(tp, false); + r8153_first_init(tp); ++ ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); ++ ocp_data |= LANWAKE_CLR_EN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); ++ ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG); ++ ocp_data &= ~LANWAKE_PIN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data); ++ ++ ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_SSPHYLINK1); ++ ocp_data &= ~DELAY_PHY_PWR_CHG; ++ ocp_write_word(tp, MCU_TYPE_USB, USB_SSPHYLINK1, ocp_data); ++ + r8153_aldps_en(tp, true); + + switch (tp->version) { +@@ -4029,11 +4056,17 @@ static void rtl8153_up(struct r8152 *tp) + + static void rtl8153_down(struct r8152 *tp) + { ++ u32 ocp_data; ++ + if (test_bit(RTL8152_UNPLUG, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } + ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); ++ ocp_data &= ~LANWAKE_CLR_EN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); ++ + r8153_u1u2en(tp, false); + r8153_u2p3en(tp, false); + r8153_power_cut_en(tp, false); +@@ -4044,6 +4077,8 @@ static void rtl8153_down(struct r8152 *tp) + + static void rtl8153b_up(struct r8152 *tp) + { ++ u32 ocp_data; ++ + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + return; + +@@ -4054,18 +4089,27 @@ static void rtl8153b_up(struct r8152 *tp) + r8153_first_init(tp); + ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_B); + ++ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); ++ ocp_data &= ~PLA_MCU_SPDWN_EN; ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); ++ + r8153_aldps_en(tp, true); +- r8153_u2p3en(tp, true); + r8153b_u1u2en(tp, true); + } + + static void rtl8153b_down(struct r8152 *tp) + { ++ u32 ocp_data; ++ + if (test_bit(RTL8152_UNPLUG, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } + ++ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); ++ ocp_data |= PLA_MCU_SPDWN_EN; ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); ++ + r8153b_u1u2en(tp, false); + r8153_u2p3en(tp, false); + r8153b_power_cut_en(tp, false); +@@ -4454,6 +4498,14 @@ static void r8153_init(struct r8152 *tp) + r8153_mac_clk_spd(tp, false); + usb_enable_lpm(tp->udev); + ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); ++ ocp_data |= LANWAKE_CLR_EN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); ++ ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG); ++ ocp_data &= ~LANWAKE_PIN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data); ++ + /* rx aggregation */ + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); + ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); +@@ -4526,6 +4578,19 @@ static void r8153b_init(struct r8152 *tp) + ocp_data |= MAC_CLK_SPDWN_EN; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, ocp_data); + ++ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); ++ ocp_data &= ~PLA_MCU_SPDWN_EN; ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); ++ ++ if (tp->version == RTL_VER_09) { ++ /* Disable Test IO for 32QFN */ ++ if (ocp_read_byte(tp, MCU_TYPE_PLA, 0xdc00) & BIT(5)) { ++ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); ++ ocp_data |= TEST_IO_OFF; ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); ++ } ++ } ++ + set_bit(GREEN_ETHERNET, &tp->flags); + + /* rx aggregation */ +@@ -5690,6 +5755,11 @@ static int rtl8152_probe(struct usb_interface *intf, + + intf->needs_remote_wakeup = 1; + ++ if (!rtl_can_wakeup(tp)) ++ __rtl_set_wol(tp, 0); ++ else ++ tp->saved_wolopts = __rtl_get_wol(tp); ++ + tp->rtl_ops.init(tp); + queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0); + set_ethernet_addr(tp); +@@ -5703,10 +5773,6 @@ static int rtl8152_probe(struct usb_interface *intf, + goto out1; + } + +- if (!rtl_can_wakeup(tp)) +- __rtl_set_wol(tp, 0); +- +- tp->saved_wolopts = __rtl_get_wol(tp); + if (tp->saved_wolopts) + device_set_wakeup_enable(&udev->dev, true); + else +diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c +index 3029e3f6de63..621cd7206b7c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c +@@ -267,7 +267,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv, + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + struct iwl_station_priv *sta_priv = NULL; + struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; +- struct iwl_device_cmd *dev_cmd; ++ struct iwl_device_tx_cmd *dev_cmd; + struct iwl_tx_cmd *tx_cmd; + __le16 fc; + u8 hdr_len; +@@ -348,7 +348,6 @@ int iwlagn_tx_skb(struct iwl_priv *priv, + if (unlikely(!dev_cmd)) + goto drop_unlock_priv; + +- memset(dev_cmd, 0, sizeof(*dev_cmd)); + dev_cmd->hdr.cmd = REPLY_TX; + tx_cmd = (struct iwl_tx_cmd *) dev_cmd->payload; + +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +index 87421807e040..386ca67ec7b4 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +@@ -2490,12 +2490,7 @@ int iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, + { + int ret = 0; + +- /* if the FW crashed or not debug monitor cfg was given, there is +- * no point in changing the recording state +- */ +- if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status) || +- (!fwrt->trans->dbg.dest_tlv && +- fwrt->trans->dbg.ini_dest == IWL_FW_INI_LOCATION_INVALID)) ++ if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) + return 0; + + if (fw_has_capa(&fwrt->fw->ucode_capa, +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +index c8972f6e38ba..5d546dac7814 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +@@ -225,6 +225,34 @@ enum iwl_nvm_channel_flags { + NVM_CHANNEL_DC_HIGH = BIT(12), + }; + ++/** ++ * enum iwl_reg_capa_flags - global flags applied for the whole regulatory ++ * domain. ++ * @REG_CAPA_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the ++ * 2.4Ghz band is allowed. ++ * @REG_CAPA_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the ++ * 5Ghz band is allowed. ++ * @REG_CAPA_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed ++ * for this regulatory domain (valid only in 5Ghz). ++ * @REG_CAPA_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed ++ * for this regulatory domain (valid only in 5Ghz). ++ * @REG_CAPA_MCS_8_ALLOWED: 11ac with MCS 8 is allowed. ++ * @REG_CAPA_MCS_9_ALLOWED: 11ac with MCS 9 is allowed. ++ * @REG_CAPA_40MHZ_FORBIDDEN: 11n channel with a width of 40Mhz is forbidden ++ * for this regulatory domain (valid only in 5Ghz). ++ * @REG_CAPA_DC_HIGH_ENABLED: DC HIGH allowed. ++ */ ++enum iwl_reg_capa_flags { ++ REG_CAPA_BF_CCD_LOW_BAND = BIT(0), ++ REG_CAPA_BF_CCD_HIGH_BAND = BIT(1), ++ REG_CAPA_160MHZ_ALLOWED = BIT(2), ++ REG_CAPA_80MHZ_ALLOWED = BIT(3), ++ REG_CAPA_MCS_8_ALLOWED = BIT(4), ++ REG_CAPA_MCS_9_ALLOWED = BIT(5), ++ REG_CAPA_40MHZ_FORBIDDEN = BIT(7), ++ REG_CAPA_DC_HIGH_ENABLED = BIT(9), ++}; ++ + static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level, + int chan, u32 flags) + { +@@ -1031,6 +1059,7 @@ IWL_EXPORT_SYMBOL(iwl_parse_nvm_data); + + static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan, + int ch_idx, u16 nvm_flags, ++ u16 cap_flags, + const struct iwl_cfg *cfg) + { + u32 flags = NL80211_RRF_NO_HT40; +@@ -1069,13 +1098,27 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan, + (flags & NL80211_RRF_NO_IR)) + flags |= NL80211_RRF_GO_CONCURRENT; + ++ /* ++ * cap_flags is per regulatory domain so apply it for every channel ++ */ ++ if (ch_idx >= NUM_2GHZ_CHANNELS) { ++ if (cap_flags & REG_CAPA_40MHZ_FORBIDDEN) ++ flags |= NL80211_RRF_NO_HT40; ++ ++ if (!(cap_flags & REG_CAPA_80MHZ_ALLOWED)) ++ flags |= NL80211_RRF_NO_80MHZ; ++ ++ if (!(cap_flags & REG_CAPA_160MHZ_ALLOWED)) ++ flags |= NL80211_RRF_NO_160MHZ; ++ } ++ + return flags; + } + + struct ieee80211_regdomain * + iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, + int num_of_ch, __le32 *channels, u16 fw_mcc, +- u16 geo_info) ++ u16 geo_info, u16 cap) + { + int ch_idx; + u16 ch_flags; +@@ -1133,7 +1176,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, + } + + reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx, +- ch_flags, cfg); ++ ch_flags, cap, ++ cfg); + + /* we can't continue the same rule */ + if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags || +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h +index b7e1ddf8f177..4eeedb41e9ac 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h +@@ -7,7 +7,7 @@ + * + * Copyright(c) 2008 - 2015 Intel Corporation. All rights reserved. + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH +- * Copyright(c) 2018 Intel Corporation ++ * Copyright(c) 2018 - 2019 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as +@@ -29,7 +29,7 @@ + * + * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH +- * Copyright(c) 2018 Intel Corporation ++ * Copyright(c) 2018 - 2019 Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without +@@ -103,7 +103,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg, + struct ieee80211_regdomain * + iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, + int num_of_ch, __le32 *channels, u16 fw_mcc, +- u16 geo_info); ++ u16 geo_info, u16 cap); + + /** + * struct iwl_nvm_section - describes an NVM section in memory. +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c +index 28bdc9a9617e..f91197e4ae40 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c +@@ -66,7 +66,9 @@ + + struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, + struct device *dev, +- const struct iwl_trans_ops *ops) ++ const struct iwl_trans_ops *ops, ++ unsigned int cmd_pool_size, ++ unsigned int cmd_pool_align) + { + struct iwl_trans *trans; + #ifdef CONFIG_LOCKDEP +@@ -90,10 +92,8 @@ struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, + "iwl_cmd_pool:%s", dev_name(trans->dev)); + trans->dev_cmd_pool = + kmem_cache_create(trans->dev_cmd_pool_name, +- sizeof(struct iwl_device_cmd), +- sizeof(void *), +- SLAB_HWCACHE_ALIGN, +- NULL); ++ cmd_pool_size, cmd_pool_align, ++ SLAB_HWCACHE_ALIGN, NULL); + if (!trans->dev_cmd_pool) + return NULL; + +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +index a31408188ed0..1e85d59b9161 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +@@ -193,6 +193,18 @@ struct iwl_device_cmd { + }; + } __packed; + ++/** ++ * struct iwl_device_tx_cmd - buffer for TX command ++ * @hdr: the header ++ * @payload: the payload placeholder ++ * ++ * The actual structure is sized dynamically according to need. ++ */ ++struct iwl_device_tx_cmd { ++ struct iwl_cmd_header hdr; ++ u8 payload[]; ++} __packed; ++ + #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_device_cmd)) + + /* +@@ -544,7 +556,7 @@ struct iwl_trans_ops { + int (*send_cmd)(struct iwl_trans *trans, struct iwl_host_cmd *cmd); + + int (*tx)(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int queue); ++ struct iwl_device_tx_cmd *dev_cmd, int queue); + void (*reclaim)(struct iwl_trans *trans, int queue, int ssn, + struct sk_buff_head *skbs); + +@@ -921,22 +933,22 @@ iwl_trans_dump_data(struct iwl_trans *trans, u32 dump_mask) + return trans->ops->dump_data(trans, dump_mask); + } + +-static inline struct iwl_device_cmd * ++static inline struct iwl_device_tx_cmd * + iwl_trans_alloc_tx_cmd(struct iwl_trans *trans) + { +- return kmem_cache_alloc(trans->dev_cmd_pool, GFP_ATOMIC); ++ return kmem_cache_zalloc(trans->dev_cmd_pool, GFP_ATOMIC); + } + + int iwl_trans_send_cmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd); + + static inline void iwl_trans_free_tx_cmd(struct iwl_trans *trans, +- struct iwl_device_cmd *dev_cmd) ++ struct iwl_device_tx_cmd *dev_cmd) + { + kmem_cache_free(trans->dev_cmd_pool, dev_cmd); + } + + static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int queue) ++ struct iwl_device_tx_cmd *dev_cmd, int queue) + { + if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status))) + return -EIO; +@@ -1239,7 +1251,9 @@ static inline bool iwl_trans_dbg_ini_valid(struct iwl_trans *trans) + *****************************************************/ + struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, + struct device *dev, +- const struct iwl_trans_ops *ops); ++ const struct iwl_trans_ops *ops, ++ unsigned int cmd_pool_size, ++ unsigned int cmd_pool_align); + void iwl_trans_free(struct iwl_trans *trans); + + /***************************************************** +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +index 49aeab7c27a2..18ccc2692437 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +@@ -256,7 +256,8 @@ struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy, + __le32_to_cpu(resp->n_channels), + resp->channels, + __le16_to_cpu(resp->mcc), +- __le16_to_cpu(resp->geo_info)); ++ __le16_to_cpu(resp->geo_info), ++ __le16_to_cpu(resp->cap)); + /* Store the return source id */ + src_id = resp->source_id; + kfree(resp); +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +index d9d82f6b5e87..2b92980a49e6 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +@@ -487,13 +487,13 @@ static void iwl_mvm_set_tx_cmd_crypto(struct iwl_mvm *mvm, + /* + * Allocates and sets the Tx cmd the driver data pointers in the skb + */ +-static struct iwl_device_cmd * ++static struct iwl_device_tx_cmd * + iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb, + struct ieee80211_tx_info *info, int hdrlen, + struct ieee80211_sta *sta, u8 sta_id) + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +- struct iwl_device_cmd *dev_cmd; ++ struct iwl_device_tx_cmd *dev_cmd; + struct iwl_tx_cmd *tx_cmd; + + dev_cmd = iwl_trans_alloc_tx_cmd(mvm->trans); +@@ -501,11 +501,6 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb, + if (unlikely(!dev_cmd)) + return NULL; + +- /* Make sure we zero enough of dev_cmd */ +- BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_gen2) > sizeof(*tx_cmd)); +- BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_gen3) > sizeof(*tx_cmd)); +- +- memset(dev_cmd, 0, sizeof(dev_cmd->hdr) + sizeof(*tx_cmd)); + dev_cmd->hdr.cmd = TX_CMD; + + if (iwl_mvm_has_new_tx_api(mvm)) { +@@ -594,7 +589,7 @@ out: + } + + static void iwl_mvm_skb_prepare_status(struct sk_buff *skb, +- struct iwl_device_cmd *cmd) ++ struct iwl_device_tx_cmd *cmd) + { + struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb); + +@@ -713,7 +708,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + struct ieee80211_tx_info info; +- struct iwl_device_cmd *dev_cmd; ++ struct iwl_device_tx_cmd *dev_cmd; + u8 sta_id; + int hdrlen = ieee80211_hdrlen(hdr->frame_control); + __le16 fc = hdr->frame_control; +@@ -1075,7 +1070,7 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb, + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + struct iwl_mvm_sta *mvmsta; +- struct iwl_device_cmd *dev_cmd; ++ struct iwl_device_tx_cmd *dev_cmd; + __le16 fc; + u16 seq_number = 0; + u8 tid = IWL_MAX_TID_COUNT; +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +index 1047d48beaa5..9b5b96e34456 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +@@ -305,7 +305,7 @@ struct iwl_cmd_meta { + #define IWL_FIRST_TB_SIZE_ALIGN ALIGN(IWL_FIRST_TB_SIZE, 64) + + struct iwl_pcie_txq_entry { +- struct iwl_device_cmd *cmd; ++ void *cmd; + struct sk_buff *skb; + /* buffer to free after command completes */ + const void *free_buf; +@@ -690,7 +690,7 @@ void iwl_trans_pcie_txq_set_shared_mode(struct iwl_trans *trans, u32 txq_id, + void iwl_trans_pcie_log_scd_error(struct iwl_trans *trans, + struct iwl_txq *txq); + int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int txq_id); ++ struct iwl_device_tx_cmd *dev_cmd, int txq_id); + void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans); + int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd); + void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx); +@@ -1111,7 +1111,7 @@ int iwl_trans_pcie_dyn_txq_alloc(struct iwl_trans *trans, + unsigned int timeout); + void iwl_trans_pcie_dyn_txq_free(struct iwl_trans *trans, int queue); + int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int txq_id); ++ struct iwl_device_tx_cmd *dev_cmd, int txq_id); + int iwl_trans_pcie_gen2_send_hcmd(struct iwl_trans *trans, + struct iwl_host_cmd *cmd); + void iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans); +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +index d3db38c3095b..c76d26708e65 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +@@ -79,6 +79,7 @@ + #include "iwl-agn-hw.h" + #include "fw/error-dump.h" + #include "fw/dbg.h" ++#include "fw/api/tx.h" + #include "internal.h" + #include "iwl-fh.h" + +@@ -3462,19 +3463,34 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, + { + struct iwl_trans_pcie *trans_pcie; + struct iwl_trans *trans; +- int ret, addr_size; ++ int ret, addr_size, txcmd_size, txcmd_align; ++ const struct iwl_trans_ops *ops = &trans_ops_pcie_gen2; ++ ++ if (!cfg_trans->gen2) { ++ ops = &trans_ops_pcie; ++ txcmd_size = sizeof(struct iwl_tx_cmd); ++ txcmd_align = sizeof(void *); ++ } else if (cfg_trans->device_family < IWL_DEVICE_FAMILY_AX210) { ++ txcmd_size = sizeof(struct iwl_tx_cmd_gen2); ++ txcmd_align = 64; ++ } else { ++ txcmd_size = sizeof(struct iwl_tx_cmd_gen3); ++ txcmd_align = 128; ++ } ++ ++ txcmd_size += sizeof(struct iwl_cmd_header); ++ txcmd_size += 36; /* biggest possible 802.11 header */ ++ ++ /* Ensure device TX cmd cannot reach/cross a page boundary in gen2 */ ++ if (WARN_ON(cfg_trans->gen2 && txcmd_size >= txcmd_align)) ++ return ERR_PTR(-EINVAL); + + ret = pcim_enable_device(pdev); + if (ret) + return ERR_PTR(ret); + +- if (cfg_trans->gen2) +- trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), +- &pdev->dev, &trans_ops_pcie_gen2); +- else +- trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), +- &pdev->dev, &trans_ops_pcie); +- ++ trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), &pdev->dev, ops, ++ txcmd_size, txcmd_align); + if (!trans) + return ERR_PTR(-ENOMEM); + +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +index 97cb3a8d505c..ff4c34d7b74f 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +@@ -243,7 +243,8 @@ static int iwl_pcie_gen2_set_tb(struct iwl_trans *trans, + static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans, + struct sk_buff *skb, + struct iwl_tfh_tfd *tfd, int start_len, +- u8 hdr_len, struct iwl_device_cmd *dev_cmd) ++ u8 hdr_len, ++ struct iwl_device_tx_cmd *dev_cmd) + { + #ifdef CONFIG_INET + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); +@@ -371,7 +372,7 @@ out_err: + static struct + iwl_tfh_tfd *iwl_pcie_gen2_build_tx_amsdu(struct iwl_trans *trans, + struct iwl_txq *txq, +- struct iwl_device_cmd *dev_cmd, ++ struct iwl_device_tx_cmd *dev_cmd, + struct sk_buff *skb, + struct iwl_cmd_meta *out_meta, + int hdr_len, +@@ -403,6 +404,10 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx_amsdu(struct iwl_trans *trans, + tb_phys = dma_map_single(trans->dev, tb1_addr, len, DMA_TO_DEVICE); + if (unlikely(dma_mapping_error(trans->dev, tb_phys))) + goto out_err; ++ /* ++ * No need for _with_wa(), we ensure (via alignment) that the data ++ * here can never cross or end at a page boundary. ++ */ + iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, len); + + if (iwl_pcie_gen2_build_amsdu(trans, skb, tfd, +@@ -456,7 +461,7 @@ static int iwl_pcie_gen2_tx_add_frags(struct iwl_trans *trans, + static struct + iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, + struct iwl_txq *txq, +- struct iwl_device_cmd *dev_cmd, ++ struct iwl_device_tx_cmd *dev_cmd, + struct sk_buff *skb, + struct iwl_cmd_meta *out_meta, + int hdr_len, +@@ -496,6 +501,10 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, + tb_phys = dma_map_single(trans->dev, tb1_addr, tb1_len, DMA_TO_DEVICE); + if (unlikely(dma_mapping_error(trans->dev, tb_phys))) + goto out_err; ++ /* ++ * No need for _with_wa(), we ensure (via alignment) that the data ++ * here can never cross or end at a page boundary. ++ */ + iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb1_len); + trace_iwlwifi_dev_tx(trans->dev, skb, tfd, sizeof(*tfd), &dev_cmd->hdr, + IWL_FIRST_TB_SIZE + tb1_len, hdr_len); +@@ -540,7 +549,7 @@ out_err: + static + struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans, + struct iwl_txq *txq, +- struct iwl_device_cmd *dev_cmd, ++ struct iwl_device_tx_cmd *dev_cmd, + struct sk_buff *skb, + struct iwl_cmd_meta *out_meta) + { +@@ -580,7 +589,7 @@ struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans, + } + + int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int txq_id) ++ struct iwl_device_tx_cmd *dev_cmd, int txq_id) + { + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); + struct iwl_cmd_meta *out_meta; +@@ -605,7 +614,7 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, + + /* don't put the packet on the ring, if there is no room */ + if (unlikely(iwl_queue_space(trans, txq) < 3)) { +- struct iwl_device_cmd **dev_cmd_ptr; ++ struct iwl_device_tx_cmd **dev_cmd_ptr; + + dev_cmd_ptr = (void *)((u8 *)skb->cb + + trans_pcie->dev_cmd_offs); +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +index 4806a04cec8c..d3b58334e13e 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +@@ -213,8 +213,8 @@ static void iwl_pcie_txq_update_byte_cnt_tbl(struct iwl_trans *trans, + u8 sec_ctl = 0; + u16 len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE; + __le16 bc_ent; +- struct iwl_tx_cmd *tx_cmd = +- (void *)txq->entries[txq->write_ptr].cmd->payload; ++ struct iwl_device_tx_cmd *dev_cmd = txq->entries[txq->write_ptr].cmd; ++ struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; + u8 sta_id = tx_cmd->sta_id; + + scd_bc_tbl = trans_pcie->scd_bc_tbls.addr; +@@ -257,8 +257,8 @@ static void iwl_pcie_txq_inval_byte_cnt_tbl(struct iwl_trans *trans, + int read_ptr = txq->read_ptr; + u8 sta_id = 0; + __le16 bc_ent; +- struct iwl_tx_cmd *tx_cmd = +- (void *)txq->entries[read_ptr].cmd->payload; ++ struct iwl_device_tx_cmd *dev_cmd = txq->entries[read_ptr].cmd; ++ struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; + + WARN_ON(read_ptr >= TFD_QUEUE_SIZE_MAX); + +@@ -1196,7 +1196,7 @@ void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn, + + while (!skb_queue_empty(&overflow_skbs)) { + struct sk_buff *skb = __skb_dequeue(&overflow_skbs); +- struct iwl_device_cmd *dev_cmd_ptr; ++ struct iwl_device_tx_cmd *dev_cmd_ptr; + + dev_cmd_ptr = *(void **)((u8 *)skb->cb + + trans_pcie->dev_cmd_offs); +@@ -2099,7 +2099,8 @@ static void iwl_compute_pseudo_hdr_csum(void *iph, struct tcphdr *tcph, + static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, + struct iwl_txq *txq, u8 hdr_len, + struct iwl_cmd_meta *out_meta, +- struct iwl_device_cmd *dev_cmd, u16 tb1_len) ++ struct iwl_device_tx_cmd *dev_cmd, ++ u16 tb1_len) + { + struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; + struct iwl_trans_pcie *trans_pcie = txq->trans_pcie; +@@ -2281,7 +2282,8 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, + static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, + struct iwl_txq *txq, u8 hdr_len, + struct iwl_cmd_meta *out_meta, +- struct iwl_device_cmd *dev_cmd, u16 tb1_len) ++ struct iwl_device_tx_cmd *dev_cmd, ++ u16 tb1_len) + { + /* No A-MSDU without CONFIG_INET */ + WARN_ON(1); +@@ -2291,7 +2293,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, + #endif /* CONFIG_INET */ + + int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int txq_id) ++ struct iwl_device_tx_cmd *dev_cmd, int txq_id) + { + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); + struct ieee80211_hdr *hdr; +@@ -2348,7 +2350,7 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, + + /* don't put the packet on the ring, if there is no room */ + if (unlikely(iwl_queue_space(trans, txq) < 3)) { +- struct iwl_device_cmd **dev_cmd_ptr; ++ struct iwl_device_tx_cmd **dev_cmd_ptr; + + dev_cmd_ptr = (void *)((u8 *)skb->cb + + trans_pcie->dev_cmd_offs); +diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c +index d6cdabef264d..4b9e406b8461 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_usb.c ++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c +@@ -805,7 +805,7 @@ static int rsi_probe(struct usb_interface *pfunction, + adapter->device_model = RSI_DEV_9116; + } else { + rsi_dbg(ERR_ZONE, "%s: Unsupported RSI device id 0x%x\n", +- __func__, id ? id->idProduct : 0x0); ++ __func__, id->idProduct); + goto err1; + } + +diff --git a/drivers/platform/x86/gpd-pocket-fan.c b/drivers/platform/x86/gpd-pocket-fan.c +index 73eb1572b966..b471b86c28fe 100644 +--- a/drivers/platform/x86/gpd-pocket-fan.c ++++ b/drivers/platform/x86/gpd-pocket-fan.c +@@ -127,7 +127,7 @@ static int gpd_pocket_fan_probe(struct platform_device *pdev) + int i; + + for (i = 0; i < ARRAY_SIZE(temp_limits); i++) { +- if (temp_limits[i] < 40000 || temp_limits[i] > 70000) { ++ if (temp_limits[i] < 20000 || temp_limits[i] > 90000) { + dev_err(&pdev->dev, "Invalid temp-limit %d (must be between 40000 and 70000)\n", + temp_limits[i]); + temp_limits[0] = TEMP_LIMIT0_DEFAULT; +diff --git a/drivers/platform/x86/intel_pmc_core_pltdrv.c b/drivers/platform/x86/intel_pmc_core_pltdrv.c +index 6fe829f30997..e1266f5c6359 100644 +--- a/drivers/platform/x86/intel_pmc_core_pltdrv.c ++++ b/drivers/platform/x86/intel_pmc_core_pltdrv.c +@@ -44,6 +44,8 @@ static const struct x86_cpu_id intel_pmc_core_platform_ids[] = { + INTEL_CPU_FAM6(KABYLAKE, pmc_core_device), + INTEL_CPU_FAM6(CANNONLAKE_L, pmc_core_device), + INTEL_CPU_FAM6(ICELAKE_L, pmc_core_device), ++ INTEL_CPU_FAM6(COMETLAKE, pmc_core_device), ++ INTEL_CPU_FAM6(COMETLAKE_L, pmc_core_device), + {} + }; + MODULE_DEVICE_TABLE(x86cpu, intel_pmc_core_platform_ids); +diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c +index a1915061932e..5256e3ce84e5 100644 +--- a/drivers/s390/crypto/ap_bus.c ++++ b/drivers/s390/crypto/ap_bus.c +@@ -793,8 +793,6 @@ static int ap_device_probe(struct device *dev) + drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT; + if (!!devres != !!drvres) + return -ENODEV; +- /* (re-)init queue's state machine */ +- ap_queue_reinit_state(to_ap_queue(dev)); + } + + /* Add queue/card to list of active queues/cards */ +diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h +index 433b7b64368d..bb35ba4a8d24 100644 +--- a/drivers/s390/crypto/ap_bus.h ++++ b/drivers/s390/crypto/ap_bus.h +@@ -261,7 +261,7 @@ void ap_queue_prepare_remove(struct ap_queue *aq); + void ap_queue_remove(struct ap_queue *aq); + void ap_queue_suspend(struct ap_device *ap_dev); + void ap_queue_resume(struct ap_device *ap_dev); +-void ap_queue_reinit_state(struct ap_queue *aq); ++void ap_queue_init_state(struct ap_queue *aq); + + struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type, + int comp_device_type, unsigned int functions); +diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c +index dad2be333d82..37c3bdc3642d 100644 +--- a/drivers/s390/crypto/ap_queue.c ++++ b/drivers/s390/crypto/ap_queue.c +@@ -638,7 +638,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type) + aq->ap_dev.device.type = &ap_queue_type; + aq->ap_dev.device_type = device_type; + aq->qid = qid; +- aq->state = AP_STATE_RESET_START; ++ aq->state = AP_STATE_UNBOUND; + aq->interrupt = AP_INTR_DISABLED; + spin_lock_init(&aq->lock); + INIT_LIST_HEAD(&aq->list); +@@ -771,10 +771,11 @@ void ap_queue_remove(struct ap_queue *aq) + spin_unlock_bh(&aq->lock); + } + +-void ap_queue_reinit_state(struct ap_queue *aq) ++void ap_queue_init_state(struct ap_queue *aq) + { + spin_lock_bh(&aq->lock); + aq->state = AP_STATE_RESET_START; + ap_wait(ap_sm_event(aq, AP_EVENT_POLL)); + spin_unlock_bh(&aq->lock); + } ++EXPORT_SYMBOL(ap_queue_init_state); +diff --git a/drivers/s390/crypto/zcrypt_cex2a.c b/drivers/s390/crypto/zcrypt_cex2a.c +index c50f3e86cc74..7cbb384ec535 100644 +--- a/drivers/s390/crypto/zcrypt_cex2a.c ++++ b/drivers/s390/crypto/zcrypt_cex2a.c +@@ -175,6 +175,7 @@ static int zcrypt_cex2a_queue_probe(struct ap_device *ap_dev) + zq->queue = aq; + zq->online = 1; + atomic_set(&zq->load, 0); ++ ap_queue_init_state(aq); + ap_queue_init_reply(aq, &zq->reply); + aq->request_timeout = CEX2A_CLEANUP_TIME, + aq->private = zq; +diff --git a/drivers/s390/crypto/zcrypt_cex2c.c b/drivers/s390/crypto/zcrypt_cex2c.c +index 35c7c6672713..c78c0d119806 100644 +--- a/drivers/s390/crypto/zcrypt_cex2c.c ++++ b/drivers/s390/crypto/zcrypt_cex2c.c +@@ -220,6 +220,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev) + zq->queue = aq; + zq->online = 1; + atomic_set(&zq->load, 0); ++ ap_rapq(aq->qid); + rc = zcrypt_cex2c_rng_supported(aq); + if (rc < 0) { + zcrypt_queue_free(zq); +@@ -231,6 +232,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev) + else + zq->ops = zcrypt_msgtype(MSGTYPE06_NAME, + MSGTYPE06_VARIANT_NORNG); ++ ap_queue_init_state(aq); + ap_queue_init_reply(aq, &zq->reply); + aq->request_timeout = CEX2C_CLEANUP_TIME; + aq->private = zq; +diff --git a/drivers/s390/crypto/zcrypt_cex4.c b/drivers/s390/crypto/zcrypt_cex4.c +index 442e3d6162f7..6fabc906114c 100644 +--- a/drivers/s390/crypto/zcrypt_cex4.c ++++ b/drivers/s390/crypto/zcrypt_cex4.c +@@ -381,6 +381,7 @@ static int zcrypt_cex4_queue_probe(struct ap_device *ap_dev) + zq->queue = aq; + zq->online = 1; + atomic_set(&zq->load, 0); ++ ap_queue_init_state(aq); + ap_queue_init_reply(aq, &zq->reply); + aq->request_timeout = CEX4_CLEANUP_TIME, + aq->private = zq; +diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c +index 80608b53897b..e3f5c91d5e4f 100644 +--- a/drivers/scsi/fnic/fnic_scsi.c ++++ b/drivers/scsi/fnic/fnic_scsi.c +@@ -439,6 +439,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_ + if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED))) + return SCSI_MLQUEUE_HOST_BUSY; + ++ if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET))) ++ return SCSI_MLQUEUE_HOST_BUSY; ++ + rport = starget_to_rport(scsi_target(sc->device)); + if (!rport) { + FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host, +diff --git a/drivers/soc/ti/wkup_m3_ipc.c b/drivers/soc/ti/wkup_m3_ipc.c +index 378369d9364a..e9ece45d7a33 100644 +--- a/drivers/soc/ti/wkup_m3_ipc.c ++++ b/drivers/soc/ti/wkup_m3_ipc.c +@@ -419,6 +419,8 @@ static void wkup_m3_rproc_boot_thread(struct wkup_m3_ipc *m3_ipc) + ret = rproc_boot(m3_ipc->rproc); + if (ret) + dev_err(dev, "rproc_boot failed\n"); ++ else ++ m3_ipc_state = m3_ipc; + + do_exit(0); + } +@@ -505,8 +507,6 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev) + goto err_put_rproc; + } + +- m3_ipc_state = m3_ipc; +- + return 0; + + err_put_rproc: +diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig +index d1ad512e1708..3ca71e3812ed 100644 +--- a/drivers/tee/optee/Kconfig ++++ b/drivers/tee/optee/Kconfig +@@ -3,6 +3,7 @@ + config OPTEE + tristate "OP-TEE" + depends on HAVE_ARM_SMCCC ++ depends on MMU + help + This implements the OP-TEE Trusted Execution Environment (TEE) + driver. +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index 1b151af25772..abcd93a3ca1d 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -2102,7 +2102,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + */ + thresh = SZ_4M; + +- if (!mixed && total_free_meta - thresh < block_rsv->size) ++ /* ++ * We only want to claim there's no available space if we can no longer ++ * allocate chunks for our metadata profile and our global reserve will ++ * not fit in the free metadata space. If we aren't ->full then we ++ * still can allocate chunks and thus are fine using the currently ++ * calculated f_bavail. ++ */ ++ if (!mixed && block_rsv->space_info->full && ++ total_free_meta - thresh < block_rsv->size) + buf->f_bavail = 0; + + buf->f_type = BTRFS_SUPER_MAGIC; +diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c +index e1d8cec6ba2e..e1cac715d19e 100644 +--- a/fs/cifs/smb2pdu.c ++++ b/fs/cifs/smb2pdu.c +@@ -312,7 +312,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon) + if (server->tcpStatus != CifsNeedReconnect) + break; + +- if (--retries) ++ if (retries && --retries) + continue; + + /* +diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c +index e2437b775456..e7b9d39955d4 100644 +--- a/fs/gfs2/lops.c ++++ b/fs/gfs2/lops.c +@@ -264,7 +264,7 @@ static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd *sdp, u64 blkno, + struct super_block *sb = sdp->sd_vfs; + struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES); + +- bio->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9); ++ bio->bi_iter.bi_sector = blkno << (sb->s_blocksize_bits - 9); + bio_set_dev(bio, sb->s_bdev); + bio->bi_end_io = end_io; + bio->bi_private = sdp; +@@ -471,6 +471,20 @@ static void gfs2_jhead_process_page(struct gfs2_jdesc *jd, unsigned long index, + put_page(page); /* Once more for find_or_create_page */ + } + ++static struct bio *gfs2_chain_bio(struct bio *prev, unsigned int nr_iovecs) ++{ ++ struct bio *new; ++ ++ new = bio_alloc(GFP_NOIO, nr_iovecs); ++ bio_copy_dev(new, prev); ++ new->bi_iter.bi_sector = bio_end_sector(prev); ++ new->bi_opf = prev->bi_opf; ++ new->bi_write_hint = prev->bi_write_hint; ++ bio_chain(new, prev); ++ submit_bio(prev); ++ return new; ++} ++ + /** + * gfs2_find_jhead - find the head of a log + * @jd: The journal descriptor +@@ -487,15 +501,15 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, + struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); + struct address_space *mapping = jd->jd_inode->i_mapping; + unsigned int block = 0, blocks_submitted = 0, blocks_read = 0; +- unsigned int bsize = sdp->sd_sb.sb_bsize; ++ unsigned int bsize = sdp->sd_sb.sb_bsize, off; + unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift; + unsigned int shift = PAGE_SHIFT - bsize_shift; +- unsigned int readhead_blocks = BIO_MAX_PAGES << shift; ++ unsigned int readahead_blocks = BIO_MAX_PAGES << shift; + struct gfs2_journal_extent *je; + int sz, ret = 0; + struct bio *bio = NULL; + struct page *page = NULL; +- bool done = false; ++ bool bio_chained = false, done = false; + errseq_t since; + + memset(head, 0, sizeof(*head)); +@@ -504,9 +518,9 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, + + since = filemap_sample_wb_err(mapping); + list_for_each_entry(je, &jd->extent_list, list) { +- for (; block < je->lblock + je->blocks; block++) { +- u64 dblock; ++ u64 dblock = je->dblock; + ++ for (; block < je->lblock + je->blocks; block++, dblock++) { + if (!page) { + page = find_or_create_page(mapping, + block >> shift, GFP_NOFS); +@@ -515,35 +529,41 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, + done = true; + goto out; + } ++ off = 0; + } + +- if (bio) { +- unsigned int off; +- +- off = (block << bsize_shift) & ~PAGE_MASK; ++ if (!bio || (bio_chained && !off)) { ++ /* start new bio */ ++ } else { + sz = bio_add_page(bio, page, bsize, off); +- if (sz == bsize) { /* block added */ +- if (off + bsize == PAGE_SIZE) { +- page = NULL; +- goto page_added; +- } +- continue; ++ if (sz == bsize) ++ goto block_added; ++ if (off) { ++ unsigned int blocks = ++ (PAGE_SIZE - off) >> bsize_shift; ++ ++ bio = gfs2_chain_bio(bio, blocks); ++ bio_chained = true; ++ goto add_block_to_new_bio; + } ++ } ++ ++ if (bio) { + blocks_submitted = block + 1; + submit_bio(bio); +- bio = NULL; + } + +- dblock = je->dblock + (block - je->lblock); + bio = gfs2_log_alloc_bio(sdp, dblock, gfs2_end_log_read); + bio->bi_opf = REQ_OP_READ; +- sz = bio_add_page(bio, page, bsize, 0); +- gfs2_assert_warn(sdp, sz == bsize); +- if (bsize == PAGE_SIZE) ++ bio_chained = false; ++add_block_to_new_bio: ++ sz = bio_add_page(bio, page, bsize, off); ++ BUG_ON(sz != bsize); ++block_added: ++ off += bsize; ++ if (off == PAGE_SIZE) + page = NULL; +- +-page_added: +- if (blocks_submitted < blocks_read + readhead_blocks) { ++ if (blocks_submitted < blocks_read + readahead_blocks) { + /* Keep at least one bio in flight */ + continue; + } +diff --git a/fs/namei.c b/fs/namei.c +index e81521c87f98..bd1c0ca4151c 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -3249,8 +3249,8 @@ static int do_last(struct nameidata *nd, + struct file *file, const struct open_flags *op) + { + struct dentry *dir = nd->path.dentry; +- kuid_t dir_uid = dir->d_inode->i_uid; +- umode_t dir_mode = dir->d_inode->i_mode; ++ kuid_t dir_uid = nd->inode->i_uid; ++ umode_t dir_mode = nd->inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c +index 3244037b1286..d127af64283e 100644 +--- a/fs/reiserfs/super.c ++++ b/fs/reiserfs/super.c +@@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s) + reiserfs_write_unlock(s); + mutex_destroy(&REISERFS_SB(s)->lock); + destroy_workqueue(REISERFS_SB(s)->commit_wq); ++ kfree(REISERFS_SB(s)->s_jdev); + kfree(s->s_fs_info); + s->s_fs_info = NULL; + } +@@ -2240,6 +2241,7 @@ error_unlocked: + kfree(qf_names[j]); + } + #endif ++ kfree(sbi->s_jdev); + kfree(sbi); + + s->s_fs_info = NULL; +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 775503573ed7..b968d736833b 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1915,11 +1915,11 @@ static inline void rseq_migrate(struct task_struct *t) + + /* + * If parent process has a registered restartable sequences area, the +- * child inherits. Only applies when forking a process, not a thread. ++ * child inherits. Unregister rseq for a clone with CLONE_VM set. + */ + static inline void rseq_fork(struct task_struct *t, unsigned long clone_flags) + { +- if (clone_flags & CLONE_THREAD) { ++ if (clone_flags & CLONE_VM) { + t->rseq = NULL; + t->rseq_sig = 0; + t->rseq_event_mask = 0; +diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h +index 4ab2c49423dc..68782ba8b6e8 100644 +--- a/include/net/cfg80211.h ++++ b/include/net/cfg80211.h +@@ -3537,6 +3537,9 @@ struct cfg80211_update_owe_info { + * + * @start_radar_detection: Start radar detection in the driver. + * ++ * @end_cac: End running CAC, probably because a related CAC ++ * was finished on another phy. ++ * + * @update_ft_ies: Provide updated Fast BSS Transition information to the + * driver. If the SME is in the driver/firmware, this information can be + * used in building Authentication and Reassociation Request frames. +@@ -3863,6 +3866,8 @@ struct cfg80211_ops { + struct net_device *dev, + struct cfg80211_chan_def *chandef, + u32 cac_time_ms); ++ void (*end_cac)(struct wiphy *wiphy, ++ struct net_device *dev); + int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_update_ft_ies_params *ftie); + int (*crit_proto_start)(struct wiphy *wiphy, +diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c +index ef4242e5d4bc..595c52d59f31 100644 +--- a/kernel/cgroup/cgroup.c ++++ b/kernel/cgroup/cgroup.c +@@ -3111,8 +3111,6 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) + for_each_subsys(ss, ssid) { + struct cgroup_subsys_state *css = cgroup_css(dsct, ss); + +- WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); +- + if (!(cgroup_ss_mask(dsct) & (1 << ss->id))) + continue; + +@@ -3122,6 +3120,8 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) + return PTR_ERR(css); + } + ++ WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); ++ + if (css_visible(css)) { + ret = css_populate_dir(css); + if (ret) +@@ -3157,11 +3157,11 @@ static void cgroup_apply_control_disable(struct cgroup *cgrp) + for_each_subsys(ss, ssid) { + struct cgroup_subsys_state *css = cgroup_css(dsct, ss); + +- WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); +- + if (!css) + continue; + ++ WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); ++ + if (css->parent && + !(cgroup_ss_mask(dsct) & (1 << ss->id))) { + kill_css(css); +@@ -3448,7 +3448,8 @@ static ssize_t cgroup_type_write(struct kernfs_open_file *of, char *buf, + if (strcmp(strstrip(buf), "threaded")) + return -EINVAL; + +- cgrp = cgroup_kn_lock_live(of->kn, false); ++ /* drain dying csses before we re-apply (threaded) subtree control */ ++ cgrp = cgroup_kn_lock_live(of->kn, true); + if (!cgrp) + return -ENOENT; + +diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c +index 3e5f9c7d939c..3f54dc2f6e1c 100644 +--- a/kernel/trace/trace_kprobe.c ++++ b/kernel/trace/trace_kprobe.c +@@ -290,7 +290,7 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group, + INIT_HLIST_NODE(&tk->rp.kp.hlist); + INIT_LIST_HEAD(&tk->rp.kp.list); + +- ret = trace_probe_init(&tk->tp, event, group, 0); ++ ret = trace_probe_init(&tk->tp, event, group, false); + if (ret < 0) + goto error; + +diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c +index bba18cf44a30..9ae87be422f2 100644 +--- a/kernel/trace/trace_probe.c ++++ b/kernel/trace/trace_probe.c +@@ -984,16 +984,19 @@ void trace_probe_cleanup(struct trace_probe *tp) + } + + int trace_probe_init(struct trace_probe *tp, const char *event, +- const char *group, size_t event_data_size) ++ const char *group, bool alloc_filter) + { + struct trace_event_call *call; ++ size_t size = sizeof(struct trace_probe_event); + int ret = 0; + + if (!event || !group) + return -EINVAL; + +- tp->event = kzalloc(sizeof(struct trace_probe_event) + event_data_size, +- GFP_KERNEL); ++ if (alloc_filter) ++ size += sizeof(struct trace_uprobe_filter); ++ ++ tp->event = kzalloc(size, GFP_KERNEL); + if (!tp->event) + return -ENOMEM; + +diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h +index 03e4e180058d..a0ff9e200ef6 100644 +--- a/kernel/trace/trace_probe.h ++++ b/kernel/trace/trace_probe.h +@@ -223,6 +223,12 @@ struct probe_arg { + const struct fetch_type *type; /* Type of this argument */ + }; + ++struct trace_uprobe_filter { ++ rwlock_t rwlock; ++ int nr_systemwide; ++ struct list_head perf_events; ++}; ++ + /* Event call and class holder */ + struct trace_probe_event { + unsigned int flags; /* For TP_FLAG_* */ +@@ -230,7 +236,7 @@ struct trace_probe_event { + struct trace_event_call call; + struct list_head files; + struct list_head probes; +- char data[0]; ++ struct trace_uprobe_filter filter[0]; + }; + + struct trace_probe { +@@ -323,7 +329,7 @@ static inline bool trace_probe_has_single_file(struct trace_probe *tp) + } + + int trace_probe_init(struct trace_probe *tp, const char *event, +- const char *group, size_t event_data_size); ++ const char *group, bool alloc_filter); + void trace_probe_cleanup(struct trace_probe *tp); + int trace_probe_append(struct trace_probe *tp, struct trace_probe *to); + void trace_probe_unlink(struct trace_probe *tp); +diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c +index f66e202fec13..2619bc5ed520 100644 +--- a/kernel/trace/trace_uprobe.c ++++ b/kernel/trace/trace_uprobe.c +@@ -34,12 +34,6 @@ struct uprobe_trace_entry_head { + #define DATAOF_TRACE_ENTRY(entry, is_return) \ + ((void*)(entry) + SIZEOF_TRACE_ENTRY(is_return)) + +-struct trace_uprobe_filter { +- rwlock_t rwlock; +- int nr_systemwide; +- struct list_head perf_events; +-}; +- + static int trace_uprobe_create(int argc, const char **argv); + static int trace_uprobe_show(struct seq_file *m, struct dyn_event *ev); + static int trace_uprobe_release(struct dyn_event *ev); +@@ -263,14 +257,6 @@ process_fetch_insn(struct fetch_insn *code, struct pt_regs *regs, void *dest, + } + NOKPROBE_SYMBOL(process_fetch_insn) + +-static struct trace_uprobe_filter * +-trace_uprobe_get_filter(struct trace_uprobe *tu) +-{ +- struct trace_probe_event *event = tu->tp.event; +- +- return (struct trace_uprobe_filter *)&event->data[0]; +-} +- + static inline void init_trace_uprobe_filter(struct trace_uprobe_filter *filter) + { + rwlock_init(&filter->rwlock); +@@ -358,8 +344,7 @@ alloc_trace_uprobe(const char *group, const char *event, int nargs, bool is_ret) + if (!tu) + return ERR_PTR(-ENOMEM); + +- ret = trace_probe_init(&tu->tp, event, group, +- sizeof(struct trace_uprobe_filter)); ++ ret = trace_probe_init(&tu->tp, event, group, true); + if (ret < 0) + goto error; + +@@ -367,7 +352,7 @@ alloc_trace_uprobe(const char *group, const char *event, int nargs, bool is_ret) + tu->consumer.handler = uprobe_dispatcher; + if (is_ret) + tu->consumer.ret_handler = uretprobe_dispatcher; +- init_trace_uprobe_filter(trace_uprobe_get_filter(tu)); ++ init_trace_uprobe_filter(tu->tp.event->filter); + return tu; + + error: +@@ -1076,7 +1061,7 @@ static void __probe_event_disable(struct trace_probe *tp) + struct trace_uprobe *tu; + + tu = container_of(tp, struct trace_uprobe, tp); +- WARN_ON(!uprobe_filter_is_empty(trace_uprobe_get_filter(tu))); ++ WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); + + list_for_each_entry(pos, trace_probe_probe_list(tp), list) { + tu = container_of(pos, struct trace_uprobe, tp); +@@ -1117,7 +1102,7 @@ static int probe_event_enable(struct trace_event_call *call, + } + + tu = container_of(tp, struct trace_uprobe, tp); +- WARN_ON(!uprobe_filter_is_empty(trace_uprobe_get_filter(tu))); ++ WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); + + if (enabled) + return 0; +@@ -1281,7 +1266,7 @@ static int uprobe_perf_close(struct trace_event_call *call, + return -ENODEV; + + tu = container_of(tp, struct trace_uprobe, tp); +- if (trace_uprobe_filter_remove(trace_uprobe_get_filter(tu), event)) ++ if (trace_uprobe_filter_remove(tu->tp.event->filter, event)) + return 0; + + list_for_each_entry(pos, trace_probe_probe_list(tp), list) { +@@ -1306,7 +1291,7 @@ static int uprobe_perf_open(struct trace_event_call *call, + return -ENODEV; + + tu = container_of(tp, struct trace_uprobe, tp); +- if (trace_uprobe_filter_add(trace_uprobe_get_filter(tu), event)) ++ if (trace_uprobe_filter_add(tu->tp.event->filter, event)) + return 0; + + list_for_each_entry(pos, trace_probe_probe_list(tp), list) { +@@ -1328,7 +1313,7 @@ static bool uprobe_perf_filter(struct uprobe_consumer *uc, + int ret; + + tu = container_of(uc, struct trace_uprobe, consumer); +- filter = trace_uprobe_get_filter(tu); ++ filter = tu->tp.event->filter; + + read_lock(&filter->rwlock); + ret = __uprobe_perf_filter(filter, mm); +diff --git a/lib/test_xarray.c b/lib/test_xarray.c +index 03c3f42966ce..55c14e8c8859 100644 +--- a/lib/test_xarray.c ++++ b/lib/test_xarray.c +@@ -1160,6 +1160,27 @@ static noinline void check_move_tiny(struct xarray *xa) + XA_BUG_ON(xa, !xa_empty(xa)); + } + ++static noinline void check_move_max(struct xarray *xa) ++{ ++ XA_STATE(xas, xa, 0); ++ ++ xa_store_index(xa, ULONG_MAX, GFP_KERNEL); ++ rcu_read_lock(); ++ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX)); ++ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL); ++ rcu_read_unlock(); ++ ++ xas_set(&xas, 0); ++ rcu_read_lock(); ++ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX)); ++ xas_pause(&xas); ++ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL); ++ rcu_read_unlock(); ++ ++ xa_erase_index(xa, ULONG_MAX); ++ XA_BUG_ON(xa, !xa_empty(xa)); ++} ++ + static noinline void check_move_small(struct xarray *xa, unsigned long idx) + { + XA_STATE(xas, xa, 0); +@@ -1268,6 +1289,7 @@ static noinline void check_move(struct xarray *xa) + xa_destroy(xa); + + check_move_tiny(xa); ++ check_move_max(xa); + + for (i = 0; i < 16; i++) + check_move_small(xa, 1UL << i); +diff --git a/lib/xarray.c b/lib/xarray.c +index 47e17d46e5f8..1d9fab7db8da 100644 +--- a/lib/xarray.c ++++ b/lib/xarray.c +@@ -968,6 +968,7 @@ void xas_pause(struct xa_state *xas) + if (xas_invalid(xas)) + return; + ++ xas->xa_node = XAS_RESTART; + if (node) { + unsigned int offset = xas->xa_offset; + while (++offset < XA_CHUNK_SIZE) { +@@ -975,10 +976,11 @@ void xas_pause(struct xa_state *xas) + break; + } + xas->xa_index += (offset - xas->xa_offset) << node->shift; ++ if (xas->xa_index == 0) ++ xas->xa_node = XAS_BOUNDS; + } else { + xas->xa_index++; + } +- xas->xa_node = XAS_RESTART; + } + EXPORT_SYMBOL_GPL(xas_pause); + +@@ -1080,7 +1082,7 @@ void *xas_find(struct xa_state *xas, unsigned long max) + { + void *entry; + +- if (xas_error(xas)) ++ if (xas_error(xas) || xas->xa_node == XAS_BOUNDS) + return NULL; + if (xas->xa_index > max) + return set_bounds(xas); +@@ -1088,7 +1090,7 @@ void *xas_find(struct xa_state *xas, unsigned long max) + if (!xas->xa_node) { + xas->xa_index = 1; + return set_bounds(xas); +- } else if (xas_top(xas->xa_node)) { ++ } else if (xas->xa_node == XAS_RESTART) { + entry = xas_load(xas); + if (entry || xas_not_node(xas->xa_node)) + return entry; +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index e08c94170ae4..fbb3258af275 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2802,6 +2802,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + char *flags = strchr(str, '='); + int err = 1, mode; + ++ if (flags) ++ *flags++ = '\0'; /* terminate mode string */ ++ + if (nodelist) { + /* NUL-terminate mode or flags string */ + *nodelist++ = '\0'; +@@ -2812,9 +2815,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + } else + nodes_clear(nodes); + +- if (flags) +- *flags++ = '\0'; /* terminate mode string */ +- + mode = match_string(policy_modes, MPOL_MAX, str); + if (mode < 0) + goto out; +diff --git a/mm/migrate.c b/mm/migrate.c +index 45d3303e0022..6956627ebf8b 100644 +--- a/mm/migrate.c ++++ b/mm/migrate.c +@@ -1680,7 +1680,7 @@ out_flush: + err1 = do_move_pages_to_node(mm, &pagelist, current_node); + if (!err1) + err1 = store_status(status, start, current_node, i - start); +- if (!err) ++ if (err >= 0) + err = err1; + out: + return err; +diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c +index d32077b28433..8159b344deef 100644 +--- a/net/bluetooth/hci_sock.c ++++ b/net/bluetooth/hci_sock.c +@@ -831,6 +831,8 @@ static int hci_sock_release(struct socket *sock) + if (!sk) + return 0; + ++ lock_sock(sk); ++ + switch (hci_pi(sk)->channel) { + case HCI_CHANNEL_MONITOR: + atomic_dec(&monitor_promisc); +@@ -878,6 +880,7 @@ static int hci_sock_release(struct socket *sock) + skb_queue_purge(&sk->sk_receive_queue); + skb_queue_purge(&sk->sk_write_queue); + ++ release_sock(sk); + sock_put(sk); + return 0; + } +diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c +index 1292f3f0f93f..96b2566c298d 100644 +--- a/net/core/flow_dissector.c ++++ b/net/core/flow_dissector.c +@@ -758,10 +758,10 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys, + struct flow_dissector *flow_dissector, + void *target_container) + { ++ struct flow_dissector_key_ports *key_ports = NULL; + struct flow_dissector_key_control *key_control; + struct flow_dissector_key_basic *key_basic; + struct flow_dissector_key_addrs *key_addrs; +- struct flow_dissector_key_ports *key_ports; + struct flow_dissector_key_tags *key_tags; + + key_control = skb_flow_dissector_target(flow_dissector, +@@ -800,10 +800,17 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys, + key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; + } + +- if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) { ++ if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) + key_ports = skb_flow_dissector_target(flow_dissector, + FLOW_DISSECTOR_KEY_PORTS, + target_container); ++ else if (dissector_uses_key(flow_dissector, ++ FLOW_DISSECTOR_KEY_PORTS_RANGE)) ++ key_ports = skb_flow_dissector_target(flow_dissector, ++ FLOW_DISSECTOR_KEY_PORTS_RANGE, ++ target_container); ++ ++ if (key_ports) { + key_ports->src = flow_keys->sport; + key_ports->dst = flow_keys->dport; + } +diff --git a/net/core/utils.c b/net/core/utils.c +index 6b6e51db9f3b..1f31a39236d5 100644 +--- a/net/core/utils.c ++++ b/net/core/utils.c +@@ -438,6 +438,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, + } + EXPORT_SYMBOL(inet_proto_csum_replace4); + ++/** ++ * inet_proto_csum_replace16 - update layer 4 header checksum field ++ * @sum: Layer 4 header checksum field ++ * @skb: sk_buff for the packet ++ * @from: old IPv6 address ++ * @to: new IPv6 address ++ * @pseudohdr: True if layer 4 header checksum includes pseudoheader ++ * ++ * Update layer 4 header as per the update in IPv6 src/dst address. ++ * ++ * There is no need to update skb->csum in this function, because update in two ++ * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other ++ * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to ++ * update skb->csum, because update in 3 fields a.) IPv4 src/dst address, ++ * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as ++ * L4 Header checksum for skb->csum calculation. ++ */ + void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + const __be32 *from, const __be32 *to, + bool pseudohdr) +@@ -449,9 +466,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + if (skb->ip_summed != CHECKSUM_PARTIAL) { + *sum = csum_fold(csum_partial(diff, sizeof(diff), + ~csum_unfold(*sum))); +- if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) +- skb->csum = ~csum_partial(diff, sizeof(diff), +- ~skb->csum); + } else if (pseudohdr) + *sum = ~csum_fold(csum_partial(diff, sizeof(diff), + csum_unfold(*sum))); +diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c +index fb9f6d60c27c..79eef5db336a 100644 +--- a/net/ipv4/ip_vti.c ++++ b/net/ipv4/ip_vti.c +@@ -187,8 +187,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev, + int mtu; + + if (!dst) { +- dev->stats.tx_carrier_errors++; +- goto tx_error_icmp; ++ struct rtable *rt; ++ ++ fl->u.ip4.flowi4_oif = dev->ifindex; ++ fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; ++ rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); ++ if (IS_ERR(rt)) { ++ dev->stats.tx_carrier_errors++; ++ goto tx_error_icmp; ++ } ++ dst = &rt->dst; ++ skb_dst_set(skb, dst); + } + + dst_hold(dst); +diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c +index 6f08b760c2a7..524006aa0d78 100644 +--- a/net/ipv6/ip6_vti.c ++++ b/net/ipv6/ip6_vti.c +@@ -449,8 +449,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + int err = -1; + int mtu; + +- if (!dst) +- goto tx_err_link_failure; ++ if (!dst) { ++ fl->u.ip6.flowi6_oif = dev->ifindex; ++ fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; ++ dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); ++ if (dst->error) { ++ dst_release(dst); ++ dst = NULL; ++ goto tx_err_link_failure; ++ } ++ skb_dst_set(skb, dst); ++ } + + dst_hold(dst); + dst = xfrm_lookup(t->net, dst, fl, NULL, 0); +diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c +index 70739e746c13..0daaf7e37a21 100644 +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -2954,6 +2954,28 @@ static int ieee80211_start_radar_detection(struct wiphy *wiphy, + return err; + } + ++static void ieee80211_end_cac(struct wiphy *wiphy, ++ struct net_device *dev) ++{ ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); ++ struct ieee80211_local *local = sdata->local; ++ ++ mutex_lock(&local->mtx); ++ list_for_each_entry(sdata, &local->interfaces, list) { ++ /* it might be waiting for the local->mtx, but then ++ * by the time it gets it, sdata->wdev.cac_started ++ * will no longer be true ++ */ ++ cancel_delayed_work(&sdata->dfs_cac_timer_work); ++ ++ if (sdata->wdev.cac_started) { ++ ieee80211_vif_release_channel(sdata); ++ sdata->wdev.cac_started = false; ++ } ++ } ++ mutex_unlock(&local->mtx); ++} ++ + static struct cfg80211_beacon_data * + cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon) + { +@@ -4023,6 +4045,7 @@ const struct cfg80211_ops mac80211_config_ops = { + #endif + .get_channel = ieee80211_cfg_get_channel, + .start_radar_detection = ieee80211_start_radar_detection, ++ .end_cac = ieee80211_end_cac, + .channel_switch = ieee80211_channel_switch, + .set_qos_map = ieee80211_set_qos_map, + .set_ap_chanwidth = ieee80211_set_ap_chanwidth, +diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c +index 68af62306385..d69983370381 100644 +--- a/net/mac80211/mesh_hwmp.c ++++ b/net/mac80211/mesh_hwmp.c +@@ -328,6 +328,9 @@ u32 airtime_link_metric_get(struct ieee80211_local *local, + unsigned long fail_avg = + ewma_mesh_fail_avg_read(&sta->mesh->fail_avg); + ++ if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) ++ return MAX_METRIC; ++ + /* Try to get rate based on HW/SW RC algorithm. + * Rate is returned in units of Kbps, correct this + * to comply with airtime calculation units +diff --git a/net/mac80211/tkip.c b/net/mac80211/tkip.c +index 727dc9f3f3b3..e7f57bb18f6e 100644 +--- a/net/mac80211/tkip.c ++++ b/net/mac80211/tkip.c +@@ -263,9 +263,21 @@ int ieee80211_tkip_decrypt_data(struct arc4_ctx *ctx, + if ((keyid >> 6) != key->conf.keyidx) + return TKIP_DECRYPT_INVALID_KEYIDX; + +- if (rx_ctx->ctx.state != TKIP_STATE_NOT_INIT && +- (iv32 < rx_ctx->iv32 || +- (iv32 == rx_ctx->iv32 && iv16 <= rx_ctx->iv16))) ++ /* Reject replays if the received TSC is smaller than or equal to the ++ * last received value in a valid message, but with an exception for ++ * the case where a new key has been set and no valid frame using that ++ * key has yet received and the local RSC was initialized to 0. This ++ * exception allows the very first frame sent by the transmitter to be ++ * accepted even if that transmitter were to use TSC 0 (IEEE 802.11 ++ * described TSC to be initialized to 1 whenever a new key is taken into ++ * use). ++ */ ++ if (iv32 < rx_ctx->iv32 || ++ (iv32 == rx_ctx->iv32 && ++ (iv16 < rx_ctx->iv16 || ++ (iv16 == rx_ctx->iv16 && ++ (rx_ctx->iv32 || rx_ctx->iv16 || ++ rx_ctx->ctx.state != TKIP_STATE_NOT_INIT))))) + return TKIP_DECRYPT_REPLAY; + + if (only_iv) { +diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c +index 0399ae8f1188..4f897b14b606 100644 +--- a/net/netfilter/nf_conntrack_proto_sctp.c ++++ b/net/netfilter/nf_conntrack_proto_sctp.c +@@ -114,7 +114,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] = { + { + /* ORIGINAL */ + /* sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS, sHA */ +-/* init */ {sCW, sCW, sCW, sCE, sES, sSS, sSR, sSA, sCW, sHA}, ++/* init */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCW, sHA}, + /* init_ack */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCL, sHA}, + /* abort */ {sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL}, + /* shutdown */ {sCL, sCL, sCW, sCE, sSS, sSS, sSR, sSA, sCL, sSS}, +@@ -130,7 +130,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] = { + /* REPLY */ + /* sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS, sHA */ + /* init */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA},/* INIT in sCL Big TODO */ +-/* init_ack */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA}, ++/* init_ack */ {sIV, sCW, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA}, + /* abort */ {sIV, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sIV, sCL}, + /* shutdown */ {sIV, sCL, sCW, sCE, sSR, sSS, sSR, sSA, sIV, sSR}, + /* shutdown_ack */ {sIV, sCL, sCW, sCE, sES, sSA, sSA, sSA, sIV, sHA}, +@@ -316,7 +316,7 @@ sctp_new(struct nf_conn *ct, const struct sk_buff *skb, + ct->proto.sctp.vtag[IP_CT_DIR_REPLY] = sh->vtag; + } + +- ct->proto.sctp.state = new_state; ++ ct->proto.sctp.state = SCTP_CONNTRACK_NONE; + } + + return true; +diff --git a/net/netfilter/nf_tables_offload.c b/net/netfilter/nf_tables_offload.c +index 96a64e7594a5..914cd0618d5a 100644 +--- a/net/netfilter/nf_tables_offload.c ++++ b/net/netfilter/nf_tables_offload.c +@@ -437,7 +437,7 @@ static void nft_indr_block_cb(struct net_device *dev, + + mutex_lock(&net->nft.commit_mutex); + chain = __nft_offload_get_chain(dev); +- if (chain) { ++ if (chain && chain->flags & NFT_CHAIN_HW_OFFLOAD) { + struct nft_base_chain *basechain; + + basechain = nft_base_chain(chain); +diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h +index 3dd9515c836b..e0d34f796d0b 100644 +--- a/net/wireless/rdev-ops.h ++++ b/net/wireless/rdev-ops.h +@@ -1171,6 +1171,16 @@ rdev_start_radar_detection(struct cfg80211_registered_device *rdev, + return ret; + } + ++static inline void ++rdev_end_cac(struct cfg80211_registered_device *rdev, ++ struct net_device *dev) ++{ ++ trace_rdev_end_cac(&rdev->wiphy, dev); ++ if (rdev->ops->end_cac) ++ rdev->ops->end_cac(&rdev->wiphy, dev); ++ trace_rdev_return_void(&rdev->wiphy); ++} ++ + static inline int + rdev_set_mcast_rate(struct cfg80211_registered_device *rdev, + struct net_device *dev, +diff --git a/net/wireless/reg.c b/net/wireless/reg.c +index 446c76d44e65..fff9a74891fc 100644 +--- a/net/wireless/reg.c ++++ b/net/wireless/reg.c +@@ -2261,14 +2261,15 @@ static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator) + + static void handle_channel_custom(struct wiphy *wiphy, + struct ieee80211_channel *chan, +- const struct ieee80211_regdomain *regd) ++ const struct ieee80211_regdomain *regd, ++ u32 min_bw) + { + u32 bw_flags = 0; + const struct ieee80211_reg_rule *reg_rule = NULL; + const struct ieee80211_power_rule *power_rule = NULL; + u32 bw; + +- for (bw = MHZ_TO_KHZ(20); bw >= MHZ_TO_KHZ(5); bw = bw / 2) { ++ for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) { + reg_rule = freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), + regd, bw); + if (!IS_ERR(reg_rule)) +@@ -2324,8 +2325,14 @@ static void handle_band_custom(struct wiphy *wiphy, + if (!sband) + return; + ++ /* ++ * We currently assume that you always want at least 20 MHz, ++ * otherwise channel 12 might get enabled if this rule is ++ * compatible to US, which permits 2402 - 2472 MHz. ++ */ + for (i = 0; i < sband->n_channels; i++) +- handle_channel_custom(wiphy, &sband->channels[i], regd); ++ handle_channel_custom(wiphy, &sband->channels[i], regd, ++ MHZ_TO_KHZ(20)); + } + + /* Used by drivers prior to wiphy registration */ +@@ -3885,6 +3892,25 @@ bool regulatory_pre_cac_allowed(struct wiphy *wiphy) + } + EXPORT_SYMBOL(regulatory_pre_cac_allowed); + ++static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev) ++{ ++ struct wireless_dev *wdev; ++ /* If we finished CAC or received radar, we should end any ++ * CAC running on the same channels. ++ * the check !cfg80211_chandef_dfs_usable contain 2 options: ++ * either all channels are available - those the CAC_FINISHED ++ * event has effected another wdev state, or there is a channel ++ * in unavailable state in wdev chandef - those the RADAR_DETECTED ++ * event has effected another wdev state. ++ * In both cases we should end the CAC on the wdev. ++ */ ++ list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { ++ if (wdev->cac_started && ++ !cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef)) ++ rdev_end_cac(rdev, wdev->netdev); ++ } ++} ++ + void regulatory_propagate_dfs_state(struct wiphy *wiphy, + struct cfg80211_chan_def *chandef, + enum nl80211_dfs_state dfs_state, +@@ -3911,8 +3937,10 @@ void regulatory_propagate_dfs_state(struct wiphy *wiphy, + cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state); + + if (event == NL80211_RADAR_DETECTED || +- event == NL80211_RADAR_CAC_FINISHED) ++ event == NL80211_RADAR_CAC_FINISHED) { + cfg80211_sched_dfs_chan_update(rdev); ++ cfg80211_check_and_end_cac(rdev); ++ } + + nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL); + } +diff --git a/net/wireless/trace.h b/net/wireless/trace.h +index d98ad2b3143b..8677d7ab7d69 100644 +--- a/net/wireless/trace.h ++++ b/net/wireless/trace.h +@@ -646,6 +646,11 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_flush_pmksa, + TP_ARGS(wiphy, netdev) + ); + ++DEFINE_EVENT(wiphy_netdev_evt, rdev_end_cac, ++ TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), ++ TP_ARGS(wiphy, netdev) ++); ++ + DECLARE_EVENT_CLASS(station_add_change, + TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac, + struct station_parameters *params), +diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c +index 5e677dac2a0c..69102fda9ebd 100644 +--- a/net/wireless/wext-core.c ++++ b/net/wireless/wext-core.c +@@ -657,7 +657,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev) + return NULL; + } + +-static int iw_handler_get_iwstats(struct net_device * dev, ++/* noinline to avoid a bogus warning with -O3 */ ++static noinline int iw_handler_get_iwstats(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra) +diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c +index 0f5131bc3342..4d5627e274fe 100644 +--- a/net/xfrm/xfrm_interface.c ++++ b/net/xfrm/xfrm_interface.c +@@ -268,9 +268,6 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + int err = -1; + int mtu; + +- if (!dst) +- goto tx_err_link_failure; +- + dst_hold(dst); + dst = xfrm_lookup_with_ifid(xi->net, dst, fl, NULL, 0, xi->p.if_id); + if (IS_ERR(dst)) { +@@ -297,7 +294,7 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + + mtu = dst_mtu(dst); + if (!skb->ignore_df && skb->len > mtu) { +- skb_dst_update_pmtu(skb, mtu); ++ skb_dst_update_pmtu_no_confirm(skb, mtu); + + if (skb->protocol == htons(ETH_P_IPV6)) { + if (mtu < IPV6_MIN_MTU) +@@ -343,6 +340,7 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct xfrm_if *xi = netdev_priv(dev); + struct net_device_stats *stats = &xi->dev->stats; ++ struct dst_entry *dst = skb_dst(skb); + struct flowi fl; + int ret; + +@@ -352,10 +350,33 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev) + case htons(ETH_P_IPV6): + xfrm_decode_session(skb, &fl, AF_INET6); + memset(IP6CB(skb), 0, sizeof(*IP6CB(skb))); ++ if (!dst) { ++ fl.u.ip6.flowi6_oif = dev->ifindex; ++ fl.u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; ++ dst = ip6_route_output(dev_net(dev), NULL, &fl.u.ip6); ++ if (dst->error) { ++ dst_release(dst); ++ stats->tx_carrier_errors++; ++ goto tx_err; ++ } ++ skb_dst_set(skb, dst); ++ } + break; + case htons(ETH_P_IP): + xfrm_decode_session(skb, &fl, AF_INET); + memset(IPCB(skb), 0, sizeof(*IPCB(skb))); ++ if (!dst) { ++ struct rtable *rt; ++ ++ fl.u.ip4.flowi4_oif = dev->ifindex; ++ fl.u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; ++ rt = __ip_route_output_key(dev_net(dev), &fl.u.ip4); ++ if (IS_ERR(rt)) { ++ stats->tx_carrier_errors++; ++ goto tx_err; ++ } ++ skb_dst_set(skb, &rt->dst); ++ } + break; + default: + goto tx_err; +@@ -563,12 +584,9 @@ static void xfrmi_dev_setup(struct net_device *dev) + { + dev->netdev_ops = &xfrmi_netdev_ops; + dev->type = ARPHRD_NONE; +- dev->hard_header_len = ETH_HLEN; +- dev->min_header_len = ETH_HLEN; + dev->mtu = ETH_DATA_LEN; + dev->min_mtu = ETH_MIN_MTU; +- dev->max_mtu = ETH_DATA_LEN; +- dev->addr_len = ETH_ALEN; ++ dev->max_mtu = IP_MAX_MTU; + dev->flags = IFF_NOARP; + dev->needs_free_netdev = true; + dev->priv_destructor = xfrmi_dev_free; +diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c +index c36bafbcd77e..1b467381986f 100644 +--- a/security/tomoyo/common.c ++++ b/security/tomoyo/common.c +@@ -2322,9 +2322,9 @@ static const char * const tomoyo_memory_headers[TOMOYO_MAX_MEMORY_STAT] = { + [TOMOYO_MEMORY_QUERY] = "query message:", + }; + +-/* Timestamp counter for last updated. */ +-static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; + /* Counter for number of updates. */ ++static atomic_t tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; ++/* Timestamp counter for last updated. */ + static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; + + /** +@@ -2336,10 +2336,7 @@ static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; + */ + void tomoyo_update_stat(const u8 index) + { +- /* +- * I don't use atomic operations because race condition is not fatal. +- */ +- tomoyo_stat_updated[index]++; ++ atomic_inc(&tomoyo_stat_updated[index]); + tomoyo_stat_modified[index] = ktime_get_real_seconds(); + } + +@@ -2360,7 +2357,7 @@ static void tomoyo_read_stat(struct tomoyo_io_buffer *head) + for (i = 0; i < TOMOYO_MAX_POLICY_STAT; i++) { + tomoyo_io_printf(head, "Policy %-30s %10u", + tomoyo_policy_headers[i], +- tomoyo_stat_updated[i]); ++ atomic_read(&tomoyo_stat_updated[i])); + if (tomoyo_stat_modified[i]) { + struct tomoyo_time stamp; + +diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c +index 4570f662fb48..d78f4d856aaf 100644 +--- a/sound/soc/codecs/hdac_hda.c ++++ b/sound/soc/codecs/hdac_hda.c +@@ -498,7 +498,9 @@ static int hdac_hda_dev_remove(struct hdac_device *hdev) + struct hdac_hda_priv *hda_pvt; + + hda_pvt = dev_get_drvdata(&hdev->dev); +- cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); ++ if (hda_pvt && hda_pvt->codec.registered) ++ cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); ++ + return 0; + } + +diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c +index adbae1f36a8a..747ca248bf10 100644 +--- a/sound/soc/codecs/rt5640.c ++++ b/sound/soc/codecs/rt5640.c +@@ -2432,6 +2432,13 @@ static void rt5640_disable_jack_detect(struct snd_soc_component *component) + { + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); + ++ /* ++ * soc_remove_component() force-disables jack and thus rt5640->jack ++ * could be NULL at the time of driver's module unloading. ++ */ ++ if (!rt5640->jack) ++ return; ++ + disable_irq(rt5640->irq); + rt5640_cancel_work(rt5640); + +diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c +index 7ccbca47240d..fef01e1dd15c 100644 +--- a/sound/soc/soc-topology.c ++++ b/sound/soc/soc-topology.c +@@ -1891,6 +1891,10 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, + link->num_codecs = 1; + link->num_platforms = 1; + ++ link->dobj.index = tplg->index; ++ link->dobj.ops = tplg->ops; ++ link->dobj.type = SND_SOC_DOBJ_DAI_LINK; ++ + if (strlen(pcm->pcm_name)) { + link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); + link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL); +@@ -1927,9 +1931,6 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, + goto err; + } + +- link->dobj.index = tplg->index; +- link->dobj.ops = tplg->ops; +- link->dobj.type = SND_SOC_DOBJ_DAI_LINK; + list_add(&link->dobj.list, &tplg->comp->dobj_list); + + return 0; +diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c +index 3ca6795a89ba..9e8233c10d86 100644 +--- a/sound/soc/sof/intel/hda-codec.c ++++ b/sound/soc/sof/intel/hda-codec.c +@@ -24,19 +24,18 @@ + #define IDISP_VID_INTEL 0x80860000 + + /* load the legacy HDA codec driver */ +-#ifdef MODULE +-static void hda_codec_load_module(struct hda_codec *codec) ++static int hda_codec_load_module(struct hda_codec *codec) + { ++#ifdef MODULE + char alias[MODULE_NAME_LEN]; + const char *module = alias; + + snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias)); + dev_dbg(&codec->core.dev, "loading codec module: %s\n", module); + request_module(module); +-} +-#else +-static void hda_codec_load_module(struct hda_codec *codec) {} + #endif ++ return device_attach(hda_codec_dev(codec)); ++} + + /* enable controller wake up event for all codecs with jack connectors */ + void hda_codec_jack_wake_enable(struct snd_sof_dev *sdev) +@@ -116,10 +115,16 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address) + /* use legacy bus only for HDA codecs, idisp uses ext bus */ + if ((resp & 0xFFFF0000) != IDISP_VID_INTEL) { + hdev->type = HDA_DEV_LEGACY; +- hda_codec_load_module(&hda_priv->codec); ++ ret = hda_codec_load_module(&hda_priv->codec); ++ /* ++ * handle ret==0 (no driver bound) as an error, but pass ++ * other return codes without modification ++ */ ++ if (ret == 0) ++ ret = -ENOENT; + } + +- return 0; ++ return ret; + #else + hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL); + if (!hdev) +diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c +index 48ea915b24ba..2ed92c990b97 100644 +--- a/sound/soc/sti/uniperif_player.c ++++ b/sound/soc/sti/uniperif_player.c +@@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player, + * sampling frequency. If no sample rate is already specified, then + * set one. + */ +- mutex_lock(&player->ctrl_lock); + if (runtime) { + switch (runtime->rate) { + case 22050: +@@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif *player, + player->stream_settings.iec958.status[3 + (n * 4)] << 24; + SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status); + } +- mutex_unlock(&player->ctrl_lock); + + /* Update the channel status */ + if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) +@@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif *player, + + SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player); + ++ mutex_lock(&player->ctrl_lock); + /* Update the channel status */ + uni_player_set_channel_status(player, runtime); ++ mutex_unlock(&player->ctrl_lock); + + /* Clear the user validity user bits */ + SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0); +@@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, + iec958->status[1] = ucontrol->value.iec958.status[1]; + iec958->status[2] = ucontrol->value.iec958.status[2]; + iec958->status[3] = ucontrol->value.iec958.status[3]; +- mutex_unlock(&player->ctrl_lock); + + spin_lock_irqsave(&player->irq_lock, flags); + if (player->substream && player->substream->runtime) +@@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, + uni_player_set_channel_status(player, NULL); + + spin_unlock_irqrestore(&player->irq_lock, flags); ++ mutex_unlock(&player->ctrl_lock); ++ + return 0; + } + +diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h +index 980cb9266718..5e9e781905ed 100644 +--- a/tools/include/linux/string.h ++++ b/tools/include/linux/string.h +@@ -17,7 +17,15 @@ int strtobool(const char *s, bool *res); + * However uClibc headers also define __GLIBC__ hence the hack below + */ + #if defined(__GLIBC__) && !defined(__UCLIBC__) ++// pragma diagnostic was introduced in gcc 4.6 ++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wredundant-decls" ++#endif + extern size_t strlcpy(char *dest, const char *src, size_t size); ++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) ++#pragma GCC diagnostic pop ++#endif + #endif + + char *str_error_r(int errnum, char *buf, size_t buflen); +diff --git a/tools/lib/string.c b/tools/lib/string.c +index f2ae1b87c719..f645343815de 100644 +--- a/tools/lib/string.c ++++ b/tools/lib/string.c +@@ -96,6 +96,10 @@ int strtobool(const char *s, bool *res) + * If libc has strlcpy() then that version will override this + * implementation: + */ ++#ifdef __clang__ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wignored-attributes" ++#endif + size_t __weak strlcpy(char *dest, const char *src, size_t size) + { + size_t ret = strlen(src); +@@ -107,6 +111,9 @@ size_t __weak strlcpy(char *dest, const char *src, size_t size) + } + return ret; + } ++#ifdef __clang__ ++#pragma clang diagnostic pop ++#endif + + /** + * skip_spaces - Removes leading whitespace from @str. +diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c +index f3cbf86e51ac..20eed719542e 100644 +--- a/tools/lib/traceevent/parse-filter.c ++++ b/tools/lib/traceevent/parse-filter.c +@@ -1228,8 +1228,10 @@ filter_event(struct tep_event_filter *filter, struct tep_event *event, + } + + filter_type = add_filter_type(filter, event->id); +- if (filter_type == NULL) ++ if (filter_type == NULL) { ++ free_arg(arg); + return TEP_ERRNO__MEM_ALLOC_FAILED; ++ } + + if (filter_type->filter) + free_arg(filter_type->filter); +diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c +index e69f44941aad..f2e9d2b1b913 100644 +--- a/tools/perf/builtin-c2c.c ++++ b/tools/perf/builtin-c2c.c +@@ -595,8 +595,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + { + struct c2c_hist_entry *c2c_left; + struct c2c_hist_entry *c2c_right; +- unsigned int tot_hitm_left; +- unsigned int tot_hitm_right; ++ uint64_t tot_hitm_left; ++ uint64_t tot_hitm_right; + + c2c_left = container_of(left, struct c2c_hist_entry, he); + c2c_right = container_of(right, struct c2c_hist_entry, he); +@@ -629,7 +629,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __maybe_unused, \ + \ + c2c_left = container_of(left, struct c2c_hist_entry, he); \ + c2c_right = container_of(right, struct c2c_hist_entry, he); \ +- return c2c_left->stats.__f - c2c_right->stats.__f; \ ++ return (uint64_t) c2c_left->stats.__f - \ ++ (uint64_t) c2c_right->stats.__f; \ + } + + #define STAT_FN(__f) \ +@@ -682,7 +683,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + c2c_left = container_of(left, struct c2c_hist_entry, he); + c2c_right = container_of(right, struct c2c_hist_entry, he); + +- return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats); ++ return (uint64_t) llc_miss(&c2c_left->stats) - ++ (uint64_t) llc_miss(&c2c_right->stats); + } + + static uint64_t total_records(struct c2c_stats *stats) +diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c +index ea3f0745d7ad..6407dff405d9 100644 +--- a/tools/perf/builtin-report.c ++++ b/tools/perf/builtin-report.c +@@ -399,10 +399,10 @@ static int report__setup_sample_type(struct report *rep) + PERF_SAMPLE_BRANCH_ANY)) + rep->nonany_branch_mode = true; + +-#ifndef HAVE_LIBUNWIND_SUPPORT ++#if !defined(HAVE_LIBUNWIND_SUPPORT) && !defined(HAVE_DWARF_SUPPORT) + if (dwarf_callchain_users) { +- ui__warning("Please install libunwind development packages " +- "during the perf build.\n"); ++ ui__warning("Please install libunwind or libdw " ++ "development packages during the perf build.\n"); + } + #endif + From 0dc58c1109296b08977287752da38342ca382b59 Mon Sep 17 00:00:00 2001 From: Tony Date: Wed, 5 Feb 2020 23:54:47 -0500 Subject: [PATCH 19/54] fix typo noticed missing HDMI audio Rock64. Oops. --- patch/kernel/rockchip64-current/board-rock64-add-audio.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patch/kernel/rockchip64-current/board-rock64-add-audio.patch b/patch/kernel/rockchip64-current/board-rock64-add-audio.patch index 8799c0a6f6..aa57696710 100644 --- a/patch/kernel/rockchip64-current/board-rock64-add-audio.patch +++ b/patch/kernel/rockchip64-current/board-rock64-add-audio.patch @@ -45,7 +45,7 @@ index f97446924..d9a1cb24a 100644 }; +&hdmi_sound { -+ stratus = "okay"; ++ status = "okay"; +}; + &i2c1 { From 03ae848dd124f97ba46a5a461243bc82d5204d0c Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Thu, 6 Feb 2020 12:32:21 -0500 Subject: [PATCH 20/54] add i2c2/i2c3 to R40 --- .../sunxi-dev/add-i2c2-i2c3-to-r40.patch | 39 +++++++++++++ .../sunxi-dev/general-sunxi-overlays.patch | 56 ++++++++++++++++++- 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 patch/kernel/sunxi-dev/add-i2c2-i2c3-to-r40.patch diff --git a/patch/kernel/sunxi-dev/add-i2c2-i2c3-to-r40.patch b/patch/kernel/sunxi-dev/add-i2c2-i2c3-to-r40.patch new file mode 100644 index 0000000000..edd0ddf834 --- /dev/null +++ b/patch/kernel/sunxi-dev/add-i2c2-i2c3-to-r40.patch @@ -0,0 +1,39 @@ +diff --git a/arch/arm/boot/dts/sun8i-r40.dtsi b/arch/arm/boot/dts/sun8i-r40.dtsi +index 421dfbb..dc61f3a 100644 +--- a/arch/arm/boot/dts/sun8i-r40.dtsi ++++ b/arch/arm/boot/dts/sun8i-r40.dtsi +@@ -373,6 +399,16 @@ + function = "i2c0"; + }; + ++ i2c2_pins: i2c2-pins { ++ pins = "PB20", "PB21"; ++ function = "i2c2"; ++ }; ++ ++ i2c3_pins: i2c3-pins { ++ pins = "PI0", "PI1"; ++ function = "i2c3"; ++ }; ++ + mmc0_pins: mmc0-pins { + pins = "PF0", "PF1", "PF2", + "PF3", "PF4", "PF5"; +@@ -539,6 +649,8 @@ + interrupts = ; + clocks = <&ccu CLK_BUS_I2C2>; + resets = <&ccu RST_BUS_I2C2>; ++ pinctrl-0 = <&i2c2_pins>; ++ pinctrl-names = "default"; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; +@@ -550,6 +662,8 @@ + interrupts = ; + clocks = <&ccu CLK_BUS_I2C3>; + resets = <&ccu RST_BUS_I2C3>; ++ pinctrl-0 = <&i2c3_pins>; ++ pinctrl-names = "default"; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; diff --git a/patch/kernel/sunxi-dev/general-sunxi-overlays.patch b/patch/kernel/sunxi-dev/general-sunxi-overlays.patch index 39a387d921..0e35faab14 100644 --- a/patch/kernel/sunxi-dev/general-sunxi-overlays.patch +++ b/patch/kernel/sunxi-dev/general-sunxi-overlays.patch @@ -13,7 +13,7 @@ new file mode 100644 index 0000000..39d6a27 --- /dev/null +++ b/arch/arm/boot/dts/overlay/Makefile -@@ -0,0 +1,95 @@ +@@ -0,0 +1,97 @@ +# SPDX-License-Identifier: GPL-2.0 +dtbo-$(CONFIG_MACH_SUN4I) += \ + sun4i-a10-analog-codec.dtbo \ @@ -93,6 +93,8 @@ index 0000000..39d6a27 + sun8i-h3-usbhost2.dtbo \ + sun8i-h3-usbhost3.dtbo \ + sun8i-h3-w1-gpio.dtbo \ ++ sun8i-r40-i2c2.dtbo \ ++ sun8i-r40-i2c3.dtbo \ + sun8i-r40-spi-spidev0.dtbo \ + sun8i-r40-spi-spidev1.dtbo \ + sun8i-r40-uart2.dtbo \ @@ -4526,6 +4528,58 @@ index 0000000..f4ccb7f + }; + }; +}; +diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-i2c2.dts b/arch/arm/boot/dts/overlay/sun8i-r40-i2c2.dts +new file mode 100644 +index 0000000..a1e3284 +--- /dev/null ++++ b/arch/arm/boot/dts/overlay/sun8i-r40-i2c2.dts +@@ -0,0 +1,20 @@ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "allwinner,sun8i-h3"; ++ ++ fragment@0 { ++ target-path = "/aliases"; ++ __overlay__ { ++ i2c2 = "/soc/i2c@1c2b400"; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&i2c2>; ++ __overlay__ { ++ status = "okay"; ++ }; ++ }; ++}; +diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-i2c3.dts b/arch/arm/boot/dts/overlay/sun8i-r40-i2c3.dts +new file mode 100644 +index 0000000..a1e3284 +--- /dev/null ++++ b/arch/arm/boot/dts/overlay/sun8i-r40-i2c3.dts +@@ -0,0 +1,20 @@ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "allwinner,sun8i-h3"; ++ ++ fragment@0 { ++ target-path = "/aliases"; ++ __overlay__ { ++ i2c3 = "/soc/i2c@1c2b800"; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&i2c3>; ++ __overlay__ { ++ status = "okay"; ++ }; ++ }; ++}; diff --git a/arch/arm/boot/dts/overlay/sun8i-r40-spi-spidev0.dts b/arch/arm/boot/dts/overlay/sun8i-r40-spi-spidev0.dts new file mode 100644 index 0000000..734a9a8 From bdba55a74fa8f35488fbb2b4f609f2f5c494b00c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Pe=C4=8Dovnik?= Date: Thu, 6 Feb 2020 22:32:14 +0100 Subject: [PATCH 21/54] Fixes htop package building under Ubuntu Focal (#1783) --- lib/chroot-buildpackages.sh | 1 + packages/extras-buildpkgs/90-htop.conf | 8 +++++++- packages/extras-buildpkgs/htop/debian/control | 3 +-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/chroot-buildpackages.sh b/lib/chroot-buildpackages.sh index c67e9b9272..cb1e4848c0 100644 --- a/lib/chroot-buildpackages.sh +++ b/lib/chroot-buildpackages.sh @@ -78,6 +78,7 @@ create_chroot() mkdir -p $target_dir/var/lock fi chroot $target_dir /bin/bash -c "/usr/sbin/update-ccache-symlinks" + [[ $release == focal ]] && chroot $target_dir /bin/bash -c "ln -s /usr/bin/python3 /usr/bin/python" touch $target_dir/root/.debootstrap-complete display_alert "Debootstrap complete" "$release/$arch" "info" } ############################################################################# diff --git a/packages/extras-buildpkgs/90-htop.conf b/packages/extras-buildpkgs/90-htop.conf index 04a336e58a..675b27dcd5 100644 --- a/packages/extras-buildpkgs/90-htop.conf +++ b/packages/extras-buildpkgs/90-htop.conf @@ -4,10 +4,16 @@ local package_repo="https://github.com/hishamhm/htop" local package_ref="tag:2.2.0" local package_upstream_version="2.2.0-3" -local package_builddeps="debhelper dpkg-dev libhwloc-dev libncurses5-dev libncursesw5-dev pkg-config python-minimal:native" +local package_builddeps="debhelper dpkg-dev libhwloc-dev libncurses5-dev libncursesw5-dev pkg-config" local package_install_target="htop" local package_component="${release}-utils" +if [[ $release == focal ]]; then + package_builddeps+=" python3-minimal:native" + else + package_builddeps+=" python-minimal:native" +fi + package_checkbuild() { [[ $release != stretch && $release != bionic && $release != jessie ]] diff --git a/packages/extras-buildpkgs/htop/debian/control b/packages/extras-buildpkgs/htop/debian/control index 03a8737c16..0d45ffddd5 100644 --- a/packages/extras-buildpkgs/htop/debian/control +++ b/packages/extras-buildpkgs/htop/debian/control @@ -10,8 +10,7 @@ Build-Depends: debhelper, libkvm-dev [kfreebsd-any], libncurses5-dev, libncursesw5-dev, - pkg-config, - python-minimal:native + pkg-config Standards-Version: 4.1.4 Homepage: https://hisham.hm/htop/ Vcs-Browser: https://salsa.debian.org/debian/htop From 1b8e75c90f45ec5c50d3e132984e81fefe2b4aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Pe=C4=8Dovnik?= Date: Thu, 6 Feb 2020 22:57:41 +0100 Subject: [PATCH 22/54] Improve welcome readme file (#1779) --- .github/README.gif | Bin 0 -> 180474 bytes .github/armbian-logo.png | Bin 0 -> 38116 bytes README.md | 238 +++++++++++++++++++++++++++++++++------ 3 files changed, 206 insertions(+), 32 deletions(-) create mode 100644 .github/README.gif create mode 100644 .github/armbian-logo.png diff --git a/.github/README.gif b/.github/README.gif new file mode 100644 index 0000000000000000000000000000000000000000..d428f4d9850f009007e38843364dec0fa10a94c8 GIT binary patch literal 180474 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

hU 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%0An+bkdbp99e+5Y7- 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 G5CA(Fn~FgI literal 0 HcmV?d00001 diff --git a/.github/armbian-logo.png b/.github/armbian-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..809df42bde5330c649ac6157380fb02f7c0af808 GIT binary patch literal 38116 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 %({`n`ERuaOsq9bV?{dr4 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

V{wvl0F7g*Ge=8VZo&UNAE=1tE#{AF1_7Ass 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 logo
+build tools -Debian based Linux for ARM based single-board computers - -[https://www.armbian.com](https://www.armbian.com "Armbian") +

 

+ +## Table of contents + +- [What this project does?](#what-this-project-does) +- [What do you need to get started?](#what-do-you-need-to-get-started) +- [How to build an image or a kernel?](#how-to-build-an-image-or-a-kernel) +- [Build parameter examples](#build-parameter-examples) +- [Compare with industry standards](#compare-with-industry-standards) +- [Where to download prebuilt images?](#where-to-download-prebuilt-images) +- [Additional information](#additional-information) +- [Build tools overview](#build-tools-overview) +- [Support](#support) +- [Contribute](#contribute) +- [Social](#social) +- [Credits](#credits) +- [Sponsors](#sponsors) + +

 

+ +## What this project does? + +- builds custom Debian based Linux system optimised for [supported single board computers](https://www.armbian.com/download/), +- covers root filesystem generation, kernel image compilation and bootloader compilation, +- maintains low-level control software for a [selection of hardware](https://www.armbian.com/download/), +- provides a consistent user experience by keeping system standards across different SBC platforms. + +

 

+ +## What do you need to get started? + +- x64 machine with at least 2GB of memory and ~30GB of disk space for the VM, container or native OS, +- Ubuntu Bionic 18.04 / Focal 20.04 x64 for native building or any [Docker](https://docs.armbian.com/Developer-Guide_Building-with-Docker/) capable x64 Linux for containerised, +- superuser rights (configured sudo or root access). + +

⇧

+ +## How to build an image or a kernel? + +```text +apt -y install git +git clone https://github.com/armbian/build +cd build +./compile.sh +``` +Armbian logo + +

⇧

+ +## Build parameter examples + +Show work in progress areas in interactive mode: + +```text +./compile.sh EXPERT="yes" +``` + +Run build tools inside Docker container: + +```text +./compile.sh docker +``` + +Build minimal CLI Debian buster based image for Odroid XU4. Use modern kernel and write image to the SD card: + +```text +./compile.sh BOARD="odroidxu4" BRANCH="current" RELEASE="buster" CARD_DEVICE="/dev/sda" \ +KERNEL_ONLY="no" KERNEL_CONFIGURE="no" INSTALL_HEADERS="yes" BUILD_DESKTOP="no" BUILD_MINIMAL="yes" +``` + +[Build parameters, advanced build options, user defined configuration, build with Docker?](#additional-information) + +

⇧

+ +## Compare with industry standards + +Check similarity, advantages and disadvantages compared with leading industry standard build software. + +Function | Armbian | Yocto | Buildroot | +|:--|:--|:--|:--| +| Target | general purpose | embedded | embedded / IOT | +| U-boot and kernel | compiled from sources | compiled from sources | compiled from sources | +| Hardware support maintenance       | complete | outside | outside | +| Root file system | Debian or Ubuntu based| custom | custom | +| Package manager | APT | any | none | +| Configurability | limited | large | large | +| Initramfs support | yes | yes | yes | +| Getting started | quick | very slow | slow | +| Cross compilation | yes | yes | yes | + +

⇧

+ +## Where to download prebuilt images? + +https://www.armbian.com/download/ + +Armbian [releases](https://docs.armbian.com/Release_Changelog/) quarterly at the end of [February, May, August, November](https://github.com/armbian/documentation/blob/master/docs/Process_Release-Model.md). You are welcome to propose changes to our default [images build list](https://github.com/armbian/build/blob/master/config/targets.conf). -# How to build an image or a kernel? -Supported build environment is **Ubuntu Bionic 18.04 x64** ([minimal iso image](http://archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/current/images/netboot/mini.iso)). +

⇧

-- guest inside a [VirtualBox](https://www.virtualbox.org/wiki/Downloads) or other virtualization software, -- guest managed by [Vagrant](https://docs.armbian.com/Developer-Guide_Using-Vagrant/). This uses Virtualbox (as above) but does so in an easily repeatable way, -- inside a [Docker](https://docs.armbian.com/Developer-Guide_Building-with-Docker/), [systemd-nspawn](https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html) or other container environment [(example)](https://github.com/armbian/build/pull/255#issuecomment-205045273), -- running natively on a dedicated PC or a server (**not** recommended), -- **25GB disk space** or more and **2GB RAM** or more available for the VM, container or native OS, -- superuser rights (configured `sudo` or root access). +## Additional information -**Execution** +- [Build parameters and advanced build options](https://docs.armbian.com/Developer-Guide_Build-Options/), +- [Make use of user defined configurations](https://docs.armbian.com/Developer-Guide_User-Configurations/), +- [Docker](https://docs.armbian.com/Developer-Guide_Building-with-Docker/) and [Vagrant](https://docs.armbian.com/Developer-Guide_Using-Vagrant/) building guides, +- Engage in [Armbian build framework forums](https://forum.armbian.com/forum/4-development/), +- Check [Jira project management application](https://armbian.atlassian.net/browse/AR) status, +- Make use of [central project search engine](https://www.armbian.com/search), +- Browse [IRC channel logs](http://irc.armbian.com) or interact at #armbian on [freenode](https://freenode.net/). - apt -y install git - git clone https://github.com/armbian/build - cd build - ./compile.sh +

⇧

-Make sure that full path to the build script does not contain spaces. +## Build tools overview -You will be prompted with a selection menu for a build option, a board name, a kernel branch and an OS release. Please check the documentation for [advanced options](https://docs.armbian.com/Developer-Guide_Build-Options/) and [additional customization](https://docs.armbian.com/Developer-Guide_User-Configurations/). +```text +├── cache Work / cache directory +│   ├── rootfs Compressed vanilla Debian and Ubuntu rootfilesystem cache +│   ├── sources Kernel, u-boot and various drivers sources. Mainly C code +│   ├── toolchains External cross compilers from Linaro™ or ARM™ +├── config Packages repository configurations +│   ├── targets.conf Board build target configuration +│   ├── boards Board configurations +│   ├── bootenv Initial boot loaders environments per family +│   ├── bootscripts Initial Boot loaders scripts per family +│   ├── kernel Kernel build configurations per family +│   ├── sources Kernel and u-boot sources locations and scripts +│   ├── templates User configuration templates which populate userpatches +│   └── torrents External compiler and rootfs cache torrents +├── lib Main build tools libraries +├── output Build artifact +│   └── deb Deb packages +│   └── images Bootable images - RAW or compressed +│   └── debug Patch and build logs +│   └── config Kernel configuration export location +│   └── patch Created patches location +├── packages Support scripts, binary blobs, packages +│   ├── blobs Wallpapers, various configs, closed source bootloaders +│   ├── bsp Scripts and configs overlay for rootfs +│   └── extras-buildpkgs Optional compilation and packaging engine +├── patch Collection of patches +│   ├── atf ARM trusted firmware +│   ├── kernel Linux kernel patches +| |   └── family-branch Per kernel family and branch +│   ├── misc Linux kernel packaging patches +│   └── u-boot Universal boot loader patches +| ├── u-boot-board For specific board +|    └── u-boot-family For entire kernel family +└── userpatches User: configuration patching area + ├── lib.config User: tools common config/override file + ├── config-default.conf User: default user config file + ├── customize-image.sh User: script will execute just before closing the image +    ├── atf User: ARM trusted firmware +    ├── kernel User: Linux kernel per kernel family +    ├── misc User: various +    └── u-boot User: universal boot loader patches +``` -Build process uses caching for the compilation and the debootstrap process, so consecutive runs with similar settings will be much faster. +

⇧

-# How to report issues? +## Support -Please read [this](https://github.com/igorpecovnik/lib/blob/master/.github/ISSUE_TEMPLATE.md) notice first before opening an issue. +- Have you found a bug in the **build tools**? -# How to contribute? + Try to recreate it with a clean build tools clone. Then search for [existing and closed issues](https://github.com/armbian/build/issues). If you don't find it there, [open a new issue](https://github.com/armbian/build/issues/new). + +- Do you have troubles **elsewhere**? + + Armbian is free software and provides **best effort help** through [community forums](https://forum.armbian.com/). If you can't find answer there and/or with help of [general project search](https://www.armbian.com/search) engine, consider [hiring an expert](https://www.debian.org/consultants/). -- [Fork](https://help.github.com/articles/fork-a-repo/) the project -- Make one or more well commented and clean commits to the repository. -- Perform a [pull request](https://help.github.com/articles/creating-a-pull-request/) in github's web interface. +- Personalized support? -If it is a new feature request, don't start the coding first. Remember to [open an issue](https://guides.github.com/features/issues/) to discuss the new feature. + It is limited to active project supporters and sponsors. The shortest way to become one and receive our attention is a four figure [donation to our non-profit project](https://www.armbian.com/donate). -If you are struggling, check [this detailed step by step guide on contributing](https://www.exchangecore.com/blog/contributing-concrete5-github/). +

⇧

-## Where to get more info? +## Contribute -- [Documentation](https://docs.armbian.com/Developer-Guide_Build-Preparation/ "Developer resources") -- [Prebuilt images](https://www.armbian.com/download/ "Download section") -- [Support forums](https://forum.armbian.com/ "Armbian support forum") +- Adding a new feature? + + You are welcome to suggest or contribute directly to the code with a pull request. In case your proposed changes are large, remember to discuss them prior to development. + +- Join development? + + Join regulars on their active missions, start maintaining any part of the code: patches, drivers or scripted applications like [armbian-config](https://github.com/armbian/config), address [community wishes](https://github.com/armbian/build/issues), + +- Help elsewhere? + + Maintain and develop [documentation](https://github.com/armbian/documentation), [CI](https://github.com/armbian/ci-testing-tools), [autotests](https://github.com/armbian/autotests), [seed torrents](https://forum.armbian.com/topic/4198-seed-our-torrents/), help on [forum moderating](https://forum.armbian.com/topic/12631-help-on-forum-moderating/), [project administration](https://forum.armbian.com/forum/39-armbian-project-administration/), [costs](https://www.armbian.com/donate). + +

⇧

+ +## Social + +- [Participate in Armbian forums](https://forum.armbian.com), +- Chat with fellow users on IRC [#armbian](https://webchat.freenode.net/?channels=armbian) on Freenode, +- Follow [@armbian on Twitter](https://twitter.com/armbian) or [LinkedIN](https://www.linkedin.com/company/armbian). + +

⇧

+ +## Credits + +- [Current and past contributors](https://github.com/armbian/build/graphs/contributors), our families and friends, +- [Support staff that keeps forums usable](https://forum.armbian.com/members/2-moderators/), +- [Individuals that help with their ideas](https://forum.armbian.com/), reports and [donations](https://www.armbian.com/donate). + +

⇧

+ +## Sponsors + +Most of the project is sponsored with a work done by volunteer collaborators, while some part of the project costs are being covered by the industry. We would not be able to get this far without their help. + +[Do you want to see yourself below?](https://www.armbian.com/#contact) + +Armbian logoArmbian logo + + + + +

⇧

From 50dd1ca46782a4d33ed8395758f362e46c4313df Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Thu, 6 Feb 2020 23:47:12 +0100 Subject: [PATCH 23/54] Update rockchip64 kernel config - getting closer to Ayufan configuration which is apparently more stable. Need testings --- config/kernel/linux-rockchip64-legacy.config | 829 +-- .../rockchip64-legacy/patch-4.4.211-212.patch | 5145 +++++++++++++++++ .../rockchip64-legacy/patch-4.4.212-213.patch | 1559 +++++ ...GBE_usb_rtl8156_to_v2.12.0.patch.disabled} | 0 4 files changed, 7125 insertions(+), 408 deletions(-) create mode 100644 patch/kernel/rockchip64-legacy/patch-4.4.211-212.patch create mode 100644 patch/kernel/rockchip64-legacy/patch-4.4.212-213.patch rename patch/kernel/rockchip64-legacy/{update_rockchip64-default_2.5GBE_usb_rtl8156_to_v2.12.0.patch => update_rockchip64-default_2.5GBE_usb_rtl8156_to_v2.12.0.patch.disabled} (100%) diff --git a/config/kernel/linux-rockchip64-legacy.config b/config/kernel/linux-rockchip64-legacy.config index 6a32d777f8..8386de9cb3 100644 --- a/config/kernel/linux-rockchip64-legacy.config +++ b/config/kernel/linux-rockchip64-legacy.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 4.4.211 Kernel Configuration +# Linux/arm64 4.4.213 Kernel Configuration # CONFIG_ARM64=y CONFIG_64BIT=y @@ -309,7 +309,7 @@ CONFIG_MSDOS_PARTITION=y # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set -CONFIG_RK_PARTITION=y +# CONFIG_RK_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set CONFIG_BLOCK_COMPAT=y @@ -382,10 +382,10 @@ CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCIE_ROCKCHIP=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y -CONFIG_PCIE_ECRC=y -CONFIG_PCIEAER_INJECT=y +# CONFIG_PCIE_ECRC is not set +# CONFIG_PCIEAER_INJECT is not set CONFIG_PCIEASPM=y -CONFIG_PCIEASPM_DEBUG=y +# CONFIG_PCIEASPM_DEBUG is not set # CONFIG_PCIEASPM_DEFAULT is not set CONFIG_PCIEASPM_POWERSAVE=y # CONFIG_PCIEASPM_PERFORMANCE is not set @@ -407,7 +407,7 @@ CONFIG_PCIE_PME=y CONFIG_ARM64_ERRATUM_834220=y CONFIG_ARM64_ERRATUM_845719=y CONFIG_ARM64_ERRATUM_843419=y -CONFIG_ARM64_ERRATUM_1024718=y +# CONFIG_ARM64_ERRATUM_1024718 is not set # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set CONFIG_CAVIUM_ERRATUM_27456=y @@ -452,17 +452,14 @@ CONFIG_HAVE_MEMBLOCK=y CONFIG_NO_BOOTMEM=y # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set CONFIG_SPLIT_PTLOCK_CPUS=4 -CONFIG_COMPACTION=y -CONFIG_MIGRATION=y +# CONFIG_COMPACTION is not set CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=1 CONFIG_BOUNCE=y CONFIG_MMU_NOTIFIER=y -CONFIG_KSM=y +# CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 -CONFIG_TRANSPARENT_HUGEPAGE=y -# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set -CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y +# CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set # CONFIG_CMA is not set @@ -512,7 +509,7 @@ CONFIG_COMPAT_BINFMT_ELF=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set -CONFIG_BINFMT_MISC=y +CONFIG_BINFMT_MISC=m CONFIG_COREDUMP=y CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y @@ -528,7 +525,7 @@ CONFIG_WAKELOCK=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y -# CONFIG_PM_AUTOSLEEP is not set +CONFIG_PM_AUTOSLEEP=y CONFIG_PM_WAKELOCKS=y CONFIG_PM_WAKELOCKS_LIMIT=100 CONFIG_PM_WAKELOCKS_GC=y @@ -572,14 +569,14 @@ CONFIG_ARM_CPUIDLE=y CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y -CONFIG_CPU_FREQ_STAT_DETAILS=y +# CONFIG_CPU_FREQ_STAT_DETAILS is not set CONFIG_CPU_FREQ_TIMES=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y @@ -702,25 +699,25 @@ CONFIG_NETLABEL=y # CONFIG_ANDROID_PARANOID_NETWORK is not set CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y -CONFIG_NETWORK_PHY_TIMESTAMPING=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y -CONFIG_BRIDGE_NETFILTER=m +CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y -CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_ACCT=m -CONFIG_NETFILTER_NETLINK_QUEUE=m -CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_COMMON=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y -CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_TIMEOUT=y @@ -743,8 +740,7 @@ CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NF_CT_NETLINK_TIMEOUT=m -CONFIG_NF_CT_NETLINK_HELPER=m -CONFIG_NETFILTER_NETLINK_GLUE_CT=y +# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y CONFIG_NF_NAT_PROTO_DCCP=m @@ -787,7 +783,7 @@ CONFIG_NETFILTER_XT_SET=m # # Xtables targets # -CONFIG_NETFILTER_XT_TARGET_AUDIT=m +# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m CONFIG_NETFILTER_XT_TARGET_CONNMARK=m @@ -865,7 +861,7 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m CONFIG_NETFILTER_XT_MATCH_TCPMSS=m CONFIG_NETFILTER_XT_MATCH_TIME=m CONFIG_NETFILTER_XT_MATCH_U32=m -CONFIG_IP_SET=m +CONFIG_IP_SET=y CONFIG_IP_SET_MAX=256 CONFIG_IP_SET_BITMAP_IP=m CONFIG_IP_SET_BITMAP_IPMAC=m @@ -921,9 +917,9 @@ CONFIG_IP_VS_SH_TAB_BITS=8 # # IPVS application helper # -CONFIG_IP_VS_FTP=m +# CONFIG_IP_VS_FTP is not set CONFIG_IP_VS_NFCT=y -CONFIG_IP_VS_PE_SIP=m +# CONFIG_IP_VS_PE_SIP is not set # # IP: Netfilter Configuration @@ -1034,35 +1030,22 @@ CONFIG_BRIDGE_EBT_SNAT=m CONFIG_BRIDGE_EBT_LOG=m CONFIG_BRIDGE_EBT_NFLOG=m # CONFIG_IP_DCCP is not set -CONFIG_IP_SCTP=m -# CONFIG_SCTP_DBG_OBJCNT is not set -CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y -# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set -# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set -CONFIG_SCTP_COOKIE_HMAC_MD5=y -# CONFIG_SCTP_COOKIE_HMAC_SHA1 is not set +# CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set -CONFIG_L2TP=m -# CONFIG_L2TP_DEBUGFS is not set -CONFIG_L2TP_V3=y -CONFIG_L2TP_IP=m -CONFIG_L2TP_ETH=m -CONFIG_STP=m -CONFIG_GARP=m -CONFIG_MRP=m -CONFIG_BRIDGE=m +# CONFIG_L2TP is not set +CONFIG_STP=y +CONFIG_BRIDGE=y CONFIG_BRIDGE_IGMP_SNOOPING=y -CONFIG_BRIDGE_VLAN_FILTERING=y +# CONFIG_BRIDGE_VLAN_FILTERING is not set CONFIG_HAVE_NET_DSA=y -CONFIG_NET_DSA=m -CONFIG_NET_DSA_HWMON=y -CONFIG_VLAN_8021Q=m -CONFIG_VLAN_8021Q_GVRP=y -CONFIG_VLAN_8021Q_MVRP=y +# CONFIG_NET_DSA is not set +CONFIG_VLAN_8021Q=y +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_VLAN_8021Q_MVRP is not set # CONFIG_DECNET is not set -CONFIG_LLC=m +CONFIG_LLC=y # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set @@ -1123,24 +1106,19 @@ CONFIG_NET_CLS_CGROUP=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y -CONFIG_BATMAN_ADV=m -CONFIG_BATMAN_ADV_BLA=y -CONFIG_BATMAN_ADV_DAT=y -CONFIG_BATMAN_ADV_NC=y -CONFIG_BATMAN_ADV_MCAST=y -# CONFIG_BATMAN_ADV_DEBUG is not set +# CONFIG_BATMAN_ADV is not set CONFIG_OPENVSWITCH=m CONFIG_OPENVSWITCH_GRE=m CONFIG_OPENVSWITCH_VXLAN=m CONFIG_OPENVSWITCH_GENEVE=m -CONFIG_VSOCKETS=m -CONFIG_NETLINK_DIAG=m +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_DIAG is not set CONFIG_MPLS=y CONFIG_NET_MPLS_GSO=m # CONFIG_MPLS_ROUTING is not set -CONFIG_HSR=m -CONFIG_NET_SWITCHDEV=y -CONFIG_NET_L3_MASTER_DEV=y +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +# CONFIG_NET_L3_MASTER_DEV is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y @@ -1148,7 +1126,7 @@ CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -CONFIG_BPF_JIT=y +# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -1159,12 +1137,12 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set -CONFIG_BT=m +CONFIG_BT=y CONFIG_BT_BREDR=y -CONFIG_BT_RFCOMM=m -CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_RFCOMM=y +# CONFIG_BT_RFCOMM_TTY is not set # CONFIG_BT_BNEP is not set -CONFIG_BT_HIDP=m +CONFIG_BT_HIDP=y CONFIG_BT_HS=y CONFIG_BT_LE=y # CONFIG_BT_SELFTEST is not set @@ -1173,30 +1151,29 @@ CONFIG_BT_DEBUGFS=y # # Bluetooth device drivers # -CONFIG_BT_INTEL=m -CONFIG_BT_BCM=m -CONFIG_BT_RTL=m -CONFIG_BT_QCA=m +CONFIG_BT_INTEL=y +CONFIG_BT_BCM=y +CONFIG_BT_RTL=y # CONFIG_BT_RTKBTUSB is not set -CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIBTUSB=y CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y # CONFIG_BT_HCIBTSDIO is not set -CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART=y CONFIG_BT_HCIUART_H4=y # CONFIG_BT_HCIUART_BCSP is not set CONFIG_BT_HCIUART_ATH3K=y CONFIG_BT_HCIUART_LL=y -CONFIG_BT_HCIUART_3WIRE=y -CONFIG_BT_HCIUART_INTEL=y -CONFIG_BT_HCIUART_BCM=y -CONFIG_BT_HCIUART_QCA=y -CONFIG_BT_HCIBCM203X=m -CONFIG_BT_HCIBPA10X=m -CONFIG_BT_HCIBFUSB=m -CONFIG_BT_HCIVHCI=m -CONFIG_BT_MRVL=m -CONFIG_BT_MRVL_SDIO=m +# CONFIG_BT_HCIUART_3WIRE is not set +# CONFIG_BT_HCIUART_INTEL is not set +# CONFIG_BT_HCIUART_BCM is not set +# CONFIG_BT_HCIUART_QCA is not set +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBPA10X is not set +CONFIG_BT_HCIBFUSB=y +CONFIG_BT_HCIVHCI=y +CONFIG_BT_MRVL=y +CONFIG_BT_MRVL_SDIO=y # CONFIG_BT_ATH3K is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y @@ -1228,7 +1205,7 @@ CONFIG_MAC80211_RC_MINSTREL_HT=y # CONFIG_MAC80211_RC_MINSTREL_VHT is not set CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" -CONFIG_MAC80211_MESH=y +# CONFIG_MAC80211_MESH is not set CONFIG_MAC80211_LEDS=y CONFIG_MAC80211_DEBUGFS=y # CONFIG_MAC80211_MESSAGE_TRACING is not set @@ -1241,12 +1218,6 @@ CONFIG_MAC80211_VERBOSE_DEBUG=y # CONFIG_MAC80211_OCB_DEBUG is not set # CONFIG_MAC80211_IBSS_DEBUG is not set # CONFIG_MAC80211_PS_DEBUG is not set -# CONFIG_MAC80211_MPL_DEBUG is not set -# CONFIG_MAC80211_MPATH_DEBUG is not set -# CONFIG_MAC80211_MHWMP_DEBUG is not set -# CONFIG_MAC80211_MESH_SYNC_DEBUG is not set -# CONFIG_MAC80211_MESH_CSA_DEBUG is not set -# CONFIG_MAC80211_MESH_PS_DEBUG is not set # CONFIG_MAC80211_TDLS_DEBUG is not set # CONFIG_MAC80211_DEBUG_COUNTERS is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 @@ -1445,17 +1416,16 @@ CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 CONFIG_BLK_DEV_RAM_SIZE=4096 -# CONFIG_BLK_DEV_RAM_DAX is not set # CONFIG_CDROM_PKTCDVD is not set CONFIG_ATA_OVER_ETH=m -# CONFIG_BLK_DEV_RBD is not set +CONFIG_BLK_DEV_RBD=m # CONFIG_BLK_DEV_RSXX is not set CONFIG_BLK_DEV_NVME=y # # Misc devices # -CONFIG_ROCKCHIP_SCR=y +# CONFIG_ROCKCHIP_SCR is not set # CONFIG_SENSORS_LIS3LV02D is not set # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set @@ -1475,8 +1445,9 @@ CONFIG_ROCKCHIP_SCR=y # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_TI_DAC7512 is not set -# CONFIG_BMP085_I2C is not set -# CONFIG_BMP085_SPI is not set +CONFIG_BMP085=m +CONFIG_BMP085_I2C=m +CONFIG_BMP085_SPI=m # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set CONFIG_SRAM=y @@ -1599,7 +1570,7 @@ CONFIG_ISCSI_BOOT_SYSFS=m CONFIG_SCSI_MPT3SAS=m CONFIG_SCSI_MPT2SAS_MAX_SGE=128 CONFIG_SCSI_MPT3SAS_MAX_SGE=128 -CONFIG_SCSI_MPT2SAS=m +# CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_SNIC is not set @@ -1610,9 +1581,7 @@ CONFIG_SCSI_MPT2SAS=m # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set -CONFIG_SCSI_IPR=m -CONFIG_SCSI_IPR_TRACE=y -CONFIG_SCSI_IPR_DUMP=y +# CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set @@ -1796,7 +1765,6 @@ CONFIG_TUN=m # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m CONFIG_NLMON=m -CONFIG_NET_VRF=m CONFIG_ARCNET=m # CONFIG_ARCNET_1201 is not set # CONFIG_ARCNET_1051 is not set @@ -1813,19 +1781,13 @@ CONFIG_ARCNET=m CONFIG_VHOST_NET=m CONFIG_VHOST_RING=m CONFIG_VHOST=m -CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y +# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Distributed Switch Architecture drivers # # CONFIG_NET_DSA_MV88E6XXX is not set -# CONFIG_NET_DSA_MV88E6060 is not set # CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set -# CONFIG_NET_DSA_MV88E6131 is not set -# CONFIG_NET_DSA_MV88E6123_61_65 is not set -# CONFIG_NET_DSA_MV88E6171 is not set -# CONFIG_NET_DSA_MV88E6352 is not set -# CONFIG_NET_DSA_BCM_SF2 is not set CONFIG_ETHERNET=y CONFIG_NET_VENDOR_3COM=y # CONFIG_VORTEX is not set @@ -1960,7 +1922,6 @@ CONFIG_NET_VENDOR_RENESAS=y CONFIG_NET_VENDOR_RDC=y # CONFIG_R6040 is not set CONFIG_NET_VENDOR_ROCKER=y -# CONFIG_ROCKER is not set CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set CONFIG_NET_VENDOR_SEEQ=y @@ -2051,7 +2012,6 @@ CONFIG_PPP_DEFLATE=m # CONFIG_PPP_MULTILINK is not set CONFIG_PPPOE=m # CONFIG_PPTP is not set -CONFIG_PPPOL2TP=m CONFIG_PPPOLAC=m CONFIG_PPPOPNS=m CONFIG_PPP_ASYNC=m @@ -2237,8 +2197,8 @@ CONFIG_WIFI_BUILD_MODULE=y CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y # CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set CONFIG_AP6XXX=m -CONFIG_CYW_BCMDHD=m -# CONFIG_RTL_WIRELESS_SOLUTION is not set +# CONFIG_CYW_BCMDHD is not set +CONFIG_RTL_WIRELESS_SOLUTION=y CONFIG_RTL8188EU=m CONFIG_RTL8188FU=m # CONFIG_RTL8189ES is not set @@ -2248,8 +2208,8 @@ CONFIG_RTL8723BU=m # CONFIG_RTL8723CS is not set # CONFIG_RTL8723DS is not set # CONFIG_RTL8822BE is not set -# CONFIG_RTL8822BS is not set -CONFIG_MVL88W8977=m +CONFIG_RTL8822BS=m +# CONFIG_MVL88W8977 is not set # # SouthSV 6XXX WLAN support @@ -2452,6 +2412,7 @@ CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set +CONFIG_TOUCHSCREEN_COLIBRI_VF50=m # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_VTL_CT36X is not set CONFIG_TOUCHSCREEN_GT1X=y @@ -2461,7 +2422,18 @@ CONFIG_ROCKCHIP_REMOTECTL_PWM=y # # handle all sensors # -# CONFIG_SENSOR_DEVICE is not set +CONFIG_SENSOR_DEVICE=y +# CONFIG_ANGLE_DEVICE is not set +# CONFIG_GSENSOR_DEVICE is not set +# CONFIG_COMPASS_DEVICE is not set +# CONFIG_GYROSCOPE_DEVICE is not set +# CONFIG_LIGHT_DEVICE is not set +# CONFIG_PROXIMITY_DEVICE is not set +# CONFIG_TEMPERATURE_DEVICE is not set +# CONFIG_PRESSURE_DEVICE is not set +CONFIG_HALL_DEVICE=y +# CONFIG_HS_OCH165T is not set +CONFIG_HS_MH248=y CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_BMA150 is not set @@ -2538,7 +2510,7 @@ CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y -CONFIG_SERIAL_8250_PCI=y +# CONFIG_SERIAL_8250_PCI is not set CONFIG_SERIAL_8250_NR_UARTS=5 CONFIG_SERIAL_8250_RUNTIME_UARTS=5 # CONFIG_SERIAL_8250_EXTENDED is not set @@ -2577,7 +2549,7 @@ CONFIG_SERIAL_OF_PLATFORM=y CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_TPM=y -CONFIG_HW_RANDOM_ROCKCHIP=m +# CONFIG_HW_RANDOM_ROCKCHIP is not set # CONFIG_APPLICOM is not set # @@ -2712,7 +2684,7 @@ CONFIG_PPS=y # PPS clients support # CONFIG_PPS_CLIENT_KTIMER=m -CONFIG_PPS_CLIENT_LDISC=m +# CONFIG_PPS_CLIENT_LDISC is not set CONFIG_PPS_CLIENT_GPIO=m # @@ -2723,7 +2695,10 @@ CONFIG_PPS_CLIENT_GPIO=m # PTP clock support # CONFIG_PTP_1588_CLOCK=y -CONFIG_DP83640_PHY=m + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# CONFIG_PINCTRL=y # @@ -2736,7 +2711,7 @@ CONFIG_GENERIC_PINCONF=y # CONFIG_PINCTRL_AMD is not set CONFIG_PINCTRL_ROCKCHIP=y # CONFIG_PINCTRL_SINGLE is not set -CONFIG_PINCTRL_RK805=m +CONFIG_PINCTRL_RK805=y CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_GPIOLIB=y @@ -2857,10 +2832,10 @@ CONFIG_CHARGER_BQ24735=y # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_CHARGER_SY6982C is not set -CONFIG_CHARGER_UNIVERSAL=m +CONFIG_CHARGER_UNIVERSAL=y # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_BATTERY_EC is not set -# CONFIG_BATTERY_CW2015 is not set +CONFIG_BATTERY_CW2015=y # CONFIG_BATTERY_RK816 is not set CONFIG_BATTERY_RK817=y CONFIG_CHARGER_RK817=y @@ -3028,13 +3003,13 @@ CONFIG_ROCKCHIP_THERMAL=y # CONFIG_RK_VIRTUAL_THERMAL is not set # CONFIG_RK3368_THERMAL is not set CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_CORE is not set # CONFIG_WATCHDOG_NOWAYOUT is not set # # Watchdog Device Drivers # -CONFIG_SOFT_WATCHDOG=m +# CONFIG_SOFT_WATCHDOG is not set # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set @@ -3221,7 +3196,7 @@ CONFIG_REGULATOR_RK808=y CONFIG_REGULATOR_RK818=y # CONFIG_REGULATOR_SYR82X is not set # CONFIG_REGULATOR_TPS51632 is not set -CONFIG_REGULATOR_TPS549B22=m +# CONFIG_REGULATOR_TPS549B22 is not set # CONFIG_REGULATOR_TPS62360 is not set # CONFIG_REGULATOR_TPS65023 is not set # CONFIG_REGULATOR_TPS6507X is not set @@ -3271,8 +3246,8 @@ CONFIG_DVB_MAX_ADAPTERS=8 # Media drivers # CONFIG_RC_CORE=y -CONFIG_RC_MAP=m -# CONFIG_LIRC is not set +CONFIG_RC_MAP=y +CONFIG_LIRC=y CONFIG_RC_DECODERS=y CONFIG_IR_NEC_DECODER=y CONFIG_IR_RC5_DECODER=y @@ -3284,14 +3259,28 @@ CONFIG_IR_SHARP_DECODER=y CONFIG_IR_MCE_KBD_DECODER=y CONFIG_IR_XMP_DECODER=y # CONFIG_IR_IMON_DECODER is not set -# CONFIG_RC_DEVICES is not set +CONFIG_RC_DEVICES=y +# CONFIG_RC_ATI_REMOTE is not set +# CONFIG_IR_HIX5HD2 is not set +# CONFIG_IR_IMON is not set +# CONFIG_IR_MCEUSB is not set +# CONFIG_IR_REDRAT3 is not set +# CONFIG_IR_STREAMZAP is not set +# CONFIG_IR_IGORPLUGUSB is not set +# CONFIG_IR_IGUANA is not set +# CONFIG_IR_TTUSBIR is not set +# CONFIG_RC_LOOPBACK is not set +CONFIG_IR_GPIO_CIR=m +# CONFIG_IR_GPIO_TX is not set +# CONFIG_IR_PWM_TX is not set +# CONFIG_IR_SERIAL is not set CONFIG_MEDIA_USB_SUPPORT=y # # Webcam devices # CONFIG_USB_VIDEO_CLASS=y -CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +# CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set CONFIG_USB_GSPCA=m CONFIG_USB_M5602=m CONFIG_USB_STV06XX=m @@ -3436,7 +3425,7 @@ CONFIG_V4L_PLATFORM_DRIVERS=y CONFIG_SOC_CAMERA=y # CONFIG_SOC_CAMERA_PLATFORM is not set # CONFIG_VIDEO_XILINX is not set -CONFIG_VIDEO_RK_CIF_ISP10=y +# CONFIG_VIDEO_RK_CIF_ISP10 is not set # CONFIG_VIDEO_ROCKCHIP_CIF is not set CONFIG_VIDEO_ROCKCHIP_ISP1=y CONFIG_V4L_MEM2MEM_DRIVERS=y @@ -3471,7 +3460,7 @@ CONFIG_SMS_SIANO_RC=y # # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set CONFIG_MEDIA_ATTACH=y -CONFIG_VIDEO_IR_I2C=y +# CONFIG_VIDEO_IR_I2C is not set # # I2C Encoders, decoders, sensors and other helper chips @@ -3638,16 +3627,6 @@ CONFIG_VIDEO_SC031GS=y # CONFIG_SOC_CAMERA_OV9740 is not set # CONFIG_SOC_CAMERA_RJ54N1 is not set # CONFIG_SOC_CAMERA_TW9910 is not set -# CONFIG_VIDEO_OV8858 is not set -# CONFIG_VIDEO_OV2710 is not set -# CONFIG_VIDEO_TC358749XBG is not set -CONFIG_VIDEO_ADV7181=y -# CONFIG_VIDEO_OV7675 is not set -# CONFIG_VIDEO_NT99230 is not set -# CONFIG_VIDEO_OV9281 is not set -# CONFIG_VIDEO_OV9750 is not set -# CONFIG_VIDEO_ov5640 is not set -# CONFIG_VIDEO_SC2232 is not set # # SPI helper chips @@ -3862,7 +3841,7 @@ CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_LOAD_EDID_FIRMWARE=y -CONFIG_DRM_TTM=y +CONFIG_DRM_TTM=m # CONFIG_DRM_SCDC_HELPER is not set CONFIG_DRM_DMA_SYNC=y @@ -3897,7 +3876,7 @@ CONFIG_ROCKCHIP_RGB=y CONFIG_ROCKCHIP_DRM_BACKLIGHT=y # CONFIG_ROCKCHIP_RK3066_HDMI is not set CONFIG_DRM_UDL=y -CONFIG_DRM_AST=y +CONFIG_DRM_AST=m # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_QXL is not set @@ -3931,7 +3910,7 @@ CONFIG_DRM_DW_HDMI=y CONFIG_DRM_DW_HDMI_I2S_AUDIO=y CONFIG_DRM_DW_HDMI_CEC=y # CONFIG_POWERVR_ROGUE_M is not set -CONFIG_MALI400=y +CONFIG_MALI400=m CONFIG_MALI450=y # CONFIG_MALI470 is not set # CONFIG_MALI400_DEBUG is not set @@ -3943,12 +3922,28 @@ CONFIG_MALI_SHARED_INTERRUPTS=y CONFIG_MALI_DT=y CONFIG_MALI_DEVFREQ=y # CONFIG_MALI_QUIET is not set -CONFIG_MALI_MIDGARD_FOR_ANDROID=y -# CONFIG_MALI_MIDGARD_FOR_LINUX is not set -# CONFIG_MALI_MIDGARD is not set +# CONFIG_MALI_MIDGARD_FOR_ANDROID is not set +CONFIG_MALI_MIDGARD_FOR_LINUX=y +CONFIG_MALI_MIDGARD=m +# CONFIG_MALI_GATOR_SUPPORT is not set +# CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set +CONFIG_MALI_DMA_FENCE=y +CONFIG_MALI_EXPERT=y +# CONFIG_MALI_CORESTACK is not set +# CONFIG_MALI_PRFCNT_SET_SECONDARY is not set +# CONFIG_MALI_PLATFORM_FAKE is not set +# CONFIG_MALI_PLATFORM_DEVICETREE is not set +CONFIG_MALI_PLATFORM_THIRDPARTY=y +CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk" +CONFIG_MALI_DEBUG=y +# CONFIG_MALI_NO_MALI is not set +# CONFIG_MALI_TRACE_TIMELINE is not set +# CONFIG_MALI_SYSTEM_TRACE is not set +# CONFIG_MALI_GPU_MMU_AARCH64 is not set +CONFIG_MALI_PWRSOFT_765=y # CONFIG_MALI_KUTF is not set -CONFIG_MALI_BIFROST_FOR_ANDROID=y -# CONFIG_MALI_BIFROST_FOR_LINUX is not set +# CONFIG_MALI_BIFROST_FOR_ANDROID is not set +CONFIG_MALI_BIFROST_FOR_LINUX=y # CONFIG_MALI_BIFROST is not set # @@ -4050,18 +4045,18 @@ CONFIG_LCD_GENERAL=y # # RGA2 # -# CONFIG_ROCKCHIP_RGA2 is not set +CONFIG_ROCKCHIP_RGA2=y # # VCODEC # -CONFIG_RK_VCODEC=m +CONFIG_RK_VCODEC=y # # IEP # -# CONFIG_IEP is not set -# CONFIG_IEP_MMU is not set +CONFIG_IEP=y +CONFIG_IEP_MMU=y # # DP @@ -4099,22 +4094,22 @@ CONFIG_SND_DMAENGINE_PCM=y CONFIG_SND_HWDEP=y CONFIG_SND_RAWMIDI=y CONFIG_SND_JACK=y -CONFIG_SND_SEQUENCER=m -CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_SEQUENCER=y +CONFIG_SND_SEQ_DUMMY=y # CONFIG_SND_MIXER_OSS is not set # CONFIG_SND_PCM_OSS is not set CONFIG_SND_PCM_TIMER=y # CONFIG_SND_SEQUENCER_OSS is not set -CONFIG_SND_HRTIMER=m +CONFIG_SND_HRTIMER=y CONFIG_SND_SEQ_HRTIMER_DEFAULT=y CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 -CONFIG_SND_SUPPORT_OLD_API=y +# CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set -CONFIG_SND_RAWMIDI_SEQ=m +CONFIG_SND_RAWMIDI_SEQ=y # CONFIG_SND_OPL3_LIB_SEQ is not set # CONFIG_SND_OPL4_LIB_SEQ is not set # CONFIG_SND_SBAWE_SEQ is not set @@ -4229,15 +4224,15 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y CONFIG_SND_SOC_ROCKCHIP=y # CONFIG_SND_SOC_ROCKCHIP_FORCE_SRAM is not set CONFIG_SND_SOC_ROCKCHIP_I2S=y -CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=m +CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y # CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS is not set -# CONFIG_SND_SOC_ROCKCHIP_PDM is not set +CONFIG_SND_SOC_ROCKCHIP_PDM=y CONFIG_SND_SOC_ROCKCHIP_SPDIF=y # CONFIG_SND_SOC_ROCKCHIP_SPDIFRX is not set # CONFIG_SND_SOC_ROCKCHIP_VAD is not set # CONFIG_SND_SOC_ROCKCHIP_DA7219 is not set -CONFIG_SND_SOC_ROCKCHIP_HDMI_ANALOG=m -CONFIG_SND_SOC_ROCKCHIP_HDMI_DP=m +CONFIG_SND_SOC_ROCKCHIP_HDMI_ANALOG=y +CONFIG_SND_SOC_ROCKCHIP_HDMI_DP=y CONFIG_SND_SOC_ROCKCHIP_MAX98090=y CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y CONFIG_SND_SOC_ROCKCHIP_RT5645=y @@ -4293,7 +4288,7 @@ CONFIG_SND_SOC_MAX98090=y # CONFIG_SND_SOC_PCM512x_SPI is not set # CONFIG_SND_SOC_RK312X is not set # CONFIG_SND_SOC_RK3228 is not set -# CONFIG_SND_SOC_RK3308 is not set +CONFIG_SND_SOC_RK3308=y CONFIG_SND_SOC_RK3328=y CONFIG_SND_SOC_RK817=y CONFIG_SND_SOC_RL6231=y @@ -4355,93 +4350,89 @@ CONFIG_HID_GENERIC=y # # Special HID drivers # -CONFIG_HID_A4TECH=m -CONFIG_HID_ACRUX=m +CONFIG_HID_A4TECH=y +CONFIG_HID_ACRUX=y # CONFIG_HID_ACRUX_FF is not set -CONFIG_HID_APPLE=m -CONFIG_HID_APPLEIR=m -CONFIG_HID_AUREAL=m -CONFIG_HID_BELKIN=m -CONFIG_HID_BETOP_FF=m -CONFIG_HID_CHERRY=m -CONFIG_HID_CHICONY=m -CONFIG_HID_CORSAIR=m -CONFIG_HID_PRODIKEYS=m -CONFIG_HID_CP2112=m -CONFIG_HID_CYPRESS=m -CONFIG_HID_DRAGONRISE=m -# CONFIG_DRAGONRISE_FF is not set -CONFIG_HID_EMS_FF=m -CONFIG_HID_ELECOM=m -CONFIG_HID_ELO=m -CONFIG_HID_EZKEY=m -CONFIG_HID_GEMBIRD=m -CONFIG_HID_GFRM=m -CONFIG_HID_HOLTEK=m -# CONFIG_HOLTEK_FF is not set -CONFIG_HID_GT683R=m -CONFIG_HID_KEYTOUCH=m -CONFIG_HID_KYE=m -CONFIG_HID_UCLOGIC=m -CONFIG_HID_WALTOP=m -CONFIG_HID_GYRATION=m -CONFIG_HID_ICADE=m -CONFIG_HID_TWINHAN=m -CONFIG_HID_KENSINGTON=m -CONFIG_HID_LCPOWER=m -CONFIG_HID_LENOVO=m -CONFIG_HID_LOGITECH=m -CONFIG_HID_LOGITECH_DJ=m -CONFIG_HID_LOGITECH_HIDPP=m -# CONFIG_LOGITECH_FF is not set -# CONFIG_LOGIRUMBLEPAD2_FF is not set -# CONFIG_LOGIG940_FF is not set -# CONFIG_LOGIWHEELS_FF is not set -CONFIG_HID_MAGICMOUSE=m -CONFIG_HID_MICROSOFT=m -CONFIG_HID_MONTEREY=m -CONFIG_HID_MULTITOUCH=m -CONFIG_HID_NTRIG=m -CONFIG_HID_ORTEK=m -CONFIG_HID_PANTHERLORD=m -# CONFIG_PANTHERLORD_FF is not set -CONFIG_HID_PENMOUNT=m -CONFIG_HID_PETALYNX=m -CONFIG_HID_PICOLCD=m -# CONFIG_HID_PICOLCD_FB is not set -# CONFIG_HID_PICOLCD_BACKLIGHT is not set -# CONFIG_HID_PICOLCD_LEDS is not set -# CONFIG_HID_PICOLCD_CIR is not set -CONFIG_HID_PLANTRONICS=m -CONFIG_HID_PRIMAX=m -CONFIG_HID_ROCCAT=m -CONFIG_HID_SAITEK=m -CONFIG_HID_SAMSUNG=m -CONFIG_HID_SONY=m +CONFIG_HID_APPLE=y +CONFIG_HID_APPLEIR=y +CONFIG_HID_AUREAL=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BETOP_FF=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CORSAIR=y +CONFIG_HID_PRODIKEYS=y +CONFIG_HID_CP2112=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=y +CONFIG_HID_ELECOM=y +CONFIG_HID_ELO=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GEMBIRD=y +CONFIG_HID_GFRM=y +CONFIG_HID_HOLTEK=y +CONFIG_HOLTEK_FF=y +CONFIG_HID_GT683R=y +CONFIG_HID_KEYTOUCH=y +CONFIG_HID_KYE=y +CONFIG_HID_UCLOGIC=y +CONFIG_HID_WALTOP=y +CONFIG_HID_GYRATION=y +CONFIG_HID_ICADE=y +CONFIG_HID_TWINHAN=y +CONFIG_HID_KENSINGTON=y +CONFIG_HID_LCPOWER=y +CONFIG_HID_LENOVO=y +CONFIG_HID_LOGITECH=y +CONFIG_HID_LOGITECH_DJ=y +CONFIG_HID_LOGITECH_HIDPP=y +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_LOGIWHEELS_FF=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_MULTITOUCH=y +CONFIG_HID_NTRIG=y +CONFIG_HID_ORTEK=y +CONFIG_HID_PANTHERLORD=y +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=y +CONFIG_HID_PETALYNX=y +# CONFIG_HID_PICOLCD is not set +CONFIG_HID_PLANTRONICS=y +CONFIG_HID_PRIMAX=y +CONFIG_HID_ROCCAT=y +CONFIG_HID_SAITEK=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y # CONFIG_SONY_FF is not set -CONFIG_HID_SPEEDLINK=m -CONFIG_HID_STEELSERIES=m -CONFIG_HID_SUNPLUS=m -CONFIG_HID_RMI=m -CONFIG_HID_GREENASIA=m -# CONFIG_GREENASIA_FF is not set -CONFIG_HID_SMARTJOYPLUS=m -# CONFIG_SMARTJOYPLUS_FF is not set -CONFIG_HID_TIVO=m -CONFIG_HID_TOPSEED=m -CONFIG_HID_THINGM=m -CONFIG_HID_THRUSTMASTER=m -# CONFIG_THRUSTMASTER_FF is not set -CONFIG_HID_WACOM=m -CONFIG_HID_WIIMOTE=m -CONFIG_HID_XINMO=m -CONFIG_HID_ZEROPLUS=m -# CONFIG_ZEROPLUS_FF is not set -CONFIG_HID_ZYDACRON=m -CONFIG_HID_SENSOR_HUB=m -# CONFIG_HID_SENSOR_CUSTOM_SENSOR is not set -# CONFIG_HID_RKVR is not set -CONFIG_HID_ALPS=m +CONFIG_HID_SPEEDLINK=y +CONFIG_HID_STEELSERIES=y +CONFIG_HID_SUNPLUS=y +CONFIG_HID_RMI=y +CONFIG_HID_GREENASIA=y +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=y +CONFIG_HID_TOPSEED=y +CONFIG_HID_THINGM=y +CONFIG_HID_THRUSTMASTER=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_HID_WACOM=y +CONFIG_HID_WIIMOTE=y +CONFIG_HID_XINMO=y +CONFIG_HID_ZEROPLUS=y +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=y +CONFIG_HID_SENSOR_HUB=y +CONFIG_HID_SENSOR_CUSTOM_SENSOR=y +CONFIG_HID_RKVR=y +CONFIG_HID_ALPS=y # # USB HID support @@ -4504,9 +4495,9 @@ CONFIG_USB_HCD_SSB=m # # USB Device Class drivers # -CONFIG_USB_ACM=y +CONFIG_USB_ACM=m CONFIG_USB_PRINTER=m -CONFIG_USB_WDM=y +CONFIG_USB_WDM=m # CONFIG_USB_TMC is not set # @@ -5144,12 +5135,16 @@ CONFIG_TSL2583=y # # Android # -CONFIG_ASHMEM=y -# CONFIG_ANDROID_TIMED_OUTPUT is not set +# CONFIG_ASHMEM is not set +CONFIG_ANDROID_TIMED_OUTPUT=y +# CONFIG_ANDROID_TIMED_GPIO is not set # CONFIG_ANDROID_LOW_MEMORY_KILLER is not set # CONFIG_SYNC is not set # CONFIG_ANDROID_VSOC is not set -# CONFIG_ION is not set +CONFIG_ION=y +# CONFIG_ION_TEST is not set +# CONFIG_ION_DUMMY is not set +CONFIG_ION_ROCKCHIP=y CONFIG_FIQ_DEBUGGER=y CONFIG_FIQ_DEBUGGER_NO_SLEEP=y # CONFIG_FIQ_DEBUGGER_WAKEUP_IRQ_ALWAYS_ON is not set @@ -5232,7 +5227,9 @@ CONFIG_IOMMU_IOVA=y CONFIG_OF_IOMMU=y CONFIG_IOMMU_DMA=y CONFIG_ROCKCHIP_IOMMU=y -# CONFIG_RK_IOMMU is not set +CONFIG_RK_IOMMU=y +CONFIG_RK_IOVMM=y +# CONFIG_RK_IOMMU_DEBUG is not set # CONFIG_ARM_SMMU is not set # CONFIG_ARM_SMMU_V3 is not set @@ -5254,9 +5251,9 @@ CONFIG_ROCKCHIP_IOMMU=y # CONFIG_CPU_PX30=y # CONFIG_CPU_RK1808 is not set -CONFIG_CPU_RK3308=y +# CONFIG_CPU_RK3308 is not set CONFIG_CPU_RK3328=y -CONFIG_CPU_RK3366=y +# CONFIG_CPU_RK3366 is not set CONFIG_CPU_RK3368=y CONFIG_CPU_RK3399=y CONFIG_ANDROID_VERSION=0x07010000 @@ -5285,11 +5282,11 @@ CONFIG_DEVFREQ_GOV_USERSPACE=y # # DEVFREQ Drivers # -# CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ is not set +CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y CONFIG_PM_DEVFREQ_EVENT=y CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y -# CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP is not set +CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP=y CONFIG_EXTCON=y # @@ -5306,50 +5303,57 @@ CONFIG_IIO=y CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set CONFIG_IIO_KFIFO_BUF=y -CONFIG_IIO_TRIGGERED_BUFFER=m +CONFIG_IIO_TRIGGERED_BUFFER=y CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +CONFIG_IIO_TRIGGERED_EVENT=m # # Accelerometers # -# CONFIG_BMA180 is not set -# CONFIG_BMC150_ACCEL is not set -# CONFIG_HID_SENSOR_ACCEL_3D is not set -# CONFIG_IIO_ST_ACCEL_3AXIS is not set -# CONFIG_KXSD9 is not set -# CONFIG_KXCJK1013 is not set -# CONFIG_MMA8452 is not set -# CONFIG_MMA9551 is not set -# CONFIG_MMA9553 is not set -# CONFIG_MXC4005 is not set -# CONFIG_STK8312 is not set -# CONFIG_STK8BA50 is not set +CONFIG_BMA180=m +CONFIG_BMC150_ACCEL=m +CONFIG_BMC150_ACCEL_I2C=m +CONFIG_BMC150_ACCEL_SPI=m +CONFIG_HID_SENSOR_ACCEL_3D=m +CONFIG_IIO_ST_ACCEL_3AXIS=m +CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m +CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m +CONFIG_KXSD9=m +CONFIG_KXCJK1013=m +CONFIG_MMA8452=m +CONFIG_MMA9551_CORE=m +CONFIG_MMA9551=m +CONFIG_MMA9553=m +CONFIG_MXC4005=m +CONFIG_STK8312=m +CONFIG_STK8BA50=m # # Analog to digital converters # -# CONFIG_AD7266 is not set -# CONFIG_AD7291 is not set -# CONFIG_AD7298 is not set -# CONFIG_AD7476 is not set -# CONFIG_AD7791 is not set -# CONFIG_AD7793 is not set -# CONFIG_AD7887 is not set -# CONFIG_AD7923 is not set -# CONFIG_AD799X is not set -# CONFIG_CC10001_ADC is not set -# CONFIG_GPIO_MUXADC is not set -# CONFIG_HI8435 is not set -# CONFIG_MAX1027 is not set -# CONFIG_MAX1363 is not set +CONFIG_AD_SIGMA_DELTA=m +CONFIG_AD7266=m +CONFIG_AD7291=m +CONFIG_AD7298=m +CONFIG_AD7476=m +CONFIG_AD7791=m +CONFIG_AD7793=m +CONFIG_AD7887=m +CONFIG_AD7923=m +CONFIG_AD799X=m +CONFIG_CC10001_ADC=m +CONFIG_GPIO_MUXADC=m +CONFIG_HI8435=m +CONFIG_MAX1027=m +CONFIG_MAX1363=m CONFIG_MCP320X=m CONFIG_MCP3422=m -# CONFIG_NAU7802 is not set -CONFIG_ROCKCHIP_SARADC=y -# CONFIG_TI_ADC081C is not set -# CONFIG_TI_ADC128S052 is not set -# CONFIG_VF610_ADC is not set +CONFIG_NAU7802=m +CONFIG_ROCKCHIP_SARADC=m +CONFIG_TI_ADC081C=m +CONFIG_TI_ADC128S052=m +CONFIG_VF610_ADC=m # # Amplifiers @@ -5359,7 +5363,7 @@ CONFIG_ROCKCHIP_SARADC=y # # Chemical Sensors # -# CONFIG_VZ89X is not set +CONFIG_VZ89X=m # # Hid Sensor IIO Common @@ -5372,28 +5376,31 @@ CONFIG_IIO_MS_SENSORS_I2C=m # SSP Sensor Common # # CONFIG_IIO_SSP_SENSORHUB is not set +CONFIG_IIO_ST_SENSORS_I2C=m +CONFIG_IIO_ST_SENSORS_SPI=m +CONFIG_IIO_ST_SENSORS_CORE=m # # Digital to analog converters # -# CONFIG_AD5064 is not set -# CONFIG_AD5360 is not set -# CONFIG_AD5380 is not set -# CONFIG_AD5421 is not set -# CONFIG_AD5446 is not set -# CONFIG_AD5449 is not set -# CONFIG_AD5504 is not set -# CONFIG_AD5624R_SPI is not set -# CONFIG_AD5686 is not set -# CONFIG_AD5755 is not set -# CONFIG_AD5764 is not set -# CONFIG_AD5791 is not set -# CONFIG_AD7303 is not set -# CONFIG_M62332 is not set -# CONFIG_MAX517 is not set -# CONFIG_MAX5821 is not set -# CONFIG_MCP4725 is not set -# CONFIG_MCP4922 is not set +CONFIG_AD5064=m +CONFIG_AD5360=m +CONFIG_AD5380=m +CONFIG_AD5421=m +CONFIG_AD5446=m +CONFIG_AD5449=m +CONFIG_AD5504=m +CONFIG_AD5624R_SPI=m +CONFIG_AD5686=m +CONFIG_AD5755=m +CONFIG_AD5764=m +CONFIG_AD5791=m +CONFIG_AD7303=m +CONFIG_M62332=m +CONFIG_MAX517=m +CONFIG_MAX5821=m +CONFIG_MCP4725=m +CONFIG_MCP4922=m # # Frequency Synthesizers DDS/PLL @@ -5412,79 +5419,87 @@ CONFIG_IIO_MS_SENSORS_I2C=m # # Digital gyroscope sensors # -# CONFIG_ADIS16080 is not set -# CONFIG_ADIS16130 is not set -# CONFIG_ADIS16136 is not set -# CONFIG_ADIS16260 is not set -# CONFIG_ADXRS450 is not set -# CONFIG_BMG160 is not set +CONFIG_ADIS16080=m +CONFIG_ADIS16130=m +CONFIG_ADIS16136=m +CONFIG_ADIS16260=m +CONFIG_ADXRS450=m +CONFIG_BMG160=m +CONFIG_BMG160_I2C=m +CONFIG_BMG160_SPI=m CONFIG_HID_SENSOR_GYRO_3D=m -# CONFIG_IIO_ST_GYRO_3AXIS is not set -# CONFIG_ITG3200 is not set +CONFIG_IIO_ST_GYRO_3AXIS=m +CONFIG_IIO_ST_GYRO_I2C_3AXIS=m +CONFIG_IIO_ST_GYRO_SPI_3AXIS=m +CONFIG_ITG3200=m # # Humidity sensors # CONFIG_DHT11=m -# CONFIG_HDC100X is not set +CONFIG_HDC100X=m CONFIG_HTU21=m -# CONFIG_SI7005 is not set -# CONFIG_SI7020 is not set +CONFIG_SI7005=m +CONFIG_SI7020=m # # Inertial measurement units # -# CONFIG_ADIS16400 is not set -# CONFIG_ADIS16480 is not set -# CONFIG_KMX61 is not set -# CONFIG_INV_MPU6050_IIO is not set +CONFIG_ADIS16400=m +CONFIG_ADIS16480=m +CONFIG_KMX61=m +CONFIG_INV_MPU6050_IIO=m +CONFIG_IIO_ADIS_LIB=m +CONFIG_IIO_ADIS_LIB_BUFFER=y # # Light sensors # -# CONFIG_ADJD_S311 is not set -# CONFIG_AL3320A is not set -# CONFIG_APDS9300 is not set -# CONFIG_APDS9960 is not set -# CONFIG_BH1750 is not set -# CONFIG_CM32181 is not set -# CONFIG_CM3232 is not set -# CONFIG_CM3323 is not set -# CONFIG_CM36651 is not set -# CONFIG_GP2AP020A00F is not set -# CONFIG_ISL29125 is not set +CONFIG_ADJD_S311=m +CONFIG_AL3320A=m +CONFIG_APDS9300=m +CONFIG_APDS9960=m +CONFIG_BH1750=m +CONFIG_CM32181=m +CONFIG_CM3232=m +CONFIG_CM3323=m +CONFIG_CM36651=m +CONFIG_GP2AP020A00F=m +CONFIG_ISL29125=m CONFIG_HID_SENSOR_ALS=m CONFIG_HID_SENSOR_PROX=m -# CONFIG_JSA1212 is not set -# CONFIG_RPR0521 is not set -# CONFIG_LTR501 is not set -# CONFIG_OPT3001 is not set -# CONFIG_PA12203001 is not set -# CONFIG_STK3310 is not set -# CONFIG_TCS3414 is not set -# CONFIG_TCS3472 is not set -CONFIG_SENSORS_TSL2563=m -# CONFIG_TSL4531 is not set -# CONFIG_US5182D is not set -# CONFIG_VCNL4000 is not set +CONFIG_JSA1212=m +CONFIG_RPR0521=m +CONFIG_LTR501=m +CONFIG_OPT3001=m +CONFIG_PA12203001=m +CONFIG_STK3310=m +CONFIG_TCS3414=m +CONFIG_TCS3472=m +CONFIG_SENSORS_TSL2563=y +CONFIG_TSL4531=m +CONFIG_US5182D=m +CONFIG_VCNL4000=m CONFIG_VL6180=m # # Magnetometer sensors # -# CONFIG_AK8975 is not set -# CONFIG_AK09911 is not set -# CONFIG_BMC150_MAGN is not set -# CONFIG_MAG3110 is not set -# CONFIG_HID_SENSOR_MAGNETOMETER_3D is not set -# CONFIG_MMC35240 is not set -# CONFIG_IIO_ST_MAGN_3AXIS is not set +CONFIG_AK8975=m +CONFIG_AK09911=m +CONFIG_BMC150_MAGN=m +CONFIG_MAG3110=m +CONFIG_HID_SENSOR_MAGNETOMETER_3D=m +CONFIG_MMC35240=m +CONFIG_IIO_ST_MAGN_3AXIS=m +CONFIG_IIO_ST_MAGN_I2C_3AXIS=m +CONFIG_IIO_ST_MAGN_SPI_3AXIS=m # # Inclinometer sensors # -# CONFIG_HID_SENSOR_INCLINOMETER_3D is not set -# CONFIG_HID_SENSOR_DEVICE_ROTATION is not set +CONFIG_HID_SENSOR_INCLINOMETER_3D=m +CONFIG_HID_SENSOR_DEVICE_ROTATION=m # # Triggers - standalone @@ -5495,49 +5510,53 @@ CONFIG_IIO_SYSFS_TRIGGER=y # # Digital potentiometers # -# CONFIG_MCP4531 is not set +CONFIG_MCP4531=m # # Pressure sensors # -# CONFIG_BMP280 is not set +CONFIG_BMP280=m CONFIG_HID_SENSOR_PRESS=m -# CONFIG_MPL115 is not set -# CONFIG_MPL3115 is not set -# CONFIG_MS5611 is not set -# CONFIG_MS5637 is not set -# CONFIG_IIO_ST_PRESS is not set -# CONFIG_T5403 is not set +CONFIG_MPL115=m +CONFIG_MPL3115=m +CONFIG_MS5611=m +CONFIG_MS5611_I2C=m +CONFIG_MS5611_SPI=m +CONFIG_MS5637=m +CONFIG_IIO_ST_PRESS=m +CONFIG_IIO_ST_PRESS_I2C=m +CONFIG_IIO_ST_PRESS_SPI=m +CONFIG_T5403=m # # Lightning sensors # -# CONFIG_AS3935 is not set +CONFIG_AS3935=m # # Proximity sensors # -# CONFIG_LIDAR_LITE_V2 is not set -# CONFIG_SRF04 is not set -# CONFIG_SX9500 is not set +CONFIG_LIDAR_LITE_V2=m +CONFIG_SRF04=m +CONFIG_SX9500=m # # Temperature sensors # -# CONFIG_MLX90614 is not set -# CONFIG_TMP006 is not set -# CONFIG_TSYS01 is not set -# CONFIG_TSYS02D is not set +CONFIG_MLX90614=m +CONFIG_TMP006=m +CONFIG_TSYS01=m +CONFIG_TSYS02D=m # CONFIG_NTB is not set # CONFIG_VME_BUS is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_CROS_EC is not set # CONFIG_PWM_FSL_FTM is not set -CONFIG_PWM_GPIO=m +# CONFIG_PWM_GPIO is not set # CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y -CONFIG_PWM_ROCKCHIP_I2S=m +# CONFIG_PWM_ROCKCHIP_I2S is not set CONFIG_IRQCHIP=y CONFIG_ARM_GIC=y CONFIG_ARM_GIC_V2M=y @@ -5570,7 +5589,7 @@ CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY=y # CONFIG_PHY_ROCKCHIP_INNO_VIDEO_PHY is not set CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y CONFIG_PHY_ROCKCHIP_TYPEC=y -CONFIG_PHY_ROCKCHIP_PCIE=m +CONFIG_PHY_ROCKCHIP_PCIE=y # CONFIG_POWERCAP is not set # CONFIG_MCB is not set @@ -5598,14 +5617,7 @@ CONFIG_ROCKCHIP_OTP=m # # CONFIG_FPGA is not set # CONFIG_TEE is not set -CONFIG_RK_FLASH=m - -# -# Rockchip Flash Devices -# -# CONFIG_RK_NANDC_NAND is not set -# CONFIG_RK_SFC_NAND is not set -# CONFIG_RK_SFC_NOR is not set +# CONFIG_RK_FLASH is not set # CONFIG_RK_NAND is not set # @@ -5652,7 +5664,7 @@ CONFIG_XFS_FS=y CONFIG_XFS_QUOTA=y CONFIG_XFS_POSIX_ACL=y CONFIG_XFS_RT=y -# CONFIG_XFS_WARN is not set +CONFIG_XFS_WARN=y # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set @@ -5663,16 +5675,16 @@ CONFIG_BTRFS_FS_RUN_SANITY_TESTS=y # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set # CONFIG_NILFS2_FS is not set -CONFIG_F2FS_FS=m +CONFIG_F2FS_FS=y CONFIG_F2FS_STAT_FS=y CONFIG_F2FS_FS_XATTR=y CONFIG_F2FS_FS_POSIX_ACL=y CONFIG_F2FS_FS_SECURITY=y -CONFIG_F2FS_CHECK_FS=y +# CONFIG_F2FS_CHECK_FS is not set CONFIG_F2FS_FS_ENCRYPTION=y -CONFIG_F2FS_IO_TRACE=y +# CONFIG_F2FS_IO_TRACE is not set # CONFIG_F2FS_FAULT_INJECTION is not set -CONFIG_FS_DAX=y +# CONFIG_FS_DAX is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_FILE_LOCKING=y @@ -5765,7 +5777,7 @@ CONFIG_SQUASHFS_DECOMP_SINGLE=y # CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set # CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=y -CONFIG_SQUASHFS_LZ4=y +# CONFIG_SQUASHFS_LZ4 is not set CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y # CONFIG_SQUASHFS_ZSTD is not set @@ -5793,15 +5805,8 @@ CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_SWAP=y -CONFIG_NFS_V4_1=y -CONFIG_NFS_V4_2=y -CONFIG_PNFS_FILE_LAYOUT=y -CONFIG_PNFS_BLOCK=y -CONFIG_PNFS_FLEXFILE_LAYOUT=m -CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" -# CONFIG_NFS_V4_1_MIGRATION is not set -CONFIG_NFS_V4_SECURITY_LABEL=y -CONFIG_ROOT_NFS=y +# CONFIG_NFS_V4_1 is not set +# CONFIG_ROOT_NFS is not set # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFSD=y @@ -5810,7 +5815,7 @@ CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y # CONFIG_NFSD_PNFS is not set -CONFIG_NFSD_V4_SECURITY_LABEL=y +# CONFIG_NFSD_V4_SECURITY_LABEL is not set # CONFIG_NFSD_FAULT_INJECTION is not set CONFIG_GRACE_PERIOD=y CONFIG_LOCKD=y @@ -5819,7 +5824,6 @@ CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y -CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=y # CONFIG_SUNRPC_DEBUG is not set @@ -5828,13 +5832,12 @@ CONFIG_CEPH_FSCACHE=y CONFIG_CEPH_FS_POSIX_ACL=y CONFIG_CIFS=m CONFIG_CIFS_STATS=y -# CONFIG_CIFS_STATS2 is not set +CONFIG_CIFS_STATS2=y # CONFIG_CIFS_WEAK_PW_HASH is not set -CONFIG_CIFS_UPCALL=y -CONFIG_CIFS_XATTR=y -CONFIG_CIFS_POSIX=y -CONFIG_CIFS_ACL=y -# CONFIG_CIFS_DEBUG is not set +# CONFIG_CIFS_UPCALL is not set +# CONFIG_CIFS_XATTR is not set +CONFIG_CIFS_DEBUG=y +# CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DFS_UPCALL is not set CONFIG_CIFS_SMB2=y CONFIG_CIFS_SMB311=y @@ -6031,6 +6034,7 @@ CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y +CONFIG_GPU_TRACEPOINTS=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y @@ -6075,7 +6079,7 @@ CONFIG_LKDTM=y # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_RHASHTABLE is not set -CONFIG_TEST_HASH=m +# CONFIG_TEST_HASH is not set # CONFIG_DMA_API_DEBUG is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set @@ -6112,10 +6116,18 @@ CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y # CONFIG_SECURITY_NETWORK_XFRM is not set CONFIG_SECURITY_PATH=y +CONFIG_LSM_MMAP_MIN_ADDR=32768 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY is not set -# CONFIG_SECURITY_SELINUX is not set +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_SELINUX_BOOTPARAM=y +CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=0 +CONFIG_SECURITY_SELINUX_DISABLE=y +CONFIG_SECURITY_SELINUX_DEVELOP=y +CONFIG_SECURITY_SELINUX_AVC_STATS=y +CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 +# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set CONFIG_SECURITY_SMACK=y # CONFIG_SECURITY_SMACK_BRINGUP is not set # CONFIG_SECURITY_SMACK_NETFILTER is not set @@ -6130,6 +6142,7 @@ CONFIG_INTEGRITY=y CONFIG_INTEGRITY_AUDIT=y # CONFIG_IMA is not set # CONFIG_EVM is not set +# CONFIG_DEFAULT_SECURITY_SELINUX is not set # CONFIG_DEFAULT_SECURITY_SMACK is not set # CONFIG_DEFAULT_SECURITY_APPARMOR is not set CONFIG_DEFAULT_SECURITY_DAC=y diff --git a/patch/kernel/rockchip64-legacy/patch-4.4.211-212.patch b/patch/kernel/rockchip64-legacy/patch-4.4.211-212.patch new file mode 100644 index 0000000000..150526f647 --- /dev/null +++ b/patch/kernel/rockchip64-legacy/patch-4.4.211-212.patch @@ -0,0 +1,5145 @@ +diff --git a/Makefile b/Makefile +index 9f03733dac69..379f2a525c02 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 4 + PATCHLEVEL = 4 +-SUBLEVEL = 211 ++SUBLEVEL = 212 + EXTRAVERSION = + NAME = Blurry Fish Butt + +diff --git a/arch/arm/common/mcpm_entry.c b/arch/arm/common/mcpm_entry.c +index a923524d1040..8617323eb273 100644 +--- a/arch/arm/common/mcpm_entry.c ++++ b/arch/arm/common/mcpm_entry.c +@@ -379,7 +379,7 @@ static int __init nocache_trampoline(unsigned long _arg) + unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); + phys_reset_t phys_reset; + +- mcpm_set_entry_vector(cpu, cluster, cpu_resume); ++ mcpm_set_entry_vector(cpu, cluster, cpu_resume_no_hyp); + setup_mm_for_reboot(); + + __mcpm_cpu_going_down(cpu, cluster); +diff --git a/arch/arm/include/asm/suspend.h b/arch/arm/include/asm/suspend.h +index 6c7182f32cef..e6c2f426f8c8 100644 +--- a/arch/arm/include/asm/suspend.h ++++ b/arch/arm/include/asm/suspend.h +@@ -7,6 +7,7 @@ struct sleep_save_sp { + }; + + extern void cpu_resume(void); ++extern void cpu_resume_no_hyp(void); + extern void cpu_resume_arm(void); + extern int cpu_suspend(unsigned long, int (*)(unsigned long)); + +diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S +index 0f6c1000582c..c8569390e7e7 100644 +--- a/arch/arm/kernel/sleep.S ++++ b/arch/arm/kernel/sleep.S +@@ -119,6 +119,14 @@ ENDPROC(cpu_resume_after_mmu) + .text + .align + ++#ifdef CONFIG_MCPM ++ .arm ++THUMB( .thumb ) ++ENTRY(cpu_resume_no_hyp) ++ARM_BE8(setend be) @ ensure we are in BE mode ++ b no_hyp ++#endif ++ + #ifdef CONFIG_MMU + .arm + ENTRY(cpu_resume_arm) +@@ -134,6 +142,7 @@ ARM_BE8(setend be) @ ensure we are in BE mode + bl __hyp_stub_install_secondary + #endif + safe_svcmode_maskall r1 ++no_hyp: + mov r1, #0 + ALT_SMP(mrc p15, 0, r0, c0, c0, 5) + ALT_UP_B(1f) +@@ -162,6 +171,9 @@ ENDPROC(cpu_resume) + + #ifdef CONFIG_MMU + ENDPROC(cpu_resume_arm) ++#endif ++#ifdef CONFIG_MCPM ++ENDPROC(cpu_resume_no_hyp) + #endif + + .align 2 +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c +index 36706d32d656..1bc87c29467b 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -2563,7 +2563,7 @@ static void _setup_iclk_autoidle(struct omap_hwmod *oh) + */ + static int _setup_reset(struct omap_hwmod *oh) + { +- int r; ++ int r = 0; + + if (oh->_state != _HWMOD_STATE_INITIALIZED) + return -EINVAL; +diff --git a/arch/arm/mach-rpc/irq.c b/arch/arm/mach-rpc/irq.c +index 66502e6207fe..fce7fecbd8fa 100644 +--- a/arch/arm/mach-rpc/irq.c ++++ b/arch/arm/mach-rpc/irq.c +@@ -117,7 +117,7 @@ extern unsigned char rpc_default_fiq_start, rpc_default_fiq_end; + + void __init rpc_init_irq(void) + { +- unsigned int irq, clr, set = 0; ++ unsigned int irq, clr, set; + + iomd_writeb(0, IOMD_IRQMASKA); + iomd_writeb(0, IOMD_IRQMASKB); +@@ -129,6 +129,7 @@ void __init rpc_init_irq(void) + + for (irq = 0; irq < NR_IRQS; irq++) { + clr = IRQ_NOREQUEST; ++ set = 0; + + if (irq <= 6 || (irq >= 9 && irq <= 15)) + clr |= IRQ_NOPROBE; +diff --git a/arch/arm/plat-pxa/ssp.c b/arch/arm/plat-pxa/ssp.c +index 6748827c2ec8..b6b0979e3cf9 100644 +--- a/arch/arm/plat-pxa/ssp.c ++++ b/arch/arm/plat-pxa/ssp.c +@@ -231,18 +231,12 @@ static int pxa_ssp_probe(struct platform_device *pdev) + + static int pxa_ssp_remove(struct platform_device *pdev) + { +- struct resource *res; + struct ssp_device *ssp; + + ssp = platform_get_drvdata(pdev); + if (ssp == NULL) + return -ENODEV; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- release_mem_region(res->start, resource_size(res)); +- +- clk_put(ssp->clk); +- + mutex_lock(&ssp_lock); + list_del(&ssp->node); + mutex_unlock(&ssp_lock); +diff --git a/arch/arm64/boot/dts/arm/juno-clocks.dtsi b/arch/arm64/boot/dts/arm/juno-clocks.dtsi +index 25352ed943e6..00bcbf7688c7 100644 +--- a/arch/arm64/boot/dts/arm/juno-clocks.dtsi ++++ b/arch/arm64/boot/dts/arm/juno-clocks.dtsi +@@ -8,10 +8,10 @@ + */ + + /* SoC fixed clocks */ +- soc_uartclk: refclk7273800hz { ++ soc_uartclk: refclk7372800hz { + compatible = "fixed-clock"; + #clock-cells = <0>; +- clock-frequency = <7273800>; ++ clock-frequency = <7372800>; + clock-output-names = "juno:uartclk"; + }; + +diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c +index 2081b8cd5591..b9aee983e6f4 100644 +--- a/arch/m68k/amiga/cia.c ++++ b/arch/m68k/amiga/cia.c +@@ -88,10 +88,19 @@ static irqreturn_t cia_handler(int irq, void *dev_id) + struct ciabase *base = dev_id; + int mach_irq; + unsigned char ints; ++ unsigned long flags; + ++ /* Interrupts get disabled while the timer irq flag is cleared and ++ * the timer interrupt serviced. ++ */ + mach_irq = base->cia_irq; ++ local_irq_save(flags); + ints = cia_set_irq(base, CIA_ICR_ALL); + amiga_custom.intreq = base->int_mask; ++ if (ints & 1) ++ generic_handle_irq(mach_irq); ++ local_irq_restore(flags); ++ mach_irq++, ints >>= 1; + for (; ints; mach_irq++, ints >>= 1) { + if (ints & 1) + generic_handle_irq(mach_irq); +diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c +index 3d2b63bedf05..56f02ea2c248 100644 +--- a/arch/m68k/atari/ataints.c ++++ b/arch/m68k/atari/ataints.c +@@ -142,7 +142,7 @@ struct mfptimerbase { + .name = "MFP Timer D" + }; + +-static irqreturn_t mfptimer_handler(int irq, void *dev_id) ++static irqreturn_t mfp_timer_d_handler(int irq, void *dev_id) + { + struct mfptimerbase *base = dev_id; + int mach_irq; +@@ -344,7 +344,7 @@ void __init atari_init_IRQ(void) + st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 0xf0) | 0x6; + + /* request timer D dispatch handler */ +- if (request_irq(IRQ_MFP_TIMD, mfptimer_handler, IRQF_SHARED, ++ if (request_irq(IRQ_MFP_TIMD, mfp_timer_d_handler, IRQF_SHARED, + stmfp_base.name, &stmfp_base)) + pr_err("Couldn't register %s interrupt\n", stmfp_base.name); + +diff --git a/arch/m68k/atari/time.c b/arch/m68k/atari/time.c +index c549b48174ec..972181c1fe4b 100644 +--- a/arch/m68k/atari/time.c ++++ b/arch/m68k/atari/time.c +@@ -24,6 +24,18 @@ + DEFINE_SPINLOCK(rtc_lock); + EXPORT_SYMBOL_GPL(rtc_lock); + ++static irqreturn_t mfp_timer_c_handler(int irq, void *dev_id) ++{ ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; ++} ++ + void __init + atari_sched_init(irq_handler_t timer_routine) + { +@@ -32,7 +44,8 @@ atari_sched_init(irq_handler_t timer_routine) + /* start timer C, div = 1:100 */ + st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60; + /* install interrupt service routine for MFP Timer C */ +- if (request_irq(IRQ_MFP_TIMC, timer_routine, 0, "timer", timer_routine)) ++ if (request_irq(IRQ_MFP_TIMC, mfp_timer_c_handler, 0, "timer", ++ timer_routine)) + pr_err("Couldn't register timer interrupt\n"); + } + +diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c +index 478623dbb209..62054c01ecb4 100644 +--- a/arch/m68k/bvme6000/config.c ++++ b/arch/m68k/bvme6000/config.c +@@ -46,11 +46,6 @@ extern int bvme6000_set_clock_mmss (unsigned long); + extern void bvme6000_reset (void); + void bvme6000_set_vectors (void); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/timer/timekeeping.c, called via bvme6000_process_int() */ +- +-static irq_handler_t tick_handler; +- + + int __init bvme6000_parse_bootinfo(const struct bi_record *bi) + { +@@ -160,12 +155,18 @@ irqreturn_t bvme6000_abort_int (int irq, void *dev_id) + + static irqreturn_t bvme6000_timer_int (int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; +- unsigned char msr = rtc->msr & 0xc0; ++ unsigned char msr; + ++ local_irq_save(flags); ++ msr = rtc->msr & 0xc0; + rtc->msr = msr | 0x20; /* Ack the interrupt */ ++ timer_routine(0, NULL); ++ local_irq_restore(flags); + +- return tick_handler(irq, dev_id); ++ return IRQ_HANDLED; + } + + /* +@@ -184,9 +185,8 @@ void bvme6000_sched_init (irq_handler_t timer_routine) + + rtc->msr = 0; /* Ensure timer registers accessible */ + +- tick_handler = timer_routine; +- if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, +- "timer", bvme6000_timer_int)) ++ if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, "timer", ++ timer_routine)) + panic ("Couldn't register timer int"); + + rtc->t1cr_omr = 0x04; /* Mode 2, ext clk */ +diff --git a/arch/m68k/hp300/time.c b/arch/m68k/hp300/time.c +index 749543b425a4..03c83b8f9032 100644 +--- a/arch/m68k/hp300/time.c ++++ b/arch/m68k/hp300/time.c +@@ -37,13 +37,19 @@ + + static irqreturn_t hp300_tick(int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + unsigned long tmp; +- irq_handler_t vector = dev_id; ++ ++ local_irq_save(flags); + in_8(CLOCKBASE + CLKSR); + asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE)); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ + /* Turn off the network and SCSI leds */ + blinken_leds(0, 0xe0); +- return vector(irq, NULL); ++ return IRQ_HANDLED; + } + + u32 hp300_gettimeoffset(void) +diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c +index ce56e04386e7..49f9fa4529a8 100644 +--- a/arch/m68k/mac/via.c ++++ b/arch/m68k/mac/via.c +@@ -53,16 +53,6 @@ static __u8 rbv_clear; + + static int gIER,gIFR,gBufA,gBufB; + +-/* +- * Timer defs. +- */ +- +-#define TICK_SIZE 10000 +-#define MAC_CLOCK_TICK (783300/HZ) /* ticks per HZ */ +-#define MAC_CLOCK_LOW (MAC_CLOCK_TICK&0xFF) +-#define MAC_CLOCK_HIGH (MAC_CLOCK_TICK>>8) +- +- + /* + * On Macs with a genuine VIA chip there is no way to mask an individual slot + * interrupt. This limitation also seems to apply to VIA clone logic cores in +@@ -277,22 +267,6 @@ void __init via_init(void) + } + } + +-/* +- * Start the 100 Hz clock +- */ +- +-void __init via_init_clock(irq_handler_t func) +-{ +- via1[vACR] |= 0x40; +- via1[vT1LL] = MAC_CLOCK_LOW; +- via1[vT1LH] = MAC_CLOCK_HIGH; +- via1[vT1CL] = MAC_CLOCK_LOW; +- via1[vT1CH] = MAC_CLOCK_HIGH; +- +- if (request_irq(IRQ_MAC_TIMER_1, func, 0, "timer", func)) +- pr_err("Couldn't register %s interrupt\n", "timer"); +-} +- + /* + * Debugging dump, used in various places to see what's going on. + */ +@@ -320,29 +294,6 @@ void via_debug_dump(void) + } + } + +-/* +- * This is always executed with interrupts disabled. +- * +- * TBI: get time offset between scheduling timer ticks +- */ +- +-u32 mac_gettimeoffset(void) +-{ +- unsigned long ticks, offset = 0; +- +- /* read VIA1 timer 2 current value */ +- ticks = via1[vT1CL] | (via1[vT1CH] << 8); +- /* The probability of underflow is less than 2% */ +- if (ticks > MAC_CLOCK_TICK - MAC_CLOCK_TICK / 50) +- /* Check for pending timer interrupt in VIA1 IFR */ +- if (via1[vIFR] & 0x40) offset = TICK_SIZE; +- +- ticks = MAC_CLOCK_TICK - ticks; +- ticks = ticks * 10000L / MAC_CLOCK_TICK; +- +- return (ticks + offset) * 1000; +-} +- + /* + * Flush the L2 cache on Macs that have it by flipping + * the system into 24-bit mode for an instant. +@@ -446,6 +397,8 @@ void via_nubus_irq_shutdown(int irq) + * via6522.c :-), disable/pending masks added. + */ + ++#define VIA_TIMER_1_INT BIT(6) ++ + void via1_irq(struct irq_desc *desc) + { + int irq_num; +@@ -455,6 +408,21 @@ void via1_irq(struct irq_desc *desc) + if (!events) + return; + ++ irq_num = IRQ_MAC_TIMER_1; ++ irq_bit = VIA_TIMER_1_INT; ++ if (events & irq_bit) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ via1[vIFR] = irq_bit; ++ generic_handle_irq(irq_num); ++ local_irq_restore(flags); ++ ++ events &= ~irq_bit; ++ if (!events) ++ return; ++ } ++ + irq_num = VIA1_SOURCE_BASE; + irq_bit = 1; + do { +@@ -619,3 +587,56 @@ int via2_scsi_drq_pending(void) + return via2[gIFR] & (1 << IRQ_IDX(IRQ_MAC_SCSIDRQ)); + } + EXPORT_SYMBOL(via2_scsi_drq_pending); ++ ++/* timer and clock source */ ++ ++#define VIA_CLOCK_FREQ 783360 /* VIA "phase 2" clock in Hz */ ++#define VIA_TIMER_INTERVAL (1000000 / HZ) /* microseconds per jiffy */ ++#define VIA_TIMER_CYCLES (VIA_CLOCK_FREQ / HZ) /* clock cycles per jiffy */ ++ ++#define VIA_TC (VIA_TIMER_CYCLES - 2) /* including 0 and -1 */ ++#define VIA_TC_LOW (VIA_TC & 0xFF) ++#define VIA_TC_HIGH (VIA_TC >> 8) ++ ++void __init via_init_clock(irq_handler_t timer_routine) ++{ ++ if (request_irq(IRQ_MAC_TIMER_1, timer_routine, 0, "timer", NULL)) { ++ pr_err("Couldn't register %s interrupt\n", "timer"); ++ return; ++ } ++ ++ via1[vT1LL] = VIA_TC_LOW; ++ via1[vT1LH] = VIA_TC_HIGH; ++ via1[vT1CL] = VIA_TC_LOW; ++ via1[vT1CH] = VIA_TC_HIGH; ++ via1[vACR] |= 0x40; ++} ++ ++u32 mac_gettimeoffset(void) ++{ ++ unsigned long flags; ++ u8 count_high; ++ u16 count, offset = 0; ++ ++ /* ++ * Timer counter wrap-around is detected with the timer interrupt flag ++ * but reading the counter low byte (vT1CL) would reset the flag. ++ * Also, accessing both counter registers is essentially a data race. ++ * These problems are avoided by ignoring the low byte. Clock accuracy ++ * is 256 times worse (error can reach 0.327 ms) but CPU overhead is ++ * reduced by avoiding slow VIA register accesses. ++ */ ++ ++ local_irq_save(flags); ++ count_high = via1[vT1CH]; ++ if (count_high == 0xFF) ++ count_high = 0; ++ if (count_high > 0 && (via1[vIFR] & VIA_TIMER_1_INT)) ++ offset = VIA_TIMER_CYCLES; ++ local_irq_restore(flags); ++ ++ count = count_high << 8; ++ count = VIA_TIMER_CYCLES - count + offset; ++ ++ return ((count * VIA_TIMER_INTERVAL) / VIA_TIMER_CYCLES) * 1000; ++} +diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c +index e6a3b56c6481..152fbde23424 100644 +--- a/arch/m68k/mvme147/config.c ++++ b/arch/m68k/mvme147/config.c +@@ -47,11 +47,6 @@ extern void mvme147_reset (void); + + static int bcd2int (unsigned char b); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/time/timekeeping.c, called via mvme147_process_int() */ +- +-irq_handler_t tick_handler; +- + + int __init mvme147_parse_bootinfo(const struct bi_record *bi) + { +@@ -107,16 +102,23 @@ void __init config_mvme147(void) + + static irqreturn_t mvme147_timer_int (int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); + m147_pcc->t1_int_cntrl = PCC_TIMER_INT_CLR; + m147_pcc->t1_int_cntrl = PCC_INT_ENAB|PCC_LEVEL_TIMER1; +- return tick_handler(irq, dev_id); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; + } + + + void mvme147_sched_init (irq_handler_t timer_routine) + { +- tick_handler = timer_routine; +- if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", NULL)) ++ if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", ++ timer_routine)) + pr_err("Couldn't register timer interrupt\n"); + + /* Init the clock with a value */ +diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c +index a53803cc66cd..0d43bfb3324d 100644 +--- a/arch/m68k/mvme16x/config.c ++++ b/arch/m68k/mvme16x/config.c +@@ -52,11 +52,6 @@ extern void mvme16x_reset (void); + + int bcd2int (unsigned char b); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/time/timekeeping.c, called via mvme16x_process_int() */ +- +-static irq_handler_t tick_handler; +- + + unsigned short mvme16x_config; + EXPORT_SYMBOL(mvme16x_config); +@@ -355,8 +350,15 @@ static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) + + static irqreturn_t mvme16x_timer_int (int irq, void *dev_id) + { +- *(volatile unsigned char *)0xfff4201b |= 8; +- return tick_handler(irq, dev_id); ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ *(volatile unsigned char *)0xfff4201b |= 8; ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; + } + + void mvme16x_sched_init (irq_handler_t timer_routine) +@@ -364,14 +366,13 @@ void mvme16x_sched_init (irq_handler_t timer_routine) + uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); + int irq; + +- tick_handler = timer_routine; + /* Using PCCchip2 or MC2 chip tick timer 1 */ + *(volatile unsigned long *)0xfff42008 = 0; + *(volatile unsigned long *)0xfff42004 = 10000; /* 10ms */ + *(volatile unsigned char *)0xfff42017 |= 3; + *(volatile unsigned char *)0xfff4201b = 0x16; +- if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, +- "timer", mvme16x_timer_int)) ++ if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, "timer", ++ timer_routine)) + panic ("Couldn't register timer int"); + + if (brdno == 0x0162 || brdno == 0x172) +diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c +index 513f9bb17b9c..60b51f5b9cfc 100644 +--- a/arch/m68k/q40/q40ints.c ++++ b/arch/m68k/q40/q40ints.c +@@ -126,10 +126,10 @@ void q40_mksound(unsigned int hz, unsigned int ticks) + sound_ticks = ticks << 1; + } + +-static irq_handler_t q40_timer_routine; +- +-static irqreturn_t q40_timer_int (int irq, void * dev) ++static irqreturn_t q40_timer_int(int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ + ql_ticks = ql_ticks ? 0 : 1; + if (sound_ticks) { + unsigned char sval=(sound_ticks & 1) ? 128-SVOL : 128+SVOL; +@@ -138,8 +138,13 @@ static irqreturn_t q40_timer_int (int irq, void * dev) + *DAC_RIGHT=sval; + } + +- if (!ql_ticks) +- q40_timer_routine(irq, dev); ++ if (!ql_ticks) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ } + return IRQ_HANDLED; + } + +@@ -147,11 +152,9 @@ void q40_sched_init (irq_handler_t timer_routine) + { + int timer_irq; + +- q40_timer_routine = timer_routine; + timer_irq = Q40_IRQ_FRAME; + +- if (request_irq(timer_irq, q40_timer_int, 0, +- "timer", q40_timer_int)) ++ if (request_irq(timer_irq, q40_timer_int, 0, "timer", timer_routine)) + panic("Couldn't register timer int"); + + master_outb(-1, FRAME_CLEAR_REG); +diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c +index 6bbca30c9188..a5824abb4a39 100644 +--- a/arch/m68k/sun3/sun3ints.c ++++ b/arch/m68k/sun3/sun3ints.c +@@ -61,8 +61,10 @@ static irqreturn_t sun3_int7(int irq, void *dev_id) + + static irqreturn_t sun3_int5(int irq, void *dev_id) + { ++ unsigned long flags; + unsigned int cnt; + ++ local_irq_save(flags); + #ifdef CONFIG_SUN3 + intersil_clear(); + #endif +@@ -76,6 +78,7 @@ static irqreturn_t sun3_int5(int irq, void *dev_id) + cnt = kstat_irqs_cpu(irq, 0); + if (!(cnt % 20)) + sun3_leds(led_pattern[cnt % 160 / 20]); ++ local_irq_restore(flags); + return IRQ_HANDLED; + } + +diff --git a/arch/m68k/sun3x/time.c b/arch/m68k/sun3x/time.c +index c8eb08add6b0..7a195313ff4f 100644 +--- a/arch/m68k/sun3x/time.c ++++ b/arch/m68k/sun3x/time.c +@@ -77,15 +77,19 @@ u32 sun3x_gettimeoffset(void) + } + + #if 0 +-static void sun3x_timer_tick(int irq, void *dev_id, struct pt_regs *regs) ++static irqreturn_t sun3x_timer_tick(int irq, void *dev_id) + { +- void (*vector)(int, void *, struct pt_regs *) = dev_id; ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + +- /* Clear the pending interrupt - pulse the enable line low */ +- disable_irq(5); +- enable_irq(5); ++ local_irq_save(flags); ++ /* Clear the pending interrupt - pulse the enable line low */ ++ disable_irq(5); ++ enable_irq(5); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); + +- vector(irq, NULL, regs); ++ return IRQ_HANDLED; + } + #endif + +diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h +index ab1df19b0957..60604b26fa72 100644 +--- a/arch/mips/include/asm/io.h ++++ b/arch/mips/include/asm/io.h +@@ -60,21 +60,11 @@ + * instruction, so the lower 16 bits must be zero. Should be true on + * on any sane architecture; generic code does not use this assumption. + */ +-extern const unsigned long mips_io_port_base; ++extern unsigned long mips_io_port_base; + +-/* +- * Gcc will generate code to load the value of mips_io_port_base after each +- * function call which may be fairly wasteful in some cases. So we don't +- * play quite by the book. We tell gcc mips_io_port_base is a long variable +- * which solves the code generation issue. Now we need to violate the +- * aliasing rules a little to make initialization possible and finally we +- * will need the barrier() to fight side effects of the aliasing chat. +- * This trickery will eventually collapse under gcc's optimizer. Oh well. +- */ + static inline void set_io_port_base(unsigned long base) + { +- * (unsigned long *) &mips_io_port_base = base; +- barrier(); ++ mips_io_port_base = base; + } + + /* +diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c +index 4f9f1ae49213..fadc946b306d 100644 +--- a/arch/mips/kernel/setup.c ++++ b/arch/mips/kernel/setup.c +@@ -80,7 +80,7 @@ static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; + * mips_io_port_base is the begin of the address space to which x86 style + * I/O ports are mapped. + */ +-const unsigned long mips_io_port_base = -1; ++unsigned long mips_io_port_base = -1; + EXPORT_SYMBOL(mips_io_port_base); + + static struct resource code_resource = { .name = "Kernel code", }; +diff --git a/arch/nios2/kernel/nios2_ksyms.c b/arch/nios2/kernel/nios2_ksyms.c +index bf2f55d10a4d..4e704046a150 100644 +--- a/arch/nios2/kernel/nios2_ksyms.c ++++ b/arch/nios2/kernel/nios2_ksyms.c +@@ -9,12 +9,20 @@ + #include + #include + ++#include ++#include ++ + /* string functions */ + + EXPORT_SYMBOL(memcpy); + EXPORT_SYMBOL(memset); + EXPORT_SYMBOL(memmove); + ++/* memory management */ ++ ++EXPORT_SYMBOL(empty_zero_page); ++EXPORT_SYMBOL(flush_icache_range); ++ + /* + * libgcc functions - functions that are used internally by the + * compiler... (prototypes are not correct though, but that +@@ -31,3 +39,7 @@ DECLARE_EXPORT(__udivsi3); + DECLARE_EXPORT(__umoddi3); + DECLARE_EXPORT(__umodsi3); + DECLARE_EXPORT(__muldi3); ++DECLARE_EXPORT(__ucmpdi2); ++DECLARE_EXPORT(__lshrdi3); ++DECLARE_EXPORT(__ashldi3); ++DECLARE_EXPORT(__ashrdi3); +diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile +index d7eb035a9c96..65cb22541c66 100644 +--- a/arch/powerpc/Makefile ++++ b/arch/powerpc/Makefile +@@ -350,7 +350,9 @@ vdso_install: + ifeq ($(CONFIG_PPC64),y) + $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@ + endif ++ifdef CONFIG_VDSO32 + $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso32 $@ ++endif + + archclean: + $(Q)$(MAKE) $(clean)=$(boot) +diff --git a/arch/powerpc/include/asm/archrandom.h b/arch/powerpc/include/asm/archrandom.h +index 85e88f7a59c0..9ff848e3c4a6 100644 +--- a/arch/powerpc/include/asm/archrandom.h ++++ b/arch/powerpc/include/asm/archrandom.h +@@ -27,7 +27,7 @@ static inline int arch_get_random_seed_int(unsigned int *v) + unsigned long val; + int rc; + +- rc = arch_get_random_long(&val); ++ rc = arch_get_random_seed_long(&val); + if (rc) + *v = val; + +diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c +index c641983bbdd6..3394a72b19f2 100644 +--- a/arch/powerpc/kernel/cacheinfo.c ++++ b/arch/powerpc/kernel/cacheinfo.c +@@ -867,4 +867,21 @@ void cacheinfo_cpu_offline(unsigned int cpu_id) + if (cache) + cache_cpu_clear(cache, cpu_id); + } ++ ++void cacheinfo_teardown(void) ++{ ++ unsigned int cpu; ++ ++ for_each_online_cpu(cpu) ++ cacheinfo_cpu_offline(cpu); ++} ++ ++void cacheinfo_rebuild(void) ++{ ++ unsigned int cpu; ++ ++ for_each_online_cpu(cpu) ++ cacheinfo_cpu_online(cpu); ++} ++ + #endif /* (CONFIG_PPC_PSERIES && CONFIG_SUSPEND) || CONFIG_HOTPLUG_CPU */ +diff --git a/arch/powerpc/kernel/cacheinfo.h b/arch/powerpc/kernel/cacheinfo.h +index a7b74d36acd7..2cdee87a482c 100644 +--- a/arch/powerpc/kernel/cacheinfo.h ++++ b/arch/powerpc/kernel/cacheinfo.h +@@ -5,4 +5,8 @@ + extern void cacheinfo_cpu_online(unsigned int cpu_id); + extern void cacheinfo_cpu_offline(unsigned int cpu_id); + ++/* Allow migration/suspend to tear down and rebuild the hierarchy. */ ++extern void cacheinfo_teardown(void); ++extern void cacheinfo_rebuild(void); ++ + #endif /* _PPC_CACHEINFO_H */ +diff --git a/arch/powerpc/sysdev/qe_lib/gpio.c b/arch/powerpc/sysdev/qe_lib/gpio.c +index 521e67a49dc4..4052e3d7edbd 100644 +--- a/arch/powerpc/sysdev/qe_lib/gpio.c ++++ b/arch/powerpc/sysdev/qe_lib/gpio.c +@@ -155,8 +155,10 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index) + if (err < 0) + goto err0; + gc = gpio_to_chip(err); +- if (WARN_ON(!gc)) ++ if (WARN_ON(!gc)) { ++ err = -ENODEV; + goto err0; ++ } + + if (!of_device_is_compatible(gc->of_node, "fsl,mpc8323-qe-pario-bank")) { + pr_debug("%s: tried to get a non-qe pin\n", __func__); +diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug +index 2aa212fb0faf..31c191a08bb1 100644 +--- a/arch/x86/Kconfig.debug ++++ b/arch/x86/Kconfig.debug +@@ -221,7 +221,7 @@ config HAVE_MMIOTRACE_SUPPORT + + config X86_DECODER_SELFTEST + bool "x86 instruction decoder selftest" +- depends on DEBUG_KERNEL && KPROBES ++ depends on DEBUG_KERNEL && INSTRUCTION_DECODER + depends on !COMPILE_TEST + ---help--- + Perform x86 instruction decoder selftests at build time. +diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c +index 44256a62702b..4a08fda2b06f 100644 +--- a/arch/x86/kernel/kgdb.c ++++ b/arch/x86/kernel/kgdb.c +@@ -437,7 +437,7 @@ static void kgdb_disable_hw_debug(struct pt_regs *regs) + */ + void kgdb_roundup_cpus(unsigned long flags) + { +- apic->send_IPI_allbutself(APIC_DM_NMI); ++ apic->send_IPI_allbutself(NMI_VECTOR); + } + #endif + +diff --git a/block/blk-merge.c b/block/blk-merge.c +index 7225511cf0b4..b8f1eaeeaac2 100644 +--- a/block/blk-merge.c ++++ b/block/blk-merge.c +@@ -296,13 +296,7 @@ void blk_recalc_rq_segments(struct request *rq) + + void blk_recount_segments(struct request_queue *q, struct bio *bio) + { +- unsigned short seg_cnt; +- +- /* estimate segment number by bi_vcnt for non-cloned bio */ +- if (bio_flagged(bio, BIO_CLONED)) +- seg_cnt = bio_segments(bio); +- else +- seg_cnt = bio->bi_vcnt; ++ unsigned short seg_cnt = bio_segments(bio); + + if (test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags) && + (seg_cnt < queue_max_segments(q))) +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index f8ec3d4ba4a8..a5718c0a3dc4 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -394,7 +394,7 @@ static int pcrypt_sysfs_add(struct padata_instance *pinst, const char *name) + int ret; + + pinst->kobj.kset = pcrypt_kset; +- ret = kobject_add(&pinst->kobj, NULL, name); ++ ret = kobject_add(&pinst->kobj, NULL, "%s", name); + if (!ret) + kobject_uevent(&pinst->kobj, KOBJ_ADD); + +diff --git a/crypto/tgr192.c b/crypto/tgr192.c +index 321bc6ff2a9d..904c8444aa0a 100644 +--- a/crypto/tgr192.c ++++ b/crypto/tgr192.c +@@ -25,8 +25,9 @@ + #include + #include + #include +-#include + #include ++#include ++#include + + #define TGR192_DIGEST_SIZE 24 + #define TGR160_DIGEST_SIZE 20 +@@ -468,10 +469,9 @@ static void tgr192_transform(struct tgr192_ctx *tctx, const u8 * data) + u64 a, b, c, aa, bb, cc; + u64 x[8]; + int i; +- const __le64 *ptr = (const __le64 *)data; + + for (i = 0; i < 8; i++) +- x[i] = le64_to_cpu(ptr[i]); ++ x[i] = get_unaligned_le64(data + i * sizeof(__le64)); + + /* save */ + a = aa = tctx->a; +diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c +index 8116cb2fef2d..1241cecfcfca 100644 +--- a/drivers/ata/libahci.c ++++ b/drivers/ata/libahci.c +@@ -187,7 +187,6 @@ struct ata_port_operations ahci_pmp_retry_srst_ops = { + EXPORT_SYMBOL_GPL(ahci_pmp_retry_srst_ops); + + static bool ahci_em_messages __read_mostly = true; +-EXPORT_SYMBOL_GPL(ahci_em_messages); + module_param(ahci_em_messages, bool, 0444); + /* add other LED protocol types when they become supported */ + MODULE_PARM_DESC(ahci_em_messages, +diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c +index 82f2ae0d7cc4..04b39d0da868 100644 +--- a/drivers/atm/firestream.c ++++ b/drivers/atm/firestream.c +@@ -923,6 +923,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + } + if (!to) { + printk ("No more free channels for FS50..\n"); ++ kfree(vcc); + return -EBUSY; + } + vcc->channo = dev->channo; +@@ -933,6 +934,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + if (((DO_DIRECTION(rxtp) && dev->atm_vccs[vcc->channo])) || + ( DO_DIRECTION(txtp) && test_bit (vcc->channo, dev->tx_inuse))) { + printk ("Channel is in use for FS155.\n"); ++ kfree(vcc); + return -EBUSY; + } + } +@@ -946,6 +948,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + tc, sizeof (struct fs_transmit_config)); + if (!tc) { + fs_dprintk (FS_DEBUG_OPEN, "fs: can't alloc transmit_config.\n"); ++ kfree(vcc); + return -ENOMEM; + } + +diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c +index f499a469e66d..12b2cc9a3fbe 100644 +--- a/drivers/bcma/driver_pci.c ++++ b/drivers/bcma/driver_pci.c +@@ -78,7 +78,7 @@ static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u16 device, u8 address) + v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); + } + +- v = BCMA_CORE_PCI_MDIODATA_START; ++ v |= BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_READ; + v |= BCMA_CORE_PCI_MDIODATA_TA; + +@@ -121,7 +121,7 @@ static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u16 device, + v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); + } + +- v = BCMA_CORE_PCI_MDIODATA_START; ++ v |= BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_WRITE; + v |= BCMA_CORE_PCI_MDIODATA_TA; + v |= data; +diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c +index 385ec4ae3394..456350bd24b3 100644 +--- a/drivers/block/drbd/drbd_main.c ++++ b/drivers/block/drbd/drbd_main.c +@@ -331,6 +331,8 @@ static int drbd_thread_setup(void *arg) + thi->name[0], + resource->name); + ++ allow_kernel_signal(DRBD_SIGKILL); ++ allow_kernel_signal(SIGXCPU); + restart: + retval = thi->function(thi); + +diff --git a/drivers/clk/clk-highbank.c b/drivers/clk/clk-highbank.c +index be3a21abb185..4105066b428c 100644 +--- a/drivers/clk/clk-highbank.c ++++ b/drivers/clk/clk-highbank.c +@@ -294,6 +294,7 @@ static __init struct clk *hb_clk_init(struct device_node *node, const struct clk + /* Map system registers */ + srnp = of_find_compatible_node(NULL, NULL, "calxeda,hb-sregs"); + hb_clk->reg = of_iomap(srnp, 0); ++ of_node_put(srnp); + BUG_ON(!hb_clk->reg); + hb_clk->reg += reg; + +diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c +index 7244a621c61b..efc9e1973295 100644 +--- a/drivers/clk/clk-qoriq.c ++++ b/drivers/clk/clk-qoriq.c +@@ -1244,6 +1244,7 @@ static void __init clockgen_init(struct device_node *np) + pr_err("%s: Couldn't map %s regs\n", __func__, + guts->full_name); + } ++ of_node_put(guts); + } + + } +diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c +index 46c05c9a9354..39ea50102d52 100644 +--- a/drivers/clk/imx/clk-imx6q.c ++++ b/drivers/clk/imx/clk-imx6q.c +@@ -155,6 +155,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + /* Audio/video PLL post dividers do not work on i.MX6q revision 1.0 */ + if (clk_on_imx6q() && imx_get_soc_revision() == IMX_CHIP_REVISION_1_0) { +diff --git a/drivers/clk/imx/clk-imx6sx.c b/drivers/clk/imx/clk-imx6sx.c +index fea125eb4330..8f2958ac04e8 100644 +--- a/drivers/clk/imx/clk-imx6sx.c ++++ b/drivers/clk/imx/clk-imx6sx.c +@@ -162,6 +162,7 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + clks[IMX6SX_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); + clks[IMX6SX_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); +diff --git a/drivers/clk/imx/clk-imx7d.c b/drivers/clk/imx/clk-imx7d.c +index 448ef321948b..863163b239a3 100644 +--- a/drivers/clk/imx/clk-imx7d.c ++++ b/drivers/clk/imx/clk-imx7d.c +@@ -386,6 +386,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + clks[IMX7D_PLL_ARM_MAIN_SRC] = imx_clk_mux("pll_arm_main_src", base + 0x60, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); + clks[IMX7D_PLL_DRAM_MAIN_SRC] = imx_clk_mux("pll_dram_main_src", base + 0x70, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); +diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c +index 0a94d9661d91..2c92a2706fdd 100644 +--- a/drivers/clk/imx/clk-vf610.c ++++ b/drivers/clk/imx/clk-vf610.c +@@ -155,6 +155,7 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,vf610-anatop"); + anatop_base = of_iomap(np, 0); + BUG_ON(!anatop_base); ++ of_node_put(np); + + np = ccm_node; + ccm_base = of_iomap(np, 0); +diff --git a/drivers/clk/mvebu/armada-370.c b/drivers/clk/mvebu/armada-370.c +index 2c7c1085f883..8fdfa97900cd 100644 +--- a/drivers/clk/mvebu/armada-370.c ++++ b/drivers/clk/mvebu/armada-370.c +@@ -177,8 +177,10 @@ static void __init a370_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &a370_coreclks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, a370_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(a370_clk, "marvell,armada-370-core-clock", a370_clk_init); + +diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c +index b3094315a3c0..2fa15a274719 100644 +--- a/drivers/clk/mvebu/armada-xp.c ++++ b/drivers/clk/mvebu/armada-xp.c +@@ -202,7 +202,9 @@ static void __init axp_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &axp_coreclks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, axp_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); +diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c +index 99550f25975e..1d2b9a1a9609 100644 +--- a/drivers/clk/mvebu/kirkwood.c ++++ b/drivers/clk/mvebu/kirkwood.c +@@ -335,6 +335,8 @@ static void __init kirkwood_clk_init(struct device_node *np) + if (cgnp) { + mvebu_clk_gating_setup(cgnp, kirkwood_gating_desc); + kirkwood_clk_muxing_setup(cgnp, kirkwood_mux_desc); ++ ++ of_node_put(cgnp); + } + } + CLK_OF_DECLARE(kirkwood_clk, "marvell,kirkwood-core-clock", +diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c +index 7f370d3e0983..6c8e45e007c8 100644 +--- a/drivers/clk/samsung/clk-exynos4.c ++++ b/drivers/clk/samsung/clk-exynos4.c +@@ -1224,6 +1224,7 @@ static unsigned long exynos4_get_xom(void) + xom = readl(chipid_base + 8); + + iounmap(chipid_base); ++ of_node_put(np); + } + + return xom; +diff --git a/drivers/clk/socfpga/clk-pll-a10.c b/drivers/clk/socfpga/clk-pll-a10.c +index 402d630bd531..623d5b77fb43 100644 +--- a/drivers/clk/socfpga/clk-pll-a10.c ++++ b/drivers/clk/socfpga/clk-pll-a10.c +@@ -95,6 +95,7 @@ static struct __init clk * __socfpga_pll_init(struct device_node *node, + + clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_a10_base_addr = of_iomap(clkmgr_np, 0); ++ of_node_put(clkmgr_np); + BUG_ON(!clk_mgr_a10_base_addr); + pll_clk->hw.reg = clk_mgr_a10_base_addr + reg; + +diff --git a/drivers/clk/socfpga/clk-pll.c b/drivers/clk/socfpga/clk-pll.c +index c7f463172e4b..b4b44e9b5901 100644 +--- a/drivers/clk/socfpga/clk-pll.c ++++ b/drivers/clk/socfpga/clk-pll.c +@@ -100,6 +100,7 @@ static __init struct clk *__socfpga_pll_init(struct device_node *node, + + clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_base_addr = of_iomap(clkmgr_np, 0); ++ of_node_put(clkmgr_np); + BUG_ON(!clk_mgr_base_addr); + pll_clk->hw.reg = clk_mgr_base_addr + reg; + +diff --git a/drivers/clocksource/timer-sun5i.c b/drivers/clocksource/timer-sun5i.c +index bca9573e036a..32b2dab69fd7 100644 +--- a/drivers/clocksource/timer-sun5i.c ++++ b/drivers/clocksource/timer-sun5i.c +@@ -201,6 +201,11 @@ static int __init sun5i_setup_clocksource(struct device_node *node, + } + + rate = clk_get_rate(clk); ++ if (!rate) { ++ pr_err("Couldn't get parent clock rate\n"); ++ ret = -EINVAL; ++ goto err_disable_clk; ++ } + + cs->timer.base = base; + cs->timer.clk = clk; +@@ -274,6 +279,11 @@ static int __init sun5i_setup_clockevent(struct device_node *node, void __iomem + } + + rate = clk_get_rate(clk); ++ if (!rate) { ++ pr_err("Couldn't get parent clock rate\n"); ++ ret = -EINVAL; ++ goto err_disable_clk; ++ } + + ce->timer.base = base; + ce->timer.ticks_per_jiffy = DIV_ROUND_UP(rate, HZ); +diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c +index 9b92af2c7241..a77319bf221d 100644 +--- a/drivers/crypto/caam/caamrng.c ++++ b/drivers/crypto/caam/caamrng.c +@@ -361,7 +361,10 @@ static int __init caam_rng_init(void) + goto free_rng_ctx; + + dev_info(dev, "registering rng-caam\n"); +- return hwrng_register(&caam_rng); ++ ++ err = hwrng_register(&caam_rng); ++ if (!err) ++ return err; + + free_rng_ctx: + kfree(rng_ctx); +diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c +index 5b2395e7e04d..6de3d2142c7d 100644 +--- a/drivers/dma/dma-axi-dmac.c ++++ b/drivers/dma/dma-axi-dmac.c +@@ -441,7 +441,7 @@ static struct dma_async_tx_descriptor *axi_dmac_prep_interleaved( + + if (chan->hw_2d) { + if (!axi_dmac_check_len(chan, xt->sgl[0].size) || +- !axi_dmac_check_len(chan, xt->numf)) ++ xt->numf == 0) + return NULL; + if (xt->sgl[0].size + dst_icg > chan->max_length || + xt->sgl[0].size + src_icg > chan->max_length) +diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c +index 68a4815750b5..22d0cc1855b5 100644 +--- a/drivers/dma/dw/platform.c ++++ b/drivers/dma/dw/platform.c +@@ -87,13 +87,20 @@ static void dw_dma_acpi_controller_register(struct dw_dma *dw) + dma_cap_set(DMA_SLAVE, info->dma_cap); + info->filter_fn = dw_dma_acpi_filter; + +- ret = devm_acpi_dma_controller_register(dev, acpi_dma_simple_xlate, +- info); ++ ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info); + if (ret) + dev_err(dev, "could not register acpi_dma_controller\n"); + } ++ ++static void dw_dma_acpi_controller_free(struct dw_dma *dw) ++{ ++ struct device *dev = dw->dma.dev; ++ ++ acpi_dma_controller_free(dev); ++} + #else /* !CONFIG_ACPI */ + static inline void dw_dma_acpi_controller_register(struct dw_dma *dw) {} ++static inline void dw_dma_acpi_controller_free(struct dw_dma *dw) {} + #endif /* !CONFIG_ACPI */ + + #ifdef CONFIG_OF +@@ -225,6 +232,9 @@ static int dw_remove(struct platform_device *pdev) + { + struct dw_dma_chip *chip = platform_get_drvdata(pdev); + ++ if (ACPI_HANDLE(&pdev->dev)) ++ dw_dma_acpi_controller_free(chip->dw); ++ + if (pdev->dev.of_node) + of_dma_controller_free(pdev->dev.of_node); + +diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c +index e508c8c5f3fd..17521fcf226f 100644 +--- a/drivers/dma/edma.c ++++ b/drivers/dma/edma.c +@@ -2288,8 +2288,10 @@ static int edma_probe(struct platform_device *pdev) + + ecc->tc_list = devm_kcalloc(dev, ecc->num_tc, + sizeof(*ecc->tc_list), GFP_KERNEL); +- if (!ecc->tc_list) +- return -ENOMEM; ++ if (!ecc->tc_list) { ++ ret = -ENOMEM; ++ goto err_reg1; ++ } + + for (i = 0;; i++) { + ret = of_parse_phandle_with_fixed_args(node, "ti,tptcs", +diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c +index dd97dbf6618c..1dc06e0e890f 100644 +--- a/drivers/dma/imx-sdma.c ++++ b/drivers/dma/imx-sdma.c +@@ -1411,6 +1411,14 @@ static void sdma_add_scripts(struct sdma_engine *sdma, + if (!sdma->script_number) + sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; + ++ if (sdma->script_number > sizeof(struct sdma_script_start_addrs) ++ / sizeof(s32)) { ++ dev_err(sdma->dev, ++ "SDMA script number %d not match with firmware.\n", ++ sdma->script_number); ++ return; ++ } ++ + for (i = 0; i < sdma->script_number; i++) + if (addr_arr[i] > 0) + saddr_arr[i] = addr_arr[i]; +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index 2cb924ffd5a3..4d0f77f0edad 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -975,9 +975,20 @@ static struct drm_dp_mst_port *drm_dp_mst_get_port_ref_locked(struct drm_dp_mst_ + static struct drm_dp_mst_port *drm_dp_get_validated_port_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) + { + struct drm_dp_mst_port *rport = NULL; ++ + mutex_lock(&mgr->lock); +- if (mgr->mst_primary) +- rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, port); ++ /* ++ * Port may or may not be 'valid' but we don't care about that when ++ * destroying the port and we are guaranteed that the port pointer ++ * will be valid until we've finished ++ */ ++ if (current_work() == &mgr->destroy_connector_work) { ++ kref_get(&port->kref); ++ rport = port; ++ } else if (mgr->mst_primary) { ++ rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, ++ port); ++ } + mutex_unlock(&mgr->lock); + return rport; + } +diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +index fd266ed963b6..25a0e7d13340 100644 +--- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +@@ -383,19 +383,17 @@ static const unsigned int a3xx_registers[] = { + 0x2200, 0x2212, 0x2214, 0x2217, 0x221a, 0x221a, 0x2240, 0x227e, + 0x2280, 0x228b, 0x22c0, 0x22c0, 0x22c4, 0x22ce, 0x22d0, 0x22d8, + 0x22df, 0x22e6, 0x22e8, 0x22e9, 0x22ec, 0x22ec, 0x22f0, 0x22f7, +- 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2348, 0x2349, 0x2350, 0x2356, +- 0x2360, 0x2360, 0x2440, 0x2440, 0x2444, 0x2444, 0x2448, 0x244d, +- 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, 0x2472, 0x2472, +- 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, 0x24e4, 0x24ef, +- 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, 0x2510, 0x2511, +- 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, 0x25ec, 0x25ed, +- 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, 0x261a, 0x261a, +- 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, 0x26c4, 0x26ce, +- 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, 0x26ec, 0x26ec, +- 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, 0x2748, 0x2749, +- 0x2750, 0x2756, 0x2760, 0x2760, 0x300c, 0x300e, 0x301c, 0x301d, +- 0x302a, 0x302a, 0x302c, 0x302d, 0x3030, 0x3031, 0x3034, 0x3036, +- 0x303c, 0x303c, 0x305e, 0x305f, ++ 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2440, 0x2440, 0x2444, 0x2444, ++ 0x2448, 0x244d, 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, ++ 0x2472, 0x2472, 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, ++ 0x24e4, 0x24ef, 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, ++ 0x2510, 0x2511, 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, ++ 0x25ec, 0x25ed, 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, ++ 0x261a, 0x261a, 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, ++ 0x26c4, 0x26ce, 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, ++ 0x26ec, 0x26ec, 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, ++ 0x300c, 0x300e, 0x301c, 0x301d, 0x302a, 0x302a, 0x302c, 0x302d, ++ 0x3030, 0x3031, 0x3034, 0x3036, 0x303c, 0x303c, 0x305e, 0x305f, + ~0 /* sentinel */ + }; + +diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c +index 4c49868efcda..12ddbbb53107 100644 +--- a/drivers/gpu/drm/msm/dsi/dsi_host.c ++++ b/drivers/gpu/drm/msm/dsi/dsi_host.c +@@ -30,6 +30,8 @@ + #include "dsi.xml.h" + #include "dsi_cfg.h" + ++#define DSI_RESET_TOGGLE_DELAY_MS 20 ++ + static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor) + { + u32 ver; +@@ -764,7 +766,7 @@ static void dsi_sw_reset(struct msm_dsi_host *msm_host) + wmb(); /* clocks need to be enabled before reset */ + + dsi_write(msm_host, REG_DSI_RESET, 1); +- wmb(); /* make sure reset happen */ ++ msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ + dsi_write(msm_host, REG_DSI_RESET, 0); + } + +@@ -1111,7 +1113,7 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) + + /* dsi controller can only be reset while clocks are running */ + dsi_write(msm_host, REG_DSI_RESET, 1); +- wmb(); /* make sure reset happen */ ++ msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ + dsi_write(msm_host, REG_DSI_RESET, 0); + wmb(); /* controller out of reset */ + dsi_write(msm_host, REG_DSI_CTRL, data0); +diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +index bb1225aa2f75..89305ad3cde2 100644 +--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c ++++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +@@ -547,7 +547,7 @@ fail: + if (cfg_handler) + mdp5_cfg_destroy(cfg_handler); + +- return NULL; ++ return ERR_PTR(ret); + } + + static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev) +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +index 60ece0a8a2e1..1d2d6bae73cd 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +@@ -87,7 +87,7 @@ nvkm_gddr3_calc(struct nvkm_ram *ram) + WR = (ram->next->bios.timing[2] & 0x007f0000) >> 16; + /* XXX: Get these values from the VBIOS instead */ + DLL = !(ram->mr[1] & 0x1); +- RON = !(ram->mr[1] & 0x300) >> 8; ++ RON = !((ram->mr[1] & 0x300) >> 8); + break; + default: + return -ENOSYS; +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +index e6f74168238c..2ef9e942f43a 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +@@ -87,10 +87,10 @@ nvkm_memx_fini(struct nvkm_memx **pmemx, bool exec) + if (exec) { + nvkm_pmu_send(pmu, reply, PROC_MEMX, MEMX_MSG_EXEC, + memx->base, finish); ++ nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", ++ reply[0], reply[1]); + } + +- nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", +- reply[0], reply[1]); + kfree(memx); + return 0; + } +diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c +index 80b6d6e4721a..7acde09c8e8f 100644 +--- a/drivers/gpu/drm/radeon/cik.c ++++ b/drivers/gpu/drm/radeon/cik.c +@@ -7372,8 +7372,8 @@ static int cik_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* XXX this should actually be a bus address, not an MC address. same on older asics */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c +index 0e20c08f8977..2056224d0b3c 100644 +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -3647,8 +3647,8 @@ int r600_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* set dummy read address to ring address */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c +index 5cf3a2cbc07e..4128c98d9054 100644 +--- a/drivers/gpu/drm/radeon/si.c ++++ b/drivers/gpu/drm/radeon/si.c +@@ -6013,8 +6013,8 @@ static int si_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* set dummy read address to ring address */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c +index a1b3ea1ccb65..772a5a3b0ce1 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_vq.c ++++ b/drivers/gpu/drm/virtio/virtgpu_vq.c +@@ -681,11 +681,11 @@ int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, + { + struct virtio_gpu_get_capset *cmd_p; + struct virtio_gpu_vbuffer *vbuf; +- int max_size = vgdev->capsets[idx].max_size; ++ int max_size; + struct virtio_gpu_drv_cap_cache *cache_ent; + void *resp_buf; + +- if (idx > vgdev->num_capsets) ++ if (idx >= vgdev->num_capsets) + return -EINVAL; + + if (version > vgdev->capsets[idx].max_version) +@@ -695,6 +695,7 @@ int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, + if (!cache_ent) + return -ENOMEM; + ++ max_size = vgdev->capsets[idx].max_size; + cache_ent->caps_cache = kmalloc(max_size, GFP_KERNEL); + if (!cache_ent->caps_cache) { + kfree(cache_ent); +diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c +index 9c262d955331..d2583caa8087 100644 +--- a/drivers/hwmon/adt7475.c ++++ b/drivers/hwmon/adt7475.c +@@ -268,9 +268,10 @@ static inline u16 volt2reg(int channel, long volt, u8 bypass_attn) + long reg; + + if (bypass_attn & (1 << channel)) +- reg = (volt * 1024) / 2250; ++ reg = DIV_ROUND_CLOSEST(volt * 1024, 2250); + else +- reg = (volt * r[1] * 1024) / ((r[0] + r[1]) * 2250); ++ reg = DIV_ROUND_CLOSEST(volt * r[1] * 1024, ++ (r[0] + r[1]) * 2250); + return clamp_val(reg, 0, 1023) & (0xff << 2); + } + +diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c +index 7f8738a83cb9..40addb213bdf 100644 +--- a/drivers/hwmon/nct7802.c ++++ b/drivers/hwmon/nct7802.c +@@ -32,8 +32,8 @@ + static const u8 REG_VOLTAGE[5] = { 0x09, 0x0a, 0x0c, 0x0d, 0x0e }; + + static const u8 REG_VOLTAGE_LIMIT_LSB[2][5] = { +- { 0x40, 0x00, 0x42, 0x44, 0x46 }, +- { 0x3f, 0x00, 0x41, 0x43, 0x45 }, ++ { 0x46, 0x00, 0x40, 0x42, 0x44 }, ++ { 0x45, 0x00, 0x3f, 0x41, 0x43 }, + }; + + static const u8 REG_VOLTAGE_LIMIT_MSB[5] = { 0x48, 0x00, 0x47, 0x47, 0x48 }; +diff --git a/drivers/hwmon/shtc1.c b/drivers/hwmon/shtc1.c +index decd7df995ab..2a18539591ea 100644 +--- a/drivers/hwmon/shtc1.c ++++ b/drivers/hwmon/shtc1.c +@@ -38,7 +38,7 @@ static const unsigned char shtc1_cmd_read_id_reg[] = { 0xef, 0xc8 }; + + /* constants for reading the ID register */ + #define SHTC1_ID 0x07 +-#define SHTC1_ID_REG_MASK 0x1f ++#define SHTC1_ID_REG_MASK 0x3f + + /* delays for non-blocking i2c commands, both in us */ + #define SHTC1_NONBLOCKING_WAIT_TIME_HPM 14400 +diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c +index 721295b9a051..43c0f89cefdf 100644 +--- a/drivers/hwmon/w83627hf.c ++++ b/drivers/hwmon/w83627hf.c +@@ -130,17 +130,23 @@ superio_select(struct w83627hf_sio_data *sio, int ld) + outb(ld, sio->sioaddr + 1); + } + +-static inline void ++static inline int + superio_enter(struct w83627hf_sio_data *sio) + { ++ if (!request_muxed_region(sio->sioaddr, 2, DRVNAME)) ++ return -EBUSY; ++ + outb(0x87, sio->sioaddr); + outb(0x87, sio->sioaddr); ++ ++ return 0; + } + + static inline void + superio_exit(struct w83627hf_sio_data *sio) + { + outb(0xAA, sio->sioaddr); ++ release_region(sio->sioaddr, 2); + } + + #define W627_DEVID 0x52 +@@ -1275,7 +1281,7 @@ static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); + static int __init w83627hf_find(int sioaddr, unsigned short *addr, + struct w83627hf_sio_data *sio_data) + { +- int err = -ENODEV; ++ int err; + u16 val; + + static __initconst char *const names[] = { +@@ -1287,7 +1293,11 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, + }; + + sio_data->sioaddr = sioaddr; +- superio_enter(sio_data); ++ err = superio_enter(sio_data); ++ if (err) ++ return err; ++ ++ err = -ENODEV; + val = force_id ? force_id : superio_inb(sio_data, DEVID); + switch (val) { + case W627_DEVID: +@@ -1641,9 +1651,21 @@ static int w83627thf_read_gpio5(struct platform_device *pdev) + struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); + int res = 0xff, sel; + +- superio_enter(sio_data); ++ if (superio_enter(sio_data)) { ++ /* ++ * Some other driver reserved the address space for itself. ++ * We don't want to fail driver instantiation because of that, ++ * so display a warning and keep going. ++ */ ++ dev_warn(&pdev->dev, ++ "Can not read VID data: Failed to enable SuperIO access\n"); ++ return res; ++ } ++ + superio_select(sio_data, W83627HF_LD_GPIO5); + ++ res = 0xff; ++ + /* Make sure these GPIO pins are enabled */ + if (!(superio_inb(sio_data, W83627THF_GPIO5_EN) & (1<<3))) { + dev_dbg(&pdev->dev, "GPIO5 disabled, no VID function\n"); +@@ -1674,7 +1696,17 @@ static int w83687thf_read_vid(struct platform_device *pdev) + struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); + int res = 0xff; + +- superio_enter(sio_data); ++ if (superio_enter(sio_data)) { ++ /* ++ * Some other driver reserved the address space for itself. ++ * We don't want to fail driver instantiation because of that, ++ * so display a warning and keep going. ++ */ ++ dev_warn(&pdev->dev, ++ "Can not read VID data: Failed to enable SuperIO access\n"); ++ return res; ++ } ++ + superio_select(sio_data, W83627HF_LD_HWM); + + /* Make sure these GPIO pins are enabled */ +diff --git a/drivers/iio/dac/ad5380.c b/drivers/iio/dac/ad5380.c +index 97d2c5111f43..8bf7fc626a9d 100644 +--- a/drivers/iio/dac/ad5380.c ++++ b/drivers/iio/dac/ad5380.c +@@ -221,7 +221,7 @@ static int ad5380_read_raw(struct iio_dev *indio_dev, + if (ret) + return ret; + *val >>= chan->scan_type.shift; +- val -= (1 << chan->scan_type.realbits) / 2; ++ *val -= (1 << chan->scan_type.realbits) / 2; + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + *val = 2 * st->vref; +diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c +index 961afb5588be..864a61b05665 100644 +--- a/drivers/iio/industrialio-buffer.c ++++ b/drivers/iio/industrialio-buffer.c +@@ -527,7 +527,7 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + { + const struct iio_chan_spec *ch; + unsigned bytes = 0; +- int length, i; ++ int length, i, largest = 0; + + /* How much space will the demuxed element take? */ + for_each_set_bit(i, mask, +@@ -540,6 +540,7 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + length = ch->scan_type.storagebits / 8; + bytes = ALIGN(bytes, length); + bytes += length; ++ largest = max(largest, length); + } + if (timestamp) { + ch = iio_find_channel_from_si(indio_dev, +@@ -551,7 +552,10 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + length = ch->scan_type.storagebits / 8; + bytes = ALIGN(bytes, length); + bytes += length; ++ largest = max(largest, length); + } ++ ++ bytes = ALIGN(bytes, largest); + return bytes; + } + +diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c +index 43d277a931c2..eac5f5eff8d2 100644 +--- a/drivers/infiniband/hw/mlx5/qp.c ++++ b/drivers/infiniband/hw/mlx5/qp.c +@@ -1426,6 +1426,11 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_PKEY_INDEX | + MLX5_QP_OPTPAR_Q_KEY | + MLX5_QP_OPTPAR_PRI_PORT, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_PKEY_INDEX | ++ MLX5_QP_OPTPAR_PRI_PORT, + }, + [MLX5_QP_STATE_RTR] = { + [MLX5_QP_ST_RC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | +@@ -1459,6 +1464,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_PM_STATE, + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | ++ MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_PM_STATE | ++ MLX5_QP_OPTPAR_RNR_TIMEOUT, + }, + }, + [MLX5_QP_STATE_RTS] = { +@@ -1475,6 +1486,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY | + MLX5_QP_OPTPAR_SRQN | + MLX5_QP_OPTPAR_CQN_RCV, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_RNR_TIMEOUT | ++ MLX5_QP_OPTPAR_PM_STATE | ++ MLX5_QP_OPTPAR_ALT_ADDR_PATH, + }, + }, + [MLX5_QP_STATE_SQER] = { +@@ -1486,6 +1503,10 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_RAE | + MLX5_QP_OPTPAR_RRE, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RNR_TIMEOUT | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RRE, + }, + }, + }; +diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +index 76e96f97b3f6..6385448b22c5 100644 +--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c ++++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +@@ -55,7 +55,7 @@ + + int ocrdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) + { +- if (index > 1) ++ if (index > 0) + return -EINVAL; + + *pkey = 0xffff; +diff --git a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +index f8e3211689a3..8e18bfca5516 100644 +--- a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c ++++ b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +@@ -427,7 +427,7 @@ int usnic_ib_query_gid(struct ib_device *ibdev, u8 port, int index, + int usnic_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, + u16 *pkey) + { +- if (index > 1) ++ if (index > 0) + return -EINVAL; + + *pkey = 0xffff; +diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c +index 0b7f5a701c60..32ef17e1aef8 100644 +--- a/drivers/infiniband/ulp/isert/ib_isert.c ++++ b/drivers/infiniband/ulp/isert/ib_isert.c +@@ -3277,17 +3277,6 @@ isert_wait4logout(struct isert_conn *isert_conn) + } + } + +-static void +-isert_wait4cmds(struct iscsi_conn *conn) +-{ +- isert_info("iscsi_conn %p\n", conn); +- +- if (conn->sess) { +- target_sess_cmd_list_set_waiting(conn->sess->se_sess); +- target_wait_for_sess_cmds(conn->sess->se_sess); +- } +-} +- + static void + isert_wait4flush(struct isert_conn *isert_conn) + { +@@ -3361,7 +3350,6 @@ static void isert_wait_conn(struct iscsi_conn *conn) + + isert_wait4flush(isert_conn); + isert_put_unsol_pending_cmds(conn); +- isert_wait4cmds(conn); + isert_wait4logout(isert_conn); + + queue_work(isert_release_wq, &isert_conn->release_work); +diff --git a/drivers/input/keyboard/nomadik-ske-keypad.c b/drivers/input/keyboard/nomadik-ske-keypad.c +index 8567ee47761e..ae3b04557074 100644 +--- a/drivers/input/keyboard/nomadik-ske-keypad.c ++++ b/drivers/input/keyboard/nomadik-ske-keypad.c +@@ -100,7 +100,7 @@ static int __init ske_keypad_chip_init(struct ske_keypad *keypad) + while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) + cpu_relax(); + +- if (!timeout) ++ if (timeout == -1) + return -EINVAL; + + /* +diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c +index a3fe4a990cc9..c7b889d13edd 100644 +--- a/drivers/input/misc/keyspan_remote.c ++++ b/drivers/input/misc/keyspan_remote.c +@@ -344,7 +344,8 @@ static int keyspan_setup(struct usb_device* dev) + int retval = 0; + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); ++ 0x11, 0x40, 0x5601, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", + __func__, retval); +@@ -352,7 +353,8 @@ static int keyspan_setup(struct usb_device* dev) + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); ++ 0x44, 0x40, 0x0, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", + __func__, retval); +@@ -360,7 +362,8 @@ static int keyspan_setup(struct usb_device* dev) + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); ++ 0x22, 0x40, 0x0, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", + __func__, retval); +diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c +index 78ca44840d60..40a166773c1b 100644 +--- a/drivers/input/tablet/aiptek.c ++++ b/drivers/input/tablet/aiptek.c +@@ -1820,14 +1820,14 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) + input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0); + + /* Verify that a device really has an endpoint */ +- if (intf->altsetting[0].desc.bNumEndpoints < 1) { ++ if (intf->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&intf->dev, + "interface has %d endpoints, but must have minimum 1\n", +- intf->altsetting[0].desc.bNumEndpoints); ++ intf->cur_altsetting->desc.bNumEndpoints); + err = -EINVAL; + goto fail3; + } +- endpoint = &intf->altsetting[0].endpoint[0].desc; ++ endpoint = &intf->cur_altsetting->endpoint[0].desc; + + /* Go set up our URB, which is called when the tablet receives + * input. +diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c +index 5a0e4cd86353..67dc17c8bba9 100644 +--- a/drivers/input/tablet/gtco.c ++++ b/drivers/input/tablet/gtco.c +@@ -876,18 +876,14 @@ static int gtco_probe(struct usb_interface *usbinterface, + } + + /* Sanity check that a device has an endpoint */ +- if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) { ++ if (usbinterface->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&usbinterface->dev, + "Invalid number of endpoints\n"); + error = -EINVAL; + goto err_free_urb; + } + +- /* +- * The endpoint is always altsetting 0, we know this since we know +- * this device only has one interrupt endpoint +- */ +- endpoint = &usbinterface->altsetting[0].endpoint[0].desc; ++ endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; + + /* Some debug */ + dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting); +@@ -974,7 +970,7 @@ static int gtco_probe(struct usb_interface *usbinterface, + input_dev->dev.parent = &usbinterface->dev; + + /* Setup the URB, it will be posted later on open of input device */ +- endpoint = &usbinterface->altsetting[0].endpoint[0].desc; ++ endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; + + usb_fill_int_urb(gtco->urbinfo, + gtco->usbdev, +diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c +index 0146e2c74649..6178e28baaba 100644 +--- a/drivers/input/touchscreen/sur40.c ++++ b/drivers/input/touchscreen/sur40.c +@@ -496,7 +496,7 @@ static int sur40_probe(struct usb_interface *interface, + int error; + + /* Check if we really have the right interface. */ +- iface_desc = &interface->altsetting[0]; ++ iface_desc = interface->cur_altsetting; + if (iface_desc->desc.bInterfaceClass != 0xFF) + return -ENODEV; + +diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c +index 0ad8b7c78a43..66a406e87e11 100644 +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -2184,6 +2184,8 @@ static int attach_device(struct device *dev, + */ + domain_flush_tlb_pde(domain); + ++ domain_flush_complete(domain); ++ + return ret; + } + +diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c +index 6a69b5bb231f..036fb186a3be 100644 +--- a/drivers/iommu/amd_iommu_init.c ++++ b/drivers/iommu/amd_iommu_init.c +@@ -360,6 +360,9 @@ static void iommu_enable(struct amd_iommu *iommu) + + static void iommu_disable(struct amd_iommu *iommu) + { ++ if (!iommu->mmio_base) ++ return; ++ + /* Disable command buffer */ + iommu_feature_disable(iommu, CONTROL_CMDBUF_EN); + +diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c +index b965561a4162..a2005b82ec8f 100644 +--- a/drivers/iommu/intel-iommu.c ++++ b/drivers/iommu/intel-iommu.c +@@ -3259,9 +3259,12 @@ static int __init init_dmars(void) + iommu_identity_mapping |= IDENTMAP_ALL; + + #ifdef CONFIG_INTEL_IOMMU_BROKEN_GFX_WA +- iommu_identity_mapping |= IDENTMAP_GFX; ++ dmar_map_gfx = 0; + #endif + ++ if (!dmar_map_gfx) ++ iommu_identity_mapping |= IDENTMAP_GFX; ++ + check_tylersburg_isoch(); + + if (iommu_identity_mapping) { +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index 5d5066cf3bbd..589207176ffa 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -1594,9 +1594,9 @@ int iommu_request_dm_for_dev(struct device *dev) + int ret; + + /* Device must already be in a group before calling this function */ +- group = iommu_group_get_for_dev(dev); +- if (IS_ERR(group)) +- return PTR_ERR(group); ++ group = iommu_group_get(dev); ++ if (!group) ++ return -EINVAL; + + mutex_lock(&group->mutex); + +diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c +index 7a50728b9389..391090c455ce 100644 +--- a/drivers/md/bitmap.c ++++ b/drivers/md/bitmap.c +@@ -1671,7 +1671,7 @@ void bitmap_flush(struct mddev *mddev) + /* + * free memory that was allocated + */ +-static void bitmap_free(struct bitmap *bitmap) ++static void md_bitmap_free(struct bitmap *bitmap) + { + unsigned long k, pages; + struct bitmap_page *bp; +@@ -1721,7 +1721,7 @@ void bitmap_destroy(struct mddev *mddev) + if (bitmap->sysfs_can_clear) + sysfs_put(bitmap->sysfs_can_clear); + +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + } + + /* +@@ -1805,7 +1805,7 @@ struct bitmap *bitmap_create(struct mddev *mddev, int slot) + + return bitmap; + error: +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return ERR_PTR(err); + } + +@@ -1904,7 +1904,7 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot, + *low = lo; + *high = hi; + err: +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return rv; + } + EXPORT_SYMBOL_GPL(bitmap_copy_from_slot); +diff --git a/drivers/media/i2c/ov2659.c b/drivers/media/i2c/ov2659.c +index 6eefb8bbb5b5..20e3c56991cf 100644 +--- a/drivers/media/i2c/ov2659.c ++++ b/drivers/media/i2c/ov2659.c +@@ -1137,7 +1137,7 @@ static int ov2659_set_fmt(struct v4l2_subdev *sd, + mf = v4l2_subdev_get_try_format(sd, cfg, fmt->pad); + *mf = fmt->format; + #else +- return -ENOTTY; ++ ret = -ENOTTY; + #endif + } else { + s64 val; +diff --git a/drivers/media/i2c/soc_camera/ov6650.c b/drivers/media/i2c/soc_camera/ov6650.c +index bb55ddfbf733..7928ea8528e1 100644 +--- a/drivers/media/i2c/soc_camera/ov6650.c ++++ b/drivers/media/i2c/soc_camera/ov6650.c +@@ -203,7 +203,6 @@ struct ov6650 { + unsigned long pclk_max; /* from resolution and format */ + struct v4l2_fract tpf; /* as requested with s_parm */ + u32 code; +- enum v4l2_colorspace colorspace; + }; + + +@@ -216,6 +215,17 @@ static u32 ov6650_codes[] = { + MEDIA_BUS_FMT_Y8_1X8, + }; + ++static const struct v4l2_mbus_framefmt ov6650_def_fmt = { ++ .width = W_CIF, ++ .height = H_CIF, ++ .code = MEDIA_BUS_FMT_SBGGR8_1X8, ++ .colorspace = V4L2_COLORSPACE_SRGB, ++ .field = V4L2_FIELD_NONE, ++ .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT, ++ .quantization = V4L2_QUANTIZATION_DEFAULT, ++ .xfer_func = V4L2_XFER_FUNC_DEFAULT, ++}; ++ + /* read a register */ + static int ov6650_reg_read(struct i2c_client *client, u8 reg, u8 *val) + { +@@ -510,12 +520,20 @@ static int ov6650_get_fmt(struct v4l2_subdev *sd, + if (format->pad) + return -EINVAL; + +- mf->width = priv->rect.width >> priv->half_scale; +- mf->height = priv->rect.height >> priv->half_scale; +- mf->code = priv->code; +- mf->colorspace = priv->colorspace; +- mf->field = V4L2_FIELD_NONE; ++ /* initialize response with default media bus frame format */ ++ *mf = ov6650_def_fmt; + ++ /* update media bus format code and frame size */ ++ if (format->which == V4L2_SUBDEV_FORMAT_TRY) { ++ mf->width = cfg->try_fmt.width; ++ mf->height = cfg->try_fmt.height; ++ mf->code = cfg->try_fmt.code; ++ ++ } else { ++ mf->width = priv->rect.width >> priv->half_scale; ++ mf->height = priv->rect.height >> priv->half_scale; ++ mf->code = priv->code; ++ } + return 0; + } + +@@ -623,11 +641,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) + priv->pclk_max = 8000000; + } + +- if (code == MEDIA_BUS_FMT_SBGGR8_1X8) +- priv->colorspace = V4L2_COLORSPACE_SRGB; +- else if (code != 0) +- priv->colorspace = V4L2_COLORSPACE_JPEG; +- + if (half_scale) { + dev_dbg(&client->dev, "max resolution: QCIF\n"); + coma_set |= COMA_QCIF; +@@ -683,11 +696,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) + if (!ret) + priv->code = code; + +- if (!ret) { +- mf->colorspace = priv->colorspace; +- mf->width = priv->rect.width >> half_scale; +- mf->height = priv->rect.height >> half_scale; +- } + return ret; + } + +@@ -706,8 +714,6 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd, + v4l_bound_align_image(&mf->width, 2, W_CIF, 1, + &mf->height, 2, H_CIF, 1, 0); + +- mf->field = V4L2_FIELD_NONE; +- + switch (mf->code) { + case MEDIA_BUS_FMT_Y10_1X10: + mf->code = MEDIA_BUS_FMT_Y8_1X8; +@@ -716,19 +722,38 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd, + case MEDIA_BUS_FMT_YUYV8_2X8: + case MEDIA_BUS_FMT_VYUY8_2X8: + case MEDIA_BUS_FMT_UYVY8_2X8: +- mf->colorspace = V4L2_COLORSPACE_JPEG; + break; + default: + mf->code = MEDIA_BUS_FMT_SBGGR8_1X8; + case MEDIA_BUS_FMT_SBGGR8_1X8: +- mf->colorspace = V4L2_COLORSPACE_SRGB; + break; + } + +- if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) +- return ov6650_s_fmt(sd, mf); +- cfg->try_fmt = *mf; ++ if (format->which == V4L2_SUBDEV_FORMAT_TRY) { ++ /* store media bus format code and frame size in pad config */ ++ cfg->try_fmt.width = mf->width; ++ cfg->try_fmt.height = mf->height; ++ cfg->try_fmt.code = mf->code; + ++ /* return default mbus frame format updated with pad config */ ++ *mf = ov6650_def_fmt; ++ mf->width = cfg->try_fmt.width; ++ mf->height = cfg->try_fmt.height; ++ mf->code = cfg->try_fmt.code; ++ ++ } else { ++ /* apply new media bus format code and frame size */ ++ int ret = ov6650_s_fmt(sd, mf); ++ ++ if (ret) ++ return ret; ++ ++ /* return default format updated with active size and code */ ++ *mf = ov6650_def_fmt; ++ mf->width = priv->rect.width >> priv->half_scale; ++ mf->height = priv->rect.height >> priv->half_scale; ++ mf->code = priv->code; ++ } + return 0; + } + +@@ -1048,7 +1073,6 @@ static int ov6650_probe(struct i2c_client *client, + priv->rect.height = H_CIF; + priv->half_scale = false; + priv->code = MEDIA_BUS_FMT_YUYV8_2X8; +- priv->colorspace = V4L2_COLORSPACE_JPEG; + + ret = ov6650_video_probe(client); + if (ret) +diff --git a/drivers/media/pci/cx18/cx18-fileops.c b/drivers/media/pci/cx18/cx18-fileops.c +index df837408efd5..0171dc5b8809 100644 +--- a/drivers/media/pci/cx18/cx18-fileops.c ++++ b/drivers/media/pci/cx18/cx18-fileops.c +@@ -490,7 +490,7 @@ static ssize_t cx18_read_pos(struct cx18_stream *s, char __user *ubuf, + + CX18_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); + if (rc > 0) +- pos += rc; ++ *pos += rc; + return rc; + } + +diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c +index e543cbbf2ec4..8fe78b8b1c25 100644 +--- a/drivers/media/pci/cx23885/cx23885-dvb.c ++++ b/drivers/media/pci/cx23885/cx23885-dvb.c +@@ -1452,8 +1452,9 @@ static int dvb_register(struct cx23885_tsport *port) + if (fe0->dvb.frontend != NULL) { + struct i2c_adapter *tun_i2c; + +- fe0->dvb.frontend->sec_priv = kmalloc(sizeof(dib7000p_ops), GFP_KERNEL); +- memcpy(fe0->dvb.frontend->sec_priv, &dib7000p_ops, sizeof(dib7000p_ops)); ++ fe0->dvb.frontend->sec_priv = kmemdup(&dib7000p_ops, sizeof(dib7000p_ops), GFP_KERNEL); ++ if (!fe0->dvb.frontend->sec_priv) ++ return -ENOMEM; + tun_i2c = dib7000p_ops.get_i2c_master(fe0->dvb.frontend, DIBX000_I2C_INTERFACE_TUNER, 1); + if (!dvb_attach(dib0070_attach, fe0->dvb.frontend, tun_i2c, &dib7070p_dib0070_config)) + return -ENODEV; +diff --git a/drivers/media/pci/ivtv/ivtv-fileops.c b/drivers/media/pci/ivtv/ivtv-fileops.c +index 605d280d8a5f..cb65fe6c49e0 100644 +--- a/drivers/media/pci/ivtv/ivtv-fileops.c ++++ b/drivers/media/pci/ivtv/ivtv-fileops.c +@@ -420,7 +420,7 @@ static ssize_t ivtv_read_pos(struct ivtv_stream *s, char __user *ubuf, size_t co + + IVTV_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); + if (rc > 0) +- pos += rc; ++ *pos += rc; + return rc; + } + +diff --git a/drivers/media/platform/davinci/isif.c b/drivers/media/platform/davinci/isif.c +index 78e37cf3470f..b51b875c5a61 100644 +--- a/drivers/media/platform/davinci/isif.c ++++ b/drivers/media/platform/davinci/isif.c +@@ -890,9 +890,7 @@ static int isif_set_hw_if_params(struct vpfe_hw_if_param *params) + static int isif_config_ycbcr(void) + { + struct isif_ycbcr_config *params = &isif_cfg.ycbcr; +- struct vpss_pg_frame_size frame_size; + u32 modeset = 0, ccdcfg = 0; +- struct vpss_sync_pol sync; + + dev_dbg(isif_cfg.dev, "\nStarting isif_config_ycbcr..."); + +@@ -980,13 +978,6 @@ static int isif_config_ycbcr(void) + /* two fields are interleaved in memory */ + regw(0x00000249, SDOFST); + +- /* Setup test pattern if enabled */ +- if (isif_cfg.bayer.config_params.test_pat_gen) { +- sync.ccdpg_hdpol = params->hd_pol; +- sync.ccdpg_vdpol = params->vd_pol; +- dm365_vpss_set_sync_pol(sync); +- dm365_vpss_set_pg_frame_size(frame_size); +- } + return 0; + } + +diff --git a/drivers/media/platform/davinci/vpbe.c b/drivers/media/platform/davinci/vpbe.c +index abce9c4a1a8e..59518c08528b 100644 +--- a/drivers/media/platform/davinci/vpbe.c ++++ b/drivers/media/platform/davinci/vpbe.c +@@ -130,7 +130,7 @@ static int vpbe_enum_outputs(struct vpbe_device *vpbe_dev, + struct v4l2_output *output) + { + struct vpbe_config *cfg = vpbe_dev->cfg; +- int temp_index = output->index; ++ unsigned int temp_index = output->index; + + if (temp_index >= cfg->num_outputs) + return -EINVAL; +diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c +index 596359576109..cf015bfc559b 100644 +--- a/drivers/media/platform/omap/omap_vout.c ++++ b/drivers/media/platform/omap/omap_vout.c +@@ -1580,23 +1580,20 @@ static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) + unsigned long size; + struct videobuf_buffer *vb; + +- vb = q->bufs[b->index]; +- + if (!vout->streaming) + return -EINVAL; + +- if (file->f_flags & O_NONBLOCK) +- /* Call videobuf_dqbuf for non blocking mode */ +- ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 1); +- else +- /* Call videobuf_dqbuf for blocking mode */ +- ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 0); ++ ret = videobuf_dqbuf(q, b, !!(file->f_flags & O_NONBLOCK)); ++ if (ret) ++ return ret; ++ ++ vb = q->bufs[b->index]; + + addr = (unsigned long) vout->buf_phy_addr[vb->i]; + size = (unsigned long) vb->size; + dma_unmap_single(vout->vid_dev->v4l2_dev.dev, addr, + size, DMA_TO_DEVICE); +- return ret; ++ return 0; + } + + static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i) +diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c +index 0d981bbf38bc..255f70999ee8 100644 +--- a/drivers/media/platform/s5p-jpeg/jpeg-core.c ++++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c +@@ -1952,7 +1952,7 @@ static int s5p_jpeg_controls_create(struct s5p_jpeg_ctx *ctx) + + v4l2_ctrl_new_std(&ctx->ctrl_handler, &s5p_jpeg_ctrl_ops, + V4L2_CID_JPEG_RESTART_INTERVAL, +- 0, 3, 0xffff, 0); ++ 0, 0xffff, 1, 0); + if (ctx->jpeg->variant->version == SJPEG_S5P) + mask = ~0x06; /* 422, 420 */ + } +diff --git a/drivers/media/platform/vivid/vivid-osd.c b/drivers/media/platform/vivid/vivid-osd.c +index e15eef6a94e5..f3afc74f98ed 100644 +--- a/drivers/media/platform/vivid/vivid-osd.c ++++ b/drivers/media/platform/vivid/vivid-osd.c +@@ -167,7 +167,7 @@ static int _vivid_fb_check_var(struct fb_var_screeninfo *var, struct vivid_dev * + var->nonstd = 0; + + var->vmode &= ~FB_VMODE_MASK; +- var->vmode = FB_VMODE_NONINTERLACED; ++ var->vmode |= FB_VMODE_NONINTERLACED; + + /* Dummy values */ + var->hsync_len = 24; +diff --git a/drivers/media/radio/wl128x/fmdrv_common.c b/drivers/media/radio/wl128x/fmdrv_common.c +index 51639a3f7abe..0cee10cca0e5 100644 +--- a/drivers/media/radio/wl128x/fmdrv_common.c ++++ b/drivers/media/radio/wl128x/fmdrv_common.c +@@ -1278,8 +1278,9 @@ static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name) + + switch (action->type) { + case ACTION_SEND_COMMAND: /* Send */ +- if (fmc_send_cmd(fmdev, 0, 0, action->data, +- action->size, NULL, NULL)) ++ ret = fmc_send_cmd(fmdev, 0, 0, action->data, ++ action->size, NULL, NULL); ++ if (ret) + goto rel_fw; + + cmd_cnt++; +diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c +index 498875193386..adbb23b6595f 100644 +--- a/drivers/mfd/intel-lpss.c ++++ b/drivers/mfd/intel-lpss.c +@@ -525,6 +525,7 @@ module_init(intel_lpss_init); + + static void __exit intel_lpss_exit(void) + { ++ ida_destroy(&intel_lpss_devid_ida); + debugfs_remove(intel_lpss_debugfs); + } + module_exit(intel_lpss_exit); +diff --git a/drivers/misc/mic/card/mic_x100.c b/drivers/misc/mic/card/mic_x100.c +index b2958ce2368c..cd778e2b4f3e 100644 +--- a/drivers/misc/mic/card/mic_x100.c ++++ b/drivers/misc/mic/card/mic_x100.c +@@ -249,6 +249,9 @@ static int __init mic_probe(struct platform_device *pdev) + mdrv->dev = &pdev->dev; + snprintf(mdrv->name, sizeof(mic_driver_name), mic_driver_name); + ++ /* FIXME: use dma_set_mask_and_coherent() and check result */ ++ dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); ++ + mdev->mmio.pa = MIC_X100_MMIO_BASE; + mdev->mmio.len = MIC_X100_MMIO_LEN; + mdev->mmio.va = devm_ioremap(&pdev->dev, MIC_X100_MMIO_BASE, +@@ -294,18 +297,6 @@ static void mic_platform_shutdown(struct platform_device *pdev) + mic_remove(pdev); + } + +-static u64 mic_dma_mask = DMA_BIT_MASK(64); +- +-static struct platform_device mic_platform_dev = { +- .name = mic_driver_name, +- .id = 0, +- .num_resources = 0, +- .dev = { +- .dma_mask = &mic_dma_mask, +- .coherent_dma_mask = DMA_BIT_MASK(64), +- }, +-}; +- + static struct platform_driver __refdata mic_platform_driver = { + .probe = mic_probe, + .remove = mic_remove, +@@ -315,6 +306,8 @@ static struct platform_driver __refdata mic_platform_driver = { + }, + }; + ++static struct platform_device *mic_platform_dev; ++ + static int __init mic_init(void) + { + int ret; +@@ -327,9 +320,12 @@ static int __init mic_init(void) + } + + mic_init_card_debugfs(); +- ret = platform_device_register(&mic_platform_dev); ++ ++ mic_platform_dev = platform_device_register_simple(mic_driver_name, ++ 0, NULL, 0); ++ ret = PTR_ERR_OR_ZERO(mic_platform_dev); + if (ret) { +- pr_err("platform_device_register ret %d\n", ret); ++ pr_err("platform_device_register_full ret %d\n", ret); + goto cleanup_debugfs; + } + ret = platform_driver_register(&mic_platform_driver); +@@ -340,7 +336,7 @@ static int __init mic_init(void) + return ret; + + device_unregister: +- platform_device_unregister(&mic_platform_dev); ++ platform_device_unregister(mic_platform_dev); + cleanup_debugfs: + mic_exit_card_debugfs(); + done: +@@ -350,7 +346,7 @@ done: + static void __exit mic_exit(void) + { + platform_driver_unregister(&mic_platform_driver); +- platform_device_unregister(&mic_platform_dev); ++ platform_device_unregister(mic_platform_dev); + mic_exit_card_debugfs(); + } + +diff --git a/drivers/misc/sgi-xp/xpc_partition.c b/drivers/misc/sgi-xp/xpc_partition.c +index 6956f7e7d439..ca5f0102daef 100644 +--- a/drivers/misc/sgi-xp/xpc_partition.c ++++ b/drivers/misc/sgi-xp/xpc_partition.c +@@ -70,7 +70,7 @@ xpc_get_rsvd_page_pa(int nasid) + unsigned long rp_pa = nasid; /* seed with nasid */ + size_t len = 0; + size_t buf_len = 0; +- void *buf = buf; ++ void *buf = NULL; + void *buf_base = NULL; + enum xp_retval (*get_partition_rsvd_page_pa) + (void *, u64 *, unsigned long *, size_t *) = +diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c +index 2bae0214528b..bf309a8a66a1 100644 +--- a/drivers/mmc/host/sdhci.c ++++ b/drivers/mmc/host/sdhci.c +@@ -3096,11 +3096,13 @@ int sdhci_add_host(struct sdhci_host *host) + if (host->ops->get_min_clock) + mmc->f_min = host->ops->get_min_clock(host); + else if (host->version >= SDHCI_SPEC_300) { +- if (host->clk_mul) { +- mmc->f_min = (host->max_clk * host->clk_mul) / 1024; ++ if (host->clk_mul) + max_clk = host->max_clk * host->clk_mul; +- } else +- mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; ++ /* ++ * Divided Clock Mode minimum clock rate is always less than ++ * Programmable Clock Mode minimum clock rate. ++ */ ++ mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; + } else + mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; + +diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c +index 8a226cc05c10..cc4a0c48f090 100644 +--- a/drivers/net/can/slcan.c ++++ b/drivers/net/can/slcan.c +@@ -344,9 +344,16 @@ static void slcan_transmit(struct work_struct *work) + */ + static void slcan_write_wakeup(struct tty_struct *tty) + { +- struct slcan *sl = tty->disc_data; ++ struct slcan *sl; ++ ++ rcu_read_lock(); ++ sl = rcu_dereference(tty->disc_data); ++ if (!sl) ++ goto out; + + schedule_work(&sl->tx_work); ++out: ++ rcu_read_unlock(); + } + + /* Send a can_frame to a TTY queue. */ +@@ -640,10 +647,11 @@ static void slcan_close(struct tty_struct *tty) + return; + + spin_lock_bh(&sl->lock); +- tty->disc_data = NULL; ++ rcu_assign_pointer(tty->disc_data, NULL); + sl->tty = NULL; + spin_unlock_bh(&sl->lock); + ++ synchronize_rcu(); + flush_work(&sl->tx_work); + + /* Flush network side */ +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c +index 53b3c1a5851c..9530ee12726f 100644 +--- a/drivers/net/ethernet/broadcom/bcmsysport.c ++++ b/drivers/net/ethernet/broadcom/bcmsysport.c +@@ -1794,7 +1794,7 @@ static int bcm_sysport_probe(struct platform_device *pdev) + + priv->phy_interface = of_get_phy_mode(dn); + /* Default to GMII interface mode */ +- if (priv->phy_interface < 0) ++ if ((int)priv->phy_interface < 0) + priv->phy_interface = PHY_INTERFACE_MODE_GMII; + + /* In the case of a fixed PHY, the DT node associated +diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +index bee615cddbdd..f40eefd1b378 100644 +--- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c ++++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +@@ -2437,6 +2437,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) + + if (!is_offload(adapter)) + return -EOPNOTSUPP; ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; + if (!(adapter->flags & FULL_INIT_DONE)) + return -EIO; /* need the memory controllers */ + if (copy_from_user(&t, useraddr, sizeof(t))) +diff --git a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +index e51892d518ff..761c80eb8a68 100644 +--- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c ++++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +@@ -951,7 +951,7 @@ static int hix5hd2_dev_probe(struct platform_device *pdev) + goto err_free_mdio; + + priv->phy_mode = of_get_phy_mode(node); +- if (priv->phy_mode < 0) { ++ if ((int)priv->phy_mode < 0) { + netdev_err(ndev, "not find phy-mode\n"); + ret = -EINVAL; + goto err_mdiobus; +diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c +index 1a56de06b014..fdbba588c6db 100644 +--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c ++++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c +@@ -1477,7 +1477,7 @@ static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr, + + memset(pr, 0, sizeof(struct ehea_port_res)); + +- pr->tx_bytes = rx_bytes; ++ pr->tx_bytes = tx_bytes; + pr->tx_packets = tx_packets; + pr->rx_bytes = rx_bytes; + pr->rx_packets = rx_packets; +diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c +index 0798b4adb039..667900578249 100644 +--- a/drivers/net/ethernet/natsemi/sonic.c ++++ b/drivers/net/ethernet/natsemi/sonic.c +@@ -221,9 +221,9 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + + laddr = dma_map_single(lp->device, skb->data, length, DMA_TO_DEVICE); + if (!laddr) { +- printk(KERN_ERR "%s: failed to map tx DMA buffer.\n", dev->name); +- dev_kfree_skb(skb); +- return NETDEV_TX_BUSY; ++ pr_err_ratelimited("%s: failed to map tx DMA buffer.\n", dev->name); ++ dev_kfree_skb_any(skb); ++ return NETDEV_TX_OK; + } + + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ +diff --git a/drivers/net/ethernet/pasemi/pasemi_mac.c b/drivers/net/ethernet/pasemi/pasemi_mac.c +index 57a6e6cd74fc..48106953cf64 100644 +--- a/drivers/net/ethernet/pasemi/pasemi_mac.c ++++ b/drivers/net/ethernet/pasemi/pasemi_mac.c +@@ -1091,7 +1091,6 @@ static int pasemi_mac_phy_init(struct net_device *dev) + + dn = pci_device_to_OF_node(mac->pdev); + phy_dn = of_parse_phandle(dn, "phy-handle", 0); +- of_node_put(phy_dn); + + mac->link = 0; + mac->speed = 0; +@@ -1100,6 +1099,7 @@ static int pasemi_mac_phy_init(struct net_device *dev) + phydev = of_phy_connect(dev, phy_dn, &pasemi_adjust_link, 0, + PHY_INTERFACE_MODE_SGMII); + ++ of_node_put(phy_dn); + if (!phydev) { + printk(KERN_ERR "%s: Could not attach to phy\n", dev->name); + return -ENODEV; +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c +index 7886a8a5b55b..fb944e65c632 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.c ++++ b/drivers/net/ethernet/qualcomm/qca_spi.c +@@ -438,7 +438,6 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event) + u16 signature = 0; + u16 spi_config; + u16 wrbuf_space = 0; +- static u16 reset_count; + + if (event == QCASPI_EVENT_CPUON) { + /* Read signature twice, if not valid +@@ -491,13 +490,13 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event) + + qca->sync = QCASPI_SYNC_RESET; + qca->stats.trig_reset++; +- reset_count = 0; ++ qca->reset_count = 0; + break; + case QCASPI_SYNC_RESET: +- reset_count++; ++ qca->reset_count++; + netdev_dbg(qca->net_dev, "sync: waiting for CPU on, count %u.\n", +- reset_count); +- if (reset_count >= QCASPI_RESET_TIMEOUT) { ++ qca->reset_count); ++ if (qca->reset_count >= QCASPI_RESET_TIMEOUT) { + /* reset did not seem to take place, try again */ + qca->sync = QCASPI_SYNC_UNKNOWN; + qca->stats.reset_timeout++; +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.h b/drivers/net/ethernet/qualcomm/qca_spi.h +index 6e31a0e744a4..c48c314ca4df 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.h ++++ b/drivers/net/ethernet/qualcomm/qca_spi.h +@@ -97,6 +97,7 @@ struct qcaspi { + + unsigned int intr_req; + unsigned int intr_svc; ++ u16 reset_count; + + #ifdef CONFIG_DEBUG_FS + struct dentry *device_root; +diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c +index 2d9f4ed9a65e..8413f93f5cd9 100644 +--- a/drivers/net/ethernet/renesas/sh_eth.c ++++ b/drivers/net/ethernet/renesas/sh_eth.c +@@ -3040,12 +3040,16 @@ static struct sh_eth_plat_data *sh_eth_parse_dt(struct device *dev) + struct device_node *np = dev->of_node; + struct sh_eth_plat_data *pdata; + const char *mac_addr; ++ int ret; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return NULL; + +- pdata->phy_interface = of_get_phy_mode(np); ++ ret = of_get_phy_mode(np); ++ if (ret < 0) ++ return NULL; ++ pdata->phy_interface = ret; + + mac_addr = of_get_mac_address(np); + if (mac_addr) +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +index 82de68b1a452..1fc356c17750 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +@@ -203,7 +203,7 @@ static void *ipq806x_gmac_of_parse(struct ipq806x_gmac *gmac) + struct device *dev = &gmac->pdev->dev; + + gmac->phy_mode = of_get_phy_mode(dev->of_node); +- if (gmac->phy_mode < 0) { ++ if ((int)gmac->phy_mode < 0) { + dev_err(dev, "missing phy mode property\n"); + return ERR_PTR(-EINVAL); + } +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +index 170a18b61281..147c9f8cee7f 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +@@ -157,7 +157,7 @@ static int stmmac_enable(struct ptp_clock_info *ptp, + /* structure describing a PTP hardware clock */ + static struct ptp_clock_info stmmac_ptp_clock_ops = { + .owner = THIS_MODULE, +- .name = "stmmac_ptp_clock", ++ .name = "stmmac ptp", + .max_adj = 62500000, + .n_alarm = 0, + .n_ext_ts = 0, +diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c +index ef6b25ec75a1..0f8d5609ed51 100644 +--- a/drivers/net/slip/slip.c ++++ b/drivers/net/slip/slip.c +@@ -452,9 +452,16 @@ static void slip_transmit(struct work_struct *work) + */ + static void slip_write_wakeup(struct tty_struct *tty) + { +- struct slip *sl = tty->disc_data; ++ struct slip *sl; ++ ++ rcu_read_lock(); ++ sl = rcu_dereference(tty->disc_data); ++ if (!sl) ++ goto out; + + schedule_work(&sl->tx_work); ++out: ++ rcu_read_unlock(); + } + + static void sl_tx_timeout(struct net_device *dev) +@@ -887,10 +894,11 @@ static void slip_close(struct tty_struct *tty) + return; + + spin_lock_bh(&sl->lock); +- tty->disc_data = NULL; ++ rcu_assign_pointer(tty->disc_data, NULL); + sl->tty = NULL; + spin_unlock_bh(&sl->lock); + ++ synchronize_rcu(); + flush_work(&sl->tx_work); + + /* VSV = very important to remove timers */ +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 4174b24963b9..75a3865a80d2 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + #include + #include "lan78xx.h" + +@@ -2893,6 +2894,19 @@ void lan78xx_tx_timeout(struct net_device *net) + tasklet_schedule(&dev->bh); + } + ++static netdev_features_t lan78xx_features_check(struct sk_buff *skb, ++ struct net_device *netdev, ++ netdev_features_t features) ++{ ++ if (skb->len + TX_OVERHEAD > MAX_SINGLE_PACKET_SIZE) ++ features &= ~NETIF_F_GSO_MASK; ++ ++ features = vlan_features_check(skb, features); ++ features = vxlan_features_check(skb, features); ++ ++ return features; ++} ++ + static const struct net_device_ops lan78xx_netdev_ops = { + .ndo_open = lan78xx_open, + .ndo_stop = lan78xx_stop, +@@ -2906,6 +2920,7 @@ static const struct net_device_ops lan78xx_netdev_ops = { + .ndo_set_features = lan78xx_set_features, + .ndo_vlan_rx_add_vid = lan78xx_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = lan78xx_vlan_rx_kill_vid, ++ .ndo_features_check = lan78xx_features_check, + }; + + static int lan78xx_probe(struct usb_interface *intf, +diff --git a/drivers/net/wireless/ath/ath9k/dynack.c b/drivers/net/wireless/ath/ath9k/dynack.c +index 22b3cc4c27cd..58205a5bd74b 100644 +--- a/drivers/net/wireless/ath/ath9k/dynack.c ++++ b/drivers/net/wireless/ath/ath9k/dynack.c +@@ -285,9 +285,9 @@ void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an) + + an->ackto = ackto; + +- spin_lock(&da->qlock); ++ spin_lock_bh(&da->qlock); + list_add_tail(&an->list, &da->nodes); +- spin_unlock(&da->qlock); ++ spin_unlock_bh(&da->qlock); + } + EXPORT_SYMBOL(ath_dynack_node_init); + +@@ -301,9 +301,9 @@ void ath_dynack_node_deinit(struct ath_hw *ah, struct ath_node *an) + { + struct ath_dynack *da = &ah->dynack; + +- spin_lock(&da->qlock); ++ spin_lock_bh(&da->qlock); + list_del(&an->list); +- spin_unlock(&da->qlock); ++ spin_unlock_bh(&da->qlock); + } + EXPORT_SYMBOL(ath_dynack_node_deinit); + +diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c +index 8317afd065b4..0824697c3dca 100644 +--- a/drivers/net/wireless/libertas/cfg.c ++++ b/drivers/net/wireless/libertas/cfg.c +@@ -272,6 +272,10 @@ add_ie_rates(u8 *tlv, const u8 *ie, int *nrates) + int hw, ap, ap_max = ie[1]; + u8 hw_rate; + ++ if (ap_max > MAX_RATES) { ++ lbs_deb_assoc("invalid rates\n"); ++ return tlv; ++ } + /* Advance past IE header */ + ie += 2; + +@@ -1783,6 +1787,9 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + struct cmd_ds_802_11_ad_hoc_join cmd; + u8 preamble = RADIO_PREAMBLE_SHORT; + int ret = 0; ++ int hw, i; ++ u8 rates_max; ++ u8 *rates; + + lbs_deb_enter(LBS_DEB_CFG80211); + +@@ -1843,9 +1850,12 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + if (!rates_eid) { + lbs_add_rates(cmd.bss.rates); + } else { +- int hw, i; +- u8 rates_max = rates_eid[1]; +- u8 *rates = cmd.bss.rates; ++ rates_max = rates_eid[1]; ++ if (rates_max > MAX_RATES) { ++ lbs_deb_join("invalid rates"); ++ goto out; ++ } ++ rates = cmd.bss.rates; + for (hw = 0; hw < ARRAY_SIZE(lbs_rates); hw++) { + u8 hw_rate = lbs_rates[hw].bitrate / 5; + for (i = 0; i < rates_max; i++) { +diff --git a/drivers/net/wireless/libertas_tf/cmd.c b/drivers/net/wireless/libertas_tf/cmd.c +index 909ac3685010..2b193f1257a5 100644 +--- a/drivers/net/wireless/libertas_tf/cmd.c ++++ b/drivers/net/wireless/libertas_tf/cmd.c +@@ -69,7 +69,7 @@ static void lbtf_geo_init(struct lbtf_private *priv) + break; + } + +- for (ch = priv->range.start; ch < priv->range.end; ch++) ++ for (ch = range->start; ch < range->end; ch++) + priv->channels[CHAN_TO_IDX(ch)].flags = 0; + } + +diff --git a/drivers/net/wireless/mediatek/mt7601u/phy.c b/drivers/net/wireless/mediatek/mt7601u/phy.c +index 1908af6add87..59ed073a8572 100644 +--- a/drivers/net/wireless/mediatek/mt7601u/phy.c ++++ b/drivers/net/wireless/mediatek/mt7601u/phy.c +@@ -219,7 +219,7 @@ int mt7601u_wait_bbp_ready(struct mt7601u_dev *dev) + + do { + val = mt7601u_bbp_rr(dev, MT_BBP_REG_VERSION); +- if (val && ~val) ++ if (val && val != 0xff) + break; + } while (--i); + +diff --git a/drivers/pinctrl/sh-pfc/pfc-emev2.c b/drivers/pinctrl/sh-pfc/pfc-emev2.c +index 02118ab336fc..5ab3ac61f418 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-emev2.c ++++ b/drivers/pinctrl/sh-pfc/pfc-emev2.c +@@ -1263,6 +1263,14 @@ static const char * const dtv_groups[] = { + "dtv_b", + }; + ++static const char * const err_rst_reqb_groups[] = { ++ "err_rst_reqb", ++}; ++ ++static const char * const ext_clki_groups[] = { ++ "ext_clki", ++}; ++ + static const char * const iic0_groups[] = { + "iic0", + }; +@@ -1285,6 +1293,10 @@ static const char * const lcd_groups[] = { + "yuv3", + }; + ++static const char * const lowpwr_groups[] = { ++ "lowpwr", ++}; ++ + static const char * const ntsc_groups[] = { + "ntsc_clk", + "ntsc_data", +@@ -1298,6 +1310,10 @@ static const char * const pwm1_groups[] = { + "pwm1", + }; + ++static const char * const ref_clko_groups[] = { ++ "ref_clko", ++}; ++ + static const char * const sd_groups[] = { + "sd_cki", + }; +@@ -1391,13 +1407,17 @@ static const struct sh_pfc_function pinmux_functions[] = { + SH_PFC_FUNCTION(cam), + SH_PFC_FUNCTION(cf), + SH_PFC_FUNCTION(dtv), ++ SH_PFC_FUNCTION(err_rst_reqb), ++ SH_PFC_FUNCTION(ext_clki), + SH_PFC_FUNCTION(iic0), + SH_PFC_FUNCTION(iic1), + SH_PFC_FUNCTION(jtag), + SH_PFC_FUNCTION(lcd), ++ SH_PFC_FUNCTION(lowpwr), + SH_PFC_FUNCTION(ntsc), + SH_PFC_FUNCTION(pwm0), + SH_PFC_FUNCTION(pwm1), ++ SH_PFC_FUNCTION(ref_clko), + SH_PFC_FUNCTION(sd), + SH_PFC_FUNCTION(sdi0), + SH_PFC_FUNCTION(sdi1), +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +index 279e9dd442e4..bc2ee07fa92f 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +@@ -1983,7 +1983,7 @@ static const unsigned int gether_gmii_pins[] = { + */ + 185, 186, 187, 188, 189, 190, 191, 192, 174, 161, 204, + 171, 170, 169, 168, 167, 166, 173, 172, 176, 184, 183, 203, +- 205, 163, 206, 207, ++ 205, 163, 206, 207, 158, + }; + static const unsigned int gether_gmii_mux[] = { + ET_ERXD0_MARK, ET_ERXD1_MARK, ET_ERXD2_MARK, ET_ERXD3_MARK, +@@ -2155,6 +2155,7 @@ static const unsigned int lcd0_data24_1_mux[] = { + LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK, + LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK, + LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK, ++ LCD0_D12_MARK, LCD0_D13_MARK, LCD0_D14_MARK, LCD0_D15_MARK, + LCD0_D16_MARK, LCD0_D17_MARK, LCD0_D18_PORT163_MARK, + LCD0_D19_PORT162_MARK, LCD0_D20_PORT161_MARK, LCD0_D21_PORT158_MARK, + LCD0_D22_PORT160_MARK, LCD0_D23_PORT159_MARK, +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +index 42ffa8708abc..b2f8898ddb2c 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +@@ -3059,8 +3059,7 @@ static const unsigned int qspi_data4_b_pins[] = { + RCAR_GP_PIN(6, 4), + }; + static const unsigned int qspi_data4_b_mux[] = { +- SPCLK_B_MARK, MOSI_IO0_B_MARK, MISO_IO1_B_MARK, +- IO2_B_MARK, IO3_B_MARK, SSL_B_MARK, ++ MOSI_IO0_B_MARK, MISO_IO1_B_MARK, IO2_B_MARK, IO3_B_MARK, + }; + /* - SCIF0 ------------------------------------------------------------------ */ + static const unsigned int scif0_data_pins[] = { +@@ -4171,17 +4170,14 @@ static const unsigned int vin1_b_data18_pins[] = { + }; + static const unsigned int vin1_b_data18_mux[] = { + /* B */ +- VI1_DATA0_B_MARK, VI1_DATA1_B_MARK, + VI1_DATA2_B_MARK, VI1_DATA3_B_MARK, + VI1_DATA4_B_MARK, VI1_DATA5_B_MARK, + VI1_DATA6_B_MARK, VI1_DATA7_B_MARK, + /* G */ +- VI1_G0_B_MARK, VI1_G1_B_MARK, + VI1_G2_B_MARK, VI1_G3_B_MARK, + VI1_G4_B_MARK, VI1_G5_B_MARK, + VI1_G6_B_MARK, VI1_G7_B_MARK, + /* R */ +- VI1_R0_B_MARK, VI1_R1_B_MARK, + VI1_R2_B_MARK, VI1_R3_B_MARK, + VI1_R4_B_MARK, VI1_R5_B_MARK, + VI1_R6_B_MARK, VI1_R7_B_MARK, +@@ -4971,7 +4967,7 @@ static const char * const scifb2_groups[] = { + "scifb2_data_b", + "scifb2_clk_b", + "scifb2_ctrl_b", +- "scifb0_data_c", ++ "scifb2_data_c", + "scifb2_clk_c", + "scifb2_data_d", + }; +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7794.c b/drivers/pinctrl/sh-pfc/pfc-r8a7794.c +index 086f6798b129..3b79e893b5ed 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7794.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7794.c +@@ -4046,7 +4046,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_AVB_MDC, FN_SSI_SDATA6_B, 0, 0, } + }, + { PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32, +- 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3) { ++ 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3) { + /* IP9_31 [1] */ + 0, 0, + /* IP9_30_28 [3] */ +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7269.c b/drivers/pinctrl/sh-pfc/pfc-sh7269.c +index a50d22bef1f4..cfdb4fc177c3 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7269.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7269.c +@@ -2119,7 +2119,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + }, + + { PINMUX_CFG_REG("PCIOR0", 0xfffe3852, 16, 1) { +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PC8_IN, PC8_OUT, + PC7_IN, PC7_OUT, + PC6_IN, PC6_OUT, +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +index 6a69c8c5d943..b173bd759ee1 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +@@ -2672,6 +2672,7 @@ static const unsigned int tpu4_to2_mux[] = { + }; + static const unsigned int tpu4_to3_pins[] = { + /* TO */ ++ PIN_NUMBER(6, 26), + }; + static const unsigned int tpu4_to3_mux[] = { + TPU4TO3_MARK, +@@ -2894,7 +2895,8 @@ static const char * const fsic_groups[] = { + "fsic_sclk_out", + "fsic_data_in", + "fsic_data_out", +- "fsic_spdif", ++ "fsic_spdif_0", ++ "fsic_spdif_1", + }; + + static const char * const fsid_groups[] = { +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7734.c b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +index ab09d385f95d..ce543f3c39b2 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7734.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +@@ -2236,13 +2236,13 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_LCD_CL1_B, 0, 0, + /* IP10_5_3 [3] */ + FN_SSI_WS23, FN_VI1_5_B, FN_TX1_D, FN_HSCK0_C, FN_FALE_B, +- FN_LCD_DON_B, 0, 0, 0, ++ FN_LCD_DON_B, 0, 0, + /* IP10_2_0 [3] */ + FN_SSI_SCK23, FN_VI1_4_B, FN_RX1_D, FN_FCLE_B, + FN_LCD_DATA15_B, 0, 0, 0 } + }, + { PINMUX_CFG_REG_VAR("IPSR11", 0xFFFC0048, 32, +- 3, 1, 2, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { ++ 3, 1, 2, 3, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { + /* IP11_31_29 [3] */ + 0, 0, 0, 0, 0, 0, 0, 0, + /* IP11_28 [1] */ +diff --git a/drivers/platform/mips/cpu_hwmon.c b/drivers/platform/mips/cpu_hwmon.c +index 0f6c63e17049..9a201c3caaf4 100644 +--- a/drivers/platform/mips/cpu_hwmon.c ++++ b/drivers/platform/mips/cpu_hwmon.c +@@ -155,7 +155,7 @@ static int __init loongson_hwmon_init(void) + + cpu_hwmon_dev = hwmon_device_register(NULL); + if (IS_ERR(cpu_hwmon_dev)) { +- ret = -ENOMEM; ++ ret = PTR_ERR(cpu_hwmon_dev); + pr_err("hwmon_device_register fail!\n"); + goto fail_hwmon_device_register; + } +diff --git a/drivers/platform/x86/alienware-wmi.c b/drivers/platform/x86/alienware-wmi.c +index 3df47c1b04ec..f5585740a765 100644 +--- a/drivers/platform/x86/alienware-wmi.c ++++ b/drivers/platform/x86/alienware-wmi.c +@@ -511,7 +511,7 @@ static ssize_t show_hdmi_source(struct device *dev, + return scnprintf(buf, PAGE_SIZE, + "input [gpu] unknown\n"); + } +- pr_err("alienware-wmi: unknown HDMI source status: %d\n", out_data); ++ pr_err("alienware-wmi: unknown HDMI source status: %u\n", status); + return scnprintf(buf, PAGE_SIZE, "input gpu [unknown]\n"); + } + +diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c +index b13cd074c52a..9281e42c9ed5 100644 +--- a/drivers/power/power_supply_core.c ++++ b/drivers/power/power_supply_core.c +@@ -755,14 +755,14 @@ __power_supply_register(struct device *parent, + } + + spin_lock_init(&psy->changed_lock); +- rc = device_init_wakeup(dev, ws); +- if (rc) +- goto wakeup_init_failed; +- + rc = device_add(dev); + if (rc) + goto device_add_failed; + ++ rc = device_init_wakeup(dev, ws); ++ if (rc) ++ goto wakeup_init_failed; ++ + rc = psy_register_thermal(psy); + if (rc) + goto register_thermal_failed; +@@ -798,8 +798,8 @@ register_cooler_failed: + psy_unregister_thermal(psy); + register_thermal_failed: + device_del(dev); +-device_add_failed: + wakeup_init_failed: ++device_add_failed: + check_supplies_failed: + dev_set_name_failed: + put_device(dev); +diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c +index 8cbb82ceec40..fad424e20bd5 100644 +--- a/drivers/regulator/wm831x-dcdc.c ++++ b/drivers/regulator/wm831x-dcdc.c +@@ -327,8 +327,8 @@ static int wm831x_buckv_get_voltage_sel(struct regulator_dev *rdev) + } + + /* Current limit options */ +-static u16 wm831x_dcdc_ilim[] = { +- 125, 250, 375, 500, 625, 750, 875, 1000 ++static const unsigned int wm831x_dcdc_ilim[] = { ++ 125000, 250000, 375000, 500000, 625000, 750000, 875000, 1000000 + }; + + static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev, +diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c +index 466bf7f9a285..7da2a1fb50f8 100644 +--- a/drivers/rtc/rtc-88pm80x.c ++++ b/drivers/rtc/rtc-88pm80x.c +@@ -116,12 +116,14 @@ static int pm80x_rtc_read_time(struct device *dev, struct rtc_time *tm) + unsigned char buf[4]; + unsigned long ticks, base, data; + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -144,7 +146,8 @@ static int pm80x_rtc_set_time(struct device *dev, struct rtc_time *tm) + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + base = ticks - data; + dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -165,11 +168,13 @@ static int pm80x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) + int ret; + + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + regmap_raw_read(info->map, PM800_RTC_EXPIRE1_1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -192,12 +197,14 @@ static int pm80x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) + regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_ALARM1_EN, 0); + + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c +index 166faae3a59c..7d3e5168fcef 100644 +--- a/drivers/rtc/rtc-88pm860x.c ++++ b/drivers/rtc/rtc-88pm860x.c +@@ -115,11 +115,13 @@ static int pm860x_rtc_read_time(struct device *dev, struct rtc_time *tm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -145,7 +147,8 @@ static int pm860x_rtc_set_time(struct device *dev, struct rtc_time *tm) + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + base = ticks - data; + dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -170,10 +173,12 @@ static int pm860x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + pm860x_bulk_read(info->i2c, PM8607_RTC_EXPIRE1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -198,11 +203,13 @@ static int pm860x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c +index 92b1cbf2c4a7..2bea733b1589 100644 +--- a/drivers/rtc/rtc-ds1672.c ++++ b/drivers/rtc/rtc-ds1672.c +@@ -60,7 +60,8 @@ static int ds1672_get_datetime(struct i2c_client *client, struct rtc_time *tm) + "%s: raw read data - counters=%02x,%02x,%02x,%02x\n", + __func__, buf[0], buf[1], buf[2], buf[3]); + +- time = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ time = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + + rtc_time_to_tm(time, tm); + +diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c +index 45b5a3d47ccf..1982eec0a3ea 100644 +--- a/drivers/rtc/rtc-pcf8563.c ++++ b/drivers/rtc/rtc-pcf8563.c +@@ -568,7 +568,6 @@ static int pcf8563_probe(struct i2c_client *client, + struct pcf8563 *pcf8563; + int err; + unsigned char buf; +- unsigned char alm_pending; + + dev_dbg(&client->dev, "%s\n", __func__); + +@@ -594,13 +593,13 @@ static int pcf8563_probe(struct i2c_client *client, + return err; + } + +- err = pcf8563_get_alarm_mode(client, NULL, &alm_pending); +- if (err) { +- dev_err(&client->dev, "%s: read error\n", __func__); ++ /* Clear flags and disable interrupts */ ++ buf = 0; ++ err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf); ++ if (err < 0) { ++ dev_err(&client->dev, "%s: write error\n", __func__); + return err; + } +- if (alm_pending) +- pcf8563_set_alarm_mode(client, 0); + + pcf8563->rtc = devm_rtc_device_register(&client->dev, + pcf8563_driver.driver.name, +diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c +index 795fcbd02ea3..a0dae6271ff6 100644 +--- a/drivers/rtc/rtc-pm8xxx.c ++++ b/drivers/rtc/rtc-pm8xxx.c +@@ -186,7 +186,8 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) + } + } + +- secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); ++ secs = value[0] | (value[1] << 8) | (value[2] << 16) | ++ ((unsigned long)value[3] << 24); + + rtc_time_to_tm(secs, tm); + +@@ -267,7 +268,8 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) + return rc; + } + +- secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); ++ secs = value[0] | (value[1] << 8) | (value[2] << 16) | ++ ((unsigned long)value[3] << 24); + + rtc_time_to_tm(secs, &alarm->time); + +diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c +index 30f9ef0c0d4f..b20c575564e4 100644 +--- a/drivers/scsi/libfc/fc_exch.c ++++ b/drivers/scsi/libfc/fc_exch.c +@@ -2499,7 +2499,7 @@ void fc_exch_recv(struct fc_lport *lport, struct fc_frame *fp) + + /* lport lock ? */ + if (!lport || lport->state == LPORT_ST_DISABLED) { +- FC_LPORT_DBG(lport, "Receiving frames for an lport that " ++ FC_LIBFC_DBG("Receiving frames for an lport that " + "has not been initialized correctly\n"); + fc_frame_free(fp); + return; +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index 7be968f60b59..1efd876f0728 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -3585,12 +3585,12 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr) + /* + * The cur_state should not last for more than max_wait secs + */ +- for (i = 0; i < max_wait; i++) { ++ for (i = 0; i < max_wait * 50; i++) { + curr_abs_state = instance->instancet-> + read_fw_status_reg(instance->reg_set); + + if (abs_state == curr_abs_state) { +- msleep(1000); ++ msleep(20); + } else + break; + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 611a127f08d8..8975baab73e5 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -5780,8 +5780,7 @@ qla2x00_module_init(void) + /* Initialize target kmem_cache and mem_pools */ + ret = qlt_init(); + if (ret < 0) { +- kmem_cache_destroy(srb_cachep); +- return ret; ++ goto destroy_cache; + } else if (ret > 0) { + /* + * If initiator mode is explictly disabled by qlt_init(), +@@ -5800,11 +5799,10 @@ qla2x00_module_init(void) + qla2xxx_transport_template = + fc_attach_transport(&qla2xxx_transport_functions); + if (!qla2xxx_transport_template) { +- kmem_cache_destroy(srb_cachep); + ql_log(ql_log_fatal, NULL, 0x0002, + "fc_attach_transport failed...Failing load!.\n"); +- qlt_exit(); +- return -ENODEV; ++ ret = -ENODEV; ++ goto qlt_exit; + } + + apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops); +@@ -5816,27 +5814,37 @@ qla2x00_module_init(void) + qla2xxx_transport_vport_template = + fc_attach_transport(&qla2xxx_transport_vport_functions); + if (!qla2xxx_transport_vport_template) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); + ql_log(ql_log_fatal, NULL, 0x0004, + "fc_attach_transport vport failed...Failing load!.\n"); +- return -ENODEV; ++ ret = -ENODEV; ++ goto unreg_chrdev; + } + ql_log(ql_log_info, NULL, 0x0005, + "QLogic Fibre Channel HBA Driver: %s.\n", + qla2x00_version_str); + ret = pci_register_driver(&qla2xxx_pci_driver); + if (ret) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); +- fc_release_transport(qla2xxx_transport_vport_template); + ql_log(ql_log_fatal, NULL, 0x0006, + "pci_register_driver failed...ret=%d Failing load!.\n", + ret); ++ goto release_vport_transport; + } + return ret; ++ ++release_vport_transport: ++ fc_release_transport(qla2xxx_transport_vport_template); ++ ++unreg_chrdev: ++ if (apidev_major >= 0) ++ unregister_chrdev(apidev_major, QLA2XXX_APIDEV); ++ fc_release_transport(qla2xxx_transport_template); ++ ++qlt_exit: ++ qlt_exit(); ++ ++destroy_cache: ++ kmem_cache_destroy(srb_cachep); ++ return ret; + } + + /** +diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c +index bb4ed7b1f5df..ab32e6073642 100644 +--- a/drivers/scsi/scsi_transport_iscsi.c ++++ b/drivers/scsi/scsi_transport_iscsi.c +@@ -37,6 +37,8 @@ + + #define ISCSI_TRANSPORT_VERSION "2.0-870" + ++#define ISCSI_SEND_MAX_ALLOWED 10 ++ + static int dbg_session; + module_param_named(debug_session, dbg_session, int, + S_IRUGO | S_IWUSR); +@@ -3695,6 +3697,7 @@ iscsi_if_rx(struct sk_buff *skb) + struct nlmsghdr *nlh; + struct iscsi_uevent *ev; + uint32_t group; ++ int retries = ISCSI_SEND_MAX_ALLOWED; + + nlh = nlmsg_hdr(skb); + if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) || +@@ -3725,6 +3728,10 @@ iscsi_if_rx(struct sk_buff *skb) + break; + err = iscsi_if_send_reply(group, nlh->nlmsg_seq, + nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); ++ if (err == -EAGAIN && --retries < 0) { ++ printk(KERN_WARNING "Send reply failed, error %d\n", err); ++ break; ++ } + } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH); + skb_pull(skb, rlen); + } +diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c +index ca655593c5e0..1cedd640705f 100644 +--- a/drivers/spi/spi-bcm2835aux.c ++++ b/drivers/spi/spi-bcm2835aux.c +@@ -390,7 +390,18 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev) + platform_set_drvdata(pdev, master); + master->mode_bits = BCM2835_AUX_SPI_MODE_BITS; + master->bits_per_word_mask = SPI_BPW_MASK(8); +- master->num_chipselect = -1; ++ /* even though the driver never officially supported native CS ++ * allow a single native CS for legacy DT support purposes when ++ * no cs-gpio is configured. ++ * Known limitations for native cs are: ++ * * multiple chip-selects: cs0-cs2 are all simultaniously asserted ++ * whenever there is a transfer - this even includes SPI_NO_CS ++ * * SPI_CS_HIGH: is ignores - cs are always asserted low ++ * * cs_change: cs is deasserted after each spi_transfer ++ * * cs_delay_usec: cs is always deasserted one SCK cycle after ++ * a spi_transfer ++ */ ++ master->num_chipselect = 1; + master->transfer_one = bcm2835aux_spi_transfer_one; + master->handle_err = bcm2835aux_spi_handle_err; + master->dev.of_node = pdev->dev.of_node; +diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c +index 8b290d9d7935..5419de19859a 100644 +--- a/drivers/spi/spi-fsl-spi.c ++++ b/drivers/spi/spi-fsl-spi.c +@@ -408,7 +408,6 @@ static int fsl_spi_do_one_msg(struct spi_master *master, + } + + m->status = status; +- spi_finalize_current_message(master); + + if (status || !cs_change) { + ndelay(nsecs); +@@ -416,6 +415,7 @@ static int fsl_spi_do_one_msg(struct spi_master *master, + } + + fsl_spi_setup_transfer(spi, NULL); ++ spi_finalize_current_message(master); + return 0; + } + +diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c +index 705f515863d4..e37712bed0b2 100644 +--- a/drivers/spi/spi-tegra114.c ++++ b/drivers/spi/spi-tegra114.c +@@ -307,10 +307,16 @@ static unsigned tegra_spi_fill_tx_fifo_from_client_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tegra_spi_writel(tspi, x, SPI_TX_FIFO); + } ++ ++ tspi->cur_tx_pos += written_words * tspi->bytes_per_word; + } else { ++ unsigned int write_bytes; + max_n_32bit = min(tspi->curr_dma_words, tx_empty_count); + written_words = max_n_32bit; + nbytes = written_words * tspi->bytes_per_word; ++ if (nbytes > t->len - tspi->cur_pos) ++ nbytes = t->len - tspi->cur_pos; ++ write_bytes = nbytes; + for (count = 0; count < max_n_32bit; count++) { + u32 x = 0; + +@@ -319,8 +325,10 @@ static unsigned tegra_spi_fill_tx_fifo_from_client_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tegra_spi_writel(tspi, x, SPI_TX_FIFO); + } ++ ++ tspi->cur_tx_pos += write_bytes; + } +- tspi->cur_tx_pos += written_words * tspi->bytes_per_word; ++ + return written_words; + } + +@@ -344,20 +352,27 @@ static unsigned int tegra_spi_read_rx_fifo_to_client_rxbuf( + for (i = 0; len && (i < 4); i++, len--) + *rx_buf++ = (x >> i*8) & 0xFF; + } +- tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + read_words += tspi->curr_dma_words; ++ tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; ++ u8 bytes_per_word = tspi->bytes_per_word; ++ unsigned int read_bytes; + ++ len = rx_full_count * bytes_per_word; ++ if (len > t->len - tspi->cur_pos) ++ len = t->len - tspi->cur_pos; ++ read_bytes = len; + for (count = 0; count < rx_full_count; count++) { + u32 x = tegra_spi_readl(tspi, SPI_RX_FIFO) & rx_mask; + +- for (i = 0; (i < tspi->bytes_per_word); i++) ++ for (i = 0; len && (i < bytes_per_word); i++, len--) + *rx_buf++ = (x >> (i*8)) & 0xFF; + } +- tspi->cur_rx_pos += rx_full_count * tspi->bytes_per_word; + read_words += rx_full_count; ++ tspi->cur_rx_pos += read_bytes; + } ++ + return read_words; + } + +@@ -372,12 +387,17 @@ static void tegra_spi_copy_client_txbuf_to_spi_txbuf( + unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; + + memcpy(tspi->tx_dma_buf, t->tx_buf + tspi->cur_pos, len); ++ tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + unsigned int i; + unsigned int count; + u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; + unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; ++ unsigned int write_bytes; + ++ if (consume > t->len - tspi->cur_pos) ++ consume = t->len - tspi->cur_pos; ++ write_bytes = consume; + for (count = 0; count < tspi->curr_dma_words; count++) { + u32 x = 0; + +@@ -386,8 +406,9 @@ static void tegra_spi_copy_client_txbuf_to_spi_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tspi->tx_dma_buf[count] = x; + } ++ ++ tspi->cur_tx_pos += write_bytes; + } +- tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->tx_dma_phys, +@@ -405,20 +426,28 @@ static void tegra_spi_copy_spi_rxbuf_to_client_rxbuf( + unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; + + memcpy(t->rx_buf + tspi->cur_rx_pos, tspi->rx_dma_buf, len); ++ tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + unsigned int i; + unsigned int count; + unsigned char *rx_buf = t->rx_buf + tspi->cur_rx_pos; + u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; ++ unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; ++ unsigned int read_bytes; + ++ if (consume > t->len - tspi->cur_pos) ++ consume = t->len - tspi->cur_pos; ++ read_bytes = consume; + for (count = 0; count < tspi->curr_dma_words; count++) { + u32 x = tspi->rx_dma_buf[count] & rx_mask; + +- for (i = 0; (i < tspi->bytes_per_word); i++) ++ for (i = 0; consume && (i < tspi->bytes_per_word); ++ i++, consume--) + *rx_buf++ = (x >> (i*8)) & 0xFF; + } ++ ++ tspi->cur_rx_pos += read_bytes; + } +- tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, +@@ -730,6 +759,8 @@ static int tegra_spi_start_transfer_one(struct spi_device *spi, + + if (tspi->is_packed) + command1 |= SPI_PACKED; ++ else ++ command1 &= ~SPI_PACKED; + + command1 &= ~(SPI_CS_SEL_MASK | SPI_TX_EN | SPI_RX_EN); + tspi->cur_direction = 0; +diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c +index 619c989c5f37..d682907c146a 100644 +--- a/drivers/staging/comedi/drivers/ni_mio_common.c ++++ b/drivers/staging/comedi/drivers/ni_mio_common.c +@@ -4809,7 +4809,10 @@ static int ni_valid_rtsi_output_source(struct comedi_device *dev, + case NI_RTSI_OUTPUT_G_SRC0: + case NI_RTSI_OUTPUT_G_GATE0: + case NI_RTSI_OUTPUT_RGOUT0: +- case NI_RTSI_OUTPUT_RTSI_BRD_0: ++ case NI_RTSI_OUTPUT_RTSI_BRD(0): ++ case NI_RTSI_OUTPUT_RTSI_BRD(1): ++ case NI_RTSI_OUTPUT_RTSI_BRD(2): ++ case NI_RTSI_OUTPUT_RTSI_BRD(3): + return 1; + case NI_RTSI_OUTPUT_RTSI_OSC: + return (devpriv->is_m_series) ? 1 : 0; +@@ -4830,11 +4833,18 @@ static int ni_set_rtsi_routing(struct comedi_device *dev, + devpriv->rtsi_trig_a_output_reg |= NISTC_RTSI_TRIG(chan, src); + ni_stc_writew(dev, devpriv->rtsi_trig_a_output_reg, + NISTC_RTSI_TRIGA_OUT_REG); +- } else if (chan < 8) { ++ } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { + devpriv->rtsi_trig_b_output_reg &= ~NISTC_RTSI_TRIG_MASK(chan); + devpriv->rtsi_trig_b_output_reg |= NISTC_RTSI_TRIG(chan, src); + ni_stc_writew(dev, devpriv->rtsi_trig_b_output_reg, + NISTC_RTSI_TRIGB_OUT_REG); ++ } else if (chan != NISTC_RTSI_TRIG_OLD_CLK_CHAN) { ++ /* probably should never reach this, since the ++ * ni_valid_rtsi_output_source above errors out if chan is too ++ * high ++ */ ++ dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); ++ return -EINVAL; + } + return 2; + } +@@ -4849,12 +4859,12 @@ static unsigned ni_get_rtsi_routing(struct comedi_device *dev, unsigned chan) + } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { + return NISTC_RTSI_TRIG_TO_SRC(chan, + devpriv->rtsi_trig_b_output_reg); +- } else { +- if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) +- return NI_RTSI_OUTPUT_RTSI_OSC; +- dev_err(dev->class_dev, "bug! should never get here?\n"); +- return 0; ++ } else if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) { ++ return NI_RTSI_OUTPUT_RTSI_OSC; + } ++ ++ dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); ++ return -EINVAL; + } + + static int ni_rtsi_insn_config(struct comedi_device *dev, +diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c +index 564828554ca0..07d9384bce94 100644 +--- a/drivers/target/iscsi/iscsi_target.c ++++ b/drivers/target/iscsi/iscsi_target.c +@@ -4309,9 +4309,6 @@ int iscsit_close_connection( + iscsit_stop_nopin_response_timer(conn); + iscsit_stop_nopin_timer(conn); + +- if (conn->conn_transport->iscsit_wait_conn) +- conn->conn_transport->iscsit_wait_conn(conn); +- + /* + * During Connection recovery drop unacknowledged out of order + * commands for this connection, and prepare the other commands +@@ -4397,6 +4394,9 @@ int iscsit_close_connection( + target_sess_cmd_list_set_waiting(sess->se_sess); + target_wait_for_sess_cmds(sess->se_sess); + ++ if (conn->conn_transport->iscsit_wait_conn) ++ conn->conn_transport->iscsit_wait_conn(conn); ++ + if (conn->conn_rx_hash.tfm) + crypto_free_hash(conn->conn_rx_hash.tfm); + if (conn->conn_tx_hash.tfm) +diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c +index 87d87ac1c8a0..96567b4a4f20 100644 +--- a/drivers/thermal/cpu_cooling.c ++++ b/drivers/thermal/cpu_cooling.c +@@ -607,7 +607,7 @@ static int cpufreq_get_requested_power(struct thermal_cooling_device *cdev, + load = 0; + + total_load += load; +- if (trace_thermal_power_cpu_limit_enabled() && load_cpu) ++ if (load_cpu) + load_cpu[i] = load; + + i++; +diff --git a/drivers/tty/ipwireless/hardware.c b/drivers/tty/ipwireless/hardware.c +index ad7031a4f3c4..454cdc6f2c05 100644 +--- a/drivers/tty/ipwireless/hardware.c ++++ b/drivers/tty/ipwireless/hardware.c +@@ -1515,6 +1515,8 @@ static void ipw_send_setup_packet(struct ipw_hardware *hw) + sizeof(struct ipw_setup_get_version_query_packet), + ADDR_SETUP_PROT, TL_PROTOCOLID_SETUP, + TL_SETUP_SIGNO_GET_VERSION_QRY); ++ if (!ver_packet) ++ return; + ver_packet->header.length = sizeof(struct tl_setup_get_version_qry); + + /* +diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c +index 71ad04d54212..1a1d1cfc3704 100644 +--- a/drivers/usb/class/cdc-wdm.c ++++ b/drivers/usb/class/cdc-wdm.c +@@ -1098,7 +1098,7 @@ static int wdm_post_reset(struct usb_interface *intf) + rv = recover_from_urb_loss(desc); + mutex_unlock(&desc->wlock); + mutex_unlock(&desc->rlock); +- return 0; ++ return rv; + } + + static struct usb_driver wdm_driver = { +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 40c95ed6afbf..3ef80c2c0dcc 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -965,7 +965,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + } + port_li = readl(port_array[wIndex] + PORTLI); + status = xhci_get_ext_port_status(temp, port_li); +- put_unaligned_le32(cpu_to_le32(status), &buf[4]); ++ put_unaligned_le32(status, &buf[4]); + } + break; + case SetPortFeature: +diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c +index 4b62eb3b5923..7a82735d5308 100644 +--- a/drivers/vfio/pci/vfio_pci.c ++++ b/drivers/vfio/pci/vfio_pci.c +@@ -496,6 +496,7 @@ static long vfio_pci_ioctl(void *device_data, + { + void __iomem *io; + size_t size; ++ u16 orig_cmd; + + info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index); + info.flags = 0; +@@ -505,15 +506,23 @@ static long vfio_pci_ioctl(void *device_data, + if (!info.size) + break; + +- /* Is it really there? */ ++ /* ++ * Is it really there? Enable memory decode for ++ * implicit access in pci_map_rom(). ++ */ ++ pci_read_config_word(pdev, PCI_COMMAND, &orig_cmd); ++ pci_write_config_word(pdev, PCI_COMMAND, ++ orig_cmd | PCI_COMMAND_MEMORY); ++ + io = pci_map_rom(pdev, &size); +- if (!io || !size) { ++ if (io) { ++ info.flags = VFIO_REGION_INFO_FLAG_READ; ++ pci_unmap_rom(pdev, io); ++ } else { + info.size = 0; +- break; + } +- pci_unmap_rom(pdev, io); + +- info.flags = VFIO_REGION_INFO_FLAG_READ; ++ pci_write_config_word(pdev, PCI_COMMAND, orig_cmd); + break; + } + case VFIO_PCI_VGA_REGION_INDEX: +diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c +index 35fe4825a454..5ef6f9d420a2 100644 +--- a/drivers/video/backlight/lm3630a_bl.c ++++ b/drivers/video/backlight/lm3630a_bl.c +@@ -200,7 +200,7 @@ static int lm3630a_bank_a_update_status(struct backlight_device *bl) + LM3630A_LEDA_ENABLE, LM3630A_LEDA_ENABLE); + if (ret < 0) + goto out_i2c_err; +- return bl->props.brightness; ++ return 0; + + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access\n"); +@@ -277,7 +277,7 @@ static int lm3630a_bank_b_update_status(struct backlight_device *bl) + LM3630A_LEDB_ENABLE, LM3630A_LEDB_ENABLE); + if (ret < 0) + goto out_i2c_err; +- return bl->props.brightness; ++ return 0; + + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); +diff --git a/drivers/video/fbdev/chipsfb.c b/drivers/video/fbdev/chipsfb.c +index 59abdc6a97f6..314b7eceb81c 100644 +--- a/drivers/video/fbdev/chipsfb.c ++++ b/drivers/video/fbdev/chipsfb.c +@@ -350,7 +350,7 @@ static void init_chips(struct fb_info *p, unsigned long addr) + static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) + { + struct fb_info *p; +- unsigned long addr, size; ++ unsigned long addr; + unsigned short cmd; + int rc = -ENODEV; + +@@ -362,7 +362,6 @@ static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) + if ((dp->resource[0].flags & IORESOURCE_MEM) == 0) + goto err_disable; + addr = pci_resource_start(dp, 0); +- size = pci_resource_len(dp, 0); + if (addr == 0) + goto err_disable; + +diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c +index f4e59c445964..17054d695411 100644 +--- a/drivers/xen/cpu_hotplug.c ++++ b/drivers/xen/cpu_hotplug.c +@@ -53,7 +53,7 @@ static int vcpu_online(unsigned int cpu) + } + static void vcpu_hotplug(unsigned int cpu) + { +- if (!cpu_possible(cpu)) ++ if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) + return; + + switch (vcpu_online(cpu)) { +diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c +index 07573dc1614a..3469c7ce7cb6 100644 +--- a/fs/btrfs/inode-map.c ++++ b/fs/btrfs/inode-map.c +@@ -158,6 +158,7 @@ static void start_caching(struct btrfs_root *root) + spin_lock(&root->ino_cache_lock); + root->ino_cache_state = BTRFS_CACHE_FINISHED; + spin_unlock(&root->ino_cache_lock); ++ wake_up(&root->ino_cache_wait); + return; + } + +diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c +index 63108343124a..4bde8acca455 100644 +--- a/fs/cifs/connect.c ++++ b/fs/cifs/connect.c +@@ -939,6 +939,7 @@ cifs_demultiplex_thread(void *p) + mempool_resize(cifs_req_poolp, length + cifs_min_rcv); + + set_freezable(); ++ allow_kernel_signal(SIGKILL); + while (server->tcpStatus != CifsExiting) { + if (try_to_freeze()) + continue; +@@ -2246,7 +2247,7 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect) + + task = xchg(&server->tsk, NULL); + if (task) +- force_sig(SIGKILL, task); ++ send_sig(SIGKILL, task, 1); + } + + static struct TCP_Server_Info * +diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c +index 6599c6124552..01cbdd0987c0 100644 +--- a/fs/exportfs/expfs.c ++++ b/fs/exportfs/expfs.c +@@ -148,6 +148,7 @@ static struct dentry *reconnect_one(struct vfsmount *mnt, + mutex_unlock(&parent->d_inode->i_mutex); + if (IS_ERR(tmp)) { + dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); ++ err = PTR_ERR(tmp); + goto out_err; + } + if (tmp != dentry) { +diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c +index 0dcd33f62637..00f9433eea23 100644 +--- a/fs/ext4/inline.c ++++ b/fs/ext4/inline.c +@@ -1418,7 +1418,7 @@ int htree_inlinedir_to_tree(struct file *dir_file, + err = ext4_htree_store_dirent(dir_file, hinfo->hash, + hinfo->minor_hash, de, &tmp_str); + if (err) { +- count = err; ++ ret = err; + goto out; + } + count++; +diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c +index d595856453b2..de6351c1c8db 100644 +--- a/fs/jfs/jfs_txnmgr.c ++++ b/fs/jfs/jfs_txnmgr.c +@@ -1928,8 +1928,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, + * header ? + */ + if (tlck->type & tlckTRUNCATE) { +- /* This odd declaration suppresses a bogus gcc warning */ +- pxd_t pxd = pxd; /* truncated extent of xad */ ++ pxd_t pxd; /* truncated extent of xad */ + int twm; + + /* +diff --git a/fs/namei.c b/fs/namei.c +index 40049d61ef37..a4ed9c337c21 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -988,7 +988,8 @@ static int may_linkat(struct path *link) + * may_create_in_sticky - Check whether an O_CREAT open in a sticky directory + * should be allowed, or not, on files that already + * exist. +- * @dir: the sticky parent directory ++ * @dir_mode: mode bits of directory ++ * @dir_uid: owner of directory + * @inode: the inode of the file to open + * + * Block an O_CREAT open of a FIFO (or a regular file) when: +@@ -1004,18 +1005,18 @@ static int may_linkat(struct path *link) + * + * Returns 0 if the open is allowed, -ve on error. + */ +-static int may_create_in_sticky(struct dentry * const dir, ++static int may_create_in_sticky(umode_t dir_mode, kuid_t dir_uid, + struct inode * const inode) + { + if ((!sysctl_protected_fifos && S_ISFIFO(inode->i_mode)) || + (!sysctl_protected_regular && S_ISREG(inode->i_mode)) || +- likely(!(dir->d_inode->i_mode & S_ISVTX)) || +- uid_eq(inode->i_uid, dir->d_inode->i_uid) || ++ likely(!(dir_mode & S_ISVTX)) || ++ uid_eq(inode->i_uid, dir_uid) || + uid_eq(current_fsuid(), inode->i_uid)) + return 0; + +- if (likely(dir->d_inode->i_mode & 0002) || +- (dir->d_inode->i_mode & 0020 && ++ if (likely(dir_mode & 0002) || ++ (dir_mode & 0020 && + ((sysctl_protected_fifos >= 2 && S_ISFIFO(inode->i_mode)) || + (sysctl_protected_regular >= 2 && S_ISREG(inode->i_mode))))) { + return -EACCES; +@@ -3059,6 +3060,8 @@ static int do_last(struct nameidata *nd, + int *opened) + { + struct dentry *dir = nd->path.dentry; ++ kuid_t dir_uid = dir->d_inode->i_uid; ++ umode_t dir_mode = dir->d_inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +@@ -3211,7 +3214,7 @@ finish_open: + error = -EISDIR; + if (d_is_dir(nd->path.dentry)) + goto out; +- error = may_create_in_sticky(dir, ++ error = may_create_in_sticky(dir_mode, dir_uid, + d_backing_inode(nd->path.dentry)); + if (unlikely(error)) + goto out; +diff --git a/fs/nfs/super.c b/fs/nfs/super.c +index dced329a8584..47a7751146cf 100644 +--- a/fs/nfs/super.c ++++ b/fs/nfs/super.c +@@ -1901,7 +1901,7 @@ static int nfs_parse_devname(const char *dev_name, + /* kill possible hostname list: not supported */ + comma = strchr(dev_name, ','); + if (comma != NULL && comma < end) +- *comma = 0; ++ len = comma - dev_name; + } + + if (len > maxnamlen) +diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c +index 7795e0d01382..4b94db85b2a0 100644 +--- a/fs/xfs/xfs_quotaops.c ++++ b/fs/xfs/xfs_quotaops.c +@@ -214,6 +214,9 @@ xfs_fs_rm_xquota( + if (XFS_IS_QUOTA_ON(mp)) + return -EINVAL; + ++ if (uflags & ~(FS_USER_QUOTA | FS_GROUP_QUOTA | FS_PROJ_QUOTA)) ++ return -EINVAL; ++ + if (uflags & FS_USER_QUOTA) + flags |= XFS_DQ_USER; + if (uflags & FS_GROUP_QUOTA) +diff --git a/include/asm-generic/rtc.h b/include/asm-generic/rtc.h +index 4e3b6558331e..3e457ae2d571 100644 +--- a/include/asm-generic/rtc.h ++++ b/include/asm-generic/rtc.h +@@ -106,7 +106,7 @@ static inline unsigned int __get_rtc_time(struct rtc_time *time) + time->tm_year += real_year - 72; + #endif + +- if (century) ++ if (century > 20) + time->tm_year += (century - 19) * 100; + + /* +diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h +index 714ce4a5e31f..39d47af6ca7b 100644 +--- a/include/linux/bitmap.h ++++ b/include/linux/bitmap.h +@@ -83,6 +83,14 @@ + * contain all bit positions from 0 to 'bits' - 1. + */ + ++/* ++ * Allocation and deallocation of bitmap. ++ * Provided in lib/bitmap.c to avoid circular dependency. ++ */ ++extern unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags); ++extern unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags); ++extern void bitmap_free(const unsigned long *bitmap); ++ + /* + * lib/bitmap.c provides these functions: + */ +diff --git a/include/linux/device.h b/include/linux/device.h +index 834000903525..eb891c9c4b62 100644 +--- a/include/linux/device.h ++++ b/include/linux/device.h +@@ -677,7 +677,8 @@ extern unsigned long devm_get_free_pages(struct device *dev, + gfp_t gfp_mask, unsigned int order); + extern void devm_free_pages(struct device *dev, unsigned long addr); + +-void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); ++void __iomem *devm_ioremap_resource(struct device *dev, ++ const struct resource *res); + + /* allows to add/remove a custom action to devres stack */ + int devm_add_action(struct device *dev, void (*action)(void *), void *data); +diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h +index 0e1f433cc4b7..378c234ba3e4 100644 +--- a/include/linux/netfilter/ipset/ip_set.h ++++ b/include/linux/netfilter/ipset/ip_set.h +@@ -530,13 +530,6 @@ ip6addrptr(const struct sk_buff *skb, bool src, struct in6_addr *addr) + sizeof(*addr)); + } + +-/* Calculate the bytes required to store the inclusive range of a-b */ +-static inline int +-bitmap_bytes(u32 a, u32 b) +-{ +- return 4 * ((((b - a + 8) / 8) + 3) / 4); +-} +- + #include + #include + +diff --git a/include/linux/platform_data/dma-imx-sdma.h b/include/linux/platform_data/dma-imx-sdma.h +index 2d08816720f6..5bb0a119f39a 100644 +--- a/include/linux/platform_data/dma-imx-sdma.h ++++ b/include/linux/platform_data/dma-imx-sdma.h +@@ -50,7 +50,10 @@ struct sdma_script_start_addrs { + /* End of v2 array */ + s32 zcanfd_2_mcu_addr; + s32 zqspi_2_mcu_addr; ++ s32 mcu_2_ecspi_addr; + /* End of v3 array */ ++ s32 mcu_2_zqspi_addr; ++ /* End of v4 array */ + }; + + /** +diff --git a/include/linux/signal.h b/include/linux/signal.h +index bcc094cb697c..649cd9fc63ca 100644 +--- a/include/linux/signal.h ++++ b/include/linux/signal.h +@@ -313,6 +313,9 @@ extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping); + extern void exit_signals(struct task_struct *tsk); + extern void kernel_sigaction(int, __sighandler_t); + ++#define SIG_KTHREAD ((__force __sighandler_t)2) ++#define SIG_KTHREAD_KERNEL ((__force __sighandler_t)3) ++ + static inline void allow_signal(int sig) + { + /* +@@ -320,7 +323,17 @@ static inline void allow_signal(int sig) + * know it'll be handled, so that they don't get converted to + * SIGKILL or just silently dropped. + */ +- kernel_sigaction(sig, (__force __sighandler_t)2); ++ kernel_sigaction(sig, SIG_KTHREAD); ++} ++ ++static inline void allow_kernel_signal(int sig) ++{ ++ /* ++ * Kernel threads handle their own signals. Let the signal code ++ * know signals sent by the kernel will be handled, so that they ++ * don't get silently dropped. ++ */ ++ kernel_sigaction(sig, SIG_KTHREAD_KERNEL); + } + + static inline void disallow_signal(int sig) +diff --git a/include/media/davinci/vpbe.h b/include/media/davinci/vpbe.h +index 4376beeb28c2..5d8ceeddc797 100644 +--- a/include/media/davinci/vpbe.h ++++ b/include/media/davinci/vpbe.h +@@ -96,7 +96,7 @@ struct vpbe_config { + struct encoder_config_info *ext_encoders; + /* amplifier information goes here */ + struct amp_config_info *amp; +- int num_outputs; ++ unsigned int num_outputs; + /* Order is venc outputs followed by LCD and then external encoders */ + struct vpbe_output *outputs; + }; +diff --git a/include/trace/events/xen.h b/include/trace/events/xen.h +index d6be935caa50..ecd1a0f7bd3e 100644 +--- a/include/trace/events/xen.h ++++ b/include/trace/events/xen.h +@@ -63,7 +63,11 @@ TRACE_EVENT(xen_mc_callback, + TP_PROTO(xen_mc_callback_fn_t fn, void *data), + TP_ARGS(fn, data), + TP_STRUCT__entry( +- __field(xen_mc_callback_fn_t, fn) ++ /* ++ * Use field_struct to avoid is_signed_type() ++ * comparison of a function pointer. ++ */ ++ __field_struct(xen_mc_callback_fn_t, fn) + __field(void *, data) + ), + TP_fast_assign( +diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c +index ebc52c7bd8a6..cba287a5c976 100644 +--- a/kernel/debug/kdb/kdb_main.c ++++ b/kernel/debug/kdb/kdb_main.c +@@ -2632,7 +2632,7 @@ static int kdb_per_cpu(int argc, const char **argv) + diag = kdbgetularg(argv[3], &whichcpu); + if (diag) + return diag; +- if (!cpu_online(whichcpu)) { ++ if (whichcpu >= nr_cpu_ids || !cpu_online(whichcpu)) { + kdb_printf("cpu %ld is not online\n", whichcpu); + return KDB_BADCPUNUM; + } +diff --git a/kernel/signal.c b/kernel/signal.c +index 3095b2309876..7e4a4b199a11 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -79,6 +79,11 @@ static int sig_task_ignored(struct task_struct *t, int sig, bool force) + handler == SIG_DFL && !(force && sig_kernel_only(sig))) + return 1; + ++ /* Only allow kernel generated signals to this kthread */ ++ if (unlikely((t->flags & PF_KTHREAD) && ++ (handler == SIG_KTHREAD_KERNEL) && !force)) ++ return true; ++ + return sig_handler_ignored(handler, sig); + } + +diff --git a/lib/bitmap.c b/lib/bitmap.c +index 814814397cce..bdf572d09b8f 100644 +--- a/lib/bitmap.c ++++ b/lib/bitmap.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -1081,3 +1082,22 @@ void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int n + } + EXPORT_SYMBOL(bitmap_copy_le); + #endif ++ ++unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags) ++{ ++ return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long), ++ flags); ++} ++EXPORT_SYMBOL(bitmap_alloc); ++ ++unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags) ++{ ++ return bitmap_alloc(nbits, flags | __GFP_ZERO); ++} ++EXPORT_SYMBOL(bitmap_zalloc); ++ ++void bitmap_free(const unsigned long *bitmap) ++{ ++ kfree(bitmap); ++} ++EXPORT_SYMBOL(bitmap_free); +diff --git a/lib/devres.c b/lib/devres.c +index 8c85672639d3..9d18ccd00df5 100644 +--- a/lib/devres.c ++++ b/lib/devres.c +@@ -131,7 +131,8 @@ EXPORT_SYMBOL(devm_iounmap); + * if (IS_ERR(base)) + * return PTR_ERR(base); + */ +-void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) ++void __iomem *devm_ioremap_resource(struct device *dev, ++ const struct resource *res) + { + resource_size_t size; + const char *name; +diff --git a/lib/kfifo.c b/lib/kfifo.c +index 90ba1eb1df06..a94227c55551 100644 +--- a/lib/kfifo.c ++++ b/lib/kfifo.c +@@ -82,7 +82,8 @@ int __kfifo_init(struct __kfifo *fifo, void *buffer, + { + size /= esize; + +- size = roundup_pow_of_two(size); ++ if (!is_power_of_2(size)) ++ size = rounddown_pow_of_two(size); + + fifo->in = 0; + fifo->out = 0; +diff --git a/net/6lowpan/nhc.c b/net/6lowpan/nhc.c +index 7008d53e455c..e61679bf0908 100644 +--- a/net/6lowpan/nhc.c ++++ b/net/6lowpan/nhc.c +@@ -18,7 +18,7 @@ + #include "nhc.h" + + static struct rb_root rb_root = RB_ROOT; +-static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX]; ++static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX + 1]; + static DEFINE_SPINLOCK(lowpan_nhc_lock); + + static int lowpan_nhc_insert(struct lowpan_nhc *nhc) +diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c +index fd1af7cb960d..e7c170949b21 100644 +--- a/net/bridge/netfilter/ebtables.c ++++ b/net/bridge/netfilter/ebtables.c +@@ -2174,7 +2174,9 @@ static int compat_copy_entries(unsigned char *data, unsigned int size_user, + if (ret < 0) + return ret; + +- WARN_ON(size_remaining); ++ if (size_remaining) ++ return -EINVAL; ++ + return state->buf_kern_offset; + } + +diff --git a/net/core/neighbour.c b/net/core/neighbour.c +index af1ecd0e7b07..9849f1f4cf4f 100644 +--- a/net/core/neighbour.c ++++ b/net/core/neighbour.c +@@ -1837,8 +1837,8 @@ static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl, + goto nla_put_failure; + { + unsigned long now = jiffies; +- unsigned int flush_delta = now - tbl->last_flush; +- unsigned int rand_delta = now - tbl->last_rand; ++ long flush_delta = now - tbl->last_flush; ++ long rand_delta = now - tbl->last_rand; + struct neigh_hash_table *nht; + struct ndt_config ndc = { + .ndtc_key_len = tbl->key_len, +diff --git a/net/ieee802154/6lowpan/reassembly.c b/net/ieee802154/6lowpan/reassembly.c +index 6183730d38db..e728dae467c3 100644 +--- a/net/ieee802154/6lowpan/reassembly.c ++++ b/net/ieee802154/6lowpan/reassembly.c +@@ -634,7 +634,7 @@ err_sysctl: + + void lowpan_net_frag_exit(void) + { +- inet_frags_fini(&lowpan_frags); + lowpan_frags_sysctl_unregister(); + unregister_pernet_subsys(&lowpan_frags_ops); ++ inet_frags_fini(&lowpan_frags); + } +diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c +index 91ae061d46ac..e598aa14f167 100644 +--- a/net/ipv4/ip_tunnel.c ++++ b/net/ipv4/ip_tunnel.c +@@ -1151,10 +1151,8 @@ int ip_tunnel_init(struct net_device *dev) + iph->version = 4; + iph->ihl = 5; + +- if (tunnel->collect_md) { +- dev->features |= NETIF_F_NETNS_LOCAL; ++ if (tunnel->collect_md) + netif_keep_dst(dev); +- } + return 0; + } + EXPORT_SYMBOL_GPL(ip_tunnel_init); +diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c +index ec917f58d105..17e9ed2edb86 100644 +--- a/net/ipv6/reassembly.c ++++ b/net/ipv6/reassembly.c +@@ -774,8 +774,8 @@ err_protocol: + + void ipv6_frag_exit(void) + { +- inet_frags_fini(&ip6_frags); + ip6_frags_sysctl_unregister(); + unregister_pernet_subsys(&ip6_frags_ops); + inet6_del_protocol(&frag_protocol, IPPROTO_FRAGMENT); ++ inet_frags_fini(&ip6_frags); + } +diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c +index 5984cc35d508..3edffb7bf2a4 100644 +--- a/net/iucv/af_iucv.c ++++ b/net/iucv/af_iucv.c +@@ -2392,6 +2392,13 @@ out: + return err; + } + ++static void afiucv_iucv_exit(void) ++{ ++ device_unregister(af_iucv_dev); ++ driver_unregister(&af_iucv_driver); ++ pr_iucv->iucv_unregister(&af_iucv_handler, 0); ++} ++ + static int __init afiucv_init(void) + { + int err; +@@ -2425,11 +2432,18 @@ static int __init afiucv_init(void) + err = afiucv_iucv_init(); + if (err) + goto out_sock; +- } else +- register_netdevice_notifier(&afiucv_netdev_notifier); ++ } ++ ++ err = register_netdevice_notifier(&afiucv_netdev_notifier); ++ if (err) ++ goto out_notifier; ++ + dev_add_pack(&iucv_packet_type); + return 0; + ++out_notifier: ++ if (pr_iucv) ++ afiucv_iucv_exit(); + out_sock: + sock_unregister(PF_IUCV); + out_proto: +@@ -2443,12 +2457,11 @@ out: + static void __exit afiucv_exit(void) + { + if (pr_iucv) { +- device_unregister(af_iucv_dev); +- driver_unregister(&af_iucv_driver); +- pr_iucv->iucv_unregister(&af_iucv_handler, 0); ++ afiucv_iucv_exit(); + symbol_put(iucv_if); +- } else +- unregister_netdevice_notifier(&afiucv_netdev_notifier); ++ } ++ ++ unregister_netdevice_notifier(&afiucv_netdev_notifier); + dev_remove_pack(&iucv_packet_type); + sock_unregister(PF_IUCV); + proto_unregister(&iucv_proto); +diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c +index c153fc2883a8..69f1558dfcb7 100644 +--- a/net/llc/af_llc.c ++++ b/net/llc/af_llc.c +@@ -111,22 +111,26 @@ static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr) + * + * Send data via reliable llc2 connection. + * Returns 0 upon success, non-zero if action did not succeed. ++ * ++ * This function always consumes a reference to the skb. + */ + static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock) + { + struct llc_sock* llc = llc_sk(sk); +- int rc = 0; + + if (unlikely(llc_data_accept_state(llc->state) || + llc->remote_busy_flag || + llc->p_flag)) { + long timeout = sock_sndtimeo(sk, noblock); ++ int rc; + + rc = llc_ui_wait_for_busy_core(sk, timeout); ++ if (rc) { ++ kfree_skb(skb); ++ return rc; ++ } + } +- if (unlikely(!rc)) +- rc = llc_build_and_send_pkt(sk, skb); +- return rc; ++ return llc_build_and_send_pkt(sk, skb); + } + + static void llc_ui_sk_init(struct socket *sock, struct sock *sk) +@@ -896,7 +900,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name); + int flags = msg->msg_flags; + int noblock = flags & MSG_DONTWAIT; +- struct sk_buff *skb; ++ struct sk_buff *skb = NULL; + size_t size = 0; + int rc = -EINVAL, copied = 0, hdrlen; + +@@ -905,10 +909,10 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + lock_sock(sk); + if (addr) { + if (msg->msg_namelen < sizeof(*addr)) +- goto release; ++ goto out; + } else { + if (llc_ui_addr_null(&llc->addr)) +- goto release; ++ goto out; + addr = &llc->addr; + } + /* must bind connection to sap if user hasn't done it. */ +@@ -916,7 +920,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + /* bind to sap with null dev, exclusive. */ + rc = llc_ui_autobind(sock, addr); + if (rc) +- goto release; ++ goto out; + } + hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr); + size = hdrlen + len; +@@ -925,12 +929,12 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + copied = size - hdrlen; + rc = -EINVAL; + if (copied < 0) +- goto release; ++ goto out; + release_sock(sk); + skb = sock_alloc_send_skb(sk, size, noblock, &rc); + lock_sock(sk); + if (!skb) +- goto release; ++ goto out; + skb->dev = llc->dev; + skb->protocol = llc_proto_type(addr->sllc_arphrd); + skb_reserve(skb, hdrlen); +@@ -940,29 +944,31 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) { + llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + if (addr->sllc_test) { + llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + if (addr->sllc_xid) { + llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + rc = -ENOPROTOOPT; + if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua)) + goto out; + rc = llc_ui_send_data(sk, skb, noblock); ++ skb = NULL; + out: +- if (rc) { +- kfree_skb(skb); +-release: ++ kfree_skb(skb); ++ if (rc) + dprintk("%s: failed sending from %02X to %02X: %d\n", + __func__, llc->laddr.lsap, llc->daddr.lsap, rc); +- } + release_sock(sk); + return rc ? : copied; + } +diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c +index d861b74ad068..3b002ab68b29 100644 +--- a/net/llc/llc_conn.c ++++ b/net/llc/llc_conn.c +@@ -55,6 +55,8 @@ int sysctl_llc2_busy_timeout = LLC2_BUSY_TIME * HZ; + * (executing it's actions and changing state), upper layer will be + * indicated or confirmed, if needed. Returns 0 for success, 1 for + * failure. The socket lock has to be held before calling this function. ++ * ++ * This function always consumes a reference to the skb. + */ + int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + { +@@ -62,12 +64,6 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + struct llc_sock *llc = llc_sk(skb->sk); + struct llc_conn_state_ev *ev = llc_conn_ev(skb); + +- /* +- * We have to hold the skb, because llc_conn_service will kfree it in +- * the sending path and we need to look at the skb->cb, where we encode +- * llc_conn_state_ev. +- */ +- skb_get(skb); + ev->ind_prim = ev->cfm_prim = 0; + /* + * Send event to state machine +@@ -75,21 +71,12 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + rc = llc_conn_service(skb->sk, skb); + if (unlikely(rc != 0)) { + printk(KERN_ERR "%s: llc_conn_service failed\n", __func__); +- goto out_kfree_skb; +- } +- +- if (unlikely(!ev->ind_prim && !ev->cfm_prim)) { +- /* indicate or confirm not required */ +- if (!skb->next) +- goto out_kfree_skb; + goto out_skb_put; + } + +- if (unlikely(ev->ind_prim && ev->cfm_prim)) /* Paranoia */ +- skb_get(skb); +- + switch (ev->ind_prim) { + case LLC_DATA_PRIM: ++ skb_get(skb); + llc_save_primitive(sk, skb, LLC_DATA_PRIM); + if (unlikely(sock_queue_rcv_skb(sk, skb))) { + /* +@@ -106,6 +93,7 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + * skb->sk pointing to the newly created struct sock in + * llc_conn_handler. -acme + */ ++ skb_get(skb); + skb_queue_tail(&sk->sk_receive_queue, skb); + sk->sk_state_change(sk); + break; +@@ -121,7 +109,6 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + sk->sk_state_change(sk); + } + } +- kfree_skb(skb); + sock_put(sk); + break; + case LLC_RESET_PRIM: +@@ -130,14 +117,11 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + * RESET is not being notified to upper layers for now + */ + printk(KERN_INFO "%s: received a reset ind!\n", __func__); +- kfree_skb(skb); + break; + default: +- if (ev->ind_prim) { ++ if (ev->ind_prim) + printk(KERN_INFO "%s: received unknown %d prim!\n", + __func__, ev->ind_prim); +- kfree_skb(skb); +- } + /* No indication */ + break; + } +@@ -179,15 +163,12 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + printk(KERN_INFO "%s: received a reset conf!\n", __func__); + break; + default: +- if (ev->cfm_prim) { ++ if (ev->cfm_prim) + printk(KERN_INFO "%s: received unknown %d prim!\n", + __func__, ev->cfm_prim); +- break; +- } +- goto out_skb_put; /* No confirmation */ ++ /* No confirmation */ ++ break; + } +-out_kfree_skb: +- kfree_skb(skb); + out_skb_put: + kfree_skb(skb); + return rc; +diff --git a/net/llc/llc_if.c b/net/llc/llc_if.c +index 6daf391b3e84..fc4d2bd8816f 100644 +--- a/net/llc/llc_if.c ++++ b/net/llc/llc_if.c +@@ -38,6 +38,8 @@ + * closed and -EBUSY when sending data is not permitted in this state or + * LLC has send an I pdu with p bit set to 1 and is waiting for it's + * response. ++ * ++ * This function always consumes a reference to the skb. + */ + int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) + { +@@ -46,20 +48,22 @@ int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) + struct llc_sock *llc = llc_sk(sk); + + if (unlikely(llc->state == LLC_CONN_STATE_ADM)) +- goto out; ++ goto out_free; + rc = -EBUSY; + if (unlikely(llc_data_accept_state(llc->state) || /* data_conn_refuse */ + llc->p_flag)) { + llc->failed_data_req = 1; +- goto out; ++ goto out_free; + } + ev = llc_conn_ev(skb); + ev->type = LLC_CONN_EV_TYPE_PRIM; + ev->prim = LLC_DATA_PRIM; + ev->prim_type = LLC_PRIM_TYPE_REQ; + skb->dev = llc->dev; +- rc = llc_conn_state_process(sk, skb); +-out: ++ return llc_conn_state_process(sk, skb); ++ ++out_free: ++ kfree_skb(skb); + return rc; + } + +diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c +index ff3b28e7dbce..fb44f0107da1 100644 +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -546,7 +546,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) + + /* (re)Initialize group rate indexes */ + for(j = 0; j < MAX_THR_RATES; j++) +- tmp_group_tp_rate[j] = group; ++ tmp_group_tp_rate[j] = MCS_GROUP_RATES * group; + + for (i = 0; i < MCS_GROUP_RATES; i++) { + if (!(mg->supported & BIT(i))) +diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c +index 3b8e2f97d815..2b7975c4dac7 100644 +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -3040,9 +3040,18 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) + case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP): + /* process for all: mesh, mlme, ibss */ + break; ++ case cpu_to_le16(IEEE80211_STYPE_DEAUTH): ++ if (is_multicast_ether_addr(mgmt->da) && ++ !is_broadcast_ether_addr(mgmt->da)) ++ return RX_DROP_MONITOR; ++ ++ /* process only for station/IBSS */ ++ if (sdata->vif.type != NL80211_IFTYPE_STATION && ++ sdata->vif.type != NL80211_IFTYPE_ADHOC) ++ return RX_DROP_MONITOR; ++ break; + case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): + case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): +- case cpu_to_le16(IEEE80211_STYPE_DEAUTH): + case cpu_to_le16(IEEE80211_STYPE_DISASSOC): + if (is_multicast_ether_addr(mgmt->da) && + !is_broadcast_ether_addr(mgmt->da)) +diff --git a/net/netfilter/ipset/ip_set_bitmap_gen.h b/net/netfilter/ipset/ip_set_bitmap_gen.h +index adc703ccd68b..7d08a170ac27 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_gen.h ++++ b/net/netfilter/ipset/ip_set_bitmap_gen.h +@@ -81,7 +81,7 @@ mtype_flush(struct ip_set *set) + + if (set->extensions & IPSET_EXT_DESTROY) + mtype_ext_cleanup(set); +- memset(map->members, 0, map->memsize); ++ bitmap_zero(map->members, map->elements); + } + + static int +diff --git a/net/netfilter/ipset/ip_set_bitmap_ip.c b/net/netfilter/ipset/ip_set_bitmap_ip.c +index 4783efff0bde..a4c104a4977f 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_ip.c ++++ b/net/netfilter/ipset/ip_set_bitmap_ip.c +@@ -40,7 +40,7 @@ MODULE_ALIAS("ip_set_bitmap:ip"); + + /* Type structure */ + struct bitmap_ip { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -222,7 +222,7 @@ init_map_ip(struct ip_set *set, struct bitmap_ip *map, + u32 first_ip, u32 last_ip, + u32 elements, u32 hosts, u8 netmask) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_ip = first_ip; +@@ -315,7 +315,7 @@ bitmap_ip_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + if (!map) + return -ENOMEM; + +- map->memsize = bitmap_bytes(0, elements - 1); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_ip; + if (!init_map_ip(set, map, first_ip, last_ip, + elements, hosts, netmask)) { +diff --git a/net/netfilter/ipset/ip_set_bitmap_ipmac.c b/net/netfilter/ipset/ip_set_bitmap_ipmac.c +index 29dde208381d..0e961690510d 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_ipmac.c ++++ b/net/netfilter/ipset/ip_set_bitmap_ipmac.c +@@ -46,7 +46,7 @@ enum { + + /* Type structure */ + struct bitmap_ipmac { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -297,7 +297,7 @@ static bool + init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map, + u32 first_ip, u32 last_ip, u32 elements) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_ip = first_ip; +@@ -361,7 +361,7 @@ bitmap_ipmac_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + if (!map) + return -ENOMEM; + +- map->memsize = bitmap_bytes(0, elements - 1); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_ipmac; + if (!init_map_ipmac(set, map, first_ip, last_ip, elements)) { + kfree(map); +diff --git a/net/netfilter/ipset/ip_set_bitmap_port.c b/net/netfilter/ipset/ip_set_bitmap_port.c +index 7f0c733358a4..6771b362a123 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_port.c ++++ b/net/netfilter/ipset/ip_set_bitmap_port.c +@@ -34,7 +34,7 @@ MODULE_ALIAS("ip_set_bitmap:port"); + + /* Type structure */ + struct bitmap_port { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u16 first_port; /* host byte order, included in range */ + u16 last_port; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -207,7 +207,7 @@ static bool + init_map_port(struct ip_set *set, struct bitmap_port *map, + u16 first_port, u16 last_port) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(map->elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_port = first_port; +@@ -250,7 +250,7 @@ bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + return -ENOMEM; + + map->elements = elements; +- map->memsize = bitmap_bytes(0, map->elements); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_port; + if (!init_map_port(set, map, first_port, last_port)) { + kfree(map); +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c +index 8b277658905f..eac6f7eea7b5 100644 +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -1332,15 +1332,21 @@ static void packet_sock_destruct(struct sock *sk) + + static bool fanout_flow_is_huge(struct packet_sock *po, struct sk_buff *skb) + { +- u32 rxhash; ++ u32 *history = po->rollover->history; ++ u32 victim, rxhash; + int i, count = 0; + + rxhash = skb_get_hash(skb); + for (i = 0; i < ROLLOVER_HLEN; i++) +- if (po->rollover->history[i] == rxhash) ++ if (READ_ONCE(history[i]) == rxhash) + count++; + +- po->rollover->history[prandom_u32() % ROLLOVER_HLEN] = rxhash; ++ victim = prandom_u32() % ROLLOVER_HLEN; ++ ++ /* Avoid dirtying the cache line if possible */ ++ if (READ_ONCE(history[victim]) != rxhash) ++ WRITE_ONCE(history[victim], rxhash); ++ + return count > (ROLLOVER_HLEN >> 1); + } + +@@ -3309,20 +3315,29 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, + sock_recv_ts_and_drops(msg, sk, skb); + + if (msg->msg_name) { ++ int copy_len; ++ + /* If the address length field is there to be filled + * in, we fill it in now. + */ + if (sock->type == SOCK_PACKET) { + __sockaddr_check_size(sizeof(struct sockaddr_pkt)); + msg->msg_namelen = sizeof(struct sockaddr_pkt); ++ copy_len = msg->msg_namelen; + } else { + struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; + + msg->msg_namelen = sll->sll_halen + + offsetof(struct sockaddr_ll, sll_addr); ++ copy_len = msg->msg_namelen; ++ if (msg->msg_namelen < sizeof(struct sockaddr_ll)) { ++ memset(msg->msg_name + ++ offsetof(struct sockaddr_ll, sll_addr), ++ 0, sizeof(sll->sll_addr)); ++ msg->msg_namelen = sizeof(struct sockaddr_ll); ++ } + } +- memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, +- msg->msg_namelen); ++ memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, copy_len); + } + + if (pkt_sk(sk)->auxdata) { +diff --git a/net/rds/ib_stats.c b/net/rds/ib_stats.c +index d77e04473056..a88460058185 100644 +--- a/net/rds/ib_stats.c ++++ b/net/rds/ib_stats.c +@@ -42,7 +42,7 @@ DEFINE_PER_CPU_SHARED_ALIGNED(struct rds_ib_statistics, rds_ib_stats); + static const char *const rds_ib_stat_names[] = { + "ib_connect_raced", + "ib_listen_closed_stale", +- "s_ib_evt_handler_call", ++ "ib_evt_handler_call", + "ib_tasklet_call", + "ib_tx_cq_event", + "ib_tx_ring_full", +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index fbb7ebfc58c6..b0b04b3c0896 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -267,12 +267,12 @@ static int tcf_em_validate(struct tcf_proto *tp, + } + em->data = (unsigned long) v; + } ++ em->datalen = data_len; + } + } + + em->matchid = em_hdr->matchid; + em->flags = em_hdr->flags; +- em->datalen = data_len; + em->net = net; + + err = 0; +diff --git a/net/tipc/sysctl.c b/net/tipc/sysctl.c +index 1a779b1e8510..40f6d82083d7 100644 +--- a/net/tipc/sysctl.c ++++ b/net/tipc/sysctl.c +@@ -37,6 +37,8 @@ + + #include + ++static int zero; ++static int one = 1; + static struct ctl_table_header *tipc_ctl_hdr; + + static struct ctl_table tipc_table[] = { +@@ -45,14 +47,16 @@ static struct ctl_table tipc_table[] = { + .data = &sysctl_tipc_rmem, + .maxlen = sizeof(sysctl_tipc_rmem), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ .proc_handler = proc_dointvec_minmax, ++ .extra1 = &one, + }, + { + .procname = "named_timeout", + .data = &sysctl_tipc_named_timeout, + .maxlen = sizeof(sysctl_tipc_named_timeout), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ .proc_handler = proc_dointvec_minmax, ++ .extra1 = &zero, + }, + {} + }; +diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c +index f330475a87ff..f9fb8613fb28 100644 +--- a/net/x25/af_x25.c ++++ b/net/x25/af_x25.c +@@ -764,6 +764,10 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, + if (sk->sk_state == TCP_ESTABLISHED) + goto out; + ++ rc = -EALREADY; /* Do nothing if call is already in progress */ ++ if (sk->sk_state == TCP_SYN_SENT) ++ goto out; ++ + sk->sk_state = TCP_CLOSE; + sock->state = SS_UNCONNECTED; + +@@ -810,7 +814,7 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, + /* Now the loop */ + rc = -EINPROGRESS; + if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) +- goto out_put_neigh; ++ goto out; + + rc = x25_wait_for_connection_establishment(sk); + if (rc) +diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c +index 42396a74405d..7250fb38350c 100644 +--- a/scripts/recordmcount.c ++++ b/scripts/recordmcount.c +@@ -53,6 +53,10 @@ + #define R_AARCH64_ABS64 257 + #endif + ++#define R_ARM_PC24 1 ++#define R_ARM_THM_CALL 10 ++#define R_ARM_CALL 28 ++ + static int fd_map; /* File descriptor for file being modified. */ + static int mmap_failed; /* Boolean flag. */ + static char gpfx; /* prefix for global symbol name (sometimes '_') */ +@@ -372,6 +376,18 @@ is_mcounted_section_name(char const *const txtname) + #define RECORD_MCOUNT_64 + #include "recordmcount.h" + ++static int arm_is_fake_mcount(Elf32_Rel const *rp) ++{ ++ switch (ELF32_R_TYPE(w(rp->r_info))) { ++ case R_ARM_THM_CALL: ++ case R_ARM_CALL: ++ case R_ARM_PC24: ++ return 0; ++ } ++ ++ return 1; ++} ++ + /* 64-bit EM_MIPS has weird ELF64_Rela.r_info. + * http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf + * We interpret Table 29 Relocation Operation (Elf64_Rel, Elf64_Rela) [p.40] +@@ -461,6 +477,7 @@ do_file(char const *const fname) + break; + case EM_ARM: reltype = R_ARM_ABS32; + altmcount = "__gnu_mcount_nc"; ++ is_fake_mcount32 = arm_is_fake_mcount; + break; + case EM_AARCH64: + reltype = R_AARCH64_ABS64; +diff --git a/sound/aoa/codecs/onyx.c b/sound/aoa/codecs/onyx.c +index a04edff8b729..ae50d59fb810 100644 +--- a/sound/aoa/codecs/onyx.c ++++ b/sound/aoa/codecs/onyx.c +@@ -74,8 +74,10 @@ static int onyx_read_register(struct onyx *onyx, u8 reg, u8 *value) + return 0; + } + v = i2c_smbus_read_byte_data(onyx->i2c, reg); +- if (v < 0) ++ if (v < 0) { ++ *value = 0; + return -1; ++ } + *value = (u8)v; + onyx->cache[ONYX_REG_CONTROL-FIRSTREGISTER] = *value; + return 0; +diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h +index 55ec4470f6b6..499873d29cc1 100644 +--- a/sound/pci/hda/hda_controller.h ++++ b/sound/pci/hda/hda_controller.h +@@ -164,11 +164,10 @@ struct azx { + #define azx_bus(chip) (&(chip)->bus.core) + #define bus_to_azx(_bus) container_of(_bus, struct azx, bus.core) + +-#ifdef CONFIG_X86 +-#define azx_snoop(chip) ((chip)->snoop) +-#else +-#define azx_snoop(chip) true +-#endif ++static inline bool azx_snoop(struct azx *chip) ++{ ++ return !IS_ENABLED(CONFIG_X86) || chip->snoop; ++} + + /* + * macros for easy use +diff --git a/sound/soc/codecs/cs4349.c b/sound/soc/codecs/cs4349.c +index 0ac8fc5ed4ae..9ebd500ecf38 100644 +--- a/sound/soc/codecs/cs4349.c ++++ b/sound/soc/codecs/cs4349.c +@@ -379,6 +379,7 @@ static struct i2c_driver cs4349_i2c_driver = { + .driver = { + .name = "cs4349", + .of_match_table = cs4349_of_match, ++ .pm = &cs4349_runtime_pm, + }, + .id_table = cs4349_i2c_id, + .probe = cs4349_i2c_probe, +diff --git a/sound/soc/codecs/es8328.c b/sound/soc/codecs/es8328.c +index afa6c5db9dcc..2bf30d0eb82f 100644 +--- a/sound/soc/codecs/es8328.c ++++ b/sound/soc/codecs/es8328.c +@@ -210,7 +210,7 @@ static const struct soc_enum es8328_rline_enum = + ARRAY_SIZE(es8328_line_texts), + es8328_line_texts); + static const struct snd_kcontrol_new es8328_right_line_controls = +- SOC_DAPM_ENUM("Route", es8328_lline_enum); ++ SOC_DAPM_ENUM("Route", es8328_rline_enum); + + /* Left Mixer */ + static const struct snd_kcontrol_new es8328_left_mixer_controls[] = { +diff --git a/sound/soc/codecs/wm8737.c b/sound/soc/codecs/wm8737.c +index e7807601e675..ae69cb790ac3 100644 +--- a/sound/soc/codecs/wm8737.c ++++ b/sound/soc/codecs/wm8737.c +@@ -170,7 +170,7 @@ SOC_DOUBLE("Polarity Invert Switch", WM8737_ADC_CONTROL, 5, 6, 1, 0), + SOC_SINGLE("3D Switch", WM8737_3D_ENHANCE, 0, 1, 0), + SOC_SINGLE("3D Depth", WM8737_3D_ENHANCE, 1, 15, 0), + SOC_ENUM("3D Low Cut-off", low_3d), +-SOC_ENUM("3D High Cut-off", low_3d), ++SOC_ENUM("3D High Cut-off", high_3d), + SOC_SINGLE_TLV("3D ADC Volume", WM8737_3D_ENHANCE, 7, 1, 1, adc_tlv), + + SOC_SINGLE("Noise Gate Switch", WM8737_NOISE_GATE, 0, 1, 0), +diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c +index 2f7be6cee98e..fc0a73227b02 100644 +--- a/sound/soc/davinci/davinci-mcasp.c ++++ b/sound/soc/davinci/davinci-mcasp.c +@@ -875,14 +875,13 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream, + active_slots = hweight32(mcasp->tdm_mask[stream]); + active_serializers = (channels + active_slots - 1) / + active_slots; +- if (active_serializers == 1) { ++ if (active_serializers == 1) + active_slots = channels; +- for (i = 0; i < total_slots; i++) { +- if ((1 << i) & mcasp->tdm_mask[stream]) { +- mask |= (1 << i); +- if (--active_slots <= 0) +- break; +- } ++ for (i = 0; i < total_slots; i++) { ++ if ((1 << i) & mcasp->tdm_mask[stream]) { ++ mask |= (1 << i); ++ if (--active_slots <= 0) ++ break; + } + } + } else { +diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c +index 8e525f7ac08d..3d99a8579c99 100644 +--- a/sound/soc/fsl/imx-sgtl5000.c ++++ b/sound/soc/fsl/imx-sgtl5000.c +@@ -119,7 +119,8 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) + codec_dev = of_find_i2c_device_by_node(codec_np); + if (!codec_dev) { + dev_err(&pdev->dev, "failed to find codec platform device\n"); +- return -EPROBE_DEFER; ++ ret = -EPROBE_DEFER; ++ goto fail; + } + + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); +diff --git a/sound/soc/qcom/apq8016_sbc.c b/sound/soc/qcom/apq8016_sbc.c +index 1efdf0088ecd..886f2027e671 100644 +--- a/sound/soc/qcom/apq8016_sbc.c ++++ b/sound/soc/qcom/apq8016_sbc.c +@@ -98,13 +98,15 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + + if (!cpu || !codec) { + dev_err(dev, "Can't find cpu/codec DT node\n"); +- return ERR_PTR(-EINVAL); ++ ret = -EINVAL; ++ goto error; + } + + link->cpu_of_node = of_parse_phandle(cpu, "sound-dai", 0); + if (!link->cpu_of_node) { + dev_err(card->dev, "error getting cpu phandle\n"); +- return ERR_PTR(-EINVAL); ++ ret = -EINVAL; ++ goto error; + } + + link->codec_of_node = of_parse_phandle(codec, "sound-dai", 0); +@@ -116,13 +118,13 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name); + if (ret) { + dev_err(card->dev, "error getting cpu dai name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + ret = snd_soc_of_get_dai_name(codec, &link->codec_dai_name); + if (ret) { + dev_err(card->dev, "error getting codec dai name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + link->platform_of_node = link->cpu_of_node; +@@ -132,15 +134,24 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + ret = of_property_read_string(np, "link-name", &link->name); + if (ret) { + dev_err(card->dev, "error getting codec dai_link name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + link->stream_name = link->name; + link->init = apq8016_sbc_dai_init; + link++; ++ ++ of_node_put(cpu); ++ of_node_put(codec); + } + + return data; ++ ++ error: ++ of_node_put(np); ++ of_node_put(cpu); ++ of_node_put(codec); ++ return ERR_PTR(ret); + } + + static int apq8016_sbc_platform_probe(struct platform_device *pdev) +diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c +index 78813057167d..dbdea1975f90 100644 +--- a/sound/soc/soc-pcm.c ++++ b/sound/soc/soc-pcm.c +@@ -48,8 +48,8 @@ static bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream) + else + codec_stream = &dai->driver->capture; + +- /* If the codec specifies any rate at all, it supports the stream. */ +- return codec_stream->rates; ++ /* If the codec specifies any channels at all, it supports the stream */ ++ return codec_stream->channels_min; + } + + /** +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 1b81f18010d2..73149b9be29c 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -2552,7 +2552,9 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, + (err = snd_usb_mixer_status_create(mixer)) < 0) + goto _error; + +- snd_usb_mixer_apply_create_quirk(mixer); ++ err = snd_usb_mixer_apply_create_quirk(mixer); ++ if (err < 0) ++ goto _error; + + err = snd_device_new(chip->card, SNDRV_DEV_CODEC, mixer, &dev_ops); + if (err < 0) +diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h +index d32727c74a16..c892b4d1e733 100644 +--- a/sound/usb/quirks-table.h ++++ b/sound/usb/quirks-table.h +@@ -3293,19 +3293,14 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), + .ifnum = 0, + .type = QUIRK_AUDIO_STANDARD_MIXER, + }, +- /* Capture */ +- { +- .ifnum = 1, +- .type = QUIRK_IGNORE_INTERFACE, +- }, + /* Playback */ + { +- .ifnum = 2, ++ .ifnum = 1, + .type = QUIRK_AUDIO_FIXED_ENDPOINT, + .data = &(const struct audioformat) { + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels = 2, +- .iface = 2, ++ .iface = 1, + .altsetting = 1, + .altset_idx = 1, + .attributes = UAC_EP_CS_ATTR_FILL_MAX | diff --git a/patch/kernel/rockchip64-legacy/patch-4.4.212-213.patch b/patch/kernel/rockchip64-legacy/patch-4.4.212-213.patch new file mode 100644 index 0000000000..dbc3c940e8 --- /dev/null +++ b/patch/kernel/rockchip64-legacy/patch-4.4.212-213.patch @@ -0,0 +1,1559 @@ +diff --git a/Makefile b/Makefile +index 379f2a525c02..6e86896525d9 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 4 + PATCHLEVEL = 4 +-SUBLEVEL = 212 ++SUBLEVEL = 213 + EXTRAVERSION = + NAME = Blurry Fish Butt + +diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile +index abcbba2f01ba..a29f640de983 100644 +--- a/arch/arm64/boot/Makefile ++++ b/arch/arm64/boot/Makefile +@@ -14,7 +14,7 @@ + # Based on the ia64 boot/Makefile. + # + +-targets := Image Image.gz ++targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo + + $(obj)/Image: vmlinux FORCE + $(call if_changed,objcopy) +diff --git a/crypto/af_alg.c b/crypto/af_alg.c +index b5953f1d1a18..cf3975ee4fd8 100644 +--- a/crypto/af_alg.c ++++ b/crypto/af_alg.c +@@ -136,11 +136,13 @@ void af_alg_release_parent(struct sock *sk) + sk = ask->parent; + ask = alg_sk(sk); + +- lock_sock(sk); ++ local_bh_disable(); ++ bh_lock_sock(sk); + ask->nokey_refcnt -= nokey; + if (!last) + last = !--ask->refcnt; +- release_sock(sk); ++ bh_unlock_sock(sk); ++ local_bh_enable(); + + if (last) + sock_put(sk); +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index a5718c0a3dc4..1348541da463 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -505,11 +505,12 @@ err: + + static void __exit pcrypt_exit(void) + { ++ crypto_unregister_template(&pcrypt_tmpl); ++ + pcrypt_fini_padata(&pencrypt); + pcrypt_fini_padata(&pdecrypt); + + kset_unregister(pcrypt_kset); +- crypto_unregister_template(&pcrypt_tmpl); + } + + module_init(pcrypt_init); +diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c +index 6339efd32697..ad591a2f7c82 100644 +--- a/drivers/atm/eni.c ++++ b/drivers/atm/eni.c +@@ -372,7 +372,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + here = (eni_vcc->descr+skip) & (eni_vcc->words-1); + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci + << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1); + if (!eff) size += skip; +@@ -445,7 +445,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + if (size != eff) { + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | + (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + if (!j || j > 2*RX_DMA_BUF) { + printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n"); +diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c +index a15ce4ef39cd..e265bace57d7 100644 +--- a/drivers/char/ttyprintk.c ++++ b/drivers/char/ttyprintk.c +@@ -18,10 +18,11 @@ + #include + #include + #include ++#include + + struct ttyprintk_port { + struct tty_port port; +- struct mutex port_write_mutex; ++ spinlock_t spinlock; + }; + + static struct ttyprintk_port tpk_port; +@@ -107,11 +108,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp) + static void tpk_close(struct tty_struct *tty, struct file *filp) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + /* flush tpk_printk buffer */ + tpk_printk(NULL, 0); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + tty_port_close(&tpkp->port, tty, filp); + } +@@ -123,13 +125,14 @@ static int tpk_write(struct tty_struct *tty, + const unsigned char *buf, int count) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + int ret; + + + /* exclusive use of tpk_printk within this tty */ +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + ret = tpk_printk(buf, count); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + return ret; + } +@@ -179,7 +182,7 @@ static int __init ttyprintk_init(void) + { + int ret = -ENOMEM; + +- mutex_init(&tpk_port.port_write_mutex); ++ spin_lock_init(&tpk_port.spinlock); + + ttyprintk_driver = tty_alloc_driver(1, + TTY_DRIVER_RESET_TERMIOS | +diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c +index 8b45cb2caed1..60db6531996e 100644 +--- a/drivers/clk/mmp/clk-of-mmp2.c ++++ b/drivers/clk/mmp/clk-of-mmp2.c +@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock); + static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; + + static DEFINE_SPINLOCK(timer_lock); +-static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"}; ++static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; + + static DEFINE_SPINLOCK(reset_lock); + +diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c b/drivers/media/radio/si470x/radio-si470x-i2c.c +index f9e1768b8d31..0836fa442d22 100644 +--- a/drivers/media/radio/si470x/radio-si470x-i2c.c ++++ b/drivers/media/radio/si470x/radio-si470x-i2c.c +@@ -458,10 +458,10 @@ static int si470x_i2c_remove(struct i2c_client *client) + + free_irq(client->irq, radio); + video_unregister_device(&radio->videodev); +- kfree(radio); + + v4l2_ctrl_handler_free(&radio->hdl); + v4l2_device_unregister(&radio->v4l2_dev); ++ kfree(radio); + return 0; + } + +diff --git a/drivers/media/usb/dvb-usb/digitv.c b/drivers/media/usb/dvb-usb/digitv.c +index 772bde3c5020..4a817363a33b 100644 +--- a/drivers/media/usb/dvb-usb/digitv.c ++++ b/drivers/media/usb/dvb-usb/digitv.c +@@ -226,18 +226,22 @@ static struct rc_map_table rc_map_digitv_table[] = { + + static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + { +- int i; ++ int ret, i; + u8 key[5]; + u8 b[4] = { 0 }; + + *event = 0; + *state = REMOTE_NO_KEY_PRESSED; + +- digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4); ++ ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4); ++ if (ret) ++ return ret; + + /* Tell the device we've read the remote. Not sure how necessary + this is, but the Nebula SDK does it. */ +- digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0); ++ ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0); ++ if (ret) ++ return ret; + + /* if something is inside the buffer, simulate key press */ + if (key[1] != 0) +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-urb.c b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +index 5c8f651344fc..c98a01d36260 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-urb.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +@@ -11,7 +11,7 @@ + int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, + u16 rlen, int delay_ms) + { +- int actlen,ret = -ENOMEM; ++ int actlen = 0, ret = -ENOMEM; + + if (!d || wbuf == NULL || wlen == 0) + return -EINVAL; +diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c +index af5cd8213e8b..3733c15c753e 100644 +--- a/drivers/media/usb/gspca/gspca.c ++++ b/drivers/media/usb/gspca/gspca.c +@@ -2028,7 +2028,7 @@ int gspca_dev_probe2(struct usb_interface *intf, + pr_err("couldn't kzalloc gspca struct\n"); + return -ENOMEM; + } +- gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); ++ gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL); + if (!gspca_dev->usb_buf) { + pr_err("out of memory\n"); + ret = -ENOMEM; +diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c +index a3b1c07ae0af..e7214edfe5b4 100644 +--- a/drivers/net/ethernet/broadcom/b44.c ++++ b/drivers/net/ethernet/broadcom/b44.c +@@ -1524,8 +1524,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + int ethaddr_bytes = ETH_ALEN; + + memset(ppattern + offset, 0xff, magicsync); +- for (j = 0; j < magicsync; j++) +- set_bit(len++, (unsigned long *) pmask); ++ for (j = 0; j < magicsync; j++) { ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; ++ } + + for (j = 0; j < B44_MAX_PATTERNS; j++) { + if ((B44_PATTERN_SIZE - len) >= ETH_ALEN) +@@ -1537,7 +1539,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + for (k = 0; k< ethaddr_bytes; k++) { + ppattern[offset + magicsync + + (j * ETH_ALEN) + k] = macaddr[k]; +- set_bit(len++, (unsigned long *) pmask); ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; + } + } + return len - 1; +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +index 129d6095749a..54d5e53e94af 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +@@ -66,8 +66,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos) + static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = seq_tab_get_idx(seq->private, *pos + 1); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +index ac27898c6ab0..e7bdaad6ed0f 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +@@ -604,8 +604,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos) + static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = l2t_get_idx(seq, *pos); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c b/drivers/net/ethernet/freescale/xgmac_mdio.c +index 7b8fe866f603..a15b4a97c172 100644 +--- a/drivers/net/ethernet/freescale/xgmac_mdio.c ++++ b/drivers/net/ethernet/freescale/xgmac_mdio.c +@@ -49,6 +49,7 @@ struct tgec_mdio_controller { + struct mdio_fsl_priv { + struct tgec_mdio_controller __iomem *mdio_base; + bool is_little_endian; ++ bool has_a011043; + }; + + static u32 xgmac_read32(void __iomem *regs, +@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) + return ret; + + /* Return all Fs if nothing was there */ +- if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) { ++ if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && ++ !priv->has_a011043) { + dev_err(&bus->dev, + "Error while reading PHY%d reg at %d.%hhu\n", + phy_id, dev_addr, regnum); +@@ -277,6 +279,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) + else + priv->is_little_endian = false; + ++ priv->has_a011043 = of_property_read_bool(pdev->dev.of_node, ++ "fsl,erratum-a011043"); ++ + ret = of_mdiobus_register(bus, np); + if (ret) { + dev_err(&pdev->dev, "cannot register MDIO bus\n"); +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +index 4521181aa0ed..23fb344f9e1c 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +@@ -4532,7 +4532,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + struct ixgbe_hw *hw = &adapter->hw; + struct hlist_node *node2; + struct ixgbe_fdir_filter *filter; +- u64 action; ++ u8 queue; + + spin_lock(&adapter->fdir_perfect_lock); + +@@ -4541,17 +4541,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + + hlist_for_each_entry_safe(filter, node2, + &adapter->fdir_filter_list, fdir_node) { +- action = filter->action; +- if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) +- action = +- (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; ++ if (filter->action == IXGBE_FDIR_DROP_QUEUE) { ++ queue = IXGBE_FDIR_DROP_QUEUE; ++ } else { ++ u32 ring = ethtool_get_flow_spec_ring(filter->action); ++ u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); ++ ++ if (!vf && (ring >= adapter->num_rx_queues)) { ++ e_err(drv, "FDIR restore failed without VF, ring: %u\n", ++ ring); ++ continue; ++ } else if (vf && ++ ((vf > adapter->num_vfs) || ++ ring >= adapter->num_rx_queues_per_pool)) { ++ e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", ++ vf, ring); ++ continue; ++ } ++ ++ /* Map the ring onto the absolute queue index */ ++ if (!vf) ++ queue = adapter->rx_ring[ring]->reg_idx; ++ else ++ queue = ((vf - 1) * ++ adapter->num_rx_queues_per_pool) + ring; ++ } + + ixgbe_fdir_write_perfect_filter_82599(hw, +- &filter->filter, +- filter->sw_idx, +- (action == IXGBE_FDIR_DROP_QUEUE) ? +- IXGBE_FDIR_DROP_QUEUE : +- adapter->rx_ring[action]->reg_idx); ++ &filter->filter, filter->sw_idx, queue); + } + + spin_unlock(&adapter->fdir_perfect_lock); +diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +index 723bda33472a..0fa94ebf0411 100644 +--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c ++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +@@ -1861,11 +1861,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev) + struct ixgbe_hw *hw = &adapter->hw; + int count = 0; + +- if ((netdev_uc_count(netdev)) > 10) { +- pr_err("Too many unicast filters - No Space\n"); +- return -ENOSPC; +- } +- + if (!netdev_uc_empty(netdev)) { + struct netdev_hw_addr *ha; + +diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c +index 667900578249..712be59251f5 100644 +--- a/drivers/net/ethernet/natsemi/sonic.c ++++ b/drivers/net/ethernet/natsemi/sonic.c +@@ -50,6 +50,8 @@ static int sonic_open(struct net_device *dev) + if (sonic_debug > 2) + printk("sonic_open: initializing sonic driver.\n"); + ++ spin_lock_init(&lp->lock); ++ + for (i = 0; i < SONIC_NUM_RRS; i++) { + struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (skb == NULL) { +@@ -101,6 +103,24 @@ static int sonic_open(struct net_device *dev) + return 0; + } + ++/* Wait for the SONIC to become idle. */ ++static void sonic_quiesce(struct net_device *dev, u16 mask) ++{ ++ struct sonic_local * __maybe_unused lp = netdev_priv(dev); ++ int i; ++ u16 bits; ++ ++ for (i = 0; i < 1000; ++i) { ++ bits = SONIC_READ(SONIC_CMD) & mask; ++ if (!bits) ++ return; ++ if (irqs_disabled() || in_interrupt()) ++ udelay(20); ++ else ++ usleep_range(100, 200); ++ } ++ WARN_ONCE(1, "command deadline expired! 0x%04x\n", bits); ++} + + /* + * Close the SONIC device +@@ -118,6 +138,9 @@ static int sonic_close(struct net_device *dev) + /* + * stop the SONIC, disable interrupts + */ ++ SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); ++ + SONIC_WRITE(SONIC_IMR, 0); + SONIC_WRITE(SONIC_ISR, 0x7fff); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); +@@ -157,6 +180,9 @@ static void sonic_tx_timeout(struct net_device *dev) + * put the Sonic into software-reset mode and + * disable all interrupts before releasing DMA buffers + */ ++ SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); ++ + SONIC_WRITE(SONIC_IMR, 0); + SONIC_WRITE(SONIC_ISR, 0x7fff); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); +@@ -194,8 +220,6 @@ static void sonic_tx_timeout(struct net_device *dev) + * wake the tx queue + * Concurrently with all of this, the SONIC is potentially writing to + * the status flags of the TDs. +- * Until some mutual exclusion is added, this code will not work with SMP. However, +- * MIPS Jazz machines and m68k Macs were all uni-processor machines. + */ + + static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) +@@ -203,7 +227,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + struct sonic_local *lp = netdev_priv(dev); + dma_addr_t laddr; + int length; +- int entry = lp->next_tx; ++ int entry; ++ unsigned long flags; + + if (sonic_debug > 2) + printk("sonic_send_packet: skb=%p, dev=%p\n", skb, dev); +@@ -226,6 +251,10 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + return NETDEV_TX_OK; + } + ++ spin_lock_irqsave(&lp->lock, flags); ++ ++ entry = lp->next_tx; ++ + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ + sonic_tda_put(dev, entry, SONIC_TD_FRAG_COUNT, 1); /* single fragment */ + sonic_tda_put(dev, entry, SONIC_TD_PKTSIZE, length); /* length of packet */ +@@ -235,10 +264,6 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + sonic_tda_put(dev, entry, SONIC_TD_LINK, + sonic_tda_get(dev, entry, SONIC_TD_LINK) | SONIC_EOL); + +- /* +- * Must set tx_skb[entry] only after clearing status, and +- * before clearing EOL and before stopping queue +- */ + wmb(); + lp->tx_len[entry] = length; + lp->tx_laddr[entry] = laddr; +@@ -263,6 +288,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + + SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP); + ++ spin_unlock_irqrestore(&lp->lock, flags); ++ + return NETDEV_TX_OK; + } + +@@ -275,9 +302,21 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + struct net_device *dev = dev_id; + struct sonic_local *lp = netdev_priv(dev); + int status; ++ unsigned long flags; ++ ++ /* The lock has two purposes. Firstly, it synchronizes sonic_interrupt() ++ * with sonic_send_packet() so that the two functions can share state. ++ * Secondly, it makes sonic_interrupt() re-entrant, as that is required ++ * by macsonic which must use two IRQs with different priority levels. ++ */ ++ spin_lock_irqsave(&lp->lock, flags); ++ ++ status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; ++ if (!status) { ++ spin_unlock_irqrestore(&lp->lock, flags); + +- if (!(status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)) + return IRQ_NONE; ++ } + + do { + if (status & SONIC_INT_PKTRX) { +@@ -292,11 +331,12 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + int td_status; + int freed_some = 0; + +- /* At this point, cur_tx is the index of a TD that is one of: +- * unallocated/freed (status set & tx_skb[entry] clear) +- * allocated and sent (status set & tx_skb[entry] set ) +- * allocated and not yet sent (status clear & tx_skb[entry] set ) +- * still being allocated by sonic_send_packet (status clear & tx_skb[entry] clear) ++ /* The state of a Transmit Descriptor may be inferred ++ * from { tx_skb[entry], td_status } as follows. ++ * { clear, clear } => the TD has never been used ++ * { set, clear } => the TD was handed to SONIC ++ * { set, set } => the TD was handed back ++ * { clear, set } => the TD is available for re-use + */ + + if (sonic_debug > 2) +@@ -398,10 +438,30 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + /* load CAM done */ + if (status & SONIC_INT_LCD) + SONIC_WRITE(SONIC_ISR, SONIC_INT_LCD); /* clear the interrupt */ +- } while((status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)); ++ ++ status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; ++ } while (status); ++ ++ spin_unlock_irqrestore(&lp->lock, flags); ++ + return IRQ_HANDLED; + } + ++/* Return the array index corresponding to a given Receive Buffer pointer. */ ++static int index_from_addr(struct sonic_local *lp, dma_addr_t addr, ++ unsigned int last) ++{ ++ unsigned int i = last; ++ ++ do { ++ i = (i + 1) & SONIC_RRS_MASK; ++ if (addr == lp->rx_laddr[i]) ++ return i; ++ } while (i != last); ++ ++ return -ENOENT; ++} ++ + /* + * We have a good packet(s), pass it/them up the network stack. + */ +@@ -421,6 +481,16 @@ static void sonic_rx(struct net_device *dev) + + status = sonic_rda_get(dev, entry, SONIC_RD_STATUS); + if (status & SONIC_RCR_PRX) { ++ u32 addr = (sonic_rda_get(dev, entry, ++ SONIC_RD_PKTPTR_H) << 16) | ++ sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L); ++ int i = index_from_addr(lp, addr, entry); ++ ++ if (i < 0) { ++ WARN_ONCE(1, "failed to find buffer!\n"); ++ break; ++ } ++ + /* Malloc up new buffer. */ + new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (new_skb == NULL) { +@@ -442,7 +512,7 @@ static void sonic_rx(struct net_device *dev) + + /* now we have a new skb to replace it, pass the used one up the stack */ + dma_unmap_single(lp->device, lp->rx_laddr[entry], SONIC_RBSIZE, DMA_FROM_DEVICE); +- used_skb = lp->rx_skb[entry]; ++ used_skb = lp->rx_skb[i]; + pkt_len = sonic_rda_get(dev, entry, SONIC_RD_PKTLEN); + skb_trim(used_skb, pkt_len); + used_skb->protocol = eth_type_trans(used_skb, dev); +@@ -451,13 +521,13 @@ static void sonic_rx(struct net_device *dev) + lp->stats.rx_bytes += pkt_len; + + /* and insert the new skb */ +- lp->rx_laddr[entry] = new_laddr; +- lp->rx_skb[entry] = new_skb; ++ lp->rx_laddr[i] = new_laddr; ++ lp->rx_skb[i] = new_skb; + + bufadr_l = (unsigned long)new_laddr & 0xffff; + bufadr_h = (unsigned long)new_laddr >> 16; +- sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, bufadr_l); +- sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, bufadr_h); ++ sonic_rra_put(dev, i, SONIC_RR_BUFADR_L, bufadr_l); ++ sonic_rra_put(dev, i, SONIC_RR_BUFADR_H, bufadr_h); + } else { + /* This should only happen, if we enable accepting broken packets. */ + lp->stats.rx_errors++; +@@ -592,6 +662,7 @@ static int sonic_init(struct net_device *dev) + */ + SONIC_WRITE(SONIC_CMD, 0); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); + + /* + * initialize the receive resource area +diff --git a/drivers/net/ethernet/natsemi/sonic.h b/drivers/net/ethernet/natsemi/sonic.h +index 07091dd27e5d..7dcf913d7395 100644 +--- a/drivers/net/ethernet/natsemi/sonic.h ++++ b/drivers/net/ethernet/natsemi/sonic.h +@@ -109,6 +109,9 @@ + #define SONIC_CR_TXP 0x0002 + #define SONIC_CR_HTX 0x0001 + ++#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \ ++ SONIC_CR_RXEN | SONIC_CR_TXP) ++ + /* + * SONIC data configuration bits + */ +@@ -273,8 +276,9 @@ + #define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */ + #define SONIC_NUM_TDS 16 /* number of transmit descriptors */ + +-#define SONIC_RDS_MASK (SONIC_NUM_RDS-1) +-#define SONIC_TDS_MASK (SONIC_NUM_TDS-1) ++#define SONIC_RRS_MASK (SONIC_NUM_RRS - 1) ++#define SONIC_RDS_MASK (SONIC_NUM_RDS - 1) ++#define SONIC_TDS_MASK (SONIC_NUM_TDS - 1) + + #define SONIC_RBSIZE 1520 /* size of one resource buffer */ + +@@ -320,6 +324,7 @@ struct sonic_local { + unsigned int next_tx; /* next free TD */ + struct device *device; /* generic device */ + struct net_device_stats stats; ++ spinlock_t lock; + }; + + #define TX_TIMEOUT (3 * HZ) +@@ -341,30 +346,30 @@ static void sonic_tx_timeout(struct net_device *dev); + as far as we can tell. */ + /* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put() + is a much better name. */ +-static inline void sonic_buf_put(void* base, int bitmode, ++static inline void sonic_buf_put(u16 *base, int bitmode, + int offset, __u16 val) + { + if (bitmode) + #ifdef __BIG_ENDIAN +- ((__u16 *) base + (offset*2))[1] = val; ++ __raw_writew(val, base + (offset * 2) + 1); + #else +- ((__u16 *) base + (offset*2))[0] = val; ++ __raw_writew(val, base + (offset * 2) + 0); + #endif + else +- ((__u16 *) base)[offset] = val; ++ __raw_writew(val, base + (offset * 1) + 0); + } + +-static inline __u16 sonic_buf_get(void* base, int bitmode, ++static inline __u16 sonic_buf_get(u16 *base, int bitmode, + int offset) + { + if (bitmode) + #ifdef __BIG_ENDIAN +- return ((volatile __u16 *) base + (offset*2))[1]; ++ return __raw_readw(base + (offset * 2) + 1); + #else +- return ((volatile __u16 *) base + (offset*2))[0]; ++ return __raw_readw(base + (offset * 2) + 0); + #endif + else +- return ((volatile __u16 *) base)[offset]; ++ return __raw_readw(base + (offset * 1) + 0); + } + + /* Inlines that you should actually use for reading/writing DMA buffers */ +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +index bf892160dd5f..26263a192a77 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +@@ -2047,6 +2047,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, + break; + } + entry += p_hdr->size; ++ cond_resched(); + } + p_dev->ahw->reset.seq_index = index; + } +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +index cda9e604a95f..e5ea8e972b91 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, + addr += 16; + reg_read -= 16; + ret += 16; ++ cond_resched(); + } + out: + mutex_unlock(&adapter->ahw->mem_lock); +@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) + buf_offset += entry->hdr.cap_size; + entry_offset += entry->hdr.offset; + buffer = fw_dump->data + buf_offset; ++ cond_resched(); + } + + fw_dump->clr = 1; +diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c +index db8b489b0513..23e299c86b81 100644 +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -4313,6 +4313,11 @@ static int rtl8152_probe(struct usb_interface *intf, + + intf->needs_remote_wakeup = 1; + ++ if (!rtl_can_wakeup(tp)) ++ __rtl_set_wol(tp, 0); ++ else ++ tp->saved_wolopts = __rtl_get_wol(tp); ++ + tp->rtl_ops.init(tp); + set_ethernet_addr(tp); + +@@ -4325,10 +4330,6 @@ static int rtl8152_probe(struct usb_interface *intf, + goto out1; + } + +- if (!rtl_can_wakeup(tp)) +- __rtl_set_wol(tp, 0); +- +- tp->saved_wolopts = __rtl_get_wol(tp); + if (tp->saved_wolopts) + device_set_wakeup_enable(&udev->dev, true); + else +diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c +index 421ac5f85699..79fd89150947 100644 +--- a/drivers/net/wan/sdla.c ++++ b/drivers/net/wan/sdla.c +@@ -711,7 +711,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, + + spin_lock_irqsave(&sdla_lock, flags); + SDLA_WINDOW(dev, addr); +- pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK)); ++ pbuf = (void *)(dev->mem_start + (addr & SDLA_ADDR_MASK)); + __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len); + SDLA_WINDOW(dev, addr); + pbuf->opp_flag = 1; +diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c +index 82d24f2b9c19..a44496d8423a 100644 +--- a/drivers/net/wireless/airo.c ++++ b/drivers/net/wireless/airo.c +@@ -7808,16 +7808,8 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { + case AIROGVLIST: ridcode = RID_APLIST; break; + case AIROGDRVNAM: ridcode = RID_DRVNAME; break; + case AIROGEHTENC: ridcode = RID_ETHERENCAP; break; +- case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; +- /* Only super-user can read WEP keys */ +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- break; +- case AIROGWEPKNV: ridcode = RID_WEP_PERM; +- /* Only super-user can read WEP keys */ +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- break; ++ case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; break; ++ case AIROGWEPKNV: ridcode = RID_WEP_PERM; break; + case AIROGSTAT: ridcode = RID_STATUS; break; + case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; + case AIROGSTATSC32: ridcode = RID_STATS; break; +@@ -7831,7 +7823,13 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { + return -EINVAL; + } + +- if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL) ++ if (ridcode == RID_WEP_TEMP || ridcode == RID_WEP_PERM) { ++ /* Only super-user can read WEP keys */ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ } ++ ++ if ((iobuf = kzalloc(RIDSIZE, GFP_KERNEL)) == NULL) + return -ENOMEM; + + PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1); +diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c +index c92564b3ec85..1f019df15a67 100644 +--- a/drivers/net/wireless/ath/ath9k/hif_usb.c ++++ b/drivers/net/wireless/ath/ath9k/hif_usb.c +@@ -1211,7 +1211,7 @@ err_fw: + static int send_eject_command(struct usb_interface *interface) + { + struct usb_device *udev = interface_to_usbdev(interface); +- struct usb_host_interface *iface_desc = &interface->altsetting[0]; ++ struct usb_host_interface *iface_desc = interface->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c +index 3002268e57f3..b9bfa592bcab 100644 +--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c +@@ -1352,7 +1352,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + goto fail; + } + +- desc = &intf->altsetting[0].desc; ++ desc = &intf->cur_altsetting->desc; + if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || + (desc->bInterfaceSubClass != 2) || + (desc->bInterfaceProtocol != 0xff)) { +@@ -1365,7 +1365,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + + num_of_eps = desc->bNumEndpoints; + for (ep = 0; ep < num_of_eps; ep++) { +- endpoint = &intf->altsetting[0].endpoint[ep].desc; ++ endpoint = &intf->cur_altsetting->endpoint[ep].desc; + endpoint_num = usb_endpoint_num(endpoint); + if (!usb_endpoint_xfer_bulk(endpoint)) + continue; +diff --git a/drivers/net/wireless/orinoco/orinoco_usb.c b/drivers/net/wireless/orinoco/orinoco_usb.c +index f2cd513d54b2..e434f7ca8ff3 100644 +--- a/drivers/net/wireless/orinoco/orinoco_usb.c ++++ b/drivers/net/wireless/orinoco/orinoco_usb.c +@@ -1601,9 +1601,9 @@ static int ezusb_probe(struct usb_interface *interface, + /* set up the endpoint information */ + /* check out the endpoints */ + +- iface_desc = &interface->altsetting[0].desc; ++ iface_desc = &interface->cur_altsetting->desc; + for (i = 0; i < iface_desc->bNumEndpoints; ++i) { +- ep = &interface->altsetting[0].endpoint[i].desc; ++ ep = &interface->cur_altsetting->endpoint[i].desc; + + if (usb_endpoint_is_bulk_in(ep)) { + /* we found a bulk in endpoint */ +diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c +index 4d94bb4e95f8..8254d4b22c50 100644 +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c +@@ -5555,7 +5555,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv, + u8 dir, xtype, num; + int ret = 0; + +- host_interface = &interface->altsetting[0]; ++ host_interface = interface->cur_altsetting; + interface_desc = &host_interface->desc; + endpoints = interface_desc->bNumEndpoints; + +diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c +index ef5d394f185b..974387ad1e8c 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_usb.c ++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c +@@ -103,7 +103,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface, + __le16 buffer_size; + int ii, bep_found = 0; + +- iface_desc = &(interface->altsetting[0]); ++ iface_desc = interface->cur_altsetting; + + for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) { + endpoint = &(iface_desc->endpoint[ii].desc); +diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c +index a912dc051111..a5a5898093e7 100644 +--- a/drivers/net/wireless/zd1211rw/zd_usb.c ++++ b/drivers/net/wireless/zd1211rw/zd_usb.c +@@ -1272,7 +1272,7 @@ static void print_id(struct usb_device *udev) + static int eject_installer(struct usb_interface *intf) + { + struct usb_device *udev = interface_to_usbdev(intf); +- struct usb_host_interface *iface_desc = &intf->altsetting[0]; ++ struct usb_host_interface *iface_desc = intf->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c +index 82e4bc8c11c5..fc6706b12ac7 100644 +--- a/drivers/scsi/fnic/fnic_scsi.c ++++ b/drivers/scsi/fnic/fnic_scsi.c +@@ -446,6 +446,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_ + if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED))) + return SCSI_MLQUEUE_HOST_BUSY; + ++ if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET))) ++ return SCSI_MLQUEUE_HOST_BUSY; ++ + rport = starget_to_rport(scsi_target(sc->device)); + ret = fc_remote_port_chkready(rport); + if (ret) { +diff --git a/drivers/staging/most/aim-network/networking.c b/drivers/staging/most/aim-network/networking.c +index 3c7beb03871d..350fa05aaeed 100644 +--- a/drivers/staging/most/aim-network/networking.c ++++ b/drivers/staging/most/aim-network/networking.c +@@ -87,6 +87,11 @@ static int skb_to_mamac(const struct sk_buff *skb, struct mbo *mbo) + unsigned int payload_len = skb->len - ETH_HLEN; + unsigned int mdp_len = payload_len + MDP_HDR_LEN; + ++ if (mdp_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mdp_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mdp_len); +@@ -134,6 +139,11 @@ static int skb_to_mep(const struct sk_buff *skb, struct mbo *mbo) + u8 *buff = mbo->virt_address; + unsigned int mep_len = skb->len + MEP_HDR_LEN; + ++ if (mep_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mep_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mep_len); +diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h +index ba362a883016..80ab403aeb72 100644 +--- a/drivers/staging/vt6656/device.h ++++ b/drivers/staging/vt6656/device.h +@@ -65,6 +65,8 @@ + #define RATE_AUTO 12 + + #define MAX_RATE 12 ++#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ ++ BIT(RATE_5M) | BIT(RATE_11M)) + + /* + * device specific +diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c +index 14b8ebc6508d..cb22b5efe2be 100644 +--- a/drivers/staging/vt6656/int.c ++++ b/drivers/staging/vt6656/int.c +@@ -111,9 +111,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) + + info->status.rates[0].count = tx_retry; + +- if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) { ++ if (!(tsr & TSR_TMO)) { + info->status.rates[0].idx = idx; +- info->flags |= IEEE80211_TX_STAT_ACK; ++ ++ if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) ++ info->flags |= IEEE80211_TX_STAT_ACK; + } + + ieee80211_tx_status_irqsafe(priv->hw, context->skb); +diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c +index 668fcd3a0bfe..66e658810229 100644 +--- a/drivers/staging/vt6656/main_usb.c ++++ b/drivers/staging/vt6656/main_usb.c +@@ -1002,6 +1002,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); + ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); + ieee80211_hw_set(priv->hw, SUPPORTS_PS); ++ ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK); + + priv->hw->max_signal = 100; + +diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c +index efb54f53b4f9..5d951e043d35 100644 +--- a/drivers/staging/vt6656/rxtx.c ++++ b/drivers/staging/vt6656/rxtx.c +@@ -280,11 +280,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context, + PK_TYPE_11B, &buf->b); + + /* Get Duration and TimeStamp */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration_a = dur; +- buf->duration_b = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration_a = hdr->duration_id; ++ buf->duration_b = hdr->duration_id; + } else { + buf->duration_a = vnt_get_duration_le(priv, + tx_context->pkt_type, need_ack); +@@ -373,10 +371,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context, + tx_context->pkt_type, &buf->ab); + + /* Get Duration and TimeStampOff */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration = hdr->duration_id; + } else { + buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); +@@ -815,10 +811,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) + if (info->band == IEEE80211_BAND_5GHZ) { + pkt_type = PK_TYPE_11A; + } else { +- if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) +- pkt_type = PK_TYPE_11GB; +- else +- pkt_type = PK_TYPE_11GA; ++ if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { ++ if (priv->basic_rates & VNT_B_RATES) ++ pkt_type = PK_TYPE_11GB; ++ else ++ pkt_type = PK_TYPE_11GA; ++ } else { ++ pkt_type = PK_TYPE_11A; ++ } + } + } else { + pkt_type = PK_TYPE_11B; +diff --git a/drivers/staging/wlan-ng/prism2mgmt.c b/drivers/staging/wlan-ng/prism2mgmt.c +index c1ad0aea23b9..73ec8d3936d5 100644 +--- a/drivers/staging/wlan-ng/prism2mgmt.c ++++ b/drivers/staging/wlan-ng/prism2mgmt.c +@@ -940,7 +940,7 @@ int prism2mgmt_flashdl_state(wlandevice_t *wlandev, void *msgp) + } + } + +- return 0; ++ return result; + } + + /*---------------------------------------------------------------- +diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c +index 4378e758baef..591bc3f7be76 100644 +--- a/drivers/usb/dwc3/core.c ++++ b/drivers/usb/dwc3/core.c +@@ -801,6 +801,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) + /* do nothing */ + break; + } ++ ++ /* de-assert DRVVBUS for HOST and OTG mode */ ++ dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE); + } + + #define DWC3_ALIGN_MASK (16 - 1) +diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c +index 73956d48a0c5..1347c77facd0 100644 +--- a/drivers/usb/serial/ir-usb.c ++++ b/drivers/usb/serial/ir-usb.c +@@ -49,9 +49,10 @@ static int buffer_size; + static int xbof = -1; + + static int ir_startup (struct usb_serial *serial); +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port); +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size); ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count); ++static int ir_write_room(struct tty_struct *tty); ++static void ir_write_bulk_callback(struct urb *urb); + static void ir_process_read_urb(struct urb *urb); + static void ir_set_termios(struct tty_struct *tty, + struct usb_serial_port *port, struct ktermios *old_termios); +@@ -81,8 +82,9 @@ static struct usb_serial_driver ir_device = { + .num_ports = 1, + .set_termios = ir_set_termios, + .attach = ir_startup, +- .open = ir_open, +- .prepare_write_buffer = ir_prepare_write_buffer, ++ .write = ir_write, ++ .write_room = ir_write_room, ++ .write_bulk_callback = ir_write_bulk_callback, + .process_read_urb = ir_process_read_urb, + }; + +@@ -198,6 +200,9 @@ static int ir_startup(struct usb_serial *serial) + { + struct usb_irda_cs_descriptor *irda_desc; + ++ if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1) ++ return -ENODEV; ++ + irda_desc = irda_usb_find_class_desc(serial, 0); + if (!irda_desc) { + dev_err(&serial->dev->dev, +@@ -252,35 +257,102 @@ static int ir_startup(struct usb_serial *serial) + return 0; + } + +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port) ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count) + { +- int i; ++ struct urb *urb = NULL; ++ unsigned long flags; ++ int ret; + +- for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) +- port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET; ++ if (port->bulk_out_size == 0) ++ return -EINVAL; + +- /* Start reading from the device */ +- return usb_serial_generic_open(tty, port); +-} ++ if (count == 0) ++ return 0; + +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size) +-{ +- unsigned char *buf = dest; +- int count; ++ count = min(count, port->bulk_out_size - 1); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ if (__test_and_clear_bit(0, &port->write_urbs_free)) { ++ urb = port->write_urbs[0]; ++ port->tx_bytes += count; ++ } ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ if (!urb) ++ return 0; + + /* + * The first byte of the packet we send to the device contains an +- * inbound header which indicates an additional number of BOFs and ++ * outbound header which indicates an additional number of BOFs and + * a baud rate change. + * + * See section 5.4.2.2 of the USB IrDA spec. + */ +- *buf = ir_xbof | ir_baud; ++ *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud; ++ ++ memcpy(urb->transfer_buffer + 1, buf, count); ++ ++ urb->transfer_buffer_length = count + 1; ++ urb->transfer_flags = URB_ZERO_PACKET; ++ ++ ret = usb_submit_urb(urb, GFP_ATOMIC); ++ if (ret) { ++ dev_err(&port->dev, "failed to submit write urb: %d\n", ret); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= count; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ return ret; ++ } ++ ++ return count; ++} ++ ++static void ir_write_bulk_callback(struct urb *urb) ++{ ++ struct usb_serial_port *port = urb->context; ++ int status = urb->status; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= urb->transfer_buffer_length - 1; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ switch (status) { ++ case 0: ++ break; ++ case -ENOENT: ++ case -ECONNRESET: ++ case -ESHUTDOWN: ++ dev_dbg(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ case -EPIPE: ++ dev_err(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ default: ++ dev_err(&port->dev, "nonzero write-urb status: %d\n", status); ++ break; ++ } ++ ++ usb_serial_port_softint(port); ++} ++ ++static int ir_write_room(struct tty_struct *tty) ++{ ++ struct usb_serial_port *port = tty->driver_data; ++ int count = 0; ++ ++ if (port->bulk_out_size == 0) ++ return 0; ++ ++ if (test_bit(0, &port->write_urbs_free)) ++ count = port->bulk_out_size - 1; + +- count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1, +- &port->lock); +- return count + 1; ++ return count; + } + + static void ir_process_read_urb(struct urb *urb) +@@ -333,34 +405,34 @@ static void ir_set_termios(struct tty_struct *tty, + + switch (baud) { + case 2400: +- ir_baud = USB_IRDA_BR_2400; ++ ir_baud = USB_IRDA_LS_2400; + break; + case 9600: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + break; + case 19200: +- ir_baud = USB_IRDA_BR_19200; ++ ir_baud = USB_IRDA_LS_19200; + break; + case 38400: +- ir_baud = USB_IRDA_BR_38400; ++ ir_baud = USB_IRDA_LS_38400; + break; + case 57600: +- ir_baud = USB_IRDA_BR_57600; ++ ir_baud = USB_IRDA_LS_57600; + break; + case 115200: +- ir_baud = USB_IRDA_BR_115200; ++ ir_baud = USB_IRDA_LS_115200; + break; + case 576000: +- ir_baud = USB_IRDA_BR_576000; ++ ir_baud = USB_IRDA_LS_576000; + break; + case 1152000: +- ir_baud = USB_IRDA_BR_1152000; ++ ir_baud = USB_IRDA_LS_1152000; + break; + case 4000000: +- ir_baud = USB_IRDA_BR_4000000; ++ ir_baud = USB_IRDA_LS_4000000; + break; + default: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + baud = 9600; + } + +diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h +index 8ed80f28416f..9aad6825947c 100644 +--- a/drivers/usb/storage/unusual_uas.h ++++ b/drivers/usb/storage/unusual_uas.h +@@ -162,12 +162,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999, + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_IGNORE_UAS), + +-/* Reported-by: Takeo Nakayama */ ++/* ++ * Initially Reported-by: Takeo Nakayama ++ * UAS Ignore Reported by Steven Ellis ++ */ + UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, + "JMicron", + "JMS566", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, +- US_FL_NO_REPORT_OPCODES), ++ US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS), + + /* Reported-by: Hans de Goede */ + UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, +diff --git a/drivers/watchdog/rn5t618_wdt.c b/drivers/watchdog/rn5t618_wdt.c +index d1c12278cb6a..8b6eff26e480 100644 +--- a/drivers/watchdog/rn5t618_wdt.c ++++ b/drivers/watchdog/rn5t618_wdt.c +@@ -193,6 +193,7 @@ static struct platform_driver rn5t618_wdt_driver = { + + module_platform_driver(rn5t618_wdt_driver); + ++MODULE_ALIAS("platform:rn5t618-wdt"); + MODULE_AUTHOR("Beniamino Galvani "); + MODULE_DESCRIPTION("RN5T618 watchdog driver"); + MODULE_LICENSE("GPL v2"); +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index 0f99336c37eb..df211bad255c 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -1978,6 +1978,7 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv; + int ret; + u64 thresh = 0; ++ int mixed = 0; + + /* + * holding chunk_muext to avoid allocating new chunks, holding +@@ -2003,8 +2004,17 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + } + } + } +- if (found->flags & BTRFS_BLOCK_GROUP_METADATA) +- total_free_meta += found->disk_total - found->disk_used; ++ ++ /* ++ * Metadata in mixed block goup profiles are accounted in data ++ */ ++ if (!mixed && found->flags & BTRFS_BLOCK_GROUP_METADATA) { ++ if (found->flags & BTRFS_BLOCK_GROUP_DATA) ++ mixed = 1; ++ else ++ total_free_meta += found->disk_total - ++ found->disk_used; ++ } + + total_used += found->disk_used; + } +@@ -2042,7 +2052,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + */ + thresh = 4 * 1024 * 1024; + +- if (total_free_meta - thresh < block_rsv->size) ++ /* ++ * We only want to claim there's no available space if we can no longer ++ * allocate chunks for our metadata profile and our global reserve will ++ * not fit in the free metadata space. If we aren't ->full then we ++ * still can allocate chunks and thus are fine using the currently ++ * calculated f_bavail. ++ */ ++ if (!mixed && block_rsv->space_info->full && ++ total_free_meta - thresh < block_rsv->size) + buf->f_bavail = 0; + + buf->f_type = BTRFS_SUPER_MAGIC; +diff --git a/fs/namei.c b/fs/namei.c +index a4ed9c337c21..9f1aae507909 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -3060,8 +3060,8 @@ static int do_last(struct nameidata *nd, + int *opened) + { + struct dentry *dir = nd->path.dentry; +- kuid_t dir_uid = dir->d_inode->i_uid; +- umode_t dir_mode = dir->d_inode->i_mode; ++ kuid_t dir_uid = nd->inode->i_uid; ++ umode_t dir_mode = nd->inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c +index ee095246da4e..519bf410e65b 100644 +--- a/fs/reiserfs/super.c ++++ b/fs/reiserfs/super.c +@@ -599,6 +599,7 @@ static void reiserfs_put_super(struct super_block *s) + reiserfs_write_unlock(s); + mutex_destroy(&REISERFS_SB(s)->lock); + destroy_workqueue(REISERFS_SB(s)->commit_wq); ++ kfree(REISERFS_SB(s)->s_jdev); + kfree(s->s_fs_info); + s->s_fs_info = NULL; + } +@@ -2208,6 +2209,7 @@ error_unlocked: + kfree(qf_names[j]); + } + #endif ++ kfree(sbi->s_jdev); + kfree(sbi); + + s->s_fs_info = NULL; +diff --git a/include/linux/usb/irda.h b/include/linux/usb/irda.h +index e345ceaf72d6..9dc46010a067 100644 +--- a/include/linux/usb/irda.h ++++ b/include/linux/usb/irda.h +@@ -118,11 +118,22 @@ struct usb_irda_cs_descriptor { + * 6 - 115200 bps + * 7 - 576000 bps + * 8 - 1.152 Mbps +- * 9 - 5 mbps ++ * 9 - 4 Mbps + * 10..15 - Reserved + */ + #define USB_IRDA_STATUS_LINK_SPEED 0x0f + ++#define USB_IRDA_LS_NO_CHANGE 0 ++#define USB_IRDA_LS_2400 1 ++#define USB_IRDA_LS_9600 2 ++#define USB_IRDA_LS_19200 3 ++#define USB_IRDA_LS_38400 4 ++#define USB_IRDA_LS_57600 5 ++#define USB_IRDA_LS_115200 6 ++#define USB_IRDA_LS_576000 7 ++#define USB_IRDA_LS_1152000 8 ++#define USB_IRDA_LS_4000000 9 ++ + /* The following is a 4-bit value used only for + * outbound header: + * +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index 878d05bd185c..41c678199b80 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2701,6 +2701,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + char *flags = strchr(str, '='); + int err = 1; + ++ if (flags) ++ *flags++ = '\0'; /* terminate mode string */ ++ + if (nodelist) { + /* NUL-terminate mode or flags string */ + *nodelist++ = '\0'; +@@ -2711,9 +2714,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + } else + nodes_clear(nodes); + +- if (flags) +- *flags++ = '\0'; /* terminate mode string */ +- + for (mode = 0; mode < MPOL_MAX; mode++) { + if (!strcmp(str, policy_modes[mode])) { + break; +diff --git a/net/core/utils.c b/net/core/utils.c +index 3d17ca8b4744..13eb3552de07 100644 +--- a/net/core/utils.c ++++ b/net/core/utils.c +@@ -316,6 +316,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, + } + EXPORT_SYMBOL(inet_proto_csum_replace4); + ++/** ++ * inet_proto_csum_replace16 - update layer 4 header checksum field ++ * @sum: Layer 4 header checksum field ++ * @skb: sk_buff for the packet ++ * @from: old IPv6 address ++ * @to: new IPv6 address ++ * @pseudohdr: True if layer 4 header checksum includes pseudoheader ++ * ++ * Update layer 4 header as per the update in IPv6 src/dst address. ++ * ++ * There is no need to update skb->csum in this function, because update in two ++ * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other ++ * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to ++ * update skb->csum, because update in 3 fields a.) IPv4 src/dst address, ++ * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as ++ * L4 Header checksum for skb->csum calculation. ++ */ + void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + const __be32 *from, const __be32 *to, + bool pseudohdr) +@@ -327,9 +344,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + if (skb->ip_summed != CHECKSUM_PARTIAL) { + *sum = csum_fold(csum_partial(diff, sizeof(diff), + ~csum_unfold(*sum))); +- if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) +- skb->csum = ~csum_partial(diff, sizeof(diff), +- ~skb->csum); + } else if (pseudohdr) + *sum = ~csum_fold(csum_partial(diff, sizeof(diff), + csum_unfold(*sum))); +diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c +index bbcbbc1cc2cc..42dbd280dc9b 100644 +--- a/net/ipv4/ip_vti.c ++++ b/net/ipv4/ip_vti.c +@@ -195,8 +195,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev, + int err; + + if (!dst) { +- dev->stats.tx_carrier_errors++; +- goto tx_error_icmp; ++ struct rtable *rt; ++ ++ fl->u.ip4.flowi4_oif = dev->ifindex; ++ fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; ++ rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); ++ if (IS_ERR(rt)) { ++ dev->stats.tx_carrier_errors++; ++ goto tx_error_icmp; ++ } ++ dst = &rt->dst; ++ skb_dst_set(skb, dst); + } + + dst_hold(dst); +diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c +index 51da5987952c..623963a2d8a6 100644 +--- a/net/ipv6/ip6_vti.c ++++ b/net/ipv6/ip6_vti.c +@@ -441,8 +441,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + int err = -1; + int mtu; + +- if (!dst) +- goto tx_err_link_failure; ++ if (!dst) { ++ fl->u.ip6.flowi6_oif = dev->ifindex; ++ fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; ++ dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); ++ if (dst->error) { ++ dst_release(dst); ++ dst = NULL; ++ goto tx_err_link_failure; ++ } ++ skb_dst_set(skb, dst); ++ } + + dst_hold(dst); + dst = xfrm_lookup(t->net, dst, fl, NULL, 0); +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index b0b04b3c0896..d4d6f9c91e8c 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -242,6 +242,9 @@ static int tcf_em_validate(struct tcf_proto *tp, + goto errout; + + if (em->ops->change) { ++ err = -EINVAL; ++ if (em_hdr->flags & TCF_EM_SIMPLE) ++ goto errout; + err = em->ops->change(net, data, data_len, em); + if (err < 0) + goto errout; +diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c +index b50ee5d622e1..843d2cf1e6a6 100644 +--- a/net/wireless/wext-core.c ++++ b/net/wireless/wext-core.c +@@ -656,7 +656,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev) + return NULL; + } + +-static int iw_handler_get_iwstats(struct net_device * dev, ++/* noinline to avoid a bogus warning with -O3 */ ++static noinline int iw_handler_get_iwstats(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra) +diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c +index b9bfbf394959..59423576b1cc 100644 +--- a/sound/core/pcm_native.c ++++ b/sound/core/pcm_native.c +@@ -588,7 +588,7 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, + runtime->boundary *= 2; + + /* clear the buffer for avoiding possible kernel info leaks */ +- if (runtime->dma_area) ++ if (runtime->dma_area && !substream->ops->copy) + memset(runtime->dma_area, 0, runtime->dma_bytes); + + snd_pcm_timer_resolution_change(substream); diff --git a/patch/kernel/rockchip64-legacy/update_rockchip64-default_2.5GBE_usb_rtl8156_to_v2.12.0.patch b/patch/kernel/rockchip64-legacy/update_rockchip64-default_2.5GBE_usb_rtl8156_to_v2.12.0.patch.disabled similarity index 100% rename from patch/kernel/rockchip64-legacy/update_rockchip64-default_2.5GBE_usb_rtl8156_to_v2.12.0.patch rename to patch/kernel/rockchip64-legacy/update_rockchip64-default_2.5GBE_usb_rtl8156_to_v2.12.0.patch.disabled From 33f8a9cc7d6d06f075c156c5205847c3d54bf6d0 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Thu, 6 Feb 2020 23:53:17 +0100 Subject: [PATCH 24/54] [odroidxu4-current] Add upstream patch --- .../03-patch-5.4.17-18.patch | 3992 +++++++++++++++++ 1 file changed, 3992 insertions(+) create mode 100644 patch/kernel/odroidxu4-current/03-patch-5.4.17-18.patch diff --git a/patch/kernel/odroidxu4-current/03-patch-5.4.17-18.patch b/patch/kernel/odroidxu4-current/03-patch-5.4.17-18.patch new file mode 100644 index 0000000000..aa79549ab6 --- /dev/null +++ b/patch/kernel/odroidxu4-current/03-patch-5.4.17-18.patch @@ -0,0 +1,3992 @@ +diff --git a/Documentation/ABI/testing/sysfs-class-devfreq b/Documentation/ABI/testing/sysfs-class-devfreq +index 01196e19afca..75897e2fde43 100644 +--- a/Documentation/ABI/testing/sysfs-class-devfreq ++++ b/Documentation/ABI/testing/sysfs-class-devfreq +@@ -7,6 +7,13 @@ Description: + The name of devfreq object denoted as ... is same as the + name of device using devfreq. + ++What: /sys/class/devfreq/.../name ++Date: November 2019 ++Contact: Chanwoo Choi ++Description: ++ The /sys/class/devfreq/.../name shows the name of device ++ of the corresponding devfreq object. ++ + What: /sys/class/devfreq/.../governor + Date: September 2011 + Contact: MyungJoo Ham +diff --git a/Makefile b/Makefile +index a363a539a092..b6c151fd5227 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 17 ++SUBLEVEL = 18 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi b/arch/arm/boot/dts/am335x-boneblack-common.dtsi +index 7ad079861efd..91f93bc89716 100644 +--- a/arch/arm/boot/dts/am335x-boneblack-common.dtsi ++++ b/arch/arm/boot/dts/am335x-boneblack-common.dtsi +@@ -131,6 +131,11 @@ + }; + + / { ++ memory@80000000 { ++ device_type = "memory"; ++ reg = <0x80000000 0x20000000>; /* 512 MB */ ++ }; ++ + clk_mcasp0_fixed: clk_mcasp0_fixed { + #clock-cells = <0>; + compatible = "fixed-clock"; +diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts +index 078cb473fa7d..a6fbc088daa8 100644 +--- a/arch/arm/boot/dts/am43x-epos-evm.dts ++++ b/arch/arm/boot/dts/am43x-epos-evm.dts +@@ -848,6 +848,7 @@ + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi0_pins_default>; + pinctrl-1 = <&spi0_pins_sleep>; ++ ti,pindir-d0-out-d1-in = <1>; + }; + + &spi1 { +@@ -855,6 +856,7 @@ + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_pins_default>; + pinctrl-1 = <&spi1_pins_sleep>; ++ ti,pindir-d0-out-d1-in = <1>; + }; + + &usb2_phy1 { +diff --git a/arch/arm/boot/dts/am571x-idk.dts b/arch/arm/boot/dts/am571x-idk.dts +index 9d6a872c2b23..10105a497c1a 100644 +--- a/arch/arm/boot/dts/am571x-idk.dts ++++ b/arch/arm/boot/dts/am571x-idk.dts +@@ -170,10 +170,6 @@ + gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>; + }; + +-&pcie1_ep { +- gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; +-}; +- + &mmc1 { + pinctrl-names = "default", "hs"; + pinctrl-0 = <&mmc1_pins_default_no_clk_pu>; +diff --git a/arch/arm/boot/dts/am572x-idk-common.dtsi b/arch/arm/boot/dts/am572x-idk-common.dtsi +index a064f13b3880..ddf123620e96 100644 +--- a/arch/arm/boot/dts/am572x-idk-common.dtsi ++++ b/arch/arm/boot/dts/am572x-idk-common.dtsi +@@ -147,10 +147,6 @@ + gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; + }; + +-&pcie1_ep { +- gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; +-}; +- + &mailbox5 { + status = "okay"; + mbox_ipu1_ipc3x: mbox_ipu1_ipc3x { +diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi +index bc76f1705c0f..a813a0cf3ff3 100644 +--- a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi ++++ b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi +@@ -29,6 +29,27 @@ + reg = <0x0 0x80000000 0x0 0x80000000>; + }; + ++ main_12v0: fixedregulator-main_12v0 { ++ /* main supply */ ++ compatible = "regulator-fixed"; ++ regulator-name = "main_12v0"; ++ regulator-min-microvolt = <12000000>; ++ regulator-max-microvolt = <12000000>; ++ regulator-always-on; ++ regulator-boot-on; ++ }; ++ ++ evm_5v0: fixedregulator-evm_5v0 { ++ /* Output of TPS54531D */ ++ compatible = "regulator-fixed"; ++ regulator-name = "evm_5v0"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ vin-supply = <&main_12v0>; ++ regulator-always-on; ++ regulator-boot-on; ++ }; ++ + vdd_3v3: fixedregulator-vdd_3v3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_3v3"; +@@ -547,10 +568,6 @@ + gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; + }; + +-&pcie1_ep { +- gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; +-}; +- + &mcasp3 { + #sound-dai-cells = <0>; + assigned-clocks = <&l4per2_clkctrl DRA7_L4PER2_MCASP3_CLKCTRL 24>; +diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts +index fb928503ad45..d9be511f054f 100644 +--- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts ++++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts +@@ -101,7 +101,7 @@ + initial-mode = <1>; /* initialize in HUB mode */ + disabled-ports = <1>; + intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */ +- reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */ ++ reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */ + connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */ + refclk-frequency = <19200000>; + }; +diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S +index ae5020302de4..6607fa817bba 100644 +--- a/arch/arm/kernel/hyp-stub.S ++++ b/arch/arm/kernel/hyp-stub.S +@@ -146,10 +146,9 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE + #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER) + @ make CNTP_* and CNTPCT accessible from PL1 + mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 +- lsr r7, #16 +- and r7, #0xf +- cmp r7, #1 +- bne 1f ++ ubfx r7, r7, #16, #4 ++ teq r7, #0 ++ beq 1f + mrc p15, 4, r7, c14, c1, 0 @ CNTHCTL + orr r7, r7, #3 @ PL1PCEN | PL1PCTEN + mcr p15, 4, r7, c14, c1, 0 @ CNTHCTL +diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile +index 1f012c506434..cd3414898d10 100644 +--- a/arch/arm64/boot/Makefile ++++ b/arch/arm64/boot/Makefile +@@ -16,7 +16,7 @@ + + OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S + +-targets := Image Image.gz ++targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo + + $(obj)/Image: vmlinux FORCE + $(call if_changed,objcopy) +diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +index 3435aaa4e8db..5d6a8dafe8dc 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +@@ -361,6 +361,8 @@ + + bluetooth { + compatible = "brcm,bcm43438-bt"; ++ interrupt-parent = <&gpio_intc>; ++ interrupts = <95 IRQ_TYPE_LEVEL_HIGH>; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; +diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c +index a6c9f49c6612..a5f3e50fe976 100644 +--- a/arch/parisc/kernel/drivers.c ++++ b/arch/parisc/kernel/drivers.c +@@ -889,8 +889,8 @@ static void print_parisc_device(struct parisc_device *dev) + static int count; + + print_pa_hwpath(dev, hw_path); +- pr_info("%d. %s at 0x%px [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", +- ++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type, ++ pr_info("%d. %s at %pap [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", ++ ++count, dev->name, &(dev->hpa.start), hw_path, dev->id.hw_type, + dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); + + if (dev->num_addrs) { +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi +index e1a961f05dcd..baa0c503e741 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi +@@ -63,6 +63,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy0: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi +index c288f3c6c637..93095600e808 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi +@@ -60,6 +60,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy6: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi +index 94f3e7175012..ff4bd38f0645 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi +@@ -63,6 +63,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy1: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi +index 94a76982d214..1fa38ed6f59e 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi +@@ -60,6 +60,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy7: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi +index b5ff5f71c6b8..a8cc9780c0c4 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy0: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi +index ee44182c6348..8b8bd70c9382 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy1: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi +index f05f0d775039..619c880b54d8 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe5000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy2: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi +index a9114ec51075..d7ebb73a400d 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe7000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy3: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi +index 44dd00ac7367..b151d696a069 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe9000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy4: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi +index 5b1b84b58602..adc0ae0013a3 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xeb000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy5: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi +index 0e1daaef9e74..435047e0e250 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi +@@ -60,6 +60,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy14: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi +index 68c5ef779266..c098657cca0a 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi +@@ -60,6 +60,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy15: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi +index 605363cc1117..9d06824815f3 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy8: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi +index 1955dfa13634..70e947730c4b 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy9: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi +index 2c1476454ee0..ad96e6529595 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe5000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy10: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi +index b8b541ff5fb0..034bc4b71f7a 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe7000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy11: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi +index 4b2cfddd1b15..93ca23d82b39 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe9000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy12: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi +index 0a52ddf7cc17..23b3117a2fd2 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xeb000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy13: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile +index 49a5852fd07d..33b16f4212f7 100644 +--- a/arch/riscv/kernel/vdso/Makefile ++++ b/arch/riscv/kernel/vdso/Makefile +@@ -58,7 +58,8 @@ quiet_cmd_vdsold = VDSOLD $@ + cmd_vdsold = $(CC) $(KBUILD_CFLAGS) $(call cc-option, -no-pie) -nostdlib -nostartfiles $(SYSCFLAGS_$(@F)) \ + -Wl,-T,$(filter-out FORCE,$^) -o $@.tmp && \ + $(CROSS_COMPILE)objcopy \ +- $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ ++ $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ && \ ++ rm $@.tmp + + # install commands for the unstripped file + quiet_cmd_vdso_install = INSTALL $@ +diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c +index dbaa1b088a30..c37cb12d0ef6 100644 +--- a/arch/x86/events/intel/uncore_snb.c ++++ b/arch/x86/events/intel/uncore_snb.c +@@ -15,6 +15,7 @@ + #define PCI_DEVICE_ID_INTEL_SKL_HQ_IMC 0x1910 + #define PCI_DEVICE_ID_INTEL_SKL_SD_IMC 0x190f + #define PCI_DEVICE_ID_INTEL_SKL_SQ_IMC 0x191f ++#define PCI_DEVICE_ID_INTEL_SKL_E3_IMC 0x1918 + #define PCI_DEVICE_ID_INTEL_KBL_Y_IMC 0x590c + #define PCI_DEVICE_ID_INTEL_KBL_U_IMC 0x5904 + #define PCI_DEVICE_ID_INTEL_KBL_UQ_IMC 0x5914 +@@ -657,6 +658,10 @@ static const struct pci_device_id skl_uncore_pci_ids[] = { + PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_SQ_IMC), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), + }, ++ { /* IMC */ ++ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_E3_IMC), ++ .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), ++ }, + { /* IMC */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KBL_Y_IMC), + .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), +@@ -826,6 +831,7 @@ static const struct imc_uncore_pci_dev desktop_imc_pci_ids[] = { + IMC_DEV(SKL_HQ_IMC, &skl_uncore_pci_driver), /* 6th Gen Core H Quad Core */ + IMC_DEV(SKL_SD_IMC, &skl_uncore_pci_driver), /* 6th Gen Core S Dual Core */ + IMC_DEV(SKL_SQ_IMC, &skl_uncore_pci_driver), /* 6th Gen Core S Quad Core */ ++ IMC_DEV(SKL_E3_IMC, &skl_uncore_pci_driver), /* Xeon E3 V5 Gen Core processor */ + IMC_DEV(KBL_Y_IMC, &skl_uncore_pci_driver), /* 7th Gen Core Y */ + IMC_DEV(KBL_U_IMC, &skl_uncore_pci_driver), /* 7th Gen Core U */ + IMC_DEV(KBL_UQ_IMC, &skl_uncore_pci_driver), /* 7th Gen Core U Quad Core */ +diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c +index 011644802ce7..ad20220af303 100644 +--- a/arch/x86/events/intel/uncore_snbep.c ++++ b/arch/x86/events/intel/uncore_snbep.c +@@ -369,11 +369,6 @@ + #define SNR_M2M_PCI_PMON_BOX_CTL 0x438 + #define SNR_M2M_PCI_PMON_UMASK_EXT 0xff + +-/* SNR PCIE3 */ +-#define SNR_PCIE3_PCI_PMON_CTL0 0x508 +-#define SNR_PCIE3_PCI_PMON_CTR0 0x4e8 +-#define SNR_PCIE3_PCI_PMON_BOX_CTL 0x4e4 +- + /* SNR IMC */ + #define SNR_IMC_MMIO_PMON_FIXED_CTL 0x54 + #define SNR_IMC_MMIO_PMON_FIXED_CTR 0x38 +@@ -4328,27 +4323,12 @@ static struct intel_uncore_type snr_uncore_m2m = { + .format_group = &snr_m2m_uncore_format_group, + }; + +-static struct intel_uncore_type snr_uncore_pcie3 = { +- .name = "pcie3", +- .num_counters = 4, +- .num_boxes = 1, +- .perf_ctr_bits = 48, +- .perf_ctr = SNR_PCIE3_PCI_PMON_CTR0, +- .event_ctl = SNR_PCIE3_PCI_PMON_CTL0, +- .event_mask = SNBEP_PMON_RAW_EVENT_MASK, +- .box_ctl = SNR_PCIE3_PCI_PMON_BOX_CTL, +- .ops = &ivbep_uncore_pci_ops, +- .format_group = &ivbep_uncore_format_group, +-}; +- + enum { + SNR_PCI_UNCORE_M2M, +- SNR_PCI_UNCORE_PCIE3, + }; + + static struct intel_uncore_type *snr_pci_uncores[] = { + [SNR_PCI_UNCORE_M2M] = &snr_uncore_m2m, +- [SNR_PCI_UNCORE_PCIE3] = &snr_uncore_pcie3, + NULL, + }; + +@@ -4357,10 +4337,6 @@ static const struct pci_device_id snr_uncore_pci_ids[] = { + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a), + .driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 0, SNR_PCI_UNCORE_M2M, 0), + }, +- { /* PCIe3 */ +- PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x334a), +- .driver_data = UNCORE_PCI_DEV_FULL_DATA(4, 0, SNR_PCI_UNCORE_PCIE3, 0), +- }, + { /* end: all zeroes */ } + }; + +diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c +index dac7209a0708..954fd048ad9b 100644 +--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c ++++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c +@@ -1970,7 +1970,7 @@ static int rdt_get_tree(struct fs_context *fc) + + if (rdt_mon_capable) { + ret = mongroup_create_dir(rdtgroup_default.kn, +- NULL, "mon_groups", ++ &rdtgroup_default, "mon_groups", + &kn_mongrp); + if (ret < 0) + goto out_info; +@@ -2205,7 +2205,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp) + list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) { + free_rmid(sentry->mon.rmid); + list_del(&sentry->mon.crdtgrp_list); +- kfree(sentry); ++ ++ if (atomic_read(&sentry->waitcount) != 0) ++ sentry->flags = RDT_DELETED; ++ else ++ kfree(sentry); + } + } + +@@ -2243,7 +2247,11 @@ static void rmdir_all_sub(void) + + kernfs_remove(rdtgrp->kn); + list_del(&rdtgrp->rdtgroup_list); +- kfree(rdtgrp); ++ ++ if (atomic_read(&rdtgrp->waitcount) != 0) ++ rdtgrp->flags = RDT_DELETED; ++ else ++ kfree(rdtgrp); + } + /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */ + update_closid_rmid(cpu_online_mask, &rdtgroup_default); +@@ -2446,7 +2454,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn, + /* + * Create the mon_data directory first. + */ +- ret = mongroup_create_dir(parent_kn, NULL, "mon_data", &kn); ++ ret = mongroup_create_dir(parent_kn, prgrp, "mon_data", &kn); + if (ret) + return ret; + +@@ -2645,7 +2653,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, + uint files = 0; + int ret; + +- prdtgrp = rdtgroup_kn_lock_live(prgrp_kn); ++ prdtgrp = rdtgroup_kn_lock_live(parent_kn); + if (!prdtgrp) { + ret = -ENODEV; + goto out_unlock; +@@ -2718,7 +2726,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, + kernfs_activate(kn); + + /* +- * The caller unlocks the prgrp_kn upon success. ++ * The caller unlocks the parent_kn upon success. + */ + return 0; + +@@ -2729,7 +2737,7 @@ out_destroy: + out_free_rgrp: + kfree(rdtgrp); + out_unlock: +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -2767,7 +2775,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn, + */ + list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list); + +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -2810,7 +2818,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, + * Create an empty mon_groups directory to hold the subset + * of tasks and cpus to monitor. + */ +- ret = mongroup_create_dir(kn, NULL, "mon_groups", NULL); ++ ret = mongroup_create_dir(kn, rdtgrp, "mon_groups", NULL); + if (ret) { + rdt_last_cmd_puts("kernfs subdir error\n"); + goto out_del_list; +@@ -2826,7 +2834,7 @@ out_id_free: + out_common_fail: + mkdir_rdt_prepare_clean(rdtgrp); + out_unlock: +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -2952,13 +2960,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp, + closid_free(rdtgrp->closid); + free_rmid(rdtgrp->mon.rmid); + ++ rdtgroup_ctrl_remove(kn, rdtgrp); ++ + /* + * Free all the child monitor group rmids. + */ + free_all_child_rdtgrp(rdtgrp); + +- rdtgroup_ctrl_remove(kn, rdtgrp); +- + return 0; + } + +diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c +index 4f24e46ebe7c..56db949a7b70 100644 +--- a/drivers/char/ttyprintk.c ++++ b/drivers/char/ttyprintk.c +@@ -15,10 +15,11 @@ + #include + #include + #include ++#include + + struct ttyprintk_port { + struct tty_port port; +- struct mutex port_write_mutex; ++ spinlock_t spinlock; + }; + + static struct ttyprintk_port tpk_port; +@@ -99,11 +100,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp) + static void tpk_close(struct tty_struct *tty, struct file *filp) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + /* flush tpk_printk buffer */ + tpk_printk(NULL, 0); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + tty_port_close(&tpkp->port, tty, filp); + } +@@ -115,13 +117,14 @@ static int tpk_write(struct tty_struct *tty, + const unsigned char *buf, int count) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + int ret; + + + /* exclusive use of tpk_printk within this tty */ +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + ret = tpk_printk(buf, count); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + return ret; + } +@@ -171,7 +174,7 @@ static int __init ttyprintk_init(void) + { + int ret = -ENOMEM; + +- mutex_init(&tpk_port.port_write_mutex); ++ spin_lock_init(&tpk_port.spinlock); + + ttyprintk_driver = tty_alloc_driver(1, + TTY_DRIVER_RESET_TERMIOS | +diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c +index a60a1be937ad..b4a95cbbda98 100644 +--- a/drivers/clk/mmp/clk-of-mmp2.c ++++ b/drivers/clk/mmp/clk-of-mmp2.c +@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock); + static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; + + static DEFINE_SPINLOCK(timer_lock); +-static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"}; ++static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; + + static DEFINE_SPINLOCK(reset_lock); + +diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c +index 45a1ed3fe674..ab194143e06c 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c ++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c +@@ -23,9 +23,9 @@ + */ + + static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k", +- "pll-periph0", "iosc" }; ++ "iosc", "pll-periph0" }; + static const struct ccu_mux_var_prediv ar100_r_apb2_predivs[] = { +- { .index = 2, .shift = 0, .width = 5 }, ++ { .index = 3, .shift = 0, .width = 5 }, + }; + + static struct ccu_div ar100_clk = { +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.c b/drivers/clk/sunxi-ng/ccu-sun8i-r.c +index 4646fdc61053..4c8c491b87c2 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-r.c ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.c +@@ -51,19 +51,7 @@ static struct ccu_div ar100_clk = { + + static CLK_FIXED_FACTOR_HW(ahb0_clk, "ahb0", &ar100_clk.common.hw, 1, 1, 0); + +-static struct ccu_div apb0_clk = { +- .div = _SUNXI_CCU_DIV_FLAGS(0, 2, CLK_DIVIDER_POWER_OF_TWO), +- +- .common = { +- .reg = 0x0c, +- .hw.init = CLK_HW_INIT_HW("apb0", +- &ahb0_clk.hw, +- &ccu_div_ops, +- 0), +- }, +-}; +- +-static SUNXI_CCU_M(a83t_apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0); ++static SUNXI_CCU_M(apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0); + + /* + * Define the parent as an array that can be reused to save space +@@ -127,7 +115,7 @@ static struct ccu_mp a83t_ir_clk = { + + static struct ccu_common *sun8i_a83t_r_ccu_clks[] = { + &ar100_clk.common, +- &a83t_apb0_clk.common, ++ &apb0_clk.common, + &apb0_pio_clk.common, + &apb0_ir_clk.common, + &apb0_timer_clk.common, +@@ -167,7 +155,7 @@ static struct clk_hw_onecell_data sun8i_a83t_r_hw_clks = { + .hws = { + [CLK_AR100] = &ar100_clk.common.hw, + [CLK_AHB0] = &ahb0_clk.hw, +- [CLK_APB0] = &a83t_apb0_clk.common.hw, ++ [CLK_APB0] = &apb0_clk.common.hw, + [CLK_APB0_PIO] = &apb0_pio_clk.common.hw, + [CLK_APB0_IR] = &apb0_ir_clk.common.hw, + [CLK_APB0_TIMER] = &apb0_timer_clk.common.hw, +@@ -282,9 +270,6 @@ static void __init sunxi_r_ccu_init(struct device_node *node, + + static void __init sun8i_a83t_r_ccu_setup(struct device_node *node) + { +- /* Fix apb0 bus gate parents here */ +- apb0_gate_parent[0] = &a83t_apb0_clk.common.hw; +- + sunxi_r_ccu_init(node, &sun8i_a83t_r_ccu_desc); + } + CLK_OF_DECLARE(sun8i_a83t_r_ccu, "allwinner,sun8i-a83t-r-ccu", +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +index 5c779eec454b..0e36ca3bf3d5 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +@@ -618,7 +618,7 @@ static struct clk_hw_onecell_data sun8i_v3s_hw_clks = { + [CLK_MBUS] = &mbus_clk.common.hw, + [CLK_MIPI_CSI] = &mipi_csi_clk.common.hw, + }, +- .num = CLK_NUMBER, ++ .num = CLK_PLL_DDR1 + 1, + }; + + static struct clk_hw_onecell_data sun8i_v3_hw_clks = { +@@ -700,7 +700,7 @@ static struct clk_hw_onecell_data sun8i_v3_hw_clks = { + [CLK_MBUS] = &mbus_clk.common.hw, + [CLK_MIPI_CSI] = &mipi_csi_clk.common.hw, + }, +- .num = CLK_NUMBER, ++ .num = CLK_I2S0 + 1, + }; + + static struct ccu_reset_map sun8i_v3s_ccu_resets[] = { +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h +index b0160d305a67..108eeeedcbf7 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h +@@ -51,6 +51,4 @@ + + #define CLK_PLL_DDR1 74 + +-#define CLK_NUMBER (CLK_I2S0 + 1) +- + #endif /* _CCU_SUN8I_H3_H_ */ +diff --git a/drivers/cpuidle/governors/teo.c b/drivers/cpuidle/governors/teo.c +index 703047434ee1..c71773c88890 100644 +--- a/drivers/cpuidle/governors/teo.c ++++ b/drivers/cpuidle/governors/teo.c +@@ -234,7 +234,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + struct teo_cpu *cpu_data = per_cpu_ptr(&teo_cpus, dev->cpu); + int latency_req = cpuidle_governor_latency_req(dev->cpu); + unsigned int duration_us, hits, misses, early_hits; +- int max_early_idx, constraint_idx, idx, i; ++ int max_early_idx, prev_max_early_idx, constraint_idx, idx, i; + ktime_t delta_tick; + + if (dev->last_state_idx >= 0) { +@@ -251,6 +251,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + misses = 0; + early_hits = 0; + max_early_idx = -1; ++ prev_max_early_idx = -1; + constraint_idx = drv->state_count; + idx = -1; + +@@ -303,6 +304,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + */ + if (!(tick_nohz_tick_stopped() && + drv->states[idx].target_residency < TICK_USEC)) { ++ prev_max_early_idx = max_early_idx; + early_hits = cpu_data->states[i].early_hits; + max_early_idx = idx; + } +@@ -329,6 +331,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + if (early_hits < cpu_data->states[i].early_hits && + !(tick_nohz_tick_stopped() && + drv->states[i].target_residency < TICK_USEC)) { ++ prev_max_early_idx = max_early_idx; + early_hits = cpu_data->states[i].early_hits; + max_early_idx = i; + } +@@ -342,9 +345,19 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, + * "early hits" metric, but if that cannot be determined, just use the + * state selected so far. + */ +- if (hits <= misses && max_early_idx >= 0) { +- idx = max_early_idx; +- duration_us = drv->states[idx].target_residency; ++ if (hits <= misses) { ++ /* ++ * The current candidate state is not suitable, so take the one ++ * whose "early hits" metric is the maximum for the range of ++ * shallower states. ++ */ ++ if (idx == max_early_idx) ++ max_early_idx = prev_max_early_idx; ++ ++ if (max_early_idx >= 0) { ++ idx = max_early_idx; ++ duration_us = drv->states[idx].target_residency; ++ } + } + + /* +diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c +index c64d20fdc187..174795ecbd3b 100644 +--- a/drivers/devfreq/devfreq.c ++++ b/drivers/devfreq/devfreq.c +@@ -1112,6 +1112,14 @@ err_out: + } + EXPORT_SYMBOL(devfreq_remove_governor); + ++static ssize_t name_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct devfreq *devfreq = to_devfreq(dev); ++ return sprintf(buf, "%s\n", dev_name(devfreq->dev.parent)); ++} ++static DEVICE_ATTR_RO(name); ++ + static ssize_t governor_show(struct device *dev, + struct device_attribute *attr, char *buf) + { +@@ -1440,6 +1448,7 @@ static ssize_t trans_stat_show(struct device *dev, + static DEVICE_ATTR_RO(trans_stat); + + static struct attribute *devfreq_attrs[] = { ++ &dev_attr_name.attr, + &dev_attr_governor.attr, + &dev_attr_available_governors.attr, + &dev_attr_cur_freq.attr, +diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c +index f918fca9ada3..cb6e3a5f509c 100644 +--- a/drivers/input/evdev.c ++++ b/drivers/input/evdev.c +@@ -484,10 +484,7 @@ static int evdev_open(struct inode *inode, struct file *file) + struct evdev_client *client; + int error; + +- client = kzalloc(struct_size(client, buffer, bufsize), +- GFP_KERNEL | __GFP_NOWARN); +- if (!client) +- client = vzalloc(struct_size(client, buffer, bufsize)); ++ client = kvzalloc(struct_size(client, buffer, bufsize), GFP_KERNEL); + if (!client) + return -ENOMEM; + +diff --git a/drivers/input/misc/max77650-onkey.c b/drivers/input/misc/max77650-onkey.c +index 4d875f2ac13d..ee55f22dbca5 100644 +--- a/drivers/input/misc/max77650-onkey.c ++++ b/drivers/input/misc/max77650-onkey.c +@@ -108,9 +108,16 @@ static int max77650_onkey_probe(struct platform_device *pdev) + return input_register_device(onkey->input); + } + ++static const struct of_device_id max77650_onkey_of_match[] = { ++ { .compatible = "maxim,max77650-onkey" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, max77650_onkey_of_match); ++ + static struct platform_driver max77650_onkey_driver = { + .driver = { + .name = "max77650-onkey", ++ .of_match_table = max77650_onkey_of_match, + }, + .probe = max77650_onkey_probe, + }; +diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c +index 4c2d0b3c6dad..a0d4b725c917 100644 +--- a/drivers/leds/leds-max77650.c ++++ b/drivers/leds/leds-max77650.c +@@ -135,9 +135,16 @@ err_node_put: + return rv; + } + ++static const struct of_device_id max77650_led_of_match[] = { ++ { .compatible = "maxim,max77650-led" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, max77650_led_of_match); ++ + static struct platform_driver max77650_led_driver = { + .driver = { + .name = "max77650-led", ++ .of_match_table = max77650_led_of_match, + }, + .probe = max77650_led_probe, + }; +diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c +index 1696bfd23ad1..69201bdf7f4c 100644 +--- a/drivers/md/dm-thin.c ++++ b/drivers/md/dm-thin.c +@@ -3420,10 +3420,6 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) + if (r) + goto out_flags_changed; + +- dm_pool_register_pre_commit_callback(pt->pool->pmd, +- metadata_pre_commit_callback, +- pt); +- + pt->callbacks.congested_fn = pool_is_congested; + dm_table_add_target_callbacks(ti->table, &pt->callbacks); + +@@ -3587,6 +3583,9 @@ static int pool_preresume(struct dm_target *ti) + if (r) + return r; + ++ dm_pool_register_pre_commit_callback(pool->pmd, ++ metadata_pre_commit_callback, pt); ++ + r = maybe_resize_data_dev(ti, &need_commit1); + if (r) + return r; +diff --git a/drivers/media/usb/dvb-usb/af9005.c b/drivers/media/usb/dvb-usb/af9005.c +index ac93e88d7038..89b4b5d84cdf 100644 +--- a/drivers/media/usb/dvb-usb/af9005.c ++++ b/drivers/media/usb/dvb-usb/af9005.c +@@ -554,7 +554,7 @@ static int af9005_boot_packet(struct usb_device *udev, int type, u8 *reply, + u8 *buf, int size) + { + u16 checksum; +- int act_len, i, ret; ++ int act_len = 0, i, ret; + + memset(buf, 0, size); + buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff); +diff --git a/drivers/media/usb/dvb-usb/digitv.c b/drivers/media/usb/dvb-usb/digitv.c +index dd5bb230cec1..99a39339d45d 100644 +--- a/drivers/media/usb/dvb-usb/digitv.c ++++ b/drivers/media/usb/dvb-usb/digitv.c +@@ -230,18 +230,22 @@ static struct rc_map_table rc_map_digitv_table[] = { + + static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + { +- int i; ++ int ret, i; + u8 key[5]; + u8 b[4] = { 0 }; + + *event = 0; + *state = REMOTE_NO_KEY_PRESSED; + +- digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4); ++ ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4); ++ if (ret) ++ return ret; + + /* Tell the device we've read the remote. Not sure how necessary + this is, but the Nebula SDK does it. */ +- digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0); ++ ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0); ++ if (ret) ++ return ret; + + /* if something is inside the buffer, simulate key press */ + if (key[1] != 0) +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-urb.c b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +index c1b4e94a37f8..2aabf90d8697 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-urb.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +@@ -12,7 +12,7 @@ + int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, + u16 rlen, int delay_ms) + { +- int actlen,ret = -ENOMEM; ++ int actlen = 0, ret = -ENOMEM; + + if (!d || wbuf == NULL || wlen == 0) + return -EINVAL; +diff --git a/drivers/media/usb/dvb-usb/vp7045.c b/drivers/media/usb/dvb-usb/vp7045.c +index 80c1cf05384b..2baf57216d19 100644 +--- a/drivers/media/usb/dvb-usb/vp7045.c ++++ b/drivers/media/usb/dvb-usb/vp7045.c +@@ -96,10 +96,14 @@ static int vp7045_power_ctrl(struct dvb_usb_device *d, int onoff) + + static int vp7045_rc_query(struct dvb_usb_device *d) + { ++ int ret; + u8 key; +- vp7045_usb_op(d,RC_VAL_READ,NULL,0,&key,1,20); + +- deb_rc("remote query key: %x %d\n",key,key); ++ ret = vp7045_usb_op(d, RC_VAL_READ, NULL, 0, &key, 1, 20); ++ if (ret) ++ return ret; ++ ++ deb_rc("remote query key: %x\n", key); + + if (key != 0x44) { + /* +@@ -115,15 +119,18 @@ static int vp7045_rc_query(struct dvb_usb_device *d) + + static int vp7045_read_eeprom(struct dvb_usb_device *d,u8 *buf, int len, int offset) + { +- int i = 0; +- u8 v,br[2]; ++ int i, ret; ++ u8 v, br[2]; + for (i=0; i < len; i++) { + v = offset + i; +- vp7045_usb_op(d,GET_EE_VALUE,&v,1,br,2,5); ++ ret = vp7045_usb_op(d, GET_EE_VALUE, &v, 1, br, 2, 5); ++ if (ret) ++ return ret; ++ + buf[i] = br[1]; + } +- deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ",offset, i); +- debug_dump(buf,i,deb_info); ++ deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ", offset, i); ++ debug_dump(buf, i, deb_info); + return 0; + } + +diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c +index 4add2b12d330..c1b307bbe540 100644 +--- a/drivers/media/usb/gspca/gspca.c ++++ b/drivers/media/usb/gspca/gspca.c +@@ -1461,7 +1461,7 @@ int gspca_dev_probe2(struct usb_interface *intf, + pr_err("couldn't kzalloc gspca struct\n"); + return -ENOMEM; + } +- gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); ++ gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL); + if (!gspca_dev->usb_buf) { + pr_err("out of memory\n"); + ret = -ENOMEM; +diff --git a/drivers/misc/lkdtm/bugs.c b/drivers/misc/lkdtm/bugs.c +index 7284a22b1a09..4d5a512769e9 100644 +--- a/drivers/misc/lkdtm/bugs.c ++++ b/drivers/misc/lkdtm/bugs.c +@@ -274,7 +274,7 @@ void lkdtm_STACK_GUARD_PAGE_TRAILING(void) + + void lkdtm_UNSET_SMEP(void) + { +-#ifdef CONFIG_X86_64 ++#if IS_ENABLED(CONFIG_X86_64) && !IS_ENABLED(CONFIG_UML) + #define MOV_CR4_DEPTH 64 + void (*direct_write_cr4)(unsigned long val); + unsigned char *insn; +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +index fb8ade9a05a9..2ce96cc1bad4 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +@@ -70,8 +70,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos) + static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = seq_tab_get_idx(seq->private, *pos + 1); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +index 1a407d3c1d67..e6fe2870137b 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +@@ -682,8 +682,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos) + static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = l2t_get_idx(seq, *pos); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c +index 41c6fa200e74..e1901874c19f 100644 +--- a/drivers/net/ethernet/freescale/fman/fman_memac.c ++++ b/drivers/net/ethernet/freescale/fman/fman_memac.c +@@ -110,7 +110,7 @@ do { \ + /* Interface Mode Register (IF_MODE) */ + + #define IF_MODE_MASK 0x00000003 /* 30-31 Mask on i/f mode bits */ +-#define IF_MODE_XGMII 0x00000000 /* 30-31 XGMII (10G) interface */ ++#define IF_MODE_10G 0x00000000 /* 30-31 10G interface */ + #define IF_MODE_GMII 0x00000002 /* 30-31 GMII (1G) interface */ + #define IF_MODE_RGMII 0x00000004 + #define IF_MODE_RGMII_AUTO 0x00008000 +@@ -440,7 +440,7 @@ static int init(struct memac_regs __iomem *regs, struct memac_cfg *cfg, + tmp = 0; + switch (phy_if) { + case PHY_INTERFACE_MODE_XGMII: +- tmp |= IF_MODE_XGMII; ++ tmp |= IF_MODE_10G; + break; + default: + tmp |= IF_MODE_GMII; +diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c b/drivers/net/ethernet/freescale/xgmac_mdio.c +index e03b30c60dcf..c82c85ef5fb3 100644 +--- a/drivers/net/ethernet/freescale/xgmac_mdio.c ++++ b/drivers/net/ethernet/freescale/xgmac_mdio.c +@@ -49,6 +49,7 @@ struct tgec_mdio_controller { + struct mdio_fsl_priv { + struct tgec_mdio_controller __iomem *mdio_base; + bool is_little_endian; ++ bool has_a011043; + }; + + static u32 xgmac_read32(void __iomem *regs, +@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) + return ret; + + /* Return all Fs if nothing was there */ +- if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) { ++ if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && ++ !priv->has_a011043) { + dev_err(&bus->dev, + "Error while reading PHY%d reg at %d.%hhu\n", + phy_id, dev_addr, regnum); +@@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) + priv->is_little_endian = of_property_read_bool(pdev->dev.of_node, + "little-endian"); + ++ priv->has_a011043 = of_property_read_bool(pdev->dev.of_node, ++ "fsl,erratum-a011043"); ++ + ret = of_mdiobus_register(bus, np); + if (ret) { + dev_err(&pdev->dev, "cannot register MDIO bus\n"); +diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h +index 6c51b1bad8c4..37a2314d3e6b 100644 +--- a/drivers/net/ethernet/intel/e1000e/e1000.h ++++ b/drivers/net/ethernet/intel/e1000e/e1000.h +@@ -185,13 +185,12 @@ struct e1000_phy_regs { + + /* board specific private data structure */ + struct e1000_adapter { ++ struct timer_list watchdog_timer; + struct timer_list phy_info_timer; + struct timer_list blink_timer; + + struct work_struct reset_task; +- struct delayed_work watchdog_task; +- +- struct workqueue_struct *e1000_workqueue; ++ struct work_struct watchdog_task; + + const struct e1000_info *ei; + +diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c +index d7d56e42a6aa..c27ed7363768 100644 +--- a/drivers/net/ethernet/intel/e1000e/netdev.c ++++ b/drivers/net/ethernet/intel/e1000e/netdev.c +@@ -1780,8 +1780,7 @@ static irqreturn_t e1000_intr_msi(int __always_unused irq, void *data) + } + /* guard against interrupt when we're going down */ + if (!test_bit(__E1000_DOWN, &adapter->state)) +- mod_delayed_work(adapter->e1000_workqueue, +- &adapter->watchdog_task, HZ); ++ mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + + /* Reset on uncorrectable ECC error */ +@@ -1861,8 +1860,7 @@ static irqreturn_t e1000_intr(int __always_unused irq, void *data) + } + /* guard against interrupt when we're going down */ + if (!test_bit(__E1000_DOWN, &adapter->state)) +- mod_delayed_work(adapter->e1000_workqueue, +- &adapter->watchdog_task, HZ); ++ mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + + /* Reset on uncorrectable ECC error */ +@@ -1907,8 +1905,7 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data) + hw->mac.get_link_status = true; + /* guard against interrupt when we're going down */ + if (!test_bit(__E1000_DOWN, &adapter->state)) +- mod_delayed_work(adapter->e1000_workqueue, +- &adapter->watchdog_task, HZ); ++ mod_timer(&adapter->watchdog_timer, jiffies + 1); + } + + if (!test_bit(__E1000_DOWN, &adapter->state)) +@@ -4281,6 +4278,7 @@ void e1000e_down(struct e1000_adapter *adapter, bool reset) + + napi_synchronize(&adapter->napi); + ++ del_timer_sync(&adapter->watchdog_timer); + del_timer_sync(&adapter->phy_info_timer); + + spin_lock(&adapter->stats64_lock); +@@ -5152,11 +5150,25 @@ static void e1000e_check_82574_phy_workaround(struct e1000_adapter *adapter) + } + } + ++/** ++ * e1000_watchdog - Timer Call-back ++ * @data: pointer to adapter cast into an unsigned long ++ **/ ++static void e1000_watchdog(struct timer_list *t) ++{ ++ struct e1000_adapter *adapter = from_timer(adapter, t, watchdog_timer); ++ ++ /* Do the rest outside of interrupt context */ ++ schedule_work(&adapter->watchdog_task); ++ ++ /* TODO: make this use queue_delayed_work() */ ++} ++ + static void e1000_watchdog_task(struct work_struct *work) + { + struct e1000_adapter *adapter = container_of(work, + struct e1000_adapter, +- watchdog_task.work); ++ watchdog_task); + struct net_device *netdev = adapter->netdev; + struct e1000_mac_info *mac = &adapter->hw.mac; + struct e1000_phy_info *phy = &adapter->hw.phy; +@@ -5404,9 +5416,8 @@ link_up: + + /* Reset the timer */ + if (!test_bit(__E1000_DOWN, &adapter->state)) +- queue_delayed_work(adapter->e1000_workqueue, +- &adapter->watchdog_task, +- round_jiffies(2 * HZ)); ++ mod_timer(&adapter->watchdog_timer, ++ round_jiffies(jiffies + 2 * HZ)); + } + + #define E1000_TX_FLAGS_CSUM 0x00000001 +@@ -7259,21 +7270,11 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + goto err_eeprom; + } + +- adapter->e1000_workqueue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, +- e1000e_driver_name); +- +- if (!adapter->e1000_workqueue) { +- err = -ENOMEM; +- goto err_workqueue; +- } +- +- INIT_DELAYED_WORK(&adapter->watchdog_task, e1000_watchdog_task); +- queue_delayed_work(adapter->e1000_workqueue, &adapter->watchdog_task, +- 0); +- ++ timer_setup(&adapter->watchdog_timer, e1000_watchdog, 0); + timer_setup(&adapter->phy_info_timer, e1000_update_phy_info, 0); + + INIT_WORK(&adapter->reset_task, e1000_reset_task); ++ INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); + INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround); + INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task); + INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang); +@@ -7367,9 +7368,6 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + return 0; + + err_register: +- flush_workqueue(adapter->e1000_workqueue); +- destroy_workqueue(adapter->e1000_workqueue); +-err_workqueue: + if (!(adapter->flags & FLAG_HAS_AMT)) + e1000e_release_hw_control(adapter); + err_eeprom: +@@ -7407,26 +7405,22 @@ static void e1000_remove(struct pci_dev *pdev) + { + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev_priv(netdev); +- bool down = test_bit(__E1000_DOWN, &adapter->state); + + e1000e_ptp_remove(adapter); + + /* The timers may be rescheduled, so explicitly disable them + * from being rescheduled. + */ +- if (!down) +- set_bit(__E1000_DOWN, &adapter->state); ++ set_bit(__E1000_DOWN, &adapter->state); ++ del_timer_sync(&adapter->watchdog_timer); + del_timer_sync(&adapter->phy_info_timer); + + cancel_work_sync(&adapter->reset_task); ++ cancel_work_sync(&adapter->watchdog_task); + cancel_work_sync(&adapter->downshift_task); + cancel_work_sync(&adapter->update_phy_task); + cancel_work_sync(&adapter->print_hang_task); + +- cancel_delayed_work(&adapter->watchdog_task); +- flush_workqueue(adapter->e1000_workqueue); +- destroy_workqueue(adapter->e1000_workqueue); +- + if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) { + cancel_work_sync(&adapter->tx_hwtstamp_work); + if (adapter->tx_hwtstamp_skb) { +@@ -7435,9 +7429,6 @@ static void e1000_remove(struct pci_dev *pdev) + } + } + +- /* Don't lie to e1000_close() down the road. */ +- if (!down) +- clear_bit(__E1000_DOWN, &adapter->state); + unregister_netdev(netdev); + + if (pci_dev_run_wake(pdev)) +diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +index 3d2440838822..3515ace0f020 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +@@ -2322,6 +2322,22 @@ static int i40e_ctrl_vf_rx_rings(struct i40e_vsi *vsi, unsigned long q_map, + return ret; + } + ++/** ++ * i40e_vc_validate_vqs_bitmaps - validate Rx/Tx queue bitmaps from VIRTHCHNL ++ * @vqs: virtchnl_queue_select structure containing bitmaps to validate ++ * ++ * Returns true if validation was successful, else false. ++ */ ++static bool i40e_vc_validate_vqs_bitmaps(struct virtchnl_queue_select *vqs) ++{ ++ if ((!vqs->rx_queues && !vqs->tx_queues) || ++ vqs->rx_queues >= BIT(I40E_MAX_VF_QUEUES) || ++ vqs->tx_queues >= BIT(I40E_MAX_VF_QUEUES)) ++ return false; ++ ++ return true; ++} ++ + /** + * i40e_vc_enable_queues_msg + * @vf: pointer to the VF info +@@ -2347,7 +2363,7 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg) + goto error_param; + } + +- if ((0 == vqs->rx_queues) && (0 == vqs->tx_queues)) { ++ if (i40e_vc_validate_vqs_bitmaps(vqs)) { + aq_ret = I40E_ERR_PARAM; + goto error_param; + } +@@ -2409,9 +2425,7 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf *vf, u8 *msg) + goto error_param; + } + +- if ((vqs->rx_queues == 0 && vqs->tx_queues == 0) || +- vqs->rx_queues > I40E_MAX_VF_QUEUES || +- vqs->tx_queues > I40E_MAX_VF_QUEUES) { ++ if (i40e_vc_validate_vqs_bitmaps(vqs)) { + aq_ret = I40E_ERR_PARAM; + goto error_param; + } +diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h +index 29de3ae96ef2..bd1b1ed323f4 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf.h ++++ b/drivers/net/ethernet/intel/iavf/iavf.h +@@ -415,4 +415,6 @@ void iavf_enable_channels(struct iavf_adapter *adapter); + void iavf_disable_channels(struct iavf_adapter *adapter); + void iavf_add_cloud_filter(struct iavf_adapter *adapter); + void iavf_del_cloud_filter(struct iavf_adapter *adapter); ++struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, ++ const u8 *macaddr); + #endif /* _IAVF_H_ */ +diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c +index 821987da5698..8e16be960e96 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_main.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c +@@ -743,9 +743,8 @@ iavf_mac_filter *iavf_find_filter(struct iavf_adapter *adapter, + * + * Returns ptr to the filter object or NULL when no memory available. + **/ +-static struct +-iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, +- const u8 *macaddr) ++struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, ++ const u8 *macaddr) + { + struct iavf_mac_filter *f; + +@@ -2065,9 +2064,9 @@ static void iavf_reset_task(struct work_struct *work) + struct virtchnl_vf_resource *vfres = adapter->vf_res; + struct net_device *netdev = adapter->netdev; + struct iavf_hw *hw = &adapter->hw; ++ struct iavf_mac_filter *f, *ftmp; + struct iavf_vlan_filter *vlf; + struct iavf_cloud_filter *cf; +- struct iavf_mac_filter *f; + u32 reg_val; + int i = 0, err; + bool running; +@@ -2181,6 +2180,16 @@ continue_reset: + + spin_lock_bh(&adapter->mac_vlan_list_lock); + ++ /* Delete filter for the current MAC address, it could have ++ * been changed by the PF via administratively set MAC. ++ * Will be re-added via VIRTCHNL_OP_GET_VF_RESOURCES. ++ */ ++ list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) { ++ if (ether_addr_equal(f->macaddr, adapter->hw.mac.addr)) { ++ list_del(&f->list); ++ kfree(f); ++ } ++ } + /* re-add all MAC filters */ + list_for_each_entry(f, &adapter->mac_filter_list, list) { + f->add = true; +diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +index c46770eba320..1ab9cb339acb 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +@@ -1359,6 +1359,9 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, + ether_addr_copy(netdev->perm_addr, + adapter->hw.mac.addr); + } ++ spin_lock_bh(&adapter->mac_vlan_list_lock); ++ iavf_add_filter(adapter, adapter->hw.mac.addr); ++ spin_unlock_bh(&adapter->mac_vlan_list_lock); + iavf_process_config(adapter); + } + break; +diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c +index 8a6ef3514129..438b42ce2cd9 100644 +--- a/drivers/net/ethernet/intel/igb/e1000_82575.c ++++ b/drivers/net/ethernet/intel/igb/e1000_82575.c +@@ -530,7 +530,7 @@ static s32 igb_set_sfp_media_type_82575(struct e1000_hw *hw) + dev_spec->module_plugged = true; + if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) { + hw->phy.media_type = e1000_media_type_internal_serdes; +- } else if (eth_flags->e100_base_fx) { ++ } else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { + dev_spec->sgmii_active = true; + hw->phy.media_type = e1000_media_type_internal_serdes; + } else if (eth_flags->e1000_base_t) { +@@ -657,14 +657,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw) + break; + } + +- /* do not change link mode for 100BaseFX */ +- if (dev_spec->eth_flags.e100_base_fx) +- break; +- + /* change current link mode setting */ + ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK; + +- if (hw->phy.media_type == e1000_media_type_copper) ++ if (dev_spec->sgmii_active) + ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII; + else + ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES; +diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c +index 3182b059bf55..8959418776f6 100644 +--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c ++++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c +@@ -181,7 +181,7 @@ static int igb_get_link_ksettings(struct net_device *netdev, + advertising &= ~ADVERTISED_1000baseKX_Full; + } + } +- if (eth_flags->e100_base_fx) { ++ if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { + supported |= SUPPORTED_100baseT_Full; + advertising |= ADVERTISED_100baseT_Full; + } +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +index c6404abf2dd1..a26f9fb95ac0 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +@@ -5239,7 +5239,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + struct ixgbe_hw *hw = &adapter->hw; + struct hlist_node *node2; + struct ixgbe_fdir_filter *filter; +- u64 action; ++ u8 queue; + + spin_lock(&adapter->fdir_perfect_lock); + +@@ -5248,17 +5248,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + + hlist_for_each_entry_safe(filter, node2, + &adapter->fdir_filter_list, fdir_node) { +- action = filter->action; +- if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) +- action = +- (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; ++ if (filter->action == IXGBE_FDIR_DROP_QUEUE) { ++ queue = IXGBE_FDIR_DROP_QUEUE; ++ } else { ++ u32 ring = ethtool_get_flow_spec_ring(filter->action); ++ u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); ++ ++ if (!vf && (ring >= adapter->num_rx_queues)) { ++ e_err(drv, "FDIR restore failed without VF, ring: %u\n", ++ ring); ++ continue; ++ } else if (vf && ++ ((vf > adapter->num_vfs) || ++ ring >= adapter->num_rx_queues_per_pool)) { ++ e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", ++ vf, ring); ++ continue; ++ } ++ ++ /* Map the ring onto the absolute queue index */ ++ if (!vf) ++ queue = adapter->rx_ring[ring]->reg_idx; ++ else ++ queue = ((vf - 1) * ++ adapter->num_rx_queues_per_pool) + ring; ++ } + + ixgbe_fdir_write_perfect_filter_82599(hw, +- &filter->filter, +- filter->sw_idx, +- (action == IXGBE_FDIR_DROP_QUEUE) ? +- IXGBE_FDIR_DROP_QUEUE : +- adapter->rx_ring[action]->reg_idx); ++ &filter->filter, filter->sw_idx, queue); + } + + spin_unlock(&adapter->fdir_perfect_lock); +diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +index 076f2da36f27..64ec0e7c64b4 100644 +--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c ++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +@@ -2081,11 +2081,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev) + struct ixgbe_hw *hw = &adapter->hw; + int count = 0; + +- if ((netdev_uc_count(netdev)) > 10) { +- pr_err("Too many unicast filters - No Space\n"); +- return -ENOSPC; +- } +- + if (!netdev_uc_empty(netdev)) { + struct netdev_hw_addr *ha; + +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +index a496390b8632..07f9067affc6 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +@@ -2043,6 +2043,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, + break; + } + entry += p_hdr->size; ++ cond_resched(); + } + p_dev->ahw->reset.seq_index = index; + } +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +index afa10a163da1..f34ae8c75bc5 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, + addr += 16; + reg_read -= 16; + ret += 16; ++ cond_resched(); + } + out: + mutex_unlock(&adapter->ahw->mem_lock); +@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) + buf_offset += entry->hdr.cap_size; + entry_offset += entry->hdr.offset; + buffer = fw_dump->data + buf_offset; ++ cond_resched(); + } + + fw_dump->clr = 1; +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 4196c0e32740..9485c8d1de8a 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1062,6 +1062,7 @@ static const struct usb_device_id products[] = { + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ ++ {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ + + /* 3. Combined interface devices matching on interface number */ + {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ +diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c +index 9e4b7a400284..6912624eed4a 100644 +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -29,7 +29,7 @@ + #define NETNEXT_VERSION "10" + + /* Information for net */ +-#define NET_VERSION "10" ++#define NET_VERSION "11" + + #define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION + #define DRIVER_AUTHOR "Realtek linux nic maintainers " +@@ -63,6 +63,7 @@ + #define PLA_LED_FEATURE 0xdd92 + #define PLA_PHYAR 0xde00 + #define PLA_BOOT_CTRL 0xe004 ++#define PLA_LWAKE_CTRL_REG 0xe007 + #define PLA_GPHY_INTR_IMR 0xe022 + #define PLA_EEE_CR 0xe040 + #define PLA_EEEP_CR 0xe080 +@@ -90,6 +91,7 @@ + #define PLA_TALLYCNT 0xe890 + #define PLA_SFF_STS_7 0xe8de + #define PLA_PHYSTATUS 0xe908 ++#define PLA_CONFIG6 0xe90a /* CONFIG6 */ + #define PLA_BP_BA 0xfc26 + #define PLA_BP_0 0xfc28 + #define PLA_BP_1 0xfc2a +@@ -102,6 +104,7 @@ + #define PLA_BP_EN 0xfc38 + + #define USB_USB2PHY 0xb41e ++#define USB_SSPHYLINK1 0xb426 + #define USB_SSPHYLINK2 0xb428 + #define USB_U2P3_CTRL 0xb460 + #define USB_CSR_DUMMY1 0xb464 +@@ -286,6 +289,9 @@ + #define LINK_ON_WAKE_EN 0x0010 + #define LINK_OFF_WAKE_EN 0x0008 + ++/* PLA_CONFIG6 */ ++#define LANWAKE_CLR_EN BIT(0) ++ + /* PLA_CONFIG5 */ + #define BWF_EN 0x0040 + #define MWF_EN 0x0020 +@@ -298,6 +304,7 @@ + /* PLA_PHY_PWR */ + #define TX_10M_IDLE_EN 0x0080 + #define PFM_PWM_SWITCH 0x0040 ++#define TEST_IO_OFF BIT(4) + + /* PLA_MAC_PWR_CTRL */ + #define D3_CLK_GATED_EN 0x00004000 +@@ -310,6 +317,7 @@ + #define MAC_CLK_SPDWN_EN BIT(15) + + /* PLA_MAC_PWR_CTRL3 */ ++#define PLA_MCU_SPDWN_EN BIT(14) + #define PKT_AVAIL_SPDWN_EN 0x0100 + #define SUSPEND_SPDWN_EN 0x0004 + #define U1U2_SPDWN_EN 0x0002 +@@ -340,6 +348,9 @@ + /* PLA_BOOT_CTRL */ + #define AUTOLOAD_DONE 0x0002 + ++/* PLA_LWAKE_CTRL_REG */ ++#define LANWAKE_PIN BIT(7) ++ + /* PLA_SUSPEND_FLAG */ + #define LINK_CHG_EVENT BIT(0) + +@@ -353,6 +364,9 @@ + #define USB2PHY_SUSPEND 0x0001 + #define USB2PHY_L1 0x0002 + ++/* USB_SSPHYLINK1 */ ++#define DELAY_PHY_PWR_CHG BIT(1) ++ + /* USB_SSPHYLINK2 */ + #define pwd_dn_scale_mask 0x3ffe + #define pwd_dn_scale(x) ((x) << 1) +@@ -3175,7 +3189,6 @@ static void rtl8153b_runtime_enable(struct r8152 *tp, bool enable) + r8153b_ups_en(tp, false); + r8153_queue_wake(tp, false); + rtl_runtime_suspend_enable(tp, false); +- r8153_u2p3en(tp, true); + r8153b_u1u2en(tp, true); + } + } +@@ -3703,7 +3716,6 @@ static void r8153b_hw_phy_cfg(struct r8152 *tp) + + r8153_aldps_en(tp, true); + r8152b_enable_fc(tp); +- r8153_u2p3en(tp, true); + + set_bit(PHY_RESET, &tp->flags); + } +@@ -4004,6 +4016,8 @@ static void rtl8152_down(struct r8152 *tp) + + static void rtl8153_up(struct r8152 *tp) + { ++ u32 ocp_data; ++ + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + return; + +@@ -4011,6 +4025,19 @@ static void rtl8153_up(struct r8152 *tp) + r8153_u2p3en(tp, false); + r8153_aldps_en(tp, false); + r8153_first_init(tp); ++ ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); ++ ocp_data |= LANWAKE_CLR_EN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); ++ ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG); ++ ocp_data &= ~LANWAKE_PIN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data); ++ ++ ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_SSPHYLINK1); ++ ocp_data &= ~DELAY_PHY_PWR_CHG; ++ ocp_write_word(tp, MCU_TYPE_USB, USB_SSPHYLINK1, ocp_data); ++ + r8153_aldps_en(tp, true); + + switch (tp->version) { +@@ -4029,11 +4056,17 @@ static void rtl8153_up(struct r8152 *tp) + + static void rtl8153_down(struct r8152 *tp) + { ++ u32 ocp_data; ++ + if (test_bit(RTL8152_UNPLUG, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } + ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); ++ ocp_data &= ~LANWAKE_CLR_EN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); ++ + r8153_u1u2en(tp, false); + r8153_u2p3en(tp, false); + r8153_power_cut_en(tp, false); +@@ -4044,6 +4077,8 @@ static void rtl8153_down(struct r8152 *tp) + + static void rtl8153b_up(struct r8152 *tp) + { ++ u32 ocp_data; ++ + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + return; + +@@ -4054,18 +4089,27 @@ static void rtl8153b_up(struct r8152 *tp) + r8153_first_init(tp); + ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_B); + ++ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); ++ ocp_data &= ~PLA_MCU_SPDWN_EN; ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); ++ + r8153_aldps_en(tp, true); +- r8153_u2p3en(tp, true); + r8153b_u1u2en(tp, true); + } + + static void rtl8153b_down(struct r8152 *tp) + { ++ u32 ocp_data; ++ + if (test_bit(RTL8152_UNPLUG, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } + ++ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); ++ ocp_data |= PLA_MCU_SPDWN_EN; ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); ++ + r8153b_u1u2en(tp, false); + r8153_u2p3en(tp, false); + r8153b_power_cut_en(tp, false); +@@ -4454,6 +4498,14 @@ static void r8153_init(struct r8152 *tp) + r8153_mac_clk_spd(tp, false); + usb_enable_lpm(tp->udev); + ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); ++ ocp_data |= LANWAKE_CLR_EN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); ++ ++ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG); ++ ocp_data &= ~LANWAKE_PIN; ++ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data); ++ + /* rx aggregation */ + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); + ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); +@@ -4526,6 +4578,19 @@ static void r8153b_init(struct r8152 *tp) + ocp_data |= MAC_CLK_SPDWN_EN; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, ocp_data); + ++ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); ++ ocp_data &= ~PLA_MCU_SPDWN_EN; ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); ++ ++ if (tp->version == RTL_VER_09) { ++ /* Disable Test IO for 32QFN */ ++ if (ocp_read_byte(tp, MCU_TYPE_PLA, 0xdc00) & BIT(5)) { ++ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); ++ ocp_data |= TEST_IO_OFF; ++ ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); ++ } ++ } ++ + set_bit(GREEN_ETHERNET, &tp->flags); + + /* rx aggregation */ +@@ -5690,6 +5755,11 @@ static int rtl8152_probe(struct usb_interface *intf, + + intf->needs_remote_wakeup = 1; + ++ if (!rtl_can_wakeup(tp)) ++ __rtl_set_wol(tp, 0); ++ else ++ tp->saved_wolopts = __rtl_get_wol(tp); ++ + tp->rtl_ops.init(tp); + queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0); + set_ethernet_addr(tp); +@@ -5703,10 +5773,6 @@ static int rtl8152_probe(struct usb_interface *intf, + goto out1; + } + +- if (!rtl_can_wakeup(tp)) +- __rtl_set_wol(tp, 0); +- +- tp->saved_wolopts = __rtl_get_wol(tp); + if (tp->saved_wolopts) + device_set_wakeup_enable(&udev->dev, true); + else +diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c +index 3029e3f6de63..621cd7206b7c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c +@@ -267,7 +267,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv, + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + struct iwl_station_priv *sta_priv = NULL; + struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; +- struct iwl_device_cmd *dev_cmd; ++ struct iwl_device_tx_cmd *dev_cmd; + struct iwl_tx_cmd *tx_cmd; + __le16 fc; + u8 hdr_len; +@@ -348,7 +348,6 @@ int iwlagn_tx_skb(struct iwl_priv *priv, + if (unlikely(!dev_cmd)) + goto drop_unlock_priv; + +- memset(dev_cmd, 0, sizeof(*dev_cmd)); + dev_cmd->hdr.cmd = REPLY_TX; + tx_cmd = (struct iwl_tx_cmd *) dev_cmd->payload; + +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +index 87421807e040..386ca67ec7b4 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +@@ -2490,12 +2490,7 @@ int iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, + { + int ret = 0; + +- /* if the FW crashed or not debug monitor cfg was given, there is +- * no point in changing the recording state +- */ +- if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status) || +- (!fwrt->trans->dbg.dest_tlv && +- fwrt->trans->dbg.ini_dest == IWL_FW_INI_LOCATION_INVALID)) ++ if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) + return 0; + + if (fw_has_capa(&fwrt->fw->ucode_capa, +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +index c8972f6e38ba..5d546dac7814 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +@@ -225,6 +225,34 @@ enum iwl_nvm_channel_flags { + NVM_CHANNEL_DC_HIGH = BIT(12), + }; + ++/** ++ * enum iwl_reg_capa_flags - global flags applied for the whole regulatory ++ * domain. ++ * @REG_CAPA_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the ++ * 2.4Ghz band is allowed. ++ * @REG_CAPA_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the ++ * 5Ghz band is allowed. ++ * @REG_CAPA_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed ++ * for this regulatory domain (valid only in 5Ghz). ++ * @REG_CAPA_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed ++ * for this regulatory domain (valid only in 5Ghz). ++ * @REG_CAPA_MCS_8_ALLOWED: 11ac with MCS 8 is allowed. ++ * @REG_CAPA_MCS_9_ALLOWED: 11ac with MCS 9 is allowed. ++ * @REG_CAPA_40MHZ_FORBIDDEN: 11n channel with a width of 40Mhz is forbidden ++ * for this regulatory domain (valid only in 5Ghz). ++ * @REG_CAPA_DC_HIGH_ENABLED: DC HIGH allowed. ++ */ ++enum iwl_reg_capa_flags { ++ REG_CAPA_BF_CCD_LOW_BAND = BIT(0), ++ REG_CAPA_BF_CCD_HIGH_BAND = BIT(1), ++ REG_CAPA_160MHZ_ALLOWED = BIT(2), ++ REG_CAPA_80MHZ_ALLOWED = BIT(3), ++ REG_CAPA_MCS_8_ALLOWED = BIT(4), ++ REG_CAPA_MCS_9_ALLOWED = BIT(5), ++ REG_CAPA_40MHZ_FORBIDDEN = BIT(7), ++ REG_CAPA_DC_HIGH_ENABLED = BIT(9), ++}; ++ + static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level, + int chan, u32 flags) + { +@@ -1031,6 +1059,7 @@ IWL_EXPORT_SYMBOL(iwl_parse_nvm_data); + + static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan, + int ch_idx, u16 nvm_flags, ++ u16 cap_flags, + const struct iwl_cfg *cfg) + { + u32 flags = NL80211_RRF_NO_HT40; +@@ -1069,13 +1098,27 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan, + (flags & NL80211_RRF_NO_IR)) + flags |= NL80211_RRF_GO_CONCURRENT; + ++ /* ++ * cap_flags is per regulatory domain so apply it for every channel ++ */ ++ if (ch_idx >= NUM_2GHZ_CHANNELS) { ++ if (cap_flags & REG_CAPA_40MHZ_FORBIDDEN) ++ flags |= NL80211_RRF_NO_HT40; ++ ++ if (!(cap_flags & REG_CAPA_80MHZ_ALLOWED)) ++ flags |= NL80211_RRF_NO_80MHZ; ++ ++ if (!(cap_flags & REG_CAPA_160MHZ_ALLOWED)) ++ flags |= NL80211_RRF_NO_160MHZ; ++ } ++ + return flags; + } + + struct ieee80211_regdomain * + iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, + int num_of_ch, __le32 *channels, u16 fw_mcc, +- u16 geo_info) ++ u16 geo_info, u16 cap) + { + int ch_idx; + u16 ch_flags; +@@ -1133,7 +1176,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, + } + + reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx, +- ch_flags, cfg); ++ ch_flags, cap, ++ cfg); + + /* we can't continue the same rule */ + if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags || +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h +index b7e1ddf8f177..4eeedb41e9ac 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h +@@ -7,7 +7,7 @@ + * + * Copyright(c) 2008 - 2015 Intel Corporation. All rights reserved. + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH +- * Copyright(c) 2018 Intel Corporation ++ * Copyright(c) 2018 - 2019 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as +@@ -29,7 +29,7 @@ + * + * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH +- * Copyright(c) 2018 Intel Corporation ++ * Copyright(c) 2018 - 2019 Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without +@@ -103,7 +103,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg, + struct ieee80211_regdomain * + iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, + int num_of_ch, __le32 *channels, u16 fw_mcc, +- u16 geo_info); ++ u16 geo_info, u16 cap); + + /** + * struct iwl_nvm_section - describes an NVM section in memory. +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c +index 28bdc9a9617e..f91197e4ae40 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c +@@ -66,7 +66,9 @@ + + struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, + struct device *dev, +- const struct iwl_trans_ops *ops) ++ const struct iwl_trans_ops *ops, ++ unsigned int cmd_pool_size, ++ unsigned int cmd_pool_align) + { + struct iwl_trans *trans; + #ifdef CONFIG_LOCKDEP +@@ -90,10 +92,8 @@ struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, + "iwl_cmd_pool:%s", dev_name(trans->dev)); + trans->dev_cmd_pool = + kmem_cache_create(trans->dev_cmd_pool_name, +- sizeof(struct iwl_device_cmd), +- sizeof(void *), +- SLAB_HWCACHE_ALIGN, +- NULL); ++ cmd_pool_size, cmd_pool_align, ++ SLAB_HWCACHE_ALIGN, NULL); + if (!trans->dev_cmd_pool) + return NULL; + +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +index a31408188ed0..1e85d59b9161 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +@@ -193,6 +193,18 @@ struct iwl_device_cmd { + }; + } __packed; + ++/** ++ * struct iwl_device_tx_cmd - buffer for TX command ++ * @hdr: the header ++ * @payload: the payload placeholder ++ * ++ * The actual structure is sized dynamically according to need. ++ */ ++struct iwl_device_tx_cmd { ++ struct iwl_cmd_header hdr; ++ u8 payload[]; ++} __packed; ++ + #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_device_cmd)) + + /* +@@ -544,7 +556,7 @@ struct iwl_trans_ops { + int (*send_cmd)(struct iwl_trans *trans, struct iwl_host_cmd *cmd); + + int (*tx)(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int queue); ++ struct iwl_device_tx_cmd *dev_cmd, int queue); + void (*reclaim)(struct iwl_trans *trans, int queue, int ssn, + struct sk_buff_head *skbs); + +@@ -921,22 +933,22 @@ iwl_trans_dump_data(struct iwl_trans *trans, u32 dump_mask) + return trans->ops->dump_data(trans, dump_mask); + } + +-static inline struct iwl_device_cmd * ++static inline struct iwl_device_tx_cmd * + iwl_trans_alloc_tx_cmd(struct iwl_trans *trans) + { +- return kmem_cache_alloc(trans->dev_cmd_pool, GFP_ATOMIC); ++ return kmem_cache_zalloc(trans->dev_cmd_pool, GFP_ATOMIC); + } + + int iwl_trans_send_cmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd); + + static inline void iwl_trans_free_tx_cmd(struct iwl_trans *trans, +- struct iwl_device_cmd *dev_cmd) ++ struct iwl_device_tx_cmd *dev_cmd) + { + kmem_cache_free(trans->dev_cmd_pool, dev_cmd); + } + + static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int queue) ++ struct iwl_device_tx_cmd *dev_cmd, int queue) + { + if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status))) + return -EIO; +@@ -1239,7 +1251,9 @@ static inline bool iwl_trans_dbg_ini_valid(struct iwl_trans *trans) + *****************************************************/ + struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, + struct device *dev, +- const struct iwl_trans_ops *ops); ++ const struct iwl_trans_ops *ops, ++ unsigned int cmd_pool_size, ++ unsigned int cmd_pool_align); + void iwl_trans_free(struct iwl_trans *trans); + + /***************************************************** +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +index 49aeab7c27a2..18ccc2692437 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +@@ -256,7 +256,8 @@ struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy, + __le32_to_cpu(resp->n_channels), + resp->channels, + __le16_to_cpu(resp->mcc), +- __le16_to_cpu(resp->geo_info)); ++ __le16_to_cpu(resp->geo_info), ++ __le16_to_cpu(resp->cap)); + /* Store the return source id */ + src_id = resp->source_id; + kfree(resp); +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +index d9d82f6b5e87..2b92980a49e6 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +@@ -487,13 +487,13 @@ static void iwl_mvm_set_tx_cmd_crypto(struct iwl_mvm *mvm, + /* + * Allocates and sets the Tx cmd the driver data pointers in the skb + */ +-static struct iwl_device_cmd * ++static struct iwl_device_tx_cmd * + iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb, + struct ieee80211_tx_info *info, int hdrlen, + struct ieee80211_sta *sta, u8 sta_id) + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +- struct iwl_device_cmd *dev_cmd; ++ struct iwl_device_tx_cmd *dev_cmd; + struct iwl_tx_cmd *tx_cmd; + + dev_cmd = iwl_trans_alloc_tx_cmd(mvm->trans); +@@ -501,11 +501,6 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb, + if (unlikely(!dev_cmd)) + return NULL; + +- /* Make sure we zero enough of dev_cmd */ +- BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_gen2) > sizeof(*tx_cmd)); +- BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_gen3) > sizeof(*tx_cmd)); +- +- memset(dev_cmd, 0, sizeof(dev_cmd->hdr) + sizeof(*tx_cmd)); + dev_cmd->hdr.cmd = TX_CMD; + + if (iwl_mvm_has_new_tx_api(mvm)) { +@@ -594,7 +589,7 @@ out: + } + + static void iwl_mvm_skb_prepare_status(struct sk_buff *skb, +- struct iwl_device_cmd *cmd) ++ struct iwl_device_tx_cmd *cmd) + { + struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb); + +@@ -713,7 +708,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + struct ieee80211_tx_info info; +- struct iwl_device_cmd *dev_cmd; ++ struct iwl_device_tx_cmd *dev_cmd; + u8 sta_id; + int hdrlen = ieee80211_hdrlen(hdr->frame_control); + __le16 fc = hdr->frame_control; +@@ -1075,7 +1070,7 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb, + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + struct iwl_mvm_sta *mvmsta; +- struct iwl_device_cmd *dev_cmd; ++ struct iwl_device_tx_cmd *dev_cmd; + __le16 fc; + u16 seq_number = 0; + u8 tid = IWL_MAX_TID_COUNT; +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +index 1047d48beaa5..9b5b96e34456 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +@@ -305,7 +305,7 @@ struct iwl_cmd_meta { + #define IWL_FIRST_TB_SIZE_ALIGN ALIGN(IWL_FIRST_TB_SIZE, 64) + + struct iwl_pcie_txq_entry { +- struct iwl_device_cmd *cmd; ++ void *cmd; + struct sk_buff *skb; + /* buffer to free after command completes */ + const void *free_buf; +@@ -690,7 +690,7 @@ void iwl_trans_pcie_txq_set_shared_mode(struct iwl_trans *trans, u32 txq_id, + void iwl_trans_pcie_log_scd_error(struct iwl_trans *trans, + struct iwl_txq *txq); + int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int txq_id); ++ struct iwl_device_tx_cmd *dev_cmd, int txq_id); + void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans); + int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd); + void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx); +@@ -1111,7 +1111,7 @@ int iwl_trans_pcie_dyn_txq_alloc(struct iwl_trans *trans, + unsigned int timeout); + void iwl_trans_pcie_dyn_txq_free(struct iwl_trans *trans, int queue); + int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int txq_id); ++ struct iwl_device_tx_cmd *dev_cmd, int txq_id); + int iwl_trans_pcie_gen2_send_hcmd(struct iwl_trans *trans, + struct iwl_host_cmd *cmd); + void iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans); +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +index d3db38c3095b..c76d26708e65 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +@@ -79,6 +79,7 @@ + #include "iwl-agn-hw.h" + #include "fw/error-dump.h" + #include "fw/dbg.h" ++#include "fw/api/tx.h" + #include "internal.h" + #include "iwl-fh.h" + +@@ -3462,19 +3463,34 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, + { + struct iwl_trans_pcie *trans_pcie; + struct iwl_trans *trans; +- int ret, addr_size; ++ int ret, addr_size, txcmd_size, txcmd_align; ++ const struct iwl_trans_ops *ops = &trans_ops_pcie_gen2; ++ ++ if (!cfg_trans->gen2) { ++ ops = &trans_ops_pcie; ++ txcmd_size = sizeof(struct iwl_tx_cmd); ++ txcmd_align = sizeof(void *); ++ } else if (cfg_trans->device_family < IWL_DEVICE_FAMILY_AX210) { ++ txcmd_size = sizeof(struct iwl_tx_cmd_gen2); ++ txcmd_align = 64; ++ } else { ++ txcmd_size = sizeof(struct iwl_tx_cmd_gen3); ++ txcmd_align = 128; ++ } ++ ++ txcmd_size += sizeof(struct iwl_cmd_header); ++ txcmd_size += 36; /* biggest possible 802.11 header */ ++ ++ /* Ensure device TX cmd cannot reach/cross a page boundary in gen2 */ ++ if (WARN_ON(cfg_trans->gen2 && txcmd_size >= txcmd_align)) ++ return ERR_PTR(-EINVAL); + + ret = pcim_enable_device(pdev); + if (ret) + return ERR_PTR(ret); + +- if (cfg_trans->gen2) +- trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), +- &pdev->dev, &trans_ops_pcie_gen2); +- else +- trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), +- &pdev->dev, &trans_ops_pcie); +- ++ trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), &pdev->dev, ops, ++ txcmd_size, txcmd_align); + if (!trans) + return ERR_PTR(-ENOMEM); + +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +index 97cb3a8d505c..ff4c34d7b74f 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +@@ -243,7 +243,8 @@ static int iwl_pcie_gen2_set_tb(struct iwl_trans *trans, + static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans, + struct sk_buff *skb, + struct iwl_tfh_tfd *tfd, int start_len, +- u8 hdr_len, struct iwl_device_cmd *dev_cmd) ++ u8 hdr_len, ++ struct iwl_device_tx_cmd *dev_cmd) + { + #ifdef CONFIG_INET + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); +@@ -371,7 +372,7 @@ out_err: + static struct + iwl_tfh_tfd *iwl_pcie_gen2_build_tx_amsdu(struct iwl_trans *trans, + struct iwl_txq *txq, +- struct iwl_device_cmd *dev_cmd, ++ struct iwl_device_tx_cmd *dev_cmd, + struct sk_buff *skb, + struct iwl_cmd_meta *out_meta, + int hdr_len, +@@ -403,6 +404,10 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx_amsdu(struct iwl_trans *trans, + tb_phys = dma_map_single(trans->dev, tb1_addr, len, DMA_TO_DEVICE); + if (unlikely(dma_mapping_error(trans->dev, tb_phys))) + goto out_err; ++ /* ++ * No need for _with_wa(), we ensure (via alignment) that the data ++ * here can never cross or end at a page boundary. ++ */ + iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, len); + + if (iwl_pcie_gen2_build_amsdu(trans, skb, tfd, +@@ -456,7 +461,7 @@ static int iwl_pcie_gen2_tx_add_frags(struct iwl_trans *trans, + static struct + iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, + struct iwl_txq *txq, +- struct iwl_device_cmd *dev_cmd, ++ struct iwl_device_tx_cmd *dev_cmd, + struct sk_buff *skb, + struct iwl_cmd_meta *out_meta, + int hdr_len, +@@ -496,6 +501,10 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, + tb_phys = dma_map_single(trans->dev, tb1_addr, tb1_len, DMA_TO_DEVICE); + if (unlikely(dma_mapping_error(trans->dev, tb_phys))) + goto out_err; ++ /* ++ * No need for _with_wa(), we ensure (via alignment) that the data ++ * here can never cross or end at a page boundary. ++ */ + iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb1_len); + trace_iwlwifi_dev_tx(trans->dev, skb, tfd, sizeof(*tfd), &dev_cmd->hdr, + IWL_FIRST_TB_SIZE + tb1_len, hdr_len); +@@ -540,7 +549,7 @@ out_err: + static + struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans, + struct iwl_txq *txq, +- struct iwl_device_cmd *dev_cmd, ++ struct iwl_device_tx_cmd *dev_cmd, + struct sk_buff *skb, + struct iwl_cmd_meta *out_meta) + { +@@ -580,7 +589,7 @@ struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans, + } + + int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int txq_id) ++ struct iwl_device_tx_cmd *dev_cmd, int txq_id) + { + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); + struct iwl_cmd_meta *out_meta; +@@ -605,7 +614,7 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, + + /* don't put the packet on the ring, if there is no room */ + if (unlikely(iwl_queue_space(trans, txq) < 3)) { +- struct iwl_device_cmd **dev_cmd_ptr; ++ struct iwl_device_tx_cmd **dev_cmd_ptr; + + dev_cmd_ptr = (void *)((u8 *)skb->cb + + trans_pcie->dev_cmd_offs); +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +index 4806a04cec8c..d3b58334e13e 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +@@ -213,8 +213,8 @@ static void iwl_pcie_txq_update_byte_cnt_tbl(struct iwl_trans *trans, + u8 sec_ctl = 0; + u16 len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE; + __le16 bc_ent; +- struct iwl_tx_cmd *tx_cmd = +- (void *)txq->entries[txq->write_ptr].cmd->payload; ++ struct iwl_device_tx_cmd *dev_cmd = txq->entries[txq->write_ptr].cmd; ++ struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; + u8 sta_id = tx_cmd->sta_id; + + scd_bc_tbl = trans_pcie->scd_bc_tbls.addr; +@@ -257,8 +257,8 @@ static void iwl_pcie_txq_inval_byte_cnt_tbl(struct iwl_trans *trans, + int read_ptr = txq->read_ptr; + u8 sta_id = 0; + __le16 bc_ent; +- struct iwl_tx_cmd *tx_cmd = +- (void *)txq->entries[read_ptr].cmd->payload; ++ struct iwl_device_tx_cmd *dev_cmd = txq->entries[read_ptr].cmd; ++ struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; + + WARN_ON(read_ptr >= TFD_QUEUE_SIZE_MAX); + +@@ -1196,7 +1196,7 @@ void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn, + + while (!skb_queue_empty(&overflow_skbs)) { + struct sk_buff *skb = __skb_dequeue(&overflow_skbs); +- struct iwl_device_cmd *dev_cmd_ptr; ++ struct iwl_device_tx_cmd *dev_cmd_ptr; + + dev_cmd_ptr = *(void **)((u8 *)skb->cb + + trans_pcie->dev_cmd_offs); +@@ -2099,7 +2099,8 @@ static void iwl_compute_pseudo_hdr_csum(void *iph, struct tcphdr *tcph, + static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, + struct iwl_txq *txq, u8 hdr_len, + struct iwl_cmd_meta *out_meta, +- struct iwl_device_cmd *dev_cmd, u16 tb1_len) ++ struct iwl_device_tx_cmd *dev_cmd, ++ u16 tb1_len) + { + struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; + struct iwl_trans_pcie *trans_pcie = txq->trans_pcie; +@@ -2281,7 +2282,8 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, + static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, + struct iwl_txq *txq, u8 hdr_len, + struct iwl_cmd_meta *out_meta, +- struct iwl_device_cmd *dev_cmd, u16 tb1_len) ++ struct iwl_device_tx_cmd *dev_cmd, ++ u16 tb1_len) + { + /* No A-MSDU without CONFIG_INET */ + WARN_ON(1); +@@ -2291,7 +2293,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, + #endif /* CONFIG_INET */ + + int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, +- struct iwl_device_cmd *dev_cmd, int txq_id) ++ struct iwl_device_tx_cmd *dev_cmd, int txq_id) + { + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); + struct ieee80211_hdr *hdr; +@@ -2348,7 +2350,7 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, + + /* don't put the packet on the ring, if there is no room */ + if (unlikely(iwl_queue_space(trans, txq) < 3)) { +- struct iwl_device_cmd **dev_cmd_ptr; ++ struct iwl_device_tx_cmd **dev_cmd_ptr; + + dev_cmd_ptr = (void *)((u8 *)skb->cb + + trans_pcie->dev_cmd_offs); +diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c +index d6cdabef264d..4b9e406b8461 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_usb.c ++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c +@@ -805,7 +805,7 @@ static int rsi_probe(struct usb_interface *pfunction, + adapter->device_model = RSI_DEV_9116; + } else { + rsi_dbg(ERR_ZONE, "%s: Unsupported RSI device id 0x%x\n", +- __func__, id ? id->idProduct : 0x0); ++ __func__, id->idProduct); + goto err1; + } + +diff --git a/drivers/platform/x86/gpd-pocket-fan.c b/drivers/platform/x86/gpd-pocket-fan.c +index 73eb1572b966..b471b86c28fe 100644 +--- a/drivers/platform/x86/gpd-pocket-fan.c ++++ b/drivers/platform/x86/gpd-pocket-fan.c +@@ -127,7 +127,7 @@ static int gpd_pocket_fan_probe(struct platform_device *pdev) + int i; + + for (i = 0; i < ARRAY_SIZE(temp_limits); i++) { +- if (temp_limits[i] < 40000 || temp_limits[i] > 70000) { ++ if (temp_limits[i] < 20000 || temp_limits[i] > 90000) { + dev_err(&pdev->dev, "Invalid temp-limit %d (must be between 40000 and 70000)\n", + temp_limits[i]); + temp_limits[0] = TEMP_LIMIT0_DEFAULT; +diff --git a/drivers/platform/x86/intel_pmc_core_pltdrv.c b/drivers/platform/x86/intel_pmc_core_pltdrv.c +index 6fe829f30997..e1266f5c6359 100644 +--- a/drivers/platform/x86/intel_pmc_core_pltdrv.c ++++ b/drivers/platform/x86/intel_pmc_core_pltdrv.c +@@ -44,6 +44,8 @@ static const struct x86_cpu_id intel_pmc_core_platform_ids[] = { + INTEL_CPU_FAM6(KABYLAKE, pmc_core_device), + INTEL_CPU_FAM6(CANNONLAKE_L, pmc_core_device), + INTEL_CPU_FAM6(ICELAKE_L, pmc_core_device), ++ INTEL_CPU_FAM6(COMETLAKE, pmc_core_device), ++ INTEL_CPU_FAM6(COMETLAKE_L, pmc_core_device), + {} + }; + MODULE_DEVICE_TABLE(x86cpu, intel_pmc_core_platform_ids); +diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c +index a1915061932e..5256e3ce84e5 100644 +--- a/drivers/s390/crypto/ap_bus.c ++++ b/drivers/s390/crypto/ap_bus.c +@@ -793,8 +793,6 @@ static int ap_device_probe(struct device *dev) + drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT; + if (!!devres != !!drvres) + return -ENODEV; +- /* (re-)init queue's state machine */ +- ap_queue_reinit_state(to_ap_queue(dev)); + } + + /* Add queue/card to list of active queues/cards */ +diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h +index 433b7b64368d..bb35ba4a8d24 100644 +--- a/drivers/s390/crypto/ap_bus.h ++++ b/drivers/s390/crypto/ap_bus.h +@@ -261,7 +261,7 @@ void ap_queue_prepare_remove(struct ap_queue *aq); + void ap_queue_remove(struct ap_queue *aq); + void ap_queue_suspend(struct ap_device *ap_dev); + void ap_queue_resume(struct ap_device *ap_dev); +-void ap_queue_reinit_state(struct ap_queue *aq); ++void ap_queue_init_state(struct ap_queue *aq); + + struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type, + int comp_device_type, unsigned int functions); +diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c +index dad2be333d82..37c3bdc3642d 100644 +--- a/drivers/s390/crypto/ap_queue.c ++++ b/drivers/s390/crypto/ap_queue.c +@@ -638,7 +638,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type) + aq->ap_dev.device.type = &ap_queue_type; + aq->ap_dev.device_type = device_type; + aq->qid = qid; +- aq->state = AP_STATE_RESET_START; ++ aq->state = AP_STATE_UNBOUND; + aq->interrupt = AP_INTR_DISABLED; + spin_lock_init(&aq->lock); + INIT_LIST_HEAD(&aq->list); +@@ -771,10 +771,11 @@ void ap_queue_remove(struct ap_queue *aq) + spin_unlock_bh(&aq->lock); + } + +-void ap_queue_reinit_state(struct ap_queue *aq) ++void ap_queue_init_state(struct ap_queue *aq) + { + spin_lock_bh(&aq->lock); + aq->state = AP_STATE_RESET_START; + ap_wait(ap_sm_event(aq, AP_EVENT_POLL)); + spin_unlock_bh(&aq->lock); + } ++EXPORT_SYMBOL(ap_queue_init_state); +diff --git a/drivers/s390/crypto/zcrypt_cex2a.c b/drivers/s390/crypto/zcrypt_cex2a.c +index c50f3e86cc74..7cbb384ec535 100644 +--- a/drivers/s390/crypto/zcrypt_cex2a.c ++++ b/drivers/s390/crypto/zcrypt_cex2a.c +@@ -175,6 +175,7 @@ static int zcrypt_cex2a_queue_probe(struct ap_device *ap_dev) + zq->queue = aq; + zq->online = 1; + atomic_set(&zq->load, 0); ++ ap_queue_init_state(aq); + ap_queue_init_reply(aq, &zq->reply); + aq->request_timeout = CEX2A_CLEANUP_TIME, + aq->private = zq; +diff --git a/drivers/s390/crypto/zcrypt_cex2c.c b/drivers/s390/crypto/zcrypt_cex2c.c +index 35c7c6672713..c78c0d119806 100644 +--- a/drivers/s390/crypto/zcrypt_cex2c.c ++++ b/drivers/s390/crypto/zcrypt_cex2c.c +@@ -220,6 +220,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev) + zq->queue = aq; + zq->online = 1; + atomic_set(&zq->load, 0); ++ ap_rapq(aq->qid); + rc = zcrypt_cex2c_rng_supported(aq); + if (rc < 0) { + zcrypt_queue_free(zq); +@@ -231,6 +232,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev) + else + zq->ops = zcrypt_msgtype(MSGTYPE06_NAME, + MSGTYPE06_VARIANT_NORNG); ++ ap_queue_init_state(aq); + ap_queue_init_reply(aq, &zq->reply); + aq->request_timeout = CEX2C_CLEANUP_TIME; + aq->private = zq; +diff --git a/drivers/s390/crypto/zcrypt_cex4.c b/drivers/s390/crypto/zcrypt_cex4.c +index 442e3d6162f7..6fabc906114c 100644 +--- a/drivers/s390/crypto/zcrypt_cex4.c ++++ b/drivers/s390/crypto/zcrypt_cex4.c +@@ -381,6 +381,7 @@ static int zcrypt_cex4_queue_probe(struct ap_device *ap_dev) + zq->queue = aq; + zq->online = 1; + atomic_set(&zq->load, 0); ++ ap_queue_init_state(aq); + ap_queue_init_reply(aq, &zq->reply); + aq->request_timeout = CEX4_CLEANUP_TIME, + aq->private = zq; +diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c +index 80608b53897b..e3f5c91d5e4f 100644 +--- a/drivers/scsi/fnic/fnic_scsi.c ++++ b/drivers/scsi/fnic/fnic_scsi.c +@@ -439,6 +439,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_ + if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED))) + return SCSI_MLQUEUE_HOST_BUSY; + ++ if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET))) ++ return SCSI_MLQUEUE_HOST_BUSY; ++ + rport = starget_to_rport(scsi_target(sc->device)); + if (!rport) { + FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host, +diff --git a/drivers/soc/ti/wkup_m3_ipc.c b/drivers/soc/ti/wkup_m3_ipc.c +index 378369d9364a..e9ece45d7a33 100644 +--- a/drivers/soc/ti/wkup_m3_ipc.c ++++ b/drivers/soc/ti/wkup_m3_ipc.c +@@ -419,6 +419,8 @@ static void wkup_m3_rproc_boot_thread(struct wkup_m3_ipc *m3_ipc) + ret = rproc_boot(m3_ipc->rproc); + if (ret) + dev_err(dev, "rproc_boot failed\n"); ++ else ++ m3_ipc_state = m3_ipc; + + do_exit(0); + } +@@ -505,8 +507,6 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev) + goto err_put_rproc; + } + +- m3_ipc_state = m3_ipc; +- + return 0; + + err_put_rproc: +diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig +index d1ad512e1708..3ca71e3812ed 100644 +--- a/drivers/tee/optee/Kconfig ++++ b/drivers/tee/optee/Kconfig +@@ -3,6 +3,7 @@ + config OPTEE + tristate "OP-TEE" + depends on HAVE_ARM_SMCCC ++ depends on MMU + help + This implements the OP-TEE Trusted Execution Environment (TEE) + driver. +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index 1b151af25772..abcd93a3ca1d 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -2102,7 +2102,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + */ + thresh = SZ_4M; + +- if (!mixed && total_free_meta - thresh < block_rsv->size) ++ /* ++ * We only want to claim there's no available space if we can no longer ++ * allocate chunks for our metadata profile and our global reserve will ++ * not fit in the free metadata space. If we aren't ->full then we ++ * still can allocate chunks and thus are fine using the currently ++ * calculated f_bavail. ++ */ ++ if (!mixed && block_rsv->space_info->full && ++ total_free_meta - thresh < block_rsv->size) + buf->f_bavail = 0; + + buf->f_type = BTRFS_SUPER_MAGIC; +diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c +index e1d8cec6ba2e..e1cac715d19e 100644 +--- a/fs/cifs/smb2pdu.c ++++ b/fs/cifs/smb2pdu.c +@@ -312,7 +312,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon) + if (server->tcpStatus != CifsNeedReconnect) + break; + +- if (--retries) ++ if (retries && --retries) + continue; + + /* +diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c +index e2437b775456..e7b9d39955d4 100644 +--- a/fs/gfs2/lops.c ++++ b/fs/gfs2/lops.c +@@ -264,7 +264,7 @@ static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd *sdp, u64 blkno, + struct super_block *sb = sdp->sd_vfs; + struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES); + +- bio->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9); ++ bio->bi_iter.bi_sector = blkno << (sb->s_blocksize_bits - 9); + bio_set_dev(bio, sb->s_bdev); + bio->bi_end_io = end_io; + bio->bi_private = sdp; +@@ -471,6 +471,20 @@ static void gfs2_jhead_process_page(struct gfs2_jdesc *jd, unsigned long index, + put_page(page); /* Once more for find_or_create_page */ + } + ++static struct bio *gfs2_chain_bio(struct bio *prev, unsigned int nr_iovecs) ++{ ++ struct bio *new; ++ ++ new = bio_alloc(GFP_NOIO, nr_iovecs); ++ bio_copy_dev(new, prev); ++ new->bi_iter.bi_sector = bio_end_sector(prev); ++ new->bi_opf = prev->bi_opf; ++ new->bi_write_hint = prev->bi_write_hint; ++ bio_chain(new, prev); ++ submit_bio(prev); ++ return new; ++} ++ + /** + * gfs2_find_jhead - find the head of a log + * @jd: The journal descriptor +@@ -487,15 +501,15 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, + struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); + struct address_space *mapping = jd->jd_inode->i_mapping; + unsigned int block = 0, blocks_submitted = 0, blocks_read = 0; +- unsigned int bsize = sdp->sd_sb.sb_bsize; ++ unsigned int bsize = sdp->sd_sb.sb_bsize, off; + unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift; + unsigned int shift = PAGE_SHIFT - bsize_shift; +- unsigned int readhead_blocks = BIO_MAX_PAGES << shift; ++ unsigned int readahead_blocks = BIO_MAX_PAGES << shift; + struct gfs2_journal_extent *je; + int sz, ret = 0; + struct bio *bio = NULL; + struct page *page = NULL; +- bool done = false; ++ bool bio_chained = false, done = false; + errseq_t since; + + memset(head, 0, sizeof(*head)); +@@ -504,9 +518,9 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, + + since = filemap_sample_wb_err(mapping); + list_for_each_entry(je, &jd->extent_list, list) { +- for (; block < je->lblock + je->blocks; block++) { +- u64 dblock; ++ u64 dblock = je->dblock; + ++ for (; block < je->lblock + je->blocks; block++, dblock++) { + if (!page) { + page = find_or_create_page(mapping, + block >> shift, GFP_NOFS); +@@ -515,35 +529,41 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, + done = true; + goto out; + } ++ off = 0; + } + +- if (bio) { +- unsigned int off; +- +- off = (block << bsize_shift) & ~PAGE_MASK; ++ if (!bio || (bio_chained && !off)) { ++ /* start new bio */ ++ } else { + sz = bio_add_page(bio, page, bsize, off); +- if (sz == bsize) { /* block added */ +- if (off + bsize == PAGE_SIZE) { +- page = NULL; +- goto page_added; +- } +- continue; ++ if (sz == bsize) ++ goto block_added; ++ if (off) { ++ unsigned int blocks = ++ (PAGE_SIZE - off) >> bsize_shift; ++ ++ bio = gfs2_chain_bio(bio, blocks); ++ bio_chained = true; ++ goto add_block_to_new_bio; + } ++ } ++ ++ if (bio) { + blocks_submitted = block + 1; + submit_bio(bio); +- bio = NULL; + } + +- dblock = je->dblock + (block - je->lblock); + bio = gfs2_log_alloc_bio(sdp, dblock, gfs2_end_log_read); + bio->bi_opf = REQ_OP_READ; +- sz = bio_add_page(bio, page, bsize, 0); +- gfs2_assert_warn(sdp, sz == bsize); +- if (bsize == PAGE_SIZE) ++ bio_chained = false; ++add_block_to_new_bio: ++ sz = bio_add_page(bio, page, bsize, off); ++ BUG_ON(sz != bsize); ++block_added: ++ off += bsize; ++ if (off == PAGE_SIZE) + page = NULL; +- +-page_added: +- if (blocks_submitted < blocks_read + readhead_blocks) { ++ if (blocks_submitted < blocks_read + readahead_blocks) { + /* Keep at least one bio in flight */ + continue; + } +diff --git a/fs/namei.c b/fs/namei.c +index e81521c87f98..bd1c0ca4151c 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -3249,8 +3249,8 @@ static int do_last(struct nameidata *nd, + struct file *file, const struct open_flags *op) + { + struct dentry *dir = nd->path.dentry; +- kuid_t dir_uid = dir->d_inode->i_uid; +- umode_t dir_mode = dir->d_inode->i_mode; ++ kuid_t dir_uid = nd->inode->i_uid; ++ umode_t dir_mode = nd->inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c +index 3244037b1286..d127af64283e 100644 +--- a/fs/reiserfs/super.c ++++ b/fs/reiserfs/super.c +@@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s) + reiserfs_write_unlock(s); + mutex_destroy(&REISERFS_SB(s)->lock); + destroy_workqueue(REISERFS_SB(s)->commit_wq); ++ kfree(REISERFS_SB(s)->s_jdev); + kfree(s->s_fs_info); + s->s_fs_info = NULL; + } +@@ -2240,6 +2241,7 @@ error_unlocked: + kfree(qf_names[j]); + } + #endif ++ kfree(sbi->s_jdev); + kfree(sbi); + + s->s_fs_info = NULL; +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 775503573ed7..b968d736833b 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1915,11 +1915,11 @@ static inline void rseq_migrate(struct task_struct *t) + + /* + * If parent process has a registered restartable sequences area, the +- * child inherits. Only applies when forking a process, not a thread. ++ * child inherits. Unregister rseq for a clone with CLONE_VM set. + */ + static inline void rseq_fork(struct task_struct *t, unsigned long clone_flags) + { +- if (clone_flags & CLONE_THREAD) { ++ if (clone_flags & CLONE_VM) { + t->rseq = NULL; + t->rseq_sig = 0; + t->rseq_event_mask = 0; +diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h +index 4ab2c49423dc..68782ba8b6e8 100644 +--- a/include/net/cfg80211.h ++++ b/include/net/cfg80211.h +@@ -3537,6 +3537,9 @@ struct cfg80211_update_owe_info { + * + * @start_radar_detection: Start radar detection in the driver. + * ++ * @end_cac: End running CAC, probably because a related CAC ++ * was finished on another phy. ++ * + * @update_ft_ies: Provide updated Fast BSS Transition information to the + * driver. If the SME is in the driver/firmware, this information can be + * used in building Authentication and Reassociation Request frames. +@@ -3863,6 +3866,8 @@ struct cfg80211_ops { + struct net_device *dev, + struct cfg80211_chan_def *chandef, + u32 cac_time_ms); ++ void (*end_cac)(struct wiphy *wiphy, ++ struct net_device *dev); + int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_update_ft_ies_params *ftie); + int (*crit_proto_start)(struct wiphy *wiphy, +diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c +index ef4242e5d4bc..595c52d59f31 100644 +--- a/kernel/cgroup/cgroup.c ++++ b/kernel/cgroup/cgroup.c +@@ -3111,8 +3111,6 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) + for_each_subsys(ss, ssid) { + struct cgroup_subsys_state *css = cgroup_css(dsct, ss); + +- WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); +- + if (!(cgroup_ss_mask(dsct) & (1 << ss->id))) + continue; + +@@ -3122,6 +3120,8 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) + return PTR_ERR(css); + } + ++ WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); ++ + if (css_visible(css)) { + ret = css_populate_dir(css); + if (ret) +@@ -3157,11 +3157,11 @@ static void cgroup_apply_control_disable(struct cgroup *cgrp) + for_each_subsys(ss, ssid) { + struct cgroup_subsys_state *css = cgroup_css(dsct, ss); + +- WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); +- + if (!css) + continue; + ++ WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); ++ + if (css->parent && + !(cgroup_ss_mask(dsct) & (1 << ss->id))) { + kill_css(css); +@@ -3448,7 +3448,8 @@ static ssize_t cgroup_type_write(struct kernfs_open_file *of, char *buf, + if (strcmp(strstrip(buf), "threaded")) + return -EINVAL; + +- cgrp = cgroup_kn_lock_live(of->kn, false); ++ /* drain dying csses before we re-apply (threaded) subtree control */ ++ cgrp = cgroup_kn_lock_live(of->kn, true); + if (!cgrp) + return -ENOENT; + +diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c +index 3e5f9c7d939c..3f54dc2f6e1c 100644 +--- a/kernel/trace/trace_kprobe.c ++++ b/kernel/trace/trace_kprobe.c +@@ -290,7 +290,7 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group, + INIT_HLIST_NODE(&tk->rp.kp.hlist); + INIT_LIST_HEAD(&tk->rp.kp.list); + +- ret = trace_probe_init(&tk->tp, event, group, 0); ++ ret = trace_probe_init(&tk->tp, event, group, false); + if (ret < 0) + goto error; + +diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c +index bba18cf44a30..9ae87be422f2 100644 +--- a/kernel/trace/trace_probe.c ++++ b/kernel/trace/trace_probe.c +@@ -984,16 +984,19 @@ void trace_probe_cleanup(struct trace_probe *tp) + } + + int trace_probe_init(struct trace_probe *tp, const char *event, +- const char *group, size_t event_data_size) ++ const char *group, bool alloc_filter) + { + struct trace_event_call *call; ++ size_t size = sizeof(struct trace_probe_event); + int ret = 0; + + if (!event || !group) + return -EINVAL; + +- tp->event = kzalloc(sizeof(struct trace_probe_event) + event_data_size, +- GFP_KERNEL); ++ if (alloc_filter) ++ size += sizeof(struct trace_uprobe_filter); ++ ++ tp->event = kzalloc(size, GFP_KERNEL); + if (!tp->event) + return -ENOMEM; + +diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h +index 03e4e180058d..a0ff9e200ef6 100644 +--- a/kernel/trace/trace_probe.h ++++ b/kernel/trace/trace_probe.h +@@ -223,6 +223,12 @@ struct probe_arg { + const struct fetch_type *type; /* Type of this argument */ + }; + ++struct trace_uprobe_filter { ++ rwlock_t rwlock; ++ int nr_systemwide; ++ struct list_head perf_events; ++}; ++ + /* Event call and class holder */ + struct trace_probe_event { + unsigned int flags; /* For TP_FLAG_* */ +@@ -230,7 +236,7 @@ struct trace_probe_event { + struct trace_event_call call; + struct list_head files; + struct list_head probes; +- char data[0]; ++ struct trace_uprobe_filter filter[0]; + }; + + struct trace_probe { +@@ -323,7 +329,7 @@ static inline bool trace_probe_has_single_file(struct trace_probe *tp) + } + + int trace_probe_init(struct trace_probe *tp, const char *event, +- const char *group, size_t event_data_size); ++ const char *group, bool alloc_filter); + void trace_probe_cleanup(struct trace_probe *tp); + int trace_probe_append(struct trace_probe *tp, struct trace_probe *to); + void trace_probe_unlink(struct trace_probe *tp); +diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c +index f66e202fec13..2619bc5ed520 100644 +--- a/kernel/trace/trace_uprobe.c ++++ b/kernel/trace/trace_uprobe.c +@@ -34,12 +34,6 @@ struct uprobe_trace_entry_head { + #define DATAOF_TRACE_ENTRY(entry, is_return) \ + ((void*)(entry) + SIZEOF_TRACE_ENTRY(is_return)) + +-struct trace_uprobe_filter { +- rwlock_t rwlock; +- int nr_systemwide; +- struct list_head perf_events; +-}; +- + static int trace_uprobe_create(int argc, const char **argv); + static int trace_uprobe_show(struct seq_file *m, struct dyn_event *ev); + static int trace_uprobe_release(struct dyn_event *ev); +@@ -263,14 +257,6 @@ process_fetch_insn(struct fetch_insn *code, struct pt_regs *regs, void *dest, + } + NOKPROBE_SYMBOL(process_fetch_insn) + +-static struct trace_uprobe_filter * +-trace_uprobe_get_filter(struct trace_uprobe *tu) +-{ +- struct trace_probe_event *event = tu->tp.event; +- +- return (struct trace_uprobe_filter *)&event->data[0]; +-} +- + static inline void init_trace_uprobe_filter(struct trace_uprobe_filter *filter) + { + rwlock_init(&filter->rwlock); +@@ -358,8 +344,7 @@ alloc_trace_uprobe(const char *group, const char *event, int nargs, bool is_ret) + if (!tu) + return ERR_PTR(-ENOMEM); + +- ret = trace_probe_init(&tu->tp, event, group, +- sizeof(struct trace_uprobe_filter)); ++ ret = trace_probe_init(&tu->tp, event, group, true); + if (ret < 0) + goto error; + +@@ -367,7 +352,7 @@ alloc_trace_uprobe(const char *group, const char *event, int nargs, bool is_ret) + tu->consumer.handler = uprobe_dispatcher; + if (is_ret) + tu->consumer.ret_handler = uretprobe_dispatcher; +- init_trace_uprobe_filter(trace_uprobe_get_filter(tu)); ++ init_trace_uprobe_filter(tu->tp.event->filter); + return tu; + + error: +@@ -1076,7 +1061,7 @@ static void __probe_event_disable(struct trace_probe *tp) + struct trace_uprobe *tu; + + tu = container_of(tp, struct trace_uprobe, tp); +- WARN_ON(!uprobe_filter_is_empty(trace_uprobe_get_filter(tu))); ++ WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); + + list_for_each_entry(pos, trace_probe_probe_list(tp), list) { + tu = container_of(pos, struct trace_uprobe, tp); +@@ -1117,7 +1102,7 @@ static int probe_event_enable(struct trace_event_call *call, + } + + tu = container_of(tp, struct trace_uprobe, tp); +- WARN_ON(!uprobe_filter_is_empty(trace_uprobe_get_filter(tu))); ++ WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); + + if (enabled) + return 0; +@@ -1281,7 +1266,7 @@ static int uprobe_perf_close(struct trace_event_call *call, + return -ENODEV; + + tu = container_of(tp, struct trace_uprobe, tp); +- if (trace_uprobe_filter_remove(trace_uprobe_get_filter(tu), event)) ++ if (trace_uprobe_filter_remove(tu->tp.event->filter, event)) + return 0; + + list_for_each_entry(pos, trace_probe_probe_list(tp), list) { +@@ -1306,7 +1291,7 @@ static int uprobe_perf_open(struct trace_event_call *call, + return -ENODEV; + + tu = container_of(tp, struct trace_uprobe, tp); +- if (trace_uprobe_filter_add(trace_uprobe_get_filter(tu), event)) ++ if (trace_uprobe_filter_add(tu->tp.event->filter, event)) + return 0; + + list_for_each_entry(pos, trace_probe_probe_list(tp), list) { +@@ -1328,7 +1313,7 @@ static bool uprobe_perf_filter(struct uprobe_consumer *uc, + int ret; + + tu = container_of(uc, struct trace_uprobe, consumer); +- filter = trace_uprobe_get_filter(tu); ++ filter = tu->tp.event->filter; + + read_lock(&filter->rwlock); + ret = __uprobe_perf_filter(filter, mm); +diff --git a/lib/test_xarray.c b/lib/test_xarray.c +index 03c3f42966ce..55c14e8c8859 100644 +--- a/lib/test_xarray.c ++++ b/lib/test_xarray.c +@@ -1160,6 +1160,27 @@ static noinline void check_move_tiny(struct xarray *xa) + XA_BUG_ON(xa, !xa_empty(xa)); + } + ++static noinline void check_move_max(struct xarray *xa) ++{ ++ XA_STATE(xas, xa, 0); ++ ++ xa_store_index(xa, ULONG_MAX, GFP_KERNEL); ++ rcu_read_lock(); ++ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX)); ++ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL); ++ rcu_read_unlock(); ++ ++ xas_set(&xas, 0); ++ rcu_read_lock(); ++ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX)); ++ xas_pause(&xas); ++ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL); ++ rcu_read_unlock(); ++ ++ xa_erase_index(xa, ULONG_MAX); ++ XA_BUG_ON(xa, !xa_empty(xa)); ++} ++ + static noinline void check_move_small(struct xarray *xa, unsigned long idx) + { + XA_STATE(xas, xa, 0); +@@ -1268,6 +1289,7 @@ static noinline void check_move(struct xarray *xa) + xa_destroy(xa); + + check_move_tiny(xa); ++ check_move_max(xa); + + for (i = 0; i < 16; i++) + check_move_small(xa, 1UL << i); +diff --git a/lib/xarray.c b/lib/xarray.c +index 47e17d46e5f8..1d9fab7db8da 100644 +--- a/lib/xarray.c ++++ b/lib/xarray.c +@@ -968,6 +968,7 @@ void xas_pause(struct xa_state *xas) + if (xas_invalid(xas)) + return; + ++ xas->xa_node = XAS_RESTART; + if (node) { + unsigned int offset = xas->xa_offset; + while (++offset < XA_CHUNK_SIZE) { +@@ -975,10 +976,11 @@ void xas_pause(struct xa_state *xas) + break; + } + xas->xa_index += (offset - xas->xa_offset) << node->shift; ++ if (xas->xa_index == 0) ++ xas->xa_node = XAS_BOUNDS; + } else { + xas->xa_index++; + } +- xas->xa_node = XAS_RESTART; + } + EXPORT_SYMBOL_GPL(xas_pause); + +@@ -1080,7 +1082,7 @@ void *xas_find(struct xa_state *xas, unsigned long max) + { + void *entry; + +- if (xas_error(xas)) ++ if (xas_error(xas) || xas->xa_node == XAS_BOUNDS) + return NULL; + if (xas->xa_index > max) + return set_bounds(xas); +@@ -1088,7 +1090,7 @@ void *xas_find(struct xa_state *xas, unsigned long max) + if (!xas->xa_node) { + xas->xa_index = 1; + return set_bounds(xas); +- } else if (xas_top(xas->xa_node)) { ++ } else if (xas->xa_node == XAS_RESTART) { + entry = xas_load(xas); + if (entry || xas_not_node(xas->xa_node)) + return entry; +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index e08c94170ae4..fbb3258af275 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2802,6 +2802,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + char *flags = strchr(str, '='); + int err = 1, mode; + ++ if (flags) ++ *flags++ = '\0'; /* terminate mode string */ ++ + if (nodelist) { + /* NUL-terminate mode or flags string */ + *nodelist++ = '\0'; +@@ -2812,9 +2815,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + } else + nodes_clear(nodes); + +- if (flags) +- *flags++ = '\0'; /* terminate mode string */ +- + mode = match_string(policy_modes, MPOL_MAX, str); + if (mode < 0) + goto out; +diff --git a/mm/migrate.c b/mm/migrate.c +index 45d3303e0022..6956627ebf8b 100644 +--- a/mm/migrate.c ++++ b/mm/migrate.c +@@ -1680,7 +1680,7 @@ out_flush: + err1 = do_move_pages_to_node(mm, &pagelist, current_node); + if (!err1) + err1 = store_status(status, start, current_node, i - start); +- if (!err) ++ if (err >= 0) + err = err1; + out: + return err; +diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c +index d32077b28433..8159b344deef 100644 +--- a/net/bluetooth/hci_sock.c ++++ b/net/bluetooth/hci_sock.c +@@ -831,6 +831,8 @@ static int hci_sock_release(struct socket *sock) + if (!sk) + return 0; + ++ lock_sock(sk); ++ + switch (hci_pi(sk)->channel) { + case HCI_CHANNEL_MONITOR: + atomic_dec(&monitor_promisc); +@@ -878,6 +880,7 @@ static int hci_sock_release(struct socket *sock) + skb_queue_purge(&sk->sk_receive_queue); + skb_queue_purge(&sk->sk_write_queue); + ++ release_sock(sk); + sock_put(sk); + return 0; + } +diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c +index 1292f3f0f93f..96b2566c298d 100644 +--- a/net/core/flow_dissector.c ++++ b/net/core/flow_dissector.c +@@ -758,10 +758,10 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys, + struct flow_dissector *flow_dissector, + void *target_container) + { ++ struct flow_dissector_key_ports *key_ports = NULL; + struct flow_dissector_key_control *key_control; + struct flow_dissector_key_basic *key_basic; + struct flow_dissector_key_addrs *key_addrs; +- struct flow_dissector_key_ports *key_ports; + struct flow_dissector_key_tags *key_tags; + + key_control = skb_flow_dissector_target(flow_dissector, +@@ -800,10 +800,17 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys, + key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; + } + +- if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) { ++ if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) + key_ports = skb_flow_dissector_target(flow_dissector, + FLOW_DISSECTOR_KEY_PORTS, + target_container); ++ else if (dissector_uses_key(flow_dissector, ++ FLOW_DISSECTOR_KEY_PORTS_RANGE)) ++ key_ports = skb_flow_dissector_target(flow_dissector, ++ FLOW_DISSECTOR_KEY_PORTS_RANGE, ++ target_container); ++ ++ if (key_ports) { + key_ports->src = flow_keys->sport; + key_ports->dst = flow_keys->dport; + } +diff --git a/net/core/utils.c b/net/core/utils.c +index 6b6e51db9f3b..1f31a39236d5 100644 +--- a/net/core/utils.c ++++ b/net/core/utils.c +@@ -438,6 +438,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, + } + EXPORT_SYMBOL(inet_proto_csum_replace4); + ++/** ++ * inet_proto_csum_replace16 - update layer 4 header checksum field ++ * @sum: Layer 4 header checksum field ++ * @skb: sk_buff for the packet ++ * @from: old IPv6 address ++ * @to: new IPv6 address ++ * @pseudohdr: True if layer 4 header checksum includes pseudoheader ++ * ++ * Update layer 4 header as per the update in IPv6 src/dst address. ++ * ++ * There is no need to update skb->csum in this function, because update in two ++ * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other ++ * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to ++ * update skb->csum, because update in 3 fields a.) IPv4 src/dst address, ++ * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as ++ * L4 Header checksum for skb->csum calculation. ++ */ + void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + const __be32 *from, const __be32 *to, + bool pseudohdr) +@@ -449,9 +466,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + if (skb->ip_summed != CHECKSUM_PARTIAL) { + *sum = csum_fold(csum_partial(diff, sizeof(diff), + ~csum_unfold(*sum))); +- if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) +- skb->csum = ~csum_partial(diff, sizeof(diff), +- ~skb->csum); + } else if (pseudohdr) + *sum = ~csum_fold(csum_partial(diff, sizeof(diff), + csum_unfold(*sum))); +diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c +index fb9f6d60c27c..79eef5db336a 100644 +--- a/net/ipv4/ip_vti.c ++++ b/net/ipv4/ip_vti.c +@@ -187,8 +187,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev, + int mtu; + + if (!dst) { +- dev->stats.tx_carrier_errors++; +- goto tx_error_icmp; ++ struct rtable *rt; ++ ++ fl->u.ip4.flowi4_oif = dev->ifindex; ++ fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; ++ rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); ++ if (IS_ERR(rt)) { ++ dev->stats.tx_carrier_errors++; ++ goto tx_error_icmp; ++ } ++ dst = &rt->dst; ++ skb_dst_set(skb, dst); + } + + dst_hold(dst); +diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c +index 6f08b760c2a7..524006aa0d78 100644 +--- a/net/ipv6/ip6_vti.c ++++ b/net/ipv6/ip6_vti.c +@@ -449,8 +449,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + int err = -1; + int mtu; + +- if (!dst) +- goto tx_err_link_failure; ++ if (!dst) { ++ fl->u.ip6.flowi6_oif = dev->ifindex; ++ fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; ++ dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); ++ if (dst->error) { ++ dst_release(dst); ++ dst = NULL; ++ goto tx_err_link_failure; ++ } ++ skb_dst_set(skb, dst); ++ } + + dst_hold(dst); + dst = xfrm_lookup(t->net, dst, fl, NULL, 0); +diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c +index 70739e746c13..0daaf7e37a21 100644 +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -2954,6 +2954,28 @@ static int ieee80211_start_radar_detection(struct wiphy *wiphy, + return err; + } + ++static void ieee80211_end_cac(struct wiphy *wiphy, ++ struct net_device *dev) ++{ ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); ++ struct ieee80211_local *local = sdata->local; ++ ++ mutex_lock(&local->mtx); ++ list_for_each_entry(sdata, &local->interfaces, list) { ++ /* it might be waiting for the local->mtx, but then ++ * by the time it gets it, sdata->wdev.cac_started ++ * will no longer be true ++ */ ++ cancel_delayed_work(&sdata->dfs_cac_timer_work); ++ ++ if (sdata->wdev.cac_started) { ++ ieee80211_vif_release_channel(sdata); ++ sdata->wdev.cac_started = false; ++ } ++ } ++ mutex_unlock(&local->mtx); ++} ++ + static struct cfg80211_beacon_data * + cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon) + { +@@ -4023,6 +4045,7 @@ const struct cfg80211_ops mac80211_config_ops = { + #endif + .get_channel = ieee80211_cfg_get_channel, + .start_radar_detection = ieee80211_start_radar_detection, ++ .end_cac = ieee80211_end_cac, + .channel_switch = ieee80211_channel_switch, + .set_qos_map = ieee80211_set_qos_map, + .set_ap_chanwidth = ieee80211_set_ap_chanwidth, +diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c +index 68af62306385..d69983370381 100644 +--- a/net/mac80211/mesh_hwmp.c ++++ b/net/mac80211/mesh_hwmp.c +@@ -328,6 +328,9 @@ u32 airtime_link_metric_get(struct ieee80211_local *local, + unsigned long fail_avg = + ewma_mesh_fail_avg_read(&sta->mesh->fail_avg); + ++ if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) ++ return MAX_METRIC; ++ + /* Try to get rate based on HW/SW RC algorithm. + * Rate is returned in units of Kbps, correct this + * to comply with airtime calculation units +diff --git a/net/mac80211/tkip.c b/net/mac80211/tkip.c +index 727dc9f3f3b3..e7f57bb18f6e 100644 +--- a/net/mac80211/tkip.c ++++ b/net/mac80211/tkip.c +@@ -263,9 +263,21 @@ int ieee80211_tkip_decrypt_data(struct arc4_ctx *ctx, + if ((keyid >> 6) != key->conf.keyidx) + return TKIP_DECRYPT_INVALID_KEYIDX; + +- if (rx_ctx->ctx.state != TKIP_STATE_NOT_INIT && +- (iv32 < rx_ctx->iv32 || +- (iv32 == rx_ctx->iv32 && iv16 <= rx_ctx->iv16))) ++ /* Reject replays if the received TSC is smaller than or equal to the ++ * last received value in a valid message, but with an exception for ++ * the case where a new key has been set and no valid frame using that ++ * key has yet received and the local RSC was initialized to 0. This ++ * exception allows the very first frame sent by the transmitter to be ++ * accepted even if that transmitter were to use TSC 0 (IEEE 802.11 ++ * described TSC to be initialized to 1 whenever a new key is taken into ++ * use). ++ */ ++ if (iv32 < rx_ctx->iv32 || ++ (iv32 == rx_ctx->iv32 && ++ (iv16 < rx_ctx->iv16 || ++ (iv16 == rx_ctx->iv16 && ++ (rx_ctx->iv32 || rx_ctx->iv16 || ++ rx_ctx->ctx.state != TKIP_STATE_NOT_INIT))))) + return TKIP_DECRYPT_REPLAY; + + if (only_iv) { +diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c +index 0399ae8f1188..4f897b14b606 100644 +--- a/net/netfilter/nf_conntrack_proto_sctp.c ++++ b/net/netfilter/nf_conntrack_proto_sctp.c +@@ -114,7 +114,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] = { + { + /* ORIGINAL */ + /* sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS, sHA */ +-/* init */ {sCW, sCW, sCW, sCE, sES, sSS, sSR, sSA, sCW, sHA}, ++/* init */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCW, sHA}, + /* init_ack */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCL, sHA}, + /* abort */ {sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL}, + /* shutdown */ {sCL, sCL, sCW, sCE, sSS, sSS, sSR, sSA, sCL, sSS}, +@@ -130,7 +130,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] = { + /* REPLY */ + /* sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS, sHA */ + /* init */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA},/* INIT in sCL Big TODO */ +-/* init_ack */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA}, ++/* init_ack */ {sIV, sCW, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA}, + /* abort */ {sIV, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sIV, sCL}, + /* shutdown */ {sIV, sCL, sCW, sCE, sSR, sSS, sSR, sSA, sIV, sSR}, + /* shutdown_ack */ {sIV, sCL, sCW, sCE, sES, sSA, sSA, sSA, sIV, sHA}, +@@ -316,7 +316,7 @@ sctp_new(struct nf_conn *ct, const struct sk_buff *skb, + ct->proto.sctp.vtag[IP_CT_DIR_REPLY] = sh->vtag; + } + +- ct->proto.sctp.state = new_state; ++ ct->proto.sctp.state = SCTP_CONNTRACK_NONE; + } + + return true; +diff --git a/net/netfilter/nf_tables_offload.c b/net/netfilter/nf_tables_offload.c +index 96a64e7594a5..914cd0618d5a 100644 +--- a/net/netfilter/nf_tables_offload.c ++++ b/net/netfilter/nf_tables_offload.c +@@ -437,7 +437,7 @@ static void nft_indr_block_cb(struct net_device *dev, + + mutex_lock(&net->nft.commit_mutex); + chain = __nft_offload_get_chain(dev); +- if (chain) { ++ if (chain && chain->flags & NFT_CHAIN_HW_OFFLOAD) { + struct nft_base_chain *basechain; + + basechain = nft_base_chain(chain); +diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h +index 3dd9515c836b..e0d34f796d0b 100644 +--- a/net/wireless/rdev-ops.h ++++ b/net/wireless/rdev-ops.h +@@ -1171,6 +1171,16 @@ rdev_start_radar_detection(struct cfg80211_registered_device *rdev, + return ret; + } + ++static inline void ++rdev_end_cac(struct cfg80211_registered_device *rdev, ++ struct net_device *dev) ++{ ++ trace_rdev_end_cac(&rdev->wiphy, dev); ++ if (rdev->ops->end_cac) ++ rdev->ops->end_cac(&rdev->wiphy, dev); ++ trace_rdev_return_void(&rdev->wiphy); ++} ++ + static inline int + rdev_set_mcast_rate(struct cfg80211_registered_device *rdev, + struct net_device *dev, +diff --git a/net/wireless/reg.c b/net/wireless/reg.c +index 446c76d44e65..fff9a74891fc 100644 +--- a/net/wireless/reg.c ++++ b/net/wireless/reg.c +@@ -2261,14 +2261,15 @@ static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator) + + static void handle_channel_custom(struct wiphy *wiphy, + struct ieee80211_channel *chan, +- const struct ieee80211_regdomain *regd) ++ const struct ieee80211_regdomain *regd, ++ u32 min_bw) + { + u32 bw_flags = 0; + const struct ieee80211_reg_rule *reg_rule = NULL; + const struct ieee80211_power_rule *power_rule = NULL; + u32 bw; + +- for (bw = MHZ_TO_KHZ(20); bw >= MHZ_TO_KHZ(5); bw = bw / 2) { ++ for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) { + reg_rule = freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), + regd, bw); + if (!IS_ERR(reg_rule)) +@@ -2324,8 +2325,14 @@ static void handle_band_custom(struct wiphy *wiphy, + if (!sband) + return; + ++ /* ++ * We currently assume that you always want at least 20 MHz, ++ * otherwise channel 12 might get enabled if this rule is ++ * compatible to US, which permits 2402 - 2472 MHz. ++ */ + for (i = 0; i < sband->n_channels; i++) +- handle_channel_custom(wiphy, &sband->channels[i], regd); ++ handle_channel_custom(wiphy, &sband->channels[i], regd, ++ MHZ_TO_KHZ(20)); + } + + /* Used by drivers prior to wiphy registration */ +@@ -3885,6 +3892,25 @@ bool regulatory_pre_cac_allowed(struct wiphy *wiphy) + } + EXPORT_SYMBOL(regulatory_pre_cac_allowed); + ++static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev) ++{ ++ struct wireless_dev *wdev; ++ /* If we finished CAC or received radar, we should end any ++ * CAC running on the same channels. ++ * the check !cfg80211_chandef_dfs_usable contain 2 options: ++ * either all channels are available - those the CAC_FINISHED ++ * event has effected another wdev state, or there is a channel ++ * in unavailable state in wdev chandef - those the RADAR_DETECTED ++ * event has effected another wdev state. ++ * In both cases we should end the CAC on the wdev. ++ */ ++ list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { ++ if (wdev->cac_started && ++ !cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef)) ++ rdev_end_cac(rdev, wdev->netdev); ++ } ++} ++ + void regulatory_propagate_dfs_state(struct wiphy *wiphy, + struct cfg80211_chan_def *chandef, + enum nl80211_dfs_state dfs_state, +@@ -3911,8 +3937,10 @@ void regulatory_propagate_dfs_state(struct wiphy *wiphy, + cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state); + + if (event == NL80211_RADAR_DETECTED || +- event == NL80211_RADAR_CAC_FINISHED) ++ event == NL80211_RADAR_CAC_FINISHED) { + cfg80211_sched_dfs_chan_update(rdev); ++ cfg80211_check_and_end_cac(rdev); ++ } + + nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL); + } +diff --git a/net/wireless/trace.h b/net/wireless/trace.h +index d98ad2b3143b..8677d7ab7d69 100644 +--- a/net/wireless/trace.h ++++ b/net/wireless/trace.h +@@ -646,6 +646,11 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_flush_pmksa, + TP_ARGS(wiphy, netdev) + ); + ++DEFINE_EVENT(wiphy_netdev_evt, rdev_end_cac, ++ TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), ++ TP_ARGS(wiphy, netdev) ++); ++ + DECLARE_EVENT_CLASS(station_add_change, + TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac, + struct station_parameters *params), +diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c +index 5e677dac2a0c..69102fda9ebd 100644 +--- a/net/wireless/wext-core.c ++++ b/net/wireless/wext-core.c +@@ -657,7 +657,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev) + return NULL; + } + +-static int iw_handler_get_iwstats(struct net_device * dev, ++/* noinline to avoid a bogus warning with -O3 */ ++static noinline int iw_handler_get_iwstats(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra) +diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c +index 0f5131bc3342..4d5627e274fe 100644 +--- a/net/xfrm/xfrm_interface.c ++++ b/net/xfrm/xfrm_interface.c +@@ -268,9 +268,6 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + int err = -1; + int mtu; + +- if (!dst) +- goto tx_err_link_failure; +- + dst_hold(dst); + dst = xfrm_lookup_with_ifid(xi->net, dst, fl, NULL, 0, xi->p.if_id); + if (IS_ERR(dst)) { +@@ -297,7 +294,7 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + + mtu = dst_mtu(dst); + if (!skb->ignore_df && skb->len > mtu) { +- skb_dst_update_pmtu(skb, mtu); ++ skb_dst_update_pmtu_no_confirm(skb, mtu); + + if (skb->protocol == htons(ETH_P_IPV6)) { + if (mtu < IPV6_MIN_MTU) +@@ -343,6 +340,7 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct xfrm_if *xi = netdev_priv(dev); + struct net_device_stats *stats = &xi->dev->stats; ++ struct dst_entry *dst = skb_dst(skb); + struct flowi fl; + int ret; + +@@ -352,10 +350,33 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev) + case htons(ETH_P_IPV6): + xfrm_decode_session(skb, &fl, AF_INET6); + memset(IP6CB(skb), 0, sizeof(*IP6CB(skb))); ++ if (!dst) { ++ fl.u.ip6.flowi6_oif = dev->ifindex; ++ fl.u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; ++ dst = ip6_route_output(dev_net(dev), NULL, &fl.u.ip6); ++ if (dst->error) { ++ dst_release(dst); ++ stats->tx_carrier_errors++; ++ goto tx_err; ++ } ++ skb_dst_set(skb, dst); ++ } + break; + case htons(ETH_P_IP): + xfrm_decode_session(skb, &fl, AF_INET); + memset(IPCB(skb), 0, sizeof(*IPCB(skb))); ++ if (!dst) { ++ struct rtable *rt; ++ ++ fl.u.ip4.flowi4_oif = dev->ifindex; ++ fl.u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; ++ rt = __ip_route_output_key(dev_net(dev), &fl.u.ip4); ++ if (IS_ERR(rt)) { ++ stats->tx_carrier_errors++; ++ goto tx_err; ++ } ++ skb_dst_set(skb, &rt->dst); ++ } + break; + default: + goto tx_err; +@@ -563,12 +584,9 @@ static void xfrmi_dev_setup(struct net_device *dev) + { + dev->netdev_ops = &xfrmi_netdev_ops; + dev->type = ARPHRD_NONE; +- dev->hard_header_len = ETH_HLEN; +- dev->min_header_len = ETH_HLEN; + dev->mtu = ETH_DATA_LEN; + dev->min_mtu = ETH_MIN_MTU; +- dev->max_mtu = ETH_DATA_LEN; +- dev->addr_len = ETH_ALEN; ++ dev->max_mtu = IP_MAX_MTU; + dev->flags = IFF_NOARP; + dev->needs_free_netdev = true; + dev->priv_destructor = xfrmi_dev_free; +diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c +index c36bafbcd77e..1b467381986f 100644 +--- a/security/tomoyo/common.c ++++ b/security/tomoyo/common.c +@@ -2322,9 +2322,9 @@ static const char * const tomoyo_memory_headers[TOMOYO_MAX_MEMORY_STAT] = { + [TOMOYO_MEMORY_QUERY] = "query message:", + }; + +-/* Timestamp counter for last updated. */ +-static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; + /* Counter for number of updates. */ ++static atomic_t tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; ++/* Timestamp counter for last updated. */ + static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; + + /** +@@ -2336,10 +2336,7 @@ static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; + */ + void tomoyo_update_stat(const u8 index) + { +- /* +- * I don't use atomic operations because race condition is not fatal. +- */ +- tomoyo_stat_updated[index]++; ++ atomic_inc(&tomoyo_stat_updated[index]); + tomoyo_stat_modified[index] = ktime_get_real_seconds(); + } + +@@ -2360,7 +2357,7 @@ static void tomoyo_read_stat(struct tomoyo_io_buffer *head) + for (i = 0; i < TOMOYO_MAX_POLICY_STAT; i++) { + tomoyo_io_printf(head, "Policy %-30s %10u", + tomoyo_policy_headers[i], +- tomoyo_stat_updated[i]); ++ atomic_read(&tomoyo_stat_updated[i])); + if (tomoyo_stat_modified[i]) { + struct tomoyo_time stamp; + +diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c +index 4570f662fb48..d78f4d856aaf 100644 +--- a/sound/soc/codecs/hdac_hda.c ++++ b/sound/soc/codecs/hdac_hda.c +@@ -498,7 +498,9 @@ static int hdac_hda_dev_remove(struct hdac_device *hdev) + struct hdac_hda_priv *hda_pvt; + + hda_pvt = dev_get_drvdata(&hdev->dev); +- cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); ++ if (hda_pvt && hda_pvt->codec.registered) ++ cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); ++ + return 0; + } + +diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c +index adbae1f36a8a..747ca248bf10 100644 +--- a/sound/soc/codecs/rt5640.c ++++ b/sound/soc/codecs/rt5640.c +@@ -2432,6 +2432,13 @@ static void rt5640_disable_jack_detect(struct snd_soc_component *component) + { + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); + ++ /* ++ * soc_remove_component() force-disables jack and thus rt5640->jack ++ * could be NULL at the time of driver's module unloading. ++ */ ++ if (!rt5640->jack) ++ return; ++ + disable_irq(rt5640->irq); + rt5640_cancel_work(rt5640); + +diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c +index 7ccbca47240d..fef01e1dd15c 100644 +--- a/sound/soc/soc-topology.c ++++ b/sound/soc/soc-topology.c +@@ -1891,6 +1891,10 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, + link->num_codecs = 1; + link->num_platforms = 1; + ++ link->dobj.index = tplg->index; ++ link->dobj.ops = tplg->ops; ++ link->dobj.type = SND_SOC_DOBJ_DAI_LINK; ++ + if (strlen(pcm->pcm_name)) { + link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); + link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL); +@@ -1927,9 +1931,6 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, + goto err; + } + +- link->dobj.index = tplg->index; +- link->dobj.ops = tplg->ops; +- link->dobj.type = SND_SOC_DOBJ_DAI_LINK; + list_add(&link->dobj.list, &tplg->comp->dobj_list); + + return 0; +diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c +index 3ca6795a89ba..9e8233c10d86 100644 +--- a/sound/soc/sof/intel/hda-codec.c ++++ b/sound/soc/sof/intel/hda-codec.c +@@ -24,19 +24,18 @@ + #define IDISP_VID_INTEL 0x80860000 + + /* load the legacy HDA codec driver */ +-#ifdef MODULE +-static void hda_codec_load_module(struct hda_codec *codec) ++static int hda_codec_load_module(struct hda_codec *codec) + { ++#ifdef MODULE + char alias[MODULE_NAME_LEN]; + const char *module = alias; + + snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias)); + dev_dbg(&codec->core.dev, "loading codec module: %s\n", module); + request_module(module); +-} +-#else +-static void hda_codec_load_module(struct hda_codec *codec) {} + #endif ++ return device_attach(hda_codec_dev(codec)); ++} + + /* enable controller wake up event for all codecs with jack connectors */ + void hda_codec_jack_wake_enable(struct snd_sof_dev *sdev) +@@ -116,10 +115,16 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address) + /* use legacy bus only for HDA codecs, idisp uses ext bus */ + if ((resp & 0xFFFF0000) != IDISP_VID_INTEL) { + hdev->type = HDA_DEV_LEGACY; +- hda_codec_load_module(&hda_priv->codec); ++ ret = hda_codec_load_module(&hda_priv->codec); ++ /* ++ * handle ret==0 (no driver bound) as an error, but pass ++ * other return codes without modification ++ */ ++ if (ret == 0) ++ ret = -ENOENT; + } + +- return 0; ++ return ret; + #else + hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL); + if (!hdev) +diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c +index 48ea915b24ba..2ed92c990b97 100644 +--- a/sound/soc/sti/uniperif_player.c ++++ b/sound/soc/sti/uniperif_player.c +@@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player, + * sampling frequency. If no sample rate is already specified, then + * set one. + */ +- mutex_lock(&player->ctrl_lock); + if (runtime) { + switch (runtime->rate) { + case 22050: +@@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif *player, + player->stream_settings.iec958.status[3 + (n * 4)] << 24; + SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status); + } +- mutex_unlock(&player->ctrl_lock); + + /* Update the channel status */ + if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) +@@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif *player, + + SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player); + ++ mutex_lock(&player->ctrl_lock); + /* Update the channel status */ + uni_player_set_channel_status(player, runtime); ++ mutex_unlock(&player->ctrl_lock); + + /* Clear the user validity user bits */ + SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0); +@@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, + iec958->status[1] = ucontrol->value.iec958.status[1]; + iec958->status[2] = ucontrol->value.iec958.status[2]; + iec958->status[3] = ucontrol->value.iec958.status[3]; +- mutex_unlock(&player->ctrl_lock); + + spin_lock_irqsave(&player->irq_lock, flags); + if (player->substream && player->substream->runtime) +@@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, + uni_player_set_channel_status(player, NULL); + + spin_unlock_irqrestore(&player->irq_lock, flags); ++ mutex_unlock(&player->ctrl_lock); ++ + return 0; + } + +diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h +index 980cb9266718..5e9e781905ed 100644 +--- a/tools/include/linux/string.h ++++ b/tools/include/linux/string.h +@@ -17,7 +17,15 @@ int strtobool(const char *s, bool *res); + * However uClibc headers also define __GLIBC__ hence the hack below + */ + #if defined(__GLIBC__) && !defined(__UCLIBC__) ++// pragma diagnostic was introduced in gcc 4.6 ++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wredundant-decls" ++#endif + extern size_t strlcpy(char *dest, const char *src, size_t size); ++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) ++#pragma GCC diagnostic pop ++#endif + #endif + + char *str_error_r(int errnum, char *buf, size_t buflen); +diff --git a/tools/lib/string.c b/tools/lib/string.c +index f2ae1b87c719..f645343815de 100644 +--- a/tools/lib/string.c ++++ b/tools/lib/string.c +@@ -96,6 +96,10 @@ int strtobool(const char *s, bool *res) + * If libc has strlcpy() then that version will override this + * implementation: + */ ++#ifdef __clang__ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wignored-attributes" ++#endif + size_t __weak strlcpy(char *dest, const char *src, size_t size) + { + size_t ret = strlen(src); +@@ -107,6 +111,9 @@ size_t __weak strlcpy(char *dest, const char *src, size_t size) + } + return ret; + } ++#ifdef __clang__ ++#pragma clang diagnostic pop ++#endif + + /** + * skip_spaces - Removes leading whitespace from @str. +diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c +index f3cbf86e51ac..20eed719542e 100644 +--- a/tools/lib/traceevent/parse-filter.c ++++ b/tools/lib/traceevent/parse-filter.c +@@ -1228,8 +1228,10 @@ filter_event(struct tep_event_filter *filter, struct tep_event *event, + } + + filter_type = add_filter_type(filter, event->id); +- if (filter_type == NULL) ++ if (filter_type == NULL) { ++ free_arg(arg); + return TEP_ERRNO__MEM_ALLOC_FAILED; ++ } + + if (filter_type->filter) + free_arg(filter_type->filter); +diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c +index e69f44941aad..f2e9d2b1b913 100644 +--- a/tools/perf/builtin-c2c.c ++++ b/tools/perf/builtin-c2c.c +@@ -595,8 +595,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + { + struct c2c_hist_entry *c2c_left; + struct c2c_hist_entry *c2c_right; +- unsigned int tot_hitm_left; +- unsigned int tot_hitm_right; ++ uint64_t tot_hitm_left; ++ uint64_t tot_hitm_right; + + c2c_left = container_of(left, struct c2c_hist_entry, he); + c2c_right = container_of(right, struct c2c_hist_entry, he); +@@ -629,7 +629,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __maybe_unused, \ + \ + c2c_left = container_of(left, struct c2c_hist_entry, he); \ + c2c_right = container_of(right, struct c2c_hist_entry, he); \ +- return c2c_left->stats.__f - c2c_right->stats.__f; \ ++ return (uint64_t) c2c_left->stats.__f - \ ++ (uint64_t) c2c_right->stats.__f; \ + } + + #define STAT_FN(__f) \ +@@ -682,7 +683,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + c2c_left = container_of(left, struct c2c_hist_entry, he); + c2c_right = container_of(right, struct c2c_hist_entry, he); + +- return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats); ++ return (uint64_t) llc_miss(&c2c_left->stats) - ++ (uint64_t) llc_miss(&c2c_right->stats); + } + + static uint64_t total_records(struct c2c_stats *stats) +diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c +index ea3f0745d7ad..6407dff405d9 100644 +--- a/tools/perf/builtin-report.c ++++ b/tools/perf/builtin-report.c +@@ -399,10 +399,10 @@ static int report__setup_sample_type(struct report *rep) + PERF_SAMPLE_BRANCH_ANY)) + rep->nonany_branch_mode = true; + +-#ifndef HAVE_LIBUNWIND_SUPPORT ++#if !defined(HAVE_LIBUNWIND_SUPPORT) && !defined(HAVE_DWARF_SUPPORT) + if (dwarf_callchain_users) { +- ui__warning("Please install libunwind development packages " +- "during the perf build.\n"); ++ ui__warning("Please install libunwind or libdw " ++ "development packages during the perf build.\n"); + } + #endif + From a29b1c34fbdf8abd296386698bfc176ba518d0ce Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Fri, 7 Feb 2020 07:32:38 +0100 Subject: [PATCH 25/54] Remove deprecated patches --- .../patch-5.4.16-17-modified.patch | 4040 ----------------- .../sunxi-current/patch-5.4.17-18.patch | 3992 ---------------- 2 files changed, 8032 deletions(-) delete mode 100644 patch/kernel/sunxi-current/patch-5.4.16-17-modified.patch delete mode 100644 patch/kernel/sunxi-current/patch-5.4.17-18.patch diff --git a/patch/kernel/sunxi-current/patch-5.4.16-17-modified.patch b/patch/kernel/sunxi-current/patch-5.4.16-17-modified.patch deleted file mode 100644 index b35a9137b6..0000000000 --- a/patch/kernel/sunxi-current/patch-5.4.16-17-modified.patch +++ /dev/null @@ -1,4040 +0,0 @@ -diff --git a/Makefile b/Makefile -index e16d2e58ed4b..a363a539a092 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0 - VERSION = 5 - PATCHLEVEL = 4 --SUBLEVEL = 16 -+SUBLEVEL = 17 - EXTRAVERSION = - NAME = Kleptomaniac Octopus - -diff --git a/arch/arc/plat-eznps/Kconfig b/arch/arc/plat-eznps/Kconfig -index a376a50d3fea..a931d0a256d0 100644 ---- a/arch/arc/plat-eznps/Kconfig -+++ b/arch/arc/plat-eznps/Kconfig -@@ -7,7 +7,7 @@ - menuconfig ARC_PLAT_EZNPS - bool "\"EZchip\" ARC dev platform" - select CPU_BIG_ENDIAN -- select CLKSRC_NPS -+ select CLKSRC_NPS if !PHYS_ADDR_T_64BIT - select EZNPS_GIC - select EZCHIP_NPS_MANAGEMENT_ENET if ETHERNET - help -diff --git a/arch/arm/configs/aspeed_g5_defconfig b/arch/arm/configs/aspeed_g5_defconfig -index 597536cc9573..b87508c7056c 100644 ---- a/arch/arm/configs/aspeed_g5_defconfig -+++ b/arch/arm/configs/aspeed_g5_defconfig -@@ -139,6 +139,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=6 - CONFIG_SERIAL_8250_EXTENDED=y - CONFIG_SERIAL_8250_ASPEED_VUART=y - CONFIG_SERIAL_8250_SHARE_IRQ=y -+CONFIG_SERIAL_8250_DW=y - CONFIG_SERIAL_OF_PLATFORM=y - CONFIG_ASPEED_KCS_IPMI_BMC=y - CONFIG_ASPEED_BT_IPMI_BMC=y -diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c -index 43487f035385..7a7e425616b5 100644 ---- a/arch/arm64/kvm/debug.c -+++ b/arch/arm64/kvm/debug.c -@@ -101,7 +101,7 @@ void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu) - void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) - { - bool trap_debug = !(vcpu->arch.flags & KVM_ARM64_DEBUG_DIRTY); -- unsigned long mdscr; -+ unsigned long mdscr, orig_mdcr_el2 = vcpu->arch.mdcr_el2; - - trace_kvm_arm_setup_debug(vcpu, vcpu->guest_debug); - -@@ -197,6 +197,10 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) - if (vcpu_read_sys_reg(vcpu, MDSCR_EL1) & (DBG_MDSCR_KDE | DBG_MDSCR_MDE)) - vcpu->arch.flags |= KVM_ARM64_DEBUG_DIRTY; - -+ /* Write mdcr_el2 changes since vcpu_load on VHE systems */ -+ if (has_vhe() && orig_mdcr_el2 != vcpu->arch.mdcr_el2) -+ write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2); -+ - trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2); - trace_kvm_arm_set_dreg32("MDSCR_EL1", vcpu_read_sys_reg(vcpu, MDSCR_EL1)); - } -diff --git a/arch/um/include/asm/common.lds.S b/arch/um/include/asm/common.lds.S -index d7086b985f27..4049f2c46387 100644 ---- a/arch/um/include/asm/common.lds.S -+++ b/arch/um/include/asm/common.lds.S -@@ -83,8 +83,8 @@ - __preinit_array_end = .; - } - .init_array : { -- /* dummy - we call this ourselves */ - __init_array_start = .; -+ *(.init_array) - __init_array_end = .; - } - .fini_array : { -diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S -index c69d69ee96be..f5001481010c 100644 ---- a/arch/um/kernel/dyn.lds.S -+++ b/arch/um/kernel/dyn.lds.S -@@ -103,6 +103,7 @@ SECTIONS - be empty, which isn't pretty. */ - . = ALIGN(32 / 8); - .preinit_array : { *(.preinit_array) } -+ .init_array : { *(.init_array) } - .fini_array : { *(.fini_array) } - .data : { - INIT_TASK_DATA(KERNEL_STACK_SIZE) -diff --git a/crypto/af_alg.c b/crypto/af_alg.c -index 0dceaabc6321..3d8e53010cda 100644 ---- a/crypto/af_alg.c -+++ b/crypto/af_alg.c -@@ -134,11 +134,13 @@ void af_alg_release_parent(struct sock *sk) - sk = ask->parent; - ask = alg_sk(sk); - -- lock_sock(sk); -+ local_bh_disable(); -+ bh_lock_sock(sk); - ask->nokey_refcnt -= nokey; - if (!last) - last = !--ask->refcnt; -- release_sock(sk); -+ bh_unlock_sock(sk); -+ local_bh_enable(); - - if (last) - sock_put(sk); -diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c -index 543792e0ebf0..81bbea7f2ba6 100644 ---- a/crypto/pcrypt.c -+++ b/crypto/pcrypt.c -@@ -362,11 +362,12 @@ err: - - static void __exit pcrypt_exit(void) - { -+ crypto_unregister_template(&pcrypt_tmpl); -+ - pcrypt_fini_padata(pencrypt); - pcrypt_fini_padata(pdecrypt); - - kset_unregister(pcrypt_kset); -- crypto_unregister_template(&pcrypt_tmpl); - } - - subsys_initcall(pcrypt_init); -diff --git a/drivers/android/binder.c b/drivers/android/binder.c -index 976a69420c16..254f87b627fe 100644 ---- a/drivers/android/binder.c -+++ b/drivers/android/binder.c -@@ -5203,10 +5203,11 @@ err_bad_arg: - - static int binder_open(struct inode *nodp, struct file *filp) - { -- struct binder_proc *proc; -+ struct binder_proc *proc, *itr; - struct binder_device *binder_dev; - struct binderfs_info *info; - struct dentry *binder_binderfs_dir_entry_proc = NULL; -+ bool existing_pid = false; - - binder_debug(BINDER_DEBUG_OPEN_CLOSE, "%s: %d:%d\n", __func__, - current->group_leader->pid, current->pid); -@@ -5239,19 +5240,24 @@ static int binder_open(struct inode *nodp, struct file *filp) - filp->private_data = proc; - - mutex_lock(&binder_procs_lock); -+ hlist_for_each_entry(itr, &binder_procs, proc_node) { -+ if (itr->pid == proc->pid) { -+ existing_pid = true; -+ break; -+ } -+ } - hlist_add_head(&proc->proc_node, &binder_procs); - mutex_unlock(&binder_procs_lock); - -- if (binder_debugfs_dir_entry_proc) { -+ if (binder_debugfs_dir_entry_proc && !existing_pid) { - char strbuf[11]; - - snprintf(strbuf, sizeof(strbuf), "%u", proc->pid); - /* -- * proc debug entries are shared between contexts, so -- * this will fail if the process tries to open the driver -- * again with a different context. The priting code will -- * anyway print all contexts that a given PID has, so this -- * is not a problem. -+ * proc debug entries are shared between contexts. -+ * Only create for the first PID to avoid debugfs log spamming -+ * The printing code will anyway print all contexts for a given -+ * PID so this is not a problem. - */ - proc->debugfs_entry = debugfs_create_file(strbuf, 0444, - binder_debugfs_dir_entry_proc, -@@ -5259,19 +5265,16 @@ static int binder_open(struct inode *nodp, struct file *filp) - &proc_fops); - } - -- if (binder_binderfs_dir_entry_proc) { -+ if (binder_binderfs_dir_entry_proc && !existing_pid) { - char strbuf[11]; - struct dentry *binderfs_entry; - - snprintf(strbuf, sizeof(strbuf), "%u", proc->pid); - /* - * Similar to debugfs, the process specific log file is shared -- * between contexts. If the file has already been created for a -- * process, the following binderfs_create_file() call will -- * fail with error code EEXIST if another context of the same -- * process invoked binder_open(). This is ok since same as -- * debugfs, the log file will contain information on all -- * contexts of a given PID. -+ * between contexts. Only create for the first PID. -+ * This is ok since same as debugfs, the log file will contain -+ * information on all contexts of a given PID. - */ - binderfs_entry = binderfs_create_file(binder_binderfs_dir_entry_proc, - strbuf, &proc_fops, (void *)(unsigned long)proc->pid); -@@ -5281,10 +5284,8 @@ static int binder_open(struct inode *nodp, struct file *filp) - int error; - - error = PTR_ERR(binderfs_entry); -- if (error != -EEXIST) { -- pr_warn("Unable to create file %s in binderfs (error %d)\n", -- strbuf, error); -- } -+ pr_warn("Unable to create file %s in binderfs (error %d)\n", -+ strbuf, error); - } - } - -diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c -index b23d1e4bad33..9d0d65efcd94 100644 ---- a/drivers/atm/eni.c -+++ b/drivers/atm/eni.c -@@ -374,7 +374,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, - here = (eni_vcc->descr+skip) & (eni_vcc->words-1); - dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci - << MID_DMA_VCI_SHIFT) | MID_DT_JK; -- j++; -+ dma[j++] = 0; - } - here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1); - if (!eff) size += skip; -@@ -447,7 +447,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, - if (size != eff) { - dma[j++] = (here << MID_DMA_COUNT_SHIFT) | - (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; -- j++; -+ dma[j++] = 0; - } - if (!j || j > 2*RX_DMA_BUF) { - printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n"); -diff --git a/drivers/base/component.c b/drivers/base/component.c -index 532a3a5d8f63..1fdbd6ff2058 100644 ---- a/drivers/base/component.c -+++ b/drivers/base/component.c -@@ -102,11 +102,11 @@ static int component_devices_show(struct seq_file *s, void *data) - seq_printf(s, "%-40s %20s\n", "device name", "status"); - seq_puts(s, "-------------------------------------------------------------\n"); - for (i = 0; i < match->num; i++) { -- struct device *d = (struct device *)match->compare[i].data; -+ struct component *component = match->compare[i].component; - -- seq_printf(s, "%-40s %20s\n", dev_name(d), -- match->compare[i].component ? -- "registered" : "not registered"); -+ seq_printf(s, "%-40s %20s\n", -+ component ? dev_name(component->dev) : "(unknown)", -+ component ? (component->bound ? "bound" : "not bound") : "not registered"); - } - mutex_unlock(&component_mutex); - -diff --git a/drivers/base/test/test_async_driver_probe.c b/drivers/base/test/test_async_driver_probe.c -index f4b1d8e54daf..3bb7beb127a9 100644 ---- a/drivers/base/test/test_async_driver_probe.c -+++ b/drivers/base/test/test_async_driver_probe.c -@@ -44,7 +44,8 @@ static int test_probe(struct platform_device *pdev) - * performing an async init on that node. - */ - if (dev->driver->probe_type == PROBE_PREFER_ASYNCHRONOUS) { -- if (dev_to_node(dev) != numa_node_id()) { -+ if (IS_ENABLED(CONFIG_NUMA) && -+ dev_to_node(dev) != numa_node_id()) { - dev_warn(dev, "NUMA node mismatch %d != %d\n", - dev_to_node(dev), numa_node_id()); - atomic_inc(&warnings); -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index 04cf767d0708..4e7ef35f1c8f 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -2585,7 +2585,7 @@ static void btusb_mtk_wmt_recv(struct urb *urb) - * and being processed the events from there then. - */ - if (test_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags)) { -- data->evt_skb = skb_clone(skb, GFP_KERNEL); -+ data->evt_skb = skb_clone(skb, GFP_ATOMIC); - if (!data->evt_skb) - goto err_out; - } -diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c -index abbf281ee337..d9846265a5cd 100644 ---- a/drivers/bus/ti-sysc.c -+++ b/drivers/bus/ti-sysc.c -@@ -923,6 +923,9 @@ set_midle: - return -EINVAL; - } - -+ if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_MSTANDBY) -+ best_mode = SYSC_IDLE_NO; -+ - reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift); - reg |= best_mode << regbits->midle_shift; - sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); -@@ -984,6 +987,10 @@ static int sysc_disable_module(struct device *dev) - return ret; - } - -+ if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_MSTANDBY) || -+ ddata->cfg.quirks & (SYSC_QUIRK_FORCE_MSTANDBY)) -+ best_mode = SYSC_IDLE_FORCE; -+ - reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift); - reg |= best_mode << regbits->midle_shift; - sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); -@@ -1242,6 +1249,8 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { - SYSC_QUIRK_SWSUP_SIDLE), - - /* Quirks that need to be set based on detected module */ -+ SYSC_QUIRK("aess", 0, 0, 0x10, -1, 0x40000000, 0xffffffff, -+ SYSC_MODULE_QUIRK_AESS), - SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff, - SYSC_MODULE_QUIRK_HDQ1W), - SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff, -@@ -1257,6 +1266,10 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { - SYSC_QUIRK("gpu", 0x50000000, 0x14, -1, -1, 0x00010201, 0xffffffff, 0), - SYSC_QUIRK("gpu", 0x50000000, 0xfe00, 0xfe10, -1, 0x40000000 , 0xffffffff, - SYSC_MODULE_QUIRK_SGX), -+ 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_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), - SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0, - SYSC_MODULE_QUIRK_WDT), - /* Watchdog on am3 and am4 */ -@@ -1266,7 +1279,6 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { - #ifdef DEBUG - SYSC_QUIRK("adc", 0, 0, 0x10, -1, 0x47300001, 0xffffffff, 0), - SYSC_QUIRK("atl", 0, 0, -1, -1, 0x0a070100, 0xffffffff, 0), -- SYSC_QUIRK("aess", 0, 0, 0x10, -1, 0x40000000, 0xffffffff, 0), - SYSC_QUIRK("cm", 0, 0, -1, -1, 0x40000301, 0xffffffff, 0), - SYSC_QUIRK("control", 0, 0, 0x10, -1, 0x40000900, 0xffffffff, 0), - SYSC_QUIRK("cpgmac", 0, 0x1200, 0x1208, 0x1204, 0x4edb1902, -@@ -1315,8 +1327,6 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { - 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("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000050, -- 0xffffffff, 0), - SYSC_QUIRK("vfpe", 0, 0, 0x104, -1, 0x4d001200, 0xffffffff, 0), - #endif - }; -@@ -1400,6 +1410,14 @@ static void sysc_clk_enable_quirk_hdq1w(struct sysc *ddata) - sysc_write(ddata, offset, val); - } - -+/* AESS (Audio Engine SubSystem) needs autogating set after enable */ -+static void sysc_module_enable_quirk_aess(struct sysc *ddata) -+{ -+ int offset = 0x7c; /* AESS_AUTO_GATING_ENABLE */ -+ -+ sysc_write(ddata, offset, 1); -+} -+ - /* I2C needs extra enable bit toggling for reset */ - static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable) - { -@@ -1482,6 +1500,9 @@ static void sysc_init_module_quirks(struct sysc *ddata) - return; - } - -+ if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_AESS) -+ ddata->module_enable_quirk = sysc_module_enable_quirk_aess; -+ - if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_SGX) - ddata->module_enable_quirk = sysc_module_enable_quirk_sgx; - -diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c -index db22777d59b4..62930351ccd9 100644 ---- a/drivers/crypto/caam/ctrl.c -+++ b/drivers/crypto/caam/ctrl.c -@@ -685,11 +685,9 @@ static int caam_probe(struct platform_device *pdev) - of_node_put(np); - - if (!ctrlpriv->mc_en) -- clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK | MCFGR_LONG_PTR, -+ clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK, - MCFGR_AWCACHE_CACH | MCFGR_AWCACHE_BUFF | -- MCFGR_WDENABLE | MCFGR_LARGE_BURST | -- (sizeof(dma_addr_t) == sizeof(u64) ? -- MCFGR_LONG_PTR : 0)); -+ MCFGR_WDENABLE | MCFGR_LARGE_BURST); - - handle_imx6_err005766(&ctrl->mcr); - -diff --git a/drivers/crypto/chelsio/chcr_algo.c b/drivers/crypto/chelsio/chcr_algo.c -index 38ee38b37ae6..01dd418bdadc 100644 ---- a/drivers/crypto/chelsio/chcr_algo.c -+++ b/drivers/crypto/chelsio/chcr_algo.c -@@ -3194,9 +3194,6 @@ static int chcr_gcm_setauthsize(struct crypto_aead *tfm, unsigned int authsize) - aeadctx->mayverify = VERIFY_SW; - break; - default: -- -- crypto_tfm_set_flags((struct crypto_tfm *) tfm, -- CRYPTO_TFM_RES_BAD_KEY_LEN); - return -EINVAL; - } - return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); -@@ -3221,8 +3218,6 @@ static int chcr_4106_4309_setauthsize(struct crypto_aead *tfm, - aeadctx->mayverify = VERIFY_HW; - break; - default: -- crypto_tfm_set_flags((struct crypto_tfm *)tfm, -- CRYPTO_TFM_RES_BAD_KEY_LEN); - return -EINVAL; - } - return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); -@@ -3263,8 +3258,6 @@ static int chcr_ccm_setauthsize(struct crypto_aead *tfm, - aeadctx->mayverify = VERIFY_HW; - break; - default: -- crypto_tfm_set_flags((struct crypto_tfm *)tfm, -- CRYPTO_TFM_RES_BAD_KEY_LEN); - return -EINVAL; - } - return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); -@@ -3289,8 +3282,7 @@ static int chcr_ccm_common_setkey(struct crypto_aead *aead, - ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; - mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256; - } else { -- crypto_tfm_set_flags((struct crypto_tfm *)aead, -- CRYPTO_TFM_RES_BAD_KEY_LEN); -+ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); - aeadctx->enckey_len = 0; - return -EINVAL; - } -@@ -3328,8 +3320,7 @@ static int chcr_aead_rfc4309_setkey(struct crypto_aead *aead, const u8 *key, - int error; - - if (keylen < 3) { -- crypto_tfm_set_flags((struct crypto_tfm *)aead, -- CRYPTO_TFM_RES_BAD_KEY_LEN); -+ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); - aeadctx->enckey_len = 0; - return -EINVAL; - } -@@ -3379,8 +3370,7 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key, - } else if (keylen == AES_KEYSIZE_256) { - ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; - } else { -- crypto_tfm_set_flags((struct crypto_tfm *)aead, -- CRYPTO_TFM_RES_BAD_KEY_LEN); -+ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); - pr_err("GCM: Invalid key length %d\n", keylen); - ret = -EINVAL; - goto out; -diff --git a/drivers/crypto/vmx/aes_xts.c b/drivers/crypto/vmx/aes_xts.c -index d59e736882f6..9fee1b1532a4 100644 ---- a/drivers/crypto/vmx/aes_xts.c -+++ b/drivers/crypto/vmx/aes_xts.c -@@ -84,6 +84,9 @@ static int p8_aes_xts_crypt(struct skcipher_request *req, int enc) - u8 tweak[AES_BLOCK_SIZE]; - int ret; - -+ if (req->cryptlen < AES_BLOCK_SIZE) -+ return -EINVAL; -+ - if (!crypto_simd_usable() || (req->cryptlen % XTS_BLOCK_SIZE) != 0) { - struct skcipher_request *subreq = skcipher_request_ctx(req); - -diff --git a/drivers/extcon/extcon-intel-cht-wc.c b/drivers/extcon/extcon-intel-cht-wc.c -index 9d32150e68db..771f6f4cf92e 100644 ---- a/drivers/extcon/extcon-intel-cht-wc.c -+++ b/drivers/extcon/extcon-intel-cht-wc.c -@@ -338,6 +338,7 @@ static int cht_wc_extcon_probe(struct platform_device *pdev) - struct intel_soc_pmic *pmic = dev_get_drvdata(pdev->dev.parent); - struct cht_wc_extcon_data *ext; - unsigned long mask = ~(CHT_WC_PWRSRC_VBUS | CHT_WC_PWRSRC_USBID_MASK); -+ int pwrsrc_sts, id; - int irq, ret; - - irq = platform_get_irq(pdev, 0); -@@ -387,8 +388,19 @@ static int cht_wc_extcon_probe(struct platform_device *pdev) - goto disable_sw_control; - } - -- /* Route D+ and D- to PMIC for initial charger detection */ -- cht_wc_extcon_set_phymux(ext, MUX_SEL_PMIC); -+ ret = regmap_read(ext->regmap, CHT_WC_PWRSRC_STS, &pwrsrc_sts); -+ if (ret) { -+ dev_err(ext->dev, "Error reading pwrsrc status: %d\n", ret); -+ goto disable_sw_control; -+ } -+ -+ /* -+ * If no USB host or device connected, route D+ and D- to PMIC for -+ * initial charger detection -+ */ -+ id = cht_wc_extcon_get_id(ext, pwrsrc_sts); -+ if (id != INTEL_USB_ID_GND) -+ cht_wc_extcon_set_phymux(ext, MUX_SEL_PMIC); - - /* Get initial state */ - cht_wc_extcon_pwrsrc_event(ext); -diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig -index ceb908f7dbe5..f9263426af03 100644 ---- a/drivers/gpio/Kconfig -+++ b/drivers/gpio/Kconfig -@@ -1120,6 +1120,7 @@ config GPIO_MADERA - config GPIO_MAX77620 - tristate "GPIO support for PMIC MAX77620 and MAX20024" - depends on MFD_MAX77620 -+ select GPIOLIB_IRQCHIP - help - GPIO driver for MAX77620 and MAX20024 PMIC from Maxim Semiconductor. - MAX77620 PMIC has 8 pins that can be configured as GPIOs. The -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c -index 33a1099e2f33..bb9a2771a0f9 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c -@@ -1023,6 +1023,7 @@ static const struct pci_device_id pciidlist[] = { - - /* Navi12 */ - {0x1002, 0x7360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12|AMD_EXP_HW_SUPPORT}, -+ {0x1002, 0x7362, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12|AMD_EXP_HW_SUPPORT}, - - {0, 0, 0} - }; -diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -index 4e9c15c409ba..360c87ba4595 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -@@ -3266,27 +3266,21 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing) - return color_space; - } - --static void reduce_mode_colour_depth(struct dc_crtc_timing *timing_out) --{ -- if (timing_out->display_color_depth <= COLOR_DEPTH_888) -- return; -- -- timing_out->display_color_depth--; --} -- --static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_out, -- const struct drm_display_info *info) -+static bool adjust_colour_depth_from_display_info( -+ struct dc_crtc_timing *timing_out, -+ const struct drm_display_info *info) - { -+ enum dc_color_depth depth = timing_out->display_color_depth; - int normalized_clk; -- if (timing_out->display_color_depth <= COLOR_DEPTH_888) -- return; - do { - normalized_clk = timing_out->pix_clk_100hz / 10; - /* YCbCr 4:2:0 requires additional adjustment of 1/2 */ - if (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420) - normalized_clk /= 2; - /* Adjusting pix clock following on HDMI spec based on colour depth */ -- switch (timing_out->display_color_depth) { -+ switch (depth) { -+ case COLOR_DEPTH_888: -+ break; - case COLOR_DEPTH_101010: - normalized_clk = (normalized_clk * 30) / 24; - break; -@@ -3297,14 +3291,15 @@ static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_ - normalized_clk = (normalized_clk * 48) / 24; - break; - default: -- return; -+ /* The above depths are the only ones valid for HDMI. */ -+ return false; - } -- if (normalized_clk <= info->max_tmds_clock) -- return; -- reduce_mode_colour_depth(timing_out); -- -- } while (timing_out->display_color_depth > COLOR_DEPTH_888); -- -+ if (normalized_clk <= info->max_tmds_clock) { -+ timing_out->display_color_depth = depth; -+ return true; -+ } -+ } while (--depth > COLOR_DEPTH_666); -+ return false; - } - - static void fill_stream_properties_from_drm_display_mode( -@@ -3370,8 +3365,14 @@ static void fill_stream_properties_from_drm_display_mode( - - stream->out_transfer_func->type = TF_TYPE_PREDEFINED; - stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB; -- if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) -- adjust_colour_depth_from_display_info(timing_out, info); -+ if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) { -+ if (!adjust_colour_depth_from_display_info(timing_out, info) && -+ drm_mode_is_420_also(info, mode_in) && -+ timing_out->pixel_encoding != PIXEL_ENCODING_YCBCR420) { -+ timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420; -+ adjust_colour_depth_from_display_info(timing_out, info); -+ } -+ } - } - - static void fill_audio_info(struct audio_info *audio_info, -diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c -index 8063b1d567b1..e6e4c841fb06 100644 ---- a/drivers/hid/hid-asus.c -+++ b/drivers/hid/hid-asus.c -@@ -261,7 +261,8 @@ static int asus_event(struct hid_device *hdev, struct hid_field *field, - struct hid_usage *usage, __s32 value) - { - if ((usage->hid & HID_USAGE_PAGE) == 0xff310000 && -- (usage->hid & HID_USAGE) != 0x00 && !usage->type) { -+ (usage->hid & HID_USAGE) != 0x00 && -+ (usage->hid & HID_USAGE) != 0xff && !usage->type) { - hid_warn(hdev, "Unmapped Asus vendor usagepage code 0x%02x\n", - usage->hid & HID_USAGE); - } -diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h -index 6273e7178e78..5fc82029a03b 100644 ---- a/drivers/hid/hid-ids.h -+++ b/drivers/hid/hid-ids.h -@@ -631,6 +631,7 @@ - #define USB_VENDOR_ID_ITE 0x048d - #define USB_DEVICE_ID_ITE_LENOVO_YOGA 0x8386 - #define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350 -+#define I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720 0x837a - #define USB_DEVICE_ID_ITE_LENOVO_YOGA900 0x8396 - #define USB_DEVICE_ID_ITE8595 0x8595 - -@@ -730,6 +731,7 @@ - #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 - #define USB_DEVICE_ID_LG_MELFAS_MT 0x6007 - #define I2C_DEVICE_ID_LG_8001 0x8001 -+#define I2C_DEVICE_ID_LG_7010 0x7010 - - #define USB_VENDOR_ID_LOGITECH 0x046d - #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e -@@ -1098,6 +1100,7 @@ - #define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10 - #define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3 - #define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3 -+#define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968 - #define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710 - #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5 0x81a7 - -diff --git a/drivers/hid/hid-ite.c b/drivers/hid/hid-ite.c -index a45f2352618d..c436e12feb23 100644 ---- a/drivers/hid/hid-ite.c -+++ b/drivers/hid/hid-ite.c -@@ -40,6 +40,9 @@ static int ite_event(struct hid_device *hdev, struct hid_field *field, - static const struct hid_device_id ite_devices[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, - { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, -+ /* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */ -+ { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, -+ USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, - { } - }; - MODULE_DEVICE_TABLE(hid, ite_devices); -diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c -index 3cfeb1629f79..362805ddf377 100644 ---- a/drivers/hid/hid-multitouch.c -+++ b/drivers/hid/hid-multitouch.c -@@ -1019,7 +1019,7 @@ static int mt_process_slot(struct mt_device *td, struct input_dev *input, - tool = MT_TOOL_DIAL; - else if (unlikely(!confidence_state)) { - tool = MT_TOOL_PALM; -- if (!active && -+ if (!active && mt && - input_mt_is_active(&mt->slots[slotnum])) { - /* - * The non-confidence was reported for -@@ -1985,6 +1985,9 @@ static const struct hid_device_id mt_devices[] = { - { .driver_data = MT_CLS_LG, - HID_USB_DEVICE(USB_VENDOR_ID_LG, - USB_DEVICE_ID_LG_MELFAS_MT) }, -+ { .driver_data = MT_CLS_LG, -+ HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC, -+ USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) }, - - /* MosArt panels */ - { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, -diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c -index 9a35af1e2662..fa58a7cbb3ff 100644 ---- a/drivers/hid/hid-quirks.c -+++ b/drivers/hid/hid-quirks.c -@@ -174,6 +174,7 @@ static const struct hid_device_id hid_quirks[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD2, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_XIN_MO_DUAL_ARCADE), HID_QUIRK_MULTI_INPUT }, - - { 0 } - }; -diff --git a/drivers/hid/hid-steam.c b/drivers/hid/hid-steam.c -index 8dae0f9b819e..6286204d4c56 100644 ---- a/drivers/hid/hid-steam.c -+++ b/drivers/hid/hid-steam.c -@@ -768,8 +768,12 @@ static int steam_probe(struct hid_device *hdev, - - if (steam->quirks & STEAM_QUIRK_WIRELESS) { - hid_info(hdev, "Steam wireless receiver connected"); -+ /* If using a wireless adaptor ask for connection status */ -+ steam->connected = false; - steam_request_conn_status(steam); - } else { -+ /* A wired connection is always present */ -+ steam->connected = true; - ret = steam_register(steam); - if (ret) { - hid_err(hdev, -diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c -index ac44bf752ff1..479934f7d241 100644 ---- a/drivers/hid/i2c-hid/i2c-hid-core.c -+++ b/drivers/hid/i2c-hid/i2c-hid-core.c -@@ -49,6 +49,8 @@ - #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1) - #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4) - #define I2C_HID_QUIRK_RESET_ON_RESUME BIT(5) -+#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(6) -+ - - /* flags */ - #define I2C_HID_STARTED 0 -@@ -177,6 +179,8 @@ static const struct i2c_hid_quirks { - I2C_HID_QUIRK_BOGUS_IRQ }, - { USB_VENDOR_ID_ALPS_JP, HID_ANY_ID, - I2C_HID_QUIRK_RESET_ON_RESUME }, -+ { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, -+ I2C_HID_QUIRK_BAD_INPUT_SIZE }, - { 0, 0 } - }; - -@@ -498,9 +502,15 @@ static void i2c_hid_get_input(struct i2c_hid *ihid) - } - - if ((ret_size > size) || (ret_size < 2)) { -- dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", -- __func__, size, ret_size); -- return; -+ if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { -+ ihid->inbuf[0] = size & 0xff; -+ ihid->inbuf[1] = size >> 8; -+ ret_size = size; -+ } else { -+ dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", -+ __func__, size, ret_size); -+ return; -+ } - } - - i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); -diff --git a/drivers/hid/intel-ish-hid/ipc/hw-ish.h b/drivers/hid/intel-ish-hid/ipc/hw-ish.h -index 6c1e6110867f..1fb294ca463e 100644 ---- a/drivers/hid/intel-ish-hid/ipc/hw-ish.h -+++ b/drivers/hid/intel-ish-hid/ipc/hw-ish.h -@@ -24,7 +24,9 @@ - #define ICL_MOBILE_DEVICE_ID 0x34FC - #define SPT_H_DEVICE_ID 0xA135 - #define CML_LP_DEVICE_ID 0x02FC -+#define CMP_H_DEVICE_ID 0x06FC - #define EHL_Ax_DEVICE_ID 0x4BB3 -+#define TGL_LP_DEVICE_ID 0xA0FC - - #define REVISION_ID_CHT_A0 0x6 - #define REVISION_ID_CHT_Ax_SI 0x0 -diff --git a/drivers/hid/intel-ish-hid/ipc/pci-ish.c b/drivers/hid/intel-ish-hid/ipc/pci-ish.c -index 784dcc8c7022..f491d8b4e24c 100644 ---- a/drivers/hid/intel-ish-hid/ipc/pci-ish.c -+++ b/drivers/hid/intel-ish-hid/ipc/pci-ish.c -@@ -34,7 +34,9 @@ static const struct pci_device_id ish_pci_tbl[] = { - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ICL_MOBILE_DEVICE_ID)}, - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, SPT_H_DEVICE_ID)}, - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, CML_LP_DEVICE_ID)}, -+ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, CMP_H_DEVICE_ID)}, - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, EHL_Ax_DEVICE_ID)}, -+ {PCI_DEVICE(PCI_VENDOR_ID_INTEL, TGL_LP_DEVICE_ID)}, - {0, } - }; - MODULE_DEVICE_TABLE(pci, ish_pci_tbl); -diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c -index ccb74529bc78..d99a9d407671 100644 ---- a/drivers/hid/wacom_wac.c -+++ b/drivers/hid/wacom_wac.c -@@ -2096,14 +2096,16 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field - (hdev->product == 0x34d || hdev->product == 0x34e || /* MobileStudio Pro */ - hdev->product == 0x357 || hdev->product == 0x358 || /* Intuos Pro 2 */ - hdev->product == 0x392 || /* Intuos Pro 2 */ -- hdev->product == 0x398 || hdev->product == 0x399)) { /* MobileStudio Pro */ -+ hdev->product == 0x398 || hdev->product == 0x399 || /* MobileStudio Pro */ -+ hdev->product == 0x3AA)) { /* MobileStudio Pro */ - value = (field->logical_maximum - value); - - if (hdev->product == 0x357 || hdev->product == 0x358 || - hdev->product == 0x392) - value = wacom_offset_rotation(input, usage, value, 3, 16); - else if (hdev->product == 0x34d || hdev->product == 0x34e || -- hdev->product == 0x398 || hdev->product == 0x399) -+ hdev->product == 0x398 || hdev->product == 0x399 || -+ hdev->product == 0x3AA) - value = wacom_offset_rotation(input, usage, value, 1, 2); - } - else { -diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c -index e493242c266e..0339ecdd06bd 100644 ---- a/drivers/iio/adc/stm32-dfsdm-adc.c -+++ b/drivers/iio/adc/stm32-dfsdm-adc.c -@@ -1204,6 +1204,8 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev, - - stm32_dfsdm_stop_conv(adc); - -+ stm32_dfsdm_process_data(adc, res); -+ - stop_dfsdm: - stm32_dfsdm_stop_dfsdm(adc->dfsdm); - -diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c -index c0acbb5d2ffb..b21f72dd473c 100644 ---- a/drivers/iio/gyro/st_gyro_core.c -+++ b/drivers/iio/gyro/st_gyro_core.c -@@ -139,7 +139,6 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = { - [2] = LSM330DLC_GYRO_DEV_NAME, - [3] = L3G4IS_GYRO_DEV_NAME, - [4] = LSM330_GYRO_DEV_NAME, -- [5] = LSM9DS0_GYRO_DEV_NAME, - }, - .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, - .odr = { -@@ -209,6 +208,80 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = { - .multi_read_bit = true, - .bootime = 2, - }, -+ { -+ .wai = 0xd4, -+ .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, -+ .sensors_supported = { -+ [0] = LSM9DS0_GYRO_DEV_NAME, -+ }, -+ .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, -+ .odr = { -+ .addr = 0x20, -+ .mask = GENMASK(7, 6), -+ .odr_avl = { -+ { .hz = 95, .value = 0x00, }, -+ { .hz = 190, .value = 0x01, }, -+ { .hz = 380, .value = 0x02, }, -+ { .hz = 760, .value = 0x03, }, -+ }, -+ }, -+ .pw = { -+ .addr = 0x20, -+ .mask = BIT(3), -+ .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE, -+ .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE, -+ }, -+ .enable_axis = { -+ .addr = ST_SENSORS_DEFAULT_AXIS_ADDR, -+ .mask = ST_SENSORS_DEFAULT_AXIS_MASK, -+ }, -+ .fs = { -+ .addr = 0x23, -+ .mask = GENMASK(5, 4), -+ .fs_avl = { -+ [0] = { -+ .num = ST_GYRO_FS_AVL_245DPS, -+ .value = 0x00, -+ .gain = IIO_DEGREE_TO_RAD(8750), -+ }, -+ [1] = { -+ .num = ST_GYRO_FS_AVL_500DPS, -+ .value = 0x01, -+ .gain = IIO_DEGREE_TO_RAD(17500), -+ }, -+ [2] = { -+ .num = ST_GYRO_FS_AVL_2000DPS, -+ .value = 0x02, -+ .gain = IIO_DEGREE_TO_RAD(70000), -+ }, -+ }, -+ }, -+ .bdu = { -+ .addr = 0x23, -+ .mask = BIT(7), -+ }, -+ .drdy_irq = { -+ .int2 = { -+ .addr = 0x22, -+ .mask = BIT(3), -+ }, -+ /* -+ * The sensor has IHL (active low) and open -+ * drain settings, but only for INT1 and not -+ * for the DRDY line on INT2. -+ */ -+ .stat_drdy = { -+ .addr = ST_SENSORS_DEFAULT_STAT_ADDR, -+ .mask = GENMASK(2, 0), -+ }, -+ }, -+ .sim = { -+ .addr = 0x23, -+ .value = BIT(0), -+ }, -+ .multi_read_bit = true, -+ .bootime = 2, -+ }, - { - .wai = 0xd7, - .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, -diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c -index dd555078258c..454695b372c8 100644 ---- a/drivers/iommu/amd_iommu.c -+++ b/drivers/iommu/amd_iommu.c -@@ -226,71 +226,61 @@ static struct iommu_dev_data *search_dev_data(u16 devid) - return NULL; - } - --static int __last_alias(struct pci_dev *pdev, u16 alias, void *data) -+static int clone_alias(struct pci_dev *pdev, u16 alias, void *data) - { -- *(u16 *)data = alias; -- return 0; --} -- --static u16 get_alias(struct device *dev) --{ -- struct pci_dev *pdev = to_pci_dev(dev); -- u16 devid, ivrs_alias, pci_alias; -- -- /* The callers make sure that get_device_id() does not fail here */ -- devid = get_device_id(dev); -+ u16 devid = pci_dev_id(pdev); - -- /* For ACPI HID devices, we simply return the devid as such */ -- if (!dev_is_pci(dev)) -- return devid; -+ if (devid == alias) -+ return 0; - -- ivrs_alias = amd_iommu_alias_table[devid]; -+ amd_iommu_rlookup_table[alias] = -+ amd_iommu_rlookup_table[devid]; -+ memcpy(amd_iommu_dev_table[alias].data, -+ amd_iommu_dev_table[devid].data, -+ sizeof(amd_iommu_dev_table[alias].data)); - -- pci_for_each_dma_alias(pdev, __last_alias, &pci_alias); -+ return 0; -+} - -- if (ivrs_alias == pci_alias) -- return ivrs_alias; -+static void clone_aliases(struct pci_dev *pdev) -+{ -+ if (!pdev) -+ return; - - /* -- * DMA alias showdown -- * -- * The IVRS is fairly reliable in telling us about aliases, but it -- * can't know about every screwy device. If we don't have an IVRS -- * reported alias, use the PCI reported alias. In that case we may -- * still need to initialize the rlookup and dev_table entries if the -- * alias is to a non-existent device. -+ * The IVRS alias stored in the alias table may not be -+ * part of the PCI DMA aliases if it's bus differs -+ * from the original device. - */ -- if (ivrs_alias == devid) { -- if (!amd_iommu_rlookup_table[pci_alias]) { -- amd_iommu_rlookup_table[pci_alias] = -- amd_iommu_rlookup_table[devid]; -- memcpy(amd_iommu_dev_table[pci_alias].data, -- amd_iommu_dev_table[devid].data, -- sizeof(amd_iommu_dev_table[pci_alias].data)); -- } -+ clone_alias(pdev, amd_iommu_alias_table[pci_dev_id(pdev)], NULL); - -- return pci_alias; -- } -+ pci_for_each_dma_alias(pdev, clone_alias, NULL); -+} - -- pci_info(pdev, "Using IVRS reported alias %02x:%02x.%d " -- "for device [%04x:%04x], kernel reported alias " -- "%02x:%02x.%d\n", PCI_BUS_NUM(ivrs_alias), PCI_SLOT(ivrs_alias), -- PCI_FUNC(ivrs_alias), pdev->vendor, pdev->device, -- PCI_BUS_NUM(pci_alias), PCI_SLOT(pci_alias), -- PCI_FUNC(pci_alias)); -+static struct pci_dev *setup_aliases(struct device *dev) -+{ -+ struct pci_dev *pdev = to_pci_dev(dev); -+ u16 ivrs_alias; -+ -+ /* For ACPI HID devices, there are no aliases */ -+ if (!dev_is_pci(dev)) -+ return NULL; - - /* -- * If we don't have a PCI DMA alias and the IVRS alias is on the same -- * bus, then the IVRS table may know about a quirk that we don't. -+ * Add the IVRS alias to the pci aliases if it is on the same -+ * bus. The IVRS table may know about a quirk that we don't. - */ -- if (pci_alias == devid && -+ ivrs_alias = amd_iommu_alias_table[pci_dev_id(pdev)]; -+ if (ivrs_alias != pci_dev_id(pdev) && - PCI_BUS_NUM(ivrs_alias) == pdev->bus->number) { - pci_add_dma_alias(pdev, ivrs_alias & 0xff); - pci_info(pdev, "Added PCI DMA alias %02x.%d\n", - PCI_SLOT(ivrs_alias), PCI_FUNC(ivrs_alias)); - } - -- return ivrs_alias; -+ clone_aliases(pdev); -+ -+ return pdev; - } - - static struct iommu_dev_data *find_dev_data(u16 devid) -@@ -428,7 +418,7 @@ static int iommu_init_device(struct device *dev) - if (!dev_data) - return -ENOMEM; - -- dev_data->alias = get_alias(dev); -+ dev_data->pdev = setup_aliases(dev); - - /* - * By default we use passthrough mode for IOMMUv2 capable device. -@@ -453,20 +443,16 @@ static int iommu_init_device(struct device *dev) - - static void iommu_ignore_device(struct device *dev) - { -- u16 alias; - int devid; - - devid = get_device_id(dev); - if (devid < 0) - return; - -- alias = get_alias(dev); -- -+ amd_iommu_rlookup_table[devid] = NULL; - memset(&amd_iommu_dev_table[devid], 0, sizeof(struct dev_table_entry)); -- memset(&amd_iommu_dev_table[alias], 0, sizeof(struct dev_table_entry)); - -- amd_iommu_rlookup_table[devid] = NULL; -- amd_iommu_rlookup_table[alias] = NULL; -+ setup_aliases(dev); - } - - static void iommu_uninit_device(struct device *dev) -@@ -1236,6 +1222,13 @@ static int device_flush_iotlb(struct iommu_dev_data *dev_data, - return iommu_queue_command(iommu, &cmd); - } - -+static int device_flush_dte_alias(struct pci_dev *pdev, u16 alias, void *data) -+{ -+ struct amd_iommu *iommu = data; -+ -+ return iommu_flush_dte(iommu, alias); -+} -+ - /* - * Command send function for invalidating a device table entry - */ -@@ -1246,14 +1239,22 @@ static int device_flush_dte(struct iommu_dev_data *dev_data) - int ret; - - iommu = amd_iommu_rlookup_table[dev_data->devid]; -- alias = dev_data->alias; - -- ret = iommu_flush_dte(iommu, dev_data->devid); -- if (!ret && alias != dev_data->devid) -- ret = iommu_flush_dte(iommu, alias); -+ if (dev_data->pdev) -+ ret = pci_for_each_dma_alias(dev_data->pdev, -+ device_flush_dte_alias, iommu); -+ else -+ ret = iommu_flush_dte(iommu, dev_data->devid); - if (ret) - return ret; - -+ alias = amd_iommu_alias_table[dev_data->devid]; -+ if (alias != dev_data->devid) { -+ ret = iommu_flush_dte(iommu, alias); -+ if (ret) -+ return ret; -+ } -+ - if (dev_data->ats.enabled) - ret = device_flush_iotlb(dev_data, 0, ~0UL); - -@@ -2035,11 +2036,9 @@ static void do_attach(struct iommu_dev_data *dev_data, - struct protection_domain *domain) - { - struct amd_iommu *iommu; -- u16 alias; - bool ats; - - iommu = amd_iommu_rlookup_table[dev_data->devid]; -- alias = dev_data->alias; - ats = dev_data->ats.enabled; - - /* Update data structures */ -@@ -2052,8 +2051,7 @@ static void do_attach(struct iommu_dev_data *dev_data, - - /* Update device table */ - set_dte_entry(dev_data->devid, domain, ats, dev_data->iommu_v2); -- if (alias != dev_data->devid) -- set_dte_entry(alias, domain, ats, dev_data->iommu_v2); -+ clone_aliases(dev_data->pdev); - - device_flush_dte(dev_data); - } -@@ -2062,17 +2060,14 @@ static void do_detach(struct iommu_dev_data *dev_data) - { - struct protection_domain *domain = dev_data->domain; - struct amd_iommu *iommu; -- u16 alias; - - iommu = amd_iommu_rlookup_table[dev_data->devid]; -- alias = dev_data->alias; - - /* Update data structures */ - dev_data->domain = NULL; - list_del(&dev_data->list); - clear_dte_entry(dev_data->devid); -- if (alias != dev_data->devid) -- clear_dte_entry(alias); -+ clone_aliases(dev_data->pdev); - - /* Flush the DTE entry */ - device_flush_dte(dev_data); -@@ -2384,13 +2379,7 @@ static void update_device_table(struct protection_domain *domain) - list_for_each_entry(dev_data, &domain->dev_list, list) { - set_dte_entry(dev_data->devid, domain, dev_data->ats.enabled, - dev_data->iommu_v2); -- -- if (dev_data->devid == dev_data->alias) -- continue; -- -- /* There is an alias, update device table entry for it */ -- set_dte_entry(dev_data->alias, domain, dev_data->ats.enabled, -- dev_data->iommu_v2); -+ clone_aliases(dev_data->pdev); - } - } - -@@ -3752,7 +3741,20 @@ static void set_remap_table_entry(struct amd_iommu *iommu, u16 devid, - iommu_flush_dte(iommu, devid); - } - --static struct irq_remap_table *alloc_irq_table(u16 devid) -+static int set_remap_table_entry_alias(struct pci_dev *pdev, u16 alias, -+ void *data) -+{ -+ struct irq_remap_table *table = data; -+ -+ irq_lookup_table[alias] = table; -+ set_dte_irq_entry(alias, table); -+ -+ iommu_flush_dte(amd_iommu_rlookup_table[alias], alias); -+ -+ return 0; -+} -+ -+static struct irq_remap_table *alloc_irq_table(u16 devid, struct pci_dev *pdev) - { - struct irq_remap_table *table = NULL; - struct irq_remap_table *new_table = NULL; -@@ -3798,7 +3800,12 @@ static struct irq_remap_table *alloc_irq_table(u16 devid) - table = new_table; - new_table = NULL; - -- set_remap_table_entry(iommu, devid, table); -+ if (pdev) -+ pci_for_each_dma_alias(pdev, set_remap_table_entry_alias, -+ table); -+ else -+ set_remap_table_entry(iommu, devid, table); -+ - if (devid != alias) - set_remap_table_entry(iommu, alias, table); - -@@ -3815,7 +3822,8 @@ out_unlock: - return table; - } - --static int alloc_irq_index(u16 devid, int count, bool align) -+static int alloc_irq_index(u16 devid, int count, bool align, -+ struct pci_dev *pdev) - { - struct irq_remap_table *table; - int index, c, alignment = 1; -@@ -3825,7 +3833,7 @@ static int alloc_irq_index(u16 devid, int count, bool align) - if (!iommu) - return -ENODEV; - -- table = alloc_irq_table(devid); -+ table = alloc_irq_table(devid, pdev); - if (!table) - return -ENODEV; - -@@ -4258,7 +4266,7 @@ static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq, - struct irq_remap_table *table; - struct amd_iommu *iommu; - -- table = alloc_irq_table(devid); -+ table = alloc_irq_table(devid, NULL); - if (table) { - if (!table->min_index) { - /* -@@ -4275,11 +4283,15 @@ static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq, - } else { - index = -ENOMEM; - } -- } else { -+ } else if (info->type == X86_IRQ_ALLOC_TYPE_MSI || -+ info->type == X86_IRQ_ALLOC_TYPE_MSIX) { - bool align = (info->type == X86_IRQ_ALLOC_TYPE_MSI); - -- index = alloc_irq_index(devid, nr_irqs, align); -+ index = alloc_irq_index(devid, nr_irqs, align, info->msi_dev); -+ } else { -+ index = alloc_irq_index(devid, nr_irqs, false, NULL); - } -+ - if (index < 0) { - pr_warn("Failed to allocate IRTE\n"); - ret = index; -diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h -index 17bd5a349119..fc956479b94e 100644 ---- a/drivers/iommu/amd_iommu_types.h -+++ b/drivers/iommu/amd_iommu_types.h -@@ -639,8 +639,8 @@ struct iommu_dev_data { - struct list_head list; /* For domain->dev_list */ - struct llist_node dev_data_list; /* For global dev_data_list */ - struct protection_domain *domain; /* Domain the device is bound to */ -+ struct pci_dev *pdev; - u16 devid; /* PCI Device ID */ -- u16 alias; /* Alias Device ID */ - bool iommu_v2; /* Device can make use of IOMMUv2 */ - bool passthrough; /* Device is identity mapped */ - struct { -diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c -index 51456e7f264f..c68a1f072c31 100644 ---- a/drivers/iommu/dma-iommu.c -+++ b/drivers/iommu/dma-iommu.c -@@ -1177,7 +1177,6 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) - { - struct device *dev = msi_desc_to_dev(desc); - struct iommu_domain *domain = iommu_get_domain_for_dev(dev); -- struct iommu_dma_cookie *cookie; - struct iommu_dma_msi_page *msi_page; - static DEFINE_MUTEX(msi_prepare_lock); /* see below */ - -@@ -1186,8 +1185,6 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) - return 0; - } - -- cookie = domain->iova_cookie; -- - /* - * In fact the whole prepare operation should already be serialised by - * irq_domain_mutex further up the callchain, but that's pretty subtle -diff --git a/drivers/media/usb/dvb-usb-v2/dvbsky.c b/drivers/media/usb/dvb-usb-v2/dvbsky.c -index 617a306f6815..dc380c0c9536 100644 ---- a/drivers/media/usb/dvb-usb-v2/dvbsky.c -+++ b/drivers/media/usb/dvb-usb-v2/dvbsky.c -@@ -792,6 +792,9 @@ static const struct usb_device_id dvbsky_id_table[] = { - { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C, - &mygica_t230c_props, "MyGica Mini DVB-T2 USB Stick T230C", - RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, -+ { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C_LITE, -+ &mygica_t230c_props, "MyGica Mini DVB-T2 USB Stick T230C Lite", -+ NULL) }, - { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C2, - &mygica_t230c_props, "MyGica Mini DVB-T2 USB Stick T230C v2", - RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, -diff --git a/drivers/mfd/intel-lpss-pci.c b/drivers/mfd/intel-lpss-pci.c -index 1767f30a1676..b33030e3385c 100644 ---- a/drivers/mfd/intel-lpss-pci.c -+++ b/drivers/mfd/intel-lpss-pci.c -@@ -140,7 +140,7 @@ static const struct intel_lpss_platform_info cnl_i2c_info = { - }; - - static const struct pci_device_id intel_lpss_pci_ids[] = { -- /* CML */ -+ /* CML-LP */ - { PCI_VDEVICE(INTEL, 0x02a8), (kernel_ulong_t)&spt_uart_info }, - { PCI_VDEVICE(INTEL, 0x02a9), (kernel_ulong_t)&spt_uart_info }, - { PCI_VDEVICE(INTEL, 0x02aa), (kernel_ulong_t)&spt_info }, -@@ -153,6 +153,17 @@ static const struct pci_device_id intel_lpss_pci_ids[] = { - { PCI_VDEVICE(INTEL, 0x02ea), (kernel_ulong_t)&cnl_i2c_info }, - { PCI_VDEVICE(INTEL, 0x02eb), (kernel_ulong_t)&cnl_i2c_info }, - { PCI_VDEVICE(INTEL, 0x02fb), (kernel_ulong_t)&spt_info }, -+ /* CML-H */ -+ { PCI_VDEVICE(INTEL, 0x06a8), (kernel_ulong_t)&spt_uart_info }, -+ { PCI_VDEVICE(INTEL, 0x06a9), (kernel_ulong_t)&spt_uart_info }, -+ { PCI_VDEVICE(INTEL, 0x06aa), (kernel_ulong_t)&spt_info }, -+ { PCI_VDEVICE(INTEL, 0x06ab), (kernel_ulong_t)&spt_info }, -+ { PCI_VDEVICE(INTEL, 0x06c7), (kernel_ulong_t)&spt_uart_info }, -+ { PCI_VDEVICE(INTEL, 0x06e8), (kernel_ulong_t)&cnl_i2c_info }, -+ { PCI_VDEVICE(INTEL, 0x06e9), (kernel_ulong_t)&cnl_i2c_info }, -+ { PCI_VDEVICE(INTEL, 0x06ea), (kernel_ulong_t)&cnl_i2c_info }, -+ { PCI_VDEVICE(INTEL, 0x06eb), (kernel_ulong_t)&cnl_i2c_info }, -+ { PCI_VDEVICE(INTEL, 0x06fb), (kernel_ulong_t)&spt_info }, - /* BXT A-Step */ - { PCI_VDEVICE(INTEL, 0x0aac), (kernel_ulong_t)&bxt_i2c_info }, - { PCI_VDEVICE(INTEL, 0x0aae), (kernel_ulong_t)&bxt_i2c_info }, -diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c -index c681f6fab342..a9793ea6933b 100644 ---- a/drivers/misc/mei/hdcp/mei_hdcp.c -+++ b/drivers/misc/mei/hdcp/mei_hdcp.c -@@ -758,11 +758,38 @@ static const struct component_master_ops mei_component_master_ops = { - .unbind = mei_component_master_unbind, - }; - -+/** -+ * mei_hdcp_component_match - compare function for matching mei hdcp. -+ * -+ * The function checks if the driver is i915, the subcomponent is HDCP -+ * and the grand parent of hdcp and the parent of i915 are the same -+ * PCH device. -+ * -+ * @dev: master device -+ * @subcomponent: subcomponent to match (I915_COMPONENT_HDCP) -+ * @data: compare data (mei hdcp device) -+ * -+ * Return: -+ * * 1 - if components match -+ * * 0 - otherwise -+ */ - static int mei_hdcp_component_match(struct device *dev, int subcomponent, - void *data) - { -- return !strcmp(dev->driver->name, "i915") && -- subcomponent == I915_COMPONENT_HDCP; -+ struct device *base = data; -+ -+ if (strcmp(dev->driver->name, "i915") || -+ subcomponent != I915_COMPONENT_HDCP) -+ return 0; -+ -+ base = base->parent; -+ if (!base) -+ return 0; -+ -+ base = base->parent; -+ dev = dev->parent; -+ -+ return (base && dev && dev == base); - } - - static int mei_hdcp_probe(struct mei_cl_device *cldev, -@@ -786,7 +813,7 @@ static int mei_hdcp_probe(struct mei_cl_device *cldev, - - master_match = NULL; - component_match_add_typed(&cldev->dev, &master_match, -- mei_hdcp_component_match, comp_master); -+ mei_hdcp_component_match, &cldev->dev); - if (IS_ERR_OR_NULL(master_match)) { - ret = -ENOMEM; - goto err_exit; -diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h -index b359f06f05e7..69d9b1736bf9 100644 ---- a/drivers/misc/mei/hw-me-regs.h -+++ b/drivers/misc/mei/hw-me-regs.h -@@ -81,8 +81,12 @@ - - #define MEI_DEV_ID_CMP_LP 0x02e0 /* Comet Point LP */ - #define MEI_DEV_ID_CMP_LP_3 0x02e4 /* Comet Point LP 3 (iTouch) */ -+ - #define MEI_DEV_ID_CMP_V 0xA3BA /* Comet Point Lake V */ - -+#define MEI_DEV_ID_CMP_H 0x06e0 /* Comet Lake H */ -+#define MEI_DEV_ID_CMP_H_3 0x06e4 /* Comet Lake H 3 (iTouch) */ -+ - #define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */ - - #define MEI_DEV_ID_TGP_LP 0xA0E0 /* Tiger Lake Point LP */ -diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c -index ce43415a536c..309cb8a23381 100644 ---- a/drivers/misc/mei/pci-me.c -+++ b/drivers/misc/mei/pci-me.c -@@ -99,6 +99,8 @@ static const struct pci_device_id mei_me_pci_tbl[] = { - {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_LP, MEI_ME_PCH12_CFG)}, - {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_LP_3, MEI_ME_PCH8_CFG)}, - {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_V, MEI_ME_PCH12_CFG)}, -+ {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H, MEI_ME_PCH12_CFG)}, -+ {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H_3, MEI_ME_PCH8_CFG)}, - - {MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)}, - -diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c -index 642a9667db4d..c9ea365c248c 100644 ---- a/drivers/mmc/host/sdhci-pci-core.c -+++ b/drivers/mmc/host/sdhci-pci-core.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -1598,11 +1599,59 @@ static int amd_probe(struct sdhci_pci_chip *chip) - return 0; - } - -+static u32 sdhci_read_present_state(struct sdhci_host *host) -+{ -+ return sdhci_readl(host, SDHCI_PRESENT_STATE); -+} -+ -+void amd_sdhci_reset(struct sdhci_host *host, u8 mask) -+{ -+ struct sdhci_pci_slot *slot = sdhci_priv(host); -+ struct pci_dev *pdev = slot->chip->pdev; -+ u32 present_state; -+ -+ /* -+ * SDHC 0x7906 requires a hard reset to clear all internal state. -+ * Otherwise it can get into a bad state where the DATA lines are always -+ * read as zeros. -+ */ -+ if (pdev->device == 0x7906 && (mask & SDHCI_RESET_ALL)) { -+ pci_clear_master(pdev); -+ -+ pci_save_state(pdev); -+ -+ pci_set_power_state(pdev, PCI_D3cold); -+ pr_debug("%s: power_state=%u\n", mmc_hostname(host->mmc), -+ pdev->current_state); -+ pci_set_power_state(pdev, PCI_D0); -+ -+ pci_restore_state(pdev); -+ -+ /* -+ * SDHCI_RESET_ALL says the card detect logic should not be -+ * reset, but since we need to reset the entire controller -+ * we should wait until the card detect logic has stabilized. -+ * -+ * This normally takes about 40ms. -+ */ -+ readx_poll_timeout( -+ sdhci_read_present_state, -+ host, -+ present_state, -+ present_state & SDHCI_CD_STABLE, -+ 10000, -+ 100000 -+ ); -+ } -+ -+ return sdhci_reset(host, mask); -+} -+ - static const struct sdhci_ops amd_sdhci_pci_ops = { - .set_clock = sdhci_set_clock, - .enable_dma = sdhci_pci_enable_dma, - .set_bus_width = sdhci_set_bus_width, -- .reset = sdhci_reset, -+ .reset = amd_sdhci_reset, - .set_uhs_signaling = sdhci_set_uhs_signaling, - }; - -@@ -1681,6 +1730,8 @@ static const struct pci_device_id pci_ids[] = { - SDHCI_PCI_DEVICE(INTEL, CML_EMMC, intel_glk_emmc), - SDHCI_PCI_DEVICE(INTEL, CML_SD, intel_byt_sd), - SDHCI_PCI_DEVICE(INTEL, CMLH_SD, intel_byt_sd), -+ SDHCI_PCI_DEVICE(INTEL, JSL_EMMC, intel_glk_emmc), -+ SDHCI_PCI_DEVICE(INTEL, JSL_SD, intel_byt_sd), - SDHCI_PCI_DEVICE(O2, 8120, o2), - SDHCI_PCI_DEVICE(O2, 8220, o2), - SDHCI_PCI_DEVICE(O2, 8221, o2), -diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h -index 558202fe64c6..981bbbe63aff 100644 ---- a/drivers/mmc/host/sdhci-pci.h -+++ b/drivers/mmc/host/sdhci-pci.h -@@ -55,6 +55,8 @@ - #define PCI_DEVICE_ID_INTEL_CML_EMMC 0x02c4 - #define PCI_DEVICE_ID_INTEL_CML_SD 0x02f5 - #define PCI_DEVICE_ID_INTEL_CMLH_SD 0x06f5 -+#define PCI_DEVICE_ID_INTEL_JSL_EMMC 0x4dc4 -+#define PCI_DEVICE_ID_INTEL_JSL_SD 0x4df8 - - #define PCI_DEVICE_ID_SYSKONNECT_8000 0x8000 - #define PCI_DEVICE_ID_VIA_95D0 0x95d0 -diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c -index d797912e665a..b233756345f8 100644 ---- a/drivers/net/can/m_can/tcan4x5x.c -+++ b/drivers/net/can/m_can/tcan4x5x.c -@@ -164,6 +164,28 @@ static void tcan4x5x_check_wake(struct tcan4x5x_priv *priv) - } - } - -+static int tcan4x5x_reset(struct tcan4x5x_priv *priv) -+{ -+ int ret = 0; -+ -+ if (priv->reset_gpio) { -+ gpiod_set_value(priv->reset_gpio, 1); -+ -+ /* tpulse_width minimum 30us */ -+ usleep_range(30, 100); -+ gpiod_set_value(priv->reset_gpio, 0); -+ } else { -+ ret = regmap_write(priv->regmap, TCAN4X5X_CONFIG, -+ TCAN4X5X_SW_RESET); -+ if (ret) -+ return ret; -+ } -+ -+ usleep_range(700, 1000); -+ -+ return ret; -+} -+ - static int regmap_spi_gather_write(void *context, const void *reg, - size_t reg_len, const void *val, - size_t val_len) -@@ -341,6 +363,7 @@ static int tcan4x5x_init(struct m_can_classdev *cdev) - static int tcan4x5x_parse_config(struct m_can_classdev *cdev) - { - struct tcan4x5x_priv *tcan4x5x = cdev->device_data; -+ int ret; - - tcan4x5x->device_wake_gpio = devm_gpiod_get(cdev->dev, "device-wake", - GPIOD_OUT_HIGH); -@@ -354,7 +377,9 @@ static int tcan4x5x_parse_config(struct m_can_classdev *cdev) - if (IS_ERR(tcan4x5x->reset_gpio)) - tcan4x5x->reset_gpio = NULL; - -- usleep_range(700, 1000); -+ ret = tcan4x5x_reset(tcan4x5x); -+ if (ret) -+ return ret; - - tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev, - "device-state", -diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c -index 97ab0dd25552..1a7710c399d7 100644 ---- a/drivers/net/ethernet/broadcom/b44.c -+++ b/drivers/net/ethernet/broadcom/b44.c -@@ -1519,8 +1519,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) - int ethaddr_bytes = ETH_ALEN; - - memset(ppattern + offset, 0xff, magicsync); -- for (j = 0; j < magicsync; j++) -- set_bit(len++, (unsigned long *) pmask); -+ for (j = 0; j < magicsync; j++) { -+ pmask[len >> 3] |= BIT(len & 7); -+ len++; -+ } - - for (j = 0; j < B44_MAX_PATTERNS; j++) { - if ((B44_PATTERN_SIZE - len) >= ETH_ALEN) -@@ -1532,7 +1534,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) - for (k = 0; k< ethaddr_bytes; k++) { - ppattern[offset + magicsync + - (j * ETH_ALEN) + k] = macaddr[k]; -- set_bit(len++, (unsigned long *) pmask); -+ pmask[len >> 3] |= BIT(len & 7); -+ len++; - } - } - return len - 1; -diff --git a/drivers/net/ethernet/google/gve/gve_rx.c b/drivers/net/ethernet/google/gve/gve_rx.c -index edec61dfc868..9f52e72ff641 100644 ---- a/drivers/net/ethernet/google/gve/gve_rx.c -+++ b/drivers/net/ethernet/google/gve/gve_rx.c -@@ -418,8 +418,6 @@ bool gve_clean_rx_done(struct gve_rx_ring *rx, int budget, - rx->cnt = cnt; - rx->fill_cnt += work_done; - -- /* restock desc ring slots */ -- dma_wmb(); /* Ensure descs are visible before ringing doorbell */ - gve_rx_write_doorbell(priv, rx); - return gve_rx_work_pending(rx); - } -diff --git a/drivers/net/ethernet/google/gve/gve_tx.c b/drivers/net/ethernet/google/gve/gve_tx.c -index f4889431f9b7..d0244feb0301 100644 ---- a/drivers/net/ethernet/google/gve/gve_tx.c -+++ b/drivers/net/ethernet/google/gve/gve_tx.c -@@ -487,10 +487,6 @@ netdev_tx_t gve_tx(struct sk_buff *skb, struct net_device *dev) - * may have added descriptors without ringing the doorbell. - */ - -- /* Ensure tx descs from a prior gve_tx are visible before -- * ringing doorbell. -- */ -- dma_wmb(); - gve_tx_put_doorbell(priv, tx->q_resources, tx->req); - return NETDEV_TX_BUSY; - } -@@ -505,8 +501,6 @@ netdev_tx_t gve_tx(struct sk_buff *skb, struct net_device *dev) - if (!netif_xmit_stopped(tx->netdev_txq) && netdev_xmit_more()) - return NETDEV_TX_OK; - -- /* Ensure tx descs are visible before ringing doorbell */ -- dma_wmb(); - gve_tx_put_doorbell(priv, tx->q_resources, tx->req); - return NETDEV_TX_OK; - } -diff --git a/drivers/net/ethernet/mellanox/mlxsw/minimal.c b/drivers/net/ethernet/mellanox/mlxsw/minimal.c -index 471b0ca6d69a..55dfba990e6e 100644 ---- a/drivers/net/ethernet/mellanox/mlxsw/minimal.c -+++ b/drivers/net/ethernet/mellanox/mlxsw/minimal.c -@@ -204,8 +204,8 @@ mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u8 local_port, u8 module) - - err_register_netdev: - mlxsw_m->ports[local_port] = NULL; -- free_netdev(dev); - err_dev_addr_get: -+ free_netdev(dev); - err_alloc_etherdev: - mlxsw_core_port_fini(mlxsw_m->core, local_port); - return err; -diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c -index 41ddd8fff2a7..8bd2912bf713 100644 ---- a/drivers/net/ethernet/socionext/netsec.c -+++ b/drivers/net/ethernet/socionext/netsec.c -@@ -928,7 +928,6 @@ static int netsec_process_rx(struct netsec_priv *priv, int budget) - struct netsec_rx_pkt_info rx_info; - enum dma_data_direction dma_dir; - struct bpf_prog *xdp_prog; -- struct sk_buff *skb = NULL; - u16 xdp_xmit = 0; - u32 xdp_act = 0; - int done = 0; -@@ -942,7 +941,8 @@ static int netsec_process_rx(struct netsec_priv *priv, int budget) - struct netsec_de *de = dring->vaddr + (DESC_SZ * idx); - struct netsec_desc *desc = &dring->desc[idx]; - struct page *page = virt_to_page(desc->addr); -- u32 xdp_result = XDP_PASS; -+ u32 xdp_result = NETSEC_XDP_PASS; -+ struct sk_buff *skb = NULL; - u16 pkt_len, desc_len; - dma_addr_t dma_handle; - struct xdp_buff xdp; -diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -index 1b3520d0e59e..06dd65c419c4 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -@@ -105,6 +105,7 @@ MODULE_PARM_DESC(chain_mode, "To use chain instead of ring mode"); - static irqreturn_t stmmac_interrupt(int irq, void *dev_id); - - #ifdef CONFIG_DEBUG_FS -+static const struct net_device_ops stmmac_netdev_ops; - static void stmmac_init_fs(struct net_device *dev); - static void stmmac_exit_fs(struct net_device *dev); - #endif -@@ -4175,6 +4176,34 @@ static int stmmac_dma_cap_show(struct seq_file *seq, void *v) - } - DEFINE_SHOW_ATTRIBUTE(stmmac_dma_cap); - -+/* Use network device events to rename debugfs file entries. -+ */ -+static int stmmac_device_event(struct notifier_block *unused, -+ unsigned long event, void *ptr) -+{ -+ struct net_device *dev = netdev_notifier_info_to_dev(ptr); -+ struct stmmac_priv *priv = netdev_priv(dev); -+ -+ if (dev->netdev_ops != &stmmac_netdev_ops) -+ goto done; -+ -+ switch (event) { -+ case NETDEV_CHANGENAME: -+ if (priv->dbgfs_dir) -+ priv->dbgfs_dir = debugfs_rename(stmmac_fs_dir, -+ priv->dbgfs_dir, -+ stmmac_fs_dir, -+ dev->name); -+ break; -+ } -+done: -+ return NOTIFY_DONE; -+} -+ -+static struct notifier_block stmmac_notifier = { -+ .notifier_call = stmmac_device_event, -+}; -+ - static void stmmac_init_fs(struct net_device *dev) - { - struct stmmac_priv *priv = netdev_priv(dev); -@@ -4189,12 +4218,15 @@ static void stmmac_init_fs(struct net_device *dev) - /* Entry to report the DMA HW features */ - debugfs_create_file("dma_cap", 0444, priv->dbgfs_dir, dev, - &stmmac_dma_cap_fops); -+ -+ register_netdevice_notifier(&stmmac_notifier); - } - - static void stmmac_exit_fs(struct net_device *dev) - { - struct stmmac_priv *priv = netdev_priv(dev); - -+ unregister_netdevice_notifier(&stmmac_notifier); - debugfs_remove_recursive(priv->dbgfs_dir); - } - #endif /* CONFIG_DEBUG_FS */ -diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c -index e2e679a01b65..77ccf3672ede 100644 ---- a/drivers/net/wan/sdla.c -+++ b/drivers/net/wan/sdla.c -@@ -708,7 +708,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, - - spin_lock_irqsave(&sdla_lock, flags); - SDLA_WINDOW(dev, addr); -- pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK)); -+ pbuf = (void *)(dev->mem_start + (addr & SDLA_ADDR_MASK)); - __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len); - SDLA_WINDOW(dev, addr); - pbuf->opp_flag = 1; -diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c -index fb649d85b8fc..dd0c32379375 100644 ---- a/drivers/net/wireless/ath/ath9k/hif_usb.c -+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c -@@ -1216,7 +1216,7 @@ err_fw: - static int send_eject_command(struct usb_interface *interface) - { - struct usb_device *udev = interface_to_usbdev(interface); -- struct usb_host_interface *iface_desc = &interface->altsetting[0]; -+ struct usb_host_interface *iface_desc = interface->cur_altsetting; - struct usb_endpoint_descriptor *endpoint; - unsigned char *cmd; - u8 bulk_out_ep; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -index 06f3c01f10b3..7cdfde9b3dea 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -@@ -1348,7 +1348,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) - goto fail; - } - -- desc = &intf->altsetting[0].desc; -+ desc = &intf->cur_altsetting->desc; - if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || - (desc->bInterfaceSubClass != 2) || - (desc->bInterfaceProtocol != 0xff)) { -@@ -1361,7 +1361,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) - - num_of_eps = desc->bNumEndpoints; - for (ep = 0; ep < num_of_eps; ep++) { -- endpoint = &intf->altsetting[0].endpoint[ep].desc; -+ endpoint = &intf->cur_altsetting->endpoint[ep].desc; - endpoint_num = usb_endpoint_num(endpoint); - if (!usb_endpoint_xfer_bulk(endpoint)) - continue; -diff --git a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c -index 40a8b941ad5c..8c79b963bcff 100644 ---- a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c -+++ b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c -@@ -1608,9 +1608,9 @@ static int ezusb_probe(struct usb_interface *interface, - /* set up the endpoint information */ - /* check out the endpoints */ - -- iface_desc = &interface->altsetting[0].desc; -+ iface_desc = &interface->cur_altsetting->desc; - for (i = 0; i < iface_desc->bNumEndpoints; ++i) { -- ep = &interface->altsetting[0].endpoint[i].desc; -+ ep = &interface->cur_altsetting->endpoint[i].desc; - - if (usb_endpoint_is_bulk_in(ep)) { - /* we found a bulk in endpoint */ -diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -index e7d96ac673b7..3499b211dad5 100644 ---- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -@@ -5915,7 +5915,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv, - u8 dir, xtype, num; - int ret = 0; - -- host_interface = &interface->altsetting[0]; -+ host_interface = interface->cur_altsetting; - interface_desc = &host_interface->desc; - endpoints = interface_desc->bNumEndpoints; - -diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c -index f84250bdb8cf..6f8d5f9a9f7e 100644 ---- a/drivers/net/wireless/rsi/rsi_91x_hal.c -+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c -@@ -622,6 +622,7 @@ static int bl_cmd(struct rsi_hw *adapter, u8 cmd, u8 exp_resp, char *str) - bl_start_cmd_timer(adapter, timeout); - status = bl_write_cmd(adapter, cmd, exp_resp, ®out_val); - if (status < 0) { -+ bl_stop_cmd_timer(adapter); - rsi_dbg(ERR_ZONE, - "%s: Command %s (%0x) writing failed..\n", - __func__, str, cmd); -@@ -737,10 +738,9 @@ static int ping_pong_write(struct rsi_hw *adapter, u8 cmd, u8 *addr, u32 size) - } - - status = bl_cmd(adapter, cmd_req, cmd_resp, str); -- if (status) { -- bl_stop_cmd_timer(adapter); -+ if (status) - return status; -- } -+ - return 0; - } - -@@ -828,10 +828,9 @@ static int auto_fw_upgrade(struct rsi_hw *adapter, u8 *flash_content, - - status = bl_cmd(adapter, EOF_REACHED, FW_LOADING_SUCCESSFUL, - "EOF_REACHED"); -- if (status) { -- bl_stop_cmd_timer(adapter); -+ if (status) - return status; -- } -+ - rsi_dbg(INFO_ZONE, "FW loading is done and FW is running..\n"); - return 0; - } -@@ -849,6 +848,7 @@ static int rsi_hal_prepare_fwload(struct rsi_hw *adapter) - ®out_val, - RSI_COMMON_REG_SIZE); - if (status < 0) { -+ bl_stop_cmd_timer(adapter); - rsi_dbg(ERR_ZONE, - "%s: REGOUT read failed\n", __func__); - return status; -diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c -index 23a1d00b5f38..d6cdabef264d 100644 ---- a/drivers/net/wireless/rsi/rsi_91x_usb.c -+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c -@@ -16,6 +16,7 @@ - */ - - #include -+#include - #include - #include "rsi_usb.h" - #include "rsi_hal.h" -@@ -29,7 +30,7 @@ MODULE_PARM_DESC(dev_oper_mode, - "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n" - "6[AP + BT classic], 14[AP + BT classic + BT LE]"); - --static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num); -+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t flags); - - /** - * rsi_usb_card_write() - This function writes to the USB Card. -@@ -117,7 +118,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface, - __le16 buffer_size; - int ii, bin_found = 0, bout_found = 0; - -- iface_desc = &(interface->altsetting[0]); -+ iface_desc = interface->cur_altsetting; - - for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) { - endpoint = &(iface_desc->endpoint[ii].desc); -@@ -285,20 +286,29 @@ static void rsi_rx_done_handler(struct urb *urb) - status = 0; - - out: -- if (rsi_rx_urb_submit(dev->priv, rx_cb->ep_num)) -+ if (rsi_rx_urb_submit(dev->priv, rx_cb->ep_num, GFP_ATOMIC)) - rsi_dbg(ERR_ZONE, "%s: Failed in urb submission", __func__); - - if (status) - dev_kfree_skb(rx_cb->rx_skb); - } - -+static void rsi_rx_urb_kill(struct rsi_hw *adapter, u8 ep_num) -+{ -+ struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; -+ struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1]; -+ struct urb *urb = rx_cb->rx_urb; -+ -+ usb_kill_urb(urb); -+} -+ - /** - * rsi_rx_urb_submit() - This function submits the given URB to the USB stack. - * @adapter: Pointer to the adapter structure. - * - * Return: 0 on success, a negative error code on failure. - */ --static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num) -+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t mem_flags) - { - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; - struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1]; -@@ -328,9 +338,11 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num) - rsi_rx_done_handler, - rx_cb); - -- status = usb_submit_urb(urb, GFP_KERNEL); -- if (status) -+ status = usb_submit_urb(urb, mem_flags); -+ if (status) { - rsi_dbg(ERR_ZONE, "%s: Failed in urb submission\n", __func__); -+ dev_kfree_skb(skb); -+ } - - return status; - } -@@ -816,17 +828,20 @@ static int rsi_probe(struct usb_interface *pfunction, - rsi_dbg(INIT_ZONE, "%s: Device Init Done\n", __func__); - } - -- status = rsi_rx_urb_submit(adapter, WLAN_EP); -+ status = rsi_rx_urb_submit(adapter, WLAN_EP, GFP_KERNEL); - if (status) - goto err1; - - if (adapter->priv->coex_mode > 1) { -- status = rsi_rx_urb_submit(adapter, BT_EP); -+ status = rsi_rx_urb_submit(adapter, BT_EP, GFP_KERNEL); - if (status) -- goto err1; -+ goto err_kill_wlan_urb; - } - - return 0; -+ -+err_kill_wlan_urb: -+ rsi_rx_urb_kill(adapter, WLAN_EP); - err1: - rsi_deinit_usb_interface(adapter); - err: -@@ -857,6 +872,10 @@ static void rsi_disconnect(struct usb_interface *pfunction) - adapter->priv->bt_adapter = NULL; - } - -+ if (adapter->priv->coex_mode > 1) -+ rsi_rx_urb_kill(adapter, BT_EP); -+ rsi_rx_urb_kill(adapter, WLAN_EP); -+ - rsi_reset_card(adapter); - rsi_deinit_usb_interface(adapter); - rsi_91x_deinit(adapter); -diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c -index 7b5c2fe5bd4d..8ff0374126e4 100644 ---- a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c -+++ b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c -@@ -1263,7 +1263,7 @@ static void print_id(struct usb_device *udev) - static int eject_installer(struct usb_interface *intf) - { - struct usb_device *udev = interface_to_usbdev(intf); -- struct usb_host_interface *iface_desc = &intf->altsetting[0]; -+ struct usb_host_interface *iface_desc = intf->cur_altsetting; - struct usb_endpoint_descriptor *endpoint; - unsigned char *cmd; - u8 bulk_out_ep; -diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c -index 1593b8494ebb..2f88b1ff7ada 100644 ---- a/drivers/pci/quirks.c -+++ b/drivers/pci/quirks.c -@@ -4080,6 +4080,40 @@ static void quirk_mic_x200_dma_alias(struct pci_dev *pdev) - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2260, quirk_mic_x200_dma_alias); - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2264, quirk_mic_x200_dma_alias); - -+/* -+ * Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices -+ * exposing computational units via Non Transparent Bridges (NTB, PEX 87xx). -+ * -+ * Similarly to MIC x200, we need to add DMA aliases to allow buffer access -+ * when IOMMU is enabled. These aliases allow computational unit access to -+ * host memory. These aliases mark the whole VCA device as one IOMMU -+ * group. -+ * -+ * All possible slot numbers (0x20) are used, since we are unable to tell -+ * what slot is used on other side. This quirk is intended for both host -+ * and computational unit sides. The VCA devices have up to five functions -+ * (four for DMA channels and one additional). -+ */ -+static void quirk_pex_vca_alias(struct pci_dev *pdev) -+{ -+ const unsigned int num_pci_slots = 0x20; -+ unsigned int slot; -+ -+ for (slot = 0; slot < num_pci_slots; slot++) { -+ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x0)); -+ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x1)); -+ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x2)); -+ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x3)); -+ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x4)); -+ } -+} -+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2954, quirk_pex_vca_alias); -+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2955, quirk_pex_vca_alias); -+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2956, quirk_pex_vca_alias); -+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2958, quirk_pex_vca_alias); -+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2959, quirk_pex_vca_alias); -+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x295A, quirk_pex_vca_alias); -+ - /* - * The IOMMU and interrupt controller on Broadcom Vulcan/Cavium ThunderX2 are - * associated not at the root bus, but at a bridge below. This quirk avoids -diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c -index ce7345745b42..2a3966d059e7 100644 ---- a/drivers/perf/fsl_imx8_ddr_perf.c -+++ b/drivers/perf/fsl_imx8_ddr_perf.c -@@ -45,7 +45,8 @@ - static DEFINE_IDA(ddr_ida); - - /* DDR Perf hardware feature */ --#define DDR_CAP_AXI_ID_FILTER 0x1 /* support AXI ID filter */ -+#define DDR_CAP_AXI_ID_FILTER 0x1 /* support AXI ID filter */ -+#define DDR_CAP_AXI_ID_FILTER_ENHANCED 0x3 /* support enhanced AXI ID filter */ - - struct fsl_ddr_devtype_data { - unsigned int quirks; /* quirks needed for different DDR Perf core */ -@@ -178,6 +179,36 @@ static const struct attribute_group *attr_groups[] = { - NULL, - }; - -+static bool ddr_perf_is_filtered(struct perf_event *event) -+{ -+ return event->attr.config == 0x41 || event->attr.config == 0x42; -+} -+ -+static u32 ddr_perf_filter_val(struct perf_event *event) -+{ -+ return event->attr.config1; -+} -+ -+static bool ddr_perf_filters_compatible(struct perf_event *a, -+ struct perf_event *b) -+{ -+ if (!ddr_perf_is_filtered(a)) -+ return true; -+ if (!ddr_perf_is_filtered(b)) -+ return true; -+ return ddr_perf_filter_val(a) == ddr_perf_filter_val(b); -+} -+ -+static bool ddr_perf_is_enhanced_filtered(struct perf_event *event) -+{ -+ unsigned int filt; -+ struct ddr_pmu *pmu = to_ddr_pmu(event->pmu); -+ -+ filt = pmu->devtype_data->quirks & DDR_CAP_AXI_ID_FILTER_ENHANCED; -+ return (filt == DDR_CAP_AXI_ID_FILTER_ENHANCED) && -+ ddr_perf_is_filtered(event); -+} -+ - static u32 ddr_perf_alloc_counter(struct ddr_pmu *pmu, int event) - { - int i; -@@ -209,27 +240,17 @@ static void ddr_perf_free_counter(struct ddr_pmu *pmu, int counter) - - static u32 ddr_perf_read_counter(struct ddr_pmu *pmu, int counter) - { -- return readl_relaxed(pmu->base + COUNTER_READ + counter * 4); --} -- --static bool ddr_perf_is_filtered(struct perf_event *event) --{ -- return event->attr.config == 0x41 || event->attr.config == 0x42; --} -+ struct perf_event *event = pmu->events[counter]; -+ void __iomem *base = pmu->base; - --static u32 ddr_perf_filter_val(struct perf_event *event) --{ -- return event->attr.config1; --} -- --static bool ddr_perf_filters_compatible(struct perf_event *a, -- struct perf_event *b) --{ -- if (!ddr_perf_is_filtered(a)) -- return true; -- if (!ddr_perf_is_filtered(b)) -- return true; -- return ddr_perf_filter_val(a) == ddr_perf_filter_val(b); -+ /* -+ * return bytes instead of bursts from ddr transaction for -+ * axid-read and axid-write event if PMU core supports enhanced -+ * filter. -+ */ -+ base += ddr_perf_is_enhanced_filtered(event) ? COUNTER_DPCR1 : -+ COUNTER_READ; -+ return readl_relaxed(base + counter * 4); - } - - static int ddr_perf_event_init(struct perf_event *event) -diff --git a/drivers/phy/motorola/phy-cpcap-usb.c b/drivers/phy/motorola/phy-cpcap-usb.c -index 9a38741d3546..5baf64dfb24d 100644 ---- a/drivers/phy/motorola/phy-cpcap-usb.c -+++ b/drivers/phy/motorola/phy-cpcap-usb.c -@@ -115,7 +115,7 @@ struct cpcap_usb_ints_state { - enum cpcap_gpio_mode { - CPCAP_DM_DP, - CPCAP_MDM_RX_TX, -- CPCAP_UNKNOWN, -+ CPCAP_UNKNOWN_DISABLED, /* Seems to disable USB lines */ - CPCAP_OTG_DM_DP, - }; - -@@ -381,7 +381,8 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) - { - int error; - -- error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); -+ /* Disable lines to prevent glitches from waking up mdm6600 */ -+ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); - if (error) - goto out_err; - -@@ -408,6 +409,11 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) - if (error) - goto out_err; - -+ /* Enable UART mode */ -+ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); -+ if (error) -+ goto out_err; -+ - return 0; - - out_err: -@@ -420,7 +426,8 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) - { - int error; - -- error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); -+ /* Disable lines to prevent glitches from waking up mdm6600 */ -+ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); - if (error) - return error; - -@@ -460,6 +467,11 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) - if (error) - goto out_err; - -+ /* Enable USB mode */ -+ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); -+ if (error) -+ goto out_err; -+ - return 0; - - out_err: -diff --git a/drivers/phy/qualcomm/phy-qcom-qmp.c b/drivers/phy/qualcomm/phy-qcom-qmp.c -index 39e8deb8001e..27dd20a7fe13 100644 ---- a/drivers/phy/qualcomm/phy-qcom-qmp.c -+++ b/drivers/phy/qualcomm/phy-qcom-qmp.c -@@ -66,7 +66,7 @@ - /* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */ - #define CLAMP_EN BIT(0) /* enables i/o clamp_n */ - --#define PHY_INIT_COMPLETE_TIMEOUT 1000 -+#define PHY_INIT_COMPLETE_TIMEOUT 10000 - #define POWER_DOWN_DELAY_US_MIN 10 - #define POWER_DOWN_DELAY_US_MAX 11 - -diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c -index d27be2836bc2..74e988f839e8 100644 ---- a/drivers/platform/x86/dell-laptop.c -+++ b/drivers/platform/x86/dell-laptop.c -@@ -33,6 +33,7 @@ - - struct quirk_entry { - bool touchpad_led; -+ bool kbd_led_not_present; - bool kbd_led_levels_off_1; - bool kbd_missing_ac_tag; - -@@ -73,6 +74,10 @@ static struct quirk_entry quirk_dell_latitude_e6410 = { - .kbd_led_levels_off_1 = true, - }; - -+static struct quirk_entry quirk_dell_inspiron_1012 = { -+ .kbd_led_not_present = true, -+}; -+ - static struct platform_driver platform_driver = { - .driver = { - .name = "dell-laptop", -@@ -310,6 +315,24 @@ static const struct dmi_system_id dell_quirks[] __initconst = { - }, - .driver_data = &quirk_dell_latitude_e6410, - }, -+ { -+ .callback = dmi_matched, -+ .ident = "Dell Inspiron 1012", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"), -+ }, -+ .driver_data = &quirk_dell_inspiron_1012, -+ }, -+ { -+ .callback = dmi_matched, -+ .ident = "Dell Inspiron 1018", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1018"), -+ }, -+ .driver_data = &quirk_dell_inspiron_1012, -+ }, - { } - }; - -@@ -1493,6 +1516,9 @@ static void kbd_init(void) - { - int ret; - -+ if (quirks && quirks->kbd_led_not_present) -+ return; -+ - ret = kbd_init_info(); - kbd_init_tokens(); - -diff --git a/drivers/power/supply/ingenic-battery.c b/drivers/power/supply/ingenic-battery.c -index 35816d4b3012..2748715c4c75 100644 ---- a/drivers/power/supply/ingenic-battery.c -+++ b/drivers/power/supply/ingenic-battery.c -@@ -100,10 +100,17 @@ static int ingenic_battery_set_scale(struct ingenic_battery *bat) - return -EINVAL; - } - -- return iio_write_channel_attribute(bat->channel, -- scale_raw[best_idx], -- scale_raw[best_idx + 1], -- IIO_CHAN_INFO_SCALE); -+ /* Only set scale if there is more than one (fractional) entry */ -+ if (scale_len > 2) { -+ ret = iio_write_channel_attribute(bat->channel, -+ scale_raw[best_idx], -+ scale_raw[best_idx + 1], -+ IIO_CHAN_INFO_SCALE); -+ if (ret) -+ return ret; -+ } -+ -+ return 0; - } - - static enum power_supply_property ingenic_battery_properties[] = { -diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c -index 45972056ed8c..11cac7e10663 100644 ---- a/drivers/spi/spi-dw.c -+++ b/drivers/spi/spi-dw.c -@@ -172,9 +172,11 @@ static inline u32 rx_max(struct dw_spi *dws) - - static void dw_writer(struct dw_spi *dws) - { -- u32 max = tx_max(dws); -+ u32 max; - u16 txw = 0; - -+ spin_lock(&dws->buf_lock); -+ max = tx_max(dws); - while (max--) { - /* Set the tx word if the transfer's original "tx" is not null */ - if (dws->tx_end - dws->len) { -@@ -186,13 +188,16 @@ static void dw_writer(struct dw_spi *dws) - dw_write_io_reg(dws, DW_SPI_DR, txw); - dws->tx += dws->n_bytes; - } -+ spin_unlock(&dws->buf_lock); - } - - static void dw_reader(struct dw_spi *dws) - { -- u32 max = rx_max(dws); -+ u32 max; - u16 rxw; - -+ spin_lock(&dws->buf_lock); -+ max = rx_max(dws); - while (max--) { - rxw = dw_read_io_reg(dws, DW_SPI_DR); - /* Care rx only if the transfer's original "rx" is not null */ -@@ -204,6 +209,7 @@ static void dw_reader(struct dw_spi *dws) - } - dws->rx += dws->n_bytes; - } -+ spin_unlock(&dws->buf_lock); - } - - static void int_error_stop(struct dw_spi *dws, const char *msg) -@@ -276,18 +282,20 @@ static int dw_spi_transfer_one(struct spi_controller *master, - { - struct dw_spi *dws = spi_controller_get_devdata(master); - struct chip_data *chip = spi_get_ctldata(spi); -+ unsigned long flags; - u8 imask = 0; - u16 txlevel = 0; - u32 cr0; - int ret; - - dws->dma_mapped = 0; -- -+ spin_lock_irqsave(&dws->buf_lock, flags); - dws->tx = (void *)transfer->tx_buf; - dws->tx_end = dws->tx + transfer->len; - dws->rx = transfer->rx_buf; - dws->rx_end = dws->rx + transfer->len; - dws->len = transfer->len; -+ spin_unlock_irqrestore(&dws->buf_lock, flags); - - spi_enable_chip(dws, 0); - -@@ -471,6 +479,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) - dws->type = SSI_MOTO_SPI; - dws->dma_inited = 0; - dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR); -+ spin_lock_init(&dws->buf_lock); - - spi_controller_set_devdata(master, dws); - -diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h -index c9c15881e982..f3a2f157a2b1 100644 ---- a/drivers/spi/spi-dw.h -+++ b/drivers/spi/spi-dw.h -@@ -120,6 +120,7 @@ struct dw_spi { - size_t len; - void *tx; - void *tx_end; -+ spinlock_t buf_lock; - void *rx; - void *rx_end; - int dma_mapped; -diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c -index 9f92165fe09f..2fd843b18297 100644 ---- a/drivers/spi/spi-pxa2xx.c -+++ b/drivers/spi/spi-pxa2xx.c -@@ -1461,6 +1461,10 @@ static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = { - { PCI_VDEVICE(INTEL, 0x02aa), LPSS_CNL_SSP }, - { PCI_VDEVICE(INTEL, 0x02ab), LPSS_CNL_SSP }, - { PCI_VDEVICE(INTEL, 0x02fb), LPSS_CNL_SSP }, -+ /* CML-H */ -+ { PCI_VDEVICE(INTEL, 0x06aa), LPSS_CNL_SSP }, -+ { PCI_VDEVICE(INTEL, 0x06ab), LPSS_CNL_SSP }, -+ { PCI_VDEVICE(INTEL, 0x06fb), LPSS_CNL_SSP }, - /* TGL-LP */ - { PCI_VDEVICE(INTEL, 0xa0aa), LPSS_CNL_SSP }, - { PCI_VDEVICE(INTEL, 0xa0ab), LPSS_CNL_SSP }, -diff --git a/drivers/staging/most/net/net.c b/drivers/staging/most/net/net.c -index 26a31854c636..c48956f0ef29 100644 ---- a/drivers/staging/most/net/net.c -+++ b/drivers/staging/most/net/net.c -@@ -81,6 +81,11 @@ static int skb_to_mamac(const struct sk_buff *skb, struct mbo *mbo) - unsigned int payload_len = skb->len - ETH_HLEN; - unsigned int mdp_len = payload_len + MDP_HDR_LEN; - -+ if (mdp_len < skb->len) { -+ pr_err("drop: too large packet! (%u)\n", skb->len); -+ return -EINVAL; -+ } -+ - if (mbo->buffer_length < mdp_len) { - pr_err("drop: too small buffer! (%d for %d)\n", - mbo->buffer_length, mdp_len); -@@ -128,6 +133,11 @@ static int skb_to_mep(const struct sk_buff *skb, struct mbo *mbo) - u8 *buff = mbo->virt_address; - unsigned int mep_len = skb->len + MEP_HDR_LEN; - -+ if (mep_len < skb->len) { -+ pr_err("drop: too large packet! (%u)\n", skb->len); -+ return -EINVAL; -+ } -+ - if (mbo->buffer_length < mep_len) { - pr_err("drop: too small buffer! (%d for %d)\n", - mbo->buffer_length, mep_len); -diff --git a/drivers/staging/mt7621-pci/pci-mt7621.c b/drivers/staging/mt7621-pci/pci-mt7621.c -index 6b98827da57f..3633c924848e 100644 ---- a/drivers/staging/mt7621-pci/pci-mt7621.c -+++ b/drivers/staging/mt7621-pci/pci-mt7621.c -@@ -29,15 +29,14 @@ - #include - #include - #include -+#include - #include - #include - - #include "../../pci/pci.h" - - /* sysctl */ --#define MT7621_CHIP_REV_ID 0x0c - #define MT7621_GPIO_MODE 0x60 --#define CHIP_REV_MT7621_E2 0x0101 - - /* MediaTek specific configuration registers */ - #define PCIE_FTS_NUM 0x70c -@@ -126,6 +125,8 @@ struct mt7621_pcie_port { - * @ports: pointer to PCIe port information - * @perst: gpio reset - * @rst: pointer to pcie reset -+ * @resets_inverted: depends on chip revision -+ * reset lines are inverted. - */ - struct mt7621_pcie { - void __iomem *base; -@@ -140,6 +141,7 @@ struct mt7621_pcie { - struct list_head ports; - struct gpio_desc *perst; - struct reset_control *rst; -+ bool resets_inverted; - }; - - static inline u32 pcie_read(struct mt7621_pcie *pcie, u32 reg) -@@ -229,9 +231,9 @@ static inline void mt7621_pcie_port_clk_disable(struct mt7621_pcie_port *port) - - static inline void mt7621_control_assert(struct mt7621_pcie_port *port) - { -- u32 chip_rev_id = rt_sysc_r32(MT7621_CHIP_REV_ID); -+ struct mt7621_pcie *pcie = port->pcie; - -- if ((chip_rev_id & 0xFFFF) == CHIP_REV_MT7621_E2) -+ if (pcie->resets_inverted) - reset_control_assert(port->pcie_rst); - else - reset_control_deassert(port->pcie_rst); -@@ -239,9 +241,9 @@ static inline void mt7621_control_assert(struct mt7621_pcie_port *port) - - static inline void mt7621_control_deassert(struct mt7621_pcie_port *port) - { -- u32 chip_rev_id = rt_sysc_r32(MT7621_CHIP_REV_ID); -+ struct mt7621_pcie *pcie = port->pcie; - -- if ((chip_rev_id & 0xFFFF) == CHIP_REV_MT7621_E2) -+ if (pcie->resets_inverted) - reset_control_deassert(port->pcie_rst); - else - reset_control_assert(port->pcie_rst); -@@ -641,9 +643,14 @@ static int mt7621_pcie_register_host(struct pci_host_bridge *host, - return pci_host_probe(host); - } - -+static const struct soc_device_attribute mt7621_pci_quirks_match[] = { -+ { .soc_id = "mt7621", .revision = "E2" } -+}; -+ - static int mt7621_pci_probe(struct platform_device *pdev) - { - struct device *dev = &pdev->dev; -+ const struct soc_device_attribute *attr; - struct mt7621_pcie *pcie; - struct pci_host_bridge *bridge; - int err; -@@ -661,6 +668,10 @@ static int mt7621_pci_probe(struct platform_device *pdev) - platform_set_drvdata(pdev, pcie); - INIT_LIST_HEAD(&pcie->ports); - -+ attr = soc_device_match(mt7621_pci_quirks_match); -+ if (attr) -+ pcie->resets_inverted = true; -+ - err = mt7621_pcie_parse_dt(pcie); - if (err) { - dev_err(dev, "Parsing DT failed\n"); -diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h -index 50e1c8918040..e2fabe818b19 100644 ---- a/drivers/staging/vt6656/device.h -+++ b/drivers/staging/vt6656/device.h -@@ -52,6 +52,8 @@ - #define RATE_AUTO 12 - - #define MAX_RATE 12 -+#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ -+ BIT(RATE_5M) | BIT(RATE_11M)) - - /* - * device specific -diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c -index f40947955675..af215860be4c 100644 ---- a/drivers/staging/vt6656/int.c -+++ b/drivers/staging/vt6656/int.c -@@ -99,9 +99,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) - - info->status.rates[0].count = tx_retry; - -- if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) { -+ if (!(tsr & TSR_TMO)) { - info->status.rates[0].idx = idx; -- info->flags |= IEEE80211_TX_STAT_ACK; -+ -+ if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) -+ info->flags |= IEEE80211_TX_STAT_ACK; - } - - ieee80211_tx_status_irqsafe(priv->hw, context->skb); -diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c -index c26882e2bb80..69a48383611f 100644 ---- a/drivers/staging/vt6656/main_usb.c -+++ b/drivers/staging/vt6656/main_usb.c -@@ -1016,6 +1016,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) - ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); - ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); - ieee80211_hw_set(priv->hw, SUPPORTS_PS); -+ ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK); - - priv->hw->max_signal = 100; - -diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c -index 4e9cfacf75f2..ab6141f361af 100644 ---- a/drivers/staging/vt6656/rxtx.c -+++ b/drivers/staging/vt6656/rxtx.c -@@ -278,11 +278,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context, - PK_TYPE_11B, &buf->b); - - /* Get Duration and TimeStamp */ -- if (ieee80211_is_pspoll(hdr->frame_control)) { -- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); -- -- buf->duration_a = dur; -- buf->duration_b = dur; -+ if (ieee80211_is_nullfunc(hdr->frame_control)) { -+ buf->duration_a = hdr->duration_id; -+ buf->duration_b = hdr->duration_id; - } else { - buf->duration_a = vnt_get_duration_le(priv, - tx_context->pkt_type, need_ack); -@@ -371,10 +369,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context, - tx_context->pkt_type, &buf->ab); - - /* Get Duration and TimeStampOff */ -- if (ieee80211_is_pspoll(hdr->frame_control)) { -- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); -- -- buf->duration = dur; -+ if (ieee80211_is_nullfunc(hdr->frame_control)) { -+ buf->duration = hdr->duration_id; - } else { - buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type, - need_ack); -@@ -815,10 +811,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) - if (info->band == NL80211_BAND_5GHZ) { - pkt_type = PK_TYPE_11A; - } else { -- if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) -- pkt_type = PK_TYPE_11GB; -- else -- pkt_type = PK_TYPE_11GA; -+ if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { -+ if (priv->basic_rates & VNT_B_RATES) -+ pkt_type = PK_TYPE_11GB; -+ else -+ pkt_type = PK_TYPE_11GA; -+ } else { -+ pkt_type = PK_TYPE_11A; -+ } - } - } else { - pkt_type = PK_TYPE_11B; -diff --git a/drivers/staging/wlan-ng/prism2mgmt.c b/drivers/staging/wlan-ng/prism2mgmt.c -index 7350fe5d96a3..a8860d2aee68 100644 ---- a/drivers/staging/wlan-ng/prism2mgmt.c -+++ b/drivers/staging/wlan-ng/prism2mgmt.c -@@ -959,7 +959,7 @@ int prism2mgmt_flashdl_state(struct wlandevice *wlandev, void *msgp) - } - } - -- return 0; -+ return result; - } - - /*---------------------------------------------------------------- -diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c b/drivers/tty/serial/8250/8250_bcm2835aux.c -index 8ce700c1a7fc..4997c519ebb3 100644 ---- a/drivers/tty/serial/8250/8250_bcm2835aux.c -+++ b/drivers/tty/serial/8250/8250_bcm2835aux.c -@@ -113,7 +113,7 @@ static int bcm2835aux_serial_remove(struct platform_device *pdev) - { - struct bcm2835aux_data *data = platform_get_drvdata(pdev); - -- serial8250_unregister_port(data->uart.port.line); -+ serial8250_unregister_port(data->line); - clk_disable_unprepare(data->clk); - - return 0; -diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c -index 34f602c3a882..9d8c660dc289 100644 ---- a/drivers/tty/serial/imx.c -+++ b/drivers/tty/serial/imx.c -@@ -700,22 +700,33 @@ static void imx_uart_start_tx(struct uart_port *port) - } - } - --static irqreturn_t imx_uart_rtsint(int irq, void *dev_id) -+static irqreturn_t __imx_uart_rtsint(int irq, void *dev_id) - { - struct imx_port *sport = dev_id; - u32 usr1; - -- spin_lock(&sport->port.lock); -- - imx_uart_writel(sport, USR1_RTSD, USR1); - usr1 = imx_uart_readl(sport, USR1) & USR1_RTSS; - uart_handle_cts_change(&sport->port, !!usr1); - wake_up_interruptible(&sport->port.state->port.delta_msr_wait); - -- spin_unlock(&sport->port.lock); - return IRQ_HANDLED; - } - -+static irqreturn_t imx_uart_rtsint(int irq, void *dev_id) -+{ -+ struct imx_port *sport = dev_id; -+ irqreturn_t ret; -+ -+ spin_lock(&sport->port.lock); -+ -+ ret = __imx_uart_rtsint(irq, dev_id); -+ -+ spin_unlock(&sport->port.lock); -+ -+ return ret; -+} -+ - static irqreturn_t imx_uart_txint(int irq, void *dev_id) - { - struct imx_port *sport = dev_id; -@@ -726,14 +737,12 @@ static irqreturn_t imx_uart_txint(int irq, void *dev_id) - return IRQ_HANDLED; - } - --static irqreturn_t imx_uart_rxint(int irq, void *dev_id) -+static irqreturn_t __imx_uart_rxint(int irq, void *dev_id) - { - struct imx_port *sport = dev_id; - unsigned int rx, flg, ignored = 0; - struct tty_port *port = &sport->port.state->port; - -- spin_lock(&sport->port.lock); -- - while (imx_uart_readl(sport, USR2) & USR2_RDR) { - u32 usr2; - -@@ -792,11 +801,25 @@ static irqreturn_t imx_uart_rxint(int irq, void *dev_id) - } - - out: -- spin_unlock(&sport->port.lock); - tty_flip_buffer_push(port); -+ - return IRQ_HANDLED; - } - -+static irqreturn_t imx_uart_rxint(int irq, void *dev_id) -+{ -+ struct imx_port *sport = dev_id; -+ irqreturn_t ret; -+ -+ spin_lock(&sport->port.lock); -+ -+ ret = __imx_uart_rxint(irq, dev_id); -+ -+ spin_unlock(&sport->port.lock); -+ -+ return ret; -+} -+ - static void imx_uart_clear_rx_errors(struct imx_port *sport); - - /* -@@ -855,6 +878,8 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) - unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4; - irqreturn_t ret = IRQ_NONE; - -+ spin_lock(&sport->port.lock); -+ - usr1 = imx_uart_readl(sport, USR1); - usr2 = imx_uart_readl(sport, USR2); - ucr1 = imx_uart_readl(sport, UCR1); -@@ -888,27 +913,25 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) - usr2 &= ~USR2_ORE; - - if (usr1 & (USR1_RRDY | USR1_AGTIM)) { -- imx_uart_rxint(irq, dev_id); -+ __imx_uart_rxint(irq, dev_id); - ret = IRQ_HANDLED; - } - - if ((usr1 & USR1_TRDY) || (usr2 & USR2_TXDC)) { -- imx_uart_txint(irq, dev_id); -+ imx_uart_transmit_buffer(sport); - ret = IRQ_HANDLED; - } - - if (usr1 & USR1_DTRD) { - imx_uart_writel(sport, USR1_DTRD, USR1); - -- spin_lock(&sport->port.lock); - imx_uart_mctrl_check(sport); -- spin_unlock(&sport->port.lock); - - ret = IRQ_HANDLED; - } - - if (usr1 & USR1_RTSD) { -- imx_uart_rtsint(irq, dev_id); -+ __imx_uart_rtsint(irq, dev_id); - ret = IRQ_HANDLED; - } - -@@ -923,6 +946,8 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) - ret = IRQ_HANDLED; - } - -+ spin_unlock(&sport->port.lock); -+ - return ret; - } - -diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c -index 97d6ae3c4df2..cede7a8e3605 100644 ---- a/drivers/usb/dwc3/core.c -+++ b/drivers/usb/dwc3/core.c -@@ -1209,6 +1209,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) - /* do nothing */ - break; - } -+ -+ /* de-assert DRVVBUS for HOST and OTG mode */ -+ dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE); - } - - static void dwc3_get_properties(struct dwc3 *dwc) -diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c -index 294276f7deb9..7051611229c9 100644 ---- a/drivers/usb/dwc3/dwc3-pci.c -+++ b/drivers/usb/dwc3/dwc3-pci.c -@@ -34,6 +34,7 @@ - #define PCI_DEVICE_ID_INTEL_GLK 0x31aa - #define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee - #define PCI_DEVICE_ID_INTEL_CNPH 0xa36e -+#define PCI_DEVICE_ID_INTEL_CNPV 0xa3b0 - #define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee - #define PCI_DEVICE_ID_INTEL_EHLLP 0x4b7e - #define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee -@@ -342,6 +343,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = { - { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPH), - (kernel_ulong_t) &dwc3_pci_intel_properties, }, - -+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPV), -+ (kernel_ulong_t) &dwc3_pci_intel_properties, }, -+ - { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICLLP), - (kernel_ulong_t) &dwc3_pci_intel_properties, }, - -diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c -index dc172513a4aa..b8e24ccba9f3 100644 ---- a/drivers/usb/host/xhci-tegra.c -+++ b/drivers/usb/host/xhci-tegra.c -@@ -1413,6 +1413,7 @@ MODULE_FIRMWARE("nvidia/tegra210/xusb.bin"); - - static const char * const tegra186_supply_names[] = { - }; -+MODULE_FIRMWARE("nvidia/tegra186/xusb.bin"); - - static const struct tegra_xusb_phy_type tegra186_phy_types[] = { - { .name = "usb3", .num = 3, }, -diff --git a/drivers/usb/musb/jz4740.c b/drivers/usb/musb/jz4740.c -index 5261f8dfedec..e3b8c84ccdb8 100644 ---- a/drivers/usb/musb/jz4740.c -+++ b/drivers/usb/musb/jz4740.c -@@ -75,14 +75,17 @@ static struct musb_hdrc_platform_data jz4740_musb_platform_data = { - static int jz4740_musb_init(struct musb *musb) - { - struct device *dev = musb->controller->parent; -+ int err; - - if (dev->of_node) - musb->xceiv = devm_usb_get_phy_by_phandle(dev, "phys", 0); - else - musb->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); - if (IS_ERR(musb->xceiv)) { -- dev_err(dev, "No transceiver configured\n"); -- return PTR_ERR(musb->xceiv); -+ err = PTR_ERR(musb->xceiv); -+ if (err != -EPROBE_DEFER) -+ dev_err(dev, "No transceiver configured: %d", err); -+ return err; - } - - /* Silicon does not implement ConfigData register. -diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c -index 302eb9530859..627bea7e6cfb 100644 ---- a/drivers/usb/serial/ir-usb.c -+++ b/drivers/usb/serial/ir-usb.c -@@ -45,9 +45,10 @@ static int buffer_size; - static int xbof = -1; - - static int ir_startup (struct usb_serial *serial); --static int ir_open(struct tty_struct *tty, struct usb_serial_port *port); --static int ir_prepare_write_buffer(struct usb_serial_port *port, -- void *dest, size_t size); -+static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, -+ const unsigned char *buf, int count); -+static int ir_write_room(struct tty_struct *tty); -+static void ir_write_bulk_callback(struct urb *urb); - static void ir_process_read_urb(struct urb *urb); - static void ir_set_termios(struct tty_struct *tty, - struct usb_serial_port *port, struct ktermios *old_termios); -@@ -77,8 +78,9 @@ static struct usb_serial_driver ir_device = { - .num_ports = 1, - .set_termios = ir_set_termios, - .attach = ir_startup, -- .open = ir_open, -- .prepare_write_buffer = ir_prepare_write_buffer, -+ .write = ir_write, -+ .write_room = ir_write_room, -+ .write_bulk_callback = ir_write_bulk_callback, - .process_read_urb = ir_process_read_urb, - }; - -@@ -195,6 +197,9 @@ static int ir_startup(struct usb_serial *serial) - struct usb_irda_cs_descriptor *irda_desc; - int rates; - -+ if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1) -+ return -ENODEV; -+ - irda_desc = irda_usb_find_class_desc(serial, 0); - if (!irda_desc) { - dev_err(&serial->dev->dev, -@@ -251,35 +256,102 @@ static int ir_startup(struct usb_serial *serial) - return 0; - } - --static int ir_open(struct tty_struct *tty, struct usb_serial_port *port) -+static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, -+ const unsigned char *buf, int count) - { -- int i; -+ struct urb *urb = NULL; -+ unsigned long flags; -+ int ret; - -- for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) -- port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET; -+ if (port->bulk_out_size == 0) -+ return -EINVAL; - -- /* Start reading from the device */ -- return usb_serial_generic_open(tty, port); --} -+ if (count == 0) -+ return 0; - --static int ir_prepare_write_buffer(struct usb_serial_port *port, -- void *dest, size_t size) --{ -- unsigned char *buf = dest; -- int count; -+ count = min(count, port->bulk_out_size - 1); -+ -+ spin_lock_irqsave(&port->lock, flags); -+ if (__test_and_clear_bit(0, &port->write_urbs_free)) { -+ urb = port->write_urbs[0]; -+ port->tx_bytes += count; -+ } -+ spin_unlock_irqrestore(&port->lock, flags); -+ -+ if (!urb) -+ return 0; - - /* - * The first byte of the packet we send to the device contains an -- * inbound header which indicates an additional number of BOFs and -+ * outbound header which indicates an additional number of BOFs and - * a baud rate change. - * - * See section 5.4.2.2 of the USB IrDA spec. - */ -- *buf = ir_xbof | ir_baud; -+ *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud; -+ -+ memcpy(urb->transfer_buffer + 1, buf, count); -+ -+ urb->transfer_buffer_length = count + 1; -+ urb->transfer_flags = URB_ZERO_PACKET; -+ -+ ret = usb_submit_urb(urb, GFP_ATOMIC); -+ if (ret) { -+ dev_err(&port->dev, "failed to submit write urb: %d\n", ret); -+ -+ spin_lock_irqsave(&port->lock, flags); -+ __set_bit(0, &port->write_urbs_free); -+ port->tx_bytes -= count; -+ spin_unlock_irqrestore(&port->lock, flags); -+ -+ return ret; -+ } -+ -+ return count; -+} -+ -+static void ir_write_bulk_callback(struct urb *urb) -+{ -+ struct usb_serial_port *port = urb->context; -+ int status = urb->status; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&port->lock, flags); -+ __set_bit(0, &port->write_urbs_free); -+ port->tx_bytes -= urb->transfer_buffer_length - 1; -+ spin_unlock_irqrestore(&port->lock, flags); -+ -+ switch (status) { -+ case 0: -+ break; -+ case -ENOENT: -+ case -ECONNRESET: -+ case -ESHUTDOWN: -+ dev_dbg(&port->dev, "write urb stopped: %d\n", status); -+ return; -+ case -EPIPE: -+ dev_err(&port->dev, "write urb stopped: %d\n", status); -+ return; -+ default: -+ dev_err(&port->dev, "nonzero write-urb status: %d\n", status); -+ break; -+ } -+ -+ usb_serial_port_softint(port); -+} -+ -+static int ir_write_room(struct tty_struct *tty) -+{ -+ struct usb_serial_port *port = tty->driver_data; -+ int count = 0; -+ -+ if (port->bulk_out_size == 0) -+ return 0; -+ -+ if (test_bit(0, &port->write_urbs_free)) -+ count = port->bulk_out_size - 1; - -- count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1, -- &port->lock); -- return count + 1; -+ return count; - } - - static void ir_process_read_urb(struct urb *urb) -@@ -332,34 +404,34 @@ static void ir_set_termios(struct tty_struct *tty, - - switch (baud) { - case 2400: -- ir_baud = USB_IRDA_BR_2400; -+ ir_baud = USB_IRDA_LS_2400; - break; - case 9600: -- ir_baud = USB_IRDA_BR_9600; -+ ir_baud = USB_IRDA_LS_9600; - break; - case 19200: -- ir_baud = USB_IRDA_BR_19200; -+ ir_baud = USB_IRDA_LS_19200; - break; - case 38400: -- ir_baud = USB_IRDA_BR_38400; -+ ir_baud = USB_IRDA_LS_38400; - break; - case 57600: -- ir_baud = USB_IRDA_BR_57600; -+ ir_baud = USB_IRDA_LS_57600; - break; - case 115200: -- ir_baud = USB_IRDA_BR_115200; -+ ir_baud = USB_IRDA_LS_115200; - break; - case 576000: -- ir_baud = USB_IRDA_BR_576000; -+ ir_baud = USB_IRDA_LS_576000; - break; - case 1152000: -- ir_baud = USB_IRDA_BR_1152000; -+ ir_baud = USB_IRDA_LS_1152000; - break; - case 4000000: -- ir_baud = USB_IRDA_BR_4000000; -+ ir_baud = USB_IRDA_LS_4000000; - break; - default: -- ir_baud = USB_IRDA_BR_9600; -+ ir_baud = USB_IRDA_LS_9600; - baud = 9600; - } - -diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h -index d0bdebd87ce3..1b23741036ee 100644 ---- a/drivers/usb/storage/unusual_uas.h -+++ b/drivers/usb/storage/unusual_uas.h -@@ -87,12 +87,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_IGNORE_UAS), - --/* Reported-by: Takeo Nakayama */ -+/* -+ * Initially Reported-by: Takeo Nakayama -+ * UAS Ignore Reported by Steven Ellis -+ */ - UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, - "JMicron", - "JMS566", - USB_SC_DEVICE, USB_PR_DEVICE, NULL, -- US_FL_NO_REPORT_OPCODES), -+ US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS), - - /* Reported-by: Hans de Goede */ - UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, -diff --git a/drivers/usb/typec/tcpm/fusb302.c b/drivers/usb/typec/tcpm/fusb302.c -index ed8655c6af8c..b498960ff72b 100644 ---- a/drivers/usb/typec/tcpm/fusb302.c -+++ b/drivers/usb/typec/tcpm/fusb302.c -@@ -1666,7 +1666,7 @@ static const struct property_entry port_props[] = { - PROPERTY_ENTRY_STRING("try-power-role", "sink"), - PROPERTY_ENTRY_U32_ARRAY("source-pdos", src_pdo), - PROPERTY_ENTRY_U32_ARRAY("sink-pdos", snk_pdo), -- PROPERTY_ENTRY_U32("op-sink-microwatt", 2500), -+ PROPERTY_ENTRY_U32("op-sink-microwatt", 2500000), - { } - }; - -diff --git a/drivers/usb/typec/tcpm/wcove.c b/drivers/usb/typec/tcpm/wcove.c -index edc271da14f4..9b745f432c91 100644 ---- a/drivers/usb/typec/tcpm/wcove.c -+++ b/drivers/usb/typec/tcpm/wcove.c -@@ -597,7 +597,7 @@ static const struct property_entry wcove_props[] = { - PROPERTY_ENTRY_STRING("try-power-role", "sink"), - PROPERTY_ENTRY_U32_ARRAY("source-pdos", src_pdo), - PROPERTY_ENTRY_U32_ARRAY("sink-pdos", snk_pdo), -- PROPERTY_ENTRY_U32("op-sink-microwatt", 15000), -+ PROPERTY_ENTRY_U32("op-sink-microwatt", 15000000), - { } - }; - -diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig -index 4c761abc5688..e2745f686196 100644 ---- a/drivers/watchdog/Kconfig -+++ b/drivers/watchdog/Kconfig -@@ -687,6 +687,7 @@ config MAX63XX_WATCHDOG - config MAX77620_WATCHDOG - tristate "Maxim Max77620 Watchdog Timer" - depends on MFD_MAX77620 || COMPILE_TEST -+ select WATCHDOG_CORE - help - This is the driver for the Max77620 watchdog timer. - Say 'Y' here to enable the watchdog timer support for -diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c -index 1cccf8eb1c5d..8e6dfe76f9c9 100644 ---- a/drivers/watchdog/orion_wdt.c -+++ b/drivers/watchdog/orion_wdt.c -@@ -602,7 +602,7 @@ static int orion_wdt_probe(struct platform_device *pdev) - set_bit(WDOG_HW_RUNNING, &dev->wdt.status); - - /* Request the IRQ only after the watchdog is disabled */ -- irq = platform_get_irq(pdev, 0); -+ irq = platform_get_irq_optional(pdev, 0); - if (irq > 0) { - /* - * Not all supported platforms specify an interrupt for the -@@ -617,7 +617,7 @@ static int orion_wdt_probe(struct platform_device *pdev) - } - - /* Optional 2nd interrupt for pretimeout */ -- irq = platform_get_irq(pdev, 1); -+ irq = platform_get_irq_optional(pdev, 1); - if (irq > 0) { - orion_wdt_info.options |= WDIOF_PRETIMEOUT; - ret = devm_request_irq(&pdev->dev, irq, orion_wdt_pre_irq, -diff --git a/drivers/watchdog/rn5t618_wdt.c b/drivers/watchdog/rn5t618_wdt.c -index 234876047431..6e524c8e26a8 100644 ---- a/drivers/watchdog/rn5t618_wdt.c -+++ b/drivers/watchdog/rn5t618_wdt.c -@@ -188,6 +188,7 @@ static struct platform_driver rn5t618_wdt_driver = { - - module_platform_driver(rn5t618_wdt_driver); - -+MODULE_ALIAS("platform:rn5t618-wdt"); - MODULE_AUTHOR("Beniamino Galvani "); - MODULE_DESCRIPTION("RN5T618 watchdog driver"); - MODULE_LICENSE("GPL v2"); -diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h -index f55e53486e74..53611d7e9d28 100644 ---- a/fs/cifs/cifsglob.h -+++ b/fs/cifs/cifsglob.h -@@ -1538,6 +1538,7 @@ struct mid_q_entry { - mid_callback_t *callback; /* call completion callback */ - mid_handle_t *handle; /* call handle mid callback */ - void *callback_data; /* general purpose pointer for callback */ -+ struct task_struct *creator; - void *resp_buf; /* pointer to received SMB header */ - unsigned int resp_buf_size; - int mid_state; /* wish this were enum but can not pass to wait_event */ -diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c -index 766974fe637a..14265b4bbcc0 100644 ---- a/fs/cifs/smb2misc.c -+++ b/fs/cifs/smb2misc.c -@@ -750,7 +750,7 @@ __smb2_handle_cancelled_close(struct cifs_tcon *tcon, __u64 persistent_fid, - { - struct close_cancelled_open *cancelled; - -- cancelled = kzalloc(sizeof(*cancelled), GFP_KERNEL); -+ cancelled = kzalloc(sizeof(*cancelled), GFP_ATOMIC); - if (!cancelled) - return -ENOMEM; - -diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c -index b5c1cba3e6a1..662256fa2a18 100644 ---- a/fs/cifs/smb2ops.c -+++ b/fs/cifs/smb2ops.c -@@ -1461,7 +1461,9 @@ smb2_ioctl_query_info(const unsigned int xid, - COMPOUND_FID, COMPOUND_FID, - qi.info_type, true, buffer, - qi.output_buffer_length, -- CIFSMaxBufSize); -+ CIFSMaxBufSize - -+ MAX_SMB2_CREATE_RESPONSE_SIZE - -+ MAX_SMB2_CLOSE_RESPONSE_SIZE); - } - } else if (qi.flags == PASSTHRU_SET_INFO) { - /* Can eventually relax perm check since server enforces too */ -@@ -2634,7 +2636,10 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, - - rc = SMB2_ioctl_init(tcon, &rqst[1], fid.persistent_fid, - fid.volatile_fid, FSCTL_GET_REPARSE_POINT, -- true /* is_fctl */, NULL, 0, CIFSMaxBufSize); -+ true /* is_fctl */, NULL, 0, -+ CIFSMaxBufSize - -+ MAX_SMB2_CREATE_RESPONSE_SIZE - -+ MAX_SMB2_CLOSE_RESPONSE_SIZE); - if (rc) - goto querty_exit; - -diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c -index 148d7942c796..805652969065 100644 ---- a/fs/cifs/smb2transport.c -+++ b/fs/cifs/smb2transport.c -@@ -599,6 +599,8 @@ smb2_mid_entry_alloc(const struct smb2_sync_hdr *shdr, - * The default is for the mid to be synchronous, so the - * default callback just wakes up the current task. - */ -+ get_task_struct(current); -+ temp->creator = current; - temp->callback = cifs_wake_up_task; - temp->callback_data = current; - -diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c -index 755434d5e4e7..e67a43fd037c 100644 ---- a/fs/cifs/transport.c -+++ b/fs/cifs/transport.c -@@ -76,6 +76,8 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server) - * The default is for the mid to be synchronous, so the - * default callback just wakes up the current task. - */ -+ get_task_struct(current); -+ temp->creator = current; - temp->callback = cifs_wake_up_task; - temp->callback_data = current; - -@@ -158,6 +160,7 @@ static void _cifs_mid_q_entry_release(struct kref *refcount) - } - } - #endif -+ put_task_struct(midEntry->creator); - - mempool_free(midEntry, cifs_mid_poolp); - } -diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c -index 87846aad594b..8fd45eb89424 100644 ---- a/fs/debugfs/file.c -+++ b/fs/debugfs/file.c -@@ -142,18 +142,21 @@ EXPORT_SYMBOL_GPL(debugfs_file_put); - * We also need to exclude any file that has ways to write or alter it as root - * can bypass the permissions check. - */ --static bool debugfs_is_locked_down(struct inode *inode, -- struct file *filp, -- const struct file_operations *real_fops) -+static int debugfs_locked_down(struct inode *inode, -+ struct file *filp, -+ const struct file_operations *real_fops) - { - if ((inode->i_mode & 07777) == 0444 && - !(filp->f_mode & FMODE_WRITE) && - !real_fops->unlocked_ioctl && - !real_fops->compat_ioctl && - !real_fops->mmap) -- return false; -+ return 0; - -- return security_locked_down(LOCKDOWN_DEBUGFS); -+ if (security_locked_down(LOCKDOWN_DEBUGFS)) -+ return -EPERM; -+ -+ return 0; - } - - static int open_proxy_open(struct inode *inode, struct file *filp) -@@ -168,7 +171,7 @@ static int open_proxy_open(struct inode *inode, struct file *filp) - - real_fops = debugfs_real_fops(filp); - -- r = debugfs_is_locked_down(inode, filp, real_fops); -+ r = debugfs_locked_down(inode, filp, real_fops); - if (r) - goto out; - -@@ -298,7 +301,7 @@ static int full_proxy_open(struct inode *inode, struct file *filp) - - real_fops = debugfs_real_fops(filp); - -- r = debugfs_is_locked_down(inode, filp, real_fops); -+ r = debugfs_locked_down(inode, filp, real_fops); - if (r) - goto out; - -diff --git a/include/linux/platform_data/ti-sysc.h b/include/linux/platform_data/ti-sysc.h -index b5b7a3423ca8..8cfe570fdece 100644 ---- a/include/linux/platform_data/ti-sysc.h -+++ b/include/linux/platform_data/ti-sysc.h -@@ -49,6 +49,8 @@ struct sysc_regbits { - s8 emufree_shift; - }; - -+#define SYSC_QUIRK_FORCE_MSTANDBY BIT(20) -+#define SYSC_MODULE_QUIRK_AESS BIT(19) - #define SYSC_MODULE_QUIRK_SGX BIT(18) - #define SYSC_MODULE_QUIRK_HDQ1W BIT(17) - #define SYSC_MODULE_QUIRK_I2C BIT(16) -diff --git a/include/linux/power/smartreflex.h b/include/linux/power/smartreflex.h -index d0b37e937037..971c9264179e 100644 ---- a/include/linux/power/smartreflex.h -+++ b/include/linux/power/smartreflex.h -@@ -293,6 +293,9 @@ struct omap_sr_data { - struct voltagedomain *voltdm; - }; - -+ -+extern struct omap_sr_data omap_sr_pdata[OMAP_SR_NR]; -+ - #ifdef CONFIG_POWER_AVS_OMAP - - /* Smartreflex module enable/disable interface */ -diff --git a/include/linux/usb/irda.h b/include/linux/usb/irda.h -index 396d2b043e64..556a801efce3 100644 ---- a/include/linux/usb/irda.h -+++ b/include/linux/usb/irda.h -@@ -119,11 +119,22 @@ struct usb_irda_cs_descriptor { - * 6 - 115200 bps - * 7 - 576000 bps - * 8 - 1.152 Mbps -- * 9 - 5 mbps -+ * 9 - 4 Mbps - * 10..15 - Reserved - */ - #define USB_IRDA_STATUS_LINK_SPEED 0x0f - -+#define USB_IRDA_LS_NO_CHANGE 0 -+#define USB_IRDA_LS_2400 1 -+#define USB_IRDA_LS_9600 2 -+#define USB_IRDA_LS_19200 3 -+#define USB_IRDA_LS_38400 4 -+#define USB_IRDA_LS_57600 5 -+#define USB_IRDA_LS_115200 6 -+#define USB_IRDA_LS_576000 7 -+#define USB_IRDA_LS_1152000 8 -+#define USB_IRDA_LS_4000000 9 -+ - /* The following is a 4-bit value used only for - * outbound header: - * -diff --git a/include/media/dvb-usb-ids.h b/include/media/dvb-usb-ids.h -index 7ce4e8332421..1409230ad3a4 100644 ---- a/include/media/dvb-usb-ids.h -+++ b/include/media/dvb-usb-ids.h -@@ -389,6 +389,7 @@ - #define USB_PID_MYGICA_T230 0xc688 - #define USB_PID_MYGICA_T230C 0xc689 - #define USB_PID_MYGICA_T230C2 0xc68a -+#define USB_PID_MYGICA_T230C_LITE 0xc699 - #define USB_PID_ELGATO_EYETV_DIVERSITY 0x0011 - #define USB_PID_ELGATO_EYETV_DTT 0x0021 - #define USB_PID_ELGATO_EYETV_DTT_2 0x003f -diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h -index e553fc80eb23..9976ad2f54fd 100644 ---- a/include/net/pkt_cls.h -+++ b/include/net/pkt_cls.h -@@ -141,31 +141,38 @@ __cls_set_class(unsigned long *clp, unsigned long cl) - return xchg(clp, cl); - } - --static inline unsigned long --cls_set_class(struct Qdisc *q, unsigned long *clp, unsigned long cl) -+static inline void -+__tcf_bind_filter(struct Qdisc *q, struct tcf_result *r, unsigned long base) - { -- unsigned long old_cl; -+ unsigned long cl; - -- sch_tree_lock(q); -- old_cl = __cls_set_class(clp, cl); -- sch_tree_unlock(q); -- return old_cl; -+ cl = q->ops->cl_ops->bind_tcf(q, base, r->classid); -+ cl = __cls_set_class(&r->class, cl); -+ if (cl) -+ q->ops->cl_ops->unbind_tcf(q, cl); - } - - static inline void - tcf_bind_filter(struct tcf_proto *tp, struct tcf_result *r, unsigned long base) - { - struct Qdisc *q = tp->chain->block->q; -- unsigned long cl; - - /* Check q as it is not set for shared blocks. In that case, - * setting class is not supported. - */ - if (!q) - return; -- cl = q->ops->cl_ops->bind_tcf(q, base, r->classid); -- cl = cls_set_class(q, &r->class, cl); -- if (cl) -+ sch_tree_lock(q); -+ __tcf_bind_filter(q, r, base); -+ sch_tree_unlock(q); -+} -+ -+static inline void -+__tcf_unbind_filter(struct Qdisc *q, struct tcf_result *r) -+{ -+ unsigned long cl; -+ -+ if ((cl = __cls_set_class(&r->class, 0)) != 0) - q->ops->cl_ops->unbind_tcf(q, cl); - } - -@@ -173,12 +180,10 @@ static inline void - tcf_unbind_filter(struct tcf_proto *tp, struct tcf_result *r) - { - struct Qdisc *q = tp->chain->block->q; -- unsigned long cl; - - if (!q) - return; -- if ((cl = __cls_set_class(&r->class, 0)) != 0) -- q->ops->cl_ops->unbind_tcf(q, cl); -+ __tcf_unbind_filter(q, r); - } - - struct tcf_exts { -diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h -index 32e418dba133..d334e4609dd4 100644 ---- a/include/net/sch_generic.h -+++ b/include/net/sch_generic.h -@@ -318,7 +318,8 @@ struct tcf_proto_ops { - void *type_data); - void (*hw_del)(struct tcf_proto *tp, - void *type_data); -- void (*bind_class)(void *, u32, unsigned long); -+ void (*bind_class)(void *, u32, unsigned long, -+ void *, unsigned long); - void * (*tmplt_create)(struct net *net, - struct tcf_chain *chain, - struct nlattr **tca, -diff --git a/include/net/udp.h b/include/net/udp.h -index bad74f780831..8f163d674f07 100644 ---- a/include/net/udp.h -+++ b/include/net/udp.h -@@ -476,6 +476,9 @@ static inline struct sk_buff *udp_rcv_segment(struct sock *sk, - if (!inet_get_convert_csum(sk)) - features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; - -+ if (skb->pkt_type == PACKET_LOOPBACK) -+ skb->ip_summed = CHECKSUM_PARTIAL; -+ - /* the GSO CB lays after the UDP one, no need to save and restore any - * CB fragment - */ -diff --git a/init/Kconfig b/init/Kconfig -index b4daad2bac23..0328b53d09ad 100644 ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -54,6 +54,7 @@ config CC_DISABLE_WARN_MAYBE_UNINITIALIZED - - config CONSTRUCTORS - bool -+ depends on !UML - - config IRQ_WORK - bool -diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig -index 060e8e726755..3941a9c48f83 100644 ---- a/kernel/gcov/Kconfig -+++ b/kernel/gcov/Kconfig -@@ -4,7 +4,7 @@ menu "GCOV-based kernel profiling" - config GCOV_KERNEL - bool "Enable gcov-based kernel profiling" - depends on DEBUG_FS -- select CONSTRUCTORS -+ select CONSTRUCTORS if !UML - default n - ---help--- - This option enables gcov-based code profiling (e.g. for code coverage -diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c -index fc34fd1668d6..3737d32ad11a 100644 ---- a/net/ipv4/nexthop.c -+++ b/net/ipv4/nexthop.c -@@ -322,7 +322,9 @@ static size_t nh_nlmsg_size_single(struct nexthop *nh) - - static size_t nh_nlmsg_size(struct nexthop *nh) - { -- size_t sz = nla_total_size(4); /* NHA_ID */ -+ size_t sz = NLMSG_ALIGN(sizeof(struct nhmsg)); -+ -+ sz += nla_total_size(4); /* NHA_ID */ - - if (nh->is_group) - sz += nh_nlmsg_size_grp(nh); -diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c -index 86bd133b4fa0..96d54e5bf7bc 100644 ---- a/net/rxrpc/input.c -+++ b/net/rxrpc/input.c -@@ -413,7 +413,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) - { - struct rxrpc_skb_priv *sp = rxrpc_skb(skb); - enum rxrpc_call_state state; -- unsigned int j; -+ unsigned int j, nr_subpackets; - rxrpc_serial_t serial = sp->hdr.serial, ack_serial = 0; - rxrpc_seq_t seq0 = sp->hdr.seq, hard_ack; - bool immediate_ack = false, jumbo_bad = false; -@@ -457,7 +457,8 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) - call->ackr_prev_seq = seq0; - hard_ack = READ_ONCE(call->rx_hard_ack); - -- if (sp->nr_subpackets > 1) { -+ nr_subpackets = sp->nr_subpackets; -+ if (nr_subpackets > 1) { - if (call->nr_jumbo_bad > 3) { - ack = RXRPC_ACK_NOSPACE; - ack_serial = serial; -@@ -465,11 +466,11 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) - } - } - -- for (j = 0; j < sp->nr_subpackets; j++) { -+ for (j = 0; j < nr_subpackets; j++) { - rxrpc_serial_t serial = sp->hdr.serial + j; - rxrpc_seq_t seq = seq0 + j; - unsigned int ix = seq & RXRPC_RXTX_BUFF_MASK; -- bool terminal = (j == sp->nr_subpackets - 1); -+ bool terminal = (j == nr_subpackets - 1); - bool last = terminal && (sp->rx_flags & RXRPC_SKB_INCL_LAST); - u8 flags, annotation = j; - -@@ -506,7 +507,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) - } - - if (call->rxtx_buffer[ix]) { -- rxrpc_input_dup_data(call, seq, sp->nr_subpackets > 1, -+ rxrpc_input_dup_data(call, seq, nr_subpackets > 1, - &jumbo_bad); - if (ack != RXRPC_ACK_DUPLICATE) { - ack = RXRPC_ACK_DUPLICATE; -@@ -564,6 +565,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) - * ring. - */ - skb = NULL; -+ sp = NULL; - } - - if (last) { -diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c -index 4aafbe3d435c..f256a7c69093 100644 ---- a/net/sched/cls_basic.c -+++ b/net/sched/cls_basic.c -@@ -263,12 +263,17 @@ skip: - } - } - --static void basic_bind_class(void *fh, u32 classid, unsigned long cl) -+static void basic_bind_class(void *fh, u32 classid, unsigned long cl, void *q, -+ unsigned long base) - { - struct basic_filter *f = fh; - -- if (f && f->res.classid == classid) -- f->res.class = cl; -+ if (f && f->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &f->res, base); -+ else -+ __tcf_unbind_filter(q, &f->res); -+ } - } - - static int basic_dump(struct net *net, struct tcf_proto *tp, void *fh, -diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c -index 8229ed4a67be..6e3e63db0e01 100644 ---- a/net/sched/cls_bpf.c -+++ b/net/sched/cls_bpf.c -@@ -631,12 +631,17 @@ nla_put_failure: - return -1; - } - --static void cls_bpf_bind_class(void *fh, u32 classid, unsigned long cl) -+static void cls_bpf_bind_class(void *fh, u32 classid, unsigned long cl, -+ void *q, unsigned long base) - { - struct cls_bpf_prog *prog = fh; - -- if (prog && prog->res.classid == classid) -- prog->res.class = cl; -+ if (prog && prog->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &prog->res, base); -+ else -+ __tcf_unbind_filter(q, &prog->res); -+ } - } - - static void cls_bpf_walk(struct tcf_proto *tp, struct tcf_walker *arg, -diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c -index 5cf8163710c8..7394e01c0c9c 100644 ---- a/net/sched/cls_flower.c -+++ b/net/sched/cls_flower.c -@@ -2511,12 +2511,17 @@ nla_put_failure: - return -EMSGSIZE; - } - --static void fl_bind_class(void *fh, u32 classid, unsigned long cl) -+static void fl_bind_class(void *fh, u32 classid, unsigned long cl, void *q, -+ unsigned long base) - { - struct cls_fl_filter *f = fh; - -- if (f && f->res.classid == classid) -- f->res.class = cl; -+ if (f && f->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &f->res, base); -+ else -+ __tcf_unbind_filter(q, &f->res); -+ } - } - - static bool fl_delete_empty(struct tcf_proto *tp) -diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c -index c9496c920d6f..ec945294626a 100644 ---- a/net/sched/cls_fw.c -+++ b/net/sched/cls_fw.c -@@ -419,12 +419,17 @@ nla_put_failure: - return -1; - } - --static void fw_bind_class(void *fh, u32 classid, unsigned long cl) -+static void fw_bind_class(void *fh, u32 classid, unsigned long cl, void *q, -+ unsigned long base) - { - struct fw_filter *f = fh; - -- if (f && f->res.classid == classid) -- f->res.class = cl; -+ if (f && f->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &f->res, base); -+ else -+ __tcf_unbind_filter(q, &f->res); -+ } - } - - static struct tcf_proto_ops cls_fw_ops __read_mostly = { -diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c -index 7fc2eb62aa98..039cc86974f4 100644 ---- a/net/sched/cls_matchall.c -+++ b/net/sched/cls_matchall.c -@@ -393,12 +393,17 @@ nla_put_failure: - return -1; - } - --static void mall_bind_class(void *fh, u32 classid, unsigned long cl) -+static void mall_bind_class(void *fh, u32 classid, unsigned long cl, void *q, -+ unsigned long base) - { - struct cls_mall_head *head = fh; - -- if (head && head->res.classid == classid) -- head->res.class = cl; -+ if (head && head->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &head->res, base); -+ else -+ __tcf_unbind_filter(q, &head->res); -+ } - } - - static struct tcf_proto_ops cls_mall_ops __read_mostly = { -diff --git a/net/sched/cls_route.c b/net/sched/cls_route.c -index 2d9e0b4484ea..6f8786b06bde 100644 ---- a/net/sched/cls_route.c -+++ b/net/sched/cls_route.c -@@ -641,12 +641,17 @@ nla_put_failure: - return -1; - } - --static void route4_bind_class(void *fh, u32 classid, unsigned long cl) -+static void route4_bind_class(void *fh, u32 classid, unsigned long cl, void *q, -+ unsigned long base) - { - struct route4_filter *f = fh; - -- if (f && f->res.classid == classid) -- f->res.class = cl; -+ if (f && f->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &f->res, base); -+ else -+ __tcf_unbind_filter(q, &f->res); -+ } - } - - static struct tcf_proto_ops cls_route4_ops __read_mostly = { -diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h -index 2f3c03b25d5d..c22624131949 100644 ---- a/net/sched/cls_rsvp.h -+++ b/net/sched/cls_rsvp.h -@@ -738,12 +738,17 @@ nla_put_failure: - return -1; - } - --static void rsvp_bind_class(void *fh, u32 classid, unsigned long cl) -+static void rsvp_bind_class(void *fh, u32 classid, unsigned long cl, void *q, -+ unsigned long base) - { - struct rsvp_filter *f = fh; - -- if (f && f->res.classid == classid) -- f->res.class = cl; -+ if (f && f->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &f->res, base); -+ else -+ __tcf_unbind_filter(q, &f->res); -+ } - } - - static struct tcf_proto_ops RSVP_OPS __read_mostly = { -diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c -index e573e5a5c794..3d4a1280352f 100644 ---- a/net/sched/cls_tcindex.c -+++ b/net/sched/cls_tcindex.c -@@ -654,12 +654,17 @@ nla_put_failure: - return -1; - } - --static void tcindex_bind_class(void *fh, u32 classid, unsigned long cl) -+static void tcindex_bind_class(void *fh, u32 classid, unsigned long cl, -+ void *q, unsigned long base) - { - struct tcindex_filter_result *r = fh; - -- if (r && r->res.classid == classid) -- r->res.class = cl; -+ if (r && r->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &r->res, base); -+ else -+ __tcf_unbind_filter(q, &r->res); -+ } - } - - static struct tcf_proto_ops cls_tcindex_ops __read_mostly = { -diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c -index a0e6fac613de..e15ff335953d 100644 ---- a/net/sched/cls_u32.c -+++ b/net/sched/cls_u32.c -@@ -1255,12 +1255,17 @@ static int u32_reoffload(struct tcf_proto *tp, bool add, flow_setup_cb_t *cb, - return 0; - } - --static void u32_bind_class(void *fh, u32 classid, unsigned long cl) -+static void u32_bind_class(void *fh, u32 classid, unsigned long cl, void *q, -+ unsigned long base) - { - struct tc_u_knode *n = fh; - -- if (n && n->res.classid == classid) -- n->res.class = cl; -+ if (n && n->res.classid == classid) { -+ if (cl) -+ __tcf_bind_filter(q, &n->res, base); -+ else -+ __tcf_unbind_filter(q, &n->res); -+ } - } - - static int u32_dump(struct net *net, struct tcf_proto *tp, void *fh, -diff --git a/net/sched/ematch.c b/net/sched/ematch.c -index d0140a92694a..dd3b8c11a2e0 100644 ---- a/net/sched/ematch.c -+++ b/net/sched/ematch.c -@@ -238,6 +238,9 @@ static int tcf_em_validate(struct tcf_proto *tp, - goto errout; - - if (em->ops->change) { -+ err = -EINVAL; -+ if (em_hdr->flags & TCF_EM_SIMPLE) -+ goto errout; - err = em->ops->change(net, data, data_len, em); - if (err < 0) - goto errout; -diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c -index 1047825d9f48..50794125bf02 100644 ---- a/net/sched/sch_api.c -+++ b/net/sched/sch_api.c -@@ -1891,8 +1891,9 @@ static int tclass_del_notify(struct net *net, - - struct tcf_bind_args { - struct tcf_walker w; -- u32 classid; -+ unsigned long base; - unsigned long cl; -+ u32 classid; - }; - - static int tcf_node_bind(struct tcf_proto *tp, void *n, struct tcf_walker *arg) -@@ -1903,28 +1904,30 @@ static int tcf_node_bind(struct tcf_proto *tp, void *n, struct tcf_walker *arg) - struct Qdisc *q = tcf_block_q(tp->chain->block); - - sch_tree_lock(q); -- tp->ops->bind_class(n, a->classid, a->cl); -+ tp->ops->bind_class(n, a->classid, a->cl, q, a->base); - sch_tree_unlock(q); - } - return 0; - } - --static void tc_bind_tclass(struct Qdisc *q, u32 portid, u32 clid, -- unsigned long new_cl) -+struct tc_bind_class_args { -+ struct qdisc_walker w; -+ unsigned long new_cl; -+ u32 portid; -+ u32 clid; -+}; -+ -+static int tc_bind_class_walker(struct Qdisc *q, unsigned long cl, -+ struct qdisc_walker *w) - { -+ struct tc_bind_class_args *a = (struct tc_bind_class_args *)w; - const struct Qdisc_class_ops *cops = q->ops->cl_ops; - struct tcf_block *block; - struct tcf_chain *chain; -- unsigned long cl; - -- cl = cops->find(q, portid); -- if (!cl) -- return; -- if (!cops->tcf_block) -- return; - block = cops->tcf_block(q, cl, NULL); - if (!block) -- return; -+ return 0; - for (chain = tcf_get_next_chain(block, NULL); - chain; - chain = tcf_get_next_chain(block, chain)) { -@@ -1935,11 +1938,29 @@ static void tc_bind_tclass(struct Qdisc *q, u32 portid, u32 clid, - struct tcf_bind_args arg = {}; - - arg.w.fn = tcf_node_bind; -- arg.classid = clid; -- arg.cl = new_cl; -+ arg.classid = a->clid; -+ arg.base = cl; -+ arg.cl = a->new_cl; - tp->ops->walk(tp, &arg.w, true); - } - } -+ -+ return 0; -+} -+ -+static void tc_bind_tclass(struct Qdisc *q, u32 portid, u32 clid, -+ unsigned long new_cl) -+{ -+ const struct Qdisc_class_ops *cops = q->ops->cl_ops; -+ struct tc_bind_class_args args = {}; -+ -+ if (!cops->tcf_block) -+ return; -+ args.portid = portid; -+ args.clid = clid; -+ args.new_cl = new_cl; -+ args.w.fn = tc_bind_class_walker; -+ q->ops->cl_ops->walk(q, &args.w); - } - - #else -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index d293488dc3dd..68832f52c1ad 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -7563,20 +7563,6 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { - {0x19, 0x02a11020}, - {0x1a, 0x02a11030}, - {0x21, 0x0221101f}), -- SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, -- {0x12, 0x90a60140}, -- {0x14, 0x90170110}, -- {0x21, 0x02211020}), -- SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, -- {0x12, 0x90a60140}, -- {0x14, 0x90170150}, -- {0x21, 0x02211020}), -- SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, -- {0x21, 0x02211020}), -- SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, -- {0x12, 0x40000000}, -- {0x14, 0x90170110}, -- {0x21, 0x02211020}), - SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, - {0x14, 0x90170110}, - {0x21, 0x02211020}), -@@ -7901,6 +7887,9 @@ static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = { - SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, - {0x19, 0x40000000}, - {0x1a, 0x40000000}), -+ SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, -+ {0x19, 0x40000000}, -+ {0x1a, 0x40000000}), - {} - }; - -diff --git a/sound/soc/fsl/fsl_audmix.c b/sound/soc/fsl/fsl_audmix.c -index a1db1bce330f..5faecbeb5497 100644 ---- a/sound/soc/fsl/fsl_audmix.c -+++ b/sound/soc/fsl/fsl_audmix.c -@@ -505,15 +505,20 @@ static int fsl_audmix_probe(struct platform_device *pdev) - ARRAY_SIZE(fsl_audmix_dai)); - if (ret) { - dev_err(dev, "failed to register ASoC DAI\n"); -- return ret; -+ goto err_disable_pm; - } - - priv->pdev = platform_device_register_data(dev, mdrv, 0, NULL, 0); - if (IS_ERR(priv->pdev)) { - ret = PTR_ERR(priv->pdev); - dev_err(dev, "failed to register platform %s: %d\n", mdrv, ret); -+ goto err_disable_pm; - } - -+ return 0; -+ -+err_disable_pm: -+ pm_runtime_disable(dev); - return ret; - } - -@@ -521,6 +526,8 @@ static int fsl_audmix_remove(struct platform_device *pdev) - { - struct fsl_audmix *priv = dev_get_drvdata(&pdev->dev); - -+ pm_runtime_disable(&pdev->dev); -+ - if (priv->pdev) - platform_device_unregister(priv->pdev); - -diff --git a/sound/soc/intel/boards/cht_bsw_rt5645.c b/sound/soc/intel/boards/cht_bsw_rt5645.c -index 8879c3be29d5..c68a5b85a4a0 100644 ---- a/sound/soc/intel/boards/cht_bsw_rt5645.c -+++ b/sound/soc/intel/boards/cht_bsw_rt5645.c -@@ -48,6 +48,7 @@ struct cht_mc_private { - #define CHT_RT5645_SSP2_AIF2 BIT(16) /* default is using AIF1 */ - #define CHT_RT5645_SSP0_AIF1 BIT(17) - #define CHT_RT5645_SSP0_AIF2 BIT(18) -+#define CHT_RT5645_PMC_PLT_CLK_0 BIT(19) - - static unsigned long cht_rt5645_quirk = 0; - -@@ -59,6 +60,8 @@ static void log_quirks(struct device *dev) - dev_info(dev, "quirk SSP0_AIF1 enabled"); - if (cht_rt5645_quirk & CHT_RT5645_SSP0_AIF2) - dev_info(dev, "quirk SSP0_AIF2 enabled"); -+ if (cht_rt5645_quirk & CHT_RT5645_PMC_PLT_CLK_0) -+ dev_info(dev, "quirk PMC_PLT_CLK_0 enabled"); - } - - static int platform_clock_control(struct snd_soc_dapm_widget *w, -@@ -226,15 +229,21 @@ static int cht_aif1_hw_params(struct snd_pcm_substream *substream, - return 0; - } - --/* uncomment when we have a real quirk - static int cht_rt5645_quirk_cb(const struct dmi_system_id *id) - { - cht_rt5645_quirk = (unsigned long)id->driver_data; - return 1; - } --*/ - - static const struct dmi_system_id cht_rt5645_quirk_table[] = { -+ { -+ /* Strago family Chromebooks */ -+ .callback = cht_rt5645_quirk_cb, -+ .matches = { -+ DMI_MATCH(DMI_PRODUCT_FAMILY, "Intel_Strago"), -+ }, -+ .driver_data = (void *)CHT_RT5645_PMC_PLT_CLK_0, -+ }, - { - }, - }; -@@ -526,6 +535,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev) - int dai_index = 0; - int ret_val = 0; - int i; -+ const char *mclk_name; - - drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL); - if (!drv) -@@ -662,11 +672,15 @@ static int snd_cht_mc_probe(struct platform_device *pdev) - if (ret_val) - return ret_val; - -- drv->mclk = devm_clk_get(&pdev->dev, "pmc_plt_clk_3"); -+ if (cht_rt5645_quirk & CHT_RT5645_PMC_PLT_CLK_0) -+ mclk_name = "pmc_plt_clk_0"; -+ else -+ mclk_name = "pmc_plt_clk_3"; -+ -+ drv->mclk = devm_clk_get(&pdev->dev, mclk_name); - if (IS_ERR(drv->mclk)) { -- dev_err(&pdev->dev, -- "Failed to get MCLK from pmc_plt_clk_3: %ld\n", -- PTR_ERR(drv->mclk)); -+ dev_err(&pdev->dev, "Failed to get MCLK from %s: %ld\n", -+ mclk_name, PTR_ERR(drv->mclk)); - return PTR_ERR(drv->mclk); - } - -diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c -index fd2d22ddc81b..7ccbca47240d 100644 ---- a/sound/soc/soc-topology.c -+++ b/sound/soc/soc-topology.c -@@ -548,12 +548,12 @@ static void remove_link(struct snd_soc_component *comp, - if (dobj->ops && dobj->ops->link_unload) - dobj->ops->link_unload(comp, dobj); - -+ list_del(&dobj->list); -+ snd_soc_remove_dai_link(comp->card, link); -+ - kfree(link->name); - kfree(link->stream_name); - kfree(link->cpus->dai_name); -- -- list_del(&dobj->list); -- snd_soc_remove_dai_link(comp->card, link); - kfree(link); - } - -diff --git a/sound/soc/sof/intel/hda-dai.c b/sound/soc/sof/intel/hda-dai.c -index 8796f385be76..896d21984b73 100644 ---- a/sound/soc/sof/intel/hda-dai.c -+++ b/sound/soc/sof/intel/hda-dai.c -@@ -216,6 +216,8 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream, - link_dev = hda_link_stream_assign(bus, substream); - if (!link_dev) - return -EBUSY; -+ -+ snd_soc_dai_set_dma_data(dai, substream, (void *)link_dev); - } - - stream_tag = hdac_stream(link_dev)->stream_tag; -@@ -228,8 +230,6 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream, - if (ret < 0) - return ret; - -- snd_soc_dai_set_dma_data(dai, substream, (void *)link_dev); -- - link = snd_hdac_ext_bus_get_link(bus, codec_dai->component->name); - if (!link) - return -EINVAL; -@@ -361,6 +361,13 @@ static int hda_link_hw_free(struct snd_pcm_substream *substream, - bus = hstream->bus; - rtd = snd_pcm_substream_chip(substream); - link_dev = snd_soc_dai_get_dma_data(dai, substream); -+ -+ if (!link_dev) { -+ dev_dbg(dai->dev, -+ "%s: link_dev is not assigned\n", __func__); -+ return -EINVAL; -+ } -+ - hda_stream = hstream_to_sof_hda_stream(link_dev); - - /* free the link DMA channel in the FW */ -diff --git a/sound/soc/sof/ipc.c b/sound/soc/sof/ipc.c -index 086eeeab8679..7b6d69783e16 100644 ---- a/sound/soc/sof/ipc.c -+++ b/sound/soc/sof/ipc.c -@@ -834,6 +834,9 @@ void snd_sof_ipc_free(struct snd_sof_dev *sdev) - { - struct snd_sof_ipc *ipc = sdev->ipc; - -+ if (!ipc) -+ return; -+ - /* disable sending of ipc's */ - mutex_lock(&ipc->tx_mutex); - ipc->disable_ipc_tx = true; -diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h -index 54a50699bbfd..9f77cbaac01c 100644 ---- a/tools/testing/selftests/bpf/bpf_helpers.h -+++ b/tools/testing/selftests/bpf/bpf_helpers.h -@@ -3,7 +3,7 @@ - #define __BPF_HELPERS__ - - #define __uint(name, val) int (*name)[val] --#define __type(name, val) val *name -+#define __type(name, val) typeof(val) *name - - /* helper macro to print out debug messages */ - #define bpf_printk(fmt, ...) \ -diff --git a/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c b/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c -index f8ffa3f3d44b..6cc4479ac9df 100644 ---- a/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c -+++ b/tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c -@@ -47,12 +47,11 @@ struct { - * issue and avoid complicated C programming massaging. - * This is an acceptable workaround since there is one entry here. - */ --typedef __u64 raw_stack_trace_t[2 * MAX_STACK_RAWTP]; - struct { - __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); - __uint(max_entries, 1); - __type(key, __u32); -- __type(value, raw_stack_trace_t); -+ __type(value, __u64[2 * MAX_STACK_RAWTP]); - } rawdata_map SEC(".maps"); - - SEC("raw_tracepoint/sys_enter") diff --git a/patch/kernel/sunxi-current/patch-5.4.17-18.patch b/patch/kernel/sunxi-current/patch-5.4.17-18.patch deleted file mode 100644 index aa79549ab6..0000000000 --- a/patch/kernel/sunxi-current/patch-5.4.17-18.patch +++ /dev/null @@ -1,3992 +0,0 @@ -diff --git a/Documentation/ABI/testing/sysfs-class-devfreq b/Documentation/ABI/testing/sysfs-class-devfreq -index 01196e19afca..75897e2fde43 100644 ---- a/Documentation/ABI/testing/sysfs-class-devfreq -+++ b/Documentation/ABI/testing/sysfs-class-devfreq -@@ -7,6 +7,13 @@ Description: - The name of devfreq object denoted as ... is same as the - name of device using devfreq. - -+What: /sys/class/devfreq/.../name -+Date: November 2019 -+Contact: Chanwoo Choi -+Description: -+ The /sys/class/devfreq/.../name shows the name of device -+ of the corresponding devfreq object. -+ - What: /sys/class/devfreq/.../governor - Date: September 2011 - Contact: MyungJoo Ham -diff --git a/Makefile b/Makefile -index a363a539a092..b6c151fd5227 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0 - VERSION = 5 - PATCHLEVEL = 4 --SUBLEVEL = 17 -+SUBLEVEL = 18 - EXTRAVERSION = - NAME = Kleptomaniac Octopus - -diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi b/arch/arm/boot/dts/am335x-boneblack-common.dtsi -index 7ad079861efd..91f93bc89716 100644 ---- a/arch/arm/boot/dts/am335x-boneblack-common.dtsi -+++ b/arch/arm/boot/dts/am335x-boneblack-common.dtsi -@@ -131,6 +131,11 @@ - }; - - / { -+ memory@80000000 { -+ device_type = "memory"; -+ reg = <0x80000000 0x20000000>; /* 512 MB */ -+ }; -+ - clk_mcasp0_fixed: clk_mcasp0_fixed { - #clock-cells = <0>; - compatible = "fixed-clock"; -diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts -index 078cb473fa7d..a6fbc088daa8 100644 ---- a/arch/arm/boot/dts/am43x-epos-evm.dts -+++ b/arch/arm/boot/dts/am43x-epos-evm.dts -@@ -848,6 +848,7 @@ - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&spi0_pins_default>; - pinctrl-1 = <&spi0_pins_sleep>; -+ ti,pindir-d0-out-d1-in = <1>; - }; - - &spi1 { -@@ -855,6 +856,7 @@ - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&spi1_pins_default>; - pinctrl-1 = <&spi1_pins_sleep>; -+ ti,pindir-d0-out-d1-in = <1>; - }; - - &usb2_phy1 { -diff --git a/arch/arm/boot/dts/am571x-idk.dts b/arch/arm/boot/dts/am571x-idk.dts -index 9d6a872c2b23..10105a497c1a 100644 ---- a/arch/arm/boot/dts/am571x-idk.dts -+++ b/arch/arm/boot/dts/am571x-idk.dts -@@ -170,10 +170,6 @@ - gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>; - }; - --&pcie1_ep { -- gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; --}; -- - &mmc1 { - pinctrl-names = "default", "hs"; - pinctrl-0 = <&mmc1_pins_default_no_clk_pu>; -diff --git a/arch/arm/boot/dts/am572x-idk-common.dtsi b/arch/arm/boot/dts/am572x-idk-common.dtsi -index a064f13b3880..ddf123620e96 100644 ---- a/arch/arm/boot/dts/am572x-idk-common.dtsi -+++ b/arch/arm/boot/dts/am572x-idk-common.dtsi -@@ -147,10 +147,6 @@ - gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; - }; - --&pcie1_ep { -- gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; --}; -- - &mailbox5 { - status = "okay"; - mbox_ipu1_ipc3x: mbox_ipu1_ipc3x { -diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi -index bc76f1705c0f..a813a0cf3ff3 100644 ---- a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi -+++ b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi -@@ -29,6 +29,27 @@ - reg = <0x0 0x80000000 0x0 0x80000000>; - }; - -+ main_12v0: fixedregulator-main_12v0 { -+ /* main supply */ -+ compatible = "regulator-fixed"; -+ regulator-name = "main_12v0"; -+ regulator-min-microvolt = <12000000>; -+ regulator-max-microvolt = <12000000>; -+ regulator-always-on; -+ regulator-boot-on; -+ }; -+ -+ evm_5v0: fixedregulator-evm_5v0 { -+ /* Output of TPS54531D */ -+ compatible = "regulator-fixed"; -+ regulator-name = "evm_5v0"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ vin-supply = <&main_12v0>; -+ regulator-always-on; -+ regulator-boot-on; -+ }; -+ - vdd_3v3: fixedregulator-vdd_3v3 { - compatible = "regulator-fixed"; - regulator-name = "vdd_3v3"; -@@ -547,10 +568,6 @@ - gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; - }; - --&pcie1_ep { -- gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; --}; -- - &mcasp3 { - #sound-dai-cells = <0>; - assigned-clocks = <&l4per2_clkctrl DRA7_L4PER2_MCASP3_CLKCTRL 24>; -diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts -index fb928503ad45..d9be511f054f 100644 ---- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts -+++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts -@@ -101,7 +101,7 @@ - initial-mode = <1>; /* initialize in HUB mode */ - disabled-ports = <1>; - intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */ -- reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */ -+ reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */ - connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */ - refclk-frequency = <19200000>; - }; -diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S -index ae5020302de4..6607fa817bba 100644 ---- a/arch/arm/kernel/hyp-stub.S -+++ b/arch/arm/kernel/hyp-stub.S -@@ -146,10 +146,9 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE - #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER) - @ make CNTP_* and CNTPCT accessible from PL1 - mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 -- lsr r7, #16 -- and r7, #0xf -- cmp r7, #1 -- bne 1f -+ ubfx r7, r7, #16, #4 -+ teq r7, #0 -+ beq 1f - mrc p15, 4, r7, c14, c1, 0 @ CNTHCTL - orr r7, r7, #3 @ PL1PCEN | PL1PCTEN - mcr p15, 4, r7, c14, c1, 0 @ CNTHCTL -diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile -index 1f012c506434..cd3414898d10 100644 ---- a/arch/arm64/boot/Makefile -+++ b/arch/arm64/boot/Makefile -@@ -16,7 +16,7 @@ - - OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S - --targets := Image Image.gz -+targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo - - $(obj)/Image: vmlinux FORCE - $(call if_changed,objcopy) -diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts -index 3435aaa4e8db..5d6a8dafe8dc 100644 ---- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts -+++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts -@@ -361,6 +361,8 @@ - - bluetooth { - compatible = "brcm,bcm43438-bt"; -+ interrupt-parent = <&gpio_intc>; -+ interrupts = <95 IRQ_TYPE_LEVEL_HIGH>; - shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; - max-speed = <2000000>; - clocks = <&wifi32k>; -diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c -index a6c9f49c6612..a5f3e50fe976 100644 ---- a/arch/parisc/kernel/drivers.c -+++ b/arch/parisc/kernel/drivers.c -@@ -889,8 +889,8 @@ static void print_parisc_device(struct parisc_device *dev) - static int count; - - print_pa_hwpath(dev, hw_path); -- pr_info("%d. %s at 0x%px [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", -- ++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type, -+ pr_info("%d. %s at %pap [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", -+ ++count, dev->name, &(dev->hpa.start), hw_path, dev->id.hw_type, - dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); - - if (dev->num_addrs) { -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi -index e1a961f05dcd..baa0c503e741 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi -@@ -63,6 +63,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe1000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy0: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi -index c288f3c6c637..93095600e808 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi -@@ -60,6 +60,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xf1000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy6: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi -index 94f3e7175012..ff4bd38f0645 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi -@@ -63,6 +63,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe3000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy1: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi -index 94a76982d214..1fa38ed6f59e 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi -@@ -60,6 +60,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xf3000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy7: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi -index b5ff5f71c6b8..a8cc9780c0c4 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi -@@ -59,6 +59,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe1000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy0: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi -index ee44182c6348..8b8bd70c9382 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi -@@ -59,6 +59,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe3000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy1: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi -index f05f0d775039..619c880b54d8 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi -@@ -59,6 +59,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe5000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy2: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi -index a9114ec51075..d7ebb73a400d 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi -@@ -59,6 +59,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe7000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy3: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi -index 44dd00ac7367..b151d696a069 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi -@@ -59,6 +59,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe9000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy4: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi -index 5b1b84b58602..adc0ae0013a3 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi -@@ -59,6 +59,7 @@ fman@400000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xeb000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy5: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi -index 0e1daaef9e74..435047e0e250 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi -@@ -60,6 +60,7 @@ fman@500000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xf1000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy14: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi -index 68c5ef779266..c098657cca0a 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi -@@ -60,6 +60,7 @@ fman@500000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xf3000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy15: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi -index 605363cc1117..9d06824815f3 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi -@@ -59,6 +59,7 @@ fman@500000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe1000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy8: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi -index 1955dfa13634..70e947730c4b 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi -@@ -59,6 +59,7 @@ fman@500000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe3000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy9: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi -index 2c1476454ee0..ad96e6529595 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi -@@ -59,6 +59,7 @@ fman@500000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe5000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy10: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi -index b8b541ff5fb0..034bc4b71f7a 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi -@@ -59,6 +59,7 @@ fman@500000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe7000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy11: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi -index 4b2cfddd1b15..93ca23d82b39 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi -@@ -59,6 +59,7 @@ fman@500000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xe9000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy12: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi -index 0a52ddf7cc17..23b3117a2fd2 100644 ---- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi -+++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi -@@ -59,6 +59,7 @@ fman@500000 { - #size-cells = <0>; - compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; - reg = <0xeb000 0x1000>; -+ fsl,erratum-a011043; /* must ignore read errors */ - - pcsphy13: ethernet-phy@0 { - reg = <0x0>; -diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile -index 49a5852fd07d..33b16f4212f7 100644 ---- a/arch/riscv/kernel/vdso/Makefile -+++ b/arch/riscv/kernel/vdso/Makefile -@@ -58,7 +58,8 @@ quiet_cmd_vdsold = VDSOLD $@ - cmd_vdsold = $(CC) $(KBUILD_CFLAGS) $(call cc-option, -no-pie) -nostdlib -nostartfiles $(SYSCFLAGS_$(@F)) \ - -Wl,-T,$(filter-out FORCE,$^) -o $@.tmp && \ - $(CROSS_COMPILE)objcopy \ -- $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ -+ $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ && \ -+ rm $@.tmp - - # install commands for the unstripped file - quiet_cmd_vdso_install = INSTALL $@ -diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c -index dbaa1b088a30..c37cb12d0ef6 100644 ---- a/arch/x86/events/intel/uncore_snb.c -+++ b/arch/x86/events/intel/uncore_snb.c -@@ -15,6 +15,7 @@ - #define PCI_DEVICE_ID_INTEL_SKL_HQ_IMC 0x1910 - #define PCI_DEVICE_ID_INTEL_SKL_SD_IMC 0x190f - #define PCI_DEVICE_ID_INTEL_SKL_SQ_IMC 0x191f -+#define PCI_DEVICE_ID_INTEL_SKL_E3_IMC 0x1918 - #define PCI_DEVICE_ID_INTEL_KBL_Y_IMC 0x590c - #define PCI_DEVICE_ID_INTEL_KBL_U_IMC 0x5904 - #define PCI_DEVICE_ID_INTEL_KBL_UQ_IMC 0x5914 -@@ -657,6 +658,10 @@ static const struct pci_device_id skl_uncore_pci_ids[] = { - PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_SQ_IMC), - .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), - }, -+ { /* IMC */ -+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_E3_IMC), -+ .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), -+ }, - { /* IMC */ - PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KBL_Y_IMC), - .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), -@@ -826,6 +831,7 @@ static const struct imc_uncore_pci_dev desktop_imc_pci_ids[] = { - IMC_DEV(SKL_HQ_IMC, &skl_uncore_pci_driver), /* 6th Gen Core H Quad Core */ - IMC_DEV(SKL_SD_IMC, &skl_uncore_pci_driver), /* 6th Gen Core S Dual Core */ - IMC_DEV(SKL_SQ_IMC, &skl_uncore_pci_driver), /* 6th Gen Core S Quad Core */ -+ IMC_DEV(SKL_E3_IMC, &skl_uncore_pci_driver), /* Xeon E3 V5 Gen Core processor */ - IMC_DEV(KBL_Y_IMC, &skl_uncore_pci_driver), /* 7th Gen Core Y */ - IMC_DEV(KBL_U_IMC, &skl_uncore_pci_driver), /* 7th Gen Core U */ - IMC_DEV(KBL_UQ_IMC, &skl_uncore_pci_driver), /* 7th Gen Core U Quad Core */ -diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c -index 011644802ce7..ad20220af303 100644 ---- a/arch/x86/events/intel/uncore_snbep.c -+++ b/arch/x86/events/intel/uncore_snbep.c -@@ -369,11 +369,6 @@ - #define SNR_M2M_PCI_PMON_BOX_CTL 0x438 - #define SNR_M2M_PCI_PMON_UMASK_EXT 0xff - --/* SNR PCIE3 */ --#define SNR_PCIE3_PCI_PMON_CTL0 0x508 --#define SNR_PCIE3_PCI_PMON_CTR0 0x4e8 --#define SNR_PCIE3_PCI_PMON_BOX_CTL 0x4e4 -- - /* SNR IMC */ - #define SNR_IMC_MMIO_PMON_FIXED_CTL 0x54 - #define SNR_IMC_MMIO_PMON_FIXED_CTR 0x38 -@@ -4328,27 +4323,12 @@ static struct intel_uncore_type snr_uncore_m2m = { - .format_group = &snr_m2m_uncore_format_group, - }; - --static struct intel_uncore_type snr_uncore_pcie3 = { -- .name = "pcie3", -- .num_counters = 4, -- .num_boxes = 1, -- .perf_ctr_bits = 48, -- .perf_ctr = SNR_PCIE3_PCI_PMON_CTR0, -- .event_ctl = SNR_PCIE3_PCI_PMON_CTL0, -- .event_mask = SNBEP_PMON_RAW_EVENT_MASK, -- .box_ctl = SNR_PCIE3_PCI_PMON_BOX_CTL, -- .ops = &ivbep_uncore_pci_ops, -- .format_group = &ivbep_uncore_format_group, --}; -- - enum { - SNR_PCI_UNCORE_M2M, -- SNR_PCI_UNCORE_PCIE3, - }; - - static struct intel_uncore_type *snr_pci_uncores[] = { - [SNR_PCI_UNCORE_M2M] = &snr_uncore_m2m, -- [SNR_PCI_UNCORE_PCIE3] = &snr_uncore_pcie3, - NULL, - }; - -@@ -4357,10 +4337,6 @@ static const struct pci_device_id snr_uncore_pci_ids[] = { - PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a), - .driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 0, SNR_PCI_UNCORE_M2M, 0), - }, -- { /* PCIe3 */ -- PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x334a), -- .driver_data = UNCORE_PCI_DEV_FULL_DATA(4, 0, SNR_PCI_UNCORE_PCIE3, 0), -- }, - { /* end: all zeroes */ } - }; - -diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c -index dac7209a0708..954fd048ad9b 100644 ---- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c -+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c -@@ -1970,7 +1970,7 @@ static int rdt_get_tree(struct fs_context *fc) - - if (rdt_mon_capable) { - ret = mongroup_create_dir(rdtgroup_default.kn, -- NULL, "mon_groups", -+ &rdtgroup_default, "mon_groups", - &kn_mongrp); - if (ret < 0) - goto out_info; -@@ -2205,7 +2205,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp) - list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) { - free_rmid(sentry->mon.rmid); - list_del(&sentry->mon.crdtgrp_list); -- kfree(sentry); -+ -+ if (atomic_read(&sentry->waitcount) != 0) -+ sentry->flags = RDT_DELETED; -+ else -+ kfree(sentry); - } - } - -@@ -2243,7 +2247,11 @@ static void rmdir_all_sub(void) - - kernfs_remove(rdtgrp->kn); - list_del(&rdtgrp->rdtgroup_list); -- kfree(rdtgrp); -+ -+ if (atomic_read(&rdtgrp->waitcount) != 0) -+ rdtgrp->flags = RDT_DELETED; -+ else -+ kfree(rdtgrp); - } - /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */ - update_closid_rmid(cpu_online_mask, &rdtgroup_default); -@@ -2446,7 +2454,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn, - /* - * Create the mon_data directory first. - */ -- ret = mongroup_create_dir(parent_kn, NULL, "mon_data", &kn); -+ ret = mongroup_create_dir(parent_kn, prgrp, "mon_data", &kn); - if (ret) - return ret; - -@@ -2645,7 +2653,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, - uint files = 0; - int ret; - -- prdtgrp = rdtgroup_kn_lock_live(prgrp_kn); -+ prdtgrp = rdtgroup_kn_lock_live(parent_kn); - if (!prdtgrp) { - ret = -ENODEV; - goto out_unlock; -@@ -2718,7 +2726,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, - kernfs_activate(kn); - - /* -- * The caller unlocks the prgrp_kn upon success. -+ * The caller unlocks the parent_kn upon success. - */ - return 0; - -@@ -2729,7 +2737,7 @@ out_destroy: - out_free_rgrp: - kfree(rdtgrp); - out_unlock: -- rdtgroup_kn_unlock(prgrp_kn); -+ rdtgroup_kn_unlock(parent_kn); - return ret; - } - -@@ -2767,7 +2775,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn, - */ - list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list); - -- rdtgroup_kn_unlock(prgrp_kn); -+ rdtgroup_kn_unlock(parent_kn); - return ret; - } - -@@ -2810,7 +2818,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, - * Create an empty mon_groups directory to hold the subset - * of tasks and cpus to monitor. - */ -- ret = mongroup_create_dir(kn, NULL, "mon_groups", NULL); -+ ret = mongroup_create_dir(kn, rdtgrp, "mon_groups", NULL); - if (ret) { - rdt_last_cmd_puts("kernfs subdir error\n"); - goto out_del_list; -@@ -2826,7 +2834,7 @@ out_id_free: - out_common_fail: - mkdir_rdt_prepare_clean(rdtgrp); - out_unlock: -- rdtgroup_kn_unlock(prgrp_kn); -+ rdtgroup_kn_unlock(parent_kn); - return ret; - } - -@@ -2952,13 +2960,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp, - closid_free(rdtgrp->closid); - free_rmid(rdtgrp->mon.rmid); - -+ rdtgroup_ctrl_remove(kn, rdtgrp); -+ - /* - * Free all the child monitor group rmids. - */ - free_all_child_rdtgrp(rdtgrp); - -- rdtgroup_ctrl_remove(kn, rdtgrp); -- - return 0; - } - -diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c -index 4f24e46ebe7c..56db949a7b70 100644 ---- a/drivers/char/ttyprintk.c -+++ b/drivers/char/ttyprintk.c -@@ -15,10 +15,11 @@ - #include - #include - #include -+#include - - struct ttyprintk_port { - struct tty_port port; -- struct mutex port_write_mutex; -+ spinlock_t spinlock; - }; - - static struct ttyprintk_port tpk_port; -@@ -99,11 +100,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp) - static void tpk_close(struct tty_struct *tty, struct file *filp) - { - struct ttyprintk_port *tpkp = tty->driver_data; -+ unsigned long flags; - -- mutex_lock(&tpkp->port_write_mutex); -+ spin_lock_irqsave(&tpkp->spinlock, flags); - /* flush tpk_printk buffer */ - tpk_printk(NULL, 0); -- mutex_unlock(&tpkp->port_write_mutex); -+ spin_unlock_irqrestore(&tpkp->spinlock, flags); - - tty_port_close(&tpkp->port, tty, filp); - } -@@ -115,13 +117,14 @@ static int tpk_write(struct tty_struct *tty, - const unsigned char *buf, int count) - { - struct ttyprintk_port *tpkp = tty->driver_data; -+ unsigned long flags; - int ret; - - - /* exclusive use of tpk_printk within this tty */ -- mutex_lock(&tpkp->port_write_mutex); -+ spin_lock_irqsave(&tpkp->spinlock, flags); - ret = tpk_printk(buf, count); -- mutex_unlock(&tpkp->port_write_mutex); -+ spin_unlock_irqrestore(&tpkp->spinlock, flags); - - return ret; - } -@@ -171,7 +174,7 @@ static int __init ttyprintk_init(void) - { - int ret = -ENOMEM; - -- mutex_init(&tpk_port.port_write_mutex); -+ spin_lock_init(&tpk_port.spinlock); - - ttyprintk_driver = tty_alloc_driver(1, - TTY_DRIVER_RESET_TERMIOS | -diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c -index a60a1be937ad..b4a95cbbda98 100644 ---- a/drivers/clk/mmp/clk-of-mmp2.c -+++ b/drivers/clk/mmp/clk-of-mmp2.c -@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock); - static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; - - static DEFINE_SPINLOCK(timer_lock); --static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"}; -+static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; - - static DEFINE_SPINLOCK(reset_lock); - -diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c -index 45a1ed3fe674..ab194143e06c 100644 ---- a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c -+++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c -@@ -23,9 +23,9 @@ - */ - - static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k", -- "pll-periph0", "iosc" }; -+ "iosc", "pll-periph0" }; - static const struct ccu_mux_var_prediv ar100_r_apb2_predivs[] = { -- { .index = 2, .shift = 0, .width = 5 }, -+ { .index = 3, .shift = 0, .width = 5 }, - }; - - static struct ccu_div ar100_clk = { -diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.c b/drivers/clk/sunxi-ng/ccu-sun8i-r.c -index 4646fdc61053..4c8c491b87c2 100644 ---- a/drivers/clk/sunxi-ng/ccu-sun8i-r.c -+++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.c -@@ -51,19 +51,7 @@ static struct ccu_div ar100_clk = { - - static CLK_FIXED_FACTOR_HW(ahb0_clk, "ahb0", &ar100_clk.common.hw, 1, 1, 0); - --static struct ccu_div apb0_clk = { -- .div = _SUNXI_CCU_DIV_FLAGS(0, 2, CLK_DIVIDER_POWER_OF_TWO), -- -- .common = { -- .reg = 0x0c, -- .hw.init = CLK_HW_INIT_HW("apb0", -- &ahb0_clk.hw, -- &ccu_div_ops, -- 0), -- }, --}; -- --static SUNXI_CCU_M(a83t_apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0); -+static SUNXI_CCU_M(apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0); - - /* - * Define the parent as an array that can be reused to save space -@@ -127,7 +115,7 @@ static struct ccu_mp a83t_ir_clk = { - - static struct ccu_common *sun8i_a83t_r_ccu_clks[] = { - &ar100_clk.common, -- &a83t_apb0_clk.common, -+ &apb0_clk.common, - &apb0_pio_clk.common, - &apb0_ir_clk.common, - &apb0_timer_clk.common, -@@ -167,7 +155,7 @@ static struct clk_hw_onecell_data sun8i_a83t_r_hw_clks = { - .hws = { - [CLK_AR100] = &ar100_clk.common.hw, - [CLK_AHB0] = &ahb0_clk.hw, -- [CLK_APB0] = &a83t_apb0_clk.common.hw, -+ [CLK_APB0] = &apb0_clk.common.hw, - [CLK_APB0_PIO] = &apb0_pio_clk.common.hw, - [CLK_APB0_IR] = &apb0_ir_clk.common.hw, - [CLK_APB0_TIMER] = &apb0_timer_clk.common.hw, -@@ -282,9 +270,6 @@ static void __init sunxi_r_ccu_init(struct device_node *node, - - static void __init sun8i_a83t_r_ccu_setup(struct device_node *node) - { -- /* Fix apb0 bus gate parents here */ -- apb0_gate_parent[0] = &a83t_apb0_clk.common.hw; -- - sunxi_r_ccu_init(node, &sun8i_a83t_r_ccu_desc); - } - CLK_OF_DECLARE(sun8i_a83t_r_ccu, "allwinner,sun8i-a83t-r-ccu", -diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c -index 5c779eec454b..0e36ca3bf3d5 100644 ---- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c -+++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c -@@ -618,7 +618,7 @@ static struct clk_hw_onecell_data sun8i_v3s_hw_clks = { - [CLK_MBUS] = &mbus_clk.common.hw, - [CLK_MIPI_CSI] = &mipi_csi_clk.common.hw, - }, -- .num = CLK_NUMBER, -+ .num = CLK_PLL_DDR1 + 1, - }; - - static struct clk_hw_onecell_data sun8i_v3_hw_clks = { -@@ -700,7 +700,7 @@ static struct clk_hw_onecell_data sun8i_v3_hw_clks = { - [CLK_MBUS] = &mbus_clk.common.hw, - [CLK_MIPI_CSI] = &mipi_csi_clk.common.hw, - }, -- .num = CLK_NUMBER, -+ .num = CLK_I2S0 + 1, - }; - - static struct ccu_reset_map sun8i_v3s_ccu_resets[] = { -diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h -index b0160d305a67..108eeeedcbf7 100644 ---- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h -+++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h -@@ -51,6 +51,4 @@ - - #define CLK_PLL_DDR1 74 - --#define CLK_NUMBER (CLK_I2S0 + 1) -- - #endif /* _CCU_SUN8I_H3_H_ */ -diff --git a/drivers/cpuidle/governors/teo.c b/drivers/cpuidle/governors/teo.c -index 703047434ee1..c71773c88890 100644 ---- a/drivers/cpuidle/governors/teo.c -+++ b/drivers/cpuidle/governors/teo.c -@@ -234,7 +234,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, - struct teo_cpu *cpu_data = per_cpu_ptr(&teo_cpus, dev->cpu); - int latency_req = cpuidle_governor_latency_req(dev->cpu); - unsigned int duration_us, hits, misses, early_hits; -- int max_early_idx, constraint_idx, idx, i; -+ int max_early_idx, prev_max_early_idx, constraint_idx, idx, i; - ktime_t delta_tick; - - if (dev->last_state_idx >= 0) { -@@ -251,6 +251,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, - misses = 0; - early_hits = 0; - max_early_idx = -1; -+ prev_max_early_idx = -1; - constraint_idx = drv->state_count; - idx = -1; - -@@ -303,6 +304,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, - */ - if (!(tick_nohz_tick_stopped() && - drv->states[idx].target_residency < TICK_USEC)) { -+ prev_max_early_idx = max_early_idx; - early_hits = cpu_data->states[i].early_hits; - max_early_idx = idx; - } -@@ -329,6 +331,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, - if (early_hits < cpu_data->states[i].early_hits && - !(tick_nohz_tick_stopped() && - drv->states[i].target_residency < TICK_USEC)) { -+ prev_max_early_idx = max_early_idx; - early_hits = cpu_data->states[i].early_hits; - max_early_idx = i; - } -@@ -342,9 +345,19 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, - * "early hits" metric, but if that cannot be determined, just use the - * state selected so far. - */ -- if (hits <= misses && max_early_idx >= 0) { -- idx = max_early_idx; -- duration_us = drv->states[idx].target_residency; -+ if (hits <= misses) { -+ /* -+ * The current candidate state is not suitable, so take the one -+ * whose "early hits" metric is the maximum for the range of -+ * shallower states. -+ */ -+ if (idx == max_early_idx) -+ max_early_idx = prev_max_early_idx; -+ -+ if (max_early_idx >= 0) { -+ idx = max_early_idx; -+ duration_us = drv->states[idx].target_residency; -+ } - } - - /* -diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c -index c64d20fdc187..174795ecbd3b 100644 ---- a/drivers/devfreq/devfreq.c -+++ b/drivers/devfreq/devfreq.c -@@ -1112,6 +1112,14 @@ err_out: - } - EXPORT_SYMBOL(devfreq_remove_governor); - -+static ssize_t name_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct devfreq *devfreq = to_devfreq(dev); -+ return sprintf(buf, "%s\n", dev_name(devfreq->dev.parent)); -+} -+static DEVICE_ATTR_RO(name); -+ - static ssize_t governor_show(struct device *dev, - struct device_attribute *attr, char *buf) - { -@@ -1440,6 +1448,7 @@ static ssize_t trans_stat_show(struct device *dev, - static DEVICE_ATTR_RO(trans_stat); - - static struct attribute *devfreq_attrs[] = { -+ &dev_attr_name.attr, - &dev_attr_governor.attr, - &dev_attr_available_governors.attr, - &dev_attr_cur_freq.attr, -diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c -index f918fca9ada3..cb6e3a5f509c 100644 ---- a/drivers/input/evdev.c -+++ b/drivers/input/evdev.c -@@ -484,10 +484,7 @@ static int evdev_open(struct inode *inode, struct file *file) - struct evdev_client *client; - int error; - -- client = kzalloc(struct_size(client, buffer, bufsize), -- GFP_KERNEL | __GFP_NOWARN); -- if (!client) -- client = vzalloc(struct_size(client, buffer, bufsize)); -+ client = kvzalloc(struct_size(client, buffer, bufsize), GFP_KERNEL); - if (!client) - return -ENOMEM; - -diff --git a/drivers/input/misc/max77650-onkey.c b/drivers/input/misc/max77650-onkey.c -index 4d875f2ac13d..ee55f22dbca5 100644 ---- a/drivers/input/misc/max77650-onkey.c -+++ b/drivers/input/misc/max77650-onkey.c -@@ -108,9 +108,16 @@ static int max77650_onkey_probe(struct platform_device *pdev) - return input_register_device(onkey->input); - } - -+static const struct of_device_id max77650_onkey_of_match[] = { -+ { .compatible = "maxim,max77650-onkey" }, -+ { } -+}; -+MODULE_DEVICE_TABLE(of, max77650_onkey_of_match); -+ - static struct platform_driver max77650_onkey_driver = { - .driver = { - .name = "max77650-onkey", -+ .of_match_table = max77650_onkey_of_match, - }, - .probe = max77650_onkey_probe, - }; -diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c -index 4c2d0b3c6dad..a0d4b725c917 100644 ---- a/drivers/leds/leds-max77650.c -+++ b/drivers/leds/leds-max77650.c -@@ -135,9 +135,16 @@ err_node_put: - return rv; - } - -+static const struct of_device_id max77650_led_of_match[] = { -+ { .compatible = "maxim,max77650-led" }, -+ { } -+}; -+MODULE_DEVICE_TABLE(of, max77650_led_of_match); -+ - static struct platform_driver max77650_led_driver = { - .driver = { - .name = "max77650-led", -+ .of_match_table = max77650_led_of_match, - }, - .probe = max77650_led_probe, - }; -diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c -index 1696bfd23ad1..69201bdf7f4c 100644 ---- a/drivers/md/dm-thin.c -+++ b/drivers/md/dm-thin.c -@@ -3420,10 +3420,6 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) - if (r) - goto out_flags_changed; - -- dm_pool_register_pre_commit_callback(pt->pool->pmd, -- metadata_pre_commit_callback, -- pt); -- - pt->callbacks.congested_fn = pool_is_congested; - dm_table_add_target_callbacks(ti->table, &pt->callbacks); - -@@ -3587,6 +3583,9 @@ static int pool_preresume(struct dm_target *ti) - if (r) - return r; - -+ dm_pool_register_pre_commit_callback(pool->pmd, -+ metadata_pre_commit_callback, pt); -+ - r = maybe_resize_data_dev(ti, &need_commit1); - if (r) - return r; -diff --git a/drivers/media/usb/dvb-usb/af9005.c b/drivers/media/usb/dvb-usb/af9005.c -index ac93e88d7038..89b4b5d84cdf 100644 ---- a/drivers/media/usb/dvb-usb/af9005.c -+++ b/drivers/media/usb/dvb-usb/af9005.c -@@ -554,7 +554,7 @@ static int af9005_boot_packet(struct usb_device *udev, int type, u8 *reply, - u8 *buf, int size) - { - u16 checksum; -- int act_len, i, ret; -+ int act_len = 0, i, ret; - - memset(buf, 0, size); - buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff); -diff --git a/drivers/media/usb/dvb-usb/digitv.c b/drivers/media/usb/dvb-usb/digitv.c -index dd5bb230cec1..99a39339d45d 100644 ---- a/drivers/media/usb/dvb-usb/digitv.c -+++ b/drivers/media/usb/dvb-usb/digitv.c -@@ -230,18 +230,22 @@ static struct rc_map_table rc_map_digitv_table[] = { - - static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state) - { -- int i; -+ int ret, i; - u8 key[5]; - u8 b[4] = { 0 }; - - *event = 0; - *state = REMOTE_NO_KEY_PRESSED; - -- digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4); -+ ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4); -+ if (ret) -+ return ret; - - /* Tell the device we've read the remote. Not sure how necessary - this is, but the Nebula SDK does it. */ -- digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0); -+ ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0); -+ if (ret) -+ return ret; - - /* if something is inside the buffer, simulate key press */ - if (key[1] != 0) -diff --git a/drivers/media/usb/dvb-usb/dvb-usb-urb.c b/drivers/media/usb/dvb-usb/dvb-usb-urb.c -index c1b4e94a37f8..2aabf90d8697 100644 ---- a/drivers/media/usb/dvb-usb/dvb-usb-urb.c -+++ b/drivers/media/usb/dvb-usb/dvb-usb-urb.c -@@ -12,7 +12,7 @@ - int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, - u16 rlen, int delay_ms) - { -- int actlen,ret = -ENOMEM; -+ int actlen = 0, ret = -ENOMEM; - - if (!d || wbuf == NULL || wlen == 0) - return -EINVAL; -diff --git a/drivers/media/usb/dvb-usb/vp7045.c b/drivers/media/usb/dvb-usb/vp7045.c -index 80c1cf05384b..2baf57216d19 100644 ---- a/drivers/media/usb/dvb-usb/vp7045.c -+++ b/drivers/media/usb/dvb-usb/vp7045.c -@@ -96,10 +96,14 @@ static int vp7045_power_ctrl(struct dvb_usb_device *d, int onoff) - - static int vp7045_rc_query(struct dvb_usb_device *d) - { -+ int ret; - u8 key; -- vp7045_usb_op(d,RC_VAL_READ,NULL,0,&key,1,20); - -- deb_rc("remote query key: %x %d\n",key,key); -+ ret = vp7045_usb_op(d, RC_VAL_READ, NULL, 0, &key, 1, 20); -+ if (ret) -+ return ret; -+ -+ deb_rc("remote query key: %x\n", key); - - if (key != 0x44) { - /* -@@ -115,15 +119,18 @@ static int vp7045_rc_query(struct dvb_usb_device *d) - - static int vp7045_read_eeprom(struct dvb_usb_device *d,u8 *buf, int len, int offset) - { -- int i = 0; -- u8 v,br[2]; -+ int i, ret; -+ u8 v, br[2]; - for (i=0; i < len; i++) { - v = offset + i; -- vp7045_usb_op(d,GET_EE_VALUE,&v,1,br,2,5); -+ ret = vp7045_usb_op(d, GET_EE_VALUE, &v, 1, br, 2, 5); -+ if (ret) -+ return ret; -+ - buf[i] = br[1]; - } -- deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ",offset, i); -- debug_dump(buf,i,deb_info); -+ deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ", offset, i); -+ debug_dump(buf, i, deb_info); - return 0; - } - -diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c -index 4add2b12d330..c1b307bbe540 100644 ---- a/drivers/media/usb/gspca/gspca.c -+++ b/drivers/media/usb/gspca/gspca.c -@@ -1461,7 +1461,7 @@ int gspca_dev_probe2(struct usb_interface *intf, - pr_err("couldn't kzalloc gspca struct\n"); - return -ENOMEM; - } -- gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); -+ gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL); - if (!gspca_dev->usb_buf) { - pr_err("out of memory\n"); - ret = -ENOMEM; -diff --git a/drivers/misc/lkdtm/bugs.c b/drivers/misc/lkdtm/bugs.c -index 7284a22b1a09..4d5a512769e9 100644 ---- a/drivers/misc/lkdtm/bugs.c -+++ b/drivers/misc/lkdtm/bugs.c -@@ -274,7 +274,7 @@ void lkdtm_STACK_GUARD_PAGE_TRAILING(void) - - void lkdtm_UNSET_SMEP(void) - { --#ifdef CONFIG_X86_64 -+#if IS_ENABLED(CONFIG_X86_64) && !IS_ENABLED(CONFIG_UML) - #define MOV_CR4_DEPTH 64 - void (*direct_write_cr4)(unsigned long val); - unsigned char *insn; -diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c -index fb8ade9a05a9..2ce96cc1bad4 100644 ---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c -+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c -@@ -70,8 +70,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos) - static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos) - { - v = seq_tab_get_idx(seq->private, *pos + 1); -- if (v) -- ++*pos; -+ ++(*pos); - return v; - } - -diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c -index 1a407d3c1d67..e6fe2870137b 100644 ---- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c -+++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c -@@ -682,8 +682,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos) - static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos) - { - v = l2t_get_idx(seq, *pos); -- if (v) -- ++*pos; -+ ++(*pos); - return v; - } - -diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c -index 41c6fa200e74..e1901874c19f 100644 ---- a/drivers/net/ethernet/freescale/fman/fman_memac.c -+++ b/drivers/net/ethernet/freescale/fman/fman_memac.c -@@ -110,7 +110,7 @@ do { \ - /* Interface Mode Register (IF_MODE) */ - - #define IF_MODE_MASK 0x00000003 /* 30-31 Mask on i/f mode bits */ --#define IF_MODE_XGMII 0x00000000 /* 30-31 XGMII (10G) interface */ -+#define IF_MODE_10G 0x00000000 /* 30-31 10G interface */ - #define IF_MODE_GMII 0x00000002 /* 30-31 GMII (1G) interface */ - #define IF_MODE_RGMII 0x00000004 - #define IF_MODE_RGMII_AUTO 0x00008000 -@@ -440,7 +440,7 @@ static int init(struct memac_regs __iomem *regs, struct memac_cfg *cfg, - tmp = 0; - switch (phy_if) { - case PHY_INTERFACE_MODE_XGMII: -- tmp |= IF_MODE_XGMII; -+ tmp |= IF_MODE_10G; - break; - default: - tmp |= IF_MODE_GMII; -diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c b/drivers/net/ethernet/freescale/xgmac_mdio.c -index e03b30c60dcf..c82c85ef5fb3 100644 ---- a/drivers/net/ethernet/freescale/xgmac_mdio.c -+++ b/drivers/net/ethernet/freescale/xgmac_mdio.c -@@ -49,6 +49,7 @@ struct tgec_mdio_controller { - struct mdio_fsl_priv { - struct tgec_mdio_controller __iomem *mdio_base; - bool is_little_endian; -+ bool has_a011043; - }; - - static u32 xgmac_read32(void __iomem *regs, -@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) - return ret; - - /* Return all Fs if nothing was there */ -- if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) { -+ if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && -+ !priv->has_a011043) { - dev_err(&bus->dev, - "Error while reading PHY%d reg at %d.%hhu\n", - phy_id, dev_addr, regnum); -@@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) - priv->is_little_endian = of_property_read_bool(pdev->dev.of_node, - "little-endian"); - -+ priv->has_a011043 = of_property_read_bool(pdev->dev.of_node, -+ "fsl,erratum-a011043"); -+ - ret = of_mdiobus_register(bus, np); - if (ret) { - dev_err(&pdev->dev, "cannot register MDIO bus\n"); -diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h -index 6c51b1bad8c4..37a2314d3e6b 100644 ---- a/drivers/net/ethernet/intel/e1000e/e1000.h -+++ b/drivers/net/ethernet/intel/e1000e/e1000.h -@@ -185,13 +185,12 @@ struct e1000_phy_regs { - - /* board specific private data structure */ - struct e1000_adapter { -+ struct timer_list watchdog_timer; - struct timer_list phy_info_timer; - struct timer_list blink_timer; - - struct work_struct reset_task; -- struct delayed_work watchdog_task; -- -- struct workqueue_struct *e1000_workqueue; -+ struct work_struct watchdog_task; - - const struct e1000_info *ei; - -diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c -index d7d56e42a6aa..c27ed7363768 100644 ---- a/drivers/net/ethernet/intel/e1000e/netdev.c -+++ b/drivers/net/ethernet/intel/e1000e/netdev.c -@@ -1780,8 +1780,7 @@ static irqreturn_t e1000_intr_msi(int __always_unused irq, void *data) - } - /* guard against interrupt when we're going down */ - if (!test_bit(__E1000_DOWN, &adapter->state)) -- mod_delayed_work(adapter->e1000_workqueue, -- &adapter->watchdog_task, HZ); -+ mod_timer(&adapter->watchdog_timer, jiffies + 1); - } - - /* Reset on uncorrectable ECC error */ -@@ -1861,8 +1860,7 @@ static irqreturn_t e1000_intr(int __always_unused irq, void *data) - } - /* guard against interrupt when we're going down */ - if (!test_bit(__E1000_DOWN, &adapter->state)) -- mod_delayed_work(adapter->e1000_workqueue, -- &adapter->watchdog_task, HZ); -+ mod_timer(&adapter->watchdog_timer, jiffies + 1); - } - - /* Reset on uncorrectable ECC error */ -@@ -1907,8 +1905,7 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data) - hw->mac.get_link_status = true; - /* guard against interrupt when we're going down */ - if (!test_bit(__E1000_DOWN, &adapter->state)) -- mod_delayed_work(adapter->e1000_workqueue, -- &adapter->watchdog_task, HZ); -+ mod_timer(&adapter->watchdog_timer, jiffies + 1); - } - - if (!test_bit(__E1000_DOWN, &adapter->state)) -@@ -4281,6 +4278,7 @@ void e1000e_down(struct e1000_adapter *adapter, bool reset) - - napi_synchronize(&adapter->napi); - -+ del_timer_sync(&adapter->watchdog_timer); - del_timer_sync(&adapter->phy_info_timer); - - spin_lock(&adapter->stats64_lock); -@@ -5152,11 +5150,25 @@ static void e1000e_check_82574_phy_workaround(struct e1000_adapter *adapter) - } - } - -+/** -+ * e1000_watchdog - Timer Call-back -+ * @data: pointer to adapter cast into an unsigned long -+ **/ -+static void e1000_watchdog(struct timer_list *t) -+{ -+ struct e1000_adapter *adapter = from_timer(adapter, t, watchdog_timer); -+ -+ /* Do the rest outside of interrupt context */ -+ schedule_work(&adapter->watchdog_task); -+ -+ /* TODO: make this use queue_delayed_work() */ -+} -+ - static void e1000_watchdog_task(struct work_struct *work) - { - struct e1000_adapter *adapter = container_of(work, - struct e1000_adapter, -- watchdog_task.work); -+ watchdog_task); - struct net_device *netdev = adapter->netdev; - struct e1000_mac_info *mac = &adapter->hw.mac; - struct e1000_phy_info *phy = &adapter->hw.phy; -@@ -5404,9 +5416,8 @@ link_up: - - /* Reset the timer */ - if (!test_bit(__E1000_DOWN, &adapter->state)) -- queue_delayed_work(adapter->e1000_workqueue, -- &adapter->watchdog_task, -- round_jiffies(2 * HZ)); -+ mod_timer(&adapter->watchdog_timer, -+ round_jiffies(jiffies + 2 * HZ)); - } - - #define E1000_TX_FLAGS_CSUM 0x00000001 -@@ -7259,21 +7270,11 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) - goto err_eeprom; - } - -- adapter->e1000_workqueue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, -- e1000e_driver_name); -- -- if (!adapter->e1000_workqueue) { -- err = -ENOMEM; -- goto err_workqueue; -- } -- -- INIT_DELAYED_WORK(&adapter->watchdog_task, e1000_watchdog_task); -- queue_delayed_work(adapter->e1000_workqueue, &adapter->watchdog_task, -- 0); -- -+ timer_setup(&adapter->watchdog_timer, e1000_watchdog, 0); - timer_setup(&adapter->phy_info_timer, e1000_update_phy_info, 0); - - INIT_WORK(&adapter->reset_task, e1000_reset_task); -+ INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); - INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround); - INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task); - INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang); -@@ -7367,9 +7368,6 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) - return 0; - - err_register: -- flush_workqueue(adapter->e1000_workqueue); -- destroy_workqueue(adapter->e1000_workqueue); --err_workqueue: - if (!(adapter->flags & FLAG_HAS_AMT)) - e1000e_release_hw_control(adapter); - err_eeprom: -@@ -7407,26 +7405,22 @@ static void e1000_remove(struct pci_dev *pdev) - { - struct net_device *netdev = pci_get_drvdata(pdev); - struct e1000_adapter *adapter = netdev_priv(netdev); -- bool down = test_bit(__E1000_DOWN, &adapter->state); - - e1000e_ptp_remove(adapter); - - /* The timers may be rescheduled, so explicitly disable them - * from being rescheduled. - */ -- if (!down) -- set_bit(__E1000_DOWN, &adapter->state); -+ set_bit(__E1000_DOWN, &adapter->state); -+ del_timer_sync(&adapter->watchdog_timer); - del_timer_sync(&adapter->phy_info_timer); - - cancel_work_sync(&adapter->reset_task); -+ cancel_work_sync(&adapter->watchdog_task); - cancel_work_sync(&adapter->downshift_task); - cancel_work_sync(&adapter->update_phy_task); - cancel_work_sync(&adapter->print_hang_task); - -- cancel_delayed_work(&adapter->watchdog_task); -- flush_workqueue(adapter->e1000_workqueue); -- destroy_workqueue(adapter->e1000_workqueue); -- - if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) { - cancel_work_sync(&adapter->tx_hwtstamp_work); - if (adapter->tx_hwtstamp_skb) { -@@ -7435,9 +7429,6 @@ static void e1000_remove(struct pci_dev *pdev) - } - } - -- /* Don't lie to e1000_close() down the road. */ -- if (!down) -- clear_bit(__E1000_DOWN, &adapter->state); - unregister_netdev(netdev); - - if (pci_dev_run_wake(pdev)) -diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c -index 3d2440838822..3515ace0f020 100644 ---- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c -+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c -@@ -2322,6 +2322,22 @@ static int i40e_ctrl_vf_rx_rings(struct i40e_vsi *vsi, unsigned long q_map, - return ret; - } - -+/** -+ * i40e_vc_validate_vqs_bitmaps - validate Rx/Tx queue bitmaps from VIRTHCHNL -+ * @vqs: virtchnl_queue_select structure containing bitmaps to validate -+ * -+ * Returns true if validation was successful, else false. -+ */ -+static bool i40e_vc_validate_vqs_bitmaps(struct virtchnl_queue_select *vqs) -+{ -+ if ((!vqs->rx_queues && !vqs->tx_queues) || -+ vqs->rx_queues >= BIT(I40E_MAX_VF_QUEUES) || -+ vqs->tx_queues >= BIT(I40E_MAX_VF_QUEUES)) -+ return false; -+ -+ return true; -+} -+ - /** - * i40e_vc_enable_queues_msg - * @vf: pointer to the VF info -@@ -2347,7 +2363,7 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg) - goto error_param; - } - -- if ((0 == vqs->rx_queues) && (0 == vqs->tx_queues)) { -+ if (i40e_vc_validate_vqs_bitmaps(vqs)) { - aq_ret = I40E_ERR_PARAM; - goto error_param; - } -@@ -2409,9 +2425,7 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf *vf, u8 *msg) - goto error_param; - } - -- if ((vqs->rx_queues == 0 && vqs->tx_queues == 0) || -- vqs->rx_queues > I40E_MAX_VF_QUEUES || -- vqs->tx_queues > I40E_MAX_VF_QUEUES) { -+ if (i40e_vc_validate_vqs_bitmaps(vqs)) { - aq_ret = I40E_ERR_PARAM; - goto error_param; - } -diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h -index 29de3ae96ef2..bd1b1ed323f4 100644 ---- a/drivers/net/ethernet/intel/iavf/iavf.h -+++ b/drivers/net/ethernet/intel/iavf/iavf.h -@@ -415,4 +415,6 @@ void iavf_enable_channels(struct iavf_adapter *adapter); - void iavf_disable_channels(struct iavf_adapter *adapter); - void iavf_add_cloud_filter(struct iavf_adapter *adapter); - void iavf_del_cloud_filter(struct iavf_adapter *adapter); -+struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, -+ const u8 *macaddr); - #endif /* _IAVF_H_ */ -diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c -index 821987da5698..8e16be960e96 100644 ---- a/drivers/net/ethernet/intel/iavf/iavf_main.c -+++ b/drivers/net/ethernet/intel/iavf/iavf_main.c -@@ -743,9 +743,8 @@ iavf_mac_filter *iavf_find_filter(struct iavf_adapter *adapter, - * - * Returns ptr to the filter object or NULL when no memory available. - **/ --static struct --iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, -- const u8 *macaddr) -+struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, -+ const u8 *macaddr) - { - struct iavf_mac_filter *f; - -@@ -2065,9 +2064,9 @@ static void iavf_reset_task(struct work_struct *work) - struct virtchnl_vf_resource *vfres = adapter->vf_res; - struct net_device *netdev = adapter->netdev; - struct iavf_hw *hw = &adapter->hw; -+ struct iavf_mac_filter *f, *ftmp; - struct iavf_vlan_filter *vlf; - struct iavf_cloud_filter *cf; -- struct iavf_mac_filter *f; - u32 reg_val; - int i = 0, err; - bool running; -@@ -2181,6 +2180,16 @@ continue_reset: - - spin_lock_bh(&adapter->mac_vlan_list_lock); - -+ /* Delete filter for the current MAC address, it could have -+ * been changed by the PF via administratively set MAC. -+ * Will be re-added via VIRTCHNL_OP_GET_VF_RESOURCES. -+ */ -+ list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) { -+ if (ether_addr_equal(f->macaddr, adapter->hw.mac.addr)) { -+ list_del(&f->list); -+ kfree(f); -+ } -+ } - /* re-add all MAC filters */ - list_for_each_entry(f, &adapter->mac_filter_list, list) { - f->add = true; -diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c -index c46770eba320..1ab9cb339acb 100644 ---- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c -+++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c -@@ -1359,6 +1359,9 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, - ether_addr_copy(netdev->perm_addr, - adapter->hw.mac.addr); - } -+ spin_lock_bh(&adapter->mac_vlan_list_lock); -+ iavf_add_filter(adapter, adapter->hw.mac.addr); -+ spin_unlock_bh(&adapter->mac_vlan_list_lock); - iavf_process_config(adapter); - } - break; -diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c -index 8a6ef3514129..438b42ce2cd9 100644 ---- a/drivers/net/ethernet/intel/igb/e1000_82575.c -+++ b/drivers/net/ethernet/intel/igb/e1000_82575.c -@@ -530,7 +530,7 @@ static s32 igb_set_sfp_media_type_82575(struct e1000_hw *hw) - dev_spec->module_plugged = true; - if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) { - hw->phy.media_type = e1000_media_type_internal_serdes; -- } else if (eth_flags->e100_base_fx) { -+ } else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { - dev_spec->sgmii_active = true; - hw->phy.media_type = e1000_media_type_internal_serdes; - } else if (eth_flags->e1000_base_t) { -@@ -657,14 +657,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw) - break; - } - -- /* do not change link mode for 100BaseFX */ -- if (dev_spec->eth_flags.e100_base_fx) -- break; -- - /* change current link mode setting */ - ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK; - -- if (hw->phy.media_type == e1000_media_type_copper) -+ if (dev_spec->sgmii_active) - ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII; - else - ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES; -diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c -index 3182b059bf55..8959418776f6 100644 ---- a/drivers/net/ethernet/intel/igb/igb_ethtool.c -+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c -@@ -181,7 +181,7 @@ static int igb_get_link_ksettings(struct net_device *netdev, - advertising &= ~ADVERTISED_1000baseKX_Full; - } - } -- if (eth_flags->e100_base_fx) { -+ if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { - supported |= SUPPORTED_100baseT_Full; - advertising |= ADVERTISED_100baseT_Full; - } -diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -index c6404abf2dd1..a26f9fb95ac0 100644 ---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -@@ -5239,7 +5239,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) - struct ixgbe_hw *hw = &adapter->hw; - struct hlist_node *node2; - struct ixgbe_fdir_filter *filter; -- u64 action; -+ u8 queue; - - spin_lock(&adapter->fdir_perfect_lock); - -@@ -5248,17 +5248,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) - - hlist_for_each_entry_safe(filter, node2, - &adapter->fdir_filter_list, fdir_node) { -- action = filter->action; -- if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) -- action = -- (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; -+ if (filter->action == IXGBE_FDIR_DROP_QUEUE) { -+ queue = IXGBE_FDIR_DROP_QUEUE; -+ } else { -+ u32 ring = ethtool_get_flow_spec_ring(filter->action); -+ u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); -+ -+ if (!vf && (ring >= adapter->num_rx_queues)) { -+ e_err(drv, "FDIR restore failed without VF, ring: %u\n", -+ ring); -+ continue; -+ } else if (vf && -+ ((vf > adapter->num_vfs) || -+ ring >= adapter->num_rx_queues_per_pool)) { -+ e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", -+ vf, ring); -+ continue; -+ } -+ -+ /* Map the ring onto the absolute queue index */ -+ if (!vf) -+ queue = adapter->rx_ring[ring]->reg_idx; -+ else -+ queue = ((vf - 1) * -+ adapter->num_rx_queues_per_pool) + ring; -+ } - - ixgbe_fdir_write_perfect_filter_82599(hw, -- &filter->filter, -- filter->sw_idx, -- (action == IXGBE_FDIR_DROP_QUEUE) ? -- IXGBE_FDIR_DROP_QUEUE : -- adapter->rx_ring[action]->reg_idx); -+ &filter->filter, filter->sw_idx, queue); - } - - spin_unlock(&adapter->fdir_perfect_lock); -diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c -index 076f2da36f27..64ec0e7c64b4 100644 ---- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c -+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c -@@ -2081,11 +2081,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev) - struct ixgbe_hw *hw = &adapter->hw; - int count = 0; - -- if ((netdev_uc_count(netdev)) > 10) { -- pr_err("Too many unicast filters - No Space\n"); -- return -ENOSPC; -- } -- - if (!netdev_uc_empty(netdev)) { - struct netdev_hw_addr *ha; - -diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c -index a496390b8632..07f9067affc6 100644 ---- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c -+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c -@@ -2043,6 +2043,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, - break; - } - entry += p_hdr->size; -+ cond_resched(); - } - p_dev->ahw->reset.seq_index = index; - } -diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c -index afa10a163da1..f34ae8c75bc5 100644 ---- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c -+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c -@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, - addr += 16; - reg_read -= 16; - ret += 16; -+ cond_resched(); - } - out: - mutex_unlock(&adapter->ahw->mem_lock); -@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) - buf_offset += entry->hdr.cap_size; - entry_offset += entry->hdr.offset; - buffer = fw_dump->data + buf_offset; -+ cond_resched(); - } - - fw_dump->clr = 1; -diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c -index 4196c0e32740..9485c8d1de8a 100644 ---- a/drivers/net/usb/qmi_wwan.c -+++ b/drivers/net/usb/qmi_wwan.c -@@ -1062,6 +1062,7 @@ static const struct usb_device_id products[] = { - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ -+ {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ - - /* 3. Combined interface devices matching on interface number */ - {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ -diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c -index 9e4b7a400284..6912624eed4a 100644 ---- a/drivers/net/usb/r8152.c -+++ b/drivers/net/usb/r8152.c -@@ -29,7 +29,7 @@ - #define NETNEXT_VERSION "10" - - /* Information for net */ --#define NET_VERSION "10" -+#define NET_VERSION "11" - - #define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION - #define DRIVER_AUTHOR "Realtek linux nic maintainers " -@@ -63,6 +63,7 @@ - #define PLA_LED_FEATURE 0xdd92 - #define PLA_PHYAR 0xde00 - #define PLA_BOOT_CTRL 0xe004 -+#define PLA_LWAKE_CTRL_REG 0xe007 - #define PLA_GPHY_INTR_IMR 0xe022 - #define PLA_EEE_CR 0xe040 - #define PLA_EEEP_CR 0xe080 -@@ -90,6 +91,7 @@ - #define PLA_TALLYCNT 0xe890 - #define PLA_SFF_STS_7 0xe8de - #define PLA_PHYSTATUS 0xe908 -+#define PLA_CONFIG6 0xe90a /* CONFIG6 */ - #define PLA_BP_BA 0xfc26 - #define PLA_BP_0 0xfc28 - #define PLA_BP_1 0xfc2a -@@ -102,6 +104,7 @@ - #define PLA_BP_EN 0xfc38 - - #define USB_USB2PHY 0xb41e -+#define USB_SSPHYLINK1 0xb426 - #define USB_SSPHYLINK2 0xb428 - #define USB_U2P3_CTRL 0xb460 - #define USB_CSR_DUMMY1 0xb464 -@@ -286,6 +289,9 @@ - #define LINK_ON_WAKE_EN 0x0010 - #define LINK_OFF_WAKE_EN 0x0008 - -+/* PLA_CONFIG6 */ -+#define LANWAKE_CLR_EN BIT(0) -+ - /* PLA_CONFIG5 */ - #define BWF_EN 0x0040 - #define MWF_EN 0x0020 -@@ -298,6 +304,7 @@ - /* PLA_PHY_PWR */ - #define TX_10M_IDLE_EN 0x0080 - #define PFM_PWM_SWITCH 0x0040 -+#define TEST_IO_OFF BIT(4) - - /* PLA_MAC_PWR_CTRL */ - #define D3_CLK_GATED_EN 0x00004000 -@@ -310,6 +317,7 @@ - #define MAC_CLK_SPDWN_EN BIT(15) - - /* PLA_MAC_PWR_CTRL3 */ -+#define PLA_MCU_SPDWN_EN BIT(14) - #define PKT_AVAIL_SPDWN_EN 0x0100 - #define SUSPEND_SPDWN_EN 0x0004 - #define U1U2_SPDWN_EN 0x0002 -@@ -340,6 +348,9 @@ - /* PLA_BOOT_CTRL */ - #define AUTOLOAD_DONE 0x0002 - -+/* PLA_LWAKE_CTRL_REG */ -+#define LANWAKE_PIN BIT(7) -+ - /* PLA_SUSPEND_FLAG */ - #define LINK_CHG_EVENT BIT(0) - -@@ -353,6 +364,9 @@ - #define USB2PHY_SUSPEND 0x0001 - #define USB2PHY_L1 0x0002 - -+/* USB_SSPHYLINK1 */ -+#define DELAY_PHY_PWR_CHG BIT(1) -+ - /* USB_SSPHYLINK2 */ - #define pwd_dn_scale_mask 0x3ffe - #define pwd_dn_scale(x) ((x) << 1) -@@ -3175,7 +3189,6 @@ static void rtl8153b_runtime_enable(struct r8152 *tp, bool enable) - r8153b_ups_en(tp, false); - r8153_queue_wake(tp, false); - rtl_runtime_suspend_enable(tp, false); -- r8153_u2p3en(tp, true); - r8153b_u1u2en(tp, true); - } - } -@@ -3703,7 +3716,6 @@ static void r8153b_hw_phy_cfg(struct r8152 *tp) - - r8153_aldps_en(tp, true); - r8152b_enable_fc(tp); -- r8153_u2p3en(tp, true); - - set_bit(PHY_RESET, &tp->flags); - } -@@ -4004,6 +4016,8 @@ static void rtl8152_down(struct r8152 *tp) - - static void rtl8153_up(struct r8152 *tp) - { -+ u32 ocp_data; -+ - if (test_bit(RTL8152_UNPLUG, &tp->flags)) - return; - -@@ -4011,6 +4025,19 @@ static void rtl8153_up(struct r8152 *tp) - r8153_u2p3en(tp, false); - r8153_aldps_en(tp, false); - r8153_first_init(tp); -+ -+ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); -+ ocp_data |= LANWAKE_CLR_EN; -+ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); -+ -+ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG); -+ ocp_data &= ~LANWAKE_PIN; -+ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data); -+ -+ ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_SSPHYLINK1); -+ ocp_data &= ~DELAY_PHY_PWR_CHG; -+ ocp_write_word(tp, MCU_TYPE_USB, USB_SSPHYLINK1, ocp_data); -+ - r8153_aldps_en(tp, true); - - switch (tp->version) { -@@ -4029,11 +4056,17 @@ static void rtl8153_up(struct r8152 *tp) - - static void rtl8153_down(struct r8152 *tp) - { -+ u32 ocp_data; -+ - if (test_bit(RTL8152_UNPLUG, &tp->flags)) { - rtl_drop_queued_tx(tp); - return; - } - -+ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); -+ ocp_data &= ~LANWAKE_CLR_EN; -+ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); -+ - r8153_u1u2en(tp, false); - r8153_u2p3en(tp, false); - r8153_power_cut_en(tp, false); -@@ -4044,6 +4077,8 @@ static void rtl8153_down(struct r8152 *tp) - - static void rtl8153b_up(struct r8152 *tp) - { -+ u32 ocp_data; -+ - if (test_bit(RTL8152_UNPLUG, &tp->flags)) - return; - -@@ -4054,18 +4089,27 @@ static void rtl8153b_up(struct r8152 *tp) - r8153_first_init(tp); - ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_B); - -+ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); -+ ocp_data &= ~PLA_MCU_SPDWN_EN; -+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); -+ - r8153_aldps_en(tp, true); -- r8153_u2p3en(tp, true); - r8153b_u1u2en(tp, true); - } - - static void rtl8153b_down(struct r8152 *tp) - { -+ u32 ocp_data; -+ - if (test_bit(RTL8152_UNPLUG, &tp->flags)) { - rtl_drop_queued_tx(tp); - return; - } - -+ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); -+ ocp_data |= PLA_MCU_SPDWN_EN; -+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); -+ - r8153b_u1u2en(tp, false); - r8153_u2p3en(tp, false); - r8153b_power_cut_en(tp, false); -@@ -4454,6 +4498,14 @@ static void r8153_init(struct r8152 *tp) - r8153_mac_clk_spd(tp, false); - usb_enable_lpm(tp->udev); - -+ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6); -+ ocp_data |= LANWAKE_CLR_EN; -+ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data); -+ -+ ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG); -+ ocp_data &= ~LANWAKE_PIN; -+ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data); -+ - /* rx aggregation */ - ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); - ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); -@@ -4526,6 +4578,19 @@ static void r8153b_init(struct r8152 *tp) - ocp_data |= MAC_CLK_SPDWN_EN; - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, ocp_data); - -+ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); -+ ocp_data &= ~PLA_MCU_SPDWN_EN; -+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); -+ -+ if (tp->version == RTL_VER_09) { -+ /* Disable Test IO for 32QFN */ -+ if (ocp_read_byte(tp, MCU_TYPE_PLA, 0xdc00) & BIT(5)) { -+ ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); -+ ocp_data |= TEST_IO_OFF; -+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); -+ } -+ } -+ - set_bit(GREEN_ETHERNET, &tp->flags); - - /* rx aggregation */ -@@ -5690,6 +5755,11 @@ static int rtl8152_probe(struct usb_interface *intf, - - intf->needs_remote_wakeup = 1; - -+ if (!rtl_can_wakeup(tp)) -+ __rtl_set_wol(tp, 0); -+ else -+ tp->saved_wolopts = __rtl_get_wol(tp); -+ - tp->rtl_ops.init(tp); - queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0); - set_ethernet_addr(tp); -@@ -5703,10 +5773,6 @@ static int rtl8152_probe(struct usb_interface *intf, - goto out1; - } - -- if (!rtl_can_wakeup(tp)) -- __rtl_set_wol(tp, 0); -- -- tp->saved_wolopts = __rtl_get_wol(tp); - if (tp->saved_wolopts) - device_set_wakeup_enable(&udev->dev, true); - else -diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c -index 3029e3f6de63..621cd7206b7c 100644 ---- a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c -+++ b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c -@@ -267,7 +267,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv, - struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); - struct iwl_station_priv *sta_priv = NULL; - struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; -- struct iwl_device_cmd *dev_cmd; -+ struct iwl_device_tx_cmd *dev_cmd; - struct iwl_tx_cmd *tx_cmd; - __le16 fc; - u8 hdr_len; -@@ -348,7 +348,6 @@ int iwlagn_tx_skb(struct iwl_priv *priv, - if (unlikely(!dev_cmd)) - goto drop_unlock_priv; - -- memset(dev_cmd, 0, sizeof(*dev_cmd)); - dev_cmd->hdr.cmd = REPLY_TX; - tx_cmd = (struct iwl_tx_cmd *) dev_cmd->payload; - -diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c -index 87421807e040..386ca67ec7b4 100644 ---- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c -+++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c -@@ -2490,12 +2490,7 @@ int iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, - { - int ret = 0; - -- /* if the FW crashed or not debug monitor cfg was given, there is -- * no point in changing the recording state -- */ -- if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status) || -- (!fwrt->trans->dbg.dest_tlv && -- fwrt->trans->dbg.ini_dest == IWL_FW_INI_LOCATION_INVALID)) -+ if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) - return 0; - - if (fw_has_capa(&fwrt->fw->ucode_capa, -diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c -index c8972f6e38ba..5d546dac7814 100644 ---- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c -+++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c -@@ -225,6 +225,34 @@ enum iwl_nvm_channel_flags { - NVM_CHANNEL_DC_HIGH = BIT(12), - }; - -+/** -+ * enum iwl_reg_capa_flags - global flags applied for the whole regulatory -+ * domain. -+ * @REG_CAPA_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the -+ * 2.4Ghz band is allowed. -+ * @REG_CAPA_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the -+ * 5Ghz band is allowed. -+ * @REG_CAPA_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed -+ * for this regulatory domain (valid only in 5Ghz). -+ * @REG_CAPA_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed -+ * for this regulatory domain (valid only in 5Ghz). -+ * @REG_CAPA_MCS_8_ALLOWED: 11ac with MCS 8 is allowed. -+ * @REG_CAPA_MCS_9_ALLOWED: 11ac with MCS 9 is allowed. -+ * @REG_CAPA_40MHZ_FORBIDDEN: 11n channel with a width of 40Mhz is forbidden -+ * for this regulatory domain (valid only in 5Ghz). -+ * @REG_CAPA_DC_HIGH_ENABLED: DC HIGH allowed. -+ */ -+enum iwl_reg_capa_flags { -+ REG_CAPA_BF_CCD_LOW_BAND = BIT(0), -+ REG_CAPA_BF_CCD_HIGH_BAND = BIT(1), -+ REG_CAPA_160MHZ_ALLOWED = BIT(2), -+ REG_CAPA_80MHZ_ALLOWED = BIT(3), -+ REG_CAPA_MCS_8_ALLOWED = BIT(4), -+ REG_CAPA_MCS_9_ALLOWED = BIT(5), -+ REG_CAPA_40MHZ_FORBIDDEN = BIT(7), -+ REG_CAPA_DC_HIGH_ENABLED = BIT(9), -+}; -+ - static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level, - int chan, u32 flags) - { -@@ -1031,6 +1059,7 @@ IWL_EXPORT_SYMBOL(iwl_parse_nvm_data); - - static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan, - int ch_idx, u16 nvm_flags, -+ u16 cap_flags, - const struct iwl_cfg *cfg) - { - u32 flags = NL80211_RRF_NO_HT40; -@@ -1069,13 +1098,27 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan, - (flags & NL80211_RRF_NO_IR)) - flags |= NL80211_RRF_GO_CONCURRENT; - -+ /* -+ * cap_flags is per regulatory domain so apply it for every channel -+ */ -+ if (ch_idx >= NUM_2GHZ_CHANNELS) { -+ if (cap_flags & REG_CAPA_40MHZ_FORBIDDEN) -+ flags |= NL80211_RRF_NO_HT40; -+ -+ if (!(cap_flags & REG_CAPA_80MHZ_ALLOWED)) -+ flags |= NL80211_RRF_NO_80MHZ; -+ -+ if (!(cap_flags & REG_CAPA_160MHZ_ALLOWED)) -+ flags |= NL80211_RRF_NO_160MHZ; -+ } -+ - return flags; - } - - struct ieee80211_regdomain * - iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, - int num_of_ch, __le32 *channels, u16 fw_mcc, -- u16 geo_info) -+ u16 geo_info, u16 cap) - { - int ch_idx; - u16 ch_flags; -@@ -1133,7 +1176,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, - } - - reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx, -- ch_flags, cfg); -+ ch_flags, cap, -+ cfg); - - /* we can't continue the same rule */ - if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags || -diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h -index b7e1ddf8f177..4eeedb41e9ac 100644 ---- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h -+++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h -@@ -7,7 +7,7 @@ - * - * Copyright(c) 2008 - 2015 Intel Corporation. All rights reserved. - * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -- * Copyright(c) 2018 Intel Corporation -+ * Copyright(c) 2018 - 2019 Intel Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License as -@@ -29,7 +29,7 @@ - * - * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. - * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -- * Copyright(c) 2018 Intel Corporation -+ * Copyright(c) 2018 - 2019 Intel Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without -@@ -103,7 +103,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg, - struct ieee80211_regdomain * - iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, - int num_of_ch, __le32 *channels, u16 fw_mcc, -- u16 geo_info); -+ u16 geo_info, u16 cap); - - /** - * struct iwl_nvm_section - describes an NVM section in memory. -diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c -index 28bdc9a9617e..f91197e4ae40 100644 ---- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c -+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c -@@ -66,7 +66,9 @@ - - struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, - struct device *dev, -- const struct iwl_trans_ops *ops) -+ const struct iwl_trans_ops *ops, -+ unsigned int cmd_pool_size, -+ unsigned int cmd_pool_align) - { - struct iwl_trans *trans; - #ifdef CONFIG_LOCKDEP -@@ -90,10 +92,8 @@ struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, - "iwl_cmd_pool:%s", dev_name(trans->dev)); - trans->dev_cmd_pool = - kmem_cache_create(trans->dev_cmd_pool_name, -- sizeof(struct iwl_device_cmd), -- sizeof(void *), -- SLAB_HWCACHE_ALIGN, -- NULL); -+ cmd_pool_size, cmd_pool_align, -+ SLAB_HWCACHE_ALIGN, NULL); - if (!trans->dev_cmd_pool) - return NULL; - -diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h -index a31408188ed0..1e85d59b9161 100644 ---- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h -+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h -@@ -193,6 +193,18 @@ struct iwl_device_cmd { - }; - } __packed; - -+/** -+ * struct iwl_device_tx_cmd - buffer for TX command -+ * @hdr: the header -+ * @payload: the payload placeholder -+ * -+ * The actual structure is sized dynamically according to need. -+ */ -+struct iwl_device_tx_cmd { -+ struct iwl_cmd_header hdr; -+ u8 payload[]; -+} __packed; -+ - #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_device_cmd)) - - /* -@@ -544,7 +556,7 @@ struct iwl_trans_ops { - int (*send_cmd)(struct iwl_trans *trans, struct iwl_host_cmd *cmd); - - int (*tx)(struct iwl_trans *trans, struct sk_buff *skb, -- struct iwl_device_cmd *dev_cmd, int queue); -+ struct iwl_device_tx_cmd *dev_cmd, int queue); - void (*reclaim)(struct iwl_trans *trans, int queue, int ssn, - struct sk_buff_head *skbs); - -@@ -921,22 +933,22 @@ iwl_trans_dump_data(struct iwl_trans *trans, u32 dump_mask) - return trans->ops->dump_data(trans, dump_mask); - } - --static inline struct iwl_device_cmd * -+static inline struct iwl_device_tx_cmd * - iwl_trans_alloc_tx_cmd(struct iwl_trans *trans) - { -- return kmem_cache_alloc(trans->dev_cmd_pool, GFP_ATOMIC); -+ return kmem_cache_zalloc(trans->dev_cmd_pool, GFP_ATOMIC); - } - - int iwl_trans_send_cmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd); - - static inline void iwl_trans_free_tx_cmd(struct iwl_trans *trans, -- struct iwl_device_cmd *dev_cmd) -+ struct iwl_device_tx_cmd *dev_cmd) - { - kmem_cache_free(trans->dev_cmd_pool, dev_cmd); - } - - static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb, -- struct iwl_device_cmd *dev_cmd, int queue) -+ struct iwl_device_tx_cmd *dev_cmd, int queue) - { - if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status))) - return -EIO; -@@ -1239,7 +1251,9 @@ static inline bool iwl_trans_dbg_ini_valid(struct iwl_trans *trans) - *****************************************************/ - struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, - struct device *dev, -- const struct iwl_trans_ops *ops); -+ const struct iwl_trans_ops *ops, -+ unsigned int cmd_pool_size, -+ unsigned int cmd_pool_align); - void iwl_trans_free(struct iwl_trans *trans); - - /***************************************************** -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -index 49aeab7c27a2..18ccc2692437 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -@@ -256,7 +256,8 @@ struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy, - __le32_to_cpu(resp->n_channels), - resp->channels, - __le16_to_cpu(resp->mcc), -- __le16_to_cpu(resp->geo_info)); -+ __le16_to_cpu(resp->geo_info), -+ __le16_to_cpu(resp->cap)); - /* Store the return source id */ - src_id = resp->source_id; - kfree(resp); -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -index d9d82f6b5e87..2b92980a49e6 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -@@ -487,13 +487,13 @@ static void iwl_mvm_set_tx_cmd_crypto(struct iwl_mvm *mvm, - /* - * Allocates and sets the Tx cmd the driver data pointers in the skb - */ --static struct iwl_device_cmd * -+static struct iwl_device_tx_cmd * - iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb, - struct ieee80211_tx_info *info, int hdrlen, - struct ieee80211_sta *sta, u8 sta_id) - { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; -- struct iwl_device_cmd *dev_cmd; -+ struct iwl_device_tx_cmd *dev_cmd; - struct iwl_tx_cmd *tx_cmd; - - dev_cmd = iwl_trans_alloc_tx_cmd(mvm->trans); -@@ -501,11 +501,6 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb, - if (unlikely(!dev_cmd)) - return NULL; - -- /* Make sure we zero enough of dev_cmd */ -- BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_gen2) > sizeof(*tx_cmd)); -- BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_gen3) > sizeof(*tx_cmd)); -- -- memset(dev_cmd, 0, sizeof(dev_cmd->hdr) + sizeof(*tx_cmd)); - dev_cmd->hdr.cmd = TX_CMD; - - if (iwl_mvm_has_new_tx_api(mvm)) { -@@ -594,7 +589,7 @@ out: - } - - static void iwl_mvm_skb_prepare_status(struct sk_buff *skb, -- struct iwl_device_cmd *cmd) -+ struct iwl_device_tx_cmd *cmd) - { - struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb); - -@@ -713,7 +708,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) - { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - struct ieee80211_tx_info info; -- struct iwl_device_cmd *dev_cmd; -+ struct iwl_device_tx_cmd *dev_cmd; - u8 sta_id; - int hdrlen = ieee80211_hdrlen(hdr->frame_control); - __le16 fc = hdr->frame_control; -@@ -1075,7 +1070,7 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb, - { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - struct iwl_mvm_sta *mvmsta; -- struct iwl_device_cmd *dev_cmd; -+ struct iwl_device_tx_cmd *dev_cmd; - __le16 fc; - u16 seq_number = 0; - u8 tid = IWL_MAX_TID_COUNT; -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -index 1047d48beaa5..9b5b96e34456 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -@@ -305,7 +305,7 @@ struct iwl_cmd_meta { - #define IWL_FIRST_TB_SIZE_ALIGN ALIGN(IWL_FIRST_TB_SIZE, 64) - - struct iwl_pcie_txq_entry { -- struct iwl_device_cmd *cmd; -+ void *cmd; - struct sk_buff *skb; - /* buffer to free after command completes */ - const void *free_buf; -@@ -690,7 +690,7 @@ void iwl_trans_pcie_txq_set_shared_mode(struct iwl_trans *trans, u32 txq_id, - void iwl_trans_pcie_log_scd_error(struct iwl_trans *trans, - struct iwl_txq *txq); - int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, -- struct iwl_device_cmd *dev_cmd, int txq_id); -+ struct iwl_device_tx_cmd *dev_cmd, int txq_id); - void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans); - int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd); - void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx); -@@ -1111,7 +1111,7 @@ int iwl_trans_pcie_dyn_txq_alloc(struct iwl_trans *trans, - unsigned int timeout); - void iwl_trans_pcie_dyn_txq_free(struct iwl_trans *trans, int queue); - int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, -- struct iwl_device_cmd *dev_cmd, int txq_id); -+ struct iwl_device_tx_cmd *dev_cmd, int txq_id); - int iwl_trans_pcie_gen2_send_hcmd(struct iwl_trans *trans, - struct iwl_host_cmd *cmd); - void iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans); -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -index d3db38c3095b..c76d26708e65 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -@@ -79,6 +79,7 @@ - #include "iwl-agn-hw.h" - #include "fw/error-dump.h" - #include "fw/dbg.h" -+#include "fw/api/tx.h" - #include "internal.h" - #include "iwl-fh.h" - -@@ -3462,19 +3463,34 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, - { - struct iwl_trans_pcie *trans_pcie; - struct iwl_trans *trans; -- int ret, addr_size; -+ int ret, addr_size, txcmd_size, txcmd_align; -+ const struct iwl_trans_ops *ops = &trans_ops_pcie_gen2; -+ -+ if (!cfg_trans->gen2) { -+ ops = &trans_ops_pcie; -+ txcmd_size = sizeof(struct iwl_tx_cmd); -+ txcmd_align = sizeof(void *); -+ } else if (cfg_trans->device_family < IWL_DEVICE_FAMILY_AX210) { -+ txcmd_size = sizeof(struct iwl_tx_cmd_gen2); -+ txcmd_align = 64; -+ } else { -+ txcmd_size = sizeof(struct iwl_tx_cmd_gen3); -+ txcmd_align = 128; -+ } -+ -+ txcmd_size += sizeof(struct iwl_cmd_header); -+ txcmd_size += 36; /* biggest possible 802.11 header */ -+ -+ /* Ensure device TX cmd cannot reach/cross a page boundary in gen2 */ -+ if (WARN_ON(cfg_trans->gen2 && txcmd_size >= txcmd_align)) -+ return ERR_PTR(-EINVAL); - - ret = pcim_enable_device(pdev); - if (ret) - return ERR_PTR(ret); - -- if (cfg_trans->gen2) -- trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), -- &pdev->dev, &trans_ops_pcie_gen2); -- else -- trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), -- &pdev->dev, &trans_ops_pcie); -- -+ trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), &pdev->dev, ops, -+ txcmd_size, txcmd_align); - if (!trans) - return ERR_PTR(-ENOMEM); - -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c -index 97cb3a8d505c..ff4c34d7b74f 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c -@@ -243,7 +243,8 @@ static int iwl_pcie_gen2_set_tb(struct iwl_trans *trans, - static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans, - struct sk_buff *skb, - struct iwl_tfh_tfd *tfd, int start_len, -- u8 hdr_len, struct iwl_device_cmd *dev_cmd) -+ u8 hdr_len, -+ struct iwl_device_tx_cmd *dev_cmd) - { - #ifdef CONFIG_INET - struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); -@@ -371,7 +372,7 @@ out_err: - static struct - iwl_tfh_tfd *iwl_pcie_gen2_build_tx_amsdu(struct iwl_trans *trans, - struct iwl_txq *txq, -- struct iwl_device_cmd *dev_cmd, -+ struct iwl_device_tx_cmd *dev_cmd, - struct sk_buff *skb, - struct iwl_cmd_meta *out_meta, - int hdr_len, -@@ -403,6 +404,10 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx_amsdu(struct iwl_trans *trans, - tb_phys = dma_map_single(trans->dev, tb1_addr, len, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(trans->dev, tb_phys))) - goto out_err; -+ /* -+ * No need for _with_wa(), we ensure (via alignment) that the data -+ * here can never cross or end at a page boundary. -+ */ - iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, len); - - if (iwl_pcie_gen2_build_amsdu(trans, skb, tfd, -@@ -456,7 +461,7 @@ static int iwl_pcie_gen2_tx_add_frags(struct iwl_trans *trans, - static struct - iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, - struct iwl_txq *txq, -- struct iwl_device_cmd *dev_cmd, -+ struct iwl_device_tx_cmd *dev_cmd, - struct sk_buff *skb, - struct iwl_cmd_meta *out_meta, - int hdr_len, -@@ -496,6 +501,10 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, - tb_phys = dma_map_single(trans->dev, tb1_addr, tb1_len, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(trans->dev, tb_phys))) - goto out_err; -+ /* -+ * No need for _with_wa(), we ensure (via alignment) that the data -+ * here can never cross or end at a page boundary. -+ */ - iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb1_len); - trace_iwlwifi_dev_tx(trans->dev, skb, tfd, sizeof(*tfd), &dev_cmd->hdr, - IWL_FIRST_TB_SIZE + tb1_len, hdr_len); -@@ -540,7 +549,7 @@ out_err: - static - struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans, - struct iwl_txq *txq, -- struct iwl_device_cmd *dev_cmd, -+ struct iwl_device_tx_cmd *dev_cmd, - struct sk_buff *skb, - struct iwl_cmd_meta *out_meta) - { -@@ -580,7 +589,7 @@ struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans, - } - - int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, -- struct iwl_device_cmd *dev_cmd, int txq_id) -+ struct iwl_device_tx_cmd *dev_cmd, int txq_id) - { - struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); - struct iwl_cmd_meta *out_meta; -@@ -605,7 +614,7 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, - - /* don't put the packet on the ring, if there is no room */ - if (unlikely(iwl_queue_space(trans, txq) < 3)) { -- struct iwl_device_cmd **dev_cmd_ptr; -+ struct iwl_device_tx_cmd **dev_cmd_ptr; - - dev_cmd_ptr = (void *)((u8 *)skb->cb + - trans_pcie->dev_cmd_offs); -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c -index 4806a04cec8c..d3b58334e13e 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c -@@ -213,8 +213,8 @@ static void iwl_pcie_txq_update_byte_cnt_tbl(struct iwl_trans *trans, - u8 sec_ctl = 0; - u16 len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE; - __le16 bc_ent; -- struct iwl_tx_cmd *tx_cmd = -- (void *)txq->entries[txq->write_ptr].cmd->payload; -+ struct iwl_device_tx_cmd *dev_cmd = txq->entries[txq->write_ptr].cmd; -+ struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; - u8 sta_id = tx_cmd->sta_id; - - scd_bc_tbl = trans_pcie->scd_bc_tbls.addr; -@@ -257,8 +257,8 @@ static void iwl_pcie_txq_inval_byte_cnt_tbl(struct iwl_trans *trans, - int read_ptr = txq->read_ptr; - u8 sta_id = 0; - __le16 bc_ent; -- struct iwl_tx_cmd *tx_cmd = -- (void *)txq->entries[read_ptr].cmd->payload; -+ struct iwl_device_tx_cmd *dev_cmd = txq->entries[read_ptr].cmd; -+ struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; - - WARN_ON(read_ptr >= TFD_QUEUE_SIZE_MAX); - -@@ -1196,7 +1196,7 @@ void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn, - - while (!skb_queue_empty(&overflow_skbs)) { - struct sk_buff *skb = __skb_dequeue(&overflow_skbs); -- struct iwl_device_cmd *dev_cmd_ptr; -+ struct iwl_device_tx_cmd *dev_cmd_ptr; - - dev_cmd_ptr = *(void **)((u8 *)skb->cb + - trans_pcie->dev_cmd_offs); -@@ -2099,7 +2099,8 @@ static void iwl_compute_pseudo_hdr_csum(void *iph, struct tcphdr *tcph, - static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, - struct iwl_txq *txq, u8 hdr_len, - struct iwl_cmd_meta *out_meta, -- struct iwl_device_cmd *dev_cmd, u16 tb1_len) -+ struct iwl_device_tx_cmd *dev_cmd, -+ u16 tb1_len) - { - struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload; - struct iwl_trans_pcie *trans_pcie = txq->trans_pcie; -@@ -2281,7 +2282,8 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, - static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, - struct iwl_txq *txq, u8 hdr_len, - struct iwl_cmd_meta *out_meta, -- struct iwl_device_cmd *dev_cmd, u16 tb1_len) -+ struct iwl_device_tx_cmd *dev_cmd, -+ u16 tb1_len) - { - /* No A-MSDU without CONFIG_INET */ - WARN_ON(1); -@@ -2291,7 +2293,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, - #endif /* CONFIG_INET */ - - int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, -- struct iwl_device_cmd *dev_cmd, int txq_id) -+ struct iwl_device_tx_cmd *dev_cmd, int txq_id) - { - struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); - struct ieee80211_hdr *hdr; -@@ -2348,7 +2350,7 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, - - /* don't put the packet on the ring, if there is no room */ - if (unlikely(iwl_queue_space(trans, txq) < 3)) { -- struct iwl_device_cmd **dev_cmd_ptr; -+ struct iwl_device_tx_cmd **dev_cmd_ptr; - - dev_cmd_ptr = (void *)((u8 *)skb->cb + - trans_pcie->dev_cmd_offs); -diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c -index d6cdabef264d..4b9e406b8461 100644 ---- a/drivers/net/wireless/rsi/rsi_91x_usb.c -+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c -@@ -805,7 +805,7 @@ static int rsi_probe(struct usb_interface *pfunction, - adapter->device_model = RSI_DEV_9116; - } else { - rsi_dbg(ERR_ZONE, "%s: Unsupported RSI device id 0x%x\n", -- __func__, id ? id->idProduct : 0x0); -+ __func__, id->idProduct); - goto err1; - } - -diff --git a/drivers/platform/x86/gpd-pocket-fan.c b/drivers/platform/x86/gpd-pocket-fan.c -index 73eb1572b966..b471b86c28fe 100644 ---- a/drivers/platform/x86/gpd-pocket-fan.c -+++ b/drivers/platform/x86/gpd-pocket-fan.c -@@ -127,7 +127,7 @@ static int gpd_pocket_fan_probe(struct platform_device *pdev) - int i; - - for (i = 0; i < ARRAY_SIZE(temp_limits); i++) { -- if (temp_limits[i] < 40000 || temp_limits[i] > 70000) { -+ if (temp_limits[i] < 20000 || temp_limits[i] > 90000) { - dev_err(&pdev->dev, "Invalid temp-limit %d (must be between 40000 and 70000)\n", - temp_limits[i]); - temp_limits[0] = TEMP_LIMIT0_DEFAULT; -diff --git a/drivers/platform/x86/intel_pmc_core_pltdrv.c b/drivers/platform/x86/intel_pmc_core_pltdrv.c -index 6fe829f30997..e1266f5c6359 100644 ---- a/drivers/platform/x86/intel_pmc_core_pltdrv.c -+++ b/drivers/platform/x86/intel_pmc_core_pltdrv.c -@@ -44,6 +44,8 @@ static const struct x86_cpu_id intel_pmc_core_platform_ids[] = { - INTEL_CPU_FAM6(KABYLAKE, pmc_core_device), - INTEL_CPU_FAM6(CANNONLAKE_L, pmc_core_device), - INTEL_CPU_FAM6(ICELAKE_L, pmc_core_device), -+ INTEL_CPU_FAM6(COMETLAKE, pmc_core_device), -+ INTEL_CPU_FAM6(COMETLAKE_L, pmc_core_device), - {} - }; - MODULE_DEVICE_TABLE(x86cpu, intel_pmc_core_platform_ids); -diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c -index a1915061932e..5256e3ce84e5 100644 ---- a/drivers/s390/crypto/ap_bus.c -+++ b/drivers/s390/crypto/ap_bus.c -@@ -793,8 +793,6 @@ static int ap_device_probe(struct device *dev) - drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT; - if (!!devres != !!drvres) - return -ENODEV; -- /* (re-)init queue's state machine */ -- ap_queue_reinit_state(to_ap_queue(dev)); - } - - /* Add queue/card to list of active queues/cards */ -diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h -index 433b7b64368d..bb35ba4a8d24 100644 ---- a/drivers/s390/crypto/ap_bus.h -+++ b/drivers/s390/crypto/ap_bus.h -@@ -261,7 +261,7 @@ void ap_queue_prepare_remove(struct ap_queue *aq); - void ap_queue_remove(struct ap_queue *aq); - void ap_queue_suspend(struct ap_device *ap_dev); - void ap_queue_resume(struct ap_device *ap_dev); --void ap_queue_reinit_state(struct ap_queue *aq); -+void ap_queue_init_state(struct ap_queue *aq); - - struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type, - int comp_device_type, unsigned int functions); -diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c -index dad2be333d82..37c3bdc3642d 100644 ---- a/drivers/s390/crypto/ap_queue.c -+++ b/drivers/s390/crypto/ap_queue.c -@@ -638,7 +638,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type) - aq->ap_dev.device.type = &ap_queue_type; - aq->ap_dev.device_type = device_type; - aq->qid = qid; -- aq->state = AP_STATE_RESET_START; -+ aq->state = AP_STATE_UNBOUND; - aq->interrupt = AP_INTR_DISABLED; - spin_lock_init(&aq->lock); - INIT_LIST_HEAD(&aq->list); -@@ -771,10 +771,11 @@ void ap_queue_remove(struct ap_queue *aq) - spin_unlock_bh(&aq->lock); - } - --void ap_queue_reinit_state(struct ap_queue *aq) -+void ap_queue_init_state(struct ap_queue *aq) - { - spin_lock_bh(&aq->lock); - aq->state = AP_STATE_RESET_START; - ap_wait(ap_sm_event(aq, AP_EVENT_POLL)); - spin_unlock_bh(&aq->lock); - } -+EXPORT_SYMBOL(ap_queue_init_state); -diff --git a/drivers/s390/crypto/zcrypt_cex2a.c b/drivers/s390/crypto/zcrypt_cex2a.c -index c50f3e86cc74..7cbb384ec535 100644 ---- a/drivers/s390/crypto/zcrypt_cex2a.c -+++ b/drivers/s390/crypto/zcrypt_cex2a.c -@@ -175,6 +175,7 @@ static int zcrypt_cex2a_queue_probe(struct ap_device *ap_dev) - zq->queue = aq; - zq->online = 1; - atomic_set(&zq->load, 0); -+ ap_queue_init_state(aq); - ap_queue_init_reply(aq, &zq->reply); - aq->request_timeout = CEX2A_CLEANUP_TIME, - aq->private = zq; -diff --git a/drivers/s390/crypto/zcrypt_cex2c.c b/drivers/s390/crypto/zcrypt_cex2c.c -index 35c7c6672713..c78c0d119806 100644 ---- a/drivers/s390/crypto/zcrypt_cex2c.c -+++ b/drivers/s390/crypto/zcrypt_cex2c.c -@@ -220,6 +220,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev) - zq->queue = aq; - zq->online = 1; - atomic_set(&zq->load, 0); -+ ap_rapq(aq->qid); - rc = zcrypt_cex2c_rng_supported(aq); - if (rc < 0) { - zcrypt_queue_free(zq); -@@ -231,6 +232,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev) - else - zq->ops = zcrypt_msgtype(MSGTYPE06_NAME, - MSGTYPE06_VARIANT_NORNG); -+ ap_queue_init_state(aq); - ap_queue_init_reply(aq, &zq->reply); - aq->request_timeout = CEX2C_CLEANUP_TIME; - aq->private = zq; -diff --git a/drivers/s390/crypto/zcrypt_cex4.c b/drivers/s390/crypto/zcrypt_cex4.c -index 442e3d6162f7..6fabc906114c 100644 ---- a/drivers/s390/crypto/zcrypt_cex4.c -+++ b/drivers/s390/crypto/zcrypt_cex4.c -@@ -381,6 +381,7 @@ static int zcrypt_cex4_queue_probe(struct ap_device *ap_dev) - zq->queue = aq; - zq->online = 1; - atomic_set(&zq->load, 0); -+ ap_queue_init_state(aq); - ap_queue_init_reply(aq, &zq->reply); - aq->request_timeout = CEX4_CLEANUP_TIME, - aq->private = zq; -diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c -index 80608b53897b..e3f5c91d5e4f 100644 ---- a/drivers/scsi/fnic/fnic_scsi.c -+++ b/drivers/scsi/fnic/fnic_scsi.c -@@ -439,6 +439,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_ - if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED))) - return SCSI_MLQUEUE_HOST_BUSY; - -+ if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET))) -+ return SCSI_MLQUEUE_HOST_BUSY; -+ - rport = starget_to_rport(scsi_target(sc->device)); - if (!rport) { - FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host, -diff --git a/drivers/soc/ti/wkup_m3_ipc.c b/drivers/soc/ti/wkup_m3_ipc.c -index 378369d9364a..e9ece45d7a33 100644 ---- a/drivers/soc/ti/wkup_m3_ipc.c -+++ b/drivers/soc/ti/wkup_m3_ipc.c -@@ -419,6 +419,8 @@ static void wkup_m3_rproc_boot_thread(struct wkup_m3_ipc *m3_ipc) - ret = rproc_boot(m3_ipc->rproc); - if (ret) - dev_err(dev, "rproc_boot failed\n"); -+ else -+ m3_ipc_state = m3_ipc; - - do_exit(0); - } -@@ -505,8 +507,6 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev) - goto err_put_rproc; - } - -- m3_ipc_state = m3_ipc; -- - return 0; - - err_put_rproc: -diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig -index d1ad512e1708..3ca71e3812ed 100644 ---- a/drivers/tee/optee/Kconfig -+++ b/drivers/tee/optee/Kconfig -@@ -3,6 +3,7 @@ - config OPTEE - tristate "OP-TEE" - depends on HAVE_ARM_SMCCC -+ depends on MMU - help - This implements the OP-TEE Trusted Execution Environment (TEE) - driver. -diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c -index 1b151af25772..abcd93a3ca1d 100644 ---- a/fs/btrfs/super.c -+++ b/fs/btrfs/super.c -@@ -2102,7 +2102,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) - */ - thresh = SZ_4M; - -- if (!mixed && total_free_meta - thresh < block_rsv->size) -+ /* -+ * We only want to claim there's no available space if we can no longer -+ * allocate chunks for our metadata profile and our global reserve will -+ * not fit in the free metadata space. If we aren't ->full then we -+ * still can allocate chunks and thus are fine using the currently -+ * calculated f_bavail. -+ */ -+ if (!mixed && block_rsv->space_info->full && -+ total_free_meta - thresh < block_rsv->size) - buf->f_bavail = 0; - - buf->f_type = BTRFS_SUPER_MAGIC; -diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c -index e1d8cec6ba2e..e1cac715d19e 100644 ---- a/fs/cifs/smb2pdu.c -+++ b/fs/cifs/smb2pdu.c -@@ -312,7 +312,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon) - if (server->tcpStatus != CifsNeedReconnect) - break; - -- if (--retries) -+ if (retries && --retries) - continue; - - /* -diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c -index e2437b775456..e7b9d39955d4 100644 ---- a/fs/gfs2/lops.c -+++ b/fs/gfs2/lops.c -@@ -264,7 +264,7 @@ static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd *sdp, u64 blkno, - struct super_block *sb = sdp->sd_vfs; - struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES); - -- bio->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9); -+ bio->bi_iter.bi_sector = blkno << (sb->s_blocksize_bits - 9); - bio_set_dev(bio, sb->s_bdev); - bio->bi_end_io = end_io; - bio->bi_private = sdp; -@@ -471,6 +471,20 @@ static void gfs2_jhead_process_page(struct gfs2_jdesc *jd, unsigned long index, - put_page(page); /* Once more for find_or_create_page */ - } - -+static struct bio *gfs2_chain_bio(struct bio *prev, unsigned int nr_iovecs) -+{ -+ struct bio *new; -+ -+ new = bio_alloc(GFP_NOIO, nr_iovecs); -+ bio_copy_dev(new, prev); -+ new->bi_iter.bi_sector = bio_end_sector(prev); -+ new->bi_opf = prev->bi_opf; -+ new->bi_write_hint = prev->bi_write_hint; -+ bio_chain(new, prev); -+ submit_bio(prev); -+ return new; -+} -+ - /** - * gfs2_find_jhead - find the head of a log - * @jd: The journal descriptor -@@ -487,15 +501,15 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, - struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); - struct address_space *mapping = jd->jd_inode->i_mapping; - unsigned int block = 0, blocks_submitted = 0, blocks_read = 0; -- unsigned int bsize = sdp->sd_sb.sb_bsize; -+ unsigned int bsize = sdp->sd_sb.sb_bsize, off; - unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift; - unsigned int shift = PAGE_SHIFT - bsize_shift; -- unsigned int readhead_blocks = BIO_MAX_PAGES << shift; -+ unsigned int readahead_blocks = BIO_MAX_PAGES << shift; - struct gfs2_journal_extent *je; - int sz, ret = 0; - struct bio *bio = NULL; - struct page *page = NULL; -- bool done = false; -+ bool bio_chained = false, done = false; - errseq_t since; - - memset(head, 0, sizeof(*head)); -@@ -504,9 +518,9 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, - - since = filemap_sample_wb_err(mapping); - list_for_each_entry(je, &jd->extent_list, list) { -- for (; block < je->lblock + je->blocks; block++) { -- u64 dblock; -+ u64 dblock = je->dblock; - -+ for (; block < je->lblock + je->blocks; block++, dblock++) { - if (!page) { - page = find_or_create_page(mapping, - block >> shift, GFP_NOFS); -@@ -515,35 +529,41 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, - done = true; - goto out; - } -+ off = 0; - } - -- if (bio) { -- unsigned int off; -- -- off = (block << bsize_shift) & ~PAGE_MASK; -+ if (!bio || (bio_chained && !off)) { -+ /* start new bio */ -+ } else { - sz = bio_add_page(bio, page, bsize, off); -- if (sz == bsize) { /* block added */ -- if (off + bsize == PAGE_SIZE) { -- page = NULL; -- goto page_added; -- } -- continue; -+ if (sz == bsize) -+ goto block_added; -+ if (off) { -+ unsigned int blocks = -+ (PAGE_SIZE - off) >> bsize_shift; -+ -+ bio = gfs2_chain_bio(bio, blocks); -+ bio_chained = true; -+ goto add_block_to_new_bio; - } -+ } -+ -+ if (bio) { - blocks_submitted = block + 1; - submit_bio(bio); -- bio = NULL; - } - -- dblock = je->dblock + (block - je->lblock); - bio = gfs2_log_alloc_bio(sdp, dblock, gfs2_end_log_read); - bio->bi_opf = REQ_OP_READ; -- sz = bio_add_page(bio, page, bsize, 0); -- gfs2_assert_warn(sdp, sz == bsize); -- if (bsize == PAGE_SIZE) -+ bio_chained = false; -+add_block_to_new_bio: -+ sz = bio_add_page(bio, page, bsize, off); -+ BUG_ON(sz != bsize); -+block_added: -+ off += bsize; -+ if (off == PAGE_SIZE) - page = NULL; -- --page_added: -- if (blocks_submitted < blocks_read + readhead_blocks) { -+ if (blocks_submitted < blocks_read + readahead_blocks) { - /* Keep at least one bio in flight */ - continue; - } -diff --git a/fs/namei.c b/fs/namei.c -index e81521c87f98..bd1c0ca4151c 100644 ---- a/fs/namei.c -+++ b/fs/namei.c -@@ -3249,8 +3249,8 @@ static int do_last(struct nameidata *nd, - struct file *file, const struct open_flags *op) - { - struct dentry *dir = nd->path.dentry; -- kuid_t dir_uid = dir->d_inode->i_uid; -- umode_t dir_mode = dir->d_inode->i_mode; -+ kuid_t dir_uid = nd->inode->i_uid; -+ umode_t dir_mode = nd->inode->i_mode; - int open_flag = op->open_flag; - bool will_truncate = (open_flag & O_TRUNC) != 0; - bool got_write = false; -diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c -index 3244037b1286..d127af64283e 100644 ---- a/fs/reiserfs/super.c -+++ b/fs/reiserfs/super.c -@@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s) - reiserfs_write_unlock(s); - mutex_destroy(&REISERFS_SB(s)->lock); - destroy_workqueue(REISERFS_SB(s)->commit_wq); -+ kfree(REISERFS_SB(s)->s_jdev); - kfree(s->s_fs_info); - s->s_fs_info = NULL; - } -@@ -2240,6 +2241,7 @@ error_unlocked: - kfree(qf_names[j]); - } - #endif -+ kfree(sbi->s_jdev); - kfree(sbi); - - s->s_fs_info = NULL; -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 775503573ed7..b968d736833b 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1915,11 +1915,11 @@ static inline void rseq_migrate(struct task_struct *t) - - /* - * If parent process has a registered restartable sequences area, the -- * child inherits. Only applies when forking a process, not a thread. -+ * child inherits. Unregister rseq for a clone with CLONE_VM set. - */ - static inline void rseq_fork(struct task_struct *t, unsigned long clone_flags) - { -- if (clone_flags & CLONE_THREAD) { -+ if (clone_flags & CLONE_VM) { - t->rseq = NULL; - t->rseq_sig = 0; - t->rseq_event_mask = 0; -diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h -index 4ab2c49423dc..68782ba8b6e8 100644 ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -3537,6 +3537,9 @@ struct cfg80211_update_owe_info { - * - * @start_radar_detection: Start radar detection in the driver. - * -+ * @end_cac: End running CAC, probably because a related CAC -+ * was finished on another phy. -+ * - * @update_ft_ies: Provide updated Fast BSS Transition information to the - * driver. If the SME is in the driver/firmware, this information can be - * used in building Authentication and Reassociation Request frames. -@@ -3863,6 +3866,8 @@ struct cfg80211_ops { - struct net_device *dev, - struct cfg80211_chan_def *chandef, - u32 cac_time_ms); -+ void (*end_cac)(struct wiphy *wiphy, -+ struct net_device *dev); - int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, - struct cfg80211_update_ft_ies_params *ftie); - int (*crit_proto_start)(struct wiphy *wiphy, -diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c -index ef4242e5d4bc..595c52d59f31 100644 ---- a/kernel/cgroup/cgroup.c -+++ b/kernel/cgroup/cgroup.c -@@ -3111,8 +3111,6 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) - for_each_subsys(ss, ssid) { - struct cgroup_subsys_state *css = cgroup_css(dsct, ss); - -- WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); -- - if (!(cgroup_ss_mask(dsct) & (1 << ss->id))) - continue; - -@@ -3122,6 +3120,8 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) - return PTR_ERR(css); - } - -+ WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); -+ - if (css_visible(css)) { - ret = css_populate_dir(css); - if (ret) -@@ -3157,11 +3157,11 @@ static void cgroup_apply_control_disable(struct cgroup *cgrp) - for_each_subsys(ss, ssid) { - struct cgroup_subsys_state *css = cgroup_css(dsct, ss); - -- WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); -- - if (!css) - continue; - -+ WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); -+ - if (css->parent && - !(cgroup_ss_mask(dsct) & (1 << ss->id))) { - kill_css(css); -@@ -3448,7 +3448,8 @@ static ssize_t cgroup_type_write(struct kernfs_open_file *of, char *buf, - if (strcmp(strstrip(buf), "threaded")) - return -EINVAL; - -- cgrp = cgroup_kn_lock_live(of->kn, false); -+ /* drain dying csses before we re-apply (threaded) subtree control */ -+ cgrp = cgroup_kn_lock_live(of->kn, true); - if (!cgrp) - return -ENOENT; - -diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c -index 3e5f9c7d939c..3f54dc2f6e1c 100644 ---- a/kernel/trace/trace_kprobe.c -+++ b/kernel/trace/trace_kprobe.c -@@ -290,7 +290,7 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group, - INIT_HLIST_NODE(&tk->rp.kp.hlist); - INIT_LIST_HEAD(&tk->rp.kp.list); - -- ret = trace_probe_init(&tk->tp, event, group, 0); -+ ret = trace_probe_init(&tk->tp, event, group, false); - if (ret < 0) - goto error; - -diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c -index bba18cf44a30..9ae87be422f2 100644 ---- a/kernel/trace/trace_probe.c -+++ b/kernel/trace/trace_probe.c -@@ -984,16 +984,19 @@ void trace_probe_cleanup(struct trace_probe *tp) - } - - int trace_probe_init(struct trace_probe *tp, const char *event, -- const char *group, size_t event_data_size) -+ const char *group, bool alloc_filter) - { - struct trace_event_call *call; -+ size_t size = sizeof(struct trace_probe_event); - int ret = 0; - - if (!event || !group) - return -EINVAL; - -- tp->event = kzalloc(sizeof(struct trace_probe_event) + event_data_size, -- GFP_KERNEL); -+ if (alloc_filter) -+ size += sizeof(struct trace_uprobe_filter); -+ -+ tp->event = kzalloc(size, GFP_KERNEL); - if (!tp->event) - return -ENOMEM; - -diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h -index 03e4e180058d..a0ff9e200ef6 100644 ---- a/kernel/trace/trace_probe.h -+++ b/kernel/trace/trace_probe.h -@@ -223,6 +223,12 @@ struct probe_arg { - const struct fetch_type *type; /* Type of this argument */ - }; - -+struct trace_uprobe_filter { -+ rwlock_t rwlock; -+ int nr_systemwide; -+ struct list_head perf_events; -+}; -+ - /* Event call and class holder */ - struct trace_probe_event { - unsigned int flags; /* For TP_FLAG_* */ -@@ -230,7 +236,7 @@ struct trace_probe_event { - struct trace_event_call call; - struct list_head files; - struct list_head probes; -- char data[0]; -+ struct trace_uprobe_filter filter[0]; - }; - - struct trace_probe { -@@ -323,7 +329,7 @@ static inline bool trace_probe_has_single_file(struct trace_probe *tp) - } - - int trace_probe_init(struct trace_probe *tp, const char *event, -- const char *group, size_t event_data_size); -+ const char *group, bool alloc_filter); - void trace_probe_cleanup(struct trace_probe *tp); - int trace_probe_append(struct trace_probe *tp, struct trace_probe *to); - void trace_probe_unlink(struct trace_probe *tp); -diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c -index f66e202fec13..2619bc5ed520 100644 ---- a/kernel/trace/trace_uprobe.c -+++ b/kernel/trace/trace_uprobe.c -@@ -34,12 +34,6 @@ struct uprobe_trace_entry_head { - #define DATAOF_TRACE_ENTRY(entry, is_return) \ - ((void*)(entry) + SIZEOF_TRACE_ENTRY(is_return)) - --struct trace_uprobe_filter { -- rwlock_t rwlock; -- int nr_systemwide; -- struct list_head perf_events; --}; -- - static int trace_uprobe_create(int argc, const char **argv); - static int trace_uprobe_show(struct seq_file *m, struct dyn_event *ev); - static int trace_uprobe_release(struct dyn_event *ev); -@@ -263,14 +257,6 @@ process_fetch_insn(struct fetch_insn *code, struct pt_regs *regs, void *dest, - } - NOKPROBE_SYMBOL(process_fetch_insn) - --static struct trace_uprobe_filter * --trace_uprobe_get_filter(struct trace_uprobe *tu) --{ -- struct trace_probe_event *event = tu->tp.event; -- -- return (struct trace_uprobe_filter *)&event->data[0]; --} -- - static inline void init_trace_uprobe_filter(struct trace_uprobe_filter *filter) - { - rwlock_init(&filter->rwlock); -@@ -358,8 +344,7 @@ alloc_trace_uprobe(const char *group, const char *event, int nargs, bool is_ret) - if (!tu) - return ERR_PTR(-ENOMEM); - -- ret = trace_probe_init(&tu->tp, event, group, -- sizeof(struct trace_uprobe_filter)); -+ ret = trace_probe_init(&tu->tp, event, group, true); - if (ret < 0) - goto error; - -@@ -367,7 +352,7 @@ alloc_trace_uprobe(const char *group, const char *event, int nargs, bool is_ret) - tu->consumer.handler = uprobe_dispatcher; - if (is_ret) - tu->consumer.ret_handler = uretprobe_dispatcher; -- init_trace_uprobe_filter(trace_uprobe_get_filter(tu)); -+ init_trace_uprobe_filter(tu->tp.event->filter); - return tu; - - error: -@@ -1076,7 +1061,7 @@ static void __probe_event_disable(struct trace_probe *tp) - struct trace_uprobe *tu; - - tu = container_of(tp, struct trace_uprobe, tp); -- WARN_ON(!uprobe_filter_is_empty(trace_uprobe_get_filter(tu))); -+ WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); - - list_for_each_entry(pos, trace_probe_probe_list(tp), list) { - tu = container_of(pos, struct trace_uprobe, tp); -@@ -1117,7 +1102,7 @@ static int probe_event_enable(struct trace_event_call *call, - } - - tu = container_of(tp, struct trace_uprobe, tp); -- WARN_ON(!uprobe_filter_is_empty(trace_uprobe_get_filter(tu))); -+ WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); - - if (enabled) - return 0; -@@ -1281,7 +1266,7 @@ static int uprobe_perf_close(struct trace_event_call *call, - return -ENODEV; - - tu = container_of(tp, struct trace_uprobe, tp); -- if (trace_uprobe_filter_remove(trace_uprobe_get_filter(tu), event)) -+ if (trace_uprobe_filter_remove(tu->tp.event->filter, event)) - return 0; - - list_for_each_entry(pos, trace_probe_probe_list(tp), list) { -@@ -1306,7 +1291,7 @@ static int uprobe_perf_open(struct trace_event_call *call, - return -ENODEV; - - tu = container_of(tp, struct trace_uprobe, tp); -- if (trace_uprobe_filter_add(trace_uprobe_get_filter(tu), event)) -+ if (trace_uprobe_filter_add(tu->tp.event->filter, event)) - return 0; - - list_for_each_entry(pos, trace_probe_probe_list(tp), list) { -@@ -1328,7 +1313,7 @@ static bool uprobe_perf_filter(struct uprobe_consumer *uc, - int ret; - - tu = container_of(uc, struct trace_uprobe, consumer); -- filter = trace_uprobe_get_filter(tu); -+ filter = tu->tp.event->filter; - - read_lock(&filter->rwlock); - ret = __uprobe_perf_filter(filter, mm); -diff --git a/lib/test_xarray.c b/lib/test_xarray.c -index 03c3f42966ce..55c14e8c8859 100644 ---- a/lib/test_xarray.c -+++ b/lib/test_xarray.c -@@ -1160,6 +1160,27 @@ static noinline void check_move_tiny(struct xarray *xa) - XA_BUG_ON(xa, !xa_empty(xa)); - } - -+static noinline void check_move_max(struct xarray *xa) -+{ -+ XA_STATE(xas, xa, 0); -+ -+ xa_store_index(xa, ULONG_MAX, GFP_KERNEL); -+ rcu_read_lock(); -+ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX)); -+ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL); -+ rcu_read_unlock(); -+ -+ xas_set(&xas, 0); -+ rcu_read_lock(); -+ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX)); -+ xas_pause(&xas); -+ XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL); -+ rcu_read_unlock(); -+ -+ xa_erase_index(xa, ULONG_MAX); -+ XA_BUG_ON(xa, !xa_empty(xa)); -+} -+ - static noinline void check_move_small(struct xarray *xa, unsigned long idx) - { - XA_STATE(xas, xa, 0); -@@ -1268,6 +1289,7 @@ static noinline void check_move(struct xarray *xa) - xa_destroy(xa); - - check_move_tiny(xa); -+ check_move_max(xa); - - for (i = 0; i < 16; i++) - check_move_small(xa, 1UL << i); -diff --git a/lib/xarray.c b/lib/xarray.c -index 47e17d46e5f8..1d9fab7db8da 100644 ---- a/lib/xarray.c -+++ b/lib/xarray.c -@@ -968,6 +968,7 @@ void xas_pause(struct xa_state *xas) - if (xas_invalid(xas)) - return; - -+ xas->xa_node = XAS_RESTART; - if (node) { - unsigned int offset = xas->xa_offset; - while (++offset < XA_CHUNK_SIZE) { -@@ -975,10 +976,11 @@ void xas_pause(struct xa_state *xas) - break; - } - xas->xa_index += (offset - xas->xa_offset) << node->shift; -+ if (xas->xa_index == 0) -+ xas->xa_node = XAS_BOUNDS; - } else { - xas->xa_index++; - } -- xas->xa_node = XAS_RESTART; - } - EXPORT_SYMBOL_GPL(xas_pause); - -@@ -1080,7 +1082,7 @@ void *xas_find(struct xa_state *xas, unsigned long max) - { - void *entry; - -- if (xas_error(xas)) -+ if (xas_error(xas) || xas->xa_node == XAS_BOUNDS) - return NULL; - if (xas->xa_index > max) - return set_bounds(xas); -@@ -1088,7 +1090,7 @@ void *xas_find(struct xa_state *xas, unsigned long max) - if (!xas->xa_node) { - xas->xa_index = 1; - return set_bounds(xas); -- } else if (xas_top(xas->xa_node)) { -+ } else if (xas->xa_node == XAS_RESTART) { - entry = xas_load(xas); - if (entry || xas_not_node(xas->xa_node)) - return entry; -diff --git a/mm/mempolicy.c b/mm/mempolicy.c -index e08c94170ae4..fbb3258af275 100644 ---- a/mm/mempolicy.c -+++ b/mm/mempolicy.c -@@ -2802,6 +2802,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) - char *flags = strchr(str, '='); - int err = 1, mode; - -+ if (flags) -+ *flags++ = '\0'; /* terminate mode string */ -+ - if (nodelist) { - /* NUL-terminate mode or flags string */ - *nodelist++ = '\0'; -@@ -2812,9 +2815,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) - } else - nodes_clear(nodes); - -- if (flags) -- *flags++ = '\0'; /* terminate mode string */ -- - mode = match_string(policy_modes, MPOL_MAX, str); - if (mode < 0) - goto out; -diff --git a/mm/migrate.c b/mm/migrate.c -index 45d3303e0022..6956627ebf8b 100644 ---- a/mm/migrate.c -+++ b/mm/migrate.c -@@ -1680,7 +1680,7 @@ out_flush: - err1 = do_move_pages_to_node(mm, &pagelist, current_node); - if (!err1) - err1 = store_status(status, start, current_node, i - start); -- if (!err) -+ if (err >= 0) - err = err1; - out: - return err; -diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c -index d32077b28433..8159b344deef 100644 ---- a/net/bluetooth/hci_sock.c -+++ b/net/bluetooth/hci_sock.c -@@ -831,6 +831,8 @@ static int hci_sock_release(struct socket *sock) - if (!sk) - return 0; - -+ lock_sock(sk); -+ - switch (hci_pi(sk)->channel) { - case HCI_CHANNEL_MONITOR: - atomic_dec(&monitor_promisc); -@@ -878,6 +880,7 @@ static int hci_sock_release(struct socket *sock) - skb_queue_purge(&sk->sk_receive_queue); - skb_queue_purge(&sk->sk_write_queue); - -+ release_sock(sk); - sock_put(sk); - return 0; - } -diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c -index 1292f3f0f93f..96b2566c298d 100644 ---- a/net/core/flow_dissector.c -+++ b/net/core/flow_dissector.c -@@ -758,10 +758,10 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys, - struct flow_dissector *flow_dissector, - void *target_container) - { -+ struct flow_dissector_key_ports *key_ports = NULL; - struct flow_dissector_key_control *key_control; - struct flow_dissector_key_basic *key_basic; - struct flow_dissector_key_addrs *key_addrs; -- struct flow_dissector_key_ports *key_ports; - struct flow_dissector_key_tags *key_tags; - - key_control = skb_flow_dissector_target(flow_dissector, -@@ -800,10 +800,17 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys, - key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; - } - -- if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) { -+ if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) - key_ports = skb_flow_dissector_target(flow_dissector, - FLOW_DISSECTOR_KEY_PORTS, - target_container); -+ else if (dissector_uses_key(flow_dissector, -+ FLOW_DISSECTOR_KEY_PORTS_RANGE)) -+ key_ports = skb_flow_dissector_target(flow_dissector, -+ FLOW_DISSECTOR_KEY_PORTS_RANGE, -+ target_container); -+ -+ if (key_ports) { - key_ports->src = flow_keys->sport; - key_ports->dst = flow_keys->dport; - } -diff --git a/net/core/utils.c b/net/core/utils.c -index 6b6e51db9f3b..1f31a39236d5 100644 ---- a/net/core/utils.c -+++ b/net/core/utils.c -@@ -438,6 +438,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, - } - EXPORT_SYMBOL(inet_proto_csum_replace4); - -+/** -+ * inet_proto_csum_replace16 - update layer 4 header checksum field -+ * @sum: Layer 4 header checksum field -+ * @skb: sk_buff for the packet -+ * @from: old IPv6 address -+ * @to: new IPv6 address -+ * @pseudohdr: True if layer 4 header checksum includes pseudoheader -+ * -+ * Update layer 4 header as per the update in IPv6 src/dst address. -+ * -+ * There is no need to update skb->csum in this function, because update in two -+ * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other -+ * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to -+ * update skb->csum, because update in 3 fields a.) IPv4 src/dst address, -+ * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as -+ * L4 Header checksum for skb->csum calculation. -+ */ - void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, - const __be32 *from, const __be32 *to, - bool pseudohdr) -@@ -449,9 +466,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, - if (skb->ip_summed != CHECKSUM_PARTIAL) { - *sum = csum_fold(csum_partial(diff, sizeof(diff), - ~csum_unfold(*sum))); -- if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) -- skb->csum = ~csum_partial(diff, sizeof(diff), -- ~skb->csum); - } else if (pseudohdr) - *sum = ~csum_fold(csum_partial(diff, sizeof(diff), - csum_unfold(*sum))); -diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c -index fb9f6d60c27c..79eef5db336a 100644 ---- a/net/ipv4/ip_vti.c -+++ b/net/ipv4/ip_vti.c -@@ -187,8 +187,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev, - int mtu; - - if (!dst) { -- dev->stats.tx_carrier_errors++; -- goto tx_error_icmp; -+ struct rtable *rt; -+ -+ fl->u.ip4.flowi4_oif = dev->ifindex; -+ fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; -+ rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); -+ if (IS_ERR(rt)) { -+ dev->stats.tx_carrier_errors++; -+ goto tx_error_icmp; -+ } -+ dst = &rt->dst; -+ skb_dst_set(skb, dst); - } - - dst_hold(dst); -diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c -index 6f08b760c2a7..524006aa0d78 100644 ---- a/net/ipv6/ip6_vti.c -+++ b/net/ipv6/ip6_vti.c -@@ -449,8 +449,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) - int err = -1; - int mtu; - -- if (!dst) -- goto tx_err_link_failure; -+ if (!dst) { -+ fl->u.ip6.flowi6_oif = dev->ifindex; -+ fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; -+ dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); -+ if (dst->error) { -+ dst_release(dst); -+ dst = NULL; -+ goto tx_err_link_failure; -+ } -+ skb_dst_set(skb, dst); -+ } - - dst_hold(dst); - dst = xfrm_lookup(t->net, dst, fl, NULL, 0); -diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c -index 70739e746c13..0daaf7e37a21 100644 ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -2954,6 +2954,28 @@ static int ieee80211_start_radar_detection(struct wiphy *wiphy, - return err; - } - -+static void ieee80211_end_cac(struct wiphy *wiphy, -+ struct net_device *dev) -+{ -+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); -+ struct ieee80211_local *local = sdata->local; -+ -+ mutex_lock(&local->mtx); -+ list_for_each_entry(sdata, &local->interfaces, list) { -+ /* it might be waiting for the local->mtx, but then -+ * by the time it gets it, sdata->wdev.cac_started -+ * will no longer be true -+ */ -+ cancel_delayed_work(&sdata->dfs_cac_timer_work); -+ -+ if (sdata->wdev.cac_started) { -+ ieee80211_vif_release_channel(sdata); -+ sdata->wdev.cac_started = false; -+ } -+ } -+ mutex_unlock(&local->mtx); -+} -+ - static struct cfg80211_beacon_data * - cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon) - { -@@ -4023,6 +4045,7 @@ const struct cfg80211_ops mac80211_config_ops = { - #endif - .get_channel = ieee80211_cfg_get_channel, - .start_radar_detection = ieee80211_start_radar_detection, -+ .end_cac = ieee80211_end_cac, - .channel_switch = ieee80211_channel_switch, - .set_qos_map = ieee80211_set_qos_map, - .set_ap_chanwidth = ieee80211_set_ap_chanwidth, -diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c -index 68af62306385..d69983370381 100644 ---- a/net/mac80211/mesh_hwmp.c -+++ b/net/mac80211/mesh_hwmp.c -@@ -328,6 +328,9 @@ u32 airtime_link_metric_get(struct ieee80211_local *local, - unsigned long fail_avg = - ewma_mesh_fail_avg_read(&sta->mesh->fail_avg); - -+ if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) -+ return MAX_METRIC; -+ - /* Try to get rate based on HW/SW RC algorithm. - * Rate is returned in units of Kbps, correct this - * to comply with airtime calculation units -diff --git a/net/mac80211/tkip.c b/net/mac80211/tkip.c -index 727dc9f3f3b3..e7f57bb18f6e 100644 ---- a/net/mac80211/tkip.c -+++ b/net/mac80211/tkip.c -@@ -263,9 +263,21 @@ int ieee80211_tkip_decrypt_data(struct arc4_ctx *ctx, - if ((keyid >> 6) != key->conf.keyidx) - return TKIP_DECRYPT_INVALID_KEYIDX; - -- if (rx_ctx->ctx.state != TKIP_STATE_NOT_INIT && -- (iv32 < rx_ctx->iv32 || -- (iv32 == rx_ctx->iv32 && iv16 <= rx_ctx->iv16))) -+ /* Reject replays if the received TSC is smaller than or equal to the -+ * last received value in a valid message, but with an exception for -+ * the case where a new key has been set and no valid frame using that -+ * key has yet received and the local RSC was initialized to 0. This -+ * exception allows the very first frame sent by the transmitter to be -+ * accepted even if that transmitter were to use TSC 0 (IEEE 802.11 -+ * described TSC to be initialized to 1 whenever a new key is taken into -+ * use). -+ */ -+ if (iv32 < rx_ctx->iv32 || -+ (iv32 == rx_ctx->iv32 && -+ (iv16 < rx_ctx->iv16 || -+ (iv16 == rx_ctx->iv16 && -+ (rx_ctx->iv32 || rx_ctx->iv16 || -+ rx_ctx->ctx.state != TKIP_STATE_NOT_INIT))))) - return TKIP_DECRYPT_REPLAY; - - if (only_iv) { -diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c -index 0399ae8f1188..4f897b14b606 100644 ---- a/net/netfilter/nf_conntrack_proto_sctp.c -+++ b/net/netfilter/nf_conntrack_proto_sctp.c -@@ -114,7 +114,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] = { - { - /* ORIGINAL */ - /* sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS, sHA */ --/* init */ {sCW, sCW, sCW, sCE, sES, sSS, sSR, sSA, sCW, sHA}, -+/* init */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCW, sHA}, - /* init_ack */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCL, sHA}, - /* abort */ {sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL}, - /* shutdown */ {sCL, sCL, sCW, sCE, sSS, sSS, sSR, sSA, sCL, sSS}, -@@ -130,7 +130,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] = { - /* REPLY */ - /* sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS, sHA */ - /* init */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA},/* INIT in sCL Big TODO */ --/* init_ack */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA}, -+/* init_ack */ {sIV, sCW, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA}, - /* abort */ {sIV, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sIV, sCL}, - /* shutdown */ {sIV, sCL, sCW, sCE, sSR, sSS, sSR, sSA, sIV, sSR}, - /* shutdown_ack */ {sIV, sCL, sCW, sCE, sES, sSA, sSA, sSA, sIV, sHA}, -@@ -316,7 +316,7 @@ sctp_new(struct nf_conn *ct, const struct sk_buff *skb, - ct->proto.sctp.vtag[IP_CT_DIR_REPLY] = sh->vtag; - } - -- ct->proto.sctp.state = new_state; -+ ct->proto.sctp.state = SCTP_CONNTRACK_NONE; - } - - return true; -diff --git a/net/netfilter/nf_tables_offload.c b/net/netfilter/nf_tables_offload.c -index 96a64e7594a5..914cd0618d5a 100644 ---- a/net/netfilter/nf_tables_offload.c -+++ b/net/netfilter/nf_tables_offload.c -@@ -437,7 +437,7 @@ static void nft_indr_block_cb(struct net_device *dev, - - mutex_lock(&net->nft.commit_mutex); - chain = __nft_offload_get_chain(dev); -- if (chain) { -+ if (chain && chain->flags & NFT_CHAIN_HW_OFFLOAD) { - struct nft_base_chain *basechain; - - basechain = nft_base_chain(chain); -diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h -index 3dd9515c836b..e0d34f796d0b 100644 ---- a/net/wireless/rdev-ops.h -+++ b/net/wireless/rdev-ops.h -@@ -1171,6 +1171,16 @@ rdev_start_radar_detection(struct cfg80211_registered_device *rdev, - return ret; - } - -+static inline void -+rdev_end_cac(struct cfg80211_registered_device *rdev, -+ struct net_device *dev) -+{ -+ trace_rdev_end_cac(&rdev->wiphy, dev); -+ if (rdev->ops->end_cac) -+ rdev->ops->end_cac(&rdev->wiphy, dev); -+ trace_rdev_return_void(&rdev->wiphy); -+} -+ - static inline int - rdev_set_mcast_rate(struct cfg80211_registered_device *rdev, - struct net_device *dev, -diff --git a/net/wireless/reg.c b/net/wireless/reg.c -index 446c76d44e65..fff9a74891fc 100644 ---- a/net/wireless/reg.c -+++ b/net/wireless/reg.c -@@ -2261,14 +2261,15 @@ static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator) - - static void handle_channel_custom(struct wiphy *wiphy, - struct ieee80211_channel *chan, -- const struct ieee80211_regdomain *regd) -+ const struct ieee80211_regdomain *regd, -+ u32 min_bw) - { - u32 bw_flags = 0; - const struct ieee80211_reg_rule *reg_rule = NULL; - const struct ieee80211_power_rule *power_rule = NULL; - u32 bw; - -- for (bw = MHZ_TO_KHZ(20); bw >= MHZ_TO_KHZ(5); bw = bw / 2) { -+ for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) { - reg_rule = freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), - regd, bw); - if (!IS_ERR(reg_rule)) -@@ -2324,8 +2325,14 @@ static void handle_band_custom(struct wiphy *wiphy, - if (!sband) - return; - -+ /* -+ * We currently assume that you always want at least 20 MHz, -+ * otherwise channel 12 might get enabled if this rule is -+ * compatible to US, which permits 2402 - 2472 MHz. -+ */ - for (i = 0; i < sband->n_channels; i++) -- handle_channel_custom(wiphy, &sband->channels[i], regd); -+ handle_channel_custom(wiphy, &sband->channels[i], regd, -+ MHZ_TO_KHZ(20)); - } - - /* Used by drivers prior to wiphy registration */ -@@ -3885,6 +3892,25 @@ bool regulatory_pre_cac_allowed(struct wiphy *wiphy) - } - EXPORT_SYMBOL(regulatory_pre_cac_allowed); - -+static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev) -+{ -+ struct wireless_dev *wdev; -+ /* If we finished CAC or received radar, we should end any -+ * CAC running on the same channels. -+ * the check !cfg80211_chandef_dfs_usable contain 2 options: -+ * either all channels are available - those the CAC_FINISHED -+ * event has effected another wdev state, or there is a channel -+ * in unavailable state in wdev chandef - those the RADAR_DETECTED -+ * event has effected another wdev state. -+ * In both cases we should end the CAC on the wdev. -+ */ -+ list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { -+ if (wdev->cac_started && -+ !cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef)) -+ rdev_end_cac(rdev, wdev->netdev); -+ } -+} -+ - void regulatory_propagate_dfs_state(struct wiphy *wiphy, - struct cfg80211_chan_def *chandef, - enum nl80211_dfs_state dfs_state, -@@ -3911,8 +3937,10 @@ void regulatory_propagate_dfs_state(struct wiphy *wiphy, - cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state); - - if (event == NL80211_RADAR_DETECTED || -- event == NL80211_RADAR_CAC_FINISHED) -+ event == NL80211_RADAR_CAC_FINISHED) { - cfg80211_sched_dfs_chan_update(rdev); -+ cfg80211_check_and_end_cac(rdev); -+ } - - nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL); - } -diff --git a/net/wireless/trace.h b/net/wireless/trace.h -index d98ad2b3143b..8677d7ab7d69 100644 ---- a/net/wireless/trace.h -+++ b/net/wireless/trace.h -@@ -646,6 +646,11 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_flush_pmksa, - TP_ARGS(wiphy, netdev) - ); - -+DEFINE_EVENT(wiphy_netdev_evt, rdev_end_cac, -+ TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), -+ TP_ARGS(wiphy, netdev) -+); -+ - DECLARE_EVENT_CLASS(station_add_change, - TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac, - struct station_parameters *params), -diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c -index 5e677dac2a0c..69102fda9ebd 100644 ---- a/net/wireless/wext-core.c -+++ b/net/wireless/wext-core.c -@@ -657,7 +657,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev) - return NULL; - } - --static int iw_handler_get_iwstats(struct net_device * dev, -+/* noinline to avoid a bogus warning with -O3 */ -+static noinline int iw_handler_get_iwstats(struct net_device * dev, - struct iw_request_info * info, - union iwreq_data * wrqu, - char * extra) -diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c -index 0f5131bc3342..4d5627e274fe 100644 ---- a/net/xfrm/xfrm_interface.c -+++ b/net/xfrm/xfrm_interface.c -@@ -268,9 +268,6 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) - int err = -1; - int mtu; - -- if (!dst) -- goto tx_err_link_failure; -- - dst_hold(dst); - dst = xfrm_lookup_with_ifid(xi->net, dst, fl, NULL, 0, xi->p.if_id); - if (IS_ERR(dst)) { -@@ -297,7 +294,7 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) - - mtu = dst_mtu(dst); - if (!skb->ignore_df && skb->len > mtu) { -- skb_dst_update_pmtu(skb, mtu); -+ skb_dst_update_pmtu_no_confirm(skb, mtu); - - if (skb->protocol == htons(ETH_P_IPV6)) { - if (mtu < IPV6_MIN_MTU) -@@ -343,6 +340,7 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev) - { - struct xfrm_if *xi = netdev_priv(dev); - struct net_device_stats *stats = &xi->dev->stats; -+ struct dst_entry *dst = skb_dst(skb); - struct flowi fl; - int ret; - -@@ -352,10 +350,33 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev) - case htons(ETH_P_IPV6): - xfrm_decode_session(skb, &fl, AF_INET6); - memset(IP6CB(skb), 0, sizeof(*IP6CB(skb))); -+ if (!dst) { -+ fl.u.ip6.flowi6_oif = dev->ifindex; -+ fl.u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; -+ dst = ip6_route_output(dev_net(dev), NULL, &fl.u.ip6); -+ if (dst->error) { -+ dst_release(dst); -+ stats->tx_carrier_errors++; -+ goto tx_err; -+ } -+ skb_dst_set(skb, dst); -+ } - break; - case htons(ETH_P_IP): - xfrm_decode_session(skb, &fl, AF_INET); - memset(IPCB(skb), 0, sizeof(*IPCB(skb))); -+ if (!dst) { -+ struct rtable *rt; -+ -+ fl.u.ip4.flowi4_oif = dev->ifindex; -+ fl.u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; -+ rt = __ip_route_output_key(dev_net(dev), &fl.u.ip4); -+ if (IS_ERR(rt)) { -+ stats->tx_carrier_errors++; -+ goto tx_err; -+ } -+ skb_dst_set(skb, &rt->dst); -+ } - break; - default: - goto tx_err; -@@ -563,12 +584,9 @@ static void xfrmi_dev_setup(struct net_device *dev) - { - dev->netdev_ops = &xfrmi_netdev_ops; - dev->type = ARPHRD_NONE; -- dev->hard_header_len = ETH_HLEN; -- dev->min_header_len = ETH_HLEN; - dev->mtu = ETH_DATA_LEN; - dev->min_mtu = ETH_MIN_MTU; -- dev->max_mtu = ETH_DATA_LEN; -- dev->addr_len = ETH_ALEN; -+ dev->max_mtu = IP_MAX_MTU; - dev->flags = IFF_NOARP; - dev->needs_free_netdev = true; - dev->priv_destructor = xfrmi_dev_free; -diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c -index c36bafbcd77e..1b467381986f 100644 ---- a/security/tomoyo/common.c -+++ b/security/tomoyo/common.c -@@ -2322,9 +2322,9 @@ static const char * const tomoyo_memory_headers[TOMOYO_MAX_MEMORY_STAT] = { - [TOMOYO_MEMORY_QUERY] = "query message:", - }; - --/* Timestamp counter for last updated. */ --static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; - /* Counter for number of updates. */ -+static atomic_t tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; -+/* Timestamp counter for last updated. */ - static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; - - /** -@@ -2336,10 +2336,7 @@ static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; - */ - void tomoyo_update_stat(const u8 index) - { -- /* -- * I don't use atomic operations because race condition is not fatal. -- */ -- tomoyo_stat_updated[index]++; -+ atomic_inc(&tomoyo_stat_updated[index]); - tomoyo_stat_modified[index] = ktime_get_real_seconds(); - } - -@@ -2360,7 +2357,7 @@ static void tomoyo_read_stat(struct tomoyo_io_buffer *head) - for (i = 0; i < TOMOYO_MAX_POLICY_STAT; i++) { - tomoyo_io_printf(head, "Policy %-30s %10u", - tomoyo_policy_headers[i], -- tomoyo_stat_updated[i]); -+ atomic_read(&tomoyo_stat_updated[i])); - if (tomoyo_stat_modified[i]) { - struct tomoyo_time stamp; - -diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c -index 4570f662fb48..d78f4d856aaf 100644 ---- a/sound/soc/codecs/hdac_hda.c -+++ b/sound/soc/codecs/hdac_hda.c -@@ -498,7 +498,9 @@ static int hdac_hda_dev_remove(struct hdac_device *hdev) - struct hdac_hda_priv *hda_pvt; - - hda_pvt = dev_get_drvdata(&hdev->dev); -- cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); -+ if (hda_pvt && hda_pvt->codec.registered) -+ cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); -+ - return 0; - } - -diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c -index adbae1f36a8a..747ca248bf10 100644 ---- a/sound/soc/codecs/rt5640.c -+++ b/sound/soc/codecs/rt5640.c -@@ -2432,6 +2432,13 @@ static void rt5640_disable_jack_detect(struct snd_soc_component *component) - { - struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); - -+ /* -+ * soc_remove_component() force-disables jack and thus rt5640->jack -+ * could be NULL at the time of driver's module unloading. -+ */ -+ if (!rt5640->jack) -+ return; -+ - disable_irq(rt5640->irq); - rt5640_cancel_work(rt5640); - -diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c -index 7ccbca47240d..fef01e1dd15c 100644 ---- a/sound/soc/soc-topology.c -+++ b/sound/soc/soc-topology.c -@@ -1891,6 +1891,10 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, - link->num_codecs = 1; - link->num_platforms = 1; - -+ link->dobj.index = tplg->index; -+ link->dobj.ops = tplg->ops; -+ link->dobj.type = SND_SOC_DOBJ_DAI_LINK; -+ - if (strlen(pcm->pcm_name)) { - link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); - link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL); -@@ -1927,9 +1931,6 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, - goto err; - } - -- link->dobj.index = tplg->index; -- link->dobj.ops = tplg->ops; -- link->dobj.type = SND_SOC_DOBJ_DAI_LINK; - list_add(&link->dobj.list, &tplg->comp->dobj_list); - - return 0; -diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c -index 3ca6795a89ba..9e8233c10d86 100644 ---- a/sound/soc/sof/intel/hda-codec.c -+++ b/sound/soc/sof/intel/hda-codec.c -@@ -24,19 +24,18 @@ - #define IDISP_VID_INTEL 0x80860000 - - /* load the legacy HDA codec driver */ --#ifdef MODULE --static void hda_codec_load_module(struct hda_codec *codec) -+static int hda_codec_load_module(struct hda_codec *codec) - { -+#ifdef MODULE - char alias[MODULE_NAME_LEN]; - const char *module = alias; - - snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias)); - dev_dbg(&codec->core.dev, "loading codec module: %s\n", module); - request_module(module); --} --#else --static void hda_codec_load_module(struct hda_codec *codec) {} - #endif -+ return device_attach(hda_codec_dev(codec)); -+} - - /* enable controller wake up event for all codecs with jack connectors */ - void hda_codec_jack_wake_enable(struct snd_sof_dev *sdev) -@@ -116,10 +115,16 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address) - /* use legacy bus only for HDA codecs, idisp uses ext bus */ - if ((resp & 0xFFFF0000) != IDISP_VID_INTEL) { - hdev->type = HDA_DEV_LEGACY; -- hda_codec_load_module(&hda_priv->codec); -+ ret = hda_codec_load_module(&hda_priv->codec); -+ /* -+ * handle ret==0 (no driver bound) as an error, but pass -+ * other return codes without modification -+ */ -+ if (ret == 0) -+ ret = -ENOENT; - } - -- return 0; -+ return ret; - #else - hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL); - if (!hdev) -diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c -index 48ea915b24ba..2ed92c990b97 100644 ---- a/sound/soc/sti/uniperif_player.c -+++ b/sound/soc/sti/uniperif_player.c -@@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player, - * sampling frequency. If no sample rate is already specified, then - * set one. - */ -- mutex_lock(&player->ctrl_lock); - if (runtime) { - switch (runtime->rate) { - case 22050: -@@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif *player, - player->stream_settings.iec958.status[3 + (n * 4)] << 24; - SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status); - } -- mutex_unlock(&player->ctrl_lock); - - /* Update the channel status */ - if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) -@@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif *player, - - SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player); - -+ mutex_lock(&player->ctrl_lock); - /* Update the channel status */ - uni_player_set_channel_status(player, runtime); -+ mutex_unlock(&player->ctrl_lock); - - /* Clear the user validity user bits */ - SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0); -@@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, - iec958->status[1] = ucontrol->value.iec958.status[1]; - iec958->status[2] = ucontrol->value.iec958.status[2]; - iec958->status[3] = ucontrol->value.iec958.status[3]; -- mutex_unlock(&player->ctrl_lock); - - spin_lock_irqsave(&player->irq_lock, flags); - if (player->substream && player->substream->runtime) -@@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, - uni_player_set_channel_status(player, NULL); - - spin_unlock_irqrestore(&player->irq_lock, flags); -+ mutex_unlock(&player->ctrl_lock); -+ - return 0; - } - -diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h -index 980cb9266718..5e9e781905ed 100644 ---- a/tools/include/linux/string.h -+++ b/tools/include/linux/string.h -@@ -17,7 +17,15 @@ int strtobool(const char *s, bool *res); - * However uClibc headers also define __GLIBC__ hence the hack below - */ - #if defined(__GLIBC__) && !defined(__UCLIBC__) -+// pragma diagnostic was introduced in gcc 4.6 -+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wredundant-decls" -+#endif - extern size_t strlcpy(char *dest, const char *src, size_t size); -+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) -+#pragma GCC diagnostic pop -+#endif - #endif - - char *str_error_r(int errnum, char *buf, size_t buflen); -diff --git a/tools/lib/string.c b/tools/lib/string.c -index f2ae1b87c719..f645343815de 100644 ---- a/tools/lib/string.c -+++ b/tools/lib/string.c -@@ -96,6 +96,10 @@ int strtobool(const char *s, bool *res) - * If libc has strlcpy() then that version will override this - * implementation: - */ -+#ifdef __clang__ -+#pragma clang diagnostic push -+#pragma clang diagnostic ignored "-Wignored-attributes" -+#endif - size_t __weak strlcpy(char *dest, const char *src, size_t size) - { - size_t ret = strlen(src); -@@ -107,6 +111,9 @@ size_t __weak strlcpy(char *dest, const char *src, size_t size) - } - return ret; - } -+#ifdef __clang__ -+#pragma clang diagnostic pop -+#endif - - /** - * skip_spaces - Removes leading whitespace from @str. -diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c -index f3cbf86e51ac..20eed719542e 100644 ---- a/tools/lib/traceevent/parse-filter.c -+++ b/tools/lib/traceevent/parse-filter.c -@@ -1228,8 +1228,10 @@ filter_event(struct tep_event_filter *filter, struct tep_event *event, - } - - filter_type = add_filter_type(filter, event->id); -- if (filter_type == NULL) -+ if (filter_type == NULL) { -+ free_arg(arg); - return TEP_ERRNO__MEM_ALLOC_FAILED; -+ } - - if (filter_type->filter) - free_arg(filter_type->filter); -diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c -index e69f44941aad..f2e9d2b1b913 100644 ---- a/tools/perf/builtin-c2c.c -+++ b/tools/perf/builtin-c2c.c -@@ -595,8 +595,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused, - { - struct c2c_hist_entry *c2c_left; - struct c2c_hist_entry *c2c_right; -- unsigned int tot_hitm_left; -- unsigned int tot_hitm_right; -+ uint64_t tot_hitm_left; -+ uint64_t tot_hitm_right; - - c2c_left = container_of(left, struct c2c_hist_entry, he); - c2c_right = container_of(right, struct c2c_hist_entry, he); -@@ -629,7 +629,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __maybe_unused, \ - \ - c2c_left = container_of(left, struct c2c_hist_entry, he); \ - c2c_right = container_of(right, struct c2c_hist_entry, he); \ -- return c2c_left->stats.__f - c2c_right->stats.__f; \ -+ return (uint64_t) c2c_left->stats.__f - \ -+ (uint64_t) c2c_right->stats.__f; \ - } - - #define STAT_FN(__f) \ -@@ -682,7 +683,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused, - c2c_left = container_of(left, struct c2c_hist_entry, he); - c2c_right = container_of(right, struct c2c_hist_entry, he); - -- return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats); -+ return (uint64_t) llc_miss(&c2c_left->stats) - -+ (uint64_t) llc_miss(&c2c_right->stats); - } - - static uint64_t total_records(struct c2c_stats *stats) -diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c -index ea3f0745d7ad..6407dff405d9 100644 ---- a/tools/perf/builtin-report.c -+++ b/tools/perf/builtin-report.c -@@ -399,10 +399,10 @@ static int report__setup_sample_type(struct report *rep) - PERF_SAMPLE_BRANCH_ANY)) - rep->nonany_branch_mode = true; - --#ifndef HAVE_LIBUNWIND_SUPPORT -+#if !defined(HAVE_LIBUNWIND_SUPPORT) && !defined(HAVE_DWARF_SUPPORT) - if (dwarf_callchain_users) { -- ui__warning("Please install libunwind development packages " -- "during the perf build.\n"); -+ ui__warning("Please install libunwind or libdw " -+ "development packages during the perf build.\n"); - } - #endif - From 992d0aa88cb2cacaf16660ce153dc51b7817b0c4 Mon Sep 17 00:00:00 2001 From: Piotr Szczepanik Date: Fri, 7 Feb 2020 20:22:37 +0100 Subject: [PATCH 26/54] Linked legacy Rock Pi S' DTS file to mainline's filename --- .../board-rockpi-s-modern-dts-link.patch | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 patch/kernel/rockpis-legacy/board-rockpi-s-modern-dts-link.patch diff --git a/patch/kernel/rockpis-legacy/board-rockpi-s-modern-dts-link.patch b/patch/kernel/rockpis-legacy/board-rockpi-s-modern-dts-link.patch new file mode 100644 index 0000000000..6239d80195 --- /dev/null +++ b/patch/kernel/rockpis-legacy/board-rockpi-s-modern-dts-link.patch @@ -0,0 +1,20 @@ +diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile +index 3c650d60..15abd689 100644 +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -28,6 +28,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-evb-dmic-pdm-v10.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-evb-dmic-pdm-v11.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-fpga.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-robot.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-rock-pi-s.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-voice-module-board-v10.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308b-evb-amic-v10.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-evb-ai-va-v10.dtb +diff --git a/arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts b/arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts +new file mode 120000 +index 00000000..6db75655 +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts +@@ -0,0 +1 @@ ++rockpi-s-linux.dts +\ No newline at end of file From d366d621bd984de7f4c771b00452cce084dd348a Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Fri, 7 Feb 2020 16:04:59 -0500 Subject: [PATCH 27/54] UART4 should be disabled by default on OPi4 since overlay exist --- patch/kernel/rockchip64-dev/add-board-orangepi-4.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patch/kernel/rockchip64-dev/add-board-orangepi-4.patch b/patch/kernel/rockchip64-dev/add-board-orangepi-4.patch index e63c40f25e..9233362e4b 100644 --- a/patch/kernel/rockchip64-dev/add-board-orangepi-4.patch +++ b/patch/kernel/rockchip64-dev/add-board-orangepi-4.patch @@ -469,7 +469,7 @@ index 00000000..17010305 +}; + +&uart4 { -+ status = "okay"; ++ status = "disabled"; +}; + +&vopb { From 83cf87922b93cb27e03a59e6c4121c7d99bb41c4 Mon Sep 17 00:00:00 2001 From: Piotr Szczepanik Date: Fri, 7 Feb 2020 21:27:14 +0100 Subject: [PATCH 28/54] FDT file configurable per board --- config/boards/lafrite.conf | 1 + config/boards/nanopim4v2.conf | 2 -- config/boards/orangepi4.wip | 2 -- config/boards/pinebook-pro.wip | 1 + config/boards/roc-rk3399-pc.csc | 10 +--------- config/boards/xt-q8l-v10.tvb | 1 + config/boards/z28pro.tvb | 2 +- .../sources/families/include/rockchip64_common.inc | 12 ------------ config/sources/families/meson-gxl.conf | 6 +----- config/sources/families/rockchip.conf | 1 - lib/distributions.sh | 3 +++ .../u-boot/u-boot-rk3399/add-board-nanopi-m4v2.patch | 2 +- 12 files changed, 10 insertions(+), 33 deletions(-) diff --git a/config/boards/lafrite.conf b/config/boards/lafrite.conf index b2c0fe4174..1ba94a9844 100644 --- a/config/boards/lafrite.conf +++ b/config/boards/lafrite.conf @@ -2,5 +2,6 @@ BOARD_NAME="La Frite" BOARDFAMILY="meson-gxl" BOOTCONFIG="libretech-ac_defconfig" +BOOT_FDT_FILE="amlogic/meson-gxl-s805x-libretech-ac.dtb" KERNEL_TARGET="current,dev" FULL_DESKTOP="yes" diff --git a/config/boards/nanopim4v2.conf b/config/boards/nanopim4v2.conf index 2b9bcdf215..2428c894ef 100644 --- a/config/boards/nanopim4v2.conf +++ b/config/boards/nanopim4v2.conf @@ -2,7 +2,5 @@ BOARD_NAME="NanoPi M4V2" BOARDFAMILY="rk3399" BOOTCONFIG="nanopi-m4v2-rk3399_defconfig" -MODULES="" -MODULES_NEXT="" KERNEL_TARGET="legacy,current,dev" FULL_DESKTOP="yes" diff --git a/config/boards/orangepi4.wip b/config/boards/orangepi4.wip index 23408f6e46..7633d0a78f 100644 --- a/config/boards/orangepi4.wip +++ b/config/boards/orangepi4.wip @@ -2,7 +2,5 @@ BOARD_NAME="OrangePi 4" BOARDFAMILY="rk3399" BOOTCONFIG="orangepi-4-rk3399_defconfig" -MODULES="" -MODULES_NEXT="" KERNEL_TARGET="legacy,current,dev" FULL_DESKTOP="yes" diff --git a/config/boards/pinebook-pro.wip b/config/boards/pinebook-pro.wip index e548a834e6..71d2339bc5 100644 --- a/config/boards/pinebook-pro.wip +++ b/config/boards/pinebook-pro.wip @@ -2,6 +2,7 @@ BOARD_NAME="Pinebook Pro" BOARDFAMILY="rockchip64" BOOTCONFIG="pinebook_pro-rk3399_defconfig" +BOOT_FDT_FILE="rockchip/rk3399-pinebook-pro.dtb" DESKTOP_AUTOLOGIN="no" KERNEL_TARGET="legacy,current,dev" FULL_DESKTOP="yes" diff --git a/config/boards/roc-rk3399-pc.csc b/config/boards/roc-rk3399-pc.csc index b470f9debc..4932c5f4be 100644 --- a/config/boards/roc-rk3399-pc.csc +++ b/config/boards/roc-rk3399-pc.csc @@ -2,13 +2,5 @@ BOARD_NAME="ROC-RK3399-PC" BOARDFAMILY="rk3399" BOOTCONFIG="roc-pc-rk3399_defconfig" -# -MODULES="" -MODULES_NEXT="" -# KERNEL_TARGET="legacy,current,dev" -CLI_TARGET="buster,bionic:default" -DESKTOP_TARGET="buster,bionic:default" -# -CLI_BETA_TARGET="buster,bionic:dev" -DESKTOP_BETA_TARGET="" +FULL_DESKTOP="yes" diff --git a/config/boards/xt-q8l-v10.tvb b/config/boards/xt-q8l-v10.tvb index 0b1f1b3df7..fa513e6225 100644 --- a/config/boards/xt-q8l-v10.tvb +++ b/config/boards/xt-q8l-v10.tvb @@ -2,5 +2,6 @@ BOARD_NAME="xt-q8l-v10" BOARDFAMILY="rockchip" BOOTCONFIG="xt-q8l-v10-rk3288_defconfig" +BOOT_FDT_FILE="rk3288-xt-q8l-v10.dtb" MODULES_LEGACY="hci_uart rfcomm hidp" KERNEL_TARGET="legacy,current,dev" diff --git a/config/boards/z28pro.tvb b/config/boards/z28pro.tvb index 320ac0f418..d2c9f1b5f0 100644 --- a/config/boards/z28pro.tvb +++ b/config/boards/z28pro.tvb @@ -2,6 +2,6 @@ BOARD_NAME="Z28 PRO" BOARDFAMILY="rockchip64" BOOTCONFIG="rock64-rk3328_defconfig" -MODULES_LEGACY="" +BOOT_FDT_FILE="rockchip/rk3328-z28pro.dtb" KERNEL_TARGET="legacy,current" FULL_DESKTOP="yes" diff --git a/config/sources/families/include/rockchip64_common.inc b/config/sources/families/include/rockchip64_common.inc index e03ff53513..464ea1963e 100644 --- a/config/sources/families/include/rockchip64_common.inc +++ b/config/sources/families/include/rockchip64_common.inc @@ -105,20 +105,8 @@ atf_custom_postprocess() family_tweaks() { - [[ $BOARD == firefly-rk3399 ]] && echo "fdtfile=rockchip/rk3399-firefly.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == nanopct4 ]] && echo "fdtfile=rockchip/rk3399-nanopc-t4.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == nanopim4 ]] && echo "fdtfile=rockchip/rk3399-nanopi-m4.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == nanopim4v2 ]] && echo "fdtfile=rockchip/rk3399-nanopi-m4v2.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == nanopineo4 ]] && echo "fdtfile=rockchip/rk3399-nanopi-neo4.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == orangepi-rk3399 ]] && echo "fdtfile=rockchip/rk3399-orangepi.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == orangepi4 ]] && echo "fdtfile=rockchip/rk3399-orangepi-4.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == pinebook-pro ]] && echo "fdtfile=rockchip/rk3399-pinebook-pro.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == roc-rk3399-pc ]] && echo "fdtfile=rockchip/rk3399-roc-pc.dtb" >> $SDCARD/boot/armbianEnv.txt - [[ $BOARD == rockpi-4* ]] && echo "fdtfile=rockchip/rk3399-rock-pi-4.dtb" >> $SDCARD/boot/armbianEnv.txt - if [[ $BOARD == z28pro ]]; then - echo "fdtfile=rockchip/rk3328-z28pro.dtb" >> $SDCARD/boot/armbianEnv.txt chroot $SDCARD /bin/bash -c "systemctl --no-reload enable z28pro-bluetooth.service >/dev/null 2>&1" elif [[ -f $SDCARD/lib/systemd/system/rk3399-bluetooth.service ]]; then diff --git a/config/sources/families/meson-gxl.conf b/config/sources/families/meson-gxl.conf index c9287e4ad7..dadaf9d88d 100644 --- a/config/sources/families/meson-gxl.conf +++ b/config/sources/families/meson-gxl.conf @@ -8,11 +8,7 @@ fi family_tweaks() { - - if [[ $BOARD == lafrite ]]; then - echo "fdtfile=amlogic/meson-gxl-s805x-libretech-ac.dtb" >> $SDCARD/boot/armbianEnv.txt - fi - + : } uboot_custom_postprocess() diff --git a/config/sources/families/rockchip.conf b/config/sources/families/rockchip.conf index 3f38bddf96..c7f7c2f8d4 100644 --- a/config/sources/families/rockchip.conf +++ b/config/sources/families/rockchip.conf @@ -75,7 +75,6 @@ family_tweaks() fi if [[ $BOARD == xt-q8l-v10 ]]; then - echo "fdtfile=rk3288-xt-q8l-v10.dtb" >> $SDCARD/boot/armbianEnv.txt mkdir -p $SDCARD/etc/firmware/ ln -sf /lib/firmware/brcm/BCM4330B1.hcd $SDCARD/etc/firmware chroot $SDCARD /bin/bash -c "systemctl --no-reload enable ap6330-bluetooth.service >/dev/null 2>&1" diff --git a/lib/distributions.sh b/lib/distributions.sh index 8531828f9d..e408d8ae23 100644 --- a/lib/distributions.sh +++ b/lib/distributions.sh @@ -177,6 +177,9 @@ install_common() [[ -n $DEFAULT_OVERLAYS && -f $SDCARD/boot/armbianEnv.txt ]] && \ echo "overlays=${DEFAULT_OVERLAYS//,/ }" >> "${SDCARD}"/boot/armbianEnv.txt + [[ -n $BOOT_FDT_FILE && -f $SDCARD/boot/armbianEnv.txt ]] && \ + echo "fdtfile=${BOOT_FDT_FILE}" >> "${SDCARD}/boot/armbianEnv.txt" + # initial date for fake-hwclock date -u '+%Y-%m-%d %H:%M:%S' > "${SDCARD}"/etc/fake-hwclock.data diff --git a/patch/u-boot/u-boot-rk3399/add-board-nanopi-m4v2.patch b/patch/u-boot/u-boot-rk3399/add-board-nanopi-m4v2.patch index dbfb02ee83..40436a4823 100644 --- a/patch/u-boot/u-boot-rk3399/add-board-nanopi-m4v2.patch +++ b/patch/u-boot/u-boot-rk3399/add-board-nanopi-m4v2.patch @@ -119,7 +119,7 @@ index 00000000..ff4d32e2 +CONFIG_DEBUG_UART_BASE=0xFF1A0000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_DEBUG_UART=y -+CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-nanopi-m4.dtb" ++CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-nanopi-m4v2.dtb" +CONFIG_MISC_INIT_R=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_DISPLAY_BOARDINFO_LATE=y From aa6d56dab39de5a7e02e419cd614512f95205463 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Sat, 8 Feb 2020 10:12:47 +0100 Subject: [PATCH 29/54] Bugfix - Focal desktop was not building. Updating kernel configuration for Rockchip, bump with rootfs version due to cache recompile, adding kernel config for rockchip DEV, attached to 5.5.y --- config/kernel/linux-rockchip-current.config | 221 +- config/kernel/linux-rockchip-dev.config | 6997 +++++++++++++++++- config/kernel/linux-rockchip64-legacy.config | 4 +- config/sources/families/rockchip64.conf | 1 + lib/configuration.sh | 4 +- 5 files changed, 7093 insertions(+), 134 deletions(-) mode change 120000 => 100644 config/kernel/linux-rockchip-dev.config diff --git a/config/kernel/linux-rockchip-current.config b/config/kernel/linux-rockchip-current.config index 5028188f27..ddb2901266 100644 --- a/config/kernel/linux-rockchip-current.config +++ b/config/kernel/linux-rockchip-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.5.1 Kernel Configuration +# Linux/arm 5.4.18 Kernel Configuration # # @@ -21,6 +21,7 @@ CONFIG_BUILDTIME_EXTABLE_SORT=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_HEADER_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -178,6 +179,7 @@ CONFIG_UID16=y CONFIG_MULTIUSER=y # CONFIG_SGETMASK_SYSCALL is not set CONFIG_SYSFS_SYSCALL=y +# CONFIG_SYSCTL_SYSCALL is not set CONFIG_FHANDLE=y CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y @@ -501,6 +503,7 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_CPUFREQ_DT=m CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_ARM_BIG_LITTLE_CPUFREQ=m # CONFIG_QORIQ_CPUFREQ is not set # end of CPU Frequency scaling @@ -592,9 +595,7 @@ CONFIG_CRYPTO_GHASH_ARM_CE=m CONFIG_CRYPTO_CRCT10DIF_ARM_CE=m CONFIG_CRYPTO_CRC32_ARM_CE=m CONFIG_CRYPTO_CHACHA20_NEON=m -CONFIG_CRYPTO_POLY1305_ARM=m CONFIG_CRYPTO_NHPOLY1305_NEON=m -CONFIG_CRYPTO_CURVE25519_NEON=m # CONFIG_VIRTUALIZATION is not set # @@ -647,6 +648,7 @@ CONFIG_HAVE_COPY_THREAD_TLS=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y +CONFIG_64BIT_TIME=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y @@ -655,6 +657,7 @@ CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_ARCH_HAS_PHYS_TO_DMA=y +CONFIG_REFCOUNT_FULL=y # CONFIG_LOCK_EVENT_COUNTS is not set # @@ -684,7 +687,6 @@ CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_CGROUP_RWSTAT=y CONFIG_BLK_DEV_BSG=y # CONFIG_BLK_DEV_BSGLIB is not set # CONFIG_BLK_DEV_INTEGRITY is not set @@ -810,7 +812,6 @@ CONFIG_UNIX_SCM=y CONFIG_UNIX_DIAG=m CONFIG_TLS=m # CONFIG_TLS_DEVICE is not set -# CONFIG_TLS_TOE is not set CONFIG_XFRM=y CONFIG_XFRM_OFFLOAD=y CONFIG_XFRM_ALGO=m @@ -1299,7 +1300,6 @@ CONFIG_RDS_TCP=m # CONFIG_RDS_DEBUG is not set CONFIG_TIPC=m CONFIG_TIPC_MEDIA_UDP=y -CONFIG_TIPC_CRYPTO=y CONFIG_TIPC_DIAG=m CONFIG_ATM=m CONFIG_ATM_CLIP=m @@ -1329,7 +1329,6 @@ CONFIG_NET_DSA_TAG_DSA=m CONFIG_NET_DSA_TAG_EDSA=m CONFIG_NET_DSA_TAG_MTK=m CONFIG_NET_DSA_TAG_KSZ=m -CONFIG_NET_DSA_TAG_OCELOT=m CONFIG_NET_DSA_TAG_QCA=m CONFIG_NET_DSA_TAG_LAN9303=m CONFIG_NET_DSA_TAG_SJA1105=m @@ -1711,7 +1710,6 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set -CONFIG_FW_CACHE=y # end of Firmware loader CONFIG_WANT_DEV_COREDUMP=y @@ -1843,7 +1841,39 @@ CONFIG_EEPROM_93CX6=m # # Intel MIC & related support # + +# +# Intel MIC Bus Driver +# + +# +# SCIF Bus Driver +# + +# +# VOP Bus Driver +# # CONFIG_VOP_BUS is not set + +# +# Intel MIC Host Driver +# + +# +# Intel MIC Card Driver +# + +# +# SCIF Driver +# + +# +# Intel MIC Coprocessor State Management (COSM) Drivers +# + +# +# VOP Driver +# # end of Intel MIC & related support # CONFIG_ECHO is not set @@ -1965,6 +1995,10 @@ CONFIG_ATM_DRIVERS=y # CONFIG_ATM_DUMMY is not set # CONFIG_ATM_TCP is not set +# +# CAIF transport drivers +# + # # Distributed Switch Architecture drivers # @@ -2077,6 +2111,7 @@ CONFIG_ADIN_PHY=m # CONFIG_AMD_PHY is not set # CONFIG_AQUANTIA_PHY is not set CONFIG_AX88796B_PHY=m +# CONFIG_AT803X_PHY is not set CONFIG_BCM7XXX_PHY=m # CONFIG_BCM87XX_PHY is not set CONFIG_BCM_NET_PHYLIB=m @@ -2088,7 +2123,6 @@ CONFIG_BCM_NET_PHYLIB=m CONFIG_DP83TC811_PHY=m # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set -CONFIG_DP83869_PHY=m CONFIG_FIXED_PHY=y # CONFIG_ICPLUS_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set @@ -2102,7 +2136,6 @@ CONFIG_MICROCHIP_T1_PHY=m # CONFIG_MICROSEMI_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set -# CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set CONFIG_REALTEK_PHY=m # CONFIG_RENESAS_PHY is not set @@ -2786,13 +2819,10 @@ CONFIG_PPS_CLIENT_GPIO=m # CONFIG_PTP_1588_CLOCK=y CONFIG_DP83640_PHY=m -CONFIG_PTP_1588_CLOCK_IDTCM=m # end of PTP clock support CONFIG_PINCTRL=y -CONFIG_GENERIC_PINCTRL_GROUPS=y CONFIG_PINMUX=y -CONFIG_GENERIC_PINMUX_FUNCTIONS=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set @@ -2805,7 +2835,6 @@ CONFIG_PINCTRL_STMFX=m # CONFIG_PINCTRL_RK805 is not set # CONFIG_PINCTRL_OCELOT is not set CONFIG_PINCTRL_MADERA=m -CONFIG_PINCTRL_EQUILIBRIUM=m CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 @@ -2901,7 +2930,6 @@ CONFIG_W1_SLAVE_DS2413=m CONFIG_W1_SLAVE_DS2406=m CONFIG_W1_SLAVE_DS2423=m # CONFIG_W1_SLAVE_DS2805 is not set -CONFIG_W1_SLAVE_DS2430=m CONFIG_W1_SLAVE_DS2431=m CONFIG_W1_SLAVE_DS2433=m # CONFIG_W1_SLAVE_DS2433_CRC is not set @@ -3009,9 +3037,6 @@ CONFIG_SENSORS_JC42=m CONFIG_SENSORS_POWR1220=m CONFIG_SENSORS_LINEAGE=m CONFIG_SENSORS_LTC2945=m -CONFIG_SENSORS_LTC2947=m -CONFIG_SENSORS_LTC2947_I2C=m -CONFIG_SENSORS_LTC2947_SPI=m CONFIG_SENSORS_LTC2990=m CONFIG_SENSORS_LTC4151=m CONFIG_SENSORS_LTC4215=m @@ -3092,7 +3117,6 @@ CONFIG_SENSORS_TMP103=m # CONFIG_SENSORS_TMP108 is not set CONFIG_SENSORS_TMP401=m CONFIG_SENSORS_TMP421=m -CONFIG_SENSORS_TMP513=m CONFIG_SENSORS_VT1211=m CONFIG_SENSORS_W83773G=m CONFIG_SENSORS_W83781D=m @@ -3114,10 +3138,12 @@ CONFIG_THERMAL_OF=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set # CONFIG_THERMAL_GOV_USER_SPACE is not set +# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set CONFIG_CPU_THERMAL=y # CONFIG_CLOCK_THERMAL is not set # CONFIG_DEVFREQ_THERMAL is not set @@ -3721,11 +3747,9 @@ CONFIG_VIDEO_THS8200=m # CONFIG_VIDEO_APTINA_PLL=m CONFIG_VIDEO_SMIAPP_PLL=m -CONFIG_VIDEO_HI556=m # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX258 is not set CONFIG_VIDEO_IMX274=m -CONFIG_VIDEO_IMX290=m # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX355 is not set CONFIG_VIDEO_OV2640=m @@ -4048,12 +4072,12 @@ CONFIG_DRM_DEBUG_MM=y # CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_KMS_FB_HELPER=y -# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set # CONFIG_DRM_DP_CEC is not set +CONFIG_DRM_TTM=m CONFIG_DRM_GEM_CMA_HELPER=y CONFIG_DRM_KMS_CMA_HELPER=y CONFIG_DRM_GEM_SHMEM_HELPER=y @@ -4074,7 +4098,6 @@ CONFIG_DRM_I2C_NXP_TDA9950=m # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set CONFIG_DRM_KOMEDA=m -# CONFIG_DRM_KOMEDA_ERROR_PRINT is not set # end of ARM devices # @@ -4240,7 +4263,7 @@ CONFIG_FB_MODE_HELPERS=y CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=y CONFIG_BACKLIGHT_PWM=y -CONFIG_BACKLIGHT_QCOM_WLED=m +CONFIG_BACKLIGHT_PM8941_WLED=m # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set @@ -4382,9 +4405,6 @@ CONFIG_SND_SOC_I2C_AND_SPI=m # CONFIG_SND_SOC_ADAU1761_I2C is not set # CONFIG_SND_SOC_ADAU1761_SPI is not set # CONFIG_SND_SOC_ADAU7002 is not set -CONFIG_SND_SOC_ADAU7118=m -CONFIG_SND_SOC_ADAU7118_HW=m -CONFIG_SND_SOC_ADAU7118_I2C=m # CONFIG_SND_SOC_AK4104 is not set # CONFIG_SND_SOC_AK4118 is not set CONFIG_SND_SOC_AK4458=m @@ -4418,7 +4438,6 @@ CONFIG_SND_SOC_CS4341=m # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_CX2072X is not set -CONFIG_SND_SOC_DA7213=m # CONFIG_SND_SOC_DMIC is not set CONFIG_SND_SOC_HDMI_CODEC=m # CONFIG_SND_SOC_ES7134 is not set @@ -4468,8 +4487,6 @@ CONFIG_SND_SOC_SSM2305=m # CONFIG_SND_SOC_STA350 is not set # CONFIG_SND_SOC_STI_SAS is not set # CONFIG_SND_SOC_TAS2552 is not set -CONFIG_SND_SOC_TAS2562=m -CONFIG_SND_SOC_TAS2770=m # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set @@ -4948,7 +4965,6 @@ CONFIG_MMC_TEST=y # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y -CONFIG_MMC_SDHCI_IO_ACCESSORS=y CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_SDHCI_OF_ARASAN is not set CONFIG_MMC_SDHCI_OF_ASPEED=m @@ -4956,7 +4972,6 @@ CONFIG_MMC_SDHCI_OF_ASPEED=m CONFIG_MMC_SDHCI_OF_DWCMSHC=m CONFIG_MMC_SDHCI_CADENCE=m # CONFIG_MMC_SDHCI_F_SDH30 is not set -CONFIG_MMC_SDHCI_MILBEAUT=m # CONFIG_MMC_SPI is not set CONFIG_MMC_DW=y CONFIG_MMC_DW_PLTFM=y @@ -4988,7 +5003,6 @@ CONFIG_LEDS_CLASS=y # CONFIG_LEDS_BCM6358 is not set # CONFIG_LEDS_CPCAP is not set CONFIG_LEDS_CR0014114=m -CONFIG_LEDS_EL15203000=m # CONFIG_LEDS_LM3530 is not set CONFIG_LEDS_LM3532=m # CONFIG_LEDS_LM3642 is not set @@ -5194,7 +5208,6 @@ CONFIG_PL330_DMA=y # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set -CONFIG_SF_PDMA=m # # DMA Clients @@ -5335,7 +5348,6 @@ CONFIG_FB_TFT_PCD8544=m CONFIG_FB_TFT_RA8875=m CONFIG_FB_TFT_S6D02A1=m CONFIG_FB_TFT_S6D1121=m -CONFIG_FB_TFT_SEPS525=m CONFIG_FB_TFT_SH1106=m CONFIG_FB_TFT_SSD1289=m CONFIG_FB_TFT_SSD1305=m @@ -5376,13 +5388,13 @@ CONFIG_HMS_PROFINET=m # CONFIG_USB_WUSB_CBAF is not set # CONFIG_UWB is not set CONFIG_EXFAT_FS=m +CONFIG_EXFAT_DONT_MOUNT_VFAT=y CONFIG_EXFAT_DISCARD=y # CONFIG_EXFAT_DELAYED_SYNC is not set # CONFIG_EXFAT_KERNEL_DEBUG is not set # CONFIG_EXFAT_DEBUG_MSG is not set CONFIG_EXFAT_DEFAULT_CODEPAGE=437 CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" -CONFIG_WFX=m # CONFIG_GOLDFISH is not set CONFIG_MFD_CROS_EC=y CONFIG_CHROME_PLATFORMS=y @@ -5394,7 +5406,6 @@ CONFIG_CROS_EC_CHARDEV=m CONFIG_CROS_EC_LIGHTBAR=m CONFIG_CROS_EC_VBC=m CONFIG_CROS_EC_DEBUGFS=m -CONFIG_CROS_EC_SENSORHUB=m CONFIG_CROS_EC_SYSFS=m CONFIG_CROS_USBPD_LOGGER=m # CONFIG_MELLANOX_PLATFORM is not set @@ -5496,7 +5507,6 @@ CONFIG_ROCKCHIP_IOMMU=y # # NXP/Freescale QorIQ SoC drivers # -# CONFIG_FSL_RCPM is not set # end of NXP/Freescale QorIQ SoC drivers # @@ -5594,7 +5604,6 @@ CONFIG_HID_SENSOR_ACCEL_3D=m # CONFIG_AD7124 is not set # CONFIG_AD7266 is not set # CONFIG_AD7291 is not set -CONFIG_AD7292=m # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set CONFIG_AD7606=m @@ -5803,9 +5812,6 @@ CONFIG_ADIS16460=m # CONFIG_ADIS16480 is not set # CONFIG_BMI160_I2C is not set # CONFIG_BMI160_SPI is not set -CONFIG_FXOS8700=m -CONFIG_FXOS8700_I2C=m -CONFIG_FXOS8700_SPI=m # CONFIG_KMX61 is not set # CONFIG_INV_MPU6050_I2C is not set # CONFIG_INV_MPU6050_SPI is not set @@ -5819,7 +5825,6 @@ CONFIG_IIO_ADIS_LIB_BUFFER=y # Light sensors # # CONFIG_ADJD_S311 is not set -CONFIG_ADUX1020=m # CONFIG_AL3320A is not set # CONFIG_APDS9300 is not set # CONFIG_APDS9960 is not set @@ -5858,7 +5863,6 @@ CONFIG_TSL2772=m # CONFIG_US5182D is not set # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set -CONFIG_VEML6030=m # CONFIG_VEML6070 is not set # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set @@ -5971,7 +5975,6 @@ CONFIG_MB1232=m # # Temperature sensors # -CONFIG_LTC2983=m # CONFIG_MAXIM_THERMOCOUPLE is not set CONFIG_HID_SENSOR_TEMP=m # CONFIG_MLX90614 is not set @@ -6024,7 +6027,6 @@ CONFIG_PHY_MAPPHONE_MDM6600=m CONFIG_PHY_ROCKCHIP_DP=y CONFIG_PHY_ROCKCHIP_EMMC=y # CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set -CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=m # CONFIG_PHY_ROCKCHIP_PCIE is not set # CONFIG_PHY_ROCKCHIP_TYPEC is not set CONFIG_PHY_ROCKCHIP_USB=y @@ -6057,7 +6059,6 @@ CONFIG_DAX=y CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_ROCKCHIP_EFUSE=y -CONFIG_ROCKCHIP_OTP=m # # HW tracing support @@ -6275,6 +6276,24 @@ CONFIG_PSTORE_RAM=y # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EROFS_FS is not set +CONFIG_AUFS_FS=m +CONFIG_AUFS_BRANCH_MAX_127=y +# CONFIG_AUFS_BRANCH_MAX_511 is not set +# CONFIG_AUFS_BRANCH_MAX_1023 is not set +# CONFIG_AUFS_BRANCH_MAX_32767 is not set +CONFIG_AUFS_SBILIST=y +# CONFIG_AUFS_HNOTIFY is not set +# CONFIG_AUFS_EXPORT is not set +# CONFIG_AUFS_XATTR is not set +# CONFIG_AUFS_FHSM is not set +# CONFIG_AUFS_RDU is not set +# CONFIG_AUFS_DIRREN is not set +# CONFIG_AUFS_SHWH is not set +# CONFIG_AUFS_BR_RAMFS is not set +# CONFIG_AUFS_BR_FUSE is not set +CONFIG_AUFS_BR_HFSPLUS=y +CONFIG_AUFS_BDEV_LOOP=y +# CONFIG_AUFS_DEBUG is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y @@ -6384,7 +6403,6 @@ CONFIG_NLS_ISO8859_1=y CONFIG_NLS_UTF8=y # CONFIG_DLM is not set # CONFIG_UNICODE is not set -CONFIG_IO_WQ=y # end of File systems # @@ -6452,8 +6470,8 @@ CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_SKCIPHER=y -CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y @@ -6486,7 +6504,6 @@ CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECC=y CONFIG_CRYPTO_ECDH=y CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m # # Authenticated Encryption with Associated Data @@ -6530,8 +6547,6 @@ CONFIG_CRYPTO_VMAC=m CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_XXHASH=y -CONFIG_CRYPTO_BLAKE2B=y -CONFIG_CRYPTO_BLAKE2S=m CONFIG_CRYPTO_CRCT10DIF=y CONFIG_CRYPTO_GHASH=y CONFIG_CRYPTO_POLY1305=m @@ -6543,6 +6558,7 @@ CONFIG_CRYPTO_RMD160=m CONFIG_CRYPTO_RMD256=m CONFIG_CRYPTO_RMD320=m CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_SHA3=m @@ -6554,9 +6570,11 @@ CONFIG_CRYPTO_WP512=m # # Ciphers # +CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_LIB_ARC4=y CONFIG_CRYPTO_ARC4=y CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_BLOWFISH_COMMON=m @@ -6564,6 +6582,7 @@ CONFIG_CRYPTO_CAMELLIA=m CONFIG_CRYPTO_CAST_COMMON=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_FCRYPT=m CONFIG_CRYPTO_KHAZAD=m @@ -6603,27 +6622,6 @@ CONFIG_CRYPTO_USER_API_RNG=m CONFIG_CRYPTO_USER_API_AEAD=m # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m -CONFIG_CRYPTO_LIB_BLAKE2S=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m -CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m -CONFIG_CRYPTO_LIB_CURVE25519=m -CONFIG_CRYPTO_LIB_DES=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m -CONFIG_CRYPTO_LIB_POLY1305=m -CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m -CONFIG_CRYPTO_LIB_SHA256=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set @@ -6631,8 +6629,6 @@ CONFIG_CRYPTO_DEV_ROCKCHIP=m CONFIG_CRYPTO_DEV_VIRTIO=m CONFIG_CRYPTO_DEV_SAFEXCEL=m CONFIG_CRYPTO_DEV_CCREE=m -CONFIG_CRYPTO_DEV_AMLOGIC_GXL=m -# CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y @@ -6729,7 +6725,6 @@ CONFIG_NEED_DMA_MAP_STATE=y CONFIG_DMA_DECLARE_COHERENT=y CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y -CONFIG_DMA_NONCOHERENT_MMAP=y CONFIG_DMA_REMAP=y CONFIG_DMA_CMA=y @@ -6755,9 +6750,6 @@ CONFIG_CLZ_TAB=y CONFIG_MPILIB=y CONFIG_LIBFDT=y CONFIG_OID_REGISTRY=y -CONFIG_HAVE_GENERIC_VDSO=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_VDSO_32=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y @@ -6782,8 +6774,6 @@ CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_DYNAMIC_DEBUG is not set -CONFIG_SYMBOLIC_ERRNAME=y -CONFIG_DEBUG_BUGVERBOSE=y # end of printk and dmesg options # @@ -6794,6 +6784,7 @@ CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set +CONFIG_DEBUG_FS=y # CONFIG_HEADERS_INSTALL is not set CONFIG_OPTIMIZE_INLINING=y # CONFIG_DEBUG_SECTION_MISMATCH is not set @@ -6803,19 +6794,9 @@ CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options -# -# Generic Kernel Debugging Instruments -# CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 CONFIG_MAGIC_SYSRQ_SERIAL=y -CONFIG_DEBUG_FS=y -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -# CONFIG_UBSAN is not set -CONFIG_UBSAN_ALIGNMENT=y -# end of Generic Kernel Debugging Instruments - CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_MISC=y @@ -6834,7 +6815,6 @@ CONFIG_PAGE_EXTENSION=y CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set @@ -6845,30 +6825,29 @@ CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_KASAN_STACK=1 # end of Memory Debugging +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set # CONFIG_DEBUG_SHIRQ is not set # -# Debug Oops, Lockups and Hangs +# Debug Lockups and Hangs # -# CONFIG_PANIC_ON_OOPS is not set -CONFIG_PANIC_ON_OOPS_VALUE=0 -CONFIG_PANIC_TIMEOUT=0 # CONFIG_SOFTLOCKUP_DETECTOR is not set CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1 # CONFIG_WQ_WATCHDOG is not set -# end of Debug Oops, Lockups and Hangs +# end of Debug Lockups and Hangs -# -# Scheduler Debugging -# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_SCHEDSTATS=y -# end of Scheduler Debugging - +# CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_DEBUG_PREEMPT=y @@ -6893,17 +6872,11 @@ CONFIG_DEBUG_SPINLOCK=y CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set - -# -# Debug kernel data structures -# +CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_PLIST is not set # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set -# CONFIG_BUG_ON_DATA_CORRUPTION is not set -# end of Debug kernel data structures - CONFIG_DEBUG_CREDENTIALS=y # @@ -6919,6 +6892,8 @@ CONFIG_RCU_CPU_STALL_TIMEOUT=60 # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y @@ -6956,20 +6931,22 @@ CONFIG_DYNAMIC_FTRACE_WITH_REGS=y # CONFIG_FUNCTION_PROFILER is not set CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_TRACE_EVENT_INJECT is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set # CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +# CONFIG_MEMTEST is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +# CONFIG_UBSAN is not set +CONFIG_UBSAN_ALIGNMENT=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set - -# -# arm Debugging -# # CONFIG_ARM_PTDUMP_DEBUGFS is not set # CONFIG_DEBUG_WX is not set CONFIG_UNWINDER_FRAME_POINTER=y @@ -6979,18 +6956,4 @@ CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" # CONFIG_PID_IN_CONTEXTIDR is not set # CONFIG_CORESIGHT is not set -# end of arm Debugging - -# -# Kernel Testing and Coverage -# -# CONFIG_KUNIT is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -# CONFIG_FAULT_INJECTION is not set -CONFIG_ARCH_HAS_KCOV=y -CONFIG_CC_HAS_SANCOV_TRACE_PC=y -# CONFIG_KCOV is not set -# CONFIG_RUNTIME_TESTING_MENU is not set -# CONFIG_MEMTEST is not set -# end of Kernel Testing and Coverage # end of Kernel hacking diff --git a/config/kernel/linux-rockchip-dev.config b/config/kernel/linux-rockchip-dev.config deleted file mode 120000 index 0c8c0671f0..0000000000 --- a/config/kernel/linux-rockchip-dev.config +++ /dev/null @@ -1 +0,0 @@ -linux-rockchip-current.config \ No newline at end of file diff --git a/config/kernel/linux-rockchip-dev.config b/config/kernel/linux-rockchip-dev.config new file mode 100644 index 0000000000..7c8d681364 --- /dev/null +++ b/config/kernel/linux-rockchip-dev.config @@ -0,0 +1,6996 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm 5.5.2 Kernel Configuration +# + +# +# Compiler: arm-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0 +# +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=80300 +CONFIG_CLANG_VERSION=0 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_EXTABLE_SORT=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_XZ is not set +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +CONFIG_DEFAULT_HOSTNAME="localhost" +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POSIX_MQUEUE_SYSCTL=y +CONFIG_CROSS_MEMORY_ATTACH=y +CONFIG_USELIB=y +CONFIG_AUDIT=y +CONFIG_HAVE_ARCH_AUDITSYSCALL=y +CONFIG_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +# end of IRQ subsystem + +CONFIG_GENERIC_IRQ_MULTI_HANDLER=y +CONFIG_ARCH_CLOCKSOURCE_DATA=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +# end of Timers subsystem + +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPTION=y + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_PSI is not set +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_PREEMPT_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_SRCU=y +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +CONFIG_IKCONFIG=m +CONFIG_IKCONFIG_PROC=y +CONFIG_IKHEADERS=m +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +CONFIG_GENERIC_SCHED_CLOCK=y + +# +# Scheduler features +# +# CONFIG_UCLAMP_TASK is not set +# end of Scheduler features + +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_MEMCG_SWAP_ENABLED=y +CONFIG_MEMCG_KMEM=y +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +CONFIG_PROC_PID_CPUSET=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +# CONFIG_CGROUP_DEBUG is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +# CONFIG_CHECKPOINT_RESTORE is not set +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SYSFS_DEPRECATED is not set +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_RD_XZ=y +CONFIG_RD_LZO=y +CONFIG_RD_LZ4=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +CONFIG_HAVE_UID16=y +CONFIG_BPF=y +CONFIG_EXPERT=y +CONFIG_UID16=y +CONFIG_MULTIUSER=y +# CONFIG_SGETMASK_SYSCALL is not set +CONFIG_SYSFS_SYSCALL=y +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_PRINTK_NMI=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_IO_URING=y +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +CONFIG_KALLSYMS_BASE_RELATIVE=y +# CONFIG_BPF_SYSCALL is not set +# CONFIG_USERFAULTFD is not set +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_RSEQ=y +# CONFIG_DEBUG_RSEQ is not set +CONFIG_EMBEDDED=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_PERF_USE_VMALLOC=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +# CONFIG_SLUB_MEMCG_SYSFS_ON is not set +# CONFIG_COMPAT_BRK is not set +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +CONFIG_SLUB_CPU_PARTIAL=y +CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# end of General setup + +CONFIG_ARM=y +CONFIG_ARM_HAS_SG_CHAIN=y +CONFIG_ARM_DMA_USE_IOMMU=y +CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_HAVE_PROC_CPU=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_ARM_PATCH_PHYS_VIRT=y +CONFIG_GENERIC_BUG=y +CONFIG_PGTABLE_LEVELS=2 + +# +# System Type +# +CONFIG_MMU=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_BITS_MAX=16 +CONFIG_ARCH_MULTIPLATFORM=y +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_DOVE is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C24XX is not set +# CONFIG_ARCH_OMAP1 is not set + +# +# Multiple platform selection +# + +# +# CPU Core family selection +# +# CONFIG_ARCH_MULTI_V6 is not set +CONFIG_ARCH_MULTI_V7=y +CONFIG_ARCH_MULTI_V6_V7=y +# end of Multiple platform selection + +# CONFIG_ARCH_VIRT is not set +# CONFIG_ARCH_ACTIONS is not set +# CONFIG_ARCH_ALPINE is not set +# CONFIG_ARCH_ARTPEC is not set +# CONFIG_ARCH_ASPEED is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_BCM is not set +# CONFIG_ARCH_BERLIN is not set +# CONFIG_ARCH_DIGICOLOR is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_HIGHBANK is not set +# CONFIG_ARCH_HISI is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_KEYSTONE is not set +# CONFIG_ARCH_MEDIATEK is not set +# CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MILBEAUT is not set +# CONFIG_ARCH_MMP is not set +# CONFIG_ARCH_MVEBU is not set +# CONFIG_ARCH_NPCM is not set + +# +# TI OMAP/AM/DM/DRA Family +# +# CONFIG_ARCH_OMAP3 is not set +# CONFIG_ARCH_OMAP4 is not set +# CONFIG_SOC_OMAP5 is not set +# CONFIG_SOC_AM33XX is not set +# CONFIG_SOC_AM43XX is not set +# CONFIG_SOC_DRA7XX is not set +# end of TI OMAP/AM/DM/DRA Family + +# CONFIG_ARCH_SIRF is not set +# CONFIG_ARCH_QCOM is not set +# CONFIG_ARCH_RDA is not set +# CONFIG_ARCH_REALVIEW is not set +CONFIG_ARCH_ROCKCHIP=y +# CONFIG_ARCH_S5PV210 is not set +# CONFIG_ARCH_RENESAS is not set +# CONFIG_ARCH_SOCFPGA is not set +# CONFIG_PLAT_SPEAR is not set +# CONFIG_ARCH_STI is not set +# CONFIG_ARCH_STM32 is not set +# CONFIG_ARCH_SUNXI is not set +# CONFIG_ARCH_TANGO is not set +# CONFIG_ARCH_TEGRA is not set +# CONFIG_ARCH_UNIPHIER is not set +# CONFIG_ARCH_U8500 is not set +# CONFIG_ARCH_VEXPRESS is not set +# CONFIG_ARCH_WM8850 is not set +# CONFIG_ARCH_ZX is not set +# CONFIG_ARCH_ZYNQ is not set + +# +# Processor Type +# +CONFIG_CPU_V7=y +CONFIG_CPU_THUMB_CAPABLE=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_LPAE is not set +CONFIG_ARM_THUMB=y +CONFIG_ARM_THUMBEE=y +CONFIG_ARM_VIRT_EXT=y +CONFIG_SWP_EMULATE=y +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set +# CONFIG_CPU_BPREDICT_DISABLE is not set +CONFIG_CPU_SPECTRE=y +CONFIG_HARDEN_BRANCH_PREDICTOR=y +CONFIG_KUSER_HELPERS=y +CONFIG_VDSO=y +CONFIG_OUTER_CACHE=y +CONFIG_OUTER_CACHE_SYNC=y +CONFIG_MIGHT_HAVE_CACHE_L2X0=y +CONFIG_CACHE_L2X0=y +# CONFIG_CACHE_L2X0_PMU is not set +# CONFIG_PL310_ERRATA_588369 is not set +# CONFIG_PL310_ERRATA_727915 is not set +# CONFIG_PL310_ERRATA_753970 is not set +# CONFIG_PL310_ERRATA_769419 is not set +CONFIG_ARM_L1_CACHE_SHIFT_6=y +CONFIG_ARM_L1_CACHE_SHIFT=6 +CONFIG_ARM_DMA_MEM_BUFFERABLE=y +CONFIG_ARM_HEAVY_MB=y +CONFIG_DEBUG_ALIGN_RODATA=y +# CONFIG_ARM_ERRATA_430973 is not set +# CONFIG_ARM_ERRATA_643719 is not set +# CONFIG_ARM_ERRATA_720789 is not set +# CONFIG_ARM_ERRATA_754322 is not set +# CONFIG_ARM_ERRATA_754327 is not set +# CONFIG_ARM_ERRATA_764369 is not set +# CONFIG_ARM_ERRATA_775420 is not set +# CONFIG_ARM_ERRATA_798181 is not set +# CONFIG_ARM_ERRATA_773022 is not set +CONFIG_ARM_ERRATA_818325_852422=y +CONFIG_ARM_ERRATA_821420=y +CONFIG_ARM_ERRATA_825619=y +# CONFIG_ARM_ERRATA_857271 is not set +# CONFIG_ARM_ERRATA_852421 is not set +# CONFIG_ARM_ERRATA_852423 is not set +# CONFIG_ARM_ERRATA_857272 is not set +# end of System Type + +# +# Bus support +# +# CONFIG_ARM_ERRATA_814220 is not set +# end of Bus support + +# +# Kernel Features +# +CONFIG_HAVE_SMP=y +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +CONFIG_ARM_CPU_TOPOLOGY=y +# CONFIG_SCHED_MC is not set +# CONFIG_SCHED_SMT is not set +CONFIG_HAVE_ARM_SCU=y +CONFIG_HAVE_ARM_ARCH_TIMER=y +CONFIG_HAVE_ARM_TWD=y +# CONFIG_MCPM is not set +# CONFIG_BIG_LITTLE is not set +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_3G_OPT is not set +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_NR_CPUS=4 +CONFIG_HOTPLUG_CPU=y +# CONFIG_ARM_PSCI is not set +CONFIG_ARCH_NR_GPIO=288 +CONFIG_HZ_FIXED=0 +# CONFIG_HZ_100 is not set +# CONFIG_HZ_200 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_300 is not set +# CONFIG_HZ_500 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_SCHED_HRTICK=y +# CONFIG_THUMB2_KERNEL is not set +CONFIG_ARM_PATCH_IDIV=y +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +CONFIG_HAVE_ARCH_PFN_VALID=y +CONFIG_HIGHMEM=y +# CONFIG_HIGHPTE is not set +CONFIG_CPU_SW_DOMAIN_PAN=y +CONFIG_HW_PERF_EVENTS=y +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +# CONFIG_ARM_MODULE_PLTS is not set +CONFIG_FORCE_MAX_ZONEORDER=11 +CONFIG_ALIGNMENT_TRAP=y +# CONFIG_UACCESS_WITH_MEMCPY is not set +CONFIG_SECCOMP=y +# CONFIG_PARAVIRT is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +# CONFIG_XEN is not set +# end of Kernel Features + +# +# Boot options +# +CONFIG_USE_OF=y +CONFIG_ATAGS=y +# CONFIG_DEPRECATED_PARAM_STRUCT is not set +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +# CONFIG_ARM_APPENDED_DTB is not set +CONFIG_CMDLINE="" +# CONFIG_KEXEC is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_AUTO_ZRELADDR=y +# CONFIG_EFI is not set +# end of Boot options + +# +# CPU Power Management +# + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_CPUFREQ_DT=m +CONFIG_CPUFREQ_DT_PLATDEV=y +# CONFIG_QORIQ_CPUFREQ is not set +# end of CPU Frequency scaling + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set + +# +# ARM CPU Idle Drivers +# +# CONFIG_ARM_CPUIDLE is not set +# end of ARM CPU Idle Drivers +# end of CPU Idle +# end of CPU Power Management + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_VFP=y +CONFIG_VFPv3=y +CONFIG_NEON=y +CONFIG_KERNEL_MODE_NEON=y +# end of Floating point emulation + +# +# Power management options +# +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +# CONFIG_SUSPEND_SKIP_SYNC is not set +# CONFIG_HIBERNATION is not set +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +# CONFIG_PM_AUTOSLEEP is not set +# CONFIG_PM_WAKELOCKS is not set +CONFIG_PM=y +CONFIG_PM_DEBUG=y +CONFIG_PM_ADVANCED_DEBUG=y +# CONFIG_PM_TEST_SUSPEND is not set +CONFIG_PM_SLEEP_DEBUG=y +# CONFIG_DPM_WATCHDOG is not set +# CONFIG_APM_EMULATION is not set +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_CPU_PM=y +# CONFIG_ENERGY_MODEL is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +# end of Power management options + +# +# Firmware Drivers +# +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_FW_CFG_SYSFS is not set +# CONFIG_TRUSTED_FOUNDATIONS is not set +CONFIG_HAVE_ARM_SMCCC=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +CONFIG_ARM_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM=m +CONFIG_CRYPTO_SHA1_ARM_NEON=m +CONFIG_CRYPTO_SHA1_ARM_CE=m +CONFIG_CRYPTO_SHA2_ARM_CE=m +CONFIG_CRYPTO_SHA256_ARM=m +CONFIG_CRYPTO_SHA512_ARM=m +CONFIG_CRYPTO_AES_ARM=m +CONFIG_CRYPTO_AES_ARM_BS=m +CONFIG_CRYPTO_AES_ARM_CE=m +CONFIG_CRYPTO_GHASH_ARM_CE=m +CONFIG_CRYPTO_CRCT10DIF_ARM_CE=m +CONFIG_CRYPTO_CRC32_ARM_CE=m +CONFIG_CRYPTO_CHACHA20_NEON=m +CONFIG_CRYPTO_POLY1305_ARM=m +CONFIG_CRYPTO_NHPOLY1305_NEON=m +CONFIG_CRYPTO_CURVE25519_NEON=m +# CONFIG_VIRTUALIZATION is not set + +# +# General architecture-dependent options +# +# CONFIG_OPROFILE is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +# CONFIG_JUMP_LABEL is not set +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_NMI=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_KEEPINITRD=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_32BIT_OFF_T=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP_FILTER=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_CC_HAS_STACKPROTECTOR_NONE=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS=8 +CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_HAVE_COPY_THREAD_TLS=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_OLD_SIGACTION=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_ARCH_HAS_PHYS_TO_DMA=y +# CONFIG_LOCK_EVENT_COUNTS is not set + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_PLUGIN_HOSTCC="" +CONFIG_HAVE_GCC_PLUGINS=y +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_MODULE_FORCE_LOAD=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +# CONFIG_MODULE_COMPRESS is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLK_SCSI_REQUEST=y +CONFIG_BLK_CGROUP_RWSTAT=y +CONFIG_BLK_DEV_BSG=y +# CONFIG_BLK_DEV_BSGLIB is not set +# CONFIG_BLK_DEV_INTEGRITY is not set +# CONFIG_BLK_DEV_ZONED is not set +CONFIG_BLK_DEV_THROTTLING=y +# CONFIG_BLK_DEV_THROTTLING_LOW is not set +# CONFIG_BLK_CMDLINE_PARSER is not set +# CONFIG_BLK_WBT is not set +# CONFIG_BLK_CGROUP_IOLATENCY is not set +# CONFIG_BLK_CGROUP_IOCOST is not set +CONFIG_BLK_DEBUG_FS=y +# CONFIG_BLK_SED_OPAL is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_AIX_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +CONFIG_EFI_PARTITION=y +# CONFIG_SYSV68_PARTITION is not set +# CONFIG_CMDLINE_PARTITION is not set +# end of Partition Types + +CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BLK_PM=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=y +CONFIG_MQ_IOSCHED_KYBER=y +# CONFIG_IOSCHED_BFQ is not set +# end of IO Schedulers + +CONFIG_PADATA=y +CONFIG_ASN1=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_FREEZER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_ELF_FDPIC is not set +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +CONFIG_ARCH_HAS_BINFMT_FLAT=y +CONFIG_BINFMT_FLAT=y +CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y +# CONFIG_BINFMT_FLAT_OLD is not set +CONFIG_BINFMT_ZFLAT=y +CONFIG_BINFMT_SHARED_FLAT=y +CONFIG_BINFMT_MISC=m +CONFIG_COREDUMP=y +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_COMPACTION=y +CONFIG_MIGRATION=y +CONFIG_CONTIG_ALLOC=y +CONFIG_BOUNCE=y +CONFIG_KSM=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +CONFIG_CLEANCACHE=y +CONFIG_FRONTSWAP=y +CONFIG_CMA=y +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_AREAS=7 +CONFIG_ZSWAP=y +CONFIG_ZPOOL=y +CONFIG_ZBUD=y +CONFIG_Z3FOLD=y +CONFIG_ZSMALLOC=y +# CONFIG_PGTABLE_MAPPING is not set +# CONFIG_ZSMALLOC_STAT is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_IDLE_PAGE_TRACKING=y +CONFIG_FRAME_VECTOR=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_BENCHMARK is not set +# end of Memory Management options + +CONFIG_NET=y +CONFIG_NET_INGRESS=y +CONFIG_NET_EGRESS=y +CONFIG_SKB_EXTENSIONS=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m +CONFIG_UNIX=y +CONFIG_UNIX_SCM=y +CONFIG_UNIX_DIAG=m +CONFIG_TLS=m +# CONFIG_TLS_DEVICE is not set +# CONFIG_TLS_TOE is not set +CONFIG_XFRM=y +CONFIG_XFRM_OFFLOAD=y +CONFIG_XFRM_ALGO=m +CONFIG_XFRM_USER=m +# CONFIG_XFRM_INTERFACE is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=m +CONFIG_NET_KEY=m +# CONFIG_NET_KEY_MIGRATE is not set +CONFIG_INET=y +CONFIG_WIREGUARD=m +# CONFIG_WIREGUARD_DEBUG is not set +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_FIB_TRIE_STATS=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_ROUTE_CLASSID=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IP_TUNNEL=y +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE_COMMON=y +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m +CONFIG_NET_UDP_TUNNEL=y +CONFIG_NET_FOU=y +CONFIG_NET_FOU_IP_TUNNELS=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_ESP_OFFLOAD=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=y +CONFIG_INET_DIAG=m +CONFIG_INET_TCP_DIAG=m +CONFIG_INET_UDP_DIAG=m +CONFIG_INET_RAW_DIAG=m +# CONFIG_INET_DIAG_DESTROY is not set +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_BIC=m +CONFIG_TCP_CONG_CUBIC=y +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +CONFIG_TCP_CONG_NV=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=y +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_CONG_BBR=m +CONFIG_DEFAULT_CUBIC=y +# CONFIG_DEFAULT_RENO is not set +CONFIG_DEFAULT_TCP_CONG="cubic" +CONFIG_TCP_MD5SIG=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_ESP_OFFLOAD=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_MIP6=m +CONFIG_IPV6_ILA=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=y +# CONFIG_IPV6_VTI is not set +CONFIG_IPV6_SIT=y +# CONFIG_IPV6_SIT_6RD is not set +CONFIG_IPV6_NDISC_NODETYPE=y +CONFIG_IPV6_TUNNEL=y +# CONFIG_IPV6_GRE is not set +CONFIG_IPV6_FOU=y +CONFIG_IPV6_FOU_TUNNEL=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_IPV6_MROUTE=y +CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y +CONFIG_IPV6_PIMSM_V2=y +# CONFIG_IPV6_SEG6_LWTUNNEL is not set +# CONFIG_IPV6_SEG6_HMAC is not set +CONFIG_NETLABEL=y +CONFIG_NETWORK_SECMARK=y +CONFIG_NET_PTP_CLASSIFY=y +CONFIG_NETWORK_PHY_TIMESTAMPING=y +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=m + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_FAMILY_BRIDGE=y +CONFIG_NETFILTER_FAMILY_ARP=y +CONFIG_NETFILTER_NETLINK_ACCT=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NETFILTER_NETLINK_OSF=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_LOG_COMMON=m +CONFIG_NF_LOG_NETDEV=m +CONFIG_NETFILTER_CONNCOUNT=m +CONFIG_NF_CONNTRACK_MARK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_LABELS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_GRE=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_BROADCAST=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +CONFIG_NF_CT_NETLINK_HELPER=m +CONFIG_NETFILTER_NETLINK_GLUE_CT=y +CONFIG_NF_NAT=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_SIP=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_REDIRECT=y +CONFIG_NF_NAT_MASQUERADE=y +CONFIG_NETFILTER_SYNPROXY=m +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_SET=m +CONFIG_NF_TABLES_INET=y +CONFIG_NF_TABLES_NETDEV=y +CONFIG_NFT_NUMGEN=m +CONFIG_NFT_CT=m +CONFIG_NFT_FLOW_OFFLOAD=m +CONFIG_NFT_COUNTER=m +CONFIG_NFT_CONNLIMIT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_NAT=m +CONFIG_NFT_TUNNEL=m +CONFIG_NFT_OBJREF=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_QUOTA=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_REJECT_INET=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NFT_FIB=m +CONFIG_NFT_FIB_INET=m +CONFIG_NFT_XFRM=m +CONFIG_NFT_SOCKET=m +CONFIG_NFT_OSF=m +CONFIG_NFT_TPROXY=m +# CONFIG_NFT_SYNPROXY is not set +CONFIG_NF_DUP_NETDEV=m +CONFIG_NFT_DUP_NETDEV=m +CONFIG_NFT_FWD_NETDEV=m +CONFIG_NFT_FIB_NETDEV=m +CONFIG_NF_FLOW_TABLE_INET=m +CONFIG_NF_FLOW_TABLE=m +CONFIG_NETFILTER_XTABLES=y + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=m +CONFIG_NETFILTER_XT_CONNMARK=m +CONFIG_NETFILTER_XT_SET=m + +# +# Xtables targets +# +CONFIG_NETFILTER_XT_TARGET_AUDIT=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m +CONFIG_NETFILTER_XT_TARGET_CT=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HL=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_NAT=m +CONFIG_NETFILTER_XT_TARGET_NETMAP=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +CONFIG_NETFILTER_XT_TARGET_RATEEST=m +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m +CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m + +# +# Xtables matches +# +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ECN=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_HL=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_L2TP=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +# end of Core Netfilter Configuration + +CONFIG_IP_SET=m +CONFIG_IP_SET_MAX=256 +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_IPMAC=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m +CONFIG_IP_VS=m +CONFIG_IP_VS_IPV6=y +CONFIG_IP_VS_DEBUG=y +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_AH_ESP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_MH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS SH scheduler +# +CONFIG_IP_VS_SH_TAB_BITS=8 + +# +# IPVS MH scheduler +# +CONFIG_IP_VS_MH_TAB_INDEX=12 + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IP_VS_NFCT=y +CONFIG_IP_VS_PE_SIP=m + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=m +CONFIG_NF_SOCKET_IPV4=m +CONFIG_NF_TPROXY_IPV4=m +CONFIG_NF_TABLES_IPV4=y +CONFIG_NFT_REJECT_IPV4=m +CONFIG_NFT_DUP_IPV4=m +CONFIG_NFT_FIB_IPV4=m +CONFIG_NF_TABLES_ARP=y +CONFIG_NF_FLOW_TABLE_IPV4=m +CONFIG_NF_DUP_IPV4=m +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_NF_REJECT_IPV4=y +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# end of IP: Netfilter Configuration + +# +# IPv6: Netfilter Configuration +# +CONFIG_NF_SOCKET_IPV6=m +CONFIG_NF_TPROXY_IPV6=m +CONFIG_NF_TABLES_IPV6=y +CONFIG_NFT_REJECT_IPV6=m +CONFIG_NFT_DUP_IPV6=m +CONFIG_NFT_FIB_IPV6=m +CONFIG_NF_FLOW_TABLE_IPV6=m +CONFIG_NF_DUP_IPV6=m +CONFIG_NF_REJECT_IPV6=y +CONFIG_NF_LOG_IPV6=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_RPFILTER=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_SRH=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_TARGET_SYNPROXY=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_RAW=m +CONFIG_IP6_NF_SECURITY=m +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_IP6_NF_TARGET_NPT=m +# end of IPv6: Netfilter Configuration + +CONFIG_NF_DEFRAG_IPV6=m +CONFIG_NF_TABLES_BRIDGE=m +# CONFIG_NFT_BRIDGE_META is not set +CONFIG_NFT_BRIDGE_REJECT=m +CONFIG_NF_LOG_BRIDGE=m +# CONFIG_NF_CONNTRACK_BRIDGE is not set +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_IP6=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +# CONFIG_BPFILTER is not set +CONFIG_IP_DCCP=m +CONFIG_INET_DCCP_DIAG=m + +# +# DCCP CCIDs Configuration +# +# CONFIG_IP_DCCP_CCID2_DEBUG is not set +CONFIG_IP_DCCP_CCID3=y +# CONFIG_IP_DCCP_CCID3_DEBUG is not set +CONFIG_IP_DCCP_TFRC_LIB=y +# end of DCCP CCIDs Configuration + +# +# DCCP Kernel Hacking +# +# CONFIG_IP_DCCP_DEBUG is not set +# end of DCCP Kernel Hacking + +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_OBJCNT is not set +CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y +# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set +# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set +CONFIG_SCTP_COOKIE_HMAC_MD5=y +# CONFIG_SCTP_COOKIE_HMAC_SHA1 is not set +CONFIG_INET_SCTP_DIAG=m +CONFIG_RDS=m +CONFIG_RDS_TCP=m +# CONFIG_RDS_DEBUG is not set +CONFIG_TIPC=m +CONFIG_TIPC_MEDIA_UDP=y +CONFIG_TIPC_CRYPTO=y +CONFIG_TIPC_DIAG=m +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +CONFIG_ATM_CLIP_NO_ICMP=y +# CONFIG_ATM_LANE is not set +CONFIG_ATM_BR2684=m +CONFIG_ATM_BR2684_IPFILTER=y +CONFIG_L2TP=m +# CONFIG_L2TP_DEBUGFS is not set +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=m +CONFIG_L2TP_ETH=m +CONFIG_STP=y +CONFIG_GARP=y +CONFIG_MRP=y +CONFIG_BRIDGE=y +CONFIG_BRIDGE_IGMP_SNOOPING=y +CONFIG_BRIDGE_VLAN_FILTERING=y +CONFIG_HAVE_NET_DSA=y +CONFIG_NET_DSA=m +CONFIG_NET_DSA_TAG_8021Q=m +CONFIG_NET_DSA_TAG_BRCM_COMMON=m +CONFIG_NET_DSA_TAG_BRCM=m +CONFIG_NET_DSA_TAG_BRCM_PREPEND=m +CONFIG_NET_DSA_TAG_GSWIP=m +CONFIG_NET_DSA_TAG_DSA=m +CONFIG_NET_DSA_TAG_EDSA=m +CONFIG_NET_DSA_TAG_MTK=m +CONFIG_NET_DSA_TAG_KSZ=m +CONFIG_NET_DSA_TAG_OCELOT=m +CONFIG_NET_DSA_TAG_QCA=m +CONFIG_NET_DSA_TAG_LAN9303=m +CONFIG_NET_DSA_TAG_SJA1105=m +CONFIG_NET_DSA_TAG_TRAILER=m +CONFIG_VLAN_8021Q=y +CONFIG_VLAN_8021Q_GVRP=y +CONFIG_VLAN_8021Q_MVRP=y +# CONFIG_DECNET is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=m +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +CONFIG_6LOWPAN=m +# CONFIG_6LOWPAN_DEBUGFS is not set +CONFIG_6LOWPAN_NHC=m +CONFIG_6LOWPAN_NHC_DEST=m +CONFIG_6LOWPAN_NHC_FRAGMENT=m +CONFIG_6LOWPAN_NHC_HOP=m +CONFIG_6LOWPAN_NHC_IPV6=m +CONFIG_6LOWPAN_NHC_MOBILITY=m +CONFIG_6LOWPAN_NHC_ROUTING=m +CONFIG_6LOWPAN_NHC_UDP=m +# CONFIG_6LOWPAN_GHC_EXT_HDR_HOP is not set +# CONFIG_6LOWPAN_GHC_UDP is not set +# CONFIG_6LOWPAN_GHC_ICMPV6 is not set +# CONFIG_6LOWPAN_GHC_EXT_HDR_DEST is not set +# CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG is not set +# CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE is not set +# CONFIG_IEEE802154 is not set +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_MULTIQ=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFB=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_CBS=m +CONFIG_NET_SCH_ETF=m +# CONFIG_NET_SCH_TAPRIO is not set +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_DRR=m +CONFIG_NET_SCH_MQPRIO=m +CONFIG_NET_SCH_SKBPRIO=m +CONFIG_NET_SCH_CHOKE=m +CONFIG_NET_SCH_QFQ=m +CONFIG_NET_SCH_CODEL=m +CONFIG_NET_SCH_FQ_CODEL=m +CONFIG_NET_SCH_CAKE=m +CONFIG_NET_SCH_FQ=m +CONFIG_NET_SCH_HHF=m +CONFIG_NET_SCH_PIE=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_SCH_PLUG=m +CONFIG_NET_SCH_DEFAULT=y +# CONFIG_DEFAULT_FQ is not set +# CONFIG_DEFAULT_CODEL is not set +# CONFIG_DEFAULT_FQ_CODEL is not set +# CONFIG_DEFAULT_SFQ is not set +CONFIG_DEFAULT_PFIFO_FAST=y +CONFIG_DEFAULT_NET_SCH="pfifo_fast" + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_CLS_FLOW=m +CONFIG_NET_CLS_CGROUP=m +CONFIG_NET_CLS_BPF=m +CONFIG_NET_CLS_FLOWER=m +CONFIG_NET_CLS_MATCHALL=m +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_STACK=32 +CONFIG_NET_EMATCH_CMP=m +CONFIG_NET_EMATCH_NBYTE=m +CONFIG_NET_EMATCH_U32=m +CONFIG_NET_EMATCH_META=m +CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_EMATCH_CANID=m +CONFIG_NET_EMATCH_IPSET=m +CONFIG_NET_EMATCH_IPT=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_SAMPLE=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_NAT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_ACT_SKBEDIT=m +CONFIG_NET_ACT_CSUM=m +# CONFIG_NET_ACT_MPLS is not set +CONFIG_NET_ACT_VLAN=m +CONFIG_NET_ACT_BPF=m +CONFIG_NET_ACT_CONNMARK=m +# CONFIG_NET_ACT_CTINFO is not set +CONFIG_NET_ACT_SKBMOD=m +CONFIG_NET_ACT_IFE=m +CONFIG_NET_ACT_TUNNEL_KEY=m +# CONFIG_NET_ACT_CT is not set +CONFIG_NET_IFE_SKBMARK=m +CONFIG_NET_IFE_SKBPRIO=m +CONFIG_NET_IFE_SKBTCINDEX=m +# CONFIG_NET_TC_SKB_EXT is not set +CONFIG_NET_SCH_FIFO=y +CONFIG_DCB=y +CONFIG_DNS_RESOLVER=y +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_BATMAN_V=y +CONFIG_BATMAN_ADV_BLA=y +CONFIG_BATMAN_ADV_DAT=y +CONFIG_BATMAN_ADV_NC=y +CONFIG_BATMAN_ADV_MCAST=y +# CONFIG_BATMAN_ADV_DEBUGFS is not set +# CONFIG_BATMAN_ADV_DEBUG is not set +CONFIG_BATMAN_ADV_SYSFS=y +# CONFIG_BATMAN_ADV_TRACING is not set +CONFIG_OPENVSWITCH=m +CONFIG_OPENVSWITCH_GRE=m +CONFIG_OPENVSWITCH_VXLAN=m +CONFIG_OPENVSWITCH_GENEVE=m +# CONFIG_VSOCKETS is not set +CONFIG_NETLINK_DIAG=m +CONFIG_MPLS=y +CONFIG_NET_MPLS_GSO=m +# CONFIG_MPLS_ROUTING is not set +CONFIG_NET_NSH=m +CONFIG_HSR=m +CONFIG_NET_SWITCHDEV=y +CONFIG_NET_L3_MASTER_DEV=y +# CONFIG_NET_NCSI is not set +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_XPS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_NET_CLASSID=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +# CONFIG_BPF_JIT is not set +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +CONFIG_CAN=y +CONFIG_CAN_RAW=m +CONFIG_CAN_BCM=m +CONFIG_CAN_GW=m +CONFIG_CAN_J1939=m + +# +# CAN Device Drivers +# +CONFIG_CAN_VCAN=m +CONFIG_CAN_VXCAN=m +CONFIG_CAN_SLCAN=m +CONFIG_CAN_DEV=y +CONFIG_CAN_CALC_BITTIMING=y +CONFIG_CAN_FLEXCAN=m +CONFIG_CAN_GRCAN=m +CONFIG_CAN_TI_HECC=m +CONFIG_CAN_C_CAN=m +CONFIG_CAN_C_CAN_PLATFORM=m +CONFIG_CAN_CC770=m +CONFIG_CAN_CC770_ISA=m +CONFIG_CAN_CC770_PLATFORM=m +CONFIG_CAN_IFI_CANFD=m +CONFIG_CAN_M_CAN=m +CONFIG_CAN_M_CAN_PLATFORM=m +CONFIG_CAN_M_CAN_TCAN4X5X=m +CONFIG_CAN_RCAR=m +CONFIG_CAN_RCAR_CANFD=m +CONFIG_CAN_SJA1000=m +CONFIG_CAN_SJA1000_ISA=m +CONFIG_CAN_SJA1000_PLATFORM=m +CONFIG_CAN_SOFTING=m + +# +# CAN SPI interfaces +# +CONFIG_CAN_HI311X=m +CONFIG_CAN_MCP251X=y +# end of CAN SPI interfaces + +# +# CAN USB interfaces +# +CONFIG_CAN_8DEV_USB=m +CONFIG_CAN_EMS_USB=m +CONFIG_CAN_ESD_USB2=m +CONFIG_CAN_GS_USB=m +CONFIG_CAN_KVASER_USB=m +CONFIG_CAN_MCBA_USB=m +CONFIG_CAN_PEAK_USB=m +CONFIG_CAN_UCAN=m +# end of CAN USB interfaces + +# CONFIG_CAN_DEBUG_DEVICES is not set +# end of CAN Device Drivers + +CONFIG_BT=y +CONFIG_BT_BREDR=y +CONFIG_BT_RFCOMM=y +# CONFIG_BT_RFCOMM_TTY is not set +# CONFIG_BT_BNEP is not set +CONFIG_BT_HIDP=y +CONFIG_BT_HS=y +CONFIG_BT_LE=y +CONFIG_BT_6LOWPAN=m +# CONFIG_BT_LEDS is not set +# CONFIG_BT_SELFTEST is not set +CONFIG_BT_DEBUGFS=y + +# +# Bluetooth device drivers +# +CONFIG_BT_INTEL=y +CONFIG_BT_BCM=y +CONFIG_BT_RTL=y +CONFIG_BT_HCIBTUSB=y +# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set +CONFIG_BT_HCIBTUSB_BCM=y +# CONFIG_BT_HCIBTUSB_MTK is not set +CONFIG_BT_HCIBTUSB_RTL=y +CONFIG_BT_HCIBTSDIO=y +CONFIG_BT_HCIUART=y +CONFIG_BT_HCIUART_SERDEV=y +CONFIG_BT_HCIUART_H4=y +# CONFIG_BT_HCIUART_NOKIA is not set +# CONFIG_BT_HCIUART_BCSP is not set +CONFIG_BT_HCIUART_ATH3K=y +# CONFIG_BT_HCIUART_LL is not set +CONFIG_BT_HCIUART_3WIRE=y +# CONFIG_BT_HCIUART_INTEL is not set +# CONFIG_BT_HCIUART_BCM is not set +# CONFIG_BT_HCIUART_QCA is not set +# CONFIG_BT_HCIUART_AG6XX is not set +# CONFIG_BT_HCIUART_MRVL is not set +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBPA10X is not set +CONFIG_BT_HCIBFUSB=y +CONFIG_BT_HCIVHCI=y +CONFIG_BT_MRVL=y +CONFIG_BT_MRVL_SDIO=y +# CONFIG_BT_ATH3K is not set +CONFIG_BT_MTKSDIO=m +CONFIG_BT_MTKUART=m +# end of Bluetooth device drivers + +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +CONFIG_STREAM_PARSER=y +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_EXT=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_WEXT_SPY=y +CONFIG_WEXT_PRIV=y +CONFIG_CFG80211=y +CONFIG_NL80211_TESTMODE=y +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set +CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y +CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y +CONFIG_CFG80211_DEFAULT_PS=y +CONFIG_CFG80211_DEBUGFS=y +CONFIG_CFG80211_CRDA_SUPPORT=y +CONFIG_CFG80211_WEXT=y +CONFIG_LIB80211=y +CONFIG_LIB80211_CRYPT_WEP=y +CONFIG_LIB80211_CRYPT_CCMP=y +CONFIG_LIB80211_CRYPT_TKIP=y +# CONFIG_LIB80211_DEBUG is not set +CONFIG_MAC80211=y +CONFIG_MAC80211_HAS_RC=y +CONFIG_MAC80211_RC_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" +CONFIG_MAC80211_MESH=y +CONFIG_MAC80211_LEDS=y +CONFIG_MAC80211_DEBUGFS=y +# CONFIG_MAC80211_MESSAGE_TRACING is not set +CONFIG_MAC80211_DEBUG_MENU=y +# CONFIG_MAC80211_NOINLINE is not set +CONFIG_MAC80211_VERBOSE_DEBUG=y +# CONFIG_MAC80211_MLME_DEBUG is not set +# CONFIG_MAC80211_STA_DEBUG is not set +# CONFIG_MAC80211_HT_DEBUG is not set +# CONFIG_MAC80211_OCB_DEBUG is not set +# CONFIG_MAC80211_IBSS_DEBUG is not set +# CONFIG_MAC80211_PS_DEBUG is not set +# CONFIG_MAC80211_MPL_DEBUG is not set +# CONFIG_MAC80211_MPATH_DEBUG is not set +# CONFIG_MAC80211_MHWMP_DEBUG is not set +# CONFIG_MAC80211_MESH_SYNC_DEBUG is not set +# CONFIG_MAC80211_MESH_CSA_DEBUG is not set +# CONFIG_MAC80211_MESH_PS_DEBUG is not set +# CONFIG_MAC80211_TDLS_DEBUG is not set +# CONFIG_MAC80211_DEBUG_COUNTERS is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +# CONFIG_WIMAX is not set +CONFIG_RFKILL=y +CONFIG_RFKILL_LEDS=y +# CONFIG_RFKILL_INPUT is not set +# CONFIG_RFKILL_GPIO is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +CONFIG_CEPH_LIB=m +# CONFIG_CEPH_LIB_PRETTYDEBUG is not set +# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set +# CONFIG_NFC is not set +CONFIG_PSAMPLE=m +CONFIG_NET_IFE=m +CONFIG_LWTUNNEL=y +CONFIG_LWTUNNEL_BPF=y +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +CONFIG_NET_SOCK_MSG=y +CONFIG_NET_DEVLINK=y +CONFIG_PAGE_POOL=y +CONFIG_FAILOVER=m +CONFIG_HAVE_EBPF_JIT=y + +# +# Device Drivers +# +CONFIG_ARM_AMBA=y +CONFIG_HAVE_PCI=y +# CONFIG_PCI is not set +# CONFIG_PCCARD is not set + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER=y +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER is not set +# CONFIG_FW_LOADER_COMPRESS is not set +CONFIG_FW_CACHE=y +# end of Firmware loader + +CONFIG_WANT_DEV_COREDUMP=y +CONFIG_ALLOW_DEV_COREDUMP=y +CONFIG_DEV_COREDUMP=y +# CONFIG_DEBUG_DRIVER is not set +CONFIG_DEBUG_DEVRES=y +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_W1=m +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_IRQ=y +CONFIG_REGMAP_SCCB=m +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +CONFIG_GENERIC_ARCH_TOPOLOGY=y +# end of Generic Driver Options + +# +# Bus devices +# +CONFIG_ARM_CCI=y +# CONFIG_BRCMSTB_GISB_ARB is not set +# CONFIG_MOXTET is not set +# CONFIG_SIMPLE_PM_BUS is not set +# CONFIG_VEXPRESS_CONFIG is not set +# end of Bus devices + +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y +CONFIG_GNSS=m +# CONFIG_GNSS_MTK_SERIAL is not set +CONFIG_GNSS_SIRF_SERIAL=m +# CONFIG_GNSS_UBX_SERIAL is not set +# CONFIG_MTD is not set +CONFIG_DTC=y +CONFIG_OF=y +# CONFIG_OF_UNITTEST is not set +CONFIG_OF_FLATTREE=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_KOBJ=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_IRQ=y +CONFIG_OF_NET=y +CONFIG_OF_MDIO=y +CONFIG_OF_RESERVED_MEM=y +CONFIG_OF_RESOLVE=y +CONFIG_OF_OVERLAY=y +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +CONFIG_CDROM=y +CONFIG_ZRAM=m +CONFIG_ZRAM_WRITEBACK=y +# CONFIG_ZRAM_MEMORY_TRACKING is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +CONFIG_BLK_DEV_DRBD=m +# CONFIG_DRBD_FAULT_INJECTION is not set +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=1 +CONFIG_BLK_DEV_RAM_SIZE=4096 +# CONFIG_CDROM_PKTCDVD is not set +CONFIG_ATA_OVER_ETH=m +CONFIG_VIRTIO_BLK=m +# CONFIG_VIRTIO_BLK_SCSI is not set +# CONFIG_BLK_DEV_RBD is not set + +# +# NVME Support +# +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TARGET is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +# CONFIG_XILINX_SDFEC is not set +CONFIG_MISC_RTSX=m +# CONFIG_PVPANIC is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +CONFIG_EEPROM_AT24=m +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +CONFIG_EEPROM_93CX6=m +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_EE1004 is not set +# end of EEPROM support + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# end of Texas Instruments shared transport line discipline + +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set + +# +# Intel MIC & related support +# +# CONFIG_VOP_BUS is not set +# end of Intel MIC & related support + +# CONFIG_ECHO is not set +CONFIG_MISC_RTSX_USB=m +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set + +# +# SCSI Transports +# +CONFIG_SCSI_SPI_ATTRS=y +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# end of SCSI Transports + +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_VIRTIO=m +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +# CONFIG_ATA is not set +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_AUTODETECT=y +# CONFIG_MD_LINEAR is not set +CONFIG_MD_RAID0=y +CONFIG_MD_RAID1=y +CONFIG_MD_RAID10=y +CONFIG_MD_RAID456=y +# CONFIG_MD_MULTIPATH is not set +# CONFIG_MD_FAULTY is not set +# CONFIG_BCACHE is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=y +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=y +CONFIG_DM_PERSISTENT_DATA=y +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=y +# CONFIG_DM_SNAPSHOT is not set +CONFIG_DM_THIN_PROVISIONING=y +# CONFIG_DM_CACHE is not set +CONFIG_DM_WRITECACHE=m +# CONFIG_DM_ERA is not set +CONFIG_DM_CLONE=m +CONFIG_DM_MIRROR=y +# CONFIG_DM_LOG_USERSPACE is not set +CONFIG_DM_RAID=y +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +CONFIG_DM_DUST=m +# CONFIG_DM_INIT is not set +# CONFIG_DM_UEVENT is not set +# CONFIG_DM_FLAKEY is not set +CONFIG_DM_VERITY=y +# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set +# CONFIG_DM_VERITY_FEC is not set +# CONFIG_DM_SWITCH is not set +# CONFIG_DM_LOG_WRITES is not set +# CONFIG_DM_INTEGRITY is not set +# CONFIG_TARGET_CORE is not set +CONFIG_NETDEVICES=y +CONFIG_MII=y +CONFIG_NET_CORE=y +CONFIG_BONDING=m +CONFIG_DUMMY=y +# CONFIG_EQUALIZER is not set +CONFIG_IFB=m +# CONFIG_NET_TEAM is not set +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_IPVLAN_L3S=y +CONFIG_IPVLAN=m +CONFIG_IPVTAP=m +CONFIG_VXLAN=m +CONFIG_GENEVE=m +CONFIG_GTP=m +CONFIG_MACSEC=m +# CONFIG_NETCONSOLE is not set +CONFIG_TUN=y +CONFIG_TAP=m +# CONFIG_TUN_VNET_CROSS_LE is not set +CONFIG_VETH=m +CONFIG_VIRTIO_NET=m +# CONFIG_NLMON is not set +CONFIG_NET_VRF=m +CONFIG_ATM_DRIVERS=y +# CONFIG_ATM_DUMMY is not set +# CONFIG_ATM_TCP is not set + +# +# Distributed Switch Architecture drivers +# +CONFIG_B53=m +CONFIG_B53_SPI_DRIVER=m +CONFIG_B53_MDIO_DRIVER=m +CONFIG_B53_MMAP_DRIVER=m +CONFIG_B53_SRAB_DRIVER=m +# CONFIG_B53_SERDES is not set +CONFIG_NET_DSA_BCM_SF2=m +CONFIG_NET_DSA_LOOP=m +# CONFIG_NET_DSA_LANTIQ_GSWIP is not set +CONFIG_NET_DSA_MT7530=m +CONFIG_NET_DSA_MV88E6060=m +CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON=m +# CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set +CONFIG_NET_DSA_MICROCHIP_KSZ8795=m +CONFIG_NET_DSA_MICROCHIP_KSZ8795_SPI=m +CONFIG_NET_DSA_MV88E6XXX=m +CONFIG_NET_DSA_MV88E6XXX_GLOBAL2=y +# CONFIG_NET_DSA_MV88E6XXX_PTP is not set +CONFIG_NET_DSA_SJA1105=m +# CONFIG_NET_DSA_SJA1105_PTP is not set +# CONFIG_NET_DSA_QCA8K is not set +CONFIG_NET_DSA_REALTEK_SMI=m +CONFIG_NET_DSA_SMSC_LAN9303=m +# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set +CONFIG_NET_DSA_SMSC_LAN9303_MDIO=m +CONFIG_NET_DSA_VITESSE_VSC73XX=m +CONFIG_NET_DSA_VITESSE_VSC73XX_SPI=m +# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set +# end of Distributed Switch Architecture drivers + +CONFIG_ETHERNET=y +# CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_ALTERA_TSE is not set +# CONFIG_NET_VENDOR_AMAZON is not set +# CONFIG_NET_VENDOR_AQUANTIA is not set +CONFIG_NET_VENDOR_ARC=y +CONFIG_ARC_EMAC_CORE=y +CONFIG_EMAC_ROCKCHIP=y +# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +CONFIG_NET_VENDOR_CADENCE=y +# CONFIG_MACB is not set +CONFIG_NET_VENDOR_CAVIUM=y +# CONFIG_NET_VENDOR_CIRRUS is not set +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_DM9000 is not set +# CONFIG_DNET is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FARADAY is not set +CONFIG_NET_VENDOR_GOOGLE=y +# CONFIG_NET_VENDOR_HISILICON is not set +# CONFIG_NET_VENDOR_HUAWEI is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_MSCC_OCELOT_SWITCH=m +CONFIG_MSCC_OCELOT_SWITCH_OCELOT=m +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NETRONOME is not set +CONFIG_NET_VENDOR_NI=y +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +# CONFIG_ETHOC is not set +CONFIG_NET_VENDOR_PENSANDO=y +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_SOCIONEXT is not set +CONFIG_NET_VENDOR_STMICRO=y +CONFIG_STMMAC_ETH=y +# CONFIG_STMMAC_SELFTESTS is not set +CONFIG_STMMAC_PLATFORM=y +# CONFIG_DWMAC_DWC_QOS_ETH is not set +CONFIG_DWMAC_GENERIC=y +CONFIG_DWMAC_ROCKCHIP=y +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WIZNET is not set +CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_AXI_EMAC is not set +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_BUS=y +CONFIG_MDIO_BCM_UNIMAC=m +# CONFIG_MDIO_BITBANG is not set +CONFIG_MDIO_BUS_MUX=m +# CONFIG_MDIO_BUS_MUX_GPIO is not set +# CONFIG_MDIO_BUS_MUX_MMIOREG is not set +CONFIG_MDIO_BUS_MUX_MULTIPLEXER=m +# CONFIG_MDIO_HISI_FEMAC is not set +CONFIG_MDIO_MSCC_MIIM=m +CONFIG_PHYLINK=y +CONFIG_PHYLIB=y +CONFIG_SWPHY=y +CONFIG_LED_TRIGGER_PHY=y + +# +# MII PHY device drivers +# +# CONFIG_SFP is not set +CONFIG_ADIN_PHY=m +# CONFIG_AMD_PHY is not set +# CONFIG_AQUANTIA_PHY is not set +CONFIG_AX88796B_PHY=m +CONFIG_BCM7XXX_PHY=m +# CONFIG_BCM87XX_PHY is not set +CONFIG_BCM_NET_PHYLIB=m +# CONFIG_BROADCOM_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_CORTINA_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_DP83822_PHY is not set +CONFIG_DP83TC811_PHY=m +# CONFIG_DP83848_PHY is not set +# CONFIG_DP83867_PHY is not set +CONFIG_DP83869_PHY=m +CONFIG_FIXED_PHY=y +# CONFIG_ICPLUS_PHY is not set +# CONFIG_INTEL_XWAY_PHY is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_MARVELL_10G_PHY is not set +# CONFIG_MICREL_PHY is not set +CONFIG_MICROCHIP_PHY=m +CONFIG_MICROCHIP_T1_PHY=m +# CONFIG_MICROSEMI_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_NXP_TJA11XX_PHY is not set +# CONFIG_AT803X_PHY is not set +# CONFIG_QSEMI_PHY is not set +CONFIG_REALTEK_PHY=m +# CONFIG_RENESAS_PHY is not set +CONFIG_ROCKCHIP_PHY=y +# CONFIG_SMSC_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_TERANETICS_PHY is not set +CONFIG_VITESSE_PHY=m +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_MICREL_KS8995MA is not set +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=m +CONFIG_PPP_MULTILINK=y +# CONFIG_PPPOATM is not set +CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_SLIP=m +CONFIG_SLHC=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SLIP_MODE_SLIP6=y +CONFIG_USB_NET_DRIVERS=y +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_RTL8152=m +CONFIG_USB_LAN78XX=m +CONFIG_USB_USBNET=y +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_AX88179_178A=m +CONFIG_USB_NET_CDCETHER=y +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +CONFIG_USB_NET_HUAWEI_CDC_NCM=m +CONFIG_USB_NET_CDC_MBIM=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_SR9700=m +CONFIG_USB_NET_SR9800=m +CONFIG_USB_NET_SMSC75XX=m +CONFIG_USB_NET_SMSC95XX=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_MCS7830=m +CONFIG_USB_NET_RNDIS_HOST=y +CONFIG_USB_NET_CDC_SUBSET_ENABLE=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_KC2190=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_NET_CX82310_ETH=m +CONFIG_USB_NET_KALMIA=m +CONFIG_USB_NET_QMI_WWAN=m +CONFIG_USB_HSO=m +CONFIG_USB_NET_INT51X1=m +CONFIG_USB_IPHETH=m +CONFIG_USB_SIERRA_NET=m +CONFIG_USB_VL600=m +CONFIG_USB_NET_CH9200=m +CONFIG_USB_NET_AQC111=m +CONFIG_WLAN=y +# CONFIG_WIRELESS_WDS is not set +CONFIG_WLAN_VENDOR_ADMTEK=y +CONFIG_ATH_COMMON=m +CONFIG_WLAN_VENDOR_ATH=y +# CONFIG_ATH_DEBUG is not set +CONFIG_ATH9K_HW=m +CONFIG_ATH9K_COMMON=m +CONFIG_ATH9K_BTCOEX_SUPPORT=y +CONFIG_ATH9K=m +# CONFIG_ATH9K_AHB is not set +# CONFIG_ATH9K_DEBUGFS is not set +# CONFIG_ATH9K_DYNACK is not set +# CONFIG_ATH9K_WOW is not set +CONFIG_ATH9K_RFKILL=y +# CONFIG_ATH9K_CHANNEL_CONTEXT is not set +CONFIG_ATH9K_PCOEM=y +CONFIG_ATH9K_HTC=m +# CONFIG_ATH9K_HTC_DEBUGFS is not set +# CONFIG_ATH9K_HWRNG is not set +CONFIG_CARL9170=m +CONFIG_CARL9170_LEDS=y +# CONFIG_CARL9170_DEBUGFS is not set +CONFIG_CARL9170_WPC=y +# CONFIG_CARL9170_HWRNG is not set +# CONFIG_ATH6KL is not set +CONFIG_AR5523=m +CONFIG_ATH10K=m +CONFIG_ATH10K_CE=y +CONFIG_ATH10K_SDIO=m +CONFIG_ATH10K_USB=m +# CONFIG_ATH10K_DEBUG is not set +# CONFIG_ATH10K_DEBUGFS is not set +# CONFIG_ATH10K_TRACING is not set +CONFIG_WCN36XX=m +# CONFIG_WCN36XX_DEBUGFS is not set +CONFIG_WLAN_VENDOR_ATMEL=y +CONFIG_AT76C50X_USB=m +CONFIG_WLAN_VENDOR_BROADCOM=y +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +CONFIG_BRCMUTIL=m +# CONFIG_BRCMSMAC is not set +CONFIG_BRCMFMAC=m +CONFIG_BRCMFMAC_PROTO_BCDC=y +CONFIG_BRCMFMAC_SDIO=y +# CONFIG_BRCMFMAC_USB is not set +# CONFIG_BRCM_TRACING is not set +# CONFIG_BRCMDBG is not set +CONFIG_WLAN_VENDOR_CISCO=y +CONFIG_WLAN_VENDOR_INTEL=y +CONFIG_WLAN_VENDOR_INTERSIL=y +CONFIG_HOSTAP=y +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP_FIRMWARE_NVRAM=y +# CONFIG_P54_COMMON is not set +CONFIG_WLAN_VENDOR_MARVELL=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBERTAS_SDIO=m +CONFIG_LIBERTAS_SPI=m +# CONFIG_LIBERTAS_DEBUG is not set +# CONFIG_LIBERTAS_MESH is not set +CONFIG_LIBERTAS_THINFIRM=y +# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set +CONFIG_LIBERTAS_THINFIRM_USB=m +CONFIG_MWIFIEX=y +CONFIG_MWIFIEX_SDIO=y +CONFIG_MWIFIEX_USB=m +CONFIG_WLAN_VENDOR_MEDIATEK=y +CONFIG_MT7601U=m +CONFIG_MT76_CORE=m +CONFIG_MT76_LEDS=y +CONFIG_MT76_USB=m +CONFIG_MT76x02_LIB=m +CONFIG_MT76x02_USB=m +CONFIG_MT76x0_COMMON=m +CONFIG_MT76x0U=m +CONFIG_MT76x2_COMMON=m +CONFIG_MT76x2U=m +CONFIG_WLAN_VENDOR_RALINK=y +CONFIG_RT2X00=y +CONFIG_RT2500USB=y +CONFIG_RT73USB=y +CONFIG_RT2800USB=y +CONFIG_RT2800USB_RT33XX=y +CONFIG_RT2800USB_RT35XX=y +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RT2800_LIB=y +CONFIG_RT2X00_LIB_USB=y +CONFIG_RT2X00_LIB=y +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2X00_LIB_CRYPTO=y +CONFIG_RT2X00_LIB_LEDS=y +# CONFIG_RT2X00_LIB_DEBUGFS is not set +# CONFIG_RT2X00_DEBUG is not set +CONFIG_WLAN_VENDOR_REALTEK=y +CONFIG_RTL8187=m +CONFIG_RTL8187_LEDS=y +CONFIG_RTL_CARDS=m +CONFIG_RTL8192CU=m +CONFIG_RTLWIFI=m +CONFIG_RTLWIFI_USB=m +# CONFIG_RTLWIFI_DEBUG is not set +CONFIG_RTL8192C_COMMON=m +CONFIG_RTL8XXXU=y +# CONFIG_RTL8XXXU_UNTESTED is not set +CONFIG_RTW88=m +CONFIG_WLAN_VENDOR_RSI=y +# CONFIG_RSI_91X is not set +CONFIG_WLAN_VENDOR_ST=y +# CONFIG_CW1200 is not set +CONFIG_WLAN_VENDOR_TI=y +# CONFIG_WL1251 is not set +# CONFIG_WL12XX is not set +# CONFIG_WL18XX is not set +# CONFIG_WLCORE is not set +CONFIG_RTL8822BU=m +CONFIG_RTL8188EU=m +CONFIG_RTL8821CU=m +CONFIG_RTL8812AU=m +CONFIG_WLAN_VENDOR_ZYDAS=y +CONFIG_USB_ZD1201=m +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_WLAN_VENDOR_QUANTENNA=y +# CONFIG_MAC80211_HWSIM is not set +CONFIG_USB_NET_RNDIS_WLAN=y +CONFIG_VIRT_WIFI=m + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +# +# CONFIG_WAN is not set +# CONFIG_NETDEVSIM is not set +CONFIG_NET_FAILOVER=m +# CONFIG_ISDN is not set +# CONFIG_NVM is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=y +CONFIG_INPUT_FF_MEMLESS=y +CONFIG_INPUT_POLLDEV=y +# CONFIG_INPUT_SPARSEKMAP is not set +CONFIG_INPUT_MATRIXKMAP=y + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +CONFIG_INPUT_JOYDEV=y +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ADC is not set +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_QT1050=m +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_GPIO=m +CONFIG_KEYBOARD_GPIO_POLLED=m +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +CONFIG_KEYBOARD_MATRIX=m +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MCS is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_KEYBOARD_SUNKBD=y +# CONFIG_KEYBOARD_OMAP4 is not set +CONFIG_KEYBOARD_TM2_TOUCHKEY=m +# CONFIG_KEYBOARD_XTKBD is not set +CONFIG_KEYBOARD_CROS_EC=y +# CONFIG_KEYBOARD_CAP11XX is not set +# CONFIG_KEYBOARD_BCM is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set +CONFIG_MOUSE_CYAPA=y +CONFIG_MOUSE_ELAN_I2C=y +CONFIG_MOUSE_ELAN_I2C_I2C=y +# CONFIG_MOUSE_ELAN_I2C_SMBUS is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_GPIO is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set +# CONFIG_MOUSE_SYNAPTICS_USB is not set +CONFIG_INPUT_JOYSTICK=y +# CONFIG_JOYSTICK_ANALOG is not set +# CONFIG_JOYSTICK_A3D is not set +# CONFIG_JOYSTICK_ADI is not set +# CONFIG_JOYSTICK_COBRA is not set +# CONFIG_JOYSTICK_GF2K is not set +# CONFIG_JOYSTICK_GRIP is not set +# CONFIG_JOYSTICK_GRIP_MP is not set +# CONFIG_JOYSTICK_GUILLEMOT is not set +# CONFIG_JOYSTICK_INTERACT is not set +# CONFIG_JOYSTICK_SIDEWINDER is not set +# CONFIG_JOYSTICK_TMDC is not set +CONFIG_JOYSTICK_IFORCE=y +CONFIG_JOYSTICK_IFORCE_USB=y +# CONFIG_JOYSTICK_IFORCE_232 is not set +# CONFIG_JOYSTICK_WARRIOR is not set +# CONFIG_JOYSTICK_MAGELLAN is not set +# CONFIG_JOYSTICK_SPACEORB is not set +# CONFIG_JOYSTICK_SPACEBALL is not set +# CONFIG_JOYSTICK_STINGER is not set +# CONFIG_JOYSTICK_TWIDJOY is not set +# CONFIG_JOYSTICK_ZHENHUA is not set +# CONFIG_JOYSTICK_AS5011 is not set +# CONFIG_JOYSTICK_JOYDUMP is not set +CONFIG_JOYSTICK_XPAD=y +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_JOYSTICK_XPAD_LEDS=y +# CONFIG_JOYSTICK_PSXPAD_SPI is not set +CONFIG_JOYSTICK_PXRC=m +CONFIG_JOYSTICK_FSIA6B=m +CONFIG_INPUT_TABLET=y +# CONFIG_TABLET_USB_ACECAD is not set +# CONFIG_TABLET_USB_AIPTEK is not set +# CONFIG_TABLET_USB_GTCO is not set +# CONFIG_TABLET_USB_HANWANG is not set +# CONFIG_TABLET_USB_KBTAB is not set +# CONFIG_TABLET_USB_PEGASUS is not set +# CONFIG_TABLET_SERIAL_WACOM4 is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_PROPERTIES=y +CONFIG_TOUCHSCREEN_ADS7846=m +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +CONFIG_TOUCHSCREEN_ADC=m +# CONFIG_TOUCHSCREEN_AR1021_I2C is not set +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +CONFIG_TOUCHSCREEN_BU21029=m +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_EGALAX is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GOODIX is not set +# CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_EKTF2127 is not set +CONFIG_TOUCHSCREEN_ELAN=y +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MCS5000 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +CONFIG_TOUCHSCREEN_USB_COMPOSITE=y +CONFIG_TOUCHSCREEN_USB_EGALAX=y +CONFIG_TOUCHSCREEN_USB_PANJIT=y +CONFIG_TOUCHSCREEN_USB_3M=y +CONFIG_TOUCHSCREEN_USB_ITM=y +CONFIG_TOUCHSCREEN_USB_ETURBO=y +CONFIG_TOUCHSCREEN_USB_GUNZE=y +CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y +CONFIG_TOUCHSCREEN_USB_IRTOUCH=y +CONFIG_TOUCHSCREEN_USB_IDEALTEK=y +CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y +CONFIG_TOUCHSCREEN_USB_GOTOP=y +CONFIG_TOUCHSCREEN_USB_JASTEC=y +CONFIG_TOUCHSCREEN_USB_ELO=y +CONFIG_TOUCHSCREEN_USB_E2I=y +CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y +CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y +CONFIG_TOUCHSCREEN_USB_NEXIO=y +CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_STMFTS is not set +# CONFIG_TOUCHSCREEN_SUR40 is not set +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +CONFIG_TOUCHSCREEN_ZET6223=m +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set +CONFIG_TOUCHSCREEN_IQS5XX=m +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_ATMEL_CAPTOUCH is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_MSM_VIBRATOR is not set +CONFIG_INPUT_MAX77650_ONKEY=m +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_GP2A is not set +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_DECODER is not set +CONFIG_INPUT_GPIO_VIBRA=m +# CONFIG_INPUT_CPCAP_PWRBUTTON is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +# CONFIG_INPUT_REGULATOR_HAPTIC is not set +CONFIG_INPUT_UINPUT=y +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_PWM_BEEPER is not set +# CONFIG_INPUT_PWM_VIBRA is not set +# CONFIG_INPUT_RK805_PWRKEY is not set +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_CMA3000 is not set +# CONFIG_INPUT_DRV260X_HAPTICS is not set +# CONFIG_INPUT_DRV2665_HAPTICS is not set +# CONFIG_INPUT_DRV2667_HAPTICS is not set +# CONFIG_INPUT_STPMIC1_ONKEY is not set +CONFIG_RMI4_CORE=y +# CONFIG_RMI4_I2C is not set +# CONFIG_RMI4_SPI is not set +# CONFIG_RMI4_SMB is not set +CONFIG_RMI4_F03=y +CONFIG_RMI4_F03_SERIO=y +CONFIG_RMI4_2D_SENSOR=y +CONFIG_RMI4_F11=y +CONFIG_RMI4_F12=y +CONFIG_RMI4_F30=y +# CONFIG_RMI4_F34 is not set +# CONFIG_RMI4_F54 is not set +# CONFIG_RMI4_F55 is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_AMBAKMI is not set +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_RAW=y +# CONFIG_SERIO_ALTERA_PS2 is not set +# CONFIG_SERIO_PS2MULT is not set +# CONFIG_SERIO_ARC_PS2 is not set +# CONFIG_SERIO_APBPS2 is not set +# CONFIG_SERIO_GPIO_PS2 is not set +# CONFIG_USERIO is not set +# CONFIG_GAMEPORT is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_TRACE_SINK is not set +CONFIG_NULL_TTY=m +CONFIG_LDISC_AUTOLOAD=y +CONFIG_RK_CHAR_DRIVERS=y +CONFIG_RK3288_DEVGPIOMEM=m +CONFIG_DEVMEM=y +# CONFIG_DEVKMEM is not set + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +# CONFIG_SERIAL_8250_FINTEK is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DMA=y +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_ASPEED_VUART is not set +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_DW=y +# CONFIG_SERIAL_8250_EM is not set +# CONFIG_SERIAL_8250_RT288X is not set +CONFIG_SERIAL_OF_PLATFORM=y + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set +# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_SIFIVE=m +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_BCM63XX is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_IFX6X60 is not set +# CONFIG_SERIAL_XILINX_PS_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_FSL_LPUART is not set +CONFIG_SERIAL_FSL_LINFLEXUART=m +# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +# CONFIG_SERIAL_ST_ASC is not set +# end of Serial drivers + +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_DEV_BUS=y +# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set +# CONFIG_TTY_PRINTK is not set +CONFIG_HVC_DRIVER=y +# CONFIG_HVC_DCC is not set +CONFIG_VIRTIO_CONSOLE=m +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +CONFIG_HW_RANDOM_VIRTIO=m +# CONFIG_RAW_DRIVER is not set +CONFIG_TCG_TPM=y +CONFIG_HW_RANDOM_TPM=y +# CONFIG_TCG_TIS is not set +# CONFIG_TCG_TIS_SPI is not set +# CONFIG_TCG_TIS_I2C_ATMEL is not set +CONFIG_TCG_TIS_I2C_INFINEON=y +# CONFIG_TCG_TIS_I2C_NUVOTON is not set +# CONFIG_TCG_ATMEL is not set +# CONFIG_TCG_VTPM_PROXY is not set +# CONFIG_TCG_TIS_ST33ZP24_I2C is not set +# CONFIG_TCG_TIS_ST33ZP24_SPI is not set +# CONFIG_XILLYBUS is not set +# end of Character devices + +# CONFIG_RANDOM_TRUST_BOOTLOADER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MUX=y + +# +# Multiplexer I2C Chip support +# +CONFIG_I2C_ARB_GPIO_CHALLENGE=m +CONFIG_I2C_MUX_GPIO=m +# CONFIG_I2C_MUX_GPMUX is not set +# CONFIG_I2C_MUX_LTC4306 is not set +CONFIG_I2C_MUX_PCA9541=m +CONFIG_I2C_MUX_PCA954x=m +CONFIG_I2C_MUX_PINCTRL=m +CONFIG_I2C_MUX_REG=m +CONFIG_I2C_DEMUX_PINCTRL=m +# CONFIG_I2C_MUX_MLXCPLD is not set +# end of Multiplexer I2C Chip support + +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_ALGOBIT=y + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_DESIGNWARE_PLATFORM is not set +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +CONFIG_I2C_RK3X=y +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +CONFIG_I2C_CROS_EC_TUNNEL=y +# end of I2C Hardware Bus support + +CONFIG_I2C_STUB=m +# CONFIG_I2C_SLAVE is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +# CONFIG_I3C is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y +# CONFIG_SPI_MEM is not set + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_AXI_SPI_ENGINE is not set +CONFIG_SPI_BITBANG=y +# CONFIG_SPI_CADENCE is not set +# CONFIG_SPI_DESIGNWARE is not set +# CONFIG_SPI_NXP_FLEXSPI is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PL022 is not set +CONFIG_SPI_ROCKCHIP=y +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set +# CONFIG_SPI_MXIC is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_ZYNQMP_GQSPI is not set + +# +# SPI Protocol Masters +# +CONFIG_SPI_SPIDEV=y +# CONFIG_SPI_LOOPBACK_TEST is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_SLAVE is not set +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +CONFIG_PPS=y +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +# CONFIG_PPS_CLIENT_KTIMER is not set +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PPS_CLIENT_GPIO=m + +# +# PPS generators support +# + +# +# PTP clock support +# +CONFIG_PTP_1588_CLOCK=y +CONFIG_DP83640_PHY=m +CONFIG_PTP_1588_CLOCK_IDTCM=m +# end of PTP clock support + +CONFIG_PINCTRL=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_PINMUX=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_PINCONF=y +CONFIG_GENERIC_PINCONF=y +# CONFIG_DEBUG_PINCTRL is not set +# CONFIG_PINCTRL_AMD is not set +# CONFIG_PINCTRL_MCP23S08 is not set +CONFIG_PINCTRL_ROCKCHIP=y +# CONFIG_PINCTRL_SINGLE is not set +# CONFIG_PINCTRL_SX150X is not set +CONFIG_PINCTRL_STMFX=m +# CONFIG_PINCTRL_RK805 is not set +# CONFIG_PINCTRL_OCELOT is not set +CONFIG_PINCTRL_MADERA=m +CONFIG_PINCTRL_EQUILIBRIUM=m +CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +CONFIG_OF_GPIO=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_DEBUG_GPIO=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_GENERIC=y + +# +# Memory mapped GPIO drivers +# +# CONFIG_GPIO_74XX_MMIO is not set +# CONFIG_GPIO_ALTERA is not set +# CONFIG_GPIO_CADENCE is not set +# CONFIG_GPIO_DWAPB is not set +# CONFIG_GPIO_FTGPIO010 is not set +CONFIG_GPIO_GENERIC_PLATFORM=y +# CONFIG_GPIO_GRGPIO is not set +CONFIG_GPIO_HLWD=m +# CONFIG_GPIO_MB86S7X is not set +# CONFIG_GPIO_MPC8XXX is not set +# CONFIG_GPIO_PL061 is not set +# CONFIG_GPIO_SAMA5D2_PIOBU is not set +# CONFIG_GPIO_SYSCON is not set +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_ZEVIO is not set +# CONFIG_GPIO_AMD_FCH is not set +# end of Memory mapped GPIO drivers + +# +# I2C GPIO expanders +# +# CONFIG_GPIO_ADP5588 is not set +# CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_GW_PLD is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_TPIC2810 is not set +# end of I2C GPIO expanders + +# +# MFD GPIO expanders +# +# CONFIG_HTC_EGPIO is not set +# CONFIG_GPIO_MADERA is not set +CONFIG_GPIO_MAX77650=m +# CONFIG_GPIO_TPS6586X is not set +# CONFIG_GPIO_TQMX86 is not set +# end of MFD GPIO expanders + +# +# SPI GPIO expanders +# +# CONFIG_GPIO_74X164 is not set +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set +# end of SPI GPIO expanders + +# +# USB GPIO expanders +# +# end of USB GPIO expanders + +# CONFIG_GPIO_MOCKUP is not set +CONFIG_W1=m +CONFIG_W1_CON=y + +# +# 1-wire Bus Masters +# +# CONFIG_W1_MASTER_DS2490 is not set +# CONFIG_W1_MASTER_DS2482 is not set +# CONFIG_W1_MASTER_DS1WM is not set +CONFIG_W1_MASTER_GPIO=m +CONFIG_W1_MASTER_SGI=m +# end of 1-wire Bus Masters + +# +# 1-wire Slaves +# +CONFIG_W1_SLAVE_THERM=m +CONFIG_W1_SLAVE_SMEM=m +CONFIG_W1_SLAVE_DS2405=m +CONFIG_W1_SLAVE_DS2408=m +CONFIG_W1_SLAVE_DS2408_READBACK=y +CONFIG_W1_SLAVE_DS2413=m +CONFIG_W1_SLAVE_DS2406=m +CONFIG_W1_SLAVE_DS2423=m +# CONFIG_W1_SLAVE_DS2805 is not set +CONFIG_W1_SLAVE_DS2430=m +CONFIG_W1_SLAVE_DS2431=m +CONFIG_W1_SLAVE_DS2433=m +# CONFIG_W1_SLAVE_DS2433_CRC is not set +CONFIG_W1_SLAVE_DS2438=m +CONFIG_W1_SLAVE_DS250X=m +CONFIG_W1_SLAVE_DS2780=m +CONFIG_W1_SLAVE_DS2781=m +# CONFIG_W1_SLAVE_DS28E04 is not set +# CONFIG_W1_SLAVE_DS28E17 is not set +# end of 1-wire Slaves + +CONFIG_POWER_AVS=y +CONFIG_ROCKCHIP_IODOMAIN=y +CONFIG_POWER_RESET=y +# CONFIG_POWER_RESET_BRCMKONA is not set +# CONFIG_POWER_RESET_BRCMSTB is not set +# CONFIG_POWER_RESET_GPIO is not set +CONFIG_POWER_RESET_GPIO_RESTART=y +# CONFIG_POWER_RESET_LTC2952 is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_RESET_VERSATILE is not set +CONFIG_POWER_RESET_SYSCON=y +CONFIG_POWER_RESET_SYSCON_POWEROFF=y +CONFIG_REBOOT_MODE=m +CONFIG_SYSCON_REBOOT_MODE=m +# CONFIG_NVMEM_REBOOT_MODE is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_POWER_SUPPLY_HWMON=y +# CONFIG_PDA_POWER is not set +# CONFIG_GENERIC_ADC_BATTERY is not set +# CONFIG_TEST_POWER is not set +CONFIG_CHARGER_ADP5061=m +CONFIG_BATTERY_CPCAP=m +CONFIG_BATTERY_DS2760=m +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_LEGO_EV3 is not set +CONFIG_BATTERY_SBS=y +# CONFIG_CHARGER_SBS is not set +# CONFIG_MANAGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +CONFIG_BATTERY_MAX1721X=m +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +CONFIG_CHARGER_GPIO=y +# CONFIG_CHARGER_MANAGER is not set +CONFIG_CHARGER_LT3651=m +# CONFIG_CHARGER_DETECTOR_MAX14656 is not set +CONFIG_CHARGER_MAX77650=m +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24257 is not set +CONFIG_CHARGER_BQ24735=y +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_CHARGER_RT9455 is not set +CONFIG_CHARGER_CROS_USBPD=m +CONFIG_CHARGER_UCS1002=m +CONFIG_HWMON=y +CONFIG_HWMON_VID=m +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +CONFIG_SENSORS_AD7314=m +CONFIG_SENSORS_AD7414=m +CONFIG_SENSORS_AD7418=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1026=m +CONFIG_SENSORS_ADM1029=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_ADT7X10=m +CONFIG_SENSORS_ADT7310=m +CONFIG_SENSORS_ADT7410=m +CONFIG_SENSORS_ADT7411=m +CONFIG_SENSORS_ADT7462=m +CONFIG_SENSORS_ADT7470=m +CONFIG_SENSORS_ADT7475=m +CONFIG_SENSORS_AS370=m +CONFIG_SENSORS_ASC7621=m +# CONFIG_SENSORS_ASPEED is not set +CONFIG_SENSORS_ATXP1=m +CONFIG_SENSORS_DS620=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_F71805F=m +CONFIG_SENSORS_F71882FG=m +CONFIG_SENSORS_F75375S=m +CONFIG_SENSORS_FTSTEUTATES=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_G760A=m +CONFIG_SENSORS_G762=m +CONFIG_SENSORS_GPIO_FAN=m +CONFIG_SENSORS_HIH6130=m +# CONFIG_SENSORS_IIO_HWMON is not set +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_JC42=m +CONFIG_SENSORS_POWR1220=m +CONFIG_SENSORS_LINEAGE=m +CONFIG_SENSORS_LTC2945=m +CONFIG_SENSORS_LTC2947=m +CONFIG_SENSORS_LTC2947_I2C=m +CONFIG_SENSORS_LTC2947_SPI=m +CONFIG_SENSORS_LTC2990=m +CONFIG_SENSORS_LTC4151=m +CONFIG_SENSORS_LTC4215=m +CONFIG_SENSORS_LTC4222=m +CONFIG_SENSORS_LTC4245=m +CONFIG_SENSORS_LTC4260=m +CONFIG_SENSORS_LTC4261=m +CONFIG_SENSORS_MAX1111=m +CONFIG_SENSORS_MAX16065=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_MAX1668=m +CONFIG_SENSORS_MAX197=m +CONFIG_SENSORS_MAX31722=m +# CONFIG_SENSORS_MAX6621 is not set +CONFIG_SENSORS_MAX6639=m +CONFIG_SENSORS_MAX6642=m +CONFIG_SENSORS_MAX6650=m +CONFIG_SENSORS_MAX6697=m +CONFIG_SENSORS_MAX31790=m +CONFIG_SENSORS_MCP3021=m +# CONFIG_SENSORS_TC654 is not set +CONFIG_SENSORS_ADCXX=m +CONFIG_SENSORS_LM63=m +CONFIG_SENSORS_LM70=m +CONFIG_SENSORS_LM73=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM87=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_LM92=m +CONFIG_SENSORS_LM93=m +CONFIG_SENSORS_LM95234=m +CONFIG_SENSORS_LM95241=m +CONFIG_SENSORS_LM95245=m +CONFIG_SENSORS_PC87360=m +CONFIG_SENSORS_PC87427=m +CONFIG_SENSORS_NTC_THERMISTOR=m +CONFIG_SENSORS_NCT6683=m +CONFIG_SENSORS_NCT6775=m +CONFIG_SENSORS_NCT7802=m +CONFIG_SENSORS_NCT7904=m +CONFIG_SENSORS_NPCM7XX=m +# CONFIG_SENSORS_OCC_P8_I2C is not set +CONFIG_SENSORS_PCF8591=m +# CONFIG_PMBUS is not set +CONFIG_SENSORS_PWM_FAN=m +CONFIG_SENSORS_SHT15=m +CONFIG_SENSORS_SHT21=m +CONFIG_SENSORS_SHT3x=m +CONFIG_SENSORS_SHTC1=m +CONFIG_SENSORS_DME1737=m +CONFIG_SENSORS_EMC1403=m +CONFIG_SENSORS_EMC2103=m +CONFIG_SENSORS_EMC6W201=m +CONFIG_SENSORS_SMSC47M1=m +CONFIG_SENSORS_SMSC47M192=m +CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_SCH56XX_COMMON=m +CONFIG_SENSORS_SCH5627=m +CONFIG_SENSORS_SCH5636=m +CONFIG_SENSORS_STTS751=m +CONFIG_SENSORS_SMM665=m +CONFIG_SENSORS_ADC128D818=m +CONFIG_SENSORS_ADS7828=m +CONFIG_SENSORS_ADS7871=m +CONFIG_SENSORS_AMC6821=m +CONFIG_SENSORS_INA209=m +CONFIG_SENSORS_INA2XX=m +CONFIG_SENSORS_INA3221=m +CONFIG_SENSORS_TC74=m +CONFIG_SENSORS_THMC50=m +CONFIG_SENSORS_TMP102=m +CONFIG_SENSORS_TMP103=m +# CONFIG_SENSORS_TMP108 is not set +CONFIG_SENSORS_TMP401=m +CONFIG_SENSORS_TMP421=m +CONFIG_SENSORS_TMP513=m +CONFIG_SENSORS_VT1211=m +CONFIG_SENSORS_W83773G=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83791D=m +CONFIG_SENSORS_W83792D=m +CONFIG_SENSORS_W83793=m +CONFIG_SENSORS_W83795=m +# CONFIG_SENSORS_W83795_FANCTRL is not set +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83L786NG=m +CONFIG_SENSORS_W83627HF=m +CONFIG_SENSORS_W83627EHF=m +CONFIG_THERMAL=y +# CONFIG_THERMAL_STATISTICS is not set +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +# CONFIG_THERMAL_WRITABLE_TRIPS is not set +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +CONFIG_THERMAL_GOV_STEP_WISE=y +# CONFIG_THERMAL_GOV_BANG_BANG is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +CONFIG_CPU_THERMAL=y +# CONFIG_CLOCK_THERMAL is not set +# CONFIG_DEVFREQ_THERMAL is not set +# CONFIG_THERMAL_EMULATION is not set +CONFIG_THERMAL_MMIO=m +# CONFIG_QORIQ_THERMAL is not set +CONFIG_ROCKCHIP_THERMAL=m +# CONFIG_GENERIC_ADC_THERMAL is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y +CONFIG_WATCHDOG_OPEN_TIMEOUT=0 +# CONFIG_WATCHDOG_SYSFS is not set + +# +# Watchdog Pretimeout Governors +# +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +# CONFIG_GPIO_WATCHDOG is not set +# CONFIG_XILINX_WATCHDOG is not set +# CONFIG_ZIIRAVE_WATCHDOG is not set +# CONFIG_ARM_SP805_WATCHDOG is not set +# CONFIG_CADENCE_WATCHDOG is not set +CONFIG_FTWDT010_WATCHDOG=m +CONFIG_DW_WATCHDOG=m +# CONFIG_MAX63XX_WATCHDOG is not set +CONFIG_STPMIC1_WATCHDOG=m +# CONFIG_MEN_A21_WDT is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y +# CONFIG_MFD_ACT8945A is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_AS3722 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_ATMEL_FLEXCOM is not set +# CONFIG_MFD_ATMEL_HLCDC is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_AXP20X_I2C is not set +CONFIG_MFD_CROS_EC_DEV=m +CONFIG_MFD_MADERA=m +CONFIG_MFD_MADERA_I2C=m +# CONFIG_MFD_MADERA_SPI is not set +# CONFIG_MFD_CS47L15 is not set +# CONFIG_MFD_CS47L35 is not set +# CONFIG_MFD_CS47L85 is not set +# CONFIG_MFD_CS47L90 is not set +# CONFIG_MFD_CS47L92 is not set +# CONFIG_MFD_ASIC3 is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_HI6421_PMIC is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_HTC_I2CPLD is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77620 is not set +CONFIG_MFD_MAX77650=m +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_EZX_PCAP is not set +CONFIG_MFD_CPCAP=m +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_PM8XXX is not set +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RC5T583 is not set +CONFIG_MFD_RK808=y +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_MFD_SMSC is not set +# CONFIG_ABX500_CORE is not set +# CONFIG_MFD_STMPE is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TI_LP87565 is not set +# CONFIG_MFD_TPS65218 is not set +CONFIG_MFD_TPS6586X=y +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS80031 is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +CONFIG_MFD_WL1273_CORE=m +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_MFD_TC6393XB is not set +CONFIG_MFD_TQMX86=m +# CONFIG_MFD_LOCHNAGAR is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +CONFIG_MFD_ROHM_BD718XX=m +# CONFIG_MFD_ROHM_BD70528 is not set +CONFIG_MFD_STPMIC1=m +CONFIG_MFD_STMFX=m +# CONFIG_RAVE_SP_CORE is not set +# end of Multifunction device drivers + +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_DEBUG is not set +CONFIG_REGULATOR_FIXED_VOLTAGE=y +# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set +# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set +CONFIG_REGULATOR_88PG86X=m +CONFIG_REGULATOR_ACT8865=y +# CONFIG_REGULATOR_AD5398 is not set +# CONFIG_REGULATOR_ANATOP is not set +# CONFIG_REGULATOR_ARIZONA_LDO1 is not set +# CONFIG_REGULATOR_ARIZONA_MICSUPP is not set +CONFIG_REGULATOR_BD718XX=m +CONFIG_REGULATOR_CPCAP=m +# CONFIG_REGULATOR_DA9210 is not set +# CONFIG_REGULATOR_DA9211 is not set +CONFIG_REGULATOR_FAN53555=y +# CONFIG_REGULATOR_GPIO is not set +# CONFIG_REGULATOR_ISL9305 is not set +# CONFIG_REGULATOR_ISL6271A is not set +# CONFIG_REGULATOR_LP3971 is not set +# CONFIG_REGULATOR_LP3972 is not set +# CONFIG_REGULATOR_LP872X is not set +# CONFIG_REGULATOR_LP8755 is not set +# CONFIG_REGULATOR_LTC3589 is not set +# CONFIG_REGULATOR_LTC3676 is not set +# CONFIG_REGULATOR_MAX1586 is not set +CONFIG_REGULATOR_MAX77650=m +# CONFIG_REGULATOR_MAX8649 is not set +# CONFIG_REGULATOR_MAX8660 is not set +# CONFIG_REGULATOR_MAX8952 is not set +# CONFIG_REGULATOR_MAX8973 is not set +# CONFIG_REGULATOR_MCP16502 is not set +# CONFIG_REGULATOR_MT6311 is not set +# CONFIG_REGULATOR_PFUZE100 is not set +# CONFIG_REGULATOR_PV88060 is not set +# CONFIG_REGULATOR_PV88080 is not set +# CONFIG_REGULATOR_PV88090 is not set +CONFIG_REGULATOR_PWM=y +CONFIG_REGULATOR_RK808=y +# CONFIG_REGULATOR_SLG51000 is not set +# CONFIG_REGULATOR_STPMIC1 is not set +# CONFIG_REGULATOR_SY8106A is not set +CONFIG_REGULATOR_SY8824X=m +# CONFIG_REGULATOR_TPS51632 is not set +# CONFIG_REGULATOR_TPS62360 is not set +# CONFIG_REGULATOR_TPS65023 is not set +# CONFIG_REGULATOR_TPS6507X is not set +# CONFIG_REGULATOR_TPS65132 is not set +# CONFIG_REGULATOR_TPS6524X is not set +CONFIG_REGULATOR_TPS6586X=y +# CONFIG_REGULATOR_VCTRL is not set +CONFIG_CEC_CORE=y +CONFIG_CEC_NOTIFIER=y +CONFIG_RC_CORE=y +CONFIG_RC_MAP=y +CONFIG_LIRC=y +CONFIG_RC_DECODERS=y +CONFIG_IR_NEC_DECODER=m +CONFIG_IR_RC5_DECODER=m +CONFIG_IR_RC6_DECODER=m +CONFIG_IR_JVC_DECODER=m +CONFIG_IR_SONY_DECODER=m +CONFIG_IR_SANYO_DECODER=m +CONFIG_IR_SHARP_DECODER=m +CONFIG_IR_MCE_KBD_DECODER=m +CONFIG_IR_XMP_DECODER=m +CONFIG_IR_IMON_DECODER=m +CONFIG_IR_RCMM_DECODER=m +CONFIG_RC_DEVICES=y +# CONFIG_RC_ATI_REMOTE is not set +# CONFIG_IR_HIX5HD2 is not set +# CONFIG_IR_IMON is not set +# CONFIG_IR_IMON_RAW is not set +# CONFIG_IR_MCEUSB is not set +# CONFIG_IR_REDRAT3 is not set +CONFIG_IR_SPI=m +# CONFIG_IR_STREAMZAP is not set +# CONFIG_IR_IGORPLUGUSB is not set +# CONFIG_IR_IGUANA is not set +# CONFIG_IR_TTUSBIR is not set +# CONFIG_RC_LOOPBACK is not set +CONFIG_IR_GPIO_CIR=m +# CONFIG_IR_GPIO_TX is not set +# CONFIG_IR_PWM_TX is not set +# CONFIG_IR_SERIAL is not set +# CONFIG_IR_SIR is not set +# CONFIG_RC_XBOX_DVD is not set +CONFIG_MEDIA_SUPPORT=y + +# +# Multimedia core support +# +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +# CONFIG_MEDIA_CEC_SUPPORT is not set +# CONFIG_MEDIA_CEC_RC is not set +CONFIG_MEDIA_CONTROLLER=y +CONFIG_MEDIA_CONTROLLER_DVB=y +# CONFIG_MEDIA_CONTROLLER_REQUEST_API is not set +CONFIG_VIDEO_DEV=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_VIDEO_V4L2=y +CONFIG_VIDEO_V4L2_I2C=y +# CONFIG_VIDEO_ADV_DEBUG is not set +CONFIG_VIDEO_FIXED_MINOR_RANGES=y +CONFIG_VIDEO_TUNER=m +CONFIG_V4L2_MEM2MEM_DEV=m +CONFIG_V4L2_FWNODE=m +CONFIG_VIDEOBUF_GEN=m +CONFIG_VIDEOBUF_VMALLOC=m +CONFIG_DVB_CORE=y +# CONFIG_DVB_MMAP is not set +CONFIG_DVB_NET=y +CONFIG_TTPCI_EEPROM=m +CONFIG_DVB_MAX_ADAPTERS=16 +CONFIG_DVB_DYNAMIC_MINORS=y +# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set +# CONFIG_DVB_ULE_DEBUG is not set + +# +# Media drivers +# +CONFIG_MEDIA_USB_SUPPORT=y + +# +# Webcam devices +# +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_USB_GSPCA=m +CONFIG_USB_M5602=m +CONFIG_USB_STV06XX=m +CONFIG_USB_GL860=m +CONFIG_USB_GSPCA_BENQ=m +CONFIG_USB_GSPCA_CONEX=m +CONFIG_USB_GSPCA_CPIA1=m +CONFIG_USB_GSPCA_DTCS033=m +CONFIG_USB_GSPCA_ETOMS=m +CONFIG_USB_GSPCA_FINEPIX=m +CONFIG_USB_GSPCA_JEILINJ=m +CONFIG_USB_GSPCA_JL2005BCD=m +CONFIG_USB_GSPCA_KINECT=m +CONFIG_USB_GSPCA_KONICA=m +CONFIG_USB_GSPCA_MARS=m +CONFIG_USB_GSPCA_MR97310A=m +CONFIG_USB_GSPCA_NW80X=m +CONFIG_USB_GSPCA_OV519=m +CONFIG_USB_GSPCA_OV534=m +CONFIG_USB_GSPCA_OV534_9=m +CONFIG_USB_GSPCA_PAC207=m +CONFIG_USB_GSPCA_PAC7302=m +CONFIG_USB_GSPCA_PAC7311=m +CONFIG_USB_GSPCA_SE401=m +CONFIG_USB_GSPCA_SN9C2028=m +CONFIG_USB_GSPCA_SN9C20X=m +CONFIG_USB_GSPCA_SONIXB=m +CONFIG_USB_GSPCA_SONIXJ=m +CONFIG_USB_GSPCA_SPCA500=m +CONFIG_USB_GSPCA_SPCA501=m +CONFIG_USB_GSPCA_SPCA505=m +CONFIG_USB_GSPCA_SPCA506=m +CONFIG_USB_GSPCA_SPCA508=m +CONFIG_USB_GSPCA_SPCA561=m +CONFIG_USB_GSPCA_SPCA1528=m +CONFIG_USB_GSPCA_SQ905=m +CONFIG_USB_GSPCA_SQ905C=m +CONFIG_USB_GSPCA_SQ930X=m +CONFIG_USB_GSPCA_STK014=m +CONFIG_USB_GSPCA_STK1135=m +CONFIG_USB_GSPCA_STV0680=m +CONFIG_USB_GSPCA_SUNPLUS=m +CONFIG_USB_GSPCA_T613=m +CONFIG_USB_GSPCA_TOPRO=m +CONFIG_USB_GSPCA_TOUPTEK=m +CONFIG_USB_GSPCA_TV8532=m +CONFIG_USB_GSPCA_VC032X=m +CONFIG_USB_GSPCA_VICAM=m +CONFIG_USB_GSPCA_XIRLINK_CIT=m +CONFIG_USB_GSPCA_ZC3XX=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set +CONFIG_USB_PWC_INPUT_EVDEV=y +CONFIG_VIDEO_CPIA2=m +CONFIG_USB_ZR364XX=m +CONFIG_USB_STKWEBCAM=m +CONFIG_USB_S2255=m +CONFIG_VIDEO_USBTV=m + +# +# Analog TV USB devices +# +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_SYSFS=y +CONFIG_VIDEO_PVRUSB2_DVB=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_HDPVR=m +CONFIG_VIDEO_USBVISION=m +CONFIG_VIDEO_STK1160_COMMON=m +CONFIG_VIDEO_STK1160=m +# CONFIG_VIDEO_GO7007 is not set + +# +# Analog/digital TV USB devices +# +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_AU0828_V4L2=y +# CONFIG_VIDEO_AU0828_RC is not set +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_RC=y +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_VIDEO_TM6000=m +CONFIG_VIDEO_TM6000_ALSA=m +CONFIG_VIDEO_TM6000_DVB=m + +# +# Digital TV USB devices +# +CONFIG_DVB_USB=m +# CONFIG_DVB_USB_DEBUG is not set +CONFIG_DVB_USB_DIB3000MC=m +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_DIBUSB_MB=m +CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_CXUSB=m +# CONFIG_DVB_USB_CXUSB_ANALOG is not set +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_VP7045=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_V2=y +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_ZD1301=m +CONFIG_SMS_USB_DRV=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set +CONFIG_DVB_AS102=m + +# +# Webcam, TV (analog/digital) USB devices +# +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_VIDEO_EM28XX_RC=m + +# +# Software defined radio USB devices +# +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +CONFIG_USB_MSI2500=m +CONFIG_V4L_PLATFORM_DRIVERS=y +# CONFIG_VIDEO_CADENCE is not set +# CONFIG_VIDEO_ASPEED is not set +CONFIG_VIDEO_MUX=m +CONFIG_VIDEO_XILINX=m +CONFIG_VIDEO_XILINX_TPG=m +CONFIG_VIDEO_XILINX_VTC=m +CONFIG_V4L_MEM2MEM_DRIVERS=y +# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set +# CONFIG_VIDEO_SH_VEU is not set +CONFIG_VIDEO_ROCKCHIP_RGA=m +CONFIG_V4L_TEST_DRIVERS=y +# CONFIG_VIDEO_VIMC is not set +CONFIG_VIDEO_VIVID=m +# CONFIG_VIDEO_VIVID_CEC is not set +CONFIG_VIDEO_VIVID_MAX_DEVS=64 +CONFIG_VIDEO_VIM2M=m +CONFIG_VIDEO_VICODEC=m +CONFIG_DVB_PLATFORM_DRIVERS=y +CONFIG_DVB_C8SECTPFE=m +# CONFIG_SDR_PLATFORM_DRIVERS is not set + +# +# Supported MMC/SDIO adapters +# +CONFIG_SMS_SDIO_DRV=m +CONFIG_RADIO_ADAPTERS=y +CONFIG_RADIO_TEA575X=m +CONFIG_RADIO_SI470X=y +CONFIG_USB_SI470X=m +CONFIG_I2C_SI470X=m +CONFIG_RADIO_SI4713=m +CONFIG_USB_SI4713=m +CONFIG_PLATFORM_SI4713=m +CONFIG_I2C_SI4713=m +CONFIG_USB_MR800=m +CONFIG_USB_DSBR=m +CONFIG_RADIO_SHARK=m +CONFIG_RADIO_SHARK2=m +CONFIG_USB_KEENE=m +CONFIG_USB_RAREMONO=m +CONFIG_USB_MA901=m +CONFIG_RADIO_TEA5764=m +CONFIG_RADIO_SAA7706H=m +CONFIG_RADIO_TEF6862=m +CONFIG_RADIO_WL1273=m + +# +# Texas Instruments WL128x FM driver (ST based) +# +# end of Texas Instruments WL128x FM driver (ST based) + +CONFIG_MEDIA_COMMON_OPTIONS=y + +# +# common driver options +# +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_CYPRESS_FIRMWARE=m +CONFIG_VIDEOBUF2_CORE=m +CONFIG_VIDEOBUF2_V4L2=m +CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m +CONFIG_VIDEOBUF2_VMALLOC=m +CONFIG_VIDEOBUF2_DMA_SG=m +CONFIG_DVB_B2C2_FLEXCOP=m +CONFIG_SMS_SIANO_MDTV=m +CONFIG_SMS_SIANO_RC=y +CONFIG_SMS_SIANO_DEBUGFS=y +CONFIG_VIDEO_V4L2_TPG=m + +# +# Media ancillary drivers (tuners, sensors, i2c, spi, frontends) +# +# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set +CONFIG_MEDIA_ATTACH=y +CONFIG_VIDEO_IR_I2C=m + +# +# I2C Encoders, decoders, sensors and other helper chips +# + +# +# Audio decoders, processors and mixers +# +CONFIG_VIDEO_TVAUDIO=m +CONFIG_VIDEO_TDA7432=m +CONFIG_VIDEO_TDA9840=m +# CONFIG_VIDEO_TDA1997X is not set +CONFIG_VIDEO_TEA6415C=m +CONFIG_VIDEO_TEA6420=m +CONFIG_VIDEO_MSP3400=m +# CONFIG_VIDEO_CS3308 is not set +CONFIG_VIDEO_CS5345=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_TLV320AIC23B=m +CONFIG_VIDEO_UDA1342=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_VP27SMPX=m +CONFIG_VIDEO_SONY_BTF_MPX=m + +# +# RDS decoders +# +CONFIG_VIDEO_SAA6588=m + +# +# Video decoders +# +CONFIG_VIDEO_ADV7180=m +CONFIG_VIDEO_ADV7183=m +# CONFIG_VIDEO_ADV748X is not set +CONFIG_VIDEO_ADV7604=m +# CONFIG_VIDEO_ADV7604_CEC is not set +CONFIG_VIDEO_ADV7842=m +# CONFIG_VIDEO_ADV7842_CEC is not set +CONFIG_VIDEO_BT819=m +CONFIG_VIDEO_BT856=m +CONFIG_VIDEO_BT866=m +CONFIG_VIDEO_KS0127=m +CONFIG_VIDEO_ML86V7667=m +CONFIG_VIDEO_SAA7110=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_TC358743=m +# CONFIG_VIDEO_TC358743_CEC is not set +CONFIG_VIDEO_TVP514X=m +CONFIG_VIDEO_TVP5150=m +CONFIG_VIDEO_TVP7002=m +CONFIG_VIDEO_TW2804=m +CONFIG_VIDEO_TW9903=m +CONFIG_VIDEO_TW9906=m +# CONFIG_VIDEO_TW9910 is not set +CONFIG_VIDEO_VPX3220=m + +# +# Video and audio decoders +# +CONFIG_VIDEO_SAA717X=m +CONFIG_VIDEO_CX25840=m + +# +# Video encoders +# +CONFIG_VIDEO_SAA7127=m +CONFIG_VIDEO_SAA7185=m +CONFIG_VIDEO_ADV7170=m +CONFIG_VIDEO_ADV7175=m +CONFIG_VIDEO_ADV7343=m +CONFIG_VIDEO_ADV7393=m +CONFIG_VIDEO_ADV7511=m +# CONFIG_VIDEO_ADV7511_CEC is not set +CONFIG_VIDEO_AD9389B=m +CONFIG_VIDEO_AK881X=m +CONFIG_VIDEO_THS8200=m + +# +# Camera sensor devices +# +CONFIG_VIDEO_APTINA_PLL=m +CONFIG_VIDEO_SMIAPP_PLL=m +CONFIG_VIDEO_HI556=m +# CONFIG_VIDEO_IMX214 is not set +# CONFIG_VIDEO_IMX258 is not set +CONFIG_VIDEO_IMX274=m +CONFIG_VIDEO_IMX290=m +# CONFIG_VIDEO_IMX319 is not set +# CONFIG_VIDEO_IMX355 is not set +CONFIG_VIDEO_OV2640=m +CONFIG_VIDEO_OV2659=m +CONFIG_VIDEO_OV2680=m +CONFIG_VIDEO_OV2685=m +CONFIG_VIDEO_OV5640=m +CONFIG_VIDEO_OV5645=m +CONFIG_VIDEO_OV5647=m +CONFIG_VIDEO_OV6650=m +CONFIG_VIDEO_OV5670=m +CONFIG_VIDEO_OV5675=m +CONFIG_VIDEO_OV5695=m +CONFIG_VIDEO_OV7251=m +CONFIG_VIDEO_OV772X=m +CONFIG_VIDEO_OV7640=m +CONFIG_VIDEO_OV7670=m +CONFIG_VIDEO_OV7740=m +CONFIG_VIDEO_OV8856=m +CONFIG_VIDEO_OV9640=m +CONFIG_VIDEO_OV9650=m +CONFIG_VIDEO_OV13858=m +CONFIG_VIDEO_VS6624=m +CONFIG_VIDEO_MT9M001=m +CONFIG_VIDEO_MT9M032=m +CONFIG_VIDEO_MT9M111=m +CONFIG_VIDEO_MT9P031=m +CONFIG_VIDEO_MT9T001=m +CONFIG_VIDEO_MT9T112=m +CONFIG_VIDEO_MT9V011=m +CONFIG_VIDEO_MT9V032=m +CONFIG_VIDEO_MT9V111=m +CONFIG_VIDEO_SR030PC30=m +CONFIG_VIDEO_NOON010PC30=m +CONFIG_VIDEO_M5MOLS=m +CONFIG_VIDEO_RJ54N1=m +CONFIG_VIDEO_S5K6AA=m +CONFIG_VIDEO_S5K6A3=m +CONFIG_VIDEO_S5K4ECGX=m +CONFIG_VIDEO_S5K5BAF=m +CONFIG_VIDEO_SMIAPP=m +CONFIG_VIDEO_ET8EK8=m +CONFIG_VIDEO_S5C73M3=m + +# +# Lens drivers +# +# CONFIG_VIDEO_AD5820 is not set +CONFIG_VIDEO_AK7375=m +# CONFIG_VIDEO_DW9714 is not set +CONFIG_VIDEO_DW9807_VCM=m + +# +# Flash devices +# +CONFIG_VIDEO_ADP1653=m +CONFIG_VIDEO_LM3560=m +CONFIG_VIDEO_LM3646=m + +# +# Video improvement chips +# +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m + +# +# Audio/Video compression chips +# +# CONFIG_VIDEO_SAA6752HS is not set + +# +# SDR tuner chips +# +CONFIG_SDR_MAX2175=m + +# +# Miscellaneous helper chips +# +CONFIG_VIDEO_THS7303=m +CONFIG_VIDEO_M52790=m +CONFIG_VIDEO_I2C=m +CONFIG_VIDEO_ST_MIPID02=m +# end of I2C Encoders, decoders, sensors and other helper chips + +# +# SPI helper chips +# +# CONFIG_VIDEO_GS1662 is not set +# end of SPI helper chips + +# +# Media SPI Adapters +# +CONFIG_CXD2880_SPI_DRV=m +# end of Media SPI Adapters + +CONFIG_MEDIA_TUNER=y + +# +# Customize TV tuners +# +CONFIG_MEDIA_TUNER_SIMPLE=y +CONFIG_MEDIA_TUNER_TDA18250=m +CONFIG_MEDIA_TUNER_TDA8290=y +CONFIG_MEDIA_TUNER_TDA827X=y +CONFIG_MEDIA_TUNER_TDA18271=y +CONFIG_MEDIA_TUNER_TDA9887=y +CONFIG_MEDIA_TUNER_TEA5761=m +CONFIG_MEDIA_TUNER_TEA5767=m +CONFIG_MEDIA_TUNER_MSI001=m +CONFIG_MEDIA_TUNER_MT20XX=y +CONFIG_MEDIA_TUNER_MT2060=m +CONFIG_MEDIA_TUNER_MT2063=m +CONFIG_MEDIA_TUNER_MT2266=m +CONFIG_MEDIA_TUNER_MT2131=m +CONFIG_MEDIA_TUNER_QT1010=m +CONFIG_MEDIA_TUNER_XC2028=y +CONFIG_MEDIA_TUNER_XC5000=y +CONFIG_MEDIA_TUNER_XC4000=y +CONFIG_MEDIA_TUNER_MXL5005S=m +CONFIG_MEDIA_TUNER_MXL5007T=m +CONFIG_MEDIA_TUNER_MC44S803=y +CONFIG_MEDIA_TUNER_MAX2165=m +CONFIG_MEDIA_TUNER_TDA18218=m +CONFIG_MEDIA_TUNER_FC0011=m +CONFIG_MEDIA_TUNER_FC0012=m +CONFIG_MEDIA_TUNER_FC0013=m +CONFIG_MEDIA_TUNER_TDA18212=m +CONFIG_MEDIA_TUNER_E4000=m +CONFIG_MEDIA_TUNER_FC2580=m +CONFIG_MEDIA_TUNER_M88RS6000T=m +CONFIG_MEDIA_TUNER_TUA9001=m +CONFIG_MEDIA_TUNER_SI2157=m +CONFIG_MEDIA_TUNER_IT913X=m +CONFIG_MEDIA_TUNER_R820T=m +CONFIG_MEDIA_TUNER_MXL301RF=m +CONFIG_MEDIA_TUNER_QM1D1C0042=m +CONFIG_MEDIA_TUNER_QM1D1B0004=m +# end of Customize TV tuners + +# +# Customise DVB Frontends +# + +# +# Multistandard (satellite) frontends +# +CONFIG_DVB_STB0899=m +CONFIG_DVB_STB6100=m +CONFIG_DVB_STV090x=m +CONFIG_DVB_STV0910=m +CONFIG_DVB_STV6110x=m +CONFIG_DVB_STV6111=m +CONFIG_DVB_MXL5XX=m +CONFIG_DVB_M88DS3103=m + +# +# Multistandard (cable + terrestrial) frontends +# +CONFIG_DVB_DRXK=m +CONFIG_DVB_TDA18271C2DD=m +CONFIG_DVB_SI2165=m +CONFIG_DVB_MN88472=m +CONFIG_DVB_MN88473=m + +# +# DVB-S (satellite) frontends +# +CONFIG_DVB_CX24110=m +CONFIG_DVB_CX24123=m +CONFIG_DVB_MT312=m +CONFIG_DVB_ZL10036=m +CONFIG_DVB_ZL10039=m +CONFIG_DVB_S5H1420=m +CONFIG_DVB_STV0288=m +CONFIG_DVB_STB6000=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_STV6110=m +CONFIG_DVB_STV0900=m +CONFIG_DVB_TDA8083=m +CONFIG_DVB_TDA10086=m +CONFIG_DVB_TDA8261=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TUNER_ITD1000=m +CONFIG_DVB_TUNER_CX24113=m +CONFIG_DVB_TDA826X=m +CONFIG_DVB_TUA6100=m +CONFIG_DVB_CX24116=m +CONFIG_DVB_CX24117=m +CONFIG_DVB_CX24120=m +CONFIG_DVB_SI21XX=m +CONFIG_DVB_TS2020=m +CONFIG_DVB_DS3000=m +CONFIG_DVB_MB86A16=m +CONFIG_DVB_TDA10071=m + +# +# DVB-T (terrestrial) frontends +# +CONFIG_DVB_SP8870=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_CX22700=m +CONFIG_DVB_CX22702=m +CONFIG_DVB_S5H1432=m +CONFIG_DVB_DRXD=m +CONFIG_DVB_L64781=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_NXT6000=m +CONFIG_DVB_MT352=m +CONFIG_DVB_ZL10353=m +CONFIG_DVB_DIB3000MB=m +CONFIG_DVB_DIB3000MC=m +CONFIG_DVB_DIB7000M=m +CONFIG_DVB_DIB7000P=m +CONFIG_DVB_DIB9000=m +CONFIG_DVB_TDA10048=m +CONFIG_DVB_AF9013=m +CONFIG_DVB_EC100=m +CONFIG_DVB_STV0367=m +CONFIG_DVB_CXD2820R=m +CONFIG_DVB_CXD2841ER=m +CONFIG_DVB_RTL2830=m +CONFIG_DVB_RTL2832=m +CONFIG_DVB_RTL2832_SDR=m +CONFIG_DVB_SI2168=m +CONFIG_DVB_AS102_FE=m +CONFIG_DVB_ZD1301_DEMOD=m +CONFIG_DVB_GP8PSK_FE=m +CONFIG_DVB_CXD2880=m + +# +# DVB-C (cable) frontends +# +CONFIG_DVB_VES1820=m +CONFIG_DVB_TDA10021=m +CONFIG_DVB_TDA10023=m +CONFIG_DVB_STV0297=m + +# +# ATSC (North American/Korean Terrestrial/Cable DTV) frontends +# +CONFIG_DVB_NXT200X=m +CONFIG_DVB_OR51211=m +CONFIG_DVB_OR51132=m +CONFIG_DVB_BCM3510=m +CONFIG_DVB_LGDT330X=m +CONFIG_DVB_LGDT3305=m +CONFIG_DVB_LGDT3306A=m +CONFIG_DVB_LG2160=m +CONFIG_DVB_S5H1409=m +CONFIG_DVB_AU8522=m +CONFIG_DVB_AU8522_DTV=m +CONFIG_DVB_AU8522_V4L=m +CONFIG_DVB_S5H1411=m + +# +# ISDB-T (terrestrial) frontends +# +CONFIG_DVB_S921=m +CONFIG_DVB_DIB8000=m +CONFIG_DVB_MB86A20S=m + +# +# ISDB-S (satellite) & ISDB-T (terrestrial) frontends +# +CONFIG_DVB_TC90522=m +CONFIG_DVB_MN88443X=m + +# +# Digital terrestrial only tuners/PLL +# +CONFIG_DVB_PLL=m +CONFIG_DVB_TUNER_DIB0070=m +CONFIG_DVB_TUNER_DIB0090=m + +# +# SEC control devices for DVB-S +# +CONFIG_DVB_DRX39XYJ=m +CONFIG_DVB_LNBH25=m +CONFIG_DVB_LNBH29=m +CONFIG_DVB_LNBP21=m +CONFIG_DVB_LNBP22=m +CONFIG_DVB_ISL6405=m +CONFIG_DVB_ISL6421=m +CONFIG_DVB_ISL6423=m +CONFIG_DVB_A8293=m +CONFIG_DVB_LGS8GL5=m +CONFIG_DVB_LGS8GXX=m +CONFIG_DVB_ATBM8830=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_IX2505V=m +CONFIG_DVB_M88RS2000=m +CONFIG_DVB_AF9033=m +CONFIG_DVB_HORUS3A=m +CONFIG_DVB_ASCOT2E=m +CONFIG_DVB_HELENE=m + +# +# Common Interface (EN50221) controller drivers +# +CONFIG_DVB_CXD2099=m +CONFIG_DVB_SP2=m + +# +# Tools to develop new frontends +# +# CONFIG_DVB_DUMMY_FE is not set +# end of Customise DVB Frontends + +# +# Graphics support +# +# CONFIG_IMX_IPUV3_CORE is not set +CONFIG_DRM=y +CONFIG_DRM_MIPI_DBI=m +CONFIG_DRM_MIPI_DSI=y +# CONFIG_DRM_DP_AUX_CHARDEV is not set +CONFIG_DRM_DEBUG_MM=y +# CONFIG_DRM_DEBUG_SELFTEST is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_KMS_FB_HELPER=y +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set +# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +# CONFIG_DRM_DP_CEC is not set +CONFIG_DRM_GEM_CMA_HELPER=y +CONFIG_DRM_KMS_CMA_HELPER=y +CONFIG_DRM_GEM_SHMEM_HELPER=y +CONFIG_DRM_SCHED=m + +# +# I2C encoder or helper chips +# +# CONFIG_DRM_I2C_CH7006 is not set +# CONFIG_DRM_I2C_SIL164 is not set +# CONFIG_DRM_I2C_NXP_TDA998X is not set +CONFIG_DRM_I2C_NXP_TDA9950=m +# end of I2C encoder or helper chips + +# +# ARM devices +# +# CONFIG_DRM_HDLCD is not set +# CONFIG_DRM_MALI_DISPLAY is not set +CONFIG_DRM_KOMEDA=m +# CONFIG_DRM_KOMEDA_ERROR_PRINT is not set +# end of ARM devices + +# +# ACP (Audio CoProcessor) Configuration +# +# end of ACP (Audio CoProcessor) Configuration + +# CONFIG_DRM_VGEM is not set +CONFIG_DRM_VKMS=m +# CONFIG_DRM_EXYNOS is not set +CONFIG_DRM_ROCKCHIP=y +# CONFIG_ROCKCHIP_ANALOGIX_DP is not set +CONFIG_ROCKCHIP_DW_HDMI=y +# CONFIG_ROCKCHIP_DW_MIPI_DSI is not set +# CONFIG_ROCKCHIP_INNO_HDMI is not set +CONFIG_ROCKCHIP_LVDS=y +# CONFIG_ROCKCHIP_RGB is not set +# CONFIG_ROCKCHIP_RK3066_HDMI is not set +CONFIG_DRM_UDL=y +# CONFIG_DRM_ARMADA is not set +# CONFIG_DRM_RCAR_DW_HDMI is not set +CONFIG_DRM_RCAR_LVDS=m +# CONFIG_DRM_OMAP is not set +# CONFIG_DRM_TILCDC is not set +CONFIG_DRM_VIRTIO_GPU=m +# CONFIG_DRM_FSL_DCU is not set +# CONFIG_DRM_STM is not set +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +CONFIG_DRM_PANEL_ARM_VERSATILE=m +# CONFIG_DRM_PANEL_LVDS is not set +CONFIG_DRM_PANEL_SIMPLE=y +# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set +# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set +CONFIG_DRM_PANEL_ILITEK_ILI9881C=m +CONFIG_DRM_PANEL_INNOLUX_P079ZCA=m +CONFIG_DRM_PANEL_JDI_LT070ME05000=m +CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04=m +# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set +CONFIG_DRM_PANEL_LG_LB035Q02=m +# CONFIG_DRM_PANEL_LG_LG4573 is not set +CONFIG_DRM_PANEL_NEC_NL8048HL11=m +CONFIG_DRM_PANEL_NOVATEK_NT39016=m +# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set +CONFIG_DRM_PANEL_ORISETECH_OTM8009A=m +# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set +CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00=m +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m +CONFIG_DRM_PANEL_RAYDIUM_RM67191=m +CONFIG_DRM_PANEL_RAYDIUM_RM68200=m +# CONFIG_DRM_PANEL_ROCKTECH_JH057N00900 is not set +# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set +CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2=m +CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03=m +# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set +# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set +CONFIG_DRM_PANEL_SHARP_LQ101R1SX01=m +CONFIG_DRM_PANEL_SHARP_LS037V7DW01=m +CONFIG_DRM_PANEL_SHARP_LS043T1LE01=m +CONFIG_DRM_PANEL_SITRONIX_ST7701=m +# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set +CONFIG_DRM_PANEL_SONY_ACX565AKM=m +CONFIG_DRM_PANEL_TPO_TD028TTEC1=m +CONFIG_DRM_PANEL_TPO_TD043MTEA1=m +CONFIG_DRM_PANEL_TPO_TPG110=m +# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set +# end of Display Panels + +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +CONFIG_DRM_CDNS_DSI=m +# CONFIG_DRM_DUMB_VGA_DAC is not set +# CONFIG_DRM_LVDS_ENCODER is not set +# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set +# CONFIG_DRM_NXP_PTN3460 is not set +# CONFIG_DRM_PARADE_PS8622 is not set +CONFIG_DRM_SIL_SII8620=m +# CONFIG_DRM_SII902X is not set +# CONFIG_DRM_SII9234 is not set +CONFIG_DRM_THINE_THC63LVD1024=m +CONFIG_DRM_TOSHIBA_TC358764=m +# CONFIG_DRM_TOSHIBA_TC358767 is not set +# CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_TI_SN65DSI86 is not set +# CONFIG_DRM_I2C_ADV7511 is not set +CONFIG_DRM_DW_HDMI=y +# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set +CONFIG_DRM_DW_HDMI_I2S_AUDIO=m +# CONFIG_DRM_DW_HDMI_CEC is not set +# end of Display Interface Bridges + +# CONFIG_DRM_STI is not set +CONFIG_DRM_ETNAVIV=m +CONFIG_DRM_ETNAVIV_THERMAL=y +# CONFIG_DRM_ARCPGU is not set +# CONFIG_DRM_MXSFB is not set +CONFIG_DRM_GM12U320=m +# CONFIG_TINYDRM_HX8357D is not set +# CONFIG_TINYDRM_ILI9225 is not set +CONFIG_TINYDRM_ILI9341=m +CONFIG_TINYDRM_MI0283QT=m +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_ST7586 is not set +# CONFIG_TINYDRM_ST7735R is not set +# CONFIG_DRM_PL111 is not set +# CONFIG_DRM_TVE200 is not set +CONFIG_DRM_LIMA=m +CONFIG_DRM_PANFROST=m +# CONFIG_DRM_MCDE is not set +# CONFIG_DRM_LEGACY is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y + +# +# Frame buffer Devices +# +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_BACKLIGHT=m +CONFIG_FB_MODE_HELPERS=y +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_ARMCLCD is not set +# CONFIG_FB_UVESA is not set +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_SIMPLE is not set +# CONFIG_FB_SSD1307 is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_GENERIC=y +CONFIG_BACKLIGHT_PWM=y +CONFIG_BACKLIGHT_QCOM_WLED=m +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +# CONFIG_BACKLIGHT_LM3630A is not set +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_LP855X is not set +# CONFIG_BACKLIGHT_GPIO is not set +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set +# end of Backlight & LCD device support + +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_HDMI=y + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +# CONFIG_LOGO_LINUX_CLUT224 is not set +# end of Graphics support + +CONFIG_SOUND=m +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_PCM_ELD=y +CONFIG_SND_PCM_IEC958=y +CONFIG_SND_DMAENGINE_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_SEQ_DEVICE=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +# CONFIG_SND_OSSEMUL is not set +CONFIG_SND_PCM_TIMER=y +CONFIG_SND_HRTIMER=m +CONFIG_SND_DYNAMIC_MINORS=y +CONFIG_SND_MAX_CARDS=32 +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_PROC_FS=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_SEQ_HRTIMER_DEFAULT=y +CONFIG_SND_SEQ_MIDI_EVENT=m +CONFIG_SND_SEQ_MIDI=m +CONFIG_SND_DRIVERS=y +CONFIG_SND_DUMMY=m +CONFIG_SND_ALOOP=m +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# HD-Audio +# +# end of HD-Audio + +CONFIG_SND_HDA_PREALLOC_SIZE=64 +# CONFIG_SND_ARM is not set +# CONFIG_SND_SPI is not set +CONFIG_SND_USB=y +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_USB_HIFACE is not set +# CONFIG_SND_BCD2000 is not set +# CONFIG_SND_USB_POD is not set +# CONFIG_SND_USB_PODHD is not set +# CONFIG_SND_USB_TONEPORT is not set +# CONFIG_SND_USB_VARIAX is not set +CONFIG_SND_SOC=m +CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_ATMEL_SOC is not set +# CONFIG_SND_DESIGNWARE_I2S is not set + +# +# SoC Audio for Freescale CPUs +# + +# +# Common SoC Audio options for Freescale CPUs: +# +# CONFIG_SND_SOC_FSL_ASRC is not set +# CONFIG_SND_SOC_FSL_SAI is not set +CONFIG_SND_SOC_FSL_AUDMIX=m +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# end of SoC Audio for Freescale CPUs + +# CONFIG_SND_I2S_HI6210_I2S is not set +# CONFIG_SND_SOC_IMG is not set +CONFIG_SND_SOC_MTK_BTCVSD=m +CONFIG_SND_SOC_ROCKCHIP=m +CONFIG_SND_SOC_ROCKCHIP_I2S=m +# CONFIG_SND_SOC_ROCKCHIP_PDM is not set +CONFIG_SND_SOC_ROCKCHIP_SPDIF=m +CONFIG_SND_SOC_ROCKCHIP_MAX98090=m +CONFIG_SND_SOC_ROCKCHIP_RT5645=m +CONFIG_SND_SOC_RK3288_HDMI_ANALOG=m +# CONFIG_SND_SOC_RK3399_GRU_SOUND is not set +# CONFIG_SND_SOC_SOF_TOPLEVEL is not set + +# +# STMicroelectronics STM32 SOC audio support +# +# end of STMicroelectronics STM32 SOC audio support + +# CONFIG_SND_SOC_XILINX_I2S is not set +CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER=m +CONFIG_SND_SOC_XILINX_SPDIF=m +# CONFIG_SND_SOC_XTFPGA_I2S is not set +# CONFIG_ZX_TDM is not set +CONFIG_SND_SOC_I2C_AND_SPI=m + +# +# CODEC drivers +# +# CONFIG_SND_SOC_AC97_CODEC is not set +# CONFIG_SND_SOC_ADAU1701 is not set +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +# CONFIG_SND_SOC_ADAU7002 is not set +CONFIG_SND_SOC_ADAU7118=m +CONFIG_SND_SOC_ADAU7118_HW=m +CONFIG_SND_SOC_ADAU7118_I2C=m +# CONFIG_SND_SOC_AK4104 is not set +# CONFIG_SND_SOC_AK4118 is not set +CONFIG_SND_SOC_AK4458=m +# CONFIG_SND_SOC_AK4554 is not set +# CONFIG_SND_SOC_AK4613 is not set +# CONFIG_SND_SOC_AK4642 is not set +# CONFIG_SND_SOC_AK5386 is not set +CONFIG_SND_SOC_AK5558=m +# CONFIG_SND_SOC_ALC5623 is not set +CONFIG_SND_SOC_BD28623=m +# CONFIG_SND_SOC_BT_SCO is not set +CONFIG_SND_SOC_CPCAP=m +CONFIG_SND_SOC_CROS_EC_CODEC=m +# CONFIG_SND_SOC_CS35L32 is not set +# CONFIG_SND_SOC_CS35L33 is not set +# CONFIG_SND_SOC_CS35L34 is not set +# CONFIG_SND_SOC_CS35L35 is not set +CONFIG_SND_SOC_CS35L36=m +# CONFIG_SND_SOC_CS42L42 is not set +# CONFIG_SND_SOC_CS42L51_I2C is not set +# CONFIG_SND_SOC_CS42L52 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_CS42L73 is not set +# CONFIG_SND_SOC_CS4265 is not set +# CONFIG_SND_SOC_CS4270 is not set +# CONFIG_SND_SOC_CS4271_I2C is not set +# CONFIG_SND_SOC_CS4271_SPI is not set +# CONFIG_SND_SOC_CS42XX8_I2C is not set +# CONFIG_SND_SOC_CS43130 is not set +CONFIG_SND_SOC_CS4341=m +# CONFIG_SND_SOC_CS4349 is not set +# CONFIG_SND_SOC_CS53L30 is not set +# CONFIG_SND_SOC_CX2072X is not set +CONFIG_SND_SOC_DA7213=m +# CONFIG_SND_SOC_DMIC is not set +CONFIG_SND_SOC_HDMI_CODEC=m +# CONFIG_SND_SOC_ES7134 is not set +CONFIG_SND_SOC_ES7241=m +# CONFIG_SND_SOC_ES8316 is not set +CONFIG_SND_SOC_ES8328=m +CONFIG_SND_SOC_ES8328_I2C=m +CONFIG_SND_SOC_ES8328_SPI=m +# CONFIG_SND_SOC_GTM601 is not set +# CONFIG_SND_SOC_INNO_RK3036 is not set +# CONFIG_SND_SOC_MAX98088 is not set +CONFIG_SND_SOC_MAX98090=m +# CONFIG_SND_SOC_MAX98357A is not set +# CONFIG_SND_SOC_MAX98504 is not set +CONFIG_SND_SOC_MAX9867=m +# CONFIG_SND_SOC_MAX98927 is not set +# CONFIG_SND_SOC_MAX98373 is not set +# CONFIG_SND_SOC_MAX9860 is not set +# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set +# CONFIG_SND_SOC_PCM1681 is not set +CONFIG_SND_SOC_PCM1789=m +CONFIG_SND_SOC_PCM1789_I2C=m +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +# CONFIG_SND_SOC_PCM3060_I2C is not set +# CONFIG_SND_SOC_PCM3060_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +CONFIG_SND_SOC_RK3328=m +CONFIG_SND_SOC_RL6231=m +CONFIG_SND_SOC_RT5616=m +# CONFIG_SND_SOC_RT5631 is not set +CONFIG_SND_SOC_RT5645=m +# CONFIG_SND_SOC_SGTL5000 is not set +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m +# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set +CONFIG_SND_SOC_SPDIF=m +CONFIG_SND_SOC_SSM2305=m +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +# CONFIG_SND_SOC_SSM4567 is not set +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +# CONFIG_SND_SOC_TAS2552 is not set +CONFIG_SND_SOC_TAS2562=m +CONFIG_SND_SOC_TAS2770=m +# CONFIG_SND_SOC_TAS5086 is not set +# CONFIG_SND_SOC_TAS571X is not set +# CONFIG_SND_SOC_TAS5720 is not set +# CONFIG_SND_SOC_TAS6424 is not set +CONFIG_SND_SOC_TDA7419=m +# CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +# CONFIG_SND_SOC_TLV320AIC3X is not set +CONFIG_SND_SOC_TS3A227E=m +# CONFIG_SND_SOC_TSCS42XX is not set +CONFIG_SND_SOC_TSCS454=m +CONFIG_SND_SOC_UDA1334=m +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731 is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +CONFIG_SND_SOC_WM8782=m +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +CONFIG_SND_SOC_WM8904=m +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +# CONFIG_SND_SOC_ZX_AUD96P22 is not set +CONFIG_SND_SOC_MAX9759=m +CONFIG_SND_SOC_MT6351=m +CONFIG_SND_SOC_MT6358=m +CONFIG_SND_SOC_NAU8540=m +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8822 is not set +# CONFIG_SND_SOC_NAU8824 is not set +# CONFIG_SND_SOC_TPA6130A2 is not set +# end of CODEC drivers + +CONFIG_SND_SIMPLE_CARD_UTILS=m +CONFIG_SND_SIMPLE_CARD=m +# CONFIG_SND_AUDIO_GRAPH_CARD is not set + +# +# HID support +# +CONFIG_HID=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=m +CONFIG_HID_ACCUTOUCH=m +CONFIG_HID_ACRUX=m +CONFIG_HID_ACRUX_FF=y +CONFIG_HID_APPLE=m +CONFIG_HID_APPLEIR=m +# CONFIG_HID_ASUS is not set +CONFIG_HID_AUREAL=m +CONFIG_HID_BELKIN=m +CONFIG_HID_BETOP_FF=m +# CONFIG_HID_BIGBEN_FF is not set +CONFIG_HID_CHERRY=m +CONFIG_HID_CHICONY=m +CONFIG_HID_CORSAIR=m +CONFIG_HID_COUGAR=m +CONFIG_HID_MACALLY=m +CONFIG_HID_PRODIKEYS=m +# CONFIG_HID_CMEDIA is not set +CONFIG_HID_CP2112=m +CONFIG_HID_CREATIVE_SB0540=m +CONFIG_HID_CYPRESS=m +CONFIG_HID_DRAGONRISE=m +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=m +CONFIG_HID_ELAN=m +CONFIG_HID_ELECOM=m +CONFIG_HID_ELO=m +CONFIG_HID_EZKEY=m +CONFIG_HID_GEMBIRD=m +CONFIG_HID_GFRM=m +CONFIG_HID_HOLTEK=m +CONFIG_HOLTEK_FF=y +CONFIG_HID_GOOGLE_HAMMER=m +CONFIG_HID_GT683R=m +CONFIG_HID_KEYTOUCH=m +CONFIG_HID_KYE=m +CONFIG_HID_UCLOGIC=m +CONFIG_HID_WALTOP=m +CONFIG_HID_VIEWSONIC=m +CONFIG_HID_GYRATION=m +CONFIG_HID_ICADE=m +# CONFIG_HID_ITE is not set +# CONFIG_HID_JABRA is not set +CONFIG_HID_TWINHAN=m +CONFIG_HID_KENSINGTON=m +CONFIG_HID_LCPOWER=m +CONFIG_HID_LED=m +CONFIG_HID_LENOVO=m +CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m +CONFIG_HID_LOGITECH_HIDPP=m +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_LOGIWHEELS_FF=y +CONFIG_HID_MAGICMOUSE=m +CONFIG_HID_MALTRON=m +# CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_REDRAGON is not set +CONFIG_HID_MICROSOFT=m +CONFIG_HID_MONTEREY=m +CONFIG_HID_MULTITOUCH=m +CONFIG_HID_NTI=m +CONFIG_HID_NTRIG=m +CONFIG_HID_ORTEK=m +CONFIG_HID_PANTHERLORD=m +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=m +CONFIG_HID_PETALYNX=m +CONFIG_HID_PICOLCD=m +CONFIG_HID_PICOLCD_FB=y +CONFIG_HID_PICOLCD_BACKLIGHT=y +CONFIG_HID_PICOLCD_LEDS=y +CONFIG_HID_PICOLCD_CIR=y +CONFIG_HID_PLANTRONICS=m +CONFIG_HID_PRIMAX=m +# CONFIG_HID_RETRODE is not set +CONFIG_HID_ROCCAT=m +CONFIG_HID_SAITEK=m +CONFIG_HID_SAMSUNG=m +CONFIG_HID_SONY=m +CONFIG_SONY_FF=y +CONFIG_HID_SPEEDLINK=m +# CONFIG_HID_STEAM is not set +CONFIG_HID_STEELSERIES=m +CONFIG_HID_SUNPLUS=m +CONFIG_HID_RMI=m +CONFIG_HID_GREENASIA=m +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=m +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=m +CONFIG_HID_TOPSEED=m +CONFIG_HID_THINGM=m +CONFIG_HID_THRUSTMASTER=m +CONFIG_THRUSTMASTER_FF=y +# CONFIG_HID_UDRAW_PS3 is not set +CONFIG_HID_U2FZERO=m +CONFIG_HID_WACOM=m +CONFIG_HID_WIIMOTE=m +CONFIG_HID_XINMO=m +CONFIG_HID_ZEROPLUS=m +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=m +CONFIG_HID_SENSOR_HUB=m +CONFIG_HID_SENSOR_CUSTOM_SENSOR=m +CONFIG_HID_ALPS=m +# end of Special HID drivers + +# +# USB HID support +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +CONFIG_USB_HIDDEV=y +# end of USB HID support + +# +# I2C HID support +# +CONFIG_I2C_HID=y +# end of I2C HID support +# end of HID support + +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +# CONFIG_USB_LED_TRIG is not set +# CONFIG_USB_ULPI_BUS is not set +CONFIG_USB_CONN_GPIO=m +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +# CONFIG_USB_DEFAULT_PERSIST is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +CONFIG_USB_OTG=y +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_OTG_FSM is not set +# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 +CONFIG_USB_MON=y + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_XHCI_HCD is not set +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_FSL=m +CONFIG_USB_EHCI_HCD_PLATFORM=y +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_FOTG210_HCD is not set +# CONFIG_USB_MAX3421_HCD is not set +# CONFIG_USB_OHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_WDM=m +CONFIG_USB_TMC=m + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_STORAGE_ENE_UB6250 is not set +CONFIG_USB_UAS=m + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +CONFIG_USBIP_CORE=m +CONFIG_USBIP_VHCI_HCD=m +CONFIG_USBIP_VHCI_HC_PORTS=8 +CONFIG_USBIP_VHCI_NR_HCS=1 +CONFIG_USBIP_HOST=m +CONFIG_USBIP_VUDC=m +# CONFIG_USBIP_DEBUG is not set +CONFIG_USB_CDNS3=m +# CONFIG_USB_CDNS3_GADGET is not set +# CONFIG_USB_CDNS3_HOST is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_DWC3 is not set +CONFIG_USB_DWC2=y +# CONFIG_USB_DWC2_HOST is not set + +# +# Gadget/Dual-role mode requires USB Gadget support to be enabled +# +# CONFIG_USB_DWC2_PERIPHERAL is not set +CONFIG_USB_DWC2_DUAL_ROLE=y +# CONFIG_USB_DWC2_DEBUG is not set +# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_SIMPLE=m +CONFIG_USB_SERIAL_AIRCABLE=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_CH341=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP210X=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_F81232=m +# CONFIG_USB_SERIAL_F8153X is not set +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_IUU=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_METRO=m +CONFIG_USB_SERIAL_MOS7720=m +CONFIG_USB_SERIAL_MOS7840=m +CONFIG_USB_SERIAL_MXUPORT=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_OTI6858=m +CONFIG_USB_SERIAL_QCAUX=m +CONFIG_USB_SERIAL_QUALCOMM=m +CONFIG_USB_SERIAL_SPCP8X5=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_SYMBOL=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_WWAN=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_SERIAL_OPTICON=m +CONFIG_USB_SERIAL_XSENS_MT=m +CONFIG_USB_SERIAL_WISHBONE=m +CONFIG_USB_SERIAL_SSU100=m +CONFIG_USB_SERIAL_QT2=m +CONFIG_USB_SERIAL_UPD78F0730=m +CONFIG_USB_SERIAL_DEBUG=m + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_LEGOTOWER is not set +CONFIG_USB_LCD=m +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +CONFIG_USB_EZUSB_FX2=y +CONFIG_USB_HUB_USB251XB=m +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_CHAOSKEY is not set +# CONFIG_USB_ATM is not set + +# +# USB Physical Layer drivers +# +# CONFIG_NOP_USB_XCEIV is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_ULPI is not set +# end of USB Physical Layer drivers + +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +# CONFIG_U_SERIAL_CONSOLE is not set + +# +# USB Peripheral Controller +# +# CONFIG_USB_FUSB300 is not set +# CONFIG_USB_FOTG210_UDC is not set +# CONFIG_USB_GR_UDC is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_MV_UDC is not set +# CONFIG_USB_MV_U3D is not set +# CONFIG_USB_SNP_UDC_PLAT is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_BDC_UDC is not set +# CONFIG_USB_NET2272 is not set +# CONFIG_USB_GADGET_XILINX is not set +# CONFIG_USB_DUMMY_HCD is not set +# end of USB Peripheral Controller + +CONFIG_USB_LIBCOMPOSITE=y +CONFIG_USB_F_ACM=m +CONFIG_USB_U_SERIAL=m +CONFIG_USB_F_SERIAL=m +CONFIG_USB_F_OBEX=m +CONFIG_USB_F_MASS_STORAGE=y +CONFIG_USB_F_FS=y +CONFIG_USB_F_HID=m +CONFIG_USB_CONFIGFS=y +# CONFIG_USB_CONFIGFS_SERIAL is not set +# CONFIG_USB_CONFIGFS_ACM is not set +# CONFIG_USB_CONFIGFS_OBEX is not set +# CONFIG_USB_CONFIGFS_NCM is not set +# CONFIG_USB_CONFIGFS_ECM is not set +# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set +# CONFIG_USB_CONFIGFS_RNDIS is not set +# CONFIG_USB_CONFIGFS_EEM is not set +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +# CONFIG_USB_CONFIGFS_F_LB_SS is not set +CONFIG_USB_CONFIGFS_F_FS=y +# CONFIG_USB_CONFIGFS_F_UAC1 is not set +# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set +# CONFIG_USB_CONFIGFS_F_UAC2 is not set +# CONFIG_USB_CONFIGFS_F_MIDI is not set +# CONFIG_USB_CONFIGFS_F_HID is not set +# CONFIG_USB_CONFIGFS_F_UVC is not set +# CONFIG_USB_CONFIGFS_F_PRINTER is not set +# CONFIG_USB_ZERO is not set +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_G_NCM is not set +CONFIG_USB_GADGETFS=m +# CONFIG_USB_FUNCTIONFS is not set +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_G_ACM_MS is not set +# CONFIG_USB_G_MULTI is not set +CONFIG_USB_G_HID=m +# CONFIG_USB_G_DBGP is not set +# CONFIG_USB_G_WEBCAM is not set +# CONFIG_TYPEC is not set +CONFIG_USB_ROLE_SWITCH=m +CONFIG_MMC=y +CONFIG_PWRSEQ_EMMC=y +CONFIG_PWRSEQ_SD8787=m +CONFIG_PWRSEQ_SIMPLE=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=16 +# CONFIG_SDIO_UART is not set +CONFIG_MMC_TEST=y + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_ARMMMCI is not set +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_PLTFM=y +# CONFIG_MMC_SDHCI_OF_ARASAN is not set +CONFIG_MMC_SDHCI_OF_ASPEED=m +# CONFIG_MMC_SDHCI_OF_AT91 is not set +CONFIG_MMC_SDHCI_OF_DWCMSHC=m +CONFIG_MMC_SDHCI_CADENCE=m +# CONFIG_MMC_SDHCI_F_SDH30 is not set +CONFIG_MMC_SDHCI_MILBEAUT=m +# CONFIG_MMC_SPI is not set +CONFIG_MMC_DW=y +CONFIG_MMC_DW_PLTFM=y +CONFIG_MMC_DW_BLUEFIELD=m +# CONFIG_MMC_DW_EXYNOS is not set +# CONFIG_MMC_DW_HI3798CV200 is not set +# CONFIG_MMC_DW_K3 is not set +CONFIG_MMC_DW_ROCKCHIP=y +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MMC_USDHI6ROL0 is not set +CONFIG_MMC_REALTEK_USB=m +# CONFIG_MMC_CQHCI is not set +# CONFIG_MMC_MTK is not set +# CONFIG_MMC_SDHCI_XENON is not set +# CONFIG_MMC_SDHCI_OMAP is not set +# CONFIG_MMC_SDHCI_AM654 is not set +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +# CONFIG_LEDS_CLASS_FLASH is not set +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +# CONFIG_LEDS_AN30259A is not set +# CONFIG_LEDS_BCM6328 is not set +# CONFIG_LEDS_BCM6358 is not set +# CONFIG_LEDS_CPCAP is not set +CONFIG_LEDS_CR0014114=m +CONFIG_LEDS_EL15203000=m +# CONFIG_LEDS_LM3530 is not set +CONFIG_LEDS_LM3532=m +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_LM3692X is not set +# CONFIG_LEDS_PCA9532 is not set +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP3952 is not set +# CONFIG_LEDS_LP5521 is not set +# CONFIG_LEDS_LP5523 is not set +# CONFIG_LEDS_LP5562 is not set +# CONFIG_LEDS_LP8501 is not set +# CONFIG_LEDS_LP8860 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA963X is not set +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_PWM is not set +# CONFIG_LEDS_REGULATOR is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_TLC591XX is not set +CONFIG_LEDS_MAX77650=m +# CONFIG_LEDS_LM355x is not set +# CONFIG_LEDS_IS31FL319X is not set +# CONFIG_LEDS_IS31FL32XX is not set + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +# CONFIG_LEDS_BLINKM is not set +# CONFIG_LEDS_SYSCON is not set +CONFIG_LEDS_MLXREG=m +CONFIG_LEDS_USER=m +# CONFIG_LEDS_SPI_BYTE is not set +# CONFIG_LEDS_TI_LMU_COMMON is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_ACTIVITY=y +CONFIG_LEDS_TRIGGER_GPIO=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y + +# +# iptables trigger is under Netfilter config (LED target) +# +CONFIG_LEDS_TRIGGER_TRANSIENT=y +# CONFIG_LEDS_TRIGGER_CAMERA is not set +# CONFIG_LEDS_TRIGGER_PANIC is not set +# CONFIG_LEDS_TRIGGER_NETDEV is not set +# CONFIG_LEDS_TRIGGER_PATTERN is not set +# CONFIG_LEDS_TRIGGER_AUDIO is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +CONFIG_RTC_DRV_ABEOZ9=m +CONFIG_RTC_DRV_ABX80X=m +CONFIG_RTC_DRV_DS1307=m +# CONFIG_RTC_DRV_DS1307_CENTURY is not set +CONFIG_RTC_DRV_DS1374=m +CONFIG_RTC_DRV_DS1374_WDT=y +CONFIG_RTC_DRV_DS1672=m +CONFIG_RTC_DRV_HYM8563=m +CONFIG_RTC_DRV_MAX6900=m +CONFIG_RTC_DRV_RK808=y +CONFIG_RTC_DRV_RS5C372=m +CONFIG_RTC_DRV_ISL1208=m +CONFIG_RTC_DRV_ISL12022=m +CONFIG_RTC_DRV_ISL12026=m +CONFIG_RTC_DRV_X1205=m +CONFIG_RTC_DRV_PCF8523=m +CONFIG_RTC_DRV_PCF85063=m +CONFIG_RTC_DRV_PCF85363=m +CONFIG_RTC_DRV_PCF8563=m +CONFIG_RTC_DRV_PCF8583=m +CONFIG_RTC_DRV_M41T80=m +CONFIG_RTC_DRV_M41T80_WDT=y +CONFIG_RTC_DRV_BQ32K=m +CONFIG_RTC_DRV_TPS6586X=m +CONFIG_RTC_DRV_S35390A=m +CONFIG_RTC_DRV_FM3130=m +CONFIG_RTC_DRV_RX8010=m +CONFIG_RTC_DRV_RX8581=m +CONFIG_RTC_DRV_RX8025=m +CONFIG_RTC_DRV_EM3027=m +CONFIG_RTC_DRV_RV3028=m +CONFIG_RTC_DRV_RV8803=m +CONFIG_RTC_DRV_SD3078=m + +# +# SPI RTC drivers +# +CONFIG_RTC_DRV_M41T93=m +CONFIG_RTC_DRV_M41T94=m +CONFIG_RTC_DRV_DS1302=m +CONFIG_RTC_DRV_DS1305=m +CONFIG_RTC_DRV_DS1343=m +CONFIG_RTC_DRV_DS1347=m +CONFIG_RTC_DRV_DS1390=m +CONFIG_RTC_DRV_MAX6916=m +CONFIG_RTC_DRV_R9701=m +CONFIG_RTC_DRV_RX4581=m +CONFIG_RTC_DRV_RX6110=m +CONFIG_RTC_DRV_RS5C348=m +CONFIG_RTC_DRV_MAX6902=m +CONFIG_RTC_DRV_PCF2123=m +CONFIG_RTC_DRV_MCP795=m +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +CONFIG_RTC_DRV_DS3232=m +CONFIG_RTC_DRV_DS3232_HWMON=y +CONFIG_RTC_DRV_PCF2127=m +CONFIG_RTC_DRV_RV3029C2=m +CONFIG_RTC_DRV_RV3029_HWMON=y + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_V3020 is not set +# CONFIG_RTC_DRV_ZYNQMP is not set +# CONFIG_RTC_DRV_CROS_EC is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set +CONFIG_RTC_DRV_CADENCE=m +# CONFIG_RTC_DRV_FTRTC010 is not set +# CONFIG_RTC_DRV_SNVS is not set +# CONFIG_RTC_DRV_R7301 is not set +# CONFIG_RTC_DRV_CPCAP is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_VIRTUAL_CHANNELS=m +CONFIG_DMA_OF=y +# CONFIG_ALTERA_MSGDMA is not set +# CONFIG_AMBA_PL08X is not set +CONFIG_DW_AXI_DMAC=m +# CONFIG_FSL_EDMA is not set +CONFIG_FSL_QDMA=m +# CONFIG_INTEL_IDMA64 is not set +# CONFIG_NBPFAXI_DMA is not set +CONFIG_PL330_DMA=y +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_HIDMA is not set +# CONFIG_DW_DMAC is not set +CONFIG_SF_PDMA=m + +# +# DMA Clients +# +# CONFIG_ASYNC_TX_DMA is not set +# CONFIG_DMATEST is not set +CONFIG_DMA_ENGINE_RAID=y + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +# CONFIG_UDMABUF is not set +CONFIG_DMABUF_SELFTESTS=m +# end of DMABUF options + +# CONFIG_AUXDISPLAY is not set +# CONFIG_UIO is not set +# CONFIG_VFIO is not set +# CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO=m +# CONFIG_VIRTIO_MENU is not set + +# +# Microsoft Hyper-V guest support +# +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +CONFIG_STAGING=y +# CONFIG_PRISM2_USB is not set +# CONFIG_COMEDI is not set +# CONFIG_RTLLIB is not set +CONFIG_RTL8723BS=m +CONFIG_R8712U=m +CONFIG_R8188EU=m +CONFIG_88EU_AP_MODE=y +# CONFIG_VT6656 is not set + +# +# IIO staging drivers +# + +# +# Accelerometers +# +# CONFIG_ADIS16203 is not set +# CONFIG_ADIS16240 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD7816 is not set +# CONFIG_AD7192 is not set +# CONFIG_AD7280 is not set +# end of Analog to digital converters + +# +# Analog digital bi-direction converters +# +# CONFIG_ADT7316 is not set +# end of Analog digital bi-direction converters + +# +# Capacitance to digital converters +# +# CONFIG_AD7150 is not set +# CONFIG_AD7746 is not set +# end of Capacitance to digital converters + +# +# Direct Digital Synthesis +# +# CONFIG_AD9832 is not set +# CONFIG_AD9834 is not set +# end of Direct Digital Synthesis + +# +# Network Analyzer, Impedance Converters +# +# CONFIG_AD5933 is not set +# end of Network Analyzer, Impedance Converters + +# +# Active energy metering IC +# +# CONFIG_ADE7854 is not set +# end of Active energy metering IC + +# +# Resolver to digital converters +# +# CONFIG_AD2S1210 is not set +# end of Resolver to digital converters +# end of IIO staging drivers + +# +# Speakup console speech +# +# CONFIG_SPEAKUP is not set +# end of Speakup console speech + +CONFIG_STAGING_MEDIA=y + +# +# soc_camera sensor drivers +# + +# +# Android +# +CONFIG_ASHMEM=y +# CONFIG_ION is not set +# end of Android + +# CONFIG_STAGING_BOARD is not set +# CONFIG_LTE_GDM724X is not set +# CONFIG_GS_FPGABOOT is not set +# CONFIG_UNISYSSPAR is not set +# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set +CONFIG_FB_TFT=m +CONFIG_FB_TFT_AGM1264K_FL=m +CONFIG_FB_TFT_BD663474=m +CONFIG_FB_TFT_HX8340BN=m +CONFIG_FB_TFT_HX8347D=m +CONFIG_FB_TFT_HX8353D=m +CONFIG_FB_TFT_HX8357D=m +CONFIG_FB_TFT_ILI9163=m +CONFIG_FB_TFT_ILI9320=m +CONFIG_FB_TFT_ILI9325=m +CONFIG_FB_TFT_ILI9340=m +CONFIG_FB_TFT_ILI9341=m +CONFIG_FB_TFT_ILI9481=m +CONFIG_FB_TFT_ILI9486=m +CONFIG_FB_TFT_PCD8544=m +CONFIG_FB_TFT_RA8875=m +CONFIG_FB_TFT_S6D02A1=m +CONFIG_FB_TFT_S6D1121=m +CONFIG_FB_TFT_SEPS525=m +CONFIG_FB_TFT_SH1106=m +CONFIG_FB_TFT_SSD1289=m +CONFIG_FB_TFT_SSD1305=m +CONFIG_FB_TFT_SSD1306=m +CONFIG_FB_TFT_SSD1331=m +CONFIG_FB_TFT_SSD1351=m +CONFIG_FB_TFT_ST7735R=m +CONFIG_FB_TFT_ST7789V=m +CONFIG_FB_TFT_TINYLCD=m +CONFIG_FB_TFT_TLS8204=m +CONFIG_FB_TFT_UC1611=m +CONFIG_FB_TFT_UC1701=m +CONFIG_FB_TFT_UPD161704=m +CONFIG_FB_TFT_WATTEROTT=m +# CONFIG_WILC1000_SDIO is not set +# CONFIG_WILC1000_SPI is not set +CONFIG_MOST=m +# CONFIG_MOST_CDEV is not set +# CONFIG_MOST_NET is not set +# CONFIG_MOST_SOUND is not set +# CONFIG_MOST_VIDEO is not set +# CONFIG_MOST_DIM2 is not set +# CONFIG_MOST_I2C is not set +# CONFIG_MOST_USB is not set +# CONFIG_KS7010 is not set +# CONFIG_PI433 is not set + +# +# Gasket devices +# +# end of Gasket devices + +# CONFIG_XIL_AXIS_FIFO is not set +CONFIG_FIELDBUS_DEV=m +CONFIG_HMS_ANYBUSS_BUS=m +CONFIG_ARCX_ANYBUS_CONTROLLER=m +CONFIG_HMS_PROFINET=m +# CONFIG_USB_WUSB_CBAF is not set +# CONFIG_UWB is not set +CONFIG_EXFAT_FS=m +CONFIG_EXFAT_DISCARD=y +# CONFIG_EXFAT_DELAYED_SYNC is not set +# CONFIG_EXFAT_KERNEL_DEBUG is not set +# CONFIG_EXFAT_DEBUG_MSG is not set +CONFIG_EXFAT_DEFAULT_CODEPAGE=437 +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +CONFIG_WFX=m +# CONFIG_GOLDFISH is not set +CONFIG_MFD_CROS_EC=y +CONFIG_CHROME_PLATFORMS=y +CONFIG_CROS_EC=y +# CONFIG_CROS_EC_I2C is not set +# CONFIG_CROS_EC_SPI is not set +CONFIG_CROS_EC_PROTO=y +CONFIG_CROS_EC_CHARDEV=m +CONFIG_CROS_EC_LIGHTBAR=m +CONFIG_CROS_EC_VBC=m +CONFIG_CROS_EC_DEBUGFS=m +CONFIG_CROS_EC_SENSORHUB=m +CONFIG_CROS_EC_SYSFS=m +CONFIG_CROS_USBPD_LOGGER=m +# CONFIG_MELLANOX_PLATFORM is not set +CONFIG_CLKDEV_LOOKUP=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y + +# +# Common Clock Framework +# +# CONFIG_CLK_HSDK is not set +CONFIG_COMMON_CLK_MAX9485=m +CONFIG_COMMON_CLK_RK808=y +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI514 is not set +CONFIG_COMMON_CLK_SI544=m +# CONFIG_COMMON_CLK_SI570 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CDCE925 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_CLK_QORIQ is not set +# CONFIG_COMMON_CLK_PWM is not set +CONFIG_COMMON_CLK_VC5=m +# CONFIG_COMMON_CLK_BD718XX is not set +# CONFIG_COMMON_CLK_FIXED_MMIO is not set +# end of Common Clock Framework + +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_CLKSRC_MMIO=y +CONFIG_DW_APB_TIMER=y +CONFIG_DW_APB_TIMER_OF=y +CONFIG_ROCKCHIP_TIMER=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_ARM_GLOBAL_TIMER=y +CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y +# end of Clock Source drivers + +# CONFIG_MAILBOX is not set +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +CONFIG_IOMMU_IO_PGTABLE=y +CONFIG_IOMMU_IO_PGTABLE_LPAE=y +# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set +# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_OF_IOMMU=y +CONFIG_ROCKCHIP_IOMMU=y +# CONFIG_ARM_SMMU is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Aspeed SoC drivers +# +# end of Aspeed SoC drivers + +# +# Broadcom SoC drivers +# +# CONFIG_SOC_BRCMSTB is not set +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# CONFIG_FSL_RCPM is not set +# end of NXP/Freescale QorIQ SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Qualcomm SoC drivers +# +# end of Qualcomm SoC drivers + +CONFIG_ROCKCHIP_GRF=y +CONFIG_ROCKCHIP_PM_DOMAINS=y +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# CONFIG_XILINX_VCU is not set +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +CONFIG_PM_DEVFREQ=y + +# +# DEVFREQ Governors +# +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set +# CONFIG_DEVFREQ_GOV_POWERSAVE is not set +CONFIG_DEVFREQ_GOV_USERSPACE=y +# CONFIG_DEVFREQ_GOV_PASSIVE is not set + +# +# DEVFREQ Drivers +# +# CONFIG_ARM_RK3399_DMC_DEVFREQ is not set +# CONFIG_PM_DEVFREQ_EVENT is not set +# CONFIG_EXTCON is not set +CONFIG_MEMORY=y +# CONFIG_ARM_PL172_MPMC is not set +CONFIG_PL353_SMC=y +CONFIG_IIO=y +CONFIG_IIO_BUFFER=y +CONFIG_IIO_BUFFER_CB=m +# CONFIG_IIO_BUFFER_HW_CONSUMER is not set +CONFIG_IIO_KFIFO_BUF=y +CONFIG_IIO_TRIGGERED_BUFFER=y +# CONFIG_IIO_CONFIGFS is not set +CONFIG_IIO_TRIGGER=y +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +# CONFIG_IIO_SW_DEVICE is not set +# CONFIG_IIO_SW_TRIGGER is not set + +# +# Accelerometers +# +# CONFIG_ADIS16201 is not set +# CONFIG_ADIS16209 is not set +CONFIG_ADXL345=m +CONFIG_ADXL345_I2C=m +CONFIG_ADXL345_SPI=m +# CONFIG_ADXL372_SPI is not set +# CONFIG_ADXL372_I2C is not set +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMC150_ACCEL is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DMARD06 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +CONFIG_HID_SENSOR_ACCEL_3D=m +# CONFIG_IIO_ST_ACCEL_3AXIS is not set +# CONFIG_KXSD9 is not set +# CONFIG_KXCJK1013 is not set +# CONFIG_MC3230 is not set +# CONFIG_MMA7455_I2C is not set +# CONFIG_MMA7455_SPI is not set +# CONFIG_MMA7660 is not set +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +# CONFIG_MXC4005 is not set +# CONFIG_MXC6255 is not set +# CONFIG_SCA3000 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD7124 is not set +# CONFIG_AD7266 is not set +# CONFIG_AD7291 is not set +CONFIG_AD7292=m +# CONFIG_AD7298 is not set +# CONFIG_AD7476 is not set +CONFIG_AD7606=m +# CONFIG_AD7606_IFACE_PARALLEL is not set +CONFIG_AD7606_IFACE_SPI=m +# CONFIG_AD7766 is not set +CONFIG_AD7768_1=m +# CONFIG_AD7780 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD7949 is not set +# CONFIG_AD799X is not set +# CONFIG_CC10001_ADC is not set +# CONFIG_CPCAP_ADC is not set +# CONFIG_ENVELOPE_DETECTOR is not set +# CONFIG_HI8435 is not set +# CONFIG_HX711 is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX9611 is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_MCP3911 is not set +# CONFIG_NAU7802 is not set +CONFIG_ROCKCHIP_SARADC=y +# CONFIG_SD_ADC_MODULATOR is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS7950 is not set +CONFIG_TI_ADS8344=m +# CONFIG_TI_ADS8688 is not set +CONFIG_TI_ADS124S08=m +# CONFIG_TI_TLC4541 is not set +# CONFIG_VF610_ADC is not set +# CONFIG_XILINX_XADC is not set +# end of Analog to digital converters + +# +# Analog Front Ends +# +CONFIG_IIO_RESCALE=m +# end of Analog Front Ends + +# +# Amplifiers +# +# CONFIG_AD8366 is not set +# end of Amplifiers + +# +# Chemical Sensors +# +# CONFIG_ATLAS_PH_SENSOR is not set +CONFIG_BME680=m +CONFIG_BME680_I2C=m +CONFIG_BME680_SPI=m +# CONFIG_CCS811 is not set +# CONFIG_IAQCORE is not set +CONFIG_PMS7003=m +CONFIG_SENSIRION_SGP30=m +CONFIG_SPS30=m +# CONFIG_VZ89X is not set +# end of Chemical Sensors + +# CONFIG_IIO_CROS_EC_SENSORS_CORE is not set + +# +# Hid Sensor IIO Common +# +CONFIG_HID_SENSOR_IIO_COMMON=m +CONFIG_HID_SENSOR_IIO_TRIGGER=m +# end of Hid Sensor IIO Common + +# +# SSP Sensor Common +# +# CONFIG_IIO_SSP_SENSORHUB is not set +# end of SSP Sensor Common + +# +# Digital to analog converters +# +# CONFIG_AD5064 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446 is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_LTC1660 is not set +# CONFIG_LTC2632 is not set +CONFIG_AD5686=m +CONFIG_AD5686_SPI=m +CONFIG_AD5696_I2C=m +# CONFIG_AD5755 is not set +CONFIG_AD5758=m +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5791 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD8801 is not set +# CONFIG_DPOT_DAC is not set +# CONFIG_DS4424 is not set +# CONFIG_M62332 is not set +# CONFIG_MAX517 is not set +# CONFIG_MAX5821 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4922 is not set +# CONFIG_TI_DAC082S085 is not set +CONFIG_TI_DAC5571=m +# CONFIG_TI_DAC7311 is not set +CONFIG_TI_DAC7612=m +# CONFIG_VF610_DAC is not set +# end of Digital to analog converters + +# +# IIO dummy driver +# +# end of IIO dummy driver + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +# CONFIG_AD9523 is not set +# end of Clock Generator/Distribution + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +# CONFIG_ADF4350 is not set +# CONFIG_ADF4371 is not set +# end of Phase-Locked Loop (PLL) frequency synthesizers +# end of Frequency Synthesizers DDS/PLL + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADXRS450 is not set +# CONFIG_BMG160 is not set +CONFIG_FXAS21002C=m +CONFIG_FXAS21002C_I2C=m +CONFIG_FXAS21002C_SPI=m +CONFIG_HID_SENSOR_GYRO_3D=m +# CONFIG_MPU3050_I2C is not set +# CONFIG_IIO_ST_GYRO_3AXIS is not set +# CONFIG_ITG3200 is not set +# end of Digital gyroscope sensors + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_MAX30100 is not set +CONFIG_MAX30102=m +# end of Heart Rate Monitors +# end of Health Sensors + +# +# Humidity sensors +# +# CONFIG_AM2315 is not set +# CONFIG_DHT11 is not set +# CONFIG_HDC100X is not set +CONFIG_HID_SENSOR_HUMIDITY=m +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_SI7005 is not set +CONFIG_SI7020=m +# end of Humidity sensors + +# +# Inertial measurement units +# +# CONFIG_ADIS16400 is not set +CONFIG_ADIS16460=m +# CONFIG_ADIS16480 is not set +# CONFIG_BMI160_I2C is not set +# CONFIG_BMI160_SPI is not set +CONFIG_FXOS8700=m +CONFIG_FXOS8700_I2C=m +CONFIG_FXOS8700_SPI=m +# CONFIG_KMX61 is not set +# CONFIG_INV_MPU6050_I2C is not set +# CONFIG_INV_MPU6050_SPI is not set +# CONFIG_IIO_ST_LSM6DSX is not set +# end of Inertial measurement units + +CONFIG_IIO_ADIS_LIB=m +CONFIG_IIO_ADIS_LIB_BUFFER=y + +# +# Light sensors +# +# CONFIG_ADJD_S311 is not set +CONFIG_ADUX1020=m +# CONFIG_AL3320A is not set +# CONFIG_APDS9300 is not set +# CONFIG_APDS9960 is not set +# CONFIG_BH1750 is not set +# CONFIG_BH1780 is not set +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +# CONFIG_CM3323 is not set +CONFIG_CM3605=m +# CONFIG_CM36651 is not set +# CONFIG_GP2AP020A00F is not set +CONFIG_SENSORS_ISL29018=y +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_ISL29125 is not set +CONFIG_HID_SENSOR_ALS=m +CONFIG_HID_SENSOR_PROX=m +# CONFIG_JSA1212 is not set +# CONFIG_RPR0521 is not set +# CONFIG_LTR501 is not set +CONFIG_LV0104CS=m +# CONFIG_MAX44000 is not set +CONFIG_MAX44009=m +CONFIG_NOA1305=m +# CONFIG_OPT3001 is not set +# CONFIG_PA12203001 is not set +CONFIG_SI1133=m +# CONFIG_SI1145 is not set +# CONFIG_STK3310 is not set +# CONFIG_ST_UVIS25 is not set +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +CONFIG_SENSORS_TSL2563=y +CONFIG_TSL2583=y +CONFIG_TSL2772=m +# CONFIG_TSL4531 is not set +# CONFIG_US5182D is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VCNL4035 is not set +CONFIG_VEML6030=m +# CONFIG_VEML6070 is not set +# CONFIG_VL6180 is not set +# CONFIG_ZOPT2201 is not set +# end of Light sensors + +# +# Magnetometer sensors +# +# CONFIG_AK8974 is not set +# CONFIG_AK8975 is not set +# CONFIG_AK09911 is not set +# CONFIG_BMC150_MAGN_I2C is not set +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_MAG3110 is not set +CONFIG_HID_SENSOR_MAGNETOMETER_3D=m +# CONFIG_MMC35240 is not set +# CONFIG_IIO_ST_MAGN_3AXIS is not set +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set +# CONFIG_SENSORS_RM3100_I2C is not set +# CONFIG_SENSORS_RM3100_SPI is not set +# end of Magnetometer sensors + +# +# Multiplexers +# +# CONFIG_IIO_MUX is not set +# end of Multiplexers + +# +# Inclinometer sensors +# +CONFIG_HID_SENSOR_INCLINOMETER_3D=m +CONFIG_HID_SENSOR_DEVICE_ROTATION=m +# end of Inclinometer sensors + +# +# Triggers - standalone +# +# CONFIG_IIO_INTERRUPT_TRIGGER is not set +CONFIG_IIO_SYSFS_TRIGGER=y +# end of Triggers - standalone + +# +# Digital potentiometers +# +CONFIG_AD5272=m +# CONFIG_DS1803 is not set +CONFIG_MAX5432=m +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +CONFIG_MCP4018=m +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_MCP41010 is not set +# CONFIG_TPL0102 is not set +# end of Digital potentiometers + +# +# Digital potentiostats +# +# CONFIG_LMP91000 is not set +# end of Digital potentiostats + +# +# Pressure sensors +# +# CONFIG_ABP060MG is not set +# CONFIG_BMP280 is not set +# CONFIG_DPS310 is not set +CONFIG_HID_SENSOR_PRESS=m +# CONFIG_HP03 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +# CONFIG_MS5611 is not set +# CONFIG_MS5637 is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_T5403 is not set +# CONFIG_HP206C is not set +# CONFIG_ZPA2326 is not set +# end of Pressure sensors + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set +# end of Lightning sensors + +# +# Proximity and distance sensors +# +CONFIG_ISL29501=m +# CONFIG_LIDAR_LITE_V2 is not set +CONFIG_MB1232=m +# CONFIG_RFD77402 is not set +# CONFIG_SRF04 is not set +# CONFIG_SX9500 is not set +# CONFIG_SRF08 is not set +# CONFIG_VL53L0X_I2C is not set +# end of Proximity and distance sensors + +# +# Resolver to digital converters +# +# CONFIG_AD2S90 is not set +# CONFIG_AD2S1200 is not set +# end of Resolver to digital converters + +# +# Temperature sensors +# +CONFIG_LTC2983=m +# CONFIG_MAXIM_THERMOCOUPLE is not set +CONFIG_HID_SENSOR_TEMP=m +# CONFIG_MLX90614 is not set +CONFIG_MLX90632=m +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +CONFIG_MAX31856=m +# end of Temperature sensors + +CONFIG_PWM=y +CONFIG_PWM_SYSFS=y +# CONFIG_PWM_CROS_EC is not set +# CONFIG_PWM_FSL_FTM is not set +# CONFIG_PWM_PCA9685 is not set +CONFIG_PWM_ROCKCHIP=y + +# +# IRQ chip support +# +CONFIG_IRQCHIP=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_MAX_NR=1 +# CONFIG_AL_FIC is not set +CONFIG_MADERA_IRQ=m +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +CONFIG_ARCH_HAS_RESET_CONTROLLER=y +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_TI_SYSCON is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PHY_MIPI_DPHY=y +# CONFIG_BCM_KONA_USB2_PHY is not set +# CONFIG_PHY_CADENCE_DP is not set +CONFIG_PHY_CADENCE_DPHY=m +# CONFIG_PHY_CADENCE_SIERRA is not set +# CONFIG_PHY_FSL_IMX8MQ_USB is not set +# CONFIG_PHY_MIXEL_MIPI_DPHY is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_CPCAP_USB is not set +CONFIG_PHY_MAPPHONE_MDM6600=m +# CONFIG_PHY_OCELOT_SERDES is not set +CONFIG_PHY_ROCKCHIP_DP=y +CONFIG_PHY_ROCKCHIP_EMMC=y +# CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set +CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=m +# CONFIG_PHY_ROCKCHIP_PCIE is not set +# CONFIG_PHY_ROCKCHIP_TYPEC is not set +CONFIG_PHY_ROCKCHIP_USB=y +# CONFIG_PHY_SAMSUNG_USB2 is not set +# end of PHY Subsystem + +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +CONFIG_ARM_CCI_PMU=m +# CONFIG_ARM_CCI400_PMU is not set +# CONFIG_ARM_CCI5xx_PMU is not set +# CONFIG_ARM_CCN is not set +CONFIG_ARM_PMU=y +# end of Performance monitor support + +# CONFIG_RAS is not set + +# +# Android +# +CONFIG_ANDROID=y +# CONFIG_ANDROID_BINDER_IPC is not set +# end of Android + +CONFIG_DAX=y +CONFIG_NVMEM=y +CONFIG_NVMEM_SYSFS=y +CONFIG_ROCKCHIP_EFUSE=y +CONFIG_ROCKCHIP_OTP=m + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_FSI is not set +# CONFIG_TEE is not set +CONFIG_MULTIPLEXER=m + +# +# Multiplexer drivers +# +CONFIG_MUX_ADG792A=m +CONFIG_MUX_ADGS1408=m +CONFIG_MUX_GPIO=m +CONFIG_MUX_MMIO=m +# end of Multiplexer drivers + +CONFIG_PM_OPP=y +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +CONFIG_INTERCONNECT=m +# CONFIG_COUNTER is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_VALIDATE_FS_PARSER=y +CONFIG_FS_IOMAP=y +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_SECURITY is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +CONFIG_XFS_FS=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_XFS_RT=y +CONFIG_XFS_ONLINE_SCRUB=y +# CONFIG_XFS_ONLINE_REPAIR is not set +# CONFIG_XFS_WARN is not set +# CONFIG_XFS_DEBUG is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_BTRFS_FS=y +CONFIG_BTRFS_FS_POSIX_ACL=y +# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set +# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set +# CONFIG_BTRFS_DEBUG is not set +# CONFIG_BTRFS_ASSERT is not set +# CONFIG_BTRFS_FS_REF_VERIFY is not set +# CONFIG_NILFS2_FS is not set +CONFIG_F2FS_FS=y +CONFIG_F2FS_STAT_FS=y +CONFIG_F2FS_FS_XATTR=y +CONFIG_F2FS_FS_POSIX_ACL=y +# CONFIG_F2FS_FS_SECURITY is not set +# CONFIG_F2FS_CHECK_FS is not set +# CONFIG_F2FS_IO_TRACE is not set +# CONFIG_F2FS_FAULT_INJECTION is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +CONFIG_MANDATORY_FILE_LOCKING=y +CONFIG_FS_ENCRYPTION=y +# CONFIG_FS_VERITY is not set +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_FANOTIFY is not set +CONFIG_QUOTA=y +CONFIG_QUOTA_NETLINK_INTERFACE=y +CONFIG_PRINT_QUOTA_WARNING=y +# CONFIG_QUOTA_DEBUG is not set +CONFIG_QUOTA_TREE=m +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS4_FS=y +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=m +CONFIG_CUSE=m +CONFIG_VIRTIO_FS=m +CONFIG_OVERLAY_FS=m +# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +# CONFIG_OVERLAY_FS_INDEX is not set +# CONFIG_OVERLAY_FS_XINO_AUTO is not set +# CONFIG_OVERLAY_FS_METACOPY is not set + +# +# Caches +# +CONFIG_FSCACHE=y +CONFIG_FSCACHE_STATS=y +CONFIG_FSCACHE_HISTOGRAM=y +# CONFIG_FSCACHE_DEBUG is not set +# CONFIG_FSCACHE_OBJECT_LIST is not set +CONFIG_CACHEFILES=y +# CONFIG_CACHEFILES_DEBUG is not set +# CONFIG_CACHEFILES_HISTOGRAM is not set +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_UDF_FS=m +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +CONFIG_NTFS_RW=y +# end of DOS/FAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +# CONFIG_PROC_CHILDREN is not set +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +CONFIG_MEMFD_CREATE=y +CONFIG_CONFIGFS_FS=y +# end of Pseudo filesystems + +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +CONFIG_ECRYPT_FS=m +# CONFIG_ECRYPT_FS_MESSAGING is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=m +CONFIG_SQUASHFS_FILE_CACHE=y +# CONFIG_SQUASHFS_FILE_DIRECT is not set +# CONFIG_SQUASHFS_DECOMP_SINGLE is not set +CONFIG_SQUASHFS_DECOMP_MULTI=y +# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_ZLIB=y +# CONFIG_SQUASHFS_LZ4 is not set +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y +# CONFIG_SQUASHFS_ZSTD is not set +CONFIG_SQUASHFS_4K_DEVBLK_SIZE=y +CONFIG_SQUASHFS_EMBEDDED=y +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_PSTORE=y +CONFIG_PSTORE_DEFLATE_COMPRESS=m +# CONFIG_PSTORE_LZO_COMPRESS is not set +# CONFIG_PSTORE_LZ4_COMPRESS is not set +CONFIG_PSTORE_LZ4HC_COMPRESS=m +# CONFIG_PSTORE_842_COMPRESS is not set +# CONFIG_PSTORE_ZSTD_COMPRESS is not set +CONFIG_PSTORE_COMPRESS=y +CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y +# CONFIG_PSTORE_LZ4HC_COMPRESS_DEFAULT is not set +CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" +CONFIG_PSTORE_CONSOLE=y +# CONFIG_PSTORE_PMSG is not set +# CONFIG_PSTORE_FTRACE is not set +CONFIG_PSTORE_RAM=y +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +# CONFIG_EROFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V2=y +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_PNFS_FILE_LAYOUT=y +CONFIG_PNFS_BLOCK=y +CONFIG_PNFS_FLEXFILE_LAYOUT=m +CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" +# CONFIG_NFS_V4_1_MIGRATION is not set +CONFIG_NFS_V4_SECURITY_LABEL=y +CONFIG_ROOT_NFS=y +CONFIG_NFS_FSCACHE=y +# CONFIG_NFS_USE_LEGACY_DNS is not set +CONFIG_NFS_USE_KERNEL_DNS=y +CONFIG_NFSD=m +CONFIG_NFSD_V2_ACL=y +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +# CONFIG_NFSD_BLOCKLAYOUT is not set +# CONFIG_NFSD_SCSILAYOUT is not set +# CONFIG_NFSD_FLEXFILELAYOUT is not set +CONFIG_NFSD_V4_SECURITY_LABEL=y +CONFIG_GRACE_PERIOD=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_ACL_SUPPORT=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_GSS=y +CONFIG_SUNRPC_BACKCHANNEL=y +CONFIG_SUNRPC_SWAP=y +CONFIG_RPCSEC_GSS_KRB5=m +# CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set +# CONFIG_SUNRPC_DEBUG is not set +CONFIG_CEPH_FS=m +CONFIG_CEPH_FSCACHE=y +CONFIG_CEPH_FS_POSIX_ACL=y +# CONFIG_CEPH_FS_SECURITY_LABEL is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS2 is not set +CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y +# CONFIG_CIFS_WEAK_PW_HASH is not set +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG is not set +# CONFIG_CIFS_DFS_UPCALL is not set +CONFIG_CIFS_FSCACHE=y +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +CONFIG_NLS_CODEPAGE_850=y +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=y +# CONFIG_DLM is not set +# CONFIG_UNICODE is not set +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +CONFIG_KEYS=y +# CONFIG_KEYS_REQUEST_CACHE is not set +# CONFIG_PERSISTENT_KEYRINGS is not set +# CONFIG_BIG_KEYS is not set +# CONFIG_TRUSTED_KEYS is not set +# CONFIG_ENCRYPTED_KEYS is not set +# CONFIG_KEY_DH_OPERATIONS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y +CONFIG_SECURITY_NETWORK=y +# CONFIG_SECURITY_NETWORK_XFRM is not set +CONFIG_SECURITY_PATH=y +CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y +# CONFIG_HARDENED_USERCOPY is not set +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_SECURITY_SELINUX is not set +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +# CONFIG_SECURITY_APPARMOR is not set +# CONFIG_SECURITY_LOADPIN is not set +CONFIG_SECURITY_YAMA=y +# CONFIG_SECURITY_SAFESETID is not set +# CONFIG_SECURITY_LOCKDOWN_LSM is not set +CONFIG_INTEGRITY=y +# CONFIG_INTEGRITY_SIGNATURE is not set +CONFIG_INTEGRITY_AUDIT=y +# CONFIG_IMA is not set +# CONFIG_EVM is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="yama,loadpin,safesetid,integrity" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_INIT_STACK_NONE=y +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +# end of Memory initialization +# end of Kernel hardening options +# end of Security options + +CONFIG_XOR_BLOCKS=y +CONFIG_ASYNC_CORE=y +CONFIG_ASYNC_MEMCPY=y +CONFIG_ASYNC_XOR=y +CONFIG_ASYNC_PQ=y +CONFIG_ASYNC_RAID6_RECOV=y +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_USER=m +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +CONFIG_CRYPTO_PCRYPT=m +CONFIG_CRYPTO_CRYPTD=m +CONFIG_CRYPTO_AUTHENC=y +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_SIMD=m +CONFIG_CRYPTO_ENGINE=m + +# +# Public-key cryptography +# +CONFIG_CRYPTO_RSA=y +CONFIG_CRYPTO_DH=m +CONFIG_CRYPTO_ECC=y +CONFIG_CRYPTO_ECDH=y +CONFIG_CRYPTO_ECRDSA=m +CONFIG_CRYPTO_CURVE25519=m + +# +# Authenticated Encryption with Associated Data +# +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_CHACHA20POLY1305=m +CONFIG_CRYPTO_AEGIS128=m +CONFIG_CRYPTO_AEGIS128_SIMD=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_ECHAINIV=y + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CFB=m +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_LRW=m +# CONFIG_CRYPTO_OFB is not set +CONFIG_CRYPTO_PCBC=m +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_KEYWRAP=m +CONFIG_CRYPTO_NHPOLY1305=m +# CONFIG_CRYPTO_ADIANTUM is not set +CONFIG_CRYPTO_ESSIV=y + +# +# Hash modes +# +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_VMAC=m + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_XXHASH=y +CONFIG_CRYPTO_BLAKE2B=y +CONFIG_CRYPTO_BLAKE2S=m +CONFIG_CRYPTO_CRCT10DIF=y +CONFIG_CRYPTO_GHASH=y +CONFIG_CRYPTO_POLY1305=m +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_MICHAEL_MIC=y +CONFIG_CRYPTO_RMD128=m +CONFIG_CRYPTO_RMD160=m +CONFIG_CRYPTO_RMD256=m +CONFIG_CRYPTO_RMD320=m +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA3=m +CONFIG_CRYPTO_SM3=m +CONFIG_CRYPTO_STREEBOG=m +CONFIG_CRYPTO_TGR192=m +CONFIG_CRYPTO_WP512=m + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_AES_TI=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_BLOWFISH_COMMON=m +CONFIG_CRYPTO_CAMELLIA=m +CONFIG_CRYPTO_CAST_COMMON=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_FCRYPT=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_SALSA20=m +CONFIG_CRYPTO_CHACHA20=m +CONFIG_CRYPTO_SEED=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_SM4=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_842=m +CONFIG_CRYPTO_LZ4=m +CONFIG_CRYPTO_LZ4HC=m +CONFIG_CRYPTO_ZSTD=m + +# +# Random Number Generation +# +CONFIG_CRYPTO_ANSI_CPRNG=y +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_HASH=y +CONFIG_CRYPTO_DRBG_CTR=y +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_USER_API=m +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m +CONFIG_CRYPTO_USER_API_RNG=m +CONFIG_CRYPTO_USER_API_AEAD=m +# CONFIG_CRYPTO_STATS is not set +CONFIG_CRYPTO_HASH_INFO=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m +CONFIG_CRYPTO_LIB_BLAKE2S=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_DES=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_HW=y +# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set +# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +CONFIG_CRYPTO_DEV_ROCKCHIP=m +CONFIG_CRYPTO_DEV_VIRTIO=m +CONFIG_CRYPTO_DEV_SAFEXCEL=m +CONFIG_CRYPTO_DEV_CCREE=m +CONFIG_CRYPTO_DEV_AMLOGIC_GXL=m +# CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG is not set +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_X509_CERTIFICATE_PARSER=y +# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set + +# +# Certificates for signature checking +# +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# end of Certificates for signature checking + +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_RAID6_PQ=y +CONFIG_RAID6_PQ_BENCHMARK=y +CONFIG_PACKING=y +CONFIG_BITREVERSE=y +CONFIG_HAVE_ARCH_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +# CONFIG_CORDIC is not set +CONFIG_RATIONAL=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=y +CONFIG_CRC_T10DIF=y +CONFIG_CRC_ITU_T=y +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +CONFIG_CRC64=m +CONFIG_CRC4=m +CONFIG_CRC7=m +CONFIG_LIBCRC32C=y +CONFIG_CRC8=m +CONFIG_XXHASH=y +CONFIG_AUDIT_GENERIC=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_842_COMPRESS=m +CONFIG_842_DECOMPRESS=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=m +CONFIG_LZ4HC_COMPRESS=m +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMPRESS=y +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DECOMPRESS_XZ=y +CONFIG_DECOMPRESS_LZO=y +CONFIG_DECOMPRESS_LZ4=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_REED_SOLOMON=y +CONFIG_REED_SOLOMON_ENC8=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_HAS_SETUP_DMA_OPS=y +CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y +CONFIG_DMA_NONCOHERENT_MMAP=y +CONFIG_DMA_REMAP=y +CONFIG_DMA_CMA=y + +# +# Default contiguous memory area size: +# +CONFIG_CMA_SIZE_MBYTES=16 +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_ALIGNMENT=8 +# CONFIG_DMA_API_DEBUG is not set +CONFIG_SGL_ALLOC=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +CONFIG_LRU_CACHE=m +CONFIG_CLZ_TAB=y +# CONFIG_IRQ_POLL is not set +CONFIG_MPILIB=y +CONFIG_LIBFDT=y +CONFIG_OID_REGISTRY=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_32=y +CONFIG_FONT_SUPPORT=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_SG_POOL=y +CONFIG_STACKDEPOT=y +CONFIG_SBITMAP=y +# CONFIG_STRING_SELFTEST is not set +# end of Library routines + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_DYNAMIC_DEBUG is not set +CONFIG_SYMBOLIC_ERRNAME=y +CONFIG_DEBUG_BUGVERBOSE=y +# end of printk and dmesg options + +# +# Compile-time checks and compiler options +# +# CONFIG_DEBUG_INFO is not set +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +CONFIG_OPTIMIZE_INLINING=y +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +CONFIG_ARCH_WANT_FRAME_POINTERS=y +CONFIG_FRAME_POINTER=y +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_DEBUG_FS=y +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +# CONFIG_UBSAN is not set +CONFIG_UBSAN_ALIGNMENT=y +# end of Generic Kernel Debugging Instruments + +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_MISC=y + +# +# Memory Debugging +# +CONFIG_PAGE_EXTENSION=y +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_RODATA_TEST is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_SCHED_STACK_END_CHECK is not set +# CONFIG_DEBUG_VM is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +# CONFIG_DEBUG_HIGHMEM is not set +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_KASAN_STACK=1 +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +# CONFIG_SOFTLOCKUP_DETECTOR is not set +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y +CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1 +# CONFIG_WQ_WATCHDOG is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +CONFIG_SCHED_DEBUG=y +CONFIG_SCHED_INFO=y +CONFIG_SCHEDSTATS=y +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set +CONFIG_DEBUG_PREEMPT=y + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +CONFIG_DEBUG_SPINLOCK=y +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +CONFIG_STACKTRACE=y +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Debug kernel data structures + +CONFIG_DEBUG_CREDENTIALS=y + +# +# RCU Debugging +# +# CONFIG_RCU_PERF_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_LATENCYTOP is not set +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_GENERIC_TRACER=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +CONFIG_FUNCTION_TRACER=y +CONFIG_FUNCTION_GRAPH_TRACER=y +# CONFIG_PREEMPTIRQ_EVENTS is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_HWLAT_TRACER is not set +# CONFIG_FTRACE_SYSCALLS is not set +# CONFIG_TRACER_SNAPSHOT is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_STACK_TRACER is not set +CONFIG_BLK_DEV_IO_TRACE=y +# CONFIG_UPROBE_EVENTS is not set +CONFIG_DYNAMIC_FTRACE=y +CONFIG_DYNAMIC_FTRACE_WITH_REGS=y +# CONFIG_FUNCTION_PROFILER is not set +CONFIG_FTRACE_MCOUNT_RECORD=y +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_TRACE_EVENT_INJECT is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_PREEMPTIRQ_DELAY_TEST is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_SAMPLES is not set +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +CONFIG_STRICT_DEVMEM=y +# CONFIG_IO_STRICT_DEVMEM is not set + +# +# arm Debugging +# +# CONFIG_ARM_PTDUMP_DEBUGFS is not set +# CONFIG_DEBUG_WX is not set +CONFIG_UNWINDER_FRAME_POINTER=y +# CONFIG_DEBUG_USER is not set +# CONFIG_DEBUG_LL is not set +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_CORESIGHT is not set +# end of arm Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage +# end of Kernel hacking diff --git a/config/kernel/linux-rockchip64-legacy.config b/config/kernel/linux-rockchip64-legacy.config index 8386de9cb3..cd2c4f1c76 100644 --- a/config/kernel/linux-rockchip64-legacy.config +++ b/config/kernel/linux-rockchip64-legacy.config @@ -3003,13 +3003,13 @@ CONFIG_ROCKCHIP_THERMAL=y # CONFIG_RK_VIRTUAL_THERMAL is not set # CONFIG_RK3368_THERMAL is not set CONFIG_WATCHDOG=y -# CONFIG_WATCHDOG_CORE is not set +CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set # # Watchdog Device Drivers # -# CONFIG_SOFT_WATCHDOG is not set +CONFIG_SOFT_WATCHDOG=m # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ARM_SP805_WATCHDOG is not set diff --git a/config/sources/families/rockchip64.conf b/config/sources/families/rockchip64.conf index 372a06fb6e..0aaa1192e4 100644 --- a/config/sources/families/rockchip64.conf +++ b/config/sources/families/rockchip64.conf @@ -13,6 +13,7 @@ case $BRANCH in KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel' KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan' KERNELDIR='linux-rockchip64' + KERNEL_USE_GCC='< 8.0' ;; diff --git a/lib/configuration.sh b/lib/configuration.sh index 678c709caa..a2bae872c5 100644 --- a/lib/configuration.sh +++ b/lib/configuration.sh @@ -20,7 +20,7 @@ TZDATA=$(cat /etc/timezone) # Timezone for target is taken from host or defined USEALLCORES=yes # Use all CPU cores for compiling EXIT_PATCHING_ERROR="" # exit patching if failed [[ -z $HOST ]] && HOST="$(echo "$BOARD" | cut -f1 -d-)" # set hostname to the board -ROOTFSCACHE_VERSION=17 +ROOTFSCACHE_VERSION=18 CHROOT_CACHE_VERSION=7 BUILD_REPOSITORY_URL=$(git remote get-url $(git remote 2>/dev/null) 2>/dev/null) BUILD_REPOSITORY_COMMIT=$(git describe --match=d_e_a_d_b_e_e_f --always --dirty 2>/dev/null) @@ -236,7 +236,7 @@ case $RELEASE in [[ -z $BUILD_MINIMAL || $BUILD_MINIMAL == no ]] && PACKAGE_LIST_RELEASE="man-db kbd net-tools gnupg2 dirmngr networkd-dispatcher" PACKAGE_LIST_DESKTOP+=" xserver-xorg-input-all paprefs dbus-x11 pulseaudio-module-gsettings onboard" PACKAGE_LIST_DESKTOP_RECOMMENDS+=" firefox system-config-printer-common system-config-printer \ - language-selector-gnome mirage" + language-selector-gnome viewnior" ;; eoan) From 72c5fdf6fb2e7203a0516fcb6796e66905182296 Mon Sep 17 00:00:00 2001 From: lanefu Date: Sat, 8 Feb 2020 20:55:06 -0500 Subject: [PATCH 30/54] added build status icon --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bd9b2dd40e..98f7f8300f 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ build tools

 

+[![Build Status](https://armbian.lane-fu.com/jenkins/buildStatus/icon?job=test-full)](https://armbian.lane-fu.com/jenkins/job/test-full/) + ## Table of contents - [What this project does?](#what-this-project-does) From 2b3997df531f278c96538600ac238a859e38bf0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Pe=C4=8Dovnik?= Date: Sun, 9 Feb 2020 10:25:41 +0100 Subject: [PATCH 31/54] When seeking for rootfs cache files it also checks previous version. This solves problem described in [AR-166] (#1790) --- lib/debootstrap.sh | 32 ++++++++++++++++++++++---------- lib/general.sh | 2 +- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/lib/debootstrap.sh b/lib/debootstrap.sh index 4f64f84795..6749937ec2 100644 --- a/lib/debootstrap.sh +++ b/lib/debootstrap.sh @@ -99,17 +99,29 @@ debootstrap_ng() # create_rootfs_cache() { - local packages_hash=$(get_package_list_hash) - local cache_type=$(if [[ ${BUILD_DESKTOP} == yes ]]; then echo "desktop"; elif [[ ${BUILD_MINIMAL} == yes ]]; then echo "minimal"; else echo "cli";fi) - local cache_name=${RELEASE}-${cache_type}-${ARCH}.$packages_hash.tar.lz4 - local cache_fname=${SRC}/cache/rootfs/${cache_name} - local display_name=${RELEASE}-${cache_type}-${ARCH}.${packages_hash:0:3}...${packages_hash:29}.tar.lz4 + # seek last cache, proceed to previous otherwise build it + for ((n=0;n<2;n++)); do - display_alert "Checking for local cache" "$display_name" "info" - if [[ ! -f $cache_fname && "$ROOT_FS_CREATE_ONLY" != "force" ]]; then - display_alert "searching on servers" - download_and_verify "_rootfs" "$cache_name" - fi + local packages_hash=$(get_package_list_hash "$(($ROOTFSCACHE_VERSION - $n))") + local cache_type=$(if [[ ${BUILD_DESKTOP} == yes ]]; then echo "desktop"; elif [[ ${BUILD_MINIMAL} == yes ]]; then echo "minimal"; else echo "cli";fi) + local cache_name=${RELEASE}-${cache_type}-${ARCH}.$packages_hash.tar.lz4 + local cache_fname=${SRC}/cache/rootfs/${cache_name} + local display_name=${RELEASE}-${cache_type}-${ARCH}.${packages_hash:0:3}...${packages_hash:29}.tar.lz4 + + display_alert "Checking for local cache" "$display_name" "info" + + if [[ ! -f $cache_fname && "$ROOT_FS_CREATE_ONLY" != "force" ]]; then + display_alert "searching on servers" + download_and_verify "_rootfs" "$cache_name" + fi + + if [[ -f $cache_fname ]]; then + break + else + display_alert "not found: try to use previous cache" + fi + + done if [[ -f $cache_fname && "$ROOT_FS_CREATE_ONLY" != "force" ]]; then local date_diff=$(( ($(date +%s) - $(stat -c %Y $cache_fname)) / 86400 )) diff --git a/lib/general.sh b/lib/general.sh index 765330bf8e..20a4d6c23a 100644 --- a/lib/general.sh +++ b/lib/general.sh @@ -119,7 +119,7 @@ exit_with_error() get_package_list_hash() { - ( printf '%s\n' $PACKAGE_LIST | sort -u; printf '%s\n' $PACKAGE_LIST_EXCLUDE | sort -u; echo "$ROOTFSCACHE_VERSION" ) \ + ( printf '%s\n' $PACKAGE_LIST | sort -u; printf '%s\n' $PACKAGE_LIST_EXCLUDE | sort -u; echo "$1" ) \ | md5sum | cut -d' ' -f 1 } From c0527b1b21a67f271edcac482e10799a39aa015f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Pe=C4=8Dovnik?= Date: Sun, 9 Feb 2020 13:52:35 +0100 Subject: [PATCH 32/54] Add upstream patches, briefly tested for stability. (#1791) --- config/kernel/linux-odroidxu4-legacy.config | 2 +- .../patch-4.14.167-168-alt.patch | 9416 +++++++++++++++++ .../odroidxu4-legacy/patch-4.14.168-169.patch | 1600 +++ .../odroidxu4-legacy/patch-4.14.169-170.patch | 3128 ++++++ 4 files changed, 14145 insertions(+), 1 deletion(-) create mode 100644 patch/kernel/odroidxu4-legacy/patch-4.14.167-168-alt.patch create mode 100644 patch/kernel/odroidxu4-legacy/patch-4.14.168-169.patch create mode 100644 patch/kernel/odroidxu4-legacy/patch-4.14.169-170.patch diff --git a/config/kernel/linux-odroidxu4-legacy.config b/config/kernel/linux-odroidxu4-legacy.config index 364e0c8919..c9c0b24829 100644 --- a/config/kernel/linux-odroidxu4-legacy.config +++ b/config/kernel/linux-odroidxu4-legacy.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 4.14.167 Kernel Configuration +# Linux/arm 4.14.170 Kernel Configuration # CONFIG_ARM=y CONFIG_ARM_HAS_SG_CHAIN=y diff --git a/patch/kernel/odroidxu4-legacy/patch-4.14.167-168-alt.patch b/patch/kernel/odroidxu4-legacy/patch-4.14.167-168-alt.patch new file mode 100644 index 0000000000..02279ee57b --- /dev/null +++ b/patch/kernel/odroidxu4-legacy/patch-4.14.167-168-alt.patch @@ -0,0 +1,9416 @@ +diff --git a/Makefile b/Makefile +index 3e8eaabf2bcb..1e74ba09cdda 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 14 +-SUBLEVEL = 167 ++SUBLEVEL = 168 + EXTRAVERSION = + NAME = Petit Gorille + +@@ -971,6 +971,7 @@ ifdef CONFIG_STACK_VALIDATION + endif + endif + ++PHONY += prepare0 + + ifeq ($(KBUILD_EXTMOD),) + core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ +@@ -1065,8 +1066,7 @@ include/config/kernel.release: include/config/auto.conf FORCE + # archprepare is used in arch Makefiles and when processed asm symlink, + # version.h and scripts_basic is processed / created. + +-# Listed in dependency order +-PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3 ++PHONY += prepare archprepare prepare1 prepare2 prepare3 + + # prepare3 is used to check if we are building in a separate output directory, + # and if so do: +diff --git a/arch/arm/boot/dts/lpc3250-phy3250.dts b/arch/arm/boot/dts/lpc3250-phy3250.dts +index b7bd3a110a8d..dd0bdf765599 100644 +--- a/arch/arm/boot/dts/lpc3250-phy3250.dts ++++ b/arch/arm/boot/dts/lpc3250-phy3250.dts +@@ -49,8 +49,8 @@ + sd_reg: regulator@2 { + compatible = "regulator-fixed"; + regulator-name = "sd_reg"; +- regulator-min-microvolt = <1800000>; +- regulator-max-microvolt = <1800000>; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; + gpio = <&gpio 5 5 0>; + enable-active-high; + }; +diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi +index d077bd2b9583..c5b119ddb70b 100644 +--- a/arch/arm/boot/dts/lpc32xx.dtsi ++++ b/arch/arm/boot/dts/lpc32xx.dtsi +@@ -139,11 +139,11 @@ + }; + + clcd: clcd@31040000 { +- compatible = "arm,pl110", "arm,primecell"; ++ compatible = "arm,pl111", "arm,primecell"; + reg = <0x31040000 0x1000>; + interrupts = <14 IRQ_TYPE_LEVEL_HIGH>; +- clocks = <&clk LPC32XX_CLK_LCD>; +- clock-names = "apb_pclk"; ++ clocks = <&clk LPC32XX_CLK_LCD>, <&clk LPC32XX_CLK_LCD>; ++ clock-names = "clcdclk", "apb_pclk"; + status = "disabled"; + }; + +@@ -462,7 +462,9 @@ + key: key@40050000 { + compatible = "nxp,lpc3220-key"; + reg = <0x40050000 0x1000>; +- interrupts = <54 IRQ_TYPE_LEVEL_HIGH>; ++ clocks = <&clk LPC32XX_CLK_KEY>; ++ interrupt-parent = <&sic1>; ++ interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; + status = "disabled"; + }; + +diff --git a/arch/arm/boot/dts/ls1021a-twr.dts b/arch/arm/boot/dts/ls1021a-twr.dts +index 44715c8ef756..72a3fc63d0ec 100644 +--- a/arch/arm/boot/dts/ls1021a-twr.dts ++++ b/arch/arm/boot/dts/ls1021a-twr.dts +@@ -143,7 +143,7 @@ + }; + + &enet0 { +- tbi-handle = <&tbi1>; ++ tbi-handle = <&tbi0>; + phy-handle = <&sgmii_phy2>; + phy-connection-type = "sgmii"; + status = "okay"; +@@ -222,6 +222,13 @@ + sgmii_phy2: ethernet-phy@2 { + reg = <0x2>; + }; ++ tbi0: tbi-phy@1f { ++ reg = <0x1f>; ++ device_type = "tbi-phy"; ++ }; ++}; ++ ++&mdio1 { + tbi1: tbi-phy@1f { + reg = <0x1f>; + device_type = "tbi-phy"; +diff --git a/arch/arm/boot/dts/ls1021a.dtsi b/arch/arm/boot/dts/ls1021a.dtsi +index 2d20f60947b9..1343c86988c5 100644 +--- a/arch/arm/boot/dts/ls1021a.dtsi ++++ b/arch/arm/boot/dts/ls1021a.dtsi +@@ -562,13 +562,22 @@ + }; + + mdio0: mdio@2d24000 { +- compatible = "gianfar"; ++ compatible = "fsl,etsec2-mdio"; + device_type = "mdio"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x0 0x2d24000 0x0 0x4000>; + }; + ++ mdio1: mdio@2d64000 { ++ compatible = "fsl,etsec2-mdio"; ++ device_type = "mdio"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ reg = <0x0 0x2d64000 0x0 0x4000>, ++ <0x0 0x2d50030 0x0 0x4>; ++ }; ++ + ptp_clock@2d10e00 { + compatible = "fsl,etsec-ptp"; + reg = <0x0 0x2d10e00 0x0 0xb0>; +diff --git a/arch/arm/boot/dts/stm32h743i-eval.dts b/arch/arm/boot/dts/stm32h743i-eval.dts +index 6c07786e7ddb..0d98b2865bd7 100644 +--- a/arch/arm/boot/dts/stm32h743i-eval.dts ++++ b/arch/arm/boot/dts/stm32h743i-eval.dts +@@ -71,6 +71,7 @@ + }; + + &adc_12 { ++ vdda-supply = <&vdda>; + vref-supply = <&vdda>; + status = "okay"; + adc1: adc@0 { +diff --git a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts +index 10da56e86ab8..21b38c386f1b 100644 +--- a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts ++++ b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts +@@ -79,6 +79,8 @@ + wifi_pwrseq: wifi_pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */ ++ clocks = <&rtc 1>; ++ clock-names = "ext_clock"; + }; + + sound_spdif { +@@ -128,6 +130,8 @@ + pinctrl-names = "default"; + pinctrl-0 = <&mmc1_pins_a>; + vmmc-supply = <®_vcc3v3>; ++ vqmmc-supply = <®_vcc3v3>; ++ mmc-pwrseq = <&wifi_pwrseq>; + bus-width = <4>; + non-removable; + status = "okay"; +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c +index 45c8f2ef4e23..9274a484c6a3 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -2530,7 +2530,7 @@ static void _setup_iclk_autoidle(struct omap_hwmod *oh) + */ + static int _setup_reset(struct omap_hwmod *oh) + { +- int r; ++ int r = 0; + + if (oh->_state != _HWMOD_STATE_INITIALIZED) + return -EINVAL; +diff --git a/arch/arm/mach-rpc/irq.c b/arch/arm/mach-rpc/irq.c +index b8a61cb11207..7f0f40178634 100644 +--- a/arch/arm/mach-rpc/irq.c ++++ b/arch/arm/mach-rpc/irq.c +@@ -118,7 +118,7 @@ extern unsigned char rpc_default_fiq_start, rpc_default_fiq_end; + + void __init rpc_init_irq(void) + { +- unsigned int irq, clr, set = 0; ++ unsigned int irq, clr, set; + + iomd_writeb(0, IOMD_IRQMASKA); + iomd_writeb(0, IOMD_IRQMASKB); +@@ -130,6 +130,7 @@ void __init rpc_init_irq(void) + + for (irq = 0; irq < NR_IRQS; irq++) { + clr = IRQ_NOREQUEST; ++ set = 0; + + if (irq <= 6 || (irq >= 9 && irq <= 15)) + clr |= IRQ_NOPROBE; +diff --git a/arch/arm/plat-pxa/ssp.c b/arch/arm/plat-pxa/ssp.c +index b92673efffff..97bd43c16cd8 100644 +--- a/arch/arm/plat-pxa/ssp.c ++++ b/arch/arm/plat-pxa/ssp.c +@@ -230,18 +230,12 @@ static int pxa_ssp_probe(struct platform_device *pdev) + + static int pxa_ssp_remove(struct platform_device *pdev) + { +- struct resource *res; + struct ssp_device *ssp; + + ssp = platform_get_drvdata(pdev); + if (ssp == NULL) + return -ENODEV; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- release_mem_region(res->start, resource_size(res)); +- +- clk_put(ssp->clk); +- + mutex_lock(&ssp_lock); + list_del(&ssp->node); + mutex_unlock(&ssp_lock); +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 8c8db1b057df..788a6f8c5994 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -274,7 +274,8 @@ + interrupts = , + , + ; +- clocks = <&ccu 58>; ++ clocks = <&ccu 58>, <&osc24M>, <&rtc 0>; ++ clock-names = "apb", "hosc", "losc"; + gpio-controller; + #gpio-cells = <3>; + interrupt-controller; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts +index e2c71753e327..407d32f4fe73 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts +@@ -226,7 +226,6 @@ + cap-mmc-highspeed; + mmc-ddr-3_3v; + max-frequency = <50000000>; +- non-removable; + disable-wp; + + mmc-pwrseq = <&emmc_pwrseq>; +diff --git a/arch/arm64/boot/dts/arm/juno-clocks.dtsi b/arch/arm64/boot/dts/arm/juno-clocks.dtsi +index e5e265dfa902..2870b5eeb198 100644 +--- a/arch/arm64/boot/dts/arm/juno-clocks.dtsi ++++ b/arch/arm64/boot/dts/arm/juno-clocks.dtsi +@@ -8,10 +8,10 @@ + */ + / { + /* SoC fixed clocks */ +- soc_uartclk: refclk7273800hz { ++ soc_uartclk: refclk7372800hz { + compatible = "fixed-clock"; + #clock-cells = <0>; +- clock-frequency = <7273800>; ++ clock-frequency = <7372800>; + clock-output-names = "juno:uartclk"; + }; + +diff --git a/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi b/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi +index b6b44fdf7fac..c1028b47edde 100644 +--- a/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi ++++ b/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi +@@ -458,6 +458,8 @@ + l11 { + regulator-min-microvolt = <1750000>; + regulator-max-microvolt = <3337000>; ++ regulator-allow-set-load; ++ regulator-system-load = <200000>; + }; + + l12 { +diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c +index 2081b8cd5591..b9aee983e6f4 100644 +--- a/arch/m68k/amiga/cia.c ++++ b/arch/m68k/amiga/cia.c +@@ -88,10 +88,19 @@ static irqreturn_t cia_handler(int irq, void *dev_id) + struct ciabase *base = dev_id; + int mach_irq; + unsigned char ints; ++ unsigned long flags; + ++ /* Interrupts get disabled while the timer irq flag is cleared and ++ * the timer interrupt serviced. ++ */ + mach_irq = base->cia_irq; ++ local_irq_save(flags); + ints = cia_set_irq(base, CIA_ICR_ALL); + amiga_custom.intreq = base->int_mask; ++ if (ints & 1) ++ generic_handle_irq(mach_irq); ++ local_irq_restore(flags); ++ mach_irq++, ints >>= 1; + for (; ints; mach_irq++, ints >>= 1) { + if (ints & 1) + generic_handle_irq(mach_irq); +diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c +index 3d2b63bedf05..56f02ea2c248 100644 +--- a/arch/m68k/atari/ataints.c ++++ b/arch/m68k/atari/ataints.c +@@ -142,7 +142,7 @@ struct mfptimerbase { + .name = "MFP Timer D" + }; + +-static irqreturn_t mfptimer_handler(int irq, void *dev_id) ++static irqreturn_t mfp_timer_d_handler(int irq, void *dev_id) + { + struct mfptimerbase *base = dev_id; + int mach_irq; +@@ -344,7 +344,7 @@ void __init atari_init_IRQ(void) + st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 0xf0) | 0x6; + + /* request timer D dispatch handler */ +- if (request_irq(IRQ_MFP_TIMD, mfptimer_handler, IRQF_SHARED, ++ if (request_irq(IRQ_MFP_TIMD, mfp_timer_d_handler, IRQF_SHARED, + stmfp_base.name, &stmfp_base)) + pr_err("Couldn't register %s interrupt\n", stmfp_base.name); + +diff --git a/arch/m68k/atari/time.c b/arch/m68k/atari/time.c +index c549b48174ec..972181c1fe4b 100644 +--- a/arch/m68k/atari/time.c ++++ b/arch/m68k/atari/time.c +@@ -24,6 +24,18 @@ + DEFINE_SPINLOCK(rtc_lock); + EXPORT_SYMBOL_GPL(rtc_lock); + ++static irqreturn_t mfp_timer_c_handler(int irq, void *dev_id) ++{ ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; ++} ++ + void __init + atari_sched_init(irq_handler_t timer_routine) + { +@@ -32,7 +44,8 @@ atari_sched_init(irq_handler_t timer_routine) + /* start timer C, div = 1:100 */ + st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60; + /* install interrupt service routine for MFP Timer C */ +- if (request_irq(IRQ_MFP_TIMC, timer_routine, 0, "timer", timer_routine)) ++ if (request_irq(IRQ_MFP_TIMC, mfp_timer_c_handler, 0, "timer", ++ timer_routine)) + pr_err("Couldn't register timer interrupt\n"); + } + +diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c +index 2cfff4765040..0e602c32b246 100644 +--- a/arch/m68k/bvme6000/config.c ++++ b/arch/m68k/bvme6000/config.c +@@ -45,11 +45,6 @@ extern int bvme6000_set_clock_mmss (unsigned long); + extern void bvme6000_reset (void); + void bvme6000_set_vectors (void); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/timer/timekeeping.c, called via bvme6000_process_int() */ +- +-static irq_handler_t tick_handler; +- + + int __init bvme6000_parse_bootinfo(const struct bi_record *bi) + { +@@ -159,12 +154,18 @@ irqreturn_t bvme6000_abort_int (int irq, void *dev_id) + + static irqreturn_t bvme6000_timer_int (int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; +- unsigned char msr = rtc->msr & 0xc0; ++ unsigned char msr; + ++ local_irq_save(flags); ++ msr = rtc->msr & 0xc0; + rtc->msr = msr | 0x20; /* Ack the interrupt */ ++ timer_routine(0, NULL); ++ local_irq_restore(flags); + +- return tick_handler(irq, dev_id); ++ return IRQ_HANDLED; + } + + /* +@@ -183,9 +184,8 @@ void bvme6000_sched_init (irq_handler_t timer_routine) + + rtc->msr = 0; /* Ensure timer registers accessible */ + +- tick_handler = timer_routine; +- if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, +- "timer", bvme6000_timer_int)) ++ if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, "timer", ++ timer_routine)) + panic ("Couldn't register timer int"); + + rtc->t1cr_omr = 0x04; /* Mode 2, ext clk */ +diff --git a/arch/m68k/hp300/time.c b/arch/m68k/hp300/time.c +index 289d928a46cb..d30b03ea93a2 100644 +--- a/arch/m68k/hp300/time.c ++++ b/arch/m68k/hp300/time.c +@@ -38,13 +38,19 @@ + + static irqreturn_t hp300_tick(int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + unsigned long tmp; +- irq_handler_t vector = dev_id; ++ ++ local_irq_save(flags); + in_8(CLOCKBASE + CLKSR); + asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE)); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ + /* Turn off the network and SCSI leds */ + blinken_leds(0, 0xe0); +- return vector(irq, NULL); ++ return IRQ_HANDLED; + } + + u32 hp300_gettimeoffset(void) +diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c +index 9f59a662ace5..863806e6775a 100644 +--- a/arch/m68k/mac/via.c ++++ b/arch/m68k/mac/via.c +@@ -54,16 +54,6 @@ static __u8 rbv_clear; + + static int gIER,gIFR,gBufA,gBufB; + +-/* +- * Timer defs. +- */ +- +-#define TICK_SIZE 10000 +-#define MAC_CLOCK_TICK (783300/HZ) /* ticks per HZ */ +-#define MAC_CLOCK_LOW (MAC_CLOCK_TICK&0xFF) +-#define MAC_CLOCK_HIGH (MAC_CLOCK_TICK>>8) +- +- + /* + * On Macs with a genuine VIA chip there is no way to mask an individual slot + * interrupt. This limitation also seems to apply to VIA clone logic cores in +@@ -278,22 +268,6 @@ void __init via_init(void) + } + } + +-/* +- * Start the 100 Hz clock +- */ +- +-void __init via_init_clock(irq_handler_t func) +-{ +- via1[vACR] |= 0x40; +- via1[vT1LL] = MAC_CLOCK_LOW; +- via1[vT1LH] = MAC_CLOCK_HIGH; +- via1[vT1CL] = MAC_CLOCK_LOW; +- via1[vT1CH] = MAC_CLOCK_HIGH; +- +- if (request_irq(IRQ_MAC_TIMER_1, func, 0, "timer", func)) +- pr_err("Couldn't register %s interrupt\n", "timer"); +-} +- + /* + * Debugging dump, used in various places to see what's going on. + */ +@@ -321,29 +295,6 @@ void via_debug_dump(void) + } + } + +-/* +- * This is always executed with interrupts disabled. +- * +- * TBI: get time offset between scheduling timer ticks +- */ +- +-u32 mac_gettimeoffset(void) +-{ +- unsigned long ticks, offset = 0; +- +- /* read VIA1 timer 2 current value */ +- ticks = via1[vT1CL] | (via1[vT1CH] << 8); +- /* The probability of underflow is less than 2% */ +- if (ticks > MAC_CLOCK_TICK - MAC_CLOCK_TICK / 50) +- /* Check for pending timer interrupt in VIA1 IFR */ +- if (via1[vIFR] & 0x40) offset = TICK_SIZE; +- +- ticks = MAC_CLOCK_TICK - ticks; +- ticks = ticks * 10000L / MAC_CLOCK_TICK; +- +- return (ticks + offset) * 1000; +-} +- + /* + * Flush the L2 cache on Macs that have it by flipping + * the system into 24-bit mode for an instant. +@@ -447,6 +398,8 @@ void via_nubus_irq_shutdown(int irq) + * via6522.c :-), disable/pending masks added. + */ + ++#define VIA_TIMER_1_INT BIT(6) ++ + void via1_irq(struct irq_desc *desc) + { + int irq_num; +@@ -456,6 +409,21 @@ void via1_irq(struct irq_desc *desc) + if (!events) + return; + ++ irq_num = IRQ_MAC_TIMER_1; ++ irq_bit = VIA_TIMER_1_INT; ++ if (events & irq_bit) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ via1[vIFR] = irq_bit; ++ generic_handle_irq(irq_num); ++ local_irq_restore(flags); ++ ++ events &= ~irq_bit; ++ if (!events) ++ return; ++ } ++ + irq_num = VIA1_SOURCE_BASE; + irq_bit = 1; + do { +@@ -612,3 +580,56 @@ int via2_scsi_drq_pending(void) + return via2[gIFR] & (1 << IRQ_IDX(IRQ_MAC_SCSIDRQ)); + } + EXPORT_SYMBOL(via2_scsi_drq_pending); ++ ++/* timer and clock source */ ++ ++#define VIA_CLOCK_FREQ 783360 /* VIA "phase 2" clock in Hz */ ++#define VIA_TIMER_INTERVAL (1000000 / HZ) /* microseconds per jiffy */ ++#define VIA_TIMER_CYCLES (VIA_CLOCK_FREQ / HZ) /* clock cycles per jiffy */ ++ ++#define VIA_TC (VIA_TIMER_CYCLES - 2) /* including 0 and -1 */ ++#define VIA_TC_LOW (VIA_TC & 0xFF) ++#define VIA_TC_HIGH (VIA_TC >> 8) ++ ++void __init via_init_clock(irq_handler_t timer_routine) ++{ ++ if (request_irq(IRQ_MAC_TIMER_1, timer_routine, 0, "timer", NULL)) { ++ pr_err("Couldn't register %s interrupt\n", "timer"); ++ return; ++ } ++ ++ via1[vT1LL] = VIA_TC_LOW; ++ via1[vT1LH] = VIA_TC_HIGH; ++ via1[vT1CL] = VIA_TC_LOW; ++ via1[vT1CH] = VIA_TC_HIGH; ++ via1[vACR] |= 0x40; ++} ++ ++u32 mac_gettimeoffset(void) ++{ ++ unsigned long flags; ++ u8 count_high; ++ u16 count, offset = 0; ++ ++ /* ++ * Timer counter wrap-around is detected with the timer interrupt flag ++ * but reading the counter low byte (vT1CL) would reset the flag. ++ * Also, accessing both counter registers is essentially a data race. ++ * These problems are avoided by ignoring the low byte. Clock accuracy ++ * is 256 times worse (error can reach 0.327 ms) but CPU overhead is ++ * reduced by avoiding slow VIA register accesses. ++ */ ++ ++ local_irq_save(flags); ++ count_high = via1[vT1CH]; ++ if (count_high == 0xFF) ++ count_high = 0; ++ if (count_high > 0 && (via1[vIFR] & VIA_TIMER_1_INT)) ++ offset = VIA_TIMER_CYCLES; ++ local_irq_restore(flags); ++ ++ count = count_high << 8; ++ count = VIA_TIMER_CYCLES - count + offset; ++ ++ return ((count * VIA_TIMER_INTERVAL) / VIA_TIMER_CYCLES) * 1000; ++} +diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c +index 8778612d1f31..78ae803c833e 100644 +--- a/arch/m68k/mvme147/config.c ++++ b/arch/m68k/mvme147/config.c +@@ -46,11 +46,6 @@ extern void mvme147_reset (void); + + static int bcd2int (unsigned char b); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/time/timekeeping.c, called via mvme147_process_int() */ +- +-irq_handler_t tick_handler; +- + + int __init mvme147_parse_bootinfo(const struct bi_record *bi) + { +@@ -106,16 +101,23 @@ void __init config_mvme147(void) + + static irqreturn_t mvme147_timer_int (int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); + m147_pcc->t1_int_cntrl = PCC_TIMER_INT_CLR; + m147_pcc->t1_int_cntrl = PCC_INT_ENAB|PCC_LEVEL_TIMER1; +- return tick_handler(irq, dev_id); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; + } + + + void mvme147_sched_init (irq_handler_t timer_routine) + { +- tick_handler = timer_routine; +- if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", NULL)) ++ if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", ++ timer_routine)) + pr_err("Couldn't register timer interrupt\n"); + + /* Init the clock with a value */ +diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c +index 6fa06d4d16bf..3116dd576bb3 100644 +--- a/arch/m68k/mvme16x/config.c ++++ b/arch/m68k/mvme16x/config.c +@@ -51,11 +51,6 @@ extern void mvme16x_reset (void); + + int bcd2int (unsigned char b); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/time/timekeeping.c, called via mvme16x_process_int() */ +- +-static irq_handler_t tick_handler; +- + + unsigned short mvme16x_config; + EXPORT_SYMBOL(mvme16x_config); +@@ -354,8 +349,15 @@ static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) + + static irqreturn_t mvme16x_timer_int (int irq, void *dev_id) + { +- *(volatile unsigned char *)0xfff4201b |= 8; +- return tick_handler(irq, dev_id); ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ *(volatile unsigned char *)0xfff4201b |= 8; ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; + } + + void mvme16x_sched_init (irq_handler_t timer_routine) +@@ -363,14 +365,13 @@ void mvme16x_sched_init (irq_handler_t timer_routine) + uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); + int irq; + +- tick_handler = timer_routine; + /* Using PCCchip2 or MC2 chip tick timer 1 */ + *(volatile unsigned long *)0xfff42008 = 0; + *(volatile unsigned long *)0xfff42004 = 10000; /* 10ms */ + *(volatile unsigned char *)0xfff42017 |= 3; + *(volatile unsigned char *)0xfff4201b = 0x16; +- if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, +- "timer", mvme16x_timer_int)) ++ if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, "timer", ++ timer_routine)) + panic ("Couldn't register timer int"); + + if (brdno == 0x0162 || brdno == 0x172) +diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c +index 3e7603202977..1c696906c159 100644 +--- a/arch/m68k/q40/q40ints.c ++++ b/arch/m68k/q40/q40ints.c +@@ -127,10 +127,10 @@ void q40_mksound(unsigned int hz, unsigned int ticks) + sound_ticks = ticks << 1; + } + +-static irq_handler_t q40_timer_routine; +- +-static irqreturn_t q40_timer_int (int irq, void * dev) ++static irqreturn_t q40_timer_int(int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ + ql_ticks = ql_ticks ? 0 : 1; + if (sound_ticks) { + unsigned char sval=(sound_ticks & 1) ? 128-SVOL : 128+SVOL; +@@ -139,8 +139,13 @@ static irqreturn_t q40_timer_int (int irq, void * dev) + *DAC_RIGHT=sval; + } + +- if (!ql_ticks) +- q40_timer_routine(irq, dev); ++ if (!ql_ticks) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ } + return IRQ_HANDLED; + } + +@@ -148,11 +153,9 @@ void q40_sched_init (irq_handler_t timer_routine) + { + int timer_irq; + +- q40_timer_routine = timer_routine; + timer_irq = Q40_IRQ_FRAME; + +- if (request_irq(timer_irq, q40_timer_int, 0, +- "timer", q40_timer_int)) ++ if (request_irq(timer_irq, q40_timer_int, 0, "timer", timer_routine)) + panic("Couldn't register timer int"); + + master_outb(-1, FRAME_CLEAR_REG); +diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c +index 6bbca30c9188..a5824abb4a39 100644 +--- a/arch/m68k/sun3/sun3ints.c ++++ b/arch/m68k/sun3/sun3ints.c +@@ -61,8 +61,10 @@ static irqreturn_t sun3_int7(int irq, void *dev_id) + + static irqreturn_t sun3_int5(int irq, void *dev_id) + { ++ unsigned long flags; + unsigned int cnt; + ++ local_irq_save(flags); + #ifdef CONFIG_SUN3 + intersil_clear(); + #endif +@@ -76,6 +78,7 @@ static irqreturn_t sun3_int5(int irq, void *dev_id) + cnt = kstat_irqs_cpu(irq, 0); + if (!(cnt % 20)) + sun3_leds(led_pattern[cnt % 160 / 20]); ++ local_irq_restore(flags); + return IRQ_HANDLED; + } + +diff --git a/arch/m68k/sun3x/time.c b/arch/m68k/sun3x/time.c +index 7a2c53d9f779..48b43903253e 100644 +--- a/arch/m68k/sun3x/time.c ++++ b/arch/m68k/sun3x/time.c +@@ -78,15 +78,19 @@ u32 sun3x_gettimeoffset(void) + } + + #if 0 +-static void sun3x_timer_tick(int irq, void *dev_id, struct pt_regs *regs) ++static irqreturn_t sun3x_timer_tick(int irq, void *dev_id) + { +- void (*vector)(int, void *, struct pt_regs *) = dev_id; ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + +- /* Clear the pending interrupt - pulse the enable line low */ +- disable_irq(5); +- enable_irq(5); ++ local_irq_save(flags); ++ /* Clear the pending interrupt - pulse the enable line low */ ++ disable_irq(5); ++ enable_irq(5); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); + +- vector(irq, NULL, regs); ++ return IRQ_HANDLED; + } + #endif + +diff --git a/arch/mips/bcm63xx/Makefile b/arch/mips/bcm63xx/Makefile +index c69f297fc1df..d89651e538f6 100644 +--- a/arch/mips/bcm63xx/Makefile ++++ b/arch/mips/bcm63xx/Makefile +@@ -1,8 +1,8 @@ + # SPDX-License-Identifier: GPL-2.0 + obj-y += clk.o cpu.o cs.o gpio.o irq.o nvram.o prom.o reset.o \ +- setup.o timer.o dev-dsp.o dev-enet.o dev-flash.o \ +- dev-pcmcia.o dev-rng.o dev-spi.o dev-hsspi.o dev-uart.o \ +- dev-wdt.o dev-usb-usbd.o ++ setup.o timer.o dev-enet.o dev-flash.o dev-pcmcia.o \ ++ dev-rng.o dev-spi.o dev-hsspi.o dev-uart.o dev-wdt.o \ ++ dev-usb-usbd.o + obj-$(CONFIG_EARLY_PRINTK) += early_printk.o + + obj-y += boards/ +diff --git a/arch/mips/bcm63xx/boards/board_bcm963xx.c b/arch/mips/bcm63xx/boards/board_bcm963xx.c +index b2097c0d2ed7..36ec3dc2c999 100644 +--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c ++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c +@@ -23,7 +23,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -289,14 +288,6 @@ static struct board_info __initdata board_96348gw_10 = { + .has_pccard = 1, + .has_ehci0 = 1, + +- .has_dsp = 1, +- .dsp = { +- .gpio_rst = 6, +- .gpio_int = 34, +- .cs = 2, +- .ext_irq = 2, +- }, +- + .leds = { + { + .name = "adsl-fail", +@@ -401,14 +392,6 @@ static struct board_info __initdata board_96348gw = { + + .has_ohci0 = 1, + +- .has_dsp = 1, +- .dsp = { +- .gpio_rst = 6, +- .gpio_int = 34, +- .ext_irq = 2, +- .cs = 2, +- }, +- + .leds = { + { + .name = "adsl-fail", +@@ -898,9 +881,6 @@ int __init board_register_devices(void) + if (board.has_usbd) + bcm63xx_usbd_register(&board.usbd); + +- if (board.has_dsp) +- bcm63xx_dsp_register(&board.dsp); +- + /* Generate MAC address for WLAN and register our SPROM, + * do this after registering enet devices + */ +diff --git a/arch/mips/bcm63xx/dev-dsp.c b/arch/mips/bcm63xx/dev-dsp.c +deleted file mode 100644 +index 5bb5b154c9bd..000000000000 +--- a/arch/mips/bcm63xx/dev-dsp.c ++++ /dev/null +@@ -1,56 +0,0 @@ +-/* +- * Broadcom BCM63xx VoIP DSP registration +- * +- * This file is subject to the terms and conditions of the GNU General Public +- * License. See the file "COPYING" in the main directory of this archive +- * for more details. +- * +- * Copyright (C) 2009 Florian Fainelli +- */ +- +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +- +-static struct resource voip_dsp_resources[] = { +- { +- .start = -1, /* filled at runtime */ +- .end = -1, /* filled at runtime */ +- .flags = IORESOURCE_MEM, +- }, +- { +- .start = -1, /* filled at runtime */ +- .flags = IORESOURCE_IRQ, +- }, +-}; +- +-static struct platform_device bcm63xx_voip_dsp_device = { +- .name = "bcm63xx-voip-dsp", +- .id = -1, +- .num_resources = ARRAY_SIZE(voip_dsp_resources), +- .resource = voip_dsp_resources, +-}; +- +-int __init bcm63xx_dsp_register(const struct bcm63xx_dsp_platform_data *pd) +-{ +- struct bcm63xx_dsp_platform_data *dpd; +- u32 val; +- +- /* Get the memory window */ +- val = bcm_mpi_readl(MPI_CSBASE_REG(pd->cs - 1)); +- val &= MPI_CSBASE_BASE_MASK; +- voip_dsp_resources[0].start = val; +- voip_dsp_resources[0].end = val + 0xFFFFFFF; +- voip_dsp_resources[1].start = pd->ext_irq; +- +- /* copy given platform data */ +- dpd = bcm63xx_voip_dsp_device.dev.platform_data; +- memcpy(dpd, pd, sizeof (*pd)); +- +- return platform_device_register(&bcm63xx_voip_dsp_device); +-} +diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h +index 57b34257be2b..98eb15b0524c 100644 +--- a/arch/mips/include/asm/io.h ++++ b/arch/mips/include/asm/io.h +@@ -60,21 +60,11 @@ + * instruction, so the lower 16 bits must be zero. Should be true on + * on any sane architecture; generic code does not use this assumption. + */ +-extern const unsigned long mips_io_port_base; ++extern unsigned long mips_io_port_base; + +-/* +- * Gcc will generate code to load the value of mips_io_port_base after each +- * function call which may be fairly wasteful in some cases. So we don't +- * play quite by the book. We tell gcc mips_io_port_base is a long variable +- * which solves the code generation issue. Now we need to violate the +- * aliasing rules a little to make initialization possible and finally we +- * will need the barrier() to fight side effects of the aliasing chat. +- * This trickery will eventually collapse under gcc's optimizer. Oh well. +- */ + static inline void set_io_port_base(unsigned long base) + { +- * (unsigned long *) &mips_io_port_base = base; +- barrier(); ++ mips_io_port_base = base; + } + + /* +diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h +deleted file mode 100644 +index 4e4970787371..000000000000 +--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h ++++ /dev/null +@@ -1,14 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef __BCM63XX_DSP_H +-#define __BCM63XX_DSP_H +- +-struct bcm63xx_dsp_platform_data { +- unsigned gpio_rst; +- unsigned gpio_int; +- unsigned cs; +- unsigned ext_irq; +-}; +- +-int __init bcm63xx_dsp_register(const struct bcm63xx_dsp_platform_data *pd); +- +-#endif /* __BCM63XX_DSP_H */ +diff --git a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h +index 5e5b1bc4a324..830f53f28e3f 100644 +--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h ++++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h +@@ -7,7 +7,6 @@ + #include + #include + #include +-#include + + /* + * flash mapping +@@ -31,7 +30,6 @@ struct board_info { + unsigned int has_ohci0:1; + unsigned int has_ehci0:1; + unsigned int has_usbd:1; +- unsigned int has_dsp:1; + unsigned int has_uart0:1; + unsigned int has_uart1:1; + +@@ -43,9 +41,6 @@ struct board_info { + /* USB config */ + struct bcm63xx_usbd_platform_data usbd; + +- /* DSP config */ +- struct bcm63xx_dsp_platform_data dsp; +- + /* GPIO LEDs */ + struct gpio_led leds[5]; + +diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c +index 795caa763da3..05ed4ed411c7 100644 +--- a/arch/mips/kernel/setup.c ++++ b/arch/mips/kernel/setup.c +@@ -75,7 +75,7 @@ static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; + * mips_io_port_base is the begin of the address space to which x86 style + * I/O ports are mapped. + */ +-const unsigned long mips_io_port_base = -1; ++unsigned long mips_io_port_base = -1; + EXPORT_SYMBOL(mips_io_port_base); + + static struct resource code_resource = { .name = "Kernel code", }; +diff --git a/arch/nios2/kernel/nios2_ksyms.c b/arch/nios2/kernel/nios2_ksyms.c +index bf2f55d10a4d..4e704046a150 100644 +--- a/arch/nios2/kernel/nios2_ksyms.c ++++ b/arch/nios2/kernel/nios2_ksyms.c +@@ -9,12 +9,20 @@ + #include + #include + ++#include ++#include ++ + /* string functions */ + + EXPORT_SYMBOL(memcpy); + EXPORT_SYMBOL(memset); + EXPORT_SYMBOL(memmove); + ++/* memory management */ ++ ++EXPORT_SYMBOL(empty_zero_page); ++EXPORT_SYMBOL(flush_icache_range); ++ + /* + * libgcc functions - functions that are used internally by the + * compiler... (prototypes are not correct though, but that +@@ -31,3 +39,7 @@ DECLARE_EXPORT(__udivsi3); + DECLARE_EXPORT(__umoddi3); + DECLARE_EXPORT(__umodsi3); + DECLARE_EXPORT(__muldi3); ++DECLARE_EXPORT(__ucmpdi2); ++DECLARE_EXPORT(__lshrdi3); ++DECLARE_EXPORT(__ashldi3); ++DECLARE_EXPORT(__ashrdi3); +diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile +index 0f04c878113e..9c78ef298257 100644 +--- a/arch/powerpc/Makefile ++++ b/arch/powerpc/Makefile +@@ -385,7 +385,9 @@ vdso_install: + ifeq ($(CONFIG_PPC64),y) + $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@ + endif ++ifdef CONFIG_VDSO32 + $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso32 $@ ++endif + + archclean: + $(Q)$(MAKE) $(clean)=$(boot) +diff --git a/arch/powerpc/include/asm/archrandom.h b/arch/powerpc/include/asm/archrandom.h +index 9c63b596e6ce..a09595f00cab 100644 +--- a/arch/powerpc/include/asm/archrandom.h ++++ b/arch/powerpc/include/asm/archrandom.h +@@ -28,7 +28,7 @@ static inline int arch_get_random_seed_int(unsigned int *v) + unsigned long val; + int rc; + +- rc = arch_get_random_long(&val); ++ rc = arch_get_random_seed_long(&val); + if (rc) + *v = val; + +diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c +index a8f20e5928e1..9edb45430133 100644 +--- a/arch/powerpc/kernel/cacheinfo.c ++++ b/arch/powerpc/kernel/cacheinfo.c +@@ -865,4 +865,25 @@ void cacheinfo_cpu_offline(unsigned int cpu_id) + if (cache) + cache_cpu_clear(cache, cpu_id); + } ++ ++void cacheinfo_teardown(void) ++{ ++ unsigned int cpu; ++ ++ lockdep_assert_cpus_held(); ++ ++ for_each_online_cpu(cpu) ++ cacheinfo_cpu_offline(cpu); ++} ++ ++void cacheinfo_rebuild(void) ++{ ++ unsigned int cpu; ++ ++ lockdep_assert_cpus_held(); ++ ++ for_each_online_cpu(cpu) ++ cacheinfo_cpu_online(cpu); ++} ++ + #endif /* (CONFIG_PPC_PSERIES && CONFIG_SUSPEND) || CONFIG_HOTPLUG_CPU */ +diff --git a/arch/powerpc/kernel/cacheinfo.h b/arch/powerpc/kernel/cacheinfo.h +index 955f5e999f1b..52bd3fc6642d 100644 +--- a/arch/powerpc/kernel/cacheinfo.h ++++ b/arch/powerpc/kernel/cacheinfo.h +@@ -6,4 +6,8 @@ + extern void cacheinfo_cpu_online(unsigned int cpu_id); + extern void cacheinfo_cpu_offline(unsigned int cpu_id); + ++/* Allow migration/suspend to tear down and rebuild the hierarchy. */ ++extern void cacheinfo_teardown(void); ++extern void cacheinfo_rebuild(void); ++ + #endif /* _PPC_CACHEINFO_H */ +diff --git a/arch/powerpc/kernel/dt_cpu_ftrs.c b/arch/powerpc/kernel/dt_cpu_ftrs.c +index 2357df60de95..7ed2b1b6643c 100644 +--- a/arch/powerpc/kernel/dt_cpu_ftrs.c ++++ b/arch/powerpc/kernel/dt_cpu_ftrs.c +@@ -705,8 +705,10 @@ static bool __init cpufeatures_process_feature(struct dt_cpu_feature *f) + m = &dt_cpu_feature_match_table[i]; + if (!strcmp(f->name, m->name)) { + known = true; +- if (m->enable(f)) ++ if (m->enable(f)) { ++ cur_cpu_spec->cpu_features |= m->cpu_ftr_bit_mask; + break; ++ } + + pr_info("not enabling: %s (disabled or unsupported by kernel)\n", + f->name); +@@ -714,17 +716,12 @@ static bool __init cpufeatures_process_feature(struct dt_cpu_feature *f) + } + } + +- if (!known && enable_unknown) { +- if (!feat_try_enable_unknown(f)) { +- pr_info("not enabling: %s (unknown and unsupported by kernel)\n", +- f->name); +- return false; +- } ++ if (!known && (!enable_unknown || !feat_try_enable_unknown(f))) { ++ pr_info("not enabling: %s (unknown and unsupported by kernel)\n", ++ f->name); ++ return false; + } + +- if (m->cpu_ftr_bit_mask) +- cur_cpu_spec->cpu_features |= m->cpu_ftr_bit_mask; +- + if (known) + pr_debug("enabling: %s\n", f->name); + else +diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c +index 5e4446296021..ef6a58838e7c 100644 +--- a/arch/powerpc/kvm/book3s_64_vio.c ++++ b/arch/powerpc/kvm/book3s_64_vio.c +@@ -134,7 +134,6 @@ extern void kvm_spapr_tce_release_iommu_group(struct kvm *kvm, + continue; + + kref_put(&stit->kref, kvm_spapr_tce_liobn_put); +- return; + } + } + } +diff --git a/arch/powerpc/mm/dump_hashpagetable.c b/arch/powerpc/mm/dump_hashpagetable.c +index 5c4c93dcff19..f666d74f05f5 100644 +--- a/arch/powerpc/mm/dump_hashpagetable.c ++++ b/arch/powerpc/mm/dump_hashpagetable.c +@@ -343,7 +343,7 @@ static unsigned long hpte_find(struct pg_state *st, unsigned long ea, int psize) + + /* Look in secondary table */ + if (slot == -1) +- slot = base_hpte_find(ea, psize, true, &v, &r); ++ slot = base_hpte_find(ea, psize, false, &v, &r); + + /* No entry found */ + if (slot == -1) +diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c +index 9739a055e5f7..2d3668acb6ef 100644 +--- a/arch/powerpc/platforms/pseries/mobility.c ++++ b/arch/powerpc/platforms/pseries/mobility.c +@@ -23,6 +23,7 @@ + #include + #include + #include "pseries.h" ++#include "../../kernel/cacheinfo.h" + + static struct kobject *mobility_kobj; + +@@ -359,11 +360,20 @@ void post_mobility_fixup(void) + */ + cpus_read_lock(); + ++ /* ++ * It's common for the destination firmware to replace cache ++ * nodes. Release all of the cacheinfo hierarchy's references ++ * before updating the device tree. ++ */ ++ cacheinfo_teardown(); ++ + rc = pseries_devicetree_update(MIGRATION_SCOPE); + if (rc) + printk(KERN_ERR "Post-mobility device tree update " + "failed: %d\n", rc); + ++ cacheinfo_rebuild(); ++ + cpus_read_unlock(); + + /* Possibly switch to a new RFI flush type */ +diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug +index 6293a8768a91..bec0952c5595 100644 +--- a/arch/x86/Kconfig.debug ++++ b/arch/x86/Kconfig.debug +@@ -189,7 +189,7 @@ config HAVE_MMIOTRACE_SUPPORT + + config X86_DECODER_SELFTEST + bool "x86 instruction decoder selftest" +- depends on DEBUG_KERNEL && KPROBES ++ depends on DEBUG_KERNEL && INSTRUCTION_DECODER + depends on !COMPILE_TEST + ---help--- + Perform x86 instruction decoder selftests at build time. +diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c +index 8e36f249646e..904e18bb38c5 100644 +--- a/arch/x86/kernel/kgdb.c ++++ b/arch/x86/kernel/kgdb.c +@@ -438,7 +438,7 @@ static void kgdb_disable_hw_debug(struct pt_regs *regs) + */ + void kgdb_roundup_cpus(unsigned long flags) + { +- apic->send_IPI_allbutself(APIC_DM_NMI); ++ apic->send_IPI_allbutself(NMI_VECTOR); + } + #endif + +diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c +index 5400a24e1a8c..c5d7b4ae17ca 100644 +--- a/arch/x86/mm/tlb.c ++++ b/arch/x86/mm/tlb.c +@@ -651,9 +651,6 @@ void native_flush_tlb_others(const struct cpumask *cpumask, + * that UV should be updated so that smp_call_function_many(), + * etc, are optimal on UV. + */ +- unsigned int cpu; +- +- cpu = smp_processor_id(); + cpumask = uv_flush_tlb_others(cpumask, info); + if (cpumask) + smp_call_function_many(cpumask, flush_tlb_func_remote, +diff --git a/block/blk-merge.c b/block/blk-merge.c +index f61b50a01bc7..415b5dafd9e6 100644 +--- a/block/blk-merge.c ++++ b/block/blk-merge.c +@@ -299,13 +299,7 @@ void blk_recalc_rq_segments(struct request *rq) + + void blk_recount_segments(struct request_queue *q, struct bio *bio) + { +- unsigned short seg_cnt; +- +- /* estimate segment number by bi_vcnt for non-cloned bio */ +- if (bio_flagged(bio, BIO_CLONED)) +- seg_cnt = bio_segments(bio); +- else +- seg_cnt = bio->bi_vcnt; ++ unsigned short seg_cnt = bio_segments(bio); + + if (test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags) && + (seg_cnt < queue_max_segments(q))) +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index f8ec3d4ba4a8..a5718c0a3dc4 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -394,7 +394,7 @@ static int pcrypt_sysfs_add(struct padata_instance *pinst, const char *name) + int ret; + + pinst->kobj.kset = pcrypt_kset; +- ret = kobject_add(&pinst->kobj, NULL, name); ++ ret = kobject_add(&pinst->kobj, NULL, "%s", name); + if (!ret) + kobject_uevent(&pinst->kobj, KOBJ_ADD); + +diff --git a/crypto/tgr192.c b/crypto/tgr192.c +index 321bc6ff2a9d..904c8444aa0a 100644 +--- a/crypto/tgr192.c ++++ b/crypto/tgr192.c +@@ -25,8 +25,9 @@ + #include + #include + #include +-#include + #include ++#include ++#include + + #define TGR192_DIGEST_SIZE 24 + #define TGR160_DIGEST_SIZE 20 +@@ -468,10 +469,9 @@ static void tgr192_transform(struct tgr192_ctx *tctx, const u8 * data) + u64 a, b, c, aa, bb, cc; + u64 x[8]; + int i; +- const __le64 *ptr = (const __le64 *)data; + + for (i = 0; i < 8; i++) +- x[i] = le64_to_cpu(ptr[i]); ++ x[i] = get_unaligned_le64(data + i * sizeof(__le64)); + + /* save */ + a = aa = tctx->a; +diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c +index cda9a0b5bdaa..7473ff46de66 100644 +--- a/drivers/ata/libahci.c ++++ b/drivers/ata/libahci.c +@@ -191,7 +191,6 @@ struct ata_port_operations ahci_pmp_retry_srst_ops = { + EXPORT_SYMBOL_GPL(ahci_pmp_retry_srst_ops); + + static bool ahci_em_messages __read_mostly = true; +-EXPORT_SYMBOL_GPL(ahci_em_messages); + module_param(ahci_em_messages, bool, 0444); + /* add other LED protocol types when they become supported */ + MODULE_PARM_DESC(ahci_em_messages, +diff --git a/drivers/base/core.c b/drivers/base/core.c +index 2b0a1054535c..93c2fc58013e 100644 +--- a/drivers/base/core.c ++++ b/drivers/base/core.c +@@ -180,11 +180,20 @@ struct device_link *device_link_add(struct device *consumer, + struct device *supplier, u32 flags) + { + struct device_link *link; ++ bool rpm_put_supplier = false; + + if (!consumer || !supplier || + ((flags & DL_FLAG_STATELESS) && (flags & DL_FLAG_AUTOREMOVE))) + return NULL; + ++ if (flags & DL_FLAG_PM_RUNTIME && flags & DL_FLAG_RPM_ACTIVE) { ++ if (pm_runtime_get_sync(supplier) < 0) { ++ pm_runtime_put_noidle(supplier); ++ return NULL; ++ } ++ rpm_put_supplier = true; ++ } ++ + device_links_write_lock(); + device_pm_lock(); + +@@ -209,13 +218,8 @@ struct device_link *device_link_add(struct device *consumer, + + if (flags & DL_FLAG_PM_RUNTIME) { + if (flags & DL_FLAG_RPM_ACTIVE) { +- if (pm_runtime_get_sync(supplier) < 0) { +- pm_runtime_put_noidle(supplier); +- kfree(link); +- link = NULL; +- goto out; +- } + link->rpm_active = true; ++ rpm_put_supplier = false; + } + pm_runtime_new_link(consumer); + /* +@@ -286,6 +290,10 @@ struct device_link *device_link_add(struct device *consumer, + out: + device_pm_unlock(); + device_links_write_unlock(); ++ ++ if (rpm_put_supplier) ++ pm_runtime_put(supplier); ++ + return link; + } + EXPORT_SYMBOL_GPL(device_link_add); +diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c +index df53e2b3296b..877b2a1767a5 100644 +--- a/drivers/base/power/wakeup.c ++++ b/drivers/base/power/wakeup.c +@@ -877,7 +877,7 @@ EXPORT_SYMBOL_GPL(pm_system_wakeup); + + void pm_system_cancel_wakeup(void) + { +- atomic_dec(&pm_abort_suspend); ++ atomic_dec_if_positive(&pm_abort_suspend); + } + + void pm_wakeup_clear(bool reset) +diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c +index f499a469e66d..12b2cc9a3fbe 100644 +--- a/drivers/bcma/driver_pci.c ++++ b/drivers/bcma/driver_pci.c +@@ -78,7 +78,7 @@ static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u16 device, u8 address) + v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); + } + +- v = BCMA_CORE_PCI_MDIODATA_START; ++ v |= BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_READ; + v |= BCMA_CORE_PCI_MDIODATA_TA; + +@@ -121,7 +121,7 @@ static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u16 device, + v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); + } + +- v = BCMA_CORE_PCI_MDIODATA_START; ++ v |= BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_WRITE; + v |= BCMA_CORE_PCI_MDIODATA_TA; + v |= data; +diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c +index 7ea13b5497fd..b998e3abca7a 100644 +--- a/drivers/block/drbd/drbd_main.c ++++ b/drivers/block/drbd/drbd_main.c +@@ -334,6 +334,8 @@ static int drbd_thread_setup(void *arg) + thi->name[0], + resource->name); + ++ allow_kernel_signal(DRBD_SIGKILL); ++ allow_kernel_signal(SIGXCPU); + restart: + retval = thi->function(thi); + +diff --git a/drivers/clk/clk-highbank.c b/drivers/clk/clk-highbank.c +index 727ed8e1bb72..8e4581004695 100644 +--- a/drivers/clk/clk-highbank.c ++++ b/drivers/clk/clk-highbank.c +@@ -293,6 +293,7 @@ static __init struct clk *hb_clk_init(struct device_node *node, const struct clk + /* Map system registers */ + srnp = of_find_compatible_node(NULL, NULL, "calxeda,hb-sregs"); + hb_clk->reg = of_iomap(srnp, 0); ++ of_node_put(srnp); + BUG_ON(!hb_clk->reg); + hb_clk->reg += reg; + +diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c +index 1a292519d84f..999a90a16609 100644 +--- a/drivers/clk/clk-qoriq.c ++++ b/drivers/clk/clk-qoriq.c +@@ -1382,6 +1382,7 @@ static void __init clockgen_init(struct device_node *np) + pr_err("%s: Couldn't map %pOF regs\n", __func__, + guts); + } ++ of_node_put(guts); + } + + } +diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c +index 8eb93eb2f857..e0547654cb7b 100644 +--- a/drivers/clk/imx/clk-imx6q.c ++++ b/drivers/clk/imx/clk-imx6q.c +@@ -431,6 +431,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop"); + anatop_base = base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + /* Audio/video PLL post dividers do not work on i.MX6q revision 1.0 */ + if (clk_on_imx6q() && imx_get_soc_revision() == IMX_CHIP_REVISION_1_0) { +diff --git a/drivers/clk/imx/clk-imx6sx.c b/drivers/clk/imx/clk-imx6sx.c +index e6d389e333d7..baa07553a0dd 100644 +--- a/drivers/clk/imx/clk-imx6sx.c ++++ b/drivers/clk/imx/clk-imx6sx.c +@@ -164,6 +164,7 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + clks[IMX6SX_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); + clks[IMX6SX_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); +diff --git a/drivers/clk/imx/clk-imx7d.c b/drivers/clk/imx/clk-imx7d.c +index 0ac9b30c8b90..9f5e5b9d4a25 100644 +--- a/drivers/clk/imx/clk-imx7d.c ++++ b/drivers/clk/imx/clk-imx7d.c +@@ -416,6 +416,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + clks[IMX7D_PLL_ARM_MAIN_SRC] = imx_clk_mux("pll_arm_main_src", base + 0x60, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); + clks[IMX7D_PLL_DRAM_MAIN_SRC] = imx_clk_mux("pll_dram_main_src", base + 0x70, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); +diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c +index 6dae54325a91..a334667c450a 100644 +--- a/drivers/clk/imx/clk-vf610.c ++++ b/drivers/clk/imx/clk-vf610.c +@@ -203,6 +203,7 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,vf610-anatop"); + anatop_base = of_iomap(np, 0); + BUG_ON(!anatop_base); ++ of_node_put(np); + + np = ccm_node; + ccm_base = of_iomap(np, 0); +diff --git a/drivers/clk/mvebu/armada-370.c b/drivers/clk/mvebu/armada-370.c +index 2c7c1085f883..8fdfa97900cd 100644 +--- a/drivers/clk/mvebu/armada-370.c ++++ b/drivers/clk/mvebu/armada-370.c +@@ -177,8 +177,10 @@ static void __init a370_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &a370_coreclks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, a370_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(a370_clk, "marvell,armada-370-core-clock", a370_clk_init); + +diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c +index 0ec44ae9a2a2..df529982adc9 100644 +--- a/drivers/clk/mvebu/armada-xp.c ++++ b/drivers/clk/mvebu/armada-xp.c +@@ -228,7 +228,9 @@ static void __init axp_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &axp_coreclks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, axp_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); +diff --git a/drivers/clk/mvebu/dove.c b/drivers/clk/mvebu/dove.c +index 59fad9546c84..5f258c9bb68b 100644 +--- a/drivers/clk/mvebu/dove.c ++++ b/drivers/clk/mvebu/dove.c +@@ -190,10 +190,14 @@ static void __init dove_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &dove_coreclks); + +- if (ddnp) ++ if (ddnp) { + dove_divider_clk_init(ddnp); ++ of_node_put(ddnp); ++ } + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, dove_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(dove_clk, "marvell,dove-core-clock", dove_clk_init); +diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c +index a2a8d614039d..890ebf623261 100644 +--- a/drivers/clk/mvebu/kirkwood.c ++++ b/drivers/clk/mvebu/kirkwood.c +@@ -333,6 +333,8 @@ static void __init kirkwood_clk_init(struct device_node *np) + if (cgnp) { + mvebu_clk_gating_setup(cgnp, kirkwood_gating_desc); + kirkwood_clk_muxing_setup(cgnp, kirkwood_mux_desc); ++ ++ of_node_put(cgnp); + } + } + CLK_OF_DECLARE(kirkwood_clk, "marvell,kirkwood-core-clock", +diff --git a/drivers/clk/mvebu/mv98dx3236.c b/drivers/clk/mvebu/mv98dx3236.c +index 6e203af73cac..c8a0d03d2cd6 100644 +--- a/drivers/clk/mvebu/mv98dx3236.c ++++ b/drivers/clk/mvebu/mv98dx3236.c +@@ -174,7 +174,9 @@ static void __init mv98dx3236_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &mv98dx3236_core_clocks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, mv98dx3236_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(mv98dx3236_clk, "marvell,mv98dx3236-core-clock", mv98dx3236_clk_init); +diff --git a/drivers/clk/qcom/gcc-msm8996.c b/drivers/clk/qcom/gcc-msm8996.c +index 7ddec886fcd3..c0b043b1bd24 100644 +--- a/drivers/clk/qcom/gcc-msm8996.c ++++ b/drivers/clk/qcom/gcc-msm8996.c +@@ -140,22 +140,6 @@ static const char * const gcc_xo_gpll0_gpll4_gpll0_early_div[] = { + "gpll0_early_div" + }; + +-static const struct parent_map gcc_xo_gpll0_gpll2_gpll3_gpll0_early_div_map[] = { +- { P_XO, 0 }, +- { P_GPLL0, 1 }, +- { P_GPLL2, 2 }, +- { P_GPLL3, 3 }, +- { P_GPLL0_EARLY_DIV, 6 } +-}; +- +-static const char * const gcc_xo_gpll0_gpll2_gpll3_gpll0_early_div[] = { +- "xo", +- "gpll0", +- "gpll2", +- "gpll3", +- "gpll0_early_div" +-}; +- + static const struct parent_map gcc_xo_gpll0_gpll1_early_div_gpll1_gpll4_gpll0_early_div_map[] = { + { P_XO, 0 }, + { P_GPLL0, 1 }, +@@ -194,26 +178,6 @@ static const char * const gcc_xo_gpll0_gpll2_gpll3_gpll1_gpll2_early_gpll0_early + "gpll0_early_div" + }; + +-static const struct parent_map gcc_xo_gpll0_gpll2_gpll3_gpll1_gpll4_gpll0_early_div_map[] = { +- { P_XO, 0 }, +- { P_GPLL0, 1 }, +- { P_GPLL2, 2 }, +- { P_GPLL3, 3 }, +- { P_GPLL1, 4 }, +- { P_GPLL4, 5 }, +- { P_GPLL0_EARLY_DIV, 6 } +-}; +- +-static const char * const gcc_xo_gpll0_gpll2_gpll3_gpll1_gpll4_gpll0_early_div[] = { +- "xo", +- "gpll0", +- "gpll2", +- "gpll3", +- "gpll1", +- "gpll4", +- "gpll0_early_div" +-}; +- + static struct clk_fixed_factor xo = { + .mult = 1, + .div = 1, +diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c +index d8d3cb67b402..3d3026221927 100644 +--- a/drivers/clk/samsung/clk-exynos4.c ++++ b/drivers/clk/samsung/clk-exynos4.c +@@ -1240,6 +1240,7 @@ static unsigned long __init exynos4_get_xom(void) + xom = readl(chipid_base + 8); + + iounmap(chipid_base); ++ of_node_put(np); + } + + return xom; +diff --git a/drivers/clk/socfpga/clk-pll-a10.c b/drivers/clk/socfpga/clk-pll-a10.c +index 35fabe1a32c3..269467e8e07e 100644 +--- a/drivers/clk/socfpga/clk-pll-a10.c ++++ b/drivers/clk/socfpga/clk-pll-a10.c +@@ -95,6 +95,7 @@ static struct clk * __init __socfpga_pll_init(struct device_node *node, + + clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_a10_base_addr = of_iomap(clkmgr_np, 0); ++ of_node_put(clkmgr_np); + BUG_ON(!clk_mgr_a10_base_addr); + pll_clk->hw.reg = clk_mgr_a10_base_addr + reg; + +diff --git a/drivers/clk/socfpga/clk-pll.c b/drivers/clk/socfpga/clk-pll.c +index c7f463172e4b..b4b44e9b5901 100644 +--- a/drivers/clk/socfpga/clk-pll.c ++++ b/drivers/clk/socfpga/clk-pll.c +@@ -100,6 +100,7 @@ static __init struct clk *__socfpga_pll_init(struct device_node *node, + + clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_base_addr = of_iomap(clkmgr_np, 0); ++ of_node_put(clkmgr_np); + BUG_ON(!clk_mgr_base_addr); + pll_clk->hw.reg = clk_mgr_base_addr + reg; + +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a23.c b/drivers/clk/sunxi-ng/ccu-sun8i-a23.c +index d93b452f0df9..1cef040ebe82 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-a23.c ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-a23.c +@@ -132,7 +132,7 @@ static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_mipi_clk, "pll-mipi", + 8, 4, /* N */ + 4, 2, /* K */ + 0, 4, /* M */ +- BIT(31), /* gate */ ++ BIT(31) | BIT(23) | BIT(22), /* gate */ + BIT(28), /* lock */ + CLK_SET_RATE_UNGATE); + +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +index 9e3f4088724b..c7f9d974b10d 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +@@ -84,7 +84,7 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve", + BIT(28), /* lock */ + 0); + +-static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_ddr_clk, "pll-ddr", ++static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_ddr0_clk, "pll-ddr0", + "osc24M", 0x020, + 8, 5, /* N */ + 4, 2, /* K */ +@@ -123,6 +123,14 @@ static SUNXI_CCU_NK_WITH_GATE_LOCK_POSTDIV(pll_periph1_clk, "pll-periph1", + 2, /* post-div */ + 0); + ++static SUNXI_CCU_NM_WITH_GATE_LOCK(pll_ddr1_clk, "pll-ddr1", ++ "osc24M", 0x04c, ++ 8, 7, /* N */ ++ 0, 2, /* M */ ++ BIT(31), /* gate */ ++ BIT(28), /* lock */ ++ 0); ++ + static const char * const cpu_parents[] = { "osc32k", "osc24M", + "pll-cpu", "pll-cpu" }; + static SUNXI_CCU_MUX(cpu_clk, "cpu", cpu_parents, +@@ -310,7 +318,8 @@ static SUNXI_CCU_GATE(usb_phy0_clk, "usb-phy0", "osc24M", + static SUNXI_CCU_GATE(usb_ohci0_clk, "usb-ohci0", "osc24M", + 0x0cc, BIT(16), 0); + +-static const char * const dram_parents[] = { "pll-ddr", "pll-periph0-2x" }; ++static const char * const dram_parents[] = { "pll-ddr0", "pll-ddr1", ++ "pll-periph0-2x" }; + static SUNXI_CCU_M_WITH_MUX(dram_clk, "dram", dram_parents, + 0x0f4, 0, 4, 20, 2, CLK_IS_CRITICAL); + +@@ -369,10 +378,11 @@ static struct ccu_common *sun8i_v3s_ccu_clks[] = { + &pll_audio_base_clk.common, + &pll_video_clk.common, + &pll_ve_clk.common, +- &pll_ddr_clk.common, ++ &pll_ddr0_clk.common, + &pll_periph0_clk.common, + &pll_isp_clk.common, + &pll_periph1_clk.common, ++ &pll_ddr1_clk.common, + &cpu_clk.common, + &axi_clk.common, + &ahb1_clk.common, +@@ -457,11 +467,12 @@ static struct clk_hw_onecell_data sun8i_v3s_hw_clks = { + [CLK_PLL_AUDIO_8X] = &pll_audio_8x_clk.hw, + [CLK_PLL_VIDEO] = &pll_video_clk.common.hw, + [CLK_PLL_VE] = &pll_ve_clk.common.hw, +- [CLK_PLL_DDR] = &pll_ddr_clk.common.hw, ++ [CLK_PLL_DDR0] = &pll_ddr0_clk.common.hw, + [CLK_PLL_PERIPH0] = &pll_periph0_clk.common.hw, + [CLK_PLL_PERIPH0_2X] = &pll_periph0_2x_clk.hw, + [CLK_PLL_ISP] = &pll_isp_clk.common.hw, + [CLK_PLL_PERIPH1] = &pll_periph1_clk.common.hw, ++ [CLK_PLL_DDR1] = &pll_ddr1_clk.common.hw, + [CLK_CPU] = &cpu_clk.common.hw, + [CLK_AXI] = &axi_clk.common.hw, + [CLK_AHB1] = &ahb1_clk.common.hw, +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h +index 4a4d36fdad96..a091b7217dfd 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h +@@ -29,7 +29,7 @@ + #define CLK_PLL_AUDIO_8X 5 + #define CLK_PLL_VIDEO 6 + #define CLK_PLL_VE 7 +-#define CLK_PLL_DDR 8 ++#define CLK_PLL_DDR0 8 + #define CLK_PLL_PERIPH0 9 + #define CLK_PLL_PERIPH0_2X 10 + #define CLK_PLL_ISP 11 +@@ -58,6 +58,8 @@ + + /* And the GPU module clock is exported */ + +-#define CLK_NUMBER (CLK_MIPI_CSI + 1) ++#define CLK_PLL_DDR1 74 ++ ++#define CLK_NUMBER (CLK_PLL_DDR1 + 1) + + #endif /* _CCU_SUN8I_H3_H_ */ +diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c +index aaf5bfa9bd9c..e3ae041ac30e 100644 +--- a/drivers/clocksource/exynos_mct.c ++++ b/drivers/clocksource/exynos_mct.c +@@ -563,7 +563,19 @@ static int __init exynos4_timer_resources(struct device_node *np, void __iomem * + return 0; + + out_irq: +- free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick); ++ if (mct_int_type == MCT_INT_PPI) { ++ free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick); ++ } else { ++ for_each_possible_cpu(cpu) { ++ struct mct_clock_event_device *pcpu_mevt = ++ per_cpu_ptr(&percpu_mct_tick, cpu); ++ ++ if (pcpu_mevt->evt.irq != -1) { ++ free_irq(pcpu_mevt->evt.irq, pcpu_mevt); ++ pcpu_mevt->evt.irq = -1; ++ } ++ } ++ } + return err; + } + +diff --git a/drivers/clocksource/timer-sun5i.c b/drivers/clocksource/timer-sun5i.c +index 2a3fe83ec337..6f4a9a8faccc 100644 +--- a/drivers/clocksource/timer-sun5i.c ++++ b/drivers/clocksource/timer-sun5i.c +@@ -202,6 +202,11 @@ static int __init sun5i_setup_clocksource(struct device_node *node, + } + + rate = clk_get_rate(clk); ++ if (!rate) { ++ pr_err("Couldn't get parent clock rate\n"); ++ ret = -EINVAL; ++ goto err_disable_clk; ++ } + + cs->timer.base = base; + cs->timer.clk = clk; +@@ -275,6 +280,11 @@ static int __init sun5i_setup_clockevent(struct device_node *node, void __iomem + } + + rate = clk_get_rate(clk); ++ if (!rate) { ++ pr_err("Couldn't get parent clock rate\n"); ++ ret = -EINVAL; ++ goto err_disable_clk; ++ } + + ce->timer.base = base; + ce->timer.ticks_per_jiffy = DIV_ROUND_UP(rate, HZ); +diff --git a/drivers/cpufreq/brcmstb-avs-cpufreq.c b/drivers/cpufreq/brcmstb-avs-cpufreq.c +index 7281a2c19c36..39c462711eae 100644 +--- a/drivers/cpufreq/brcmstb-avs-cpufreq.c ++++ b/drivers/cpufreq/brcmstb-avs-cpufreq.c +@@ -468,12 +468,12 @@ static int brcm_avs_set_pstate(struct private_data *priv, unsigned int pstate) + return __issue_avs_command(priv, AVS_CMD_SET_PSTATE, true, args); + } + +-static unsigned long brcm_avs_get_voltage(void __iomem *base) ++static u32 brcm_avs_get_voltage(void __iomem *base) + { + return readl(base + AVS_MBOX_VOLTAGE1); + } + +-static unsigned long brcm_avs_get_frequency(void __iomem *base) ++static u32 brcm_avs_get_frequency(void __iomem *base) + { + return readl(base + AVS_MBOX_FREQUENCY) * 1000; /* in kHz */ + } +@@ -762,8 +762,8 @@ static bool brcm_avs_is_firmware_loaded(struct private_data *priv) + rc = brcm_avs_get_pmap(priv, NULL); + magic = readl(priv->base + AVS_MBOX_MAGIC); + +- return (magic == AVS_FIRMWARE_MAGIC) && (rc != -ENOTSUPP) && +- (rc != -EINVAL); ++ return (magic == AVS_FIRMWARE_MAGIC) && ((rc != -ENOTSUPP) || ++ (rc != -EINVAL)); + } + + static unsigned int brcm_avs_cpufreq_get(unsigned int cpu) +@@ -973,14 +973,14 @@ static ssize_t show_brcm_avs_voltage(struct cpufreq_policy *policy, char *buf) + { + struct private_data *priv = policy->driver_data; + +- return sprintf(buf, "0x%08lx\n", brcm_avs_get_voltage(priv->base)); ++ return sprintf(buf, "0x%08x\n", brcm_avs_get_voltage(priv->base)); + } + + static ssize_t show_brcm_avs_frequency(struct cpufreq_policy *policy, char *buf) + { + struct private_data *priv = policy->driver_data; + +- return sprintf(buf, "0x%08lx\n", brcm_avs_get_frequency(priv->base)); ++ return sprintf(buf, "0x%08x\n", brcm_avs_get_frequency(priv->base)); + } + + cpufreq_freq_attr_ro(brcm_avs_pstate); +diff --git a/drivers/crypto/amcc/crypto4xx_trng.h b/drivers/crypto/amcc/crypto4xx_trng.h +index 931d22531f51..7bbda51b7337 100644 +--- a/drivers/crypto/amcc/crypto4xx_trng.h ++++ b/drivers/crypto/amcc/crypto4xx_trng.h +@@ -26,9 +26,9 @@ void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev); + void ppc4xx_trng_remove(struct crypto4xx_core_device *core_dev); + #else + static inline void ppc4xx_trng_probe( +- struct crypto4xx_device *dev __maybe_unused) { } ++ struct crypto4xx_core_device *dev __maybe_unused) { } + static inline void ppc4xx_trng_remove( +- struct crypto4xx_device *dev __maybe_unused) { } ++ struct crypto4xx_core_device *dev __maybe_unused) { } + #endif + + #endif +diff --git a/drivers/crypto/bcm/cipher.c b/drivers/crypto/bcm/cipher.c +index 84422435f39b..279e907590e9 100644 +--- a/drivers/crypto/bcm/cipher.c ++++ b/drivers/crypto/bcm/cipher.c +@@ -718,7 +718,7 @@ static int handle_ahash_req(struct iproc_reqctx_s *rctx) + */ + unsigned int new_data_len; + +- unsigned int chunk_start = 0; ++ unsigned int __maybe_unused chunk_start = 0; + u32 db_size; /* Length of data field, incl gcm and hash padding */ + int pad_len = 0; /* total pad len, including gcm, hash, stat padding */ + u32 data_pad_len = 0; /* length of GCM/CCM padding */ +@@ -1676,8 +1676,6 @@ static void spu_rx_callback(struct mbox_client *cl, void *msg) + struct spu_hw *spu = &iproc_priv.spu; + struct brcm_message *mssg = msg; + struct iproc_reqctx_s *rctx; +- struct iproc_ctx_s *ctx; +- struct crypto_async_request *areq; + int err = 0; + + rctx = mssg->ctx; +@@ -1687,8 +1685,6 @@ static void spu_rx_callback(struct mbox_client *cl, void *msg) + err = -EFAULT; + goto cb_finish; + } +- areq = rctx->parent; +- ctx = rctx->ctx; + + /* process the SPU status */ + err = spu->spu_status_process(rctx->msg_buf.rx_stat); +diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c +index fde07d4ff019..ff6718a11e9e 100644 +--- a/drivers/crypto/caam/caamrng.c ++++ b/drivers/crypto/caam/caamrng.c +@@ -353,7 +353,10 @@ static int __init caam_rng_init(void) + goto free_rng_ctx; + + dev_info(dev, "registering rng-caam\n"); +- return hwrng_register(&caam_rng); ++ ++ err = hwrng_register(&caam_rng); ++ if (!err) ++ return err; + + free_rng_ctx: + kfree(rng_ctx); +diff --git a/drivers/crypto/caam/error.c b/drivers/crypto/caam/error.c +index 8da88beb1abb..832ba2afdcd5 100644 +--- a/drivers/crypto/caam/error.c ++++ b/drivers/crypto/caam/error.c +@@ -22,7 +22,7 @@ void caam_dump_sg(const char *level, const char *prefix_str, int prefix_type, + size_t len; + void *buf; + +- for (it = sg; it && tlen > 0 ; it = sg_next(sg)) { ++ for (it = sg; it && tlen > 0 ; it = sg_next(it)) { + /* + * make sure the scatterlist's page + * has a valid virtual memory mapping +diff --git a/drivers/crypto/ccp/ccp-crypto-aes.c b/drivers/crypto/ccp/ccp-crypto-aes.c +index 89291c15015c..3f768699332b 100644 +--- a/drivers/crypto/ccp/ccp-crypto-aes.c ++++ b/drivers/crypto/ccp/ccp-crypto-aes.c +@@ -1,7 +1,8 @@ ++// SPDX-License-Identifier: GPL-2.0 + /* + * AMD Cryptographic Coprocessor (CCP) AES crypto API support + * +- * Copyright (C) 2013,2016 Advanced Micro Devices, Inc. ++ * Copyright (C) 2013-2019 Advanced Micro Devices, Inc. + * + * Author: Tom Lendacky + * +@@ -79,8 +80,7 @@ static int ccp_aes_crypt(struct ablkcipher_request *req, bool encrypt) + return -EINVAL; + + if (((ctx->u.aes.mode == CCP_AES_MODE_ECB) || +- (ctx->u.aes.mode == CCP_AES_MODE_CBC) || +- (ctx->u.aes.mode == CCP_AES_MODE_CFB)) && ++ (ctx->u.aes.mode == CCP_AES_MODE_CBC)) && + (req->nbytes & (AES_BLOCK_SIZE - 1))) + return -EINVAL; + +@@ -291,7 +291,7 @@ static struct ccp_aes_def aes_algs[] = { + .version = CCP_VERSION(3, 0), + .name = "cfb(aes)", + .driver_name = "cfb-aes-ccp", +- .blocksize = AES_BLOCK_SIZE, ++ .blocksize = 1, + .ivsize = AES_BLOCK_SIZE, + .alg_defaults = &ccp_aes_defaults, + }, +diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c +index 1e2e42106dee..330853a2702f 100644 +--- a/drivers/crypto/ccp/ccp-ops.c ++++ b/drivers/crypto/ccp/ccp-ops.c +@@ -458,8 +458,8 @@ static int ccp_copy_from_sb(struct ccp_cmd_queue *cmd_q, + return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, true); + } + +-static int ccp_run_aes_cmac_cmd(struct ccp_cmd_queue *cmd_q, +- struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_aes_cmac_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_aes_engine *aes = &cmd->u.aes; + struct ccp_dm_workarea key, ctx; +@@ -614,8 +614,8 @@ e_key: + return ret; + } + +-static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, +- struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_aes_engine *aes = &cmd->u.aes; + struct ccp_dm_workarea key, ctx, final_wa, tag; +@@ -897,7 +897,8 @@ e_key: + return ret; + } + +-static int ccp_run_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_aes_engine *aes = &cmd->u.aes; + struct ccp_dm_workarea key, ctx; +@@ -907,12 +908,6 @@ static int ccp_run_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + bool in_place = false; + int ret; + +- if (aes->mode == CCP_AES_MODE_CMAC) +- return ccp_run_aes_cmac_cmd(cmd_q, cmd); +- +- if (aes->mode == CCP_AES_MODE_GCM) +- return ccp_run_aes_gcm_cmd(cmd_q, cmd); +- + if (!((aes->key_len == AES_KEYSIZE_128) || + (aes->key_len == AES_KEYSIZE_192) || + (aes->key_len == AES_KEYSIZE_256))) +@@ -1080,8 +1075,8 @@ e_key: + return ret; + } + +-static int ccp_run_xts_aes_cmd(struct ccp_cmd_queue *cmd_q, +- struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_xts_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_xts_aes_engine *xts = &cmd->u.xts; + struct ccp_dm_workarea key, ctx; +@@ -1280,7 +1275,8 @@ e_key: + return ret; + } + +-static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_des3_engine *des3 = &cmd->u.des3; + +@@ -1293,6 +1289,9 @@ static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + int ret; + + /* Error checks */ ++ if (cmd_q->ccp->vdata->version < CCP_VERSION(5, 0)) ++ return -EINVAL; ++ + if (!cmd_q->ccp->vdata->perform->des3) + return -EINVAL; + +@@ -1375,8 +1374,6 @@ static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + * passthru option to convert from big endian to little endian. + */ + if (des3->mode != CCP_DES3_MODE_ECB) { +- u32 load_mode; +- + op.sb_ctx = cmd_q->sb_ctx; + + ret = ccp_init_dm_workarea(&ctx, cmd_q, +@@ -1392,12 +1389,8 @@ static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + if (ret) + goto e_ctx; + +- if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0)) +- load_mode = CCP_PASSTHRU_BYTESWAP_NOOP; +- else +- load_mode = CCP_PASSTHRU_BYTESWAP_256BIT; + ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx, +- load_mode); ++ CCP_PASSTHRU_BYTESWAP_256BIT); + if (ret) { + cmd->engine_error = cmd_q->cmd_error; + goto e_ctx; +@@ -1459,10 +1452,6 @@ static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + } + + /* ...but we only need the last DES3_EDE_BLOCK_SIZE bytes */ +- if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0)) +- dm_offset = CCP_SB_BYTES - des3->iv_len; +- else +- dm_offset = 0; + ccp_get_dm_area(&ctx, dm_offset, des3->iv, 0, + DES3_EDE_BLOCK_SIZE); + } +@@ -1483,7 +1472,8 @@ e_key: + return ret; + } + +-static int ccp_run_sha_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_sha_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_sha_engine *sha = &cmd->u.sha; + struct ccp_dm_workarea ctx; +@@ -1827,7 +1817,8 @@ e_ctx: + return ret; + } + +-static int ccp_run_rsa_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_rsa_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_rsa_engine *rsa = &cmd->u.rsa; + struct ccp_dm_workarea exp, src, dst; +@@ -1958,8 +1949,8 @@ e_sb: + return ret; + } + +-static int ccp_run_passthru_cmd(struct ccp_cmd_queue *cmd_q, +- struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_passthru_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_passthru_engine *pt = &cmd->u.passthru; + struct ccp_dm_workarea mask; +@@ -2090,7 +2081,8 @@ e_mask: + return ret; + } + +-static int ccp_run_passthru_nomap_cmd(struct ccp_cmd_queue *cmd_q, ++static noinline_for_stack int ++ccp_run_passthru_nomap_cmd(struct ccp_cmd_queue *cmd_q, + struct ccp_cmd *cmd) + { + struct ccp_passthru_nomap_engine *pt = &cmd->u.passthru_nomap; +@@ -2431,7 +2423,8 @@ e_src: + return ret; + } + +-static int ccp_run_ecc_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) ++static noinline_for_stack int ++ccp_run_ecc_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + { + struct ccp_ecc_engine *ecc = &cmd->u.ecc; + +@@ -2468,7 +2461,17 @@ int ccp_run_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) + + switch (cmd->engine) { + case CCP_ENGINE_AES: +- ret = ccp_run_aes_cmd(cmd_q, cmd); ++ switch (cmd->u.aes.mode) { ++ case CCP_AES_MODE_CMAC: ++ ret = ccp_run_aes_cmac_cmd(cmd_q, cmd); ++ break; ++ case CCP_AES_MODE_GCM: ++ ret = ccp_run_aes_gcm_cmd(cmd_q, cmd); ++ break; ++ default: ++ ret = ccp_run_aes_cmd(cmd_q, cmd); ++ break; ++ } + break; + case CCP_ENGINE_XTS_AES_128: + ret = ccp_run_xts_aes_cmd(cmd_q, cmd); +diff --git a/drivers/crypto/sunxi-ss/sun4i-ss-hash.c b/drivers/crypto/sunxi-ss/sun4i-ss-hash.c +index 1a724263761b..2d178e013535 100644 +--- a/drivers/crypto/sunxi-ss/sun4i-ss-hash.c ++++ b/drivers/crypto/sunxi-ss/sun4i-ss-hash.c +@@ -179,7 +179,7 @@ static int sun4i_hash(struct ahash_request *areq) + */ + unsigned int i = 0, end, fill, min_fill, nwait, nbw = 0, j = 0, todo; + unsigned int in_i = 0; +- u32 spaces, rx_cnt = SS_RX_DEFAULT, bf[32] = {0}, wb = 0, v, ivmode = 0; ++ u32 spaces, rx_cnt = SS_RX_DEFAULT, bf[32] = {0}, v, ivmode = 0; + struct sun4i_req_ctx *op = ahash_request_ctx(areq); + struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); + struct sun4i_tfm_ctx *tfmctx = crypto_ahash_ctx(tfm); +@@ -188,6 +188,7 @@ static int sun4i_hash(struct ahash_request *areq) + struct sg_mapping_iter mi; + int in_r, err = 0; + size_t copied = 0; ++ __le32 wb = 0; + + dev_dbg(ss->dev, "%s %s bc=%llu len=%u mode=%x wl=%u h0=%0x", + __func__, crypto_tfm_alg_name(areq->base.tfm), +@@ -399,7 +400,7 @@ hash_final: + + nbw = op->len - 4 * nwait; + if (nbw) { +- wb = *(u32 *)(op->buf + nwait * 4); ++ wb = cpu_to_le32(*(u32 *)(op->buf + nwait * 4)); + wb &= GENMASK((nbw * 8) - 1, 0); + + op->byte_count += nbw; +@@ -408,7 +409,7 @@ hash_final: + + /* write the remaining bytes of the nbw buffer */ + wb |= ((1 << 7) << (nbw * 8)); +- bf[j++] = wb; ++ bf[j++] = le32_to_cpu(wb); + + /* + * number of space to pad to obtain 64o minus 8(size) minus 4 (final 1) +@@ -427,13 +428,13 @@ hash_final: + + /* write the length of data */ + if (op->mode == SS_OP_SHA1) { +- __be64 bits = cpu_to_be64(op->byte_count << 3); +- bf[j++] = lower_32_bits(bits); +- bf[j++] = upper_32_bits(bits); ++ __be64 *bits = (__be64 *)&bf[j]; ++ *bits = cpu_to_be64(op->byte_count << 3); ++ j += 2; + } else { +- __le64 bits = op->byte_count << 3; +- bf[j++] = lower_32_bits(bits); +- bf[j++] = upper_32_bits(bits); ++ __le64 *bits = (__le64 *)&bf[j]; ++ *bits = cpu_to_le64(op->byte_count << 3); ++ j += 2; + } + writesl(ss->base + SS_RXFIFO, bf, j); + +@@ -475,7 +476,7 @@ hash_final: + } + } else { + for (i = 0; i < 4; i++) { +- v = readl(ss->base + SS_MD0 + i * 4); ++ v = cpu_to_le32(readl(ss->base + SS_MD0 + i * 4)); + memcpy(areq->result + i * 4, &v, 4); + } + } +diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c +index 7f0b9aa15867..9887f2a14aa9 100644 +--- a/drivers/dma/dma-axi-dmac.c ++++ b/drivers/dma/dma-axi-dmac.c +@@ -451,7 +451,7 @@ static struct dma_async_tx_descriptor *axi_dmac_prep_interleaved( + + if (chan->hw_2d) { + if (!axi_dmac_check_len(chan, xt->sgl[0].size) || +- !axi_dmac_check_len(chan, xt->numf)) ++ xt->numf == 0) + return NULL; + if (xt->sgl[0].size + dst_icg > chan->max_length || + xt->sgl[0].size + src_icg > chan->max_length) +diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c +index 46a519e07195..b408c07662f5 100644 +--- a/drivers/dma/dw/platform.c ++++ b/drivers/dma/dw/platform.c +@@ -87,13 +87,20 @@ static void dw_dma_acpi_controller_register(struct dw_dma *dw) + dma_cap_set(DMA_SLAVE, info->dma_cap); + info->filter_fn = dw_dma_acpi_filter; + +- ret = devm_acpi_dma_controller_register(dev, acpi_dma_simple_xlate, +- info); ++ ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info); + if (ret) + dev_err(dev, "could not register acpi_dma_controller\n"); + } ++ ++static void dw_dma_acpi_controller_free(struct dw_dma *dw) ++{ ++ struct device *dev = dw->dma.dev; ++ ++ acpi_dma_controller_free(dev); ++} + #else /* !CONFIG_ACPI */ + static inline void dw_dma_acpi_controller_register(struct dw_dma *dw) {} ++static inline void dw_dma_acpi_controller_free(struct dw_dma *dw) {} + #endif /* !CONFIG_ACPI */ + + #ifdef CONFIG_OF +@@ -249,6 +256,9 @@ static int dw_remove(struct platform_device *pdev) + { + struct dw_dma_chip *chip = platform_get_drvdata(pdev); + ++ if (ACPI_HANDLE(&pdev->dev)) ++ dw_dma_acpi_controller_free(chip->dw); ++ + if (pdev->dev.of_node) + of_dma_controller_free(pdev->dev.of_node); + +diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c +index 519c24465dea..57a49fe713fd 100644 +--- a/drivers/dma/edma.c ++++ b/drivers/dma/edma.c +@@ -2340,8 +2340,10 @@ static int edma_probe(struct platform_device *pdev) + + ecc->tc_list = devm_kcalloc(dev, ecc->num_tc, + sizeof(*ecc->tc_list), GFP_KERNEL); +- if (!ecc->tc_list) +- return -ENOMEM; ++ if (!ecc->tc_list) { ++ ret = -ENOMEM; ++ goto err_reg1; ++ } + + for (i = 0;; i++) { + ret = of_parse_phandle_with_fixed_args(node, "ti,tptcs", +diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c +index 29d04ca71d52..15525a2b8ebd 100644 +--- a/drivers/dma/hsu/hsu.c ++++ b/drivers/dma/hsu/hsu.c +@@ -64,10 +64,10 @@ static void hsu_dma_chan_start(struct hsu_dma_chan *hsuc) + + if (hsuc->direction == DMA_MEM_TO_DEV) { + bsr = config->dst_maxburst; +- mtsr = config->src_addr_width; ++ mtsr = config->dst_addr_width; + } else if (hsuc->direction == DMA_DEV_TO_MEM) { + bsr = config->src_maxburst; +- mtsr = config->dst_addr_width; ++ mtsr = config->src_addr_width; + } + + hsu_chan_disable(hsuc); +diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c +index 0fc12a8783e3..99f3f22ed647 100644 +--- a/drivers/dma/imx-sdma.c ++++ b/drivers/dma/imx-sdma.c +@@ -1441,6 +1441,14 @@ static void sdma_add_scripts(struct sdma_engine *sdma, + if (!sdma->script_number) + sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; + ++ if (sdma->script_number > sizeof(struct sdma_script_start_addrs) ++ / sizeof(s32)) { ++ dev_err(sdma->dev, ++ "SDMA script number %d not match with firmware.\n", ++ sdma->script_number); ++ return; ++ } ++ + for (i = 0; i < sdma->script_number; i++) + if (addr_arr[i] > 0) + saddr_arr[i] = addr_arr[i]; +diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c +index 1993889003fd..1c57577f49fe 100644 +--- a/drivers/dma/mv_xor.c ++++ b/drivers/dma/mv_xor.c +@@ -1059,6 +1059,7 @@ mv_xor_channel_add(struct mv_xor_device *xordev, + mv_chan->op_in_desc = XOR_MODE_IN_DESC; + + dma_dev = &mv_chan->dmadev; ++ dma_dev->dev = &pdev->dev; + mv_chan->xordev = xordev; + + /* +@@ -1091,7 +1092,6 @@ mv_xor_channel_add(struct mv_xor_device *xordev, + dma_dev->device_free_chan_resources = mv_xor_free_chan_resources; + dma_dev->device_tx_status = mv_xor_status; + dma_dev->device_issue_pending = mv_xor_issue_pending; +- dma_dev->dev = &pdev->dev; + + /* set prep routines based on capability */ + if (dma_has_cap(DMA_INTERRUPT, dma_dev->cap_mask)) +diff --git a/drivers/dma/tegra210-adma.c b/drivers/dma/tegra210-adma.c +index 09b6756366c3..4f4733d831a1 100644 +--- a/drivers/dma/tegra210-adma.c ++++ b/drivers/dma/tegra210-adma.c +@@ -98,6 +98,7 @@ struct tegra_adma_chan_regs { + unsigned int src_addr; + unsigned int trg_addr; + unsigned int fifo_ctrl; ++ unsigned int cmd; + unsigned int tc; + }; + +@@ -127,6 +128,7 @@ struct tegra_adma_chan { + enum dma_transfer_direction sreq_dir; + unsigned int sreq_index; + bool sreq_reserved; ++ struct tegra_adma_chan_regs ch_regs; + + /* Transfer count and position info */ + unsigned int tx_buf_count; +@@ -635,8 +637,30 @@ static struct dma_chan *tegra_dma_of_xlate(struct of_phandle_args *dma_spec, + static int tegra_adma_runtime_suspend(struct device *dev) + { + struct tegra_adma *tdma = dev_get_drvdata(dev); ++ struct tegra_adma_chan_regs *ch_reg; ++ struct tegra_adma_chan *tdc; ++ int i; + + tdma->global_cmd = tdma_read(tdma, ADMA_GLOBAL_CMD); ++ if (!tdma->global_cmd) ++ goto clk_disable; ++ ++ for (i = 0; i < tdma->nr_channels; i++) { ++ tdc = &tdma->channels[i]; ++ ch_reg = &tdc->ch_regs; ++ ch_reg->cmd = tdma_ch_read(tdc, ADMA_CH_CMD); ++ /* skip if channel is not active */ ++ if (!ch_reg->cmd) ++ continue; ++ ch_reg->tc = tdma_ch_read(tdc, ADMA_CH_TC); ++ ch_reg->src_addr = tdma_ch_read(tdc, ADMA_CH_LOWER_SRC_ADDR); ++ ch_reg->trg_addr = tdma_ch_read(tdc, ADMA_CH_LOWER_TRG_ADDR); ++ ch_reg->ctrl = tdma_ch_read(tdc, ADMA_CH_CTRL); ++ ch_reg->fifo_ctrl = tdma_ch_read(tdc, ADMA_CH_FIFO_CTRL); ++ ch_reg->config = tdma_ch_read(tdc, ADMA_CH_CONFIG); ++ } ++ ++clk_disable: + clk_disable_unprepare(tdma->ahub_clk); + + return 0; +@@ -645,7 +669,9 @@ static int tegra_adma_runtime_suspend(struct device *dev) + static int tegra_adma_runtime_resume(struct device *dev) + { + struct tegra_adma *tdma = dev_get_drvdata(dev); +- int ret; ++ struct tegra_adma_chan_regs *ch_reg; ++ struct tegra_adma_chan *tdc; ++ int ret, i; + + ret = clk_prepare_enable(tdma->ahub_clk); + if (ret) { +@@ -654,6 +680,24 @@ static int tegra_adma_runtime_resume(struct device *dev) + } + tdma_write(tdma, ADMA_GLOBAL_CMD, tdma->global_cmd); + ++ if (!tdma->global_cmd) ++ return 0; ++ ++ for (i = 0; i < tdma->nr_channels; i++) { ++ tdc = &tdma->channels[i]; ++ ch_reg = &tdc->ch_regs; ++ /* skip if channel was not active earlier */ ++ if (!ch_reg->cmd) ++ continue; ++ tdma_ch_write(tdc, ADMA_CH_TC, ch_reg->tc); ++ tdma_ch_write(tdc, ADMA_CH_LOWER_SRC_ADDR, ch_reg->src_addr); ++ tdma_ch_write(tdc, ADMA_CH_LOWER_TRG_ADDR, ch_reg->trg_addr); ++ tdma_ch_write(tdc, ADMA_CH_CTRL, ch_reg->ctrl); ++ tdma_ch_write(tdc, ADMA_CH_FIFO_CTRL, ch_reg->fifo_ctrl); ++ tdma_ch_write(tdc, ADMA_CH_CONFIG, ch_reg->config); ++ tdma_ch_write(tdc, ADMA_CH_CMD, ch_reg->cmd); ++ } ++ + return 0; + } + +@@ -700,16 +744,6 @@ static int tegra_adma_probe(struct platform_device *pdev) + return PTR_ERR(tdma->ahub_clk); + } + +- pm_runtime_enable(&pdev->dev); +- +- ret = pm_runtime_get_sync(&pdev->dev); +- if (ret < 0) +- goto rpm_disable; +- +- ret = tegra_adma_init(tdma); +- if (ret) +- goto rpm_put; +- + INIT_LIST_HEAD(&tdma->dma_dev.channels); + for (i = 0; i < tdma->nr_channels; i++) { + struct tegra_adma_chan *tdc = &tdma->channels[i]; +@@ -727,6 +761,16 @@ static int tegra_adma_probe(struct platform_device *pdev) + tdc->tdma = tdma; + } + ++ pm_runtime_enable(&pdev->dev); ++ ++ ret = pm_runtime_get_sync(&pdev->dev); ++ if (ret < 0) ++ goto rpm_disable; ++ ++ ret = tegra_adma_init(tdma); ++ if (ret) ++ goto rpm_put; ++ + dma_cap_set(DMA_SLAVE, tdma->dma_dev.cap_mask); + dma_cap_set(DMA_PRIVATE, tdma->dma_dev.cap_mask); + dma_cap_set(DMA_CYCLIC, tdma->dma_dev.cap_mask); +@@ -768,13 +812,13 @@ static int tegra_adma_probe(struct platform_device *pdev) + + dma_remove: + dma_async_device_unregister(&tdma->dma_dev); +-irq_dispose: +- while (--i >= 0) +- irq_dispose_mapping(tdma->channels[i].irq); + rpm_put: + pm_runtime_put_sync(&pdev->dev); + rpm_disable: + pm_runtime_disable(&pdev->dev); ++irq_dispose: ++ while (--i >= 0) ++ irq_dispose_mapping(tdma->channels[i].irq); + + return ret; + } +diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c +index f7fa05fee45a..329021189c38 100644 +--- a/drivers/edac/edac_mc.c ++++ b/drivers/edac/edac_mc.c +@@ -680,22 +680,18 @@ static int del_mc_from_global_list(struct mem_ctl_info *mci) + + struct mem_ctl_info *edac_mc_find(int idx) + { +- struct mem_ctl_info *mci = NULL; ++ struct mem_ctl_info *mci; + struct list_head *item; + + mutex_lock(&mem_ctls_mutex); + + list_for_each(item, &mc_devices) { + mci = list_entry(item, struct mem_ctl_info, link); +- +- if (mci->mc_idx >= idx) { +- if (mci->mc_idx == idx) { +- goto unlock; +- } +- break; +- } ++ if (mci->mc_idx == idx) ++ goto unlock; + } + ++ mci = NULL; + unlock: + mutex_unlock(&mem_ctls_mutex); + return mci; +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index c8c83f84aced..9d94c306c8ca 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -982,9 +982,20 @@ static struct drm_dp_mst_port *drm_dp_mst_get_port_ref_locked(struct drm_dp_mst_ + static struct drm_dp_mst_port *drm_dp_get_validated_port_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) + { + struct drm_dp_mst_port *rport = NULL; ++ + mutex_lock(&mgr->lock); +- if (mgr->mst_primary) +- rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, port); ++ /* ++ * Port may or may not be 'valid' but we don't care about that when ++ * destroying the port and we are guaranteed that the port pointer ++ * will be valid until we've finished ++ */ ++ if (current_work() == &mgr->destroy_connector_work) { ++ kref_get(&port->kref); ++ rport = port; ++ } else if (mgr->mst_primary) { ++ rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, ++ port); ++ } + mutex_unlock(&mgr->lock); + return rport; + } +diff --git a/drivers/gpu/drm/etnaviv/etnaviv_dump.c b/drivers/gpu/drm/etnaviv/etnaviv_dump.c +index 2d955d7d7b6d..e154e6fb64da 100644 +--- a/drivers/gpu/drm/etnaviv/etnaviv_dump.c ++++ b/drivers/gpu/drm/etnaviv/etnaviv_dump.c +@@ -207,7 +207,7 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu) + mutex_lock(&obj->lock); + pages = etnaviv_gem_get_pages(obj); + mutex_unlock(&obj->lock); +- if (pages) { ++ if (!IS_ERR(pages)) { + int j; + + iter.hdr->data[0] = bomap - bomap_start; +diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c +index ae884723e9b1..880b95511b98 100644 +--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c ++++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c +@@ -26,7 +26,7 @@ struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj) + int npages = obj->size >> PAGE_SHIFT; + + if (WARN_ON(!etnaviv_obj->pages)) /* should have already pinned! */ +- return NULL; ++ return ERR_PTR(-EINVAL); + + return drm_prime_pages_to_sg(etnaviv_obj->pages, npages); + } +diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c +index 8bd29075ae4e..edcca1761500 100644 +--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c ++++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c +@@ -71,7 +71,6 @@ static int hibmc_drm_fb_create(struct drm_fb_helper *helper, + DRM_DEBUG_DRIVER("surface width(%d), height(%d) and bpp(%d)\n", + sizes->surface_width, sizes->surface_height, + sizes->surface_bpp); +- sizes->surface_depth = 32; + + bytes_per_pixel = DIV_ROUND_UP(sizes->surface_bpp, 8); + +diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +index 7791313405b5..c8671b1578c6 100644 +--- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +@@ -394,19 +394,17 @@ static const unsigned int a3xx_registers[] = { + 0x2200, 0x2212, 0x2214, 0x2217, 0x221a, 0x221a, 0x2240, 0x227e, + 0x2280, 0x228b, 0x22c0, 0x22c0, 0x22c4, 0x22ce, 0x22d0, 0x22d8, + 0x22df, 0x22e6, 0x22e8, 0x22e9, 0x22ec, 0x22ec, 0x22f0, 0x22f7, +- 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2348, 0x2349, 0x2350, 0x2356, +- 0x2360, 0x2360, 0x2440, 0x2440, 0x2444, 0x2444, 0x2448, 0x244d, +- 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, 0x2472, 0x2472, +- 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, 0x24e4, 0x24ef, +- 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, 0x2510, 0x2511, +- 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, 0x25ec, 0x25ed, +- 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, 0x261a, 0x261a, +- 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, 0x26c4, 0x26ce, +- 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, 0x26ec, 0x26ec, +- 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, 0x2748, 0x2749, +- 0x2750, 0x2756, 0x2760, 0x2760, 0x300c, 0x300e, 0x301c, 0x301d, +- 0x302a, 0x302a, 0x302c, 0x302d, 0x3030, 0x3031, 0x3034, 0x3036, +- 0x303c, 0x303c, 0x305e, 0x305f, ++ 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2440, 0x2440, 0x2444, 0x2444, ++ 0x2448, 0x244d, 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, ++ 0x2472, 0x2472, 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, ++ 0x24e4, 0x24ef, 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, ++ 0x2510, 0x2511, 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, ++ 0x25ec, 0x25ed, 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, ++ 0x261a, 0x261a, 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, ++ 0x26c4, 0x26ce, 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, ++ 0x26ec, 0x26ec, 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, ++ 0x300c, 0x300e, 0x301c, 0x301d, 0x302a, 0x302a, 0x302c, 0x302d, ++ 0x3030, 0x3031, 0x3034, 0x3036, 0x303c, 0x303c, 0x305e, 0x305f, + ~0 /* sentinel */ + }; + +diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c +index a9a0b56f1fbc..b9cb7c09e05a 100644 +--- a/drivers/gpu/drm/msm/dsi/dsi_host.c ++++ b/drivers/gpu/drm/msm/dsi/dsi_host.c +@@ -34,6 +34,8 @@ + #include "dsi_cfg.h" + #include "msm_kms.h" + ++#define DSI_RESET_TOGGLE_DELAY_MS 20 ++ + static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor) + { + u32 ver; +@@ -906,7 +908,7 @@ static void dsi_sw_reset(struct msm_dsi_host *msm_host) + wmb(); /* clocks need to be enabled before reset */ + + dsi_write(msm_host, REG_DSI_RESET, 1); +- wmb(); /* make sure reset happen */ ++ msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ + dsi_write(msm_host, REG_DSI_RESET, 0); + } + +@@ -1288,7 +1290,7 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) + + /* dsi controller can only be reset while clocks are running */ + dsi_write(msm_host, REG_DSI_RESET, 1); +- wmb(); /* make sure reset happen */ ++ msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ + dsi_write(msm_host, REG_DSI_RESET, 0); + wmb(); /* controller out of reset */ + dsi_write(msm_host, REG_DSI_CTRL, data0); +diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +index 824067d2d427..42f0ecb0cf35 100644 +--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c ++++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +@@ -635,7 +635,7 @@ fail: + if (cfg_handler) + mdp5_cfg_destroy(cfg_handler); + +- return NULL; ++ return ERR_PTR(ret); + } + + static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev) +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +index 60ece0a8a2e1..1d2d6bae73cd 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +@@ -87,7 +87,7 @@ nvkm_gddr3_calc(struct nvkm_ram *ram) + WR = (ram->next->bios.timing[2] & 0x007f0000) >> 16; + /* XXX: Get these values from the VBIOS instead */ + DLL = !(ram->mr[1] & 0x1); +- RON = !(ram->mr[1] & 0x300) >> 8; ++ RON = !((ram->mr[1] & 0x300) >> 8); + break; + default: + return -ENOSYS; +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +index 11b28b086a06..7b052879af72 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +@@ -88,10 +88,10 @@ nvkm_memx_fini(struct nvkm_memx **pmemx, bool exec) + if (exec) { + nvkm_pmu_send(pmu, reply, PROC_MEMX, MEMX_MSG_EXEC, + memx->base, finish); ++ nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", ++ reply[0], reply[1]); + } + +- nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", +- reply[0], reply[1]); + kfree(memx); + return 0; + } +diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c +index ce8b353b5753..ba31c7674fcd 100644 +--- a/drivers/gpu/drm/radeon/cik.c ++++ b/drivers/gpu/drm/radeon/cik.c +@@ -7012,8 +7012,8 @@ static int cik_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* XXX this should actually be a bus address, not an MC address. same on older asics */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c +index e06e2d8feab3..a724bb87cfad 100644 +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -3690,8 +3690,8 @@ int r600_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* set dummy read address to ring address */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c +index 1907c950d76f..1144cafea9ac 100644 +--- a/drivers/gpu/drm/radeon/si.c ++++ b/drivers/gpu/drm/radeon/si.c +@@ -5993,8 +5993,8 @@ static int si_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* set dummy read address to ring address */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/shmobile/shmob_drm_drv.c +index 592572554eb0..58d8a98c749b 100644 +--- a/drivers/gpu/drm/shmobile/shmob_drm_drv.c ++++ b/drivers/gpu/drm/shmobile/shmob_drm_drv.c +@@ -233,8 +233,8 @@ static int shmob_drm_probe(struct platform_device *pdev) + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + sdev->mmio = devm_ioremap_resource(&pdev->dev, res); +- if (sdev->mmio == NULL) +- return -ENOMEM; ++ if (IS_ERR(sdev->mmio)) ++ return PTR_ERR(sdev->mmio); + + ret = shmob_drm_setup_clocks(sdev, pdata->clk_source); + if (ret < 0) +diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c +index cf65e32b5090..0399bb18d387 100644 +--- a/drivers/gpu/drm/sti/sti_hda.c ++++ b/drivers/gpu/drm/sti/sti_hda.c +@@ -721,7 +721,6 @@ static int sti_hda_bind(struct device *dev, struct device *master, void *data) + return 0; + + err_sysfs: +- drm_bridge_remove(bridge); + return -EINVAL; + } + +diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c +index 30f02d2fdd03..bbb195a92e93 100644 +--- a/drivers/gpu/drm/sti/sti_hdmi.c ++++ b/drivers/gpu/drm/sti/sti_hdmi.c +@@ -1314,7 +1314,6 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data) + return 0; + + err_sysfs: +- drm_bridge_remove(bridge); + hdmi->drm_connector = NULL; + return -EINVAL; + } +diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c +index 5cf2527bffc8..d7a8fea94557 100644 +--- a/drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c ++++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c +@@ -50,7 +50,7 @@ static unsigned long sun4i_tmds_calc_divider(unsigned long rate, + (rate - tmp_rate) < (rate - best_rate)) { + best_rate = tmp_rate; + best_m = m; +- is_double = d; ++ is_double = (d == 2) ? true : false; + } + } + } +diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c +index 21c2de81f3e3..a3be65e689fd 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_vq.c ++++ b/drivers/gpu/drm/virtio/virtgpu_vq.c +@@ -648,11 +648,11 @@ int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, + { + struct virtio_gpu_get_capset *cmd_p; + struct virtio_gpu_vbuffer *vbuf; +- int max_size = vgdev->capsets[idx].max_size; ++ int max_size; + struct virtio_gpu_drv_cap_cache *cache_ent; + void *resp_buf; + +- if (idx > vgdev->num_capsets) ++ if (idx >= vgdev->num_capsets) + return -EINVAL; + + if (version > vgdev->capsets[idx].max_version) +@@ -662,6 +662,7 @@ int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, + if (!cache_ent) + return -ENOMEM; + ++ max_size = vgdev->capsets[idx].max_size; + cache_ent->caps_cache = kmalloc(max_size, GFP_KERNEL); + if (!cache_ent->caps_cache) { + kfree(cache_ent); +diff --git a/drivers/hwmon/lm75.c b/drivers/hwmon/lm75.c +index 005ffb5ffa92..1737bb5fbaaf 100644 +--- a/drivers/hwmon/lm75.c ++++ b/drivers/hwmon/lm75.c +@@ -165,7 +165,7 @@ static int lm75_write(struct device *dev, enum hwmon_sensor_types type, + temp = DIV_ROUND_CLOSEST(temp << (resolution - 8), + 1000) << (16 - resolution); + +- return regmap_write(data->regmap, reg, temp); ++ return regmap_write(data->regmap, reg, (u16)temp); + } + + static umode_t lm75_is_visible(const void *data, enum hwmon_sensor_types type, +diff --git a/drivers/hwmon/pmbus/tps53679.c b/drivers/hwmon/pmbus/tps53679.c +index 85b515cd9df0..2bc352c5357f 100644 +--- a/drivers/hwmon/pmbus/tps53679.c ++++ b/drivers/hwmon/pmbus/tps53679.c +@@ -80,7 +80,14 @@ static struct pmbus_driver_info tps53679_info = { + static int tps53679_probe(struct i2c_client *client, + const struct i2c_device_id *id) + { +- return pmbus_do_probe(client, id, &tps53679_info); ++ struct pmbus_driver_info *info; ++ ++ info = devm_kmemdup(&client->dev, &tps53679_info, sizeof(*info), ++ GFP_KERNEL); ++ if (!info) ++ return -ENOMEM; ++ ++ return pmbus_do_probe(client, id, info); + } + + static const struct i2c_device_id tps53679_id[] = { +diff --git a/drivers/hwmon/shtc1.c b/drivers/hwmon/shtc1.c +index decd7df995ab..2a18539591ea 100644 +--- a/drivers/hwmon/shtc1.c ++++ b/drivers/hwmon/shtc1.c +@@ -38,7 +38,7 @@ static const unsigned char shtc1_cmd_read_id_reg[] = { 0xef, 0xc8 }; + + /* constants for reading the ID register */ + #define SHTC1_ID 0x07 +-#define SHTC1_ID_REG_MASK 0x1f ++#define SHTC1_ID_REG_MASK 0x3f + + /* delays for non-blocking i2c commands, both in us */ + #define SHTC1_NONBLOCKING_WAIT_TIME_HPM 14400 +diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c +index 8ac89d0781cc..a575e1cdb81a 100644 +--- a/drivers/hwmon/w83627hf.c ++++ b/drivers/hwmon/w83627hf.c +@@ -130,17 +130,23 @@ superio_select(struct w83627hf_sio_data *sio, int ld) + outb(ld, sio->sioaddr + 1); + } + +-static inline void ++static inline int + superio_enter(struct w83627hf_sio_data *sio) + { ++ if (!request_muxed_region(sio->sioaddr, 2, DRVNAME)) ++ return -EBUSY; ++ + outb(0x87, sio->sioaddr); + outb(0x87, sio->sioaddr); ++ ++ return 0; + } + + static inline void + superio_exit(struct w83627hf_sio_data *sio) + { + outb(0xAA, sio->sioaddr); ++ release_region(sio->sioaddr, 2); + } + + #define W627_DEVID 0x52 +@@ -1278,7 +1284,7 @@ static DEVICE_ATTR_RO(name); + static int __init w83627hf_find(int sioaddr, unsigned short *addr, + struct w83627hf_sio_data *sio_data) + { +- int err = -ENODEV; ++ int err; + u16 val; + + static __initconst char *const names[] = { +@@ -1290,7 +1296,11 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, + }; + + sio_data->sioaddr = sioaddr; +- superio_enter(sio_data); ++ err = superio_enter(sio_data); ++ if (err) ++ return err; ++ ++ err = -ENODEV; + val = force_id ? force_id : superio_inb(sio_data, DEVID); + switch (val) { + case W627_DEVID: +@@ -1644,9 +1654,21 @@ static int w83627thf_read_gpio5(struct platform_device *pdev) + struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); + int res = 0xff, sel; + +- superio_enter(sio_data); ++ if (superio_enter(sio_data)) { ++ /* ++ * Some other driver reserved the address space for itself. ++ * We don't want to fail driver instantiation because of that, ++ * so display a warning and keep going. ++ */ ++ dev_warn(&pdev->dev, ++ "Can not read VID data: Failed to enable SuperIO access\n"); ++ return res; ++ } ++ + superio_select(sio_data, W83627HF_LD_GPIO5); + ++ res = 0xff; ++ + /* Make sure these GPIO pins are enabled */ + if (!(superio_inb(sio_data, W83627THF_GPIO5_EN) & (1<<3))) { + dev_dbg(&pdev->dev, "GPIO5 disabled, no VID function\n"); +@@ -1677,7 +1699,17 @@ static int w83687thf_read_vid(struct platform_device *pdev) + struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); + int res = 0xff; + +- superio_enter(sio_data); ++ if (superio_enter(sio_data)) { ++ /* ++ * Some other driver reserved the address space for itself. ++ * We don't want to fail driver instantiation because of that, ++ * so display a warning and keep going. ++ */ ++ dev_warn(&pdev->dev, ++ "Can not read VID data: Failed to enable SuperIO access\n"); ++ return res; ++ } ++ + superio_select(sio_data, W83627HF_LD_HWM); + + /* Make sure these GPIO pins are enabled */ +diff --git a/drivers/iio/dac/ad5380.c b/drivers/iio/dac/ad5380.c +index 97d2c5111f43..8bf7fc626a9d 100644 +--- a/drivers/iio/dac/ad5380.c ++++ b/drivers/iio/dac/ad5380.c +@@ -221,7 +221,7 @@ static int ad5380_read_raw(struct iio_dev *indio_dev, + if (ret) + return ret; + *val >>= chan->scan_type.shift; +- val -= (1 << chan->scan_type.realbits) / 2; ++ *val -= (1 << chan->scan_type.realbits) / 2; + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + *val = 2 * st->vref; +diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c +index fc4630e4acdd..1614f6f3677c 100644 +--- a/drivers/infiniband/core/cma.c ++++ b/drivers/infiniband/core/cma.c +@@ -2789,7 +2789,7 @@ static void addr_handler(int status, struct sockaddr *src_addr, + if (status) + pr_debug_ratelimited("RDMA CM: ADDR_ERROR: failed to acquire device. status %d\n", + status); +- } else { ++ } else if (status) { + pr_debug_ratelimited("RDMA CM: ADDR_ERROR: failed to resolve IP. status %d\n", status); + } + +diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c +index bb36cdf82a8d..7eb1cc1b1aa0 100644 +--- a/drivers/infiniband/hw/cxgb4/cm.c ++++ b/drivers/infiniband/hw/cxgb4/cm.c +@@ -2056,7 +2056,7 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, + } else { + pdev = get_real_dev(n->dev); + ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t, +- n, pdev, 0); ++ n, pdev, rt_tos2priority(tos)); + if (!ep->l2t) + goto out; + ep->mtu = dst_mtu(dst); +@@ -2147,7 +2147,8 @@ static int c4iw_reconnect(struct c4iw_ep *ep) + laddr6->sin6_addr.s6_addr, + raddr6->sin6_addr.s6_addr, + laddr6->sin6_port, +- raddr6->sin6_port, 0, ++ raddr6->sin6_port, ++ ep->com.cm_id->tos, + raddr6->sin6_scope_id); + iptype = 6; + ra = (__u8 *)&raddr6->sin6_addr; +@@ -2923,15 +2924,18 @@ static int terminate(struct c4iw_dev *dev, struct sk_buff *skb) + ep = get_ep_from_tid(dev, tid); + BUG_ON(!ep); + +- if (ep && ep->com.qp) { +- pr_warn("TERM received tid %u qpid %u\n", +- tid, ep->com.qp->wq.sq.qid); +- attrs.next_state = C4IW_QP_STATE_TERMINATE; +- c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, +- C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); ++ if (ep) { ++ if (ep->com.qp) { ++ pr_warn("TERM received tid %u qpid %u\n", tid, ++ ep->com.qp->wq.sq.qid); ++ attrs.next_state = C4IW_QP_STATE_TERMINATE; ++ c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, ++ C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); ++ } ++ ++ c4iw_put_ep(&ep->com); + } else + pr_warn("TERM received tid %u no ep/qp\n", tid); +- c4iw_put_ep(&ep->com); + + return 0; + } +@@ -3295,7 +3299,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) + laddr6->sin6_addr.s6_addr, + raddr6->sin6_addr.s6_addr, + laddr6->sin6_port, +- raddr6->sin6_port, 0, ++ raddr6->sin6_port, cm_id->tos, + raddr6->sin6_scope_id); + } + if (!ep->dst) { +diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c +index 9f78bb07744c..4a0b7c003477 100644 +--- a/drivers/infiniband/hw/hfi1/chip.c ++++ b/drivers/infiniband/hw/hfi1/chip.c +@@ -10552,12 +10552,29 @@ void set_link_down_reason(struct hfi1_pportdata *ppd, u8 lcl_reason, + } + } + +-/* +- * Verify if BCT for data VLs is non-zero. ++/** ++ * data_vls_operational() - Verify if data VL BCT credits and MTU ++ * are both set. ++ * @ppd: pointer to hfi1_pportdata structure ++ * ++ * Return: true - Ok, false -otherwise. + */ + static inline bool data_vls_operational(struct hfi1_pportdata *ppd) + { +- return !!ppd->actual_vls_operational; ++ int i; ++ u64 reg; ++ ++ if (!ppd->actual_vls_operational) ++ return false; ++ ++ for (i = 0; i < ppd->vls_supported; i++) { ++ reg = read_csr(ppd->dd, SEND_CM_CREDIT_VL + (8 * i)); ++ if ((reg && !ppd->dd->vld[i].mtu) || ++ (!reg && ppd->dd->vld[i].mtu)) ++ return false; ++ } ++ ++ return true; + } + + /* +@@ -10662,7 +10679,8 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state) + + if (!data_vls_operational(ppd)) { + dd_dev_err(dd, +- "%s: data VLs not operational\n", __func__); ++ "%s: Invalid data VL credits or mtu\n", ++ __func__); + ret = -EINVAL; + break; + } +diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c +index 3a37d26889df..281e9987ffc8 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_qp.c ++++ b/drivers/infiniband/hw/hns/hns_roce_qp.c +@@ -241,7 +241,6 @@ void hns_roce_qp_free(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp) + + if ((hr_qp->ibqp.qp_type) != IB_QPT_GSI) { + hns_roce_table_put(hr_dev, &qp_table->irrl_table, hr_qp->qpn); +- hns_roce_table_put(hr_dev, &qp_table->qp_table, hr_qp->qpn); + } + } + +diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c +index 5a7dcb5afe6e..84c962820aa2 100644 +--- a/drivers/infiniband/hw/mlx5/qp.c ++++ b/drivers/infiniband/hw/mlx5/qp.c +@@ -2357,6 +2357,11 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_PKEY_INDEX | + MLX5_QP_OPTPAR_Q_KEY | + MLX5_QP_OPTPAR_PRI_PORT, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_PKEY_INDEX | ++ MLX5_QP_OPTPAR_PRI_PORT, + }, + [MLX5_QP_STATE_RTR] = { + [MLX5_QP_ST_RC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | +@@ -2390,6 +2395,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_PM_STATE, + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | ++ MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_PM_STATE | ++ MLX5_QP_OPTPAR_RNR_TIMEOUT, + }, + }, + [MLX5_QP_STATE_RTS] = { +@@ -2406,6 +2417,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY | + MLX5_QP_OPTPAR_SRQN | + MLX5_QP_OPTPAR_CQN_RCV, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_RNR_TIMEOUT | ++ MLX5_QP_OPTPAR_PM_STATE | ++ MLX5_QP_OPTPAR_ALT_ADDR_PATH, + }, + }, + [MLX5_QP_STATE_SQER] = { +@@ -2417,6 +2434,10 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_RAE | + MLX5_QP_OPTPAR_RRE, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RNR_TIMEOUT | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RRE, + }, + }, + }; +diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +index 27d5e8d9f08d..7683d13dad3d 100644 +--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c ++++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +@@ -55,7 +55,7 @@ + + int ocrdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) + { +- if (index > 1) ++ if (index > 0) + return -EINVAL; + + *pkey = 0xffff; +diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c +index 656e7c1a4449..6ae72accae3d 100644 +--- a/drivers/infiniband/hw/qedr/verbs.c ++++ b/drivers/infiniband/hw/qedr/verbs.c +@@ -63,7 +63,7 @@ static inline int qedr_ib_copy_to_udata(struct ib_udata *udata, void *src, + + int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) + { +- if (index > QEDR_ROCE_PKEY_TABLE_LEN) ++ if (index >= QEDR_ROCE_PKEY_TABLE_LEN) + return -EINVAL; + + *pkey = QEDR_ROCE_PKEY_DEFAULT; +@@ -178,54 +178,47 @@ int qedr_query_device(struct ib_device *ibdev, + return 0; + } + +-#define QEDR_SPEED_SDR (1) +-#define QEDR_SPEED_DDR (2) +-#define QEDR_SPEED_QDR (4) +-#define QEDR_SPEED_FDR10 (8) +-#define QEDR_SPEED_FDR (16) +-#define QEDR_SPEED_EDR (32) +- + static inline void get_link_speed_and_width(int speed, u8 *ib_speed, + u8 *ib_width) + { + switch (speed) { + case 1000: +- *ib_speed = QEDR_SPEED_SDR; ++ *ib_speed = IB_SPEED_SDR; + *ib_width = IB_WIDTH_1X; + break; + case 10000: +- *ib_speed = QEDR_SPEED_QDR; ++ *ib_speed = IB_SPEED_QDR; + *ib_width = IB_WIDTH_1X; + break; + + case 20000: +- *ib_speed = QEDR_SPEED_DDR; ++ *ib_speed = IB_SPEED_DDR; + *ib_width = IB_WIDTH_4X; + break; + + case 25000: +- *ib_speed = QEDR_SPEED_EDR; ++ *ib_speed = IB_SPEED_EDR; + *ib_width = IB_WIDTH_1X; + break; + + case 40000: +- *ib_speed = QEDR_SPEED_QDR; ++ *ib_speed = IB_SPEED_QDR; + *ib_width = IB_WIDTH_4X; + break; + + case 50000: +- *ib_speed = QEDR_SPEED_QDR; +- *ib_width = IB_WIDTH_4X; ++ *ib_speed = IB_SPEED_HDR; ++ *ib_width = IB_WIDTH_1X; + break; + + case 100000: +- *ib_speed = QEDR_SPEED_EDR; ++ *ib_speed = IB_SPEED_EDR; + *ib_width = IB_WIDTH_4X; + break; + + default: + /* Unsupported */ +- *ib_speed = QEDR_SPEED_SDR; ++ *ib_speed = IB_SPEED_SDR; + *ib_width = IB_WIDTH_1X; + } + } +diff --git a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +index fdfa25059723..2602c7375d58 100644 +--- a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c ++++ b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +@@ -423,7 +423,7 @@ struct net_device *usnic_get_netdev(struct ib_device *device, u8 port_num) + int usnic_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, + u16 *pkey) + { +- if (index > 1) ++ if (index > 0) + return -EINVAL; + + *pkey = 0xffff; +diff --git a/drivers/infiniband/sw/rxe/rxe_cq.c b/drivers/infiniband/sw/rxe/rxe_cq.c +index c4aabf78dc90..f6e036ded046 100644 +--- a/drivers/infiniband/sw/rxe/rxe_cq.c ++++ b/drivers/infiniband/sw/rxe/rxe_cq.c +@@ -30,7 +30,7 @@ + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +- ++#include + #include "rxe.h" + #include "rxe_loc.h" + #include "rxe_queue.h" +@@ -97,7 +97,7 @@ int rxe_cq_from_init(struct rxe_dev *rxe, struct rxe_cq *cq, int cqe, + err = do_mmap_info(rxe, udata, false, context, cq->queue->buf, + cq->queue->buf_size, &cq->queue->ip); + if (err) { +- kvfree(cq->queue->buf); ++ vfree(cq->queue->buf); + kfree(cq->queue); + return err; + } +diff --git a/drivers/infiniband/sw/rxe/rxe_pool.c b/drivers/infiniband/sw/rxe/rxe_pool.c +index b4a8acc7bb7d..0e2425f28233 100644 +--- a/drivers/infiniband/sw/rxe/rxe_pool.c ++++ b/drivers/infiniband/sw/rxe/rxe_pool.c +@@ -112,6 +112,18 @@ static inline struct kmem_cache *pool_cache(struct rxe_pool *pool) + return rxe_type_info[pool->type].cache; + } + ++static void rxe_cache_clean(size_t cnt) ++{ ++ int i; ++ struct rxe_type_info *type; ++ ++ for (i = 0; i < cnt; i++) { ++ type = &rxe_type_info[i]; ++ kmem_cache_destroy(type->cache); ++ type->cache = NULL; ++ } ++} ++ + int rxe_cache_init(void) + { + int err; +@@ -136,24 +148,14 @@ int rxe_cache_init(void) + return 0; + + err1: +- while (--i >= 0) { +- kmem_cache_destroy(type->cache); +- type->cache = NULL; +- } ++ rxe_cache_clean(i); + + return err; + } + + void rxe_cache_exit(void) + { +- int i; +- struct rxe_type_info *type; +- +- for (i = 0; i < RXE_NUM_TYPES; i++) { +- type = &rxe_type_info[i]; +- kmem_cache_destroy(type->cache); +- type->cache = NULL; +- } ++ rxe_cache_clean(RXE_NUM_TYPES); + } + + static int rxe_pool_init_index(struct rxe_pool *pool, u32 max, u32 min) +diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c +index aeea994b04c4..25055a68a2c0 100644 +--- a/drivers/infiniband/sw/rxe/rxe_qp.c ++++ b/drivers/infiniband/sw/rxe/rxe_qp.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + + #include "rxe.h" + #include "rxe_loc.h" +@@ -255,7 +256,7 @@ static int rxe_qp_init_req(struct rxe_dev *rxe, struct rxe_qp *qp, + qp->sq.queue->buf_size, &qp->sq.queue->ip); + + if (err) { +- kvfree(qp->sq.queue->buf); ++ vfree(qp->sq.queue->buf); + kfree(qp->sq.queue); + return err; + } +@@ -308,7 +309,7 @@ static int rxe_qp_init_resp(struct rxe_dev *rxe, struct rxe_qp *qp, + qp->rq.queue->buf_size, + &qp->rq.queue->ip); + if (err) { +- kvfree(qp->rq.queue->buf); ++ vfree(qp->rq.queue->buf); + kfree(qp->rq.queue); + return err; + } +diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h +index c1ae4aeae2f9..46dfc6ae9d1c 100644 +--- a/drivers/infiniband/ulp/iser/iscsi_iser.h ++++ b/drivers/infiniband/ulp/iser/iscsi_iser.h +@@ -197,7 +197,7 @@ struct iser_data_buf { + struct scatterlist *sg; + int size; + unsigned long data_len; +- unsigned int dma_nents; ++ int dma_nents; + }; + + /* fwd declarations */ +diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c +index 322209d5ff58..19883169e7b7 100644 +--- a/drivers/infiniband/ulp/iser/iser_memory.c ++++ b/drivers/infiniband/ulp/iser/iser_memory.c +@@ -240,8 +240,8 @@ int iser_fast_reg_fmr(struct iscsi_iser_task *iser_task, + page_vec->npages = 0; + page_vec->fake_mr.page_size = SIZE_4K; + plen = ib_sg_to_pages(&page_vec->fake_mr, mem->sg, +- mem->size, NULL, iser_set_page); +- if (unlikely(plen < mem->size)) { ++ mem->dma_nents, NULL, iser_set_page); ++ if (unlikely(plen < mem->dma_nents)) { + iser_err("page vec too short to hold this SG\n"); + iser_data_buf_dump(mem, device->ib_device); + iser_dump_page_vec(page_vec); +@@ -450,10 +450,10 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task, + + ib_update_fast_reg_key(mr, ib_inc_rkey(mr->rkey)); + +- n = ib_map_mr_sg(mr, mem->sg, mem->size, NULL, SIZE_4K); +- if (unlikely(n != mem->size)) { ++ n = ib_map_mr_sg(mr, mem->sg, mem->dma_nents, NULL, SIZE_4K); ++ if (unlikely(n != mem->dma_nents)) { + iser_err("failed to map sg (%d/%d)\n", +- n, mem->size); ++ n, mem->dma_nents); + return n < 0 ? n : -EINVAL; + } + +diff --git a/drivers/input/keyboard/nomadik-ske-keypad.c b/drivers/input/keyboard/nomadik-ske-keypad.c +index 8567ee47761e..ae3b04557074 100644 +--- a/drivers/input/keyboard/nomadik-ske-keypad.c ++++ b/drivers/input/keyboard/nomadik-ske-keypad.c +@@ -100,7 +100,7 @@ static int __init ske_keypad_chip_init(struct ske_keypad *keypad) + while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) + cpu_relax(); + +- if (!timeout) ++ if (timeout == -1) + return -EINVAL; + + /* +diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c +index d09c24825734..778f167be2d3 100644 +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -2160,6 +2160,8 @@ skip_ats_check: + */ + domain_flush_tlb_pde(domain); + ++ domain_flush_complete(domain); ++ + return ret; + } + +diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c +index 6a3cf4d0bd5e..4d2920988d60 100644 +--- a/drivers/iommu/amd_iommu_init.c ++++ b/drivers/iommu/amd_iommu_init.c +@@ -420,6 +420,9 @@ static void iommu_enable(struct amd_iommu *iommu) + + static void iommu_disable(struct amd_iommu *iommu) + { ++ if (!iommu->mmio_base) ++ return; ++ + /* Disable command buffer */ + iommu_feature_disable(iommu, CONTROL_CMDBUF_EN); + +diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c +index 523d0889c2a4..b48666849dbe 100644 +--- a/drivers/iommu/intel-iommu.c ++++ b/drivers/iommu/intel-iommu.c +@@ -442,7 +442,6 @@ struct dmar_rmrr_unit { + u64 end_address; /* reserved end address */ + struct dmar_dev_scope *devices; /* target devices */ + int devices_cnt; /* target device count */ +- struct iommu_resv_region *resv; /* reserved region handle */ + }; + + struct dmar_atsr_unit { +@@ -3361,9 +3360,12 @@ static int __init init_dmars(void) + iommu_identity_mapping |= IDENTMAP_ALL; + + #ifdef CONFIG_INTEL_IOMMU_BROKEN_GFX_WA +- iommu_identity_mapping |= IDENTMAP_GFX; ++ dmar_map_gfx = 0; + #endif + ++ if (!dmar_map_gfx) ++ iommu_identity_mapping |= IDENTMAP_GFX; ++ + check_tylersburg_isoch(); + + if (iommu_identity_mapping) { +@@ -4168,7 +4170,6 @@ static inline void init_iommu_pm_ops(void) {} + int __init dmar_parse_one_rmrr(struct acpi_dmar_header *header, void *arg) + { + struct acpi_dmar_reserved_memory *rmrr; +- int prot = DMA_PTE_READ|DMA_PTE_WRITE; + struct dmar_rmrr_unit *rmrru; + size_t length; + +@@ -4182,22 +4183,16 @@ int __init dmar_parse_one_rmrr(struct acpi_dmar_header *header, void *arg) + rmrru->end_address = rmrr->end_address; + + length = rmrr->end_address - rmrr->base_address + 1; +- rmrru->resv = iommu_alloc_resv_region(rmrr->base_address, length, prot, +- IOMMU_RESV_DIRECT); +- if (!rmrru->resv) +- goto free_rmrru; + + rmrru->devices = dmar_alloc_dev_scope((void *)(rmrr + 1), + ((void *)rmrr) + rmrr->header.length, + &rmrru->devices_cnt); + if (rmrru->devices_cnt && rmrru->devices == NULL) +- goto free_all; ++ goto free_rmrru; + + list_add(&rmrru->list, &dmar_rmrr_units); + + return 0; +-free_all: +- kfree(rmrru->resv); + free_rmrru: + kfree(rmrru); + out: +@@ -4415,7 +4410,6 @@ static void intel_iommu_free_dmars(void) + list_for_each_entry_safe(rmrru, rmrr_n, &dmar_rmrr_units, list) { + list_del(&rmrru->list); + dmar_free_dev_scope(&rmrru->devices, &rmrru->devices_cnt); +- kfree(rmrru->resv); + kfree(rmrru); + } + +@@ -5183,22 +5177,33 @@ static void intel_iommu_remove_device(struct device *dev) + static void intel_iommu_get_resv_regions(struct device *device, + struct list_head *head) + { ++ int prot = DMA_PTE_READ | DMA_PTE_WRITE; + struct iommu_resv_region *reg; + struct dmar_rmrr_unit *rmrr; + struct device *i_dev; + int i; + +- rcu_read_lock(); ++ down_read(&dmar_global_lock); + for_each_rmrr_units(rmrr) { + for_each_active_dev_scope(rmrr->devices, rmrr->devices_cnt, + i, i_dev) { ++ struct iommu_resv_region *resv; ++ size_t length; ++ + if (i_dev != device) + continue; + +- list_add_tail(&rmrr->resv->list, head); ++ length = rmrr->end_address - rmrr->base_address + 1; ++ resv = iommu_alloc_resv_region(rmrr->base_address, ++ length, prot, ++ IOMMU_RESV_DIRECT); ++ if (!resv) ++ break; ++ ++ list_add_tail(&resv->list, head); + } + } +- rcu_read_unlock(); ++ up_read(&dmar_global_lock); + + reg = iommu_alloc_resv_region(IOAPIC_RANGE_START, + IOAPIC_RANGE_END - IOAPIC_RANGE_START + 1, +@@ -5213,10 +5218,8 @@ static void intel_iommu_put_resv_regions(struct device *dev, + { + struct iommu_resv_region *entry, *next; + +- list_for_each_entry_safe(entry, next, head, list) { +- if (entry->type == IOMMU_RESV_MSI) +- kfree(entry); +- } ++ list_for_each_entry_safe(entry, next, head, list) ++ kfree(entry); + } + + #ifdef CONFIG_INTEL_IOMMU_SVM +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index 4b761678a18b..2c48a9d6d91e 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -1856,9 +1856,9 @@ int iommu_request_dm_for_dev(struct device *dev) + int ret; + + /* Device must already be in a group before calling this function */ +- group = iommu_group_get_for_dev(dev); +- if (IS_ERR(group)) +- return PTR_ERR(group); ++ group = iommu_group_get(dev); ++ if (!group) ++ return -EINVAL; + + mutex_lock(&group->mutex); + +diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c +index c30f62700431..0f99e95a1a73 100644 +--- a/drivers/iommu/mtk_iommu.c ++++ b/drivers/iommu/mtk_iommu.c +@@ -115,6 +115,30 @@ struct mtk_iommu_domain { + + static struct iommu_ops mtk_iommu_ops; + ++/* ++ * In M4U 4GB mode, the physical address is remapped as below: ++ * ++ * CPU Physical address: ++ * ==================== ++ * ++ * 0 1G 2G 3G 4G 5G ++ * |---A---|---B---|---C---|---D---|---E---| ++ * +--I/O--+------------Memory-------------+ ++ * ++ * IOMMU output physical address: ++ * ============================= ++ * ++ * 4G 5G 6G 7G 8G ++ * |---E---|---B---|---C---|---D---| ++ * +------------Memory-------------+ ++ * ++ * The Region 'A'(I/O) can NOT be mapped by M4U; For Region 'B'/'C'/'D', the ++ * bit32 of the CPU physical address always is needed to set, and for Region ++ * 'E', the CPU physical address keep as is. ++ * Additionally, The iommu consumers always use the CPU phyiscal address. ++ */ ++#define MTK_IOMMU_4GB_MODE_REMAP_BASE 0x40000000 ++ + static LIST_HEAD(m4ulist); /* List all the M4U HWs */ + + #define for_each_m4u(data) list_for_each_entry(data, &m4ulist, list) +@@ -404,7 +428,7 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain, + pa = dom->iop->iova_to_phys(dom->iop, iova); + spin_unlock_irqrestore(&dom->pgtlock, flags); + +- if (data->enable_4GB) ++ if (data->enable_4GB && pa < MTK_IOMMU_4GB_MODE_REMAP_BASE) + pa |= BIT_ULL(32); + + return pa; +diff --git a/drivers/lightnvm/pblk-rb.c b/drivers/lightnvm/pblk-rb.c +index c0dd17a82170..73de2deaba67 100644 +--- a/drivers/lightnvm/pblk-rb.c ++++ b/drivers/lightnvm/pblk-rb.c +@@ -825,8 +825,8 @@ int pblk_rb_tear_down_check(struct pblk_rb *rb) + } + + out: +- spin_unlock(&rb->w_lock); + spin_unlock_irq(&rb->s_lock); ++ spin_unlock(&rb->w_lock); + + return ret; + } +diff --git a/drivers/media/i2c/ov2659.c b/drivers/media/i2c/ov2659.c +index 44b0584eb8a6..e7768ed1ff9c 100644 +--- a/drivers/media/i2c/ov2659.c ++++ b/drivers/media/i2c/ov2659.c +@@ -1136,7 +1136,7 @@ static int ov2659_set_fmt(struct v4l2_subdev *sd, + mf = v4l2_subdev_get_try_format(sd, cfg, fmt->pad); + *mf = fmt->format; + #else +- return -ENOTTY; ++ ret = -ENOTTY; + #endif + } else { + s64 val; +diff --git a/drivers/media/pci/cx18/cx18-fileops.c b/drivers/media/pci/cx18/cx18-fileops.c +index 98467b2089fa..099d59b992c1 100644 +--- a/drivers/media/pci/cx18/cx18-fileops.c ++++ b/drivers/media/pci/cx18/cx18-fileops.c +@@ -484,7 +484,7 @@ static ssize_t cx18_read_pos(struct cx18_stream *s, char __user *ubuf, + + CX18_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); + if (rc > 0) +- pos += rc; ++ *pos += rc; + return rc; + } + +diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c +index e795ddeb7fe2..60f122edaefb 100644 +--- a/drivers/media/pci/cx23885/cx23885-dvb.c ++++ b/drivers/media/pci/cx23885/cx23885-dvb.c +@@ -1460,8 +1460,9 @@ static int dvb_register(struct cx23885_tsport *port) + if (fe0->dvb.frontend != NULL) { + struct i2c_adapter *tun_i2c; + +- fe0->dvb.frontend->sec_priv = kmalloc(sizeof(dib7000p_ops), GFP_KERNEL); +- memcpy(fe0->dvb.frontend->sec_priv, &dib7000p_ops, sizeof(dib7000p_ops)); ++ fe0->dvb.frontend->sec_priv = kmemdup(&dib7000p_ops, sizeof(dib7000p_ops), GFP_KERNEL); ++ if (!fe0->dvb.frontend->sec_priv) ++ return -ENOMEM; + tun_i2c = dib7000p_ops.get_i2c_master(fe0->dvb.frontend, DIBX000_I2C_INTERFACE_TUNER, 1); + if (!dvb_attach(dib0070_attach, fe0->dvb.frontend, tun_i2c, &dib7070p_dib0070_config)) + return -ENODEV; +diff --git a/drivers/media/pci/ivtv/ivtv-fileops.c b/drivers/media/pci/ivtv/ivtv-fileops.c +index c9bd018e53de..e2b19c3eaa87 100644 +--- a/drivers/media/pci/ivtv/ivtv-fileops.c ++++ b/drivers/media/pci/ivtv/ivtv-fileops.c +@@ -420,7 +420,7 @@ static ssize_t ivtv_read_pos(struct ivtv_stream *s, char __user *ubuf, size_t co + + IVTV_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); + if (rc > 0) +- pos += rc; ++ *pos += rc; + return rc; + } + +diff --git a/drivers/media/pci/tw5864/tw5864-video.c b/drivers/media/pci/tw5864/tw5864-video.c +index e7bd2b8484e3..ee1230440b39 100644 +--- a/drivers/media/pci/tw5864/tw5864-video.c ++++ b/drivers/media/pci/tw5864/tw5864-video.c +@@ -1395,13 +1395,13 @@ static void tw5864_handle_frame(struct tw5864_h264_frame *frame) + input->vb = NULL; + spin_unlock_irqrestore(&input->slock, flags); + +- v4l2_buf = to_vb2_v4l2_buffer(&vb->vb.vb2_buf); +- + if (!vb) { /* Gone because of disabling */ + dev_dbg(&dev->pci->dev, "vb is empty, dropping frame\n"); + return; + } + ++ v4l2_buf = to_vb2_v4l2_buffer(&vb->vb.vb2_buf); ++ + /* + * Check for space. + * Mind the overhead of startcode emulation prevention. +diff --git a/drivers/media/platform/atmel/atmel-isi.c b/drivers/media/platform/atmel/atmel-isi.c +index 891fa2505efa..2f962a3418f6 100644 +--- a/drivers/media/platform/atmel/atmel-isi.c ++++ b/drivers/media/platform/atmel/atmel-isi.c +@@ -496,7 +496,7 @@ static void stop_streaming(struct vb2_queue *vq) + spin_unlock_irq(&isi->irqlock); + + if (!isi->enable_preview_path) { +- timeout = jiffies + FRAME_INTERVAL_MILLI_SEC * HZ; ++ timeout = jiffies + (FRAME_INTERVAL_MILLI_SEC * HZ) / 1000; + /* Wait until the end of the current frame. */ + while ((isi_readl(isi, ISI_STATUS) & ISI_CTRL_CDC) && + time_before(jiffies, timeout)) +diff --git a/drivers/media/platform/davinci/isif.c b/drivers/media/platform/davinci/isif.c +index 90d0f13283ae..12065ad1ac45 100644 +--- a/drivers/media/platform/davinci/isif.c ++++ b/drivers/media/platform/davinci/isif.c +@@ -886,9 +886,7 @@ static int isif_set_hw_if_params(struct vpfe_hw_if_param *params) + static int isif_config_ycbcr(void) + { + struct isif_ycbcr_config *params = &isif_cfg.ycbcr; +- struct vpss_pg_frame_size frame_size; + u32 modeset = 0, ccdcfg = 0; +- struct vpss_sync_pol sync; + + dev_dbg(isif_cfg.dev, "\nStarting isif_config_ycbcr..."); + +@@ -976,13 +974,6 @@ static int isif_config_ycbcr(void) + /* two fields are interleaved in memory */ + regw(0x00000249, SDOFST); + +- /* Setup test pattern if enabled */ +- if (isif_cfg.bayer.config_params.test_pat_gen) { +- sync.ccdpg_hdpol = params->hd_pol; +- sync.ccdpg_vdpol = params->vd_pol; +- dm365_vpss_set_sync_pol(sync); +- dm365_vpss_set_pg_frame_size(frame_size); +- } + return 0; + } + +diff --git a/drivers/media/platform/davinci/vpbe.c b/drivers/media/platform/davinci/vpbe.c +index 1d3c13e36904..915af9ca4711 100644 +--- a/drivers/media/platform/davinci/vpbe.c ++++ b/drivers/media/platform/davinci/vpbe.c +@@ -126,7 +126,7 @@ static int vpbe_enum_outputs(struct vpbe_device *vpbe_dev, + struct v4l2_output *output) + { + struct vpbe_config *cfg = vpbe_dev->cfg; +- int temp_index = output->index; ++ unsigned int temp_index = output->index; + + if (temp_index >= cfg->num_outputs) + return -EINVAL; +diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c +index 4d29860d27b4..18604b608ab2 100644 +--- a/drivers/media/platform/omap/omap_vout.c ++++ b/drivers/media/platform/omap/omap_vout.c +@@ -1527,23 +1527,20 @@ static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) + unsigned long size; + struct videobuf_buffer *vb; + +- vb = q->bufs[b->index]; +- + if (!vout->streaming) + return -EINVAL; + +- if (file->f_flags & O_NONBLOCK) +- /* Call videobuf_dqbuf for non blocking mode */ +- ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 1); +- else +- /* Call videobuf_dqbuf for blocking mode */ +- ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 0); ++ ret = videobuf_dqbuf(q, b, !!(file->f_flags & O_NONBLOCK)); ++ if (ret) ++ return ret; ++ ++ vb = q->bufs[b->index]; + + addr = (unsigned long) vout->buf_phy_addr[vb->i]; + size = (unsigned long) vb->size; + dma_unmap_single(vout->vid_dev->v4l2_dev.dev, addr, + size, DMA_TO_DEVICE); +- return ret; ++ return 0; + } + + static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i) +diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c +index 4568e68e15fa..85a5e33600c0 100644 +--- a/drivers/media/platform/s5p-jpeg/jpeg-core.c ++++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c +@@ -2005,7 +2005,7 @@ static int s5p_jpeg_controls_create(struct s5p_jpeg_ctx *ctx) + + v4l2_ctrl_new_std(&ctx->ctrl_handler, &s5p_jpeg_ctrl_ops, + V4L2_CID_JPEG_RESTART_INTERVAL, +- 0, 3, 0xffff, 0); ++ 0, 0xffff, 1, 0); + if (ctx->jpeg->variant->version == SJPEG_S5P) + mask = ~0x06; /* 422, 420 */ + } +diff --git a/drivers/media/platform/vivid/vivid-osd.c b/drivers/media/platform/vivid/vivid-osd.c +index bdc380b14e0c..a95b7c56569e 100644 +--- a/drivers/media/platform/vivid/vivid-osd.c ++++ b/drivers/media/platform/vivid/vivid-osd.c +@@ -167,7 +167,7 @@ static int _vivid_fb_check_var(struct fb_var_screeninfo *var, struct vivid_dev * + var->nonstd = 0; + + var->vmode &= ~FB_VMODE_MASK; +- var->vmode = FB_VMODE_NONINTERLACED; ++ var->vmode |= FB_VMODE_NONINTERLACED; + + /* Dummy values */ + var->hsync_len = 24; +diff --git a/drivers/media/radio/wl128x/fmdrv_common.c b/drivers/media/radio/wl128x/fmdrv_common.c +index 26895ae42fcf..2d20d908e280 100644 +--- a/drivers/media/radio/wl128x/fmdrv_common.c ++++ b/drivers/media/radio/wl128x/fmdrv_common.c +@@ -1271,8 +1271,9 @@ static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name) + + switch (action->type) { + case ACTION_SEND_COMMAND: /* Send */ +- if (fmc_send_cmd(fmdev, 0, 0, action->data, +- action->size, NULL, NULL)) ++ ret = fmc_send_cmd(fmdev, 0, 0, action->data, ++ action->size, NULL, NULL); ++ if (ret) + goto rel_fw; + + cmd_cnt++; +diff --git a/drivers/mfd/intel-lpss-pci.c b/drivers/mfd/intel-lpss-pci.c +index 2b7e8eeaa59e..0504761516f7 100644 +--- a/drivers/mfd/intel-lpss-pci.c ++++ b/drivers/mfd/intel-lpss-pci.c +@@ -126,6 +126,18 @@ static const struct intel_lpss_platform_info apl_i2c_info = { + .properties = apl_i2c_properties, + }; + ++static struct property_entry glk_i2c_properties[] = { ++ PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 313), ++ PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171), ++ PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 290), ++ { }, ++}; ++ ++static const struct intel_lpss_platform_info glk_i2c_info = { ++ .clk_rate = 133000000, ++ .properties = glk_i2c_properties, ++}; ++ + static const struct intel_lpss_platform_info cnl_i2c_info = { + .clk_rate = 216000000, + .properties = spt_i2c_properties, +@@ -165,14 +177,14 @@ static const struct pci_device_id intel_lpss_pci_ids[] = { + { PCI_VDEVICE(INTEL, 0x1ac6), (kernel_ulong_t)&bxt_info }, + { PCI_VDEVICE(INTEL, 0x1aee), (kernel_ulong_t)&bxt_uart_info }, + /* GLK */ +- { PCI_VDEVICE(INTEL, 0x31ac), (kernel_ulong_t)&bxt_i2c_info }, +- { PCI_VDEVICE(INTEL, 0x31ae), (kernel_ulong_t)&bxt_i2c_info }, +- { PCI_VDEVICE(INTEL, 0x31b0), (kernel_ulong_t)&bxt_i2c_info }, +- { PCI_VDEVICE(INTEL, 0x31b2), (kernel_ulong_t)&bxt_i2c_info }, +- { PCI_VDEVICE(INTEL, 0x31b4), (kernel_ulong_t)&bxt_i2c_info }, +- { PCI_VDEVICE(INTEL, 0x31b6), (kernel_ulong_t)&bxt_i2c_info }, +- { PCI_VDEVICE(INTEL, 0x31b8), (kernel_ulong_t)&bxt_i2c_info }, +- { PCI_VDEVICE(INTEL, 0x31ba), (kernel_ulong_t)&bxt_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x31ac), (kernel_ulong_t)&glk_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x31ae), (kernel_ulong_t)&glk_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x31b0), (kernel_ulong_t)&glk_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x31b2), (kernel_ulong_t)&glk_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x31b4), (kernel_ulong_t)&glk_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x31b6), (kernel_ulong_t)&glk_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x31b8), (kernel_ulong_t)&glk_i2c_info }, ++ { PCI_VDEVICE(INTEL, 0x31ba), (kernel_ulong_t)&glk_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31bc), (kernel_ulong_t)&bxt_uart_info }, + { PCI_VDEVICE(INTEL, 0x31be), (kernel_ulong_t)&bxt_uart_info }, + { PCI_VDEVICE(INTEL, 0x31c0), (kernel_ulong_t)&bxt_uart_info }, +diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c +index b5c4f8f974aa..9ed573e232c0 100644 +--- a/drivers/mfd/intel-lpss.c ++++ b/drivers/mfd/intel-lpss.c +@@ -541,6 +541,7 @@ module_init(intel_lpss_init); + + static void __exit intel_lpss_exit(void) + { ++ ida_destroy(&intel_lpss_devid_ida); + debugfs_remove(intel_lpss_debugfs); + } + module_exit(intel_lpss_exit); +diff --git a/drivers/misc/mic/card/mic_x100.c b/drivers/misc/mic/card/mic_x100.c +index b9f0710ffa6b..4007adc666f3 100644 +--- a/drivers/misc/mic/card/mic_x100.c ++++ b/drivers/misc/mic/card/mic_x100.c +@@ -249,6 +249,9 @@ static int __init mic_probe(struct platform_device *pdev) + mdrv->dev = &pdev->dev; + snprintf(mdrv->name, sizeof(mic_driver_name), mic_driver_name); + ++ /* FIXME: use dma_set_mask_and_coherent() and check result */ ++ dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); ++ + mdev->mmio.pa = MIC_X100_MMIO_BASE; + mdev->mmio.len = MIC_X100_MMIO_LEN; + mdev->mmio.va = devm_ioremap(&pdev->dev, MIC_X100_MMIO_BASE, +@@ -294,18 +297,6 @@ static void mic_platform_shutdown(struct platform_device *pdev) + mic_remove(pdev); + } + +-static u64 mic_dma_mask = DMA_BIT_MASK(64); +- +-static struct platform_device mic_platform_dev = { +- .name = mic_driver_name, +- .id = 0, +- .num_resources = 0, +- .dev = { +- .dma_mask = &mic_dma_mask, +- .coherent_dma_mask = DMA_BIT_MASK(64), +- }, +-}; +- + static struct platform_driver __refdata mic_platform_driver = { + .probe = mic_probe, + .remove = mic_remove, +@@ -315,6 +306,8 @@ static struct platform_driver __refdata mic_platform_driver = { + }, + }; + ++static struct platform_device *mic_platform_dev; ++ + static int __init mic_init(void) + { + int ret; +@@ -328,9 +321,12 @@ static int __init mic_init(void) + + request_module("mic_x100_dma"); + mic_init_card_debugfs(); +- ret = platform_device_register(&mic_platform_dev); ++ ++ mic_platform_dev = platform_device_register_simple(mic_driver_name, ++ 0, NULL, 0); ++ ret = PTR_ERR_OR_ZERO(mic_platform_dev); + if (ret) { +- pr_err("platform_device_register ret %d\n", ret); ++ pr_err("platform_device_register_full ret %d\n", ret); + goto cleanup_debugfs; + } + ret = platform_driver_register(&mic_platform_driver); +@@ -341,7 +337,7 @@ static int __init mic_init(void) + return ret; + + device_unregister: +- platform_device_unregister(&mic_platform_dev); ++ platform_device_unregister(mic_platform_dev); + cleanup_debugfs: + mic_exit_card_debugfs(); + done: +@@ -351,7 +347,7 @@ done: + static void __exit mic_exit(void) + { + platform_driver_unregister(&mic_platform_driver); +- platform_device_unregister(&mic_platform_dev); ++ platform_device_unregister(mic_platform_dev); + mic_exit_card_debugfs(); + } + +diff --git a/drivers/misc/sgi-xp/xpc_partition.c b/drivers/misc/sgi-xp/xpc_partition.c +index 6956f7e7d439..ca5f0102daef 100644 +--- a/drivers/misc/sgi-xp/xpc_partition.c ++++ b/drivers/misc/sgi-xp/xpc_partition.c +@@ -70,7 +70,7 @@ xpc_get_rsvd_page_pa(int nasid) + unsigned long rp_pa = nasid; /* seed with nasid */ + size_t len = 0; + size_t buf_len = 0; +- void *buf = buf; ++ void *buf = NULL; + void *buf_base = NULL; + enum xp_retval (*get_partition_rsvd_page_pa) + (void *, u64 *, unsigned long *, size_t *) = +diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c +index ad88deb2e8f3..3740fb0052a4 100644 +--- a/drivers/mmc/core/host.c ++++ b/drivers/mmc/core/host.c +@@ -376,8 +376,6 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) + + if (mmc_gpio_alloc(host)) { + put_device(&host->class_dev); +- ida_simple_remove(&mmc_host_ida, host->index); +- kfree(host); + return NULL; + } + +diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h +index 5153577754f0..09897abb79ed 100644 +--- a/drivers/mmc/core/quirks.h ++++ b/drivers/mmc/core/quirks.h +@@ -119,7 +119,14 @@ static const struct mmc_fixup mmc_ext_csd_fixups[] = { + END_FIXUP + }; + ++ + static const struct mmc_fixup sdio_fixup_methods[] = { ++ SDIO_FIXUP(SDIO_VENDOR_ID_TI_WL1251, SDIO_DEVICE_ID_TI_WL1251, ++ add_quirk, MMC_QUIRK_NONSTD_FUNC_IF), ++ ++ SDIO_FIXUP(SDIO_VENDOR_ID_TI_WL1251, SDIO_DEVICE_ID_TI_WL1251, ++ add_quirk, MMC_QUIRK_DISABLE_CD), ++ + SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271, + add_quirk, MMC_QUIRK_NONSTD_FUNC_IF), + +diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c +index 552bddc5096c..1cd10356fc14 100644 +--- a/drivers/mmc/host/sdhci-brcmstb.c ++++ b/drivers/mmc/host/sdhci-brcmstb.c +@@ -55,7 +55,9 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) + } + + sdhci_get_of_property(pdev); +- mmc_of_parse(host->mmc); ++ res = mmc_of_parse(host->mmc); ++ if (res) ++ goto err; + + /* + * Supply the existing CAPS, but clear the UHS modes. This +diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c +index 8e49974ffa0e..8ee59b20b47a 100644 +--- a/drivers/net/dsa/qca8k.c ++++ b/drivers/net/dsa/qca8k.c +@@ -459,6 +459,18 @@ qca8k_set_pad_ctrl(struct qca8k_priv *priv, int port, int mode) + qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, + QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); + break; ++ case PHY_INTERFACE_MODE_RGMII_ID: ++ /* RGMII_ID needs internal delay. This is enabled through ++ * PORT5_PAD_CTRL for all ports, rather than individual port ++ * registers ++ */ ++ qca8k_write(priv, reg, ++ QCA8K_PORT_PAD_RGMII_EN | ++ QCA8K_PORT_PAD_RGMII_TX_DELAY(QCA8K_MAX_DELAY) | ++ QCA8K_PORT_PAD_RGMII_RX_DELAY(QCA8K_MAX_DELAY)); ++ qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, ++ QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); ++ break; + case PHY_INTERFACE_MODE_SGMII: + qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); + break; +diff --git a/drivers/net/dsa/qca8k.h b/drivers/net/dsa/qca8k.h +index 613fe5c50236..d146e54c8a6c 100644 +--- a/drivers/net/dsa/qca8k.h ++++ b/drivers/net/dsa/qca8k.h +@@ -40,6 +40,7 @@ + ((0x8 + (x & 0x3)) << 22) + #define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) \ + ((0x10 + (x & 0x3)) << 20) ++#define QCA8K_MAX_DELAY 3 + #define QCA8K_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) + #define QCA8K_PORT_PAD_SGMII_EN BIT(7) + #define QCA8K_REG_MODULE_EN 0x030 +diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c b/drivers/net/ethernet/amazon/ena/ena_com.c +index 1a4ffc5d3da4..10e6053f6671 100644 +--- a/drivers/net/ethernet/amazon/ena/ena_com.c ++++ b/drivers/net/ethernet/amazon/ena/ena_com.c +@@ -2002,7 +2002,7 @@ int ena_com_set_hash_function(struct ena_com_dev *ena_dev) + if (unlikely(ret)) + return ret; + +- if (get_resp.u.flow_hash_func.supported_func & (1 << rss->hash_func)) { ++ if (!(get_resp.u.flow_hash_func.supported_func & BIT(rss->hash_func))) { + pr_err("Func hash %d isn't supported by device, abort\n", + rss->hash_func); + return -EOPNOTSUPP; +@@ -2087,6 +2087,7 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev, + return -EINVAL; + } + ++ rss->hash_func = func; + rc = ena_com_set_hash_function(ena_dev); + + /* Restore the old function */ +diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/ethernet/amazon/ena/ena_ethtool.c +index 967020fb26ee..a2f02c23fe14 100644 +--- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c ++++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c +@@ -694,8 +694,8 @@ static int ena_set_rxfh(struct net_device *netdev, const u32 *indir, + if (indir) { + for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) { + rc = ena_com_indirect_table_fill_entry(ena_dev, +- ENA_IO_RXQ_IDX(indir[i]), +- i); ++ i, ++ ENA_IO_RXQ_IDX(indir[i])); + if (unlikely(rc)) { + netif_err(adapter, drv, netdev, + "Cannot fill indirect table (index is too large)\n"); +diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c +index d22b138c2b09..518ff393a026 100644 +--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c ++++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c +@@ -1796,6 +1796,7 @@ err_setup_rx: + err_setup_tx: + ena_free_io_irq(adapter); + err_req_irq: ++ ena_del_napi(adapter); + + return rc; + } +diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c +index 5fecc9a099ef..bb2894a333f2 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c ++++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c +@@ -310,15 +310,13 @@ irqreturn_t aq_vec_isr_legacy(int irq, void *private) + { + struct aq_vec_s *self = private; + u64 irq_mask = 0U; +- irqreturn_t err = 0; ++ int err; + +- if (!self) { +- err = -EINVAL; +- goto err_exit; +- } ++ if (!self) ++ return IRQ_NONE; + err = self->aq_hw_ops->hw_irq_read(self->aq_hw, &irq_mask); + if (err < 0) +- goto err_exit; ++ return IRQ_NONE; + + if (irq_mask) { + self->aq_hw_ops->hw_irq_disable(self->aq_hw, +@@ -326,11 +324,10 @@ irqreturn_t aq_vec_isr_legacy(int irq, void *private) + napi_schedule(&self->napi); + } else { + self->aq_hw_ops->hw_irq_enable(self->aq_hw, 1U); +- err = IRQ_NONE; ++ return IRQ_NONE; + } + +-err_exit: +- return err >= 0 ? IRQ_HANDLED : IRQ_NONE; ++ return IRQ_HANDLED; + } + + cpumask_t *aq_vec_get_affinity_mask(struct aq_vec_s *self) +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c +index b0abd187cead..b83ee74d2839 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c +@@ -182,8 +182,8 @@ static int hw_atl_a0_hw_rss_set(struct aq_hw_s *self, + u32 i = 0U; + u32 num_rss_queues = max(1U, self->aq_nic_cfg->num_rss_queues); + int err = 0; +- u16 bitary[(HW_ATL_A0_RSS_REDIRECTION_MAX * +- HW_ATL_A0_RSS_REDIRECTION_BITS / 16U)]; ++ u16 bitary[1 + (HW_ATL_A0_RSS_REDIRECTION_MAX * ++ HW_ATL_A0_RSS_REDIRECTION_BITS / 16U)]; + + memset(bitary, 0, sizeof(bitary)); + +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +index 236325f48ec9..1c1bb074f664 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +@@ -183,8 +183,8 @@ static int hw_atl_b0_hw_rss_set(struct aq_hw_s *self, + u32 i = 0U; + u32 num_rss_queues = max(1U, self->aq_nic_cfg->num_rss_queues); + int err = 0; +- u16 bitary[(HW_ATL_B0_RSS_REDIRECTION_MAX * +- HW_ATL_B0_RSS_REDIRECTION_BITS / 16U)]; ++ u16 bitary[1 + (HW_ATL_B0_RSS_REDIRECTION_MAX * ++ HW_ATL_B0_RSS_REDIRECTION_BITS / 16U)]; + + memset(bitary, 0, sizeof(bitary)); + +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c +index 79018fea7be2..69b2f99b0c19 100644 +--- a/drivers/net/ethernet/broadcom/bcmsysport.c ++++ b/drivers/net/ethernet/broadcom/bcmsysport.c +@@ -2116,7 +2116,7 @@ static int bcm_sysport_probe(struct platform_device *pdev) + + priv->phy_interface = of_get_phy_mode(dn); + /* Default to GMII interface mode */ +- if (priv->phy_interface < 0) ++ if ((int)priv->phy_interface < 0) + priv->phy_interface = PHY_INTERFACE_MODE_GMII; + + /* In the case of a fixed PHY, the DT node associated +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +index fc8e185718a1..3c78cd1cdd6f 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +@@ -1667,21 +1667,19 @@ static int bnxt_flash_package_from_file(struct net_device *dev, + mutex_lock(&bp->hwrm_cmd_lock); + hwrm_err = _hwrm_send_message(bp, &install, sizeof(install), + INSTALL_PACKAGE_TIMEOUT); +- if (hwrm_err) +- goto flash_pkg_exit; +- +- if (resp->error_code) { ++ if (hwrm_err) { + u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err; + +- if (error_code == NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { ++ if (resp->error_code && error_code == ++ NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { + install.flags |= cpu_to_le16( + NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG); + hwrm_err = _hwrm_send_message(bp, &install, + sizeof(install), + INSTALL_PACKAGE_TIMEOUT); +- if (hwrm_err) +- goto flash_pkg_exit; + } ++ if (hwrm_err) ++ goto flash_pkg_exit; + } + + if (resp->result) { +@@ -2463,7 +2461,7 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest, + bool offline = false; + u8 test_results = 0; + u8 test_mask = 0; +- int rc, i; ++ int rc = 0, i; + + if (!bp->num_tests || !BNXT_SINGLE_PF(bp)) + return; +@@ -2521,9 +2519,9 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest, + } + bnxt_hwrm_phy_loopback(bp, false); + bnxt_half_close_nic(bp); +- bnxt_open_nic(bp, false, true); ++ rc = bnxt_open_nic(bp, false, true); + } +- if (bnxt_test_irq(bp)) { ++ if (rc || bnxt_test_irq(bp)) { + buf[BNXT_IRQ_TEST_IDX] = 1; + etest->flags |= ETH_TEST_FL_FAILED; + } +diff --git a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +index aab6fb10af94..6adf6831d120 100644 +--- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c ++++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +@@ -1202,7 +1202,7 @@ static int hix5hd2_dev_probe(struct platform_device *pdev) + goto err_free_mdio; + + priv->phy_mode = of_get_phy_mode(node); +- if (priv->phy_mode < 0) { ++ if ((int)priv->phy_mode < 0) { + netdev_err(ndev, "not find phy-mode\n"); + ret = -EINVAL; + goto err_mdiobus; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +index 9fcfd9395424..a4c5e72d6012 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +@@ -480,7 +480,7 @@ struct hclge_vport { + u16 alloc_rss_size; + + u16 qs_offset; +- u16 bw_limit; /* VSI BW Limit (0 = disabled) */ ++ u32 bw_limit; /* VSI BW Limit (0 = disabled) */ + u8 dwrr; + + int vport_id; +diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c +index 30cbdf0fed59..373deb247ac0 100644 +--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c ++++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c +@@ -1475,7 +1475,7 @@ static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr, + + memset(pr, 0, sizeof(struct ehea_port_res)); + +- pr->tx_bytes = rx_bytes; ++ pr->tx_bytes = tx_bytes; + pr->tx_packets = tx_packets; + pr->rx_bytes = rx_bytes; + pr->rx_packets = rx_packets; +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +index 0edfd199937d..e4c1e6345edd 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +@@ -1871,13 +1871,7 @@ static void ixgbe_pull_tail(struct ixgbe_ring *rx_ring, + static void ixgbe_dma_sync_frag(struct ixgbe_ring *rx_ring, + struct sk_buff *skb) + { +- /* if the page was released unmap it, else just sync our portion */ +- if (unlikely(IXGBE_CB(skb)->page_released)) { +- dma_unmap_page_attrs(rx_ring->dev, IXGBE_CB(skb)->dma, +- ixgbe_rx_pg_size(rx_ring), +- DMA_FROM_DEVICE, +- IXGBE_RX_DMA_ATTR); +- } else if (ring_uses_build_skb(rx_ring)) { ++ if (ring_uses_build_skb(rx_ring)) { + unsigned long offset = (unsigned long)(skb->data) & ~PAGE_MASK; + + dma_sync_single_range_for_cpu(rx_ring->dev, +@@ -1894,6 +1888,14 @@ static void ixgbe_dma_sync_frag(struct ixgbe_ring *rx_ring, + skb_frag_size(frag), + DMA_FROM_DEVICE); + } ++ ++ /* If the page was released, just unmap it. */ ++ if (unlikely(IXGBE_CB(skb)->page_released)) { ++ dma_unmap_page_attrs(rx_ring->dev, IXGBE_CB(skb)->dma, ++ ixgbe_rx_pg_size(rx_ring), ++ DMA_FROM_DEVICE, ++ IXGBE_RX_DMA_ATTR); ++ } + } + + /** +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/qp.c b/drivers/net/ethernet/mellanox/mlx5/core/qp.c +index 5f091c6ea049..b92d5690287b 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/qp.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/qp.c +@@ -44,14 +44,15 @@ static struct mlx5_core_rsc_common *mlx5_get_rsc(struct mlx5_core_dev *dev, + { + struct mlx5_qp_table *table = &dev->priv.qp_table; + struct mlx5_core_rsc_common *common; ++ unsigned long flags; + +- spin_lock(&table->lock); ++ spin_lock_irqsave(&table->lock, flags); + + common = radix_tree_lookup(&table->tree, rsn); + if (common) + atomic_inc(&common->refcount); + +- spin_unlock(&table->lock); ++ spin_unlock_irqrestore(&table->lock, flags); + + if (!common) { + mlx5_core_warn(dev, "Async event for bogus resource 0x%x\n", +diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h +index 8ab7a4f98a07..e7974ba06432 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/reg.h ++++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h +@@ -2452,7 +2452,7 @@ static inline void mlxsw_reg_qtct_pack(char *payload, u8 local_port, + * Configures the ETS elements. + */ + #define MLXSW_REG_QEEC_ID 0x400D +-#define MLXSW_REG_QEEC_LEN 0x1C ++#define MLXSW_REG_QEEC_LEN 0x20 + + MLXSW_REG_DEFINE(qeec, MLXSW_REG_QEEC_ID, MLXSW_REG_QEEC_LEN); + +@@ -2494,6 +2494,15 @@ MLXSW_ITEM32(reg, qeec, element_index, 0x04, 0, 8); + */ + MLXSW_ITEM32(reg, qeec, next_element_index, 0x08, 0, 8); + ++/* reg_qeec_mise ++ * Min shaper configuration enable. Enables configuration of the min ++ * shaper on this ETS element ++ * 0 - Disable ++ * 1 - Enable ++ * Access: RW ++ */ ++MLXSW_ITEM32(reg, qeec, mise, 0x0C, 31, 1); ++ + enum { + MLXSW_REG_QEEC_BYTES_MODE, + MLXSW_REG_QEEC_PACKETS_MODE, +@@ -2510,6 +2519,17 @@ enum { + */ + MLXSW_ITEM32(reg, qeec, pb, 0x0C, 28, 1); + ++/* The smallest permitted min shaper rate. */ ++#define MLXSW_REG_QEEC_MIS_MIN 200000 /* Kbps */ ++ ++/* reg_qeec_min_shaper_rate ++ * Min shaper information rate. ++ * For CPU port, can only be configured for port hierarchy. ++ * When in bytes mode, value is specified in units of 1000bps. ++ * Access: RW ++ */ ++MLXSW_ITEM32(reg, qeec, min_shaper_rate, 0x0C, 0, 28); ++ + /* reg_qeec_mase + * Max shaper configuration enable. Enables configuration of the max + * shaper on this ETS element. +diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c +index 23821540ab07..a051dddcbd76 100644 +--- a/drivers/net/ethernet/natsemi/sonic.c ++++ b/drivers/net/ethernet/natsemi/sonic.c +@@ -221,9 +221,9 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + + laddr = dma_map_single(lp->device, skb->data, length, DMA_TO_DEVICE); + if (!laddr) { +- printk(KERN_ERR "%s: failed to map tx DMA buffer.\n", dev->name); +- dev_kfree_skb(skb); +- return NETDEV_TX_BUSY; ++ pr_err_ratelimited("%s: failed to map tx DMA buffer.\n", dev->name); ++ dev_kfree_skb_any(skb); ++ return NETDEV_TX_OK; + } + + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ +diff --git a/drivers/net/ethernet/pasemi/pasemi_mac.c b/drivers/net/ethernet/pasemi/pasemi_mac.c +index 49591d9c2e1b..c9b4ac9d3330 100644 +--- a/drivers/net/ethernet/pasemi/pasemi_mac.c ++++ b/drivers/net/ethernet/pasemi/pasemi_mac.c +@@ -1053,7 +1053,6 @@ static int pasemi_mac_phy_init(struct net_device *dev) + + dn = pci_device_to_OF_node(mac->pdev); + phy_dn = of_parse_phandle(dn, "phy-handle", 0); +- of_node_put(phy_dn); + + mac->link = 0; + mac->speed = 0; +@@ -1062,6 +1061,7 @@ static int pasemi_mac_phy_init(struct net_device *dev) + phydev = of_phy_connect(dev, phy_dn, &pasemi_adjust_link, 0, + PHY_INTERFACE_MODE_SGMII); + ++ of_node_put(phy_dn); + if (!phydev) { + printk(KERN_ERR "%s: Could not attach to phy\n", dev->name); + return -ENODEV; +diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c +index bb09f5a9846f..38d0f62bf037 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c +@@ -509,7 +509,8 @@ int qed_iwarp_destroy_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp) + + /* Make sure ep is closed before returning and freeing memory. */ + if (ep) { +- while (ep->state != QED_IWARP_EP_CLOSED && wait_count++ < 200) ++ while (READ_ONCE(ep->state) != QED_IWARP_EP_CLOSED && ++ wait_count++ < 200) + msleep(100); + + if (ep->state != QED_IWARP_EP_CLOSED) +@@ -991,8 +992,6 @@ qed_iwarp_mpa_complete(struct qed_hwfn *p_hwfn, + + params.ep_context = ep; + +- ep->state = QED_IWARP_EP_CLOSED; +- + switch (fw_return_code) { + case RDMA_RETURN_OK: + ep->qp->max_rd_atomic_req = ep->cm_info.ord; +@@ -1052,6 +1051,10 @@ qed_iwarp_mpa_complete(struct qed_hwfn *p_hwfn, + break; + } + ++ if (fw_return_code != RDMA_RETURN_OK) ++ /* paired with READ_ONCE in destroy_qp */ ++ smp_store_release(&ep->state, QED_IWARP_EP_CLOSED); ++ + ep->event_cb(ep->cb_context, ¶ms); + + /* on passive side, if there is no associated QP (REJECT) we need to +@@ -2069,7 +2072,9 @@ void qed_iwarp_qp_in_error(struct qed_hwfn *p_hwfn, + params.status = (fw_return_code == IWARP_QP_IN_ERROR_GOOD_CLOSE) ? + 0 : -ECONNRESET; + +- ep->state = QED_IWARP_EP_CLOSED; ++ /* paired with READ_ONCE in destroy_qp */ ++ smp_store_release(&ep->state, QED_IWARP_EP_CLOSED); ++ + spin_lock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); + list_del(&ep->list_entry); + spin_unlock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); +@@ -2157,7 +2162,8 @@ qed_iwarp_tcp_connect_unsuccessful(struct qed_hwfn *p_hwfn, + params.event = QED_IWARP_EVENT_ACTIVE_COMPLETE; + params.ep_context = ep; + params.cm_info = &ep->cm_info; +- ep->state = QED_IWARP_EP_CLOSED; ++ /* paired with READ_ONCE in destroy_qp */ ++ smp_store_release(&ep->state, QED_IWARP_EP_CLOSED); + + switch (fw_return_code) { + case IWARP_CONN_ERROR_TCP_CONNECT_INVALID_PACKET: +diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c b/drivers/net/ethernet/qlogic/qed/qed_l2.c +index 62cde3854a5c..5d7adedac68d 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_l2.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c +@@ -1629,10 +1629,9 @@ static void __qed_get_vport_pstats_addrlen(struct qed_hwfn *p_hwfn, + } + } + +-static void __qed_get_vport_pstats(struct qed_hwfn *p_hwfn, +- struct qed_ptt *p_ptt, +- struct qed_eth_stats *p_stats, +- u16 statistics_bin) ++static noinline_for_stack void ++__qed_get_vport_pstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, ++ struct qed_eth_stats *p_stats, u16 statistics_bin) + { + struct eth_pstorm_per_queue_stat pstats; + u32 pstats_addr = 0, pstats_len = 0; +@@ -1659,10 +1658,9 @@ static void __qed_get_vport_pstats(struct qed_hwfn *p_hwfn, + HILO_64_REGPAIR(pstats.error_drop_pkts); + } + +-static void __qed_get_vport_tstats(struct qed_hwfn *p_hwfn, +- struct qed_ptt *p_ptt, +- struct qed_eth_stats *p_stats, +- u16 statistics_bin) ++static noinline_for_stack void ++__qed_get_vport_tstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, ++ struct qed_eth_stats *p_stats, u16 statistics_bin) + { + struct tstorm_per_port_stat tstats; + u32 tstats_addr, tstats_len; +@@ -1705,10 +1703,9 @@ static void __qed_get_vport_ustats_addrlen(struct qed_hwfn *p_hwfn, + } + } + +-static void __qed_get_vport_ustats(struct qed_hwfn *p_hwfn, +- struct qed_ptt *p_ptt, +- struct qed_eth_stats *p_stats, +- u16 statistics_bin) ++static noinline_for_stack ++void __qed_get_vport_ustats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, ++ struct qed_eth_stats *p_stats, u16 statistics_bin) + { + struct eth_ustorm_per_queue_stat ustats; + u32 ustats_addr = 0, ustats_len = 0; +@@ -1747,10 +1744,9 @@ static void __qed_get_vport_mstats_addrlen(struct qed_hwfn *p_hwfn, + } + } + +-static void __qed_get_vport_mstats(struct qed_hwfn *p_hwfn, +- struct qed_ptt *p_ptt, +- struct qed_eth_stats *p_stats, +- u16 statistics_bin) ++static noinline_for_stack void ++__qed_get_vport_mstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, ++ struct qed_eth_stats *p_stats, u16 statistics_bin) + { + struct eth_mstorm_per_queue_stat mstats; + u32 mstats_addr = 0, mstats_len = 0; +@@ -1776,9 +1772,9 @@ static void __qed_get_vport_mstats(struct qed_hwfn *p_hwfn, + HILO_64_REGPAIR(mstats.tpa_coalesced_bytes); + } + +-static void __qed_get_vport_port_stats(struct qed_hwfn *p_hwfn, +- struct qed_ptt *p_ptt, +- struct qed_eth_stats *p_stats) ++static noinline_for_stack void ++__qed_get_vport_port_stats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, ++ struct qed_eth_stats *p_stats) + { + struct qed_eth_stats_common *p_common = &p_stats->common; + struct port_stats port_stats; +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c +index 275fc6f154a7..1c87178fc485 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.c ++++ b/drivers/net/ethernet/qualcomm/qca_spi.c +@@ -475,7 +475,6 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event) + u16 signature = 0; + u16 spi_config; + u16 wrbuf_space = 0; +- static u16 reset_count; + + if (event == QCASPI_EVENT_CPUON) { + /* Read signature twice, if not valid +@@ -528,13 +527,13 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event) + + qca->sync = QCASPI_SYNC_RESET; + qca->stats.trig_reset++; +- reset_count = 0; ++ qca->reset_count = 0; + break; + case QCASPI_SYNC_RESET: +- reset_count++; ++ qca->reset_count++; + netdev_dbg(qca->net_dev, "sync: waiting for CPU on, count %u.\n", +- reset_count); +- if (reset_count >= QCASPI_RESET_TIMEOUT) { ++ qca->reset_count); ++ if (qca->reset_count >= QCASPI_RESET_TIMEOUT) { + /* reset did not seem to take place, try again */ + qca->sync = QCASPI_SYNC_UNKNOWN; + qca->stats.reset_timeout++; +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.h b/drivers/net/ethernet/qualcomm/qca_spi.h +index fc0e98726b36..719c41227f22 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.h ++++ b/drivers/net/ethernet/qualcomm/qca_spi.h +@@ -92,6 +92,7 @@ struct qcaspi { + + unsigned int intr_req; + unsigned int intr_svc; ++ u16 reset_count; + + #ifdef CONFIG_DEBUG_FS + struct dentry *device_root; +diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c +index 9b1906a65e11..25f3b2ad26e9 100644 +--- a/drivers/net/ethernet/renesas/sh_eth.c ++++ b/drivers/net/ethernet/renesas/sh_eth.c +@@ -3046,12 +3046,16 @@ static struct sh_eth_plat_data *sh_eth_parse_dt(struct device *dev) + struct device_node *np = dev->of_node; + struct sh_eth_plat_data *pdata; + const char *mac_addr; ++ int ret; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return NULL; + +- pdata->phy_interface = of_get_phy_mode(np); ++ ret = of_get_phy_mode(np); ++ if (ret < 0) ++ return NULL; ++ pdata->phy_interface = ret; + + mac_addr = of_get_mac_address(np); + if (mac_addr) +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +index 866444b6c82f..11a4a81b0397 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +@@ -203,7 +203,7 @@ static int ipq806x_gmac_of_parse(struct ipq806x_gmac *gmac) + struct device *dev = &gmac->pdev->dev; + + gmac->phy_mode = of_get_phy_mode(dev->of_node); +- if (gmac->phy_mode < 0) { ++ if ((int)gmac->phy_mode < 0) { + dev_err(dev, "missing phy mode property\n"); + return -EINVAL; + } +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +index 8be4b32544ef..d71d3c1c85ee 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +@@ -285,7 +285,7 @@ static int meson8b_dwmac_probe(struct platform_device *pdev) + + dwmac->pdev = pdev; + dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); +- if (dwmac->phy_mode < 0) { ++ if ((int)dwmac->phy_mode < 0) { + dev_err(&pdev->dev, "missing phy-mode property\n"); + ret = -EINVAL; + goto err_remove_config_dt; +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +index 8445af580cb6..e5566c121525 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +@@ -438,7 +438,7 @@ static void dwmac4_set_filter(struct mac_device_info *hw, + } + + /* Handle multiple unicast addresses */ +- if (netdev_uc_count(dev) > GMAC_MAX_PERFECT_ADDRESSES) { ++ if (netdev_uc_count(dev) > hw->unicast_filter_entries) { + /* Switch to promiscuous mode if more than 128 addrs + * are required + */ +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +index e471a903c654..1c1d6a942822 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +@@ -154,7 +154,7 @@ static int stmmac_enable(struct ptp_clock_info *ptp, + /* structure describing a PTP hardware clock */ + static const struct ptp_clock_info stmmac_ptp_clock_ops = { + .owner = THIS_MODULE, +- .name = "stmmac_ptp_clock", ++ .name = "stmmac ptp", + .max_adj = 62500000, + .n_alarm = 0, + .n_ext_ts = 0, +diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +index 9ccd08a051f6..1152d74433f6 100644 +--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c ++++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +@@ -1574,7 +1574,7 @@ static int axienet_probe(struct platform_device *pdev) + } + } else { + lp->phy_mode = of_get_phy_mode(pdev->dev.of_node); +- if (lp->phy_mode < 0) { ++ if ((int)lp->phy_mode < 0) { + ret = -EINVAL; + goto free_netdev; + } +diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c +index a89de5752a8c..14451e14d99d 100644 +--- a/drivers/net/hyperv/netvsc_drv.c ++++ b/drivers/net/hyperv/netvsc_drv.c +@@ -282,9 +282,9 @@ static inline u32 netvsc_get_hash( + else if (flow.basic.n_proto == htons(ETH_P_IPV6)) + hash = jhash2((u32 *)&flow.addrs.v6addrs, 8, hashrnd); + else +- hash = 0; ++ return 0; + +- skb_set_hash(skb, hash, PKT_HASH_TYPE_L3); ++ __skb_set_sw_hash(skb, hash, false); + } + + return hash; +@@ -802,8 +802,7 @@ static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net, + skb->protocol == htons(ETH_P_IP)) + netvsc_comp_ipcsum(skb); + +- /* Do L4 checksum offload if enabled and present. +- */ ++ /* Do L4 checksum offload if enabled and present. */ + if (csum_info && (net->features & NETIF_F_RXCSUM)) { + if (csum_info->receive.tcp_checksum_succeeded || + csum_info->receive.udp_checksum_succeeded) +@@ -1840,6 +1839,12 @@ static rx_handler_result_t netvsc_vf_handle_frame(struct sk_buff **pskb) + struct netvsc_vf_pcpu_stats *pcpu_stats + = this_cpu_ptr(ndev_ctx->vf_stats); + ++ skb = skb_share_check(skb, GFP_ATOMIC); ++ if (unlikely(!skb)) ++ return RX_HANDLER_CONSUMED; ++ ++ *pskb = skb; ++ + skb->dev = ndev; + + u64_stats_update_begin(&pcpu_stats->syncp); +diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c +index eb5167210681..3ab2eb677a59 100644 +--- a/drivers/net/phy/fixed_phy.c ++++ b/drivers/net/phy/fixed_phy.c +@@ -67,11 +67,11 @@ static int fixed_mdio_read(struct mii_bus *bus, int phy_addr, int reg_num) + do { + s = read_seqcount_begin(&fp->seqcount); + /* Issue callback if user registered it. */ +- if (fp->link_update) { ++ if (fp->link_update) + fp->link_update(fp->phydev->attached_dev, + &fp->status); +- fixed_phy_update(fp); +- } ++ /* Check the GPIO for change in status */ ++ fixed_phy_update(fp); + state = fp->status; + } while (read_seqcount_retry(&fp->seqcount, s)); + +diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c +index a98c227a4c2e..99dae55cd334 100644 +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -76,7 +76,7 @@ static LIST_HEAD(phy_fixup_list); + static DEFINE_MUTEX(phy_fixup_lock); + + #ifdef CONFIG_PM +-static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) ++static bool mdio_bus_phy_may_suspend(struct phy_device *phydev, bool suspend) + { + struct device_driver *drv = phydev->mdio.dev.driver; + struct phy_driver *phydrv = to_phy_driver(drv); +@@ -88,10 +88,11 @@ static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) + /* PHY not attached? May suspend if the PHY has not already been + * suspended as part of a prior call to phy_disconnect() -> + * phy_detach() -> phy_suspend() because the parent netdev might be the +- * MDIO bus driver and clock gated at this point. ++ * MDIO bus driver and clock gated at this point. Also may resume if ++ * PHY is not attached. + */ + if (!netdev) +- return !phydev->suspended; ++ return suspend ? !phydev->suspended : phydev->suspended; + + /* Don't suspend PHY if the attached netdev parent may wakeup. + * The parent may point to a PCI device, as in tg3 driver. +@@ -121,7 +122,7 @@ static int mdio_bus_phy_suspend(struct device *dev) + if (phydev->attached_dev && phydev->adjust_link) + phy_stop_machine(phydev); + +- if (!mdio_bus_phy_may_suspend(phydev)) ++ if (!mdio_bus_phy_may_suspend(phydev, true)) + return 0; + + return phy_suspend(phydev); +@@ -132,7 +133,7 @@ static int mdio_bus_phy_resume(struct device *dev) + struct phy_device *phydev = to_phy_device(dev); + int ret; + +- if (!mdio_bus_phy_may_suspend(phydev)) ++ if (!mdio_bus_phy_may_suspend(phydev, false)) + goto no_resume; + + ret = phy_resume(phydev); +diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c +index 5aa7d5091f4d..4d97a7b5fe3c 100644 +--- a/drivers/net/vxlan.c ++++ b/drivers/net/vxlan.c +@@ -3494,7 +3494,6 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], + struct vxlan_rdst *dst = &vxlan->default_dst; + struct vxlan_rdst old_dst; + struct vxlan_config conf; +- struct vxlan_fdb *f = NULL; + int err; + + err = vxlan_nl2conf(tb, data, +@@ -3520,19 +3519,19 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], + old_dst.remote_ifindex, 0); + + if (!vxlan_addr_any(&dst->remote_ip)) { +- err = vxlan_fdb_create(vxlan, all_zeros_mac, ++ err = vxlan_fdb_update(vxlan, all_zeros_mac, + &dst->remote_ip, + NUD_REACHABLE | NUD_PERMANENT, ++ NLM_F_APPEND | NLM_F_CREATE, + vxlan->cfg.dst_port, + dst->remote_vni, + dst->remote_vni, + dst->remote_ifindex, +- NTF_SELF, &f); ++ NTF_SELF); + if (err) { + spin_unlock_bh(&vxlan->hash_lock); + return err; + } +- vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH); + } + spin_unlock_bh(&vxlan->hash_lock); + } +diff --git a/drivers/net/wireless/ath/ath10k/sdio.c b/drivers/net/wireless/ath/ath10k/sdio.c +index 0a1248ebccf5..f49b21b137c1 100644 +--- a/drivers/net/wireless/ath/ath10k/sdio.c ++++ b/drivers/net/wireless/ath/ath10k/sdio.c +@@ -392,16 +392,11 @@ static int ath10k_sdio_mbox_rx_process_packet(struct ath10k *ar, + struct ath10k_htc_hdr *htc_hdr = (struct ath10k_htc_hdr *)skb->data; + bool trailer_present = htc_hdr->flags & ATH10K_HTC_FLAG_TRAILER_PRESENT; + enum ath10k_htc_ep_id eid; +- u16 payload_len; + u8 *trailer; + int ret; + +- payload_len = le16_to_cpu(htc_hdr->len); +- skb->len = payload_len + sizeof(struct ath10k_htc_hdr); +- + if (trailer_present) { +- trailer = skb->data + sizeof(*htc_hdr) + +- payload_len - htc_hdr->trailer_len; ++ trailer = skb->data + skb->len - htc_hdr->trailer_len; + + eid = pipe_id_to_eid(htc_hdr->eid); + +@@ -635,13 +630,31 @@ static int ath10k_sdio_mbox_rx_packet(struct ath10k *ar, + { + struct ath10k_sdio *ar_sdio = ath10k_sdio_priv(ar); + struct sk_buff *skb = pkt->skb; ++ struct ath10k_htc_hdr *htc_hdr; + int ret; + + ret = ath10k_sdio_readsb(ar, ar_sdio->mbox_info.htc_addr, + skb->data, pkt->alloc_len); ++ if (ret) ++ goto out; ++ ++ /* Update actual length. The original length may be incorrect, ++ * as the FW will bundle multiple packets as long as their sizes ++ * fit within the same aligned length (pkt->alloc_len). ++ */ ++ htc_hdr = (struct ath10k_htc_hdr *)skb->data; ++ pkt->act_len = le16_to_cpu(htc_hdr->len) + sizeof(*htc_hdr); ++ if (pkt->act_len > pkt->alloc_len) { ++ ath10k_warn(ar, "rx packet too large (%zu > %zu)\n", ++ pkt->act_len, pkt->alloc_len); ++ ret = -EMSGSIZE; ++ goto out; ++ } ++ ++ skb_put(skb, pkt->act_len); ++ ++out: + pkt->status = ret; +- if (!ret) +- skb_put(skb, pkt->act_len); + + return ret; + } +diff --git a/drivers/net/wireless/ath/ath9k/dynack.c b/drivers/net/wireless/ath/ath9k/dynack.c +index 6e236a485431..71b4888b30e7 100644 +--- a/drivers/net/wireless/ath/ath9k/dynack.c ++++ b/drivers/net/wireless/ath/ath9k/dynack.c +@@ -300,9 +300,9 @@ void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an) + + an->ackto = ackto; + +- spin_lock(&da->qlock); ++ spin_lock_bh(&da->qlock); + list_add_tail(&an->list, &da->nodes); +- spin_unlock(&da->qlock); ++ spin_unlock_bh(&da->qlock); + } + EXPORT_SYMBOL(ath_dynack_node_init); + +@@ -316,9 +316,9 @@ void ath_dynack_node_deinit(struct ath_hw *ah, struct ath_node *an) + { + struct ath_dynack *da = &ah->dynack; + +- spin_lock(&da->qlock); ++ spin_lock_bh(&da->qlock); + list_del(&an->list); +- spin_unlock(&da->qlock); ++ spin_unlock_bh(&da->qlock); + } + EXPORT_SYMBOL(ath_dynack_node_deinit); + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +index 78228f870f8f..754dcc1c1f40 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +@@ -107,12 +107,12 @@ static int iwl_send_rss_cfg_cmd(struct iwl_mvm *mvm) + int i; + struct iwl_rss_config_cmd cmd = { + .flags = cpu_to_le32(IWL_RSS_ENABLE), +- .hash_mask = IWL_RSS_HASH_TYPE_IPV4_TCP | +- IWL_RSS_HASH_TYPE_IPV4_UDP | +- IWL_RSS_HASH_TYPE_IPV4_PAYLOAD | +- IWL_RSS_HASH_TYPE_IPV6_TCP | +- IWL_RSS_HASH_TYPE_IPV6_UDP | +- IWL_RSS_HASH_TYPE_IPV6_PAYLOAD, ++ .hash_mask = BIT(IWL_RSS_HASH_TYPE_IPV4_TCP) | ++ BIT(IWL_RSS_HASH_TYPE_IPV4_UDP) | ++ BIT(IWL_RSS_HASH_TYPE_IPV4_PAYLOAD) | ++ BIT(IWL_RSS_HASH_TYPE_IPV6_TCP) | ++ BIT(IWL_RSS_HASH_TYPE_IPV6_UDP) | ++ BIT(IWL_RSS_HASH_TYPE_IPV6_PAYLOAD), + }; + + if (mvm->trans->num_rx_queues == 1) +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +index 7fb8bbaf2142..1a12e829e98b 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +@@ -871,12 +871,12 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi, + bool toggle_bit = phy_info & IWL_RX_MPDU_PHY_AMPDU_TOGGLE; + + rx_status->flag |= RX_FLAG_AMPDU_DETAILS; +- rx_status->ampdu_reference = mvm->ampdu_ref; + /* toggle is switched whenever new aggregation starts */ + if (toggle_bit != mvm->ampdu_toggle) { + mvm->ampdu_ref++; + mvm->ampdu_toggle = toggle_bit; + } ++ rx_status->ampdu_reference = mvm->ampdu_ref; + } + + rcu_read_lock(); +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +index 0cfdbaa2af3a..684c0f65a052 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +@@ -2417,7 +2417,7 @@ int iwl_mvm_sta_tx_agg_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif, + struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); + struct iwl_mvm_tid_data *tid_data; + u16 normalized_ssn; +- int txq_id; ++ u16 txq_id; + int ret; + + if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT)) +@@ -2452,17 +2452,24 @@ int iwl_mvm_sta_tx_agg_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif, + */ + txq_id = mvmsta->tid_data[tid].txq_id; + if (txq_id == IWL_MVM_INVALID_QUEUE) { +- txq_id = iwl_mvm_find_free_queue(mvm, mvmsta->sta_id, +- IWL_MVM_DQA_MIN_DATA_QUEUE, +- IWL_MVM_DQA_MAX_DATA_QUEUE); +- if (txq_id < 0) { +- ret = txq_id; ++ ret = iwl_mvm_find_free_queue(mvm, mvmsta->sta_id, ++ IWL_MVM_DQA_MIN_DATA_QUEUE, ++ IWL_MVM_DQA_MAX_DATA_QUEUE); ++ if (ret < 0) { + IWL_ERR(mvm, "Failed to allocate agg queue\n"); + goto release_locks; + } + ++ txq_id = ret; ++ + /* TXQ hasn't yet been enabled, so mark it only as reserved */ + mvm->queue_info[txq_id].status = IWL_MVM_QUEUE_RESERVED; ++ } else if (WARN_ON(txq_id >= IWL_MAX_HW_QUEUES)) { ++ ret = -ENXIO; ++ IWL_ERR(mvm, "tid_id %d out of range (0, %d)!\n", ++ tid, IWL_MAX_HW_QUEUES - 1); ++ goto out; ++ + } else if (unlikely(mvm->queue_info[txq_id].status == + IWL_MVM_QUEUE_SHARED)) { + ret = -ENXIO; +diff --git a/drivers/net/wireless/marvell/libertas_tf/cmd.c b/drivers/net/wireless/marvell/libertas_tf/cmd.c +index 909ac3685010..2b193f1257a5 100644 +--- a/drivers/net/wireless/marvell/libertas_tf/cmd.c ++++ b/drivers/net/wireless/marvell/libertas_tf/cmd.c +@@ -69,7 +69,7 @@ static void lbtf_geo_init(struct lbtf_private *priv) + break; + } + +- for (ch = priv->range.start; ch < priv->range.end; ch++) ++ for (ch = range->start; ch < range->end; ch++) + priv->channels[CHAN_TO_IDX(ch)].flags = 0; + } + +diff --git a/drivers/net/wireless/mediatek/mt7601u/phy.c b/drivers/net/wireless/mediatek/mt7601u/phy.c +index ca09a5d4305e..71a47459bf8a 100644 +--- a/drivers/net/wireless/mediatek/mt7601u/phy.c ++++ b/drivers/net/wireless/mediatek/mt7601u/phy.c +@@ -221,7 +221,7 @@ int mt7601u_wait_bbp_ready(struct mt7601u_dev *dev) + + do { + val = mt7601u_bbp_rr(dev, MT_BBP_REG_VERSION); +- if (val && ~val) ++ if (val && val != 0xff) + break; + } while (--i); + +diff --git a/drivers/ntb/hw/idt/ntb_hw_idt.c b/drivers/ntb/hw/idt/ntb_hw_idt.c +index d44d7ef38fe8..b68e2cad74cc 100644 +--- a/drivers/ntb/hw/idt/ntb_hw_idt.c ++++ b/drivers/ntb/hw/idt/ntb_hw_idt.c +@@ -1105,9 +1105,9 @@ static struct idt_mw_cfg *idt_scan_mws(struct idt_ntb_dev *ndev, int port, + } + + /* Allocate memory for memory window descriptors */ +- ret_mws = devm_kcalloc(&ndev->ntb.pdev->dev, *mw_cnt, +- sizeof(*ret_mws), GFP_KERNEL); +- if (IS_ERR_OR_NULL(ret_mws)) ++ ret_mws = devm_kcalloc(&ndev->ntb.pdev->dev, *mw_cnt, sizeof(*ret_mws), ++ GFP_KERNEL); ++ if (!ret_mws) + return ERR_PTR(-ENOMEM); + + /* Copy the info of detected memory windows */ +@@ -2393,7 +2393,7 @@ static struct idt_ntb_dev *idt_create_dev(struct pci_dev *pdev, + + /* Allocate memory for the IDT PCIe-device descriptor */ + ndev = devm_kzalloc(&pdev->dev, sizeof(*ndev), GFP_KERNEL); +- if (IS_ERR_OR_NULL(ndev)) { ++ if (!ndev) { + dev_err(&pdev->dev, "Memory allocation failed for descriptor"); + return ERR_PTR(-ENOMEM); + } +diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c +index cd11cced3678..3788c053a0b1 100644 +--- a/drivers/nvme/host/pci.c ++++ b/drivers/nvme/host/pci.c +@@ -2274,7 +2274,7 @@ static int nvme_pci_reg_write32(struct nvme_ctrl *ctrl, u32 off, u32 val) + + static int nvme_pci_reg_read64(struct nvme_ctrl *ctrl, u32 off, u64 *val) + { +- *val = readq(to_nvme_dev(ctrl)->bar + off); ++ *val = lo_hi_readq(to_nvme_dev(ctrl)->bar + off); + return 0; + } + +diff --git a/drivers/nvmem/imx-ocotp.c b/drivers/nvmem/imx-ocotp.c +index 193ca8fd350a..0c8c3b9bb6a7 100644 +--- a/drivers/nvmem/imx-ocotp.c ++++ b/drivers/nvmem/imx-ocotp.c +@@ -199,7 +199,8 @@ static int imx_ocotp_write(void *context, unsigned int offset, void *val, + strobe_prog = clk_rate / (1000000000 / 10000) + 2 * (DEF_RELAX + 1) - 1; + strobe_read = clk_rate / (1000000000 / 40) + 2 * (DEF_RELAX + 1) - 1; + +- timing = strobe_prog & 0x00000FFF; ++ timing = readl(priv->base + IMX_OCOTP_ADDR_TIMING) & 0x0FC00000; ++ timing |= strobe_prog & 0x00000FFF; + timing |= (relax << 12) & 0x0000F000; + timing |= (strobe_read << 16) & 0x003F0000; + +diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c +index 8c1819230ed2..fe26697d3bd7 100644 +--- a/drivers/of/of_mdio.c ++++ b/drivers/of/of_mdio.c +@@ -358,7 +358,7 @@ struct phy_device *of_phy_get_and_connect(struct net_device *dev, + struct phy_device *phy; + + iface = of_get_phy_mode(np); +- if (iface < 0) ++ if ((int)iface < 0) + return NULL; + + phy_np = of_parse_phandle(np, "phy-handle", 0); +diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c +index f9308c2f22e6..c2541a772abc 100644 +--- a/drivers/pci/endpoint/functions/pci-epf-test.c ++++ b/drivers/pci/endpoint/functions/pci-epf-test.c +@@ -177,7 +177,7 @@ static int pci_epf_test_read(struct pci_epf_test *epf_test) + goto err_map_addr; + } + +- memcpy(buf, src_addr, reg->size); ++ memcpy_fromio(buf, src_addr, reg->size); + + crc32 = crc32_le(~0, buf, reg->size); + if (crc32 != reg->checksum) +@@ -231,7 +231,7 @@ static int pci_epf_test_write(struct pci_epf_test *epf_test) + get_random_bytes(buf, reg->size); + reg->checksum = crc32_le(~0, buf, reg->size); + +- memcpy(dst_addr, buf, reg->size); ++ memcpy_toio(dst_addr, buf, reg->size); + + /* + * wait 1ms inorder for the write to complete. Without this delay L3 +diff --git a/drivers/pci/host/pcie-iproc.c b/drivers/pci/host/pcie-iproc.c +index c0ecc9f35667..8f8dac0155d6 100644 +--- a/drivers/pci/host/pcie-iproc.c ++++ b/drivers/pci/host/pcie-iproc.c +@@ -573,14 +573,6 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie, + return (pcie->base + offset); + } + +- /* +- * PAXC is connected to an internally emulated EP within the SoC. It +- * allows only one device. +- */ +- if (pcie->ep_is_internal) +- if (slot > 0) +- return NULL; +- + return iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where); + } + +diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c +index 0941555b84a5..73dba2739849 100644 +--- a/drivers/pci/switch/switchtec.c ++++ b/drivers/pci/switch/switchtec.c +@@ -399,10 +399,6 @@ static void mrpc_cmd_submit(struct switchtec_dev *stdev) + stuser->data, stuser->data_len); + iowrite32(stuser->cmd, &stdev->mmio_mrpc->cmd); + +- stuser->status = ioread32(&stdev->mmio_mrpc->status); +- if (stuser->status != SWITCHTEC_MRPC_STATUS_INPROGRESS) +- mrpc_complete_cmd(stdev); +- + schedule_delayed_work(&stdev->mrpc_timeout, + msecs_to_jiffies(500)); + } +diff --git a/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c b/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c +index 85a8c97d9dfe..5fe419e468ec 100644 +--- a/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c ++++ b/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c +@@ -54,8 +54,12 @@ + /* drive strength control for ASIU GPIO */ + #define IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET 0x58 + +-/* drive strength control for CCM/CRMU (AON) GPIO */ +-#define IPROC_GPIO_DRV0_CTRL_OFFSET 0x00 ++/* pinconf for CCM GPIO */ ++#define IPROC_GPIO_PULL_DN_OFFSET 0x10 ++#define IPROC_GPIO_PULL_UP_OFFSET 0x14 ++ ++/* pinconf for CRMU(aon) GPIO and CCM GPIO*/ ++#define IPROC_GPIO_DRV_CTRL_OFFSET 0x00 + + #define GPIO_BANK_SIZE 0x200 + #define NGPIOS_PER_BANK 32 +@@ -76,6 +80,12 @@ enum iproc_pinconf_param { + IPROC_PINCON_MAX, + }; + ++enum iproc_pinconf_ctrl_type { ++ IOCTRL_TYPE_AON = 1, ++ IOCTRL_TYPE_CDRU, ++ IOCTRL_TYPE_INVALID, ++}; ++ + /* + * Iproc GPIO core + * +@@ -100,6 +110,7 @@ struct iproc_gpio { + + void __iomem *base; + void __iomem *io_ctrl; ++ enum iproc_pinconf_ctrl_type io_ctrl_type; + + raw_spinlock_t lock; + +@@ -461,20 +472,44 @@ static const struct pinctrl_ops iproc_pctrl_ops = { + static int iproc_gpio_set_pull(struct iproc_gpio *chip, unsigned gpio, + bool disable, bool pull_up) + { ++ void __iomem *base; + unsigned long flags; ++ unsigned int shift; ++ u32 val_1, val_2; + + raw_spin_lock_irqsave(&chip->lock, flags); +- +- if (disable) { +- iproc_set_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio, false); ++ if (chip->io_ctrl_type == IOCTRL_TYPE_CDRU) { ++ base = chip->io_ctrl; ++ shift = IPROC_GPIO_SHIFT(gpio); ++ ++ val_1 = readl(base + IPROC_GPIO_PULL_UP_OFFSET); ++ val_2 = readl(base + IPROC_GPIO_PULL_DN_OFFSET); ++ if (disable) { ++ /* no pull-up or pull-down */ ++ val_1 &= ~BIT(shift); ++ val_2 &= ~BIT(shift); ++ } else if (pull_up) { ++ val_1 |= BIT(shift); ++ val_2 &= ~BIT(shift); ++ } else { ++ val_1 &= ~BIT(shift); ++ val_2 |= BIT(shift); ++ } ++ writel(val_1, base + IPROC_GPIO_PULL_UP_OFFSET); ++ writel(val_2, base + IPROC_GPIO_PULL_DN_OFFSET); + } else { +- iproc_set_bit(chip, IPROC_GPIO_PAD_RES_OFFSET, gpio, +- pull_up); +- iproc_set_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio, true); ++ if (disable) { ++ iproc_set_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio, ++ false); ++ } else { ++ iproc_set_bit(chip, IPROC_GPIO_PAD_RES_OFFSET, gpio, ++ pull_up); ++ iproc_set_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio, ++ true); ++ } + } + + raw_spin_unlock_irqrestore(&chip->lock, flags); +- + dev_dbg(chip->dev, "gpio:%u set pullup:%d\n", gpio, pull_up); + + return 0; +@@ -483,14 +518,35 @@ static int iproc_gpio_set_pull(struct iproc_gpio *chip, unsigned gpio, + static void iproc_gpio_get_pull(struct iproc_gpio *chip, unsigned gpio, + bool *disable, bool *pull_up) + { ++ void __iomem *base; + unsigned long flags; ++ unsigned int shift; ++ u32 val_1, val_2; + + raw_spin_lock_irqsave(&chip->lock, flags); +- *disable = !iproc_get_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio); +- *pull_up = iproc_get_bit(chip, IPROC_GPIO_PAD_RES_OFFSET, gpio); ++ if (chip->io_ctrl_type == IOCTRL_TYPE_CDRU) { ++ base = chip->io_ctrl; ++ shift = IPROC_GPIO_SHIFT(gpio); ++ ++ val_1 = readl(base + IPROC_GPIO_PULL_UP_OFFSET) & BIT(shift); ++ val_2 = readl(base + IPROC_GPIO_PULL_DN_OFFSET) & BIT(shift); ++ ++ *pull_up = val_1 ? true : false; ++ *disable = (val_1 | val_2) ? false : true; ++ ++ } else { ++ *disable = !iproc_get_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio); ++ *pull_up = iproc_get_bit(chip, IPROC_GPIO_PAD_RES_OFFSET, gpio); ++ } + raw_spin_unlock_irqrestore(&chip->lock, flags); + } + ++#define DRV_STRENGTH_OFFSET(gpio, bit, type) ((type) == IOCTRL_TYPE_AON ? \ ++ ((2 - (bit)) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \ ++ ((type) == IOCTRL_TYPE_CDRU) ? \ ++ ((bit) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \ ++ ((bit) * 4 + IPROC_GPIO_REG(gpio, IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET))) ++ + static int iproc_gpio_set_strength(struct iproc_gpio *chip, unsigned gpio, + unsigned strength) + { +@@ -505,11 +561,8 @@ static int iproc_gpio_set_strength(struct iproc_gpio *chip, unsigned gpio, + + if (chip->io_ctrl) { + base = chip->io_ctrl; +- offset = IPROC_GPIO_DRV0_CTRL_OFFSET; + } else { + base = chip->base; +- offset = IPROC_GPIO_REG(gpio, +- IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET); + } + + shift = IPROC_GPIO_SHIFT(gpio); +@@ -520,11 +573,11 @@ static int iproc_gpio_set_strength(struct iproc_gpio *chip, unsigned gpio, + raw_spin_lock_irqsave(&chip->lock, flags); + strength = (strength / 2) - 1; + for (i = 0; i < GPIO_DRV_STRENGTH_BITS; i++) { ++ offset = DRV_STRENGTH_OFFSET(gpio, i, chip->io_ctrl_type); + val = readl(base + offset); + val &= ~BIT(shift); + val |= ((strength >> i) & 0x1) << shift; + writel(val, base + offset); +- offset += 4; + } + raw_spin_unlock_irqrestore(&chip->lock, flags); + +@@ -541,11 +594,8 @@ static int iproc_gpio_get_strength(struct iproc_gpio *chip, unsigned gpio, + + if (chip->io_ctrl) { + base = chip->io_ctrl; +- offset = IPROC_GPIO_DRV0_CTRL_OFFSET; + } else { + base = chip->base; +- offset = IPROC_GPIO_REG(gpio, +- IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET); + } + + shift = IPROC_GPIO_SHIFT(gpio); +@@ -553,10 +603,10 @@ static int iproc_gpio_get_strength(struct iproc_gpio *chip, unsigned gpio, + raw_spin_lock_irqsave(&chip->lock, flags); + *strength = 0; + for (i = 0; i < GPIO_DRV_STRENGTH_BITS; i++) { ++ offset = DRV_STRENGTH_OFFSET(gpio, i, chip->io_ctrl_type); + val = readl(base + offset) & BIT(shift); + val >>= shift; + *strength += (val << i); +- offset += 4; + } + + /* convert to mA */ +@@ -734,6 +784,7 @@ static int iproc_gpio_probe(struct platform_device *pdev) + u32 ngpios, pinconf_disable_mask = 0; + int irq, ret; + bool no_pinconf = false; ++ enum iproc_pinconf_ctrl_type io_ctrl_type = IOCTRL_TYPE_INVALID; + + /* NSP does not support drive strength config */ + if (of_device_is_compatible(dev->of_node, "brcm,iproc-nsp-gpio")) +@@ -764,8 +815,15 @@ static int iproc_gpio_probe(struct platform_device *pdev) + dev_err(dev, "unable to map I/O memory\n"); + return PTR_ERR(chip->io_ctrl); + } ++ if (of_device_is_compatible(dev->of_node, ++ "brcm,cygnus-ccm-gpio")) ++ io_ctrl_type = IOCTRL_TYPE_CDRU; ++ else ++ io_ctrl_type = IOCTRL_TYPE_AON; + } + ++ chip->io_ctrl_type = io_ctrl_type; ++ + if (of_property_read_u32(dev->of_node, "ngpios", &ngpios)) { + dev_err(&pdev->dev, "missing ngpios DT property\n"); + return -ENODEV; +diff --git a/drivers/pinctrl/sh-pfc/pfc-emev2.c b/drivers/pinctrl/sh-pfc/pfc-emev2.c +index 1cbbe04d7df6..eafd8edbcbe9 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-emev2.c ++++ b/drivers/pinctrl/sh-pfc/pfc-emev2.c +@@ -1263,6 +1263,14 @@ static const char * const dtv_groups[] = { + "dtv_b", + }; + ++static const char * const err_rst_reqb_groups[] = { ++ "err_rst_reqb", ++}; ++ ++static const char * const ext_clki_groups[] = { ++ "ext_clki", ++}; ++ + static const char * const iic0_groups[] = { + "iic0", + }; +@@ -1285,6 +1293,10 @@ static const char * const lcd_groups[] = { + "yuv3", + }; + ++static const char * const lowpwr_groups[] = { ++ "lowpwr", ++}; ++ + static const char * const ntsc_groups[] = { + "ntsc_clk", + "ntsc_data", +@@ -1298,6 +1310,10 @@ static const char * const pwm1_groups[] = { + "pwm1", + }; + ++static const char * const ref_clko_groups[] = { ++ "ref_clko", ++}; ++ + static const char * const sd_groups[] = { + "sd_cki", + }; +@@ -1391,13 +1407,17 @@ static const struct sh_pfc_function pinmux_functions[] = { + SH_PFC_FUNCTION(cam), + SH_PFC_FUNCTION(cf), + SH_PFC_FUNCTION(dtv), ++ SH_PFC_FUNCTION(err_rst_reqb), ++ SH_PFC_FUNCTION(ext_clki), + SH_PFC_FUNCTION(iic0), + SH_PFC_FUNCTION(iic1), + SH_PFC_FUNCTION(jtag), + SH_PFC_FUNCTION(lcd), ++ SH_PFC_FUNCTION(lowpwr), + SH_PFC_FUNCTION(ntsc), + SH_PFC_FUNCTION(pwm0), + SH_PFC_FUNCTION(pwm1), ++ SH_PFC_FUNCTION(ref_clko), + SH_PFC_FUNCTION(sd), + SH_PFC_FUNCTION(sdi0), + SH_PFC_FUNCTION(sdi1), +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +index 35f436bcb849..e9739dbcb356 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +@@ -1982,7 +1982,7 @@ static const unsigned int gether_gmii_pins[] = { + */ + 185, 186, 187, 188, 189, 190, 191, 192, 174, 161, 204, + 171, 170, 169, 168, 167, 166, 173, 172, 176, 184, 183, 203, +- 205, 163, 206, 207, ++ 205, 163, 206, 207, 158, + }; + static const unsigned int gether_gmii_mux[] = { + ET_ERXD0_MARK, ET_ERXD1_MARK, ET_ERXD2_MARK, ET_ERXD3_MARK, +@@ -2154,6 +2154,7 @@ static const unsigned int lcd0_data24_1_mux[] = { + LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK, + LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK, + LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK, ++ LCD0_D12_MARK, LCD0_D13_MARK, LCD0_D14_MARK, LCD0_D15_MARK, + LCD0_D16_MARK, LCD0_D17_MARK, LCD0_D18_PORT163_MARK, + LCD0_D19_PORT162_MARK, LCD0_D20_PORT161_MARK, LCD0_D21_PORT158_MARK, + LCD0_D22_PORT160_MARK, LCD0_D23_PORT159_MARK, +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +index c01ef02d326b..e4774b220040 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +@@ -3220,8 +3220,7 @@ static const unsigned int qspi_data4_b_pins[] = { + RCAR_GP_PIN(6, 4), + }; + static const unsigned int qspi_data4_b_mux[] = { +- SPCLK_B_MARK, MOSI_IO0_B_MARK, MISO_IO1_B_MARK, +- IO2_B_MARK, IO3_B_MARK, SSL_B_MARK, ++ MOSI_IO0_B_MARK, MISO_IO1_B_MARK, IO2_B_MARK, IO3_B_MARK, + }; + /* - SCIF0 ------------------------------------------------------------------ */ + static const unsigned int scif0_data_pins[] = { +@@ -4349,17 +4348,14 @@ static const unsigned int vin1_b_data18_pins[] = { + }; + static const unsigned int vin1_b_data18_mux[] = { + /* B */ +- VI1_DATA0_B_MARK, VI1_DATA1_B_MARK, + VI1_DATA2_B_MARK, VI1_DATA3_B_MARK, + VI1_DATA4_B_MARK, VI1_DATA5_B_MARK, + VI1_DATA6_B_MARK, VI1_DATA7_B_MARK, + /* G */ +- VI1_G0_B_MARK, VI1_G1_B_MARK, + VI1_G2_B_MARK, VI1_G3_B_MARK, + VI1_G4_B_MARK, VI1_G5_B_MARK, + VI1_G6_B_MARK, VI1_G7_B_MARK, + /* R */ +- VI1_R0_B_MARK, VI1_R1_B_MARK, + VI1_R2_B_MARK, VI1_R3_B_MARK, + VI1_R4_B_MARK, VI1_R5_B_MARK, + VI1_R6_B_MARK, VI1_R7_B_MARK, +@@ -5213,7 +5209,7 @@ static const char * const scifb2_groups[] = { + "scifb2_data_b", + "scifb2_clk_b", + "scifb2_ctrl_b", +- "scifb0_data_c", ++ "scifb2_data_c", + "scifb2_clk_c", + "scifb2_data_d", + }; +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7792.c b/drivers/pinctrl/sh-pfc/pfc-r8a7792.c +index cc3597f66605..46c41ca6ea38 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7792.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7792.c +@@ -1916,6 +1916,7 @@ static const char * const vin1_groups[] = { + "vin1_data8", + "vin1_data24_b", + "vin1_data20_b", ++ "vin1_data18_b", + "vin1_data16_b", + "vin1_sync", + "vin1_field", +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7794.c b/drivers/pinctrl/sh-pfc/pfc-r8a7794.c +index a0ed220071f5..93bdd3e8fb67 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7794.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7794.c +@@ -4742,7 +4742,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_AVB_MDC, FN_SSI_SDATA6_B, 0, 0, } + }, + { PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32, +- 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3) { ++ 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3) { + /* IP9_31 [1] */ + 0, 0, + /* IP9_30_28 [3] */ +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a77995.c b/drivers/pinctrl/sh-pfc/pfc-r8a77995.c +index 4f5ee1d7317d..36421df1b326 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a77995.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a77995.c +@@ -391,10 +391,10 @@ FM(IP12_31_28) IP12_31_28 \ + #define MOD_SEL0_27 FM(SEL_MSIOF3_0) FM(SEL_MSIOF3_1) + #define MOD_SEL0_26 FM(SEL_HSCIF3_0) FM(SEL_HSCIF3_1) + #define MOD_SEL0_25 FM(SEL_SCIF4_0) FM(SEL_SCIF4_1) +-#define MOD_SEL0_24_23 FM(SEL_PWM0_0) FM(SEL_PWM0_1) FM(SEL_PWM0_2) FM(SEL_PWM0_3) +-#define MOD_SEL0_22_21 FM(SEL_PWM1_0) FM(SEL_PWM1_1) FM(SEL_PWM1_2) FM(SEL_PWM1_3) +-#define MOD_SEL0_20_19 FM(SEL_PWM2_0) FM(SEL_PWM2_1) FM(SEL_PWM2_2) FM(SEL_PWM2_3) +-#define MOD_SEL0_18_17 FM(SEL_PWM3_0) FM(SEL_PWM3_1) FM(SEL_PWM3_2) FM(SEL_PWM3_3) ++#define MOD_SEL0_24_23 FM(SEL_PWM0_0) FM(SEL_PWM0_1) FM(SEL_PWM0_2) F_(0, 0) ++#define MOD_SEL0_22_21 FM(SEL_PWM1_0) FM(SEL_PWM1_1) FM(SEL_PWM1_2) F_(0, 0) ++#define MOD_SEL0_20_19 FM(SEL_PWM2_0) FM(SEL_PWM2_1) FM(SEL_PWM2_2) F_(0, 0) ++#define MOD_SEL0_18_17 FM(SEL_PWM3_0) FM(SEL_PWM3_1) FM(SEL_PWM3_2) F_(0, 0) + #define MOD_SEL0_15 FM(SEL_IRQ_0_0) FM(SEL_IRQ_0_1) + #define MOD_SEL0_14 FM(SEL_IRQ_1_0) FM(SEL_IRQ_1_1) + #define MOD_SEL0_13 FM(SEL_IRQ_2_0) FM(SEL_IRQ_2_1) +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7269.c b/drivers/pinctrl/sh-pfc/pfc-sh7269.c +index a50d22bef1f4..cfdb4fc177c3 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7269.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7269.c +@@ -2119,7 +2119,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + }, + + { PINMUX_CFG_REG("PCIOR0", 0xfffe3852, 16, 1) { +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PC8_IN, PC8_OUT, + PC7_IN, PC7_OUT, + PC6_IN, PC6_OUT, +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +index d25e6f674d0a..6dca760f9f28 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +@@ -3086,6 +3086,7 @@ static const unsigned int tpu4_to2_mux[] = { + }; + static const unsigned int tpu4_to3_pins[] = { + /* TO */ ++ PIN_NUMBER(6, 26), + }; + static const unsigned int tpu4_to3_mux[] = { + TPU4TO3_MARK, +@@ -3366,7 +3367,8 @@ static const char * const fsic_groups[] = { + "fsic_sclk_out", + "fsic_data_in", + "fsic_data_out", +- "fsic_spdif", ++ "fsic_spdif_0", ++ "fsic_spdif_1", + }; + + static const char * const fsid_groups[] = { +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7734.c b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +index 3eccc9b3ca84..c691e5e9d9de 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7734.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +@@ -2231,13 +2231,13 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_LCD_CL1_B, 0, 0, + /* IP10_5_3 [3] */ + FN_SSI_WS23, FN_VI1_5_B, FN_TX1_D, FN_HSCK0_C, FN_FALE_B, +- FN_LCD_DON_B, 0, 0, 0, ++ FN_LCD_DON_B, 0, 0, + /* IP10_2_0 [3] */ + FN_SSI_SCK23, FN_VI1_4_B, FN_RX1_D, FN_FCLE_B, + FN_LCD_DATA15_B, 0, 0, 0 } + }, + { PINMUX_CFG_REG_VAR("IPSR11", 0xFFFC0048, 32, +- 3, 1, 2, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { ++ 3, 1, 2, 3, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { + /* IP11_31_29 [3] */ + 0, 0, 0, 0, 0, 0, 0, 0, + /* IP11_28 [1] */ +diff --git a/drivers/platform/mips/cpu_hwmon.c b/drivers/platform/mips/cpu_hwmon.c +index 322de58eebaf..02484ae9a116 100644 +--- a/drivers/platform/mips/cpu_hwmon.c ++++ b/drivers/platform/mips/cpu_hwmon.c +@@ -158,7 +158,7 @@ static int __init loongson_hwmon_init(void) + + cpu_hwmon_dev = hwmon_device_register(NULL); + if (IS_ERR(cpu_hwmon_dev)) { +- ret = -ENOMEM; ++ ret = PTR_ERR(cpu_hwmon_dev); + pr_err("hwmon_device_register fail!\n"); + goto fail_hwmon_device_register; + } +diff --git a/drivers/platform/x86/alienware-wmi.c b/drivers/platform/x86/alienware-wmi.c +index e335b18da20f..2c82188f8486 100644 +--- a/drivers/platform/x86/alienware-wmi.c ++++ b/drivers/platform/x86/alienware-wmi.c +@@ -505,23 +505,22 @@ static acpi_status alienware_wmax_command(struct wmax_basic_args *in_args, + + input.length = (acpi_size) sizeof(*in_args); + input.pointer = in_args; +- if (out_data != NULL) { ++ if (out_data) { + output.length = ACPI_ALLOCATE_BUFFER; + output.pointer = NULL; + status = wmi_evaluate_method(WMAX_CONTROL_GUID, 0, + command, &input, &output); +- } else ++ if (ACPI_SUCCESS(status)) { ++ obj = (union acpi_object *)output.pointer; ++ if (obj && obj->type == ACPI_TYPE_INTEGER) ++ *out_data = (u32)obj->integer.value; ++ } ++ kfree(output.pointer); ++ } else { + status = wmi_evaluate_method(WMAX_CONTROL_GUID, 0, + command, &input, NULL); +- +- if (ACPI_SUCCESS(status) && out_data != NULL) { +- obj = (union acpi_object *)output.pointer; +- if (obj && obj->type == ACPI_TYPE_INTEGER) +- *out_data = (u32) obj->integer.value; + } +- kfree(output.pointer); + return status; +- + } + + /* +@@ -571,7 +570,7 @@ static ssize_t show_hdmi_source(struct device *dev, + return scnprintf(buf, PAGE_SIZE, + "input [gpu] unknown\n"); + } +- pr_err("alienware-wmi: unknown HDMI source status: %d\n", out_data); ++ pr_err("alienware-wmi: unknown HDMI source status: %u\n", status); + return scnprintf(buf, PAGE_SIZE, "input gpu [unknown]\n"); + } + +diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c +index 7f8fa42a1084..a56e997816b2 100644 +--- a/drivers/platform/x86/wmi.c ++++ b/drivers/platform/x86/wmi.c +@@ -748,6 +748,9 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver) + struct wmi_block *wblock = dev_to_wblock(dev); + const struct wmi_device_id *id = wmi_driver->id_table; + ++ if (id == NULL) ++ return 0; ++ + while (id->guid_string) { + uuid_le driver_guid; + +diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c +index 3226faebe0a0..0f1a0efd5926 100644 +--- a/drivers/power/supply/power_supply_core.c ++++ b/drivers/power/supply/power_supply_core.c +@@ -891,14 +891,14 @@ __power_supply_register(struct device *parent, + } + + spin_lock_init(&psy->changed_lock); +- rc = device_init_wakeup(dev, ws); +- if (rc) +- goto wakeup_init_failed; +- + rc = device_add(dev); + if (rc) + goto device_add_failed; + ++ rc = device_init_wakeup(dev, ws); ++ if (rc) ++ goto wakeup_init_failed; ++ + rc = psy_register_thermal(psy); + if (rc) + goto register_thermal_failed; +@@ -935,8 +935,8 @@ register_cooler_failed: + psy_unregister_thermal(psy); + register_thermal_failed: + device_del(dev); +-device_add_failed: + wakeup_init_failed: ++device_add_failed: + check_supplies_failed: + dev_set_name_failed: + put_device(dev); +diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c +index 1e69c1c9ec09..7a4a6406cf69 100644 +--- a/drivers/pwm/pwm-lpss.c ++++ b/drivers/pwm/pwm-lpss.c +@@ -216,6 +216,12 @@ EXPORT_SYMBOL_GPL(pwm_lpss_probe); + + int pwm_lpss_remove(struct pwm_lpss_chip *lpwm) + { ++ int i; ++ ++ for (i = 0; i < lpwm->info->npwm; i++) { ++ if (pwm_is_enabled(&lpwm->chip.pwms[i])) ++ pm_runtime_put(lpwm->chip.dev); ++ } + return pwmchip_remove(&lpwm->chip); + } + EXPORT_SYMBOL_GPL(pwm_lpss_remove); +diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c +index 9b79cbc7a715..3d2c36963a4f 100644 +--- a/drivers/pwm/pwm-meson.c ++++ b/drivers/pwm/pwm-meson.c +@@ -188,7 +188,7 @@ static int meson_pwm_calc(struct meson_pwm *meson, + do_div(fin_ps, fin_freq); + + /* Calc pre_div with the period */ +- for (pre_div = 0; pre_div < MISC_CLK_DIV_MASK; pre_div++) { ++ for (pre_div = 0; pre_div <= MISC_CLK_DIV_MASK; pre_div++) { + cnt = DIV_ROUND_CLOSEST_ULL((u64)period * 1000, + fin_ps * (pre_div + 1)); + dev_dbg(meson->chip.dev, "fin_ps=%llu pre_div=%u cnt=%u\n", +@@ -197,7 +197,7 @@ static int meson_pwm_calc(struct meson_pwm *meson, + break; + } + +- if (pre_div == MISC_CLK_DIV_MASK) { ++ if (pre_div > MISC_CLK_DIV_MASK) { + dev_err(meson->chip.dev, "unable to get period pre_div\n"); + return -EINVAL; + } +@@ -325,11 +325,6 @@ static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + if (state->period != channel->state.period || + state->duty_cycle != channel->state.duty_cycle || + state->polarity != channel->state.polarity) { +- if (channel->state.enabled) { +- meson_pwm_disable(meson, pwm->hwpwm); +- channel->state.enabled = false; +- } +- + if (state->polarity != channel->state.polarity) { + if (state->polarity == PWM_POLARITY_NORMAL) + meson->inverter_mask |= BIT(pwm->hwpwm); +diff --git a/drivers/rapidio/rio_cm.c b/drivers/rapidio/rio_cm.c +index ef989a15aefc..b29fc258eeba 100644 +--- a/drivers/rapidio/rio_cm.c ++++ b/drivers/rapidio/rio_cm.c +@@ -1215,7 +1215,9 @@ static int riocm_ch_listen(u16 ch_id) + riocm_debug(CHOP, "(ch_%d)", ch_id); + + ch = riocm_get_channel(ch_id); +- if (!ch || !riocm_cmp_exch(ch, RIO_CM_CHAN_BOUND, RIO_CM_LISTEN)) ++ if (!ch) ++ return -EINVAL; ++ if (!riocm_cmp_exch(ch, RIO_CM_CHAN_BOUND, RIO_CM_LISTEN)) + ret = -EINVAL; + riocm_put_channel(ch); + return ret; +diff --git a/drivers/regulator/lp87565-regulator.c b/drivers/regulator/lp87565-regulator.c +index cfdbe294fb6a..32d4e6ec2e19 100644 +--- a/drivers/regulator/lp87565-regulator.c ++++ b/drivers/regulator/lp87565-regulator.c +@@ -188,7 +188,7 @@ static int lp87565_regulator_probe(struct platform_device *pdev) + struct lp87565 *lp87565 = dev_get_drvdata(pdev->dev.parent); + struct regulator_config config = { }; + struct regulator_dev *rdev; +- int i, min_idx = LP87565_BUCK_1, max_idx = LP87565_BUCK_3; ++ int i, min_idx = LP87565_BUCK_0, max_idx = LP87565_BUCK_3; + + platform_set_drvdata(pdev, lp87565); + +diff --git a/drivers/regulator/pv88060-regulator.c b/drivers/regulator/pv88060-regulator.c +index a9446056435f..1f2d8180506b 100644 +--- a/drivers/regulator/pv88060-regulator.c ++++ b/drivers/regulator/pv88060-regulator.c +@@ -135,7 +135,7 @@ static int pv88060_set_current_limit(struct regulator_dev *rdev, int min, + int i; + + /* search for closest to maximum */ +- for (i = info->n_current_limits; i >= 0; i--) { ++ for (i = info->n_current_limits - 1; i >= 0; i--) { + if (min <= info->current_limits[i] + && max >= info->current_limits[i]) { + return regmap_update_bits(rdev->regmap, +diff --git a/drivers/regulator/pv88080-regulator.c b/drivers/regulator/pv88080-regulator.c +index 9a08cb2de501..6770e4de2097 100644 +--- a/drivers/regulator/pv88080-regulator.c ++++ b/drivers/regulator/pv88080-regulator.c +@@ -279,7 +279,7 @@ static int pv88080_set_current_limit(struct regulator_dev *rdev, int min, + int i; + + /* search for closest to maximum */ +- for (i = info->n_current_limits; i >= 0; i--) { ++ for (i = info->n_current_limits - 1; i >= 0; i--) { + if (min <= info->current_limits[i] + && max >= info->current_limits[i]) { + return regmap_update_bits(rdev->regmap, +diff --git a/drivers/regulator/pv88090-regulator.c b/drivers/regulator/pv88090-regulator.c +index 7a0c15957bd0..2302b0df7630 100644 +--- a/drivers/regulator/pv88090-regulator.c ++++ b/drivers/regulator/pv88090-regulator.c +@@ -157,7 +157,7 @@ static int pv88090_set_current_limit(struct regulator_dev *rdev, int min, + int i; + + /* search for closest to maximum */ +- for (i = info->n_current_limits; i >= 0; i--) { ++ for (i = info->n_current_limits - 1; i >= 0; i--) { + if (min <= info->current_limits[i] + && max >= info->current_limits[i]) { + return regmap_update_bits(rdev->regmap, +diff --git a/drivers/regulator/tps65086-regulator.c b/drivers/regulator/tps65086-regulator.c +index 45e96e154690..5a5e9b5bf4be 100644 +--- a/drivers/regulator/tps65086-regulator.c ++++ b/drivers/regulator/tps65086-regulator.c +@@ -90,8 +90,8 @@ static const struct regulator_linear_range tps65086_buck345_25mv_ranges[] = { + static const struct regulator_linear_range tps65086_ldoa1_ranges[] = { + REGULATOR_LINEAR_RANGE(1350000, 0x0, 0x0, 0), + REGULATOR_LINEAR_RANGE(1500000, 0x1, 0x7, 100000), +- REGULATOR_LINEAR_RANGE(2300000, 0x8, 0xA, 100000), +- REGULATOR_LINEAR_RANGE(2700000, 0xB, 0xD, 150000), ++ REGULATOR_LINEAR_RANGE(2300000, 0x8, 0xB, 100000), ++ REGULATOR_LINEAR_RANGE(2850000, 0xC, 0xD, 150000), + REGULATOR_LINEAR_RANGE(3300000, 0xE, 0xE, 0), + }; + +diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c +index 5a5bc4bb08d2..df591435d12a 100644 +--- a/drivers/regulator/wm831x-dcdc.c ++++ b/drivers/regulator/wm831x-dcdc.c +@@ -327,8 +327,8 @@ static int wm831x_buckv_get_voltage_sel(struct regulator_dev *rdev) + } + + /* Current limit options */ +-static u16 wm831x_dcdc_ilim[] = { +- 125, 250, 375, 500, 625, 750, 875, 1000 ++static const unsigned int wm831x_dcdc_ilim[] = { ++ 125000, 250000, 375000, 500000, 625000, 750000, 875000, 1000000 + }; + + static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev, +diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c +index 466bf7f9a285..7da2a1fb50f8 100644 +--- a/drivers/rtc/rtc-88pm80x.c ++++ b/drivers/rtc/rtc-88pm80x.c +@@ -116,12 +116,14 @@ static int pm80x_rtc_read_time(struct device *dev, struct rtc_time *tm) + unsigned char buf[4]; + unsigned long ticks, base, data; + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -144,7 +146,8 @@ static int pm80x_rtc_set_time(struct device *dev, struct rtc_time *tm) + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + base = ticks - data; + dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -165,11 +168,13 @@ static int pm80x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) + int ret; + + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + regmap_raw_read(info->map, PM800_RTC_EXPIRE1_1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -192,12 +197,14 @@ static int pm80x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) + regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_ALARM1_EN, 0); + + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c +index 166faae3a59c..7d3e5168fcef 100644 +--- a/drivers/rtc/rtc-88pm860x.c ++++ b/drivers/rtc/rtc-88pm860x.c +@@ -115,11 +115,13 @@ static int pm860x_rtc_read_time(struct device *dev, struct rtc_time *tm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -145,7 +147,8 @@ static int pm860x_rtc_set_time(struct device *dev, struct rtc_time *tm) + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + base = ticks - data; + dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -170,10 +173,12 @@ static int pm860x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + pm860x_bulk_read(info->i2c, PM8607_RTC_EXPIRE1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -198,11 +203,13 @@ static int pm860x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c +index e7d9215c9201..8d45d93b1db6 100644 +--- a/drivers/rtc/rtc-ds1307.c ++++ b/drivers/rtc/rtc-ds1307.c +@@ -733,8 +733,8 @@ static int rx8130_set_alarm(struct device *dev, struct rtc_wkalrm *t) + if (ret < 0) + return ret; + +- ctl[0] &= ~RX8130_REG_EXTENSION_WADA; +- ctl[1] |= RX8130_REG_FLAG_AF; ++ ctl[0] &= RX8130_REG_EXTENSION_WADA; ++ ctl[1] &= ~RX8130_REG_FLAG_AF; + ctl[2] &= ~RX8130_REG_CONTROL0_AIE; + + ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, +@@ -757,8 +757,7 @@ static int rx8130_set_alarm(struct device *dev, struct rtc_wkalrm *t) + + ctl[2] |= RX8130_REG_CONTROL0_AIE; + +- return regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, +- sizeof(ctl)); ++ return regmap_write(ds1307->regmap, RX8130_REG_CONTROL0, ctl[2]); + } + + static int rx8130_alarm_irq_enable(struct device *dev, unsigned int enabled) +diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c +index 9caaccccaa57..b1ebca099b0d 100644 +--- a/drivers/rtc/rtc-ds1672.c ++++ b/drivers/rtc/rtc-ds1672.c +@@ -58,7 +58,8 @@ static int ds1672_get_datetime(struct i2c_client *client, struct rtc_time *tm) + "%s: raw read data - counters=%02x,%02x,%02x,%02x\n", + __func__, buf[0], buf[1], buf[2], buf[3]); + +- time = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ time = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + + rtc_time_to_tm(time, tm); + +diff --git a/drivers/rtc/rtc-mc146818-lib.c b/drivers/rtc/rtc-mc146818-lib.c +index 2f1772a358ca..18a6f15e313d 100644 +--- a/drivers/rtc/rtc-mc146818-lib.c ++++ b/drivers/rtc/rtc-mc146818-lib.c +@@ -82,7 +82,7 @@ unsigned int mc146818_get_time(struct rtc_time *time) + time->tm_year += real_year - 72; + #endif + +- if (century) ++ if (century > 20) + time->tm_year += (century - 19) * 100; + + /* +diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c +index 9f1b14bf91ae..367e0f803440 100644 +--- a/drivers/rtc/rtc-pcf2127.c ++++ b/drivers/rtc/rtc-pcf2127.c +@@ -52,20 +52,14 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm) + struct pcf2127 *pcf2127 = dev_get_drvdata(dev); + unsigned char buf[10]; + int ret; +- int i; + +- for (i = 0; i <= PCF2127_REG_CTRL3; i++) { +- ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1 + i, +- (unsigned int *)(buf + i)); +- if (ret) { +- dev_err(dev, "%s: read error\n", __func__); +- return ret; +- } +- } +- +- ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_SC, +- (buf + PCF2127_REG_SC), +- ARRAY_SIZE(buf) - PCF2127_REG_SC); ++ /* ++ * Avoid reading CTRL2 register as it causes WD_VAL register ++ * value to reset to 0 which means watchdog is stopped. ++ */ ++ ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL3, ++ (buf + PCF2127_REG_CTRL3), ++ ARRAY_SIZE(buf) - PCF2127_REG_CTRL3); + if (ret) { + dev_err(dev, "%s: read error\n", __func__); + return ret; +@@ -86,14 +80,12 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm) + } + + dev_dbg(dev, +- "%s: raw data is cr1=%02x, cr2=%02x, cr3=%02x, " +- "sec=%02x, min=%02x, hr=%02x, " ++ "%s: raw data is cr3=%02x, sec=%02x, min=%02x, hr=%02x, " + "mday=%02x, wday=%02x, mon=%02x, year=%02x\n", +- __func__, +- buf[0], buf[1], buf[2], +- buf[3], buf[4], buf[5], +- buf[6], buf[7], buf[8], buf[9]); +- ++ __func__, buf[PCF2127_REG_CTRL3], buf[PCF2127_REG_SC], ++ buf[PCF2127_REG_MN], buf[PCF2127_REG_HR], ++ buf[PCF2127_REG_DM], buf[PCF2127_REG_DW], ++ buf[PCF2127_REG_MO], buf[PCF2127_REG_YR]); + + tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F); + tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F); +diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c +index 8c836c51a508..4d0b81f9805f 100644 +--- a/drivers/rtc/rtc-pcf8563.c ++++ b/drivers/rtc/rtc-pcf8563.c +@@ -563,7 +563,6 @@ static int pcf8563_probe(struct i2c_client *client, + struct pcf8563 *pcf8563; + int err; + unsigned char buf; +- unsigned char alm_pending; + + dev_dbg(&client->dev, "%s\n", __func__); + +@@ -587,13 +586,13 @@ static int pcf8563_probe(struct i2c_client *client, + return err; + } + +- err = pcf8563_get_alarm_mode(client, NULL, &alm_pending); +- if (err) { +- dev_err(&client->dev, "%s: read error\n", __func__); ++ /* Clear flags and disable interrupts */ ++ buf = 0; ++ err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf); ++ if (err < 0) { ++ dev_err(&client->dev, "%s: write error\n", __func__); + return err; + } +- if (alm_pending) +- pcf8563_set_alarm_mode(client, 0); + + pcf8563->rtc = devm_rtc_device_register(&client->dev, + pcf8563_driver.driver.name, +@@ -605,7 +604,7 @@ static int pcf8563_probe(struct i2c_client *client, + if (client->irq > 0) { + err = devm_request_threaded_irq(&client->dev, client->irq, + NULL, pcf8563_irq, +- IRQF_SHARED|IRQF_ONESHOT|IRQF_TRIGGER_FALLING, ++ IRQF_SHARED | IRQF_ONESHOT | IRQF_TRIGGER_LOW, + pcf8563_driver.driver.name, client); + if (err) { + dev_err(&client->dev, "unable to request IRQ %d\n", +diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c +index fac835530671..a1b4b0ed1f19 100644 +--- a/drivers/rtc/rtc-pm8xxx.c ++++ b/drivers/rtc/rtc-pm8xxx.c +@@ -186,7 +186,8 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) + } + } + +- secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); ++ secs = value[0] | (value[1] << 8) | (value[2] << 16) | ++ ((unsigned long)value[3] << 24); + + rtc_time_to_tm(secs, tm); + +@@ -267,7 +268,8 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) + return rc; + } + +- secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); ++ secs = value[0] | (value[1] << 8) | (value[2] << 16) | ++ ((unsigned long)value[3] << 24); + + rtc_time_to_tm(secs, &alarm->time); + +diff --git a/drivers/scsi/fnic/fnic_isr.c b/drivers/scsi/fnic/fnic_isr.c +index 4e3a50202e8c..d28088218c36 100644 +--- a/drivers/scsi/fnic/fnic_isr.c ++++ b/drivers/scsi/fnic/fnic_isr.c +@@ -254,7 +254,7 @@ int fnic_set_intr_mode(struct fnic *fnic) + int vecs = n + m + o + 1; + + if (pci_alloc_irq_vectors(fnic->pdev, vecs, vecs, +- PCI_IRQ_MSIX) < 0) { ++ PCI_IRQ_MSIX) == vecs) { + fnic->rq_count = n; + fnic->raw_wq_count = m; + fnic->wq_copy_count = o; +@@ -280,7 +280,7 @@ int fnic_set_intr_mode(struct fnic *fnic) + fnic->wq_copy_count >= 1 && + fnic->cq_count >= 3 && + fnic->intr_count >= 1 && +- pci_alloc_irq_vectors(fnic->pdev, 1, 1, PCI_IRQ_MSI) < 0) { ++ pci_alloc_irq_vectors(fnic->pdev, 1, 1, PCI_IRQ_MSI) == 1) { + fnic->rq_count = 1; + fnic->raw_wq_count = 1; + fnic->wq_copy_count = 1; +diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c +index 42bcf7f3a0f9..6ba257cbc6d9 100644 +--- a/drivers/scsi/libfc/fc_exch.c ++++ b/drivers/scsi/libfc/fc_exch.c +@@ -2603,7 +2603,7 @@ void fc_exch_recv(struct fc_lport *lport, struct fc_frame *fp) + + /* lport lock ? */ + if (!lport || lport->state == LPORT_ST_DISABLED) { +- FC_LPORT_DBG(lport, "Receiving frames for an lport that " ++ FC_LIBFC_DBG("Receiving frames for an lport that " + "has not been initialized correctly\n"); + fc_frame_free(fp); + return; +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index 577513649afb..6abad63b127a 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -3823,12 +3823,12 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr) + /* + * The cur_state should not last for more than max_wait secs + */ +- for (i = 0; i < max_wait; i++) { ++ for (i = 0; i < max_wait * 50; i++) { + curr_abs_state = instance->instancet-> + read_fw_status_reg(instance->reg_set); + + if (abs_state == curr_abs_state) { +- msleep(1000); ++ msleep(20); + } else + break; + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 5617bb18c233..5f9d4dbc4a98 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -6714,8 +6714,7 @@ qla2x00_module_init(void) + /* Initialize target kmem_cache and mem_pools */ + ret = qlt_init(); + if (ret < 0) { +- kmem_cache_destroy(srb_cachep); +- return ret; ++ goto destroy_cache; + } else if (ret > 0) { + /* + * If initiator mode is explictly disabled by qlt_init(), +@@ -6736,11 +6735,10 @@ qla2x00_module_init(void) + qla2xxx_transport_template = + fc_attach_transport(&qla2xxx_transport_functions); + if (!qla2xxx_transport_template) { +- kmem_cache_destroy(srb_cachep); + ql_log(ql_log_fatal, NULL, 0x0002, + "fc_attach_transport failed...Failing load!.\n"); +- qlt_exit(); +- return -ENODEV; ++ ret = -ENODEV; ++ goto qlt_exit; + } + + apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops); +@@ -6752,27 +6750,37 @@ qla2x00_module_init(void) + qla2xxx_transport_vport_template = + fc_attach_transport(&qla2xxx_transport_vport_functions); + if (!qla2xxx_transport_vport_template) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); + ql_log(ql_log_fatal, NULL, 0x0004, + "fc_attach_transport vport failed...Failing load!.\n"); +- return -ENODEV; ++ ret = -ENODEV; ++ goto unreg_chrdev; + } + ql_log(ql_log_info, NULL, 0x0005, + "QLogic Fibre Channel HBA Driver: %s.\n", + qla2x00_version_str); + ret = pci_register_driver(&qla2xxx_pci_driver); + if (ret) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); +- fc_release_transport(qla2xxx_transport_vport_template); + ql_log(ql_log_fatal, NULL, 0x0006, + "pci_register_driver failed...ret=%d Failing load!.\n", + ret); ++ goto release_vport_transport; + } + return ret; ++ ++release_vport_transport: ++ fc_release_transport(qla2xxx_transport_vport_template); ++ ++unreg_chrdev: ++ if (apidev_major >= 0) ++ unregister_chrdev(apidev_major, QLA2XXX_APIDEV); ++ fc_release_transport(qla2xxx_transport_template); ++ ++qlt_exit: ++ qlt_exit(); ++ ++destroy_cache: ++ kmem_cache_destroy(srb_cachep); ++ return ret; + } + + /** +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 55227d20496a..21011c5fddeb 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -2122,14 +2122,14 @@ void qlt_send_resp_ctio(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd, + ctio->u.status1.scsi_status |= + cpu_to_le16(SS_RESIDUAL_UNDER); + +- /* Response code and sense key */ +- put_unaligned_le32(((0x70 << 24) | (sense_key << 8)), +- (&ctio->u.status1.sense_data)[0]); ++ /* Fixed format sense data. */ ++ ctio->u.status1.sense_data[0] = 0x70; ++ ctio->u.status1.sense_data[2] = sense_key; + /* Additional sense length */ +- put_unaligned_le32(0x0a, (&ctio->u.status1.sense_data)[1]); ++ ctio->u.status1.sense_data[7] = 0xa; + /* ASC and ASCQ */ +- put_unaligned_le32(((asc << 24) | (ascq << 16)), +- (&ctio->u.status1.sense_data)[3]); ++ ctio->u.status1.sense_data[12] = asc; ++ ctio->u.status1.sense_data[13] = ascq; + + /* Memory Barrier */ + wmb(); +@@ -2179,7 +2179,7 @@ void qlt_xmit_tm_rsp(struct qla_tgt_mgmt_cmd *mcmd) + mcmd->orig_iocb.imm_ntfy.u.isp24.status_subcode == + ELS_TPRLO) { + ql_dbg(ql_dbg_disc, vha, 0x2106, +- "TM response logo %phC status %#x state %#x", ++ "TM response logo %8phC status %#x state %#x", + mcmd->sess->port_name, mcmd->fc_tm_rsp, + mcmd->flags); + qlt_schedule_sess_for_deletion_lock(mcmd->sess); +diff --git a/drivers/soc/fsl/qe/gpio.c b/drivers/soc/fsl/qe/gpio.c +index 3b27075c21a7..5cbc5ce5ac15 100644 +--- a/drivers/soc/fsl/qe/gpio.c ++++ b/drivers/soc/fsl/qe/gpio.c +@@ -152,8 +152,10 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index) + if (err < 0) + goto err0; + gc = gpio_to_chip(err); +- if (WARN_ON(!gc)) ++ if (WARN_ON(!gc)) { ++ err = -ENODEV; + goto err0; ++ } + + if (!of_device_is_compatible(gc->of_node, "fsl,mpc8323-qe-pario-bank")) { + pr_debug("%s: tried to get a non-qe pin\n", __func__); +diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c +index 5c89bbb05441..e075712c501e 100644 +--- a/drivers/spi/spi-bcm2835aux.c ++++ b/drivers/spi/spi-bcm2835aux.c +@@ -416,7 +416,18 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev) + platform_set_drvdata(pdev, master); + master->mode_bits = (SPI_CPOL | SPI_CS_HIGH | SPI_NO_CS); + master->bits_per_word_mask = SPI_BPW_MASK(8); +- master->num_chipselect = -1; ++ /* even though the driver never officially supported native CS ++ * allow a single native CS for legacy DT support purposes when ++ * no cs-gpio is configured. ++ * Known limitations for native cs are: ++ * * multiple chip-selects: cs0-cs2 are all simultaniously asserted ++ * whenever there is a transfer - this even includes SPI_NO_CS ++ * * SPI_CS_HIGH: is ignores - cs are always asserted low ++ * * cs_change: cs is deasserted after each spi_transfer ++ * * cs_delay_usec: cs is always deasserted one SCK cycle after ++ * a spi_transfer ++ */ ++ master->num_chipselect = 1; + master->transfer_one = bcm2835aux_spi_transfer_one; + master->handle_err = bcm2835aux_spi_handle_err; + master->prepare_message = bcm2835aux_spi_prepare_message; +diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c +index 02bd1eba045b..d08ad93d97a1 100644 +--- a/drivers/spi/spi-cadence.c ++++ b/drivers/spi/spi-cadence.c +@@ -584,11 +584,6 @@ static int cdns_spi_probe(struct platform_device *pdev) + goto clk_dis_apb; + } + +- pm_runtime_use_autosuspend(&pdev->dev); +- pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT); +- pm_runtime_set_active(&pdev->dev); +- pm_runtime_enable(&pdev->dev); +- + ret = of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs); + if (ret < 0) + master->num_chipselect = CDNS_SPI_DEFAULT_NUM_CS; +@@ -603,8 +598,10 @@ static int cdns_spi_probe(struct platform_device *pdev) + /* SPI controller initializations */ + cdns_spi_init_hw(xspi); + +- pm_runtime_mark_last_busy(&pdev->dev); +- pm_runtime_put_autosuspend(&pdev->dev); ++ pm_runtime_set_active(&pdev->dev); ++ pm_runtime_enable(&pdev->dev); ++ pm_runtime_use_autosuspend(&pdev->dev); ++ pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT); + + irq = platform_get_irq(pdev, 0); + if (irq <= 0) { +diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c +index 8b79e36fab21..cd784552de7f 100644 +--- a/drivers/spi/spi-fsl-spi.c ++++ b/drivers/spi/spi-fsl-spi.c +@@ -407,7 +407,6 @@ static int fsl_spi_do_one_msg(struct spi_master *master, + } + + m->status = status; +- spi_finalize_current_message(master); + + if (status || !cs_change) { + ndelay(nsecs); +@@ -415,6 +414,7 @@ static int fsl_spi_do_one_msg(struct spi_master *master, + } + + fsl_spi_setup_transfer(spi, NULL); ++ spi_finalize_current_message(master); + return 0; + } + +diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c +index 2ad04796ef29..84ff0c507f0b 100644 +--- a/drivers/spi/spi-tegra114.c ++++ b/drivers/spi/spi-tegra114.c +@@ -307,10 +307,16 @@ static unsigned tegra_spi_fill_tx_fifo_from_client_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tegra_spi_writel(tspi, x, SPI_TX_FIFO); + } ++ ++ tspi->cur_tx_pos += written_words * tspi->bytes_per_word; + } else { ++ unsigned int write_bytes; + max_n_32bit = min(tspi->curr_dma_words, tx_empty_count); + written_words = max_n_32bit; + nbytes = written_words * tspi->bytes_per_word; ++ if (nbytes > t->len - tspi->cur_pos) ++ nbytes = t->len - tspi->cur_pos; ++ write_bytes = nbytes; + for (count = 0; count < max_n_32bit; count++) { + u32 x = 0; + +@@ -319,8 +325,10 @@ static unsigned tegra_spi_fill_tx_fifo_from_client_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tegra_spi_writel(tspi, x, SPI_TX_FIFO); + } ++ ++ tspi->cur_tx_pos += write_bytes; + } +- tspi->cur_tx_pos += written_words * tspi->bytes_per_word; ++ + return written_words; + } + +@@ -344,20 +352,27 @@ static unsigned int tegra_spi_read_rx_fifo_to_client_rxbuf( + for (i = 0; len && (i < 4); i++, len--) + *rx_buf++ = (x >> i*8) & 0xFF; + } +- tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + read_words += tspi->curr_dma_words; ++ tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; ++ u8 bytes_per_word = tspi->bytes_per_word; ++ unsigned int read_bytes; + ++ len = rx_full_count * bytes_per_word; ++ if (len > t->len - tspi->cur_pos) ++ len = t->len - tspi->cur_pos; ++ read_bytes = len; + for (count = 0; count < rx_full_count; count++) { + u32 x = tegra_spi_readl(tspi, SPI_RX_FIFO) & rx_mask; + +- for (i = 0; (i < tspi->bytes_per_word); i++) ++ for (i = 0; len && (i < bytes_per_word); i++, len--) + *rx_buf++ = (x >> (i*8)) & 0xFF; + } +- tspi->cur_rx_pos += rx_full_count * tspi->bytes_per_word; + read_words += rx_full_count; ++ tspi->cur_rx_pos += read_bytes; + } ++ + return read_words; + } + +@@ -372,12 +387,17 @@ static void tegra_spi_copy_client_txbuf_to_spi_txbuf( + unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; + + memcpy(tspi->tx_dma_buf, t->tx_buf + tspi->cur_pos, len); ++ tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + unsigned int i; + unsigned int count; + u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; + unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; ++ unsigned int write_bytes; + ++ if (consume > t->len - tspi->cur_pos) ++ consume = t->len - tspi->cur_pos; ++ write_bytes = consume; + for (count = 0; count < tspi->curr_dma_words; count++) { + u32 x = 0; + +@@ -386,8 +406,9 @@ static void tegra_spi_copy_client_txbuf_to_spi_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tspi->tx_dma_buf[count] = x; + } ++ ++ tspi->cur_tx_pos += write_bytes; + } +- tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->tx_dma_phys, +@@ -405,20 +426,28 @@ static void tegra_spi_copy_spi_rxbuf_to_client_rxbuf( + unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; + + memcpy(t->rx_buf + tspi->cur_rx_pos, tspi->rx_dma_buf, len); ++ tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + unsigned int i; + unsigned int count; + unsigned char *rx_buf = t->rx_buf + tspi->cur_rx_pos; + u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; ++ unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; ++ unsigned int read_bytes; + ++ if (consume > t->len - tspi->cur_pos) ++ consume = t->len - tspi->cur_pos; ++ read_bytes = consume; + for (count = 0; count < tspi->curr_dma_words; count++) { + u32 x = tspi->rx_dma_buf[count] & rx_mask; + +- for (i = 0; (i < tspi->bytes_per_word); i++) ++ for (i = 0; consume && (i < tspi->bytes_per_word); ++ i++, consume--) + *rx_buf++ = (x >> (i*8)) & 0xFF; + } ++ ++ tspi->cur_rx_pos += read_bytes; + } +- tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, +@@ -470,22 +499,39 @@ static int tegra_spi_start_rx_dma(struct tegra_spi_data *tspi, int len) + return 0; + } + +-static int tegra_spi_start_dma_based_transfer( +- struct tegra_spi_data *tspi, struct spi_transfer *t) ++static int tegra_spi_flush_fifos(struct tegra_spi_data *tspi) + { +- u32 val; +- unsigned int len; +- int ret = 0; ++ unsigned long timeout = jiffies + HZ; + u32 status; + +- /* Make sure that Rx and Tx fifo are empty */ + status = tegra_spi_readl(tspi, SPI_FIFO_STATUS); + if ((status & SPI_FIFO_EMPTY) != SPI_FIFO_EMPTY) { +- dev_err(tspi->dev, "Rx/Tx fifo are not empty status 0x%08x\n", +- (unsigned)status); +- return -EIO; ++ status |= SPI_RX_FIFO_FLUSH | SPI_TX_FIFO_FLUSH; ++ tegra_spi_writel(tspi, status, SPI_FIFO_STATUS); ++ while ((status & SPI_FIFO_EMPTY) != SPI_FIFO_EMPTY) { ++ status = tegra_spi_readl(tspi, SPI_FIFO_STATUS); ++ if (time_after(jiffies, timeout)) { ++ dev_err(tspi->dev, ++ "timeout waiting for fifo flush\n"); ++ return -EIO; ++ } ++ ++ udelay(1); ++ } + } + ++ return 0; ++} ++ ++static int tegra_spi_start_dma_based_transfer( ++ struct tegra_spi_data *tspi, struct spi_transfer *t) ++{ ++ u32 val; ++ unsigned int len; ++ int ret = 0; ++ u8 dma_burst; ++ struct dma_slave_config dma_sconfig = {0}; ++ + val = SPI_DMA_BLK_SET(tspi->curr_dma_words - 1); + tegra_spi_writel(tspi, val, SPI_DMA_BLK); + +@@ -496,12 +542,16 @@ static int tegra_spi_start_dma_based_transfer( + len = tspi->curr_dma_words * 4; + + /* Set attention level based on length of transfer */ +- if (len & 0xF) ++ if (len & 0xF) { + val |= SPI_TX_TRIG_1 | SPI_RX_TRIG_1; +- else if (((len) >> 4) & 0x1) ++ dma_burst = 1; ++ } else if (((len) >> 4) & 0x1) { + val |= SPI_TX_TRIG_4 | SPI_RX_TRIG_4; +- else ++ dma_burst = 4; ++ } else { + val |= SPI_TX_TRIG_8 | SPI_RX_TRIG_8; ++ dma_burst = 8; ++ } + + if (tspi->cur_direction & DATA_DIR_TX) + val |= SPI_IE_TX; +@@ -512,7 +562,18 @@ static int tegra_spi_start_dma_based_transfer( + tegra_spi_writel(tspi, val, SPI_DMA_CTL); + tspi->dma_control_reg = val; + ++ dma_sconfig.device_fc = true; + if (tspi->cur_direction & DATA_DIR_TX) { ++ dma_sconfig.dst_addr = tspi->phys + SPI_TX_FIFO; ++ dma_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; ++ dma_sconfig.dst_maxburst = dma_burst; ++ ret = dmaengine_slave_config(tspi->tx_dma_chan, &dma_sconfig); ++ if (ret < 0) { ++ dev_err(tspi->dev, ++ "DMA slave config failed: %d\n", ret); ++ return ret; ++ } ++ + tegra_spi_copy_client_txbuf_to_spi_txbuf(tspi, t); + ret = tegra_spi_start_tx_dma(tspi, len); + if (ret < 0) { +@@ -523,6 +584,16 @@ static int tegra_spi_start_dma_based_transfer( + } + + if (tspi->cur_direction & DATA_DIR_RX) { ++ dma_sconfig.src_addr = tspi->phys + SPI_RX_FIFO; ++ dma_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; ++ dma_sconfig.src_maxburst = dma_burst; ++ ret = dmaengine_slave_config(tspi->rx_dma_chan, &dma_sconfig); ++ if (ret < 0) { ++ dev_err(tspi->dev, ++ "DMA slave config failed: %d\n", ret); ++ return ret; ++ } ++ + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, + tspi->dma_buf_size, DMA_FROM_DEVICE); +@@ -582,7 +653,6 @@ static int tegra_spi_init_dma_param(struct tegra_spi_data *tspi, + u32 *dma_buf; + dma_addr_t dma_phys; + int ret; +- struct dma_slave_config dma_sconfig; + + dma_chan = dma_request_slave_channel_reason(tspi->dev, + dma_to_memory ? "rx" : "tx"); +@@ -602,19 +672,6 @@ static int tegra_spi_init_dma_param(struct tegra_spi_data *tspi, + return -ENOMEM; + } + +- if (dma_to_memory) { +- dma_sconfig.src_addr = tspi->phys + SPI_RX_FIFO; +- dma_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; +- dma_sconfig.src_maxburst = 0; +- } else { +- dma_sconfig.dst_addr = tspi->phys + SPI_TX_FIFO; +- dma_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; +- dma_sconfig.dst_maxburst = 0; +- } +- +- ret = dmaengine_slave_config(dma_chan, &dma_sconfig); +- if (ret) +- goto scrub; + if (dma_to_memory) { + tspi->rx_dma_chan = dma_chan; + tspi->rx_dma_buf = dma_buf; +@@ -625,11 +682,6 @@ static int tegra_spi_init_dma_param(struct tegra_spi_data *tspi, + tspi->tx_dma_phys = dma_phys; + } + return 0; +- +-scrub: +- dma_free_coherent(tspi->dev, tspi->dma_buf_size, dma_buf, dma_phys); +- dma_release_channel(dma_chan); +- return ret; + } + + static void tegra_spi_deinit_dma_param(struct tegra_spi_data *tspi, +@@ -730,6 +782,8 @@ static int tegra_spi_start_transfer_one(struct spi_device *spi, + + if (tspi->is_packed) + command1 |= SPI_PACKED; ++ else ++ command1 &= ~SPI_PACKED; + + command1 &= ~(SPI_CS_SEL_MASK | SPI_TX_EN | SPI_RX_EN); + tspi->cur_direction = 0; +@@ -748,6 +802,9 @@ static int tegra_spi_start_transfer_one(struct spi_device *spi, + dev_dbg(tspi->dev, "The def 0x%x and written 0x%x\n", + tspi->def_command1_reg, (unsigned)command1); + ++ ret = tegra_spi_flush_fifos(tspi); ++ if (ret < 0) ++ return ret; + if (total_fifo_words > SPI_FIFO_DEPTH) + ret = tegra_spi_start_dma_based_transfer(tspi, t); + else +@@ -838,7 +895,17 @@ static int tegra_spi_transfer_one_message(struct spi_master *master, + if (WARN_ON(ret == 0)) { + dev_err(tspi->dev, + "spi transfer timeout, err %d\n", ret); ++ if (tspi->is_curr_dma_xfer && ++ (tspi->cur_direction & DATA_DIR_TX)) ++ dmaengine_terminate_all(tspi->tx_dma_chan); ++ if (tspi->is_curr_dma_xfer && ++ (tspi->cur_direction & DATA_DIR_RX)) ++ dmaengine_terminate_all(tspi->rx_dma_chan); + ret = -EIO; ++ tegra_spi_flush_fifos(tspi); ++ reset_control_assert(tspi->rst); ++ udelay(2); ++ reset_control_deassert(tspi->rst); + goto complete_xfer; + } + +@@ -889,6 +956,7 @@ static irqreturn_t handle_cpu_based_xfer(struct tegra_spi_data *tspi) + tspi->status_reg); + dev_err(tspi->dev, "CpuXfer 0x%08x:0x%08x\n", + tspi->command1_reg, tspi->dma_control_reg); ++ tegra_spi_flush_fifos(tspi); + reset_control_assert(tspi->rst); + udelay(2); + reset_control_deassert(tspi->rst); +@@ -961,6 +1029,7 @@ static irqreturn_t handle_dma_based_xfer(struct tegra_spi_data *tspi) + tspi->status_reg); + dev_err(tspi->dev, "DmaXfer 0x%08x:0x%08x\n", + tspi->command1_reg, tspi->dma_control_reg); ++ tegra_spi_flush_fifos(tspi); + reset_control_assert(tspi->rst); + udelay(2); + reset_control_deassert(tspi->rst); +diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c +index 4389ab80c23e..fa730a871d25 100644 +--- a/drivers/spi/spi-topcliff-pch.c ++++ b/drivers/spi/spi-topcliff-pch.c +@@ -1008,6 +1008,9 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) + + /* RX */ + dma->sg_rx_p = kcalloc(num, sizeof(*dma->sg_rx_p), GFP_ATOMIC); ++ if (!dma->sg_rx_p) ++ return; ++ + sg_init_table(dma->sg_rx_p, num); /* Initialize SG table */ + /* offset, length setting */ + sg = dma->sg_rx_p; +@@ -1068,6 +1071,9 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) + } + + dma->sg_tx_p = kcalloc(num, sizeof(*dma->sg_tx_p), GFP_ATOMIC); ++ if (!dma->sg_tx_p) ++ return; ++ + sg_init_table(dma->sg_tx_p, num); /* Initialize SG table */ + /* offset, length setting */ + sg = dma->sg_tx_p; +diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c +index 36361bdf934a..2f82dcb1fd06 100644 +--- a/drivers/staging/comedi/drivers/ni_mio_common.c ++++ b/drivers/staging/comedi/drivers/ni_mio_common.c +@@ -4991,7 +4991,10 @@ static int ni_valid_rtsi_output_source(struct comedi_device *dev, + case NI_RTSI_OUTPUT_G_SRC0: + case NI_RTSI_OUTPUT_G_GATE0: + case NI_RTSI_OUTPUT_RGOUT0: +- case NI_RTSI_OUTPUT_RTSI_BRD_0: ++ case NI_RTSI_OUTPUT_RTSI_BRD(0): ++ case NI_RTSI_OUTPUT_RTSI_BRD(1): ++ case NI_RTSI_OUTPUT_RTSI_BRD(2): ++ case NI_RTSI_OUTPUT_RTSI_BRD(3): + return 1; + case NI_RTSI_OUTPUT_RTSI_OSC: + return (devpriv->is_m_series) ? 1 : 0; +@@ -5012,11 +5015,18 @@ static int ni_set_rtsi_routing(struct comedi_device *dev, + devpriv->rtsi_trig_a_output_reg |= NISTC_RTSI_TRIG(chan, src); + ni_stc_writew(dev, devpriv->rtsi_trig_a_output_reg, + NISTC_RTSI_TRIGA_OUT_REG); +- } else if (chan < 8) { ++ } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { + devpriv->rtsi_trig_b_output_reg &= ~NISTC_RTSI_TRIG_MASK(chan); + devpriv->rtsi_trig_b_output_reg |= NISTC_RTSI_TRIG(chan, src); + ni_stc_writew(dev, devpriv->rtsi_trig_b_output_reg, + NISTC_RTSI_TRIGB_OUT_REG); ++ } else if (chan != NISTC_RTSI_TRIG_OLD_CLK_CHAN) { ++ /* probably should never reach this, since the ++ * ni_valid_rtsi_output_source above errors out if chan is too ++ * high ++ */ ++ dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); ++ return -EINVAL; + } + return 2; + } +@@ -5032,12 +5042,12 @@ static unsigned int ni_get_rtsi_routing(struct comedi_device *dev, + } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { + return NISTC_RTSI_TRIG_TO_SRC(chan, + devpriv->rtsi_trig_b_output_reg); +- } else { +- if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) +- return NI_RTSI_OUTPUT_RTSI_OSC; +- dev_err(dev->class_dev, "bug! should never get here?\n"); +- return 0; ++ } else if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) { ++ return NI_RTSI_OUTPUT_RTSI_OSC; + } ++ ++ dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); ++ return -EINVAL; + } + + static int ni_rtsi_insn_config(struct comedi_device *dev, +diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c +index 0f538b8c3a07..4e7575147775 100644 +--- a/drivers/staging/greybus/light.c ++++ b/drivers/staging/greybus/light.c +@@ -1103,21 +1103,21 @@ static void gb_lights_channel_release(struct gb_channel *channel) + static void gb_lights_light_release(struct gb_light *light) + { + int i; +- int count; + + light->ready = false; + +- count = light->channels_count; +- + if (light->has_flash) + gb_lights_light_v4l2_unregister(light); ++ light->has_flash = false; + +- for (i = 0; i < count; i++) { ++ for (i = 0; i < light->channels_count; i++) + gb_lights_channel_release(&light->channels[i]); +- light->channels_count--; +- } ++ light->channels_count = 0; ++ + kfree(light->channels); ++ light->channels = NULL; + kfree(light->name); ++ light->name = NULL; + } + + static void gb_lights_release(struct gb_lights *glights) +diff --git a/drivers/staging/most/aim-cdev/cdev.c b/drivers/staging/most/aim-cdev/cdev.c +index 1e5cbc893496..d000b6ff8a7d 100644 +--- a/drivers/staging/most/aim-cdev/cdev.c ++++ b/drivers/staging/most/aim-cdev/cdev.c +@@ -455,7 +455,9 @@ static int aim_probe(struct most_interface *iface, int channel_id, + c->devno = MKDEV(major, current_minor); + cdev_init(&c->cdev, &channel_fops); + c->cdev.owner = THIS_MODULE; +- cdev_add(&c->cdev, c->devno, 1); ++ retval = cdev_add(&c->cdev, c->devno, 1); ++ if (retval < 0) ++ goto err_free_c; + c->iface = iface; + c->cfg = cfg; + c->channel_id = channel_id; +@@ -491,6 +493,7 @@ error_create_device: + list_del(&c->list); + error_alloc_kfifo: + cdev_del(&c->cdev); ++err_free_c: + kfree(c); + error_alloc_channel: + ida_simple_remove(&minor_id, current_minor); +diff --git a/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c b/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c +index 544f638ed3ef..65edd14a1147 100644 +--- a/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c ++++ b/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c +@@ -2492,8 +2492,11 @@ halmac_parse_psd_data_88xx(struct halmac_adapter *halmac_adapter, u8 *c2h_buf, + segment_size = (u8)PSD_DATA_GET_SEGMENT_SIZE(c2h_buf); + psd_set->data_size = total_size; + +- if (!psd_set->data) ++ if (!psd_set->data) { + psd_set->data = kzalloc(psd_set->data_size, GFP_KERNEL); ++ if (!psd_set->data) ++ return HALMAC_RET_MALLOC_FAIL; ++ } + + if (segment_id == 0) + psd_set->segment_size = segment_size; +diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +index 377da037f31c..b521752d9aa0 100644 +--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c ++++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +@@ -1849,6 +1849,12 @@ static int __init bm2835_mmal_init(void) + num_cameras = get_num_cameras(instance, + resolutions, + MAX_BCM2835_CAMERAS); ++ ++ if (num_cameras < 1) { ++ ret = -ENODEV; ++ goto cleanup_mmal; ++ } ++ + if (num_cameras > MAX_BCM2835_CAMERAS) + num_cameras = MAX_BCM2835_CAMERAS; + +@@ -1948,6 +1954,9 @@ cleanup_gdev: + pr_info("%s: error %d while loading driver\n", + BM2835_MMAL_MODULE_NAME, ret); + ++cleanup_mmal: ++ vchiq_mmal_finalise(instance); ++ + return ret; + } + +diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c +index 92b52d2314b5..cebef8e5a43d 100644 +--- a/drivers/target/target_core_device.c ++++ b/drivers/target/target_core_device.c +@@ -85,7 +85,7 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun) + goto out_unlock; + } + +- se_cmd->se_lun = rcu_dereference(deve->se_lun); ++ se_cmd->se_lun = se_lun; + se_cmd->pr_res_key = deve->pr_res_key; + se_cmd->orig_fe_lun = unpacked_lun; + se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD; +@@ -176,7 +176,7 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun) + goto out_unlock; + } + +- se_cmd->se_lun = rcu_dereference(deve->se_lun); ++ se_cmd->se_lun = se_lun; + se_cmd->pr_res_key = deve->pr_res_key; + se_cmd->orig_fe_lun = unpacked_lun; + se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD; +diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c +index 908a8014cf76..aed995ec2c90 100644 +--- a/drivers/thermal/cpu_cooling.c ++++ b/drivers/thermal/cpu_cooling.c +@@ -514,7 +514,7 @@ static int cpufreq_get_requested_power(struct thermal_cooling_device *cdev, + load = 0; + + total_load += load; +- if (trace_thermal_power_cpu_limit_enabled() && load_cpu) ++ if (load_cpu) + load_cpu[i] = load; + + i++; +diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c +index 1e61c09153c9..76b92083744c 100644 +--- a/drivers/thermal/mtk_thermal.c ++++ b/drivers/thermal/mtk_thermal.c +@@ -407,7 +407,8 @@ 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[i]); ++ raw = readl(mt->thermal_base + ++ conf->msr[conf->bank_data[bank->id].sensors[i]]); + + temp = raw_to_mcelsius(mt, + conf->bank_data[bank->id].sensors[i], +@@ -544,7 +545,8 @@ 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[i]); ++ mt->thermal_base + ++ conf->adcpnp[conf->bank_data[num].sensors[i]]); + + writel((1 << conf->bank_data[num].num_sensors) - 1, + mt->thermal_base + TEMP_MONCTL0); +diff --git a/drivers/tty/ipwireless/hardware.c b/drivers/tty/ipwireless/hardware.c +index a6b8240af6cd..960e9375a1a9 100644 +--- a/drivers/tty/ipwireless/hardware.c ++++ b/drivers/tty/ipwireless/hardware.c +@@ -1516,6 +1516,8 @@ static void ipw_send_setup_packet(struct ipw_hardware *hw) + sizeof(struct ipw_setup_get_version_query_packet), + ADDR_SETUP_PROT, TL_PROTOCOLID_SETUP, + TL_SETUP_SIGNO_GET_VERSION_QRY); ++ if (!ver_packet) ++ return; + ver_packet->header.length = sizeof(struct tl_setup_get_version_qry); + + /* +diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c +index fb2dcb3f8591..16422987ab0f 100644 +--- a/drivers/tty/serial/fsl_lpuart.c ++++ b/drivers/tty/serial/fsl_lpuart.c +@@ -532,26 +532,26 @@ static int lpuart32_poll_init(struct uart_port *port) + spin_lock_irqsave(&sport->port.lock, flags); + + /* Disable Rx & Tx */ +- writel(0, sport->port.membase + UARTCTRL); ++ lpuart32_write(&sport->port, UARTCTRL, 0); + +- temp = readl(sport->port.membase + UARTFIFO); ++ temp = lpuart32_read(&sport->port, UARTFIFO); + + /* Enable Rx and Tx FIFO */ +- writel(temp | UARTFIFO_RXFE | UARTFIFO_TXFE, +- sport->port.membase + UARTFIFO); ++ lpuart32_write(&sport->port, UARTFIFO, ++ temp | UARTFIFO_RXFE | UARTFIFO_TXFE); + + /* flush Tx and Rx FIFO */ +- writel(UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH, +- sport->port.membase + UARTFIFO); ++ lpuart32_write(&sport->port, UARTFIFO, ++ UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH); + + /* explicitly clear RDRF */ +- if (readl(sport->port.membase + UARTSTAT) & UARTSTAT_RDRF) { +- readl(sport->port.membase + UARTDATA); +- writel(UARTFIFO_RXUF, sport->port.membase + UARTFIFO); ++ if (lpuart32_read(&sport->port, UARTSTAT) & UARTSTAT_RDRF) { ++ lpuart32_read(&sport->port, UARTDATA); ++ lpuart32_write(&sport->port, UARTFIFO, UARTFIFO_RXUF); + } + + /* Enable Rx and Tx */ +- writel(UARTCTRL_RE | UARTCTRL_TE, sport->port.membase + UARTCTRL); ++ lpuart32_write(&sport->port, UARTCTRL, UARTCTRL_RE | UARTCTRL_TE); + spin_unlock_irqrestore(&sport->port.lock, flags); + + return 0; +@@ -559,18 +559,18 @@ static int lpuart32_poll_init(struct uart_port *port) + + static void lpuart32_poll_put_char(struct uart_port *port, unsigned char c) + { +- while (!(readl(port->membase + UARTSTAT) & UARTSTAT_TDRE)) ++ while (!(lpuart32_read(port, UARTSTAT) & UARTSTAT_TDRE)) + barrier(); + +- writel(c, port->membase + UARTDATA); ++ lpuart32_write(port, UARTDATA, c); + } + + static int lpuart32_poll_get_char(struct uart_port *port) + { +- if (!(readl(port->membase + UARTSTAT) & UARTSTAT_RDRF)) ++ if (!(lpuart32_read(port, UARTSTAT) & UARTSTAT_RDRF)) + return NO_POLL_CHAR; + +- return readl(port->membase + UARTDATA); ++ return lpuart32_read(port, UARTDATA); + } + #endif + +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index 03a583264d9e..1e854e1851fb 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -118,35 +118,51 @@ static void stm32_receive_chars(struct uart_port *port, bool threaded) + + while (stm32_pending_rx(port, &sr, &stm32_port->last_res, threaded)) { + sr |= USART_SR_DUMMY_RX; +- c = stm32_get_char(port, &sr, &stm32_port->last_res); + flag = TTY_NORMAL; +- port->icount.rx++; + ++ /* ++ * Status bits has to be cleared before reading the RDR: ++ * In FIFO mode, reading the RDR will pop the next data ++ * (if any) along with its status bits into the SR. ++ * Not doing so leads to misalignement between RDR and SR, ++ * and clear status bits of the next rx data. ++ * ++ * Clear errors flags for stm32f7 and stm32h7 compatible ++ * devices. On stm32f4 compatible devices, the error bit is ++ * cleared by the sequence [read SR - read DR]. ++ */ ++ if ((sr & USART_SR_ERR_MASK) && ofs->icr != UNDEF_REG) ++ writel_relaxed(sr & USART_SR_ERR_MASK, ++ port->membase + ofs->icr); ++ ++ c = stm32_get_char(port, &sr, &stm32_port->last_res); ++ port->icount.rx++; + if (sr & USART_SR_ERR_MASK) { +- if (sr & USART_SR_LBD) { +- port->icount.brk++; +- if (uart_handle_break(port)) +- continue; +- } else if (sr & USART_SR_ORE) { +- if (ofs->icr != UNDEF_REG) +- writel_relaxed(USART_ICR_ORECF, +- port->membase + +- ofs->icr); ++ if (sr & USART_SR_ORE) { + port->icount.overrun++; + } else if (sr & USART_SR_PE) { + port->icount.parity++; + } else if (sr & USART_SR_FE) { +- port->icount.frame++; ++ /* Break detection if character is null */ ++ if (!c) { ++ port->icount.brk++; ++ if (uart_handle_break(port)) ++ continue; ++ } else { ++ port->icount.frame++; ++ } + } + + sr &= port->read_status_mask; + +- if (sr & USART_SR_LBD) +- flag = TTY_BREAK; +- else if (sr & USART_SR_PE) ++ if (sr & USART_SR_PE) { + flag = TTY_PARITY; +- else if (sr & USART_SR_FE) +- flag = TTY_FRAME; ++ } else if (sr & USART_SR_FE) { ++ if (!c) ++ flag = TTY_BREAK; ++ else ++ flag = TTY_FRAME; ++ } + } + + if (uart_handle_sysrq_char(port, c)) +@@ -164,21 +180,6 @@ static void stm32_tx_dma_complete(void *arg) + struct uart_port *port = arg; + struct stm32_port *stm32port = to_stm32_port(port); + struct stm32_usart_offsets *ofs = &stm32port->info->ofs; +- unsigned int isr; +- int ret; +- +- ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr, +- isr, +- (isr & USART_SR_TC), +- 10, 100000); +- +- if (ret) +- dev_err(port->dev, "terminal count not set\n"); +- +- if (ofs->icr == UNDEF_REG) +- stm32_clr_bits(port, ofs->isr, USART_SR_TC); +- else +- stm32_set_bits(port, ofs->icr, USART_CR_TC); + + stm32_clr_bits(port, ofs->cr3, USART_CR3_DMAT); + stm32port->tx_dma_busy = false; +@@ -270,7 +271,6 @@ static void stm32_transmit_chars_dma(struct uart_port *port) + /* Issue pending DMA TX requests */ + dma_async_issue_pending(stm32port->tx_ch); + +- stm32_clr_bits(port, ofs->isr, USART_SR_TC); + stm32_set_bits(port, ofs->cr3, USART_CR3_DMAT); + + xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1); +@@ -294,15 +294,15 @@ static void stm32_transmit_chars(struct uart_port *port) + return; + } + +- if (uart_tx_stopped(port)) { +- stm32_stop_tx(port); ++ if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { ++ stm32_clr_bits(port, ofs->cr1, USART_CR1_TXEIE); + return; + } + +- if (uart_circ_empty(xmit)) { +- stm32_stop_tx(port); +- return; +- } ++ if (ofs->icr == UNDEF_REG) ++ stm32_clr_bits(port, ofs->isr, USART_SR_TC); ++ else ++ writel_relaxed(USART_ICR_TCCF, port->membase + ofs->icr); + + if (stm32_port->tx_ch) + stm32_transmit_chars_dma(port); +@@ -313,7 +313,7 @@ static void stm32_transmit_chars(struct uart_port *port) + uart_write_wakeup(port); + + if (uart_circ_empty(xmit)) +- stm32_stop_tx(port); ++ stm32_clr_bits(port, ofs->cr1, USART_CR1_TXEIE); + } + + static irqreturn_t stm32_interrupt(int irq, void *ptr) +@@ -447,7 +447,6 @@ static int stm32_startup(struct uart_port *port) + { + struct stm32_port *stm32_port = to_stm32_port(port); + struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; +- struct stm32_usart_config *cfg = &stm32_port->info->cfg; + const char *name = to_platform_device(port->dev)->name; + u32 val; + int ret; +@@ -458,15 +457,6 @@ static int stm32_startup(struct uart_port *port) + if (ret) + return ret; + +- if (cfg->has_wakeup && stm32_port->wakeirq >= 0) { +- ret = dev_pm_set_dedicated_wake_irq(port->dev, +- stm32_port->wakeirq); +- if (ret) { +- free_irq(port->irq, port); +- return ret; +- } +- } +- + val = USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; + if (stm32_port->fifoen) + val |= USART_CR1_FIFOEN; +@@ -480,15 +470,23 @@ static void stm32_shutdown(struct uart_port *port) + struct stm32_port *stm32_port = to_stm32_port(port); + struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; + struct stm32_usart_config *cfg = &stm32_port->info->cfg; +- u32 val; ++ u32 val, isr; ++ int ret; + + val = USART_CR1_TXEIE | USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; + val |= BIT(cfg->uart_enable_bit); + if (stm32_port->fifoen) + val |= USART_CR1_FIFOEN; ++ ++ ret = readl_relaxed_poll_timeout(port->membase + ofs->isr, ++ isr, (isr & USART_SR_TC), ++ 10, 100000); ++ ++ if (ret) ++ dev_err(port->dev, "transmission complete not set\n"); ++ + stm32_clr_bits(port, ofs->cr1, val); + +- dev_pm_clear_wake_irq(port->dev); + free_irq(port->irq, port); + } + +@@ -569,14 +567,14 @@ static void stm32_set_termios(struct uart_port *port, struct ktermios *termios, + if (termios->c_iflag & INPCK) + port->read_status_mask |= USART_SR_PE | USART_SR_FE; + if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) +- port->read_status_mask |= USART_SR_LBD; ++ port->read_status_mask |= USART_SR_FE; + + /* Characters to ignore */ + port->ignore_status_mask = 0; + if (termios->c_iflag & IGNPAR) + port->ignore_status_mask = USART_SR_PE | USART_SR_FE; + if (termios->c_iflag & IGNBRK) { +- port->ignore_status_mask |= USART_SR_LBD; ++ port->ignore_status_mask |= USART_SR_FE; + /* + * If we're ignoring parity and break indicators, + * ignore overruns too (for real raw support). +@@ -895,11 +893,18 @@ static int stm32_serial_probe(struct platform_device *pdev) + ret = device_init_wakeup(&pdev->dev, true); + if (ret) + goto err_uninit; ++ ++ ret = dev_pm_set_dedicated_wake_irq(&pdev->dev, ++ stm32port->wakeirq); ++ if (ret) ++ goto err_nowup; ++ ++ device_set_wakeup_enable(&pdev->dev, false); + } + + ret = uart_add_one_port(&stm32_usart_driver, &stm32port->port); + if (ret) +- goto err_nowup; ++ goto err_wirq; + + ret = stm32_of_dma_rx_probe(stm32port, pdev); + if (ret) +@@ -913,6 +918,10 @@ static int stm32_serial_probe(struct platform_device *pdev) + + return 0; + ++err_wirq: ++ if (stm32port->info->cfg.has_wakeup && stm32port->wakeirq >= 0) ++ dev_pm_clear_wake_irq(&pdev->dev); ++ + err_nowup: + if (stm32port->info->cfg.has_wakeup && stm32port->wakeirq >= 0) + device_init_wakeup(&pdev->dev, false); +@@ -950,8 +959,10 @@ static int stm32_serial_remove(struct platform_device *pdev) + TX_BUF_L, stm32_port->tx_buf, + stm32_port->tx_dma_buf); + +- if (cfg->has_wakeup && stm32_port->wakeirq >= 0) ++ if (cfg->has_wakeup && stm32_port->wakeirq >= 0) { ++ dev_pm_clear_wake_irq(&pdev->dev); + device_init_wakeup(&pdev->dev, false); ++ } + + clk_disable_unprepare(stm32_port->clk); + +diff --git a/drivers/tty/serial/stm32-usart.h b/drivers/tty/serial/stm32-usart.h +index ffc0c5285e51..9d087881913a 100644 +--- a/drivers/tty/serial/stm32-usart.h ++++ b/drivers/tty/serial/stm32-usart.h +@@ -108,7 +108,6 @@ struct stm32_usart_info stm32h7_info = { + #define USART_SR_RXNE BIT(5) + #define USART_SR_TC BIT(6) + #define USART_SR_TXE BIT(7) +-#define USART_SR_LBD BIT(8) + #define USART_SR_CTSIF BIT(9) + #define USART_SR_CTS BIT(10) /* F7 */ + #define USART_SR_RTOF BIT(11) /* F7 */ +@@ -120,8 +119,7 @@ struct stm32_usart_info stm32h7_info = { + #define USART_SR_SBKF BIT(18) /* F7 */ + #define USART_SR_WUF BIT(20) /* H7 */ + #define USART_SR_TEACK BIT(21) /* F7 */ +-#define USART_SR_ERR_MASK (USART_SR_LBD | USART_SR_ORE | \ +- USART_SR_FE | USART_SR_PE) ++#define USART_SR_ERR_MASK (USART_SR_ORE | USART_SR_FE | USART_SR_PE) + /* Dummy bits */ + #define USART_SR_DUMMY_RX BIT(16) + +@@ -166,8 +164,6 @@ struct stm32_usart_info stm32h7_info = { + /* USART_CR2 */ + #define USART_CR2_ADD_MASK GENMASK(3, 0) /* F4 */ + #define USART_CR2_ADDM7 BIT(4) /* F7 */ +-#define USART_CR2_LBDL BIT(5) +-#define USART_CR2_LBDIE BIT(6) + #define USART_CR2_LBCL BIT(8) + #define USART_CR2_CPHA BIT(9) + #define USART_CR2_CPOL BIT(10) +@@ -224,12 +220,10 @@ struct stm32_usart_info stm32h7_info = { + + /* USART_ICR */ + #define USART_ICR_PECF BIT(0) /* F7 */ +-#define USART_ICR_FFECF BIT(1) /* F7 */ +-#define USART_ICR_NCF BIT(2) /* F7 */ ++#define USART_ICR_FECF BIT(1) /* F7 */ + #define USART_ICR_ORECF BIT(3) /* F7 */ + #define USART_ICR_IDLECF BIT(4) /* F7 */ + #define USART_ICR_TCCF BIT(6) /* F7 */ +-#define USART_ICR_LBDCF BIT(8) /* F7 */ + #define USART_ICR_CTSCF BIT(9) /* F7 */ + #define USART_ICR_RTOCF BIT(11) /* F7 */ + #define USART_ICR_EOBCF BIT(12) /* F7 */ +diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c +index fb5c9701b1fb..7c18536a3742 100644 +--- a/drivers/uio/uio.c ++++ b/drivers/uio/uio.c +@@ -939,9 +939,12 @@ int __uio_register_device(struct module *owner, + atomic_set(&idev->event, 0); + + ret = uio_get_minor(idev); +- if (ret) ++ if (ret) { ++ kfree(idev); + return ret; ++ } + ++ device_initialize(&idev->dev); + idev->dev.devt = MKDEV(uio_major, idev->minor); + idev->dev.class = &uio_class; + idev->dev.parent = parent; +@@ -952,7 +955,7 @@ int __uio_register_device(struct module *owner, + if (ret) + goto err_device_create; + +- ret = device_register(&idev->dev); ++ ret = device_add(&idev->dev); + if (ret) + goto err_device_create; + +@@ -984,9 +987,10 @@ int __uio_register_device(struct module *owner, + err_request_irq: + uio_dev_del_attributes(idev); + err_uio_dev_add_attributes: +- device_unregister(&idev->dev); ++ device_del(&idev->dev); + err_device_create: + uio_free_minor(idev); ++ put_device(&idev->dev); + return ret; + } + EXPORT_SYMBOL_GPL(__uio_register_device); +diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c +index a593cdfc897f..d5d42dccda10 100644 +--- a/drivers/usb/class/cdc-wdm.c ++++ b/drivers/usb/class/cdc-wdm.c +@@ -1085,7 +1085,7 @@ static int wdm_post_reset(struct usb_interface *intf) + rv = recover_from_urb_loss(desc); + mutex_unlock(&desc->wlock); + mutex_unlock(&desc->rlock); +- return 0; ++ return rv; + } + + static struct usb_driver wdm_driver = { +diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c +index e164439b2154..4af9a1c652ed 100644 +--- a/drivers/usb/dwc2/gadget.c ++++ b/drivers/usb/dwc2/gadget.c +@@ -2276,6 +2276,7 @@ static unsigned int dwc2_gadget_get_xfersize_ddma(struct dwc2_hsotg_ep *hs_ep) + if (status & DEV_DMA_STS_MASK) + dev_err(hsotg->dev, "descriptor %d closed with %x\n", + i, status & DEV_DMA_STS_MASK); ++ desc++; + } + + return bytes_rem; +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index d1363f3fabfa..3bb38d9dc45b 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -1118,7 +1118,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + } + port_li = readl(port_array[wIndex] + PORTLI); + status = xhci_get_ext_port_status(temp, port_li); +- put_unaligned_le32(cpu_to_le32(status), &buf[4]); ++ put_unaligned_le32(status, &buf[4]); + } + break; + case SetPortFeature: +diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig +index 85a92d0813dd..440238061edd 100644 +--- a/drivers/usb/phy/Kconfig ++++ b/drivers/usb/phy/Kconfig +@@ -20,7 +20,7 @@ config AB8500_USB + in host mode, low speed. + + config FSL_USB2_OTG +- bool "Freescale USB OTG Transceiver Driver" ++ tristate "Freescale USB OTG Transceiver Driver" + depends on USB_EHCI_FSL && USB_FSL_USB2 && USB_OTG_FSM=y && PM + depends on USB_GADGET || !USB_GADGET # if USB_GADGET=m, this can't be 'y' + select USB_PHY +diff --git a/drivers/usb/phy/phy-twl6030-usb.c b/drivers/usb/phy/phy-twl6030-usb.c +index b5dc077ed7d3..8e14fa221191 100644 +--- a/drivers/usb/phy/phy-twl6030-usb.c ++++ b/drivers/usb/phy/phy-twl6030-usb.c +@@ -413,7 +413,7 @@ static int twl6030_usb_remove(struct platform_device *pdev) + { + struct twl6030_usb *twl = platform_get_drvdata(pdev); + +- cancel_delayed_work(&twl->get_status_work); ++ cancel_delayed_work_sync(&twl->get_status_work); + twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK, + REG_INT_MSK_LINE_C); + twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK, +diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c +index 0212f0ee8aea..e052f62fdea7 100644 +--- a/drivers/vfio/mdev/mdev_core.c ++++ b/drivers/vfio/mdev/mdev_core.c +@@ -150,10 +150,10 @@ static int mdev_device_remove_ops(struct mdev_device *mdev, bool force_remove) + + static int mdev_device_remove_cb(struct device *dev, void *data) + { +- if (!dev_is_mdev(dev)) +- return 0; ++ if (dev_is_mdev(dev)) ++ mdev_device_remove(dev, true); + +- return mdev_device_remove(dev, data ? *(bool *)data : true); ++ return 0; + } + + /* +@@ -182,6 +182,7 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops) + /* Check for duplicate */ + parent = __find_parent_device(dev); + if (parent) { ++ parent = NULL; + ret = -EEXIST; + goto add_dev_err; + } +@@ -240,7 +241,6 @@ EXPORT_SYMBOL(mdev_register_device); + void mdev_unregister_device(struct device *dev) + { + struct mdev_parent *parent; +- bool force_remove = true; + + mutex_lock(&parent_list_lock); + parent = __find_parent_device(dev); +@@ -254,8 +254,7 @@ void mdev_unregister_device(struct device *dev) + list_del(&parent->next); + class_compat_remove_link(mdev_bus_compat_class, dev, NULL); + +- device_for_each_child(dev, (void *)&force_remove, +- mdev_device_remove_cb); ++ device_for_each_child(dev, NULL, mdev_device_remove_cb); + + parent_remove_sysfs_files(parent); + +diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c +index 9bd3e7911af2..550ab7707b57 100644 +--- a/drivers/vfio/pci/vfio_pci.c ++++ b/drivers/vfio/pci/vfio_pci.c +@@ -717,6 +717,7 @@ static long vfio_pci_ioctl(void *device_data, + { + void __iomem *io; + size_t size; ++ u16 orig_cmd; + + info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index); + info.flags = 0; +@@ -732,15 +733,23 @@ static long vfio_pci_ioctl(void *device_data, + break; + } + +- /* Is it really there? */ ++ /* ++ * Is it really there? Enable memory decode for ++ * implicit access in pci_map_rom(). ++ */ ++ pci_read_config_word(pdev, PCI_COMMAND, &orig_cmd); ++ pci_write_config_word(pdev, PCI_COMMAND, ++ orig_cmd | PCI_COMMAND_MEMORY); ++ + io = pci_map_rom(pdev, &size); +- if (!io || !size) { ++ if (io) { ++ info.flags = VFIO_REGION_INFO_FLAG_READ; ++ pci_unmap_rom(pdev, io); ++ } else { + info.size = 0; +- break; + } +- pci_unmap_rom(pdev, io); + +- info.flags = VFIO_REGION_INFO_FLAG_READ; ++ pci_write_config_word(pdev, PCI_COMMAND, orig_cmd); + break; + } + case VFIO_PCI_VGA_REGION_INDEX: +diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c +index 2030a6b77a09..ef2553f452ca 100644 +--- a/drivers/video/backlight/lm3630a_bl.c ++++ b/drivers/video/backlight/lm3630a_bl.c +@@ -201,7 +201,7 @@ static int lm3630a_bank_a_update_status(struct backlight_device *bl) + LM3630A_LEDA_ENABLE, LM3630A_LEDA_ENABLE); + if (ret < 0) + goto out_i2c_err; +- return bl->props.brightness; ++ return 0; + + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access\n"); +@@ -278,7 +278,7 @@ static int lm3630a_bank_b_update_status(struct backlight_device *bl) + LM3630A_LEDB_ENABLE, LM3630A_LEDB_ENABLE); + if (ret < 0) + goto out_i2c_err; +- return bl->props.brightness; ++ return 0; + + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); +diff --git a/drivers/video/fbdev/chipsfb.c b/drivers/video/fbdev/chipsfb.c +index f103665cad43..f9b366d17587 100644 +--- a/drivers/video/fbdev/chipsfb.c ++++ b/drivers/video/fbdev/chipsfb.c +@@ -350,7 +350,7 @@ static void init_chips(struct fb_info *p, unsigned long addr) + static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) + { + struct fb_info *p; +- unsigned long addr, size; ++ unsigned long addr; + unsigned short cmd; + int rc = -ENODEV; + +@@ -362,7 +362,6 @@ static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) + if ((dp->resource[0].flags & IORESOURCE_MEM) == 0) + goto err_disable; + addr = pci_resource_start(dp, 0); +- size = pci_resource_len(dp, 0); + if (addr == 0) + goto err_disable; + +diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c +index b1357aa4bc55..f192b6f42da9 100644 +--- a/drivers/xen/cpu_hotplug.c ++++ b/drivers/xen/cpu_hotplug.c +@@ -54,7 +54,7 @@ static int vcpu_online(unsigned int cpu) + } + static void vcpu_hotplug(unsigned int cpu) + { +- if (!cpu_possible(cpu)) ++ if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) + return; + + switch (vcpu_online(cpu)) { +diff --git a/drivers/xen/pvcalls-back.c b/drivers/xen/pvcalls-back.c +index abd6dbc29ac2..58be15c27b6d 100644 +--- a/drivers/xen/pvcalls-back.c ++++ b/drivers/xen/pvcalls-back.c +@@ -792,7 +792,7 @@ static int pvcalls_back_poll(struct xenbus_device *dev, + mappass->reqcopy = *req; + icsk = inet_csk(mappass->sock->sk); + queue = &icsk->icsk_accept_queue; +- data = queue->rskq_accept_head != NULL; ++ data = READ_ONCE(queue->rskq_accept_head) != NULL; + if (data) { + mappass->reqcopy.cmd = 0; + ret = 0; +diff --git a/fs/affs/super.c b/fs/affs/super.c +index 884bedab7266..789a1c7db5d8 100644 +--- a/fs/affs/super.c ++++ b/fs/affs/super.c +@@ -559,14 +559,9 @@ affs_remount(struct super_block *sb, int *flags, char *data) + int root_block; + unsigned long mount_flags; + int res = 0; +- char *new_opts; + char volume[32]; + char *prefix = NULL; + +- new_opts = kstrdup(data, GFP_KERNEL); +- if (data && !new_opts) +- return -ENOMEM; +- + pr_debug("%s(flags=0x%x,opts=\"%s\")\n", __func__, *flags, data); + + sync_filesystem(sb); +@@ -577,7 +572,6 @@ affs_remount(struct super_block *sb, int *flags, char *data) + &blocksize, &prefix, volume, + &mount_flags)) { + kfree(prefix); +- kfree(new_opts); + return -EINVAL; + } + +diff --git a/fs/afs/super.c b/fs/afs/super.c +index 689173c0a682..f8529ddbd587 100644 +--- a/fs/afs/super.c ++++ b/fs/afs/super.c +@@ -359,6 +359,7 @@ static int afs_fill_super(struct super_block *sb, + /* fill in the superblock */ + sb->s_blocksize = PAGE_SIZE; + sb->s_blocksize_bits = PAGE_SHIFT; ++ sb->s_maxbytes = MAX_LFS_FILESIZE; + sb->s_magic = AFS_FS_MAGIC; + sb->s_op = &afs_super_ops; + sb->s_xattr = afs_xattr_handlers; +diff --git a/fs/afs/xattr.c b/fs/afs/xattr.c +index 2830e4f48d85..7c6b62a94e7e 100644 +--- a/fs/afs/xattr.c ++++ b/fs/afs/xattr.c +@@ -50,7 +50,7 @@ static int afs_xattr_get_cell(const struct xattr_handler *handler, + return namelen; + if (namelen > size) + return -ERANGE; +- memcpy(buffer, cell->name, size); ++ memcpy(buffer, cell->name, namelen); + return namelen; + } + +@@ -104,7 +104,7 @@ static int afs_xattr_get_volume(const struct xattr_handler *handler, + return namelen; + if (namelen > size) + return -ERANGE; +- memcpy(buffer, volname, size); ++ memcpy(buffer, volname, namelen); + return namelen; + } + +diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c +index 97be32da857a..c68ce3412dc1 100644 +--- a/fs/btrfs/file.c ++++ b/fs/btrfs/file.c +@@ -1882,7 +1882,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, + bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host); + ssize_t err; + loff_t pos; +- size_t count = iov_iter_count(from); ++ size_t count; + loff_t oldsize; + int clean_page = 0; + +@@ -1904,6 +1904,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, + } + + pos = iocb->ki_pos; ++ count = iov_iter_count(from); + if (iocb->ki_flags & IOCB_NOWAIT) { + /* + * We will allocate space in case nodatacow is not set, +diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c +index d02019747d00..2ae32451fb5b 100644 +--- a/fs/btrfs/inode-map.c ++++ b/fs/btrfs/inode-map.c +@@ -26,6 +26,19 @@ + #include "inode-map.h" + #include "transaction.h" + ++static void fail_caching_thread(struct btrfs_root *root) ++{ ++ struct btrfs_fs_info *fs_info = root->fs_info; ++ ++ btrfs_warn(fs_info, "failed to start inode caching task"); ++ btrfs_clear_pending_and_info(fs_info, INODE_MAP_CACHE, ++ "disabling inode map caching"); ++ spin_lock(&root->ino_cache_lock); ++ root->ino_cache_state = BTRFS_CACHE_ERROR; ++ spin_unlock(&root->ino_cache_lock); ++ wake_up(&root->ino_cache_wait); ++} ++ + static int caching_kthread(void *data) + { + struct btrfs_root *root = data; +@@ -42,8 +55,10 @@ static int caching_kthread(void *data) + return 0; + + path = btrfs_alloc_path(); +- if (!path) ++ if (!path) { ++ fail_caching_thread(root); + return -ENOMEM; ++ } + + /* Since the commit root is read-only, we can safely skip locking. */ + path->skip_locking = 1; +@@ -159,6 +174,7 @@ static void start_caching(struct btrfs_root *root) + spin_lock(&root->ino_cache_lock); + root->ino_cache_state = BTRFS_CACHE_FINISHED; + spin_unlock(&root->ino_cache_lock); ++ wake_up(&root->ino_cache_wait); + return; + } + +@@ -177,11 +193,8 @@ static void start_caching(struct btrfs_root *root) + + tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu", + root->root_key.objectid); +- if (IS_ERR(tsk)) { +- btrfs_warn(fs_info, "failed to start inode caching task"); +- btrfs_clear_pending_and_info(fs_info, INODE_MAP_CACHE, +- "disabling inode map caching"); +- } ++ if (IS_ERR(tsk)) ++ fail_caching_thread(root); + } + + int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) +@@ -199,11 +212,14 @@ again: + + wait_event(root->ino_cache_wait, + root->ino_cache_state == BTRFS_CACHE_FINISHED || ++ root->ino_cache_state == BTRFS_CACHE_ERROR || + root->free_ino_ctl->free_space > 0); + + if (root->ino_cache_state == BTRFS_CACHE_FINISHED && + root->free_ino_ctl->free_space == 0) + return -ENOSPC; ++ else if (root->ino_cache_state == BTRFS_CACHE_ERROR) ++ return btrfs_find_free_objectid(root, objectid); + else + goto again; + } +diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c +index f523a9ca9574..f0b1279a7de6 100644 +--- a/fs/cifs/connect.c ++++ b/fs/cifs/connect.c +@@ -921,6 +921,7 @@ cifs_demultiplex_thread(void *p) + mempool_resize(cifs_req_poolp, length + cifs_min_rcv); + + set_freezable(); ++ allow_kernel_signal(SIGKILL); + while (server->tcpStatus != CifsExiting) { + if (try_to_freeze()) + continue; +@@ -2320,7 +2321,7 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect) + + task = xchg(&server->tsk, NULL); + if (task) +- force_sig(SIGKILL, task); ++ send_sig(SIGKILL, task, 1); + } + + static struct TCP_Server_Info * +diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c +index a561ae17cf43..c08960040dd0 100644 +--- a/fs/exportfs/expfs.c ++++ b/fs/exportfs/expfs.c +@@ -147,6 +147,7 @@ static struct dentry *reconnect_one(struct vfsmount *mnt, + tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf)); + if (IS_ERR(tmp)) { + dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); ++ err = PTR_ERR(tmp); + goto out_err; + } + if (tmp != dentry) { +diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c +index 137c752ab985..6064bcb8572b 100644 +--- a/fs/ext4/inline.c ++++ b/fs/ext4/inline.c +@@ -1425,7 +1425,7 @@ int htree_inlinedir_to_tree(struct file *dir_file, + err = ext4_htree_store_dirent(dir_file, hinfo->hash, + hinfo->minor_hash, de, &tmp_str); + if (err) { +- count = err; ++ ret = err; + goto out; + } + count++; +diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c +index 4d973524c887..224ef034004b 100644 +--- a/fs/jfs/jfs_txnmgr.c ++++ b/fs/jfs/jfs_txnmgr.c +@@ -1928,8 +1928,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, + * header ? + */ + if (tlck->type & tlckTRUNCATE) { +- /* This odd declaration suppresses a bogus gcc warning */ +- pxd_t pxd = pxd; /* truncated extent of xad */ ++ pxd_t pxd; /* truncated extent of xad */ + int twm; + + /* +diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c +index 04d57e11577e..09b3bcb86d32 100644 +--- a/fs/nfs/delegation.c ++++ b/fs/nfs/delegation.c +@@ -234,6 +234,8 @@ static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation + spin_lock(&delegation->lock); + if (delegation->inode != NULL) + inode = igrab(delegation->inode); ++ if (!inode) ++ set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags); + spin_unlock(&delegation->lock); + return inode; + } +@@ -863,10 +865,11 @@ restart: + list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { + list_for_each_entry_rcu(delegation, &server->delegations, + super_list) { +- if (test_bit(NFS_DELEGATION_RETURNING, +- &delegation->flags)) +- continue; +- if (test_bit(NFS_DELEGATION_NEED_RECLAIM, ++ if (test_bit(NFS_DELEGATION_INODE_FREEING, ++ &delegation->flags) || ++ test_bit(NFS_DELEGATION_RETURNING, ++ &delegation->flags) || ++ test_bit(NFS_DELEGATION_NEED_RECLAIM, + &delegation->flags) == 0) + continue; + if (!nfs_sb_active(server->super)) +@@ -971,10 +974,11 @@ restart: + list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { + list_for_each_entry_rcu(delegation, &server->delegations, + super_list) { +- if (test_bit(NFS_DELEGATION_RETURNING, +- &delegation->flags)) +- continue; +- if (test_bit(NFS_DELEGATION_TEST_EXPIRED, ++ if (test_bit(NFS_DELEGATION_INODE_FREEING, ++ &delegation->flags) || ++ test_bit(NFS_DELEGATION_RETURNING, ++ &delegation->flags) || ++ test_bit(NFS_DELEGATION_TEST_EXPIRED, + &delegation->flags) == 0) + continue; + if (!nfs_sb_active(server->super)) +diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h +index df41d16dc6ab..510c9edcc712 100644 +--- a/fs/nfs/delegation.h ++++ b/fs/nfs/delegation.h +@@ -34,6 +34,7 @@ enum { + NFS_DELEGATION_RETURNING, + NFS_DELEGATION_REVOKED, + NFS_DELEGATION_TEST_EXPIRED, ++ NFS_DELEGATION_INODE_FREEING, + }; + + int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res); +diff --git a/fs/nfs/flexfilelayout/flexfilelayout.h b/fs/nfs/flexfilelayout/flexfilelayout.h +index d6515f1584f3..d78ec99b6c4c 100644 +--- a/fs/nfs/flexfilelayout/flexfilelayout.h ++++ b/fs/nfs/flexfilelayout/flexfilelayout.h +@@ -131,16 +131,6 @@ FF_LAYOUT_LSEG(struct pnfs_layout_segment *lseg) + generic_hdr); + } + +-static inline struct nfs4_deviceid_node * +-FF_LAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg, u32 idx) +-{ +- if (idx >= FF_LAYOUT_LSEG(lseg)->mirror_array_cnt || +- FF_LAYOUT_LSEG(lseg)->mirror_array[idx] == NULL || +- FF_LAYOUT_LSEG(lseg)->mirror_array[idx]->mirror_ds == NULL) +- return NULL; +- return &FF_LAYOUT_LSEG(lseg)->mirror_array[idx]->mirror_ds->id_node; +-} +- + static inline struct nfs4_ff_layout_ds * + FF_LAYOUT_MIRROR_DS(struct nfs4_deviceid_node *node) + { +@@ -150,9 +140,25 @@ FF_LAYOUT_MIRROR_DS(struct nfs4_deviceid_node *node) + static inline struct nfs4_ff_layout_mirror * + FF_LAYOUT_COMP(struct pnfs_layout_segment *lseg, u32 idx) + { +- if (idx >= FF_LAYOUT_LSEG(lseg)->mirror_array_cnt) +- return NULL; +- return FF_LAYOUT_LSEG(lseg)->mirror_array[idx]; ++ struct nfs4_ff_layout_segment *fls = FF_LAYOUT_LSEG(lseg); ++ ++ if (idx < fls->mirror_array_cnt) ++ return fls->mirror_array[idx]; ++ return NULL; ++} ++ ++static inline struct nfs4_deviceid_node * ++FF_LAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg, u32 idx) ++{ ++ struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, idx); ++ ++ if (mirror != NULL) { ++ struct nfs4_ff_layout_ds *mirror_ds = mirror->mirror_ds; ++ ++ if (!IS_ERR_OR_NULL(mirror_ds)) ++ return &mirror_ds->id_node; ++ } ++ return NULL; + } + + static inline u32 +diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c +index ec04cce31814..83abf3dd7351 100644 +--- a/fs/nfs/pnfs.c ++++ b/fs/nfs/pnfs.c +@@ -725,22 +725,35 @@ static int + pnfs_layout_bulk_destroy_byserver_locked(struct nfs_client *clp, + struct nfs_server *server, + struct list_head *layout_list) ++ __must_hold(&clp->cl_lock) ++ __must_hold(RCU) + { + struct pnfs_layout_hdr *lo, *next; + struct inode *inode; + + list_for_each_entry_safe(lo, next, &server->layouts, plh_layouts) { +- if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags)) ++ if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) || ++ test_bit(NFS_LAYOUT_INODE_FREEING, &lo->plh_flags) || ++ !list_empty(&lo->plh_bulk_destroy)) + continue; ++ /* If the sb is being destroyed, just bail */ ++ if (!nfs_sb_active(server->super)) ++ break; + inode = igrab(lo->plh_inode); +- if (inode == NULL) +- continue; +- list_del_init(&lo->plh_layouts); +- if (pnfs_layout_add_bulk_destroy_list(inode, layout_list)) +- continue; +- rcu_read_unlock(); +- spin_unlock(&clp->cl_lock); +- iput(inode); ++ if (inode != NULL) { ++ list_del_init(&lo->plh_layouts); ++ if (pnfs_layout_add_bulk_destroy_list(inode, ++ layout_list)) ++ continue; ++ rcu_read_unlock(); ++ spin_unlock(&clp->cl_lock); ++ iput(inode); ++ } else { ++ rcu_read_unlock(); ++ spin_unlock(&clp->cl_lock); ++ set_bit(NFS_LAYOUT_INODE_FREEING, &lo->plh_flags); ++ } ++ nfs_sb_deactive(server->super); + spin_lock(&clp->cl_lock); + rcu_read_lock(); + return -EAGAIN; +@@ -778,7 +791,7 @@ pnfs_layout_free_bulk_destroy_list(struct list_head *layout_list, + /* Free all lsegs that are attached to commit buckets */ + nfs_commit_inode(inode, 0); + pnfs_put_layout_hdr(lo); +- iput(inode); ++ nfs_iput_and_deactive(inode); + } + return ret; + } +diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h +index 87f144f14d1e..965d657086c8 100644 +--- a/fs/nfs/pnfs.h ++++ b/fs/nfs/pnfs.h +@@ -99,6 +99,7 @@ enum { + NFS_LAYOUT_RETURN_REQUESTED, /* Return this layout ASAP */ + NFS_LAYOUT_INVALID_STID, /* layout stateid id is invalid */ + NFS_LAYOUT_FIRST_LAYOUTGET, /* Serialize first layoutget */ ++ NFS_LAYOUT_INODE_FREEING, /* The inode is being freed */ + }; + + enum layoutdriver_policy_flags { +diff --git a/fs/nfs/super.c b/fs/nfs/super.c +index f464f8d9060c..470b761839a5 100644 +--- a/fs/nfs/super.c ++++ b/fs/nfs/super.c +@@ -1925,7 +1925,7 @@ static int nfs_parse_devname(const char *dev_name, + /* kill possible hostname list: not supported */ + comma = strchr(dev_name, ','); + if (comma != NULL && comma < end) +- *comma = 0; ++ len = comma - dev_name; + } + + if (len > maxnamlen) +diff --git a/fs/nfs/write.c b/fs/nfs/write.c +index 01b9d9341b54..ed3f5afc4ff7 100644 +--- a/fs/nfs/write.c ++++ b/fs/nfs/write.c +@@ -643,7 +643,7 @@ out: + return ret; + out_launder: + nfs_write_error_remove_page(req); +- return ret; ++ return 0; + } + + static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, +diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c +index a65108594a07..21bc6d2d23ca 100644 +--- a/fs/xfs/xfs_quotaops.c ++++ b/fs/xfs/xfs_quotaops.c +@@ -214,6 +214,9 @@ xfs_fs_rm_xquota( + if (XFS_IS_QUOTA_ON(mp)) + return -EINVAL; + ++ if (uflags & ~(FS_USER_QUOTA | FS_GROUP_QUOTA | FS_PROJ_QUOTA)) ++ return -EINVAL; ++ + if (uflags & FS_USER_QUOTA) + flags |= XFS_DQ_USER; + if (uflags & FS_GROUP_QUOTA) +diff --git a/include/linux/device.h b/include/linux/device.h +index 66fe271c2544..0b2e67014a83 100644 +--- a/include/linux/device.h ++++ b/include/linux/device.h +@@ -682,7 +682,8 @@ extern unsigned long devm_get_free_pages(struct device *dev, + gfp_t gfp_mask, unsigned int order); + extern void devm_free_pages(struct device *dev, unsigned long addr); + +-void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); ++void __iomem *devm_ioremap_resource(struct device *dev, ++ const struct resource *res); + + /* allows to add/remove a custom action to devres stack */ + int devm_add_action(struct device *dev, void (*action)(void *), void *data); +diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h +index 845ff8c51564..0fe1fdedb8a1 100644 +--- a/include/linux/irqchip/arm-gic-v3.h ++++ b/include/linux/irqchip/arm-gic-v3.h +@@ -152,7 +152,7 @@ + #define GICR_PROPBASER_nCnB GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, nCnB) + #define GICR_PROPBASER_nC GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, nC) + #define GICR_PROPBASER_RaWt GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWt) +-#define GICR_PROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWt) ++#define GICR_PROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWb) + #define GICR_PROPBASER_WaWt GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, WaWt) + #define GICR_PROPBASER_WaWb GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, WaWb) + #define GICR_PROPBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWaWt) +@@ -179,7 +179,7 @@ + #define GICR_PENDBASER_nCnB GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, nCnB) + #define GICR_PENDBASER_nC GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, nC) + #define GICR_PENDBASER_RaWt GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWt) +-#define GICR_PENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWt) ++#define GICR_PENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWb) + #define GICR_PENDBASER_WaWt GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, WaWt) + #define GICR_PENDBASER_WaWb GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, WaWb) + #define GICR_PENDBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWaWt) +@@ -238,7 +238,7 @@ + #define GICR_VPROPBASER_nCnB GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, nCnB) + #define GICR_VPROPBASER_nC GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, nC) + #define GICR_VPROPBASER_RaWt GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWt) +-#define GICR_VPROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWt) ++#define GICR_VPROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWb) + #define GICR_VPROPBASER_WaWt GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, WaWt) + #define GICR_VPROPBASER_WaWb GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, WaWb) + #define GICR_VPROPBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWaWt) +@@ -264,7 +264,7 @@ + #define GICR_VPENDBASER_nCnB GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nCnB) + #define GICR_VPENDBASER_nC GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nC) + #define GICR_VPENDBASER_RaWt GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWt) +-#define GICR_VPENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWt) ++#define GICR_VPENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWb) + #define GICR_VPENDBASER_WaWt GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, WaWt) + #define GICR_VPENDBASER_WaWb GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, WaWb) + #define GICR_VPENDBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWaWt) +@@ -337,7 +337,7 @@ + #define GITS_CBASER_nCnB GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, nCnB) + #define GITS_CBASER_nC GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, nC) + #define GITS_CBASER_RaWt GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWt) +-#define GITS_CBASER_RaWb GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWt) ++#define GITS_CBASER_RaWb GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWb) + #define GITS_CBASER_WaWt GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWt) + #define GITS_CBASER_WaWb GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWb) + #define GITS_CBASER_RaWaWt GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWaWt) +@@ -361,7 +361,7 @@ + #define GITS_BASER_nCnB GIC_BASER_CACHEABILITY(GITS_BASER, INNER, nCnB) + #define GITS_BASER_nC GIC_BASER_CACHEABILITY(GITS_BASER, INNER, nC) + #define GITS_BASER_RaWt GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWt) +-#define GITS_BASER_RaWb GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWt) ++#define GITS_BASER_RaWb GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWb) + #define GITS_BASER_WaWt GIC_BASER_CACHEABILITY(GITS_BASER, INNER, WaWt) + #define GITS_BASER_WaWb GIC_BASER_CACHEABILITY(GITS_BASER, INNER, WaWb) + #define GITS_BASER_RaWaWt GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWaWt) +diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h +index 1d793d86d55f..6ffa181598e6 100644 +--- a/include/linux/mlx5/mlx5_ifc.h ++++ b/include/linux/mlx5/mlx5_ifc.h +@@ -8671,8 +8671,6 @@ struct mlx5_ifc_query_lag_out_bits { + + u8 syndrome[0x20]; + +- u8 reserved_at_40[0x40]; +- + struct mlx5_ifc_lagc_bits ctx; + }; + +diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h +index 0a7abe8a407f..68bbbd9edc08 100644 +--- a/include/linux/mmc/sdio_ids.h ++++ b/include/linux/mmc/sdio_ids.h +@@ -67,6 +67,8 @@ + + #define SDIO_VENDOR_ID_TI 0x0097 + #define SDIO_DEVICE_ID_TI_WL1271 0x4076 ++#define SDIO_VENDOR_ID_TI_WL1251 0x104c ++#define SDIO_DEVICE_ID_TI_WL1251 0x9066 + + #define SDIO_VENDOR_ID_STE 0x0020 + #define SDIO_DEVICE_ID_STE_CW1200 0x2280 +diff --git a/include/linux/platform_data/dma-imx-sdma.h b/include/linux/platform_data/dma-imx-sdma.h +index 6eaa53cef0bd..30e676b36b24 100644 +--- a/include/linux/platform_data/dma-imx-sdma.h ++++ b/include/linux/platform_data/dma-imx-sdma.h +@@ -51,7 +51,10 @@ struct sdma_script_start_addrs { + /* End of v2 array */ + s32 zcanfd_2_mcu_addr; + s32 zqspi_2_mcu_addr; ++ s32 mcu_2_ecspi_addr; + /* End of v3 array */ ++ s32 mcu_2_zqspi_addr; ++ /* End of v4 array */ + }; + + /** +diff --git a/include/linux/signal.h b/include/linux/signal.h +index 843bd62b1ead..c4e3eb89a622 100644 +--- a/include/linux/signal.h ++++ b/include/linux/signal.h +@@ -268,6 +268,9 @@ extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping); + extern void exit_signals(struct task_struct *tsk); + extern void kernel_sigaction(int, __sighandler_t); + ++#define SIG_KTHREAD ((__force __sighandler_t)2) ++#define SIG_KTHREAD_KERNEL ((__force __sighandler_t)3) ++ + static inline void allow_signal(int sig) + { + /* +@@ -275,7 +278,17 @@ static inline void allow_signal(int sig) + * know it'll be handled, so that they don't get converted to + * SIGKILL or just silently dropped. + */ +- kernel_sigaction(sig, (__force __sighandler_t)2); ++ kernel_sigaction(sig, SIG_KTHREAD); ++} ++ ++static inline void allow_kernel_signal(int sig) ++{ ++ /* ++ * Kernel threads handle their own signals. Let the signal code ++ * know signals sent by the kernel will be handled, so that they ++ * don't get silently dropped. ++ */ ++ kernel_sigaction(sig, SIG_KTHREAD_KERNEL); + } + + static inline void disallow_signal(int sig) +diff --git a/include/media/davinci/vpbe.h b/include/media/davinci/vpbe.h +index 79a566d7defd..180a05e91497 100644 +--- a/include/media/davinci/vpbe.h ++++ b/include/media/davinci/vpbe.h +@@ -92,7 +92,7 @@ struct vpbe_config { + struct encoder_config_info *ext_encoders; + /* amplifier information goes here */ + struct amp_config_info *amp; +- int num_outputs; ++ unsigned int num_outputs; + /* Order is venc outputs followed by LCD and then external encoders */ + struct vpbe_output *outputs; + }; +diff --git a/include/net/request_sock.h b/include/net/request_sock.h +index 23e22054aa60..04aa2c7d35c4 100644 +--- a/include/net/request_sock.h ++++ b/include/net/request_sock.h +@@ -181,7 +181,7 @@ void reqsk_fastopen_remove(struct sock *sk, struct request_sock *req, + + static inline bool reqsk_queue_empty(const struct request_sock_queue *queue) + { +- return queue->rskq_accept_head == NULL; ++ return READ_ONCE(queue->rskq_accept_head) == NULL; + } + + static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue *queue, +@@ -193,7 +193,7 @@ static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue + req = queue->rskq_accept_head; + if (req) { + sk_acceptq_removed(parent); +- queue->rskq_accept_head = req->dl_next; ++ WRITE_ONCE(queue->rskq_accept_head, req->dl_next); + if (queue->rskq_accept_head == NULL) + queue->rskq_accept_tail = NULL; + } +diff --git a/include/net/tcp.h b/include/net/tcp.h +index 00d10f0e1194..c96302310314 100644 +--- a/include/net/tcp.h ++++ b/include/net/tcp.h +@@ -289,7 +289,7 @@ static inline bool tcp_under_memory_pressure(const struct sock *sk) + mem_cgroup_under_socket_pressure(sk->sk_memcg)) + return true; + +- return tcp_memory_pressure; ++ return READ_ONCE(tcp_memory_pressure); + } + /* + * The next routines deal with comparing 32 bit unsigned ints +diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c +index 993db6b2348e..15d902daeef6 100644 +--- a/kernel/debug/kdb/kdb_main.c ++++ b/kernel/debug/kdb/kdb_main.c +@@ -2634,7 +2634,7 @@ static int kdb_per_cpu(int argc, const char **argv) + diag = kdbgetularg(argv[3], &whichcpu); + if (diag) + return diag; +- if (!cpu_online(whichcpu)) { ++ if (whichcpu >= nr_cpu_ids || !cpu_online(whichcpu)) { + kdb_printf("cpu %ld is not online\n", whichcpu); + return KDB_BADCPUNUM; + } +diff --git a/kernel/events/core.c b/kernel/events/core.c +index ea4f3f7a0c6f..2ac73b4cb8a9 100644 +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -4762,6 +4762,9 @@ static int perf_event_period(struct perf_event *event, u64 __user *arg) + if (perf_event_check_period(event, value)) + return -EINVAL; + ++ if (!event->attr.freq && (value & (1ULL << 63))) ++ return -EINVAL; ++ + event_function_call(event, __perf_event_period, &value); + + return 0; +diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c +index ac4644e92b49..0f0e7975a309 100644 +--- a/kernel/irq/irqdomain.c ++++ b/kernel/irq/irqdomain.c +@@ -147,6 +147,7 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size, + switch (fwid->type) { + case IRQCHIP_FWNODE_NAMED: + case IRQCHIP_FWNODE_NAMED_ID: ++ domain->fwnode = fwnode; + domain->name = kstrdup(fwid->name, GFP_KERNEL); + if (!domain->name) { + kfree(domain); +diff --git a/kernel/signal.c b/kernel/signal.c +index c9b203875001..8fee1f2eba2f 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -85,6 +85,11 @@ static int sig_task_ignored(struct task_struct *t, int sig, bool force) + handler == SIG_DFL && !(force && sig_kernel_only(sig))) + return 1; + ++ /* Only allow kernel generated signals to this kthread */ ++ if (unlikely((t->flags & PF_KTHREAD) && ++ (handler == SIG_KTHREAD_KERNEL) && !force)) ++ return true; ++ + return sig_handler_ignored(handler, sig); + } + +diff --git a/lib/devres.c b/lib/devres.c +index 5f2aedd58bc5..40a8b12a8b6b 100644 +--- a/lib/devres.c ++++ b/lib/devres.c +@@ -132,7 +132,8 @@ EXPORT_SYMBOL(devm_iounmap); + * if (IS_ERR(base)) + * return PTR_ERR(base); + */ +-void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) ++void __iomem *devm_ioremap_resource(struct device *dev, ++ const struct resource *res) + { + resource_size_t size; + const char *name; +diff --git a/lib/kfifo.c b/lib/kfifo.c +index 90ba1eb1df06..a94227c55551 100644 +--- a/lib/kfifo.c ++++ b/lib/kfifo.c +@@ -82,7 +82,8 @@ int __kfifo_init(struct __kfifo *fifo, void *buffer, + { + size /= esize; + +- size = roundup_pow_of_two(size); ++ if (!is_power_of_2(size)) ++ size = rounddown_pow_of_two(size); + + fifo->in = 0; + fifo->out = 0; +diff --git a/net/6lowpan/nhc.c b/net/6lowpan/nhc.c +index 4fa2fdda174d..9e56fb98f33c 100644 +--- a/net/6lowpan/nhc.c ++++ b/net/6lowpan/nhc.c +@@ -18,7 +18,7 @@ + #include "nhc.h" + + static struct rb_root rb_root = RB_ROOT; +-static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX]; ++static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX + 1]; + static DEFINE_SPINLOCK(lowpan_nhc_lock); + + static int lowpan_nhc_insert(struct lowpan_nhc *nhc) +diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c +index 35a670ec9077..a1834ad7422c 100644 +--- a/net/bridge/netfilter/ebtables.c ++++ b/net/bridge/netfilter/ebtables.c +@@ -2164,7 +2164,9 @@ static int compat_copy_entries(unsigned char *data, unsigned int size_user, + if (ret < 0) + return ret; + +- WARN_ON(size_remaining); ++ if (size_remaining) ++ return -EINVAL; ++ + return state->buf_kern_offset; + } + +diff --git a/net/core/neighbour.c b/net/core/neighbour.c +index 16ac50b1b9a7..567e431813e5 100644 +--- a/net/core/neighbour.c ++++ b/net/core/neighbour.c +@@ -1877,8 +1877,8 @@ static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl, + goto nla_put_failure; + { + unsigned long now = jiffies; +- unsigned int flush_delta = now - tbl->last_flush; +- unsigned int rand_delta = now - tbl->last_rand; ++ long flush_delta = now - tbl->last_flush; ++ long rand_delta = now - tbl->last_rand; + struct neigh_hash_table *nht; + struct ndt_config ndc = { + .ndtc_key_len = tbl->key_len, +diff --git a/net/core/sock.c b/net/core/sock.c +index 90ccbbf9e6b0..03ca2f638eb4 100644 +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -2165,8 +2165,8 @@ static void sk_leave_memory_pressure(struct sock *sk) + } else { + unsigned long *memory_pressure = sk->sk_prot->memory_pressure; + +- if (memory_pressure && *memory_pressure) +- *memory_pressure = 0; ++ if (memory_pressure && READ_ONCE(*memory_pressure)) ++ WRITE_ONCE(*memory_pressure, 0); + } + } + +diff --git a/net/ieee802154/6lowpan/reassembly.c b/net/ieee802154/6lowpan/reassembly.c +index ec7a5da56129..e873a6a007f2 100644 +--- a/net/ieee802154/6lowpan/reassembly.c ++++ b/net/ieee802154/6lowpan/reassembly.c +@@ -634,7 +634,7 @@ err_sysctl: + + void lowpan_net_frag_exit(void) + { +- inet_frags_fini(&lowpan_frags); + lowpan_frags_sysctl_unregister(); + unregister_pernet_subsys(&lowpan_frags_ops); ++ inet_frags_fini(&lowpan_frags); + } +diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c +index f7224c4fc30f..da55ce62fe50 100644 +--- a/net/ipv4/inet_connection_sock.c ++++ b/net/ipv4/inet_connection_sock.c +@@ -936,7 +936,7 @@ struct sock *inet_csk_reqsk_queue_add(struct sock *sk, + req->sk = child; + req->dl_next = NULL; + if (queue->rskq_accept_head == NULL) +- queue->rskq_accept_head = req; ++ WRITE_ONCE(queue->rskq_accept_head, req); + else + queue->rskq_accept_tail->dl_next = req; + queue->rskq_accept_tail = req; +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 8f07655718f3..db1eceda2359 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -328,7 +328,7 @@ void tcp_enter_memory_pressure(struct sock *sk) + { + unsigned long val; + +- if (tcp_memory_pressure) ++ if (READ_ONCE(tcp_memory_pressure)) + return; + val = jiffies; + +@@ -343,7 +343,7 @@ void tcp_leave_memory_pressure(struct sock *sk) + { + unsigned long val; + +- if (!tcp_memory_pressure) ++ if (!READ_ONCE(tcp_memory_pressure)) + return; + val = xchg(&tcp_memory_pressure, 0); + if (val) +diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c +index fe797b29ca89..6dea6e92e686 100644 +--- a/net/ipv6/reassembly.c ++++ b/net/ipv6/reassembly.c +@@ -593,8 +593,8 @@ err_protocol: + + void ipv6_frag_exit(void) + { +- inet_frags_fini(&ip6_frags); + ip6_frags_sysctl_unregister(); + unregister_pernet_subsys(&ip6_frags_ops); + inet6_del_protocol(&frag_protocol, IPPROTO_FRAGMENT); ++ inet_frags_fini(&ip6_frags); + } +diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c +index ca98276c2709..7a9cbc9502d9 100644 +--- a/net/iucv/af_iucv.c ++++ b/net/iucv/af_iucv.c +@@ -2446,6 +2446,13 @@ out: + return err; + } + ++static void afiucv_iucv_exit(void) ++{ ++ device_unregister(af_iucv_dev); ++ driver_unregister(&af_iucv_driver); ++ pr_iucv->iucv_unregister(&af_iucv_handler, 0); ++} ++ + static int __init afiucv_init(void) + { + int err; +@@ -2479,11 +2486,18 @@ static int __init afiucv_init(void) + err = afiucv_iucv_init(); + if (err) + goto out_sock; +- } else +- register_netdevice_notifier(&afiucv_netdev_notifier); ++ } ++ ++ err = register_netdevice_notifier(&afiucv_netdev_notifier); ++ if (err) ++ goto out_notifier; ++ + dev_add_pack(&iucv_packet_type); + return 0; + ++out_notifier: ++ if (pr_iucv) ++ afiucv_iucv_exit(); + out_sock: + sock_unregister(PF_IUCV); + out_proto: +@@ -2497,12 +2511,11 @@ out: + static void __exit afiucv_exit(void) + { + if (pr_iucv) { +- device_unregister(af_iucv_dev); +- driver_unregister(&af_iucv_driver); +- pr_iucv->iucv_unregister(&af_iucv_handler, 0); ++ afiucv_iucv_exit(); + symbol_put(iucv_if); +- } else +- unregister_netdevice_notifier(&afiucv_netdev_notifier); ++ } ++ ++ unregister_netdevice_notifier(&afiucv_netdev_notifier); + dev_remove_pack(&iucv_packet_type); + sock_unregister(PF_IUCV); + proto_unregister(&iucv_proto); +diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c +index e494f04819e9..b9be0360ab94 100644 +--- a/net/l2tp/l2tp_core.c ++++ b/net/l2tp/l2tp_core.c +@@ -1892,7 +1892,8 @@ static __net_exit void l2tp_exit_net(struct net *net) + } + rcu_read_unlock_bh(); + +- flush_workqueue(l2tp_wq); ++ if (l2tp_wq) ++ flush_workqueue(l2tp_wq); + rcu_barrier(); + } + +diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c +index 2e472d5c3ea4..d552e8819713 100644 +--- a/net/llc/af_llc.c ++++ b/net/llc/af_llc.c +@@ -113,22 +113,26 @@ static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr) + * + * Send data via reliable llc2 connection. + * Returns 0 upon success, non-zero if action did not succeed. ++ * ++ * This function always consumes a reference to the skb. + */ + static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock) + { + struct llc_sock* llc = llc_sk(sk); +- int rc = 0; + + if (unlikely(llc_data_accept_state(llc->state) || + llc->remote_busy_flag || + llc->p_flag)) { + long timeout = sock_sndtimeo(sk, noblock); ++ int rc; + + rc = llc_ui_wait_for_busy_core(sk, timeout); ++ if (rc) { ++ kfree_skb(skb); ++ return rc; ++ } + } +- if (unlikely(!rc)) +- rc = llc_build_and_send_pkt(sk, skb); +- return rc; ++ return llc_build_and_send_pkt(sk, skb); + } + + static void llc_ui_sk_init(struct socket *sock, struct sock *sk) +@@ -900,7 +904,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name); + int flags = msg->msg_flags; + int noblock = flags & MSG_DONTWAIT; +- struct sk_buff *skb; ++ struct sk_buff *skb = NULL; + size_t size = 0; + int rc = -EINVAL, copied = 0, hdrlen; + +@@ -909,10 +913,10 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + lock_sock(sk); + if (addr) { + if (msg->msg_namelen < sizeof(*addr)) +- goto release; ++ goto out; + } else { + if (llc_ui_addr_null(&llc->addr)) +- goto release; ++ goto out; + addr = &llc->addr; + } + /* must bind connection to sap if user hasn't done it. */ +@@ -920,7 +924,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + /* bind to sap with null dev, exclusive. */ + rc = llc_ui_autobind(sock, addr); + if (rc) +- goto release; ++ goto out; + } + hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr); + size = hdrlen + len; +@@ -929,12 +933,12 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + copied = size - hdrlen; + rc = -EINVAL; + if (copied < 0) +- goto release; ++ goto out; + release_sock(sk); + skb = sock_alloc_send_skb(sk, size, noblock, &rc); + lock_sock(sk); + if (!skb) +- goto release; ++ goto out; + skb->dev = llc->dev; + skb->protocol = llc_proto_type(addr->sllc_arphrd); + skb_reserve(skb, hdrlen); +@@ -944,29 +948,31 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) { + llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + if (addr->sllc_test) { + llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + if (addr->sllc_xid) { + llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + rc = -ENOPROTOOPT; + if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua)) + goto out; + rc = llc_ui_send_data(sk, skb, noblock); ++ skb = NULL; + out: +- if (rc) { +- kfree_skb(skb); +-release: ++ kfree_skb(skb); ++ if (rc) + dprintk("%s: failed sending from %02X to %02X: %d\n", + __func__, llc->laddr.lsap, llc->daddr.lsap, rc); +- } + release_sock(sk); + return rc ? : copied; + } +diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c +index 444c13e752a0..7fbc682aff04 100644 +--- a/net/llc/llc_conn.c ++++ b/net/llc/llc_conn.c +@@ -55,6 +55,8 @@ int sysctl_llc2_busy_timeout = LLC2_BUSY_TIME * HZ; + * (executing it's actions and changing state), upper layer will be + * indicated or confirmed, if needed. Returns 0 for success, 1 for + * failure. The socket lock has to be held before calling this function. ++ * ++ * This function always consumes a reference to the skb. + */ + int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + { +@@ -62,12 +64,6 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + struct llc_sock *llc = llc_sk(skb->sk); + struct llc_conn_state_ev *ev = llc_conn_ev(skb); + +- /* +- * We have to hold the skb, because llc_conn_service will kfree it in +- * the sending path and we need to look at the skb->cb, where we encode +- * llc_conn_state_ev. +- */ +- skb_get(skb); + ev->ind_prim = ev->cfm_prim = 0; + /* + * Send event to state machine +@@ -75,21 +71,12 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + rc = llc_conn_service(skb->sk, skb); + if (unlikely(rc != 0)) { + printk(KERN_ERR "%s: llc_conn_service failed\n", __func__); +- goto out_kfree_skb; +- } +- +- if (unlikely(!ev->ind_prim && !ev->cfm_prim)) { +- /* indicate or confirm not required */ +- if (!skb->next) +- goto out_kfree_skb; + goto out_skb_put; + } + +- if (unlikely(ev->ind_prim && ev->cfm_prim)) /* Paranoia */ +- skb_get(skb); +- + switch (ev->ind_prim) { + case LLC_DATA_PRIM: ++ skb_get(skb); + llc_save_primitive(sk, skb, LLC_DATA_PRIM); + if (unlikely(sock_queue_rcv_skb(sk, skb))) { + /* +@@ -106,6 +93,7 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + * skb->sk pointing to the newly created struct sock in + * llc_conn_handler. -acme + */ ++ skb_get(skb); + skb_queue_tail(&sk->sk_receive_queue, skb); + sk->sk_state_change(sk); + break; +@@ -121,7 +109,6 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + sk->sk_state_change(sk); + } + } +- kfree_skb(skb); + sock_put(sk); + break; + case LLC_RESET_PRIM: +@@ -130,14 +117,11 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + * RESET is not being notified to upper layers for now + */ + printk(KERN_INFO "%s: received a reset ind!\n", __func__); +- kfree_skb(skb); + break; + default: +- if (ev->ind_prim) { ++ if (ev->ind_prim) + printk(KERN_INFO "%s: received unknown %d prim!\n", + __func__, ev->ind_prim); +- kfree_skb(skb); +- } + /* No indication */ + break; + } +@@ -179,15 +163,12 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + printk(KERN_INFO "%s: received a reset conf!\n", __func__); + break; + default: +- if (ev->cfm_prim) { ++ if (ev->cfm_prim) + printk(KERN_INFO "%s: received unknown %d prim!\n", + __func__, ev->cfm_prim); +- break; +- } +- goto out_skb_put; /* No confirmation */ ++ /* No confirmation */ ++ break; + } +-out_kfree_skb: +- kfree_skb(skb); + out_skb_put: + kfree_skb(skb); + return rc; +diff --git a/net/llc/llc_if.c b/net/llc/llc_if.c +index 6daf391b3e84..fc4d2bd8816f 100644 +--- a/net/llc/llc_if.c ++++ b/net/llc/llc_if.c +@@ -38,6 +38,8 @@ + * closed and -EBUSY when sending data is not permitted in this state or + * LLC has send an I pdu with p bit set to 1 and is waiting for it's + * response. ++ * ++ * This function always consumes a reference to the skb. + */ + int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) + { +@@ -46,20 +48,22 @@ int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) + struct llc_sock *llc = llc_sk(sk); + + if (unlikely(llc->state == LLC_CONN_STATE_ADM)) +- goto out; ++ goto out_free; + rc = -EBUSY; + if (unlikely(llc_data_accept_state(llc->state) || /* data_conn_refuse */ + llc->p_flag)) { + llc->failed_data_req = 1; +- goto out; ++ goto out_free; + } + ev = llc_conn_ev(skb); + ev->type = LLC_CONN_EV_TYPE_PRIM; + ev->prim = LLC_DATA_PRIM; + ev->prim_type = LLC_PRIM_TYPE_REQ; + skb->dev = llc->dev; +- rc = llc_conn_state_process(sk, skb); +-out: ++ return llc_conn_state_process(sk, skb); ++ ++out_free: ++ kfree_skb(skb); + return rc; + } + +diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c +index e57811e4b91f..7ba4272642c9 100644 +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -529,7 +529,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) + + /* (re)Initialize group rate indexes */ + for(j = 0; j < MAX_THR_RATES; j++) +- tmp_group_tp_rate[j] = group; ++ tmp_group_tp_rate[j] = MCS_GROUP_RATES * group; + + for (i = 0; i < MCS_GROUP_RATES; i++) { + if (!(mi->supported[group] & BIT(i))) +diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c +index 4a6b3c7b35e3..31000622376d 100644 +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -3227,9 +3227,18 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) + case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP): + /* process for all: mesh, mlme, ibss */ + break; ++ case cpu_to_le16(IEEE80211_STYPE_DEAUTH): ++ if (is_multicast_ether_addr(mgmt->da) && ++ !is_broadcast_ether_addr(mgmt->da)) ++ return RX_DROP_MONITOR; ++ ++ /* process only for station/IBSS */ ++ if (sdata->vif.type != NL80211_IFTYPE_STATION && ++ sdata->vif.type != NL80211_IFTYPE_ADHOC) ++ return RX_DROP_MONITOR; ++ break; + case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): + case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): +- case cpu_to_le16(IEEE80211_STYPE_DEAUTH): + case cpu_to_le16(IEEE80211_STYPE_DISASSOC): + if (is_multicast_ether_addr(mgmt->da) && + !is_broadcast_ether_addr(mgmt->da)) +diff --git a/net/mpls/mpls_iptunnel.c b/net/mpls/mpls_iptunnel.c +index 6e558a419f60..6c01166f972b 100644 +--- a/net/mpls/mpls_iptunnel.c ++++ b/net/mpls/mpls_iptunnel.c +@@ -28,7 +28,7 @@ + #include "internal.h" + + static const struct nla_policy mpls_iptunnel_policy[MPLS_IPTUNNEL_MAX + 1] = { +- [MPLS_IPTUNNEL_DST] = { .type = NLA_U32 }, ++ [MPLS_IPTUNNEL_DST] = { .len = sizeof(u32) }, + [MPLS_IPTUNNEL_TTL] = { .type = NLA_U8 }, + }; + +diff --git a/net/netfilter/nft_set_hash.c b/net/netfilter/nft_set_hash.c +index 33aa2ac3a62e..73f8f99b1193 100644 +--- a/net/netfilter/nft_set_hash.c ++++ b/net/netfilter/nft_set_hash.c +@@ -442,6 +442,23 @@ static bool nft_hash_lookup_fast(const struct net *net, + return false; + } + ++static u32 nft_jhash(const struct nft_set *set, const struct nft_hash *priv, ++ const struct nft_set_ext *ext) ++{ ++ const struct nft_data *key = nft_set_ext_key(ext); ++ u32 hash, k1; ++ ++ if (set->klen == 4) { ++ k1 = *(u32 *)key; ++ hash = jhash_1word(k1, priv->seed); ++ } else { ++ hash = jhash(key, set->klen, priv->seed); ++ } ++ hash = reciprocal_scale(hash, priv->buckets); ++ ++ return hash; ++} ++ + static int nft_hash_insert(const struct net *net, const struct nft_set *set, + const struct nft_set_elem *elem, + struct nft_set_ext **ext) +@@ -451,8 +468,7 @@ static int nft_hash_insert(const struct net *net, const struct nft_set *set, + u8 genmask = nft_genmask_next(net); + u32 hash; + +- hash = jhash(nft_set_ext_key(&this->ext), set->klen, priv->seed); +- hash = reciprocal_scale(hash, priv->buckets); ++ hash = nft_jhash(set, priv, &this->ext); + hlist_for_each_entry(he, &priv->table[hash], node) { + if (!memcmp(nft_set_ext_key(&this->ext), + nft_set_ext_key(&he->ext), set->klen) && +@@ -491,8 +507,7 @@ static void *nft_hash_deactivate(const struct net *net, + u8 genmask = nft_genmask_next(net); + u32 hash; + +- hash = jhash(nft_set_ext_key(&this->ext), set->klen, priv->seed); +- hash = reciprocal_scale(hash, priv->buckets); ++ hash = nft_jhash(set, priv, &this->ext); + hlist_for_each_entry(he, &priv->table[hash], node) { + if (!memcmp(nft_set_ext_key(&this->ext), &elem->key.val, + set->klen) || +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c +index 4e1058159b08..46b7fac82775 100644 +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -1337,15 +1337,21 @@ static void packet_sock_destruct(struct sock *sk) + + static bool fanout_flow_is_huge(struct packet_sock *po, struct sk_buff *skb) + { +- u32 rxhash; ++ u32 *history = po->rollover->history; ++ u32 victim, rxhash; + int i, count = 0; + + rxhash = skb_get_hash(skb); + for (i = 0; i < ROLLOVER_HLEN; i++) +- if (po->rollover->history[i] == rxhash) ++ if (READ_ONCE(history[i]) == rxhash) + count++; + +- po->rollover->history[prandom_u32() % ROLLOVER_HLEN] = rxhash; ++ victim = prandom_u32() % ROLLOVER_HLEN; ++ ++ /* Avoid dirtying the cache line if possible */ ++ if (READ_ONCE(history[victim]) != rxhash) ++ WRITE_ONCE(history[victim], rxhash); ++ + return count > (ROLLOVER_HLEN >> 1); + } + +@@ -3407,20 +3413,29 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, + sock_recv_ts_and_drops(msg, sk, skb); + + if (msg->msg_name) { ++ int copy_len; ++ + /* If the address length field is there to be filled + * in, we fill it in now. + */ + if (sock->type == SOCK_PACKET) { + __sockaddr_check_size(sizeof(struct sockaddr_pkt)); + msg->msg_namelen = sizeof(struct sockaddr_pkt); ++ copy_len = msg->msg_namelen; + } else { + struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; + + msg->msg_namelen = sll->sll_halen + + offsetof(struct sockaddr_ll, sll_addr); ++ copy_len = msg->msg_namelen; ++ if (msg->msg_namelen < sizeof(struct sockaddr_ll)) { ++ memset(msg->msg_name + ++ offsetof(struct sockaddr_ll, sll_addr), ++ 0, sizeof(sll->sll_addr)); ++ msg->msg_namelen = sizeof(struct sockaddr_ll); ++ } + } +- memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, +- msg->msg_namelen); ++ memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, copy_len); + } + + if (pkt_sk(sk)->auxdata) { +diff --git a/net/rds/ib_stats.c b/net/rds/ib_stats.c +index 9252ad126335..ac46d8961b61 100644 +--- a/net/rds/ib_stats.c ++++ b/net/rds/ib_stats.c +@@ -42,7 +42,7 @@ DEFINE_PER_CPU_SHARED_ALIGNED(struct rds_ib_statistics, rds_ib_stats); + static const char *const rds_ib_stat_names[] = { + "ib_connect_raced", + "ib_listen_closed_stale", +- "s_ib_evt_handler_call", ++ "ib_evt_handler_call", + "ib_tasklet_call", + "ib_tx_cq_event", + "ib_tx_ring_full", +diff --git a/net/rds/stats.c b/net/rds/stats.c +index 73be187d389e..6bbab4d74c4f 100644 +--- a/net/rds/stats.c ++++ b/net/rds/stats.c +@@ -76,6 +76,8 @@ static const char *const rds_stat_names[] = { + "cong_update_received", + "cong_send_error", + "cong_send_blocked", ++ "recv_bytes_added_to_sock", ++ "recv_bytes_freed_fromsock", + }; + + void rds_stats_info_copy(struct rds_info_iterator *iter, +diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c +index 5b67cb5d47f0..edddbacf33bc 100644 +--- a/net/rxrpc/output.c ++++ b/net/rxrpc/output.c +@@ -404,6 +404,9 @@ send_fragmentable: + } + break; + #endif ++ ++ default: ++ BUG(); + } + + up_write(&conn->params.local->defrag_sem); +diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c +index 529bb064c4a4..dcfaa4f9c7c5 100644 +--- a/net/sched/act_mirred.c ++++ b/net/sched/act_mirred.c +@@ -371,7 +371,11 @@ static int __init mirred_init_module(void) + return err; + + pr_info("Mirror/redirect action on\n"); +- return tcf_register_action(&act_mirred_ops, &mirred_net_ops); ++ err = tcf_register_action(&act_mirred_ops, &mirred_net_ops); ++ if (err) ++ unregister_netdevice_notifier(&mirred_device_notifier); ++ ++ return err; + } + + static void __exit mirred_cleanup_module(void) +diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c +index 6266121a03f9..328b043edf07 100644 +--- a/net/sched/sch_netem.c ++++ b/net/sched/sch_netem.c +@@ -431,8 +431,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, + struct netem_skb_cb *cb; + struct sk_buff *skb2; + struct sk_buff *segs = NULL; +- unsigned int len = 0, last_len, prev_len = qdisc_pkt_len(skb); +- int nb = 0; ++ unsigned int prev_len = qdisc_pkt_len(skb); + int count = 1; + int rc = NET_XMIT_SUCCESS; + int rc_drop = NET_XMIT_DROP; +@@ -489,6 +488,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, + segs = netem_segment(skb, sch, to_free); + if (!segs) + return rc_drop; ++ qdisc_skb_cb(segs)->pkt_len = segs->len; + } else { + segs = skb; + } +@@ -504,6 +504,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, + if (skb->ip_summed == CHECKSUM_PARTIAL && + skb_checksum_help(skb)) { + qdisc_drop(skb, sch, to_free); ++ skb = NULL; + goto finish_segs; + } + +@@ -579,6 +580,12 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, + + finish_segs: + if (segs) { ++ unsigned int len, last_len; ++ int nb; ++ ++ len = skb ? skb->len : 0; ++ nb = skb ? 1 : 0; ++ + while (segs) { + skb2 = segs->next; + segs->next = NULL; +@@ -594,9 +601,10 @@ finish_segs: + } + segs = skb2; + } +- sch->q.qlen += nb; +- if (nb > 1) +- qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len); ++ /* Parent qdiscs accounted for 1 skb of size @prev_len */ ++ qdisc_tree_reduce_backlog(sch, -(nb - 1), -(len - prev_len)); ++ } else if (!skb) { ++ return NET_XMIT_DROP; + } + return NET_XMIT_SUCCESS; + } +diff --git a/net/tipc/link.c b/net/tipc/link.c +index da749916faac..82e4e0e152d1 100644 +--- a/net/tipc/link.c ++++ b/net/tipc/link.c +@@ -811,18 +811,31 @@ static int link_schedule_user(struct tipc_link *l, struct tipc_msg *hdr) + */ + void link_prepare_wakeup(struct tipc_link *l) + { ++ struct sk_buff_head *wakeupq = &l->wakeupq; ++ struct sk_buff_head *inputq = l->inputq; + struct sk_buff *skb, *tmp; +- int imp, i = 0; ++ struct sk_buff_head tmpq; ++ int avail[5] = {0,}; ++ int imp = 0; ++ ++ __skb_queue_head_init(&tmpq); + +- skb_queue_walk_safe(&l->wakeupq, skb, tmp) { ++ for (; imp <= TIPC_SYSTEM_IMPORTANCE; imp++) ++ avail[imp] = l->backlog[imp].limit - l->backlog[imp].len; ++ ++ skb_queue_walk_safe(wakeupq, skb, tmp) { + imp = TIPC_SKB_CB(skb)->chain_imp; +- if (l->backlog[imp].len < l->backlog[imp].limit) { +- skb_unlink(skb, &l->wakeupq); +- skb_queue_tail(l->inputq, skb); +- } else if (i++ > 10) { +- break; +- } ++ if (avail[imp] <= 0) ++ continue; ++ avail[imp]--; ++ __skb_unlink(skb, wakeupq); ++ __skb_queue_tail(&tmpq, skb); + } ++ ++ spin_lock_bh(&inputq->lock); ++ skb_queue_splice_tail(&tmpq, inputq); ++ spin_unlock_bh(&inputq->lock); ++ + } + + void tipc_link_reset(struct tipc_link *l) +diff --git a/net/tipc/node.c b/net/tipc/node.c +index 42e9bdcc4bb6..82f8f69f4d6b 100644 +--- a/net/tipc/node.c ++++ b/net/tipc/node.c +@@ -688,10 +688,10 @@ static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id, + static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) + { + struct tipc_link_entry *le = &n->links[bearer_id]; ++ struct tipc_media_addr *maddr = NULL; + struct tipc_link *l = le->link; +- struct tipc_media_addr *maddr; +- struct sk_buff_head xmitq; + int old_bearer_id = bearer_id; ++ struct sk_buff_head xmitq; + + if (!l) + return; +@@ -713,7 +713,8 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) + tipc_node_write_unlock(n); + if (delete) + tipc_mon_remove_peer(n->net, n->addr, old_bearer_id); +- tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); ++ if (!skb_queue_empty(&xmitq)) ++ tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); + tipc_sk_rcv(n->net, &le->inputq); + } + +diff --git a/net/tipc/socket.c b/net/tipc/socket.c +index 21929ba196eb..d9ec6335c7dc 100644 +--- a/net/tipc/socket.c ++++ b/net/tipc/socket.c +@@ -487,7 +487,7 @@ static void __tipc_shutdown(struct socket *sock, int error) + struct sock *sk = sock->sk; + struct tipc_sock *tsk = tipc_sk(sk); + struct net *net = sock_net(sk); +- long timeout = CONN_TIMEOUT_DEFAULT; ++ long timeout = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT); + u32 dnode = tsk_peer_node(tsk); + struct sk_buff *skb; + +diff --git a/net/tipc/sysctl.c b/net/tipc/sysctl.c +index 1a779b1e8510..40f6d82083d7 100644 +--- a/net/tipc/sysctl.c ++++ b/net/tipc/sysctl.c +@@ -37,6 +37,8 @@ + + #include + ++static int zero; ++static int one = 1; + static struct ctl_table_header *tipc_ctl_hdr; + + static struct ctl_table tipc_table[] = { +@@ -45,14 +47,16 @@ static struct ctl_table tipc_table[] = { + .data = &sysctl_tipc_rmem, + .maxlen = sizeof(sysctl_tipc_rmem), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ .proc_handler = proc_dointvec_minmax, ++ .extra1 = &one, + }, + { + .procname = "named_timeout", + .data = &sysctl_tipc_named_timeout, + .maxlen = sizeof(sysctl_tipc_named_timeout), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ .proc_handler = proc_dointvec_minmax, ++ .extra1 = &zero, + }, + {} + }; +diff --git a/security/apparmor/include/context.h b/security/apparmor/include/context.h +index 6ae07e9aaa17..812cdec9dd3b 100644 +--- a/security/apparmor/include/context.h ++++ b/security/apparmor/include/context.h +@@ -191,6 +191,8 @@ static inline struct aa_label *begin_current_label_crit_section(void) + { + struct aa_label *label = aa_current_raw_label(); + ++ might_sleep(); ++ + if (label_is_stale(label)) { + label = aa_get_newest_label(label); + if (aa_replace_current_label(label) == 0) +diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c +index 1346ee5be04f..4f08023101f3 100644 +--- a/security/apparmor/lsm.c ++++ b/security/apparmor/lsm.c +@@ -108,12 +108,12 @@ static int apparmor_ptrace_access_check(struct task_struct *child, + struct aa_label *tracer, *tracee; + int error; + +- tracer = begin_current_label_crit_section(); ++ tracer = __begin_current_label_crit_section(); + tracee = aa_get_task_label(child); + error = aa_may_ptrace(tracer, tracee, + mode == PTRACE_MODE_READ ? AA_PTRACE_READ : AA_PTRACE_TRACE); + aa_put_label(tracee); +- end_current_label_crit_section(tracer); ++ __end_current_label_crit_section(tracer); + + return error; + } +diff --git a/security/keys/key.c b/security/keys/key.c +index 87172f99f73e..17244f5f54c6 100644 +--- a/security/keys/key.c ++++ b/security/keys/key.c +@@ -297,6 +297,7 @@ struct key *key_alloc(struct key_type *type, const char *desc, + key->gid = gid; + key->perm = perm; + key->restrict_link = restrict_link; ++ key->last_used_at = ktime_get_real_seconds(); + + if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) + key->flags |= 1 << KEY_FLAG_IN_QUOTA; +diff --git a/sound/aoa/codecs/onyx.c b/sound/aoa/codecs/onyx.c +index d2d96ca082b7..6224fd3bbf7c 100644 +--- a/sound/aoa/codecs/onyx.c ++++ b/sound/aoa/codecs/onyx.c +@@ -74,8 +74,10 @@ static int onyx_read_register(struct onyx *onyx, u8 reg, u8 *value) + return 0; + } + v = i2c_smbus_read_byte_data(onyx->i2c, reg); +- if (v < 0) ++ if (v < 0) { ++ *value = 0; + return -1; ++ } + *value = (u8)v; + onyx->cache[ONYX_REG_CONTROL-FIRSTREGISTER] = *value; + return 0; +diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h +index 8a9dd4767b1e..63cc10604afc 100644 +--- a/sound/pci/hda/hda_controller.h ++++ b/sound/pci/hda/hda_controller.h +@@ -176,11 +176,10 @@ struct azx { + #define azx_bus(chip) (&(chip)->bus.core) + #define bus_to_azx(_bus) container_of(_bus, struct azx, bus.core) + +-#ifdef CONFIG_X86 +-#define azx_snoop(chip) ((chip)->snoop) +-#else +-#define azx_snoop(chip) true +-#endif ++static inline bool azx_snoop(struct azx *chip) ++{ ++ return !IS_ENABLED(CONFIG_X86) || chip->snoop; ++} + + /* + * macros for easy use +diff --git a/sound/soc/codecs/cs4349.c b/sound/soc/codecs/cs4349.c +index 0a749c79ef57..1d38e53dc95c 100644 +--- a/sound/soc/codecs/cs4349.c ++++ b/sound/soc/codecs/cs4349.c +@@ -380,6 +380,7 @@ static struct i2c_driver cs4349_i2c_driver = { + .driver = { + .name = "cs4349", + .of_match_table = cs4349_of_match, ++ .pm = &cs4349_runtime_pm, + }, + .id_table = cs4349_i2c_id, + .probe = cs4349_i2c_probe, +diff --git a/sound/soc/codecs/es8328.c b/sound/soc/codecs/es8328.c +index bcdb8914ec16..e2f44fa46262 100644 +--- a/sound/soc/codecs/es8328.c ++++ b/sound/soc/codecs/es8328.c +@@ -231,7 +231,7 @@ static const struct soc_enum es8328_rline_enum = + ARRAY_SIZE(es8328_line_texts), + es8328_line_texts); + static const struct snd_kcontrol_new es8328_right_line_controls = +- SOC_DAPM_ENUM("Route", es8328_lline_enum); ++ SOC_DAPM_ENUM("Route", es8328_rline_enum); + + /* Left Mixer */ + static const struct snd_kcontrol_new es8328_left_mixer_controls[] = { +diff --git a/sound/soc/codecs/wm8737.c b/sound/soc/codecs/wm8737.c +index f0cb1c4afe3c..c5a8d758f58b 100644 +--- a/sound/soc/codecs/wm8737.c ++++ b/sound/soc/codecs/wm8737.c +@@ -170,7 +170,7 @@ SOC_DOUBLE("Polarity Invert Switch", WM8737_ADC_CONTROL, 5, 6, 1, 0), + SOC_SINGLE("3D Switch", WM8737_3D_ENHANCE, 0, 1, 0), + SOC_SINGLE("3D Depth", WM8737_3D_ENHANCE, 1, 15, 0), + SOC_ENUM("3D Low Cut-off", low_3d), +-SOC_ENUM("3D High Cut-off", low_3d), ++SOC_ENUM("3D High Cut-off", high_3d), + SOC_SINGLE_TLV("3D ADC Volume", WM8737_3D_ENHANCE, 7, 1, 1, adc_tlv), + + SOC_SINGLE("Noise Gate Switch", WM8737_NOISE_GATE, 0, 1, 0), +diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c +index 07bac9ea65c4..e10e03800cce 100644 +--- a/sound/soc/davinci/davinci-mcasp.c ++++ b/sound/soc/davinci/davinci-mcasp.c +@@ -882,14 +882,13 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream, + active_slots = hweight32(mcasp->tdm_mask[stream]); + active_serializers = (channels + active_slots - 1) / + active_slots; +- if (active_serializers == 1) { ++ if (active_serializers == 1) + active_slots = channels; +- for (i = 0; i < total_slots; i++) { +- if ((1 << i) & mcasp->tdm_mask[stream]) { +- mask |= (1 << i); +- if (--active_slots <= 0) +- break; +- } ++ for (i = 0; i < total_slots; i++) { ++ if ((1 << i) & mcasp->tdm_mask[stream]) { ++ mask |= (1 << i); ++ if (--active_slots <= 0) ++ break; + } + } + } else { +diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c +index 8e525f7ac08d..3d99a8579c99 100644 +--- a/sound/soc/fsl/imx-sgtl5000.c ++++ b/sound/soc/fsl/imx-sgtl5000.c +@@ -119,7 +119,8 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) + codec_dev = of_find_i2c_device_by_node(codec_np); + if (!codec_dev) { + dev_err(&pdev->dev, "failed to find codec platform device\n"); +- return -EPROBE_DEFER; ++ ret = -EPROBE_DEFER; ++ goto fail; + } + + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); +diff --git a/sound/soc/qcom/apq8016_sbc.c b/sound/soc/qcom/apq8016_sbc.c +index d49adc822a11..8e6b88d68ca6 100644 +--- a/sound/soc/qcom/apq8016_sbc.c ++++ b/sound/soc/qcom/apq8016_sbc.c +@@ -163,41 +163,52 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + + if (!cpu || !codec) { + dev_err(dev, "Can't find cpu/codec DT node\n"); +- return ERR_PTR(-EINVAL); ++ ret = -EINVAL; ++ goto error; + } + + link->cpu_of_node = of_parse_phandle(cpu, "sound-dai", 0); + if (!link->cpu_of_node) { + dev_err(card->dev, "error getting cpu phandle\n"); +- return ERR_PTR(-EINVAL); ++ ret = -EINVAL; ++ goto error; + } + + ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name); + if (ret) { + dev_err(card->dev, "error getting cpu dai name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + ret = snd_soc_of_get_dai_link_codecs(dev, codec, link); + + if (ret < 0) { + dev_err(card->dev, "error getting codec dai name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + link->platform_of_node = link->cpu_of_node; + ret = of_property_read_string(np, "link-name", &link->name); + if (ret) { + dev_err(card->dev, "error getting codec dai_link name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + link->stream_name = link->name; + link->init = apq8016_sbc_dai_init; + link++; ++ ++ of_node_put(cpu); ++ of_node_put(codec); + } + + return data; ++ ++ error: ++ of_node_put(np); ++ of_node_put(cpu); ++ of_node_put(codec); ++ return ERR_PTR(ret); + } + + static const struct snd_soc_dapm_widget apq8016_sbc_dapm_widgets[] = { +diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c +index 24047375c2fb..70e1a60a2e98 100644 +--- a/sound/soc/soc-pcm.c ++++ b/sound/soc/soc-pcm.c +@@ -48,8 +48,8 @@ static bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream) + else + codec_stream = &dai->driver->capture; + +- /* If the codec specifies any rate at all, it supports the stream. */ +- return codec_stream->rates; ++ /* If the codec specifies any channels at all, it supports the stream */ ++ return codec_stream->channels_min; + } + + /** +diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c +index da0a2083e12a..d2802fd8c1dd 100644 +--- a/sound/soc/sunxi/sun4i-i2s.c ++++ b/sound/soc/sunxi/sun4i-i2s.c +@@ -80,8 +80,8 @@ + #define SUN4I_I2S_CLK_DIV_MCLK_MASK GENMASK(3, 0) + #define SUN4I_I2S_CLK_DIV_MCLK(mclk) ((mclk) << 0) + +-#define SUN4I_I2S_RX_CNT_REG 0x28 +-#define SUN4I_I2S_TX_CNT_REG 0x2c ++#define SUN4I_I2S_TX_CNT_REG 0x28 ++#define SUN4I_I2S_RX_CNT_REG 0x2c + + #define SUN4I_I2S_TX_CHAN_SEL_REG 0x30 + #define SUN4I_I2S_CHAN_SEL(num_chan) (((num_chan) - 1) << 0) +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 044193b2364d..e6e4c3b9d9d3 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -2632,7 +2632,9 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, + (err = snd_usb_mixer_status_create(mixer)) < 0) + goto _error; + +- snd_usb_mixer_apply_create_quirk(mixer); ++ err = snd_usb_mixer_apply_create_quirk(mixer); ++ if (err < 0) ++ goto _error; + + err = snd_device_new(chip->card, SNDRV_DEV_CODEC, mixer, &dev_ops); + if (err < 0) +diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h +index d32727c74a16..c892b4d1e733 100644 +--- a/sound/usb/quirks-table.h ++++ b/sound/usb/quirks-table.h +@@ -3293,19 +3293,14 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), + .ifnum = 0, + .type = QUIRK_AUDIO_STANDARD_MIXER, + }, +- /* Capture */ +- { +- .ifnum = 1, +- .type = QUIRK_IGNORE_INTERFACE, +- }, + /* Playback */ + { +- .ifnum = 2, ++ .ifnum = 1, + .type = QUIRK_AUDIO_FIXED_ENDPOINT, + .data = &(const struct audioformat) { + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels = 2, +- .iface = 2, ++ .iface = 1, + .altsetting = 1, + .altset_idx = 1, + .attributes = UAC_EP_CS_ATTR_FILL_MAX | +diff --git a/tools/testing/selftests/ipc/msgque.c b/tools/testing/selftests/ipc/msgque.c +index ee9382bdfadc..c5587844fbb8 100644 +--- a/tools/testing/selftests/ipc/msgque.c ++++ b/tools/testing/selftests/ipc/msgque.c +@@ -1,9 +1,10 @@ + // SPDX-License-Identifier: GPL-2.0 ++#define _GNU_SOURCE + #include + #include + #include + #include +-#include ++#include + #include + + #include "../kselftest.h" +@@ -73,7 +74,7 @@ int restore_queue(struct msgque_data *msgque) + return 0; + + destroy: +- if (msgctl(id, IPC_RMID, 0)) ++ if (msgctl(id, IPC_RMID, NULL)) + printf("Failed to destroy queue: %d\n", -errno); + return ret; + } +@@ -120,7 +121,7 @@ int check_and_destroy_queue(struct msgque_data *msgque) + + ret = 0; + err: +- if (msgctl(msgque->msq_id, IPC_RMID, 0)) { ++ if (msgctl(msgque->msq_id, IPC_RMID, NULL)) { + printf("Failed to destroy queue: %d\n", -errno); + return -errno; + } +@@ -129,7 +130,7 @@ err: + + int dump_queue(struct msgque_data *msgque) + { +- struct msqid64_ds ds; ++ struct msqid_ds ds; + int kern_id; + int i, ret; + +@@ -246,7 +247,7 @@ int main(int argc, char **argv) + return ksft_exit_pass(); + + err_destroy: +- if (msgctl(msgque.msq_id, IPC_RMID, 0)) { ++ if (msgctl(msgque.msq_id, IPC_RMID, NULL)) { + printf("Failed to destroy queue: %d\n", -errno); + return ksft_exit_fail(); + } diff --git a/patch/kernel/odroidxu4-legacy/patch-4.14.168-169.patch b/patch/kernel/odroidxu4-legacy/patch-4.14.168-169.patch new file mode 100644 index 0000000000..c56331205d --- /dev/null +++ b/patch/kernel/odroidxu4-legacy/patch-4.14.168-169.patch @@ -0,0 +1,1600 @@ +diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt +index 933465eff40e..7e0a4be3503d 100644 +--- a/Documentation/admin-guide/kernel-parameters.txt ++++ b/Documentation/admin-guide/kernel-parameters.txt +@@ -1845,6 +1845,12 @@ + Built with CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y, + the default is off. + ++ kpti= [ARM64] Control page table isolation of user ++ and kernel address spaces. ++ Default: enabled on cores which need mitigation. ++ 0: force disabled ++ 1: force enabled ++ + kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs. + Default is 0 (don't ignore, but inject #GP) + +diff --git a/Makefile b/Makefile +index 1e74ba09cdda..795d93bfe156 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 14 +-SUBLEVEL = 168 ++SUBLEVEL = 169 + EXTRAVERSION = + NAME = Petit Gorille + +diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c +index 6b6368a56526..0e449ee11ac7 100644 +--- a/drivers/atm/firestream.c ++++ b/drivers/atm/firestream.c +@@ -927,6 +927,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + } + if (!to) { + printk ("No more free channels for FS50..\n"); ++ kfree(vcc); + return -EBUSY; + } + vcc->channo = dev->channo; +@@ -937,6 +938,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + if (((DO_DIRECTION(rxtp) && dev->atm_vccs[vcc->channo])) || + ( DO_DIRECTION(txtp) && test_bit (vcc->channo, dev->tx_inuse))) { + printk ("Channel is in use for FS155.\n"); ++ kfree(vcc); + return -EBUSY; + } + } +@@ -950,6 +952,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + tc, sizeof (struct fs_transmit_config)); + if (!tc) { + fs_dprintk (FS_DEBUG_OPEN, "fs: can't alloc transmit_config.\n"); ++ kfree(vcc); + return -ENOMEM; + } + +diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c +index 37db2eb66ed7..d7d1f2467100 100644 +--- a/drivers/hwmon/adt7475.c ++++ b/drivers/hwmon/adt7475.c +@@ -297,9 +297,10 @@ static inline u16 volt2reg(int channel, long volt, u8 bypass_attn) + long reg; + + if (bypass_attn & (1 << channel)) +- reg = (volt * 1024) / 2250; ++ reg = DIV_ROUND_CLOSEST(volt * 1024, 2250); + else +- reg = (volt * r[1] * 1024) / ((r[0] + r[1]) * 2250); ++ reg = DIV_ROUND_CLOSEST(volt * r[1] * 1024, ++ (r[0] + r[1]) * 2250); + return clamp_val(reg, 0, 1023) & (0xff << 2); + } + +diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c +index 7b53065e9882..652973d83a07 100644 +--- a/drivers/hwmon/hwmon.c ++++ b/drivers/hwmon/hwmon.c +@@ -51,6 +51,7 @@ struct hwmon_device_attribute { + + #define to_hwmon_attr(d) \ + container_of(d, struct hwmon_device_attribute, dev_attr) ++#define to_dev_attr(a) container_of(a, struct device_attribute, attr) + + /* + * Thermal zone information +@@ -58,7 +59,7 @@ struct hwmon_device_attribute { + * also provides the sensor index. + */ + struct hwmon_thermal_data { +- struct hwmon_device *hwdev; /* Reference to hwmon device */ ++ struct device *dev; /* Reference to hwmon device */ + int index; /* sensor index */ + }; + +@@ -95,9 +96,27 @@ static const struct attribute_group *hwmon_dev_attr_groups[] = { + NULL + }; + ++static void hwmon_free_attrs(struct attribute **attrs) ++{ ++ int i; ++ ++ for (i = 0; attrs[i]; i++) { ++ struct device_attribute *dattr = to_dev_attr(attrs[i]); ++ struct hwmon_device_attribute *hattr = to_hwmon_attr(dattr); ++ ++ kfree(hattr); ++ } ++ kfree(attrs); ++} ++ + static void hwmon_dev_release(struct device *dev) + { +- kfree(to_hwmon_device(dev)); ++ struct hwmon_device *hwdev = to_hwmon_device(dev); ++ ++ if (hwdev->group.attrs) ++ hwmon_free_attrs(hwdev->group.attrs); ++ kfree(hwdev->groups); ++ kfree(hwdev); + } + + static struct class hwmon_class = { +@@ -121,11 +140,11 @@ static DEFINE_IDA(hwmon_ida); + static int hwmon_thermal_get_temp(void *data, int *temp) + { + struct hwmon_thermal_data *tdata = data; +- struct hwmon_device *hwdev = tdata->hwdev; ++ struct hwmon_device *hwdev = to_hwmon_device(tdata->dev); + int ret; + long t; + +- ret = hwdev->chip->ops->read(&hwdev->dev, hwmon_temp, hwmon_temp_input, ++ ret = hwdev->chip->ops->read(tdata->dev, hwmon_temp, hwmon_temp_input, + tdata->index, &t); + if (ret < 0) + return ret; +@@ -139,26 +158,31 @@ static const struct thermal_zone_of_device_ops hwmon_thermal_ops = { + .get_temp = hwmon_thermal_get_temp, + }; + +-static int hwmon_thermal_add_sensor(struct device *dev, +- struct hwmon_device *hwdev, int index) ++static int hwmon_thermal_add_sensor(struct device *dev, int index) + { + struct hwmon_thermal_data *tdata; ++ struct thermal_zone_device *tzd; + + tdata = devm_kzalloc(dev, sizeof(*tdata), GFP_KERNEL); + if (!tdata) + return -ENOMEM; + +- tdata->hwdev = hwdev; ++ tdata->dev = dev; + tdata->index = index; + +- devm_thermal_zone_of_sensor_register(&hwdev->dev, index, tdata, +- &hwmon_thermal_ops); ++ tzd = devm_thermal_zone_of_sensor_register(dev, index, tdata, ++ &hwmon_thermal_ops); ++ /* ++ * If CONFIG_THERMAL_OF is disabled, this returns -ENODEV, ++ * so ignore that error but forward any other error. ++ */ ++ if (IS_ERR(tzd) && (PTR_ERR(tzd) != -ENODEV)) ++ return PTR_ERR(tzd); + + return 0; + } + #else +-static int hwmon_thermal_add_sensor(struct device *dev, +- struct hwmon_device *hwdev, int index) ++static int hwmon_thermal_add_sensor(struct device *dev, int index) + { + return 0; + } +@@ -235,8 +259,7 @@ static bool is_string_attr(enum hwmon_sensor_types type, u32 attr) + (type == hwmon_fan && attr == hwmon_fan_label); + } + +-static struct attribute *hwmon_genattr(struct device *dev, +- const void *drvdata, ++static struct attribute *hwmon_genattr(const void *drvdata, + enum hwmon_sensor_types type, + u32 attr, + int index, +@@ -264,7 +287,7 @@ static struct attribute *hwmon_genattr(struct device *dev, + if ((mode & S_IWUGO) && !ops->write) + return ERR_PTR(-EINVAL); + +- hattr = devm_kzalloc(dev, sizeof(*hattr), GFP_KERNEL); ++ hattr = kzalloc(sizeof(*hattr), GFP_KERNEL); + if (!hattr) + return ERR_PTR(-ENOMEM); + +@@ -467,8 +490,7 @@ static int hwmon_num_channel_attrs(const struct hwmon_channel_info *info) + return n; + } + +-static int hwmon_genattrs(struct device *dev, +- const void *drvdata, ++static int hwmon_genattrs(const void *drvdata, + struct attribute **attrs, + const struct hwmon_ops *ops, + const struct hwmon_channel_info *info) +@@ -494,7 +516,7 @@ static int hwmon_genattrs(struct device *dev, + attr_mask &= ~BIT(attr); + if (attr >= template_size) + return -EINVAL; +- a = hwmon_genattr(dev, drvdata, info->type, attr, i, ++ a = hwmon_genattr(drvdata, info->type, attr, i, + templates[attr], ops); + if (IS_ERR(a)) { + if (PTR_ERR(a) != -ENOENT) +@@ -508,8 +530,7 @@ static int hwmon_genattrs(struct device *dev, + } + + static struct attribute ** +-__hwmon_create_attrs(struct device *dev, const void *drvdata, +- const struct hwmon_chip_info *chip) ++__hwmon_create_attrs(const void *drvdata, const struct hwmon_chip_info *chip) + { + int ret, i, aindex = 0, nattrs = 0; + struct attribute **attrs; +@@ -520,15 +541,17 @@ __hwmon_create_attrs(struct device *dev, const void *drvdata, + if (nattrs == 0) + return ERR_PTR(-EINVAL); + +- attrs = devm_kcalloc(dev, nattrs + 1, sizeof(*attrs), GFP_KERNEL); ++ attrs = kcalloc(nattrs + 1, sizeof(*attrs), GFP_KERNEL); + if (!attrs) + return ERR_PTR(-ENOMEM); + + for (i = 0; chip->info[i]; i++) { +- ret = hwmon_genattrs(dev, drvdata, &attrs[aindex], chip->ops, ++ ret = hwmon_genattrs(drvdata, &attrs[aindex], chip->ops, + chip->info[i]); +- if (ret < 0) ++ if (ret < 0) { ++ hwmon_free_attrs(attrs); + return ERR_PTR(ret); ++ } + aindex += ret; + } + +@@ -570,14 +593,13 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata, + for (i = 0; groups[i]; i++) + ngroups++; + +- hwdev->groups = devm_kcalloc(dev, ngroups, sizeof(*groups), +- GFP_KERNEL); ++ hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL); + if (!hwdev->groups) { + err = -ENOMEM; + goto free_hwmon; + } + +- attrs = __hwmon_create_attrs(dev, drvdata, chip); ++ attrs = __hwmon_create_attrs(drvdata, chip); + if (IS_ERR(attrs)) { + err = PTR_ERR(attrs); + goto free_hwmon; +@@ -621,8 +643,13 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata, + if (!chip->ops->is_visible(drvdata, hwmon_temp, + hwmon_temp_input, j)) + continue; +- if (info[i]->config[j] & HWMON_T_INPUT) +- hwmon_thermal_add_sensor(dev, hwdev, j); ++ if (info[i]->config[j] & HWMON_T_INPUT) { ++ err = hwmon_thermal_add_sensor(hdev, j); ++ if (err) { ++ device_unregister(hdev); ++ goto ida_remove; ++ } ++ } + } + } + } +@@ -630,7 +657,7 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata, + return hdev; + + free_hwmon: +- kfree(hwdev); ++ hwmon_dev_release(hdev); + ida_remove: + ida_simple_remove(&hwmon_ida, id); + return ERR_PTR(err); +diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c +index 38ffbdb0a85f..779ec8fdfae0 100644 +--- a/drivers/hwmon/nct7802.c ++++ b/drivers/hwmon/nct7802.c +@@ -32,8 +32,8 @@ + static const u8 REG_VOLTAGE[5] = { 0x09, 0x0a, 0x0c, 0x0d, 0x0e }; + + static const u8 REG_VOLTAGE_LIMIT_LSB[2][5] = { +- { 0x40, 0x00, 0x42, 0x44, 0x46 }, +- { 0x3f, 0x00, 0x41, 0x43, 0x45 }, ++ { 0x46, 0x00, 0x40, 0x42, 0x44 }, ++ { 0x45, 0x00, 0x3f, 0x41, 0x43 }, + }; + + static const u8 REG_VOLTAGE_LIMIT_MSB[5] = { 0x48, 0x00, 0x47, 0x47, 0x48 }; +diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c +index d14a9cb7959a..cb675a596302 100644 +--- a/drivers/hwtracing/coresight/coresight-etb10.c ++++ b/drivers/hwtracing/coresight/coresight-etb10.c +@@ -287,9 +287,7 @@ static void *etb_alloc_buffer(struct coresight_device *csdev, int cpu, + int node; + struct cs_buffers *buf; + +- if (cpu == -1) +- cpu = smp_processor_id(); +- node = cpu_to_node(cpu); ++ node = (cpu == -1) ? NUMA_NO_NODE : cpu_to_node(cpu); + + buf = kzalloc_node(sizeof(struct cs_buffers), GFP_KERNEL, node); + if (!buf) +diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c +index 336194d059fe..0a00f4e941fb 100644 +--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c ++++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c +@@ -308,9 +308,7 @@ static void *tmc_alloc_etf_buffer(struct coresight_device *csdev, int cpu, + int node; + struct cs_buffers *buf; + +- if (cpu == -1) +- cpu = smp_processor_id(); +- node = cpu_to_node(cpu); ++ node = (cpu == -1) ? NUMA_NO_NODE : cpu_to_node(cpu); + + /* Allocate memory structure for interaction with Perf */ + buf = kzalloc_node(sizeof(struct cs_buffers), GFP_KERNEL, node); +diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c +index ee3f630c9217..9b5691f306a2 100644 +--- a/drivers/infiniband/ulp/isert/ib_isert.c ++++ b/drivers/infiniband/ulp/isert/ib_isert.c +@@ -2582,17 +2582,6 @@ isert_wait4logout(struct isert_conn *isert_conn) + } + } + +-static void +-isert_wait4cmds(struct iscsi_conn *conn) +-{ +- isert_info("iscsi_conn %p\n", conn); +- +- if (conn->sess) { +- target_sess_cmd_list_set_waiting(conn->sess->se_sess); +- target_wait_for_sess_cmds(conn->sess->se_sess); +- } +-} +- + /** + * isert_put_unsol_pending_cmds() - Drop commands waiting for + * unsolicitate dataout +@@ -2640,7 +2629,6 @@ static void isert_wait_conn(struct iscsi_conn *conn) + + ib_drain_qp(isert_conn->qp); + isert_put_unsol_pending_cmds(conn); +- isert_wait4cmds(conn); + isert_wait4logout(isert_conn); + + queue_work(isert_release_wq, &isert_conn->release_work); +diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c +index 77c47d6325fe..a9ee813eef10 100644 +--- a/drivers/input/misc/keyspan_remote.c ++++ b/drivers/input/misc/keyspan_remote.c +@@ -344,7 +344,8 @@ static int keyspan_setup(struct usb_device* dev) + int retval = 0; + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); ++ 0x11, 0x40, 0x5601, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", + __func__, retval); +@@ -352,7 +353,8 @@ static int keyspan_setup(struct usb_device* dev) + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); ++ 0x44, 0x40, 0x0, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", + __func__, retval); +@@ -360,7 +362,8 @@ static int keyspan_setup(struct usb_device* dev) + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); ++ 0x22, 0x40, 0x0, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", + __func__, retval); +diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c +index 7dd1c1fbe42a..27b3db154a33 100644 +--- a/drivers/input/misc/pm8xxx-vibrator.c ++++ b/drivers/input/misc/pm8xxx-vibrator.c +@@ -98,7 +98,7 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on) + + if (regs->enable_mask) + rc = regmap_update_bits(vib->regmap, regs->enable_addr, +- on ? regs->enable_mask : 0, val); ++ regs->enable_mask, on ? ~0 : 0); + + return rc; + } +diff --git a/drivers/input/rmi4/rmi_smbus.c b/drivers/input/rmi4/rmi_smbus.c +index 4b2466cf2fb1..b6ccf39c6a7b 100644 +--- a/drivers/input/rmi4/rmi_smbus.c ++++ b/drivers/input/rmi4/rmi_smbus.c +@@ -166,6 +166,7 @@ static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr, + /* prepare to write next block of bytes */ + cur_len -= SMB_MAX_COUNT; + databuff += SMB_MAX_COUNT; ++ rmiaddr += SMB_MAX_COUNT; + } + exit: + mutex_unlock(&rmi_smb->page_mutex); +@@ -217,6 +218,7 @@ static int rmi_smb_read_block(struct rmi_transport_dev *xport, u16 rmiaddr, + /* prepare to read next block of bytes */ + cur_len -= SMB_MAX_COUNT; + databuff += SMB_MAX_COUNT; ++ rmiaddr += SMB_MAX_COUNT; + } + + retval = 0; +diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c +index 0b55e1f375b3..fbe2df91aad3 100644 +--- a/drivers/input/tablet/aiptek.c ++++ b/drivers/input/tablet/aiptek.c +@@ -1822,14 +1822,14 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) + input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0); + + /* Verify that a device really has an endpoint */ +- if (intf->altsetting[0].desc.bNumEndpoints < 1) { ++ if (intf->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&intf->dev, + "interface has %d endpoints, but must have minimum 1\n", +- intf->altsetting[0].desc.bNumEndpoints); ++ intf->cur_altsetting->desc.bNumEndpoints); + err = -EINVAL; + goto fail3; + } +- endpoint = &intf->altsetting[0].endpoint[0].desc; ++ endpoint = &intf->cur_altsetting->endpoint[0].desc; + + /* Go set up our URB, which is called when the tablet receives + * input. +diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c +index 35031228a6d0..799c94dda651 100644 +--- a/drivers/input/tablet/gtco.c ++++ b/drivers/input/tablet/gtco.c +@@ -875,18 +875,14 @@ static int gtco_probe(struct usb_interface *usbinterface, + } + + /* Sanity check that a device has an endpoint */ +- if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) { ++ if (usbinterface->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&usbinterface->dev, + "Invalid number of endpoints\n"); + error = -EINVAL; + goto err_free_urb; + } + +- /* +- * The endpoint is always altsetting 0, we know this since we know +- * this device only has one interrupt endpoint +- */ +- endpoint = &usbinterface->altsetting[0].endpoint[0].desc; ++ endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; + + /* Some debug */ + dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting); +@@ -973,7 +969,7 @@ static int gtco_probe(struct usb_interface *usbinterface, + input_dev->dev.parent = &usbinterface->dev; + + /* Setup the URB, it will be posted later on open of input device */ +- endpoint = &usbinterface->altsetting[0].endpoint[0].desc; ++ endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; + + usb_fill_int_urb(gtco->urbinfo, + udev, +diff --git a/drivers/input/tablet/pegasus_notetaker.c b/drivers/input/tablet/pegasus_notetaker.c +index 47de5a81172f..2319144802c9 100644 +--- a/drivers/input/tablet/pegasus_notetaker.c ++++ b/drivers/input/tablet/pegasus_notetaker.c +@@ -260,7 +260,7 @@ static int pegasus_probe(struct usb_interface *intf, + return -ENODEV; + + /* Sanity check that the device has an endpoint */ +- if (intf->altsetting[0].desc.bNumEndpoints < 1) { ++ if (intf->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&intf->dev, "Invalid number of endpoints\n"); + return -EINVAL; + } +diff --git a/drivers/input/touchscreen/sun4i-ts.c b/drivers/input/touchscreen/sun4i-ts.c +index d2e14d9e5975..ab44eb0352d0 100644 +--- a/drivers/input/touchscreen/sun4i-ts.c ++++ b/drivers/input/touchscreen/sun4i-ts.c +@@ -246,6 +246,7 @@ static int sun4i_ts_probe(struct platform_device *pdev) + struct device *dev = &pdev->dev; + struct device_node *np = dev->of_node; + struct device *hwmon; ++ struct thermal_zone_device *thermal; + int error; + u32 reg; + bool ts_attached; +@@ -365,7 +366,10 @@ static int sun4i_ts_probe(struct platform_device *pdev) + if (IS_ERR(hwmon)) + return PTR_ERR(hwmon); + +- devm_thermal_zone_of_sensor_register(ts->dev, 0, ts, &sun4i_ts_tz_ops); ++ thermal = devm_thermal_zone_of_sensor_register(ts->dev, 0, ts, ++ &sun4i_ts_tz_ops); ++ if (IS_ERR(thermal)) ++ return PTR_ERR(thermal); + + writel(TEMP_IRQ_EN(1), ts->base + TP_INT_FIFOC); + +diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c +index f16f8358c70a..98e03d0ca03c 100644 +--- a/drivers/input/touchscreen/sur40.c ++++ b/drivers/input/touchscreen/sur40.c +@@ -537,7 +537,7 @@ static int sur40_probe(struct usb_interface *interface, + int error; + + /* Check if we really have the right interface. */ +- iface_desc = &interface->altsetting[0]; ++ iface_desc = interface->cur_altsetting; + if (iface_desc->desc.bInterfaceClass != 0xFF) + return -ENODEV; + +diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c +index 0cabf31fb163..7eb76a1a2505 100644 +--- a/drivers/md/bitmap.c ++++ b/drivers/md/bitmap.c +@@ -1729,7 +1729,7 @@ void bitmap_flush(struct mddev *mddev) + /* + * free memory that was allocated + */ +-void bitmap_free(struct bitmap *bitmap) ++void md_bitmap_free(struct bitmap *bitmap) + { + unsigned long k, pages; + struct bitmap_page *bp; +@@ -1763,7 +1763,7 @@ void bitmap_free(struct bitmap *bitmap) + kfree(bp); + kfree(bitmap); + } +-EXPORT_SYMBOL(bitmap_free); ++EXPORT_SYMBOL(md_bitmap_free); + + void bitmap_wait_behind_writes(struct mddev *mddev) + { +@@ -1796,7 +1796,7 @@ void bitmap_destroy(struct mddev *mddev) + if (mddev->thread) + mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT; + +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + } + + /* +@@ -1887,7 +1887,7 @@ struct bitmap *bitmap_create(struct mddev *mddev, int slot) + + return bitmap; + error: +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return ERR_PTR(err); + } + +@@ -1958,7 +1958,7 @@ struct bitmap *get_bitmap_from_slot(struct mddev *mddev, int slot) + + rv = bitmap_init_from_disk(bitmap, 0); + if (rv) { +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return ERR_PTR(rv); + } + +diff --git a/drivers/md/bitmap.h b/drivers/md/bitmap.h +index 5df35ca90f58..dd53a978c5f2 100644 +--- a/drivers/md/bitmap.h ++++ b/drivers/md/bitmap.h +@@ -271,7 +271,7 @@ int bitmap_resize(struct bitmap *bitmap, sector_t blocks, + struct bitmap *get_bitmap_from_slot(struct mddev *mddev, int slot); + int bitmap_copy_from_slot(struct mddev *mddev, int slot, + sector_t *lo, sector_t *hi, bool clear_bits); +-void bitmap_free(struct bitmap *bitmap); ++void md_bitmap_free(struct bitmap *bitmap); + void bitmap_wait_behind_writes(struct mddev *mddev); + #endif + +diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c +index 717aaffc227d..10057ac85476 100644 +--- a/drivers/md/md-cluster.c ++++ b/drivers/md/md-cluster.c +@@ -1128,7 +1128,7 @@ int cluster_check_sync_size(struct mddev *mddev) + bm_lockres = lockres_init(mddev, str, NULL, 1); + if (!bm_lockres) { + pr_err("md-cluster: Cannot initialize %s\n", str); +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return -1; + } + bm_lockres->flags |= DLM_LKF_NOQUEUE; +@@ -1142,11 +1142,11 @@ int cluster_check_sync_size(struct mddev *mddev) + sync_size = sb->sync_size; + else if (sync_size != sb->sync_size) { + kunmap_atomic(sb); +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return -1; + } + kunmap_atomic(sb); +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + } + + return (my_sync_size == sync_size) ? 0 : -1; +diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c +index 7cafc8a57950..8eb52139684a 100644 +--- a/drivers/media/v4l2-core/v4l2-ioctl.c ++++ b/drivers/media/v4l2-core/v4l2-ioctl.c +@@ -1496,12 +1496,12 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops, + case V4L2_BUF_TYPE_VBI_CAPTURE: + if (unlikely(!ops->vidioc_s_fmt_vbi_cap)) + break; +- CLEAR_AFTER_FIELD(p, fmt.vbi); ++ CLEAR_AFTER_FIELD(p, fmt.vbi.flags); + return ops->vidioc_s_fmt_vbi_cap(file, fh, arg); + case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: + if (unlikely(!ops->vidioc_s_fmt_sliced_vbi_cap)) + break; +- CLEAR_AFTER_FIELD(p, fmt.sliced); ++ CLEAR_AFTER_FIELD(p, fmt.sliced.io_size); + return ops->vidioc_s_fmt_sliced_vbi_cap(file, fh, arg); + case V4L2_BUF_TYPE_VIDEO_OUTPUT: + if (unlikely(!ops->vidioc_s_fmt_vid_out)) +@@ -1524,22 +1524,22 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops, + case V4L2_BUF_TYPE_VBI_OUTPUT: + if (unlikely(!ops->vidioc_s_fmt_vbi_out)) + break; +- CLEAR_AFTER_FIELD(p, fmt.vbi); ++ CLEAR_AFTER_FIELD(p, fmt.vbi.flags); + return ops->vidioc_s_fmt_vbi_out(file, fh, arg); + case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: + if (unlikely(!ops->vidioc_s_fmt_sliced_vbi_out)) + break; +- CLEAR_AFTER_FIELD(p, fmt.sliced); ++ CLEAR_AFTER_FIELD(p, fmt.sliced.io_size); + return ops->vidioc_s_fmt_sliced_vbi_out(file, fh, arg); + case V4L2_BUF_TYPE_SDR_CAPTURE: + if (unlikely(!ops->vidioc_s_fmt_sdr_cap)) + break; +- CLEAR_AFTER_FIELD(p, fmt.sdr); ++ CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize); + return ops->vidioc_s_fmt_sdr_cap(file, fh, arg); + case V4L2_BUF_TYPE_SDR_OUTPUT: + if (unlikely(!ops->vidioc_s_fmt_sdr_out)) + break; +- CLEAR_AFTER_FIELD(p, fmt.sdr); ++ CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize); + return ops->vidioc_s_fmt_sdr_out(file, fh, arg); + case V4L2_BUF_TYPE_META_CAPTURE: + if (unlikely(!ops->vidioc_s_fmt_meta_cap)) +@@ -1583,12 +1583,12 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops, + case V4L2_BUF_TYPE_VBI_CAPTURE: + if (unlikely(!ops->vidioc_try_fmt_vbi_cap)) + break; +- CLEAR_AFTER_FIELD(p, fmt.vbi); ++ CLEAR_AFTER_FIELD(p, fmt.vbi.flags); + return ops->vidioc_try_fmt_vbi_cap(file, fh, arg); + case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: + if (unlikely(!ops->vidioc_try_fmt_sliced_vbi_cap)) + break; +- CLEAR_AFTER_FIELD(p, fmt.sliced); ++ CLEAR_AFTER_FIELD(p, fmt.sliced.io_size); + return ops->vidioc_try_fmt_sliced_vbi_cap(file, fh, arg); + case V4L2_BUF_TYPE_VIDEO_OUTPUT: + if (unlikely(!ops->vidioc_try_fmt_vid_out)) +@@ -1611,22 +1611,22 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops, + case V4L2_BUF_TYPE_VBI_OUTPUT: + if (unlikely(!ops->vidioc_try_fmt_vbi_out)) + break; +- CLEAR_AFTER_FIELD(p, fmt.vbi); ++ CLEAR_AFTER_FIELD(p, fmt.vbi.flags); + return ops->vidioc_try_fmt_vbi_out(file, fh, arg); + case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: + if (unlikely(!ops->vidioc_try_fmt_sliced_vbi_out)) + break; +- CLEAR_AFTER_FIELD(p, fmt.sliced); ++ CLEAR_AFTER_FIELD(p, fmt.sliced.io_size); + return ops->vidioc_try_fmt_sliced_vbi_out(file, fh, arg); + case V4L2_BUF_TYPE_SDR_CAPTURE: + if (unlikely(!ops->vidioc_try_fmt_sdr_cap)) + break; +- CLEAR_AFTER_FIELD(p, fmt.sdr); ++ CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize); + return ops->vidioc_try_fmt_sdr_cap(file, fh, arg); + case V4L2_BUF_TYPE_SDR_OUTPUT: + if (unlikely(!ops->vidioc_try_fmt_sdr_out)) + break; +- CLEAR_AFTER_FIELD(p, fmt.sdr); ++ CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize); + return ops->vidioc_try_fmt_sdr_out(file, fh, arg); + case V4L2_BUF_TYPE_META_CAPTURE: + if (unlikely(!ops->vidioc_try_fmt_meta_cap)) +diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c +index ce3f344d2b66..d2b0a62bfce1 100644 +--- a/drivers/mmc/host/sdhci-tegra.c ++++ b/drivers/mmc/host/sdhci-tegra.c +@@ -177,7 +177,7 @@ static void tegra_sdhci_reset(struct sdhci_host *host, u8 mask) + misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_DDR50; + if (soc_data->nvquirks & NVQUIRK_ENABLE_SDR104) + misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_SDR104; +- if (soc_data->nvquirks & SDHCI_MISC_CTRL_ENABLE_SDR50) ++ if (soc_data->nvquirks & NVQUIRK_ENABLE_SDR50) + clk_ctrl |= SDHCI_CLOCK_CTRL_SDR50_TUNING_OVERRIDE; + } + +diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c +index 645775dd4edb..4f1c884c0b50 100644 +--- a/drivers/mmc/host/sdhci.c ++++ b/drivers/mmc/host/sdhci.c +@@ -3592,11 +3592,13 @@ int sdhci_setup_host(struct sdhci_host *host) + if (host->ops->get_min_clock) + mmc->f_min = host->ops->get_min_clock(host); + else if (host->version >= SDHCI_SPEC_300) { +- if (host->clk_mul) { +- mmc->f_min = (host->max_clk * host->clk_mul) / 1024; ++ if (host->clk_mul) + max_clk = host->max_clk * host->clk_mul; +- } else +- mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; ++ /* ++ * Divided Clock Mode minimum clock rate is always less than ++ * Programmable Clock Mode minimum clock rate. ++ */ ++ mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; + } else + mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; + +diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c +index a42737b4ac79..35564a9561b7 100644 +--- a/drivers/net/can/slcan.c ++++ b/drivers/net/can/slcan.c +@@ -343,9 +343,16 @@ static void slcan_transmit(struct work_struct *work) + */ + static void slcan_write_wakeup(struct tty_struct *tty) + { +- struct slcan *sl = tty->disc_data; ++ struct slcan *sl; ++ ++ rcu_read_lock(); ++ sl = rcu_dereference(tty->disc_data); ++ if (!sl) ++ goto out; + + schedule_work(&sl->tx_work); ++out: ++ rcu_read_unlock(); + } + + /* Send a can_frame to a TTY queue. */ +@@ -640,10 +647,11 @@ static void slcan_close(struct tty_struct *tty) + return; + + spin_lock_bh(&sl->lock); +- tty->disc_data = NULL; ++ rcu_assign_pointer(tty->disc_data, NULL); + sl->tty = NULL; + spin_unlock_bh(&sl->lock); + ++ synchronize_rcu(); + flush_work(&sl->tx_work); + + /* Flush network side */ +diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +index 338683e5ef1e..b8779afb8550 100644 +--- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c ++++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +@@ -2449,6 +2449,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) + + if (!is_offload(adapter)) + return -EOPNOTSUPP; ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; + if (!(adapter->flags & FULL_INIT_DONE)) + return -EIO; /* need the memory controllers */ + if (copy_from_user(&t, useraddr, sizeof(t))) +diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c +index 25be27826a22..3840f21dd635 100644 +--- a/drivers/net/gtp.c ++++ b/drivers/net/gtp.c +@@ -807,19 +807,21 @@ static struct sock *gtp_encap_enable_socket(int fd, int type, + return NULL; + } + +- if (sock->sk->sk_protocol != IPPROTO_UDP) { ++ sk = sock->sk; ++ if (sk->sk_protocol != IPPROTO_UDP || ++ sk->sk_type != SOCK_DGRAM || ++ (sk->sk_family != AF_INET && sk->sk_family != AF_INET6)) { + pr_debug("socket fd=%d not UDP\n", fd); + sk = ERR_PTR(-EINVAL); + goto out_sock; + } + +- lock_sock(sock->sk); +- if (sock->sk->sk_user_data) { ++ lock_sock(sk); ++ if (sk->sk_user_data) { + sk = ERR_PTR(-EBUSY); + goto out_rel_sock; + } + +- sk = sock->sk; + sock_hold(sk); + + tuncfg.sk_user_data = gtp; +diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c +index d6dc00b4ba55..b07f367abd91 100644 +--- a/drivers/net/slip/slip.c ++++ b/drivers/net/slip/slip.c +@@ -452,9 +452,16 @@ static void slip_transmit(struct work_struct *work) + */ + static void slip_write_wakeup(struct tty_struct *tty) + { +- struct slip *sl = tty->disc_data; ++ struct slip *sl; ++ ++ rcu_read_lock(); ++ sl = rcu_dereference(tty->disc_data); ++ if (!sl) ++ goto out; + + schedule_work(&sl->tx_work); ++out: ++ rcu_read_unlock(); + } + + static void sl_tx_timeout(struct net_device *dev) +@@ -886,10 +893,11 @@ static void slip_close(struct tty_struct *tty) + return; + + spin_lock_bh(&sl->lock); +- tty->disc_data = NULL; ++ rcu_assign_pointer(tty->disc_data, NULL); + sl->tty = NULL; + spin_unlock_bh(&sl->lock); + ++ synchronize_rcu(); + flush_work(&sl->tx_work); + + /* VSV = very important to remove timers */ +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index ee7194a9e231..b179a96ea08c 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -3525,6 +3526,19 @@ static void lan78xx_tx_timeout(struct net_device *net) + tasklet_schedule(&dev->bh); + } + ++static netdev_features_t lan78xx_features_check(struct sk_buff *skb, ++ struct net_device *netdev, ++ netdev_features_t features) ++{ ++ if (skb->len + TX_OVERHEAD > MAX_SINGLE_PACKET_SIZE) ++ features &= ~NETIF_F_GSO_MASK; ++ ++ features = vlan_features_check(skb, features); ++ features = vxlan_features_check(skb, features); ++ ++ return features; ++} ++ + static const struct net_device_ops lan78xx_netdev_ops = { + .ndo_open = lan78xx_open, + .ndo_stop = lan78xx_stop, +@@ -3538,6 +3552,7 @@ static const struct net_device_ops lan78xx_netdev_ops = { + .ndo_set_features = lan78xx_set_features, + .ndo_vlan_rx_add_vid = lan78xx_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = lan78xx_vlan_rx_kill_vid, ++ .ndo_features_check = lan78xx_features_check, + }; + + static void lan78xx_stat_monitor(unsigned long param) +diff --git a/drivers/net/wireless/marvell/libertas/cfg.c b/drivers/net/wireless/marvell/libertas/cfg.c +index 9f3a7b512673..4ffc188d2ffd 100644 +--- a/drivers/net/wireless/marvell/libertas/cfg.c ++++ b/drivers/net/wireless/marvell/libertas/cfg.c +@@ -273,6 +273,10 @@ add_ie_rates(u8 *tlv, const u8 *ie, int *nrates) + int hw, ap, ap_max = ie[1]; + u8 hw_rate; + ++ if (ap_max > MAX_RATES) { ++ lbs_deb_assoc("invalid rates\n"); ++ return tlv; ++ } + /* Advance past IE header */ + ie += 2; + +@@ -1720,6 +1724,9 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + struct cmd_ds_802_11_ad_hoc_join cmd; + u8 preamble = RADIO_PREAMBLE_SHORT; + int ret = 0; ++ int hw, i; ++ u8 rates_max; ++ u8 *rates; + + /* TODO: set preamble based on scan result */ + ret = lbs_set_radio(priv, preamble, 1); +@@ -1778,9 +1785,12 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + if (!rates_eid) { + lbs_add_rates(cmd.bss.rates); + } else { +- int hw, i; +- u8 rates_max = rates_eid[1]; +- u8 *rates = cmd.bss.rates; ++ rates_max = rates_eid[1]; ++ if (rates_max > MAX_RATES) { ++ lbs_deb_join("invalid rates"); ++ goto out; ++ } ++ rates = cmd.bss.rates; + for (hw = 0; hw < ARRAY_SIZE(lbs_rates); hw++) { + u8 hw_rate = lbs_rates[hw].bitrate / 5; + for (i = 0; i < rates_max; i++) { +diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c +index b4d06bd9ed51..95d71e301a53 100644 +--- a/drivers/scsi/scsi_transport_iscsi.c ++++ b/drivers/scsi/scsi_transport_iscsi.c +@@ -37,6 +37,8 @@ + + #define ISCSI_TRANSPORT_VERSION "2.0-870" + ++#define ISCSI_SEND_MAX_ALLOWED 10 ++ + static int dbg_session; + module_param_named(debug_session, dbg_session, int, + S_IRUGO | S_IWUSR); +@@ -3680,6 +3682,7 @@ iscsi_if_rx(struct sk_buff *skb) + struct nlmsghdr *nlh; + struct iscsi_uevent *ev; + uint32_t group; ++ int retries = ISCSI_SEND_MAX_ALLOWED; + + nlh = nlmsg_hdr(skb); + if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) || +@@ -3710,6 +3713,10 @@ iscsi_if_rx(struct sk_buff *skb) + break; + err = iscsi_if_send_reply(portid, nlh->nlmsg_type, + ev, sizeof(*ev)); ++ if (err == -EAGAIN && --retries < 0) { ++ printk(KERN_WARNING "Send reply failed, error %d\n", err); ++ break; ++ } + } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH); + skb_pull(skb, rlen); + } +diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c +index 2955b856e9ec..e8c2afbb82e9 100644 +--- a/drivers/scsi/sd.c ++++ b/drivers/scsi/sd.c +@@ -1981,9 +1981,13 @@ static int sd_done(struct scsi_cmnd *SCpnt) + } + break; + case REQ_OP_ZONE_REPORT: ++ /* To avoid that the block layer performs an incorrect ++ * bio_advance() call and restart of the remainder of ++ * incomplete report zone BIOs, always indicate a full ++ * completion of REQ_OP_ZONE_REPORT. ++ */ + if (!result) { +- good_bytes = scsi_bufflen(SCpnt) +- - scsi_get_resid(SCpnt); ++ good_bytes = scsi_bufflen(SCpnt); + scsi_set_resid(SCpnt, 0); + } else { + good_bytes = 0; +diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c +index 21ce92ee1652..37d64acea5e1 100644 +--- a/drivers/target/iscsi/iscsi_target.c ++++ b/drivers/target/iscsi/iscsi_target.c +@@ -4155,9 +4155,6 @@ int iscsit_close_connection( + iscsit_stop_nopin_response_timer(conn); + iscsit_stop_nopin_timer(conn); + +- if (conn->conn_transport->iscsit_wait_conn) +- conn->conn_transport->iscsit_wait_conn(conn); +- + /* + * During Connection recovery drop unacknowledged out of order + * commands for this connection, and prepare the other commands +@@ -4243,6 +4240,9 @@ int iscsit_close_connection( + target_sess_cmd_list_set_waiting(sess->se_sess); + target_wait_for_sess_cmds(sess->se_sess); + ++ if (conn->conn_transport->iscsit_wait_conn) ++ conn->conn_transport->iscsit_wait_conn(conn); ++ + ahash_request_free(conn->conn_tx_hash); + if (conn->conn_rx_hash) { + struct crypto_ahash *tfm; +diff --git a/fs/namei.c b/fs/namei.c +index d1e467b7b9de..d648d6d2b635 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -1023,7 +1023,8 @@ static int may_linkat(struct path *link) + * may_create_in_sticky - Check whether an O_CREAT open in a sticky directory + * should be allowed, or not, on files that already + * exist. +- * @dir: the sticky parent directory ++ * @dir_mode: mode bits of directory ++ * @dir_uid: owner of directory + * @inode: the inode of the file to open + * + * Block an O_CREAT open of a FIFO (or a regular file) when: +@@ -1039,18 +1040,18 @@ static int may_linkat(struct path *link) + * + * Returns 0 if the open is allowed, -ve on error. + */ +-static int may_create_in_sticky(struct dentry * const dir, ++static int may_create_in_sticky(umode_t dir_mode, kuid_t dir_uid, + struct inode * const inode) + { + if ((!sysctl_protected_fifos && S_ISFIFO(inode->i_mode)) || + (!sysctl_protected_regular && S_ISREG(inode->i_mode)) || +- likely(!(dir->d_inode->i_mode & S_ISVTX)) || +- uid_eq(inode->i_uid, dir->d_inode->i_uid) || ++ likely(!(dir_mode & S_ISVTX)) || ++ uid_eq(inode->i_uid, dir_uid) || + uid_eq(current_fsuid(), inode->i_uid)) + return 0; + +- if (likely(dir->d_inode->i_mode & 0002) || +- (dir->d_inode->i_mode & 0020 && ++ if (likely(dir_mode & 0002) || ++ (dir_mode & 0020 && + ((sysctl_protected_fifos >= 2 && S_ISFIFO(inode->i_mode)) || + (sysctl_protected_regular >= 2 && S_ISREG(inode->i_mode))))) { + return -EACCES; +@@ -3265,6 +3266,8 @@ static int do_last(struct nameidata *nd, + int *opened) + { + struct dentry *dir = nd->path.dentry; ++ kuid_t dir_uid = dir->d_inode->i_uid; ++ umode_t dir_mode = dir->d_inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +@@ -3400,7 +3403,7 @@ finish_open: + error = -EISDIR; + if (d_is_dir(nd->path.dentry)) + goto out; +- error = may_create_in_sticky(dir, ++ error = may_create_in_sticky(dir_mode, dir_uid, + d_backing_inode(nd->path.dentry)); + if (unlikely(error)) + goto out; +diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h +index aec255fb62aa..10a4dd02221d 100644 +--- a/include/linux/bitmap.h ++++ b/include/linux/bitmap.h +@@ -86,6 +86,14 @@ + * contain all bit positions from 0 to 'bits' - 1. + */ + ++/* ++ * Allocation and deallocation of bitmap. ++ * Provided in lib/bitmap.c to avoid circular dependency. ++ */ ++extern unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags); ++extern unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags); ++extern void bitmap_free(const unsigned long *bitmap); ++ + /* + * lib/bitmap.c provides these functions: + */ +diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h +index 8818291815bc..31fc54757bf2 100644 +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -3313,6 +3313,7 @@ int dev_set_alias(struct net_device *, const char *, size_t); + int dev_change_net_namespace(struct net_device *, struct net *, const char *); + int __dev_set_mtu(struct net_device *, int); + int dev_set_mtu(struct net_device *, int); ++int dev_validate_mtu(struct net_device *dev, int mtu); + void dev_set_group(struct net_device *, int); + int dev_set_mac_address(struct net_device *, struct sockaddr *); + int dev_change_carrier(struct net_device *, bool new_carrier); +diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h +index 91a533bd3eb1..b7246b7e0bf4 100644 +--- a/include/linux/netfilter/ipset/ip_set.h ++++ b/include/linux/netfilter/ipset/ip_set.h +@@ -445,13 +445,6 @@ ip6addrptr(const struct sk_buff *skb, bool src, struct in6_addr *addr) + sizeof(*addr)); + } + +-/* Calculate the bytes required to store the inclusive range of a-b */ +-static inline int +-bitmap_bytes(u32 a, u32 b) +-{ +- return 4 * ((((b - a + 8) / 8) + 3) / 4); +-} +- + #include + #include + #include +diff --git a/include/trace/events/xen.h b/include/trace/events/xen.h +index 2ec9064a2bb7..e5150fc67e91 100644 +--- a/include/trace/events/xen.h ++++ b/include/trace/events/xen.h +@@ -66,7 +66,11 @@ TRACE_EVENT(xen_mc_callback, + TP_PROTO(xen_mc_callback_fn_t fn, void *data), + TP_ARGS(fn, data), + TP_STRUCT__entry( +- __field(xen_mc_callback_fn_t, fn) ++ /* ++ * Use field_struct to avoid is_signed_type() ++ * comparison of a function pointer. ++ */ ++ __field_struct(xen_mc_callback_fn_t, fn) + __field(void *, data) + ), + TP_fast_assign( +diff --git a/lib/bitmap.c b/lib/bitmap.c +index 2a9373ef4054..fbe38a83acb3 100644 +--- a/lib/bitmap.c ++++ b/lib/bitmap.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -1212,3 +1213,22 @@ void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int n + } + EXPORT_SYMBOL(bitmap_copy_le); + #endif ++ ++unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags) ++{ ++ return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long), ++ flags); ++} ++EXPORT_SYMBOL(bitmap_alloc); ++ ++unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags) ++{ ++ return bitmap_alloc(nbits, flags | __GFP_ZERO); ++} ++EXPORT_SYMBOL(bitmap_zalloc); ++ ++void bitmap_free(const unsigned long *bitmap) ++{ ++ kfree(bitmap); ++} ++EXPORT_SYMBOL(bitmap_free); +diff --git a/net/core/dev.c b/net/core/dev.c +index f9f05b3df460..36d926d2d5f0 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -6896,18 +6896,9 @@ int dev_set_mtu(struct net_device *dev, int new_mtu) + if (new_mtu == dev->mtu) + return 0; + +- /* MTU must be positive, and in range */ +- if (new_mtu < 0 || new_mtu < dev->min_mtu) { +- net_err_ratelimited("%s: Invalid MTU %d requested, hw min %d\n", +- dev->name, new_mtu, dev->min_mtu); +- return -EINVAL; +- } +- +- if (dev->max_mtu > 0 && new_mtu > dev->max_mtu) { +- net_err_ratelimited("%s: Invalid MTU %d requested, hw max %d\n", +- dev->name, new_mtu, dev->max_mtu); +- return -EINVAL; +- } ++ err = dev_validate_mtu(dev, new_mtu); ++ if (err) ++ return err; + + if (!netif_device_present(dev)) + return -ENODEV; +@@ -7667,8 +7658,10 @@ int register_netdevice(struct net_device *dev) + goto err_uninit; + + ret = netdev_register_kobject(dev); +- if (ret) ++ if (ret) { ++ dev->reg_state = NETREG_UNREGISTERED; + goto err_uninit; ++ } + dev->reg_state = NETREG_REGISTERED; + + __netdev_update_features(dev); +@@ -7767,6 +7760,23 @@ int init_dummy_netdev(struct net_device *dev) + EXPORT_SYMBOL_GPL(init_dummy_netdev); + + ++int dev_validate_mtu(struct net_device *dev, int new_mtu) ++{ ++ /* MTU must be positive, and in range */ ++ if (new_mtu < 0 || new_mtu < dev->min_mtu) { ++ net_err_ratelimited("%s: Invalid MTU %d requested, hw min %d\n", ++ dev->name, new_mtu, dev->min_mtu); ++ return -EINVAL; ++ } ++ ++ if (dev->max_mtu > 0 && new_mtu > dev->max_mtu) { ++ net_err_ratelimited("%s: Invalid MTU %d requested, hw max %d\n", ++ dev->name, new_mtu, dev->max_mtu); ++ return -EINVAL; ++ } ++ return 0; ++} ++ + /** + * register_netdev - register a network device + * @dev: device to register +diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c +index dee57c5ff738..baf771d2d088 100644 +--- a/net/core/net-sysfs.c ++++ b/net/core/net-sysfs.c +@@ -911,25 +911,30 @@ static int rx_queue_add_kobject(struct net_device *dev, int index) + struct kobject *kobj = &queue->kobj; + int error = 0; + ++ /* Kobject_put later will trigger rx_queue_release call which ++ * decreases dev refcount: Take that reference here ++ */ ++ dev_hold(queue->dev); ++ + kobj->kset = dev->queues_kset; + error = kobject_init_and_add(kobj, &rx_queue_ktype, NULL, + "rx-%u", index); + if (error) +- return error; +- +- dev_hold(queue->dev); ++ goto err; + + if (dev->sysfs_rx_queue_group) { + error = sysfs_create_group(kobj, dev->sysfs_rx_queue_group); +- if (error) { +- kobject_put(kobj); +- return error; +- } ++ if (error) ++ goto err; + } + + kobject_uevent(kobj, KOBJ_ADD); + + return error; ++ ++err: ++ kobject_put(kobj); ++ return error; + } + #endif /* CONFIG_SYSFS */ + +@@ -1322,25 +1327,29 @@ static int netdev_queue_add_kobject(struct net_device *dev, int index) + struct kobject *kobj = &queue->kobj; + int error = 0; + ++ /* Kobject_put later will trigger netdev_queue_release call ++ * which decreases dev refcount: Take that reference here ++ */ ++ dev_hold(queue->dev); ++ + kobj->kset = dev->queues_kset; + error = kobject_init_and_add(kobj, &netdev_queue_ktype, NULL, + "tx-%u", index); + if (error) +- return error; +- +- dev_hold(queue->dev); ++ goto err; + + #ifdef CONFIG_BQL + error = sysfs_create_group(kobj, &dql_group); +- if (error) { +- kobject_put(kobj); +- return error; +- } ++ if (error) ++ goto err; + #endif + + kobject_uevent(kobj, KOBJ_ADD); +- + return 0; ++ ++err: ++ kobject_put(kobj); ++ return error; + } + #endif /* CONFIG_SYSFS */ + +diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c +index b598e9909fec..7c479c1ffd77 100644 +--- a/net/core/rtnetlink.c ++++ b/net/core/rtnetlink.c +@@ -2466,8 +2466,17 @@ struct net_device *rtnl_create_link(struct net *net, + dev->rtnl_link_ops = ops; + dev->rtnl_link_state = RTNL_LINK_INITIALIZING; + +- if (tb[IFLA_MTU]) +- dev->mtu = nla_get_u32(tb[IFLA_MTU]); ++ if (tb[IFLA_MTU]) { ++ u32 mtu = nla_get_u32(tb[IFLA_MTU]); ++ int err; ++ ++ err = dev_validate_mtu(dev, mtu); ++ if (err) { ++ free_netdev(dev); ++ return ERR_PTR(err); ++ } ++ dev->mtu = mtu; ++ } + if (tb[IFLA_ADDRESS]) { + memcpy(dev->dev_addr, nla_data(tb[IFLA_ADDRESS]), + nla_len(tb[IFLA_ADDRESS])); +diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c +index f1784162acc2..404dc765f2bf 100644 +--- a/net/ipv4/ip_tunnel.c ++++ b/net/ipv4/ip_tunnel.c +@@ -1202,10 +1202,8 @@ int ip_tunnel_init(struct net_device *dev) + iph->version = 4; + iph->ihl = 5; + +- if (tunnel->collect_md) { +- dev->features |= NETIF_F_NETNS_LOCAL; ++ if (tunnel->collect_md) + netif_keep_dst(dev); +- } + return 0; + } + EXPORT_SYMBOL_GPL(ip_tunnel_init); +diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c +index 06f247ca9197..434ad1e72447 100644 +--- a/net/ipv4/tcp_bbr.c ++++ b/net/ipv4/tcp_bbr.c +@@ -678,8 +678,7 @@ static void bbr_update_bw(struct sock *sk, const struct rate_sample *rs) + * bandwidth sample. Delivered is in packets and interval_us in uS and + * ratio will be <<1 for most connections. So delivered is first scaled. + */ +- bw = (u64)rs->delivered * BW_UNIT; +- do_div(bw, rs->interval_us); ++ bw = div64_long((u64)rs->delivered * BW_UNIT, rs->interval_us); + + /* If this sample is application-limited, it is likely to have a very + * low delivered count that represents application behavior rather than +diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c +index 5bc2788e6ba4..c2644405bab1 100644 +--- a/net/ipv6/ip6_tunnel.c ++++ b/net/ipv6/ip6_tunnel.c +@@ -1878,10 +1878,8 @@ static int ip6_tnl_dev_init(struct net_device *dev) + if (err) + return err; + ip6_tnl_link_config(t); +- if (t->parms.collect_md) { +- dev->features |= NETIF_F_NETNS_LOCAL; ++ if (t->parms.collect_md) + netif_keep_dst(dev); +- } + return 0; + } + +diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c +index 825b8e01f947..9a01f72d907f 100644 +--- a/net/ipv6/seg6_local.c ++++ b/net/ipv6/seg6_local.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #ifdef CONFIG_IPV6_SEG6_HMAC + #include + #endif +@@ -126,7 +127,8 @@ static bool decap_and_validate(struct sk_buff *skb, int proto) + + skb_reset_network_header(skb); + skb_reset_transport_header(skb); +- skb->encapsulation = 0; ++ if (iptunnel_pull_offloads(skb)) ++ return false; + + return true; + } +diff --git a/net/netfilter/ipset/ip_set_bitmap_gen.h b/net/netfilter/ipset/ip_set_bitmap_gen.h +index b0701f6259cc..3c0e345367a5 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_gen.h ++++ b/net/netfilter/ipset/ip_set_bitmap_gen.h +@@ -79,7 +79,7 @@ mtype_flush(struct ip_set *set) + + if (set->extensions & IPSET_EXT_DESTROY) + mtype_ext_cleanup(set); +- memset(map->members, 0, map->memsize); ++ bitmap_zero(map->members, map->elements); + set->elements = 0; + set->ext_size = 0; + } +diff --git a/net/netfilter/ipset/ip_set_bitmap_ip.c b/net/netfilter/ipset/ip_set_bitmap_ip.c +index 4783efff0bde..a4c104a4977f 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_ip.c ++++ b/net/netfilter/ipset/ip_set_bitmap_ip.c +@@ -40,7 +40,7 @@ MODULE_ALIAS("ip_set_bitmap:ip"); + + /* Type structure */ + struct bitmap_ip { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -222,7 +222,7 @@ init_map_ip(struct ip_set *set, struct bitmap_ip *map, + u32 first_ip, u32 last_ip, + u32 elements, u32 hosts, u8 netmask) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_ip = first_ip; +@@ -315,7 +315,7 @@ bitmap_ip_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + if (!map) + return -ENOMEM; + +- map->memsize = bitmap_bytes(0, elements - 1); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_ip; + if (!init_map_ip(set, map, first_ip, last_ip, + elements, hosts, netmask)) { +diff --git a/net/netfilter/ipset/ip_set_bitmap_ipmac.c b/net/netfilter/ipset/ip_set_bitmap_ipmac.c +index 9a065f672d3a..8e58e7e34981 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_ipmac.c ++++ b/net/netfilter/ipset/ip_set_bitmap_ipmac.c +@@ -46,7 +46,7 @@ enum { + + /* Type structure */ + struct bitmap_ipmac { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -299,7 +299,7 @@ static bool + init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map, + u32 first_ip, u32 last_ip, u32 elements) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_ip = first_ip; +@@ -363,7 +363,7 @@ bitmap_ipmac_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + if (!map) + return -ENOMEM; + +- map->memsize = bitmap_bytes(0, elements - 1); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_ipmac; + if (!init_map_ipmac(set, map, first_ip, last_ip, elements)) { + kfree(map); +diff --git a/net/netfilter/ipset/ip_set_bitmap_port.c b/net/netfilter/ipset/ip_set_bitmap_port.c +index 7f0c733358a4..6771b362a123 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_port.c ++++ b/net/netfilter/ipset/ip_set_bitmap_port.c +@@ -34,7 +34,7 @@ MODULE_ALIAS("ip_set_bitmap:port"); + + /* Type structure */ + struct bitmap_port { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u16 first_port; /* host byte order, included in range */ + u16 last_port; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -207,7 +207,7 @@ static bool + init_map_port(struct ip_set *set, struct bitmap_port *map, + u16 first_port, u16 last_port) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(map->elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_port = first_port; +@@ -250,7 +250,7 @@ bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + return -ENOMEM; + + map->elements = elements; +- map->memsize = bitmap_bytes(0, map->elements); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_port; + if (!init_map_port(set, map, first_port, last_port)) { + kfree(map); +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index 03b677bc0700..60f2354c1789 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -267,12 +267,12 @@ static int tcf_em_validate(struct tcf_proto *tp, + } + em->data = (unsigned long) v; + } ++ em->datalen = data_len; + } + } + + em->matchid = em_hdr->matchid; + em->flags = em_hdr->flags; +- em->datalen = data_len; + em->net = net; + + err = 0; +diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c +index a156b6dc3a72..f4fa33b84cde 100644 +--- a/net/x25/af_x25.c ++++ b/net/x25/af_x25.c +@@ -764,6 +764,10 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, + if (sk->sk_state == TCP_ESTABLISHED) + goto out; + ++ rc = -EALREADY; /* Do nothing if call is already in progress */ ++ if (sk->sk_state == TCP_SYN_SENT) ++ goto out; ++ + sk->sk_state = TCP_CLOSE; + sock->state = SS_UNCONNECTED; + +@@ -810,7 +814,7 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, + /* Now the loop */ + rc = -EINPROGRESS; + if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) +- goto out_put_neigh; ++ goto out; + + rc = x25_wait_for_connection_establishment(sk); + if (rc) +diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c +index 16e086dcc567..a4888e955466 100644 +--- a/scripts/recordmcount.c ++++ b/scripts/recordmcount.c +@@ -53,6 +53,10 @@ + #define R_AARCH64_ABS64 257 + #endif + ++#define R_ARM_PC24 1 ++#define R_ARM_THM_CALL 10 ++#define R_ARM_CALL 28 ++ + static int fd_map; /* File descriptor for file being modified. */ + static int mmap_failed; /* Boolean flag. */ + static char gpfx; /* prefix for global symbol name (sometimes '_') */ +@@ -428,6 +432,18 @@ is_mcounted_section_name(char const *const txtname) + #define RECORD_MCOUNT_64 + #include "recordmcount.h" + ++static int arm_is_fake_mcount(Elf32_Rel const *rp) ++{ ++ switch (ELF32_R_TYPE(w(rp->r_info))) { ++ case R_ARM_THM_CALL: ++ case R_ARM_CALL: ++ case R_ARM_PC24: ++ return 0; ++ } ++ ++ return 1; ++} ++ + /* 64-bit EM_MIPS has weird ELF64_Rela.r_info. + * http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf + * We interpret Table 29 Relocation Operation (Elf64_Rel, Elf64_Rela) [p.40] +@@ -529,6 +545,7 @@ do_file(char const *const fname) + altmcount = "__gnu_mcount_nc"; + make_nop = make_nop_arm; + rel_type_nop = R_ARM_NONE; ++ is_fake_mcount32 = arm_is_fake_mcount; + break; + case EM_AARCH64: + reltype = R_AARCH64_ABS64; diff --git a/patch/kernel/odroidxu4-legacy/patch-4.14.169-170.patch b/patch/kernel/odroidxu4-legacy/patch-4.14.169-170.patch new file mode 100644 index 0000000000..5f3c3d21e5 --- /dev/null +++ b/patch/kernel/odroidxu4-legacy/patch-4.14.169-170.patch @@ -0,0 +1,3128 @@ +diff --git a/Documentation/ABI/testing/sysfs-class-devfreq b/Documentation/ABI/testing/sysfs-class-devfreq +index ee39acacf6f8..335595a79866 100644 +--- a/Documentation/ABI/testing/sysfs-class-devfreq ++++ b/Documentation/ABI/testing/sysfs-class-devfreq +@@ -7,6 +7,13 @@ Description: + The name of devfreq object denoted as ... is same as the + name of device using devfreq. + ++What: /sys/class/devfreq/.../name ++Date: November 2019 ++Contact: Chanwoo Choi ++Description: ++ The /sys/class/devfreq/.../name shows the name of device ++ of the corresponding devfreq object. ++ + What: /sys/class/devfreq/.../governor + Date: September 2011 + Contact: MyungJoo Ham +diff --git a/Makefile b/Makefile +index 795d93bfe156..b614291199f8 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 14 +-SUBLEVEL = 169 ++SUBLEVEL = 170 + EXTRAVERSION = + NAME = Petit Gorille + +diff --git a/arch/arc/plat-eznps/Kconfig b/arch/arc/plat-eznps/Kconfig +index 8eff057efcae..ce908e2c5282 100644 +--- a/arch/arc/plat-eznps/Kconfig ++++ b/arch/arc/plat-eznps/Kconfig +@@ -7,7 +7,7 @@ + menuconfig ARC_PLAT_EZNPS + bool "\"EZchip\" ARC dev platform" + select CPU_BIG_ENDIAN +- select CLKSRC_NPS ++ select CLKSRC_NPS if !PHYS_ADDR_T_64BIT + select EZNPS_GIC + select EZCHIP_NPS_MANAGEMENT_ENET if ETHERNET + help +diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi b/arch/arm/boot/dts/am335x-boneblack-common.dtsi +index 325daae40278..485c27f039f5 100644 +--- a/arch/arm/boot/dts/am335x-boneblack-common.dtsi ++++ b/arch/arm/boot/dts/am335x-boneblack-common.dtsi +@@ -131,6 +131,11 @@ + }; + + / { ++ memory@80000000 { ++ device_type = "memory"; ++ reg = <0x80000000 0x20000000>; /* 512 MB */ ++ }; ++ + clk_mcasp0_fixed: clk_mcasp0_fixed { + #clock-cells = <0>; + compatible = "fixed-clock"; +diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi +index 49aeecd312b4..d578a9f7e1a0 100644 +--- a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi ++++ b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi +@@ -32,6 +32,27 @@ + reg = <0x0 0x80000000 0x0 0x80000000>; + }; + ++ main_12v0: fixedregulator-main_12v0 { ++ /* main supply */ ++ compatible = "regulator-fixed"; ++ regulator-name = "main_12v0"; ++ regulator-min-microvolt = <12000000>; ++ regulator-max-microvolt = <12000000>; ++ regulator-always-on; ++ regulator-boot-on; ++ }; ++ ++ evm_5v0: fixedregulator-evm_5v0 { ++ /* Output of TPS54531D */ ++ compatible = "regulator-fixed"; ++ regulator-name = "evm_5v0"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ vin-supply = <&main_12v0>; ++ regulator-always-on; ++ regulator-boot-on; ++ }; ++ + vdd_3v3: fixedregulator-vdd_3v3 { + compatible = "regulator-fixed"; + regulator-name = "vdd_3v3"; +diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts +index 716a205c6dbb..1fed3231f5c1 100644 +--- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts ++++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts +@@ -90,7 +90,7 @@ + initial-mode = <1>; /* initialize in HUB mode */ + disabled-ports = <1>; + intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */ +- reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */ ++ reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */ + connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */ + refclk-frequency = <19200000>; + }; +diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S +index 82a942894fc0..83e463c05dcd 100644 +--- a/arch/arm/kernel/hyp-stub.S ++++ b/arch/arm/kernel/hyp-stub.S +@@ -159,10 +159,9 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE + #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER) + @ make CNTP_* and CNTPCT accessible from PL1 + mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 +- lsr r7, #16 +- and r7, #0xf +- cmp r7, #1 +- bne 1f ++ ubfx r7, r7, #16, #4 ++ teq r7, #0 ++ beq 1f + mrc p15, 4, r7, c14, c1, 0 @ CNTHCTL + orr r7, r7, #3 @ PL1PCEN | PL1PCTEN + mcr p15, 4, r7, c14, c1, 0 @ CNTHCTL +diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile +index 1f012c506434..cd3414898d10 100644 +--- a/arch/arm64/boot/Makefile ++++ b/arch/arm64/boot/Makefile +@@ -16,7 +16,7 @@ + + OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S + +-targets := Image Image.gz ++targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo + + $(obj)/Image: vmlinux FORCE + $(call if_changed,objcopy) +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi +index e1a961f05dcd..baa0c503e741 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi +@@ -63,6 +63,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy0: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi +index c288f3c6c637..93095600e808 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi +@@ -60,6 +60,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy6: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi +index 94f3e7175012..ff4bd38f0645 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi +@@ -63,6 +63,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy1: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi +index 94a76982d214..1fa38ed6f59e 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi +@@ -60,6 +60,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy7: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi +index b5ff5f71c6b8..a8cc9780c0c4 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy0: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi +index ee44182c6348..8b8bd70c9382 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy1: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi +index f05f0d775039..619c880b54d8 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe5000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy2: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi +index a9114ec51075..d7ebb73a400d 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe7000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy3: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi +index 44dd00ac7367..b151d696a069 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe9000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy4: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi +index 5b1b84b58602..adc0ae0013a3 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi +@@ -59,6 +59,7 @@ fman@400000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xeb000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy5: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi +index 0e1daaef9e74..435047e0e250 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi +@@ -60,6 +60,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy14: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi +index 68c5ef779266..c098657cca0a 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi +@@ -60,6 +60,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xf3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy15: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi +index 605363cc1117..9d06824815f3 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe1000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy8: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi +index 1955dfa13634..70e947730c4b 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe3000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy9: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi +index 2c1476454ee0..ad96e6529595 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe5000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy10: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi +index b8b541ff5fb0..034bc4b71f7a 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe7000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy11: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi +index 4b2cfddd1b15..93ca23d82b39 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xe9000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy12: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi +index 0a52ddf7cc17..23b3117a2fd2 100644 +--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi ++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi +@@ -59,6 +59,7 @@ fman@500000 { + #size-cells = <0>; + compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; + reg = <0xeb000 0x1000>; ++ fsl,erratum-a011043; /* must ignore read errors */ + + pcsphy13: ethernet-phy@0 { + reg = <0x0>; +diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +index 2dae1b3c42fc..0ec30b2384c0 100644 +--- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c ++++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +@@ -1107,7 +1107,7 @@ static struct dentry *rdt_mount(struct file_system_type *fs_type, + + if (rdt_mon_capable) { + ret = mongroup_create_dir(rdtgroup_default.kn, +- NULL, "mon_groups", ++ &rdtgroup_default, "mon_groups", + &kn_mongrp); + if (ret) { + dentry = ERR_PTR(ret); +@@ -1260,7 +1260,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp) + list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) { + free_rmid(sentry->mon.rmid); + list_del(&sentry->mon.crdtgrp_list); +- kfree(sentry); ++ ++ if (atomic_read(&sentry->waitcount) != 0) ++ sentry->flags = RDT_DELETED; ++ else ++ kfree(sentry); + } + } + +@@ -1294,7 +1298,11 @@ static void rmdir_all_sub(void) + + kernfs_remove(rdtgrp->kn); + list_del(&rdtgrp->rdtgroup_list); +- kfree(rdtgrp); ++ ++ if (atomic_read(&rdtgrp->waitcount) != 0) ++ rdtgrp->flags = RDT_DELETED; ++ else ++ kfree(rdtgrp); + } + /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */ + update_closid_rmid(cpu_online_mask, &rdtgroup_default); +@@ -1491,7 +1499,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn, + /* + * Create the mon_data directory first. + */ +- ret = mongroup_create_dir(parent_kn, NULL, "mon_data", &kn); ++ ret = mongroup_create_dir(parent_kn, prgrp, "mon_data", &kn); + if (ret) + return ret; + +@@ -1525,7 +1533,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, + uint files = 0; + int ret; + +- prdtgrp = rdtgroup_kn_lock_live(prgrp_kn); ++ prdtgrp = rdtgroup_kn_lock_live(parent_kn); + if (!prdtgrp) { + ret = -ENODEV; + goto out_unlock; +@@ -1581,7 +1589,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, + kernfs_activate(kn); + + /* +- * The caller unlocks the prgrp_kn upon success. ++ * The caller unlocks the parent_kn upon success. + */ + return 0; + +@@ -1592,7 +1600,7 @@ out_destroy: + out_free_rgrp: + kfree(rdtgrp); + out_unlock: +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -1630,7 +1638,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn, + */ + list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list); + +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -1667,7 +1675,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, + * Create an empty mon_groups directory to hold the subset + * of tasks and cpus to monitor. + */ +- ret = mongroup_create_dir(kn, NULL, "mon_groups", NULL); ++ ret = mongroup_create_dir(kn, rdtgrp, "mon_groups", NULL); + if (ret) + goto out_id_free; + } +@@ -1680,7 +1688,7 @@ out_id_free: + out_common_fail: + mkdir_rdt_prepare_clean(rdtgrp); + out_unlock: +- rdtgroup_kn_unlock(prgrp_kn); ++ rdtgroup_kn_unlock(parent_kn); + return ret; + } + +@@ -1792,11 +1800,6 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp, + closid_free(rdtgrp->closid); + free_rmid(rdtgrp->mon.rmid); + +- /* +- * Free all the child monitor group rmids. +- */ +- free_all_child_rdtgrp(rdtgrp); +- + list_del(&rdtgrp->rdtgroup_list); + + /* +@@ -1806,6 +1809,11 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp, + kernfs_get(kn); + kernfs_remove(rdtgrp->kn); + ++ /* ++ * Free all the child monitor group rmids. ++ */ ++ free_all_child_rdtgrp(rdtgrp); ++ + return 0; + } + +diff --git a/crypto/af_alg.c b/crypto/af_alg.c +index 422bba808f73..0679c35adf55 100644 +--- a/crypto/af_alg.c ++++ b/crypto/af_alg.c +@@ -139,11 +139,13 @@ void af_alg_release_parent(struct sock *sk) + sk = ask->parent; + ask = alg_sk(sk); + +- lock_sock(sk); ++ local_bh_disable(); ++ bh_lock_sock(sk); + ask->nokey_refcnt -= nokey; + if (!last) + last = !--ask->refcnt; +- release_sock(sk); ++ bh_unlock_sock(sk); ++ local_bh_enable(); + + if (last) + sock_put(sk); +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index a5718c0a3dc4..1348541da463 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -505,11 +505,12 @@ err: + + static void __exit pcrypt_exit(void) + { ++ crypto_unregister_template(&pcrypt_tmpl); ++ + pcrypt_fini_padata(&pencrypt); + pcrypt_fini_padata(&pdecrypt); + + kset_unregister(pcrypt_kset); +- crypto_unregister_template(&pcrypt_tmpl); + } + + module_init(pcrypt_init); +diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c +index ce47eb17901d..a106d15f6def 100644 +--- a/drivers/atm/eni.c ++++ b/drivers/atm/eni.c +@@ -372,7 +372,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + here = (eni_vcc->descr+skip) & (eni_vcc->words-1); + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci + << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1); + if (!eff) size += skip; +@@ -445,7 +445,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + if (size != eff) { + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | + (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + if (!j || j > 2*RX_DMA_BUF) { + printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n"); +diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c +index 67549ce88cc9..774748497ace 100644 +--- a/drivers/char/ttyprintk.c ++++ b/drivers/char/ttyprintk.c +@@ -18,10 +18,11 @@ + #include + #include + #include ++#include + + struct ttyprintk_port { + struct tty_port port; +- struct mutex port_write_mutex; ++ spinlock_t spinlock; + }; + + static struct ttyprintk_port tpk_port; +@@ -100,11 +101,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp) + static void tpk_close(struct tty_struct *tty, struct file *filp) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + /* flush tpk_printk buffer */ + tpk_printk(NULL, 0); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + tty_port_close(&tpkp->port, tty, filp); + } +@@ -116,13 +118,14 @@ static int tpk_write(struct tty_struct *tty, + const unsigned char *buf, int count) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + int ret; + + + /* exclusive use of tpk_printk within this tty */ +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + ret = tpk_printk(buf, count); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + return ret; + } +@@ -172,7 +175,7 @@ static int __init ttyprintk_init(void) + { + int ret = -ENOMEM; + +- mutex_init(&tpk_port.port_write_mutex); ++ spin_lock_init(&tpk_port.spinlock); + + ttyprintk_driver = tty_alloc_driver(1, + TTY_DRIVER_RESET_TERMIOS | +diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c +index d083b860f083..10689d8cd386 100644 +--- a/drivers/clk/mmp/clk-of-mmp2.c ++++ b/drivers/clk/mmp/clk-of-mmp2.c +@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock); + static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; + + static DEFINE_SPINLOCK(timer_lock); +-static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"}; ++static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; + + static DEFINE_SPINLOCK(reset_lock); + +diff --git a/drivers/crypto/chelsio/chcr_algo.c b/drivers/crypto/chelsio/chcr_algo.c +index bb7b59fc5c08..8d39f3a07bf8 100644 +--- a/drivers/crypto/chelsio/chcr_algo.c ++++ b/drivers/crypto/chelsio/chcr_algo.c +@@ -2693,9 +2693,6 @@ static int chcr_gcm_setauthsize(struct crypto_aead *tfm, unsigned int authsize) + aeadctx->mayverify = VERIFY_SW; + break; + default: +- +- crypto_tfm_set_flags((struct crypto_tfm *) tfm, +- CRYPTO_TFM_RES_BAD_KEY_LEN); + return -EINVAL; + } + return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); +@@ -2720,8 +2717,6 @@ static int chcr_4106_4309_setauthsize(struct crypto_aead *tfm, + aeadctx->mayverify = VERIFY_HW; + break; + default: +- crypto_tfm_set_flags((struct crypto_tfm *)tfm, +- CRYPTO_TFM_RES_BAD_KEY_LEN); + return -EINVAL; + } + return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); +@@ -2762,8 +2757,6 @@ static int chcr_ccm_setauthsize(struct crypto_aead *tfm, + aeadctx->mayverify = VERIFY_HW; + break; + default: +- crypto_tfm_set_flags((struct crypto_tfm *)tfm, +- CRYPTO_TFM_RES_BAD_KEY_LEN); + return -EINVAL; + } + return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); +@@ -2790,8 +2783,7 @@ static int chcr_ccm_common_setkey(struct crypto_aead *aead, + ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; + mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256; + } else { +- crypto_tfm_set_flags((struct crypto_tfm *)aead, +- CRYPTO_TFM_RES_BAD_KEY_LEN); ++ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); + aeadctx->enckey_len = 0; + return -EINVAL; + } +@@ -2831,8 +2823,7 @@ static int chcr_aead_rfc4309_setkey(struct crypto_aead *aead, const u8 *key, + int error; + + if (keylen < 3) { +- crypto_tfm_set_flags((struct crypto_tfm *)aead, +- CRYPTO_TFM_RES_BAD_KEY_LEN); ++ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); + aeadctx->enckey_len = 0; + return -EINVAL; + } +@@ -2883,8 +2874,7 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key, + } else if (keylen == AES_KEYSIZE_256) { + ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; + } else { +- crypto_tfm_set_flags((struct crypto_tfm *)aead, +- CRYPTO_TFM_RES_BAD_KEY_LEN); ++ crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); + pr_err("GCM: Invalid key length %d\n", keylen); + ret = -EINVAL; + goto out; +diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c +index ad18de955b6c..58ec3abfd321 100644 +--- a/drivers/devfreq/devfreq.c ++++ b/drivers/devfreq/devfreq.c +@@ -902,6 +902,14 @@ err_out: + } + EXPORT_SYMBOL(devfreq_remove_governor); + ++static ssize_t name_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct devfreq *devfreq = to_devfreq(dev); ++ return sprintf(buf, "%s\n", dev_name(devfreq->dev.parent)); ++} ++static DEVICE_ATTR_RO(name); ++ + static ssize_t governor_show(struct device *dev, + struct device_attribute *attr, char *buf) + { +@@ -1200,6 +1208,7 @@ static ssize_t trans_stat_show(struct device *dev, + static DEVICE_ATTR_RO(trans_stat); + + static struct attribute *devfreq_attrs[] = { ++ &dev_attr_name.attr, + &dev_attr_governor.attr, + &dev_attr_available_governors.attr, + &dev_attr_cur_freq.attr, +diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig +index 2357d2f73c1a..8d2ab77c6581 100644 +--- a/drivers/gpio/Kconfig ++++ b/drivers/gpio/Kconfig +@@ -990,6 +990,7 @@ config GPIO_LP87565 + config GPIO_MAX77620 + tristate "GPIO support for PMIC MAX77620 and MAX20024" + depends on MFD_MAX77620 ++ select GPIOLIB_IRQCHIP + help + GPIO driver for MAX77620 and MAX20024 PMIC from Maxim Semiconductor. + MAX77620 PMIC has 8 pins that can be configured as GPIOs. The +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index 1e2e6e58256a..9d372fa7c298 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -1024,6 +1024,7 @@ + #define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10 + #define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3 + #define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3 ++#define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968 + #define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710 + + #define USB_VENDOR_ID_TEXAS_INSTRUMENTS 0x2047 +diff --git a/drivers/hid/hid-ite.c b/drivers/hid/hid-ite.c +index 98b059d79bc8..2ce1eb0c9212 100644 +--- a/drivers/hid/hid-ite.c ++++ b/drivers/hid/hid-ite.c +@@ -43,6 +43,9 @@ static int ite_event(struct hid_device *hdev, struct hid_field *field, + static const struct hid_device_id ite_devices[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, + { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, ++ /* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */ ++ { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, ++ USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, + { } + }; + MODULE_DEVICE_TABLE(hid, ite_devices); +diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c b/drivers/media/radio/si470x/radio-si470x-i2c.c +index b60fb6ed5aeb..527535614342 100644 +--- a/drivers/media/radio/si470x/radio-si470x-i2c.c ++++ b/drivers/media/radio/si470x/radio-si470x-i2c.c +@@ -453,10 +453,10 @@ static int si470x_i2c_remove(struct i2c_client *client) + + free_irq(client->irq, radio); + video_unregister_device(&radio->videodev); +- kfree(radio); + + v4l2_ctrl_handler_free(&radio->hdl); + v4l2_device_unregister(&radio->v4l2_dev); ++ kfree(radio); + return 0; + } + +diff --git a/drivers/media/usb/dvb-usb/af9005.c b/drivers/media/usb/dvb-usb/af9005.c +index c047a0bdf91f..66990a193bc5 100644 +--- a/drivers/media/usb/dvb-usb/af9005.c ++++ b/drivers/media/usb/dvb-usb/af9005.c +@@ -563,7 +563,7 @@ static int af9005_boot_packet(struct usb_device *udev, int type, u8 *reply, + u8 *buf, int size) + { + u16 checksum; +- int act_len, i, ret; ++ int act_len = 0, i, ret; + + memset(buf, 0, size); + buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff); +diff --git a/drivers/media/usb/dvb-usb/digitv.c b/drivers/media/usb/dvb-usb/digitv.c +index 475a3c0cdee7..20d33f0544ed 100644 +--- a/drivers/media/usb/dvb-usb/digitv.c ++++ b/drivers/media/usb/dvb-usb/digitv.c +@@ -233,18 +233,22 @@ static struct rc_map_table rc_map_digitv_table[] = { + + static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + { +- int i; ++ int ret, i; + u8 key[5]; + u8 b[4] = { 0 }; + + *event = 0; + *state = REMOTE_NO_KEY_PRESSED; + +- digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4); ++ ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4); ++ if (ret) ++ return ret; + + /* Tell the device we've read the remote. Not sure how necessary + this is, but the Nebula SDK does it. */ +- digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0); ++ ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0); ++ if (ret) ++ return ret; + + /* if something is inside the buffer, simulate key press */ + if (key[1] != 0) +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-urb.c b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +index c1b4e94a37f8..2aabf90d8697 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-urb.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +@@ -12,7 +12,7 @@ + int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, + u16 rlen, int delay_ms) + { +- int actlen,ret = -ENOMEM; ++ int actlen = 0, ret = -ENOMEM; + + if (!d || wbuf == NULL || wlen == 0) + return -EINVAL; +diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c +index 0f141762abf1..87582be4a39d 100644 +--- a/drivers/media/usb/gspca/gspca.c ++++ b/drivers/media/usb/gspca/gspca.c +@@ -2038,7 +2038,7 @@ int gspca_dev_probe2(struct usb_interface *intf, + pr_err("couldn't kzalloc gspca struct\n"); + return -ENOMEM; + } +- gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); ++ gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL); + if (!gspca_dev->usb_buf) { + pr_err("out of memory\n"); + ret = -ENOMEM; +diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c +index 94ad2fdd6ef0..05440b727261 100644 +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -137,7 +137,7 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) + + /* Force link status for IMP port */ + reg = core_readl(priv, offset); +- reg |= (MII_SW_OR | LINK_STS); ++ reg |= (MII_SW_OR | LINK_STS | GMII_SPEED_UP_2G); + core_writel(priv, reg, offset); + + /* Enable Broadcast, Multicast, Unicast forwarding to IMP port */ +diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c +index a1125d10c825..8b9a0ce1d29f 100644 +--- a/drivers/net/ethernet/broadcom/b44.c ++++ b/drivers/net/ethernet/broadcom/b44.c +@@ -1521,8 +1521,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + int ethaddr_bytes = ETH_ALEN; + + memset(ppattern + offset, 0xff, magicsync); +- for (j = 0; j < magicsync; j++) +- set_bit(len++, (unsigned long *) pmask); ++ for (j = 0; j < magicsync; j++) { ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; ++ } + + for (j = 0; j < B44_MAX_PATTERNS; j++) { + if ((B44_PATTERN_SIZE - len) >= ETH_ALEN) +@@ -1534,7 +1536,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + for (k = 0; k< ethaddr_bytes; k++) { + ppattern[offset + magicsync + + (j * ETH_ALEN) + k] = macaddr[k]; +- set_bit(len++, (unsigned long *) pmask); ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; + } + } + return len - 1; +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index 38ee7692132c..7461e7b9eaae 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -7402,11 +7402,23 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1, + struct flow_keys *keys1 = &f1->fkeys; + struct flow_keys *keys2 = &f2->fkeys; + +- if (keys1->addrs.v4addrs.src == keys2->addrs.v4addrs.src && +- keys1->addrs.v4addrs.dst == keys2->addrs.v4addrs.dst && +- keys1->ports.ports == keys2->ports.ports && +- keys1->basic.ip_proto == keys2->basic.ip_proto && +- keys1->basic.n_proto == keys2->basic.n_proto && ++ if (keys1->basic.n_proto != keys2->basic.n_proto || ++ keys1->basic.ip_proto != keys2->basic.ip_proto) ++ return false; ++ ++ if (keys1->basic.n_proto == htons(ETH_P_IP)) { ++ if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src || ++ keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst) ++ return false; ++ } else { ++ if (memcmp(&keys1->addrs.v6addrs.src, &keys2->addrs.v6addrs.src, ++ sizeof(keys1->addrs.v6addrs.src)) || ++ memcmp(&keys1->addrs.v6addrs.dst, &keys2->addrs.v6addrs.dst, ++ sizeof(keys1->addrs.v6addrs.dst))) ++ return false; ++ } ++ ++ if (keys1->ports.ports == keys2->ports.ports && + keys1->control.flags == keys2->control.flags && + ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) && + ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr)) +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +index 9e5cd18e7358..8bd90ad15607 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +@@ -66,8 +66,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos) + static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = seq_tab_get_idx(seq->private, *pos + 1); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +index f7ef8871dd0b..67aa3c997417 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +@@ -682,8 +682,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos) + static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = l2t_get_idx(seq, *pos); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c +index 75ce773c21a6..b33650a897f1 100644 +--- a/drivers/net/ethernet/freescale/fman/fman_memac.c ++++ b/drivers/net/ethernet/freescale/fman/fman_memac.c +@@ -110,7 +110,7 @@ do { \ + /* Interface Mode Register (IF_MODE) */ + + #define IF_MODE_MASK 0x00000003 /* 30-31 Mask on i/f mode bits */ +-#define IF_MODE_XGMII 0x00000000 /* 30-31 XGMII (10G) interface */ ++#define IF_MODE_10G 0x00000000 /* 30-31 10G interface */ + #define IF_MODE_GMII 0x00000002 /* 30-31 GMII (1G) interface */ + #define IF_MODE_RGMII 0x00000004 + #define IF_MODE_RGMII_AUTO 0x00008000 +@@ -439,7 +439,7 @@ static int init(struct memac_regs __iomem *regs, struct memac_cfg *cfg, + tmp = 0; + switch (phy_if) { + case PHY_INTERFACE_MODE_XGMII: +- tmp |= IF_MODE_XGMII; ++ tmp |= IF_MODE_10G; + break; + default: + tmp |= IF_MODE_GMII; +diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c b/drivers/net/ethernet/freescale/xgmac_mdio.c +index e03b30c60dcf..c82c85ef5fb3 100644 +--- a/drivers/net/ethernet/freescale/xgmac_mdio.c ++++ b/drivers/net/ethernet/freescale/xgmac_mdio.c +@@ -49,6 +49,7 @@ struct tgec_mdio_controller { + struct mdio_fsl_priv { + struct tgec_mdio_controller __iomem *mdio_base; + bool is_little_endian; ++ bool has_a011043; + }; + + static u32 xgmac_read32(void __iomem *regs, +@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) + return ret; + + /* Return all Fs if nothing was there */ +- if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) { ++ if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && ++ !priv->has_a011043) { + dev_err(&bus->dev, + "Error while reading PHY%d reg at %d.%hhu\n", + phy_id, dev_addr, regnum); +@@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) + priv->is_little_endian = of_property_read_bool(pdev->dev.of_node, + "little-endian"); + ++ priv->has_a011043 = of_property_read_bool(pdev->dev.of_node, ++ "fsl,erratum-a011043"); ++ + ret = of_mdiobus_register(bus, np); + if (ret) { + dev_err(&pdev->dev, "cannot register MDIO bus\n"); +diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c +index c37cc8bccf47..158c277ec353 100644 +--- a/drivers/net/ethernet/intel/igb/e1000_82575.c ++++ b/drivers/net/ethernet/intel/igb/e1000_82575.c +@@ -562,7 +562,7 @@ static s32 igb_set_sfp_media_type_82575(struct e1000_hw *hw) + dev_spec->module_plugged = true; + if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) { + hw->phy.media_type = e1000_media_type_internal_serdes; +- } else if (eth_flags->e100_base_fx) { ++ } else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { + dev_spec->sgmii_active = true; + hw->phy.media_type = e1000_media_type_internal_serdes; + } else if (eth_flags->e1000_base_t) { +@@ -689,14 +689,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw) + break; + } + +- /* do not change link mode for 100BaseFX */ +- if (dev_spec->eth_flags.e100_base_fx) +- break; +- + /* change current link mode setting */ + ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK; + +- if (hw->phy.media_type == e1000_media_type_copper) ++ if (dev_spec->sgmii_active) + ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII; + else + ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES; +diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c +index d06a8db514d4..82028ce355fb 100644 +--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c ++++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c +@@ -201,7 +201,7 @@ static int igb_get_link_ksettings(struct net_device *netdev, + advertising &= ~ADVERTISED_1000baseKX_Full; + } + } +- if (eth_flags->e100_base_fx) { ++ if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { + supported |= SUPPORTED_100baseT_Full; + advertising |= ADVERTISED_100baseT_Full; + } +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +index e4c1e6345edd..ba184287e11f 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +@@ -5131,7 +5131,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + struct ixgbe_hw *hw = &adapter->hw; + struct hlist_node *node2; + struct ixgbe_fdir_filter *filter; +- u64 action; ++ u8 queue; + + spin_lock(&adapter->fdir_perfect_lock); + +@@ -5140,17 +5140,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + + hlist_for_each_entry_safe(filter, node2, + &adapter->fdir_filter_list, fdir_node) { +- action = filter->action; +- if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) +- action = +- (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; ++ if (filter->action == IXGBE_FDIR_DROP_QUEUE) { ++ queue = IXGBE_FDIR_DROP_QUEUE; ++ } else { ++ u32 ring = ethtool_get_flow_spec_ring(filter->action); ++ u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); ++ ++ if (!vf && (ring >= adapter->num_rx_queues)) { ++ e_err(drv, "FDIR restore failed without VF, ring: %u\n", ++ ring); ++ continue; ++ } else if (vf && ++ ((vf > adapter->num_vfs) || ++ ring >= adapter->num_rx_queues_per_pool)) { ++ e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", ++ vf, ring); ++ continue; ++ } ++ ++ /* Map the ring onto the absolute queue index */ ++ if (!vf) ++ queue = adapter->rx_ring[ring]->reg_idx; ++ else ++ queue = ((vf - 1) * ++ adapter->num_rx_queues_per_pool) + ring; ++ } + + ixgbe_fdir_write_perfect_filter_82599(hw, +- &filter->filter, +- filter->sw_idx, +- (action == IXGBE_FDIR_DROP_QUEUE) ? +- IXGBE_FDIR_DROP_QUEUE : +- adapter->rx_ring[action]->reg_idx); ++ &filter->filter, filter->sw_idx, queue); + } + + spin_unlock(&adapter->fdir_perfect_lock); +diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +index e238f6e85ab6..a7708e14aa5c 100644 +--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c ++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +@@ -1858,11 +1858,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev) + struct ixgbe_hw *hw = &adapter->hw; + int count = 0; + +- if ((netdev_uc_count(netdev)) > 10) { +- pr_err("Too many unicast filters - No Space\n"); +- return -ENOSPC; +- } +- + if (!netdev_uc_empty(netdev)) { + struct netdev_hw_addr *ha; + +diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c +index a051dddcbd76..254e6dbc4c6a 100644 +--- a/drivers/net/ethernet/natsemi/sonic.c ++++ b/drivers/net/ethernet/natsemi/sonic.c +@@ -50,6 +50,8 @@ static int sonic_open(struct net_device *dev) + if (sonic_debug > 2) + printk("sonic_open: initializing sonic driver.\n"); + ++ spin_lock_init(&lp->lock); ++ + for (i = 0; i < SONIC_NUM_RRS; i++) { + struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (skb == NULL) { +@@ -101,6 +103,24 @@ static int sonic_open(struct net_device *dev) + return 0; + } + ++/* Wait for the SONIC to become idle. */ ++static void sonic_quiesce(struct net_device *dev, u16 mask) ++{ ++ struct sonic_local * __maybe_unused lp = netdev_priv(dev); ++ int i; ++ u16 bits; ++ ++ for (i = 0; i < 1000; ++i) { ++ bits = SONIC_READ(SONIC_CMD) & mask; ++ if (!bits) ++ return; ++ if (irqs_disabled() || in_interrupt()) ++ udelay(20); ++ else ++ usleep_range(100, 200); ++ } ++ WARN_ONCE(1, "command deadline expired! 0x%04x\n", bits); ++} + + /* + * Close the SONIC device +@@ -118,6 +138,9 @@ static int sonic_close(struct net_device *dev) + /* + * stop the SONIC, disable interrupts + */ ++ SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); ++ + SONIC_WRITE(SONIC_IMR, 0); + SONIC_WRITE(SONIC_ISR, 0x7fff); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); +@@ -157,6 +180,9 @@ static void sonic_tx_timeout(struct net_device *dev) + * put the Sonic into software-reset mode and + * disable all interrupts before releasing DMA buffers + */ ++ SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); ++ + SONIC_WRITE(SONIC_IMR, 0); + SONIC_WRITE(SONIC_ISR, 0x7fff); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); +@@ -194,8 +220,6 @@ static void sonic_tx_timeout(struct net_device *dev) + * wake the tx queue + * Concurrently with all of this, the SONIC is potentially writing to + * the status flags of the TDs. +- * Until some mutual exclusion is added, this code will not work with SMP. However, +- * MIPS Jazz machines and m68k Macs were all uni-processor machines. + */ + + static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) +@@ -203,7 +227,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + struct sonic_local *lp = netdev_priv(dev); + dma_addr_t laddr; + int length; +- int entry = lp->next_tx; ++ int entry; ++ unsigned long flags; + + if (sonic_debug > 2) + printk("sonic_send_packet: skb=%p, dev=%p\n", skb, dev); +@@ -226,6 +251,10 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + return NETDEV_TX_OK; + } + ++ spin_lock_irqsave(&lp->lock, flags); ++ ++ entry = lp->next_tx; ++ + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ + sonic_tda_put(dev, entry, SONIC_TD_FRAG_COUNT, 1); /* single fragment */ + sonic_tda_put(dev, entry, SONIC_TD_PKTSIZE, length); /* length of packet */ +@@ -235,10 +264,6 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + sonic_tda_put(dev, entry, SONIC_TD_LINK, + sonic_tda_get(dev, entry, SONIC_TD_LINK) | SONIC_EOL); + +- /* +- * Must set tx_skb[entry] only after clearing status, and +- * before clearing EOL and before stopping queue +- */ + wmb(); + lp->tx_len[entry] = length; + lp->tx_laddr[entry] = laddr; +@@ -263,6 +288,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + + SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP); + ++ spin_unlock_irqrestore(&lp->lock, flags); ++ + return NETDEV_TX_OK; + } + +@@ -275,9 +302,21 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + struct net_device *dev = dev_id; + struct sonic_local *lp = netdev_priv(dev); + int status; ++ unsigned long flags; ++ ++ /* The lock has two purposes. Firstly, it synchronizes sonic_interrupt() ++ * with sonic_send_packet() so that the two functions can share state. ++ * Secondly, it makes sonic_interrupt() re-entrant, as that is required ++ * by macsonic which must use two IRQs with different priority levels. ++ */ ++ spin_lock_irqsave(&lp->lock, flags); ++ ++ status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; ++ if (!status) { ++ spin_unlock_irqrestore(&lp->lock, flags); + +- if (!(status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)) + return IRQ_NONE; ++ } + + do { + if (status & SONIC_INT_PKTRX) { +@@ -292,11 +331,12 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + int td_status; + int freed_some = 0; + +- /* At this point, cur_tx is the index of a TD that is one of: +- * unallocated/freed (status set & tx_skb[entry] clear) +- * allocated and sent (status set & tx_skb[entry] set ) +- * allocated and not yet sent (status clear & tx_skb[entry] set ) +- * still being allocated by sonic_send_packet (status clear & tx_skb[entry] clear) ++ /* The state of a Transmit Descriptor may be inferred ++ * from { tx_skb[entry], td_status } as follows. ++ * { clear, clear } => the TD has never been used ++ * { set, clear } => the TD was handed to SONIC ++ * { set, set } => the TD was handed back ++ * { clear, set } => the TD is available for re-use + */ + + if (sonic_debug > 2) +@@ -398,10 +438,30 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + /* load CAM done */ + if (status & SONIC_INT_LCD) + SONIC_WRITE(SONIC_ISR, SONIC_INT_LCD); /* clear the interrupt */ +- } while((status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)); ++ ++ status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; ++ } while (status); ++ ++ spin_unlock_irqrestore(&lp->lock, flags); ++ + return IRQ_HANDLED; + } + ++/* Return the array index corresponding to a given Receive Buffer pointer. */ ++static int index_from_addr(struct sonic_local *lp, dma_addr_t addr, ++ unsigned int last) ++{ ++ unsigned int i = last; ++ ++ do { ++ i = (i + 1) & SONIC_RRS_MASK; ++ if (addr == lp->rx_laddr[i]) ++ return i; ++ } while (i != last); ++ ++ return -ENOENT; ++} ++ + /* + * We have a good packet(s), pass it/them up the network stack. + */ +@@ -421,6 +481,16 @@ static void sonic_rx(struct net_device *dev) + + status = sonic_rda_get(dev, entry, SONIC_RD_STATUS); + if (status & SONIC_RCR_PRX) { ++ u32 addr = (sonic_rda_get(dev, entry, ++ SONIC_RD_PKTPTR_H) << 16) | ++ sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L); ++ int i = index_from_addr(lp, addr, entry); ++ ++ if (i < 0) { ++ WARN_ONCE(1, "failed to find buffer!\n"); ++ break; ++ } ++ + /* Malloc up new buffer. */ + new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (new_skb == NULL) { +@@ -442,7 +512,7 @@ static void sonic_rx(struct net_device *dev) + + /* now we have a new skb to replace it, pass the used one up the stack */ + dma_unmap_single(lp->device, lp->rx_laddr[entry], SONIC_RBSIZE, DMA_FROM_DEVICE); +- used_skb = lp->rx_skb[entry]; ++ used_skb = lp->rx_skb[i]; + pkt_len = sonic_rda_get(dev, entry, SONIC_RD_PKTLEN); + skb_trim(used_skb, pkt_len); + used_skb->protocol = eth_type_trans(used_skb, dev); +@@ -451,13 +521,13 @@ static void sonic_rx(struct net_device *dev) + lp->stats.rx_bytes += pkt_len; + + /* and insert the new skb */ +- lp->rx_laddr[entry] = new_laddr; +- lp->rx_skb[entry] = new_skb; ++ lp->rx_laddr[i] = new_laddr; ++ lp->rx_skb[i] = new_skb; + + bufadr_l = (unsigned long)new_laddr & 0xffff; + bufadr_h = (unsigned long)new_laddr >> 16; +- sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, bufadr_l); +- sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, bufadr_h); ++ sonic_rra_put(dev, i, SONIC_RR_BUFADR_L, bufadr_l); ++ sonic_rra_put(dev, i, SONIC_RR_BUFADR_H, bufadr_h); + } else { + /* This should only happen, if we enable accepting broken packets. */ + lp->stats.rx_errors++; +@@ -592,6 +662,7 @@ static int sonic_init(struct net_device *dev) + */ + SONIC_WRITE(SONIC_CMD, 0); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); + + /* + * initialize the receive resource area +diff --git a/drivers/net/ethernet/natsemi/sonic.h b/drivers/net/ethernet/natsemi/sonic.h +index 421b1a283fed..7dc011655e70 100644 +--- a/drivers/net/ethernet/natsemi/sonic.h ++++ b/drivers/net/ethernet/natsemi/sonic.h +@@ -110,6 +110,9 @@ + #define SONIC_CR_TXP 0x0002 + #define SONIC_CR_HTX 0x0001 + ++#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \ ++ SONIC_CR_RXEN | SONIC_CR_TXP) ++ + /* + * SONIC data configuration bits + */ +@@ -274,8 +277,9 @@ + #define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */ + #define SONIC_NUM_TDS 16 /* number of transmit descriptors */ + +-#define SONIC_RDS_MASK (SONIC_NUM_RDS-1) +-#define SONIC_TDS_MASK (SONIC_NUM_TDS-1) ++#define SONIC_RRS_MASK (SONIC_NUM_RRS - 1) ++#define SONIC_RDS_MASK (SONIC_NUM_RDS - 1) ++#define SONIC_TDS_MASK (SONIC_NUM_TDS - 1) + + #define SONIC_RBSIZE 1520 /* size of one resource buffer */ + +@@ -321,6 +325,7 @@ struct sonic_local { + unsigned int next_tx; /* next free TD */ + struct device *device; /* generic device */ + struct net_device_stats stats; ++ spinlock_t lock; + }; + + #define TX_TIMEOUT (3 * HZ) +@@ -342,30 +347,30 @@ static void sonic_tx_timeout(struct net_device *dev); + as far as we can tell. */ + /* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put() + is a much better name. */ +-static inline void sonic_buf_put(void* base, int bitmode, ++static inline void sonic_buf_put(u16 *base, int bitmode, + int offset, __u16 val) + { + if (bitmode) + #ifdef __BIG_ENDIAN +- ((__u16 *) base + (offset*2))[1] = val; ++ __raw_writew(val, base + (offset * 2) + 1); + #else +- ((__u16 *) base + (offset*2))[0] = val; ++ __raw_writew(val, base + (offset * 2) + 0); + #endif + else +- ((__u16 *) base)[offset] = val; ++ __raw_writew(val, base + (offset * 1) + 0); + } + +-static inline __u16 sonic_buf_get(void* base, int bitmode, ++static inline __u16 sonic_buf_get(u16 *base, int bitmode, + int offset) + { + if (bitmode) + #ifdef __BIG_ENDIAN +- return ((volatile __u16 *) base + (offset*2))[1]; ++ return __raw_readw(base + (offset * 2) + 1); + #else +- return ((volatile __u16 *) base + (offset*2))[0]; ++ return __raw_readw(base + (offset * 2) + 0); + #endif + else +- return ((volatile __u16 *) base)[offset]; ++ return __raw_readw(base + (offset * 1) + 0); + } + + /* Inlines that you should actually use for reading/writing DMA buffers */ +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +index a496390b8632..07f9067affc6 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +@@ -2043,6 +2043,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, + break; + } + entry += p_hdr->size; ++ cond_resched(); + } + p_dev->ahw->reset.seq_index = index; + } +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +index afa10a163da1..f34ae8c75bc5 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, + addr += 16; + reg_read -= 16; + ret += 16; ++ cond_resched(); + } + out: + mutex_unlock(&adapter->ahw->mem_lock); +@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) + buf_offset += entry->hdr.cap_size; + entry_offset += entry->hdr.offset; + buffer = fw_dump->data + buf_offset; ++ cond_resched(); + } + + fw_dump->clr = 1; +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 4a984b76a60e..db70d4c5778a 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -999,6 +999,7 @@ static const struct usb_device_id products[] = { + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ + {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ ++ {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ + + /* 3. Combined interface devices matching on interface number */ + {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ +diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c +index 0083c60f5cdf..a7f9c1886bd4 100644 +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -5244,6 +5244,11 @@ static int rtl8152_probe(struct usb_interface *intf, + + intf->needs_remote_wakeup = 1; + ++ if (!rtl_can_wakeup(tp)) ++ __rtl_set_wol(tp, 0); ++ else ++ tp->saved_wolopts = __rtl_get_wol(tp); ++ + tp->rtl_ops.init(tp); + queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0); + set_ethernet_addr(tp); +@@ -5257,10 +5262,6 @@ static int rtl8152_probe(struct usb_interface *intf, + goto out1; + } + +- if (!rtl_can_wakeup(tp)) +- __rtl_set_wol(tp, 0); +- +- tp->saved_wolopts = __rtl_get_wol(tp); + if (tp->saved_wolopts) + device_set_wakeup_enable(&udev->dev, true); + else +diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c +index 236c62538036..1eb329fc7241 100644 +--- a/drivers/net/wan/sdla.c ++++ b/drivers/net/wan/sdla.c +@@ -711,7 +711,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, + + spin_lock_irqsave(&sdla_lock, flags); + SDLA_WINDOW(dev, addr); +- pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK)); ++ pbuf = (void *)(dev->mem_start + (addr & SDLA_ADDR_MASK)); + __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len); + SDLA_WINDOW(dev, addr); + pbuf->opp_flag = 1; +diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c +index c5f4dd808745..6f669166c263 100644 +--- a/drivers/net/wireless/ath/ath9k/hif_usb.c ++++ b/drivers/net/wireless/ath/ath9k/hif_usb.c +@@ -1214,7 +1214,7 @@ err_fw: + static int send_eject_command(struct usb_interface *interface) + { + struct usb_device *udev = interface_to_usbdev(interface); +- struct usb_host_interface *iface_desc = &interface->altsetting[0]; ++ struct usb_host_interface *iface_desc = interface->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +index be855aa32154..2eb5fe7367c6 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +@@ -1333,7 +1333,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + goto fail; + } + +- desc = &intf->altsetting[0].desc; ++ desc = &intf->cur_altsetting->desc; + if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || + (desc->bInterfaceSubClass != 2) || + (desc->bInterfaceProtocol != 0xff)) { +@@ -1346,7 +1346,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + + num_of_eps = desc->bNumEndpoints; + for (ep = 0; ep < num_of_eps; ep++) { +- endpoint = &intf->altsetting[0].endpoint[ep].desc; ++ endpoint = &intf->cur_altsetting->endpoint[ep].desc; + endpoint_num = usb_endpoint_num(endpoint); + if (!usb_endpoint_xfer_bulk(endpoint)) + continue; +diff --git a/drivers/net/wireless/cisco/airo.c b/drivers/net/wireless/cisco/airo.c +index fc49255bab00..f3f20abbe269 100644 +--- a/drivers/net/wireless/cisco/airo.c ++++ b/drivers/net/wireless/cisco/airo.c +@@ -7788,16 +7788,8 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { + case AIROGVLIST: ridcode = RID_APLIST; break; + case AIROGDRVNAM: ridcode = RID_DRVNAME; break; + case AIROGEHTENC: ridcode = RID_ETHERENCAP; break; +- case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; +- /* Only super-user can read WEP keys */ +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- break; +- case AIROGWEPKNV: ridcode = RID_WEP_PERM; +- /* Only super-user can read WEP keys */ +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- break; ++ case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; break; ++ case AIROGWEPKNV: ridcode = RID_WEP_PERM; break; + case AIROGSTAT: ridcode = RID_STATUS; break; + case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; + case AIROGSTATSC32: ridcode = RID_STATS; break; +@@ -7811,7 +7803,13 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { + return -EINVAL; + } + +- if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL) ++ if (ridcode == RID_WEP_TEMP || ridcode == RID_WEP_PERM) { ++ /* Only super-user can read WEP keys */ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ } ++ ++ if ((iobuf = kzalloc(RIDSIZE, GFP_KERNEL)) == NULL) + return -ENOMEM; + + PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1); +diff --git a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c +index 56f6e3b71f48..95015d74b1c0 100644 +--- a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c ++++ b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c +@@ -1613,9 +1613,9 @@ static int ezusb_probe(struct usb_interface *interface, + /* set up the endpoint information */ + /* check out the endpoints */ + +- iface_desc = &interface->altsetting[0].desc; ++ iface_desc = &interface->cur_altsetting->desc; + for (i = 0; i < iface_desc->bNumEndpoints; ++i) { +- ep = &interface->altsetting[0].endpoint[i].desc; ++ ep = &interface->cur_altsetting->endpoint[i].desc; + + if (usb_endpoint_is_bulk_in(ep)) { + /* we found a bulk in endpoint */ +diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +index 73fc5952fd37..63f37fa72e4b 100644 +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +@@ -5921,7 +5921,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv, + u8 dir, xtype, num; + int ret = 0; + +- host_interface = &interface->altsetting[0]; ++ host_interface = interface->cur_altsetting; + interface_desc = &host_interface->desc; + endpoints = interface_desc->bNumEndpoints; + +diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c +index 120b0ff545c1..d205947c4c55 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_hal.c ++++ b/drivers/net/wireless/rsi/rsi_91x_hal.c +@@ -541,6 +541,7 @@ static int bl_cmd(struct rsi_hw *adapter, u8 cmd, u8 exp_resp, char *str) + bl_start_cmd_timer(adapter, timeout); + status = bl_write_cmd(adapter, cmd, exp_resp, ®out_val); + if (status < 0) { ++ bl_stop_cmd_timer(adapter); + rsi_dbg(ERR_ZONE, + "%s: Command %s (%0x) writing failed..\n", + __func__, str, cmd); +@@ -656,10 +657,9 @@ static int ping_pong_write(struct rsi_hw *adapter, u8 cmd, u8 *addr, u32 size) + } + + status = bl_cmd(adapter, cmd_req, cmd_resp, str); +- if (status) { +- bl_stop_cmd_timer(adapter); ++ if (status) + return status; +- } ++ + return 0; + } + +@@ -749,10 +749,9 @@ static int auto_fw_upgrade(struct rsi_hw *adapter, u8 *flash_content, + + status = bl_cmd(adapter, EOF_REACHED, FW_LOADING_SUCCESSFUL, + "EOF_REACHED"); +- if (status) { +- bl_stop_cmd_timer(adapter); ++ if (status) + return status; +- } ++ + rsi_dbg(INFO_ZONE, "FW loading is done and FW is running..\n"); + return 0; + } +@@ -773,6 +772,7 @@ static int rsi_load_firmware(struct rsi_hw *adapter) + status = hif_ops->master_reg_read(adapter, SWBL_REGOUT, + ®out_val, 2); + if (status < 0) { ++ bl_stop_cmd_timer(adapter); + rsi_dbg(ERR_ZONE, + "%s: REGOUT read failed\n", __func__); + return status; +diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c +index f90c10b3c921..786a330bc470 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_usb.c ++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c +@@ -105,7 +105,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface, + __le16 buffer_size; + int ii, bep_found = 0; + +- iface_desc = &(interface->altsetting[0]); ++ iface_desc = interface->cur_altsetting; + + for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) { + endpoint = &(iface_desc->endpoint[ii].desc); +diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c +index c30bf118c67d..1e396eb26ccf 100644 +--- a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c ++++ b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c +@@ -1272,7 +1272,7 @@ static void print_id(struct usb_device *udev) + static int eject_installer(struct usb_interface *intf) + { + struct usb_device *udev = interface_to_usbdev(intf); +- struct usb_host_interface *iface_desc = &intf->altsetting[0]; ++ struct usb_host_interface *iface_desc = intf->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c +index 90df085e9f92..e7ed051ec125 100644 +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -4019,6 +4019,40 @@ static void quirk_mic_x200_dma_alias(struct pci_dev *pdev) + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2260, quirk_mic_x200_dma_alias); + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2264, quirk_mic_x200_dma_alias); + ++/* ++ * Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices ++ * exposing computational units via Non Transparent Bridges (NTB, PEX 87xx). ++ * ++ * Similarly to MIC x200, we need to add DMA aliases to allow buffer access ++ * when IOMMU is enabled. These aliases allow computational unit access to ++ * host memory. These aliases mark the whole VCA device as one IOMMU ++ * group. ++ * ++ * All possible slot numbers (0x20) are used, since we are unable to tell ++ * what slot is used on other side. This quirk is intended for both host ++ * and computational unit sides. The VCA devices have up to five functions ++ * (four for DMA channels and one additional). ++ */ ++static void quirk_pex_vca_alias(struct pci_dev *pdev) ++{ ++ const unsigned int num_pci_slots = 0x20; ++ unsigned int slot; ++ ++ for (slot = 0; slot < num_pci_slots; slot++) { ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x0)); ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x1)); ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x2)); ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x3)); ++ pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x4)); ++ } ++} ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2954, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2955, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2956, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2958, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2959, quirk_pex_vca_alias); ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x295A, quirk_pex_vca_alias); ++ + /* + * The IOMMU and interrupt controller on Broadcom Vulcan/Cavium ThunderX2 are + * associated not at the root bus, but at a bridge below. This quirk avoids +diff --git a/drivers/phy/motorola/phy-cpcap-usb.c b/drivers/phy/motorola/phy-cpcap-usb.c +index 4ba3634009af..593c77dbde2e 100644 +--- a/drivers/phy/motorola/phy-cpcap-usb.c ++++ b/drivers/phy/motorola/phy-cpcap-usb.c +@@ -115,7 +115,7 @@ struct cpcap_usb_ints_state { + enum cpcap_gpio_mode { + CPCAP_DM_DP, + CPCAP_MDM_RX_TX, +- CPCAP_UNKNOWN, ++ CPCAP_UNKNOWN_DISABLED, /* Seems to disable USB lines */ + CPCAP_OTG_DM_DP, + }; + +@@ -379,7 +379,8 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) + { + int error; + +- error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); ++ /* Disable lines to prevent glitches from waking up mdm6600 */ ++ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); + if (error) + goto out_err; + +@@ -406,6 +407,11 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) + if (error) + goto out_err; + ++ /* Enable UART mode */ ++ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); ++ if (error) ++ goto out_err; ++ + return 0; + + out_err: +@@ -418,7 +424,8 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) + { + int error; + +- error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); ++ /* Disable lines to prevent glitches from waking up mdm6600 */ ++ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); + if (error) + return error; + +@@ -458,6 +465,11 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) + if (error) + goto out_err; + ++ /* Enable USB mode */ ++ error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); ++ if (error) ++ goto out_err; ++ + return 0; + + out_err: +diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c +index 242e2ee494a1..d79ac0b24f5a 100644 +--- a/drivers/scsi/fnic/fnic_scsi.c ++++ b/drivers/scsi/fnic/fnic_scsi.c +@@ -446,6 +446,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_ + if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED))) + return SCSI_MLQUEUE_HOST_BUSY; + ++ if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET))) ++ return SCSI_MLQUEUE_HOST_BUSY; ++ + rport = starget_to_rport(scsi_target(sc->device)); + if (!rport) { + FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host, +diff --git a/drivers/soc/ti/wkup_m3_ipc.c b/drivers/soc/ti/wkup_m3_ipc.c +index 369aef5e7228..651827c6ee6f 100644 +--- a/drivers/soc/ti/wkup_m3_ipc.c ++++ b/drivers/soc/ti/wkup_m3_ipc.c +@@ -375,6 +375,8 @@ static void wkup_m3_rproc_boot_thread(struct wkup_m3_ipc *m3_ipc) + ret = rproc_boot(m3_ipc->rproc); + if (ret) + dev_err(dev, "rproc_boot failed\n"); ++ else ++ m3_ipc_state = m3_ipc; + + do_exit(0); + } +@@ -461,8 +463,6 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev) + goto err_put_rproc; + } + +- m3_ipc_state = m3_ipc; +- + return 0; + + err_put_rproc: +diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c +index b217c22ff72f..b461200871f8 100644 +--- a/drivers/spi/spi-dw.c ++++ b/drivers/spi/spi-dw.c +@@ -180,9 +180,11 @@ static inline u32 rx_max(struct dw_spi *dws) + + static void dw_writer(struct dw_spi *dws) + { +- u32 max = tx_max(dws); ++ u32 max; + u16 txw = 0; + ++ spin_lock(&dws->buf_lock); ++ max = tx_max(dws); + while (max--) { + /* Set the tx word if the transfer's original "tx" is not null */ + if (dws->tx_end - dws->len) { +@@ -194,13 +196,16 @@ static void dw_writer(struct dw_spi *dws) + dw_write_io_reg(dws, DW_SPI_DR, txw); + dws->tx += dws->n_bytes; + } ++ spin_unlock(&dws->buf_lock); + } + + static void dw_reader(struct dw_spi *dws) + { +- u32 max = rx_max(dws); ++ u32 max; + u16 rxw; + ++ spin_lock(&dws->buf_lock); ++ max = rx_max(dws); + while (max--) { + rxw = dw_read_io_reg(dws, DW_SPI_DR); + /* Care rx only if the transfer's original "rx" is not null */ +@@ -212,6 +217,7 @@ static void dw_reader(struct dw_spi *dws) + } + dws->rx += dws->n_bytes; + } ++ spin_unlock(&dws->buf_lock); + } + + static void int_error_stop(struct dw_spi *dws, const char *msg) +@@ -284,18 +290,20 @@ static int dw_spi_transfer_one(struct spi_master *master, + { + struct dw_spi *dws = spi_master_get_devdata(master); + struct chip_data *chip = spi_get_ctldata(spi); ++ unsigned long flags; + u8 imask = 0; + u16 txlevel = 0; + u32 cr0; + int ret; + + dws->dma_mapped = 0; +- ++ spin_lock_irqsave(&dws->buf_lock, flags); + dws->tx = (void *)transfer->tx_buf; + dws->tx_end = dws->tx + transfer->len; + dws->rx = transfer->rx_buf; + dws->rx_end = dws->rx + transfer->len; + dws->len = transfer->len; ++ spin_unlock_irqrestore(&dws->buf_lock, flags); + + spi_enable_chip(dws, 0); + +@@ -486,6 +494,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) + dws->type = SSI_MOTO_SPI; + dws->dma_inited = 0; + dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR); ++ spin_lock_init(&dws->buf_lock); + + ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, dev_name(dev), + master); +diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h +index 5c07cf8f19e0..45fbf3ad591c 100644 +--- a/drivers/spi/spi-dw.h ++++ b/drivers/spi/spi-dw.h +@@ -117,6 +117,7 @@ struct dw_spi { + size_t len; + void *tx; + void *tx_end; ++ spinlock_t buf_lock; + void *rx; + void *rx_end; + int dma_mapped; +diff --git a/drivers/staging/most/aim-network/networking.c b/drivers/staging/most/aim-network/networking.c +index 936f013c350e..6398c27563c9 100644 +--- a/drivers/staging/most/aim-network/networking.c ++++ b/drivers/staging/most/aim-network/networking.c +@@ -85,6 +85,11 @@ static int skb_to_mamac(const struct sk_buff *skb, struct mbo *mbo) + unsigned int payload_len = skb->len - ETH_HLEN; + unsigned int mdp_len = payload_len + MDP_HDR_LEN; + ++ if (mdp_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mdp_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mdp_len); +@@ -132,6 +137,11 @@ static int skb_to_mep(const struct sk_buff *skb, struct mbo *mbo) + u8 *buff = mbo->virt_address; + unsigned int mep_len = skb->len + MEP_HDR_LEN; + ++ if (mep_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mep_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mep_len); +diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h +index 705fffa59da9..41a4f9555d07 100644 +--- a/drivers/staging/vt6656/device.h ++++ b/drivers/staging/vt6656/device.h +@@ -62,6 +62,8 @@ + #define RATE_AUTO 12 + + #define MAX_RATE 12 ++#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ ++ BIT(RATE_5M) | BIT(RATE_11M)) + + /* + * device specific +diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c +index c6ffbe0e2728..c521729c4192 100644 +--- a/drivers/staging/vt6656/int.c ++++ b/drivers/staging/vt6656/int.c +@@ -107,9 +107,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) + + info->status.rates[0].count = tx_retry; + +- if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) { ++ if (!(tsr & TSR_TMO)) { + info->status.rates[0].idx = idx; +- info->flags |= IEEE80211_TX_STAT_ACK; ++ ++ if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) ++ info->flags |= IEEE80211_TX_STAT_ACK; + } + + ieee80211_tx_status_irqsafe(priv->hw, context->skb); +diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c +index 645ea16b53d5..e8ccd800c94f 100644 +--- a/drivers/staging/vt6656/main_usb.c ++++ b/drivers/staging/vt6656/main_usb.c +@@ -977,6 +977,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); + ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); + ieee80211_hw_set(priv->hw, SUPPORTS_PS); ++ ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK); + + priv->hw->max_signal = 100; + +diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c +index a44abcce6fb4..f78f31ce6443 100644 +--- a/drivers/staging/vt6656/rxtx.c ++++ b/drivers/staging/vt6656/rxtx.c +@@ -288,11 +288,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context, + PK_TYPE_11B, &buf->b); + + /* Get Duration and TimeStamp */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration_a = dur; +- buf->duration_b = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration_a = hdr->duration_id; ++ buf->duration_b = hdr->duration_id; + } else { + buf->duration_a = vnt_get_duration_le(priv, + tx_context->pkt_type, need_ack); +@@ -381,10 +379,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context, + tx_context->pkt_type, &buf->ab); + + /* Get Duration and TimeStampOff */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration = hdr->duration_id; + } else { + buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); +@@ -825,10 +821,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) + if (info->band == NL80211_BAND_5GHZ) { + pkt_type = PK_TYPE_11A; + } else { +- if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) +- pkt_type = PK_TYPE_11GB; +- else +- pkt_type = PK_TYPE_11GA; ++ if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { ++ if (priv->basic_rates & VNT_B_RATES) ++ pkt_type = PK_TYPE_11GB; ++ else ++ pkt_type = PK_TYPE_11GA; ++ } else { ++ pkt_type = PK_TYPE_11A; ++ } + } + } else { + pkt_type = PK_TYPE_11B; +diff --git a/drivers/staging/wlan-ng/prism2mgmt.c b/drivers/staging/wlan-ng/prism2mgmt.c +index c4aa9e7e7003..be89a0ee44bf 100644 +--- a/drivers/staging/wlan-ng/prism2mgmt.c ++++ b/drivers/staging/wlan-ng/prism2mgmt.c +@@ -945,7 +945,7 @@ int prism2mgmt_flashdl_state(struct wlandevice *wlandev, void *msgp) + } + } + +- return 0; ++ return result; + } + + /*---------------------------------------------------------------- +diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig +index 0126de898036..108600c6eb56 100644 +--- a/drivers/tee/optee/Kconfig ++++ b/drivers/tee/optee/Kconfig +@@ -2,6 +2,7 @@ + config OPTEE + tristate "OP-TEE" + depends on HAVE_ARM_SMCCC ++ depends on MMU + help + This implements the OP-TEE Trusted Execution Environment (TEE) + driver. +diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c b/drivers/tty/serial/8250/8250_bcm2835aux.c +index a23c7da42ea8..7bbcae75e651 100644 +--- a/drivers/tty/serial/8250/8250_bcm2835aux.c ++++ b/drivers/tty/serial/8250/8250_bcm2835aux.c +@@ -119,7 +119,7 @@ static int bcm2835aux_serial_remove(struct platform_device *pdev) + { + struct bcm2835aux_data *data = platform_get_drvdata(pdev); + +- serial8250_unregister_port(data->uart.port.line); ++ serial8250_unregister_port(data->line); + clk_disable_unprepare(data->clk); + + return 0; +diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c +index a497b878c3e2..021899c58028 100644 +--- a/drivers/usb/dwc3/core.c ++++ b/drivers/usb/dwc3/core.c +@@ -1031,6 +1031,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) + /* do nothing */ + break; + } ++ ++ /* de-assert DRVVBUS for HOST and OTG mode */ ++ dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE); + } + + static void dwc3_get_properties(struct dwc3 *dwc) +diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c +index f9734a96d516..a3e3b4703f38 100644 +--- a/drivers/usb/serial/ir-usb.c ++++ b/drivers/usb/serial/ir-usb.c +@@ -49,9 +49,10 @@ static int buffer_size; + static int xbof = -1; + + static int ir_startup (struct usb_serial *serial); +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port); +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size); ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count); ++static int ir_write_room(struct tty_struct *tty); ++static void ir_write_bulk_callback(struct urb *urb); + static void ir_process_read_urb(struct urb *urb); + static void ir_set_termios(struct tty_struct *tty, + struct usb_serial_port *port, struct ktermios *old_termios); +@@ -81,8 +82,9 @@ static struct usb_serial_driver ir_device = { + .num_ports = 1, + .set_termios = ir_set_termios, + .attach = ir_startup, +- .open = ir_open, +- .prepare_write_buffer = ir_prepare_write_buffer, ++ .write = ir_write, ++ .write_room = ir_write_room, ++ .write_bulk_callback = ir_write_bulk_callback, + .process_read_urb = ir_process_read_urb, + }; + +@@ -199,6 +201,9 @@ static int ir_startup(struct usb_serial *serial) + struct usb_irda_cs_descriptor *irda_desc; + int rates; + ++ if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1) ++ return -ENODEV; ++ + irda_desc = irda_usb_find_class_desc(serial, 0); + if (!irda_desc) { + dev_err(&serial->dev->dev, +@@ -255,35 +260,102 @@ static int ir_startup(struct usb_serial *serial) + return 0; + } + +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port) ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count) + { +- int i; ++ struct urb *urb = NULL; ++ unsigned long flags; ++ int ret; + +- for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) +- port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET; ++ if (port->bulk_out_size == 0) ++ return -EINVAL; + +- /* Start reading from the device */ +- return usb_serial_generic_open(tty, port); +-} ++ if (count == 0) ++ return 0; + +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size) +-{ +- unsigned char *buf = dest; +- int count; ++ count = min(count, port->bulk_out_size - 1); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ if (__test_and_clear_bit(0, &port->write_urbs_free)) { ++ urb = port->write_urbs[0]; ++ port->tx_bytes += count; ++ } ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ if (!urb) ++ return 0; + + /* + * The first byte of the packet we send to the device contains an +- * inbound header which indicates an additional number of BOFs and ++ * outbound header which indicates an additional number of BOFs and + * a baud rate change. + * + * See section 5.4.2.2 of the USB IrDA spec. + */ +- *buf = ir_xbof | ir_baud; ++ *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud; ++ ++ memcpy(urb->transfer_buffer + 1, buf, count); ++ ++ urb->transfer_buffer_length = count + 1; ++ urb->transfer_flags = URB_ZERO_PACKET; ++ ++ ret = usb_submit_urb(urb, GFP_ATOMIC); ++ if (ret) { ++ dev_err(&port->dev, "failed to submit write urb: %d\n", ret); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= count; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ return ret; ++ } ++ ++ return count; ++} ++ ++static void ir_write_bulk_callback(struct urb *urb) ++{ ++ struct usb_serial_port *port = urb->context; ++ int status = urb->status; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= urb->transfer_buffer_length - 1; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ switch (status) { ++ case 0: ++ break; ++ case -ENOENT: ++ case -ECONNRESET: ++ case -ESHUTDOWN: ++ dev_dbg(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ case -EPIPE: ++ dev_err(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ default: ++ dev_err(&port->dev, "nonzero write-urb status: %d\n", status); ++ break; ++ } ++ ++ usb_serial_port_softint(port); ++} ++ ++static int ir_write_room(struct tty_struct *tty) ++{ ++ struct usb_serial_port *port = tty->driver_data; ++ int count = 0; ++ ++ if (port->bulk_out_size == 0) ++ return 0; ++ ++ if (test_bit(0, &port->write_urbs_free)) ++ count = port->bulk_out_size - 1; + +- count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1, +- &port->lock); +- return count + 1; ++ return count; + } + + static void ir_process_read_urb(struct urb *urb) +@@ -336,34 +408,34 @@ static void ir_set_termios(struct tty_struct *tty, + + switch (baud) { + case 2400: +- ir_baud = USB_IRDA_BR_2400; ++ ir_baud = USB_IRDA_LS_2400; + break; + case 9600: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + break; + case 19200: +- ir_baud = USB_IRDA_BR_19200; ++ ir_baud = USB_IRDA_LS_19200; + break; + case 38400: +- ir_baud = USB_IRDA_BR_38400; ++ ir_baud = USB_IRDA_LS_38400; + break; + case 57600: +- ir_baud = USB_IRDA_BR_57600; ++ ir_baud = USB_IRDA_LS_57600; + break; + case 115200: +- ir_baud = USB_IRDA_BR_115200; ++ ir_baud = USB_IRDA_LS_115200; + break; + case 576000: +- ir_baud = USB_IRDA_BR_576000; ++ ir_baud = USB_IRDA_LS_576000; + break; + case 1152000: +- ir_baud = USB_IRDA_BR_1152000; ++ ir_baud = USB_IRDA_LS_1152000; + break; + case 4000000: +- ir_baud = USB_IRDA_BR_4000000; ++ ir_baud = USB_IRDA_LS_4000000; + break; + default: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + baud = 9600; + } + +diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h +index f15aa47c54a9..0eb8c67ee138 100644 +--- a/drivers/usb/storage/unusual_uas.h ++++ b/drivers/usb/storage/unusual_uas.h +@@ -163,12 +163,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999, + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_IGNORE_UAS), + +-/* Reported-by: Takeo Nakayama */ ++/* ++ * Initially Reported-by: Takeo Nakayama ++ * UAS Ignore Reported by Steven Ellis ++ */ + UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, + "JMicron", + "JMS566", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, +- US_FL_NO_REPORT_OPCODES), ++ US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS), + + /* Reported-by: Hans de Goede */ + UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, +diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig +index f55328a31629..fa15a683ae2d 100644 +--- a/drivers/watchdog/Kconfig ++++ b/drivers/watchdog/Kconfig +@@ -563,6 +563,7 @@ config MAX63XX_WATCHDOG + config MAX77620_WATCHDOG + tristate "Maxim Max77620 Watchdog Timer" + depends on MFD_MAX77620 || COMPILE_TEST ++ select WATCHDOG_CORE + help + This is the driver for the Max77620 watchdog timer. + Say 'Y' here to enable the watchdog timer support for +diff --git a/drivers/watchdog/rn5t618_wdt.c b/drivers/watchdog/rn5t618_wdt.c +index e60f55702ab7..d2e79cf70e77 100644 +--- a/drivers/watchdog/rn5t618_wdt.c ++++ b/drivers/watchdog/rn5t618_wdt.c +@@ -193,6 +193,7 @@ static struct platform_driver rn5t618_wdt_driver = { + + module_platform_driver(rn5t618_wdt_driver); + ++MODULE_ALIAS("platform:rn5t618-wdt"); + MODULE_AUTHOR("Beniamino Galvani "); + MODULE_DESCRIPTION("RN5T618 watchdog driver"); + MODULE_LICENSE("GPL v2"); +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index 204d585e012a..3ab79fa00dc7 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -2114,7 +2114,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + */ + thresh = 4 * 1024 * 1024; + +- if (!mixed && total_free_meta - thresh < block_rsv->size) ++ /* ++ * We only want to claim there's no available space if we can no longer ++ * allocate chunks for our metadata profile and our global reserve will ++ * not fit in the free metadata space. If we aren't ->full then we ++ * still can allocate chunks and thus are fine using the currently ++ * calculated f_bavail. ++ */ ++ if (!mixed && block_rsv->space_info->full && ++ total_free_meta - thresh < block_rsv->size) + buf->f_bavail = 0; + + buf->f_type = BTRFS_SUPER_MAGIC; +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index 1a0a56647974..93d8aa6ef661 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -1782,6 +1782,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, + arg = JBD2_DEFAULT_MAX_COMMIT_AGE; + sbi->s_commit_interval = HZ * arg; + } else if (token == Opt_debug_want_extra_isize) { ++ if ((arg & 1) || ++ (arg < 4) || ++ (arg > (sbi->s_inode_size - EXT4_GOOD_OLD_INODE_SIZE))) { ++ ext4_msg(sb, KERN_ERR, ++ "Invalid want_extra_isize %d", arg); ++ return -1; ++ } + sbi->s_want_extra_isize = arg; + } else if (token == Opt_max_batch_time) { + sbi->s_max_batch_time = arg; +@@ -3454,40 +3461,6 @@ int ext4_calculate_overhead(struct super_block *sb) + return 0; + } + +-static void ext4_clamp_want_extra_isize(struct super_block *sb) +-{ +- struct ext4_sb_info *sbi = EXT4_SB(sb); +- struct ext4_super_block *es = sbi->s_es; +- unsigned def_extra_isize = sizeof(struct ext4_inode) - +- EXT4_GOOD_OLD_INODE_SIZE; +- +- if (sbi->s_inode_size == EXT4_GOOD_OLD_INODE_SIZE) { +- sbi->s_want_extra_isize = 0; +- return; +- } +- if (sbi->s_want_extra_isize < 4) { +- sbi->s_want_extra_isize = def_extra_isize; +- if (ext4_has_feature_extra_isize(sb)) { +- if (sbi->s_want_extra_isize < +- le16_to_cpu(es->s_want_extra_isize)) +- sbi->s_want_extra_isize = +- le16_to_cpu(es->s_want_extra_isize); +- if (sbi->s_want_extra_isize < +- le16_to_cpu(es->s_min_extra_isize)) +- sbi->s_want_extra_isize = +- le16_to_cpu(es->s_min_extra_isize); +- } +- } +- /* Check if enough inode space is available */ +- if ((sbi->s_want_extra_isize > sbi->s_inode_size) || +- (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize > +- sbi->s_inode_size)) { +- sbi->s_want_extra_isize = def_extra_isize; +- ext4_msg(sb, KERN_INFO, +- "required extra inode space not available"); +- } +-} +- + static void ext4_set_resv_clusters(struct super_block *sb) + { + ext4_fsblk_t resv_clusters; +@@ -3695,6 +3668,65 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) + */ + sbi->s_li_wait_mult = EXT4_DEF_LI_WAIT_MULT; + ++ if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) { ++ sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE; ++ sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO; ++ } else { ++ sbi->s_inode_size = le16_to_cpu(es->s_inode_size); ++ sbi->s_first_ino = le32_to_cpu(es->s_first_ino); ++ if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) { ++ ext4_msg(sb, KERN_ERR, "invalid first ino: %u", ++ sbi->s_first_ino); ++ goto failed_mount; ++ } ++ if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) || ++ (!is_power_of_2(sbi->s_inode_size)) || ++ (sbi->s_inode_size > blocksize)) { ++ ext4_msg(sb, KERN_ERR, ++ "unsupported inode size: %d", ++ sbi->s_inode_size); ++ goto failed_mount; ++ } ++ /* ++ * i_atime_extra is the last extra field available for ++ * [acm]times in struct ext4_inode. Checking for that ++ * field should suffice to ensure we have extra space ++ * for all three. ++ */ ++ if (sbi->s_inode_size >= offsetof(struct ext4_inode, i_atime_extra) + ++ sizeof(((struct ext4_inode *)0)->i_atime_extra)) { ++ sb->s_time_gran = 1; ++ } else { ++ sb->s_time_gran = NSEC_PER_SEC; ++ } ++ } ++ if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) { ++ sbi->s_want_extra_isize = sizeof(struct ext4_inode) - ++ EXT4_GOOD_OLD_INODE_SIZE; ++ if (ext4_has_feature_extra_isize(sb)) { ++ unsigned v, max = (sbi->s_inode_size - ++ EXT4_GOOD_OLD_INODE_SIZE); ++ ++ v = le16_to_cpu(es->s_want_extra_isize); ++ if (v > max) { ++ ext4_msg(sb, KERN_ERR, ++ "bad s_want_extra_isize: %d", v); ++ goto failed_mount; ++ } ++ if (sbi->s_want_extra_isize < v) ++ sbi->s_want_extra_isize = v; ++ ++ v = le16_to_cpu(es->s_min_extra_isize); ++ if (v > max) { ++ ext4_msg(sb, KERN_ERR, ++ "bad s_min_extra_isize: %d", v); ++ goto failed_mount; ++ } ++ if (sbi->s_want_extra_isize < v) ++ sbi->s_want_extra_isize = v; ++ } ++ } ++ + if (sbi->s_es->s_mount_opts[0]) { + char *s_mount_opts = kstrndup(sbi->s_es->s_mount_opts, + sizeof(sbi->s_es->s_mount_opts), +@@ -3893,29 +3925,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) + has_huge_files); + sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files); + +- if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) { +- sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE; +- sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO; +- } else { +- sbi->s_inode_size = le16_to_cpu(es->s_inode_size); +- sbi->s_first_ino = le32_to_cpu(es->s_first_ino); +- if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) { +- ext4_msg(sb, KERN_ERR, "invalid first ino: %u", +- sbi->s_first_ino); +- goto failed_mount; +- } +- if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) || +- (!is_power_of_2(sbi->s_inode_size)) || +- (sbi->s_inode_size > blocksize)) { +- ext4_msg(sb, KERN_ERR, +- "unsupported inode size: %d", +- sbi->s_inode_size); +- goto failed_mount; +- } +- if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) +- sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2); +- } +- + sbi->s_desc_size = le16_to_cpu(es->s_desc_size); + if (ext4_has_feature_64bit(sb)) { + if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT || +@@ -4354,8 +4363,6 @@ no_journal: + if (ext4_setup_super(sb, es, sb_rdonly(sb))) + sb->s_flags |= MS_RDONLY; + +- ext4_clamp_want_extra_isize(sb); +- + ext4_set_resv_clusters(sb); + + err = ext4_setup_system_zone(sb); +@@ -5139,8 +5146,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) + goto restore_opts; + } + +- ext4_clamp_want_extra_isize(sb); +- + if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^ + test_opt(sb, JOURNAL_CHECKSUM)) { + ext4_msg(sb, KERN_ERR, "changing journal_checksum " +diff --git a/fs/namei.c b/fs/namei.c +index d648d6d2b635..f421f8d80f4d 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -3266,8 +3266,8 @@ static int do_last(struct nameidata *nd, + int *opened) + { + struct dentry *dir = nd->path.dentry; +- kuid_t dir_uid = dir->d_inode->i_uid; +- umode_t dir_mode = dir->d_inode->i_mode; ++ kuid_t dir_uid = nd->inode->i_uid; ++ umode_t dir_mode = nd->inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c +index cc0b22c72e83..5208d85dd30c 100644 +--- a/fs/reiserfs/super.c ++++ b/fs/reiserfs/super.c +@@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s) + reiserfs_write_unlock(s); + mutex_destroy(&REISERFS_SB(s)->lock); + destroy_workqueue(REISERFS_SB(s)->commit_wq); ++ kfree(REISERFS_SB(s)->s_jdev); + kfree(s->s_fs_info); + s->s_fs_info = NULL; + } +@@ -2243,6 +2244,7 @@ error_unlocked: + kfree(qf_names[j]); + } + #endif ++ kfree(sbi->s_jdev); + kfree(sbi); + + s->s_fs_info = NULL; +diff --git a/include/linux/usb/irda.h b/include/linux/usb/irda.h +index 396d2b043e64..556a801efce3 100644 +--- a/include/linux/usb/irda.h ++++ b/include/linux/usb/irda.h +@@ -119,11 +119,22 @@ struct usb_irda_cs_descriptor { + * 6 - 115200 bps + * 7 - 576000 bps + * 8 - 1.152 Mbps +- * 9 - 5 mbps ++ * 9 - 4 Mbps + * 10..15 - Reserved + */ + #define USB_IRDA_STATUS_LINK_SPEED 0x0f + ++#define USB_IRDA_LS_NO_CHANGE 0 ++#define USB_IRDA_LS_2400 1 ++#define USB_IRDA_LS_9600 2 ++#define USB_IRDA_LS_19200 3 ++#define USB_IRDA_LS_38400 4 ++#define USB_IRDA_LS_57600 5 ++#define USB_IRDA_LS_115200 6 ++#define USB_IRDA_LS_576000 7 ++#define USB_IRDA_LS_1152000 8 ++#define USB_IRDA_LS_4000000 9 ++ + /* The following is a 4-bit value used only for + * outbound header: + * +diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h +index a4c8e9d7dd06..030eea38f258 100644 +--- a/include/net/cfg80211.h ++++ b/include/net/cfg80211.h +@@ -2843,6 +2843,9 @@ struct cfg80211_pmk_conf { + * + * @start_radar_detection: Start radar detection in the driver. + * ++ * @end_cac: End running CAC, probably because a related CAC ++ * was finished on another phy. ++ * + * @update_ft_ies: Provide updated Fast BSS Transition information to the + * driver. If the SME is in the driver/firmware, this information can be + * used in building Authentication and Reassociation Request frames. +@@ -3148,6 +3151,8 @@ struct cfg80211_ops { + struct net_device *dev, + struct cfg80211_chan_def *chandef, + u32 cac_time_ms); ++ void (*end_cac)(struct wiphy *wiphy, ++ struct net_device *dev); + int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_update_ft_ies_params *ftie); + int (*crit_proto_start)(struct wiphy *wiphy, +diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c +index 2c57030f54aa..829943aad7be 100644 +--- a/kernel/cgroup/cgroup.c ++++ b/kernel/cgroup/cgroup.c +@@ -2884,8 +2884,6 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) + for_each_subsys(ss, ssid) { + struct cgroup_subsys_state *css = cgroup_css(dsct, ss); + +- WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); +- + if (!(cgroup_ss_mask(dsct) & (1 << ss->id))) + continue; + +@@ -2895,6 +2893,8 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp) + return PTR_ERR(css); + } + ++ WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); ++ + if (css_visible(css)) { + ret = css_populate_dir(css); + if (ret) +@@ -2930,11 +2930,11 @@ static void cgroup_apply_control_disable(struct cgroup *cgrp) + for_each_subsys(ss, ssid) { + struct cgroup_subsys_state *css = cgroup_css(dsct, ss); + +- WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); +- + if (!css) + continue; + ++ WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); ++ + if (css->parent && + !(cgroup_ss_mask(dsct) & (1 << ss->id))) { + kill_css(css); +@@ -3221,7 +3221,8 @@ static ssize_t cgroup_type_write(struct kernfs_open_file *of, char *buf, + if (strcmp(strstrip(buf), "threaded")) + return -EINVAL; + +- cgrp = cgroup_kn_lock_live(of->kn, false); ++ /* drain dying csses before we re-apply (threaded) subtree control */ ++ cgrp = cgroup_kn_lock_live(of->kn, true); + if (!cgrp) + return -ENOENT; + +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index a37cfa88669e..1b34f2e35951 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2724,6 +2724,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + char *flags = strchr(str, '='); + int err = 1; + ++ if (flags) ++ *flags++ = '\0'; /* terminate mode string */ ++ + if (nodelist) { + /* NUL-terminate mode or flags string */ + *nodelist++ = '\0'; +@@ -2734,9 +2737,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + } else + nodes_clear(nodes); + +- if (flags) +- *flags++ = '\0'; /* terminate mode string */ +- + for (mode = 0; mode < MPOL_MAX; mode++) { + if (!strcmp(str, policy_modes[mode])) { + break; +diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c +index 4a05235929b9..93093d7c3824 100644 +--- a/net/bluetooth/hci_sock.c ++++ b/net/bluetooth/hci_sock.c +@@ -826,6 +826,8 @@ static int hci_sock_release(struct socket *sock) + if (!sk) + return 0; + ++ lock_sock(sk); ++ + switch (hci_pi(sk)->channel) { + case HCI_CHANNEL_MONITOR: + atomic_dec(&monitor_promisc); +@@ -873,6 +875,7 @@ static int hci_sock_release(struct socket *sock) + skb_queue_purge(&sk->sk_receive_queue); + skb_queue_purge(&sk->sk_write_queue); + ++ release_sock(sk); + sock_put(sk); + return 0; + } +diff --git a/net/core/utils.c b/net/core/utils.c +index 93066bd0305a..b1823e76b877 100644 +--- a/net/core/utils.c ++++ b/net/core/utils.c +@@ -419,6 +419,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, + } + EXPORT_SYMBOL(inet_proto_csum_replace4); + ++/** ++ * inet_proto_csum_replace16 - update layer 4 header checksum field ++ * @sum: Layer 4 header checksum field ++ * @skb: sk_buff for the packet ++ * @from: old IPv6 address ++ * @to: new IPv6 address ++ * @pseudohdr: True if layer 4 header checksum includes pseudoheader ++ * ++ * Update layer 4 header as per the update in IPv6 src/dst address. ++ * ++ * There is no need to update skb->csum in this function, because update in two ++ * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other ++ * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to ++ * update skb->csum, because update in 3 fields a.) IPv4 src/dst address, ++ * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as ++ * L4 Header checksum for skb->csum calculation. ++ */ + void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + const __be32 *from, const __be32 *to, + bool pseudohdr) +@@ -430,9 +447,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + if (skb->ip_summed != CHECKSUM_PARTIAL) { + *sum = csum_fold(csum_partial(diff, sizeof(diff), + ~csum_unfold(*sum))); +- if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) +- skb->csum = ~csum_partial(diff, sizeof(diff), +- ~skb->csum); + } else if (pseudohdr) + *sum = ~csum_fold(csum_partial(diff, sizeof(diff), + csum_unfold(*sum))); +diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c +index 08c15dd42d93..59384ffe89f7 100644 +--- a/net/ipv4/ip_vti.c ++++ b/net/ipv4/ip_vti.c +@@ -208,8 +208,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev, + int mtu; + + if (!dst) { +- dev->stats.tx_carrier_errors++; +- goto tx_error_icmp; ++ struct rtable *rt; ++ ++ fl->u.ip4.flowi4_oif = dev->ifindex; ++ fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; ++ rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); ++ if (IS_ERR(rt)) { ++ dev->stats.tx_carrier_errors++; ++ goto tx_error_icmp; ++ } ++ dst = &rt->dst; ++ skb_dst_set(skb, dst); + } + + dst_hold(dst); +diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c +index 557fe3880a3f..396a0f61f5f8 100644 +--- a/net/ipv6/ip6_vti.c ++++ b/net/ipv6/ip6_vti.c +@@ -453,8 +453,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + int err = -1; + int mtu; + +- if (!dst) +- goto tx_err_link_failure; ++ if (!dst) { ++ fl->u.ip6.flowi6_oif = dev->ifindex; ++ fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; ++ dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); ++ if (dst->error) { ++ dst_release(dst); ++ dst = NULL; ++ goto tx_err_link_failure; ++ } ++ skb_dst_set(skb, dst); ++ } + + dst_hold(dst); + dst = xfrm_lookup(t->net, dst, fl, NULL, 0); +diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c +index d437007b15bb..b1484b8316e8 100644 +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -2800,6 +2800,28 @@ static int ieee80211_start_radar_detection(struct wiphy *wiphy, + return err; + } + ++static void ieee80211_end_cac(struct wiphy *wiphy, ++ struct net_device *dev) ++{ ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); ++ struct ieee80211_local *local = sdata->local; ++ ++ mutex_lock(&local->mtx); ++ list_for_each_entry(sdata, &local->interfaces, list) { ++ /* it might be waiting for the local->mtx, but then ++ * by the time it gets it, sdata->wdev.cac_started ++ * will no longer be true ++ */ ++ cancel_delayed_work(&sdata->dfs_cac_timer_work); ++ ++ if (sdata->wdev.cac_started) { ++ ieee80211_vif_release_channel(sdata); ++ sdata->wdev.cac_started = false; ++ } ++ } ++ mutex_unlock(&local->mtx); ++} ++ + static struct cfg80211_beacon_data * + cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon) + { +@@ -3730,6 +3752,7 @@ const struct cfg80211_ops mac80211_config_ops = { + #endif + .get_channel = ieee80211_cfg_get_channel, + .start_radar_detection = ieee80211_start_radar_detection, ++ .end_cac = ieee80211_end_cac, + .channel_switch = ieee80211_channel_switch, + .set_qos_map = ieee80211_set_qos_map, + .set_ap_chanwidth = ieee80211_set_ap_chanwidth, +diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c +index fab0764c315f..994dde6e5f9d 100644 +--- a/net/mac80211/mesh_hwmp.c ++++ b/net/mac80211/mesh_hwmp.c +@@ -326,6 +326,9 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local, + unsigned long fail_avg = + ewma_mesh_fail_avg_read(&sta->mesh->fail_avg); + ++ if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) ++ return MAX_METRIC; ++ + /* Try to get rate based on HW/SW RC algorithm. + * Rate is returned in units of Kbps, correct this + * to comply with airtime calculation units +diff --git a/net/mac80211/tkip.c b/net/mac80211/tkip.c +index b3622823bad2..ebd66e8f46b3 100644 +--- a/net/mac80211/tkip.c ++++ b/net/mac80211/tkip.c +@@ -266,9 +266,21 @@ int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm, + if ((keyid >> 6) != key->conf.keyidx) + return TKIP_DECRYPT_INVALID_KEYIDX; + +- if (rx_ctx->ctx.state != TKIP_STATE_NOT_INIT && +- (iv32 < rx_ctx->iv32 || +- (iv32 == rx_ctx->iv32 && iv16 <= rx_ctx->iv16))) ++ /* Reject replays if the received TSC is smaller than or equal to the ++ * last received value in a valid message, but with an exception for ++ * the case where a new key has been set and no valid frame using that ++ * key has yet received and the local RSC was initialized to 0. This ++ * exception allows the very first frame sent by the transmitter to be ++ * accepted even if that transmitter were to use TSC 0 (IEEE 802.11 ++ * described TSC to be initialized to 1 whenever a new key is taken into ++ * use). ++ */ ++ if (iv32 < rx_ctx->iv32 || ++ (iv32 == rx_ctx->iv32 && ++ (iv16 < rx_ctx->iv16 || ++ (iv16 == rx_ctx->iv16 && ++ (rx_ctx->iv32 || rx_ctx->iv16 || ++ rx_ctx->ctx.state != TKIP_STATE_NOT_INIT))))) + return TKIP_DECRYPT_REPLAY; + + if (only_iv) { +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index 60f2354c1789..a48dca26f178 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -242,6 +242,9 @@ static int tcf_em_validate(struct tcf_proto *tp, + goto errout; + + if (em->ops->change) { ++ err = -EINVAL; ++ if (em_hdr->flags & TCF_EM_SIMPLE) ++ goto errout; + err = em->ops->change(net, data, data_len, em); + if (err < 0) + goto errout; +diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h +index 249919bdfc64..4077bb3af440 100644 +--- a/net/wireless/rdev-ops.h ++++ b/net/wireless/rdev-ops.h +@@ -1143,6 +1143,16 @@ rdev_start_radar_detection(struct cfg80211_registered_device *rdev, + return ret; + } + ++static inline void ++rdev_end_cac(struct cfg80211_registered_device *rdev, ++ struct net_device *dev) ++{ ++ trace_rdev_end_cac(&rdev->wiphy, dev); ++ if (rdev->ops->end_cac) ++ rdev->ops->end_cac(&rdev->wiphy, dev); ++ trace_rdev_return_void(&rdev->wiphy); ++} ++ + static inline int + rdev_set_mcast_rate(struct cfg80211_registered_device *rdev, + struct net_device *dev, +diff --git a/net/wireless/reg.c b/net/wireless/reg.c +index 804eac073b6b..a520f433d476 100644 +--- a/net/wireless/reg.c ++++ b/net/wireless/reg.c +@@ -1718,14 +1718,15 @@ static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator) + + static void handle_channel_custom(struct wiphy *wiphy, + struct ieee80211_channel *chan, +- const struct ieee80211_regdomain *regd) ++ const struct ieee80211_regdomain *regd, ++ u32 min_bw) + { + u32 bw_flags = 0; + const struct ieee80211_reg_rule *reg_rule = NULL; + const struct ieee80211_power_rule *power_rule = NULL; + u32 bw; + +- for (bw = MHZ_TO_KHZ(20); bw >= MHZ_TO_KHZ(5); bw = bw / 2) { ++ for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) { + reg_rule = freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), + regd, bw); + if (!IS_ERR(reg_rule)) +@@ -1781,8 +1782,14 @@ static void handle_band_custom(struct wiphy *wiphy, + if (!sband) + return; + ++ /* ++ * We currently assume that you always want at least 20 MHz, ++ * otherwise channel 12 might get enabled if this rule is ++ * compatible to US, which permits 2402 - 2472 MHz. ++ */ + for (i = 0; i < sband->n_channels; i++) +- handle_channel_custom(wiphy, &sband->channels[i], regd); ++ handle_channel_custom(wiphy, &sband->channels[i], regd, ++ MHZ_TO_KHZ(20)); + } + + /* Used by drivers prior to wiphy registration */ +@@ -3296,6 +3303,25 @@ bool regulatory_pre_cac_allowed(struct wiphy *wiphy) + return pre_cac_allowed; + } + ++static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev) ++{ ++ struct wireless_dev *wdev; ++ /* If we finished CAC or received radar, we should end any ++ * CAC running on the same channels. ++ * the check !cfg80211_chandef_dfs_usable contain 2 options: ++ * either all channels are available - those the CAC_FINISHED ++ * event has effected another wdev state, or there is a channel ++ * in unavailable state in wdev chandef - those the RADAR_DETECTED ++ * event has effected another wdev state. ++ * In both cases we should end the CAC on the wdev. ++ */ ++ list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { ++ if (wdev->cac_started && ++ !cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef)) ++ rdev_end_cac(rdev, wdev->netdev); ++ } ++} ++ + void regulatory_propagate_dfs_state(struct wiphy *wiphy, + struct cfg80211_chan_def *chandef, + enum nl80211_dfs_state dfs_state, +@@ -3322,8 +3348,10 @@ void regulatory_propagate_dfs_state(struct wiphy *wiphy, + cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state); + + if (event == NL80211_RADAR_DETECTED || +- event == NL80211_RADAR_CAC_FINISHED) ++ event == NL80211_RADAR_CAC_FINISHED) { + cfg80211_sched_dfs_chan_update(rdev); ++ cfg80211_check_and_end_cac(rdev); ++ } + + nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL); + } +diff --git a/net/wireless/trace.h b/net/wireless/trace.h +index f3353fe5b35b..cd0a1c7c185d 100644 +--- a/net/wireless/trace.h ++++ b/net/wireless/trace.h +@@ -607,6 +607,11 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_flush_pmksa, + TP_ARGS(wiphy, netdev) + ); + ++DEFINE_EVENT(wiphy_netdev_evt, rdev_end_cac, ++ TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), ++ TP_ARGS(wiphy, netdev) ++); ++ + DECLARE_EVENT_CLASS(station_add_change, + TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac, + struct station_parameters *params), +diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c +index 6cdb054484d6..5236a3c2c0cc 100644 +--- a/net/wireless/wext-core.c ++++ b/net/wireless/wext-core.c +@@ -659,7 +659,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev) + return NULL; + } + +-static int iw_handler_get_iwstats(struct net_device * dev, ++/* noinline to avoid a bogus warning with -O3 */ ++static noinline int iw_handler_get_iwstats(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra) +diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c +index d8b6936e544e..908f13623f8c 100644 +--- a/sound/soc/sti/uniperif_player.c ++++ b/sound/soc/sti/uniperif_player.c +@@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player, + * sampling frequency. If no sample rate is already specified, then + * set one. + */ +- mutex_lock(&player->ctrl_lock); + if (runtime) { + switch (runtime->rate) { + case 22050: +@@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif *player, + player->stream_settings.iec958.status[3 + (n * 4)] << 24; + SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status); + } +- mutex_unlock(&player->ctrl_lock); + + /* Update the channel status */ + if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) +@@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif *player, + + SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player); + ++ mutex_lock(&player->ctrl_lock); + /* Update the channel status */ + uni_player_set_channel_status(player, runtime); ++ mutex_unlock(&player->ctrl_lock); + + /* Clear the user validity user bits */ + SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0); +@@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, + iec958->status[1] = ucontrol->value.iec958.status[1]; + iec958->status[2] = ucontrol->value.iec958.status[2]; + iec958->status[3] = ucontrol->value.iec958.status[3]; +- mutex_unlock(&player->ctrl_lock); + + spin_lock_irqsave(&player->irq_lock, flags); + if (player->substream && player->substream->runtime) +@@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol, + uni_player_set_channel_status(player, NULL); + + spin_unlock_irqrestore(&player->irq_lock, flags); ++ mutex_unlock(&player->ctrl_lock); ++ + return 0; + } + +diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h +index 6c3e2cc274c5..0ec646f127dc 100644 +--- a/tools/include/linux/string.h ++++ b/tools/include/linux/string.h +@@ -14,7 +14,15 @@ int strtobool(const char *s, bool *res); + * However uClibc headers also define __GLIBC__ hence the hack below + */ + #if defined(__GLIBC__) && !defined(__UCLIBC__) ++// pragma diagnostic was introduced in gcc 4.6 ++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wredundant-decls" ++#endif + extern size_t strlcpy(char *dest, const char *src, size_t size); ++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) ++#pragma GCC diagnostic pop ++#endif + #endif + + char *str_error_r(int errnum, char *buf, size_t buflen); +diff --git a/tools/lib/string.c b/tools/lib/string.c +index 93b3d4b6feac..ee0afcbdd696 100644 +--- a/tools/lib/string.c ++++ b/tools/lib/string.c +@@ -95,6 +95,10 @@ int strtobool(const char *s, bool *res) + * If libc has strlcpy() then that version will override this + * implementation: + */ ++#ifdef __clang__ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wignored-attributes" ++#endif + size_t __weak strlcpy(char *dest, const char *src, size_t size) + { + size_t ret = strlen(src); +@@ -106,3 +110,6 @@ size_t __weak strlcpy(char *dest, const char *src, size_t size) + } + return ret; + } ++#ifdef __clang__ ++#pragma clang diagnostic pop ++#endif +diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c +index bec7a2f1fb4d..264d458bfe2a 100644 +--- a/tools/perf/builtin-c2c.c ++++ b/tools/perf/builtin-c2c.c +@@ -528,8 +528,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + { + struct c2c_hist_entry *c2c_left; + struct c2c_hist_entry *c2c_right; +- unsigned int tot_hitm_left; +- unsigned int tot_hitm_right; ++ uint64_t tot_hitm_left; ++ uint64_t tot_hitm_right; + + c2c_left = container_of(left, struct c2c_hist_entry, he); + c2c_right = container_of(right, struct c2c_hist_entry, he); +@@ -562,7 +562,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __maybe_unused, \ + \ + c2c_left = container_of(left, struct c2c_hist_entry, he); \ + c2c_right = container_of(right, struct c2c_hist_entry, he); \ +- return c2c_left->stats.__f - c2c_right->stats.__f; \ ++ return (uint64_t) c2c_left->stats.__f - \ ++ (uint64_t) c2c_right->stats.__f; \ + } + + #define STAT_FN(__f) \ +@@ -615,7 +616,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + c2c_left = container_of(left, struct c2c_hist_entry, he); + c2c_right = container_of(right, struct c2c_hist_entry, he); + +- return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats); ++ return (uint64_t) llc_miss(&c2c_left->stats) - ++ (uint64_t) llc_miss(&c2c_right->stats); + } + + static uint64_t total_records(struct c2c_stats *stats) +diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c +index 17b26661b2f6..429c3e140dc3 100644 +--- a/tools/perf/builtin-report.c ++++ b/tools/perf/builtin-report.c +@@ -342,10 +342,10 @@ static int report__setup_sample_type(struct report *rep) + PERF_SAMPLE_BRANCH_ANY)) + rep->nonany_branch_mode = true; + +-#ifndef HAVE_LIBUNWIND_SUPPORT ++#if !defined(HAVE_LIBUNWIND_SUPPORT) && !defined(HAVE_DWARF_SUPPORT) + if (dwarf_callchain_users) { +- ui__warning("Please install libunwind development packages " +- "during the perf build.\n"); ++ ui__warning("Please install libunwind or libdw " ++ "development packages during the perf build.\n"); + } + #endif + From bd128e97a317abc1cb0afcd80317faa7d3b50afc Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Sun, 9 Feb 2020 16:13:09 +0100 Subject: [PATCH 33/54] Add Rockchip legacy upstream patches --- .../rk3399-legacy/patch-4.4.211-212.patch | 5145 +++++++++++++++++ .../rk3399-legacy/patch-4.4.212-213.patch | 1559 +++++ ...GBE_usb_rtl8156_to_v2.12.0.patch.disabled} | 0 .../rockchip-legacy/patch-4.4.211-212.patch | 5145 +++++++++++++++++ .../rockchip-legacy/patch-4.4.212-213.patch | 1559 +++++ 5 files changed, 13408 insertions(+) create mode 100644 patch/kernel/rk3399-legacy/patch-4.4.211-212.patch create mode 100644 patch/kernel/rk3399-legacy/patch-4.4.212-213.patch rename patch/kernel/rk3399-legacy/{update_2.5GBE_usb_rtl8156_to_v2.12.0.patch => update_2.5GBE_usb_rtl8156_to_v2.12.0.patch.disabled} (100%) create mode 100644 patch/kernel/rockchip-legacy/patch-4.4.211-212.patch create mode 100644 patch/kernel/rockchip-legacy/patch-4.4.212-213.patch diff --git a/patch/kernel/rk3399-legacy/patch-4.4.211-212.patch b/patch/kernel/rk3399-legacy/patch-4.4.211-212.patch new file mode 100644 index 0000000000..150526f647 --- /dev/null +++ b/patch/kernel/rk3399-legacy/patch-4.4.211-212.patch @@ -0,0 +1,5145 @@ +diff --git a/Makefile b/Makefile +index 9f03733dac69..379f2a525c02 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 4 + PATCHLEVEL = 4 +-SUBLEVEL = 211 ++SUBLEVEL = 212 + EXTRAVERSION = + NAME = Blurry Fish Butt + +diff --git a/arch/arm/common/mcpm_entry.c b/arch/arm/common/mcpm_entry.c +index a923524d1040..8617323eb273 100644 +--- a/arch/arm/common/mcpm_entry.c ++++ b/arch/arm/common/mcpm_entry.c +@@ -379,7 +379,7 @@ static int __init nocache_trampoline(unsigned long _arg) + unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); + phys_reset_t phys_reset; + +- mcpm_set_entry_vector(cpu, cluster, cpu_resume); ++ mcpm_set_entry_vector(cpu, cluster, cpu_resume_no_hyp); + setup_mm_for_reboot(); + + __mcpm_cpu_going_down(cpu, cluster); +diff --git a/arch/arm/include/asm/suspend.h b/arch/arm/include/asm/suspend.h +index 6c7182f32cef..e6c2f426f8c8 100644 +--- a/arch/arm/include/asm/suspend.h ++++ b/arch/arm/include/asm/suspend.h +@@ -7,6 +7,7 @@ struct sleep_save_sp { + }; + + extern void cpu_resume(void); ++extern void cpu_resume_no_hyp(void); + extern void cpu_resume_arm(void); + extern int cpu_suspend(unsigned long, int (*)(unsigned long)); + +diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S +index 0f6c1000582c..c8569390e7e7 100644 +--- a/arch/arm/kernel/sleep.S ++++ b/arch/arm/kernel/sleep.S +@@ -119,6 +119,14 @@ ENDPROC(cpu_resume_after_mmu) + .text + .align + ++#ifdef CONFIG_MCPM ++ .arm ++THUMB( .thumb ) ++ENTRY(cpu_resume_no_hyp) ++ARM_BE8(setend be) @ ensure we are in BE mode ++ b no_hyp ++#endif ++ + #ifdef CONFIG_MMU + .arm + ENTRY(cpu_resume_arm) +@@ -134,6 +142,7 @@ ARM_BE8(setend be) @ ensure we are in BE mode + bl __hyp_stub_install_secondary + #endif + safe_svcmode_maskall r1 ++no_hyp: + mov r1, #0 + ALT_SMP(mrc p15, 0, r0, c0, c0, 5) + ALT_UP_B(1f) +@@ -162,6 +171,9 @@ ENDPROC(cpu_resume) + + #ifdef CONFIG_MMU + ENDPROC(cpu_resume_arm) ++#endif ++#ifdef CONFIG_MCPM ++ENDPROC(cpu_resume_no_hyp) + #endif + + .align 2 +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c +index 36706d32d656..1bc87c29467b 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -2563,7 +2563,7 @@ static void _setup_iclk_autoidle(struct omap_hwmod *oh) + */ + static int _setup_reset(struct omap_hwmod *oh) + { +- int r; ++ int r = 0; + + if (oh->_state != _HWMOD_STATE_INITIALIZED) + return -EINVAL; +diff --git a/arch/arm/mach-rpc/irq.c b/arch/arm/mach-rpc/irq.c +index 66502e6207fe..fce7fecbd8fa 100644 +--- a/arch/arm/mach-rpc/irq.c ++++ b/arch/arm/mach-rpc/irq.c +@@ -117,7 +117,7 @@ extern unsigned char rpc_default_fiq_start, rpc_default_fiq_end; + + void __init rpc_init_irq(void) + { +- unsigned int irq, clr, set = 0; ++ unsigned int irq, clr, set; + + iomd_writeb(0, IOMD_IRQMASKA); + iomd_writeb(0, IOMD_IRQMASKB); +@@ -129,6 +129,7 @@ void __init rpc_init_irq(void) + + for (irq = 0; irq < NR_IRQS; irq++) { + clr = IRQ_NOREQUEST; ++ set = 0; + + if (irq <= 6 || (irq >= 9 && irq <= 15)) + clr |= IRQ_NOPROBE; +diff --git a/arch/arm/plat-pxa/ssp.c b/arch/arm/plat-pxa/ssp.c +index 6748827c2ec8..b6b0979e3cf9 100644 +--- a/arch/arm/plat-pxa/ssp.c ++++ b/arch/arm/plat-pxa/ssp.c +@@ -231,18 +231,12 @@ static int pxa_ssp_probe(struct platform_device *pdev) + + static int pxa_ssp_remove(struct platform_device *pdev) + { +- struct resource *res; + struct ssp_device *ssp; + + ssp = platform_get_drvdata(pdev); + if (ssp == NULL) + return -ENODEV; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- release_mem_region(res->start, resource_size(res)); +- +- clk_put(ssp->clk); +- + mutex_lock(&ssp_lock); + list_del(&ssp->node); + mutex_unlock(&ssp_lock); +diff --git a/arch/arm64/boot/dts/arm/juno-clocks.dtsi b/arch/arm64/boot/dts/arm/juno-clocks.dtsi +index 25352ed943e6..00bcbf7688c7 100644 +--- a/arch/arm64/boot/dts/arm/juno-clocks.dtsi ++++ b/arch/arm64/boot/dts/arm/juno-clocks.dtsi +@@ -8,10 +8,10 @@ + */ + + /* SoC fixed clocks */ +- soc_uartclk: refclk7273800hz { ++ soc_uartclk: refclk7372800hz { + compatible = "fixed-clock"; + #clock-cells = <0>; +- clock-frequency = <7273800>; ++ clock-frequency = <7372800>; + clock-output-names = "juno:uartclk"; + }; + +diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c +index 2081b8cd5591..b9aee983e6f4 100644 +--- a/arch/m68k/amiga/cia.c ++++ b/arch/m68k/amiga/cia.c +@@ -88,10 +88,19 @@ static irqreturn_t cia_handler(int irq, void *dev_id) + struct ciabase *base = dev_id; + int mach_irq; + unsigned char ints; ++ unsigned long flags; + ++ /* Interrupts get disabled while the timer irq flag is cleared and ++ * the timer interrupt serviced. ++ */ + mach_irq = base->cia_irq; ++ local_irq_save(flags); + ints = cia_set_irq(base, CIA_ICR_ALL); + amiga_custom.intreq = base->int_mask; ++ if (ints & 1) ++ generic_handle_irq(mach_irq); ++ local_irq_restore(flags); ++ mach_irq++, ints >>= 1; + for (; ints; mach_irq++, ints >>= 1) { + if (ints & 1) + generic_handle_irq(mach_irq); +diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c +index 3d2b63bedf05..56f02ea2c248 100644 +--- a/arch/m68k/atari/ataints.c ++++ b/arch/m68k/atari/ataints.c +@@ -142,7 +142,7 @@ struct mfptimerbase { + .name = "MFP Timer D" + }; + +-static irqreturn_t mfptimer_handler(int irq, void *dev_id) ++static irqreturn_t mfp_timer_d_handler(int irq, void *dev_id) + { + struct mfptimerbase *base = dev_id; + int mach_irq; +@@ -344,7 +344,7 @@ void __init atari_init_IRQ(void) + st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 0xf0) | 0x6; + + /* request timer D dispatch handler */ +- if (request_irq(IRQ_MFP_TIMD, mfptimer_handler, IRQF_SHARED, ++ if (request_irq(IRQ_MFP_TIMD, mfp_timer_d_handler, IRQF_SHARED, + stmfp_base.name, &stmfp_base)) + pr_err("Couldn't register %s interrupt\n", stmfp_base.name); + +diff --git a/arch/m68k/atari/time.c b/arch/m68k/atari/time.c +index c549b48174ec..972181c1fe4b 100644 +--- a/arch/m68k/atari/time.c ++++ b/arch/m68k/atari/time.c +@@ -24,6 +24,18 @@ + DEFINE_SPINLOCK(rtc_lock); + EXPORT_SYMBOL_GPL(rtc_lock); + ++static irqreturn_t mfp_timer_c_handler(int irq, void *dev_id) ++{ ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; ++} ++ + void __init + atari_sched_init(irq_handler_t timer_routine) + { +@@ -32,7 +44,8 @@ atari_sched_init(irq_handler_t timer_routine) + /* start timer C, div = 1:100 */ + st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60; + /* install interrupt service routine for MFP Timer C */ +- if (request_irq(IRQ_MFP_TIMC, timer_routine, 0, "timer", timer_routine)) ++ if (request_irq(IRQ_MFP_TIMC, mfp_timer_c_handler, 0, "timer", ++ timer_routine)) + pr_err("Couldn't register timer interrupt\n"); + } + +diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c +index 478623dbb209..62054c01ecb4 100644 +--- a/arch/m68k/bvme6000/config.c ++++ b/arch/m68k/bvme6000/config.c +@@ -46,11 +46,6 @@ extern int bvme6000_set_clock_mmss (unsigned long); + extern void bvme6000_reset (void); + void bvme6000_set_vectors (void); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/timer/timekeeping.c, called via bvme6000_process_int() */ +- +-static irq_handler_t tick_handler; +- + + int __init bvme6000_parse_bootinfo(const struct bi_record *bi) + { +@@ -160,12 +155,18 @@ irqreturn_t bvme6000_abort_int (int irq, void *dev_id) + + static irqreturn_t bvme6000_timer_int (int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; +- unsigned char msr = rtc->msr & 0xc0; ++ unsigned char msr; + ++ local_irq_save(flags); ++ msr = rtc->msr & 0xc0; + rtc->msr = msr | 0x20; /* Ack the interrupt */ ++ timer_routine(0, NULL); ++ local_irq_restore(flags); + +- return tick_handler(irq, dev_id); ++ return IRQ_HANDLED; + } + + /* +@@ -184,9 +185,8 @@ void bvme6000_sched_init (irq_handler_t timer_routine) + + rtc->msr = 0; /* Ensure timer registers accessible */ + +- tick_handler = timer_routine; +- if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, +- "timer", bvme6000_timer_int)) ++ if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, "timer", ++ timer_routine)) + panic ("Couldn't register timer int"); + + rtc->t1cr_omr = 0x04; /* Mode 2, ext clk */ +diff --git a/arch/m68k/hp300/time.c b/arch/m68k/hp300/time.c +index 749543b425a4..03c83b8f9032 100644 +--- a/arch/m68k/hp300/time.c ++++ b/arch/m68k/hp300/time.c +@@ -37,13 +37,19 @@ + + static irqreturn_t hp300_tick(int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + unsigned long tmp; +- irq_handler_t vector = dev_id; ++ ++ local_irq_save(flags); + in_8(CLOCKBASE + CLKSR); + asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE)); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ + /* Turn off the network and SCSI leds */ + blinken_leds(0, 0xe0); +- return vector(irq, NULL); ++ return IRQ_HANDLED; + } + + u32 hp300_gettimeoffset(void) +diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c +index ce56e04386e7..49f9fa4529a8 100644 +--- a/arch/m68k/mac/via.c ++++ b/arch/m68k/mac/via.c +@@ -53,16 +53,6 @@ static __u8 rbv_clear; + + static int gIER,gIFR,gBufA,gBufB; + +-/* +- * Timer defs. +- */ +- +-#define TICK_SIZE 10000 +-#define MAC_CLOCK_TICK (783300/HZ) /* ticks per HZ */ +-#define MAC_CLOCK_LOW (MAC_CLOCK_TICK&0xFF) +-#define MAC_CLOCK_HIGH (MAC_CLOCK_TICK>>8) +- +- + /* + * On Macs with a genuine VIA chip there is no way to mask an individual slot + * interrupt. This limitation also seems to apply to VIA clone logic cores in +@@ -277,22 +267,6 @@ void __init via_init(void) + } + } + +-/* +- * Start the 100 Hz clock +- */ +- +-void __init via_init_clock(irq_handler_t func) +-{ +- via1[vACR] |= 0x40; +- via1[vT1LL] = MAC_CLOCK_LOW; +- via1[vT1LH] = MAC_CLOCK_HIGH; +- via1[vT1CL] = MAC_CLOCK_LOW; +- via1[vT1CH] = MAC_CLOCK_HIGH; +- +- if (request_irq(IRQ_MAC_TIMER_1, func, 0, "timer", func)) +- pr_err("Couldn't register %s interrupt\n", "timer"); +-} +- + /* + * Debugging dump, used in various places to see what's going on. + */ +@@ -320,29 +294,6 @@ void via_debug_dump(void) + } + } + +-/* +- * This is always executed with interrupts disabled. +- * +- * TBI: get time offset between scheduling timer ticks +- */ +- +-u32 mac_gettimeoffset(void) +-{ +- unsigned long ticks, offset = 0; +- +- /* read VIA1 timer 2 current value */ +- ticks = via1[vT1CL] | (via1[vT1CH] << 8); +- /* The probability of underflow is less than 2% */ +- if (ticks > MAC_CLOCK_TICK - MAC_CLOCK_TICK / 50) +- /* Check for pending timer interrupt in VIA1 IFR */ +- if (via1[vIFR] & 0x40) offset = TICK_SIZE; +- +- ticks = MAC_CLOCK_TICK - ticks; +- ticks = ticks * 10000L / MAC_CLOCK_TICK; +- +- return (ticks + offset) * 1000; +-} +- + /* + * Flush the L2 cache on Macs that have it by flipping + * the system into 24-bit mode for an instant. +@@ -446,6 +397,8 @@ void via_nubus_irq_shutdown(int irq) + * via6522.c :-), disable/pending masks added. + */ + ++#define VIA_TIMER_1_INT BIT(6) ++ + void via1_irq(struct irq_desc *desc) + { + int irq_num; +@@ -455,6 +408,21 @@ void via1_irq(struct irq_desc *desc) + if (!events) + return; + ++ irq_num = IRQ_MAC_TIMER_1; ++ irq_bit = VIA_TIMER_1_INT; ++ if (events & irq_bit) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ via1[vIFR] = irq_bit; ++ generic_handle_irq(irq_num); ++ local_irq_restore(flags); ++ ++ events &= ~irq_bit; ++ if (!events) ++ return; ++ } ++ + irq_num = VIA1_SOURCE_BASE; + irq_bit = 1; + do { +@@ -619,3 +587,56 @@ int via2_scsi_drq_pending(void) + return via2[gIFR] & (1 << IRQ_IDX(IRQ_MAC_SCSIDRQ)); + } + EXPORT_SYMBOL(via2_scsi_drq_pending); ++ ++/* timer and clock source */ ++ ++#define VIA_CLOCK_FREQ 783360 /* VIA "phase 2" clock in Hz */ ++#define VIA_TIMER_INTERVAL (1000000 / HZ) /* microseconds per jiffy */ ++#define VIA_TIMER_CYCLES (VIA_CLOCK_FREQ / HZ) /* clock cycles per jiffy */ ++ ++#define VIA_TC (VIA_TIMER_CYCLES - 2) /* including 0 and -1 */ ++#define VIA_TC_LOW (VIA_TC & 0xFF) ++#define VIA_TC_HIGH (VIA_TC >> 8) ++ ++void __init via_init_clock(irq_handler_t timer_routine) ++{ ++ if (request_irq(IRQ_MAC_TIMER_1, timer_routine, 0, "timer", NULL)) { ++ pr_err("Couldn't register %s interrupt\n", "timer"); ++ return; ++ } ++ ++ via1[vT1LL] = VIA_TC_LOW; ++ via1[vT1LH] = VIA_TC_HIGH; ++ via1[vT1CL] = VIA_TC_LOW; ++ via1[vT1CH] = VIA_TC_HIGH; ++ via1[vACR] |= 0x40; ++} ++ ++u32 mac_gettimeoffset(void) ++{ ++ unsigned long flags; ++ u8 count_high; ++ u16 count, offset = 0; ++ ++ /* ++ * Timer counter wrap-around is detected with the timer interrupt flag ++ * but reading the counter low byte (vT1CL) would reset the flag. ++ * Also, accessing both counter registers is essentially a data race. ++ * These problems are avoided by ignoring the low byte. Clock accuracy ++ * is 256 times worse (error can reach 0.327 ms) but CPU overhead is ++ * reduced by avoiding slow VIA register accesses. ++ */ ++ ++ local_irq_save(flags); ++ count_high = via1[vT1CH]; ++ if (count_high == 0xFF) ++ count_high = 0; ++ if (count_high > 0 && (via1[vIFR] & VIA_TIMER_1_INT)) ++ offset = VIA_TIMER_CYCLES; ++ local_irq_restore(flags); ++ ++ count = count_high << 8; ++ count = VIA_TIMER_CYCLES - count + offset; ++ ++ return ((count * VIA_TIMER_INTERVAL) / VIA_TIMER_CYCLES) * 1000; ++} +diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c +index e6a3b56c6481..152fbde23424 100644 +--- a/arch/m68k/mvme147/config.c ++++ b/arch/m68k/mvme147/config.c +@@ -47,11 +47,6 @@ extern void mvme147_reset (void); + + static int bcd2int (unsigned char b); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/time/timekeeping.c, called via mvme147_process_int() */ +- +-irq_handler_t tick_handler; +- + + int __init mvme147_parse_bootinfo(const struct bi_record *bi) + { +@@ -107,16 +102,23 @@ void __init config_mvme147(void) + + static irqreturn_t mvme147_timer_int (int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); + m147_pcc->t1_int_cntrl = PCC_TIMER_INT_CLR; + m147_pcc->t1_int_cntrl = PCC_INT_ENAB|PCC_LEVEL_TIMER1; +- return tick_handler(irq, dev_id); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; + } + + + void mvme147_sched_init (irq_handler_t timer_routine) + { +- tick_handler = timer_routine; +- if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", NULL)) ++ if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", ++ timer_routine)) + pr_err("Couldn't register timer interrupt\n"); + + /* Init the clock with a value */ +diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c +index a53803cc66cd..0d43bfb3324d 100644 +--- a/arch/m68k/mvme16x/config.c ++++ b/arch/m68k/mvme16x/config.c +@@ -52,11 +52,6 @@ extern void mvme16x_reset (void); + + int bcd2int (unsigned char b); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/time/timekeeping.c, called via mvme16x_process_int() */ +- +-static irq_handler_t tick_handler; +- + + unsigned short mvme16x_config; + EXPORT_SYMBOL(mvme16x_config); +@@ -355,8 +350,15 @@ static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) + + static irqreturn_t mvme16x_timer_int (int irq, void *dev_id) + { +- *(volatile unsigned char *)0xfff4201b |= 8; +- return tick_handler(irq, dev_id); ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ *(volatile unsigned char *)0xfff4201b |= 8; ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; + } + + void mvme16x_sched_init (irq_handler_t timer_routine) +@@ -364,14 +366,13 @@ void mvme16x_sched_init (irq_handler_t timer_routine) + uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); + int irq; + +- tick_handler = timer_routine; + /* Using PCCchip2 or MC2 chip tick timer 1 */ + *(volatile unsigned long *)0xfff42008 = 0; + *(volatile unsigned long *)0xfff42004 = 10000; /* 10ms */ + *(volatile unsigned char *)0xfff42017 |= 3; + *(volatile unsigned char *)0xfff4201b = 0x16; +- if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, +- "timer", mvme16x_timer_int)) ++ if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, "timer", ++ timer_routine)) + panic ("Couldn't register timer int"); + + if (brdno == 0x0162 || brdno == 0x172) +diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c +index 513f9bb17b9c..60b51f5b9cfc 100644 +--- a/arch/m68k/q40/q40ints.c ++++ b/arch/m68k/q40/q40ints.c +@@ -126,10 +126,10 @@ void q40_mksound(unsigned int hz, unsigned int ticks) + sound_ticks = ticks << 1; + } + +-static irq_handler_t q40_timer_routine; +- +-static irqreturn_t q40_timer_int (int irq, void * dev) ++static irqreturn_t q40_timer_int(int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ + ql_ticks = ql_ticks ? 0 : 1; + if (sound_ticks) { + unsigned char sval=(sound_ticks & 1) ? 128-SVOL : 128+SVOL; +@@ -138,8 +138,13 @@ static irqreturn_t q40_timer_int (int irq, void * dev) + *DAC_RIGHT=sval; + } + +- if (!ql_ticks) +- q40_timer_routine(irq, dev); ++ if (!ql_ticks) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ } + return IRQ_HANDLED; + } + +@@ -147,11 +152,9 @@ void q40_sched_init (irq_handler_t timer_routine) + { + int timer_irq; + +- q40_timer_routine = timer_routine; + timer_irq = Q40_IRQ_FRAME; + +- if (request_irq(timer_irq, q40_timer_int, 0, +- "timer", q40_timer_int)) ++ if (request_irq(timer_irq, q40_timer_int, 0, "timer", timer_routine)) + panic("Couldn't register timer int"); + + master_outb(-1, FRAME_CLEAR_REG); +diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c +index 6bbca30c9188..a5824abb4a39 100644 +--- a/arch/m68k/sun3/sun3ints.c ++++ b/arch/m68k/sun3/sun3ints.c +@@ -61,8 +61,10 @@ static irqreturn_t sun3_int7(int irq, void *dev_id) + + static irqreturn_t sun3_int5(int irq, void *dev_id) + { ++ unsigned long flags; + unsigned int cnt; + ++ local_irq_save(flags); + #ifdef CONFIG_SUN3 + intersil_clear(); + #endif +@@ -76,6 +78,7 @@ static irqreturn_t sun3_int5(int irq, void *dev_id) + cnt = kstat_irqs_cpu(irq, 0); + if (!(cnt % 20)) + sun3_leds(led_pattern[cnt % 160 / 20]); ++ local_irq_restore(flags); + return IRQ_HANDLED; + } + +diff --git a/arch/m68k/sun3x/time.c b/arch/m68k/sun3x/time.c +index c8eb08add6b0..7a195313ff4f 100644 +--- a/arch/m68k/sun3x/time.c ++++ b/arch/m68k/sun3x/time.c +@@ -77,15 +77,19 @@ u32 sun3x_gettimeoffset(void) + } + + #if 0 +-static void sun3x_timer_tick(int irq, void *dev_id, struct pt_regs *regs) ++static irqreturn_t sun3x_timer_tick(int irq, void *dev_id) + { +- void (*vector)(int, void *, struct pt_regs *) = dev_id; ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + +- /* Clear the pending interrupt - pulse the enable line low */ +- disable_irq(5); +- enable_irq(5); ++ local_irq_save(flags); ++ /* Clear the pending interrupt - pulse the enable line low */ ++ disable_irq(5); ++ enable_irq(5); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); + +- vector(irq, NULL, regs); ++ return IRQ_HANDLED; + } + #endif + +diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h +index ab1df19b0957..60604b26fa72 100644 +--- a/arch/mips/include/asm/io.h ++++ b/arch/mips/include/asm/io.h +@@ -60,21 +60,11 @@ + * instruction, so the lower 16 bits must be zero. Should be true on + * on any sane architecture; generic code does not use this assumption. + */ +-extern const unsigned long mips_io_port_base; ++extern unsigned long mips_io_port_base; + +-/* +- * Gcc will generate code to load the value of mips_io_port_base after each +- * function call which may be fairly wasteful in some cases. So we don't +- * play quite by the book. We tell gcc mips_io_port_base is a long variable +- * which solves the code generation issue. Now we need to violate the +- * aliasing rules a little to make initialization possible and finally we +- * will need the barrier() to fight side effects of the aliasing chat. +- * This trickery will eventually collapse under gcc's optimizer. Oh well. +- */ + static inline void set_io_port_base(unsigned long base) + { +- * (unsigned long *) &mips_io_port_base = base; +- barrier(); ++ mips_io_port_base = base; + } + + /* +diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c +index 4f9f1ae49213..fadc946b306d 100644 +--- a/arch/mips/kernel/setup.c ++++ b/arch/mips/kernel/setup.c +@@ -80,7 +80,7 @@ static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; + * mips_io_port_base is the begin of the address space to which x86 style + * I/O ports are mapped. + */ +-const unsigned long mips_io_port_base = -1; ++unsigned long mips_io_port_base = -1; + EXPORT_SYMBOL(mips_io_port_base); + + static struct resource code_resource = { .name = "Kernel code", }; +diff --git a/arch/nios2/kernel/nios2_ksyms.c b/arch/nios2/kernel/nios2_ksyms.c +index bf2f55d10a4d..4e704046a150 100644 +--- a/arch/nios2/kernel/nios2_ksyms.c ++++ b/arch/nios2/kernel/nios2_ksyms.c +@@ -9,12 +9,20 @@ + #include + #include + ++#include ++#include ++ + /* string functions */ + + EXPORT_SYMBOL(memcpy); + EXPORT_SYMBOL(memset); + EXPORT_SYMBOL(memmove); + ++/* memory management */ ++ ++EXPORT_SYMBOL(empty_zero_page); ++EXPORT_SYMBOL(flush_icache_range); ++ + /* + * libgcc functions - functions that are used internally by the + * compiler... (prototypes are not correct though, but that +@@ -31,3 +39,7 @@ DECLARE_EXPORT(__udivsi3); + DECLARE_EXPORT(__umoddi3); + DECLARE_EXPORT(__umodsi3); + DECLARE_EXPORT(__muldi3); ++DECLARE_EXPORT(__ucmpdi2); ++DECLARE_EXPORT(__lshrdi3); ++DECLARE_EXPORT(__ashldi3); ++DECLARE_EXPORT(__ashrdi3); +diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile +index d7eb035a9c96..65cb22541c66 100644 +--- a/arch/powerpc/Makefile ++++ b/arch/powerpc/Makefile +@@ -350,7 +350,9 @@ vdso_install: + ifeq ($(CONFIG_PPC64),y) + $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@ + endif ++ifdef CONFIG_VDSO32 + $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso32 $@ ++endif + + archclean: + $(Q)$(MAKE) $(clean)=$(boot) +diff --git a/arch/powerpc/include/asm/archrandom.h b/arch/powerpc/include/asm/archrandom.h +index 85e88f7a59c0..9ff848e3c4a6 100644 +--- a/arch/powerpc/include/asm/archrandom.h ++++ b/arch/powerpc/include/asm/archrandom.h +@@ -27,7 +27,7 @@ static inline int arch_get_random_seed_int(unsigned int *v) + unsigned long val; + int rc; + +- rc = arch_get_random_long(&val); ++ rc = arch_get_random_seed_long(&val); + if (rc) + *v = val; + +diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c +index c641983bbdd6..3394a72b19f2 100644 +--- a/arch/powerpc/kernel/cacheinfo.c ++++ b/arch/powerpc/kernel/cacheinfo.c +@@ -867,4 +867,21 @@ void cacheinfo_cpu_offline(unsigned int cpu_id) + if (cache) + cache_cpu_clear(cache, cpu_id); + } ++ ++void cacheinfo_teardown(void) ++{ ++ unsigned int cpu; ++ ++ for_each_online_cpu(cpu) ++ cacheinfo_cpu_offline(cpu); ++} ++ ++void cacheinfo_rebuild(void) ++{ ++ unsigned int cpu; ++ ++ for_each_online_cpu(cpu) ++ cacheinfo_cpu_online(cpu); ++} ++ + #endif /* (CONFIG_PPC_PSERIES && CONFIG_SUSPEND) || CONFIG_HOTPLUG_CPU */ +diff --git a/arch/powerpc/kernel/cacheinfo.h b/arch/powerpc/kernel/cacheinfo.h +index a7b74d36acd7..2cdee87a482c 100644 +--- a/arch/powerpc/kernel/cacheinfo.h ++++ b/arch/powerpc/kernel/cacheinfo.h +@@ -5,4 +5,8 @@ + extern void cacheinfo_cpu_online(unsigned int cpu_id); + extern void cacheinfo_cpu_offline(unsigned int cpu_id); + ++/* Allow migration/suspend to tear down and rebuild the hierarchy. */ ++extern void cacheinfo_teardown(void); ++extern void cacheinfo_rebuild(void); ++ + #endif /* _PPC_CACHEINFO_H */ +diff --git a/arch/powerpc/sysdev/qe_lib/gpio.c b/arch/powerpc/sysdev/qe_lib/gpio.c +index 521e67a49dc4..4052e3d7edbd 100644 +--- a/arch/powerpc/sysdev/qe_lib/gpio.c ++++ b/arch/powerpc/sysdev/qe_lib/gpio.c +@@ -155,8 +155,10 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index) + if (err < 0) + goto err0; + gc = gpio_to_chip(err); +- if (WARN_ON(!gc)) ++ if (WARN_ON(!gc)) { ++ err = -ENODEV; + goto err0; ++ } + + if (!of_device_is_compatible(gc->of_node, "fsl,mpc8323-qe-pario-bank")) { + pr_debug("%s: tried to get a non-qe pin\n", __func__); +diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug +index 2aa212fb0faf..31c191a08bb1 100644 +--- a/arch/x86/Kconfig.debug ++++ b/arch/x86/Kconfig.debug +@@ -221,7 +221,7 @@ config HAVE_MMIOTRACE_SUPPORT + + config X86_DECODER_SELFTEST + bool "x86 instruction decoder selftest" +- depends on DEBUG_KERNEL && KPROBES ++ depends on DEBUG_KERNEL && INSTRUCTION_DECODER + depends on !COMPILE_TEST + ---help--- + Perform x86 instruction decoder selftests at build time. +diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c +index 44256a62702b..4a08fda2b06f 100644 +--- a/arch/x86/kernel/kgdb.c ++++ b/arch/x86/kernel/kgdb.c +@@ -437,7 +437,7 @@ static void kgdb_disable_hw_debug(struct pt_regs *regs) + */ + void kgdb_roundup_cpus(unsigned long flags) + { +- apic->send_IPI_allbutself(APIC_DM_NMI); ++ apic->send_IPI_allbutself(NMI_VECTOR); + } + #endif + +diff --git a/block/blk-merge.c b/block/blk-merge.c +index 7225511cf0b4..b8f1eaeeaac2 100644 +--- a/block/blk-merge.c ++++ b/block/blk-merge.c +@@ -296,13 +296,7 @@ void blk_recalc_rq_segments(struct request *rq) + + void blk_recount_segments(struct request_queue *q, struct bio *bio) + { +- unsigned short seg_cnt; +- +- /* estimate segment number by bi_vcnt for non-cloned bio */ +- if (bio_flagged(bio, BIO_CLONED)) +- seg_cnt = bio_segments(bio); +- else +- seg_cnt = bio->bi_vcnt; ++ unsigned short seg_cnt = bio_segments(bio); + + if (test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags) && + (seg_cnt < queue_max_segments(q))) +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index f8ec3d4ba4a8..a5718c0a3dc4 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -394,7 +394,7 @@ static int pcrypt_sysfs_add(struct padata_instance *pinst, const char *name) + int ret; + + pinst->kobj.kset = pcrypt_kset; +- ret = kobject_add(&pinst->kobj, NULL, name); ++ ret = kobject_add(&pinst->kobj, NULL, "%s", name); + if (!ret) + kobject_uevent(&pinst->kobj, KOBJ_ADD); + +diff --git a/crypto/tgr192.c b/crypto/tgr192.c +index 321bc6ff2a9d..904c8444aa0a 100644 +--- a/crypto/tgr192.c ++++ b/crypto/tgr192.c +@@ -25,8 +25,9 @@ + #include + #include + #include +-#include + #include ++#include ++#include + + #define TGR192_DIGEST_SIZE 24 + #define TGR160_DIGEST_SIZE 20 +@@ -468,10 +469,9 @@ static void tgr192_transform(struct tgr192_ctx *tctx, const u8 * data) + u64 a, b, c, aa, bb, cc; + u64 x[8]; + int i; +- const __le64 *ptr = (const __le64 *)data; + + for (i = 0; i < 8; i++) +- x[i] = le64_to_cpu(ptr[i]); ++ x[i] = get_unaligned_le64(data + i * sizeof(__le64)); + + /* save */ + a = aa = tctx->a; +diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c +index 8116cb2fef2d..1241cecfcfca 100644 +--- a/drivers/ata/libahci.c ++++ b/drivers/ata/libahci.c +@@ -187,7 +187,6 @@ struct ata_port_operations ahci_pmp_retry_srst_ops = { + EXPORT_SYMBOL_GPL(ahci_pmp_retry_srst_ops); + + static bool ahci_em_messages __read_mostly = true; +-EXPORT_SYMBOL_GPL(ahci_em_messages); + module_param(ahci_em_messages, bool, 0444); + /* add other LED protocol types when they become supported */ + MODULE_PARM_DESC(ahci_em_messages, +diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c +index 82f2ae0d7cc4..04b39d0da868 100644 +--- a/drivers/atm/firestream.c ++++ b/drivers/atm/firestream.c +@@ -923,6 +923,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + } + if (!to) { + printk ("No more free channels for FS50..\n"); ++ kfree(vcc); + return -EBUSY; + } + vcc->channo = dev->channo; +@@ -933,6 +934,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + if (((DO_DIRECTION(rxtp) && dev->atm_vccs[vcc->channo])) || + ( DO_DIRECTION(txtp) && test_bit (vcc->channo, dev->tx_inuse))) { + printk ("Channel is in use for FS155.\n"); ++ kfree(vcc); + return -EBUSY; + } + } +@@ -946,6 +948,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + tc, sizeof (struct fs_transmit_config)); + if (!tc) { + fs_dprintk (FS_DEBUG_OPEN, "fs: can't alloc transmit_config.\n"); ++ kfree(vcc); + return -ENOMEM; + } + +diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c +index f499a469e66d..12b2cc9a3fbe 100644 +--- a/drivers/bcma/driver_pci.c ++++ b/drivers/bcma/driver_pci.c +@@ -78,7 +78,7 @@ static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u16 device, u8 address) + v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); + } + +- v = BCMA_CORE_PCI_MDIODATA_START; ++ v |= BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_READ; + v |= BCMA_CORE_PCI_MDIODATA_TA; + +@@ -121,7 +121,7 @@ static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u16 device, + v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); + } + +- v = BCMA_CORE_PCI_MDIODATA_START; ++ v |= BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_WRITE; + v |= BCMA_CORE_PCI_MDIODATA_TA; + v |= data; +diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c +index 385ec4ae3394..456350bd24b3 100644 +--- a/drivers/block/drbd/drbd_main.c ++++ b/drivers/block/drbd/drbd_main.c +@@ -331,6 +331,8 @@ static int drbd_thread_setup(void *arg) + thi->name[0], + resource->name); + ++ allow_kernel_signal(DRBD_SIGKILL); ++ allow_kernel_signal(SIGXCPU); + restart: + retval = thi->function(thi); + +diff --git a/drivers/clk/clk-highbank.c b/drivers/clk/clk-highbank.c +index be3a21abb185..4105066b428c 100644 +--- a/drivers/clk/clk-highbank.c ++++ b/drivers/clk/clk-highbank.c +@@ -294,6 +294,7 @@ static __init struct clk *hb_clk_init(struct device_node *node, const struct clk + /* Map system registers */ + srnp = of_find_compatible_node(NULL, NULL, "calxeda,hb-sregs"); + hb_clk->reg = of_iomap(srnp, 0); ++ of_node_put(srnp); + BUG_ON(!hb_clk->reg); + hb_clk->reg += reg; + +diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c +index 7244a621c61b..efc9e1973295 100644 +--- a/drivers/clk/clk-qoriq.c ++++ b/drivers/clk/clk-qoriq.c +@@ -1244,6 +1244,7 @@ static void __init clockgen_init(struct device_node *np) + pr_err("%s: Couldn't map %s regs\n", __func__, + guts->full_name); + } ++ of_node_put(guts); + } + + } +diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c +index 46c05c9a9354..39ea50102d52 100644 +--- a/drivers/clk/imx/clk-imx6q.c ++++ b/drivers/clk/imx/clk-imx6q.c +@@ -155,6 +155,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + /* Audio/video PLL post dividers do not work on i.MX6q revision 1.0 */ + if (clk_on_imx6q() && imx_get_soc_revision() == IMX_CHIP_REVISION_1_0) { +diff --git a/drivers/clk/imx/clk-imx6sx.c b/drivers/clk/imx/clk-imx6sx.c +index fea125eb4330..8f2958ac04e8 100644 +--- a/drivers/clk/imx/clk-imx6sx.c ++++ b/drivers/clk/imx/clk-imx6sx.c +@@ -162,6 +162,7 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + clks[IMX6SX_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); + clks[IMX6SX_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); +diff --git a/drivers/clk/imx/clk-imx7d.c b/drivers/clk/imx/clk-imx7d.c +index 448ef321948b..863163b239a3 100644 +--- a/drivers/clk/imx/clk-imx7d.c ++++ b/drivers/clk/imx/clk-imx7d.c +@@ -386,6 +386,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + clks[IMX7D_PLL_ARM_MAIN_SRC] = imx_clk_mux("pll_arm_main_src", base + 0x60, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); + clks[IMX7D_PLL_DRAM_MAIN_SRC] = imx_clk_mux("pll_dram_main_src", base + 0x70, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); +diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c +index 0a94d9661d91..2c92a2706fdd 100644 +--- a/drivers/clk/imx/clk-vf610.c ++++ b/drivers/clk/imx/clk-vf610.c +@@ -155,6 +155,7 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,vf610-anatop"); + anatop_base = of_iomap(np, 0); + BUG_ON(!anatop_base); ++ of_node_put(np); + + np = ccm_node; + ccm_base = of_iomap(np, 0); +diff --git a/drivers/clk/mvebu/armada-370.c b/drivers/clk/mvebu/armada-370.c +index 2c7c1085f883..8fdfa97900cd 100644 +--- a/drivers/clk/mvebu/armada-370.c ++++ b/drivers/clk/mvebu/armada-370.c +@@ -177,8 +177,10 @@ static void __init a370_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &a370_coreclks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, a370_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(a370_clk, "marvell,armada-370-core-clock", a370_clk_init); + +diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c +index b3094315a3c0..2fa15a274719 100644 +--- a/drivers/clk/mvebu/armada-xp.c ++++ b/drivers/clk/mvebu/armada-xp.c +@@ -202,7 +202,9 @@ static void __init axp_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &axp_coreclks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, axp_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); +diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c +index 99550f25975e..1d2b9a1a9609 100644 +--- a/drivers/clk/mvebu/kirkwood.c ++++ b/drivers/clk/mvebu/kirkwood.c +@@ -335,6 +335,8 @@ static void __init kirkwood_clk_init(struct device_node *np) + if (cgnp) { + mvebu_clk_gating_setup(cgnp, kirkwood_gating_desc); + kirkwood_clk_muxing_setup(cgnp, kirkwood_mux_desc); ++ ++ of_node_put(cgnp); + } + } + CLK_OF_DECLARE(kirkwood_clk, "marvell,kirkwood-core-clock", +diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c +index 7f370d3e0983..6c8e45e007c8 100644 +--- a/drivers/clk/samsung/clk-exynos4.c ++++ b/drivers/clk/samsung/clk-exynos4.c +@@ -1224,6 +1224,7 @@ static unsigned long exynos4_get_xom(void) + xom = readl(chipid_base + 8); + + iounmap(chipid_base); ++ of_node_put(np); + } + + return xom; +diff --git a/drivers/clk/socfpga/clk-pll-a10.c b/drivers/clk/socfpga/clk-pll-a10.c +index 402d630bd531..623d5b77fb43 100644 +--- a/drivers/clk/socfpga/clk-pll-a10.c ++++ b/drivers/clk/socfpga/clk-pll-a10.c +@@ -95,6 +95,7 @@ static struct __init clk * __socfpga_pll_init(struct device_node *node, + + clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_a10_base_addr = of_iomap(clkmgr_np, 0); ++ of_node_put(clkmgr_np); + BUG_ON(!clk_mgr_a10_base_addr); + pll_clk->hw.reg = clk_mgr_a10_base_addr + reg; + +diff --git a/drivers/clk/socfpga/clk-pll.c b/drivers/clk/socfpga/clk-pll.c +index c7f463172e4b..b4b44e9b5901 100644 +--- a/drivers/clk/socfpga/clk-pll.c ++++ b/drivers/clk/socfpga/clk-pll.c +@@ -100,6 +100,7 @@ static __init struct clk *__socfpga_pll_init(struct device_node *node, + + clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_base_addr = of_iomap(clkmgr_np, 0); ++ of_node_put(clkmgr_np); + BUG_ON(!clk_mgr_base_addr); + pll_clk->hw.reg = clk_mgr_base_addr + reg; + +diff --git a/drivers/clocksource/timer-sun5i.c b/drivers/clocksource/timer-sun5i.c +index bca9573e036a..32b2dab69fd7 100644 +--- a/drivers/clocksource/timer-sun5i.c ++++ b/drivers/clocksource/timer-sun5i.c +@@ -201,6 +201,11 @@ static int __init sun5i_setup_clocksource(struct device_node *node, + } + + rate = clk_get_rate(clk); ++ if (!rate) { ++ pr_err("Couldn't get parent clock rate\n"); ++ ret = -EINVAL; ++ goto err_disable_clk; ++ } + + cs->timer.base = base; + cs->timer.clk = clk; +@@ -274,6 +279,11 @@ static int __init sun5i_setup_clockevent(struct device_node *node, void __iomem + } + + rate = clk_get_rate(clk); ++ if (!rate) { ++ pr_err("Couldn't get parent clock rate\n"); ++ ret = -EINVAL; ++ goto err_disable_clk; ++ } + + ce->timer.base = base; + ce->timer.ticks_per_jiffy = DIV_ROUND_UP(rate, HZ); +diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c +index 9b92af2c7241..a77319bf221d 100644 +--- a/drivers/crypto/caam/caamrng.c ++++ b/drivers/crypto/caam/caamrng.c +@@ -361,7 +361,10 @@ static int __init caam_rng_init(void) + goto free_rng_ctx; + + dev_info(dev, "registering rng-caam\n"); +- return hwrng_register(&caam_rng); ++ ++ err = hwrng_register(&caam_rng); ++ if (!err) ++ return err; + + free_rng_ctx: + kfree(rng_ctx); +diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c +index 5b2395e7e04d..6de3d2142c7d 100644 +--- a/drivers/dma/dma-axi-dmac.c ++++ b/drivers/dma/dma-axi-dmac.c +@@ -441,7 +441,7 @@ static struct dma_async_tx_descriptor *axi_dmac_prep_interleaved( + + if (chan->hw_2d) { + if (!axi_dmac_check_len(chan, xt->sgl[0].size) || +- !axi_dmac_check_len(chan, xt->numf)) ++ xt->numf == 0) + return NULL; + if (xt->sgl[0].size + dst_icg > chan->max_length || + xt->sgl[0].size + src_icg > chan->max_length) +diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c +index 68a4815750b5..22d0cc1855b5 100644 +--- a/drivers/dma/dw/platform.c ++++ b/drivers/dma/dw/platform.c +@@ -87,13 +87,20 @@ static void dw_dma_acpi_controller_register(struct dw_dma *dw) + dma_cap_set(DMA_SLAVE, info->dma_cap); + info->filter_fn = dw_dma_acpi_filter; + +- ret = devm_acpi_dma_controller_register(dev, acpi_dma_simple_xlate, +- info); ++ ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info); + if (ret) + dev_err(dev, "could not register acpi_dma_controller\n"); + } ++ ++static void dw_dma_acpi_controller_free(struct dw_dma *dw) ++{ ++ struct device *dev = dw->dma.dev; ++ ++ acpi_dma_controller_free(dev); ++} + #else /* !CONFIG_ACPI */ + static inline void dw_dma_acpi_controller_register(struct dw_dma *dw) {} ++static inline void dw_dma_acpi_controller_free(struct dw_dma *dw) {} + #endif /* !CONFIG_ACPI */ + + #ifdef CONFIG_OF +@@ -225,6 +232,9 @@ static int dw_remove(struct platform_device *pdev) + { + struct dw_dma_chip *chip = platform_get_drvdata(pdev); + ++ if (ACPI_HANDLE(&pdev->dev)) ++ dw_dma_acpi_controller_free(chip->dw); ++ + if (pdev->dev.of_node) + of_dma_controller_free(pdev->dev.of_node); + +diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c +index e508c8c5f3fd..17521fcf226f 100644 +--- a/drivers/dma/edma.c ++++ b/drivers/dma/edma.c +@@ -2288,8 +2288,10 @@ static int edma_probe(struct platform_device *pdev) + + ecc->tc_list = devm_kcalloc(dev, ecc->num_tc, + sizeof(*ecc->tc_list), GFP_KERNEL); +- if (!ecc->tc_list) +- return -ENOMEM; ++ if (!ecc->tc_list) { ++ ret = -ENOMEM; ++ goto err_reg1; ++ } + + for (i = 0;; i++) { + ret = of_parse_phandle_with_fixed_args(node, "ti,tptcs", +diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c +index dd97dbf6618c..1dc06e0e890f 100644 +--- a/drivers/dma/imx-sdma.c ++++ b/drivers/dma/imx-sdma.c +@@ -1411,6 +1411,14 @@ static void sdma_add_scripts(struct sdma_engine *sdma, + if (!sdma->script_number) + sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; + ++ if (sdma->script_number > sizeof(struct sdma_script_start_addrs) ++ / sizeof(s32)) { ++ dev_err(sdma->dev, ++ "SDMA script number %d not match with firmware.\n", ++ sdma->script_number); ++ return; ++ } ++ + for (i = 0; i < sdma->script_number; i++) + if (addr_arr[i] > 0) + saddr_arr[i] = addr_arr[i]; +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index 2cb924ffd5a3..4d0f77f0edad 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -975,9 +975,20 @@ static struct drm_dp_mst_port *drm_dp_mst_get_port_ref_locked(struct drm_dp_mst_ + static struct drm_dp_mst_port *drm_dp_get_validated_port_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) + { + struct drm_dp_mst_port *rport = NULL; ++ + mutex_lock(&mgr->lock); +- if (mgr->mst_primary) +- rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, port); ++ /* ++ * Port may or may not be 'valid' but we don't care about that when ++ * destroying the port and we are guaranteed that the port pointer ++ * will be valid until we've finished ++ */ ++ if (current_work() == &mgr->destroy_connector_work) { ++ kref_get(&port->kref); ++ rport = port; ++ } else if (mgr->mst_primary) { ++ rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, ++ port); ++ } + mutex_unlock(&mgr->lock); + return rport; + } +diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +index fd266ed963b6..25a0e7d13340 100644 +--- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +@@ -383,19 +383,17 @@ static const unsigned int a3xx_registers[] = { + 0x2200, 0x2212, 0x2214, 0x2217, 0x221a, 0x221a, 0x2240, 0x227e, + 0x2280, 0x228b, 0x22c0, 0x22c0, 0x22c4, 0x22ce, 0x22d0, 0x22d8, + 0x22df, 0x22e6, 0x22e8, 0x22e9, 0x22ec, 0x22ec, 0x22f0, 0x22f7, +- 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2348, 0x2349, 0x2350, 0x2356, +- 0x2360, 0x2360, 0x2440, 0x2440, 0x2444, 0x2444, 0x2448, 0x244d, +- 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, 0x2472, 0x2472, +- 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, 0x24e4, 0x24ef, +- 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, 0x2510, 0x2511, +- 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, 0x25ec, 0x25ed, +- 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, 0x261a, 0x261a, +- 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, 0x26c4, 0x26ce, +- 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, 0x26ec, 0x26ec, +- 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, 0x2748, 0x2749, +- 0x2750, 0x2756, 0x2760, 0x2760, 0x300c, 0x300e, 0x301c, 0x301d, +- 0x302a, 0x302a, 0x302c, 0x302d, 0x3030, 0x3031, 0x3034, 0x3036, +- 0x303c, 0x303c, 0x305e, 0x305f, ++ 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2440, 0x2440, 0x2444, 0x2444, ++ 0x2448, 0x244d, 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, ++ 0x2472, 0x2472, 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, ++ 0x24e4, 0x24ef, 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, ++ 0x2510, 0x2511, 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, ++ 0x25ec, 0x25ed, 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, ++ 0x261a, 0x261a, 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, ++ 0x26c4, 0x26ce, 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, ++ 0x26ec, 0x26ec, 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, ++ 0x300c, 0x300e, 0x301c, 0x301d, 0x302a, 0x302a, 0x302c, 0x302d, ++ 0x3030, 0x3031, 0x3034, 0x3036, 0x303c, 0x303c, 0x305e, 0x305f, + ~0 /* sentinel */ + }; + +diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c +index 4c49868efcda..12ddbbb53107 100644 +--- a/drivers/gpu/drm/msm/dsi/dsi_host.c ++++ b/drivers/gpu/drm/msm/dsi/dsi_host.c +@@ -30,6 +30,8 @@ + #include "dsi.xml.h" + #include "dsi_cfg.h" + ++#define DSI_RESET_TOGGLE_DELAY_MS 20 ++ + static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor) + { + u32 ver; +@@ -764,7 +766,7 @@ static void dsi_sw_reset(struct msm_dsi_host *msm_host) + wmb(); /* clocks need to be enabled before reset */ + + dsi_write(msm_host, REG_DSI_RESET, 1); +- wmb(); /* make sure reset happen */ ++ msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ + dsi_write(msm_host, REG_DSI_RESET, 0); + } + +@@ -1111,7 +1113,7 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) + + /* dsi controller can only be reset while clocks are running */ + dsi_write(msm_host, REG_DSI_RESET, 1); +- wmb(); /* make sure reset happen */ ++ msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ + dsi_write(msm_host, REG_DSI_RESET, 0); + wmb(); /* controller out of reset */ + dsi_write(msm_host, REG_DSI_CTRL, data0); +diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +index bb1225aa2f75..89305ad3cde2 100644 +--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c ++++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +@@ -547,7 +547,7 @@ fail: + if (cfg_handler) + mdp5_cfg_destroy(cfg_handler); + +- return NULL; ++ return ERR_PTR(ret); + } + + static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev) +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +index 60ece0a8a2e1..1d2d6bae73cd 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +@@ -87,7 +87,7 @@ nvkm_gddr3_calc(struct nvkm_ram *ram) + WR = (ram->next->bios.timing[2] & 0x007f0000) >> 16; + /* XXX: Get these values from the VBIOS instead */ + DLL = !(ram->mr[1] & 0x1); +- RON = !(ram->mr[1] & 0x300) >> 8; ++ RON = !((ram->mr[1] & 0x300) >> 8); + break; + default: + return -ENOSYS; +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +index e6f74168238c..2ef9e942f43a 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +@@ -87,10 +87,10 @@ nvkm_memx_fini(struct nvkm_memx **pmemx, bool exec) + if (exec) { + nvkm_pmu_send(pmu, reply, PROC_MEMX, MEMX_MSG_EXEC, + memx->base, finish); ++ nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", ++ reply[0], reply[1]); + } + +- nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", +- reply[0], reply[1]); + kfree(memx); + return 0; + } +diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c +index 80b6d6e4721a..7acde09c8e8f 100644 +--- a/drivers/gpu/drm/radeon/cik.c ++++ b/drivers/gpu/drm/radeon/cik.c +@@ -7372,8 +7372,8 @@ static int cik_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* XXX this should actually be a bus address, not an MC address. same on older asics */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c +index 0e20c08f8977..2056224d0b3c 100644 +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -3647,8 +3647,8 @@ int r600_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* set dummy read address to ring address */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c +index 5cf3a2cbc07e..4128c98d9054 100644 +--- a/drivers/gpu/drm/radeon/si.c ++++ b/drivers/gpu/drm/radeon/si.c +@@ -6013,8 +6013,8 @@ static int si_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* set dummy read address to ring address */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c +index a1b3ea1ccb65..772a5a3b0ce1 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_vq.c ++++ b/drivers/gpu/drm/virtio/virtgpu_vq.c +@@ -681,11 +681,11 @@ int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, + { + struct virtio_gpu_get_capset *cmd_p; + struct virtio_gpu_vbuffer *vbuf; +- int max_size = vgdev->capsets[idx].max_size; ++ int max_size; + struct virtio_gpu_drv_cap_cache *cache_ent; + void *resp_buf; + +- if (idx > vgdev->num_capsets) ++ if (idx >= vgdev->num_capsets) + return -EINVAL; + + if (version > vgdev->capsets[idx].max_version) +@@ -695,6 +695,7 @@ int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, + if (!cache_ent) + return -ENOMEM; + ++ max_size = vgdev->capsets[idx].max_size; + cache_ent->caps_cache = kmalloc(max_size, GFP_KERNEL); + if (!cache_ent->caps_cache) { + kfree(cache_ent); +diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c +index 9c262d955331..d2583caa8087 100644 +--- a/drivers/hwmon/adt7475.c ++++ b/drivers/hwmon/adt7475.c +@@ -268,9 +268,10 @@ static inline u16 volt2reg(int channel, long volt, u8 bypass_attn) + long reg; + + if (bypass_attn & (1 << channel)) +- reg = (volt * 1024) / 2250; ++ reg = DIV_ROUND_CLOSEST(volt * 1024, 2250); + else +- reg = (volt * r[1] * 1024) / ((r[0] + r[1]) * 2250); ++ reg = DIV_ROUND_CLOSEST(volt * r[1] * 1024, ++ (r[0] + r[1]) * 2250); + return clamp_val(reg, 0, 1023) & (0xff << 2); + } + +diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c +index 7f8738a83cb9..40addb213bdf 100644 +--- a/drivers/hwmon/nct7802.c ++++ b/drivers/hwmon/nct7802.c +@@ -32,8 +32,8 @@ + static const u8 REG_VOLTAGE[5] = { 0x09, 0x0a, 0x0c, 0x0d, 0x0e }; + + static const u8 REG_VOLTAGE_LIMIT_LSB[2][5] = { +- { 0x40, 0x00, 0x42, 0x44, 0x46 }, +- { 0x3f, 0x00, 0x41, 0x43, 0x45 }, ++ { 0x46, 0x00, 0x40, 0x42, 0x44 }, ++ { 0x45, 0x00, 0x3f, 0x41, 0x43 }, + }; + + static const u8 REG_VOLTAGE_LIMIT_MSB[5] = { 0x48, 0x00, 0x47, 0x47, 0x48 }; +diff --git a/drivers/hwmon/shtc1.c b/drivers/hwmon/shtc1.c +index decd7df995ab..2a18539591ea 100644 +--- a/drivers/hwmon/shtc1.c ++++ b/drivers/hwmon/shtc1.c +@@ -38,7 +38,7 @@ static const unsigned char shtc1_cmd_read_id_reg[] = { 0xef, 0xc8 }; + + /* constants for reading the ID register */ + #define SHTC1_ID 0x07 +-#define SHTC1_ID_REG_MASK 0x1f ++#define SHTC1_ID_REG_MASK 0x3f + + /* delays for non-blocking i2c commands, both in us */ + #define SHTC1_NONBLOCKING_WAIT_TIME_HPM 14400 +diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c +index 721295b9a051..43c0f89cefdf 100644 +--- a/drivers/hwmon/w83627hf.c ++++ b/drivers/hwmon/w83627hf.c +@@ -130,17 +130,23 @@ superio_select(struct w83627hf_sio_data *sio, int ld) + outb(ld, sio->sioaddr + 1); + } + +-static inline void ++static inline int + superio_enter(struct w83627hf_sio_data *sio) + { ++ if (!request_muxed_region(sio->sioaddr, 2, DRVNAME)) ++ return -EBUSY; ++ + outb(0x87, sio->sioaddr); + outb(0x87, sio->sioaddr); ++ ++ return 0; + } + + static inline void + superio_exit(struct w83627hf_sio_data *sio) + { + outb(0xAA, sio->sioaddr); ++ release_region(sio->sioaddr, 2); + } + + #define W627_DEVID 0x52 +@@ -1275,7 +1281,7 @@ static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); + static int __init w83627hf_find(int sioaddr, unsigned short *addr, + struct w83627hf_sio_data *sio_data) + { +- int err = -ENODEV; ++ int err; + u16 val; + + static __initconst char *const names[] = { +@@ -1287,7 +1293,11 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, + }; + + sio_data->sioaddr = sioaddr; +- superio_enter(sio_data); ++ err = superio_enter(sio_data); ++ if (err) ++ return err; ++ ++ err = -ENODEV; + val = force_id ? force_id : superio_inb(sio_data, DEVID); + switch (val) { + case W627_DEVID: +@@ -1641,9 +1651,21 @@ static int w83627thf_read_gpio5(struct platform_device *pdev) + struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); + int res = 0xff, sel; + +- superio_enter(sio_data); ++ if (superio_enter(sio_data)) { ++ /* ++ * Some other driver reserved the address space for itself. ++ * We don't want to fail driver instantiation because of that, ++ * so display a warning and keep going. ++ */ ++ dev_warn(&pdev->dev, ++ "Can not read VID data: Failed to enable SuperIO access\n"); ++ return res; ++ } ++ + superio_select(sio_data, W83627HF_LD_GPIO5); + ++ res = 0xff; ++ + /* Make sure these GPIO pins are enabled */ + if (!(superio_inb(sio_data, W83627THF_GPIO5_EN) & (1<<3))) { + dev_dbg(&pdev->dev, "GPIO5 disabled, no VID function\n"); +@@ -1674,7 +1696,17 @@ static int w83687thf_read_vid(struct platform_device *pdev) + struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); + int res = 0xff; + +- superio_enter(sio_data); ++ if (superio_enter(sio_data)) { ++ /* ++ * Some other driver reserved the address space for itself. ++ * We don't want to fail driver instantiation because of that, ++ * so display a warning and keep going. ++ */ ++ dev_warn(&pdev->dev, ++ "Can not read VID data: Failed to enable SuperIO access\n"); ++ return res; ++ } ++ + superio_select(sio_data, W83627HF_LD_HWM); + + /* Make sure these GPIO pins are enabled */ +diff --git a/drivers/iio/dac/ad5380.c b/drivers/iio/dac/ad5380.c +index 97d2c5111f43..8bf7fc626a9d 100644 +--- a/drivers/iio/dac/ad5380.c ++++ b/drivers/iio/dac/ad5380.c +@@ -221,7 +221,7 @@ static int ad5380_read_raw(struct iio_dev *indio_dev, + if (ret) + return ret; + *val >>= chan->scan_type.shift; +- val -= (1 << chan->scan_type.realbits) / 2; ++ *val -= (1 << chan->scan_type.realbits) / 2; + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + *val = 2 * st->vref; +diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c +index 961afb5588be..864a61b05665 100644 +--- a/drivers/iio/industrialio-buffer.c ++++ b/drivers/iio/industrialio-buffer.c +@@ -527,7 +527,7 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + { + const struct iio_chan_spec *ch; + unsigned bytes = 0; +- int length, i; ++ int length, i, largest = 0; + + /* How much space will the demuxed element take? */ + for_each_set_bit(i, mask, +@@ -540,6 +540,7 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + length = ch->scan_type.storagebits / 8; + bytes = ALIGN(bytes, length); + bytes += length; ++ largest = max(largest, length); + } + if (timestamp) { + ch = iio_find_channel_from_si(indio_dev, +@@ -551,7 +552,10 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + length = ch->scan_type.storagebits / 8; + bytes = ALIGN(bytes, length); + bytes += length; ++ largest = max(largest, length); + } ++ ++ bytes = ALIGN(bytes, largest); + return bytes; + } + +diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c +index 43d277a931c2..eac5f5eff8d2 100644 +--- a/drivers/infiniband/hw/mlx5/qp.c ++++ b/drivers/infiniband/hw/mlx5/qp.c +@@ -1426,6 +1426,11 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_PKEY_INDEX | + MLX5_QP_OPTPAR_Q_KEY | + MLX5_QP_OPTPAR_PRI_PORT, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_PKEY_INDEX | ++ MLX5_QP_OPTPAR_PRI_PORT, + }, + [MLX5_QP_STATE_RTR] = { + [MLX5_QP_ST_RC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | +@@ -1459,6 +1464,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_PM_STATE, + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | ++ MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_PM_STATE | ++ MLX5_QP_OPTPAR_RNR_TIMEOUT, + }, + }, + [MLX5_QP_STATE_RTS] = { +@@ -1475,6 +1486,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY | + MLX5_QP_OPTPAR_SRQN | + MLX5_QP_OPTPAR_CQN_RCV, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_RNR_TIMEOUT | ++ MLX5_QP_OPTPAR_PM_STATE | ++ MLX5_QP_OPTPAR_ALT_ADDR_PATH, + }, + }, + [MLX5_QP_STATE_SQER] = { +@@ -1486,6 +1503,10 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_RAE | + MLX5_QP_OPTPAR_RRE, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RNR_TIMEOUT | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RRE, + }, + }, + }; +diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +index 76e96f97b3f6..6385448b22c5 100644 +--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c ++++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +@@ -55,7 +55,7 @@ + + int ocrdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) + { +- if (index > 1) ++ if (index > 0) + return -EINVAL; + + *pkey = 0xffff; +diff --git a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +index f8e3211689a3..8e18bfca5516 100644 +--- a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c ++++ b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +@@ -427,7 +427,7 @@ int usnic_ib_query_gid(struct ib_device *ibdev, u8 port, int index, + int usnic_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, + u16 *pkey) + { +- if (index > 1) ++ if (index > 0) + return -EINVAL; + + *pkey = 0xffff; +diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c +index 0b7f5a701c60..32ef17e1aef8 100644 +--- a/drivers/infiniband/ulp/isert/ib_isert.c ++++ b/drivers/infiniband/ulp/isert/ib_isert.c +@@ -3277,17 +3277,6 @@ isert_wait4logout(struct isert_conn *isert_conn) + } + } + +-static void +-isert_wait4cmds(struct iscsi_conn *conn) +-{ +- isert_info("iscsi_conn %p\n", conn); +- +- if (conn->sess) { +- target_sess_cmd_list_set_waiting(conn->sess->se_sess); +- target_wait_for_sess_cmds(conn->sess->se_sess); +- } +-} +- + static void + isert_wait4flush(struct isert_conn *isert_conn) + { +@@ -3361,7 +3350,6 @@ static void isert_wait_conn(struct iscsi_conn *conn) + + isert_wait4flush(isert_conn); + isert_put_unsol_pending_cmds(conn); +- isert_wait4cmds(conn); + isert_wait4logout(isert_conn); + + queue_work(isert_release_wq, &isert_conn->release_work); +diff --git a/drivers/input/keyboard/nomadik-ske-keypad.c b/drivers/input/keyboard/nomadik-ske-keypad.c +index 8567ee47761e..ae3b04557074 100644 +--- a/drivers/input/keyboard/nomadik-ske-keypad.c ++++ b/drivers/input/keyboard/nomadik-ske-keypad.c +@@ -100,7 +100,7 @@ static int __init ske_keypad_chip_init(struct ske_keypad *keypad) + while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) + cpu_relax(); + +- if (!timeout) ++ if (timeout == -1) + return -EINVAL; + + /* +diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c +index a3fe4a990cc9..c7b889d13edd 100644 +--- a/drivers/input/misc/keyspan_remote.c ++++ b/drivers/input/misc/keyspan_remote.c +@@ -344,7 +344,8 @@ static int keyspan_setup(struct usb_device* dev) + int retval = 0; + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); ++ 0x11, 0x40, 0x5601, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", + __func__, retval); +@@ -352,7 +353,8 @@ static int keyspan_setup(struct usb_device* dev) + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); ++ 0x44, 0x40, 0x0, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", + __func__, retval); +@@ -360,7 +362,8 @@ static int keyspan_setup(struct usb_device* dev) + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); ++ 0x22, 0x40, 0x0, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", + __func__, retval); +diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c +index 78ca44840d60..40a166773c1b 100644 +--- a/drivers/input/tablet/aiptek.c ++++ b/drivers/input/tablet/aiptek.c +@@ -1820,14 +1820,14 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) + input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0); + + /* Verify that a device really has an endpoint */ +- if (intf->altsetting[0].desc.bNumEndpoints < 1) { ++ if (intf->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&intf->dev, + "interface has %d endpoints, but must have minimum 1\n", +- intf->altsetting[0].desc.bNumEndpoints); ++ intf->cur_altsetting->desc.bNumEndpoints); + err = -EINVAL; + goto fail3; + } +- endpoint = &intf->altsetting[0].endpoint[0].desc; ++ endpoint = &intf->cur_altsetting->endpoint[0].desc; + + /* Go set up our URB, which is called when the tablet receives + * input. +diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c +index 5a0e4cd86353..67dc17c8bba9 100644 +--- a/drivers/input/tablet/gtco.c ++++ b/drivers/input/tablet/gtco.c +@@ -876,18 +876,14 @@ static int gtco_probe(struct usb_interface *usbinterface, + } + + /* Sanity check that a device has an endpoint */ +- if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) { ++ if (usbinterface->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&usbinterface->dev, + "Invalid number of endpoints\n"); + error = -EINVAL; + goto err_free_urb; + } + +- /* +- * The endpoint is always altsetting 0, we know this since we know +- * this device only has one interrupt endpoint +- */ +- endpoint = &usbinterface->altsetting[0].endpoint[0].desc; ++ endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; + + /* Some debug */ + dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting); +@@ -974,7 +970,7 @@ static int gtco_probe(struct usb_interface *usbinterface, + input_dev->dev.parent = &usbinterface->dev; + + /* Setup the URB, it will be posted later on open of input device */ +- endpoint = &usbinterface->altsetting[0].endpoint[0].desc; ++ endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; + + usb_fill_int_urb(gtco->urbinfo, + gtco->usbdev, +diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c +index 0146e2c74649..6178e28baaba 100644 +--- a/drivers/input/touchscreen/sur40.c ++++ b/drivers/input/touchscreen/sur40.c +@@ -496,7 +496,7 @@ static int sur40_probe(struct usb_interface *interface, + int error; + + /* Check if we really have the right interface. */ +- iface_desc = &interface->altsetting[0]; ++ iface_desc = interface->cur_altsetting; + if (iface_desc->desc.bInterfaceClass != 0xFF) + return -ENODEV; + +diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c +index 0ad8b7c78a43..66a406e87e11 100644 +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -2184,6 +2184,8 @@ static int attach_device(struct device *dev, + */ + domain_flush_tlb_pde(domain); + ++ domain_flush_complete(domain); ++ + return ret; + } + +diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c +index 6a69b5bb231f..036fb186a3be 100644 +--- a/drivers/iommu/amd_iommu_init.c ++++ b/drivers/iommu/amd_iommu_init.c +@@ -360,6 +360,9 @@ static void iommu_enable(struct amd_iommu *iommu) + + static void iommu_disable(struct amd_iommu *iommu) + { ++ if (!iommu->mmio_base) ++ return; ++ + /* Disable command buffer */ + iommu_feature_disable(iommu, CONTROL_CMDBUF_EN); + +diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c +index b965561a4162..a2005b82ec8f 100644 +--- a/drivers/iommu/intel-iommu.c ++++ b/drivers/iommu/intel-iommu.c +@@ -3259,9 +3259,12 @@ static int __init init_dmars(void) + iommu_identity_mapping |= IDENTMAP_ALL; + + #ifdef CONFIG_INTEL_IOMMU_BROKEN_GFX_WA +- iommu_identity_mapping |= IDENTMAP_GFX; ++ dmar_map_gfx = 0; + #endif + ++ if (!dmar_map_gfx) ++ iommu_identity_mapping |= IDENTMAP_GFX; ++ + check_tylersburg_isoch(); + + if (iommu_identity_mapping) { +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index 5d5066cf3bbd..589207176ffa 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -1594,9 +1594,9 @@ int iommu_request_dm_for_dev(struct device *dev) + int ret; + + /* Device must already be in a group before calling this function */ +- group = iommu_group_get_for_dev(dev); +- if (IS_ERR(group)) +- return PTR_ERR(group); ++ group = iommu_group_get(dev); ++ if (!group) ++ return -EINVAL; + + mutex_lock(&group->mutex); + +diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c +index 7a50728b9389..391090c455ce 100644 +--- a/drivers/md/bitmap.c ++++ b/drivers/md/bitmap.c +@@ -1671,7 +1671,7 @@ void bitmap_flush(struct mddev *mddev) + /* + * free memory that was allocated + */ +-static void bitmap_free(struct bitmap *bitmap) ++static void md_bitmap_free(struct bitmap *bitmap) + { + unsigned long k, pages; + struct bitmap_page *bp; +@@ -1721,7 +1721,7 @@ void bitmap_destroy(struct mddev *mddev) + if (bitmap->sysfs_can_clear) + sysfs_put(bitmap->sysfs_can_clear); + +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + } + + /* +@@ -1805,7 +1805,7 @@ struct bitmap *bitmap_create(struct mddev *mddev, int slot) + + return bitmap; + error: +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return ERR_PTR(err); + } + +@@ -1904,7 +1904,7 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot, + *low = lo; + *high = hi; + err: +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return rv; + } + EXPORT_SYMBOL_GPL(bitmap_copy_from_slot); +diff --git a/drivers/media/i2c/ov2659.c b/drivers/media/i2c/ov2659.c +index 6eefb8bbb5b5..20e3c56991cf 100644 +--- a/drivers/media/i2c/ov2659.c ++++ b/drivers/media/i2c/ov2659.c +@@ -1137,7 +1137,7 @@ static int ov2659_set_fmt(struct v4l2_subdev *sd, + mf = v4l2_subdev_get_try_format(sd, cfg, fmt->pad); + *mf = fmt->format; + #else +- return -ENOTTY; ++ ret = -ENOTTY; + #endif + } else { + s64 val; +diff --git a/drivers/media/i2c/soc_camera/ov6650.c b/drivers/media/i2c/soc_camera/ov6650.c +index bb55ddfbf733..7928ea8528e1 100644 +--- a/drivers/media/i2c/soc_camera/ov6650.c ++++ b/drivers/media/i2c/soc_camera/ov6650.c +@@ -203,7 +203,6 @@ struct ov6650 { + unsigned long pclk_max; /* from resolution and format */ + struct v4l2_fract tpf; /* as requested with s_parm */ + u32 code; +- enum v4l2_colorspace colorspace; + }; + + +@@ -216,6 +215,17 @@ static u32 ov6650_codes[] = { + MEDIA_BUS_FMT_Y8_1X8, + }; + ++static const struct v4l2_mbus_framefmt ov6650_def_fmt = { ++ .width = W_CIF, ++ .height = H_CIF, ++ .code = MEDIA_BUS_FMT_SBGGR8_1X8, ++ .colorspace = V4L2_COLORSPACE_SRGB, ++ .field = V4L2_FIELD_NONE, ++ .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT, ++ .quantization = V4L2_QUANTIZATION_DEFAULT, ++ .xfer_func = V4L2_XFER_FUNC_DEFAULT, ++}; ++ + /* read a register */ + static int ov6650_reg_read(struct i2c_client *client, u8 reg, u8 *val) + { +@@ -510,12 +520,20 @@ static int ov6650_get_fmt(struct v4l2_subdev *sd, + if (format->pad) + return -EINVAL; + +- mf->width = priv->rect.width >> priv->half_scale; +- mf->height = priv->rect.height >> priv->half_scale; +- mf->code = priv->code; +- mf->colorspace = priv->colorspace; +- mf->field = V4L2_FIELD_NONE; ++ /* initialize response with default media bus frame format */ ++ *mf = ov6650_def_fmt; + ++ /* update media bus format code and frame size */ ++ if (format->which == V4L2_SUBDEV_FORMAT_TRY) { ++ mf->width = cfg->try_fmt.width; ++ mf->height = cfg->try_fmt.height; ++ mf->code = cfg->try_fmt.code; ++ ++ } else { ++ mf->width = priv->rect.width >> priv->half_scale; ++ mf->height = priv->rect.height >> priv->half_scale; ++ mf->code = priv->code; ++ } + return 0; + } + +@@ -623,11 +641,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) + priv->pclk_max = 8000000; + } + +- if (code == MEDIA_BUS_FMT_SBGGR8_1X8) +- priv->colorspace = V4L2_COLORSPACE_SRGB; +- else if (code != 0) +- priv->colorspace = V4L2_COLORSPACE_JPEG; +- + if (half_scale) { + dev_dbg(&client->dev, "max resolution: QCIF\n"); + coma_set |= COMA_QCIF; +@@ -683,11 +696,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) + if (!ret) + priv->code = code; + +- if (!ret) { +- mf->colorspace = priv->colorspace; +- mf->width = priv->rect.width >> half_scale; +- mf->height = priv->rect.height >> half_scale; +- } + return ret; + } + +@@ -706,8 +714,6 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd, + v4l_bound_align_image(&mf->width, 2, W_CIF, 1, + &mf->height, 2, H_CIF, 1, 0); + +- mf->field = V4L2_FIELD_NONE; +- + switch (mf->code) { + case MEDIA_BUS_FMT_Y10_1X10: + mf->code = MEDIA_BUS_FMT_Y8_1X8; +@@ -716,19 +722,38 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd, + case MEDIA_BUS_FMT_YUYV8_2X8: + case MEDIA_BUS_FMT_VYUY8_2X8: + case MEDIA_BUS_FMT_UYVY8_2X8: +- mf->colorspace = V4L2_COLORSPACE_JPEG; + break; + default: + mf->code = MEDIA_BUS_FMT_SBGGR8_1X8; + case MEDIA_BUS_FMT_SBGGR8_1X8: +- mf->colorspace = V4L2_COLORSPACE_SRGB; + break; + } + +- if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) +- return ov6650_s_fmt(sd, mf); +- cfg->try_fmt = *mf; ++ if (format->which == V4L2_SUBDEV_FORMAT_TRY) { ++ /* store media bus format code and frame size in pad config */ ++ cfg->try_fmt.width = mf->width; ++ cfg->try_fmt.height = mf->height; ++ cfg->try_fmt.code = mf->code; + ++ /* return default mbus frame format updated with pad config */ ++ *mf = ov6650_def_fmt; ++ mf->width = cfg->try_fmt.width; ++ mf->height = cfg->try_fmt.height; ++ mf->code = cfg->try_fmt.code; ++ ++ } else { ++ /* apply new media bus format code and frame size */ ++ int ret = ov6650_s_fmt(sd, mf); ++ ++ if (ret) ++ return ret; ++ ++ /* return default format updated with active size and code */ ++ *mf = ov6650_def_fmt; ++ mf->width = priv->rect.width >> priv->half_scale; ++ mf->height = priv->rect.height >> priv->half_scale; ++ mf->code = priv->code; ++ } + return 0; + } + +@@ -1048,7 +1073,6 @@ static int ov6650_probe(struct i2c_client *client, + priv->rect.height = H_CIF; + priv->half_scale = false; + priv->code = MEDIA_BUS_FMT_YUYV8_2X8; +- priv->colorspace = V4L2_COLORSPACE_JPEG; + + ret = ov6650_video_probe(client); + if (ret) +diff --git a/drivers/media/pci/cx18/cx18-fileops.c b/drivers/media/pci/cx18/cx18-fileops.c +index df837408efd5..0171dc5b8809 100644 +--- a/drivers/media/pci/cx18/cx18-fileops.c ++++ b/drivers/media/pci/cx18/cx18-fileops.c +@@ -490,7 +490,7 @@ static ssize_t cx18_read_pos(struct cx18_stream *s, char __user *ubuf, + + CX18_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); + if (rc > 0) +- pos += rc; ++ *pos += rc; + return rc; + } + +diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c +index e543cbbf2ec4..8fe78b8b1c25 100644 +--- a/drivers/media/pci/cx23885/cx23885-dvb.c ++++ b/drivers/media/pci/cx23885/cx23885-dvb.c +@@ -1452,8 +1452,9 @@ static int dvb_register(struct cx23885_tsport *port) + if (fe0->dvb.frontend != NULL) { + struct i2c_adapter *tun_i2c; + +- fe0->dvb.frontend->sec_priv = kmalloc(sizeof(dib7000p_ops), GFP_KERNEL); +- memcpy(fe0->dvb.frontend->sec_priv, &dib7000p_ops, sizeof(dib7000p_ops)); ++ fe0->dvb.frontend->sec_priv = kmemdup(&dib7000p_ops, sizeof(dib7000p_ops), GFP_KERNEL); ++ if (!fe0->dvb.frontend->sec_priv) ++ return -ENOMEM; + tun_i2c = dib7000p_ops.get_i2c_master(fe0->dvb.frontend, DIBX000_I2C_INTERFACE_TUNER, 1); + if (!dvb_attach(dib0070_attach, fe0->dvb.frontend, tun_i2c, &dib7070p_dib0070_config)) + return -ENODEV; +diff --git a/drivers/media/pci/ivtv/ivtv-fileops.c b/drivers/media/pci/ivtv/ivtv-fileops.c +index 605d280d8a5f..cb65fe6c49e0 100644 +--- a/drivers/media/pci/ivtv/ivtv-fileops.c ++++ b/drivers/media/pci/ivtv/ivtv-fileops.c +@@ -420,7 +420,7 @@ static ssize_t ivtv_read_pos(struct ivtv_stream *s, char __user *ubuf, size_t co + + IVTV_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); + if (rc > 0) +- pos += rc; ++ *pos += rc; + return rc; + } + +diff --git a/drivers/media/platform/davinci/isif.c b/drivers/media/platform/davinci/isif.c +index 78e37cf3470f..b51b875c5a61 100644 +--- a/drivers/media/platform/davinci/isif.c ++++ b/drivers/media/platform/davinci/isif.c +@@ -890,9 +890,7 @@ static int isif_set_hw_if_params(struct vpfe_hw_if_param *params) + static int isif_config_ycbcr(void) + { + struct isif_ycbcr_config *params = &isif_cfg.ycbcr; +- struct vpss_pg_frame_size frame_size; + u32 modeset = 0, ccdcfg = 0; +- struct vpss_sync_pol sync; + + dev_dbg(isif_cfg.dev, "\nStarting isif_config_ycbcr..."); + +@@ -980,13 +978,6 @@ static int isif_config_ycbcr(void) + /* two fields are interleaved in memory */ + regw(0x00000249, SDOFST); + +- /* Setup test pattern if enabled */ +- if (isif_cfg.bayer.config_params.test_pat_gen) { +- sync.ccdpg_hdpol = params->hd_pol; +- sync.ccdpg_vdpol = params->vd_pol; +- dm365_vpss_set_sync_pol(sync); +- dm365_vpss_set_pg_frame_size(frame_size); +- } + return 0; + } + +diff --git a/drivers/media/platform/davinci/vpbe.c b/drivers/media/platform/davinci/vpbe.c +index abce9c4a1a8e..59518c08528b 100644 +--- a/drivers/media/platform/davinci/vpbe.c ++++ b/drivers/media/platform/davinci/vpbe.c +@@ -130,7 +130,7 @@ static int vpbe_enum_outputs(struct vpbe_device *vpbe_dev, + struct v4l2_output *output) + { + struct vpbe_config *cfg = vpbe_dev->cfg; +- int temp_index = output->index; ++ unsigned int temp_index = output->index; + + if (temp_index >= cfg->num_outputs) + return -EINVAL; +diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c +index 596359576109..cf015bfc559b 100644 +--- a/drivers/media/platform/omap/omap_vout.c ++++ b/drivers/media/platform/omap/omap_vout.c +@@ -1580,23 +1580,20 @@ static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) + unsigned long size; + struct videobuf_buffer *vb; + +- vb = q->bufs[b->index]; +- + if (!vout->streaming) + return -EINVAL; + +- if (file->f_flags & O_NONBLOCK) +- /* Call videobuf_dqbuf for non blocking mode */ +- ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 1); +- else +- /* Call videobuf_dqbuf for blocking mode */ +- ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 0); ++ ret = videobuf_dqbuf(q, b, !!(file->f_flags & O_NONBLOCK)); ++ if (ret) ++ return ret; ++ ++ vb = q->bufs[b->index]; + + addr = (unsigned long) vout->buf_phy_addr[vb->i]; + size = (unsigned long) vb->size; + dma_unmap_single(vout->vid_dev->v4l2_dev.dev, addr, + size, DMA_TO_DEVICE); +- return ret; ++ return 0; + } + + static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i) +diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c +index 0d981bbf38bc..255f70999ee8 100644 +--- a/drivers/media/platform/s5p-jpeg/jpeg-core.c ++++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c +@@ -1952,7 +1952,7 @@ static int s5p_jpeg_controls_create(struct s5p_jpeg_ctx *ctx) + + v4l2_ctrl_new_std(&ctx->ctrl_handler, &s5p_jpeg_ctrl_ops, + V4L2_CID_JPEG_RESTART_INTERVAL, +- 0, 3, 0xffff, 0); ++ 0, 0xffff, 1, 0); + if (ctx->jpeg->variant->version == SJPEG_S5P) + mask = ~0x06; /* 422, 420 */ + } +diff --git a/drivers/media/platform/vivid/vivid-osd.c b/drivers/media/platform/vivid/vivid-osd.c +index e15eef6a94e5..f3afc74f98ed 100644 +--- a/drivers/media/platform/vivid/vivid-osd.c ++++ b/drivers/media/platform/vivid/vivid-osd.c +@@ -167,7 +167,7 @@ static int _vivid_fb_check_var(struct fb_var_screeninfo *var, struct vivid_dev * + var->nonstd = 0; + + var->vmode &= ~FB_VMODE_MASK; +- var->vmode = FB_VMODE_NONINTERLACED; ++ var->vmode |= FB_VMODE_NONINTERLACED; + + /* Dummy values */ + var->hsync_len = 24; +diff --git a/drivers/media/radio/wl128x/fmdrv_common.c b/drivers/media/radio/wl128x/fmdrv_common.c +index 51639a3f7abe..0cee10cca0e5 100644 +--- a/drivers/media/radio/wl128x/fmdrv_common.c ++++ b/drivers/media/radio/wl128x/fmdrv_common.c +@@ -1278,8 +1278,9 @@ static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name) + + switch (action->type) { + case ACTION_SEND_COMMAND: /* Send */ +- if (fmc_send_cmd(fmdev, 0, 0, action->data, +- action->size, NULL, NULL)) ++ ret = fmc_send_cmd(fmdev, 0, 0, action->data, ++ action->size, NULL, NULL); ++ if (ret) + goto rel_fw; + + cmd_cnt++; +diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c +index 498875193386..adbb23b6595f 100644 +--- a/drivers/mfd/intel-lpss.c ++++ b/drivers/mfd/intel-lpss.c +@@ -525,6 +525,7 @@ module_init(intel_lpss_init); + + static void __exit intel_lpss_exit(void) + { ++ ida_destroy(&intel_lpss_devid_ida); + debugfs_remove(intel_lpss_debugfs); + } + module_exit(intel_lpss_exit); +diff --git a/drivers/misc/mic/card/mic_x100.c b/drivers/misc/mic/card/mic_x100.c +index b2958ce2368c..cd778e2b4f3e 100644 +--- a/drivers/misc/mic/card/mic_x100.c ++++ b/drivers/misc/mic/card/mic_x100.c +@@ -249,6 +249,9 @@ static int __init mic_probe(struct platform_device *pdev) + mdrv->dev = &pdev->dev; + snprintf(mdrv->name, sizeof(mic_driver_name), mic_driver_name); + ++ /* FIXME: use dma_set_mask_and_coherent() and check result */ ++ dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); ++ + mdev->mmio.pa = MIC_X100_MMIO_BASE; + mdev->mmio.len = MIC_X100_MMIO_LEN; + mdev->mmio.va = devm_ioremap(&pdev->dev, MIC_X100_MMIO_BASE, +@@ -294,18 +297,6 @@ static void mic_platform_shutdown(struct platform_device *pdev) + mic_remove(pdev); + } + +-static u64 mic_dma_mask = DMA_BIT_MASK(64); +- +-static struct platform_device mic_platform_dev = { +- .name = mic_driver_name, +- .id = 0, +- .num_resources = 0, +- .dev = { +- .dma_mask = &mic_dma_mask, +- .coherent_dma_mask = DMA_BIT_MASK(64), +- }, +-}; +- + static struct platform_driver __refdata mic_platform_driver = { + .probe = mic_probe, + .remove = mic_remove, +@@ -315,6 +306,8 @@ static struct platform_driver __refdata mic_platform_driver = { + }, + }; + ++static struct platform_device *mic_platform_dev; ++ + static int __init mic_init(void) + { + int ret; +@@ -327,9 +320,12 @@ static int __init mic_init(void) + } + + mic_init_card_debugfs(); +- ret = platform_device_register(&mic_platform_dev); ++ ++ mic_platform_dev = platform_device_register_simple(mic_driver_name, ++ 0, NULL, 0); ++ ret = PTR_ERR_OR_ZERO(mic_platform_dev); + if (ret) { +- pr_err("platform_device_register ret %d\n", ret); ++ pr_err("platform_device_register_full ret %d\n", ret); + goto cleanup_debugfs; + } + ret = platform_driver_register(&mic_platform_driver); +@@ -340,7 +336,7 @@ static int __init mic_init(void) + return ret; + + device_unregister: +- platform_device_unregister(&mic_platform_dev); ++ platform_device_unregister(mic_platform_dev); + cleanup_debugfs: + mic_exit_card_debugfs(); + done: +@@ -350,7 +346,7 @@ done: + static void __exit mic_exit(void) + { + platform_driver_unregister(&mic_platform_driver); +- platform_device_unregister(&mic_platform_dev); ++ platform_device_unregister(mic_platform_dev); + mic_exit_card_debugfs(); + } + +diff --git a/drivers/misc/sgi-xp/xpc_partition.c b/drivers/misc/sgi-xp/xpc_partition.c +index 6956f7e7d439..ca5f0102daef 100644 +--- a/drivers/misc/sgi-xp/xpc_partition.c ++++ b/drivers/misc/sgi-xp/xpc_partition.c +@@ -70,7 +70,7 @@ xpc_get_rsvd_page_pa(int nasid) + unsigned long rp_pa = nasid; /* seed with nasid */ + size_t len = 0; + size_t buf_len = 0; +- void *buf = buf; ++ void *buf = NULL; + void *buf_base = NULL; + enum xp_retval (*get_partition_rsvd_page_pa) + (void *, u64 *, unsigned long *, size_t *) = +diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c +index 2bae0214528b..bf309a8a66a1 100644 +--- a/drivers/mmc/host/sdhci.c ++++ b/drivers/mmc/host/sdhci.c +@@ -3096,11 +3096,13 @@ int sdhci_add_host(struct sdhci_host *host) + if (host->ops->get_min_clock) + mmc->f_min = host->ops->get_min_clock(host); + else if (host->version >= SDHCI_SPEC_300) { +- if (host->clk_mul) { +- mmc->f_min = (host->max_clk * host->clk_mul) / 1024; ++ if (host->clk_mul) + max_clk = host->max_clk * host->clk_mul; +- } else +- mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; ++ /* ++ * Divided Clock Mode minimum clock rate is always less than ++ * Programmable Clock Mode minimum clock rate. ++ */ ++ mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; + } else + mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; + +diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c +index 8a226cc05c10..cc4a0c48f090 100644 +--- a/drivers/net/can/slcan.c ++++ b/drivers/net/can/slcan.c +@@ -344,9 +344,16 @@ static void slcan_transmit(struct work_struct *work) + */ + static void slcan_write_wakeup(struct tty_struct *tty) + { +- struct slcan *sl = tty->disc_data; ++ struct slcan *sl; ++ ++ rcu_read_lock(); ++ sl = rcu_dereference(tty->disc_data); ++ if (!sl) ++ goto out; + + schedule_work(&sl->tx_work); ++out: ++ rcu_read_unlock(); + } + + /* Send a can_frame to a TTY queue. */ +@@ -640,10 +647,11 @@ static void slcan_close(struct tty_struct *tty) + return; + + spin_lock_bh(&sl->lock); +- tty->disc_data = NULL; ++ rcu_assign_pointer(tty->disc_data, NULL); + sl->tty = NULL; + spin_unlock_bh(&sl->lock); + ++ synchronize_rcu(); + flush_work(&sl->tx_work); + + /* Flush network side */ +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c +index 53b3c1a5851c..9530ee12726f 100644 +--- a/drivers/net/ethernet/broadcom/bcmsysport.c ++++ b/drivers/net/ethernet/broadcom/bcmsysport.c +@@ -1794,7 +1794,7 @@ static int bcm_sysport_probe(struct platform_device *pdev) + + priv->phy_interface = of_get_phy_mode(dn); + /* Default to GMII interface mode */ +- if (priv->phy_interface < 0) ++ if ((int)priv->phy_interface < 0) + priv->phy_interface = PHY_INTERFACE_MODE_GMII; + + /* In the case of a fixed PHY, the DT node associated +diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +index bee615cddbdd..f40eefd1b378 100644 +--- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c ++++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +@@ -2437,6 +2437,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) + + if (!is_offload(adapter)) + return -EOPNOTSUPP; ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; + if (!(adapter->flags & FULL_INIT_DONE)) + return -EIO; /* need the memory controllers */ + if (copy_from_user(&t, useraddr, sizeof(t))) +diff --git a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +index e51892d518ff..761c80eb8a68 100644 +--- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c ++++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +@@ -951,7 +951,7 @@ static int hix5hd2_dev_probe(struct platform_device *pdev) + goto err_free_mdio; + + priv->phy_mode = of_get_phy_mode(node); +- if (priv->phy_mode < 0) { ++ if ((int)priv->phy_mode < 0) { + netdev_err(ndev, "not find phy-mode\n"); + ret = -EINVAL; + goto err_mdiobus; +diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c +index 1a56de06b014..fdbba588c6db 100644 +--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c ++++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c +@@ -1477,7 +1477,7 @@ static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr, + + memset(pr, 0, sizeof(struct ehea_port_res)); + +- pr->tx_bytes = rx_bytes; ++ pr->tx_bytes = tx_bytes; + pr->tx_packets = tx_packets; + pr->rx_bytes = rx_bytes; + pr->rx_packets = rx_packets; +diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c +index 0798b4adb039..667900578249 100644 +--- a/drivers/net/ethernet/natsemi/sonic.c ++++ b/drivers/net/ethernet/natsemi/sonic.c +@@ -221,9 +221,9 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + + laddr = dma_map_single(lp->device, skb->data, length, DMA_TO_DEVICE); + if (!laddr) { +- printk(KERN_ERR "%s: failed to map tx DMA buffer.\n", dev->name); +- dev_kfree_skb(skb); +- return NETDEV_TX_BUSY; ++ pr_err_ratelimited("%s: failed to map tx DMA buffer.\n", dev->name); ++ dev_kfree_skb_any(skb); ++ return NETDEV_TX_OK; + } + + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ +diff --git a/drivers/net/ethernet/pasemi/pasemi_mac.c b/drivers/net/ethernet/pasemi/pasemi_mac.c +index 57a6e6cd74fc..48106953cf64 100644 +--- a/drivers/net/ethernet/pasemi/pasemi_mac.c ++++ b/drivers/net/ethernet/pasemi/pasemi_mac.c +@@ -1091,7 +1091,6 @@ static int pasemi_mac_phy_init(struct net_device *dev) + + dn = pci_device_to_OF_node(mac->pdev); + phy_dn = of_parse_phandle(dn, "phy-handle", 0); +- of_node_put(phy_dn); + + mac->link = 0; + mac->speed = 0; +@@ -1100,6 +1099,7 @@ static int pasemi_mac_phy_init(struct net_device *dev) + phydev = of_phy_connect(dev, phy_dn, &pasemi_adjust_link, 0, + PHY_INTERFACE_MODE_SGMII); + ++ of_node_put(phy_dn); + if (!phydev) { + printk(KERN_ERR "%s: Could not attach to phy\n", dev->name); + return -ENODEV; +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c +index 7886a8a5b55b..fb944e65c632 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.c ++++ b/drivers/net/ethernet/qualcomm/qca_spi.c +@@ -438,7 +438,6 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event) + u16 signature = 0; + u16 spi_config; + u16 wrbuf_space = 0; +- static u16 reset_count; + + if (event == QCASPI_EVENT_CPUON) { + /* Read signature twice, if not valid +@@ -491,13 +490,13 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event) + + qca->sync = QCASPI_SYNC_RESET; + qca->stats.trig_reset++; +- reset_count = 0; ++ qca->reset_count = 0; + break; + case QCASPI_SYNC_RESET: +- reset_count++; ++ qca->reset_count++; + netdev_dbg(qca->net_dev, "sync: waiting for CPU on, count %u.\n", +- reset_count); +- if (reset_count >= QCASPI_RESET_TIMEOUT) { ++ qca->reset_count); ++ if (qca->reset_count >= QCASPI_RESET_TIMEOUT) { + /* reset did not seem to take place, try again */ + qca->sync = QCASPI_SYNC_UNKNOWN; + qca->stats.reset_timeout++; +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.h b/drivers/net/ethernet/qualcomm/qca_spi.h +index 6e31a0e744a4..c48c314ca4df 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.h ++++ b/drivers/net/ethernet/qualcomm/qca_spi.h +@@ -97,6 +97,7 @@ struct qcaspi { + + unsigned int intr_req; + unsigned int intr_svc; ++ u16 reset_count; + + #ifdef CONFIG_DEBUG_FS + struct dentry *device_root; +diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c +index 2d9f4ed9a65e..8413f93f5cd9 100644 +--- a/drivers/net/ethernet/renesas/sh_eth.c ++++ b/drivers/net/ethernet/renesas/sh_eth.c +@@ -3040,12 +3040,16 @@ static struct sh_eth_plat_data *sh_eth_parse_dt(struct device *dev) + struct device_node *np = dev->of_node; + struct sh_eth_plat_data *pdata; + const char *mac_addr; ++ int ret; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return NULL; + +- pdata->phy_interface = of_get_phy_mode(np); ++ ret = of_get_phy_mode(np); ++ if (ret < 0) ++ return NULL; ++ pdata->phy_interface = ret; + + mac_addr = of_get_mac_address(np); + if (mac_addr) +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +index 82de68b1a452..1fc356c17750 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +@@ -203,7 +203,7 @@ static void *ipq806x_gmac_of_parse(struct ipq806x_gmac *gmac) + struct device *dev = &gmac->pdev->dev; + + gmac->phy_mode = of_get_phy_mode(dev->of_node); +- if (gmac->phy_mode < 0) { ++ if ((int)gmac->phy_mode < 0) { + dev_err(dev, "missing phy mode property\n"); + return ERR_PTR(-EINVAL); + } +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +index 170a18b61281..147c9f8cee7f 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +@@ -157,7 +157,7 @@ static int stmmac_enable(struct ptp_clock_info *ptp, + /* structure describing a PTP hardware clock */ + static struct ptp_clock_info stmmac_ptp_clock_ops = { + .owner = THIS_MODULE, +- .name = "stmmac_ptp_clock", ++ .name = "stmmac ptp", + .max_adj = 62500000, + .n_alarm = 0, + .n_ext_ts = 0, +diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c +index ef6b25ec75a1..0f8d5609ed51 100644 +--- a/drivers/net/slip/slip.c ++++ b/drivers/net/slip/slip.c +@@ -452,9 +452,16 @@ static void slip_transmit(struct work_struct *work) + */ + static void slip_write_wakeup(struct tty_struct *tty) + { +- struct slip *sl = tty->disc_data; ++ struct slip *sl; ++ ++ rcu_read_lock(); ++ sl = rcu_dereference(tty->disc_data); ++ if (!sl) ++ goto out; + + schedule_work(&sl->tx_work); ++out: ++ rcu_read_unlock(); + } + + static void sl_tx_timeout(struct net_device *dev) +@@ -887,10 +894,11 @@ static void slip_close(struct tty_struct *tty) + return; + + spin_lock_bh(&sl->lock); +- tty->disc_data = NULL; ++ rcu_assign_pointer(tty->disc_data, NULL); + sl->tty = NULL; + spin_unlock_bh(&sl->lock); + ++ synchronize_rcu(); + flush_work(&sl->tx_work); + + /* VSV = very important to remove timers */ +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 4174b24963b9..75a3865a80d2 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + #include + #include "lan78xx.h" + +@@ -2893,6 +2894,19 @@ void lan78xx_tx_timeout(struct net_device *net) + tasklet_schedule(&dev->bh); + } + ++static netdev_features_t lan78xx_features_check(struct sk_buff *skb, ++ struct net_device *netdev, ++ netdev_features_t features) ++{ ++ if (skb->len + TX_OVERHEAD > MAX_SINGLE_PACKET_SIZE) ++ features &= ~NETIF_F_GSO_MASK; ++ ++ features = vlan_features_check(skb, features); ++ features = vxlan_features_check(skb, features); ++ ++ return features; ++} ++ + static const struct net_device_ops lan78xx_netdev_ops = { + .ndo_open = lan78xx_open, + .ndo_stop = lan78xx_stop, +@@ -2906,6 +2920,7 @@ static const struct net_device_ops lan78xx_netdev_ops = { + .ndo_set_features = lan78xx_set_features, + .ndo_vlan_rx_add_vid = lan78xx_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = lan78xx_vlan_rx_kill_vid, ++ .ndo_features_check = lan78xx_features_check, + }; + + static int lan78xx_probe(struct usb_interface *intf, +diff --git a/drivers/net/wireless/ath/ath9k/dynack.c b/drivers/net/wireless/ath/ath9k/dynack.c +index 22b3cc4c27cd..58205a5bd74b 100644 +--- a/drivers/net/wireless/ath/ath9k/dynack.c ++++ b/drivers/net/wireless/ath/ath9k/dynack.c +@@ -285,9 +285,9 @@ void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an) + + an->ackto = ackto; + +- spin_lock(&da->qlock); ++ spin_lock_bh(&da->qlock); + list_add_tail(&an->list, &da->nodes); +- spin_unlock(&da->qlock); ++ spin_unlock_bh(&da->qlock); + } + EXPORT_SYMBOL(ath_dynack_node_init); + +@@ -301,9 +301,9 @@ void ath_dynack_node_deinit(struct ath_hw *ah, struct ath_node *an) + { + struct ath_dynack *da = &ah->dynack; + +- spin_lock(&da->qlock); ++ spin_lock_bh(&da->qlock); + list_del(&an->list); +- spin_unlock(&da->qlock); ++ spin_unlock_bh(&da->qlock); + } + EXPORT_SYMBOL(ath_dynack_node_deinit); + +diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c +index 8317afd065b4..0824697c3dca 100644 +--- a/drivers/net/wireless/libertas/cfg.c ++++ b/drivers/net/wireless/libertas/cfg.c +@@ -272,6 +272,10 @@ add_ie_rates(u8 *tlv, const u8 *ie, int *nrates) + int hw, ap, ap_max = ie[1]; + u8 hw_rate; + ++ if (ap_max > MAX_RATES) { ++ lbs_deb_assoc("invalid rates\n"); ++ return tlv; ++ } + /* Advance past IE header */ + ie += 2; + +@@ -1783,6 +1787,9 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + struct cmd_ds_802_11_ad_hoc_join cmd; + u8 preamble = RADIO_PREAMBLE_SHORT; + int ret = 0; ++ int hw, i; ++ u8 rates_max; ++ u8 *rates; + + lbs_deb_enter(LBS_DEB_CFG80211); + +@@ -1843,9 +1850,12 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + if (!rates_eid) { + lbs_add_rates(cmd.bss.rates); + } else { +- int hw, i; +- u8 rates_max = rates_eid[1]; +- u8 *rates = cmd.bss.rates; ++ rates_max = rates_eid[1]; ++ if (rates_max > MAX_RATES) { ++ lbs_deb_join("invalid rates"); ++ goto out; ++ } ++ rates = cmd.bss.rates; + for (hw = 0; hw < ARRAY_SIZE(lbs_rates); hw++) { + u8 hw_rate = lbs_rates[hw].bitrate / 5; + for (i = 0; i < rates_max; i++) { +diff --git a/drivers/net/wireless/libertas_tf/cmd.c b/drivers/net/wireless/libertas_tf/cmd.c +index 909ac3685010..2b193f1257a5 100644 +--- a/drivers/net/wireless/libertas_tf/cmd.c ++++ b/drivers/net/wireless/libertas_tf/cmd.c +@@ -69,7 +69,7 @@ static void lbtf_geo_init(struct lbtf_private *priv) + break; + } + +- for (ch = priv->range.start; ch < priv->range.end; ch++) ++ for (ch = range->start; ch < range->end; ch++) + priv->channels[CHAN_TO_IDX(ch)].flags = 0; + } + +diff --git a/drivers/net/wireless/mediatek/mt7601u/phy.c b/drivers/net/wireless/mediatek/mt7601u/phy.c +index 1908af6add87..59ed073a8572 100644 +--- a/drivers/net/wireless/mediatek/mt7601u/phy.c ++++ b/drivers/net/wireless/mediatek/mt7601u/phy.c +@@ -219,7 +219,7 @@ int mt7601u_wait_bbp_ready(struct mt7601u_dev *dev) + + do { + val = mt7601u_bbp_rr(dev, MT_BBP_REG_VERSION); +- if (val && ~val) ++ if (val && val != 0xff) + break; + } while (--i); + +diff --git a/drivers/pinctrl/sh-pfc/pfc-emev2.c b/drivers/pinctrl/sh-pfc/pfc-emev2.c +index 02118ab336fc..5ab3ac61f418 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-emev2.c ++++ b/drivers/pinctrl/sh-pfc/pfc-emev2.c +@@ -1263,6 +1263,14 @@ static const char * const dtv_groups[] = { + "dtv_b", + }; + ++static const char * const err_rst_reqb_groups[] = { ++ "err_rst_reqb", ++}; ++ ++static const char * const ext_clki_groups[] = { ++ "ext_clki", ++}; ++ + static const char * const iic0_groups[] = { + "iic0", + }; +@@ -1285,6 +1293,10 @@ static const char * const lcd_groups[] = { + "yuv3", + }; + ++static const char * const lowpwr_groups[] = { ++ "lowpwr", ++}; ++ + static const char * const ntsc_groups[] = { + "ntsc_clk", + "ntsc_data", +@@ -1298,6 +1310,10 @@ static const char * const pwm1_groups[] = { + "pwm1", + }; + ++static const char * const ref_clko_groups[] = { ++ "ref_clko", ++}; ++ + static const char * const sd_groups[] = { + "sd_cki", + }; +@@ -1391,13 +1407,17 @@ static const struct sh_pfc_function pinmux_functions[] = { + SH_PFC_FUNCTION(cam), + SH_PFC_FUNCTION(cf), + SH_PFC_FUNCTION(dtv), ++ SH_PFC_FUNCTION(err_rst_reqb), ++ SH_PFC_FUNCTION(ext_clki), + SH_PFC_FUNCTION(iic0), + SH_PFC_FUNCTION(iic1), + SH_PFC_FUNCTION(jtag), + SH_PFC_FUNCTION(lcd), ++ SH_PFC_FUNCTION(lowpwr), + SH_PFC_FUNCTION(ntsc), + SH_PFC_FUNCTION(pwm0), + SH_PFC_FUNCTION(pwm1), ++ SH_PFC_FUNCTION(ref_clko), + SH_PFC_FUNCTION(sd), + SH_PFC_FUNCTION(sdi0), + SH_PFC_FUNCTION(sdi1), +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +index 279e9dd442e4..bc2ee07fa92f 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +@@ -1983,7 +1983,7 @@ static const unsigned int gether_gmii_pins[] = { + */ + 185, 186, 187, 188, 189, 190, 191, 192, 174, 161, 204, + 171, 170, 169, 168, 167, 166, 173, 172, 176, 184, 183, 203, +- 205, 163, 206, 207, ++ 205, 163, 206, 207, 158, + }; + static const unsigned int gether_gmii_mux[] = { + ET_ERXD0_MARK, ET_ERXD1_MARK, ET_ERXD2_MARK, ET_ERXD3_MARK, +@@ -2155,6 +2155,7 @@ static const unsigned int lcd0_data24_1_mux[] = { + LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK, + LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK, + LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK, ++ LCD0_D12_MARK, LCD0_D13_MARK, LCD0_D14_MARK, LCD0_D15_MARK, + LCD0_D16_MARK, LCD0_D17_MARK, LCD0_D18_PORT163_MARK, + LCD0_D19_PORT162_MARK, LCD0_D20_PORT161_MARK, LCD0_D21_PORT158_MARK, + LCD0_D22_PORT160_MARK, LCD0_D23_PORT159_MARK, +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +index 42ffa8708abc..b2f8898ddb2c 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +@@ -3059,8 +3059,7 @@ static const unsigned int qspi_data4_b_pins[] = { + RCAR_GP_PIN(6, 4), + }; + static const unsigned int qspi_data4_b_mux[] = { +- SPCLK_B_MARK, MOSI_IO0_B_MARK, MISO_IO1_B_MARK, +- IO2_B_MARK, IO3_B_MARK, SSL_B_MARK, ++ MOSI_IO0_B_MARK, MISO_IO1_B_MARK, IO2_B_MARK, IO3_B_MARK, + }; + /* - SCIF0 ------------------------------------------------------------------ */ + static const unsigned int scif0_data_pins[] = { +@@ -4171,17 +4170,14 @@ static const unsigned int vin1_b_data18_pins[] = { + }; + static const unsigned int vin1_b_data18_mux[] = { + /* B */ +- VI1_DATA0_B_MARK, VI1_DATA1_B_MARK, + VI1_DATA2_B_MARK, VI1_DATA3_B_MARK, + VI1_DATA4_B_MARK, VI1_DATA5_B_MARK, + VI1_DATA6_B_MARK, VI1_DATA7_B_MARK, + /* G */ +- VI1_G0_B_MARK, VI1_G1_B_MARK, + VI1_G2_B_MARK, VI1_G3_B_MARK, + VI1_G4_B_MARK, VI1_G5_B_MARK, + VI1_G6_B_MARK, VI1_G7_B_MARK, + /* R */ +- VI1_R0_B_MARK, VI1_R1_B_MARK, + VI1_R2_B_MARK, VI1_R3_B_MARK, + VI1_R4_B_MARK, VI1_R5_B_MARK, + VI1_R6_B_MARK, VI1_R7_B_MARK, +@@ -4971,7 +4967,7 @@ static const char * const scifb2_groups[] = { + "scifb2_data_b", + "scifb2_clk_b", + "scifb2_ctrl_b", +- "scifb0_data_c", ++ "scifb2_data_c", + "scifb2_clk_c", + "scifb2_data_d", + }; +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7794.c b/drivers/pinctrl/sh-pfc/pfc-r8a7794.c +index 086f6798b129..3b79e893b5ed 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7794.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7794.c +@@ -4046,7 +4046,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_AVB_MDC, FN_SSI_SDATA6_B, 0, 0, } + }, + { PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32, +- 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3) { ++ 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3) { + /* IP9_31 [1] */ + 0, 0, + /* IP9_30_28 [3] */ +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7269.c b/drivers/pinctrl/sh-pfc/pfc-sh7269.c +index a50d22bef1f4..cfdb4fc177c3 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7269.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7269.c +@@ -2119,7 +2119,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + }, + + { PINMUX_CFG_REG("PCIOR0", 0xfffe3852, 16, 1) { +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PC8_IN, PC8_OUT, + PC7_IN, PC7_OUT, + PC6_IN, PC6_OUT, +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +index 6a69c8c5d943..b173bd759ee1 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +@@ -2672,6 +2672,7 @@ static const unsigned int tpu4_to2_mux[] = { + }; + static const unsigned int tpu4_to3_pins[] = { + /* TO */ ++ PIN_NUMBER(6, 26), + }; + static const unsigned int tpu4_to3_mux[] = { + TPU4TO3_MARK, +@@ -2894,7 +2895,8 @@ static const char * const fsic_groups[] = { + "fsic_sclk_out", + "fsic_data_in", + "fsic_data_out", +- "fsic_spdif", ++ "fsic_spdif_0", ++ "fsic_spdif_1", + }; + + static const char * const fsid_groups[] = { +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7734.c b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +index ab09d385f95d..ce543f3c39b2 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7734.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +@@ -2236,13 +2236,13 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_LCD_CL1_B, 0, 0, + /* IP10_5_3 [3] */ + FN_SSI_WS23, FN_VI1_5_B, FN_TX1_D, FN_HSCK0_C, FN_FALE_B, +- FN_LCD_DON_B, 0, 0, 0, ++ FN_LCD_DON_B, 0, 0, + /* IP10_2_0 [3] */ + FN_SSI_SCK23, FN_VI1_4_B, FN_RX1_D, FN_FCLE_B, + FN_LCD_DATA15_B, 0, 0, 0 } + }, + { PINMUX_CFG_REG_VAR("IPSR11", 0xFFFC0048, 32, +- 3, 1, 2, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { ++ 3, 1, 2, 3, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { + /* IP11_31_29 [3] */ + 0, 0, 0, 0, 0, 0, 0, 0, + /* IP11_28 [1] */ +diff --git a/drivers/platform/mips/cpu_hwmon.c b/drivers/platform/mips/cpu_hwmon.c +index 0f6c63e17049..9a201c3caaf4 100644 +--- a/drivers/platform/mips/cpu_hwmon.c ++++ b/drivers/platform/mips/cpu_hwmon.c +@@ -155,7 +155,7 @@ static int __init loongson_hwmon_init(void) + + cpu_hwmon_dev = hwmon_device_register(NULL); + if (IS_ERR(cpu_hwmon_dev)) { +- ret = -ENOMEM; ++ ret = PTR_ERR(cpu_hwmon_dev); + pr_err("hwmon_device_register fail!\n"); + goto fail_hwmon_device_register; + } +diff --git a/drivers/platform/x86/alienware-wmi.c b/drivers/platform/x86/alienware-wmi.c +index 3df47c1b04ec..f5585740a765 100644 +--- a/drivers/platform/x86/alienware-wmi.c ++++ b/drivers/platform/x86/alienware-wmi.c +@@ -511,7 +511,7 @@ static ssize_t show_hdmi_source(struct device *dev, + return scnprintf(buf, PAGE_SIZE, + "input [gpu] unknown\n"); + } +- pr_err("alienware-wmi: unknown HDMI source status: %d\n", out_data); ++ pr_err("alienware-wmi: unknown HDMI source status: %u\n", status); + return scnprintf(buf, PAGE_SIZE, "input gpu [unknown]\n"); + } + +diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c +index b13cd074c52a..9281e42c9ed5 100644 +--- a/drivers/power/power_supply_core.c ++++ b/drivers/power/power_supply_core.c +@@ -755,14 +755,14 @@ __power_supply_register(struct device *parent, + } + + spin_lock_init(&psy->changed_lock); +- rc = device_init_wakeup(dev, ws); +- if (rc) +- goto wakeup_init_failed; +- + rc = device_add(dev); + if (rc) + goto device_add_failed; + ++ rc = device_init_wakeup(dev, ws); ++ if (rc) ++ goto wakeup_init_failed; ++ + rc = psy_register_thermal(psy); + if (rc) + goto register_thermal_failed; +@@ -798,8 +798,8 @@ register_cooler_failed: + psy_unregister_thermal(psy); + register_thermal_failed: + device_del(dev); +-device_add_failed: + wakeup_init_failed: ++device_add_failed: + check_supplies_failed: + dev_set_name_failed: + put_device(dev); +diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c +index 8cbb82ceec40..fad424e20bd5 100644 +--- a/drivers/regulator/wm831x-dcdc.c ++++ b/drivers/regulator/wm831x-dcdc.c +@@ -327,8 +327,8 @@ static int wm831x_buckv_get_voltage_sel(struct regulator_dev *rdev) + } + + /* Current limit options */ +-static u16 wm831x_dcdc_ilim[] = { +- 125, 250, 375, 500, 625, 750, 875, 1000 ++static const unsigned int wm831x_dcdc_ilim[] = { ++ 125000, 250000, 375000, 500000, 625000, 750000, 875000, 1000000 + }; + + static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev, +diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c +index 466bf7f9a285..7da2a1fb50f8 100644 +--- a/drivers/rtc/rtc-88pm80x.c ++++ b/drivers/rtc/rtc-88pm80x.c +@@ -116,12 +116,14 @@ static int pm80x_rtc_read_time(struct device *dev, struct rtc_time *tm) + unsigned char buf[4]; + unsigned long ticks, base, data; + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -144,7 +146,8 @@ static int pm80x_rtc_set_time(struct device *dev, struct rtc_time *tm) + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + base = ticks - data; + dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -165,11 +168,13 @@ static int pm80x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) + int ret; + + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + regmap_raw_read(info->map, PM800_RTC_EXPIRE1_1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -192,12 +197,14 @@ static int pm80x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) + regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_ALARM1_EN, 0); + + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c +index 166faae3a59c..7d3e5168fcef 100644 +--- a/drivers/rtc/rtc-88pm860x.c ++++ b/drivers/rtc/rtc-88pm860x.c +@@ -115,11 +115,13 @@ static int pm860x_rtc_read_time(struct device *dev, struct rtc_time *tm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -145,7 +147,8 @@ static int pm860x_rtc_set_time(struct device *dev, struct rtc_time *tm) + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + base = ticks - data; + dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -170,10 +173,12 @@ static int pm860x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + pm860x_bulk_read(info->i2c, PM8607_RTC_EXPIRE1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -198,11 +203,13 @@ static int pm860x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c +index 92b1cbf2c4a7..2bea733b1589 100644 +--- a/drivers/rtc/rtc-ds1672.c ++++ b/drivers/rtc/rtc-ds1672.c +@@ -60,7 +60,8 @@ static int ds1672_get_datetime(struct i2c_client *client, struct rtc_time *tm) + "%s: raw read data - counters=%02x,%02x,%02x,%02x\n", + __func__, buf[0], buf[1], buf[2], buf[3]); + +- time = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ time = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + + rtc_time_to_tm(time, tm); + +diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c +index 45b5a3d47ccf..1982eec0a3ea 100644 +--- a/drivers/rtc/rtc-pcf8563.c ++++ b/drivers/rtc/rtc-pcf8563.c +@@ -568,7 +568,6 @@ static int pcf8563_probe(struct i2c_client *client, + struct pcf8563 *pcf8563; + int err; + unsigned char buf; +- unsigned char alm_pending; + + dev_dbg(&client->dev, "%s\n", __func__); + +@@ -594,13 +593,13 @@ static int pcf8563_probe(struct i2c_client *client, + return err; + } + +- err = pcf8563_get_alarm_mode(client, NULL, &alm_pending); +- if (err) { +- dev_err(&client->dev, "%s: read error\n", __func__); ++ /* Clear flags and disable interrupts */ ++ buf = 0; ++ err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf); ++ if (err < 0) { ++ dev_err(&client->dev, "%s: write error\n", __func__); + return err; + } +- if (alm_pending) +- pcf8563_set_alarm_mode(client, 0); + + pcf8563->rtc = devm_rtc_device_register(&client->dev, + pcf8563_driver.driver.name, +diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c +index 795fcbd02ea3..a0dae6271ff6 100644 +--- a/drivers/rtc/rtc-pm8xxx.c ++++ b/drivers/rtc/rtc-pm8xxx.c +@@ -186,7 +186,8 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) + } + } + +- secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); ++ secs = value[0] | (value[1] << 8) | (value[2] << 16) | ++ ((unsigned long)value[3] << 24); + + rtc_time_to_tm(secs, tm); + +@@ -267,7 +268,8 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) + return rc; + } + +- secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); ++ secs = value[0] | (value[1] << 8) | (value[2] << 16) | ++ ((unsigned long)value[3] << 24); + + rtc_time_to_tm(secs, &alarm->time); + +diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c +index 30f9ef0c0d4f..b20c575564e4 100644 +--- a/drivers/scsi/libfc/fc_exch.c ++++ b/drivers/scsi/libfc/fc_exch.c +@@ -2499,7 +2499,7 @@ void fc_exch_recv(struct fc_lport *lport, struct fc_frame *fp) + + /* lport lock ? */ + if (!lport || lport->state == LPORT_ST_DISABLED) { +- FC_LPORT_DBG(lport, "Receiving frames for an lport that " ++ FC_LIBFC_DBG("Receiving frames for an lport that " + "has not been initialized correctly\n"); + fc_frame_free(fp); + return; +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index 7be968f60b59..1efd876f0728 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -3585,12 +3585,12 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr) + /* + * The cur_state should not last for more than max_wait secs + */ +- for (i = 0; i < max_wait; i++) { ++ for (i = 0; i < max_wait * 50; i++) { + curr_abs_state = instance->instancet-> + read_fw_status_reg(instance->reg_set); + + if (abs_state == curr_abs_state) { +- msleep(1000); ++ msleep(20); + } else + break; + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 611a127f08d8..8975baab73e5 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -5780,8 +5780,7 @@ qla2x00_module_init(void) + /* Initialize target kmem_cache and mem_pools */ + ret = qlt_init(); + if (ret < 0) { +- kmem_cache_destroy(srb_cachep); +- return ret; ++ goto destroy_cache; + } else if (ret > 0) { + /* + * If initiator mode is explictly disabled by qlt_init(), +@@ -5800,11 +5799,10 @@ qla2x00_module_init(void) + qla2xxx_transport_template = + fc_attach_transport(&qla2xxx_transport_functions); + if (!qla2xxx_transport_template) { +- kmem_cache_destroy(srb_cachep); + ql_log(ql_log_fatal, NULL, 0x0002, + "fc_attach_transport failed...Failing load!.\n"); +- qlt_exit(); +- return -ENODEV; ++ ret = -ENODEV; ++ goto qlt_exit; + } + + apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops); +@@ -5816,27 +5814,37 @@ qla2x00_module_init(void) + qla2xxx_transport_vport_template = + fc_attach_transport(&qla2xxx_transport_vport_functions); + if (!qla2xxx_transport_vport_template) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); + ql_log(ql_log_fatal, NULL, 0x0004, + "fc_attach_transport vport failed...Failing load!.\n"); +- return -ENODEV; ++ ret = -ENODEV; ++ goto unreg_chrdev; + } + ql_log(ql_log_info, NULL, 0x0005, + "QLogic Fibre Channel HBA Driver: %s.\n", + qla2x00_version_str); + ret = pci_register_driver(&qla2xxx_pci_driver); + if (ret) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); +- fc_release_transport(qla2xxx_transport_vport_template); + ql_log(ql_log_fatal, NULL, 0x0006, + "pci_register_driver failed...ret=%d Failing load!.\n", + ret); ++ goto release_vport_transport; + } + return ret; ++ ++release_vport_transport: ++ fc_release_transport(qla2xxx_transport_vport_template); ++ ++unreg_chrdev: ++ if (apidev_major >= 0) ++ unregister_chrdev(apidev_major, QLA2XXX_APIDEV); ++ fc_release_transport(qla2xxx_transport_template); ++ ++qlt_exit: ++ qlt_exit(); ++ ++destroy_cache: ++ kmem_cache_destroy(srb_cachep); ++ return ret; + } + + /** +diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c +index bb4ed7b1f5df..ab32e6073642 100644 +--- a/drivers/scsi/scsi_transport_iscsi.c ++++ b/drivers/scsi/scsi_transport_iscsi.c +@@ -37,6 +37,8 @@ + + #define ISCSI_TRANSPORT_VERSION "2.0-870" + ++#define ISCSI_SEND_MAX_ALLOWED 10 ++ + static int dbg_session; + module_param_named(debug_session, dbg_session, int, + S_IRUGO | S_IWUSR); +@@ -3695,6 +3697,7 @@ iscsi_if_rx(struct sk_buff *skb) + struct nlmsghdr *nlh; + struct iscsi_uevent *ev; + uint32_t group; ++ int retries = ISCSI_SEND_MAX_ALLOWED; + + nlh = nlmsg_hdr(skb); + if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) || +@@ -3725,6 +3728,10 @@ iscsi_if_rx(struct sk_buff *skb) + break; + err = iscsi_if_send_reply(group, nlh->nlmsg_seq, + nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); ++ if (err == -EAGAIN && --retries < 0) { ++ printk(KERN_WARNING "Send reply failed, error %d\n", err); ++ break; ++ } + } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH); + skb_pull(skb, rlen); + } +diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c +index ca655593c5e0..1cedd640705f 100644 +--- a/drivers/spi/spi-bcm2835aux.c ++++ b/drivers/spi/spi-bcm2835aux.c +@@ -390,7 +390,18 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev) + platform_set_drvdata(pdev, master); + master->mode_bits = BCM2835_AUX_SPI_MODE_BITS; + master->bits_per_word_mask = SPI_BPW_MASK(8); +- master->num_chipselect = -1; ++ /* even though the driver never officially supported native CS ++ * allow a single native CS for legacy DT support purposes when ++ * no cs-gpio is configured. ++ * Known limitations for native cs are: ++ * * multiple chip-selects: cs0-cs2 are all simultaniously asserted ++ * whenever there is a transfer - this even includes SPI_NO_CS ++ * * SPI_CS_HIGH: is ignores - cs are always asserted low ++ * * cs_change: cs is deasserted after each spi_transfer ++ * * cs_delay_usec: cs is always deasserted one SCK cycle after ++ * a spi_transfer ++ */ ++ master->num_chipselect = 1; + master->transfer_one = bcm2835aux_spi_transfer_one; + master->handle_err = bcm2835aux_spi_handle_err; + master->dev.of_node = pdev->dev.of_node; +diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c +index 8b290d9d7935..5419de19859a 100644 +--- a/drivers/spi/spi-fsl-spi.c ++++ b/drivers/spi/spi-fsl-spi.c +@@ -408,7 +408,6 @@ static int fsl_spi_do_one_msg(struct spi_master *master, + } + + m->status = status; +- spi_finalize_current_message(master); + + if (status || !cs_change) { + ndelay(nsecs); +@@ -416,6 +415,7 @@ static int fsl_spi_do_one_msg(struct spi_master *master, + } + + fsl_spi_setup_transfer(spi, NULL); ++ spi_finalize_current_message(master); + return 0; + } + +diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c +index 705f515863d4..e37712bed0b2 100644 +--- a/drivers/spi/spi-tegra114.c ++++ b/drivers/spi/spi-tegra114.c +@@ -307,10 +307,16 @@ static unsigned tegra_spi_fill_tx_fifo_from_client_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tegra_spi_writel(tspi, x, SPI_TX_FIFO); + } ++ ++ tspi->cur_tx_pos += written_words * tspi->bytes_per_word; + } else { ++ unsigned int write_bytes; + max_n_32bit = min(tspi->curr_dma_words, tx_empty_count); + written_words = max_n_32bit; + nbytes = written_words * tspi->bytes_per_word; ++ if (nbytes > t->len - tspi->cur_pos) ++ nbytes = t->len - tspi->cur_pos; ++ write_bytes = nbytes; + for (count = 0; count < max_n_32bit; count++) { + u32 x = 0; + +@@ -319,8 +325,10 @@ static unsigned tegra_spi_fill_tx_fifo_from_client_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tegra_spi_writel(tspi, x, SPI_TX_FIFO); + } ++ ++ tspi->cur_tx_pos += write_bytes; + } +- tspi->cur_tx_pos += written_words * tspi->bytes_per_word; ++ + return written_words; + } + +@@ -344,20 +352,27 @@ static unsigned int tegra_spi_read_rx_fifo_to_client_rxbuf( + for (i = 0; len && (i < 4); i++, len--) + *rx_buf++ = (x >> i*8) & 0xFF; + } +- tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + read_words += tspi->curr_dma_words; ++ tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; ++ u8 bytes_per_word = tspi->bytes_per_word; ++ unsigned int read_bytes; + ++ len = rx_full_count * bytes_per_word; ++ if (len > t->len - tspi->cur_pos) ++ len = t->len - tspi->cur_pos; ++ read_bytes = len; + for (count = 0; count < rx_full_count; count++) { + u32 x = tegra_spi_readl(tspi, SPI_RX_FIFO) & rx_mask; + +- for (i = 0; (i < tspi->bytes_per_word); i++) ++ for (i = 0; len && (i < bytes_per_word); i++, len--) + *rx_buf++ = (x >> (i*8)) & 0xFF; + } +- tspi->cur_rx_pos += rx_full_count * tspi->bytes_per_word; + read_words += rx_full_count; ++ tspi->cur_rx_pos += read_bytes; + } ++ + return read_words; + } + +@@ -372,12 +387,17 @@ static void tegra_spi_copy_client_txbuf_to_spi_txbuf( + unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; + + memcpy(tspi->tx_dma_buf, t->tx_buf + tspi->cur_pos, len); ++ tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + unsigned int i; + unsigned int count; + u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; + unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; ++ unsigned int write_bytes; + ++ if (consume > t->len - tspi->cur_pos) ++ consume = t->len - tspi->cur_pos; ++ write_bytes = consume; + for (count = 0; count < tspi->curr_dma_words; count++) { + u32 x = 0; + +@@ -386,8 +406,9 @@ static void tegra_spi_copy_client_txbuf_to_spi_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tspi->tx_dma_buf[count] = x; + } ++ ++ tspi->cur_tx_pos += write_bytes; + } +- tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->tx_dma_phys, +@@ -405,20 +426,28 @@ static void tegra_spi_copy_spi_rxbuf_to_client_rxbuf( + unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; + + memcpy(t->rx_buf + tspi->cur_rx_pos, tspi->rx_dma_buf, len); ++ tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + unsigned int i; + unsigned int count; + unsigned char *rx_buf = t->rx_buf + tspi->cur_rx_pos; + u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; ++ unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; ++ unsigned int read_bytes; + ++ if (consume > t->len - tspi->cur_pos) ++ consume = t->len - tspi->cur_pos; ++ read_bytes = consume; + for (count = 0; count < tspi->curr_dma_words; count++) { + u32 x = tspi->rx_dma_buf[count] & rx_mask; + +- for (i = 0; (i < tspi->bytes_per_word); i++) ++ for (i = 0; consume && (i < tspi->bytes_per_word); ++ i++, consume--) + *rx_buf++ = (x >> (i*8)) & 0xFF; + } ++ ++ tspi->cur_rx_pos += read_bytes; + } +- tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, +@@ -730,6 +759,8 @@ static int tegra_spi_start_transfer_one(struct spi_device *spi, + + if (tspi->is_packed) + command1 |= SPI_PACKED; ++ else ++ command1 &= ~SPI_PACKED; + + command1 &= ~(SPI_CS_SEL_MASK | SPI_TX_EN | SPI_RX_EN); + tspi->cur_direction = 0; +diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c +index 619c989c5f37..d682907c146a 100644 +--- a/drivers/staging/comedi/drivers/ni_mio_common.c ++++ b/drivers/staging/comedi/drivers/ni_mio_common.c +@@ -4809,7 +4809,10 @@ static int ni_valid_rtsi_output_source(struct comedi_device *dev, + case NI_RTSI_OUTPUT_G_SRC0: + case NI_RTSI_OUTPUT_G_GATE0: + case NI_RTSI_OUTPUT_RGOUT0: +- case NI_RTSI_OUTPUT_RTSI_BRD_0: ++ case NI_RTSI_OUTPUT_RTSI_BRD(0): ++ case NI_RTSI_OUTPUT_RTSI_BRD(1): ++ case NI_RTSI_OUTPUT_RTSI_BRD(2): ++ case NI_RTSI_OUTPUT_RTSI_BRD(3): + return 1; + case NI_RTSI_OUTPUT_RTSI_OSC: + return (devpriv->is_m_series) ? 1 : 0; +@@ -4830,11 +4833,18 @@ static int ni_set_rtsi_routing(struct comedi_device *dev, + devpriv->rtsi_trig_a_output_reg |= NISTC_RTSI_TRIG(chan, src); + ni_stc_writew(dev, devpriv->rtsi_trig_a_output_reg, + NISTC_RTSI_TRIGA_OUT_REG); +- } else if (chan < 8) { ++ } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { + devpriv->rtsi_trig_b_output_reg &= ~NISTC_RTSI_TRIG_MASK(chan); + devpriv->rtsi_trig_b_output_reg |= NISTC_RTSI_TRIG(chan, src); + ni_stc_writew(dev, devpriv->rtsi_trig_b_output_reg, + NISTC_RTSI_TRIGB_OUT_REG); ++ } else if (chan != NISTC_RTSI_TRIG_OLD_CLK_CHAN) { ++ /* probably should never reach this, since the ++ * ni_valid_rtsi_output_source above errors out if chan is too ++ * high ++ */ ++ dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); ++ return -EINVAL; + } + return 2; + } +@@ -4849,12 +4859,12 @@ static unsigned ni_get_rtsi_routing(struct comedi_device *dev, unsigned chan) + } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { + return NISTC_RTSI_TRIG_TO_SRC(chan, + devpriv->rtsi_trig_b_output_reg); +- } else { +- if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) +- return NI_RTSI_OUTPUT_RTSI_OSC; +- dev_err(dev->class_dev, "bug! should never get here?\n"); +- return 0; ++ } else if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) { ++ return NI_RTSI_OUTPUT_RTSI_OSC; + } ++ ++ dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); ++ return -EINVAL; + } + + static int ni_rtsi_insn_config(struct comedi_device *dev, +diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c +index 564828554ca0..07d9384bce94 100644 +--- a/drivers/target/iscsi/iscsi_target.c ++++ b/drivers/target/iscsi/iscsi_target.c +@@ -4309,9 +4309,6 @@ int iscsit_close_connection( + iscsit_stop_nopin_response_timer(conn); + iscsit_stop_nopin_timer(conn); + +- if (conn->conn_transport->iscsit_wait_conn) +- conn->conn_transport->iscsit_wait_conn(conn); +- + /* + * During Connection recovery drop unacknowledged out of order + * commands for this connection, and prepare the other commands +@@ -4397,6 +4394,9 @@ int iscsit_close_connection( + target_sess_cmd_list_set_waiting(sess->se_sess); + target_wait_for_sess_cmds(sess->se_sess); + ++ if (conn->conn_transport->iscsit_wait_conn) ++ conn->conn_transport->iscsit_wait_conn(conn); ++ + if (conn->conn_rx_hash.tfm) + crypto_free_hash(conn->conn_rx_hash.tfm); + if (conn->conn_tx_hash.tfm) +diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c +index 87d87ac1c8a0..96567b4a4f20 100644 +--- a/drivers/thermal/cpu_cooling.c ++++ b/drivers/thermal/cpu_cooling.c +@@ -607,7 +607,7 @@ static int cpufreq_get_requested_power(struct thermal_cooling_device *cdev, + load = 0; + + total_load += load; +- if (trace_thermal_power_cpu_limit_enabled() && load_cpu) ++ if (load_cpu) + load_cpu[i] = load; + + i++; +diff --git a/drivers/tty/ipwireless/hardware.c b/drivers/tty/ipwireless/hardware.c +index ad7031a4f3c4..454cdc6f2c05 100644 +--- a/drivers/tty/ipwireless/hardware.c ++++ b/drivers/tty/ipwireless/hardware.c +@@ -1515,6 +1515,8 @@ static void ipw_send_setup_packet(struct ipw_hardware *hw) + sizeof(struct ipw_setup_get_version_query_packet), + ADDR_SETUP_PROT, TL_PROTOCOLID_SETUP, + TL_SETUP_SIGNO_GET_VERSION_QRY); ++ if (!ver_packet) ++ return; + ver_packet->header.length = sizeof(struct tl_setup_get_version_qry); + + /* +diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c +index 71ad04d54212..1a1d1cfc3704 100644 +--- a/drivers/usb/class/cdc-wdm.c ++++ b/drivers/usb/class/cdc-wdm.c +@@ -1098,7 +1098,7 @@ static int wdm_post_reset(struct usb_interface *intf) + rv = recover_from_urb_loss(desc); + mutex_unlock(&desc->wlock); + mutex_unlock(&desc->rlock); +- return 0; ++ return rv; + } + + static struct usb_driver wdm_driver = { +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 40c95ed6afbf..3ef80c2c0dcc 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -965,7 +965,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + } + port_li = readl(port_array[wIndex] + PORTLI); + status = xhci_get_ext_port_status(temp, port_li); +- put_unaligned_le32(cpu_to_le32(status), &buf[4]); ++ put_unaligned_le32(status, &buf[4]); + } + break; + case SetPortFeature: +diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c +index 4b62eb3b5923..7a82735d5308 100644 +--- a/drivers/vfio/pci/vfio_pci.c ++++ b/drivers/vfio/pci/vfio_pci.c +@@ -496,6 +496,7 @@ static long vfio_pci_ioctl(void *device_data, + { + void __iomem *io; + size_t size; ++ u16 orig_cmd; + + info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index); + info.flags = 0; +@@ -505,15 +506,23 @@ static long vfio_pci_ioctl(void *device_data, + if (!info.size) + break; + +- /* Is it really there? */ ++ /* ++ * Is it really there? Enable memory decode for ++ * implicit access in pci_map_rom(). ++ */ ++ pci_read_config_word(pdev, PCI_COMMAND, &orig_cmd); ++ pci_write_config_word(pdev, PCI_COMMAND, ++ orig_cmd | PCI_COMMAND_MEMORY); ++ + io = pci_map_rom(pdev, &size); +- if (!io || !size) { ++ if (io) { ++ info.flags = VFIO_REGION_INFO_FLAG_READ; ++ pci_unmap_rom(pdev, io); ++ } else { + info.size = 0; +- break; + } +- pci_unmap_rom(pdev, io); + +- info.flags = VFIO_REGION_INFO_FLAG_READ; ++ pci_write_config_word(pdev, PCI_COMMAND, orig_cmd); + break; + } + case VFIO_PCI_VGA_REGION_INDEX: +diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c +index 35fe4825a454..5ef6f9d420a2 100644 +--- a/drivers/video/backlight/lm3630a_bl.c ++++ b/drivers/video/backlight/lm3630a_bl.c +@@ -200,7 +200,7 @@ static int lm3630a_bank_a_update_status(struct backlight_device *bl) + LM3630A_LEDA_ENABLE, LM3630A_LEDA_ENABLE); + if (ret < 0) + goto out_i2c_err; +- return bl->props.brightness; ++ return 0; + + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access\n"); +@@ -277,7 +277,7 @@ static int lm3630a_bank_b_update_status(struct backlight_device *bl) + LM3630A_LEDB_ENABLE, LM3630A_LEDB_ENABLE); + if (ret < 0) + goto out_i2c_err; +- return bl->props.brightness; ++ return 0; + + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); +diff --git a/drivers/video/fbdev/chipsfb.c b/drivers/video/fbdev/chipsfb.c +index 59abdc6a97f6..314b7eceb81c 100644 +--- a/drivers/video/fbdev/chipsfb.c ++++ b/drivers/video/fbdev/chipsfb.c +@@ -350,7 +350,7 @@ static void init_chips(struct fb_info *p, unsigned long addr) + static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) + { + struct fb_info *p; +- unsigned long addr, size; ++ unsigned long addr; + unsigned short cmd; + int rc = -ENODEV; + +@@ -362,7 +362,6 @@ static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) + if ((dp->resource[0].flags & IORESOURCE_MEM) == 0) + goto err_disable; + addr = pci_resource_start(dp, 0); +- size = pci_resource_len(dp, 0); + if (addr == 0) + goto err_disable; + +diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c +index f4e59c445964..17054d695411 100644 +--- a/drivers/xen/cpu_hotplug.c ++++ b/drivers/xen/cpu_hotplug.c +@@ -53,7 +53,7 @@ static int vcpu_online(unsigned int cpu) + } + static void vcpu_hotplug(unsigned int cpu) + { +- if (!cpu_possible(cpu)) ++ if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) + return; + + switch (vcpu_online(cpu)) { +diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c +index 07573dc1614a..3469c7ce7cb6 100644 +--- a/fs/btrfs/inode-map.c ++++ b/fs/btrfs/inode-map.c +@@ -158,6 +158,7 @@ static void start_caching(struct btrfs_root *root) + spin_lock(&root->ino_cache_lock); + root->ino_cache_state = BTRFS_CACHE_FINISHED; + spin_unlock(&root->ino_cache_lock); ++ wake_up(&root->ino_cache_wait); + return; + } + +diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c +index 63108343124a..4bde8acca455 100644 +--- a/fs/cifs/connect.c ++++ b/fs/cifs/connect.c +@@ -939,6 +939,7 @@ cifs_demultiplex_thread(void *p) + mempool_resize(cifs_req_poolp, length + cifs_min_rcv); + + set_freezable(); ++ allow_kernel_signal(SIGKILL); + while (server->tcpStatus != CifsExiting) { + if (try_to_freeze()) + continue; +@@ -2246,7 +2247,7 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect) + + task = xchg(&server->tsk, NULL); + if (task) +- force_sig(SIGKILL, task); ++ send_sig(SIGKILL, task, 1); + } + + static struct TCP_Server_Info * +diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c +index 6599c6124552..01cbdd0987c0 100644 +--- a/fs/exportfs/expfs.c ++++ b/fs/exportfs/expfs.c +@@ -148,6 +148,7 @@ static struct dentry *reconnect_one(struct vfsmount *mnt, + mutex_unlock(&parent->d_inode->i_mutex); + if (IS_ERR(tmp)) { + dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); ++ err = PTR_ERR(tmp); + goto out_err; + } + if (tmp != dentry) { +diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c +index 0dcd33f62637..00f9433eea23 100644 +--- a/fs/ext4/inline.c ++++ b/fs/ext4/inline.c +@@ -1418,7 +1418,7 @@ int htree_inlinedir_to_tree(struct file *dir_file, + err = ext4_htree_store_dirent(dir_file, hinfo->hash, + hinfo->minor_hash, de, &tmp_str); + if (err) { +- count = err; ++ ret = err; + goto out; + } + count++; +diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c +index d595856453b2..de6351c1c8db 100644 +--- a/fs/jfs/jfs_txnmgr.c ++++ b/fs/jfs/jfs_txnmgr.c +@@ -1928,8 +1928,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, + * header ? + */ + if (tlck->type & tlckTRUNCATE) { +- /* This odd declaration suppresses a bogus gcc warning */ +- pxd_t pxd = pxd; /* truncated extent of xad */ ++ pxd_t pxd; /* truncated extent of xad */ + int twm; + + /* +diff --git a/fs/namei.c b/fs/namei.c +index 40049d61ef37..a4ed9c337c21 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -988,7 +988,8 @@ static int may_linkat(struct path *link) + * may_create_in_sticky - Check whether an O_CREAT open in a sticky directory + * should be allowed, or not, on files that already + * exist. +- * @dir: the sticky parent directory ++ * @dir_mode: mode bits of directory ++ * @dir_uid: owner of directory + * @inode: the inode of the file to open + * + * Block an O_CREAT open of a FIFO (or a regular file) when: +@@ -1004,18 +1005,18 @@ static int may_linkat(struct path *link) + * + * Returns 0 if the open is allowed, -ve on error. + */ +-static int may_create_in_sticky(struct dentry * const dir, ++static int may_create_in_sticky(umode_t dir_mode, kuid_t dir_uid, + struct inode * const inode) + { + if ((!sysctl_protected_fifos && S_ISFIFO(inode->i_mode)) || + (!sysctl_protected_regular && S_ISREG(inode->i_mode)) || +- likely(!(dir->d_inode->i_mode & S_ISVTX)) || +- uid_eq(inode->i_uid, dir->d_inode->i_uid) || ++ likely(!(dir_mode & S_ISVTX)) || ++ uid_eq(inode->i_uid, dir_uid) || + uid_eq(current_fsuid(), inode->i_uid)) + return 0; + +- if (likely(dir->d_inode->i_mode & 0002) || +- (dir->d_inode->i_mode & 0020 && ++ if (likely(dir_mode & 0002) || ++ (dir_mode & 0020 && + ((sysctl_protected_fifos >= 2 && S_ISFIFO(inode->i_mode)) || + (sysctl_protected_regular >= 2 && S_ISREG(inode->i_mode))))) { + return -EACCES; +@@ -3059,6 +3060,8 @@ static int do_last(struct nameidata *nd, + int *opened) + { + struct dentry *dir = nd->path.dentry; ++ kuid_t dir_uid = dir->d_inode->i_uid; ++ umode_t dir_mode = dir->d_inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +@@ -3211,7 +3214,7 @@ finish_open: + error = -EISDIR; + if (d_is_dir(nd->path.dentry)) + goto out; +- error = may_create_in_sticky(dir, ++ error = may_create_in_sticky(dir_mode, dir_uid, + d_backing_inode(nd->path.dentry)); + if (unlikely(error)) + goto out; +diff --git a/fs/nfs/super.c b/fs/nfs/super.c +index dced329a8584..47a7751146cf 100644 +--- a/fs/nfs/super.c ++++ b/fs/nfs/super.c +@@ -1901,7 +1901,7 @@ static int nfs_parse_devname(const char *dev_name, + /* kill possible hostname list: not supported */ + comma = strchr(dev_name, ','); + if (comma != NULL && comma < end) +- *comma = 0; ++ len = comma - dev_name; + } + + if (len > maxnamlen) +diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c +index 7795e0d01382..4b94db85b2a0 100644 +--- a/fs/xfs/xfs_quotaops.c ++++ b/fs/xfs/xfs_quotaops.c +@@ -214,6 +214,9 @@ xfs_fs_rm_xquota( + if (XFS_IS_QUOTA_ON(mp)) + return -EINVAL; + ++ if (uflags & ~(FS_USER_QUOTA | FS_GROUP_QUOTA | FS_PROJ_QUOTA)) ++ return -EINVAL; ++ + if (uflags & FS_USER_QUOTA) + flags |= XFS_DQ_USER; + if (uflags & FS_GROUP_QUOTA) +diff --git a/include/asm-generic/rtc.h b/include/asm-generic/rtc.h +index 4e3b6558331e..3e457ae2d571 100644 +--- a/include/asm-generic/rtc.h ++++ b/include/asm-generic/rtc.h +@@ -106,7 +106,7 @@ static inline unsigned int __get_rtc_time(struct rtc_time *time) + time->tm_year += real_year - 72; + #endif + +- if (century) ++ if (century > 20) + time->tm_year += (century - 19) * 100; + + /* +diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h +index 714ce4a5e31f..39d47af6ca7b 100644 +--- a/include/linux/bitmap.h ++++ b/include/linux/bitmap.h +@@ -83,6 +83,14 @@ + * contain all bit positions from 0 to 'bits' - 1. + */ + ++/* ++ * Allocation and deallocation of bitmap. ++ * Provided in lib/bitmap.c to avoid circular dependency. ++ */ ++extern unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags); ++extern unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags); ++extern void bitmap_free(const unsigned long *bitmap); ++ + /* + * lib/bitmap.c provides these functions: + */ +diff --git a/include/linux/device.h b/include/linux/device.h +index 834000903525..eb891c9c4b62 100644 +--- a/include/linux/device.h ++++ b/include/linux/device.h +@@ -677,7 +677,8 @@ extern unsigned long devm_get_free_pages(struct device *dev, + gfp_t gfp_mask, unsigned int order); + extern void devm_free_pages(struct device *dev, unsigned long addr); + +-void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); ++void __iomem *devm_ioremap_resource(struct device *dev, ++ const struct resource *res); + + /* allows to add/remove a custom action to devres stack */ + int devm_add_action(struct device *dev, void (*action)(void *), void *data); +diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h +index 0e1f433cc4b7..378c234ba3e4 100644 +--- a/include/linux/netfilter/ipset/ip_set.h ++++ b/include/linux/netfilter/ipset/ip_set.h +@@ -530,13 +530,6 @@ ip6addrptr(const struct sk_buff *skb, bool src, struct in6_addr *addr) + sizeof(*addr)); + } + +-/* Calculate the bytes required to store the inclusive range of a-b */ +-static inline int +-bitmap_bytes(u32 a, u32 b) +-{ +- return 4 * ((((b - a + 8) / 8) + 3) / 4); +-} +- + #include + #include + +diff --git a/include/linux/platform_data/dma-imx-sdma.h b/include/linux/platform_data/dma-imx-sdma.h +index 2d08816720f6..5bb0a119f39a 100644 +--- a/include/linux/platform_data/dma-imx-sdma.h ++++ b/include/linux/platform_data/dma-imx-sdma.h +@@ -50,7 +50,10 @@ struct sdma_script_start_addrs { + /* End of v2 array */ + s32 zcanfd_2_mcu_addr; + s32 zqspi_2_mcu_addr; ++ s32 mcu_2_ecspi_addr; + /* End of v3 array */ ++ s32 mcu_2_zqspi_addr; ++ /* End of v4 array */ + }; + + /** +diff --git a/include/linux/signal.h b/include/linux/signal.h +index bcc094cb697c..649cd9fc63ca 100644 +--- a/include/linux/signal.h ++++ b/include/linux/signal.h +@@ -313,6 +313,9 @@ extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping); + extern void exit_signals(struct task_struct *tsk); + extern void kernel_sigaction(int, __sighandler_t); + ++#define SIG_KTHREAD ((__force __sighandler_t)2) ++#define SIG_KTHREAD_KERNEL ((__force __sighandler_t)3) ++ + static inline void allow_signal(int sig) + { + /* +@@ -320,7 +323,17 @@ static inline void allow_signal(int sig) + * know it'll be handled, so that they don't get converted to + * SIGKILL or just silently dropped. + */ +- kernel_sigaction(sig, (__force __sighandler_t)2); ++ kernel_sigaction(sig, SIG_KTHREAD); ++} ++ ++static inline void allow_kernel_signal(int sig) ++{ ++ /* ++ * Kernel threads handle their own signals. Let the signal code ++ * know signals sent by the kernel will be handled, so that they ++ * don't get silently dropped. ++ */ ++ kernel_sigaction(sig, SIG_KTHREAD_KERNEL); + } + + static inline void disallow_signal(int sig) +diff --git a/include/media/davinci/vpbe.h b/include/media/davinci/vpbe.h +index 4376beeb28c2..5d8ceeddc797 100644 +--- a/include/media/davinci/vpbe.h ++++ b/include/media/davinci/vpbe.h +@@ -96,7 +96,7 @@ struct vpbe_config { + struct encoder_config_info *ext_encoders; + /* amplifier information goes here */ + struct amp_config_info *amp; +- int num_outputs; ++ unsigned int num_outputs; + /* Order is venc outputs followed by LCD and then external encoders */ + struct vpbe_output *outputs; + }; +diff --git a/include/trace/events/xen.h b/include/trace/events/xen.h +index d6be935caa50..ecd1a0f7bd3e 100644 +--- a/include/trace/events/xen.h ++++ b/include/trace/events/xen.h +@@ -63,7 +63,11 @@ TRACE_EVENT(xen_mc_callback, + TP_PROTO(xen_mc_callback_fn_t fn, void *data), + TP_ARGS(fn, data), + TP_STRUCT__entry( +- __field(xen_mc_callback_fn_t, fn) ++ /* ++ * Use field_struct to avoid is_signed_type() ++ * comparison of a function pointer. ++ */ ++ __field_struct(xen_mc_callback_fn_t, fn) + __field(void *, data) + ), + TP_fast_assign( +diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c +index ebc52c7bd8a6..cba287a5c976 100644 +--- a/kernel/debug/kdb/kdb_main.c ++++ b/kernel/debug/kdb/kdb_main.c +@@ -2632,7 +2632,7 @@ static int kdb_per_cpu(int argc, const char **argv) + diag = kdbgetularg(argv[3], &whichcpu); + if (diag) + return diag; +- if (!cpu_online(whichcpu)) { ++ if (whichcpu >= nr_cpu_ids || !cpu_online(whichcpu)) { + kdb_printf("cpu %ld is not online\n", whichcpu); + return KDB_BADCPUNUM; + } +diff --git a/kernel/signal.c b/kernel/signal.c +index 3095b2309876..7e4a4b199a11 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -79,6 +79,11 @@ static int sig_task_ignored(struct task_struct *t, int sig, bool force) + handler == SIG_DFL && !(force && sig_kernel_only(sig))) + return 1; + ++ /* Only allow kernel generated signals to this kthread */ ++ if (unlikely((t->flags & PF_KTHREAD) && ++ (handler == SIG_KTHREAD_KERNEL) && !force)) ++ return true; ++ + return sig_handler_ignored(handler, sig); + } + +diff --git a/lib/bitmap.c b/lib/bitmap.c +index 814814397cce..bdf572d09b8f 100644 +--- a/lib/bitmap.c ++++ b/lib/bitmap.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -1081,3 +1082,22 @@ void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int n + } + EXPORT_SYMBOL(bitmap_copy_le); + #endif ++ ++unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags) ++{ ++ return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long), ++ flags); ++} ++EXPORT_SYMBOL(bitmap_alloc); ++ ++unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags) ++{ ++ return bitmap_alloc(nbits, flags | __GFP_ZERO); ++} ++EXPORT_SYMBOL(bitmap_zalloc); ++ ++void bitmap_free(const unsigned long *bitmap) ++{ ++ kfree(bitmap); ++} ++EXPORT_SYMBOL(bitmap_free); +diff --git a/lib/devres.c b/lib/devres.c +index 8c85672639d3..9d18ccd00df5 100644 +--- a/lib/devres.c ++++ b/lib/devres.c +@@ -131,7 +131,8 @@ EXPORT_SYMBOL(devm_iounmap); + * if (IS_ERR(base)) + * return PTR_ERR(base); + */ +-void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) ++void __iomem *devm_ioremap_resource(struct device *dev, ++ const struct resource *res) + { + resource_size_t size; + const char *name; +diff --git a/lib/kfifo.c b/lib/kfifo.c +index 90ba1eb1df06..a94227c55551 100644 +--- a/lib/kfifo.c ++++ b/lib/kfifo.c +@@ -82,7 +82,8 @@ int __kfifo_init(struct __kfifo *fifo, void *buffer, + { + size /= esize; + +- size = roundup_pow_of_two(size); ++ if (!is_power_of_2(size)) ++ size = rounddown_pow_of_two(size); + + fifo->in = 0; + fifo->out = 0; +diff --git a/net/6lowpan/nhc.c b/net/6lowpan/nhc.c +index 7008d53e455c..e61679bf0908 100644 +--- a/net/6lowpan/nhc.c ++++ b/net/6lowpan/nhc.c +@@ -18,7 +18,7 @@ + #include "nhc.h" + + static struct rb_root rb_root = RB_ROOT; +-static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX]; ++static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX + 1]; + static DEFINE_SPINLOCK(lowpan_nhc_lock); + + static int lowpan_nhc_insert(struct lowpan_nhc *nhc) +diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c +index fd1af7cb960d..e7c170949b21 100644 +--- a/net/bridge/netfilter/ebtables.c ++++ b/net/bridge/netfilter/ebtables.c +@@ -2174,7 +2174,9 @@ static int compat_copy_entries(unsigned char *data, unsigned int size_user, + if (ret < 0) + return ret; + +- WARN_ON(size_remaining); ++ if (size_remaining) ++ return -EINVAL; ++ + return state->buf_kern_offset; + } + +diff --git a/net/core/neighbour.c b/net/core/neighbour.c +index af1ecd0e7b07..9849f1f4cf4f 100644 +--- a/net/core/neighbour.c ++++ b/net/core/neighbour.c +@@ -1837,8 +1837,8 @@ static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl, + goto nla_put_failure; + { + unsigned long now = jiffies; +- unsigned int flush_delta = now - tbl->last_flush; +- unsigned int rand_delta = now - tbl->last_rand; ++ long flush_delta = now - tbl->last_flush; ++ long rand_delta = now - tbl->last_rand; + struct neigh_hash_table *nht; + struct ndt_config ndc = { + .ndtc_key_len = tbl->key_len, +diff --git a/net/ieee802154/6lowpan/reassembly.c b/net/ieee802154/6lowpan/reassembly.c +index 6183730d38db..e728dae467c3 100644 +--- a/net/ieee802154/6lowpan/reassembly.c ++++ b/net/ieee802154/6lowpan/reassembly.c +@@ -634,7 +634,7 @@ err_sysctl: + + void lowpan_net_frag_exit(void) + { +- inet_frags_fini(&lowpan_frags); + lowpan_frags_sysctl_unregister(); + unregister_pernet_subsys(&lowpan_frags_ops); ++ inet_frags_fini(&lowpan_frags); + } +diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c +index 91ae061d46ac..e598aa14f167 100644 +--- a/net/ipv4/ip_tunnel.c ++++ b/net/ipv4/ip_tunnel.c +@@ -1151,10 +1151,8 @@ int ip_tunnel_init(struct net_device *dev) + iph->version = 4; + iph->ihl = 5; + +- if (tunnel->collect_md) { +- dev->features |= NETIF_F_NETNS_LOCAL; ++ if (tunnel->collect_md) + netif_keep_dst(dev); +- } + return 0; + } + EXPORT_SYMBOL_GPL(ip_tunnel_init); +diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c +index ec917f58d105..17e9ed2edb86 100644 +--- a/net/ipv6/reassembly.c ++++ b/net/ipv6/reassembly.c +@@ -774,8 +774,8 @@ err_protocol: + + void ipv6_frag_exit(void) + { +- inet_frags_fini(&ip6_frags); + ip6_frags_sysctl_unregister(); + unregister_pernet_subsys(&ip6_frags_ops); + inet6_del_protocol(&frag_protocol, IPPROTO_FRAGMENT); ++ inet_frags_fini(&ip6_frags); + } +diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c +index 5984cc35d508..3edffb7bf2a4 100644 +--- a/net/iucv/af_iucv.c ++++ b/net/iucv/af_iucv.c +@@ -2392,6 +2392,13 @@ out: + return err; + } + ++static void afiucv_iucv_exit(void) ++{ ++ device_unregister(af_iucv_dev); ++ driver_unregister(&af_iucv_driver); ++ pr_iucv->iucv_unregister(&af_iucv_handler, 0); ++} ++ + static int __init afiucv_init(void) + { + int err; +@@ -2425,11 +2432,18 @@ static int __init afiucv_init(void) + err = afiucv_iucv_init(); + if (err) + goto out_sock; +- } else +- register_netdevice_notifier(&afiucv_netdev_notifier); ++ } ++ ++ err = register_netdevice_notifier(&afiucv_netdev_notifier); ++ if (err) ++ goto out_notifier; ++ + dev_add_pack(&iucv_packet_type); + return 0; + ++out_notifier: ++ if (pr_iucv) ++ afiucv_iucv_exit(); + out_sock: + sock_unregister(PF_IUCV); + out_proto: +@@ -2443,12 +2457,11 @@ out: + static void __exit afiucv_exit(void) + { + if (pr_iucv) { +- device_unregister(af_iucv_dev); +- driver_unregister(&af_iucv_driver); +- pr_iucv->iucv_unregister(&af_iucv_handler, 0); ++ afiucv_iucv_exit(); + symbol_put(iucv_if); +- } else +- unregister_netdevice_notifier(&afiucv_netdev_notifier); ++ } ++ ++ unregister_netdevice_notifier(&afiucv_netdev_notifier); + dev_remove_pack(&iucv_packet_type); + sock_unregister(PF_IUCV); + proto_unregister(&iucv_proto); +diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c +index c153fc2883a8..69f1558dfcb7 100644 +--- a/net/llc/af_llc.c ++++ b/net/llc/af_llc.c +@@ -111,22 +111,26 @@ static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr) + * + * Send data via reliable llc2 connection. + * Returns 0 upon success, non-zero if action did not succeed. ++ * ++ * This function always consumes a reference to the skb. + */ + static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock) + { + struct llc_sock* llc = llc_sk(sk); +- int rc = 0; + + if (unlikely(llc_data_accept_state(llc->state) || + llc->remote_busy_flag || + llc->p_flag)) { + long timeout = sock_sndtimeo(sk, noblock); ++ int rc; + + rc = llc_ui_wait_for_busy_core(sk, timeout); ++ if (rc) { ++ kfree_skb(skb); ++ return rc; ++ } + } +- if (unlikely(!rc)) +- rc = llc_build_and_send_pkt(sk, skb); +- return rc; ++ return llc_build_and_send_pkt(sk, skb); + } + + static void llc_ui_sk_init(struct socket *sock, struct sock *sk) +@@ -896,7 +900,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name); + int flags = msg->msg_flags; + int noblock = flags & MSG_DONTWAIT; +- struct sk_buff *skb; ++ struct sk_buff *skb = NULL; + size_t size = 0; + int rc = -EINVAL, copied = 0, hdrlen; + +@@ -905,10 +909,10 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + lock_sock(sk); + if (addr) { + if (msg->msg_namelen < sizeof(*addr)) +- goto release; ++ goto out; + } else { + if (llc_ui_addr_null(&llc->addr)) +- goto release; ++ goto out; + addr = &llc->addr; + } + /* must bind connection to sap if user hasn't done it. */ +@@ -916,7 +920,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + /* bind to sap with null dev, exclusive. */ + rc = llc_ui_autobind(sock, addr); + if (rc) +- goto release; ++ goto out; + } + hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr); + size = hdrlen + len; +@@ -925,12 +929,12 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + copied = size - hdrlen; + rc = -EINVAL; + if (copied < 0) +- goto release; ++ goto out; + release_sock(sk); + skb = sock_alloc_send_skb(sk, size, noblock, &rc); + lock_sock(sk); + if (!skb) +- goto release; ++ goto out; + skb->dev = llc->dev; + skb->protocol = llc_proto_type(addr->sllc_arphrd); + skb_reserve(skb, hdrlen); +@@ -940,29 +944,31 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) { + llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + if (addr->sllc_test) { + llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + if (addr->sllc_xid) { + llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + rc = -ENOPROTOOPT; + if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua)) + goto out; + rc = llc_ui_send_data(sk, skb, noblock); ++ skb = NULL; + out: +- if (rc) { +- kfree_skb(skb); +-release: ++ kfree_skb(skb); ++ if (rc) + dprintk("%s: failed sending from %02X to %02X: %d\n", + __func__, llc->laddr.lsap, llc->daddr.lsap, rc); +- } + release_sock(sk); + return rc ? : copied; + } +diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c +index d861b74ad068..3b002ab68b29 100644 +--- a/net/llc/llc_conn.c ++++ b/net/llc/llc_conn.c +@@ -55,6 +55,8 @@ int sysctl_llc2_busy_timeout = LLC2_BUSY_TIME * HZ; + * (executing it's actions and changing state), upper layer will be + * indicated or confirmed, if needed. Returns 0 for success, 1 for + * failure. The socket lock has to be held before calling this function. ++ * ++ * This function always consumes a reference to the skb. + */ + int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + { +@@ -62,12 +64,6 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + struct llc_sock *llc = llc_sk(skb->sk); + struct llc_conn_state_ev *ev = llc_conn_ev(skb); + +- /* +- * We have to hold the skb, because llc_conn_service will kfree it in +- * the sending path and we need to look at the skb->cb, where we encode +- * llc_conn_state_ev. +- */ +- skb_get(skb); + ev->ind_prim = ev->cfm_prim = 0; + /* + * Send event to state machine +@@ -75,21 +71,12 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + rc = llc_conn_service(skb->sk, skb); + if (unlikely(rc != 0)) { + printk(KERN_ERR "%s: llc_conn_service failed\n", __func__); +- goto out_kfree_skb; +- } +- +- if (unlikely(!ev->ind_prim && !ev->cfm_prim)) { +- /* indicate or confirm not required */ +- if (!skb->next) +- goto out_kfree_skb; + goto out_skb_put; + } + +- if (unlikely(ev->ind_prim && ev->cfm_prim)) /* Paranoia */ +- skb_get(skb); +- + switch (ev->ind_prim) { + case LLC_DATA_PRIM: ++ skb_get(skb); + llc_save_primitive(sk, skb, LLC_DATA_PRIM); + if (unlikely(sock_queue_rcv_skb(sk, skb))) { + /* +@@ -106,6 +93,7 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + * skb->sk pointing to the newly created struct sock in + * llc_conn_handler. -acme + */ ++ skb_get(skb); + skb_queue_tail(&sk->sk_receive_queue, skb); + sk->sk_state_change(sk); + break; +@@ -121,7 +109,6 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + sk->sk_state_change(sk); + } + } +- kfree_skb(skb); + sock_put(sk); + break; + case LLC_RESET_PRIM: +@@ -130,14 +117,11 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + * RESET is not being notified to upper layers for now + */ + printk(KERN_INFO "%s: received a reset ind!\n", __func__); +- kfree_skb(skb); + break; + default: +- if (ev->ind_prim) { ++ if (ev->ind_prim) + printk(KERN_INFO "%s: received unknown %d prim!\n", + __func__, ev->ind_prim); +- kfree_skb(skb); +- } + /* No indication */ + break; + } +@@ -179,15 +163,12 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + printk(KERN_INFO "%s: received a reset conf!\n", __func__); + break; + default: +- if (ev->cfm_prim) { ++ if (ev->cfm_prim) + printk(KERN_INFO "%s: received unknown %d prim!\n", + __func__, ev->cfm_prim); +- break; +- } +- goto out_skb_put; /* No confirmation */ ++ /* No confirmation */ ++ break; + } +-out_kfree_skb: +- kfree_skb(skb); + out_skb_put: + kfree_skb(skb); + return rc; +diff --git a/net/llc/llc_if.c b/net/llc/llc_if.c +index 6daf391b3e84..fc4d2bd8816f 100644 +--- a/net/llc/llc_if.c ++++ b/net/llc/llc_if.c +@@ -38,6 +38,8 @@ + * closed and -EBUSY when sending data is not permitted in this state or + * LLC has send an I pdu with p bit set to 1 and is waiting for it's + * response. ++ * ++ * This function always consumes a reference to the skb. + */ + int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) + { +@@ -46,20 +48,22 @@ int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) + struct llc_sock *llc = llc_sk(sk); + + if (unlikely(llc->state == LLC_CONN_STATE_ADM)) +- goto out; ++ goto out_free; + rc = -EBUSY; + if (unlikely(llc_data_accept_state(llc->state) || /* data_conn_refuse */ + llc->p_flag)) { + llc->failed_data_req = 1; +- goto out; ++ goto out_free; + } + ev = llc_conn_ev(skb); + ev->type = LLC_CONN_EV_TYPE_PRIM; + ev->prim = LLC_DATA_PRIM; + ev->prim_type = LLC_PRIM_TYPE_REQ; + skb->dev = llc->dev; +- rc = llc_conn_state_process(sk, skb); +-out: ++ return llc_conn_state_process(sk, skb); ++ ++out_free: ++ kfree_skb(skb); + return rc; + } + +diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c +index ff3b28e7dbce..fb44f0107da1 100644 +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -546,7 +546,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) + + /* (re)Initialize group rate indexes */ + for(j = 0; j < MAX_THR_RATES; j++) +- tmp_group_tp_rate[j] = group; ++ tmp_group_tp_rate[j] = MCS_GROUP_RATES * group; + + for (i = 0; i < MCS_GROUP_RATES; i++) { + if (!(mg->supported & BIT(i))) +diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c +index 3b8e2f97d815..2b7975c4dac7 100644 +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -3040,9 +3040,18 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) + case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP): + /* process for all: mesh, mlme, ibss */ + break; ++ case cpu_to_le16(IEEE80211_STYPE_DEAUTH): ++ if (is_multicast_ether_addr(mgmt->da) && ++ !is_broadcast_ether_addr(mgmt->da)) ++ return RX_DROP_MONITOR; ++ ++ /* process only for station/IBSS */ ++ if (sdata->vif.type != NL80211_IFTYPE_STATION && ++ sdata->vif.type != NL80211_IFTYPE_ADHOC) ++ return RX_DROP_MONITOR; ++ break; + case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): + case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): +- case cpu_to_le16(IEEE80211_STYPE_DEAUTH): + case cpu_to_le16(IEEE80211_STYPE_DISASSOC): + if (is_multicast_ether_addr(mgmt->da) && + !is_broadcast_ether_addr(mgmt->da)) +diff --git a/net/netfilter/ipset/ip_set_bitmap_gen.h b/net/netfilter/ipset/ip_set_bitmap_gen.h +index adc703ccd68b..7d08a170ac27 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_gen.h ++++ b/net/netfilter/ipset/ip_set_bitmap_gen.h +@@ -81,7 +81,7 @@ mtype_flush(struct ip_set *set) + + if (set->extensions & IPSET_EXT_DESTROY) + mtype_ext_cleanup(set); +- memset(map->members, 0, map->memsize); ++ bitmap_zero(map->members, map->elements); + } + + static int +diff --git a/net/netfilter/ipset/ip_set_bitmap_ip.c b/net/netfilter/ipset/ip_set_bitmap_ip.c +index 4783efff0bde..a4c104a4977f 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_ip.c ++++ b/net/netfilter/ipset/ip_set_bitmap_ip.c +@@ -40,7 +40,7 @@ MODULE_ALIAS("ip_set_bitmap:ip"); + + /* Type structure */ + struct bitmap_ip { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -222,7 +222,7 @@ init_map_ip(struct ip_set *set, struct bitmap_ip *map, + u32 first_ip, u32 last_ip, + u32 elements, u32 hosts, u8 netmask) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_ip = first_ip; +@@ -315,7 +315,7 @@ bitmap_ip_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + if (!map) + return -ENOMEM; + +- map->memsize = bitmap_bytes(0, elements - 1); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_ip; + if (!init_map_ip(set, map, first_ip, last_ip, + elements, hosts, netmask)) { +diff --git a/net/netfilter/ipset/ip_set_bitmap_ipmac.c b/net/netfilter/ipset/ip_set_bitmap_ipmac.c +index 29dde208381d..0e961690510d 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_ipmac.c ++++ b/net/netfilter/ipset/ip_set_bitmap_ipmac.c +@@ -46,7 +46,7 @@ enum { + + /* Type structure */ + struct bitmap_ipmac { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -297,7 +297,7 @@ static bool + init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map, + u32 first_ip, u32 last_ip, u32 elements) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_ip = first_ip; +@@ -361,7 +361,7 @@ bitmap_ipmac_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + if (!map) + return -ENOMEM; + +- map->memsize = bitmap_bytes(0, elements - 1); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_ipmac; + if (!init_map_ipmac(set, map, first_ip, last_ip, elements)) { + kfree(map); +diff --git a/net/netfilter/ipset/ip_set_bitmap_port.c b/net/netfilter/ipset/ip_set_bitmap_port.c +index 7f0c733358a4..6771b362a123 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_port.c ++++ b/net/netfilter/ipset/ip_set_bitmap_port.c +@@ -34,7 +34,7 @@ MODULE_ALIAS("ip_set_bitmap:port"); + + /* Type structure */ + struct bitmap_port { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u16 first_port; /* host byte order, included in range */ + u16 last_port; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -207,7 +207,7 @@ static bool + init_map_port(struct ip_set *set, struct bitmap_port *map, + u16 first_port, u16 last_port) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(map->elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_port = first_port; +@@ -250,7 +250,7 @@ bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + return -ENOMEM; + + map->elements = elements; +- map->memsize = bitmap_bytes(0, map->elements); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_port; + if (!init_map_port(set, map, first_port, last_port)) { + kfree(map); +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c +index 8b277658905f..eac6f7eea7b5 100644 +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -1332,15 +1332,21 @@ static void packet_sock_destruct(struct sock *sk) + + static bool fanout_flow_is_huge(struct packet_sock *po, struct sk_buff *skb) + { +- u32 rxhash; ++ u32 *history = po->rollover->history; ++ u32 victim, rxhash; + int i, count = 0; + + rxhash = skb_get_hash(skb); + for (i = 0; i < ROLLOVER_HLEN; i++) +- if (po->rollover->history[i] == rxhash) ++ if (READ_ONCE(history[i]) == rxhash) + count++; + +- po->rollover->history[prandom_u32() % ROLLOVER_HLEN] = rxhash; ++ victim = prandom_u32() % ROLLOVER_HLEN; ++ ++ /* Avoid dirtying the cache line if possible */ ++ if (READ_ONCE(history[victim]) != rxhash) ++ WRITE_ONCE(history[victim], rxhash); ++ + return count > (ROLLOVER_HLEN >> 1); + } + +@@ -3309,20 +3315,29 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, + sock_recv_ts_and_drops(msg, sk, skb); + + if (msg->msg_name) { ++ int copy_len; ++ + /* If the address length field is there to be filled + * in, we fill it in now. + */ + if (sock->type == SOCK_PACKET) { + __sockaddr_check_size(sizeof(struct sockaddr_pkt)); + msg->msg_namelen = sizeof(struct sockaddr_pkt); ++ copy_len = msg->msg_namelen; + } else { + struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; + + msg->msg_namelen = sll->sll_halen + + offsetof(struct sockaddr_ll, sll_addr); ++ copy_len = msg->msg_namelen; ++ if (msg->msg_namelen < sizeof(struct sockaddr_ll)) { ++ memset(msg->msg_name + ++ offsetof(struct sockaddr_ll, sll_addr), ++ 0, sizeof(sll->sll_addr)); ++ msg->msg_namelen = sizeof(struct sockaddr_ll); ++ } + } +- memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, +- msg->msg_namelen); ++ memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, copy_len); + } + + if (pkt_sk(sk)->auxdata) { +diff --git a/net/rds/ib_stats.c b/net/rds/ib_stats.c +index d77e04473056..a88460058185 100644 +--- a/net/rds/ib_stats.c ++++ b/net/rds/ib_stats.c +@@ -42,7 +42,7 @@ DEFINE_PER_CPU_SHARED_ALIGNED(struct rds_ib_statistics, rds_ib_stats); + static const char *const rds_ib_stat_names[] = { + "ib_connect_raced", + "ib_listen_closed_stale", +- "s_ib_evt_handler_call", ++ "ib_evt_handler_call", + "ib_tasklet_call", + "ib_tx_cq_event", + "ib_tx_ring_full", +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index fbb7ebfc58c6..b0b04b3c0896 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -267,12 +267,12 @@ static int tcf_em_validate(struct tcf_proto *tp, + } + em->data = (unsigned long) v; + } ++ em->datalen = data_len; + } + } + + em->matchid = em_hdr->matchid; + em->flags = em_hdr->flags; +- em->datalen = data_len; + em->net = net; + + err = 0; +diff --git a/net/tipc/sysctl.c b/net/tipc/sysctl.c +index 1a779b1e8510..40f6d82083d7 100644 +--- a/net/tipc/sysctl.c ++++ b/net/tipc/sysctl.c +@@ -37,6 +37,8 @@ + + #include + ++static int zero; ++static int one = 1; + static struct ctl_table_header *tipc_ctl_hdr; + + static struct ctl_table tipc_table[] = { +@@ -45,14 +47,16 @@ static struct ctl_table tipc_table[] = { + .data = &sysctl_tipc_rmem, + .maxlen = sizeof(sysctl_tipc_rmem), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ .proc_handler = proc_dointvec_minmax, ++ .extra1 = &one, + }, + { + .procname = "named_timeout", + .data = &sysctl_tipc_named_timeout, + .maxlen = sizeof(sysctl_tipc_named_timeout), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ .proc_handler = proc_dointvec_minmax, ++ .extra1 = &zero, + }, + {} + }; +diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c +index f330475a87ff..f9fb8613fb28 100644 +--- a/net/x25/af_x25.c ++++ b/net/x25/af_x25.c +@@ -764,6 +764,10 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, + if (sk->sk_state == TCP_ESTABLISHED) + goto out; + ++ rc = -EALREADY; /* Do nothing if call is already in progress */ ++ if (sk->sk_state == TCP_SYN_SENT) ++ goto out; ++ + sk->sk_state = TCP_CLOSE; + sock->state = SS_UNCONNECTED; + +@@ -810,7 +814,7 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, + /* Now the loop */ + rc = -EINPROGRESS; + if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) +- goto out_put_neigh; ++ goto out; + + rc = x25_wait_for_connection_establishment(sk); + if (rc) +diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c +index 42396a74405d..7250fb38350c 100644 +--- a/scripts/recordmcount.c ++++ b/scripts/recordmcount.c +@@ -53,6 +53,10 @@ + #define R_AARCH64_ABS64 257 + #endif + ++#define R_ARM_PC24 1 ++#define R_ARM_THM_CALL 10 ++#define R_ARM_CALL 28 ++ + static int fd_map; /* File descriptor for file being modified. */ + static int mmap_failed; /* Boolean flag. */ + static char gpfx; /* prefix for global symbol name (sometimes '_') */ +@@ -372,6 +376,18 @@ is_mcounted_section_name(char const *const txtname) + #define RECORD_MCOUNT_64 + #include "recordmcount.h" + ++static int arm_is_fake_mcount(Elf32_Rel const *rp) ++{ ++ switch (ELF32_R_TYPE(w(rp->r_info))) { ++ case R_ARM_THM_CALL: ++ case R_ARM_CALL: ++ case R_ARM_PC24: ++ return 0; ++ } ++ ++ return 1; ++} ++ + /* 64-bit EM_MIPS has weird ELF64_Rela.r_info. + * http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf + * We interpret Table 29 Relocation Operation (Elf64_Rel, Elf64_Rela) [p.40] +@@ -461,6 +477,7 @@ do_file(char const *const fname) + break; + case EM_ARM: reltype = R_ARM_ABS32; + altmcount = "__gnu_mcount_nc"; ++ is_fake_mcount32 = arm_is_fake_mcount; + break; + case EM_AARCH64: + reltype = R_AARCH64_ABS64; +diff --git a/sound/aoa/codecs/onyx.c b/sound/aoa/codecs/onyx.c +index a04edff8b729..ae50d59fb810 100644 +--- a/sound/aoa/codecs/onyx.c ++++ b/sound/aoa/codecs/onyx.c +@@ -74,8 +74,10 @@ static int onyx_read_register(struct onyx *onyx, u8 reg, u8 *value) + return 0; + } + v = i2c_smbus_read_byte_data(onyx->i2c, reg); +- if (v < 0) ++ if (v < 0) { ++ *value = 0; + return -1; ++ } + *value = (u8)v; + onyx->cache[ONYX_REG_CONTROL-FIRSTREGISTER] = *value; + return 0; +diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h +index 55ec4470f6b6..499873d29cc1 100644 +--- a/sound/pci/hda/hda_controller.h ++++ b/sound/pci/hda/hda_controller.h +@@ -164,11 +164,10 @@ struct azx { + #define azx_bus(chip) (&(chip)->bus.core) + #define bus_to_azx(_bus) container_of(_bus, struct azx, bus.core) + +-#ifdef CONFIG_X86 +-#define azx_snoop(chip) ((chip)->snoop) +-#else +-#define azx_snoop(chip) true +-#endif ++static inline bool azx_snoop(struct azx *chip) ++{ ++ return !IS_ENABLED(CONFIG_X86) || chip->snoop; ++} + + /* + * macros for easy use +diff --git a/sound/soc/codecs/cs4349.c b/sound/soc/codecs/cs4349.c +index 0ac8fc5ed4ae..9ebd500ecf38 100644 +--- a/sound/soc/codecs/cs4349.c ++++ b/sound/soc/codecs/cs4349.c +@@ -379,6 +379,7 @@ static struct i2c_driver cs4349_i2c_driver = { + .driver = { + .name = "cs4349", + .of_match_table = cs4349_of_match, ++ .pm = &cs4349_runtime_pm, + }, + .id_table = cs4349_i2c_id, + .probe = cs4349_i2c_probe, +diff --git a/sound/soc/codecs/es8328.c b/sound/soc/codecs/es8328.c +index afa6c5db9dcc..2bf30d0eb82f 100644 +--- a/sound/soc/codecs/es8328.c ++++ b/sound/soc/codecs/es8328.c +@@ -210,7 +210,7 @@ static const struct soc_enum es8328_rline_enum = + ARRAY_SIZE(es8328_line_texts), + es8328_line_texts); + static const struct snd_kcontrol_new es8328_right_line_controls = +- SOC_DAPM_ENUM("Route", es8328_lline_enum); ++ SOC_DAPM_ENUM("Route", es8328_rline_enum); + + /* Left Mixer */ + static const struct snd_kcontrol_new es8328_left_mixer_controls[] = { +diff --git a/sound/soc/codecs/wm8737.c b/sound/soc/codecs/wm8737.c +index e7807601e675..ae69cb790ac3 100644 +--- a/sound/soc/codecs/wm8737.c ++++ b/sound/soc/codecs/wm8737.c +@@ -170,7 +170,7 @@ SOC_DOUBLE("Polarity Invert Switch", WM8737_ADC_CONTROL, 5, 6, 1, 0), + SOC_SINGLE("3D Switch", WM8737_3D_ENHANCE, 0, 1, 0), + SOC_SINGLE("3D Depth", WM8737_3D_ENHANCE, 1, 15, 0), + SOC_ENUM("3D Low Cut-off", low_3d), +-SOC_ENUM("3D High Cut-off", low_3d), ++SOC_ENUM("3D High Cut-off", high_3d), + SOC_SINGLE_TLV("3D ADC Volume", WM8737_3D_ENHANCE, 7, 1, 1, adc_tlv), + + SOC_SINGLE("Noise Gate Switch", WM8737_NOISE_GATE, 0, 1, 0), +diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c +index 2f7be6cee98e..fc0a73227b02 100644 +--- a/sound/soc/davinci/davinci-mcasp.c ++++ b/sound/soc/davinci/davinci-mcasp.c +@@ -875,14 +875,13 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream, + active_slots = hweight32(mcasp->tdm_mask[stream]); + active_serializers = (channels + active_slots - 1) / + active_slots; +- if (active_serializers == 1) { ++ if (active_serializers == 1) + active_slots = channels; +- for (i = 0; i < total_slots; i++) { +- if ((1 << i) & mcasp->tdm_mask[stream]) { +- mask |= (1 << i); +- if (--active_slots <= 0) +- break; +- } ++ for (i = 0; i < total_slots; i++) { ++ if ((1 << i) & mcasp->tdm_mask[stream]) { ++ mask |= (1 << i); ++ if (--active_slots <= 0) ++ break; + } + } + } else { +diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c +index 8e525f7ac08d..3d99a8579c99 100644 +--- a/sound/soc/fsl/imx-sgtl5000.c ++++ b/sound/soc/fsl/imx-sgtl5000.c +@@ -119,7 +119,8 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) + codec_dev = of_find_i2c_device_by_node(codec_np); + if (!codec_dev) { + dev_err(&pdev->dev, "failed to find codec platform device\n"); +- return -EPROBE_DEFER; ++ ret = -EPROBE_DEFER; ++ goto fail; + } + + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); +diff --git a/sound/soc/qcom/apq8016_sbc.c b/sound/soc/qcom/apq8016_sbc.c +index 1efdf0088ecd..886f2027e671 100644 +--- a/sound/soc/qcom/apq8016_sbc.c ++++ b/sound/soc/qcom/apq8016_sbc.c +@@ -98,13 +98,15 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + + if (!cpu || !codec) { + dev_err(dev, "Can't find cpu/codec DT node\n"); +- return ERR_PTR(-EINVAL); ++ ret = -EINVAL; ++ goto error; + } + + link->cpu_of_node = of_parse_phandle(cpu, "sound-dai", 0); + if (!link->cpu_of_node) { + dev_err(card->dev, "error getting cpu phandle\n"); +- return ERR_PTR(-EINVAL); ++ ret = -EINVAL; ++ goto error; + } + + link->codec_of_node = of_parse_phandle(codec, "sound-dai", 0); +@@ -116,13 +118,13 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name); + if (ret) { + dev_err(card->dev, "error getting cpu dai name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + ret = snd_soc_of_get_dai_name(codec, &link->codec_dai_name); + if (ret) { + dev_err(card->dev, "error getting codec dai name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + link->platform_of_node = link->cpu_of_node; +@@ -132,15 +134,24 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + ret = of_property_read_string(np, "link-name", &link->name); + if (ret) { + dev_err(card->dev, "error getting codec dai_link name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + link->stream_name = link->name; + link->init = apq8016_sbc_dai_init; + link++; ++ ++ of_node_put(cpu); ++ of_node_put(codec); + } + + return data; ++ ++ error: ++ of_node_put(np); ++ of_node_put(cpu); ++ of_node_put(codec); ++ return ERR_PTR(ret); + } + + static int apq8016_sbc_platform_probe(struct platform_device *pdev) +diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c +index 78813057167d..dbdea1975f90 100644 +--- a/sound/soc/soc-pcm.c ++++ b/sound/soc/soc-pcm.c +@@ -48,8 +48,8 @@ static bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream) + else + codec_stream = &dai->driver->capture; + +- /* If the codec specifies any rate at all, it supports the stream. */ +- return codec_stream->rates; ++ /* If the codec specifies any channels at all, it supports the stream */ ++ return codec_stream->channels_min; + } + + /** +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 1b81f18010d2..73149b9be29c 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -2552,7 +2552,9 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, + (err = snd_usb_mixer_status_create(mixer)) < 0) + goto _error; + +- snd_usb_mixer_apply_create_quirk(mixer); ++ err = snd_usb_mixer_apply_create_quirk(mixer); ++ if (err < 0) ++ goto _error; + + err = snd_device_new(chip->card, SNDRV_DEV_CODEC, mixer, &dev_ops); + if (err < 0) +diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h +index d32727c74a16..c892b4d1e733 100644 +--- a/sound/usb/quirks-table.h ++++ b/sound/usb/quirks-table.h +@@ -3293,19 +3293,14 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), + .ifnum = 0, + .type = QUIRK_AUDIO_STANDARD_MIXER, + }, +- /* Capture */ +- { +- .ifnum = 1, +- .type = QUIRK_IGNORE_INTERFACE, +- }, + /* Playback */ + { +- .ifnum = 2, ++ .ifnum = 1, + .type = QUIRK_AUDIO_FIXED_ENDPOINT, + .data = &(const struct audioformat) { + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels = 2, +- .iface = 2, ++ .iface = 1, + .altsetting = 1, + .altset_idx = 1, + .attributes = UAC_EP_CS_ATTR_FILL_MAX | diff --git a/patch/kernel/rk3399-legacy/patch-4.4.212-213.patch b/patch/kernel/rk3399-legacy/patch-4.4.212-213.patch new file mode 100644 index 0000000000..dbc3c940e8 --- /dev/null +++ b/patch/kernel/rk3399-legacy/patch-4.4.212-213.patch @@ -0,0 +1,1559 @@ +diff --git a/Makefile b/Makefile +index 379f2a525c02..6e86896525d9 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 4 + PATCHLEVEL = 4 +-SUBLEVEL = 212 ++SUBLEVEL = 213 + EXTRAVERSION = + NAME = Blurry Fish Butt + +diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile +index abcbba2f01ba..a29f640de983 100644 +--- a/arch/arm64/boot/Makefile ++++ b/arch/arm64/boot/Makefile +@@ -14,7 +14,7 @@ + # Based on the ia64 boot/Makefile. + # + +-targets := Image Image.gz ++targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo + + $(obj)/Image: vmlinux FORCE + $(call if_changed,objcopy) +diff --git a/crypto/af_alg.c b/crypto/af_alg.c +index b5953f1d1a18..cf3975ee4fd8 100644 +--- a/crypto/af_alg.c ++++ b/crypto/af_alg.c +@@ -136,11 +136,13 @@ void af_alg_release_parent(struct sock *sk) + sk = ask->parent; + ask = alg_sk(sk); + +- lock_sock(sk); ++ local_bh_disable(); ++ bh_lock_sock(sk); + ask->nokey_refcnt -= nokey; + if (!last) + last = !--ask->refcnt; +- release_sock(sk); ++ bh_unlock_sock(sk); ++ local_bh_enable(); + + if (last) + sock_put(sk); +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index a5718c0a3dc4..1348541da463 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -505,11 +505,12 @@ err: + + static void __exit pcrypt_exit(void) + { ++ crypto_unregister_template(&pcrypt_tmpl); ++ + pcrypt_fini_padata(&pencrypt); + pcrypt_fini_padata(&pdecrypt); + + kset_unregister(pcrypt_kset); +- crypto_unregister_template(&pcrypt_tmpl); + } + + module_init(pcrypt_init); +diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c +index 6339efd32697..ad591a2f7c82 100644 +--- a/drivers/atm/eni.c ++++ b/drivers/atm/eni.c +@@ -372,7 +372,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + here = (eni_vcc->descr+skip) & (eni_vcc->words-1); + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci + << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1); + if (!eff) size += skip; +@@ -445,7 +445,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + if (size != eff) { + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | + (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + if (!j || j > 2*RX_DMA_BUF) { + printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n"); +diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c +index a15ce4ef39cd..e265bace57d7 100644 +--- a/drivers/char/ttyprintk.c ++++ b/drivers/char/ttyprintk.c +@@ -18,10 +18,11 @@ + #include + #include + #include ++#include + + struct ttyprintk_port { + struct tty_port port; +- struct mutex port_write_mutex; ++ spinlock_t spinlock; + }; + + static struct ttyprintk_port tpk_port; +@@ -107,11 +108,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp) + static void tpk_close(struct tty_struct *tty, struct file *filp) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + /* flush tpk_printk buffer */ + tpk_printk(NULL, 0); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + tty_port_close(&tpkp->port, tty, filp); + } +@@ -123,13 +125,14 @@ static int tpk_write(struct tty_struct *tty, + const unsigned char *buf, int count) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + int ret; + + + /* exclusive use of tpk_printk within this tty */ +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + ret = tpk_printk(buf, count); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + return ret; + } +@@ -179,7 +182,7 @@ static int __init ttyprintk_init(void) + { + int ret = -ENOMEM; + +- mutex_init(&tpk_port.port_write_mutex); ++ spin_lock_init(&tpk_port.spinlock); + + ttyprintk_driver = tty_alloc_driver(1, + TTY_DRIVER_RESET_TERMIOS | +diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c +index 8b45cb2caed1..60db6531996e 100644 +--- a/drivers/clk/mmp/clk-of-mmp2.c ++++ b/drivers/clk/mmp/clk-of-mmp2.c +@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock); + static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; + + static DEFINE_SPINLOCK(timer_lock); +-static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"}; ++static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; + + static DEFINE_SPINLOCK(reset_lock); + +diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c b/drivers/media/radio/si470x/radio-si470x-i2c.c +index f9e1768b8d31..0836fa442d22 100644 +--- a/drivers/media/radio/si470x/radio-si470x-i2c.c ++++ b/drivers/media/radio/si470x/radio-si470x-i2c.c +@@ -458,10 +458,10 @@ static int si470x_i2c_remove(struct i2c_client *client) + + free_irq(client->irq, radio); + video_unregister_device(&radio->videodev); +- kfree(radio); + + v4l2_ctrl_handler_free(&radio->hdl); + v4l2_device_unregister(&radio->v4l2_dev); ++ kfree(radio); + return 0; + } + +diff --git a/drivers/media/usb/dvb-usb/digitv.c b/drivers/media/usb/dvb-usb/digitv.c +index 772bde3c5020..4a817363a33b 100644 +--- a/drivers/media/usb/dvb-usb/digitv.c ++++ b/drivers/media/usb/dvb-usb/digitv.c +@@ -226,18 +226,22 @@ static struct rc_map_table rc_map_digitv_table[] = { + + static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + { +- int i; ++ int ret, i; + u8 key[5]; + u8 b[4] = { 0 }; + + *event = 0; + *state = REMOTE_NO_KEY_PRESSED; + +- digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4); ++ ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4); ++ if (ret) ++ return ret; + + /* Tell the device we've read the remote. Not sure how necessary + this is, but the Nebula SDK does it. */ +- digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0); ++ ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0); ++ if (ret) ++ return ret; + + /* if something is inside the buffer, simulate key press */ + if (key[1] != 0) +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-urb.c b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +index 5c8f651344fc..c98a01d36260 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-urb.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +@@ -11,7 +11,7 @@ + int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, + u16 rlen, int delay_ms) + { +- int actlen,ret = -ENOMEM; ++ int actlen = 0, ret = -ENOMEM; + + if (!d || wbuf == NULL || wlen == 0) + return -EINVAL; +diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c +index af5cd8213e8b..3733c15c753e 100644 +--- a/drivers/media/usb/gspca/gspca.c ++++ b/drivers/media/usb/gspca/gspca.c +@@ -2028,7 +2028,7 @@ int gspca_dev_probe2(struct usb_interface *intf, + pr_err("couldn't kzalloc gspca struct\n"); + return -ENOMEM; + } +- gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); ++ gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL); + if (!gspca_dev->usb_buf) { + pr_err("out of memory\n"); + ret = -ENOMEM; +diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c +index a3b1c07ae0af..e7214edfe5b4 100644 +--- a/drivers/net/ethernet/broadcom/b44.c ++++ b/drivers/net/ethernet/broadcom/b44.c +@@ -1524,8 +1524,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + int ethaddr_bytes = ETH_ALEN; + + memset(ppattern + offset, 0xff, magicsync); +- for (j = 0; j < magicsync; j++) +- set_bit(len++, (unsigned long *) pmask); ++ for (j = 0; j < magicsync; j++) { ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; ++ } + + for (j = 0; j < B44_MAX_PATTERNS; j++) { + if ((B44_PATTERN_SIZE - len) >= ETH_ALEN) +@@ -1537,7 +1539,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + for (k = 0; k< ethaddr_bytes; k++) { + ppattern[offset + magicsync + + (j * ETH_ALEN) + k] = macaddr[k]; +- set_bit(len++, (unsigned long *) pmask); ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; + } + } + return len - 1; +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +index 129d6095749a..54d5e53e94af 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +@@ -66,8 +66,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos) + static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = seq_tab_get_idx(seq->private, *pos + 1); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +index ac27898c6ab0..e7bdaad6ed0f 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +@@ -604,8 +604,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos) + static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = l2t_get_idx(seq, *pos); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c b/drivers/net/ethernet/freescale/xgmac_mdio.c +index 7b8fe866f603..a15b4a97c172 100644 +--- a/drivers/net/ethernet/freescale/xgmac_mdio.c ++++ b/drivers/net/ethernet/freescale/xgmac_mdio.c +@@ -49,6 +49,7 @@ struct tgec_mdio_controller { + struct mdio_fsl_priv { + struct tgec_mdio_controller __iomem *mdio_base; + bool is_little_endian; ++ bool has_a011043; + }; + + static u32 xgmac_read32(void __iomem *regs, +@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) + return ret; + + /* Return all Fs if nothing was there */ +- if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) { ++ if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && ++ !priv->has_a011043) { + dev_err(&bus->dev, + "Error while reading PHY%d reg at %d.%hhu\n", + phy_id, dev_addr, regnum); +@@ -277,6 +279,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) + else + priv->is_little_endian = false; + ++ priv->has_a011043 = of_property_read_bool(pdev->dev.of_node, ++ "fsl,erratum-a011043"); ++ + ret = of_mdiobus_register(bus, np); + if (ret) { + dev_err(&pdev->dev, "cannot register MDIO bus\n"); +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +index 4521181aa0ed..23fb344f9e1c 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +@@ -4532,7 +4532,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + struct ixgbe_hw *hw = &adapter->hw; + struct hlist_node *node2; + struct ixgbe_fdir_filter *filter; +- u64 action; ++ u8 queue; + + spin_lock(&adapter->fdir_perfect_lock); + +@@ -4541,17 +4541,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + + hlist_for_each_entry_safe(filter, node2, + &adapter->fdir_filter_list, fdir_node) { +- action = filter->action; +- if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) +- action = +- (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; ++ if (filter->action == IXGBE_FDIR_DROP_QUEUE) { ++ queue = IXGBE_FDIR_DROP_QUEUE; ++ } else { ++ u32 ring = ethtool_get_flow_spec_ring(filter->action); ++ u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); ++ ++ if (!vf && (ring >= adapter->num_rx_queues)) { ++ e_err(drv, "FDIR restore failed without VF, ring: %u\n", ++ ring); ++ continue; ++ } else if (vf && ++ ((vf > adapter->num_vfs) || ++ ring >= adapter->num_rx_queues_per_pool)) { ++ e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", ++ vf, ring); ++ continue; ++ } ++ ++ /* Map the ring onto the absolute queue index */ ++ if (!vf) ++ queue = adapter->rx_ring[ring]->reg_idx; ++ else ++ queue = ((vf - 1) * ++ adapter->num_rx_queues_per_pool) + ring; ++ } + + ixgbe_fdir_write_perfect_filter_82599(hw, +- &filter->filter, +- filter->sw_idx, +- (action == IXGBE_FDIR_DROP_QUEUE) ? +- IXGBE_FDIR_DROP_QUEUE : +- adapter->rx_ring[action]->reg_idx); ++ &filter->filter, filter->sw_idx, queue); + } + + spin_unlock(&adapter->fdir_perfect_lock); +diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +index 723bda33472a..0fa94ebf0411 100644 +--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c ++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +@@ -1861,11 +1861,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev) + struct ixgbe_hw *hw = &adapter->hw; + int count = 0; + +- if ((netdev_uc_count(netdev)) > 10) { +- pr_err("Too many unicast filters - No Space\n"); +- return -ENOSPC; +- } +- + if (!netdev_uc_empty(netdev)) { + struct netdev_hw_addr *ha; + +diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c +index 667900578249..712be59251f5 100644 +--- a/drivers/net/ethernet/natsemi/sonic.c ++++ b/drivers/net/ethernet/natsemi/sonic.c +@@ -50,6 +50,8 @@ static int sonic_open(struct net_device *dev) + if (sonic_debug > 2) + printk("sonic_open: initializing sonic driver.\n"); + ++ spin_lock_init(&lp->lock); ++ + for (i = 0; i < SONIC_NUM_RRS; i++) { + struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (skb == NULL) { +@@ -101,6 +103,24 @@ static int sonic_open(struct net_device *dev) + return 0; + } + ++/* Wait for the SONIC to become idle. */ ++static void sonic_quiesce(struct net_device *dev, u16 mask) ++{ ++ struct sonic_local * __maybe_unused lp = netdev_priv(dev); ++ int i; ++ u16 bits; ++ ++ for (i = 0; i < 1000; ++i) { ++ bits = SONIC_READ(SONIC_CMD) & mask; ++ if (!bits) ++ return; ++ if (irqs_disabled() || in_interrupt()) ++ udelay(20); ++ else ++ usleep_range(100, 200); ++ } ++ WARN_ONCE(1, "command deadline expired! 0x%04x\n", bits); ++} + + /* + * Close the SONIC device +@@ -118,6 +138,9 @@ static int sonic_close(struct net_device *dev) + /* + * stop the SONIC, disable interrupts + */ ++ SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); ++ + SONIC_WRITE(SONIC_IMR, 0); + SONIC_WRITE(SONIC_ISR, 0x7fff); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); +@@ -157,6 +180,9 @@ static void sonic_tx_timeout(struct net_device *dev) + * put the Sonic into software-reset mode and + * disable all interrupts before releasing DMA buffers + */ ++ SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); ++ + SONIC_WRITE(SONIC_IMR, 0); + SONIC_WRITE(SONIC_ISR, 0x7fff); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); +@@ -194,8 +220,6 @@ static void sonic_tx_timeout(struct net_device *dev) + * wake the tx queue + * Concurrently with all of this, the SONIC is potentially writing to + * the status flags of the TDs. +- * Until some mutual exclusion is added, this code will not work with SMP. However, +- * MIPS Jazz machines and m68k Macs were all uni-processor machines. + */ + + static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) +@@ -203,7 +227,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + struct sonic_local *lp = netdev_priv(dev); + dma_addr_t laddr; + int length; +- int entry = lp->next_tx; ++ int entry; ++ unsigned long flags; + + if (sonic_debug > 2) + printk("sonic_send_packet: skb=%p, dev=%p\n", skb, dev); +@@ -226,6 +251,10 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + return NETDEV_TX_OK; + } + ++ spin_lock_irqsave(&lp->lock, flags); ++ ++ entry = lp->next_tx; ++ + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ + sonic_tda_put(dev, entry, SONIC_TD_FRAG_COUNT, 1); /* single fragment */ + sonic_tda_put(dev, entry, SONIC_TD_PKTSIZE, length); /* length of packet */ +@@ -235,10 +264,6 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + sonic_tda_put(dev, entry, SONIC_TD_LINK, + sonic_tda_get(dev, entry, SONIC_TD_LINK) | SONIC_EOL); + +- /* +- * Must set tx_skb[entry] only after clearing status, and +- * before clearing EOL and before stopping queue +- */ + wmb(); + lp->tx_len[entry] = length; + lp->tx_laddr[entry] = laddr; +@@ -263,6 +288,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + + SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP); + ++ spin_unlock_irqrestore(&lp->lock, flags); ++ + return NETDEV_TX_OK; + } + +@@ -275,9 +302,21 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + struct net_device *dev = dev_id; + struct sonic_local *lp = netdev_priv(dev); + int status; ++ unsigned long flags; ++ ++ /* The lock has two purposes. Firstly, it synchronizes sonic_interrupt() ++ * with sonic_send_packet() so that the two functions can share state. ++ * Secondly, it makes sonic_interrupt() re-entrant, as that is required ++ * by macsonic which must use two IRQs with different priority levels. ++ */ ++ spin_lock_irqsave(&lp->lock, flags); ++ ++ status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; ++ if (!status) { ++ spin_unlock_irqrestore(&lp->lock, flags); + +- if (!(status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)) + return IRQ_NONE; ++ } + + do { + if (status & SONIC_INT_PKTRX) { +@@ -292,11 +331,12 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + int td_status; + int freed_some = 0; + +- /* At this point, cur_tx is the index of a TD that is one of: +- * unallocated/freed (status set & tx_skb[entry] clear) +- * allocated and sent (status set & tx_skb[entry] set ) +- * allocated and not yet sent (status clear & tx_skb[entry] set ) +- * still being allocated by sonic_send_packet (status clear & tx_skb[entry] clear) ++ /* The state of a Transmit Descriptor may be inferred ++ * from { tx_skb[entry], td_status } as follows. ++ * { clear, clear } => the TD has never been used ++ * { set, clear } => the TD was handed to SONIC ++ * { set, set } => the TD was handed back ++ * { clear, set } => the TD is available for re-use + */ + + if (sonic_debug > 2) +@@ -398,10 +438,30 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + /* load CAM done */ + if (status & SONIC_INT_LCD) + SONIC_WRITE(SONIC_ISR, SONIC_INT_LCD); /* clear the interrupt */ +- } while((status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)); ++ ++ status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; ++ } while (status); ++ ++ spin_unlock_irqrestore(&lp->lock, flags); ++ + return IRQ_HANDLED; + } + ++/* Return the array index corresponding to a given Receive Buffer pointer. */ ++static int index_from_addr(struct sonic_local *lp, dma_addr_t addr, ++ unsigned int last) ++{ ++ unsigned int i = last; ++ ++ do { ++ i = (i + 1) & SONIC_RRS_MASK; ++ if (addr == lp->rx_laddr[i]) ++ return i; ++ } while (i != last); ++ ++ return -ENOENT; ++} ++ + /* + * We have a good packet(s), pass it/them up the network stack. + */ +@@ -421,6 +481,16 @@ static void sonic_rx(struct net_device *dev) + + status = sonic_rda_get(dev, entry, SONIC_RD_STATUS); + if (status & SONIC_RCR_PRX) { ++ u32 addr = (sonic_rda_get(dev, entry, ++ SONIC_RD_PKTPTR_H) << 16) | ++ sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L); ++ int i = index_from_addr(lp, addr, entry); ++ ++ if (i < 0) { ++ WARN_ONCE(1, "failed to find buffer!\n"); ++ break; ++ } ++ + /* Malloc up new buffer. */ + new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (new_skb == NULL) { +@@ -442,7 +512,7 @@ static void sonic_rx(struct net_device *dev) + + /* now we have a new skb to replace it, pass the used one up the stack */ + dma_unmap_single(lp->device, lp->rx_laddr[entry], SONIC_RBSIZE, DMA_FROM_DEVICE); +- used_skb = lp->rx_skb[entry]; ++ used_skb = lp->rx_skb[i]; + pkt_len = sonic_rda_get(dev, entry, SONIC_RD_PKTLEN); + skb_trim(used_skb, pkt_len); + used_skb->protocol = eth_type_trans(used_skb, dev); +@@ -451,13 +521,13 @@ static void sonic_rx(struct net_device *dev) + lp->stats.rx_bytes += pkt_len; + + /* and insert the new skb */ +- lp->rx_laddr[entry] = new_laddr; +- lp->rx_skb[entry] = new_skb; ++ lp->rx_laddr[i] = new_laddr; ++ lp->rx_skb[i] = new_skb; + + bufadr_l = (unsigned long)new_laddr & 0xffff; + bufadr_h = (unsigned long)new_laddr >> 16; +- sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, bufadr_l); +- sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, bufadr_h); ++ sonic_rra_put(dev, i, SONIC_RR_BUFADR_L, bufadr_l); ++ sonic_rra_put(dev, i, SONIC_RR_BUFADR_H, bufadr_h); + } else { + /* This should only happen, if we enable accepting broken packets. */ + lp->stats.rx_errors++; +@@ -592,6 +662,7 @@ static int sonic_init(struct net_device *dev) + */ + SONIC_WRITE(SONIC_CMD, 0); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); + + /* + * initialize the receive resource area +diff --git a/drivers/net/ethernet/natsemi/sonic.h b/drivers/net/ethernet/natsemi/sonic.h +index 07091dd27e5d..7dcf913d7395 100644 +--- a/drivers/net/ethernet/natsemi/sonic.h ++++ b/drivers/net/ethernet/natsemi/sonic.h +@@ -109,6 +109,9 @@ + #define SONIC_CR_TXP 0x0002 + #define SONIC_CR_HTX 0x0001 + ++#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \ ++ SONIC_CR_RXEN | SONIC_CR_TXP) ++ + /* + * SONIC data configuration bits + */ +@@ -273,8 +276,9 @@ + #define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */ + #define SONIC_NUM_TDS 16 /* number of transmit descriptors */ + +-#define SONIC_RDS_MASK (SONIC_NUM_RDS-1) +-#define SONIC_TDS_MASK (SONIC_NUM_TDS-1) ++#define SONIC_RRS_MASK (SONIC_NUM_RRS - 1) ++#define SONIC_RDS_MASK (SONIC_NUM_RDS - 1) ++#define SONIC_TDS_MASK (SONIC_NUM_TDS - 1) + + #define SONIC_RBSIZE 1520 /* size of one resource buffer */ + +@@ -320,6 +324,7 @@ struct sonic_local { + unsigned int next_tx; /* next free TD */ + struct device *device; /* generic device */ + struct net_device_stats stats; ++ spinlock_t lock; + }; + + #define TX_TIMEOUT (3 * HZ) +@@ -341,30 +346,30 @@ static void sonic_tx_timeout(struct net_device *dev); + as far as we can tell. */ + /* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put() + is a much better name. */ +-static inline void sonic_buf_put(void* base, int bitmode, ++static inline void sonic_buf_put(u16 *base, int bitmode, + int offset, __u16 val) + { + if (bitmode) + #ifdef __BIG_ENDIAN +- ((__u16 *) base + (offset*2))[1] = val; ++ __raw_writew(val, base + (offset * 2) + 1); + #else +- ((__u16 *) base + (offset*2))[0] = val; ++ __raw_writew(val, base + (offset * 2) + 0); + #endif + else +- ((__u16 *) base)[offset] = val; ++ __raw_writew(val, base + (offset * 1) + 0); + } + +-static inline __u16 sonic_buf_get(void* base, int bitmode, ++static inline __u16 sonic_buf_get(u16 *base, int bitmode, + int offset) + { + if (bitmode) + #ifdef __BIG_ENDIAN +- return ((volatile __u16 *) base + (offset*2))[1]; ++ return __raw_readw(base + (offset * 2) + 1); + #else +- return ((volatile __u16 *) base + (offset*2))[0]; ++ return __raw_readw(base + (offset * 2) + 0); + #endif + else +- return ((volatile __u16 *) base)[offset]; ++ return __raw_readw(base + (offset * 1) + 0); + } + + /* Inlines that you should actually use for reading/writing DMA buffers */ +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +index bf892160dd5f..26263a192a77 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +@@ -2047,6 +2047,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, + break; + } + entry += p_hdr->size; ++ cond_resched(); + } + p_dev->ahw->reset.seq_index = index; + } +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +index cda9e604a95f..e5ea8e972b91 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, + addr += 16; + reg_read -= 16; + ret += 16; ++ cond_resched(); + } + out: + mutex_unlock(&adapter->ahw->mem_lock); +@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) + buf_offset += entry->hdr.cap_size; + entry_offset += entry->hdr.offset; + buffer = fw_dump->data + buf_offset; ++ cond_resched(); + } + + fw_dump->clr = 1; +diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c +index db8b489b0513..23e299c86b81 100644 +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -4313,6 +4313,11 @@ static int rtl8152_probe(struct usb_interface *intf, + + intf->needs_remote_wakeup = 1; + ++ if (!rtl_can_wakeup(tp)) ++ __rtl_set_wol(tp, 0); ++ else ++ tp->saved_wolopts = __rtl_get_wol(tp); ++ + tp->rtl_ops.init(tp); + set_ethernet_addr(tp); + +@@ -4325,10 +4330,6 @@ static int rtl8152_probe(struct usb_interface *intf, + goto out1; + } + +- if (!rtl_can_wakeup(tp)) +- __rtl_set_wol(tp, 0); +- +- tp->saved_wolopts = __rtl_get_wol(tp); + if (tp->saved_wolopts) + device_set_wakeup_enable(&udev->dev, true); + else +diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c +index 421ac5f85699..79fd89150947 100644 +--- a/drivers/net/wan/sdla.c ++++ b/drivers/net/wan/sdla.c +@@ -711,7 +711,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, + + spin_lock_irqsave(&sdla_lock, flags); + SDLA_WINDOW(dev, addr); +- pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK)); ++ pbuf = (void *)(dev->mem_start + (addr & SDLA_ADDR_MASK)); + __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len); + SDLA_WINDOW(dev, addr); + pbuf->opp_flag = 1; +diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c +index 82d24f2b9c19..a44496d8423a 100644 +--- a/drivers/net/wireless/airo.c ++++ b/drivers/net/wireless/airo.c +@@ -7808,16 +7808,8 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { + case AIROGVLIST: ridcode = RID_APLIST; break; + case AIROGDRVNAM: ridcode = RID_DRVNAME; break; + case AIROGEHTENC: ridcode = RID_ETHERENCAP; break; +- case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; +- /* Only super-user can read WEP keys */ +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- break; +- case AIROGWEPKNV: ridcode = RID_WEP_PERM; +- /* Only super-user can read WEP keys */ +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- break; ++ case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; break; ++ case AIROGWEPKNV: ridcode = RID_WEP_PERM; break; + case AIROGSTAT: ridcode = RID_STATUS; break; + case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; + case AIROGSTATSC32: ridcode = RID_STATS; break; +@@ -7831,7 +7823,13 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { + return -EINVAL; + } + +- if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL) ++ if (ridcode == RID_WEP_TEMP || ridcode == RID_WEP_PERM) { ++ /* Only super-user can read WEP keys */ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ } ++ ++ if ((iobuf = kzalloc(RIDSIZE, GFP_KERNEL)) == NULL) + return -ENOMEM; + + PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1); +diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c +index c92564b3ec85..1f019df15a67 100644 +--- a/drivers/net/wireless/ath/ath9k/hif_usb.c ++++ b/drivers/net/wireless/ath/ath9k/hif_usb.c +@@ -1211,7 +1211,7 @@ err_fw: + static int send_eject_command(struct usb_interface *interface) + { + struct usb_device *udev = interface_to_usbdev(interface); +- struct usb_host_interface *iface_desc = &interface->altsetting[0]; ++ struct usb_host_interface *iface_desc = interface->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c +index 3002268e57f3..b9bfa592bcab 100644 +--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c +@@ -1352,7 +1352,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + goto fail; + } + +- desc = &intf->altsetting[0].desc; ++ desc = &intf->cur_altsetting->desc; + if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || + (desc->bInterfaceSubClass != 2) || + (desc->bInterfaceProtocol != 0xff)) { +@@ -1365,7 +1365,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + + num_of_eps = desc->bNumEndpoints; + for (ep = 0; ep < num_of_eps; ep++) { +- endpoint = &intf->altsetting[0].endpoint[ep].desc; ++ endpoint = &intf->cur_altsetting->endpoint[ep].desc; + endpoint_num = usb_endpoint_num(endpoint); + if (!usb_endpoint_xfer_bulk(endpoint)) + continue; +diff --git a/drivers/net/wireless/orinoco/orinoco_usb.c b/drivers/net/wireless/orinoco/orinoco_usb.c +index f2cd513d54b2..e434f7ca8ff3 100644 +--- a/drivers/net/wireless/orinoco/orinoco_usb.c ++++ b/drivers/net/wireless/orinoco/orinoco_usb.c +@@ -1601,9 +1601,9 @@ static int ezusb_probe(struct usb_interface *interface, + /* set up the endpoint information */ + /* check out the endpoints */ + +- iface_desc = &interface->altsetting[0].desc; ++ iface_desc = &interface->cur_altsetting->desc; + for (i = 0; i < iface_desc->bNumEndpoints; ++i) { +- ep = &interface->altsetting[0].endpoint[i].desc; ++ ep = &interface->cur_altsetting->endpoint[i].desc; + + if (usb_endpoint_is_bulk_in(ep)) { + /* we found a bulk in endpoint */ +diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c +index 4d94bb4e95f8..8254d4b22c50 100644 +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c +@@ -5555,7 +5555,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv, + u8 dir, xtype, num; + int ret = 0; + +- host_interface = &interface->altsetting[0]; ++ host_interface = interface->cur_altsetting; + interface_desc = &host_interface->desc; + endpoints = interface_desc->bNumEndpoints; + +diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c +index ef5d394f185b..974387ad1e8c 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_usb.c ++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c +@@ -103,7 +103,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface, + __le16 buffer_size; + int ii, bep_found = 0; + +- iface_desc = &(interface->altsetting[0]); ++ iface_desc = interface->cur_altsetting; + + for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) { + endpoint = &(iface_desc->endpoint[ii].desc); +diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c +index a912dc051111..a5a5898093e7 100644 +--- a/drivers/net/wireless/zd1211rw/zd_usb.c ++++ b/drivers/net/wireless/zd1211rw/zd_usb.c +@@ -1272,7 +1272,7 @@ static void print_id(struct usb_device *udev) + static int eject_installer(struct usb_interface *intf) + { + struct usb_device *udev = interface_to_usbdev(intf); +- struct usb_host_interface *iface_desc = &intf->altsetting[0]; ++ struct usb_host_interface *iface_desc = intf->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c +index 82e4bc8c11c5..fc6706b12ac7 100644 +--- a/drivers/scsi/fnic/fnic_scsi.c ++++ b/drivers/scsi/fnic/fnic_scsi.c +@@ -446,6 +446,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_ + if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED))) + return SCSI_MLQUEUE_HOST_BUSY; + ++ if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET))) ++ return SCSI_MLQUEUE_HOST_BUSY; ++ + rport = starget_to_rport(scsi_target(sc->device)); + ret = fc_remote_port_chkready(rport); + if (ret) { +diff --git a/drivers/staging/most/aim-network/networking.c b/drivers/staging/most/aim-network/networking.c +index 3c7beb03871d..350fa05aaeed 100644 +--- a/drivers/staging/most/aim-network/networking.c ++++ b/drivers/staging/most/aim-network/networking.c +@@ -87,6 +87,11 @@ static int skb_to_mamac(const struct sk_buff *skb, struct mbo *mbo) + unsigned int payload_len = skb->len - ETH_HLEN; + unsigned int mdp_len = payload_len + MDP_HDR_LEN; + ++ if (mdp_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mdp_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mdp_len); +@@ -134,6 +139,11 @@ static int skb_to_mep(const struct sk_buff *skb, struct mbo *mbo) + u8 *buff = mbo->virt_address; + unsigned int mep_len = skb->len + MEP_HDR_LEN; + ++ if (mep_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mep_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mep_len); +diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h +index ba362a883016..80ab403aeb72 100644 +--- a/drivers/staging/vt6656/device.h ++++ b/drivers/staging/vt6656/device.h +@@ -65,6 +65,8 @@ + #define RATE_AUTO 12 + + #define MAX_RATE 12 ++#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ ++ BIT(RATE_5M) | BIT(RATE_11M)) + + /* + * device specific +diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c +index 14b8ebc6508d..cb22b5efe2be 100644 +--- a/drivers/staging/vt6656/int.c ++++ b/drivers/staging/vt6656/int.c +@@ -111,9 +111,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) + + info->status.rates[0].count = tx_retry; + +- if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) { ++ if (!(tsr & TSR_TMO)) { + info->status.rates[0].idx = idx; +- info->flags |= IEEE80211_TX_STAT_ACK; ++ ++ if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) ++ info->flags |= IEEE80211_TX_STAT_ACK; + } + + ieee80211_tx_status_irqsafe(priv->hw, context->skb); +diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c +index 668fcd3a0bfe..66e658810229 100644 +--- a/drivers/staging/vt6656/main_usb.c ++++ b/drivers/staging/vt6656/main_usb.c +@@ -1002,6 +1002,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); + ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); + ieee80211_hw_set(priv->hw, SUPPORTS_PS); ++ ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK); + + priv->hw->max_signal = 100; + +diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c +index efb54f53b4f9..5d951e043d35 100644 +--- a/drivers/staging/vt6656/rxtx.c ++++ b/drivers/staging/vt6656/rxtx.c +@@ -280,11 +280,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context, + PK_TYPE_11B, &buf->b); + + /* Get Duration and TimeStamp */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration_a = dur; +- buf->duration_b = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration_a = hdr->duration_id; ++ buf->duration_b = hdr->duration_id; + } else { + buf->duration_a = vnt_get_duration_le(priv, + tx_context->pkt_type, need_ack); +@@ -373,10 +371,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context, + tx_context->pkt_type, &buf->ab); + + /* Get Duration and TimeStampOff */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration = hdr->duration_id; + } else { + buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); +@@ -815,10 +811,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) + if (info->band == IEEE80211_BAND_5GHZ) { + pkt_type = PK_TYPE_11A; + } else { +- if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) +- pkt_type = PK_TYPE_11GB; +- else +- pkt_type = PK_TYPE_11GA; ++ if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { ++ if (priv->basic_rates & VNT_B_RATES) ++ pkt_type = PK_TYPE_11GB; ++ else ++ pkt_type = PK_TYPE_11GA; ++ } else { ++ pkt_type = PK_TYPE_11A; ++ } + } + } else { + pkt_type = PK_TYPE_11B; +diff --git a/drivers/staging/wlan-ng/prism2mgmt.c b/drivers/staging/wlan-ng/prism2mgmt.c +index c1ad0aea23b9..73ec8d3936d5 100644 +--- a/drivers/staging/wlan-ng/prism2mgmt.c ++++ b/drivers/staging/wlan-ng/prism2mgmt.c +@@ -940,7 +940,7 @@ int prism2mgmt_flashdl_state(wlandevice_t *wlandev, void *msgp) + } + } + +- return 0; ++ return result; + } + + /*---------------------------------------------------------------- +diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c +index 4378e758baef..591bc3f7be76 100644 +--- a/drivers/usb/dwc3/core.c ++++ b/drivers/usb/dwc3/core.c +@@ -801,6 +801,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) + /* do nothing */ + break; + } ++ ++ /* de-assert DRVVBUS for HOST and OTG mode */ ++ dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE); + } + + #define DWC3_ALIGN_MASK (16 - 1) +diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c +index 73956d48a0c5..1347c77facd0 100644 +--- a/drivers/usb/serial/ir-usb.c ++++ b/drivers/usb/serial/ir-usb.c +@@ -49,9 +49,10 @@ static int buffer_size; + static int xbof = -1; + + static int ir_startup (struct usb_serial *serial); +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port); +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size); ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count); ++static int ir_write_room(struct tty_struct *tty); ++static void ir_write_bulk_callback(struct urb *urb); + static void ir_process_read_urb(struct urb *urb); + static void ir_set_termios(struct tty_struct *tty, + struct usb_serial_port *port, struct ktermios *old_termios); +@@ -81,8 +82,9 @@ static struct usb_serial_driver ir_device = { + .num_ports = 1, + .set_termios = ir_set_termios, + .attach = ir_startup, +- .open = ir_open, +- .prepare_write_buffer = ir_prepare_write_buffer, ++ .write = ir_write, ++ .write_room = ir_write_room, ++ .write_bulk_callback = ir_write_bulk_callback, + .process_read_urb = ir_process_read_urb, + }; + +@@ -198,6 +200,9 @@ static int ir_startup(struct usb_serial *serial) + { + struct usb_irda_cs_descriptor *irda_desc; + ++ if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1) ++ return -ENODEV; ++ + irda_desc = irda_usb_find_class_desc(serial, 0); + if (!irda_desc) { + dev_err(&serial->dev->dev, +@@ -252,35 +257,102 @@ static int ir_startup(struct usb_serial *serial) + return 0; + } + +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port) ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count) + { +- int i; ++ struct urb *urb = NULL; ++ unsigned long flags; ++ int ret; + +- for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) +- port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET; ++ if (port->bulk_out_size == 0) ++ return -EINVAL; + +- /* Start reading from the device */ +- return usb_serial_generic_open(tty, port); +-} ++ if (count == 0) ++ return 0; + +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size) +-{ +- unsigned char *buf = dest; +- int count; ++ count = min(count, port->bulk_out_size - 1); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ if (__test_and_clear_bit(0, &port->write_urbs_free)) { ++ urb = port->write_urbs[0]; ++ port->tx_bytes += count; ++ } ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ if (!urb) ++ return 0; + + /* + * The first byte of the packet we send to the device contains an +- * inbound header which indicates an additional number of BOFs and ++ * outbound header which indicates an additional number of BOFs and + * a baud rate change. + * + * See section 5.4.2.2 of the USB IrDA spec. + */ +- *buf = ir_xbof | ir_baud; ++ *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud; ++ ++ memcpy(urb->transfer_buffer + 1, buf, count); ++ ++ urb->transfer_buffer_length = count + 1; ++ urb->transfer_flags = URB_ZERO_PACKET; ++ ++ ret = usb_submit_urb(urb, GFP_ATOMIC); ++ if (ret) { ++ dev_err(&port->dev, "failed to submit write urb: %d\n", ret); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= count; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ return ret; ++ } ++ ++ return count; ++} ++ ++static void ir_write_bulk_callback(struct urb *urb) ++{ ++ struct usb_serial_port *port = urb->context; ++ int status = urb->status; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= urb->transfer_buffer_length - 1; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ switch (status) { ++ case 0: ++ break; ++ case -ENOENT: ++ case -ECONNRESET: ++ case -ESHUTDOWN: ++ dev_dbg(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ case -EPIPE: ++ dev_err(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ default: ++ dev_err(&port->dev, "nonzero write-urb status: %d\n", status); ++ break; ++ } ++ ++ usb_serial_port_softint(port); ++} ++ ++static int ir_write_room(struct tty_struct *tty) ++{ ++ struct usb_serial_port *port = tty->driver_data; ++ int count = 0; ++ ++ if (port->bulk_out_size == 0) ++ return 0; ++ ++ if (test_bit(0, &port->write_urbs_free)) ++ count = port->bulk_out_size - 1; + +- count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1, +- &port->lock); +- return count + 1; ++ return count; + } + + static void ir_process_read_urb(struct urb *urb) +@@ -333,34 +405,34 @@ static void ir_set_termios(struct tty_struct *tty, + + switch (baud) { + case 2400: +- ir_baud = USB_IRDA_BR_2400; ++ ir_baud = USB_IRDA_LS_2400; + break; + case 9600: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + break; + case 19200: +- ir_baud = USB_IRDA_BR_19200; ++ ir_baud = USB_IRDA_LS_19200; + break; + case 38400: +- ir_baud = USB_IRDA_BR_38400; ++ ir_baud = USB_IRDA_LS_38400; + break; + case 57600: +- ir_baud = USB_IRDA_BR_57600; ++ ir_baud = USB_IRDA_LS_57600; + break; + case 115200: +- ir_baud = USB_IRDA_BR_115200; ++ ir_baud = USB_IRDA_LS_115200; + break; + case 576000: +- ir_baud = USB_IRDA_BR_576000; ++ ir_baud = USB_IRDA_LS_576000; + break; + case 1152000: +- ir_baud = USB_IRDA_BR_1152000; ++ ir_baud = USB_IRDA_LS_1152000; + break; + case 4000000: +- ir_baud = USB_IRDA_BR_4000000; ++ ir_baud = USB_IRDA_LS_4000000; + break; + default: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + baud = 9600; + } + +diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h +index 8ed80f28416f..9aad6825947c 100644 +--- a/drivers/usb/storage/unusual_uas.h ++++ b/drivers/usb/storage/unusual_uas.h +@@ -162,12 +162,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999, + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_IGNORE_UAS), + +-/* Reported-by: Takeo Nakayama */ ++/* ++ * Initially Reported-by: Takeo Nakayama ++ * UAS Ignore Reported by Steven Ellis ++ */ + UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, + "JMicron", + "JMS566", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, +- US_FL_NO_REPORT_OPCODES), ++ US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS), + + /* Reported-by: Hans de Goede */ + UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, +diff --git a/drivers/watchdog/rn5t618_wdt.c b/drivers/watchdog/rn5t618_wdt.c +index d1c12278cb6a..8b6eff26e480 100644 +--- a/drivers/watchdog/rn5t618_wdt.c ++++ b/drivers/watchdog/rn5t618_wdt.c +@@ -193,6 +193,7 @@ static struct platform_driver rn5t618_wdt_driver = { + + module_platform_driver(rn5t618_wdt_driver); + ++MODULE_ALIAS("platform:rn5t618-wdt"); + MODULE_AUTHOR("Beniamino Galvani "); + MODULE_DESCRIPTION("RN5T618 watchdog driver"); + MODULE_LICENSE("GPL v2"); +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index 0f99336c37eb..df211bad255c 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -1978,6 +1978,7 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv; + int ret; + u64 thresh = 0; ++ int mixed = 0; + + /* + * holding chunk_muext to avoid allocating new chunks, holding +@@ -2003,8 +2004,17 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + } + } + } +- if (found->flags & BTRFS_BLOCK_GROUP_METADATA) +- total_free_meta += found->disk_total - found->disk_used; ++ ++ /* ++ * Metadata in mixed block goup profiles are accounted in data ++ */ ++ if (!mixed && found->flags & BTRFS_BLOCK_GROUP_METADATA) { ++ if (found->flags & BTRFS_BLOCK_GROUP_DATA) ++ mixed = 1; ++ else ++ total_free_meta += found->disk_total - ++ found->disk_used; ++ } + + total_used += found->disk_used; + } +@@ -2042,7 +2052,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + */ + thresh = 4 * 1024 * 1024; + +- if (total_free_meta - thresh < block_rsv->size) ++ /* ++ * We only want to claim there's no available space if we can no longer ++ * allocate chunks for our metadata profile and our global reserve will ++ * not fit in the free metadata space. If we aren't ->full then we ++ * still can allocate chunks and thus are fine using the currently ++ * calculated f_bavail. ++ */ ++ if (!mixed && block_rsv->space_info->full && ++ total_free_meta - thresh < block_rsv->size) + buf->f_bavail = 0; + + buf->f_type = BTRFS_SUPER_MAGIC; +diff --git a/fs/namei.c b/fs/namei.c +index a4ed9c337c21..9f1aae507909 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -3060,8 +3060,8 @@ static int do_last(struct nameidata *nd, + int *opened) + { + struct dentry *dir = nd->path.dentry; +- kuid_t dir_uid = dir->d_inode->i_uid; +- umode_t dir_mode = dir->d_inode->i_mode; ++ kuid_t dir_uid = nd->inode->i_uid; ++ umode_t dir_mode = nd->inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c +index ee095246da4e..519bf410e65b 100644 +--- a/fs/reiserfs/super.c ++++ b/fs/reiserfs/super.c +@@ -599,6 +599,7 @@ static void reiserfs_put_super(struct super_block *s) + reiserfs_write_unlock(s); + mutex_destroy(&REISERFS_SB(s)->lock); + destroy_workqueue(REISERFS_SB(s)->commit_wq); ++ kfree(REISERFS_SB(s)->s_jdev); + kfree(s->s_fs_info); + s->s_fs_info = NULL; + } +@@ -2208,6 +2209,7 @@ error_unlocked: + kfree(qf_names[j]); + } + #endif ++ kfree(sbi->s_jdev); + kfree(sbi); + + s->s_fs_info = NULL; +diff --git a/include/linux/usb/irda.h b/include/linux/usb/irda.h +index e345ceaf72d6..9dc46010a067 100644 +--- a/include/linux/usb/irda.h ++++ b/include/linux/usb/irda.h +@@ -118,11 +118,22 @@ struct usb_irda_cs_descriptor { + * 6 - 115200 bps + * 7 - 576000 bps + * 8 - 1.152 Mbps +- * 9 - 5 mbps ++ * 9 - 4 Mbps + * 10..15 - Reserved + */ + #define USB_IRDA_STATUS_LINK_SPEED 0x0f + ++#define USB_IRDA_LS_NO_CHANGE 0 ++#define USB_IRDA_LS_2400 1 ++#define USB_IRDA_LS_9600 2 ++#define USB_IRDA_LS_19200 3 ++#define USB_IRDA_LS_38400 4 ++#define USB_IRDA_LS_57600 5 ++#define USB_IRDA_LS_115200 6 ++#define USB_IRDA_LS_576000 7 ++#define USB_IRDA_LS_1152000 8 ++#define USB_IRDA_LS_4000000 9 ++ + /* The following is a 4-bit value used only for + * outbound header: + * +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index 878d05bd185c..41c678199b80 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2701,6 +2701,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + char *flags = strchr(str, '='); + int err = 1; + ++ if (flags) ++ *flags++ = '\0'; /* terminate mode string */ ++ + if (nodelist) { + /* NUL-terminate mode or flags string */ + *nodelist++ = '\0'; +@@ -2711,9 +2714,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + } else + nodes_clear(nodes); + +- if (flags) +- *flags++ = '\0'; /* terminate mode string */ +- + for (mode = 0; mode < MPOL_MAX; mode++) { + if (!strcmp(str, policy_modes[mode])) { + break; +diff --git a/net/core/utils.c b/net/core/utils.c +index 3d17ca8b4744..13eb3552de07 100644 +--- a/net/core/utils.c ++++ b/net/core/utils.c +@@ -316,6 +316,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, + } + EXPORT_SYMBOL(inet_proto_csum_replace4); + ++/** ++ * inet_proto_csum_replace16 - update layer 4 header checksum field ++ * @sum: Layer 4 header checksum field ++ * @skb: sk_buff for the packet ++ * @from: old IPv6 address ++ * @to: new IPv6 address ++ * @pseudohdr: True if layer 4 header checksum includes pseudoheader ++ * ++ * Update layer 4 header as per the update in IPv6 src/dst address. ++ * ++ * There is no need to update skb->csum in this function, because update in two ++ * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other ++ * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to ++ * update skb->csum, because update in 3 fields a.) IPv4 src/dst address, ++ * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as ++ * L4 Header checksum for skb->csum calculation. ++ */ + void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + const __be32 *from, const __be32 *to, + bool pseudohdr) +@@ -327,9 +344,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + if (skb->ip_summed != CHECKSUM_PARTIAL) { + *sum = csum_fold(csum_partial(diff, sizeof(diff), + ~csum_unfold(*sum))); +- if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) +- skb->csum = ~csum_partial(diff, sizeof(diff), +- ~skb->csum); + } else if (pseudohdr) + *sum = ~csum_fold(csum_partial(diff, sizeof(diff), + csum_unfold(*sum))); +diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c +index bbcbbc1cc2cc..42dbd280dc9b 100644 +--- a/net/ipv4/ip_vti.c ++++ b/net/ipv4/ip_vti.c +@@ -195,8 +195,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev, + int err; + + if (!dst) { +- dev->stats.tx_carrier_errors++; +- goto tx_error_icmp; ++ struct rtable *rt; ++ ++ fl->u.ip4.flowi4_oif = dev->ifindex; ++ fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; ++ rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); ++ if (IS_ERR(rt)) { ++ dev->stats.tx_carrier_errors++; ++ goto tx_error_icmp; ++ } ++ dst = &rt->dst; ++ skb_dst_set(skb, dst); + } + + dst_hold(dst); +diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c +index 51da5987952c..623963a2d8a6 100644 +--- a/net/ipv6/ip6_vti.c ++++ b/net/ipv6/ip6_vti.c +@@ -441,8 +441,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + int err = -1; + int mtu; + +- if (!dst) +- goto tx_err_link_failure; ++ if (!dst) { ++ fl->u.ip6.flowi6_oif = dev->ifindex; ++ fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; ++ dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); ++ if (dst->error) { ++ dst_release(dst); ++ dst = NULL; ++ goto tx_err_link_failure; ++ } ++ skb_dst_set(skb, dst); ++ } + + dst_hold(dst); + dst = xfrm_lookup(t->net, dst, fl, NULL, 0); +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index b0b04b3c0896..d4d6f9c91e8c 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -242,6 +242,9 @@ static int tcf_em_validate(struct tcf_proto *tp, + goto errout; + + if (em->ops->change) { ++ err = -EINVAL; ++ if (em_hdr->flags & TCF_EM_SIMPLE) ++ goto errout; + err = em->ops->change(net, data, data_len, em); + if (err < 0) + goto errout; +diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c +index b50ee5d622e1..843d2cf1e6a6 100644 +--- a/net/wireless/wext-core.c ++++ b/net/wireless/wext-core.c +@@ -656,7 +656,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev) + return NULL; + } + +-static int iw_handler_get_iwstats(struct net_device * dev, ++/* noinline to avoid a bogus warning with -O3 */ ++static noinline int iw_handler_get_iwstats(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra) +diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c +index b9bfbf394959..59423576b1cc 100644 +--- a/sound/core/pcm_native.c ++++ b/sound/core/pcm_native.c +@@ -588,7 +588,7 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, + runtime->boundary *= 2; + + /* clear the buffer for avoiding possible kernel info leaks */ +- if (runtime->dma_area) ++ if (runtime->dma_area && !substream->ops->copy) + memset(runtime->dma_area, 0, runtime->dma_bytes); + + snd_pcm_timer_resolution_change(substream); diff --git a/patch/kernel/rk3399-legacy/update_2.5GBE_usb_rtl8156_to_v2.12.0.patch b/patch/kernel/rk3399-legacy/update_2.5GBE_usb_rtl8156_to_v2.12.0.patch.disabled similarity index 100% rename from patch/kernel/rk3399-legacy/update_2.5GBE_usb_rtl8156_to_v2.12.0.patch rename to patch/kernel/rk3399-legacy/update_2.5GBE_usb_rtl8156_to_v2.12.0.patch.disabled diff --git a/patch/kernel/rockchip-legacy/patch-4.4.211-212.patch b/patch/kernel/rockchip-legacy/patch-4.4.211-212.patch new file mode 100644 index 0000000000..150526f647 --- /dev/null +++ b/patch/kernel/rockchip-legacy/patch-4.4.211-212.patch @@ -0,0 +1,5145 @@ +diff --git a/Makefile b/Makefile +index 9f03733dac69..379f2a525c02 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 4 + PATCHLEVEL = 4 +-SUBLEVEL = 211 ++SUBLEVEL = 212 + EXTRAVERSION = + NAME = Blurry Fish Butt + +diff --git a/arch/arm/common/mcpm_entry.c b/arch/arm/common/mcpm_entry.c +index a923524d1040..8617323eb273 100644 +--- a/arch/arm/common/mcpm_entry.c ++++ b/arch/arm/common/mcpm_entry.c +@@ -379,7 +379,7 @@ static int __init nocache_trampoline(unsigned long _arg) + unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); + phys_reset_t phys_reset; + +- mcpm_set_entry_vector(cpu, cluster, cpu_resume); ++ mcpm_set_entry_vector(cpu, cluster, cpu_resume_no_hyp); + setup_mm_for_reboot(); + + __mcpm_cpu_going_down(cpu, cluster); +diff --git a/arch/arm/include/asm/suspend.h b/arch/arm/include/asm/suspend.h +index 6c7182f32cef..e6c2f426f8c8 100644 +--- a/arch/arm/include/asm/suspend.h ++++ b/arch/arm/include/asm/suspend.h +@@ -7,6 +7,7 @@ struct sleep_save_sp { + }; + + extern void cpu_resume(void); ++extern void cpu_resume_no_hyp(void); + extern void cpu_resume_arm(void); + extern int cpu_suspend(unsigned long, int (*)(unsigned long)); + +diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S +index 0f6c1000582c..c8569390e7e7 100644 +--- a/arch/arm/kernel/sleep.S ++++ b/arch/arm/kernel/sleep.S +@@ -119,6 +119,14 @@ ENDPROC(cpu_resume_after_mmu) + .text + .align + ++#ifdef CONFIG_MCPM ++ .arm ++THUMB( .thumb ) ++ENTRY(cpu_resume_no_hyp) ++ARM_BE8(setend be) @ ensure we are in BE mode ++ b no_hyp ++#endif ++ + #ifdef CONFIG_MMU + .arm + ENTRY(cpu_resume_arm) +@@ -134,6 +142,7 @@ ARM_BE8(setend be) @ ensure we are in BE mode + bl __hyp_stub_install_secondary + #endif + safe_svcmode_maskall r1 ++no_hyp: + mov r1, #0 + ALT_SMP(mrc p15, 0, r0, c0, c0, 5) + ALT_UP_B(1f) +@@ -162,6 +171,9 @@ ENDPROC(cpu_resume) + + #ifdef CONFIG_MMU + ENDPROC(cpu_resume_arm) ++#endif ++#ifdef CONFIG_MCPM ++ENDPROC(cpu_resume_no_hyp) + #endif + + .align 2 +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c +index 36706d32d656..1bc87c29467b 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -2563,7 +2563,7 @@ static void _setup_iclk_autoidle(struct omap_hwmod *oh) + */ + static int _setup_reset(struct omap_hwmod *oh) + { +- int r; ++ int r = 0; + + if (oh->_state != _HWMOD_STATE_INITIALIZED) + return -EINVAL; +diff --git a/arch/arm/mach-rpc/irq.c b/arch/arm/mach-rpc/irq.c +index 66502e6207fe..fce7fecbd8fa 100644 +--- a/arch/arm/mach-rpc/irq.c ++++ b/arch/arm/mach-rpc/irq.c +@@ -117,7 +117,7 @@ extern unsigned char rpc_default_fiq_start, rpc_default_fiq_end; + + void __init rpc_init_irq(void) + { +- unsigned int irq, clr, set = 0; ++ unsigned int irq, clr, set; + + iomd_writeb(0, IOMD_IRQMASKA); + iomd_writeb(0, IOMD_IRQMASKB); +@@ -129,6 +129,7 @@ void __init rpc_init_irq(void) + + for (irq = 0; irq < NR_IRQS; irq++) { + clr = IRQ_NOREQUEST; ++ set = 0; + + if (irq <= 6 || (irq >= 9 && irq <= 15)) + clr |= IRQ_NOPROBE; +diff --git a/arch/arm/plat-pxa/ssp.c b/arch/arm/plat-pxa/ssp.c +index 6748827c2ec8..b6b0979e3cf9 100644 +--- a/arch/arm/plat-pxa/ssp.c ++++ b/arch/arm/plat-pxa/ssp.c +@@ -231,18 +231,12 @@ static int pxa_ssp_probe(struct platform_device *pdev) + + static int pxa_ssp_remove(struct platform_device *pdev) + { +- struct resource *res; + struct ssp_device *ssp; + + ssp = platform_get_drvdata(pdev); + if (ssp == NULL) + return -ENODEV; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- release_mem_region(res->start, resource_size(res)); +- +- clk_put(ssp->clk); +- + mutex_lock(&ssp_lock); + list_del(&ssp->node); + mutex_unlock(&ssp_lock); +diff --git a/arch/arm64/boot/dts/arm/juno-clocks.dtsi b/arch/arm64/boot/dts/arm/juno-clocks.dtsi +index 25352ed943e6..00bcbf7688c7 100644 +--- a/arch/arm64/boot/dts/arm/juno-clocks.dtsi ++++ b/arch/arm64/boot/dts/arm/juno-clocks.dtsi +@@ -8,10 +8,10 @@ + */ + + /* SoC fixed clocks */ +- soc_uartclk: refclk7273800hz { ++ soc_uartclk: refclk7372800hz { + compatible = "fixed-clock"; + #clock-cells = <0>; +- clock-frequency = <7273800>; ++ clock-frequency = <7372800>; + clock-output-names = "juno:uartclk"; + }; + +diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c +index 2081b8cd5591..b9aee983e6f4 100644 +--- a/arch/m68k/amiga/cia.c ++++ b/arch/m68k/amiga/cia.c +@@ -88,10 +88,19 @@ static irqreturn_t cia_handler(int irq, void *dev_id) + struct ciabase *base = dev_id; + int mach_irq; + unsigned char ints; ++ unsigned long flags; + ++ /* Interrupts get disabled while the timer irq flag is cleared and ++ * the timer interrupt serviced. ++ */ + mach_irq = base->cia_irq; ++ local_irq_save(flags); + ints = cia_set_irq(base, CIA_ICR_ALL); + amiga_custom.intreq = base->int_mask; ++ if (ints & 1) ++ generic_handle_irq(mach_irq); ++ local_irq_restore(flags); ++ mach_irq++, ints >>= 1; + for (; ints; mach_irq++, ints >>= 1) { + if (ints & 1) + generic_handle_irq(mach_irq); +diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c +index 3d2b63bedf05..56f02ea2c248 100644 +--- a/arch/m68k/atari/ataints.c ++++ b/arch/m68k/atari/ataints.c +@@ -142,7 +142,7 @@ struct mfptimerbase { + .name = "MFP Timer D" + }; + +-static irqreturn_t mfptimer_handler(int irq, void *dev_id) ++static irqreturn_t mfp_timer_d_handler(int irq, void *dev_id) + { + struct mfptimerbase *base = dev_id; + int mach_irq; +@@ -344,7 +344,7 @@ void __init atari_init_IRQ(void) + st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 0xf0) | 0x6; + + /* request timer D dispatch handler */ +- if (request_irq(IRQ_MFP_TIMD, mfptimer_handler, IRQF_SHARED, ++ if (request_irq(IRQ_MFP_TIMD, mfp_timer_d_handler, IRQF_SHARED, + stmfp_base.name, &stmfp_base)) + pr_err("Couldn't register %s interrupt\n", stmfp_base.name); + +diff --git a/arch/m68k/atari/time.c b/arch/m68k/atari/time.c +index c549b48174ec..972181c1fe4b 100644 +--- a/arch/m68k/atari/time.c ++++ b/arch/m68k/atari/time.c +@@ -24,6 +24,18 @@ + DEFINE_SPINLOCK(rtc_lock); + EXPORT_SYMBOL_GPL(rtc_lock); + ++static irqreturn_t mfp_timer_c_handler(int irq, void *dev_id) ++{ ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; ++} ++ + void __init + atari_sched_init(irq_handler_t timer_routine) + { +@@ -32,7 +44,8 @@ atari_sched_init(irq_handler_t timer_routine) + /* start timer C, div = 1:100 */ + st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60; + /* install interrupt service routine for MFP Timer C */ +- if (request_irq(IRQ_MFP_TIMC, timer_routine, 0, "timer", timer_routine)) ++ if (request_irq(IRQ_MFP_TIMC, mfp_timer_c_handler, 0, "timer", ++ timer_routine)) + pr_err("Couldn't register timer interrupt\n"); + } + +diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c +index 478623dbb209..62054c01ecb4 100644 +--- a/arch/m68k/bvme6000/config.c ++++ b/arch/m68k/bvme6000/config.c +@@ -46,11 +46,6 @@ extern int bvme6000_set_clock_mmss (unsigned long); + extern void bvme6000_reset (void); + void bvme6000_set_vectors (void); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/timer/timekeeping.c, called via bvme6000_process_int() */ +- +-static irq_handler_t tick_handler; +- + + int __init bvme6000_parse_bootinfo(const struct bi_record *bi) + { +@@ -160,12 +155,18 @@ irqreturn_t bvme6000_abort_int (int irq, void *dev_id) + + static irqreturn_t bvme6000_timer_int (int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; +- unsigned char msr = rtc->msr & 0xc0; ++ unsigned char msr; + ++ local_irq_save(flags); ++ msr = rtc->msr & 0xc0; + rtc->msr = msr | 0x20; /* Ack the interrupt */ ++ timer_routine(0, NULL); ++ local_irq_restore(flags); + +- return tick_handler(irq, dev_id); ++ return IRQ_HANDLED; + } + + /* +@@ -184,9 +185,8 @@ void bvme6000_sched_init (irq_handler_t timer_routine) + + rtc->msr = 0; /* Ensure timer registers accessible */ + +- tick_handler = timer_routine; +- if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, +- "timer", bvme6000_timer_int)) ++ if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, "timer", ++ timer_routine)) + panic ("Couldn't register timer int"); + + rtc->t1cr_omr = 0x04; /* Mode 2, ext clk */ +diff --git a/arch/m68k/hp300/time.c b/arch/m68k/hp300/time.c +index 749543b425a4..03c83b8f9032 100644 +--- a/arch/m68k/hp300/time.c ++++ b/arch/m68k/hp300/time.c +@@ -37,13 +37,19 @@ + + static irqreturn_t hp300_tick(int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + unsigned long tmp; +- irq_handler_t vector = dev_id; ++ ++ local_irq_save(flags); + in_8(CLOCKBASE + CLKSR); + asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE)); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ + /* Turn off the network and SCSI leds */ + blinken_leds(0, 0xe0); +- return vector(irq, NULL); ++ return IRQ_HANDLED; + } + + u32 hp300_gettimeoffset(void) +diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c +index ce56e04386e7..49f9fa4529a8 100644 +--- a/arch/m68k/mac/via.c ++++ b/arch/m68k/mac/via.c +@@ -53,16 +53,6 @@ static __u8 rbv_clear; + + static int gIER,gIFR,gBufA,gBufB; + +-/* +- * Timer defs. +- */ +- +-#define TICK_SIZE 10000 +-#define MAC_CLOCK_TICK (783300/HZ) /* ticks per HZ */ +-#define MAC_CLOCK_LOW (MAC_CLOCK_TICK&0xFF) +-#define MAC_CLOCK_HIGH (MAC_CLOCK_TICK>>8) +- +- + /* + * On Macs with a genuine VIA chip there is no way to mask an individual slot + * interrupt. This limitation also seems to apply to VIA clone logic cores in +@@ -277,22 +267,6 @@ void __init via_init(void) + } + } + +-/* +- * Start the 100 Hz clock +- */ +- +-void __init via_init_clock(irq_handler_t func) +-{ +- via1[vACR] |= 0x40; +- via1[vT1LL] = MAC_CLOCK_LOW; +- via1[vT1LH] = MAC_CLOCK_HIGH; +- via1[vT1CL] = MAC_CLOCK_LOW; +- via1[vT1CH] = MAC_CLOCK_HIGH; +- +- if (request_irq(IRQ_MAC_TIMER_1, func, 0, "timer", func)) +- pr_err("Couldn't register %s interrupt\n", "timer"); +-} +- + /* + * Debugging dump, used in various places to see what's going on. + */ +@@ -320,29 +294,6 @@ void via_debug_dump(void) + } + } + +-/* +- * This is always executed with interrupts disabled. +- * +- * TBI: get time offset between scheduling timer ticks +- */ +- +-u32 mac_gettimeoffset(void) +-{ +- unsigned long ticks, offset = 0; +- +- /* read VIA1 timer 2 current value */ +- ticks = via1[vT1CL] | (via1[vT1CH] << 8); +- /* The probability of underflow is less than 2% */ +- if (ticks > MAC_CLOCK_TICK - MAC_CLOCK_TICK / 50) +- /* Check for pending timer interrupt in VIA1 IFR */ +- if (via1[vIFR] & 0x40) offset = TICK_SIZE; +- +- ticks = MAC_CLOCK_TICK - ticks; +- ticks = ticks * 10000L / MAC_CLOCK_TICK; +- +- return (ticks + offset) * 1000; +-} +- + /* + * Flush the L2 cache on Macs that have it by flipping + * the system into 24-bit mode for an instant. +@@ -446,6 +397,8 @@ void via_nubus_irq_shutdown(int irq) + * via6522.c :-), disable/pending masks added. + */ + ++#define VIA_TIMER_1_INT BIT(6) ++ + void via1_irq(struct irq_desc *desc) + { + int irq_num; +@@ -455,6 +408,21 @@ void via1_irq(struct irq_desc *desc) + if (!events) + return; + ++ irq_num = IRQ_MAC_TIMER_1; ++ irq_bit = VIA_TIMER_1_INT; ++ if (events & irq_bit) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ via1[vIFR] = irq_bit; ++ generic_handle_irq(irq_num); ++ local_irq_restore(flags); ++ ++ events &= ~irq_bit; ++ if (!events) ++ return; ++ } ++ + irq_num = VIA1_SOURCE_BASE; + irq_bit = 1; + do { +@@ -619,3 +587,56 @@ int via2_scsi_drq_pending(void) + return via2[gIFR] & (1 << IRQ_IDX(IRQ_MAC_SCSIDRQ)); + } + EXPORT_SYMBOL(via2_scsi_drq_pending); ++ ++/* timer and clock source */ ++ ++#define VIA_CLOCK_FREQ 783360 /* VIA "phase 2" clock in Hz */ ++#define VIA_TIMER_INTERVAL (1000000 / HZ) /* microseconds per jiffy */ ++#define VIA_TIMER_CYCLES (VIA_CLOCK_FREQ / HZ) /* clock cycles per jiffy */ ++ ++#define VIA_TC (VIA_TIMER_CYCLES - 2) /* including 0 and -1 */ ++#define VIA_TC_LOW (VIA_TC & 0xFF) ++#define VIA_TC_HIGH (VIA_TC >> 8) ++ ++void __init via_init_clock(irq_handler_t timer_routine) ++{ ++ if (request_irq(IRQ_MAC_TIMER_1, timer_routine, 0, "timer", NULL)) { ++ pr_err("Couldn't register %s interrupt\n", "timer"); ++ return; ++ } ++ ++ via1[vT1LL] = VIA_TC_LOW; ++ via1[vT1LH] = VIA_TC_HIGH; ++ via1[vT1CL] = VIA_TC_LOW; ++ via1[vT1CH] = VIA_TC_HIGH; ++ via1[vACR] |= 0x40; ++} ++ ++u32 mac_gettimeoffset(void) ++{ ++ unsigned long flags; ++ u8 count_high; ++ u16 count, offset = 0; ++ ++ /* ++ * Timer counter wrap-around is detected with the timer interrupt flag ++ * but reading the counter low byte (vT1CL) would reset the flag. ++ * Also, accessing both counter registers is essentially a data race. ++ * These problems are avoided by ignoring the low byte. Clock accuracy ++ * is 256 times worse (error can reach 0.327 ms) but CPU overhead is ++ * reduced by avoiding slow VIA register accesses. ++ */ ++ ++ local_irq_save(flags); ++ count_high = via1[vT1CH]; ++ if (count_high == 0xFF) ++ count_high = 0; ++ if (count_high > 0 && (via1[vIFR] & VIA_TIMER_1_INT)) ++ offset = VIA_TIMER_CYCLES; ++ local_irq_restore(flags); ++ ++ count = count_high << 8; ++ count = VIA_TIMER_CYCLES - count + offset; ++ ++ return ((count * VIA_TIMER_INTERVAL) / VIA_TIMER_CYCLES) * 1000; ++} +diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c +index e6a3b56c6481..152fbde23424 100644 +--- a/arch/m68k/mvme147/config.c ++++ b/arch/m68k/mvme147/config.c +@@ -47,11 +47,6 @@ extern void mvme147_reset (void); + + static int bcd2int (unsigned char b); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/time/timekeeping.c, called via mvme147_process_int() */ +- +-irq_handler_t tick_handler; +- + + int __init mvme147_parse_bootinfo(const struct bi_record *bi) + { +@@ -107,16 +102,23 @@ void __init config_mvme147(void) + + static irqreturn_t mvme147_timer_int (int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); + m147_pcc->t1_int_cntrl = PCC_TIMER_INT_CLR; + m147_pcc->t1_int_cntrl = PCC_INT_ENAB|PCC_LEVEL_TIMER1; +- return tick_handler(irq, dev_id); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; + } + + + void mvme147_sched_init (irq_handler_t timer_routine) + { +- tick_handler = timer_routine; +- if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", NULL)) ++ if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", ++ timer_routine)) + pr_err("Couldn't register timer interrupt\n"); + + /* Init the clock with a value */ +diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c +index a53803cc66cd..0d43bfb3324d 100644 +--- a/arch/m68k/mvme16x/config.c ++++ b/arch/m68k/mvme16x/config.c +@@ -52,11 +52,6 @@ extern void mvme16x_reset (void); + + int bcd2int (unsigned char b); + +-/* Save tick handler routine pointer, will point to xtime_update() in +- * kernel/time/timekeeping.c, called via mvme16x_process_int() */ +- +-static irq_handler_t tick_handler; +- + + unsigned short mvme16x_config; + EXPORT_SYMBOL(mvme16x_config); +@@ -355,8 +350,15 @@ static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) + + static irqreturn_t mvme16x_timer_int (int irq, void *dev_id) + { +- *(volatile unsigned char *)0xfff4201b |= 8; +- return tick_handler(irq, dev_id); ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ *(volatile unsigned char *)0xfff4201b |= 8; ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ ++ return IRQ_HANDLED; + } + + void mvme16x_sched_init (irq_handler_t timer_routine) +@@ -364,14 +366,13 @@ void mvme16x_sched_init (irq_handler_t timer_routine) + uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); + int irq; + +- tick_handler = timer_routine; + /* Using PCCchip2 or MC2 chip tick timer 1 */ + *(volatile unsigned long *)0xfff42008 = 0; + *(volatile unsigned long *)0xfff42004 = 10000; /* 10ms */ + *(volatile unsigned char *)0xfff42017 |= 3; + *(volatile unsigned char *)0xfff4201b = 0x16; +- if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, +- "timer", mvme16x_timer_int)) ++ if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, "timer", ++ timer_routine)) + panic ("Couldn't register timer int"); + + if (brdno == 0x0162 || brdno == 0x172) +diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c +index 513f9bb17b9c..60b51f5b9cfc 100644 +--- a/arch/m68k/q40/q40ints.c ++++ b/arch/m68k/q40/q40ints.c +@@ -126,10 +126,10 @@ void q40_mksound(unsigned int hz, unsigned int ticks) + sound_ticks = ticks << 1; + } + +-static irq_handler_t q40_timer_routine; +- +-static irqreturn_t q40_timer_int (int irq, void * dev) ++static irqreturn_t q40_timer_int(int irq, void *dev_id) + { ++ irq_handler_t timer_routine = dev_id; ++ + ql_ticks = ql_ticks ? 0 : 1; + if (sound_ticks) { + unsigned char sval=(sound_ticks & 1) ? 128-SVOL : 128+SVOL; +@@ -138,8 +138,13 @@ static irqreturn_t q40_timer_int (int irq, void * dev) + *DAC_RIGHT=sval; + } + +- if (!ql_ticks) +- q40_timer_routine(irq, dev); ++ if (!ql_ticks) { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); ++ } + return IRQ_HANDLED; + } + +@@ -147,11 +152,9 @@ void q40_sched_init (irq_handler_t timer_routine) + { + int timer_irq; + +- q40_timer_routine = timer_routine; + timer_irq = Q40_IRQ_FRAME; + +- if (request_irq(timer_irq, q40_timer_int, 0, +- "timer", q40_timer_int)) ++ if (request_irq(timer_irq, q40_timer_int, 0, "timer", timer_routine)) + panic("Couldn't register timer int"); + + master_outb(-1, FRAME_CLEAR_REG); +diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c +index 6bbca30c9188..a5824abb4a39 100644 +--- a/arch/m68k/sun3/sun3ints.c ++++ b/arch/m68k/sun3/sun3ints.c +@@ -61,8 +61,10 @@ static irqreturn_t sun3_int7(int irq, void *dev_id) + + static irqreturn_t sun3_int5(int irq, void *dev_id) + { ++ unsigned long flags; + unsigned int cnt; + ++ local_irq_save(flags); + #ifdef CONFIG_SUN3 + intersil_clear(); + #endif +@@ -76,6 +78,7 @@ static irqreturn_t sun3_int5(int irq, void *dev_id) + cnt = kstat_irqs_cpu(irq, 0); + if (!(cnt % 20)) + sun3_leds(led_pattern[cnt % 160 / 20]); ++ local_irq_restore(flags); + return IRQ_HANDLED; + } + +diff --git a/arch/m68k/sun3x/time.c b/arch/m68k/sun3x/time.c +index c8eb08add6b0..7a195313ff4f 100644 +--- a/arch/m68k/sun3x/time.c ++++ b/arch/m68k/sun3x/time.c +@@ -77,15 +77,19 @@ u32 sun3x_gettimeoffset(void) + } + + #if 0 +-static void sun3x_timer_tick(int irq, void *dev_id, struct pt_regs *regs) ++static irqreturn_t sun3x_timer_tick(int irq, void *dev_id) + { +- void (*vector)(int, void *, struct pt_regs *) = dev_id; ++ irq_handler_t timer_routine = dev_id; ++ unsigned long flags; + +- /* Clear the pending interrupt - pulse the enable line low */ +- disable_irq(5); +- enable_irq(5); ++ local_irq_save(flags); ++ /* Clear the pending interrupt - pulse the enable line low */ ++ disable_irq(5); ++ enable_irq(5); ++ timer_routine(0, NULL); ++ local_irq_restore(flags); + +- vector(irq, NULL, regs); ++ return IRQ_HANDLED; + } + #endif + +diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h +index ab1df19b0957..60604b26fa72 100644 +--- a/arch/mips/include/asm/io.h ++++ b/arch/mips/include/asm/io.h +@@ -60,21 +60,11 @@ + * instruction, so the lower 16 bits must be zero. Should be true on + * on any sane architecture; generic code does not use this assumption. + */ +-extern const unsigned long mips_io_port_base; ++extern unsigned long mips_io_port_base; + +-/* +- * Gcc will generate code to load the value of mips_io_port_base after each +- * function call which may be fairly wasteful in some cases. So we don't +- * play quite by the book. We tell gcc mips_io_port_base is a long variable +- * which solves the code generation issue. Now we need to violate the +- * aliasing rules a little to make initialization possible and finally we +- * will need the barrier() to fight side effects of the aliasing chat. +- * This trickery will eventually collapse under gcc's optimizer. Oh well. +- */ + static inline void set_io_port_base(unsigned long base) + { +- * (unsigned long *) &mips_io_port_base = base; +- barrier(); ++ mips_io_port_base = base; + } + + /* +diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c +index 4f9f1ae49213..fadc946b306d 100644 +--- a/arch/mips/kernel/setup.c ++++ b/arch/mips/kernel/setup.c +@@ -80,7 +80,7 @@ static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; + * mips_io_port_base is the begin of the address space to which x86 style + * I/O ports are mapped. + */ +-const unsigned long mips_io_port_base = -1; ++unsigned long mips_io_port_base = -1; + EXPORT_SYMBOL(mips_io_port_base); + + static struct resource code_resource = { .name = "Kernel code", }; +diff --git a/arch/nios2/kernel/nios2_ksyms.c b/arch/nios2/kernel/nios2_ksyms.c +index bf2f55d10a4d..4e704046a150 100644 +--- a/arch/nios2/kernel/nios2_ksyms.c ++++ b/arch/nios2/kernel/nios2_ksyms.c +@@ -9,12 +9,20 @@ + #include + #include + ++#include ++#include ++ + /* string functions */ + + EXPORT_SYMBOL(memcpy); + EXPORT_SYMBOL(memset); + EXPORT_SYMBOL(memmove); + ++/* memory management */ ++ ++EXPORT_SYMBOL(empty_zero_page); ++EXPORT_SYMBOL(flush_icache_range); ++ + /* + * libgcc functions - functions that are used internally by the + * compiler... (prototypes are not correct though, but that +@@ -31,3 +39,7 @@ DECLARE_EXPORT(__udivsi3); + DECLARE_EXPORT(__umoddi3); + DECLARE_EXPORT(__umodsi3); + DECLARE_EXPORT(__muldi3); ++DECLARE_EXPORT(__ucmpdi2); ++DECLARE_EXPORT(__lshrdi3); ++DECLARE_EXPORT(__ashldi3); ++DECLARE_EXPORT(__ashrdi3); +diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile +index d7eb035a9c96..65cb22541c66 100644 +--- a/arch/powerpc/Makefile ++++ b/arch/powerpc/Makefile +@@ -350,7 +350,9 @@ vdso_install: + ifeq ($(CONFIG_PPC64),y) + $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@ + endif ++ifdef CONFIG_VDSO32 + $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso32 $@ ++endif + + archclean: + $(Q)$(MAKE) $(clean)=$(boot) +diff --git a/arch/powerpc/include/asm/archrandom.h b/arch/powerpc/include/asm/archrandom.h +index 85e88f7a59c0..9ff848e3c4a6 100644 +--- a/arch/powerpc/include/asm/archrandom.h ++++ b/arch/powerpc/include/asm/archrandom.h +@@ -27,7 +27,7 @@ static inline int arch_get_random_seed_int(unsigned int *v) + unsigned long val; + int rc; + +- rc = arch_get_random_long(&val); ++ rc = arch_get_random_seed_long(&val); + if (rc) + *v = val; + +diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c +index c641983bbdd6..3394a72b19f2 100644 +--- a/arch/powerpc/kernel/cacheinfo.c ++++ b/arch/powerpc/kernel/cacheinfo.c +@@ -867,4 +867,21 @@ void cacheinfo_cpu_offline(unsigned int cpu_id) + if (cache) + cache_cpu_clear(cache, cpu_id); + } ++ ++void cacheinfo_teardown(void) ++{ ++ unsigned int cpu; ++ ++ for_each_online_cpu(cpu) ++ cacheinfo_cpu_offline(cpu); ++} ++ ++void cacheinfo_rebuild(void) ++{ ++ unsigned int cpu; ++ ++ for_each_online_cpu(cpu) ++ cacheinfo_cpu_online(cpu); ++} ++ + #endif /* (CONFIG_PPC_PSERIES && CONFIG_SUSPEND) || CONFIG_HOTPLUG_CPU */ +diff --git a/arch/powerpc/kernel/cacheinfo.h b/arch/powerpc/kernel/cacheinfo.h +index a7b74d36acd7..2cdee87a482c 100644 +--- a/arch/powerpc/kernel/cacheinfo.h ++++ b/arch/powerpc/kernel/cacheinfo.h +@@ -5,4 +5,8 @@ + extern void cacheinfo_cpu_online(unsigned int cpu_id); + extern void cacheinfo_cpu_offline(unsigned int cpu_id); + ++/* Allow migration/suspend to tear down and rebuild the hierarchy. */ ++extern void cacheinfo_teardown(void); ++extern void cacheinfo_rebuild(void); ++ + #endif /* _PPC_CACHEINFO_H */ +diff --git a/arch/powerpc/sysdev/qe_lib/gpio.c b/arch/powerpc/sysdev/qe_lib/gpio.c +index 521e67a49dc4..4052e3d7edbd 100644 +--- a/arch/powerpc/sysdev/qe_lib/gpio.c ++++ b/arch/powerpc/sysdev/qe_lib/gpio.c +@@ -155,8 +155,10 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index) + if (err < 0) + goto err0; + gc = gpio_to_chip(err); +- if (WARN_ON(!gc)) ++ if (WARN_ON(!gc)) { ++ err = -ENODEV; + goto err0; ++ } + + if (!of_device_is_compatible(gc->of_node, "fsl,mpc8323-qe-pario-bank")) { + pr_debug("%s: tried to get a non-qe pin\n", __func__); +diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug +index 2aa212fb0faf..31c191a08bb1 100644 +--- a/arch/x86/Kconfig.debug ++++ b/arch/x86/Kconfig.debug +@@ -221,7 +221,7 @@ config HAVE_MMIOTRACE_SUPPORT + + config X86_DECODER_SELFTEST + bool "x86 instruction decoder selftest" +- depends on DEBUG_KERNEL && KPROBES ++ depends on DEBUG_KERNEL && INSTRUCTION_DECODER + depends on !COMPILE_TEST + ---help--- + Perform x86 instruction decoder selftests at build time. +diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c +index 44256a62702b..4a08fda2b06f 100644 +--- a/arch/x86/kernel/kgdb.c ++++ b/arch/x86/kernel/kgdb.c +@@ -437,7 +437,7 @@ static void kgdb_disable_hw_debug(struct pt_regs *regs) + */ + void kgdb_roundup_cpus(unsigned long flags) + { +- apic->send_IPI_allbutself(APIC_DM_NMI); ++ apic->send_IPI_allbutself(NMI_VECTOR); + } + #endif + +diff --git a/block/blk-merge.c b/block/blk-merge.c +index 7225511cf0b4..b8f1eaeeaac2 100644 +--- a/block/blk-merge.c ++++ b/block/blk-merge.c +@@ -296,13 +296,7 @@ void blk_recalc_rq_segments(struct request *rq) + + void blk_recount_segments(struct request_queue *q, struct bio *bio) + { +- unsigned short seg_cnt; +- +- /* estimate segment number by bi_vcnt for non-cloned bio */ +- if (bio_flagged(bio, BIO_CLONED)) +- seg_cnt = bio_segments(bio); +- else +- seg_cnt = bio->bi_vcnt; ++ unsigned short seg_cnt = bio_segments(bio); + + if (test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags) && + (seg_cnt < queue_max_segments(q))) +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index f8ec3d4ba4a8..a5718c0a3dc4 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -394,7 +394,7 @@ static int pcrypt_sysfs_add(struct padata_instance *pinst, const char *name) + int ret; + + pinst->kobj.kset = pcrypt_kset; +- ret = kobject_add(&pinst->kobj, NULL, name); ++ ret = kobject_add(&pinst->kobj, NULL, "%s", name); + if (!ret) + kobject_uevent(&pinst->kobj, KOBJ_ADD); + +diff --git a/crypto/tgr192.c b/crypto/tgr192.c +index 321bc6ff2a9d..904c8444aa0a 100644 +--- a/crypto/tgr192.c ++++ b/crypto/tgr192.c +@@ -25,8 +25,9 @@ + #include + #include + #include +-#include + #include ++#include ++#include + + #define TGR192_DIGEST_SIZE 24 + #define TGR160_DIGEST_SIZE 20 +@@ -468,10 +469,9 @@ static void tgr192_transform(struct tgr192_ctx *tctx, const u8 * data) + u64 a, b, c, aa, bb, cc; + u64 x[8]; + int i; +- const __le64 *ptr = (const __le64 *)data; + + for (i = 0; i < 8; i++) +- x[i] = le64_to_cpu(ptr[i]); ++ x[i] = get_unaligned_le64(data + i * sizeof(__le64)); + + /* save */ + a = aa = tctx->a; +diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c +index 8116cb2fef2d..1241cecfcfca 100644 +--- a/drivers/ata/libahci.c ++++ b/drivers/ata/libahci.c +@@ -187,7 +187,6 @@ struct ata_port_operations ahci_pmp_retry_srst_ops = { + EXPORT_SYMBOL_GPL(ahci_pmp_retry_srst_ops); + + static bool ahci_em_messages __read_mostly = true; +-EXPORT_SYMBOL_GPL(ahci_em_messages); + module_param(ahci_em_messages, bool, 0444); + /* add other LED protocol types when they become supported */ + MODULE_PARM_DESC(ahci_em_messages, +diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c +index 82f2ae0d7cc4..04b39d0da868 100644 +--- a/drivers/atm/firestream.c ++++ b/drivers/atm/firestream.c +@@ -923,6 +923,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + } + if (!to) { + printk ("No more free channels for FS50..\n"); ++ kfree(vcc); + return -EBUSY; + } + vcc->channo = dev->channo; +@@ -933,6 +934,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + if (((DO_DIRECTION(rxtp) && dev->atm_vccs[vcc->channo])) || + ( DO_DIRECTION(txtp) && test_bit (vcc->channo, dev->tx_inuse))) { + printk ("Channel is in use for FS155.\n"); ++ kfree(vcc); + return -EBUSY; + } + } +@@ -946,6 +948,7 @@ static int fs_open(struct atm_vcc *atm_vcc) + tc, sizeof (struct fs_transmit_config)); + if (!tc) { + fs_dprintk (FS_DEBUG_OPEN, "fs: can't alloc transmit_config.\n"); ++ kfree(vcc); + return -ENOMEM; + } + +diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c +index f499a469e66d..12b2cc9a3fbe 100644 +--- a/drivers/bcma/driver_pci.c ++++ b/drivers/bcma/driver_pci.c +@@ -78,7 +78,7 @@ static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u16 device, u8 address) + v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); + } + +- v = BCMA_CORE_PCI_MDIODATA_START; ++ v |= BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_READ; + v |= BCMA_CORE_PCI_MDIODATA_TA; + +@@ -121,7 +121,7 @@ static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u16 device, + v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); + } + +- v = BCMA_CORE_PCI_MDIODATA_START; ++ v |= BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_WRITE; + v |= BCMA_CORE_PCI_MDIODATA_TA; + v |= data; +diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c +index 385ec4ae3394..456350bd24b3 100644 +--- a/drivers/block/drbd/drbd_main.c ++++ b/drivers/block/drbd/drbd_main.c +@@ -331,6 +331,8 @@ static int drbd_thread_setup(void *arg) + thi->name[0], + resource->name); + ++ allow_kernel_signal(DRBD_SIGKILL); ++ allow_kernel_signal(SIGXCPU); + restart: + retval = thi->function(thi); + +diff --git a/drivers/clk/clk-highbank.c b/drivers/clk/clk-highbank.c +index be3a21abb185..4105066b428c 100644 +--- a/drivers/clk/clk-highbank.c ++++ b/drivers/clk/clk-highbank.c +@@ -294,6 +294,7 @@ static __init struct clk *hb_clk_init(struct device_node *node, const struct clk + /* Map system registers */ + srnp = of_find_compatible_node(NULL, NULL, "calxeda,hb-sregs"); + hb_clk->reg = of_iomap(srnp, 0); ++ of_node_put(srnp); + BUG_ON(!hb_clk->reg); + hb_clk->reg += reg; + +diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c +index 7244a621c61b..efc9e1973295 100644 +--- a/drivers/clk/clk-qoriq.c ++++ b/drivers/clk/clk-qoriq.c +@@ -1244,6 +1244,7 @@ static void __init clockgen_init(struct device_node *np) + pr_err("%s: Couldn't map %s regs\n", __func__, + guts->full_name); + } ++ of_node_put(guts); + } + + } +diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c +index 46c05c9a9354..39ea50102d52 100644 +--- a/drivers/clk/imx/clk-imx6q.c ++++ b/drivers/clk/imx/clk-imx6q.c +@@ -155,6 +155,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + /* Audio/video PLL post dividers do not work on i.MX6q revision 1.0 */ + if (clk_on_imx6q() && imx_get_soc_revision() == IMX_CHIP_REVISION_1_0) { +diff --git a/drivers/clk/imx/clk-imx6sx.c b/drivers/clk/imx/clk-imx6sx.c +index fea125eb4330..8f2958ac04e8 100644 +--- a/drivers/clk/imx/clk-imx6sx.c ++++ b/drivers/clk/imx/clk-imx6sx.c +@@ -162,6 +162,7 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + clks[IMX6SX_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); + clks[IMX6SX_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); +diff --git a/drivers/clk/imx/clk-imx7d.c b/drivers/clk/imx/clk-imx7d.c +index 448ef321948b..863163b239a3 100644 +--- a/drivers/clk/imx/clk-imx7d.c ++++ b/drivers/clk/imx/clk-imx7d.c +@@ -386,6 +386,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-anatop"); + base = of_iomap(np, 0); + WARN_ON(!base); ++ of_node_put(np); + + clks[IMX7D_PLL_ARM_MAIN_SRC] = imx_clk_mux("pll_arm_main_src", base + 0x60, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); + clks[IMX7D_PLL_DRAM_MAIN_SRC] = imx_clk_mux("pll_dram_main_src", base + 0x70, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); +diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c +index 0a94d9661d91..2c92a2706fdd 100644 +--- a/drivers/clk/imx/clk-vf610.c ++++ b/drivers/clk/imx/clk-vf610.c +@@ -155,6 +155,7 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) + np = of_find_compatible_node(NULL, NULL, "fsl,vf610-anatop"); + anatop_base = of_iomap(np, 0); + BUG_ON(!anatop_base); ++ of_node_put(np); + + np = ccm_node; + ccm_base = of_iomap(np, 0); +diff --git a/drivers/clk/mvebu/armada-370.c b/drivers/clk/mvebu/armada-370.c +index 2c7c1085f883..8fdfa97900cd 100644 +--- a/drivers/clk/mvebu/armada-370.c ++++ b/drivers/clk/mvebu/armada-370.c +@@ -177,8 +177,10 @@ static void __init a370_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &a370_coreclks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, a370_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(a370_clk, "marvell,armada-370-core-clock", a370_clk_init); + +diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c +index b3094315a3c0..2fa15a274719 100644 +--- a/drivers/clk/mvebu/armada-xp.c ++++ b/drivers/clk/mvebu/armada-xp.c +@@ -202,7 +202,9 @@ static void __init axp_clk_init(struct device_node *np) + + mvebu_coreclk_setup(np, &axp_coreclks); + +- if (cgnp) ++ if (cgnp) { + mvebu_clk_gating_setup(cgnp, axp_gating_desc); ++ of_node_put(cgnp); ++ } + } + CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); +diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c +index 99550f25975e..1d2b9a1a9609 100644 +--- a/drivers/clk/mvebu/kirkwood.c ++++ b/drivers/clk/mvebu/kirkwood.c +@@ -335,6 +335,8 @@ static void __init kirkwood_clk_init(struct device_node *np) + if (cgnp) { + mvebu_clk_gating_setup(cgnp, kirkwood_gating_desc); + kirkwood_clk_muxing_setup(cgnp, kirkwood_mux_desc); ++ ++ of_node_put(cgnp); + } + } + CLK_OF_DECLARE(kirkwood_clk, "marvell,kirkwood-core-clock", +diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c +index 7f370d3e0983..6c8e45e007c8 100644 +--- a/drivers/clk/samsung/clk-exynos4.c ++++ b/drivers/clk/samsung/clk-exynos4.c +@@ -1224,6 +1224,7 @@ static unsigned long exynos4_get_xom(void) + xom = readl(chipid_base + 8); + + iounmap(chipid_base); ++ of_node_put(np); + } + + return xom; +diff --git a/drivers/clk/socfpga/clk-pll-a10.c b/drivers/clk/socfpga/clk-pll-a10.c +index 402d630bd531..623d5b77fb43 100644 +--- a/drivers/clk/socfpga/clk-pll-a10.c ++++ b/drivers/clk/socfpga/clk-pll-a10.c +@@ -95,6 +95,7 @@ static struct __init clk * __socfpga_pll_init(struct device_node *node, + + clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_a10_base_addr = of_iomap(clkmgr_np, 0); ++ of_node_put(clkmgr_np); + BUG_ON(!clk_mgr_a10_base_addr); + pll_clk->hw.reg = clk_mgr_a10_base_addr + reg; + +diff --git a/drivers/clk/socfpga/clk-pll.c b/drivers/clk/socfpga/clk-pll.c +index c7f463172e4b..b4b44e9b5901 100644 +--- a/drivers/clk/socfpga/clk-pll.c ++++ b/drivers/clk/socfpga/clk-pll.c +@@ -100,6 +100,7 @@ static __init struct clk *__socfpga_pll_init(struct device_node *node, + + clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); + clk_mgr_base_addr = of_iomap(clkmgr_np, 0); ++ of_node_put(clkmgr_np); + BUG_ON(!clk_mgr_base_addr); + pll_clk->hw.reg = clk_mgr_base_addr + reg; + +diff --git a/drivers/clocksource/timer-sun5i.c b/drivers/clocksource/timer-sun5i.c +index bca9573e036a..32b2dab69fd7 100644 +--- a/drivers/clocksource/timer-sun5i.c ++++ b/drivers/clocksource/timer-sun5i.c +@@ -201,6 +201,11 @@ static int __init sun5i_setup_clocksource(struct device_node *node, + } + + rate = clk_get_rate(clk); ++ if (!rate) { ++ pr_err("Couldn't get parent clock rate\n"); ++ ret = -EINVAL; ++ goto err_disable_clk; ++ } + + cs->timer.base = base; + cs->timer.clk = clk; +@@ -274,6 +279,11 @@ static int __init sun5i_setup_clockevent(struct device_node *node, void __iomem + } + + rate = clk_get_rate(clk); ++ if (!rate) { ++ pr_err("Couldn't get parent clock rate\n"); ++ ret = -EINVAL; ++ goto err_disable_clk; ++ } + + ce->timer.base = base; + ce->timer.ticks_per_jiffy = DIV_ROUND_UP(rate, HZ); +diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c +index 9b92af2c7241..a77319bf221d 100644 +--- a/drivers/crypto/caam/caamrng.c ++++ b/drivers/crypto/caam/caamrng.c +@@ -361,7 +361,10 @@ static int __init caam_rng_init(void) + goto free_rng_ctx; + + dev_info(dev, "registering rng-caam\n"); +- return hwrng_register(&caam_rng); ++ ++ err = hwrng_register(&caam_rng); ++ if (!err) ++ return err; + + free_rng_ctx: + kfree(rng_ctx); +diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c +index 5b2395e7e04d..6de3d2142c7d 100644 +--- a/drivers/dma/dma-axi-dmac.c ++++ b/drivers/dma/dma-axi-dmac.c +@@ -441,7 +441,7 @@ static struct dma_async_tx_descriptor *axi_dmac_prep_interleaved( + + if (chan->hw_2d) { + if (!axi_dmac_check_len(chan, xt->sgl[0].size) || +- !axi_dmac_check_len(chan, xt->numf)) ++ xt->numf == 0) + return NULL; + if (xt->sgl[0].size + dst_icg > chan->max_length || + xt->sgl[0].size + src_icg > chan->max_length) +diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c +index 68a4815750b5..22d0cc1855b5 100644 +--- a/drivers/dma/dw/platform.c ++++ b/drivers/dma/dw/platform.c +@@ -87,13 +87,20 @@ static void dw_dma_acpi_controller_register(struct dw_dma *dw) + dma_cap_set(DMA_SLAVE, info->dma_cap); + info->filter_fn = dw_dma_acpi_filter; + +- ret = devm_acpi_dma_controller_register(dev, acpi_dma_simple_xlate, +- info); ++ ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info); + if (ret) + dev_err(dev, "could not register acpi_dma_controller\n"); + } ++ ++static void dw_dma_acpi_controller_free(struct dw_dma *dw) ++{ ++ struct device *dev = dw->dma.dev; ++ ++ acpi_dma_controller_free(dev); ++} + #else /* !CONFIG_ACPI */ + static inline void dw_dma_acpi_controller_register(struct dw_dma *dw) {} ++static inline void dw_dma_acpi_controller_free(struct dw_dma *dw) {} + #endif /* !CONFIG_ACPI */ + + #ifdef CONFIG_OF +@@ -225,6 +232,9 @@ static int dw_remove(struct platform_device *pdev) + { + struct dw_dma_chip *chip = platform_get_drvdata(pdev); + ++ if (ACPI_HANDLE(&pdev->dev)) ++ dw_dma_acpi_controller_free(chip->dw); ++ + if (pdev->dev.of_node) + of_dma_controller_free(pdev->dev.of_node); + +diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c +index e508c8c5f3fd..17521fcf226f 100644 +--- a/drivers/dma/edma.c ++++ b/drivers/dma/edma.c +@@ -2288,8 +2288,10 @@ static int edma_probe(struct platform_device *pdev) + + ecc->tc_list = devm_kcalloc(dev, ecc->num_tc, + sizeof(*ecc->tc_list), GFP_KERNEL); +- if (!ecc->tc_list) +- return -ENOMEM; ++ if (!ecc->tc_list) { ++ ret = -ENOMEM; ++ goto err_reg1; ++ } + + for (i = 0;; i++) { + ret = of_parse_phandle_with_fixed_args(node, "ti,tptcs", +diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c +index dd97dbf6618c..1dc06e0e890f 100644 +--- a/drivers/dma/imx-sdma.c ++++ b/drivers/dma/imx-sdma.c +@@ -1411,6 +1411,14 @@ static void sdma_add_scripts(struct sdma_engine *sdma, + if (!sdma->script_number) + sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; + ++ if (sdma->script_number > sizeof(struct sdma_script_start_addrs) ++ / sizeof(s32)) { ++ dev_err(sdma->dev, ++ "SDMA script number %d not match with firmware.\n", ++ sdma->script_number); ++ return; ++ } ++ + for (i = 0; i < sdma->script_number; i++) + if (addr_arr[i] > 0) + saddr_arr[i] = addr_arr[i]; +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index 2cb924ffd5a3..4d0f77f0edad 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -975,9 +975,20 @@ static struct drm_dp_mst_port *drm_dp_mst_get_port_ref_locked(struct drm_dp_mst_ + static struct drm_dp_mst_port *drm_dp_get_validated_port_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) + { + struct drm_dp_mst_port *rport = NULL; ++ + mutex_lock(&mgr->lock); +- if (mgr->mst_primary) +- rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, port); ++ /* ++ * Port may or may not be 'valid' but we don't care about that when ++ * destroying the port and we are guaranteed that the port pointer ++ * will be valid until we've finished ++ */ ++ if (current_work() == &mgr->destroy_connector_work) { ++ kref_get(&port->kref); ++ rport = port; ++ } else if (mgr->mst_primary) { ++ rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, ++ port); ++ } + mutex_unlock(&mgr->lock); + return rport; + } +diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +index fd266ed963b6..25a0e7d13340 100644 +--- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +@@ -383,19 +383,17 @@ static const unsigned int a3xx_registers[] = { + 0x2200, 0x2212, 0x2214, 0x2217, 0x221a, 0x221a, 0x2240, 0x227e, + 0x2280, 0x228b, 0x22c0, 0x22c0, 0x22c4, 0x22ce, 0x22d0, 0x22d8, + 0x22df, 0x22e6, 0x22e8, 0x22e9, 0x22ec, 0x22ec, 0x22f0, 0x22f7, +- 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2348, 0x2349, 0x2350, 0x2356, +- 0x2360, 0x2360, 0x2440, 0x2440, 0x2444, 0x2444, 0x2448, 0x244d, +- 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, 0x2472, 0x2472, +- 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, 0x24e4, 0x24ef, +- 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, 0x2510, 0x2511, +- 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, 0x25ec, 0x25ed, +- 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, 0x261a, 0x261a, +- 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, 0x26c4, 0x26ce, +- 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, 0x26ec, 0x26ec, +- 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, 0x2748, 0x2749, +- 0x2750, 0x2756, 0x2760, 0x2760, 0x300c, 0x300e, 0x301c, 0x301d, +- 0x302a, 0x302a, 0x302c, 0x302d, 0x3030, 0x3031, 0x3034, 0x3036, +- 0x303c, 0x303c, 0x305e, 0x305f, ++ 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2440, 0x2440, 0x2444, 0x2444, ++ 0x2448, 0x244d, 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, ++ 0x2472, 0x2472, 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, ++ 0x24e4, 0x24ef, 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, ++ 0x2510, 0x2511, 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, ++ 0x25ec, 0x25ed, 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, ++ 0x261a, 0x261a, 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, ++ 0x26c4, 0x26ce, 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, ++ 0x26ec, 0x26ec, 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, ++ 0x300c, 0x300e, 0x301c, 0x301d, 0x302a, 0x302a, 0x302c, 0x302d, ++ 0x3030, 0x3031, 0x3034, 0x3036, 0x303c, 0x303c, 0x305e, 0x305f, + ~0 /* sentinel */ + }; + +diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c +index 4c49868efcda..12ddbbb53107 100644 +--- a/drivers/gpu/drm/msm/dsi/dsi_host.c ++++ b/drivers/gpu/drm/msm/dsi/dsi_host.c +@@ -30,6 +30,8 @@ + #include "dsi.xml.h" + #include "dsi_cfg.h" + ++#define DSI_RESET_TOGGLE_DELAY_MS 20 ++ + static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor) + { + u32 ver; +@@ -764,7 +766,7 @@ static void dsi_sw_reset(struct msm_dsi_host *msm_host) + wmb(); /* clocks need to be enabled before reset */ + + dsi_write(msm_host, REG_DSI_RESET, 1); +- wmb(); /* make sure reset happen */ ++ msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ + dsi_write(msm_host, REG_DSI_RESET, 0); + } + +@@ -1111,7 +1113,7 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) + + /* dsi controller can only be reset while clocks are running */ + dsi_write(msm_host, REG_DSI_RESET, 1); +- wmb(); /* make sure reset happen */ ++ msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ + dsi_write(msm_host, REG_DSI_RESET, 0); + wmb(); /* controller out of reset */ + dsi_write(msm_host, REG_DSI_CTRL, data0); +diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +index bb1225aa2f75..89305ad3cde2 100644 +--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c ++++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +@@ -547,7 +547,7 @@ fail: + if (cfg_handler) + mdp5_cfg_destroy(cfg_handler); + +- return NULL; ++ return ERR_PTR(ret); + } + + static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev) +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +index 60ece0a8a2e1..1d2d6bae73cd 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +@@ -87,7 +87,7 @@ nvkm_gddr3_calc(struct nvkm_ram *ram) + WR = (ram->next->bios.timing[2] & 0x007f0000) >> 16; + /* XXX: Get these values from the VBIOS instead */ + DLL = !(ram->mr[1] & 0x1); +- RON = !(ram->mr[1] & 0x300) >> 8; ++ RON = !((ram->mr[1] & 0x300) >> 8); + break; + default: + return -ENOSYS; +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +index e6f74168238c..2ef9e942f43a 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +@@ -87,10 +87,10 @@ nvkm_memx_fini(struct nvkm_memx **pmemx, bool exec) + if (exec) { + nvkm_pmu_send(pmu, reply, PROC_MEMX, MEMX_MSG_EXEC, + memx->base, finish); ++ nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", ++ reply[0], reply[1]); + } + +- nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", +- reply[0], reply[1]); + kfree(memx); + return 0; + } +diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c +index 80b6d6e4721a..7acde09c8e8f 100644 +--- a/drivers/gpu/drm/radeon/cik.c ++++ b/drivers/gpu/drm/radeon/cik.c +@@ -7372,8 +7372,8 @@ static int cik_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* XXX this should actually be a bus address, not an MC address. same on older asics */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c +index 0e20c08f8977..2056224d0b3c 100644 +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -3647,8 +3647,8 @@ int r600_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* set dummy read address to ring address */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c +index 5cf3a2cbc07e..4128c98d9054 100644 +--- a/drivers/gpu/drm/radeon/si.c ++++ b/drivers/gpu/drm/radeon/si.c +@@ -6013,8 +6013,8 @@ static int si_irq_init(struct radeon_device *rdev) + } + + /* setup interrupt control */ +- /* set dummy read address to ring address */ +- WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); ++ /* set dummy read address to dummy page address */ ++ WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); + interrupt_cntl = RREG32(INTERRUPT_CNTL); + /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi + * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN +diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c +index a1b3ea1ccb65..772a5a3b0ce1 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_vq.c ++++ b/drivers/gpu/drm/virtio/virtgpu_vq.c +@@ -681,11 +681,11 @@ int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, + { + struct virtio_gpu_get_capset *cmd_p; + struct virtio_gpu_vbuffer *vbuf; +- int max_size = vgdev->capsets[idx].max_size; ++ int max_size; + struct virtio_gpu_drv_cap_cache *cache_ent; + void *resp_buf; + +- if (idx > vgdev->num_capsets) ++ if (idx >= vgdev->num_capsets) + return -EINVAL; + + if (version > vgdev->capsets[idx].max_version) +@@ -695,6 +695,7 @@ int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev, + if (!cache_ent) + return -ENOMEM; + ++ max_size = vgdev->capsets[idx].max_size; + cache_ent->caps_cache = kmalloc(max_size, GFP_KERNEL); + if (!cache_ent->caps_cache) { + kfree(cache_ent); +diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c +index 9c262d955331..d2583caa8087 100644 +--- a/drivers/hwmon/adt7475.c ++++ b/drivers/hwmon/adt7475.c +@@ -268,9 +268,10 @@ static inline u16 volt2reg(int channel, long volt, u8 bypass_attn) + long reg; + + if (bypass_attn & (1 << channel)) +- reg = (volt * 1024) / 2250; ++ reg = DIV_ROUND_CLOSEST(volt * 1024, 2250); + else +- reg = (volt * r[1] * 1024) / ((r[0] + r[1]) * 2250); ++ reg = DIV_ROUND_CLOSEST(volt * r[1] * 1024, ++ (r[0] + r[1]) * 2250); + return clamp_val(reg, 0, 1023) & (0xff << 2); + } + +diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c +index 7f8738a83cb9..40addb213bdf 100644 +--- a/drivers/hwmon/nct7802.c ++++ b/drivers/hwmon/nct7802.c +@@ -32,8 +32,8 @@ + static const u8 REG_VOLTAGE[5] = { 0x09, 0x0a, 0x0c, 0x0d, 0x0e }; + + static const u8 REG_VOLTAGE_LIMIT_LSB[2][5] = { +- { 0x40, 0x00, 0x42, 0x44, 0x46 }, +- { 0x3f, 0x00, 0x41, 0x43, 0x45 }, ++ { 0x46, 0x00, 0x40, 0x42, 0x44 }, ++ { 0x45, 0x00, 0x3f, 0x41, 0x43 }, + }; + + static const u8 REG_VOLTAGE_LIMIT_MSB[5] = { 0x48, 0x00, 0x47, 0x47, 0x48 }; +diff --git a/drivers/hwmon/shtc1.c b/drivers/hwmon/shtc1.c +index decd7df995ab..2a18539591ea 100644 +--- a/drivers/hwmon/shtc1.c ++++ b/drivers/hwmon/shtc1.c +@@ -38,7 +38,7 @@ static const unsigned char shtc1_cmd_read_id_reg[] = { 0xef, 0xc8 }; + + /* constants for reading the ID register */ + #define SHTC1_ID 0x07 +-#define SHTC1_ID_REG_MASK 0x1f ++#define SHTC1_ID_REG_MASK 0x3f + + /* delays for non-blocking i2c commands, both in us */ + #define SHTC1_NONBLOCKING_WAIT_TIME_HPM 14400 +diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c +index 721295b9a051..43c0f89cefdf 100644 +--- a/drivers/hwmon/w83627hf.c ++++ b/drivers/hwmon/w83627hf.c +@@ -130,17 +130,23 @@ superio_select(struct w83627hf_sio_data *sio, int ld) + outb(ld, sio->sioaddr + 1); + } + +-static inline void ++static inline int + superio_enter(struct w83627hf_sio_data *sio) + { ++ if (!request_muxed_region(sio->sioaddr, 2, DRVNAME)) ++ return -EBUSY; ++ + outb(0x87, sio->sioaddr); + outb(0x87, sio->sioaddr); ++ ++ return 0; + } + + static inline void + superio_exit(struct w83627hf_sio_data *sio) + { + outb(0xAA, sio->sioaddr); ++ release_region(sio->sioaddr, 2); + } + + #define W627_DEVID 0x52 +@@ -1275,7 +1281,7 @@ static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); + static int __init w83627hf_find(int sioaddr, unsigned short *addr, + struct w83627hf_sio_data *sio_data) + { +- int err = -ENODEV; ++ int err; + u16 val; + + static __initconst char *const names[] = { +@@ -1287,7 +1293,11 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, + }; + + sio_data->sioaddr = sioaddr; +- superio_enter(sio_data); ++ err = superio_enter(sio_data); ++ if (err) ++ return err; ++ ++ err = -ENODEV; + val = force_id ? force_id : superio_inb(sio_data, DEVID); + switch (val) { + case W627_DEVID: +@@ -1641,9 +1651,21 @@ static int w83627thf_read_gpio5(struct platform_device *pdev) + struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); + int res = 0xff, sel; + +- superio_enter(sio_data); ++ if (superio_enter(sio_data)) { ++ /* ++ * Some other driver reserved the address space for itself. ++ * We don't want to fail driver instantiation because of that, ++ * so display a warning and keep going. ++ */ ++ dev_warn(&pdev->dev, ++ "Can not read VID data: Failed to enable SuperIO access\n"); ++ return res; ++ } ++ + superio_select(sio_data, W83627HF_LD_GPIO5); + ++ res = 0xff; ++ + /* Make sure these GPIO pins are enabled */ + if (!(superio_inb(sio_data, W83627THF_GPIO5_EN) & (1<<3))) { + dev_dbg(&pdev->dev, "GPIO5 disabled, no VID function\n"); +@@ -1674,7 +1696,17 @@ static int w83687thf_read_vid(struct platform_device *pdev) + struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); + int res = 0xff; + +- superio_enter(sio_data); ++ if (superio_enter(sio_data)) { ++ /* ++ * Some other driver reserved the address space for itself. ++ * We don't want to fail driver instantiation because of that, ++ * so display a warning and keep going. ++ */ ++ dev_warn(&pdev->dev, ++ "Can not read VID data: Failed to enable SuperIO access\n"); ++ return res; ++ } ++ + superio_select(sio_data, W83627HF_LD_HWM); + + /* Make sure these GPIO pins are enabled */ +diff --git a/drivers/iio/dac/ad5380.c b/drivers/iio/dac/ad5380.c +index 97d2c5111f43..8bf7fc626a9d 100644 +--- a/drivers/iio/dac/ad5380.c ++++ b/drivers/iio/dac/ad5380.c +@@ -221,7 +221,7 @@ static int ad5380_read_raw(struct iio_dev *indio_dev, + if (ret) + return ret; + *val >>= chan->scan_type.shift; +- val -= (1 << chan->scan_type.realbits) / 2; ++ *val -= (1 << chan->scan_type.realbits) / 2; + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + *val = 2 * st->vref; +diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c +index 961afb5588be..864a61b05665 100644 +--- a/drivers/iio/industrialio-buffer.c ++++ b/drivers/iio/industrialio-buffer.c +@@ -527,7 +527,7 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + { + const struct iio_chan_spec *ch; + unsigned bytes = 0; +- int length, i; ++ int length, i, largest = 0; + + /* How much space will the demuxed element take? */ + for_each_set_bit(i, mask, +@@ -540,6 +540,7 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + length = ch->scan_type.storagebits / 8; + bytes = ALIGN(bytes, length); + bytes += length; ++ largest = max(largest, length); + } + if (timestamp) { + ch = iio_find_channel_from_si(indio_dev, +@@ -551,7 +552,10 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, + length = ch->scan_type.storagebits / 8; + bytes = ALIGN(bytes, length); + bytes += length; ++ largest = max(largest, length); + } ++ ++ bytes = ALIGN(bytes, largest); + return bytes; + } + +diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c +index 43d277a931c2..eac5f5eff8d2 100644 +--- a/drivers/infiniband/hw/mlx5/qp.c ++++ b/drivers/infiniband/hw/mlx5/qp.c +@@ -1426,6 +1426,11 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_PKEY_INDEX | + MLX5_QP_OPTPAR_Q_KEY | + MLX5_QP_OPTPAR_PRI_PORT, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_PKEY_INDEX | ++ MLX5_QP_OPTPAR_PRI_PORT, + }, + [MLX5_QP_STATE_RTR] = { + [MLX5_QP_ST_RC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | +@@ -1459,6 +1464,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_PM_STATE, + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | ++ MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_PM_STATE | ++ MLX5_QP_OPTPAR_RNR_TIMEOUT, + }, + }, + [MLX5_QP_STATE_RTS] = { +@@ -1475,6 +1486,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY | + MLX5_QP_OPTPAR_SRQN | + MLX5_QP_OPTPAR_CQN_RCV, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_RNR_TIMEOUT | ++ MLX5_QP_OPTPAR_PM_STATE | ++ MLX5_QP_OPTPAR_ALT_ADDR_PATH, + }, + }, + [MLX5_QP_STATE_SQER] = { +@@ -1486,6 +1503,10 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_RAE | + MLX5_QP_OPTPAR_RRE, ++ [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RNR_TIMEOUT | ++ MLX5_QP_OPTPAR_RWE | ++ MLX5_QP_OPTPAR_RAE | ++ MLX5_QP_OPTPAR_RRE, + }, + }, + }; +diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +index 76e96f97b3f6..6385448b22c5 100644 +--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c ++++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +@@ -55,7 +55,7 @@ + + int ocrdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) + { +- if (index > 1) ++ if (index > 0) + return -EINVAL; + + *pkey = 0xffff; +diff --git a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +index f8e3211689a3..8e18bfca5516 100644 +--- a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c ++++ b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c +@@ -427,7 +427,7 @@ int usnic_ib_query_gid(struct ib_device *ibdev, u8 port, int index, + int usnic_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, + u16 *pkey) + { +- if (index > 1) ++ if (index > 0) + return -EINVAL; + + *pkey = 0xffff; +diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c +index 0b7f5a701c60..32ef17e1aef8 100644 +--- a/drivers/infiniband/ulp/isert/ib_isert.c ++++ b/drivers/infiniband/ulp/isert/ib_isert.c +@@ -3277,17 +3277,6 @@ isert_wait4logout(struct isert_conn *isert_conn) + } + } + +-static void +-isert_wait4cmds(struct iscsi_conn *conn) +-{ +- isert_info("iscsi_conn %p\n", conn); +- +- if (conn->sess) { +- target_sess_cmd_list_set_waiting(conn->sess->se_sess); +- target_wait_for_sess_cmds(conn->sess->se_sess); +- } +-} +- + static void + isert_wait4flush(struct isert_conn *isert_conn) + { +@@ -3361,7 +3350,6 @@ static void isert_wait_conn(struct iscsi_conn *conn) + + isert_wait4flush(isert_conn); + isert_put_unsol_pending_cmds(conn); +- isert_wait4cmds(conn); + isert_wait4logout(isert_conn); + + queue_work(isert_release_wq, &isert_conn->release_work); +diff --git a/drivers/input/keyboard/nomadik-ske-keypad.c b/drivers/input/keyboard/nomadik-ske-keypad.c +index 8567ee47761e..ae3b04557074 100644 +--- a/drivers/input/keyboard/nomadik-ske-keypad.c ++++ b/drivers/input/keyboard/nomadik-ske-keypad.c +@@ -100,7 +100,7 @@ static int __init ske_keypad_chip_init(struct ske_keypad *keypad) + while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) + cpu_relax(); + +- if (!timeout) ++ if (timeout == -1) + return -EINVAL; + + /* +diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c +index a3fe4a990cc9..c7b889d13edd 100644 +--- a/drivers/input/misc/keyspan_remote.c ++++ b/drivers/input/misc/keyspan_remote.c +@@ -344,7 +344,8 @@ static int keyspan_setup(struct usb_device* dev) + int retval = 0; + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); ++ 0x11, 0x40, 0x5601, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", + __func__, retval); +@@ -352,7 +353,8 @@ static int keyspan_setup(struct usb_device* dev) + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); ++ 0x44, 0x40, 0x0, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", + __func__, retval); +@@ -360,7 +362,8 @@ static int keyspan_setup(struct usb_device* dev) + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), +- 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); ++ 0x22, 0x40, 0x0, 0x0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", + __func__, retval); +diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c +index 78ca44840d60..40a166773c1b 100644 +--- a/drivers/input/tablet/aiptek.c ++++ b/drivers/input/tablet/aiptek.c +@@ -1820,14 +1820,14 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) + input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0); + + /* Verify that a device really has an endpoint */ +- if (intf->altsetting[0].desc.bNumEndpoints < 1) { ++ if (intf->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&intf->dev, + "interface has %d endpoints, but must have minimum 1\n", +- intf->altsetting[0].desc.bNumEndpoints); ++ intf->cur_altsetting->desc.bNumEndpoints); + err = -EINVAL; + goto fail3; + } +- endpoint = &intf->altsetting[0].endpoint[0].desc; ++ endpoint = &intf->cur_altsetting->endpoint[0].desc; + + /* Go set up our URB, which is called when the tablet receives + * input. +diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c +index 5a0e4cd86353..67dc17c8bba9 100644 +--- a/drivers/input/tablet/gtco.c ++++ b/drivers/input/tablet/gtco.c +@@ -876,18 +876,14 @@ static int gtco_probe(struct usb_interface *usbinterface, + } + + /* Sanity check that a device has an endpoint */ +- if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) { ++ if (usbinterface->cur_altsetting->desc.bNumEndpoints < 1) { + dev_err(&usbinterface->dev, + "Invalid number of endpoints\n"); + error = -EINVAL; + goto err_free_urb; + } + +- /* +- * The endpoint is always altsetting 0, we know this since we know +- * this device only has one interrupt endpoint +- */ +- endpoint = &usbinterface->altsetting[0].endpoint[0].desc; ++ endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; + + /* Some debug */ + dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting); +@@ -974,7 +970,7 @@ static int gtco_probe(struct usb_interface *usbinterface, + input_dev->dev.parent = &usbinterface->dev; + + /* Setup the URB, it will be posted later on open of input device */ +- endpoint = &usbinterface->altsetting[0].endpoint[0].desc; ++ endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; + + usb_fill_int_urb(gtco->urbinfo, + gtco->usbdev, +diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c +index 0146e2c74649..6178e28baaba 100644 +--- a/drivers/input/touchscreen/sur40.c ++++ b/drivers/input/touchscreen/sur40.c +@@ -496,7 +496,7 @@ static int sur40_probe(struct usb_interface *interface, + int error; + + /* Check if we really have the right interface. */ +- iface_desc = &interface->altsetting[0]; ++ iface_desc = interface->cur_altsetting; + if (iface_desc->desc.bInterfaceClass != 0xFF) + return -ENODEV; + +diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c +index 0ad8b7c78a43..66a406e87e11 100644 +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -2184,6 +2184,8 @@ static int attach_device(struct device *dev, + */ + domain_flush_tlb_pde(domain); + ++ domain_flush_complete(domain); ++ + return ret; + } + +diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c +index 6a69b5bb231f..036fb186a3be 100644 +--- a/drivers/iommu/amd_iommu_init.c ++++ b/drivers/iommu/amd_iommu_init.c +@@ -360,6 +360,9 @@ static void iommu_enable(struct amd_iommu *iommu) + + static void iommu_disable(struct amd_iommu *iommu) + { ++ if (!iommu->mmio_base) ++ return; ++ + /* Disable command buffer */ + iommu_feature_disable(iommu, CONTROL_CMDBUF_EN); + +diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c +index b965561a4162..a2005b82ec8f 100644 +--- a/drivers/iommu/intel-iommu.c ++++ b/drivers/iommu/intel-iommu.c +@@ -3259,9 +3259,12 @@ static int __init init_dmars(void) + iommu_identity_mapping |= IDENTMAP_ALL; + + #ifdef CONFIG_INTEL_IOMMU_BROKEN_GFX_WA +- iommu_identity_mapping |= IDENTMAP_GFX; ++ dmar_map_gfx = 0; + #endif + ++ if (!dmar_map_gfx) ++ iommu_identity_mapping |= IDENTMAP_GFX; ++ + check_tylersburg_isoch(); + + if (iommu_identity_mapping) { +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index 5d5066cf3bbd..589207176ffa 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -1594,9 +1594,9 @@ int iommu_request_dm_for_dev(struct device *dev) + int ret; + + /* Device must already be in a group before calling this function */ +- group = iommu_group_get_for_dev(dev); +- if (IS_ERR(group)) +- return PTR_ERR(group); ++ group = iommu_group_get(dev); ++ if (!group) ++ return -EINVAL; + + mutex_lock(&group->mutex); + +diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c +index 7a50728b9389..391090c455ce 100644 +--- a/drivers/md/bitmap.c ++++ b/drivers/md/bitmap.c +@@ -1671,7 +1671,7 @@ void bitmap_flush(struct mddev *mddev) + /* + * free memory that was allocated + */ +-static void bitmap_free(struct bitmap *bitmap) ++static void md_bitmap_free(struct bitmap *bitmap) + { + unsigned long k, pages; + struct bitmap_page *bp; +@@ -1721,7 +1721,7 @@ void bitmap_destroy(struct mddev *mddev) + if (bitmap->sysfs_can_clear) + sysfs_put(bitmap->sysfs_can_clear); + +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + } + + /* +@@ -1805,7 +1805,7 @@ struct bitmap *bitmap_create(struct mddev *mddev, int slot) + + return bitmap; + error: +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return ERR_PTR(err); + } + +@@ -1904,7 +1904,7 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot, + *low = lo; + *high = hi; + err: +- bitmap_free(bitmap); ++ md_bitmap_free(bitmap); + return rv; + } + EXPORT_SYMBOL_GPL(bitmap_copy_from_slot); +diff --git a/drivers/media/i2c/ov2659.c b/drivers/media/i2c/ov2659.c +index 6eefb8bbb5b5..20e3c56991cf 100644 +--- a/drivers/media/i2c/ov2659.c ++++ b/drivers/media/i2c/ov2659.c +@@ -1137,7 +1137,7 @@ static int ov2659_set_fmt(struct v4l2_subdev *sd, + mf = v4l2_subdev_get_try_format(sd, cfg, fmt->pad); + *mf = fmt->format; + #else +- return -ENOTTY; ++ ret = -ENOTTY; + #endif + } else { + s64 val; +diff --git a/drivers/media/i2c/soc_camera/ov6650.c b/drivers/media/i2c/soc_camera/ov6650.c +index bb55ddfbf733..7928ea8528e1 100644 +--- a/drivers/media/i2c/soc_camera/ov6650.c ++++ b/drivers/media/i2c/soc_camera/ov6650.c +@@ -203,7 +203,6 @@ struct ov6650 { + unsigned long pclk_max; /* from resolution and format */ + struct v4l2_fract tpf; /* as requested with s_parm */ + u32 code; +- enum v4l2_colorspace colorspace; + }; + + +@@ -216,6 +215,17 @@ static u32 ov6650_codes[] = { + MEDIA_BUS_FMT_Y8_1X8, + }; + ++static const struct v4l2_mbus_framefmt ov6650_def_fmt = { ++ .width = W_CIF, ++ .height = H_CIF, ++ .code = MEDIA_BUS_FMT_SBGGR8_1X8, ++ .colorspace = V4L2_COLORSPACE_SRGB, ++ .field = V4L2_FIELD_NONE, ++ .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT, ++ .quantization = V4L2_QUANTIZATION_DEFAULT, ++ .xfer_func = V4L2_XFER_FUNC_DEFAULT, ++}; ++ + /* read a register */ + static int ov6650_reg_read(struct i2c_client *client, u8 reg, u8 *val) + { +@@ -510,12 +520,20 @@ static int ov6650_get_fmt(struct v4l2_subdev *sd, + if (format->pad) + return -EINVAL; + +- mf->width = priv->rect.width >> priv->half_scale; +- mf->height = priv->rect.height >> priv->half_scale; +- mf->code = priv->code; +- mf->colorspace = priv->colorspace; +- mf->field = V4L2_FIELD_NONE; ++ /* initialize response with default media bus frame format */ ++ *mf = ov6650_def_fmt; + ++ /* update media bus format code and frame size */ ++ if (format->which == V4L2_SUBDEV_FORMAT_TRY) { ++ mf->width = cfg->try_fmt.width; ++ mf->height = cfg->try_fmt.height; ++ mf->code = cfg->try_fmt.code; ++ ++ } else { ++ mf->width = priv->rect.width >> priv->half_scale; ++ mf->height = priv->rect.height >> priv->half_scale; ++ mf->code = priv->code; ++ } + return 0; + } + +@@ -623,11 +641,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) + priv->pclk_max = 8000000; + } + +- if (code == MEDIA_BUS_FMT_SBGGR8_1X8) +- priv->colorspace = V4L2_COLORSPACE_SRGB; +- else if (code != 0) +- priv->colorspace = V4L2_COLORSPACE_JPEG; +- + if (half_scale) { + dev_dbg(&client->dev, "max resolution: QCIF\n"); + coma_set |= COMA_QCIF; +@@ -683,11 +696,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) + if (!ret) + priv->code = code; + +- if (!ret) { +- mf->colorspace = priv->colorspace; +- mf->width = priv->rect.width >> half_scale; +- mf->height = priv->rect.height >> half_scale; +- } + return ret; + } + +@@ -706,8 +714,6 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd, + v4l_bound_align_image(&mf->width, 2, W_CIF, 1, + &mf->height, 2, H_CIF, 1, 0); + +- mf->field = V4L2_FIELD_NONE; +- + switch (mf->code) { + case MEDIA_BUS_FMT_Y10_1X10: + mf->code = MEDIA_BUS_FMT_Y8_1X8; +@@ -716,19 +722,38 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd, + case MEDIA_BUS_FMT_YUYV8_2X8: + case MEDIA_BUS_FMT_VYUY8_2X8: + case MEDIA_BUS_FMT_UYVY8_2X8: +- mf->colorspace = V4L2_COLORSPACE_JPEG; + break; + default: + mf->code = MEDIA_BUS_FMT_SBGGR8_1X8; + case MEDIA_BUS_FMT_SBGGR8_1X8: +- mf->colorspace = V4L2_COLORSPACE_SRGB; + break; + } + +- if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) +- return ov6650_s_fmt(sd, mf); +- cfg->try_fmt = *mf; ++ if (format->which == V4L2_SUBDEV_FORMAT_TRY) { ++ /* store media bus format code and frame size in pad config */ ++ cfg->try_fmt.width = mf->width; ++ cfg->try_fmt.height = mf->height; ++ cfg->try_fmt.code = mf->code; + ++ /* return default mbus frame format updated with pad config */ ++ *mf = ov6650_def_fmt; ++ mf->width = cfg->try_fmt.width; ++ mf->height = cfg->try_fmt.height; ++ mf->code = cfg->try_fmt.code; ++ ++ } else { ++ /* apply new media bus format code and frame size */ ++ int ret = ov6650_s_fmt(sd, mf); ++ ++ if (ret) ++ return ret; ++ ++ /* return default format updated with active size and code */ ++ *mf = ov6650_def_fmt; ++ mf->width = priv->rect.width >> priv->half_scale; ++ mf->height = priv->rect.height >> priv->half_scale; ++ mf->code = priv->code; ++ } + return 0; + } + +@@ -1048,7 +1073,6 @@ static int ov6650_probe(struct i2c_client *client, + priv->rect.height = H_CIF; + priv->half_scale = false; + priv->code = MEDIA_BUS_FMT_YUYV8_2X8; +- priv->colorspace = V4L2_COLORSPACE_JPEG; + + ret = ov6650_video_probe(client); + if (ret) +diff --git a/drivers/media/pci/cx18/cx18-fileops.c b/drivers/media/pci/cx18/cx18-fileops.c +index df837408efd5..0171dc5b8809 100644 +--- a/drivers/media/pci/cx18/cx18-fileops.c ++++ b/drivers/media/pci/cx18/cx18-fileops.c +@@ -490,7 +490,7 @@ static ssize_t cx18_read_pos(struct cx18_stream *s, char __user *ubuf, + + CX18_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); + if (rc > 0) +- pos += rc; ++ *pos += rc; + return rc; + } + +diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c +index e543cbbf2ec4..8fe78b8b1c25 100644 +--- a/drivers/media/pci/cx23885/cx23885-dvb.c ++++ b/drivers/media/pci/cx23885/cx23885-dvb.c +@@ -1452,8 +1452,9 @@ static int dvb_register(struct cx23885_tsport *port) + if (fe0->dvb.frontend != NULL) { + struct i2c_adapter *tun_i2c; + +- fe0->dvb.frontend->sec_priv = kmalloc(sizeof(dib7000p_ops), GFP_KERNEL); +- memcpy(fe0->dvb.frontend->sec_priv, &dib7000p_ops, sizeof(dib7000p_ops)); ++ fe0->dvb.frontend->sec_priv = kmemdup(&dib7000p_ops, sizeof(dib7000p_ops), GFP_KERNEL); ++ if (!fe0->dvb.frontend->sec_priv) ++ return -ENOMEM; + tun_i2c = dib7000p_ops.get_i2c_master(fe0->dvb.frontend, DIBX000_I2C_INTERFACE_TUNER, 1); + if (!dvb_attach(dib0070_attach, fe0->dvb.frontend, tun_i2c, &dib7070p_dib0070_config)) + return -ENODEV; +diff --git a/drivers/media/pci/ivtv/ivtv-fileops.c b/drivers/media/pci/ivtv/ivtv-fileops.c +index 605d280d8a5f..cb65fe6c49e0 100644 +--- a/drivers/media/pci/ivtv/ivtv-fileops.c ++++ b/drivers/media/pci/ivtv/ivtv-fileops.c +@@ -420,7 +420,7 @@ static ssize_t ivtv_read_pos(struct ivtv_stream *s, char __user *ubuf, size_t co + + IVTV_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); + if (rc > 0) +- pos += rc; ++ *pos += rc; + return rc; + } + +diff --git a/drivers/media/platform/davinci/isif.c b/drivers/media/platform/davinci/isif.c +index 78e37cf3470f..b51b875c5a61 100644 +--- a/drivers/media/platform/davinci/isif.c ++++ b/drivers/media/platform/davinci/isif.c +@@ -890,9 +890,7 @@ static int isif_set_hw_if_params(struct vpfe_hw_if_param *params) + static int isif_config_ycbcr(void) + { + struct isif_ycbcr_config *params = &isif_cfg.ycbcr; +- struct vpss_pg_frame_size frame_size; + u32 modeset = 0, ccdcfg = 0; +- struct vpss_sync_pol sync; + + dev_dbg(isif_cfg.dev, "\nStarting isif_config_ycbcr..."); + +@@ -980,13 +978,6 @@ static int isif_config_ycbcr(void) + /* two fields are interleaved in memory */ + regw(0x00000249, SDOFST); + +- /* Setup test pattern if enabled */ +- if (isif_cfg.bayer.config_params.test_pat_gen) { +- sync.ccdpg_hdpol = params->hd_pol; +- sync.ccdpg_vdpol = params->vd_pol; +- dm365_vpss_set_sync_pol(sync); +- dm365_vpss_set_pg_frame_size(frame_size); +- } + return 0; + } + +diff --git a/drivers/media/platform/davinci/vpbe.c b/drivers/media/platform/davinci/vpbe.c +index abce9c4a1a8e..59518c08528b 100644 +--- a/drivers/media/platform/davinci/vpbe.c ++++ b/drivers/media/platform/davinci/vpbe.c +@@ -130,7 +130,7 @@ static int vpbe_enum_outputs(struct vpbe_device *vpbe_dev, + struct v4l2_output *output) + { + struct vpbe_config *cfg = vpbe_dev->cfg; +- int temp_index = output->index; ++ unsigned int temp_index = output->index; + + if (temp_index >= cfg->num_outputs) + return -EINVAL; +diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c +index 596359576109..cf015bfc559b 100644 +--- a/drivers/media/platform/omap/omap_vout.c ++++ b/drivers/media/platform/omap/omap_vout.c +@@ -1580,23 +1580,20 @@ static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) + unsigned long size; + struct videobuf_buffer *vb; + +- vb = q->bufs[b->index]; +- + if (!vout->streaming) + return -EINVAL; + +- if (file->f_flags & O_NONBLOCK) +- /* Call videobuf_dqbuf for non blocking mode */ +- ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 1); +- else +- /* Call videobuf_dqbuf for blocking mode */ +- ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 0); ++ ret = videobuf_dqbuf(q, b, !!(file->f_flags & O_NONBLOCK)); ++ if (ret) ++ return ret; ++ ++ vb = q->bufs[b->index]; + + addr = (unsigned long) vout->buf_phy_addr[vb->i]; + size = (unsigned long) vb->size; + dma_unmap_single(vout->vid_dev->v4l2_dev.dev, addr, + size, DMA_TO_DEVICE); +- return ret; ++ return 0; + } + + static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i) +diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c +index 0d981bbf38bc..255f70999ee8 100644 +--- a/drivers/media/platform/s5p-jpeg/jpeg-core.c ++++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c +@@ -1952,7 +1952,7 @@ static int s5p_jpeg_controls_create(struct s5p_jpeg_ctx *ctx) + + v4l2_ctrl_new_std(&ctx->ctrl_handler, &s5p_jpeg_ctrl_ops, + V4L2_CID_JPEG_RESTART_INTERVAL, +- 0, 3, 0xffff, 0); ++ 0, 0xffff, 1, 0); + if (ctx->jpeg->variant->version == SJPEG_S5P) + mask = ~0x06; /* 422, 420 */ + } +diff --git a/drivers/media/platform/vivid/vivid-osd.c b/drivers/media/platform/vivid/vivid-osd.c +index e15eef6a94e5..f3afc74f98ed 100644 +--- a/drivers/media/platform/vivid/vivid-osd.c ++++ b/drivers/media/platform/vivid/vivid-osd.c +@@ -167,7 +167,7 @@ static int _vivid_fb_check_var(struct fb_var_screeninfo *var, struct vivid_dev * + var->nonstd = 0; + + var->vmode &= ~FB_VMODE_MASK; +- var->vmode = FB_VMODE_NONINTERLACED; ++ var->vmode |= FB_VMODE_NONINTERLACED; + + /* Dummy values */ + var->hsync_len = 24; +diff --git a/drivers/media/radio/wl128x/fmdrv_common.c b/drivers/media/radio/wl128x/fmdrv_common.c +index 51639a3f7abe..0cee10cca0e5 100644 +--- a/drivers/media/radio/wl128x/fmdrv_common.c ++++ b/drivers/media/radio/wl128x/fmdrv_common.c +@@ -1278,8 +1278,9 @@ static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name) + + switch (action->type) { + case ACTION_SEND_COMMAND: /* Send */ +- if (fmc_send_cmd(fmdev, 0, 0, action->data, +- action->size, NULL, NULL)) ++ ret = fmc_send_cmd(fmdev, 0, 0, action->data, ++ action->size, NULL, NULL); ++ if (ret) + goto rel_fw; + + cmd_cnt++; +diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c +index 498875193386..adbb23b6595f 100644 +--- a/drivers/mfd/intel-lpss.c ++++ b/drivers/mfd/intel-lpss.c +@@ -525,6 +525,7 @@ module_init(intel_lpss_init); + + static void __exit intel_lpss_exit(void) + { ++ ida_destroy(&intel_lpss_devid_ida); + debugfs_remove(intel_lpss_debugfs); + } + module_exit(intel_lpss_exit); +diff --git a/drivers/misc/mic/card/mic_x100.c b/drivers/misc/mic/card/mic_x100.c +index b2958ce2368c..cd778e2b4f3e 100644 +--- a/drivers/misc/mic/card/mic_x100.c ++++ b/drivers/misc/mic/card/mic_x100.c +@@ -249,6 +249,9 @@ static int __init mic_probe(struct platform_device *pdev) + mdrv->dev = &pdev->dev; + snprintf(mdrv->name, sizeof(mic_driver_name), mic_driver_name); + ++ /* FIXME: use dma_set_mask_and_coherent() and check result */ ++ dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); ++ + mdev->mmio.pa = MIC_X100_MMIO_BASE; + mdev->mmio.len = MIC_X100_MMIO_LEN; + mdev->mmio.va = devm_ioremap(&pdev->dev, MIC_X100_MMIO_BASE, +@@ -294,18 +297,6 @@ static void mic_platform_shutdown(struct platform_device *pdev) + mic_remove(pdev); + } + +-static u64 mic_dma_mask = DMA_BIT_MASK(64); +- +-static struct platform_device mic_platform_dev = { +- .name = mic_driver_name, +- .id = 0, +- .num_resources = 0, +- .dev = { +- .dma_mask = &mic_dma_mask, +- .coherent_dma_mask = DMA_BIT_MASK(64), +- }, +-}; +- + static struct platform_driver __refdata mic_platform_driver = { + .probe = mic_probe, + .remove = mic_remove, +@@ -315,6 +306,8 @@ static struct platform_driver __refdata mic_platform_driver = { + }, + }; + ++static struct platform_device *mic_platform_dev; ++ + static int __init mic_init(void) + { + int ret; +@@ -327,9 +320,12 @@ static int __init mic_init(void) + } + + mic_init_card_debugfs(); +- ret = platform_device_register(&mic_platform_dev); ++ ++ mic_platform_dev = platform_device_register_simple(mic_driver_name, ++ 0, NULL, 0); ++ ret = PTR_ERR_OR_ZERO(mic_platform_dev); + if (ret) { +- pr_err("platform_device_register ret %d\n", ret); ++ pr_err("platform_device_register_full ret %d\n", ret); + goto cleanup_debugfs; + } + ret = platform_driver_register(&mic_platform_driver); +@@ -340,7 +336,7 @@ static int __init mic_init(void) + return ret; + + device_unregister: +- platform_device_unregister(&mic_platform_dev); ++ platform_device_unregister(mic_platform_dev); + cleanup_debugfs: + mic_exit_card_debugfs(); + done: +@@ -350,7 +346,7 @@ done: + static void __exit mic_exit(void) + { + platform_driver_unregister(&mic_platform_driver); +- platform_device_unregister(&mic_platform_dev); ++ platform_device_unregister(mic_platform_dev); + mic_exit_card_debugfs(); + } + +diff --git a/drivers/misc/sgi-xp/xpc_partition.c b/drivers/misc/sgi-xp/xpc_partition.c +index 6956f7e7d439..ca5f0102daef 100644 +--- a/drivers/misc/sgi-xp/xpc_partition.c ++++ b/drivers/misc/sgi-xp/xpc_partition.c +@@ -70,7 +70,7 @@ xpc_get_rsvd_page_pa(int nasid) + unsigned long rp_pa = nasid; /* seed with nasid */ + size_t len = 0; + size_t buf_len = 0; +- void *buf = buf; ++ void *buf = NULL; + void *buf_base = NULL; + enum xp_retval (*get_partition_rsvd_page_pa) + (void *, u64 *, unsigned long *, size_t *) = +diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c +index 2bae0214528b..bf309a8a66a1 100644 +--- a/drivers/mmc/host/sdhci.c ++++ b/drivers/mmc/host/sdhci.c +@@ -3096,11 +3096,13 @@ int sdhci_add_host(struct sdhci_host *host) + if (host->ops->get_min_clock) + mmc->f_min = host->ops->get_min_clock(host); + else if (host->version >= SDHCI_SPEC_300) { +- if (host->clk_mul) { +- mmc->f_min = (host->max_clk * host->clk_mul) / 1024; ++ if (host->clk_mul) + max_clk = host->max_clk * host->clk_mul; +- } else +- mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; ++ /* ++ * Divided Clock Mode minimum clock rate is always less than ++ * Programmable Clock Mode minimum clock rate. ++ */ ++ mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; + } else + mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; + +diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c +index 8a226cc05c10..cc4a0c48f090 100644 +--- a/drivers/net/can/slcan.c ++++ b/drivers/net/can/slcan.c +@@ -344,9 +344,16 @@ static void slcan_transmit(struct work_struct *work) + */ + static void slcan_write_wakeup(struct tty_struct *tty) + { +- struct slcan *sl = tty->disc_data; ++ struct slcan *sl; ++ ++ rcu_read_lock(); ++ sl = rcu_dereference(tty->disc_data); ++ if (!sl) ++ goto out; + + schedule_work(&sl->tx_work); ++out: ++ rcu_read_unlock(); + } + + /* Send a can_frame to a TTY queue. */ +@@ -640,10 +647,11 @@ static void slcan_close(struct tty_struct *tty) + return; + + spin_lock_bh(&sl->lock); +- tty->disc_data = NULL; ++ rcu_assign_pointer(tty->disc_data, NULL); + sl->tty = NULL; + spin_unlock_bh(&sl->lock); + ++ synchronize_rcu(); + flush_work(&sl->tx_work); + + /* Flush network side */ +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c +index 53b3c1a5851c..9530ee12726f 100644 +--- a/drivers/net/ethernet/broadcom/bcmsysport.c ++++ b/drivers/net/ethernet/broadcom/bcmsysport.c +@@ -1794,7 +1794,7 @@ static int bcm_sysport_probe(struct platform_device *pdev) + + priv->phy_interface = of_get_phy_mode(dn); + /* Default to GMII interface mode */ +- if (priv->phy_interface < 0) ++ if ((int)priv->phy_interface < 0) + priv->phy_interface = PHY_INTERFACE_MODE_GMII; + + /* In the case of a fixed PHY, the DT node associated +diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +index bee615cddbdd..f40eefd1b378 100644 +--- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c ++++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +@@ -2437,6 +2437,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) + + if (!is_offload(adapter)) + return -EOPNOTSUPP; ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; + if (!(adapter->flags & FULL_INIT_DONE)) + return -EIO; /* need the memory controllers */ + if (copy_from_user(&t, useraddr, sizeof(t))) +diff --git a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +index e51892d518ff..761c80eb8a68 100644 +--- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c ++++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +@@ -951,7 +951,7 @@ static int hix5hd2_dev_probe(struct platform_device *pdev) + goto err_free_mdio; + + priv->phy_mode = of_get_phy_mode(node); +- if (priv->phy_mode < 0) { ++ if ((int)priv->phy_mode < 0) { + netdev_err(ndev, "not find phy-mode\n"); + ret = -EINVAL; + goto err_mdiobus; +diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c +index 1a56de06b014..fdbba588c6db 100644 +--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c ++++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c +@@ -1477,7 +1477,7 @@ static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr, + + memset(pr, 0, sizeof(struct ehea_port_res)); + +- pr->tx_bytes = rx_bytes; ++ pr->tx_bytes = tx_bytes; + pr->tx_packets = tx_packets; + pr->rx_bytes = rx_bytes; + pr->rx_packets = rx_packets; +diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c +index 0798b4adb039..667900578249 100644 +--- a/drivers/net/ethernet/natsemi/sonic.c ++++ b/drivers/net/ethernet/natsemi/sonic.c +@@ -221,9 +221,9 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + + laddr = dma_map_single(lp->device, skb->data, length, DMA_TO_DEVICE); + if (!laddr) { +- printk(KERN_ERR "%s: failed to map tx DMA buffer.\n", dev->name); +- dev_kfree_skb(skb); +- return NETDEV_TX_BUSY; ++ pr_err_ratelimited("%s: failed to map tx DMA buffer.\n", dev->name); ++ dev_kfree_skb_any(skb); ++ return NETDEV_TX_OK; + } + + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ +diff --git a/drivers/net/ethernet/pasemi/pasemi_mac.c b/drivers/net/ethernet/pasemi/pasemi_mac.c +index 57a6e6cd74fc..48106953cf64 100644 +--- a/drivers/net/ethernet/pasemi/pasemi_mac.c ++++ b/drivers/net/ethernet/pasemi/pasemi_mac.c +@@ -1091,7 +1091,6 @@ static int pasemi_mac_phy_init(struct net_device *dev) + + dn = pci_device_to_OF_node(mac->pdev); + phy_dn = of_parse_phandle(dn, "phy-handle", 0); +- of_node_put(phy_dn); + + mac->link = 0; + mac->speed = 0; +@@ -1100,6 +1099,7 @@ static int pasemi_mac_phy_init(struct net_device *dev) + phydev = of_phy_connect(dev, phy_dn, &pasemi_adjust_link, 0, + PHY_INTERFACE_MODE_SGMII); + ++ of_node_put(phy_dn); + if (!phydev) { + printk(KERN_ERR "%s: Could not attach to phy\n", dev->name); + return -ENODEV; +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c +index 7886a8a5b55b..fb944e65c632 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.c ++++ b/drivers/net/ethernet/qualcomm/qca_spi.c +@@ -438,7 +438,6 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event) + u16 signature = 0; + u16 spi_config; + u16 wrbuf_space = 0; +- static u16 reset_count; + + if (event == QCASPI_EVENT_CPUON) { + /* Read signature twice, if not valid +@@ -491,13 +490,13 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event) + + qca->sync = QCASPI_SYNC_RESET; + qca->stats.trig_reset++; +- reset_count = 0; ++ qca->reset_count = 0; + break; + case QCASPI_SYNC_RESET: +- reset_count++; ++ qca->reset_count++; + netdev_dbg(qca->net_dev, "sync: waiting for CPU on, count %u.\n", +- reset_count); +- if (reset_count >= QCASPI_RESET_TIMEOUT) { ++ qca->reset_count); ++ if (qca->reset_count >= QCASPI_RESET_TIMEOUT) { + /* reset did not seem to take place, try again */ + qca->sync = QCASPI_SYNC_UNKNOWN; + qca->stats.reset_timeout++; +diff --git a/drivers/net/ethernet/qualcomm/qca_spi.h b/drivers/net/ethernet/qualcomm/qca_spi.h +index 6e31a0e744a4..c48c314ca4df 100644 +--- a/drivers/net/ethernet/qualcomm/qca_spi.h ++++ b/drivers/net/ethernet/qualcomm/qca_spi.h +@@ -97,6 +97,7 @@ struct qcaspi { + + unsigned int intr_req; + unsigned int intr_svc; ++ u16 reset_count; + + #ifdef CONFIG_DEBUG_FS + struct dentry *device_root; +diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c +index 2d9f4ed9a65e..8413f93f5cd9 100644 +--- a/drivers/net/ethernet/renesas/sh_eth.c ++++ b/drivers/net/ethernet/renesas/sh_eth.c +@@ -3040,12 +3040,16 @@ static struct sh_eth_plat_data *sh_eth_parse_dt(struct device *dev) + struct device_node *np = dev->of_node; + struct sh_eth_plat_data *pdata; + const char *mac_addr; ++ int ret; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return NULL; + +- pdata->phy_interface = of_get_phy_mode(np); ++ ret = of_get_phy_mode(np); ++ if (ret < 0) ++ return NULL; ++ pdata->phy_interface = ret; + + mac_addr = of_get_mac_address(np); + if (mac_addr) +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +index 82de68b1a452..1fc356c17750 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +@@ -203,7 +203,7 @@ static void *ipq806x_gmac_of_parse(struct ipq806x_gmac *gmac) + struct device *dev = &gmac->pdev->dev; + + gmac->phy_mode = of_get_phy_mode(dev->of_node); +- if (gmac->phy_mode < 0) { ++ if ((int)gmac->phy_mode < 0) { + dev_err(dev, "missing phy mode property\n"); + return ERR_PTR(-EINVAL); + } +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +index 170a18b61281..147c9f8cee7f 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +@@ -157,7 +157,7 @@ static int stmmac_enable(struct ptp_clock_info *ptp, + /* structure describing a PTP hardware clock */ + static struct ptp_clock_info stmmac_ptp_clock_ops = { + .owner = THIS_MODULE, +- .name = "stmmac_ptp_clock", ++ .name = "stmmac ptp", + .max_adj = 62500000, + .n_alarm = 0, + .n_ext_ts = 0, +diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c +index ef6b25ec75a1..0f8d5609ed51 100644 +--- a/drivers/net/slip/slip.c ++++ b/drivers/net/slip/slip.c +@@ -452,9 +452,16 @@ static void slip_transmit(struct work_struct *work) + */ + static void slip_write_wakeup(struct tty_struct *tty) + { +- struct slip *sl = tty->disc_data; ++ struct slip *sl; ++ ++ rcu_read_lock(); ++ sl = rcu_dereference(tty->disc_data); ++ if (!sl) ++ goto out; + + schedule_work(&sl->tx_work); ++out: ++ rcu_read_unlock(); + } + + static void sl_tx_timeout(struct net_device *dev) +@@ -887,10 +894,11 @@ static void slip_close(struct tty_struct *tty) + return; + + spin_lock_bh(&sl->lock); +- tty->disc_data = NULL; ++ rcu_assign_pointer(tty->disc_data, NULL); + sl->tty = NULL; + spin_unlock_bh(&sl->lock); + ++ synchronize_rcu(); + flush_work(&sl->tx_work); + + /* VSV = very important to remove timers */ +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 4174b24963b9..75a3865a80d2 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + #include + #include "lan78xx.h" + +@@ -2893,6 +2894,19 @@ void lan78xx_tx_timeout(struct net_device *net) + tasklet_schedule(&dev->bh); + } + ++static netdev_features_t lan78xx_features_check(struct sk_buff *skb, ++ struct net_device *netdev, ++ netdev_features_t features) ++{ ++ if (skb->len + TX_OVERHEAD > MAX_SINGLE_PACKET_SIZE) ++ features &= ~NETIF_F_GSO_MASK; ++ ++ features = vlan_features_check(skb, features); ++ features = vxlan_features_check(skb, features); ++ ++ return features; ++} ++ + static const struct net_device_ops lan78xx_netdev_ops = { + .ndo_open = lan78xx_open, + .ndo_stop = lan78xx_stop, +@@ -2906,6 +2920,7 @@ static const struct net_device_ops lan78xx_netdev_ops = { + .ndo_set_features = lan78xx_set_features, + .ndo_vlan_rx_add_vid = lan78xx_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = lan78xx_vlan_rx_kill_vid, ++ .ndo_features_check = lan78xx_features_check, + }; + + static int lan78xx_probe(struct usb_interface *intf, +diff --git a/drivers/net/wireless/ath/ath9k/dynack.c b/drivers/net/wireless/ath/ath9k/dynack.c +index 22b3cc4c27cd..58205a5bd74b 100644 +--- a/drivers/net/wireless/ath/ath9k/dynack.c ++++ b/drivers/net/wireless/ath/ath9k/dynack.c +@@ -285,9 +285,9 @@ void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an) + + an->ackto = ackto; + +- spin_lock(&da->qlock); ++ spin_lock_bh(&da->qlock); + list_add_tail(&an->list, &da->nodes); +- spin_unlock(&da->qlock); ++ spin_unlock_bh(&da->qlock); + } + EXPORT_SYMBOL(ath_dynack_node_init); + +@@ -301,9 +301,9 @@ void ath_dynack_node_deinit(struct ath_hw *ah, struct ath_node *an) + { + struct ath_dynack *da = &ah->dynack; + +- spin_lock(&da->qlock); ++ spin_lock_bh(&da->qlock); + list_del(&an->list); +- spin_unlock(&da->qlock); ++ spin_unlock_bh(&da->qlock); + } + EXPORT_SYMBOL(ath_dynack_node_deinit); + +diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c +index 8317afd065b4..0824697c3dca 100644 +--- a/drivers/net/wireless/libertas/cfg.c ++++ b/drivers/net/wireless/libertas/cfg.c +@@ -272,6 +272,10 @@ add_ie_rates(u8 *tlv, const u8 *ie, int *nrates) + int hw, ap, ap_max = ie[1]; + u8 hw_rate; + ++ if (ap_max > MAX_RATES) { ++ lbs_deb_assoc("invalid rates\n"); ++ return tlv; ++ } + /* Advance past IE header */ + ie += 2; + +@@ -1783,6 +1787,9 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + struct cmd_ds_802_11_ad_hoc_join cmd; + u8 preamble = RADIO_PREAMBLE_SHORT; + int ret = 0; ++ int hw, i; ++ u8 rates_max; ++ u8 *rates; + + lbs_deb_enter(LBS_DEB_CFG80211); + +@@ -1843,9 +1850,12 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + if (!rates_eid) { + lbs_add_rates(cmd.bss.rates); + } else { +- int hw, i; +- u8 rates_max = rates_eid[1]; +- u8 *rates = cmd.bss.rates; ++ rates_max = rates_eid[1]; ++ if (rates_max > MAX_RATES) { ++ lbs_deb_join("invalid rates"); ++ goto out; ++ } ++ rates = cmd.bss.rates; + for (hw = 0; hw < ARRAY_SIZE(lbs_rates); hw++) { + u8 hw_rate = lbs_rates[hw].bitrate / 5; + for (i = 0; i < rates_max; i++) { +diff --git a/drivers/net/wireless/libertas_tf/cmd.c b/drivers/net/wireless/libertas_tf/cmd.c +index 909ac3685010..2b193f1257a5 100644 +--- a/drivers/net/wireless/libertas_tf/cmd.c ++++ b/drivers/net/wireless/libertas_tf/cmd.c +@@ -69,7 +69,7 @@ static void lbtf_geo_init(struct lbtf_private *priv) + break; + } + +- for (ch = priv->range.start; ch < priv->range.end; ch++) ++ for (ch = range->start; ch < range->end; ch++) + priv->channels[CHAN_TO_IDX(ch)].flags = 0; + } + +diff --git a/drivers/net/wireless/mediatek/mt7601u/phy.c b/drivers/net/wireless/mediatek/mt7601u/phy.c +index 1908af6add87..59ed073a8572 100644 +--- a/drivers/net/wireless/mediatek/mt7601u/phy.c ++++ b/drivers/net/wireless/mediatek/mt7601u/phy.c +@@ -219,7 +219,7 @@ int mt7601u_wait_bbp_ready(struct mt7601u_dev *dev) + + do { + val = mt7601u_bbp_rr(dev, MT_BBP_REG_VERSION); +- if (val && ~val) ++ if (val && val != 0xff) + break; + } while (--i); + +diff --git a/drivers/pinctrl/sh-pfc/pfc-emev2.c b/drivers/pinctrl/sh-pfc/pfc-emev2.c +index 02118ab336fc..5ab3ac61f418 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-emev2.c ++++ b/drivers/pinctrl/sh-pfc/pfc-emev2.c +@@ -1263,6 +1263,14 @@ static const char * const dtv_groups[] = { + "dtv_b", + }; + ++static const char * const err_rst_reqb_groups[] = { ++ "err_rst_reqb", ++}; ++ ++static const char * const ext_clki_groups[] = { ++ "ext_clki", ++}; ++ + static const char * const iic0_groups[] = { + "iic0", + }; +@@ -1285,6 +1293,10 @@ static const char * const lcd_groups[] = { + "yuv3", + }; + ++static const char * const lowpwr_groups[] = { ++ "lowpwr", ++}; ++ + static const char * const ntsc_groups[] = { + "ntsc_clk", + "ntsc_data", +@@ -1298,6 +1310,10 @@ static const char * const pwm1_groups[] = { + "pwm1", + }; + ++static const char * const ref_clko_groups[] = { ++ "ref_clko", ++}; ++ + static const char * const sd_groups[] = { + "sd_cki", + }; +@@ -1391,13 +1407,17 @@ static const struct sh_pfc_function pinmux_functions[] = { + SH_PFC_FUNCTION(cam), + SH_PFC_FUNCTION(cf), + SH_PFC_FUNCTION(dtv), ++ SH_PFC_FUNCTION(err_rst_reqb), ++ SH_PFC_FUNCTION(ext_clki), + SH_PFC_FUNCTION(iic0), + SH_PFC_FUNCTION(iic1), + SH_PFC_FUNCTION(jtag), + SH_PFC_FUNCTION(lcd), ++ SH_PFC_FUNCTION(lowpwr), + SH_PFC_FUNCTION(ntsc), + SH_PFC_FUNCTION(pwm0), + SH_PFC_FUNCTION(pwm1), ++ SH_PFC_FUNCTION(ref_clko), + SH_PFC_FUNCTION(sd), + SH_PFC_FUNCTION(sdi0), + SH_PFC_FUNCTION(sdi1), +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +index 279e9dd442e4..bc2ee07fa92f 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +@@ -1983,7 +1983,7 @@ static const unsigned int gether_gmii_pins[] = { + */ + 185, 186, 187, 188, 189, 190, 191, 192, 174, 161, 204, + 171, 170, 169, 168, 167, 166, 173, 172, 176, 184, 183, 203, +- 205, 163, 206, 207, ++ 205, 163, 206, 207, 158, + }; + static const unsigned int gether_gmii_mux[] = { + ET_ERXD0_MARK, ET_ERXD1_MARK, ET_ERXD2_MARK, ET_ERXD3_MARK, +@@ -2155,6 +2155,7 @@ static const unsigned int lcd0_data24_1_mux[] = { + LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK, + LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK, + LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK, ++ LCD0_D12_MARK, LCD0_D13_MARK, LCD0_D14_MARK, LCD0_D15_MARK, + LCD0_D16_MARK, LCD0_D17_MARK, LCD0_D18_PORT163_MARK, + LCD0_D19_PORT162_MARK, LCD0_D20_PORT161_MARK, LCD0_D21_PORT158_MARK, + LCD0_D22_PORT160_MARK, LCD0_D23_PORT159_MARK, +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +index 42ffa8708abc..b2f8898ddb2c 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +@@ -3059,8 +3059,7 @@ static const unsigned int qspi_data4_b_pins[] = { + RCAR_GP_PIN(6, 4), + }; + static const unsigned int qspi_data4_b_mux[] = { +- SPCLK_B_MARK, MOSI_IO0_B_MARK, MISO_IO1_B_MARK, +- IO2_B_MARK, IO3_B_MARK, SSL_B_MARK, ++ MOSI_IO0_B_MARK, MISO_IO1_B_MARK, IO2_B_MARK, IO3_B_MARK, + }; + /* - SCIF0 ------------------------------------------------------------------ */ + static const unsigned int scif0_data_pins[] = { +@@ -4171,17 +4170,14 @@ static const unsigned int vin1_b_data18_pins[] = { + }; + static const unsigned int vin1_b_data18_mux[] = { + /* B */ +- VI1_DATA0_B_MARK, VI1_DATA1_B_MARK, + VI1_DATA2_B_MARK, VI1_DATA3_B_MARK, + VI1_DATA4_B_MARK, VI1_DATA5_B_MARK, + VI1_DATA6_B_MARK, VI1_DATA7_B_MARK, + /* G */ +- VI1_G0_B_MARK, VI1_G1_B_MARK, + VI1_G2_B_MARK, VI1_G3_B_MARK, + VI1_G4_B_MARK, VI1_G5_B_MARK, + VI1_G6_B_MARK, VI1_G7_B_MARK, + /* R */ +- VI1_R0_B_MARK, VI1_R1_B_MARK, + VI1_R2_B_MARK, VI1_R3_B_MARK, + VI1_R4_B_MARK, VI1_R5_B_MARK, + VI1_R6_B_MARK, VI1_R7_B_MARK, +@@ -4971,7 +4967,7 @@ static const char * const scifb2_groups[] = { + "scifb2_data_b", + "scifb2_clk_b", + "scifb2_ctrl_b", +- "scifb0_data_c", ++ "scifb2_data_c", + "scifb2_clk_c", + "scifb2_data_d", + }; +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7794.c b/drivers/pinctrl/sh-pfc/pfc-r8a7794.c +index 086f6798b129..3b79e893b5ed 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7794.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7794.c +@@ -4046,7 +4046,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_AVB_MDC, FN_SSI_SDATA6_B, 0, 0, } + }, + { PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32, +- 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3) { ++ 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3) { + /* IP9_31 [1] */ + 0, 0, + /* IP9_30_28 [3] */ +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7269.c b/drivers/pinctrl/sh-pfc/pfc-sh7269.c +index a50d22bef1f4..cfdb4fc177c3 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7269.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7269.c +@@ -2119,7 +2119,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + }, + + { PINMUX_CFG_REG("PCIOR0", 0xfffe3852, 16, 1) { +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PC8_IN, PC8_OUT, + PC7_IN, PC7_OUT, + PC6_IN, PC6_OUT, +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +index 6a69c8c5d943..b173bd759ee1 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +@@ -2672,6 +2672,7 @@ static const unsigned int tpu4_to2_mux[] = { + }; + static const unsigned int tpu4_to3_pins[] = { + /* TO */ ++ PIN_NUMBER(6, 26), + }; + static const unsigned int tpu4_to3_mux[] = { + TPU4TO3_MARK, +@@ -2894,7 +2895,8 @@ static const char * const fsic_groups[] = { + "fsic_sclk_out", + "fsic_data_in", + "fsic_data_out", +- "fsic_spdif", ++ "fsic_spdif_0", ++ "fsic_spdif_1", + }; + + static const char * const fsid_groups[] = { +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7734.c b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +index ab09d385f95d..ce543f3c39b2 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7734.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +@@ -2236,13 +2236,13 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_LCD_CL1_B, 0, 0, + /* IP10_5_3 [3] */ + FN_SSI_WS23, FN_VI1_5_B, FN_TX1_D, FN_HSCK0_C, FN_FALE_B, +- FN_LCD_DON_B, 0, 0, 0, ++ FN_LCD_DON_B, 0, 0, + /* IP10_2_0 [3] */ + FN_SSI_SCK23, FN_VI1_4_B, FN_RX1_D, FN_FCLE_B, + FN_LCD_DATA15_B, 0, 0, 0 } + }, + { PINMUX_CFG_REG_VAR("IPSR11", 0xFFFC0048, 32, +- 3, 1, 2, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { ++ 3, 1, 2, 3, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { + /* IP11_31_29 [3] */ + 0, 0, 0, 0, 0, 0, 0, 0, + /* IP11_28 [1] */ +diff --git a/drivers/platform/mips/cpu_hwmon.c b/drivers/platform/mips/cpu_hwmon.c +index 0f6c63e17049..9a201c3caaf4 100644 +--- a/drivers/platform/mips/cpu_hwmon.c ++++ b/drivers/platform/mips/cpu_hwmon.c +@@ -155,7 +155,7 @@ static int __init loongson_hwmon_init(void) + + cpu_hwmon_dev = hwmon_device_register(NULL); + if (IS_ERR(cpu_hwmon_dev)) { +- ret = -ENOMEM; ++ ret = PTR_ERR(cpu_hwmon_dev); + pr_err("hwmon_device_register fail!\n"); + goto fail_hwmon_device_register; + } +diff --git a/drivers/platform/x86/alienware-wmi.c b/drivers/platform/x86/alienware-wmi.c +index 3df47c1b04ec..f5585740a765 100644 +--- a/drivers/platform/x86/alienware-wmi.c ++++ b/drivers/platform/x86/alienware-wmi.c +@@ -511,7 +511,7 @@ static ssize_t show_hdmi_source(struct device *dev, + return scnprintf(buf, PAGE_SIZE, + "input [gpu] unknown\n"); + } +- pr_err("alienware-wmi: unknown HDMI source status: %d\n", out_data); ++ pr_err("alienware-wmi: unknown HDMI source status: %u\n", status); + return scnprintf(buf, PAGE_SIZE, "input gpu [unknown]\n"); + } + +diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c +index b13cd074c52a..9281e42c9ed5 100644 +--- a/drivers/power/power_supply_core.c ++++ b/drivers/power/power_supply_core.c +@@ -755,14 +755,14 @@ __power_supply_register(struct device *parent, + } + + spin_lock_init(&psy->changed_lock); +- rc = device_init_wakeup(dev, ws); +- if (rc) +- goto wakeup_init_failed; +- + rc = device_add(dev); + if (rc) + goto device_add_failed; + ++ rc = device_init_wakeup(dev, ws); ++ if (rc) ++ goto wakeup_init_failed; ++ + rc = psy_register_thermal(psy); + if (rc) + goto register_thermal_failed; +@@ -798,8 +798,8 @@ register_cooler_failed: + psy_unregister_thermal(psy); + register_thermal_failed: + device_del(dev); +-device_add_failed: + wakeup_init_failed: ++device_add_failed: + check_supplies_failed: + dev_set_name_failed: + put_device(dev); +diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c +index 8cbb82ceec40..fad424e20bd5 100644 +--- a/drivers/regulator/wm831x-dcdc.c ++++ b/drivers/regulator/wm831x-dcdc.c +@@ -327,8 +327,8 @@ static int wm831x_buckv_get_voltage_sel(struct regulator_dev *rdev) + } + + /* Current limit options */ +-static u16 wm831x_dcdc_ilim[] = { +- 125, 250, 375, 500, 625, 750, 875, 1000 ++static const unsigned int wm831x_dcdc_ilim[] = { ++ 125000, 250000, 375000, 500000, 625000, 750000, 875000, 1000000 + }; + + static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev, +diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c +index 466bf7f9a285..7da2a1fb50f8 100644 +--- a/drivers/rtc/rtc-88pm80x.c ++++ b/drivers/rtc/rtc-88pm80x.c +@@ -116,12 +116,14 @@ static int pm80x_rtc_read_time(struct device *dev, struct rtc_time *tm) + unsigned char buf[4]; + unsigned long ticks, base, data; + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -144,7 +146,8 @@ static int pm80x_rtc_set_time(struct device *dev, struct rtc_time *tm) + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + base = ticks - data; + dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -165,11 +168,13 @@ static int pm80x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) + int ret; + + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + regmap_raw_read(info->map, PM800_RTC_EXPIRE1_1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -192,12 +197,14 @@ static int pm80x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) + regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_ALARM1_EN, 0); + + regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); +- base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); + + /* load 32-bit read-only counter */ + regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c +index 166faae3a59c..7d3e5168fcef 100644 +--- a/drivers/rtc/rtc-88pm860x.c ++++ b/drivers/rtc/rtc-88pm860x.c +@@ -115,11 +115,13 @@ static int pm860x_rtc_read_time(struct device *dev, struct rtc_time *tm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -145,7 +147,8 @@ static int pm860x_rtc_set_time(struct device *dev, struct rtc_time *tm) + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + base = ticks - data; + dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -170,10 +173,12 @@ static int pm860x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + pm860x_bulk_read(info->i2c, PM8607_RTC_EXPIRE1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +@@ -198,11 +203,13 @@ static int pm860x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) + pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); + dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +- base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; ++ base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | ++ (buf[5] << 8) | buf[7]; + + /* load 32-bit read-only counter */ + pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); +- data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + ticks = base + data; + dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", + base, data, ticks); +diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c +index 92b1cbf2c4a7..2bea733b1589 100644 +--- a/drivers/rtc/rtc-ds1672.c ++++ b/drivers/rtc/rtc-ds1672.c +@@ -60,7 +60,8 @@ static int ds1672_get_datetime(struct i2c_client *client, struct rtc_time *tm) + "%s: raw read data - counters=%02x,%02x,%02x,%02x\n", + __func__, buf[0], buf[1], buf[2], buf[3]); + +- time = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; ++ time = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | ++ (buf[1] << 8) | buf[0]; + + rtc_time_to_tm(time, tm); + +diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c +index 45b5a3d47ccf..1982eec0a3ea 100644 +--- a/drivers/rtc/rtc-pcf8563.c ++++ b/drivers/rtc/rtc-pcf8563.c +@@ -568,7 +568,6 @@ static int pcf8563_probe(struct i2c_client *client, + struct pcf8563 *pcf8563; + int err; + unsigned char buf; +- unsigned char alm_pending; + + dev_dbg(&client->dev, "%s\n", __func__); + +@@ -594,13 +593,13 @@ static int pcf8563_probe(struct i2c_client *client, + return err; + } + +- err = pcf8563_get_alarm_mode(client, NULL, &alm_pending); +- if (err) { +- dev_err(&client->dev, "%s: read error\n", __func__); ++ /* Clear flags and disable interrupts */ ++ buf = 0; ++ err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf); ++ if (err < 0) { ++ dev_err(&client->dev, "%s: write error\n", __func__); + return err; + } +- if (alm_pending) +- pcf8563_set_alarm_mode(client, 0); + + pcf8563->rtc = devm_rtc_device_register(&client->dev, + pcf8563_driver.driver.name, +diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c +index 795fcbd02ea3..a0dae6271ff6 100644 +--- a/drivers/rtc/rtc-pm8xxx.c ++++ b/drivers/rtc/rtc-pm8xxx.c +@@ -186,7 +186,8 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) + } + } + +- secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); ++ secs = value[0] | (value[1] << 8) | (value[2] << 16) | ++ ((unsigned long)value[3] << 24); + + rtc_time_to_tm(secs, tm); + +@@ -267,7 +268,8 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) + return rc; + } + +- secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); ++ secs = value[0] | (value[1] << 8) | (value[2] << 16) | ++ ((unsigned long)value[3] << 24); + + rtc_time_to_tm(secs, &alarm->time); + +diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c +index 30f9ef0c0d4f..b20c575564e4 100644 +--- a/drivers/scsi/libfc/fc_exch.c ++++ b/drivers/scsi/libfc/fc_exch.c +@@ -2499,7 +2499,7 @@ void fc_exch_recv(struct fc_lport *lport, struct fc_frame *fp) + + /* lport lock ? */ + if (!lport || lport->state == LPORT_ST_DISABLED) { +- FC_LPORT_DBG(lport, "Receiving frames for an lport that " ++ FC_LIBFC_DBG("Receiving frames for an lport that " + "has not been initialized correctly\n"); + fc_frame_free(fp); + return; +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index 7be968f60b59..1efd876f0728 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -3585,12 +3585,12 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr) + /* + * The cur_state should not last for more than max_wait secs + */ +- for (i = 0; i < max_wait; i++) { ++ for (i = 0; i < max_wait * 50; i++) { + curr_abs_state = instance->instancet-> + read_fw_status_reg(instance->reg_set); + + if (abs_state == curr_abs_state) { +- msleep(1000); ++ msleep(20); + } else + break; + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 611a127f08d8..8975baab73e5 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -5780,8 +5780,7 @@ qla2x00_module_init(void) + /* Initialize target kmem_cache and mem_pools */ + ret = qlt_init(); + if (ret < 0) { +- kmem_cache_destroy(srb_cachep); +- return ret; ++ goto destroy_cache; + } else if (ret > 0) { + /* + * If initiator mode is explictly disabled by qlt_init(), +@@ -5800,11 +5799,10 @@ qla2x00_module_init(void) + qla2xxx_transport_template = + fc_attach_transport(&qla2xxx_transport_functions); + if (!qla2xxx_transport_template) { +- kmem_cache_destroy(srb_cachep); + ql_log(ql_log_fatal, NULL, 0x0002, + "fc_attach_transport failed...Failing load!.\n"); +- qlt_exit(); +- return -ENODEV; ++ ret = -ENODEV; ++ goto qlt_exit; + } + + apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops); +@@ -5816,27 +5814,37 @@ qla2x00_module_init(void) + qla2xxx_transport_vport_template = + fc_attach_transport(&qla2xxx_transport_vport_functions); + if (!qla2xxx_transport_vport_template) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); + ql_log(ql_log_fatal, NULL, 0x0004, + "fc_attach_transport vport failed...Failing load!.\n"); +- return -ENODEV; ++ ret = -ENODEV; ++ goto unreg_chrdev; + } + ql_log(ql_log_info, NULL, 0x0005, + "QLogic Fibre Channel HBA Driver: %s.\n", + qla2x00_version_str); + ret = pci_register_driver(&qla2xxx_pci_driver); + if (ret) { +- kmem_cache_destroy(srb_cachep); +- qlt_exit(); +- fc_release_transport(qla2xxx_transport_template); +- fc_release_transport(qla2xxx_transport_vport_template); + ql_log(ql_log_fatal, NULL, 0x0006, + "pci_register_driver failed...ret=%d Failing load!.\n", + ret); ++ goto release_vport_transport; + } + return ret; ++ ++release_vport_transport: ++ fc_release_transport(qla2xxx_transport_vport_template); ++ ++unreg_chrdev: ++ if (apidev_major >= 0) ++ unregister_chrdev(apidev_major, QLA2XXX_APIDEV); ++ fc_release_transport(qla2xxx_transport_template); ++ ++qlt_exit: ++ qlt_exit(); ++ ++destroy_cache: ++ kmem_cache_destroy(srb_cachep); ++ return ret; + } + + /** +diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c +index bb4ed7b1f5df..ab32e6073642 100644 +--- a/drivers/scsi/scsi_transport_iscsi.c ++++ b/drivers/scsi/scsi_transport_iscsi.c +@@ -37,6 +37,8 @@ + + #define ISCSI_TRANSPORT_VERSION "2.0-870" + ++#define ISCSI_SEND_MAX_ALLOWED 10 ++ + static int dbg_session; + module_param_named(debug_session, dbg_session, int, + S_IRUGO | S_IWUSR); +@@ -3695,6 +3697,7 @@ iscsi_if_rx(struct sk_buff *skb) + struct nlmsghdr *nlh; + struct iscsi_uevent *ev; + uint32_t group; ++ int retries = ISCSI_SEND_MAX_ALLOWED; + + nlh = nlmsg_hdr(skb); + if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) || +@@ -3725,6 +3728,10 @@ iscsi_if_rx(struct sk_buff *skb) + break; + err = iscsi_if_send_reply(group, nlh->nlmsg_seq, + nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); ++ if (err == -EAGAIN && --retries < 0) { ++ printk(KERN_WARNING "Send reply failed, error %d\n", err); ++ break; ++ } + } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH); + skb_pull(skb, rlen); + } +diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c +index ca655593c5e0..1cedd640705f 100644 +--- a/drivers/spi/spi-bcm2835aux.c ++++ b/drivers/spi/spi-bcm2835aux.c +@@ -390,7 +390,18 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev) + platform_set_drvdata(pdev, master); + master->mode_bits = BCM2835_AUX_SPI_MODE_BITS; + master->bits_per_word_mask = SPI_BPW_MASK(8); +- master->num_chipselect = -1; ++ /* even though the driver never officially supported native CS ++ * allow a single native CS for legacy DT support purposes when ++ * no cs-gpio is configured. ++ * Known limitations for native cs are: ++ * * multiple chip-selects: cs0-cs2 are all simultaniously asserted ++ * whenever there is a transfer - this even includes SPI_NO_CS ++ * * SPI_CS_HIGH: is ignores - cs are always asserted low ++ * * cs_change: cs is deasserted after each spi_transfer ++ * * cs_delay_usec: cs is always deasserted one SCK cycle after ++ * a spi_transfer ++ */ ++ master->num_chipselect = 1; + master->transfer_one = bcm2835aux_spi_transfer_one; + master->handle_err = bcm2835aux_spi_handle_err; + master->dev.of_node = pdev->dev.of_node; +diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c +index 8b290d9d7935..5419de19859a 100644 +--- a/drivers/spi/spi-fsl-spi.c ++++ b/drivers/spi/spi-fsl-spi.c +@@ -408,7 +408,6 @@ static int fsl_spi_do_one_msg(struct spi_master *master, + } + + m->status = status; +- spi_finalize_current_message(master); + + if (status || !cs_change) { + ndelay(nsecs); +@@ -416,6 +415,7 @@ static int fsl_spi_do_one_msg(struct spi_master *master, + } + + fsl_spi_setup_transfer(spi, NULL); ++ spi_finalize_current_message(master); + return 0; + } + +diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c +index 705f515863d4..e37712bed0b2 100644 +--- a/drivers/spi/spi-tegra114.c ++++ b/drivers/spi/spi-tegra114.c +@@ -307,10 +307,16 @@ static unsigned tegra_spi_fill_tx_fifo_from_client_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tegra_spi_writel(tspi, x, SPI_TX_FIFO); + } ++ ++ tspi->cur_tx_pos += written_words * tspi->bytes_per_word; + } else { ++ unsigned int write_bytes; + max_n_32bit = min(tspi->curr_dma_words, tx_empty_count); + written_words = max_n_32bit; + nbytes = written_words * tspi->bytes_per_word; ++ if (nbytes > t->len - tspi->cur_pos) ++ nbytes = t->len - tspi->cur_pos; ++ write_bytes = nbytes; + for (count = 0; count < max_n_32bit; count++) { + u32 x = 0; + +@@ -319,8 +325,10 @@ static unsigned tegra_spi_fill_tx_fifo_from_client_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tegra_spi_writel(tspi, x, SPI_TX_FIFO); + } ++ ++ tspi->cur_tx_pos += write_bytes; + } +- tspi->cur_tx_pos += written_words * tspi->bytes_per_word; ++ + return written_words; + } + +@@ -344,20 +352,27 @@ static unsigned int tegra_spi_read_rx_fifo_to_client_rxbuf( + for (i = 0; len && (i < 4); i++, len--) + *rx_buf++ = (x >> i*8) & 0xFF; + } +- tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + read_words += tspi->curr_dma_words; ++ tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; ++ u8 bytes_per_word = tspi->bytes_per_word; ++ unsigned int read_bytes; + ++ len = rx_full_count * bytes_per_word; ++ if (len > t->len - tspi->cur_pos) ++ len = t->len - tspi->cur_pos; ++ read_bytes = len; + for (count = 0; count < rx_full_count; count++) { + u32 x = tegra_spi_readl(tspi, SPI_RX_FIFO) & rx_mask; + +- for (i = 0; (i < tspi->bytes_per_word); i++) ++ for (i = 0; len && (i < bytes_per_word); i++, len--) + *rx_buf++ = (x >> (i*8)) & 0xFF; + } +- tspi->cur_rx_pos += rx_full_count * tspi->bytes_per_word; + read_words += rx_full_count; ++ tspi->cur_rx_pos += read_bytes; + } ++ + return read_words; + } + +@@ -372,12 +387,17 @@ static void tegra_spi_copy_client_txbuf_to_spi_txbuf( + unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; + + memcpy(tspi->tx_dma_buf, t->tx_buf + tspi->cur_pos, len); ++ tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + unsigned int i; + unsigned int count; + u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; + unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; ++ unsigned int write_bytes; + ++ if (consume > t->len - tspi->cur_pos) ++ consume = t->len - tspi->cur_pos; ++ write_bytes = consume; + for (count = 0; count < tspi->curr_dma_words; count++) { + u32 x = 0; + +@@ -386,8 +406,9 @@ static void tegra_spi_copy_client_txbuf_to_spi_txbuf( + x |= (u32)(*tx_buf++) << (i * 8); + tspi->tx_dma_buf[count] = x; + } ++ ++ tspi->cur_tx_pos += write_bytes; + } +- tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->tx_dma_phys, +@@ -405,20 +426,28 @@ static void tegra_spi_copy_spi_rxbuf_to_client_rxbuf( + unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; + + memcpy(t->rx_buf + tspi->cur_rx_pos, tspi->rx_dma_buf, len); ++ tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + } else { + unsigned int i; + unsigned int count; + unsigned char *rx_buf = t->rx_buf + tspi->cur_rx_pos; + u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; ++ unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; ++ unsigned int read_bytes; + ++ if (consume > t->len - tspi->cur_pos) ++ consume = t->len - tspi->cur_pos; ++ read_bytes = consume; + for (count = 0; count < tspi->curr_dma_words; count++) { + u32 x = tspi->rx_dma_buf[count] & rx_mask; + +- for (i = 0; (i < tspi->bytes_per_word); i++) ++ for (i = 0; consume && (i < tspi->bytes_per_word); ++ i++, consume--) + *rx_buf++ = (x >> (i*8)) & 0xFF; + } ++ ++ tspi->cur_rx_pos += read_bytes; + } +- tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; + + /* Make the dma buffer to read by dma */ + dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, +@@ -730,6 +759,8 @@ static int tegra_spi_start_transfer_one(struct spi_device *spi, + + if (tspi->is_packed) + command1 |= SPI_PACKED; ++ else ++ command1 &= ~SPI_PACKED; + + command1 &= ~(SPI_CS_SEL_MASK | SPI_TX_EN | SPI_RX_EN); + tspi->cur_direction = 0; +diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c +index 619c989c5f37..d682907c146a 100644 +--- a/drivers/staging/comedi/drivers/ni_mio_common.c ++++ b/drivers/staging/comedi/drivers/ni_mio_common.c +@@ -4809,7 +4809,10 @@ static int ni_valid_rtsi_output_source(struct comedi_device *dev, + case NI_RTSI_OUTPUT_G_SRC0: + case NI_RTSI_OUTPUT_G_GATE0: + case NI_RTSI_OUTPUT_RGOUT0: +- case NI_RTSI_OUTPUT_RTSI_BRD_0: ++ case NI_RTSI_OUTPUT_RTSI_BRD(0): ++ case NI_RTSI_OUTPUT_RTSI_BRD(1): ++ case NI_RTSI_OUTPUT_RTSI_BRD(2): ++ case NI_RTSI_OUTPUT_RTSI_BRD(3): + return 1; + case NI_RTSI_OUTPUT_RTSI_OSC: + return (devpriv->is_m_series) ? 1 : 0; +@@ -4830,11 +4833,18 @@ static int ni_set_rtsi_routing(struct comedi_device *dev, + devpriv->rtsi_trig_a_output_reg |= NISTC_RTSI_TRIG(chan, src); + ni_stc_writew(dev, devpriv->rtsi_trig_a_output_reg, + NISTC_RTSI_TRIGA_OUT_REG); +- } else if (chan < 8) { ++ } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { + devpriv->rtsi_trig_b_output_reg &= ~NISTC_RTSI_TRIG_MASK(chan); + devpriv->rtsi_trig_b_output_reg |= NISTC_RTSI_TRIG(chan, src); + ni_stc_writew(dev, devpriv->rtsi_trig_b_output_reg, + NISTC_RTSI_TRIGB_OUT_REG); ++ } else if (chan != NISTC_RTSI_TRIG_OLD_CLK_CHAN) { ++ /* probably should never reach this, since the ++ * ni_valid_rtsi_output_source above errors out if chan is too ++ * high ++ */ ++ dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); ++ return -EINVAL; + } + return 2; + } +@@ -4849,12 +4859,12 @@ static unsigned ni_get_rtsi_routing(struct comedi_device *dev, unsigned chan) + } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { + return NISTC_RTSI_TRIG_TO_SRC(chan, + devpriv->rtsi_trig_b_output_reg); +- } else { +- if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) +- return NI_RTSI_OUTPUT_RTSI_OSC; +- dev_err(dev->class_dev, "bug! should never get here?\n"); +- return 0; ++ } else if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) { ++ return NI_RTSI_OUTPUT_RTSI_OSC; + } ++ ++ dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); ++ return -EINVAL; + } + + static int ni_rtsi_insn_config(struct comedi_device *dev, +diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c +index 564828554ca0..07d9384bce94 100644 +--- a/drivers/target/iscsi/iscsi_target.c ++++ b/drivers/target/iscsi/iscsi_target.c +@@ -4309,9 +4309,6 @@ int iscsit_close_connection( + iscsit_stop_nopin_response_timer(conn); + iscsit_stop_nopin_timer(conn); + +- if (conn->conn_transport->iscsit_wait_conn) +- conn->conn_transport->iscsit_wait_conn(conn); +- + /* + * During Connection recovery drop unacknowledged out of order + * commands for this connection, and prepare the other commands +@@ -4397,6 +4394,9 @@ int iscsit_close_connection( + target_sess_cmd_list_set_waiting(sess->se_sess); + target_wait_for_sess_cmds(sess->se_sess); + ++ if (conn->conn_transport->iscsit_wait_conn) ++ conn->conn_transport->iscsit_wait_conn(conn); ++ + if (conn->conn_rx_hash.tfm) + crypto_free_hash(conn->conn_rx_hash.tfm); + if (conn->conn_tx_hash.tfm) +diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c +index 87d87ac1c8a0..96567b4a4f20 100644 +--- a/drivers/thermal/cpu_cooling.c ++++ b/drivers/thermal/cpu_cooling.c +@@ -607,7 +607,7 @@ static int cpufreq_get_requested_power(struct thermal_cooling_device *cdev, + load = 0; + + total_load += load; +- if (trace_thermal_power_cpu_limit_enabled() && load_cpu) ++ if (load_cpu) + load_cpu[i] = load; + + i++; +diff --git a/drivers/tty/ipwireless/hardware.c b/drivers/tty/ipwireless/hardware.c +index ad7031a4f3c4..454cdc6f2c05 100644 +--- a/drivers/tty/ipwireless/hardware.c ++++ b/drivers/tty/ipwireless/hardware.c +@@ -1515,6 +1515,8 @@ static void ipw_send_setup_packet(struct ipw_hardware *hw) + sizeof(struct ipw_setup_get_version_query_packet), + ADDR_SETUP_PROT, TL_PROTOCOLID_SETUP, + TL_SETUP_SIGNO_GET_VERSION_QRY); ++ if (!ver_packet) ++ return; + ver_packet->header.length = sizeof(struct tl_setup_get_version_qry); + + /* +diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c +index 71ad04d54212..1a1d1cfc3704 100644 +--- a/drivers/usb/class/cdc-wdm.c ++++ b/drivers/usb/class/cdc-wdm.c +@@ -1098,7 +1098,7 @@ static int wdm_post_reset(struct usb_interface *intf) + rv = recover_from_urb_loss(desc); + mutex_unlock(&desc->wlock); + mutex_unlock(&desc->rlock); +- return 0; ++ return rv; + } + + static struct usb_driver wdm_driver = { +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 40c95ed6afbf..3ef80c2c0dcc 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -965,7 +965,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + } + port_li = readl(port_array[wIndex] + PORTLI); + status = xhci_get_ext_port_status(temp, port_li); +- put_unaligned_le32(cpu_to_le32(status), &buf[4]); ++ put_unaligned_le32(status, &buf[4]); + } + break; + case SetPortFeature: +diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c +index 4b62eb3b5923..7a82735d5308 100644 +--- a/drivers/vfio/pci/vfio_pci.c ++++ b/drivers/vfio/pci/vfio_pci.c +@@ -496,6 +496,7 @@ static long vfio_pci_ioctl(void *device_data, + { + void __iomem *io; + size_t size; ++ u16 orig_cmd; + + info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index); + info.flags = 0; +@@ -505,15 +506,23 @@ static long vfio_pci_ioctl(void *device_data, + if (!info.size) + break; + +- /* Is it really there? */ ++ /* ++ * Is it really there? Enable memory decode for ++ * implicit access in pci_map_rom(). ++ */ ++ pci_read_config_word(pdev, PCI_COMMAND, &orig_cmd); ++ pci_write_config_word(pdev, PCI_COMMAND, ++ orig_cmd | PCI_COMMAND_MEMORY); ++ + io = pci_map_rom(pdev, &size); +- if (!io || !size) { ++ if (io) { ++ info.flags = VFIO_REGION_INFO_FLAG_READ; ++ pci_unmap_rom(pdev, io); ++ } else { + info.size = 0; +- break; + } +- pci_unmap_rom(pdev, io); + +- info.flags = VFIO_REGION_INFO_FLAG_READ; ++ pci_write_config_word(pdev, PCI_COMMAND, orig_cmd); + break; + } + case VFIO_PCI_VGA_REGION_INDEX: +diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c +index 35fe4825a454..5ef6f9d420a2 100644 +--- a/drivers/video/backlight/lm3630a_bl.c ++++ b/drivers/video/backlight/lm3630a_bl.c +@@ -200,7 +200,7 @@ static int lm3630a_bank_a_update_status(struct backlight_device *bl) + LM3630A_LEDA_ENABLE, LM3630A_LEDA_ENABLE); + if (ret < 0) + goto out_i2c_err; +- return bl->props.brightness; ++ return 0; + + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access\n"); +@@ -277,7 +277,7 @@ static int lm3630a_bank_b_update_status(struct backlight_device *bl) + LM3630A_LEDB_ENABLE, LM3630A_LEDB_ENABLE); + if (ret < 0) + goto out_i2c_err; +- return bl->props.brightness; ++ return 0; + + out_i2c_err: + dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); +diff --git a/drivers/video/fbdev/chipsfb.c b/drivers/video/fbdev/chipsfb.c +index 59abdc6a97f6..314b7eceb81c 100644 +--- a/drivers/video/fbdev/chipsfb.c ++++ b/drivers/video/fbdev/chipsfb.c +@@ -350,7 +350,7 @@ static void init_chips(struct fb_info *p, unsigned long addr) + static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) + { + struct fb_info *p; +- unsigned long addr, size; ++ unsigned long addr; + unsigned short cmd; + int rc = -ENODEV; + +@@ -362,7 +362,6 @@ static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) + if ((dp->resource[0].flags & IORESOURCE_MEM) == 0) + goto err_disable; + addr = pci_resource_start(dp, 0); +- size = pci_resource_len(dp, 0); + if (addr == 0) + goto err_disable; + +diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c +index f4e59c445964..17054d695411 100644 +--- a/drivers/xen/cpu_hotplug.c ++++ b/drivers/xen/cpu_hotplug.c +@@ -53,7 +53,7 @@ static int vcpu_online(unsigned int cpu) + } + static void vcpu_hotplug(unsigned int cpu) + { +- if (!cpu_possible(cpu)) ++ if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) + return; + + switch (vcpu_online(cpu)) { +diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c +index 07573dc1614a..3469c7ce7cb6 100644 +--- a/fs/btrfs/inode-map.c ++++ b/fs/btrfs/inode-map.c +@@ -158,6 +158,7 @@ static void start_caching(struct btrfs_root *root) + spin_lock(&root->ino_cache_lock); + root->ino_cache_state = BTRFS_CACHE_FINISHED; + spin_unlock(&root->ino_cache_lock); ++ wake_up(&root->ino_cache_wait); + return; + } + +diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c +index 63108343124a..4bde8acca455 100644 +--- a/fs/cifs/connect.c ++++ b/fs/cifs/connect.c +@@ -939,6 +939,7 @@ cifs_demultiplex_thread(void *p) + mempool_resize(cifs_req_poolp, length + cifs_min_rcv); + + set_freezable(); ++ allow_kernel_signal(SIGKILL); + while (server->tcpStatus != CifsExiting) { + if (try_to_freeze()) + continue; +@@ -2246,7 +2247,7 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect) + + task = xchg(&server->tsk, NULL); + if (task) +- force_sig(SIGKILL, task); ++ send_sig(SIGKILL, task, 1); + } + + static struct TCP_Server_Info * +diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c +index 6599c6124552..01cbdd0987c0 100644 +--- a/fs/exportfs/expfs.c ++++ b/fs/exportfs/expfs.c +@@ -148,6 +148,7 @@ static struct dentry *reconnect_one(struct vfsmount *mnt, + mutex_unlock(&parent->d_inode->i_mutex); + if (IS_ERR(tmp)) { + dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); ++ err = PTR_ERR(tmp); + goto out_err; + } + if (tmp != dentry) { +diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c +index 0dcd33f62637..00f9433eea23 100644 +--- a/fs/ext4/inline.c ++++ b/fs/ext4/inline.c +@@ -1418,7 +1418,7 @@ int htree_inlinedir_to_tree(struct file *dir_file, + err = ext4_htree_store_dirent(dir_file, hinfo->hash, + hinfo->minor_hash, de, &tmp_str); + if (err) { +- count = err; ++ ret = err; + goto out; + } + count++; +diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c +index d595856453b2..de6351c1c8db 100644 +--- a/fs/jfs/jfs_txnmgr.c ++++ b/fs/jfs/jfs_txnmgr.c +@@ -1928,8 +1928,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, + * header ? + */ + if (tlck->type & tlckTRUNCATE) { +- /* This odd declaration suppresses a bogus gcc warning */ +- pxd_t pxd = pxd; /* truncated extent of xad */ ++ pxd_t pxd; /* truncated extent of xad */ + int twm; + + /* +diff --git a/fs/namei.c b/fs/namei.c +index 40049d61ef37..a4ed9c337c21 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -988,7 +988,8 @@ static int may_linkat(struct path *link) + * may_create_in_sticky - Check whether an O_CREAT open in a sticky directory + * should be allowed, or not, on files that already + * exist. +- * @dir: the sticky parent directory ++ * @dir_mode: mode bits of directory ++ * @dir_uid: owner of directory + * @inode: the inode of the file to open + * + * Block an O_CREAT open of a FIFO (or a regular file) when: +@@ -1004,18 +1005,18 @@ static int may_linkat(struct path *link) + * + * Returns 0 if the open is allowed, -ve on error. + */ +-static int may_create_in_sticky(struct dentry * const dir, ++static int may_create_in_sticky(umode_t dir_mode, kuid_t dir_uid, + struct inode * const inode) + { + if ((!sysctl_protected_fifos && S_ISFIFO(inode->i_mode)) || + (!sysctl_protected_regular && S_ISREG(inode->i_mode)) || +- likely(!(dir->d_inode->i_mode & S_ISVTX)) || +- uid_eq(inode->i_uid, dir->d_inode->i_uid) || ++ likely(!(dir_mode & S_ISVTX)) || ++ uid_eq(inode->i_uid, dir_uid) || + uid_eq(current_fsuid(), inode->i_uid)) + return 0; + +- if (likely(dir->d_inode->i_mode & 0002) || +- (dir->d_inode->i_mode & 0020 && ++ if (likely(dir_mode & 0002) || ++ (dir_mode & 0020 && + ((sysctl_protected_fifos >= 2 && S_ISFIFO(inode->i_mode)) || + (sysctl_protected_regular >= 2 && S_ISREG(inode->i_mode))))) { + return -EACCES; +@@ -3059,6 +3060,8 @@ static int do_last(struct nameidata *nd, + int *opened) + { + struct dentry *dir = nd->path.dentry; ++ kuid_t dir_uid = dir->d_inode->i_uid; ++ umode_t dir_mode = dir->d_inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +@@ -3211,7 +3214,7 @@ finish_open: + error = -EISDIR; + if (d_is_dir(nd->path.dentry)) + goto out; +- error = may_create_in_sticky(dir, ++ error = may_create_in_sticky(dir_mode, dir_uid, + d_backing_inode(nd->path.dentry)); + if (unlikely(error)) + goto out; +diff --git a/fs/nfs/super.c b/fs/nfs/super.c +index dced329a8584..47a7751146cf 100644 +--- a/fs/nfs/super.c ++++ b/fs/nfs/super.c +@@ -1901,7 +1901,7 @@ static int nfs_parse_devname(const char *dev_name, + /* kill possible hostname list: not supported */ + comma = strchr(dev_name, ','); + if (comma != NULL && comma < end) +- *comma = 0; ++ len = comma - dev_name; + } + + if (len > maxnamlen) +diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c +index 7795e0d01382..4b94db85b2a0 100644 +--- a/fs/xfs/xfs_quotaops.c ++++ b/fs/xfs/xfs_quotaops.c +@@ -214,6 +214,9 @@ xfs_fs_rm_xquota( + if (XFS_IS_QUOTA_ON(mp)) + return -EINVAL; + ++ if (uflags & ~(FS_USER_QUOTA | FS_GROUP_QUOTA | FS_PROJ_QUOTA)) ++ return -EINVAL; ++ + if (uflags & FS_USER_QUOTA) + flags |= XFS_DQ_USER; + if (uflags & FS_GROUP_QUOTA) +diff --git a/include/asm-generic/rtc.h b/include/asm-generic/rtc.h +index 4e3b6558331e..3e457ae2d571 100644 +--- a/include/asm-generic/rtc.h ++++ b/include/asm-generic/rtc.h +@@ -106,7 +106,7 @@ static inline unsigned int __get_rtc_time(struct rtc_time *time) + time->tm_year += real_year - 72; + #endif + +- if (century) ++ if (century > 20) + time->tm_year += (century - 19) * 100; + + /* +diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h +index 714ce4a5e31f..39d47af6ca7b 100644 +--- a/include/linux/bitmap.h ++++ b/include/linux/bitmap.h +@@ -83,6 +83,14 @@ + * contain all bit positions from 0 to 'bits' - 1. + */ + ++/* ++ * Allocation and deallocation of bitmap. ++ * Provided in lib/bitmap.c to avoid circular dependency. ++ */ ++extern unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags); ++extern unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags); ++extern void bitmap_free(const unsigned long *bitmap); ++ + /* + * lib/bitmap.c provides these functions: + */ +diff --git a/include/linux/device.h b/include/linux/device.h +index 834000903525..eb891c9c4b62 100644 +--- a/include/linux/device.h ++++ b/include/linux/device.h +@@ -677,7 +677,8 @@ extern unsigned long devm_get_free_pages(struct device *dev, + gfp_t gfp_mask, unsigned int order); + extern void devm_free_pages(struct device *dev, unsigned long addr); + +-void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); ++void __iomem *devm_ioremap_resource(struct device *dev, ++ const struct resource *res); + + /* allows to add/remove a custom action to devres stack */ + int devm_add_action(struct device *dev, void (*action)(void *), void *data); +diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h +index 0e1f433cc4b7..378c234ba3e4 100644 +--- a/include/linux/netfilter/ipset/ip_set.h ++++ b/include/linux/netfilter/ipset/ip_set.h +@@ -530,13 +530,6 @@ ip6addrptr(const struct sk_buff *skb, bool src, struct in6_addr *addr) + sizeof(*addr)); + } + +-/* Calculate the bytes required to store the inclusive range of a-b */ +-static inline int +-bitmap_bytes(u32 a, u32 b) +-{ +- return 4 * ((((b - a + 8) / 8) + 3) / 4); +-} +- + #include + #include + +diff --git a/include/linux/platform_data/dma-imx-sdma.h b/include/linux/platform_data/dma-imx-sdma.h +index 2d08816720f6..5bb0a119f39a 100644 +--- a/include/linux/platform_data/dma-imx-sdma.h ++++ b/include/linux/platform_data/dma-imx-sdma.h +@@ -50,7 +50,10 @@ struct sdma_script_start_addrs { + /* End of v2 array */ + s32 zcanfd_2_mcu_addr; + s32 zqspi_2_mcu_addr; ++ s32 mcu_2_ecspi_addr; + /* End of v3 array */ ++ s32 mcu_2_zqspi_addr; ++ /* End of v4 array */ + }; + + /** +diff --git a/include/linux/signal.h b/include/linux/signal.h +index bcc094cb697c..649cd9fc63ca 100644 +--- a/include/linux/signal.h ++++ b/include/linux/signal.h +@@ -313,6 +313,9 @@ extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping); + extern void exit_signals(struct task_struct *tsk); + extern void kernel_sigaction(int, __sighandler_t); + ++#define SIG_KTHREAD ((__force __sighandler_t)2) ++#define SIG_KTHREAD_KERNEL ((__force __sighandler_t)3) ++ + static inline void allow_signal(int sig) + { + /* +@@ -320,7 +323,17 @@ static inline void allow_signal(int sig) + * know it'll be handled, so that they don't get converted to + * SIGKILL or just silently dropped. + */ +- kernel_sigaction(sig, (__force __sighandler_t)2); ++ kernel_sigaction(sig, SIG_KTHREAD); ++} ++ ++static inline void allow_kernel_signal(int sig) ++{ ++ /* ++ * Kernel threads handle their own signals. Let the signal code ++ * know signals sent by the kernel will be handled, so that they ++ * don't get silently dropped. ++ */ ++ kernel_sigaction(sig, SIG_KTHREAD_KERNEL); + } + + static inline void disallow_signal(int sig) +diff --git a/include/media/davinci/vpbe.h b/include/media/davinci/vpbe.h +index 4376beeb28c2..5d8ceeddc797 100644 +--- a/include/media/davinci/vpbe.h ++++ b/include/media/davinci/vpbe.h +@@ -96,7 +96,7 @@ struct vpbe_config { + struct encoder_config_info *ext_encoders; + /* amplifier information goes here */ + struct amp_config_info *amp; +- int num_outputs; ++ unsigned int num_outputs; + /* Order is venc outputs followed by LCD and then external encoders */ + struct vpbe_output *outputs; + }; +diff --git a/include/trace/events/xen.h b/include/trace/events/xen.h +index d6be935caa50..ecd1a0f7bd3e 100644 +--- a/include/trace/events/xen.h ++++ b/include/trace/events/xen.h +@@ -63,7 +63,11 @@ TRACE_EVENT(xen_mc_callback, + TP_PROTO(xen_mc_callback_fn_t fn, void *data), + TP_ARGS(fn, data), + TP_STRUCT__entry( +- __field(xen_mc_callback_fn_t, fn) ++ /* ++ * Use field_struct to avoid is_signed_type() ++ * comparison of a function pointer. ++ */ ++ __field_struct(xen_mc_callback_fn_t, fn) + __field(void *, data) + ), + TP_fast_assign( +diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c +index ebc52c7bd8a6..cba287a5c976 100644 +--- a/kernel/debug/kdb/kdb_main.c ++++ b/kernel/debug/kdb/kdb_main.c +@@ -2632,7 +2632,7 @@ static int kdb_per_cpu(int argc, const char **argv) + diag = kdbgetularg(argv[3], &whichcpu); + if (diag) + return diag; +- if (!cpu_online(whichcpu)) { ++ if (whichcpu >= nr_cpu_ids || !cpu_online(whichcpu)) { + kdb_printf("cpu %ld is not online\n", whichcpu); + return KDB_BADCPUNUM; + } +diff --git a/kernel/signal.c b/kernel/signal.c +index 3095b2309876..7e4a4b199a11 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -79,6 +79,11 @@ static int sig_task_ignored(struct task_struct *t, int sig, bool force) + handler == SIG_DFL && !(force && sig_kernel_only(sig))) + return 1; + ++ /* Only allow kernel generated signals to this kthread */ ++ if (unlikely((t->flags & PF_KTHREAD) && ++ (handler == SIG_KTHREAD_KERNEL) && !force)) ++ return true; ++ + return sig_handler_ignored(handler, sig); + } + +diff --git a/lib/bitmap.c b/lib/bitmap.c +index 814814397cce..bdf572d09b8f 100644 +--- a/lib/bitmap.c ++++ b/lib/bitmap.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -1081,3 +1082,22 @@ void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int n + } + EXPORT_SYMBOL(bitmap_copy_le); + #endif ++ ++unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags) ++{ ++ return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long), ++ flags); ++} ++EXPORT_SYMBOL(bitmap_alloc); ++ ++unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags) ++{ ++ return bitmap_alloc(nbits, flags | __GFP_ZERO); ++} ++EXPORT_SYMBOL(bitmap_zalloc); ++ ++void bitmap_free(const unsigned long *bitmap) ++{ ++ kfree(bitmap); ++} ++EXPORT_SYMBOL(bitmap_free); +diff --git a/lib/devres.c b/lib/devres.c +index 8c85672639d3..9d18ccd00df5 100644 +--- a/lib/devres.c ++++ b/lib/devres.c +@@ -131,7 +131,8 @@ EXPORT_SYMBOL(devm_iounmap); + * if (IS_ERR(base)) + * return PTR_ERR(base); + */ +-void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) ++void __iomem *devm_ioremap_resource(struct device *dev, ++ const struct resource *res) + { + resource_size_t size; + const char *name; +diff --git a/lib/kfifo.c b/lib/kfifo.c +index 90ba1eb1df06..a94227c55551 100644 +--- a/lib/kfifo.c ++++ b/lib/kfifo.c +@@ -82,7 +82,8 @@ int __kfifo_init(struct __kfifo *fifo, void *buffer, + { + size /= esize; + +- size = roundup_pow_of_two(size); ++ if (!is_power_of_2(size)) ++ size = rounddown_pow_of_two(size); + + fifo->in = 0; + fifo->out = 0; +diff --git a/net/6lowpan/nhc.c b/net/6lowpan/nhc.c +index 7008d53e455c..e61679bf0908 100644 +--- a/net/6lowpan/nhc.c ++++ b/net/6lowpan/nhc.c +@@ -18,7 +18,7 @@ + #include "nhc.h" + + static struct rb_root rb_root = RB_ROOT; +-static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX]; ++static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX + 1]; + static DEFINE_SPINLOCK(lowpan_nhc_lock); + + static int lowpan_nhc_insert(struct lowpan_nhc *nhc) +diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c +index fd1af7cb960d..e7c170949b21 100644 +--- a/net/bridge/netfilter/ebtables.c ++++ b/net/bridge/netfilter/ebtables.c +@@ -2174,7 +2174,9 @@ static int compat_copy_entries(unsigned char *data, unsigned int size_user, + if (ret < 0) + return ret; + +- WARN_ON(size_remaining); ++ if (size_remaining) ++ return -EINVAL; ++ + return state->buf_kern_offset; + } + +diff --git a/net/core/neighbour.c b/net/core/neighbour.c +index af1ecd0e7b07..9849f1f4cf4f 100644 +--- a/net/core/neighbour.c ++++ b/net/core/neighbour.c +@@ -1837,8 +1837,8 @@ static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl, + goto nla_put_failure; + { + unsigned long now = jiffies; +- unsigned int flush_delta = now - tbl->last_flush; +- unsigned int rand_delta = now - tbl->last_rand; ++ long flush_delta = now - tbl->last_flush; ++ long rand_delta = now - tbl->last_rand; + struct neigh_hash_table *nht; + struct ndt_config ndc = { + .ndtc_key_len = tbl->key_len, +diff --git a/net/ieee802154/6lowpan/reassembly.c b/net/ieee802154/6lowpan/reassembly.c +index 6183730d38db..e728dae467c3 100644 +--- a/net/ieee802154/6lowpan/reassembly.c ++++ b/net/ieee802154/6lowpan/reassembly.c +@@ -634,7 +634,7 @@ err_sysctl: + + void lowpan_net_frag_exit(void) + { +- inet_frags_fini(&lowpan_frags); + lowpan_frags_sysctl_unregister(); + unregister_pernet_subsys(&lowpan_frags_ops); ++ inet_frags_fini(&lowpan_frags); + } +diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c +index 91ae061d46ac..e598aa14f167 100644 +--- a/net/ipv4/ip_tunnel.c ++++ b/net/ipv4/ip_tunnel.c +@@ -1151,10 +1151,8 @@ int ip_tunnel_init(struct net_device *dev) + iph->version = 4; + iph->ihl = 5; + +- if (tunnel->collect_md) { +- dev->features |= NETIF_F_NETNS_LOCAL; ++ if (tunnel->collect_md) + netif_keep_dst(dev); +- } + return 0; + } + EXPORT_SYMBOL_GPL(ip_tunnel_init); +diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c +index ec917f58d105..17e9ed2edb86 100644 +--- a/net/ipv6/reassembly.c ++++ b/net/ipv6/reassembly.c +@@ -774,8 +774,8 @@ err_protocol: + + void ipv6_frag_exit(void) + { +- inet_frags_fini(&ip6_frags); + ip6_frags_sysctl_unregister(); + unregister_pernet_subsys(&ip6_frags_ops); + inet6_del_protocol(&frag_protocol, IPPROTO_FRAGMENT); ++ inet_frags_fini(&ip6_frags); + } +diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c +index 5984cc35d508..3edffb7bf2a4 100644 +--- a/net/iucv/af_iucv.c ++++ b/net/iucv/af_iucv.c +@@ -2392,6 +2392,13 @@ out: + return err; + } + ++static void afiucv_iucv_exit(void) ++{ ++ device_unregister(af_iucv_dev); ++ driver_unregister(&af_iucv_driver); ++ pr_iucv->iucv_unregister(&af_iucv_handler, 0); ++} ++ + static int __init afiucv_init(void) + { + int err; +@@ -2425,11 +2432,18 @@ static int __init afiucv_init(void) + err = afiucv_iucv_init(); + if (err) + goto out_sock; +- } else +- register_netdevice_notifier(&afiucv_netdev_notifier); ++ } ++ ++ err = register_netdevice_notifier(&afiucv_netdev_notifier); ++ if (err) ++ goto out_notifier; ++ + dev_add_pack(&iucv_packet_type); + return 0; + ++out_notifier: ++ if (pr_iucv) ++ afiucv_iucv_exit(); + out_sock: + sock_unregister(PF_IUCV); + out_proto: +@@ -2443,12 +2457,11 @@ out: + static void __exit afiucv_exit(void) + { + if (pr_iucv) { +- device_unregister(af_iucv_dev); +- driver_unregister(&af_iucv_driver); +- pr_iucv->iucv_unregister(&af_iucv_handler, 0); ++ afiucv_iucv_exit(); + symbol_put(iucv_if); +- } else +- unregister_netdevice_notifier(&afiucv_netdev_notifier); ++ } ++ ++ unregister_netdevice_notifier(&afiucv_netdev_notifier); + dev_remove_pack(&iucv_packet_type); + sock_unregister(PF_IUCV); + proto_unregister(&iucv_proto); +diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c +index c153fc2883a8..69f1558dfcb7 100644 +--- a/net/llc/af_llc.c ++++ b/net/llc/af_llc.c +@@ -111,22 +111,26 @@ static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr) + * + * Send data via reliable llc2 connection. + * Returns 0 upon success, non-zero if action did not succeed. ++ * ++ * This function always consumes a reference to the skb. + */ + static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock) + { + struct llc_sock* llc = llc_sk(sk); +- int rc = 0; + + if (unlikely(llc_data_accept_state(llc->state) || + llc->remote_busy_flag || + llc->p_flag)) { + long timeout = sock_sndtimeo(sk, noblock); ++ int rc; + + rc = llc_ui_wait_for_busy_core(sk, timeout); ++ if (rc) { ++ kfree_skb(skb); ++ return rc; ++ } + } +- if (unlikely(!rc)) +- rc = llc_build_and_send_pkt(sk, skb); +- return rc; ++ return llc_build_and_send_pkt(sk, skb); + } + + static void llc_ui_sk_init(struct socket *sock, struct sock *sk) +@@ -896,7 +900,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name); + int flags = msg->msg_flags; + int noblock = flags & MSG_DONTWAIT; +- struct sk_buff *skb; ++ struct sk_buff *skb = NULL; + size_t size = 0; + int rc = -EINVAL, copied = 0, hdrlen; + +@@ -905,10 +909,10 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + lock_sock(sk); + if (addr) { + if (msg->msg_namelen < sizeof(*addr)) +- goto release; ++ goto out; + } else { + if (llc_ui_addr_null(&llc->addr)) +- goto release; ++ goto out; + addr = &llc->addr; + } + /* must bind connection to sap if user hasn't done it. */ +@@ -916,7 +920,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + /* bind to sap with null dev, exclusive. */ + rc = llc_ui_autobind(sock, addr); + if (rc) +- goto release; ++ goto out; + } + hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr); + size = hdrlen + len; +@@ -925,12 +929,12 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + copied = size - hdrlen; + rc = -EINVAL; + if (copied < 0) +- goto release; ++ goto out; + release_sock(sk); + skb = sock_alloc_send_skb(sk, size, noblock, &rc); + lock_sock(sk); + if (!skb) +- goto release; ++ goto out; + skb->dev = llc->dev; + skb->protocol = llc_proto_type(addr->sllc_arphrd); + skb_reserve(skb, hdrlen); +@@ -940,29 +944,31 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) { + llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + if (addr->sllc_test) { + llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + if (addr->sllc_xid) { + llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac, + addr->sllc_sap); ++ skb = NULL; + goto out; + } + rc = -ENOPROTOOPT; + if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua)) + goto out; + rc = llc_ui_send_data(sk, skb, noblock); ++ skb = NULL; + out: +- if (rc) { +- kfree_skb(skb); +-release: ++ kfree_skb(skb); ++ if (rc) + dprintk("%s: failed sending from %02X to %02X: %d\n", + __func__, llc->laddr.lsap, llc->daddr.lsap, rc); +- } + release_sock(sk); + return rc ? : copied; + } +diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c +index d861b74ad068..3b002ab68b29 100644 +--- a/net/llc/llc_conn.c ++++ b/net/llc/llc_conn.c +@@ -55,6 +55,8 @@ int sysctl_llc2_busy_timeout = LLC2_BUSY_TIME * HZ; + * (executing it's actions and changing state), upper layer will be + * indicated or confirmed, if needed. Returns 0 for success, 1 for + * failure. The socket lock has to be held before calling this function. ++ * ++ * This function always consumes a reference to the skb. + */ + int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + { +@@ -62,12 +64,6 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + struct llc_sock *llc = llc_sk(skb->sk); + struct llc_conn_state_ev *ev = llc_conn_ev(skb); + +- /* +- * We have to hold the skb, because llc_conn_service will kfree it in +- * the sending path and we need to look at the skb->cb, where we encode +- * llc_conn_state_ev. +- */ +- skb_get(skb); + ev->ind_prim = ev->cfm_prim = 0; + /* + * Send event to state machine +@@ -75,21 +71,12 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + rc = llc_conn_service(skb->sk, skb); + if (unlikely(rc != 0)) { + printk(KERN_ERR "%s: llc_conn_service failed\n", __func__); +- goto out_kfree_skb; +- } +- +- if (unlikely(!ev->ind_prim && !ev->cfm_prim)) { +- /* indicate or confirm not required */ +- if (!skb->next) +- goto out_kfree_skb; + goto out_skb_put; + } + +- if (unlikely(ev->ind_prim && ev->cfm_prim)) /* Paranoia */ +- skb_get(skb); +- + switch (ev->ind_prim) { + case LLC_DATA_PRIM: ++ skb_get(skb); + llc_save_primitive(sk, skb, LLC_DATA_PRIM); + if (unlikely(sock_queue_rcv_skb(sk, skb))) { + /* +@@ -106,6 +93,7 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + * skb->sk pointing to the newly created struct sock in + * llc_conn_handler. -acme + */ ++ skb_get(skb); + skb_queue_tail(&sk->sk_receive_queue, skb); + sk->sk_state_change(sk); + break; +@@ -121,7 +109,6 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + sk->sk_state_change(sk); + } + } +- kfree_skb(skb); + sock_put(sk); + break; + case LLC_RESET_PRIM: +@@ -130,14 +117,11 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + * RESET is not being notified to upper layers for now + */ + printk(KERN_INFO "%s: received a reset ind!\n", __func__); +- kfree_skb(skb); + break; + default: +- if (ev->ind_prim) { ++ if (ev->ind_prim) + printk(KERN_INFO "%s: received unknown %d prim!\n", + __func__, ev->ind_prim); +- kfree_skb(skb); +- } + /* No indication */ + break; + } +@@ -179,15 +163,12 @@ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) + printk(KERN_INFO "%s: received a reset conf!\n", __func__); + break; + default: +- if (ev->cfm_prim) { ++ if (ev->cfm_prim) + printk(KERN_INFO "%s: received unknown %d prim!\n", + __func__, ev->cfm_prim); +- break; +- } +- goto out_skb_put; /* No confirmation */ ++ /* No confirmation */ ++ break; + } +-out_kfree_skb: +- kfree_skb(skb); + out_skb_put: + kfree_skb(skb); + return rc; +diff --git a/net/llc/llc_if.c b/net/llc/llc_if.c +index 6daf391b3e84..fc4d2bd8816f 100644 +--- a/net/llc/llc_if.c ++++ b/net/llc/llc_if.c +@@ -38,6 +38,8 @@ + * closed and -EBUSY when sending data is not permitted in this state or + * LLC has send an I pdu with p bit set to 1 and is waiting for it's + * response. ++ * ++ * This function always consumes a reference to the skb. + */ + int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) + { +@@ -46,20 +48,22 @@ int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) + struct llc_sock *llc = llc_sk(sk); + + if (unlikely(llc->state == LLC_CONN_STATE_ADM)) +- goto out; ++ goto out_free; + rc = -EBUSY; + if (unlikely(llc_data_accept_state(llc->state) || /* data_conn_refuse */ + llc->p_flag)) { + llc->failed_data_req = 1; +- goto out; ++ goto out_free; + } + ev = llc_conn_ev(skb); + ev->type = LLC_CONN_EV_TYPE_PRIM; + ev->prim = LLC_DATA_PRIM; + ev->prim_type = LLC_PRIM_TYPE_REQ; + skb->dev = llc->dev; +- rc = llc_conn_state_process(sk, skb); +-out: ++ return llc_conn_state_process(sk, skb); ++ ++out_free: ++ kfree_skb(skb); + return rc; + } + +diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c +index ff3b28e7dbce..fb44f0107da1 100644 +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -546,7 +546,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) + + /* (re)Initialize group rate indexes */ + for(j = 0; j < MAX_THR_RATES; j++) +- tmp_group_tp_rate[j] = group; ++ tmp_group_tp_rate[j] = MCS_GROUP_RATES * group; + + for (i = 0; i < MCS_GROUP_RATES; i++) { + if (!(mg->supported & BIT(i))) +diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c +index 3b8e2f97d815..2b7975c4dac7 100644 +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -3040,9 +3040,18 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) + case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP): + /* process for all: mesh, mlme, ibss */ + break; ++ case cpu_to_le16(IEEE80211_STYPE_DEAUTH): ++ if (is_multicast_ether_addr(mgmt->da) && ++ !is_broadcast_ether_addr(mgmt->da)) ++ return RX_DROP_MONITOR; ++ ++ /* process only for station/IBSS */ ++ if (sdata->vif.type != NL80211_IFTYPE_STATION && ++ sdata->vif.type != NL80211_IFTYPE_ADHOC) ++ return RX_DROP_MONITOR; ++ break; + case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): + case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): +- case cpu_to_le16(IEEE80211_STYPE_DEAUTH): + case cpu_to_le16(IEEE80211_STYPE_DISASSOC): + if (is_multicast_ether_addr(mgmt->da) && + !is_broadcast_ether_addr(mgmt->da)) +diff --git a/net/netfilter/ipset/ip_set_bitmap_gen.h b/net/netfilter/ipset/ip_set_bitmap_gen.h +index adc703ccd68b..7d08a170ac27 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_gen.h ++++ b/net/netfilter/ipset/ip_set_bitmap_gen.h +@@ -81,7 +81,7 @@ mtype_flush(struct ip_set *set) + + if (set->extensions & IPSET_EXT_DESTROY) + mtype_ext_cleanup(set); +- memset(map->members, 0, map->memsize); ++ bitmap_zero(map->members, map->elements); + } + + static int +diff --git a/net/netfilter/ipset/ip_set_bitmap_ip.c b/net/netfilter/ipset/ip_set_bitmap_ip.c +index 4783efff0bde..a4c104a4977f 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_ip.c ++++ b/net/netfilter/ipset/ip_set_bitmap_ip.c +@@ -40,7 +40,7 @@ MODULE_ALIAS("ip_set_bitmap:ip"); + + /* Type structure */ + struct bitmap_ip { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -222,7 +222,7 @@ init_map_ip(struct ip_set *set, struct bitmap_ip *map, + u32 first_ip, u32 last_ip, + u32 elements, u32 hosts, u8 netmask) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_ip = first_ip; +@@ -315,7 +315,7 @@ bitmap_ip_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + if (!map) + return -ENOMEM; + +- map->memsize = bitmap_bytes(0, elements - 1); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_ip; + if (!init_map_ip(set, map, first_ip, last_ip, + elements, hosts, netmask)) { +diff --git a/net/netfilter/ipset/ip_set_bitmap_ipmac.c b/net/netfilter/ipset/ip_set_bitmap_ipmac.c +index 29dde208381d..0e961690510d 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_ipmac.c ++++ b/net/netfilter/ipset/ip_set_bitmap_ipmac.c +@@ -46,7 +46,7 @@ enum { + + /* Type structure */ + struct bitmap_ipmac { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u32 first_ip; /* host byte order, included in range */ + u32 last_ip; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -297,7 +297,7 @@ static bool + init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map, + u32 first_ip, u32 last_ip, u32 elements) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_ip = first_ip; +@@ -361,7 +361,7 @@ bitmap_ipmac_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + if (!map) + return -ENOMEM; + +- map->memsize = bitmap_bytes(0, elements - 1); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_ipmac; + if (!init_map_ipmac(set, map, first_ip, last_ip, elements)) { + kfree(map); +diff --git a/net/netfilter/ipset/ip_set_bitmap_port.c b/net/netfilter/ipset/ip_set_bitmap_port.c +index 7f0c733358a4..6771b362a123 100644 +--- a/net/netfilter/ipset/ip_set_bitmap_port.c ++++ b/net/netfilter/ipset/ip_set_bitmap_port.c +@@ -34,7 +34,7 @@ MODULE_ALIAS("ip_set_bitmap:port"); + + /* Type structure */ + struct bitmap_port { +- void *members; /* the set members */ ++ unsigned long *members; /* the set members */ + u16 first_port; /* host byte order, included in range */ + u16 last_port; /* host byte order, included in range */ + u32 elements; /* number of max elements in the set */ +@@ -207,7 +207,7 @@ static bool + init_map_port(struct ip_set *set, struct bitmap_port *map, + u16 first_port, u16 last_port) + { +- map->members = ip_set_alloc(map->memsize); ++ map->members = bitmap_zalloc(map->elements, GFP_KERNEL | __GFP_NOWARN); + if (!map->members) + return false; + map->first_port = first_port; +@@ -250,7 +250,7 @@ bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[], + return -ENOMEM; + + map->elements = elements; +- map->memsize = bitmap_bytes(0, map->elements); ++ map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); + set->variant = &bitmap_port; + if (!init_map_port(set, map, first_port, last_port)) { + kfree(map); +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c +index 8b277658905f..eac6f7eea7b5 100644 +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -1332,15 +1332,21 @@ static void packet_sock_destruct(struct sock *sk) + + static bool fanout_flow_is_huge(struct packet_sock *po, struct sk_buff *skb) + { +- u32 rxhash; ++ u32 *history = po->rollover->history; ++ u32 victim, rxhash; + int i, count = 0; + + rxhash = skb_get_hash(skb); + for (i = 0; i < ROLLOVER_HLEN; i++) +- if (po->rollover->history[i] == rxhash) ++ if (READ_ONCE(history[i]) == rxhash) + count++; + +- po->rollover->history[prandom_u32() % ROLLOVER_HLEN] = rxhash; ++ victim = prandom_u32() % ROLLOVER_HLEN; ++ ++ /* Avoid dirtying the cache line if possible */ ++ if (READ_ONCE(history[victim]) != rxhash) ++ WRITE_ONCE(history[victim], rxhash); ++ + return count > (ROLLOVER_HLEN >> 1); + } + +@@ -3309,20 +3315,29 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, + sock_recv_ts_and_drops(msg, sk, skb); + + if (msg->msg_name) { ++ int copy_len; ++ + /* If the address length field is there to be filled + * in, we fill it in now. + */ + if (sock->type == SOCK_PACKET) { + __sockaddr_check_size(sizeof(struct sockaddr_pkt)); + msg->msg_namelen = sizeof(struct sockaddr_pkt); ++ copy_len = msg->msg_namelen; + } else { + struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; + + msg->msg_namelen = sll->sll_halen + + offsetof(struct sockaddr_ll, sll_addr); ++ copy_len = msg->msg_namelen; ++ if (msg->msg_namelen < sizeof(struct sockaddr_ll)) { ++ memset(msg->msg_name + ++ offsetof(struct sockaddr_ll, sll_addr), ++ 0, sizeof(sll->sll_addr)); ++ msg->msg_namelen = sizeof(struct sockaddr_ll); ++ } + } +- memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, +- msg->msg_namelen); ++ memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, copy_len); + } + + if (pkt_sk(sk)->auxdata) { +diff --git a/net/rds/ib_stats.c b/net/rds/ib_stats.c +index d77e04473056..a88460058185 100644 +--- a/net/rds/ib_stats.c ++++ b/net/rds/ib_stats.c +@@ -42,7 +42,7 @@ DEFINE_PER_CPU_SHARED_ALIGNED(struct rds_ib_statistics, rds_ib_stats); + static const char *const rds_ib_stat_names[] = { + "ib_connect_raced", + "ib_listen_closed_stale", +- "s_ib_evt_handler_call", ++ "ib_evt_handler_call", + "ib_tasklet_call", + "ib_tx_cq_event", + "ib_tx_ring_full", +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index fbb7ebfc58c6..b0b04b3c0896 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -267,12 +267,12 @@ static int tcf_em_validate(struct tcf_proto *tp, + } + em->data = (unsigned long) v; + } ++ em->datalen = data_len; + } + } + + em->matchid = em_hdr->matchid; + em->flags = em_hdr->flags; +- em->datalen = data_len; + em->net = net; + + err = 0; +diff --git a/net/tipc/sysctl.c b/net/tipc/sysctl.c +index 1a779b1e8510..40f6d82083d7 100644 +--- a/net/tipc/sysctl.c ++++ b/net/tipc/sysctl.c +@@ -37,6 +37,8 @@ + + #include + ++static int zero; ++static int one = 1; + static struct ctl_table_header *tipc_ctl_hdr; + + static struct ctl_table tipc_table[] = { +@@ -45,14 +47,16 @@ static struct ctl_table tipc_table[] = { + .data = &sysctl_tipc_rmem, + .maxlen = sizeof(sysctl_tipc_rmem), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ .proc_handler = proc_dointvec_minmax, ++ .extra1 = &one, + }, + { + .procname = "named_timeout", + .data = &sysctl_tipc_named_timeout, + .maxlen = sizeof(sysctl_tipc_named_timeout), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ .proc_handler = proc_dointvec_minmax, ++ .extra1 = &zero, + }, + {} + }; +diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c +index f330475a87ff..f9fb8613fb28 100644 +--- a/net/x25/af_x25.c ++++ b/net/x25/af_x25.c +@@ -764,6 +764,10 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, + if (sk->sk_state == TCP_ESTABLISHED) + goto out; + ++ rc = -EALREADY; /* Do nothing if call is already in progress */ ++ if (sk->sk_state == TCP_SYN_SENT) ++ goto out; ++ + sk->sk_state = TCP_CLOSE; + sock->state = SS_UNCONNECTED; + +@@ -810,7 +814,7 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, + /* Now the loop */ + rc = -EINPROGRESS; + if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) +- goto out_put_neigh; ++ goto out; + + rc = x25_wait_for_connection_establishment(sk); + if (rc) +diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c +index 42396a74405d..7250fb38350c 100644 +--- a/scripts/recordmcount.c ++++ b/scripts/recordmcount.c +@@ -53,6 +53,10 @@ + #define R_AARCH64_ABS64 257 + #endif + ++#define R_ARM_PC24 1 ++#define R_ARM_THM_CALL 10 ++#define R_ARM_CALL 28 ++ + static int fd_map; /* File descriptor for file being modified. */ + static int mmap_failed; /* Boolean flag. */ + static char gpfx; /* prefix for global symbol name (sometimes '_') */ +@@ -372,6 +376,18 @@ is_mcounted_section_name(char const *const txtname) + #define RECORD_MCOUNT_64 + #include "recordmcount.h" + ++static int arm_is_fake_mcount(Elf32_Rel const *rp) ++{ ++ switch (ELF32_R_TYPE(w(rp->r_info))) { ++ case R_ARM_THM_CALL: ++ case R_ARM_CALL: ++ case R_ARM_PC24: ++ return 0; ++ } ++ ++ return 1; ++} ++ + /* 64-bit EM_MIPS has weird ELF64_Rela.r_info. + * http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf + * We interpret Table 29 Relocation Operation (Elf64_Rel, Elf64_Rela) [p.40] +@@ -461,6 +477,7 @@ do_file(char const *const fname) + break; + case EM_ARM: reltype = R_ARM_ABS32; + altmcount = "__gnu_mcount_nc"; ++ is_fake_mcount32 = arm_is_fake_mcount; + break; + case EM_AARCH64: + reltype = R_AARCH64_ABS64; +diff --git a/sound/aoa/codecs/onyx.c b/sound/aoa/codecs/onyx.c +index a04edff8b729..ae50d59fb810 100644 +--- a/sound/aoa/codecs/onyx.c ++++ b/sound/aoa/codecs/onyx.c +@@ -74,8 +74,10 @@ static int onyx_read_register(struct onyx *onyx, u8 reg, u8 *value) + return 0; + } + v = i2c_smbus_read_byte_data(onyx->i2c, reg); +- if (v < 0) ++ if (v < 0) { ++ *value = 0; + return -1; ++ } + *value = (u8)v; + onyx->cache[ONYX_REG_CONTROL-FIRSTREGISTER] = *value; + return 0; +diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h +index 55ec4470f6b6..499873d29cc1 100644 +--- a/sound/pci/hda/hda_controller.h ++++ b/sound/pci/hda/hda_controller.h +@@ -164,11 +164,10 @@ struct azx { + #define azx_bus(chip) (&(chip)->bus.core) + #define bus_to_azx(_bus) container_of(_bus, struct azx, bus.core) + +-#ifdef CONFIG_X86 +-#define azx_snoop(chip) ((chip)->snoop) +-#else +-#define azx_snoop(chip) true +-#endif ++static inline bool azx_snoop(struct azx *chip) ++{ ++ return !IS_ENABLED(CONFIG_X86) || chip->snoop; ++} + + /* + * macros for easy use +diff --git a/sound/soc/codecs/cs4349.c b/sound/soc/codecs/cs4349.c +index 0ac8fc5ed4ae..9ebd500ecf38 100644 +--- a/sound/soc/codecs/cs4349.c ++++ b/sound/soc/codecs/cs4349.c +@@ -379,6 +379,7 @@ static struct i2c_driver cs4349_i2c_driver = { + .driver = { + .name = "cs4349", + .of_match_table = cs4349_of_match, ++ .pm = &cs4349_runtime_pm, + }, + .id_table = cs4349_i2c_id, + .probe = cs4349_i2c_probe, +diff --git a/sound/soc/codecs/es8328.c b/sound/soc/codecs/es8328.c +index afa6c5db9dcc..2bf30d0eb82f 100644 +--- a/sound/soc/codecs/es8328.c ++++ b/sound/soc/codecs/es8328.c +@@ -210,7 +210,7 @@ static const struct soc_enum es8328_rline_enum = + ARRAY_SIZE(es8328_line_texts), + es8328_line_texts); + static const struct snd_kcontrol_new es8328_right_line_controls = +- SOC_DAPM_ENUM("Route", es8328_lline_enum); ++ SOC_DAPM_ENUM("Route", es8328_rline_enum); + + /* Left Mixer */ + static const struct snd_kcontrol_new es8328_left_mixer_controls[] = { +diff --git a/sound/soc/codecs/wm8737.c b/sound/soc/codecs/wm8737.c +index e7807601e675..ae69cb790ac3 100644 +--- a/sound/soc/codecs/wm8737.c ++++ b/sound/soc/codecs/wm8737.c +@@ -170,7 +170,7 @@ SOC_DOUBLE("Polarity Invert Switch", WM8737_ADC_CONTROL, 5, 6, 1, 0), + SOC_SINGLE("3D Switch", WM8737_3D_ENHANCE, 0, 1, 0), + SOC_SINGLE("3D Depth", WM8737_3D_ENHANCE, 1, 15, 0), + SOC_ENUM("3D Low Cut-off", low_3d), +-SOC_ENUM("3D High Cut-off", low_3d), ++SOC_ENUM("3D High Cut-off", high_3d), + SOC_SINGLE_TLV("3D ADC Volume", WM8737_3D_ENHANCE, 7, 1, 1, adc_tlv), + + SOC_SINGLE("Noise Gate Switch", WM8737_NOISE_GATE, 0, 1, 0), +diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c +index 2f7be6cee98e..fc0a73227b02 100644 +--- a/sound/soc/davinci/davinci-mcasp.c ++++ b/sound/soc/davinci/davinci-mcasp.c +@@ -875,14 +875,13 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream, + active_slots = hweight32(mcasp->tdm_mask[stream]); + active_serializers = (channels + active_slots - 1) / + active_slots; +- if (active_serializers == 1) { ++ if (active_serializers == 1) + active_slots = channels; +- for (i = 0; i < total_slots; i++) { +- if ((1 << i) & mcasp->tdm_mask[stream]) { +- mask |= (1 << i); +- if (--active_slots <= 0) +- break; +- } ++ for (i = 0; i < total_slots; i++) { ++ if ((1 << i) & mcasp->tdm_mask[stream]) { ++ mask |= (1 << i); ++ if (--active_slots <= 0) ++ break; + } + } + } else { +diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c +index 8e525f7ac08d..3d99a8579c99 100644 +--- a/sound/soc/fsl/imx-sgtl5000.c ++++ b/sound/soc/fsl/imx-sgtl5000.c +@@ -119,7 +119,8 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) + codec_dev = of_find_i2c_device_by_node(codec_np); + if (!codec_dev) { + dev_err(&pdev->dev, "failed to find codec platform device\n"); +- return -EPROBE_DEFER; ++ ret = -EPROBE_DEFER; ++ goto fail; + } + + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); +diff --git a/sound/soc/qcom/apq8016_sbc.c b/sound/soc/qcom/apq8016_sbc.c +index 1efdf0088ecd..886f2027e671 100644 +--- a/sound/soc/qcom/apq8016_sbc.c ++++ b/sound/soc/qcom/apq8016_sbc.c +@@ -98,13 +98,15 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + + if (!cpu || !codec) { + dev_err(dev, "Can't find cpu/codec DT node\n"); +- return ERR_PTR(-EINVAL); ++ ret = -EINVAL; ++ goto error; + } + + link->cpu_of_node = of_parse_phandle(cpu, "sound-dai", 0); + if (!link->cpu_of_node) { + dev_err(card->dev, "error getting cpu phandle\n"); +- return ERR_PTR(-EINVAL); ++ ret = -EINVAL; ++ goto error; + } + + link->codec_of_node = of_parse_phandle(codec, "sound-dai", 0); +@@ -116,13 +118,13 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name); + if (ret) { + dev_err(card->dev, "error getting cpu dai name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + ret = snd_soc_of_get_dai_name(codec, &link->codec_dai_name); + if (ret) { + dev_err(card->dev, "error getting codec dai name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + link->platform_of_node = link->cpu_of_node; +@@ -132,15 +134,24 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card) + ret = of_property_read_string(np, "link-name", &link->name); + if (ret) { + dev_err(card->dev, "error getting codec dai_link name\n"); +- return ERR_PTR(ret); ++ goto error; + } + + link->stream_name = link->name; + link->init = apq8016_sbc_dai_init; + link++; ++ ++ of_node_put(cpu); ++ of_node_put(codec); + } + + return data; ++ ++ error: ++ of_node_put(np); ++ of_node_put(cpu); ++ of_node_put(codec); ++ return ERR_PTR(ret); + } + + static int apq8016_sbc_platform_probe(struct platform_device *pdev) +diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c +index 78813057167d..dbdea1975f90 100644 +--- a/sound/soc/soc-pcm.c ++++ b/sound/soc/soc-pcm.c +@@ -48,8 +48,8 @@ static bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream) + else + codec_stream = &dai->driver->capture; + +- /* If the codec specifies any rate at all, it supports the stream. */ +- return codec_stream->rates; ++ /* If the codec specifies any channels at all, it supports the stream */ ++ return codec_stream->channels_min; + } + + /** +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 1b81f18010d2..73149b9be29c 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -2552,7 +2552,9 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, + (err = snd_usb_mixer_status_create(mixer)) < 0) + goto _error; + +- snd_usb_mixer_apply_create_quirk(mixer); ++ err = snd_usb_mixer_apply_create_quirk(mixer); ++ if (err < 0) ++ goto _error; + + err = snd_device_new(chip->card, SNDRV_DEV_CODEC, mixer, &dev_ops); + if (err < 0) +diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h +index d32727c74a16..c892b4d1e733 100644 +--- a/sound/usb/quirks-table.h ++++ b/sound/usb/quirks-table.h +@@ -3293,19 +3293,14 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), + .ifnum = 0, + .type = QUIRK_AUDIO_STANDARD_MIXER, + }, +- /* Capture */ +- { +- .ifnum = 1, +- .type = QUIRK_IGNORE_INTERFACE, +- }, + /* Playback */ + { +- .ifnum = 2, ++ .ifnum = 1, + .type = QUIRK_AUDIO_FIXED_ENDPOINT, + .data = &(const struct audioformat) { + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels = 2, +- .iface = 2, ++ .iface = 1, + .altsetting = 1, + .altset_idx = 1, + .attributes = UAC_EP_CS_ATTR_FILL_MAX | diff --git a/patch/kernel/rockchip-legacy/patch-4.4.212-213.patch b/patch/kernel/rockchip-legacy/patch-4.4.212-213.patch new file mode 100644 index 0000000000..dbc3c940e8 --- /dev/null +++ b/patch/kernel/rockchip-legacy/patch-4.4.212-213.patch @@ -0,0 +1,1559 @@ +diff --git a/Makefile b/Makefile +index 379f2a525c02..6e86896525d9 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 4 + PATCHLEVEL = 4 +-SUBLEVEL = 212 ++SUBLEVEL = 213 + EXTRAVERSION = + NAME = Blurry Fish Butt + +diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile +index abcbba2f01ba..a29f640de983 100644 +--- a/arch/arm64/boot/Makefile ++++ b/arch/arm64/boot/Makefile +@@ -14,7 +14,7 @@ + # Based on the ia64 boot/Makefile. + # + +-targets := Image Image.gz ++targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo + + $(obj)/Image: vmlinux FORCE + $(call if_changed,objcopy) +diff --git a/crypto/af_alg.c b/crypto/af_alg.c +index b5953f1d1a18..cf3975ee4fd8 100644 +--- a/crypto/af_alg.c ++++ b/crypto/af_alg.c +@@ -136,11 +136,13 @@ void af_alg_release_parent(struct sock *sk) + sk = ask->parent; + ask = alg_sk(sk); + +- lock_sock(sk); ++ local_bh_disable(); ++ bh_lock_sock(sk); + ask->nokey_refcnt -= nokey; + if (!last) + last = !--ask->refcnt; +- release_sock(sk); ++ bh_unlock_sock(sk); ++ local_bh_enable(); + + if (last) + sock_put(sk); +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index a5718c0a3dc4..1348541da463 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -505,11 +505,12 @@ err: + + static void __exit pcrypt_exit(void) + { ++ crypto_unregister_template(&pcrypt_tmpl); ++ + pcrypt_fini_padata(&pencrypt); + pcrypt_fini_padata(&pdecrypt); + + kset_unregister(pcrypt_kset); +- crypto_unregister_template(&pcrypt_tmpl); + } + + module_init(pcrypt_init); +diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c +index 6339efd32697..ad591a2f7c82 100644 +--- a/drivers/atm/eni.c ++++ b/drivers/atm/eni.c +@@ -372,7 +372,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + here = (eni_vcc->descr+skip) & (eni_vcc->words-1); + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci + << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1); + if (!eff) size += skip; +@@ -445,7 +445,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb, + if (size != eff) { + dma[j++] = (here << MID_DMA_COUNT_SHIFT) | + (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; +- j++; ++ dma[j++] = 0; + } + if (!j || j > 2*RX_DMA_BUF) { + printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n"); +diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c +index a15ce4ef39cd..e265bace57d7 100644 +--- a/drivers/char/ttyprintk.c ++++ b/drivers/char/ttyprintk.c +@@ -18,10 +18,11 @@ + #include + #include + #include ++#include + + struct ttyprintk_port { + struct tty_port port; +- struct mutex port_write_mutex; ++ spinlock_t spinlock; + }; + + static struct ttyprintk_port tpk_port; +@@ -107,11 +108,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp) + static void tpk_close(struct tty_struct *tty, struct file *filp) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + /* flush tpk_printk buffer */ + tpk_printk(NULL, 0); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + tty_port_close(&tpkp->port, tty, filp); + } +@@ -123,13 +125,14 @@ static int tpk_write(struct tty_struct *tty, + const unsigned char *buf, int count) + { + struct ttyprintk_port *tpkp = tty->driver_data; ++ unsigned long flags; + int ret; + + + /* exclusive use of tpk_printk within this tty */ +- mutex_lock(&tpkp->port_write_mutex); ++ spin_lock_irqsave(&tpkp->spinlock, flags); + ret = tpk_printk(buf, count); +- mutex_unlock(&tpkp->port_write_mutex); ++ spin_unlock_irqrestore(&tpkp->spinlock, flags); + + return ret; + } +@@ -179,7 +182,7 @@ static int __init ttyprintk_init(void) + { + int ret = -ENOMEM; + +- mutex_init(&tpk_port.port_write_mutex); ++ spin_lock_init(&tpk_port.spinlock); + + ttyprintk_driver = tty_alloc_driver(1, + TTY_DRIVER_RESET_TERMIOS | +diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c +index 8b45cb2caed1..60db6531996e 100644 +--- a/drivers/clk/mmp/clk-of-mmp2.c ++++ b/drivers/clk/mmp/clk-of-mmp2.c +@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock); + static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; + + static DEFINE_SPINLOCK(timer_lock); +-static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"}; ++static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; + + static DEFINE_SPINLOCK(reset_lock); + +diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c b/drivers/media/radio/si470x/radio-si470x-i2c.c +index f9e1768b8d31..0836fa442d22 100644 +--- a/drivers/media/radio/si470x/radio-si470x-i2c.c ++++ b/drivers/media/radio/si470x/radio-si470x-i2c.c +@@ -458,10 +458,10 @@ static int si470x_i2c_remove(struct i2c_client *client) + + free_irq(client->irq, radio); + video_unregister_device(&radio->videodev); +- kfree(radio); + + v4l2_ctrl_handler_free(&radio->hdl); + v4l2_device_unregister(&radio->v4l2_dev); ++ kfree(radio); + return 0; + } + +diff --git a/drivers/media/usb/dvb-usb/digitv.c b/drivers/media/usb/dvb-usb/digitv.c +index 772bde3c5020..4a817363a33b 100644 +--- a/drivers/media/usb/dvb-usb/digitv.c ++++ b/drivers/media/usb/dvb-usb/digitv.c +@@ -226,18 +226,22 @@ static struct rc_map_table rc_map_digitv_table[] = { + + static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + { +- int i; ++ int ret, i; + u8 key[5]; + u8 b[4] = { 0 }; + + *event = 0; + *state = REMOTE_NO_KEY_PRESSED; + +- digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4); ++ ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4); ++ if (ret) ++ return ret; + + /* Tell the device we've read the remote. Not sure how necessary + this is, but the Nebula SDK does it. */ +- digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0); ++ ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0); ++ if (ret) ++ return ret; + + /* if something is inside the buffer, simulate key press */ + if (key[1] != 0) +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-urb.c b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +index 5c8f651344fc..c98a01d36260 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-urb.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-urb.c +@@ -11,7 +11,7 @@ + int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, + u16 rlen, int delay_ms) + { +- int actlen,ret = -ENOMEM; ++ int actlen = 0, ret = -ENOMEM; + + if (!d || wbuf == NULL || wlen == 0) + return -EINVAL; +diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c +index af5cd8213e8b..3733c15c753e 100644 +--- a/drivers/media/usb/gspca/gspca.c ++++ b/drivers/media/usb/gspca/gspca.c +@@ -2028,7 +2028,7 @@ int gspca_dev_probe2(struct usb_interface *intf, + pr_err("couldn't kzalloc gspca struct\n"); + return -ENOMEM; + } +- gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); ++ gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL); + if (!gspca_dev->usb_buf) { + pr_err("out of memory\n"); + ret = -ENOMEM; +diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c +index a3b1c07ae0af..e7214edfe5b4 100644 +--- a/drivers/net/ethernet/broadcom/b44.c ++++ b/drivers/net/ethernet/broadcom/b44.c +@@ -1524,8 +1524,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + int ethaddr_bytes = ETH_ALEN; + + memset(ppattern + offset, 0xff, magicsync); +- for (j = 0; j < magicsync; j++) +- set_bit(len++, (unsigned long *) pmask); ++ for (j = 0; j < magicsync; j++) { ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; ++ } + + for (j = 0; j < B44_MAX_PATTERNS; j++) { + if ((B44_PATTERN_SIZE - len) >= ETH_ALEN) +@@ -1537,7 +1539,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) + for (k = 0; k< ethaddr_bytes; k++) { + ppattern[offset + magicsync + + (j * ETH_ALEN) + k] = macaddr[k]; +- set_bit(len++, (unsigned long *) pmask); ++ pmask[len >> 3] |= BIT(len & 7); ++ len++; + } + } + return len - 1; +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +index 129d6095749a..54d5e53e94af 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +@@ -66,8 +66,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos) + static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = seq_tab_get_idx(seq->private, *pos + 1); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +index ac27898c6ab0..e7bdaad6ed0f 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c +@@ -604,8 +604,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos) + static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos) + { + v = l2t_get_idx(seq, *pos); +- if (v) +- ++*pos; ++ ++(*pos); + return v; + } + +diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c b/drivers/net/ethernet/freescale/xgmac_mdio.c +index 7b8fe866f603..a15b4a97c172 100644 +--- a/drivers/net/ethernet/freescale/xgmac_mdio.c ++++ b/drivers/net/ethernet/freescale/xgmac_mdio.c +@@ -49,6 +49,7 @@ struct tgec_mdio_controller { + struct mdio_fsl_priv { + struct tgec_mdio_controller __iomem *mdio_base; + bool is_little_endian; ++ bool has_a011043; + }; + + static u32 xgmac_read32(void __iomem *regs, +@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) + return ret; + + /* Return all Fs if nothing was there */ +- if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) { ++ if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && ++ !priv->has_a011043) { + dev_err(&bus->dev, + "Error while reading PHY%d reg at %d.%hhu\n", + phy_id, dev_addr, regnum); +@@ -277,6 +279,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) + else + priv->is_little_endian = false; + ++ priv->has_a011043 = of_property_read_bool(pdev->dev.of_node, ++ "fsl,erratum-a011043"); ++ + ret = of_mdiobus_register(bus, np); + if (ret) { + dev_err(&pdev->dev, "cannot register MDIO bus\n"); +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +index 4521181aa0ed..23fb344f9e1c 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +@@ -4532,7 +4532,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + struct ixgbe_hw *hw = &adapter->hw; + struct hlist_node *node2; + struct ixgbe_fdir_filter *filter; +- u64 action; ++ u8 queue; + + spin_lock(&adapter->fdir_perfect_lock); + +@@ -4541,17 +4541,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter) + + hlist_for_each_entry_safe(filter, node2, + &adapter->fdir_filter_list, fdir_node) { +- action = filter->action; +- if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) +- action = +- (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; ++ if (filter->action == IXGBE_FDIR_DROP_QUEUE) { ++ queue = IXGBE_FDIR_DROP_QUEUE; ++ } else { ++ u32 ring = ethtool_get_flow_spec_ring(filter->action); ++ u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); ++ ++ if (!vf && (ring >= adapter->num_rx_queues)) { ++ e_err(drv, "FDIR restore failed without VF, ring: %u\n", ++ ring); ++ continue; ++ } else if (vf && ++ ((vf > adapter->num_vfs) || ++ ring >= adapter->num_rx_queues_per_pool)) { ++ e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", ++ vf, ring); ++ continue; ++ } ++ ++ /* Map the ring onto the absolute queue index */ ++ if (!vf) ++ queue = adapter->rx_ring[ring]->reg_idx; ++ else ++ queue = ((vf - 1) * ++ adapter->num_rx_queues_per_pool) + ring; ++ } + + ixgbe_fdir_write_perfect_filter_82599(hw, +- &filter->filter, +- filter->sw_idx, +- (action == IXGBE_FDIR_DROP_QUEUE) ? +- IXGBE_FDIR_DROP_QUEUE : +- adapter->rx_ring[action]->reg_idx); ++ &filter->filter, filter->sw_idx, queue); + } + + spin_unlock(&adapter->fdir_perfect_lock); +diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +index 723bda33472a..0fa94ebf0411 100644 +--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c ++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +@@ -1861,11 +1861,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev) + struct ixgbe_hw *hw = &adapter->hw; + int count = 0; + +- if ((netdev_uc_count(netdev)) > 10) { +- pr_err("Too many unicast filters - No Space\n"); +- return -ENOSPC; +- } +- + if (!netdev_uc_empty(netdev)) { + struct netdev_hw_addr *ha; + +diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c +index 667900578249..712be59251f5 100644 +--- a/drivers/net/ethernet/natsemi/sonic.c ++++ b/drivers/net/ethernet/natsemi/sonic.c +@@ -50,6 +50,8 @@ static int sonic_open(struct net_device *dev) + if (sonic_debug > 2) + printk("sonic_open: initializing sonic driver.\n"); + ++ spin_lock_init(&lp->lock); ++ + for (i = 0; i < SONIC_NUM_RRS; i++) { + struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (skb == NULL) { +@@ -101,6 +103,24 @@ static int sonic_open(struct net_device *dev) + return 0; + } + ++/* Wait for the SONIC to become idle. */ ++static void sonic_quiesce(struct net_device *dev, u16 mask) ++{ ++ struct sonic_local * __maybe_unused lp = netdev_priv(dev); ++ int i; ++ u16 bits; ++ ++ for (i = 0; i < 1000; ++i) { ++ bits = SONIC_READ(SONIC_CMD) & mask; ++ if (!bits) ++ return; ++ if (irqs_disabled() || in_interrupt()) ++ udelay(20); ++ else ++ usleep_range(100, 200); ++ } ++ WARN_ONCE(1, "command deadline expired! 0x%04x\n", bits); ++} + + /* + * Close the SONIC device +@@ -118,6 +138,9 @@ static int sonic_close(struct net_device *dev) + /* + * stop the SONIC, disable interrupts + */ ++ SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); ++ + SONIC_WRITE(SONIC_IMR, 0); + SONIC_WRITE(SONIC_ISR, 0x7fff); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); +@@ -157,6 +180,9 @@ static void sonic_tx_timeout(struct net_device *dev) + * put the Sonic into software-reset mode and + * disable all interrupts before releasing DMA buffers + */ ++ SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); ++ + SONIC_WRITE(SONIC_IMR, 0); + SONIC_WRITE(SONIC_ISR, 0x7fff); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); +@@ -194,8 +220,6 @@ static void sonic_tx_timeout(struct net_device *dev) + * wake the tx queue + * Concurrently with all of this, the SONIC is potentially writing to + * the status flags of the TDs. +- * Until some mutual exclusion is added, this code will not work with SMP. However, +- * MIPS Jazz machines and m68k Macs were all uni-processor machines. + */ + + static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) +@@ -203,7 +227,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + struct sonic_local *lp = netdev_priv(dev); + dma_addr_t laddr; + int length; +- int entry = lp->next_tx; ++ int entry; ++ unsigned long flags; + + if (sonic_debug > 2) + printk("sonic_send_packet: skb=%p, dev=%p\n", skb, dev); +@@ -226,6 +251,10 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + return NETDEV_TX_OK; + } + ++ spin_lock_irqsave(&lp->lock, flags); ++ ++ entry = lp->next_tx; ++ + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ + sonic_tda_put(dev, entry, SONIC_TD_FRAG_COUNT, 1); /* single fragment */ + sonic_tda_put(dev, entry, SONIC_TD_PKTSIZE, length); /* length of packet */ +@@ -235,10 +264,6 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + sonic_tda_put(dev, entry, SONIC_TD_LINK, + sonic_tda_get(dev, entry, SONIC_TD_LINK) | SONIC_EOL); + +- /* +- * Must set tx_skb[entry] only after clearing status, and +- * before clearing EOL and before stopping queue +- */ + wmb(); + lp->tx_len[entry] = length; + lp->tx_laddr[entry] = laddr; +@@ -263,6 +288,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) + + SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP); + ++ spin_unlock_irqrestore(&lp->lock, flags); ++ + return NETDEV_TX_OK; + } + +@@ -275,9 +302,21 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + struct net_device *dev = dev_id; + struct sonic_local *lp = netdev_priv(dev); + int status; ++ unsigned long flags; ++ ++ /* The lock has two purposes. Firstly, it synchronizes sonic_interrupt() ++ * with sonic_send_packet() so that the two functions can share state. ++ * Secondly, it makes sonic_interrupt() re-entrant, as that is required ++ * by macsonic which must use two IRQs with different priority levels. ++ */ ++ spin_lock_irqsave(&lp->lock, flags); ++ ++ status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; ++ if (!status) { ++ spin_unlock_irqrestore(&lp->lock, flags); + +- if (!(status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)) + return IRQ_NONE; ++ } + + do { + if (status & SONIC_INT_PKTRX) { +@@ -292,11 +331,12 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + int td_status; + int freed_some = 0; + +- /* At this point, cur_tx is the index of a TD that is one of: +- * unallocated/freed (status set & tx_skb[entry] clear) +- * allocated and sent (status set & tx_skb[entry] set ) +- * allocated and not yet sent (status clear & tx_skb[entry] set ) +- * still being allocated by sonic_send_packet (status clear & tx_skb[entry] clear) ++ /* The state of a Transmit Descriptor may be inferred ++ * from { tx_skb[entry], td_status } as follows. ++ * { clear, clear } => the TD has never been used ++ * { set, clear } => the TD was handed to SONIC ++ * { set, set } => the TD was handed back ++ * { clear, set } => the TD is available for re-use + */ + + if (sonic_debug > 2) +@@ -398,10 +438,30 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id) + /* load CAM done */ + if (status & SONIC_INT_LCD) + SONIC_WRITE(SONIC_ISR, SONIC_INT_LCD); /* clear the interrupt */ +- } while((status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)); ++ ++ status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; ++ } while (status); ++ ++ spin_unlock_irqrestore(&lp->lock, flags); ++ + return IRQ_HANDLED; + } + ++/* Return the array index corresponding to a given Receive Buffer pointer. */ ++static int index_from_addr(struct sonic_local *lp, dma_addr_t addr, ++ unsigned int last) ++{ ++ unsigned int i = last; ++ ++ do { ++ i = (i + 1) & SONIC_RRS_MASK; ++ if (addr == lp->rx_laddr[i]) ++ return i; ++ } while (i != last); ++ ++ return -ENOENT; ++} ++ + /* + * We have a good packet(s), pass it/them up the network stack. + */ +@@ -421,6 +481,16 @@ static void sonic_rx(struct net_device *dev) + + status = sonic_rda_get(dev, entry, SONIC_RD_STATUS); + if (status & SONIC_RCR_PRX) { ++ u32 addr = (sonic_rda_get(dev, entry, ++ SONIC_RD_PKTPTR_H) << 16) | ++ sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L); ++ int i = index_from_addr(lp, addr, entry); ++ ++ if (i < 0) { ++ WARN_ONCE(1, "failed to find buffer!\n"); ++ break; ++ } ++ + /* Malloc up new buffer. */ + new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (new_skb == NULL) { +@@ -442,7 +512,7 @@ static void sonic_rx(struct net_device *dev) + + /* now we have a new skb to replace it, pass the used one up the stack */ + dma_unmap_single(lp->device, lp->rx_laddr[entry], SONIC_RBSIZE, DMA_FROM_DEVICE); +- used_skb = lp->rx_skb[entry]; ++ used_skb = lp->rx_skb[i]; + pkt_len = sonic_rda_get(dev, entry, SONIC_RD_PKTLEN); + skb_trim(used_skb, pkt_len); + used_skb->protocol = eth_type_trans(used_skb, dev); +@@ -451,13 +521,13 @@ static void sonic_rx(struct net_device *dev) + lp->stats.rx_bytes += pkt_len; + + /* and insert the new skb */ +- lp->rx_laddr[entry] = new_laddr; +- lp->rx_skb[entry] = new_skb; ++ lp->rx_laddr[i] = new_laddr; ++ lp->rx_skb[i] = new_skb; + + bufadr_l = (unsigned long)new_laddr & 0xffff; + bufadr_h = (unsigned long)new_laddr >> 16; +- sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, bufadr_l); +- sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, bufadr_h); ++ sonic_rra_put(dev, i, SONIC_RR_BUFADR_L, bufadr_l); ++ sonic_rra_put(dev, i, SONIC_RR_BUFADR_H, bufadr_h); + } else { + /* This should only happen, if we enable accepting broken packets. */ + lp->stats.rx_errors++; +@@ -592,6 +662,7 @@ static int sonic_init(struct net_device *dev) + */ + SONIC_WRITE(SONIC_CMD, 0); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); ++ sonic_quiesce(dev, SONIC_CR_ALL); + + /* + * initialize the receive resource area +diff --git a/drivers/net/ethernet/natsemi/sonic.h b/drivers/net/ethernet/natsemi/sonic.h +index 07091dd27e5d..7dcf913d7395 100644 +--- a/drivers/net/ethernet/natsemi/sonic.h ++++ b/drivers/net/ethernet/natsemi/sonic.h +@@ -109,6 +109,9 @@ + #define SONIC_CR_TXP 0x0002 + #define SONIC_CR_HTX 0x0001 + ++#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \ ++ SONIC_CR_RXEN | SONIC_CR_TXP) ++ + /* + * SONIC data configuration bits + */ +@@ -273,8 +276,9 @@ + #define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */ + #define SONIC_NUM_TDS 16 /* number of transmit descriptors */ + +-#define SONIC_RDS_MASK (SONIC_NUM_RDS-1) +-#define SONIC_TDS_MASK (SONIC_NUM_TDS-1) ++#define SONIC_RRS_MASK (SONIC_NUM_RRS - 1) ++#define SONIC_RDS_MASK (SONIC_NUM_RDS - 1) ++#define SONIC_TDS_MASK (SONIC_NUM_TDS - 1) + + #define SONIC_RBSIZE 1520 /* size of one resource buffer */ + +@@ -320,6 +324,7 @@ struct sonic_local { + unsigned int next_tx; /* next free TD */ + struct device *device; /* generic device */ + struct net_device_stats stats; ++ spinlock_t lock; + }; + + #define TX_TIMEOUT (3 * HZ) +@@ -341,30 +346,30 @@ static void sonic_tx_timeout(struct net_device *dev); + as far as we can tell. */ + /* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put() + is a much better name. */ +-static inline void sonic_buf_put(void* base, int bitmode, ++static inline void sonic_buf_put(u16 *base, int bitmode, + int offset, __u16 val) + { + if (bitmode) + #ifdef __BIG_ENDIAN +- ((__u16 *) base + (offset*2))[1] = val; ++ __raw_writew(val, base + (offset * 2) + 1); + #else +- ((__u16 *) base + (offset*2))[0] = val; ++ __raw_writew(val, base + (offset * 2) + 0); + #endif + else +- ((__u16 *) base)[offset] = val; ++ __raw_writew(val, base + (offset * 1) + 0); + } + +-static inline __u16 sonic_buf_get(void* base, int bitmode, ++static inline __u16 sonic_buf_get(u16 *base, int bitmode, + int offset) + { + if (bitmode) + #ifdef __BIG_ENDIAN +- return ((volatile __u16 *) base + (offset*2))[1]; ++ return __raw_readw(base + (offset * 2) + 1); + #else +- return ((volatile __u16 *) base + (offset*2))[0]; ++ return __raw_readw(base + (offset * 2) + 0); + #endif + else +- return ((volatile __u16 *) base)[offset]; ++ return __raw_readw(base + (offset * 1) + 0); + } + + /* Inlines that you should actually use for reading/writing DMA buffers */ +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +index bf892160dd5f..26263a192a77 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +@@ -2047,6 +2047,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, + break; + } + entry += p_hdr->size; ++ cond_resched(); + } + p_dev->ahw->reset.seq_index = index; + } +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +index cda9e604a95f..e5ea8e972b91 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter, + addr += 16; + reg_read -= 16; + ret += 16; ++ cond_resched(); + } + out: + mutex_unlock(&adapter->ahw->mem_lock); +@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter) + buf_offset += entry->hdr.cap_size; + entry_offset += entry->hdr.offset; + buffer = fw_dump->data + buf_offset; ++ cond_resched(); + } + + fw_dump->clr = 1; +diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c +index db8b489b0513..23e299c86b81 100644 +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -4313,6 +4313,11 @@ static int rtl8152_probe(struct usb_interface *intf, + + intf->needs_remote_wakeup = 1; + ++ if (!rtl_can_wakeup(tp)) ++ __rtl_set_wol(tp, 0); ++ else ++ tp->saved_wolopts = __rtl_get_wol(tp); ++ + tp->rtl_ops.init(tp); + set_ethernet_addr(tp); + +@@ -4325,10 +4330,6 @@ static int rtl8152_probe(struct usb_interface *intf, + goto out1; + } + +- if (!rtl_can_wakeup(tp)) +- __rtl_set_wol(tp, 0); +- +- tp->saved_wolopts = __rtl_get_wol(tp); + if (tp->saved_wolopts) + device_set_wakeup_enable(&udev->dev, true); + else +diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c +index 421ac5f85699..79fd89150947 100644 +--- a/drivers/net/wan/sdla.c ++++ b/drivers/net/wan/sdla.c +@@ -711,7 +711,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, + + spin_lock_irqsave(&sdla_lock, flags); + SDLA_WINDOW(dev, addr); +- pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK)); ++ pbuf = (void *)(dev->mem_start + (addr & SDLA_ADDR_MASK)); + __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len); + SDLA_WINDOW(dev, addr); + pbuf->opp_flag = 1; +diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c +index 82d24f2b9c19..a44496d8423a 100644 +--- a/drivers/net/wireless/airo.c ++++ b/drivers/net/wireless/airo.c +@@ -7808,16 +7808,8 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { + case AIROGVLIST: ridcode = RID_APLIST; break; + case AIROGDRVNAM: ridcode = RID_DRVNAME; break; + case AIROGEHTENC: ridcode = RID_ETHERENCAP; break; +- case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; +- /* Only super-user can read WEP keys */ +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- break; +- case AIROGWEPKNV: ridcode = RID_WEP_PERM; +- /* Only super-user can read WEP keys */ +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- break; ++ case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; break; ++ case AIROGWEPKNV: ridcode = RID_WEP_PERM; break; + case AIROGSTAT: ridcode = RID_STATUS; break; + case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; + case AIROGSTATSC32: ridcode = RID_STATS; break; +@@ -7831,7 +7823,13 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { + return -EINVAL; + } + +- if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL) ++ if (ridcode == RID_WEP_TEMP || ridcode == RID_WEP_PERM) { ++ /* Only super-user can read WEP keys */ ++ if (!capable(CAP_NET_ADMIN)) ++ return -EPERM; ++ } ++ ++ if ((iobuf = kzalloc(RIDSIZE, GFP_KERNEL)) == NULL) + return -ENOMEM; + + PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1); +diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c +index c92564b3ec85..1f019df15a67 100644 +--- a/drivers/net/wireless/ath/ath9k/hif_usb.c ++++ b/drivers/net/wireless/ath/ath9k/hif_usb.c +@@ -1211,7 +1211,7 @@ err_fw: + static int send_eject_command(struct usb_interface *interface) + { + struct usb_device *udev = interface_to_usbdev(interface); +- struct usb_host_interface *iface_desc = &interface->altsetting[0]; ++ struct usb_host_interface *iface_desc = interface->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c +index 3002268e57f3..b9bfa592bcab 100644 +--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c +@@ -1352,7 +1352,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + goto fail; + } + +- desc = &intf->altsetting[0].desc; ++ desc = &intf->cur_altsetting->desc; + if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || + (desc->bInterfaceSubClass != 2) || + (desc->bInterfaceProtocol != 0xff)) { +@@ -1365,7 +1365,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) + + num_of_eps = desc->bNumEndpoints; + for (ep = 0; ep < num_of_eps; ep++) { +- endpoint = &intf->altsetting[0].endpoint[ep].desc; ++ endpoint = &intf->cur_altsetting->endpoint[ep].desc; + endpoint_num = usb_endpoint_num(endpoint); + if (!usb_endpoint_xfer_bulk(endpoint)) + continue; +diff --git a/drivers/net/wireless/orinoco/orinoco_usb.c b/drivers/net/wireless/orinoco/orinoco_usb.c +index f2cd513d54b2..e434f7ca8ff3 100644 +--- a/drivers/net/wireless/orinoco/orinoco_usb.c ++++ b/drivers/net/wireless/orinoco/orinoco_usb.c +@@ -1601,9 +1601,9 @@ static int ezusb_probe(struct usb_interface *interface, + /* set up the endpoint information */ + /* check out the endpoints */ + +- iface_desc = &interface->altsetting[0].desc; ++ iface_desc = &interface->cur_altsetting->desc; + for (i = 0; i < iface_desc->bNumEndpoints; ++i) { +- ep = &interface->altsetting[0].endpoint[i].desc; ++ ep = &interface->cur_altsetting->endpoint[i].desc; + + if (usb_endpoint_is_bulk_in(ep)) { + /* we found a bulk in endpoint */ +diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c +index 4d94bb4e95f8..8254d4b22c50 100644 +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c +@@ -5555,7 +5555,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv, + u8 dir, xtype, num; + int ret = 0; + +- host_interface = &interface->altsetting[0]; ++ host_interface = interface->cur_altsetting; + interface_desc = &host_interface->desc; + endpoints = interface_desc->bNumEndpoints; + +diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c +index ef5d394f185b..974387ad1e8c 100644 +--- a/drivers/net/wireless/rsi/rsi_91x_usb.c ++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c +@@ -103,7 +103,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface, + __le16 buffer_size; + int ii, bep_found = 0; + +- iface_desc = &(interface->altsetting[0]); ++ iface_desc = interface->cur_altsetting; + + for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) { + endpoint = &(iface_desc->endpoint[ii].desc); +diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c +index a912dc051111..a5a5898093e7 100644 +--- a/drivers/net/wireless/zd1211rw/zd_usb.c ++++ b/drivers/net/wireless/zd1211rw/zd_usb.c +@@ -1272,7 +1272,7 @@ static void print_id(struct usb_device *udev) + static int eject_installer(struct usb_interface *intf) + { + struct usb_device *udev = interface_to_usbdev(intf); +- struct usb_host_interface *iface_desc = &intf->altsetting[0]; ++ struct usb_host_interface *iface_desc = intf->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + unsigned char *cmd; + u8 bulk_out_ep; +diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c +index 82e4bc8c11c5..fc6706b12ac7 100644 +--- a/drivers/scsi/fnic/fnic_scsi.c ++++ b/drivers/scsi/fnic/fnic_scsi.c +@@ -446,6 +446,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_ + if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED))) + return SCSI_MLQUEUE_HOST_BUSY; + ++ if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET))) ++ return SCSI_MLQUEUE_HOST_BUSY; ++ + rport = starget_to_rport(scsi_target(sc->device)); + ret = fc_remote_port_chkready(rport); + if (ret) { +diff --git a/drivers/staging/most/aim-network/networking.c b/drivers/staging/most/aim-network/networking.c +index 3c7beb03871d..350fa05aaeed 100644 +--- a/drivers/staging/most/aim-network/networking.c ++++ b/drivers/staging/most/aim-network/networking.c +@@ -87,6 +87,11 @@ static int skb_to_mamac(const struct sk_buff *skb, struct mbo *mbo) + unsigned int payload_len = skb->len - ETH_HLEN; + unsigned int mdp_len = payload_len + MDP_HDR_LEN; + ++ if (mdp_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mdp_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mdp_len); +@@ -134,6 +139,11 @@ static int skb_to_mep(const struct sk_buff *skb, struct mbo *mbo) + u8 *buff = mbo->virt_address; + unsigned int mep_len = skb->len + MEP_HDR_LEN; + ++ if (mep_len < skb->len) { ++ pr_err("drop: too large packet! (%u)\n", skb->len); ++ return -EINVAL; ++ } ++ + if (mbo->buffer_length < mep_len) { + pr_err("drop: too small buffer! (%d for %d)\n", + mbo->buffer_length, mep_len); +diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h +index ba362a883016..80ab403aeb72 100644 +--- a/drivers/staging/vt6656/device.h ++++ b/drivers/staging/vt6656/device.h +@@ -65,6 +65,8 @@ + #define RATE_AUTO 12 + + #define MAX_RATE 12 ++#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ ++ BIT(RATE_5M) | BIT(RATE_11M)) + + /* + * device specific +diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c +index 14b8ebc6508d..cb22b5efe2be 100644 +--- a/drivers/staging/vt6656/int.c ++++ b/drivers/staging/vt6656/int.c +@@ -111,9 +111,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) + + info->status.rates[0].count = tx_retry; + +- if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) { ++ if (!(tsr & TSR_TMO)) { + info->status.rates[0].idx = idx; +- info->flags |= IEEE80211_TX_STAT_ACK; ++ ++ if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) ++ info->flags |= IEEE80211_TX_STAT_ACK; + } + + ieee80211_tx_status_irqsafe(priv->hw, context->skb); +diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c +index 668fcd3a0bfe..66e658810229 100644 +--- a/drivers/staging/vt6656/main_usb.c ++++ b/drivers/staging/vt6656/main_usb.c +@@ -1002,6 +1002,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) + ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); + ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); + ieee80211_hw_set(priv->hw, SUPPORTS_PS); ++ ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK); + + priv->hw->max_signal = 100; + +diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c +index efb54f53b4f9..5d951e043d35 100644 +--- a/drivers/staging/vt6656/rxtx.c ++++ b/drivers/staging/vt6656/rxtx.c +@@ -280,11 +280,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context, + PK_TYPE_11B, &buf->b); + + /* Get Duration and TimeStamp */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration_a = dur; +- buf->duration_b = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration_a = hdr->duration_id; ++ buf->duration_b = hdr->duration_id; + } else { + buf->duration_a = vnt_get_duration_le(priv, + tx_context->pkt_type, need_ack); +@@ -373,10 +371,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context, + tx_context->pkt_type, &buf->ab); + + /* Get Duration and TimeStampOff */ +- if (ieee80211_is_pspoll(hdr->frame_control)) { +- __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); +- +- buf->duration = dur; ++ if (ieee80211_is_nullfunc(hdr->frame_control)) { ++ buf->duration = hdr->duration_id; + } else { + buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); +@@ -815,10 +811,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) + if (info->band == IEEE80211_BAND_5GHZ) { + pkt_type = PK_TYPE_11A; + } else { +- if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) +- pkt_type = PK_TYPE_11GB; +- else +- pkt_type = PK_TYPE_11GA; ++ if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { ++ if (priv->basic_rates & VNT_B_RATES) ++ pkt_type = PK_TYPE_11GB; ++ else ++ pkt_type = PK_TYPE_11GA; ++ } else { ++ pkt_type = PK_TYPE_11A; ++ } + } + } else { + pkt_type = PK_TYPE_11B; +diff --git a/drivers/staging/wlan-ng/prism2mgmt.c b/drivers/staging/wlan-ng/prism2mgmt.c +index c1ad0aea23b9..73ec8d3936d5 100644 +--- a/drivers/staging/wlan-ng/prism2mgmt.c ++++ b/drivers/staging/wlan-ng/prism2mgmt.c +@@ -940,7 +940,7 @@ int prism2mgmt_flashdl_state(wlandevice_t *wlandev, void *msgp) + } + } + +- return 0; ++ return result; + } + + /*---------------------------------------------------------------- +diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c +index 4378e758baef..591bc3f7be76 100644 +--- a/drivers/usb/dwc3/core.c ++++ b/drivers/usb/dwc3/core.c +@@ -801,6 +801,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) + /* do nothing */ + break; + } ++ ++ /* de-assert DRVVBUS for HOST and OTG mode */ ++ dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE); + } + + #define DWC3_ALIGN_MASK (16 - 1) +diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c +index 73956d48a0c5..1347c77facd0 100644 +--- a/drivers/usb/serial/ir-usb.c ++++ b/drivers/usb/serial/ir-usb.c +@@ -49,9 +49,10 @@ static int buffer_size; + static int xbof = -1; + + static int ir_startup (struct usb_serial *serial); +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port); +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size); ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count); ++static int ir_write_room(struct tty_struct *tty); ++static void ir_write_bulk_callback(struct urb *urb); + static void ir_process_read_urb(struct urb *urb); + static void ir_set_termios(struct tty_struct *tty, + struct usb_serial_port *port, struct ktermios *old_termios); +@@ -81,8 +82,9 @@ static struct usb_serial_driver ir_device = { + .num_ports = 1, + .set_termios = ir_set_termios, + .attach = ir_startup, +- .open = ir_open, +- .prepare_write_buffer = ir_prepare_write_buffer, ++ .write = ir_write, ++ .write_room = ir_write_room, ++ .write_bulk_callback = ir_write_bulk_callback, + .process_read_urb = ir_process_read_urb, + }; + +@@ -198,6 +200,9 @@ static int ir_startup(struct usb_serial *serial) + { + struct usb_irda_cs_descriptor *irda_desc; + ++ if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1) ++ return -ENODEV; ++ + irda_desc = irda_usb_find_class_desc(serial, 0); + if (!irda_desc) { + dev_err(&serial->dev->dev, +@@ -252,35 +257,102 @@ static int ir_startup(struct usb_serial *serial) + return 0; + } + +-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port) ++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, ++ const unsigned char *buf, int count) + { +- int i; ++ struct urb *urb = NULL; ++ unsigned long flags; ++ int ret; + +- for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) +- port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET; ++ if (port->bulk_out_size == 0) ++ return -EINVAL; + +- /* Start reading from the device */ +- return usb_serial_generic_open(tty, port); +-} ++ if (count == 0) ++ return 0; + +-static int ir_prepare_write_buffer(struct usb_serial_port *port, +- void *dest, size_t size) +-{ +- unsigned char *buf = dest; +- int count; ++ count = min(count, port->bulk_out_size - 1); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ if (__test_and_clear_bit(0, &port->write_urbs_free)) { ++ urb = port->write_urbs[0]; ++ port->tx_bytes += count; ++ } ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ if (!urb) ++ return 0; + + /* + * The first byte of the packet we send to the device contains an +- * inbound header which indicates an additional number of BOFs and ++ * outbound header which indicates an additional number of BOFs and + * a baud rate change. + * + * See section 5.4.2.2 of the USB IrDA spec. + */ +- *buf = ir_xbof | ir_baud; ++ *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud; ++ ++ memcpy(urb->transfer_buffer + 1, buf, count); ++ ++ urb->transfer_buffer_length = count + 1; ++ urb->transfer_flags = URB_ZERO_PACKET; ++ ++ ret = usb_submit_urb(urb, GFP_ATOMIC); ++ if (ret) { ++ dev_err(&port->dev, "failed to submit write urb: %d\n", ret); ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= count; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ return ret; ++ } ++ ++ return count; ++} ++ ++static void ir_write_bulk_callback(struct urb *urb) ++{ ++ struct usb_serial_port *port = urb->context; ++ int status = urb->status; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port->lock, flags); ++ __set_bit(0, &port->write_urbs_free); ++ port->tx_bytes -= urb->transfer_buffer_length - 1; ++ spin_unlock_irqrestore(&port->lock, flags); ++ ++ switch (status) { ++ case 0: ++ break; ++ case -ENOENT: ++ case -ECONNRESET: ++ case -ESHUTDOWN: ++ dev_dbg(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ case -EPIPE: ++ dev_err(&port->dev, "write urb stopped: %d\n", status); ++ return; ++ default: ++ dev_err(&port->dev, "nonzero write-urb status: %d\n", status); ++ break; ++ } ++ ++ usb_serial_port_softint(port); ++} ++ ++static int ir_write_room(struct tty_struct *tty) ++{ ++ struct usb_serial_port *port = tty->driver_data; ++ int count = 0; ++ ++ if (port->bulk_out_size == 0) ++ return 0; ++ ++ if (test_bit(0, &port->write_urbs_free)) ++ count = port->bulk_out_size - 1; + +- count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1, +- &port->lock); +- return count + 1; ++ return count; + } + + static void ir_process_read_urb(struct urb *urb) +@@ -333,34 +405,34 @@ static void ir_set_termios(struct tty_struct *tty, + + switch (baud) { + case 2400: +- ir_baud = USB_IRDA_BR_2400; ++ ir_baud = USB_IRDA_LS_2400; + break; + case 9600: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + break; + case 19200: +- ir_baud = USB_IRDA_BR_19200; ++ ir_baud = USB_IRDA_LS_19200; + break; + case 38400: +- ir_baud = USB_IRDA_BR_38400; ++ ir_baud = USB_IRDA_LS_38400; + break; + case 57600: +- ir_baud = USB_IRDA_BR_57600; ++ ir_baud = USB_IRDA_LS_57600; + break; + case 115200: +- ir_baud = USB_IRDA_BR_115200; ++ ir_baud = USB_IRDA_LS_115200; + break; + case 576000: +- ir_baud = USB_IRDA_BR_576000; ++ ir_baud = USB_IRDA_LS_576000; + break; + case 1152000: +- ir_baud = USB_IRDA_BR_1152000; ++ ir_baud = USB_IRDA_LS_1152000; + break; + case 4000000: +- ir_baud = USB_IRDA_BR_4000000; ++ ir_baud = USB_IRDA_LS_4000000; + break; + default: +- ir_baud = USB_IRDA_BR_9600; ++ ir_baud = USB_IRDA_LS_9600; + baud = 9600; + } + +diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h +index 8ed80f28416f..9aad6825947c 100644 +--- a/drivers/usb/storage/unusual_uas.h ++++ b/drivers/usb/storage/unusual_uas.h +@@ -162,12 +162,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999, + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_IGNORE_UAS), + +-/* Reported-by: Takeo Nakayama */ ++/* ++ * Initially Reported-by: Takeo Nakayama ++ * UAS Ignore Reported by Steven Ellis ++ */ + UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, + "JMicron", + "JMS566", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, +- US_FL_NO_REPORT_OPCODES), ++ US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS), + + /* Reported-by: Hans de Goede */ + UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, +diff --git a/drivers/watchdog/rn5t618_wdt.c b/drivers/watchdog/rn5t618_wdt.c +index d1c12278cb6a..8b6eff26e480 100644 +--- a/drivers/watchdog/rn5t618_wdt.c ++++ b/drivers/watchdog/rn5t618_wdt.c +@@ -193,6 +193,7 @@ static struct platform_driver rn5t618_wdt_driver = { + + module_platform_driver(rn5t618_wdt_driver); + ++MODULE_ALIAS("platform:rn5t618-wdt"); + MODULE_AUTHOR("Beniamino Galvani "); + MODULE_DESCRIPTION("RN5T618 watchdog driver"); + MODULE_LICENSE("GPL v2"); +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index 0f99336c37eb..df211bad255c 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -1978,6 +1978,7 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv; + int ret; + u64 thresh = 0; ++ int mixed = 0; + + /* + * holding chunk_muext to avoid allocating new chunks, holding +@@ -2003,8 +2004,17 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + } + } + } +- if (found->flags & BTRFS_BLOCK_GROUP_METADATA) +- total_free_meta += found->disk_total - found->disk_used; ++ ++ /* ++ * Metadata in mixed block goup profiles are accounted in data ++ */ ++ if (!mixed && found->flags & BTRFS_BLOCK_GROUP_METADATA) { ++ if (found->flags & BTRFS_BLOCK_GROUP_DATA) ++ mixed = 1; ++ else ++ total_free_meta += found->disk_total - ++ found->disk_used; ++ } + + total_used += found->disk_used; + } +@@ -2042,7 +2052,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + */ + thresh = 4 * 1024 * 1024; + +- if (total_free_meta - thresh < block_rsv->size) ++ /* ++ * We only want to claim there's no available space if we can no longer ++ * allocate chunks for our metadata profile and our global reserve will ++ * not fit in the free metadata space. If we aren't ->full then we ++ * still can allocate chunks and thus are fine using the currently ++ * calculated f_bavail. ++ */ ++ if (!mixed && block_rsv->space_info->full && ++ total_free_meta - thresh < block_rsv->size) + buf->f_bavail = 0; + + buf->f_type = BTRFS_SUPER_MAGIC; +diff --git a/fs/namei.c b/fs/namei.c +index a4ed9c337c21..9f1aae507909 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -3060,8 +3060,8 @@ static int do_last(struct nameidata *nd, + int *opened) + { + struct dentry *dir = nd->path.dentry; +- kuid_t dir_uid = dir->d_inode->i_uid; +- umode_t dir_mode = dir->d_inode->i_mode; ++ kuid_t dir_uid = nd->inode->i_uid; ++ umode_t dir_mode = nd->inode->i_mode; + int open_flag = op->open_flag; + bool will_truncate = (open_flag & O_TRUNC) != 0; + bool got_write = false; +diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c +index ee095246da4e..519bf410e65b 100644 +--- a/fs/reiserfs/super.c ++++ b/fs/reiserfs/super.c +@@ -599,6 +599,7 @@ static void reiserfs_put_super(struct super_block *s) + reiserfs_write_unlock(s); + mutex_destroy(&REISERFS_SB(s)->lock); + destroy_workqueue(REISERFS_SB(s)->commit_wq); ++ kfree(REISERFS_SB(s)->s_jdev); + kfree(s->s_fs_info); + s->s_fs_info = NULL; + } +@@ -2208,6 +2209,7 @@ error_unlocked: + kfree(qf_names[j]); + } + #endif ++ kfree(sbi->s_jdev); + kfree(sbi); + + s->s_fs_info = NULL; +diff --git a/include/linux/usb/irda.h b/include/linux/usb/irda.h +index e345ceaf72d6..9dc46010a067 100644 +--- a/include/linux/usb/irda.h ++++ b/include/linux/usb/irda.h +@@ -118,11 +118,22 @@ struct usb_irda_cs_descriptor { + * 6 - 115200 bps + * 7 - 576000 bps + * 8 - 1.152 Mbps +- * 9 - 5 mbps ++ * 9 - 4 Mbps + * 10..15 - Reserved + */ + #define USB_IRDA_STATUS_LINK_SPEED 0x0f + ++#define USB_IRDA_LS_NO_CHANGE 0 ++#define USB_IRDA_LS_2400 1 ++#define USB_IRDA_LS_9600 2 ++#define USB_IRDA_LS_19200 3 ++#define USB_IRDA_LS_38400 4 ++#define USB_IRDA_LS_57600 5 ++#define USB_IRDA_LS_115200 6 ++#define USB_IRDA_LS_576000 7 ++#define USB_IRDA_LS_1152000 8 ++#define USB_IRDA_LS_4000000 9 ++ + /* The following is a 4-bit value used only for + * outbound header: + * +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index 878d05bd185c..41c678199b80 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2701,6 +2701,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + char *flags = strchr(str, '='); + int err = 1; + ++ if (flags) ++ *flags++ = '\0'; /* terminate mode string */ ++ + if (nodelist) { + /* NUL-terminate mode or flags string */ + *nodelist++ = '\0'; +@@ -2711,9 +2714,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) + } else + nodes_clear(nodes); + +- if (flags) +- *flags++ = '\0'; /* terminate mode string */ +- + for (mode = 0; mode < MPOL_MAX; mode++) { + if (!strcmp(str, policy_modes[mode])) { + break; +diff --git a/net/core/utils.c b/net/core/utils.c +index 3d17ca8b4744..13eb3552de07 100644 +--- a/net/core/utils.c ++++ b/net/core/utils.c +@@ -316,6 +316,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, + } + EXPORT_SYMBOL(inet_proto_csum_replace4); + ++/** ++ * inet_proto_csum_replace16 - update layer 4 header checksum field ++ * @sum: Layer 4 header checksum field ++ * @skb: sk_buff for the packet ++ * @from: old IPv6 address ++ * @to: new IPv6 address ++ * @pseudohdr: True if layer 4 header checksum includes pseudoheader ++ * ++ * Update layer 4 header as per the update in IPv6 src/dst address. ++ * ++ * There is no need to update skb->csum in this function, because update in two ++ * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other ++ * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to ++ * update skb->csum, because update in 3 fields a.) IPv4 src/dst address, ++ * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as ++ * L4 Header checksum for skb->csum calculation. ++ */ + void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + const __be32 *from, const __be32 *to, + bool pseudohdr) +@@ -327,9 +344,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, + if (skb->ip_summed != CHECKSUM_PARTIAL) { + *sum = csum_fold(csum_partial(diff, sizeof(diff), + ~csum_unfold(*sum))); +- if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) +- skb->csum = ~csum_partial(diff, sizeof(diff), +- ~skb->csum); + } else if (pseudohdr) + *sum = ~csum_fold(csum_partial(diff, sizeof(diff), + csum_unfold(*sum))); +diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c +index bbcbbc1cc2cc..42dbd280dc9b 100644 +--- a/net/ipv4/ip_vti.c ++++ b/net/ipv4/ip_vti.c +@@ -195,8 +195,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev, + int err; + + if (!dst) { +- dev->stats.tx_carrier_errors++; +- goto tx_error_icmp; ++ struct rtable *rt; ++ ++ fl->u.ip4.flowi4_oif = dev->ifindex; ++ fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; ++ rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); ++ if (IS_ERR(rt)) { ++ dev->stats.tx_carrier_errors++; ++ goto tx_error_icmp; ++ } ++ dst = &rt->dst; ++ skb_dst_set(skb, dst); + } + + dst_hold(dst); +diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c +index 51da5987952c..623963a2d8a6 100644 +--- a/net/ipv6/ip6_vti.c ++++ b/net/ipv6/ip6_vti.c +@@ -441,8 +441,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) + int err = -1; + int mtu; + +- if (!dst) +- goto tx_err_link_failure; ++ if (!dst) { ++ fl->u.ip6.flowi6_oif = dev->ifindex; ++ fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; ++ dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); ++ if (dst->error) { ++ dst_release(dst); ++ dst = NULL; ++ goto tx_err_link_failure; ++ } ++ skb_dst_set(skb, dst); ++ } + + dst_hold(dst); + dst = xfrm_lookup(t->net, dst, fl, NULL, 0); +diff --git a/net/sched/ematch.c b/net/sched/ematch.c +index b0b04b3c0896..d4d6f9c91e8c 100644 +--- a/net/sched/ematch.c ++++ b/net/sched/ematch.c +@@ -242,6 +242,9 @@ static int tcf_em_validate(struct tcf_proto *tp, + goto errout; + + if (em->ops->change) { ++ err = -EINVAL; ++ if (em_hdr->flags & TCF_EM_SIMPLE) ++ goto errout; + err = em->ops->change(net, data, data_len, em); + if (err < 0) + goto errout; +diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c +index b50ee5d622e1..843d2cf1e6a6 100644 +--- a/net/wireless/wext-core.c ++++ b/net/wireless/wext-core.c +@@ -656,7 +656,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev) + return NULL; + } + +-static int iw_handler_get_iwstats(struct net_device * dev, ++/* noinline to avoid a bogus warning with -O3 */ ++static noinline int iw_handler_get_iwstats(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra) +diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c +index b9bfbf394959..59423576b1cc 100644 +--- a/sound/core/pcm_native.c ++++ b/sound/core/pcm_native.c +@@ -588,7 +588,7 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, + runtime->boundary *= 2; + + /* clear the buffer for avoiding possible kernel info leaks */ +- if (runtime->dma_area) ++ if (runtime->dma_area && !substream->ops->copy) + memset(runtime->dma_area, 0, runtime->dma_bytes); + + snd_pcm_timer_resolution_change(substream); From 0a74dd6effa3b75ec7822042a8f90c37545016a9 Mon Sep 17 00:00:00 2001 From: sergvpurik Date: Fri, 7 Feb 2020 21:08:06 +0200 Subject: [PATCH 34/54] [rockpi-4b] enable CONFIG_BT_HCIUART_H4 and CONFIG_SERIAL_DEV_BUS linux kernel options to support RockPi 4B bluetooh. --- config/kernel/linux-rockchip64-current.config | 4 ++-- config/kernel/linux-rockchip64-dev.config | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/kernel/linux-rockchip64-current.config b/config/kernel/linux-rockchip64-current.config index 74c2e7ff1e..47b9cc89ab 100644 --- a/config/kernel/linux-rockchip64-current.config +++ b/config/kernel/linux-rockchip64-current.config @@ -1468,7 +1468,7 @@ CONFIG_BT_LEDS=y # CONFIG_BT_HCIBTUSB is not set # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=m -# CONFIG_BT_HCIUART_H4 is not set +CONFIG_BT_HCIUART_H4=y # CONFIG_BT_HCIUART_BCSP is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_INTEL is not set @@ -2993,7 +2993,7 @@ CONFIG_SERIAL_FSL_LINFLEXUART=m # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_SERIAL_DEV_BUS=m CONFIG_TTY_PRINTK=m CONFIG_TTY_PRINTK_LEVEL=6 CONFIG_HVC_DRIVER=y diff --git a/config/kernel/linux-rockchip64-dev.config b/config/kernel/linux-rockchip64-dev.config index 41a60388e6..1feffd26f2 100644 --- a/config/kernel/linux-rockchip64-dev.config +++ b/config/kernel/linux-rockchip64-dev.config @@ -1473,7 +1473,7 @@ CONFIG_BT_LEDS=y # CONFIG_BT_HCIBTUSB is not set # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=m -# CONFIG_BT_HCIUART_H4 is not set +CONFIG_BT_HCIUART_H4=y # CONFIG_BT_HCIUART_BCSP is not set # CONFIG_BT_HCIUART_ATH3K is not set # CONFIG_BT_HCIUART_INTEL is not set @@ -2964,7 +2964,7 @@ CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_SERIAL_DEV_BUS=m CONFIG_TTY_PRINTK=m CONFIG_TTY_PRINTK_LEVEL=6 CONFIG_HVC_DRIVER=y From b36f2be75925609988a3c905e23abab22e1f2c0c Mon Sep 17 00:00:00 2001 From: lanefu Date: Sun, 9 Feb 2020 16:36:37 -0500 Subject: [PATCH 35/54] Update version (#1794) * Update VERSION * move master to next release trunk --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c4d940c058..b75bf32725 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -19.11.9 +20.05.0-trunk From dc75fea03748dde7c44aa8fe6db9077b34967162 Mon Sep 17 00:00:00 2001 From: tonymac32 Date: Sun, 9 Feb 2020 17:09:37 -0500 Subject: [PATCH 36/54] [ rockchip64 ] fix SD card voltage toggling vis codec on rk3328 --- .../rk3328-clean-up-codec-gpio-SD.patch | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 patch/kernel/rockchip64-current/rk3328-clean-up-codec-gpio-SD.patch diff --git a/patch/kernel/rockchip64-current/rk3328-clean-up-codec-gpio-SD.patch b/patch/kernel/rockchip64-current/rk3328-clean-up-codec-gpio-SD.patch new file mode 100644 index 0000000000..add77de84f --- /dev/null +++ b/patch/kernel/rockchip64-current/rk3328-clean-up-codec-gpio-SD.patch @@ -0,0 +1,125 @@ +Existing RK3328 codec drivers have overloaded the GRF phandle to assume +implicit control of the limited-function GPIO_MUTE pin, which is usually +used to enable an external audio line driver IC. Since this pin has a +proper binding of its own (see gpio/rockchip,rk3328-grf-gpio.txt), make +a GPIO explicit in the codec binding too. This will help avoid ambiguity +on boards that use that pin for some other purpose. + +(and while touching the example, enforce the "don't include status" rule) + +Signed-off-by: Robin Murphy +--- + .../devicetree/bindings/sound/rockchip,rk3328-codec.txt | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/Documentation/devicetree/bindings/sound/rockchip,rk3328-codec.txt b/Documentation/devicetree/bindings/sound/rockchip,rk3328-codec.txt +index 2469588c7ccb..1ecd75d2032a 100644 +--- a/Documentation/devicetree/bindings/sound/rockchip,rk3328-codec.txt ++++ b/Documentation/devicetree/bindings/sound/rockchip,rk3328-codec.txt +@@ -10,6 +10,11 @@ Required properties: + - clock-names: should be "pclk". + - spk-depop-time-ms: speak depop time msec. + ++Optional properties: ++ ++- mute-gpios: GPIO specifier for external line driver control (typically the ++ dedicated GPIO_MUTE pin) ++ + Example for rk3328 internal codec: + + codec: codec@ff410000 { +@@ -18,6 +23,6 @@ codec: codec@ff410000 { + rockchip,grf = <&grf>; + clocks = <&cru PCLK_ACODEC>; + clock-names = "pclk"; ++ mute-gpios = <&grf_gpio 0 GPIO_ACTIVE_LOW>; + spk-depop-time-ms = 100; +- status = "disabled"; + }; + +diff --git a/sound/soc/codecs/rk3328_codec.c b/sound/soc/codecs/rk3328_codec.c +index 287c962ba00d..f0e9ef21c5f8 100644 +--- a/sound/soc/codecs/rk3328_codec.c ++++ b/sound/soc/codecs/rk3328_codec.c +@@ -7,6 +7,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -31,7 +32,7 @@ + + struct rk3328_codec_priv { + struct regmap *regmap; +- struct regmap *grf; ++ struct gpio_desc *mute; + struct clk *mclk; + struct clk *pclk; + unsigned int sclk; +@@ -106,16 +107,6 @@ static int rk3328_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) + return 0; + } + +-static void rk3328_analog_output(struct rk3328_codec_priv *rk3328, int mute) +-{ +- unsigned int val = BIT(17); +- +- if (mute) +- val |= BIT(1); +- +- regmap_write(rk3328->grf, RK3328_GRF_SOC_CON10, val); +-} +- + static int rk3328_digital_mute(struct snd_soc_dai *dai, int mute) + { + struct rk3328_codec_priv *rk3328 = +@@ -205,7 +196,7 @@ static int rk3328_codec_open_playback(struct rk3328_codec_priv *rk3328) + } + + msleep(rk3328->spk_depop_time); +- rk3328_analog_output(rk3328, 1); ++ gpiod_set_value(rk3328->mute, 0); + + regmap_update_bits(rk3328->regmap, HPOUTL_GAIN_CTRL, + HPOUTL_GAIN_MASK, OUT_VOLUME); +@@ -246,7 +237,7 @@ static int rk3328_codec_close_playback(struct rk3328_codec_priv *rk3328) + { + size_t i; + +- rk3328_analog_output(rk3328, 0); ++ gpiod_set_value(rk3328->mute, 1); + + regmap_update_bits(rk3328->regmap, HPOUTL_GAIN_CTRL, + HPOUTL_GAIN_MASK, 0); +@@ -446,7 +437,6 @@ static int rk3328_platform_probe(struct platform_device *pdev) + dev_err(&pdev->dev, "missing 'rockchip,grf'\n"); + return PTR_ERR(grf); + } +- rk3328->grf = grf; + /* enable i2s_acodec_en */ + regmap_write(grf, RK3328_GRF_SOC_CON2, + (BIT(14) << 16 | BIT(14))); +@@ -458,7 +448,7 @@ static int rk3328_platform_probe(struct platform_device *pdev) + rk3328->spk_depop_time = 200; + } + +- rk3328_analog_output(rk3328, 0); ++ rk3328->mute = gpiod_get_optional(&pdev->dev, "mute", GPIOD_OUT_HIGH); + + rk3328->mclk = devm_clk_get(&pdev->dev, "mclk"); + if (IS_ERR(rk3328->mclk)) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +index 62936b432f9a..bf3e546f5266 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +@@ -104,6 +104,7 @@ + }; + + &codec { ++ mute-gpios = <&grf_gpio 0 GPIO_ACTIVE_LOW>; + status = "okay"; + + port@0 { From 7570bfcf04e180ea6cfac309f6600b56f33d0000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Pe=C4=8Dovnik?= Date: Tue, 11 Feb 2020 17:36:58 +0100 Subject: [PATCH 37/54] Improve DVFS handling on Allwinner A64 boards to gain stability (#1797) --- .../sunxi-current/0009-add-a64-cyrpto.patch | 42 +++ .../0010-add-mipi-dsi-pipeline.patch | 80 +++++ .../0011-add-thermal-sensors-a64.patch | 92 +++++ .../sunxi-current/0012-a64-use-macros.patch | 55 +++ .../0013-add-cpu-clocks-to-nodes.patch | 61 ++++ ...-a64-enable-dvfs-and-tripping-points.patch | 104 ++++++ ...5-add_dtsi_with_CPU_operating_points.patch | 101 ++++++ .../sunxi-current/0034-dts-a64-ths.patch | 62 ---- .../sunxi-current/0037-a64-dvfs-wip.patch | 260 -------------- ...ner-a64-sopine-baseboard-enable-powe.patch | 39 -- ...000-orangepi-win_enable_audio_codec.patch} | 0 .../sunxi-current/2000-a64-enable-dvfs.patch | 332 ++++++++++++++++++ .../sunxi-current/xxx-bananapim64.patch | 138 ++++++++ .../sunxi-dev/0034-dts-a64-ths.patch-disabled | 62 ---- 14 files changed, 1005 insertions(+), 423 deletions(-) create mode 100644 patch/kernel/sunxi-current/0009-add-a64-cyrpto.patch create mode 100644 patch/kernel/sunxi-current/0010-add-mipi-dsi-pipeline.patch create mode 100644 patch/kernel/sunxi-current/0011-add-thermal-sensors-a64.patch create mode 100644 patch/kernel/sunxi-current/0012-a64-use-macros.patch create mode 100644 patch/kernel/sunxi-current/0013-add-cpu-clocks-to-nodes.patch create mode 100644 patch/kernel/sunxi-current/0014-a64-enable-dvfs-and-tripping-points.patch create mode 100644 patch/kernel/sunxi-current/0015-add_dtsi_with_CPU_operating_points.patch delete mode 100644 patch/kernel/sunxi-current/0034-dts-a64-ths.patch delete mode 100644 patch/kernel/sunxi-current/0037-a64-dvfs-wip.patch delete mode 100644 patch/kernel/sunxi-current/0108-arm64-dts-allwinner-a64-sopine-baseboard-enable-powe.patch rename patch/kernel/sunxi-current/{orangepi-win_enable_audio_codec.patch => 1000-orangepi-win_enable_audio_codec.patch} (100%) create mode 100644 patch/kernel/sunxi-current/2000-a64-enable-dvfs.patch create mode 100644 patch/kernel/sunxi-current/xxx-bananapim64.patch delete mode 100644 patch/kernel/sunxi-dev/0034-dts-a64-ths.patch-disabled diff --git a/patch/kernel/sunxi-current/0009-add-a64-cyrpto.patch b/patch/kernel/sunxi-current/0009-add-a64-cyrpto.patch new file mode 100644 index 0000000000..9089594e40 --- /dev/null +++ b/patch/kernel/sunxi-current/0009-add-a64-cyrpto.patch @@ -0,0 +1,42 @@ +From 0f5fc158851b63fd145b1b105376b8976eb4934d Mon Sep 17 00:00:00 2001 +From: Corentin Labbe +Date: Wed, 23 Oct 2019 22:05:08 +0200 +Subject: arm64: dts: allwinner: sun50i: Add Crypto Engine node on A64 + +The Crypto Engine is a hardware cryptographic accelerator that supports +many algorithms. +It could be found on most Allwinner SoCs. + +This patch enables the Crypto Engine on the Allwinner A64 SoC Device-tree. + +Signed-off-by: Corentin Labbe +Signed-off-by: Maxime Ripard +--- + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 9 +++++++++ + 1 file changed, 9 insertions(+) + +(limited to 'arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi') + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 69128a6dfc46..5daa398f9246 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -487,6 +487,15 @@ + reg = <0x1c14000 0x400>; + }; + ++ crypto: crypto@1c15000 { ++ compatible = "allwinner,sun50i-a64-crypto"; ++ reg = <0x01c15000 0x1000>; ++ interrupts = ; ++ clocks = <&ccu CLK_BUS_CE>, <&ccu CLK_CE>; ++ clock-names = "bus", "mod"; ++ resets = <&ccu RST_BUS_CE>; ++ }; ++ + usb_otg: usb@1c19000 { + compatible = "allwinner,sun8i-a33-musb"; + reg = <0x01c19000 0x0400>; +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0010-add-mipi-dsi-pipeline.patch b/patch/kernel/sunxi-current/0010-add-mipi-dsi-pipeline.patch new file mode 100644 index 0000000000..a06e0395b7 --- /dev/null +++ b/patch/kernel/sunxi-current/0010-add-mipi-dsi-pipeline.patch @@ -0,0 +1,80 @@ +From 16c8ff571a16f47592ae161f92737b2fd50a0e70 Mon Sep 17 00:00:00 2001 +From: Jagan Teki +Date: Sun, 22 Dec 2019 18:52:28 +0530 +Subject: arm64: dts: allwinner: a64: Add MIPI DSI pipeline + +Add MIPI DSI pipeline for Allwinner A64. + +- dsi node, with A64 compatible since it doesn't support + DSI_SCLK gating unlike A33 +- dphy node, with A64 compatible with A33 fallback since + DPHY on A64 and A33 is similar +- finally, attach the dsi_in to tcon0 for complete MIPI DSI + +Signed-off-by: Jagan Teki +Tested-by: Merlijn Wajer +Signed-off-by: Maxime Ripard +--- + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 37 +++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +(limited to 'arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi') + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 9a89324d02db..92688b89c2a4 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -367,6 +367,12 @@ + #address-cells = <1>; + #size-cells = <0>; + reg = <1>; ++ ++ tcon0_out_dsi: endpoint@1 { ++ reg = <1>; ++ remote-endpoint = <&dsi_in_tcon0>; ++ allwinner,tcon-channel = <1>; ++ }; + }; + }; + }; +@@ -1017,6 +1023,37 @@ + status = "disabled"; + }; + ++ dsi: dsi@1ca0000 { ++ compatible = "allwinner,sun50i-a64-mipi-dsi"; ++ reg = <0x01ca0000 0x1000>; ++ interrupts = ; ++ clocks = <&ccu CLK_BUS_MIPI_DSI>; ++ resets = <&ccu RST_BUS_MIPI_DSI>; ++ phys = <&dphy>; ++ phy-names = "dphy"; ++ status = "disabled"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ port { ++ dsi_in_tcon0: endpoint { ++ remote-endpoint = <&tcon0_out_dsi>; ++ }; ++ }; ++ }; ++ ++ dphy: d-phy@1ca1000 { ++ compatible = "allwinner,sun50i-a64-mipi-dphy", ++ "allwinner,sun6i-a31-mipi-dphy"; ++ reg = <0x01ca1000 0x1000>; ++ clocks = <&ccu CLK_BUS_MIPI_DSI>, ++ <&ccu CLK_DSI_DPHY>; ++ clock-names = "bus", "mod"; ++ resets = <&ccu RST_BUS_MIPI_DSI>; ++ status = "disabled"; ++ #phy-cells = <0>; ++ }; ++ + hdmi: hdmi@1ee0000 { + compatible = "allwinner,sun50i-a64-dw-hdmi", + "allwinner,sun8i-a83t-dw-hdmi"; +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0011-add-thermal-sensors-a64.patch b/patch/kernel/sunxi-current/0011-add-thermal-sensors-a64.patch new file mode 100644 index 0000000000..d06de7499d --- /dev/null +++ b/patch/kernel/sunxi-current/0011-add-thermal-sensors-a64.patch @@ -0,0 +1,92 @@ +From 59f5e9b9a802a177727017218dcf026dc390c37d Mon Sep 17 00:00:00 2001 +From: Vasily Khoruzhick +Date: Thu, 19 Dec 2019 09:28:23 -0800 +Subject: arm64: dts: allwinner: a64: Add thermal sensors and thermal zones + +A64 has 3 thermal sensors: 1 for CPU, 2 for GPU. + +Signed-off-by: Vasily Khoruzhick +Signed-off-by: Maxime Ripard +--- + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 42 +++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +(limited to 'arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi') + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index ab42c0664b3e..9a89324d02db 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + + / { + interrupt-parent = <&gic>; +@@ -172,6 +173,29 @@ + (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; + }; + ++ thermal-zones { ++ cpu_thermal: cpu0-thermal { ++ /* milliseconds */ ++ polling-delay-passive = <0>; ++ polling-delay = <0>; ++ thermal-sensors = <&ths 0>; ++ }; ++ ++ gpu0_thermal: gpu0-thermal { ++ /* milliseconds */ ++ polling-delay-passive = <0>; ++ polling-delay = <0>; ++ thermal-sensors = <&ths 1>; ++ }; ++ ++ gpu1_thermal: gpu1-thermal { ++ /* milliseconds */ ++ polling-delay-passive = <0>; ++ polling-delay = <0>; ++ thermal-sensors = <&ths 2>; ++ }; ++ }; ++ + soc { + compatible = "simple-bus"; + #address-cells = <1>; +@@ -446,6 +470,12 @@ + sid: eeprom@1c14000 { + compatible = "allwinner,sun50i-a64-sid"; + reg = <0x1c14000 0x400>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ ths_calibration: thermal-sensor-calibration@34 { ++ reg = <0x34 0x8>; ++ }; + }; + + crypto: crypto@1c15000 { +@@ -771,6 +801,18 @@ + status = "disabled"; + }; + ++ ths: thermal-sensor@1c25000 { ++ compatible = "allwinner,sun50i-a64-ths"; ++ reg = <0x01c25000 0x100>; ++ clocks = <&ccu CLK_BUS_THS>, <&ccu CLK_THS>; ++ clock-names = "bus", "mod"; ++ interrupts = ; ++ resets = <&ccu RST_BUS_THS>; ++ nvmem-cells = <&ths_calibration>; ++ nvmem-cell-names = "calibration"; ++ #thermal-sensor-cells = <1>; ++ }; ++ + uart0: serial@1c28000 { + compatible = "snps,dw-apb-uart"; + reg = <0x01c28000 0x400>; +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0012-a64-use-macros.patch b/patch/kernel/sunxi-current/0012-a64-use-macros.patch new file mode 100644 index 0000000000..032e5d13ab --- /dev/null +++ b/patch/kernel/sunxi-current/0012-a64-use-macros.patch @@ -0,0 +1,55 @@ +From b71818cbda252fc0ceb09939518376141f3b63ce Mon Sep 17 00:00:00 2001 +From: Chen-Yu Tsai +Date: Mon, 6 Jan 2020 17:00:30 +0800 +Subject: arm64: dts: allwinner: sun50i-a64: Use macros for newly exported + clocks + +A few clocks from the CCU were exported later, and references to them in +the device tree were using raw numbers. + +Now that the DT binding header changes are in as well, switch to the +macros for more clarity. + +Signed-off-by: Chen-Yu Tsai +Signed-off-by: Maxime Ripard +--- + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +(limited to 'arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi') + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 92688b89c2a4..293059ffbbf6 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -590,7 +590,7 @@ + interrupts = , + , + ; +- clocks = <&ccu 58>, <&osc24M>, <&rtc 0>; ++ clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&rtc 0>; + clock-names = "apb", "hosc", "losc"; + gpio-controller; + #gpio-cells = <3>; +@@ -1091,7 +1091,7 @@ + compatible = "allwinner,sun50i-a64-hdmi-phy"; + reg = <0x01ef0000 0x10000>; + clocks = <&ccu CLK_BUS_HDMI>, <&ccu CLK_HDMI_DDC>, +- <&ccu 7>; ++ <&ccu CLK_PLL_VIDEO0>; + clock-names = "bus", "mod", "pll-0"; + resets = <&ccu RST_BUS_HDMI0>; + reset-names = "phy"; +@@ -1121,7 +1121,8 @@ + r_ccu: clock@1f01400 { + compatible = "allwinner,sun50i-a64-r-ccu"; + reg = <0x01f01400 0x100>; +- clocks = <&osc24M>, <&rtc 0>, <&rtc 2>, <&ccu 11>; ++ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>, ++ <&ccu CLK_PLL_PERIPH0>; + clock-names = "hosc", "losc", "iosc", "pll-periph"; + #clock-cells = <1>; + #reset-cells = <1>; +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0013-add-cpu-clocks-to-nodes.patch b/patch/kernel/sunxi-current/0013-add-cpu-clocks-to-nodes.patch new file mode 100644 index 0000000000..fb16bdf7c8 --- /dev/null +++ b/patch/kernel/sunxi-current/0013-add-cpu-clocks-to-nodes.patch @@ -0,0 +1,61 @@ +From f267eff70c0c4f51765fcb2498444d7bc0048725 Mon Sep 17 00:00:00 2001 +From: Vasily Khoruzhick +Date: Tue, 7 Jan 2020 20:20:15 -0800 +Subject: arm64: dts: allwinner: a64: add CPU clock to CPU0-3 nodes + +Add CPU clock to the CPU nodes since it is a prerequisite for enabling +DVFS. + +Signed-off-by: Vasily Khoruzhick +Signed-off-by: Maxime Ripard +[wens@csie.org: Replace CLK_CPUX macro with raw number] +Signed-off-by: Chen-Yu Tsai +--- + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 8 ++++++++ + 1 file changed, 8 insertions(+) + +(limited to 'arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi') + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 293059ffbbf6..72eedd39a2eb 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -51,6 +51,8 @@ + reg = <0>; + enable-method = "psci"; + next-level-cache = <&L2>; ++ clocks = <&ccu 21>; ++ clock-names = "cpu"; + }; + + cpu1: cpu@1 { +@@ -59,6 +61,8 @@ + reg = <1>; + enable-method = "psci"; + next-level-cache = <&L2>; ++ clocks = <&ccu 21>; ++ clock-names = "cpu"; + }; + + cpu2: cpu@2 { +@@ -67,6 +71,8 @@ + reg = <2>; + enable-method = "psci"; + next-level-cache = <&L2>; ++ clocks = <&ccu 21>; ++ clock-names = "cpu"; + }; + + cpu3: cpu@3 { +@@ -75,6 +81,8 @@ + reg = <3>; + enable-method = "psci"; + next-level-cache = <&L2>; ++ clocks = <&ccu 21>; ++ clock-names = "cpu"; + }; + + L2: l2-cache { +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0014-a64-enable-dvfs-and-tripping-points.patch b/patch/kernel/sunxi-current/0014-a64-enable-dvfs-and-tripping-points.patch new file mode 100644 index 0000000000..8bd05b90b0 --- /dev/null +++ b/patch/kernel/sunxi-current/0014-a64-enable-dvfs-and-tripping-points.patch @@ -0,0 +1,104 @@ +From e1c3804a177418fe14d95f0c4ccba5ae66f73d82 Mon Sep 17 00:00:00 2001 +From: Vasily Khoruzhick +Date: Tue, 7 Jan 2020 20:20:16 -0800 +Subject: arm64: dts: allwinner: a64: add cooling maps and thermal tripping + points + +Add cooling maps and thermal tripping points to prevent CPU overheating when +running at the highest frequency. Tripping points are taken from A33 dts since +A64 user manual doesn't mention when we should start throttling. + +Signed-off-by: Vasily Khoruzhick +Signed-off-by: Maxime Ripard +--- + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 44 +++++++++++++++++++++++++++ + 1 file changed, 44 insertions(+) + +(limited to 'arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi') + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 72eedd39a2eb..862b47dc9dc9 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -53,6 +53,7 @@ + next-level-cache = <&L2>; + clocks = <&ccu 21>; + clock-names = "cpu"; ++ #cooling-cells = <2>; + }; + + cpu1: cpu@1 { +@@ -63,6 +64,7 @@ + next-level-cache = <&L2>; + clocks = <&ccu 21>; + clock-names = "cpu"; ++ #cooling-cells = <2>; + }; + + cpu2: cpu@2 { +@@ -73,6 +75,7 @@ + next-level-cache = <&L2>; + clocks = <&ccu 21>; + clock-names = "cpu"; ++ #cooling-cells = <2>; + }; + + cpu3: cpu@3 { +@@ -83,6 +86,7 @@ + next-level-cache = <&L2>; + clocks = <&ccu 21>; + clock-names = "cpu"; ++ #cooling-cells = <2>; + }; + + L2: l2-cache { +@@ -187,6 +191,46 @@ + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&ths 0>; ++ ++ cooling-maps { ++ map0 { ++ trip = <&cpu_alert0>; ++ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, ++ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, ++ <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, ++ <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; ++ }; ++ map1 { ++ trip = <&cpu_alert1>; ++ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, ++ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, ++ <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, ++ <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; ++ }; ++ }; ++ ++ trips { ++ cpu_alert0: cpu_alert0 { ++ /* milliCelsius */ ++ temperature = <75000>; ++ hysteresis = <2000>; ++ type = "passive"; ++ }; ++ ++ cpu_alert1: cpu_alert1 { ++ /* milliCelsius */ ++ temperature = <90000>; ++ hysteresis = <2000>; ++ type = "hot"; ++ }; ++ ++ cpu_crit: cpu_crit { ++ /* milliCelsius */ ++ temperature = <110000>; ++ hysteresis = <2000>; ++ type = "critical"; ++ }; ++ }; + }; + + gpu0_thermal: gpu0-thermal { +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0015-add_dtsi_with_CPU_operating_points.patch b/patch/kernel/sunxi-current/0015-add_dtsi_with_CPU_operating_points.patch new file mode 100644 index 0000000000..b5542ddfbd --- /dev/null +++ b/patch/kernel/sunxi-current/0015-add_dtsi_with_CPU_operating_points.patch @@ -0,0 +1,101 @@ +From 51b3eaba8ad742ab72131ef436208312f0b70605 Mon Sep 17 00:00:00 2001 +From: Vasily Khoruzhick +Date: Tue, 7 Jan 2020 20:20:17 -0800 +Subject: arm64: dts: allwinner: a64: add dtsi with CPU operating points + +Add operating points for A64. These are taken from FEX file from BSP +for A64. + +Signed-off-by: Vasily Khoruzhick +Signed-off-by: Maxime Ripard +--- + .../boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi | 75 ++++++++++++++++++++++ + 1 file changed, 75 insertions(+) + create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi + +(limited to 'arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi') + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi +new file mode 100644 +index 000000000000..578c37490d90 +--- /dev/null ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi +@@ -0,0 +1,75 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2020 Vasily khoruzhick ++ */ ++ ++/ { ++ cpu0_opp_table: opp_table0 { ++ compatible = "operating-points-v2"; ++ opp-shared; ++ ++ opp-648000000 { ++ opp-hz = /bits/ 64 <648000000>; ++ opp-microvolt = <1040000>; ++ clock-latency-ns = <244144>; /* 8 32k periods */ ++ }; ++ ++ opp-816000000 { ++ opp-hz = /bits/ 64 <816000000>; ++ opp-microvolt = <1100000>; ++ clock-latency-ns = <244144>; /* 8 32k periods */ ++ }; ++ ++ opp-912000000 { ++ opp-hz = /bits/ 64 <912000000>; ++ opp-microvolt = <1120000>; ++ clock-latency-ns = <244144>; /* 8 32k periods */ ++ }; ++ ++ opp-960000000 { ++ opp-hz = /bits/ 64 <960000000>; ++ opp-microvolt = <1160000>; ++ clock-latency-ns = <244144>; /* 8 32k periods */ ++ }; ++ ++ opp-1008000000 { ++ opp-hz = /bits/ 64 <1008000000>; ++ opp-microvolt = <1200000>; ++ clock-latency-ns = <244144>; /* 8 32k periods */ ++ }; ++ ++ opp-1056000000 { ++ opp-hz = /bits/ 64 <1056000000>; ++ opp-microvolt = <1240000>; ++ clock-latency-ns = <244144>; /* 8 32k periods */ ++ }; ++ ++ opp-1104000000 { ++ opp-hz = /bits/ 64 <1104000000>; ++ opp-microvolt = <1260000>; ++ clock-latency-ns = <244144>; /* 8 32k periods */ ++ }; ++ ++ opp-1152000000 { ++ opp-hz = /bits/ 64 <1152000000>; ++ opp-microvolt = <1300000>; ++ clock-latency-ns = <244144>; /* 8 32k periods */ ++ }; ++ }; ++}; ++ ++&cpu0 { ++ operating-points-v2 = <&cpu0_opp_table>; ++}; ++ ++&cpu1 { ++ operating-points-v2 = <&cpu0_opp_table>; ++}; ++ ++&cpu2 { ++ operating-points-v2 = <&cpu0_opp_table>; ++}; ++ ++&cpu3 { ++ operating-points-v2 = <&cpu0_opp_table>; ++}; +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0034-dts-a64-ths.patch b/patch/kernel/sunxi-current/0034-dts-a64-ths.patch deleted file mode 100644 index 6f550c3f2f..0000000000 --- a/patch/kernel/sunxi-current/0034-dts-a64-ths.patch +++ /dev/null @@ -1,62 +0,0 @@ -From ff4436bd3de240a1d0796d4c6f8bd676ff0925e1 Mon Sep 17 00:00:00 2001 -From: Vasily Khoruzhick -Date: Mon, 23 Apr 2018 23:24:41 -0700 -Subject: [PATCH 034/146] dts: a64 ths - ---- - arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 32 +++++++++++++++++++ - 1 file changed, 32 insertions(+) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -index 0b44018361cb..0eb482eb58b7 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -@@ -171,6 +171,27 @@ - }; - }; - -+ thermal-zones { -+ cpu_thermal: cpu0-thermal { -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 0>; -+ }; -+ gpu0_thermal: gpu0-thermal { -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 1>; -+ }; -+ gpu1_thermal: gpu1-thermal { -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 2>; -+ }; -+ }; -+ - timer { - compatible = "arm,armv8-timer"; - interrupts = ; -+ interrupts = ; -+ clocks = <&ccu CLK_BUS_THS>, <&ccu CLK_THS>; -+ clock-names = "bus", "mod"; -+ resets = <&ccu RST_BUS_THS>; -+ #io-channel-cells = <0>; -+ #thermal-sensor-cells = <1>; -+ }; -+ - uart0: serial@1c28000 { - compatible = "snps,dw-apb-uart"; - reg = <0x01c28000 0x400>; --- -2.17.1 - diff --git a/patch/kernel/sunxi-current/0037-a64-dvfs-wip.patch b/patch/kernel/sunxi-current/0037-a64-dvfs-wip.patch deleted file mode 100644 index 1288d31b2f..0000000000 --- a/patch/kernel/sunxi-current/0037-a64-dvfs-wip.patch +++ /dev/null @@ -1,260 +0,0 @@ -From b07dd371b1a1203a013f91da750259f7a2467fce Mon Sep 17 00:00:00 2001 -From: Vasily Khoruzhick -Date: Tue, 24 Apr 2018 22:21:27 -0700 -Subject: [PATCH 037/146] a64 dvfs wip - -Changed: Igor - ---- - .../boot/dts/allwinner/sun50i-a64-pine64.dts | 4 + - .../dts/allwinner/sun50i-a64-pinebook.dts | 4 + - .../allwinner/sun50i-a64-sopine-baseboard.dts | 4 + - arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 111 ++++++++++++++++-- - drivers/clk/sunxi-ng/ccu-sun50i-a64.h | 1 - - include/dt-bindings/clock/sun50i-a64-ccu.h | 1 + - 6 files changed, 112 insertions(+), 13 deletions(-) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts -index 8c5dd99cc9ac..cdf5169f2a1a 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts -@@ -69,6 +69,10 @@ - }; - }; - -+&cpu0 { -+ cpu-supply = <®_dcdc2>; -+}; -+ - &ehci0 { - status = "okay"; - }; -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts -index 897e60cbe38d..b3698a8bb1d3 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts -@@ -66,6 +66,10 @@ - }; - }; - -+&cpu0 { -+ cpu-supply = <®_dcdc2>; -+}; -+ - &ehci0 { - phys = <&usbphy 0>; - phy-names = "usb"; -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts -index 8161895dde52..dc728b3b5556 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts -@@ -69,6 +69,10 @@ - }; - }; - -+&cpu0 { -+ cpu-supply = <®_dcdc2>; -+}; -+ - &ehci0 { - status = "okay"; - }; -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -index 0eb482eb58b7..62b880f68d6a 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -@@ -49,6 +49,7 @@ - #include - #include - #include -+#include - - / { - interrupt-parent = <&gic>; -@@ -79,6 +80,52 @@ - }; - }; - -+ cpu0_opp_table: opp_table0 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp-120000000 { -+ opp-hz = /bits/ 64 <120000000>; -+ opp-microvolt = <1040000>; -+ clock-latency-ns = <244144>; /* 8 32k periods */ -+ }; -+ opp-648000000 { -+ opp-hz = /bits/ 64 <648000000>; -+ opp-microvolt = <1040000>; -+ clock-latency-ns = <244144>; /* 8 32k periods */ -+ }; -+ opp-816000000 { -+ opp-hz = /bits/ 64 <816000000>; -+ opp-microvolt = <1100000>; -+ clock-latency-ns = <244144>; /* 8 32k periods */ -+ }; -+ opp-912000000 { -+ opp-hz = /bits/ 64 <912000000>; -+ opp-microvolt = <1120000>; -+ clock-latency-ns = <244144>; /* 8 32k periods */ -+ }; -+ opp-960000000 { -+ opp-hz = /bits/ 64 <960000000>; -+ opp-microvolt = <1160000>; -+ clock-latency-ns = <244144>; /* 8 32k periods */ -+ }; -+ opp-1008000000 { -+ opp-hz = /bits/ 64 <1008000000>; -+ opp-microvolt = <1200000>; -+ clock-latency-ns = <244144>; /* 8 32k periods */ -+ }; -+ opp-1056000000 { -+ opp-hz = /bits/ 64 <1056000000>; -+ opp-microvolt = <1240000>; -+ clock-latency-ns = <244144>; /* 8 32k periods */ -+ }; -+ opp-1104000000 { -+ opp-hz = /bits/ 64 <1104000000>; -+ opp-microvolt = <1300000>; -+ clock-latency-ns = <244144>; /* 8 32k periods */ -+ }; -+ }; -+ - cpus { - #address-cells = <1>; - #size-cells = <0>; -@@ -88,7 +135,11 @@ - device_type = "cpu"; - reg = <0>; - enable-method = "psci"; -+ clocks = <&ccu CLK_CPUX>; -+ clock-names = "cpu"; -+ operating-points-v2 = <&cpu0_opp_table>; -+ #cooling-cells = <2>; - next-level-cache = <&L2>; - }; - - cpu1: cpu@1 { -@@ -95,7 +146,8 @@ - device_type = "cpu"; - reg = <1>; - enable-method = "psci"; -+ operating-points-v2 = <&cpu0_opp_table>; - next-level-cache = <&L2>; - }; - - cpu2: cpu@2 { -@@ -102,7 +154,8 @@ - device_type = "cpu"; - reg = <2>; - enable-method = "psci"; -+ operating-points-v2 = <&cpu0_opp_table>; - next-level-cache = <&L2>; - }; - - cpu3: cpu@3 { -@@ -109,7 +162,8 @@ - device_type = "cpu"; - reg = <3>; - enable-method = "psci"; -+ operating-points-v2 = <&cpu0_opp_table>; - next-level-cache = <&L2>; - }; - }; - -@@ -173,22 +227,55 @@ - - thermal-zones { - cpu_thermal: cpu0-thermal { -- /* milliseconds */ -- polling-delay-passive = <250>; -- polling-delay = <1000>; -- thermal-sensors = <&ths 0>; -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 0>; -+ -+ cooling-maps { -+ map0 { -+ trip = <&cpu_alert0>; -+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; -+ }; -+ map1 { -+ trip = <&cpu_alert1>; -+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; -+ }; -+ }; -+ trips { -+ cpu_alert0: cpu_alert0 { -+ /* milliCelsius */ -+ temperature = <75000>; -+ hysteresis = <2000>; -+ type = "passive"; -+ }; -+ -+ cpu_alert1: cpu_alert1 { -+ /* milliCelsius */ -+ temperature = <90000>; -+ hysteresis = <2000>; -+ type = "hot"; -+ }; -+ -+ cpu_crit: cpu_crit { -+ /* milliCelsius */ -+ temperature = <110000>; -+ hysteresis = <2000>; -+ type = "critical"; -+ }; -+ }; - }; - gpu0_thermal: gpu0-thermal { -- /* milliseconds */ -- polling-delay-passive = <250>; -- polling-delay = <1000>; -- thermal-sensors = <&ths 1>; -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 1>; - }; - gpu1_thermal: gpu1-thermal { -- /* milliseconds */ -- polling-delay-passive = <250>; -- polling-delay = <1000>; -- thermal-sensors = <&ths 2>; -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 2>; - }; - }; - -diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.h b/drivers/clk/sunxi-ng/ccu-sun50i-a64.h -index 061b6fbb4f95..91f79512cee4 100644 ---- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.h -+++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.h -@@ -43,7 +43,6 @@ - #define CLK_PLL_HSIC 18 - #define CLK_PLL_DE 19 - #define CLK_PLL_DDR1 20 --#define CLK_CPUX 21 - #define CLK_AXI 22 - #define CLK_APB 23 - #define CLK_AHB1 24 -diff --git a/include/dt-bindings/clock/sun50i-a64-ccu.h b/include/dt-bindings/clock/sun50i-a64-ccu.h -index d66432c6e675..d7f42dd22663 100644 ---- a/include/dt-bindings/clock/sun50i-a64-ccu.h -+++ b/include/dt-bindings/clock/sun50i-a64-ccu.h -@@ -45,6 +45,7 @@ - - #define CLK_PLL_PERIPH0 11 - -+#define CLK_CPUX 21 - #define CLK_BUS_MIPI_DSI 28 - #define CLK_BUS_CE 29 - #define CLK_BUS_DMA 30 --- -2.17.1 - diff --git a/patch/kernel/sunxi-current/0108-arm64-dts-allwinner-a64-sopine-baseboard-enable-powe.patch b/patch/kernel/sunxi-current/0108-arm64-dts-allwinner-a64-sopine-baseboard-enable-powe.patch deleted file mode 100644 index f6b2c7d0b1..0000000000 --- a/patch/kernel/sunxi-current/0108-arm64-dts-allwinner-a64-sopine-baseboard-enable-powe.patch +++ /dev/null @@ -1,39 +0,0 @@ -From f16f4cbdb0deb70c03731fbccb4f52eb4d1d096a Mon Sep 17 00:00:00 2001 -From: Oskari Lemmela -Date: Tue, 23 Oct 2018 21:53:26 +0300 -Subject: [PATCH 108/146] arm64: dts: allwinner: a64: sopine-baseboard: enable - power supplies - -AXP803 ACIN pins are routed from SOM to the DC jack on the baseboard. -AXP803 charger pins BATSENSE, LOADSENSE, N_BATDRV, LX_CHG, VIN_CHG -and IPSOUT are connected via PMOS driver to SOM VBAT pins. VBAT and -AXP803 TS pins are routed to the baseboard 3-pin battery connector. - -Signed-off-by: Oskari Lemmela -Reviewed-by: Quentin Schulz ---- - .../boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts -index 8e9191f489a6..df7aa8c5f751 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts -@@ -80,6 +80,14 @@ - }; - }; - -+&ac_power_supply { -+ status = "okay"; -+}; -+ -+&battery_power_supply { -+ status = "okay"; -+}; -+ - &cpu0 { - cpu-supply = <®_dcdc2>; - }; --- -2.17.1 - diff --git a/patch/kernel/sunxi-current/orangepi-win_enable_audio_codec.patch b/patch/kernel/sunxi-current/1000-orangepi-win_enable_audio_codec.patch similarity index 100% rename from patch/kernel/sunxi-current/orangepi-win_enable_audio_codec.patch rename to patch/kernel/sunxi-current/1000-orangepi-win_enable_audio_codec.patch diff --git a/patch/kernel/sunxi-current/2000-a64-enable-dvfs.patch b/patch/kernel/sunxi-current/2000-a64-enable-dvfs.patch new file mode 100644 index 0000000000..e7c070a335 --- /dev/null +++ b/patch/kernel/sunxi-current/2000-a64-enable-dvfs.patch @@ -0,0 +1,332 @@ +Add CPU regulator and operating points for all the A64-based boards +that are currently supported to enable DVFS. + +Signed-off-by: Vasily Khoruzhick +--- + .../dts/allwinner/sun50i-a64-amarula-relic.dts | 17 +++++++++++++++++ + .../dts/allwinner/sun50i-a64-bananapi-m64.dts | 17 +++++++++++++++++ + .../dts/allwinner/sun50i-a64-nanopi-a64.dts | 17 +++++++++++++++++ + .../boot/dts/allwinner/sun50i-a64-olinuxino.dts | 17 +++++++++++++++++ + .../dts/allwinner/sun50i-a64-orangepi-win.dts | 17 +++++++++++++++++ + .../boot/dts/allwinner/sun50i-a64-pine64.dts | 17 +++++++++++++++++ + .../boot/dts/allwinner/sun50i-a64-pinebook.dts | 17 +++++++++++++++++ + .../boot/dts/allwinner/sun50i-a64-sopine.dtsi | 17 +++++++++++++++++ + .../boot/dts/allwinner/sun50i-a64-teres-i.dts | 17 +++++++++++++++++ + 9 files changed, 153 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-amarula-relic.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-amarula-relic.dts +index 5634245d11db..6ee7291293ec 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-amarula-relic.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-amarula-relic.dts +@@ -7,6 +7,7 @@ + /dts-v1/; + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + +@@ -65,6 +66,22 @@ wifi_pwrseq: wifi-pwrseq { + }; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &csi { + status = "okay"; + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts +index 208373efee49..9b80e06f40d6 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts +@@ -43,6 +43,7 @@ + /dts-v1/; + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + +@@ -108,6 +109,22 @@ &codec_analog { + status = "okay"; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &dai { + status = "okay"; + }; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts +index 9b9d9157128c..6b81b91da504 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts +@@ -43,6 +43,7 @@ + /dts-v1/; + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + +@@ -87,6 +88,22 @@ wifi_pwrseq: wifi_pwrseq { + }; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &de { + status = "okay"; + }; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts +index 01a9a52edae4..fb45c32558c5 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts +@@ -43,6 +43,7 @@ + /dts-v1/; + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + +@@ -87,6 +88,22 @@ wifi_pwrseq: wifi_pwrseq { + }; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &de { + status = "okay"; + }; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts +index f54a415f2e3b..a510cf40a9fe 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts +@@ -44,6 +44,7 @@ + /dts-v1/; + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + +@@ -123,6 +124,22 @@ &codec_analog { + status = "okay"; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &dai { + status = "okay"; + }; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts +index 409523cb0950..7cb01886aa32 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts +@@ -43,6 +43,7 @@ + /dts-v1/; + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + +@@ -84,6 +85,22 @@ &codec_analog { + status = "okay"; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &dai { + status = "okay"; + }; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +index 78c82a665c84..74a8569c677f 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +@@ -8,6 +8,7 @@ + /dts-v1/; + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + #include +@@ -98,6 +99,22 @@ &codec_analog { + status = "okay"; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &dai { + status = "okay"; + }; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi +index 9d20e13f0c02..e64f330ca420 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi +@@ -44,6 +44,7 @@ + */ + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + +@@ -51,6 +52,22 @@ &codec_analog { + cpvdd-supply = <®_eldo1>; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &mmc0 { + pinctrl-names = "default"; + pinctrl-0 = <&mmc0_pins>; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts +index 970415106dcf..0356608ce467 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts +@@ -8,6 +8,7 @@ + /dts-v1/; + + #include "sun50i-a64.dtsi" ++#include "sun50i-a64-cpu-opp.dtsi" + + #include + #include +@@ -104,6 +105,22 @@ &de { + status = "okay"; + }; + ++&cpu0 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu1 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu2 { ++ cpu-supply = <®_dcdc2>; ++}; ++ ++&cpu3 { ++ cpu-supply = <®_dcdc2>; ++}; ++ + &ehci1 { + status = "okay"; + }; +-- diff --git a/patch/kernel/sunxi-current/xxx-bananapim64.patch b/patch/kernel/sunxi-current/xxx-bananapim64.patch new file mode 100644 index 0000000000..f4c1607db1 --- /dev/null +++ b/patch/kernel/sunxi-current/xxx-bananapim64.patch @@ -0,0 +1,138 @@ +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts +index 9b80e06f4..e7b8bc72f 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts +@@ -46,6 +46,8 @@ + #include "sun50i-a64-cpu-opp.dtsi" + + #include ++#include ++#include + + / { + model = "BananaPi-M64"; +@@ -161,12 +163,12 @@ + }; + }; + +-&i2c1 { ++&i2s2 { + status = "okay"; + }; + +-&i2c1_pins { +- bias-pull-up; ++&mixer0 { ++ status = "okay"; + }; + + &mdio { +@@ -180,7 +182,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&mmc0_pins>; + vmmc-supply = <®_dcdc1>; +- cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; ++ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ + disable-wp; + bus-width = <4>; + status = "okay"; +@@ -209,9 +211,11 @@ + pinctrl-names = "default"; + pinctrl-0 = <&mmc2_pins>, <&mmc2_ds_pin>; + vmmc-supply = <®_dcdc1>; ++ vqmmc-supply = <®_eldo1>; + bus-width = <8>; + non-removable; + cap-mmc-hw-reset; ++ mmc-hs200-1_8v; + status = "okay"; + }; + +@@ -223,6 +227,10 @@ + status = "okay"; + }; + ++&r_ir { ++ status = "okay"; ++}; ++ + &r_rsb { + status = "okay"; + +@@ -321,8 +329,14 @@ + regulator-name = "vcc-wifi"; + }; + ++®_dldo3 { ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "avdd-csi"; ++}; ++ + ®_dldo4 { +- regulator-min-microvolt = <1800000>; ++ regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vcc-wifi-io"; + }; +@@ -333,11 +347,18 @@ + }; + + ®_eldo1 { ++ regulator-always-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "cpvdd"; + }; + ++®_eldo3 { ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "dvdd-csi"; ++}; ++ + ®_fldo1 { + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; +@@ -356,6 +377,13 @@ + regulator-name = "vdd-cpus"; + }; + ++®_ldo_io0 { ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc-usb"; ++ status = "okay"; ++}; ++ + ®_rtc_ldo { + regulator-name = "vcc-rtc"; + }; +@@ -380,12 +408,19 @@ + "MIC1", "Onboard Microphone"; + }; + ++&sound_hdmi { ++ status = "okay"; ++}; ++ ++ ++/* On debug connector */ + &uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_pb_pins>; + status = "okay"; + }; + ++/* Bluetooth */ + &uart1 { + pinctrl-names = "default"; + pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; +@@ -394,6 +429,7 @@ + + bluetooth { + compatible = "brcm,bcm43438-bt"; ++ max-speed = <1500000>; + clocks = <&rtc 1>; + clock-names = "lpo"; + vbat-supply = <®_dldo2>; diff --git a/patch/kernel/sunxi-dev/0034-dts-a64-ths.patch-disabled b/patch/kernel/sunxi-dev/0034-dts-a64-ths.patch-disabled deleted file mode 100644 index 6f550c3f2f..0000000000 --- a/patch/kernel/sunxi-dev/0034-dts-a64-ths.patch-disabled +++ /dev/null @@ -1,62 +0,0 @@ -From ff4436bd3de240a1d0796d4c6f8bd676ff0925e1 Mon Sep 17 00:00:00 2001 -From: Vasily Khoruzhick -Date: Mon, 23 Apr 2018 23:24:41 -0700 -Subject: [PATCH 034/146] dts: a64 ths - ---- - arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 32 +++++++++++++++++++ - 1 file changed, 32 insertions(+) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -index 0b44018361cb..0eb482eb58b7 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -@@ -171,6 +171,27 @@ - }; - }; - -+ thermal-zones { -+ cpu_thermal: cpu0-thermal { -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 0>; -+ }; -+ gpu0_thermal: gpu0-thermal { -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 1>; -+ }; -+ gpu1_thermal: gpu1-thermal { -+ /* milliseconds */ -+ polling-delay-passive = <250>; -+ polling-delay = <1000>; -+ thermal-sensors = <&ths 2>; -+ }; -+ }; -+ - timer { - compatible = "arm,armv8-timer"; - interrupts = ; -+ interrupts = ; -+ clocks = <&ccu CLK_BUS_THS>, <&ccu CLK_THS>; -+ clock-names = "bus", "mod"; -+ resets = <&ccu RST_BUS_THS>; -+ #io-channel-cells = <0>; -+ #thermal-sensor-cells = <1>; -+ }; -+ - uart0: serial@1c28000 { - compatible = "snps,dw-apb-uart"; - reg = <0x01c28000 0x400>; --- -2.17.1 - From 7a2b35f2d56ee2c55b3aa1d216f5d02e26dcb6d6 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Tue, 11 Feb 2020 17:37:31 +0100 Subject: [PATCH 38/54] Cleanup and a small bugfix --- .../families/include/sunxi64_common.inc | 3 +- .../sources/families/include/sunxi_common.inc | 2 +- ...-sun8i-support-RGMII-modes-with-PHY-.patch | 35 ------------------- 3 files changed, 2 insertions(+), 38 deletions(-) delete mode 100644 patch/kernel/sunxi-legacy/0003-net-stmmac-dwmac-sun8i-support-RGMII-modes-with-PHY-.patch diff --git a/config/sources/families/include/sunxi64_common.inc b/config/sources/families/include/sunxi64_common.inc index 631c55acef..500f537814 100644 --- a/config/sources/families/include/sunxi64_common.inc +++ b/config/sources/families/include/sunxi64_common.inc @@ -10,8 +10,7 @@ case $BRANCH in legacy) KERNELBRANCH='branch:linux-4.19.y' - KERNELPATCHDIR='sunxi-next' - + KERNELPATCHDIR='sunxi-'$BRANCH ;; current) diff --git a/config/sources/families/include/sunxi_common.inc b/config/sources/families/include/sunxi_common.inc index 6d3b686d91..a4ba7b7c5b 100644 --- a/config/sources/families/include/sunxi_common.inc +++ b/config/sources/families/include/sunxi_common.inc @@ -13,7 +13,7 @@ case $BRANCH in legacy) KERNELBRANCH='branch:linux-4.19.y' - + KERNELPATCHDIR='sunxi-'$BRANCH ;; current) diff --git a/patch/kernel/sunxi-legacy/0003-net-stmmac-dwmac-sun8i-support-RGMII-modes-with-PHY-.patch b/patch/kernel/sunxi-legacy/0003-net-stmmac-dwmac-sun8i-support-RGMII-modes-with-PHY-.patch deleted file mode 100644 index c417b72447..0000000000 --- a/patch/kernel/sunxi-legacy/0003-net-stmmac-dwmac-sun8i-support-RGMII-modes-with-PHY-.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 98800eeb2244387e821f4af8d21ccf2deaf18da0 Mon Sep 17 00:00:00 2001 -From: Icenowy Zheng -Date: Mon, 21 Aug 2017 23:02:32 +0800 -Subject: [PATCH 003/146] net: stmmac: dwmac-sun8i: support RGMII modes with - PHY internal delay - -Some boards uses a PHY with internal delay with an Allwinner SoC. - -Support these PHY modes in the driver. - -As the driver has no configuration registers for these modes, just treat -them as ordinary RGMII. - -Signed-off-by: Icenowy Zheng ---- - drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c -index f9a61f90cfbc..3c18f4a9dd6c 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c -@@ -933,6 +933,9 @@ static int sun8i_dwmac_set_syscon(struct stmmac_priv *priv) - /* default */ - break; - case PHY_INTERFACE_MODE_RGMII: -+ case PHY_INTERFACE_MODE_RGMII_ID: -+ case PHY_INTERFACE_MODE_RGMII_RXID: -+ case PHY_INTERFACE_MODE_RGMII_TXID: - reg |= SYSCON_EPIT | SYSCON_ETCS_INT_GMII; - break; - case PHY_INTERFACE_MODE_RMII: --- -2.17.1 - From d6e13612d1aa9ab4838b2a06c637955cf20f7d21 Mon Sep 17 00:00:00 2001 From: zhangn1985 <832666+zhangn1985@users.noreply.github.com> Date: Fri, 14 Feb 2020 03:31:20 +0800 Subject: [PATCH 39/54] allow - in hostname (#1799) Signed-off-by: Zhang Ning <832666+zhangn1985@users.noreply.github.com> --- lib/configuration.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/configuration.sh b/lib/configuration.sh index a2bae872c5..18eac4aade 100644 --- a/lib/configuration.sh +++ b/lib/configuration.sh @@ -19,7 +19,7 @@ REVISION=$(cat ${SRC}/VERSION)"$SUBREVISION" # all boards have same revision TZDATA=$(cat /etc/timezone) # Timezone for target is taken from host or defined here. USEALLCORES=yes # Use all CPU cores for compiling EXIT_PATCHING_ERROR="" # exit patching if failed -[[ -z $HOST ]] && HOST="$(echo "$BOARD" | cut -f1 -d-)" # set hostname to the board +[[ -z $HOST ]] && HOST="$BOARD" # set hostname to the board ROOTFSCACHE_VERSION=18 CHROOT_CACHE_VERSION=7 BUILD_REPOSITORY_URL=$(git remote get-url $(git remote 2>/dev/null) 2>/dev/null) From d43f389035a789d60af7d4b2a75e556be2da3c7e Mon Sep 17 00:00:00 2001 From: Elias Kotlyar Date: Thu, 13 Feb 2020 20:32:06 +0100 Subject: [PATCH 40/54] Fixxes #1788 - Code taken from https://linux-sunxi.org/SPIdev (#1789) * Fixxes #1788 - Code taken from https://linux-sunxi.org/SPIdev * Additional Patch for 5.5 --- .../general_spi_bug_low_on_sck.patch | 27 +++++++++++++++++++ .../general_spi_bug_low_on_sck.patch | 27 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 patch/kernel/sunxi-current/general_spi_bug_low_on_sck.patch create mode 100644 patch/kernel/sunxi-dev/general_spi_bug_low_on_sck.patch diff --git a/patch/kernel/sunxi-current/general_spi_bug_low_on_sck.patch b/patch/kernel/sunxi-current/general_spi_bug_low_on_sck.patch new file mode 100644 index 0000000000..7938137213 --- /dev/null +++ b/patch/kernel/sunxi-current/general_spi_bug_low_on_sck.patch @@ -0,0 +1,27 @@ +Index: drivers/spi/spi-sun4i.c +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +--- a/drivers/spi/spi-sun4i.c (date 1581011681000) ++++ b/drivers/spi/spi-sun4i.c (date 1581070363000) +@@ -389,6 +389,7 @@ + struct spi_master *master = dev_get_drvdata(dev); + struct sun4i_spi *sspi = spi_master_get_devdata(master); + int ret; ++ u32 reg; + + ret = clk_prepare_enable(sspi->hclk); + if (ret) { +@@ -401,9 +402,10 @@ + dev_err(dev, "Couldn't enable module clock\n"); + goto err; + } ++ reg = sun4i_spi_read(sspi, SUN4I_CTL_REG); + + sun4i_spi_write(sspi, SUN4I_CTL_REG, +- SUN4I_CTL_ENABLE | SUN4I_CTL_MASTER | SUN4I_CTL_TP); ++ reg | SUN4I_CTL_ENABLE | SUN4I_CTL_MASTER | SUN4I_CTL_TP); + + return 0; + diff --git a/patch/kernel/sunxi-dev/general_spi_bug_low_on_sck.patch b/patch/kernel/sunxi-dev/general_spi_bug_low_on_sck.patch new file mode 100644 index 0000000000..7938137213 --- /dev/null +++ b/patch/kernel/sunxi-dev/general_spi_bug_low_on_sck.patch @@ -0,0 +1,27 @@ +Index: drivers/spi/spi-sun4i.c +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +--- a/drivers/spi/spi-sun4i.c (date 1581011681000) ++++ b/drivers/spi/spi-sun4i.c (date 1581070363000) +@@ -389,6 +389,7 @@ + struct spi_master *master = dev_get_drvdata(dev); + struct sun4i_spi *sspi = spi_master_get_devdata(master); + int ret; ++ u32 reg; + + ret = clk_prepare_enable(sspi->hclk); + if (ret) { +@@ -401,9 +402,10 @@ + dev_err(dev, "Couldn't enable module clock\n"); + goto err; + } ++ reg = sun4i_spi_read(sspi, SUN4I_CTL_REG); + + sun4i_spi_write(sspi, SUN4I_CTL_REG, +- SUN4I_CTL_ENABLE | SUN4I_CTL_MASTER | SUN4I_CTL_TP); ++ reg | SUN4I_CTL_ENABLE | SUN4I_CTL_MASTER | SUN4I_CTL_TP); + + return 0; + From b9a589124d46e8e1086725c9a7c07b52542f6b7e Mon Sep 17 00:00:00 2001 From: Dirk Weigenand Date: Thu, 13 Feb 2020 20:35:34 +0100 Subject: [PATCH 41/54] Align location of source override with test for its existance when sourcing it. (#1782) --- lib/configuration.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/configuration.sh b/lib/configuration.sh index 18eac4aade..3fb0c3b0c9 100644 --- a/lib/configuration.sh +++ b/lib/configuration.sh @@ -99,7 +99,7 @@ source "${SRC}/config/sources/families/${LINUXFAMILY}.conf" if [[ -f $USERPATCHES_PATH/sources/families/$LINUXFAMILY.conf ]]; then display_alert "Adding user provided $LINUXFAMILY overrides" - source "$USERPATCHES_PATH/sources/${LINUXFAMILY}.conf" + source "$USERPATCHES_PATH/sources/families/${LINUXFAMILY}.conf" fi # load architecture defaults From 76dc8aba8acc0a5bddbdb6df7fb6766f3e6a0003 Mon Sep 17 00:00:00 2001 From: David Douard Date: Fri, 14 Feb 2020 18:47:55 +0100 Subject: [PATCH 42/54] Allow pcm5102 module to be built on sunxi kernels and build the module by default (#1802) * [sunxi] allow pcm5102a codec module to be built for sunxi-current and sunx-dev kernels. Fixes #1798 * [sunxi] build pcm5102a and pcm51xx_(i2s|spi) modules by default on sunxi-current and sunxi-dev kernels. --- config/kernel/linux-sunxi-current.config | 6 ++++-- config/kernel/linux-sunxi-dev.config | 6 ++++-- .../sound-soc-codecs-enable-pcm5102a.patch | 11 +++++++++++ .../sunxi-dev/sound-soc-codecs-enable-pcm5102a.patch | 11 +++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 patch/kernel/sunxi-current/sound-soc-codecs-enable-pcm5102a.patch create mode 100644 patch/kernel/sunxi-dev/sound-soc-codecs-enable-pcm5102a.patch diff --git a/config/kernel/linux-sunxi-current.config b/config/kernel/linux-sunxi-current.config index 027c349fda..263ab759e3 100644 --- a/config/kernel/linux-sunxi-current.config +++ b/config/kernel/linux-sunxi-current.config @@ -4737,8 +4737,10 @@ CONFIG_SND_SOC_PCM3060_I2C=m CONFIG_SND_SOC_PCM3060_SPI=m # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set -# CONFIG_SND_SOC_PCM512x_I2C is not set -# CONFIG_SND_SOC_PCM512x_SPI is not set +CONFIG_SND_SOC_PCM5102A=m +CONFIG_SND_SOC_PCM512x=m +CONFIG_SND_SOC_PCM512x_I2C=m +CONFIG_SND_SOC_PCM512x_SPI=m CONFIG_SND_SOC_RK3328=m # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set diff --git a/config/kernel/linux-sunxi-dev.config b/config/kernel/linux-sunxi-dev.config index 7f59d7e4a4..66ff9f6f3a 100644 --- a/config/kernel/linux-sunxi-dev.config +++ b/config/kernel/linux-sunxi-dev.config @@ -4716,8 +4716,10 @@ CONFIG_SND_SOC_PCM3060_I2C=m CONFIG_SND_SOC_PCM3060_SPI=m # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set -# CONFIG_SND_SOC_PCM512x_I2C is not set -# CONFIG_SND_SOC_PCM512x_SPI is not set +CONFIG_SND_SOC_PCM5102A=m +CONFIG_SND_SOC_PCM512x=m +CONFIG_SND_SOC_PCM512x_I2C=m +CONFIG_SND_SOC_PCM512x_SPI=m CONFIG_SND_SOC_RK3328=m # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set diff --git a/patch/kernel/sunxi-current/sound-soc-codecs-enable-pcm5102a.patch b/patch/kernel/sunxi-current/sound-soc-codecs-enable-pcm5102a.patch new file mode 100644 index 0000000000..7fab56de6d --- /dev/null +++ b/patch/kernel/sunxi-current/sound-soc-codecs-enable-pcm5102a.patch @@ -0,0 +1,11 @@ +--- a/sound/soc/codecs/Kconfig 2020-02-13 23:44:47.394937509 +0100 ++++ b/sound/soc/codecs/Kconfig 2020-02-13 23:47:11.571103180 +0100 +@@ -880,7 +880,7 @@ + select REGMAP_SPI + + config SND_SOC_PCM5102A +- tristate ++ tristate "Texas Instruments PCM5102A CODEC" + + config SND_SOC_PCM512x + tristate diff --git a/patch/kernel/sunxi-dev/sound-soc-codecs-enable-pcm5102a.patch b/patch/kernel/sunxi-dev/sound-soc-codecs-enable-pcm5102a.patch new file mode 100644 index 0000000000..27f8329874 --- /dev/null +++ b/patch/kernel/sunxi-dev/sound-soc-codecs-enable-pcm5102a.patch @@ -0,0 +1,11 @@ +--- a/sound/soc/codecs/Kconfig 2020-02-13 23:44:47.394937509 +0100 ++++ b/sound/soc/codecs/Kconfig 2020-02-13 23:47:11.571103180 +0100 +@@ -917,7 +917,7 @@ + select REGMAP_SPI + + config SND_SOC_PCM5102A +- tristate ++ tristate "Texas Instruments PCM5102A CODEC" + + config SND_SOC_PCM512x + tristate From 47e151d831a9d0b208e4fe7cbeafc505fda159b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Pe=C4=8Dovnik?= Date: Fri, 14 Feb 2020 18:50:00 +0100 Subject: [PATCH 43/54] Fix Pinebook and Teres (#1800) * Port ANX78xx Pinebook / Teres LCD panel driver from 5.6-rc1 * Move Teres U-boot to 2020.01 ... it boots with enabled screen now. * U-boot 2020 needs some extra Pyton utils when packing sunxi bootloader. Adding to native and Docker build dependencies. * Add Pinebook lid wakeup * python3-dev is also needed dependency --- config/sources/families/sun50iw1.conf | 5 + config/templates/Dockerfile | 4 +- lib/general.sh | 6 +- ...78xx_driver_to_analogix_subdirectory.patch | 2301 +++++++++++++++++ ...ons_of_ANX78xx_to_dedicated_headers.patch} | 80 +- ...ct_some_Analogix_I2C_DP_common_code.patch} | 121 +- .../0004-prepare-analogix-support.patch | 86 + ...=> 0005-add_nalogix_anx6345_support.patch} | 614 ++--- ...345-DP-eDP-bridge-for-Olimex-Teres-I.patch | 208 ++ ...45_fix_acquisition_of_the_regulators.patch | 40 + ...0009-enable_anx6345_bridge_pinebook.patch} | 65 +- ...ANA78xx-driver-to-analogix-subdirect.patch | 44 - ...d-ANX6345-DP-eDP-transmitter-binding.patch | 64 - ...e-ANX6345-bridge-on-TERES-I.patch.disabled | 87 - .../0137-Pinebook-HDMI-audio.patch | 39 - ...llwinner-a64-pinebook-Fix-lid-wakeup.patch | 29 + .../sunxi-current/xxx-teres-fixed.patch | 187 -- 17 files changed, 3045 insertions(+), 935 deletions(-) create mode 100644 patch/kernel/sunxi-current/0001-move_ANA78xx_driver_to_analogix_subdirectory.patch rename patch/kernel/sunxi-current/{0127-drm-bridge-split-some-definitions-of-ANX78xx-to-dedi.patch => 0002-split_some_definitions_of_ANX78xx_to_dedicated_headers.patch} (93%) rename patch/kernel/sunxi-current/{0128-drm-bridge-extract-some-Analogix-I2C-DP-common-code.patch => 0003-extract_some_Analogix_I2C_DP_common_code.patch} (74%) create mode 100644 patch/kernel/sunxi-current/0004-prepare-analogix-support.patch rename patch/kernel/sunxi-current/{0130-drm-bridge-Add-Analogix-anx6345-support.patch => 0005-add_nalogix_anx6345_support.patch} (62%) create mode 100644 patch/kernel/sunxi-current/0006-add-anx6345-DP-eDP-bridge-for-Olimex-Teres-I.patch create mode 100644 patch/kernel/sunxi-current/0007-anx6345_fix_acquisition_of_the_regulators.patch rename patch/kernel/sunxi-current/{0132-arm64-allwinner-a64-enable-ANX6345-bridge-on-Pineboo.patch => 0009-enable_anx6345_bridge_pinebook.patch} (60%) delete mode 100644 patch/kernel/sunxi-current/0129-dt-bindings-Add-ANX6345-DP-eDP-transmitter-binding.patch delete mode 100644 patch/kernel/sunxi-current/0133-arm64-allwinner-a64-enable-ANX6345-bridge-on-TERES-I.patch.disabled delete mode 100644 patch/kernel/sunxi-current/0137-Pinebook-HDMI-audio.patch create mode 100644 patch/kernel/sunxi-current/arm64-dts-allwinner-a64-pinebook-Fix-lid-wakeup.patch delete mode 100644 patch/kernel/sunxi-current/xxx-teres-fixed.patch diff --git a/config/sources/families/sun50iw1.conf b/config/sources/families/sun50iw1.conf index b9e836ca81..9fde5f59c1 100644 --- a/config/sources/families/sun50iw1.conf +++ b/config/sources/families/sun50iw1.conf @@ -16,3 +16,8 @@ family_tweaks_s() echo "kernel.sysrq = 0" >> $SDCARD/etc/sysctl.d/sysrq.conf fi } + +if [[ $BOARD == teres-a64 ]]; then + BOOTBRANCH='tag:v2020.01' + BOOTPATCHDIR='u-boot-sunxi-dev' +fi diff --git a/config/templates/Dockerfile b/config/templates/Dockerfile index baec6bab08..574d337fcc 100644 --- a/config/templates/Dockerfile +++ b/config/templates/Dockerfile @@ -13,10 +13,10 @@ RUN apt update && DEBIAN_FRONTEND=noninteractive apt -y upgrade && \ qemu-user-static u-boot-tools uuid-dev zlib1g-dev unzip libusb-1.0-0-dev parted pkg-config libncurses5-dev whiptail \ debian-keyring debian-archive-keyring f2fs-tools libfile-fcntllock-perl rsync libssl-dev nfs-kernel-server btrfs-progs \ ncurses-term p7zip-full kmod dosfstools libc6-dev-armhf-cross fakeroot xxd \ - curl patchutils python liblz4-tool libpython2.7-dev linux-base swig libpython-dev \ + curl patchutils python liblz4-tool libpython2.7-dev linux-base swig libpython-dev python3-dev \ systemd-container udev g++-5-arm-linux-gnueabihf lib32stdc++6 cpio tzdata psmisc acl \ libc6-i386 lib32ncurses5 lib32tinfo5 locales ncurses-base zlib1g:i386 pixz bison libbison-dev flex libfl-dev \ - pigz aptly aria2 cryptsetup cryptsetup-bin --no-install-recommends + pigz aptly aria2 cryptsetup cryptsetup-bin python3-distutils --no-install-recommends RUN locale-gen en_US.UTF-8 ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8' TERM=screen WORKDIR /root/armbian diff --git a/lib/general.sh b/lib/general.sh index 20a4d6c23a..6848f432dd 100644 --- a/lib/general.sh +++ b/lib/general.sh @@ -769,15 +769,15 @@ prepare_host() gawk gcc-arm-linux-gnueabihf qemu-user-static u-boot-tools uuid-dev zlib1g-dev unzip libusb-1.0-0-dev fakeroot \ parted pkg-config libncurses5-dev whiptail debian-keyring debian-archive-keyring f2fs-tools libfile-fcntllock-perl rsync libssl-dev \ nfs-kernel-server btrfs-progs ncurses-term p7zip-full kmod dosfstools libc6-dev-armhf-cross \ - curl patchutils liblz4-tool libpython2.7-dev linux-base swig aptly acl \ + curl patchutils liblz4-tool libpython2.7-dev linux-base swig aptly acl python3-dev \ locales ncurses-base pixz dialog systemd-container udev lib32stdc++6 libc6-i386 lib32ncurses5 lib32tinfo5 \ - bison libbison-dev flex libfl-dev cryptsetup gpgv1 gnupg1 cpio aria2 pigz dirmngr" + bison libbison-dev flex libfl-dev cryptsetup gpgv1 gnupg1 cpio aria2 pigz dirmngr python3-distutils" local codename=$(lsb_release -sc) # Getting ready for Ubuntu 20.04 if [[ $codename == focal ]]; then - hostdeps+=" python2 python3 libpython3-dev" + hostdeps+=" python2 python3" ln -fs /usr/bin/python2.7 /usr/bin/python2 ln -fs /usr/bin/python2.7 /usr/bin/python else diff --git a/patch/kernel/sunxi-current/0001-move_ANA78xx_driver_to_analogix_subdirectory.patch b/patch/kernel/sunxi-current/0001-move_ANA78xx_driver_to_analogix_subdirectory.patch new file mode 100644 index 0000000000..717a8f93ca --- /dev/null +++ b/patch/kernel/sunxi-current/0001-move_ANA78xx_driver_to_analogix_subdirectory.patch @@ -0,0 +1,2301 @@ +From 5d97408e0d70a7c7c5942ba95260bab7c9e21eb4 Mon Sep 17 00:00:00 2001 +From: Icenowy Zheng +Date: Tue, 29 Oct 2019 13:16:57 +0100 +Subject: drm/bridge: move ANA78xx driver to analogix subdirectory + +As ANA78xx chips are designed and produced by Analogix Semiconductor, +Inc, move their driver codes into analogix subdirectory. + +Signed-off-by: Icenowy Zheng +Signed-off-by: Vasily Khoruzhick +Reviewed-by: Laurent Pinchart +Signed-off-by: Torsten Duwe +Reviewed-by: Andrzej Hajda +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20191107135202.2089C68BE1@verein.lst.de +--- + drivers/gpu/drm/bridge/analogix/Kconfig | 10 + + drivers/gpu/drm/bridge/analogix/Makefile | 1 + + drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 1529 ++++++++++++++++++++ + drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h | 703 +++++++++ + 4 files changed, 2243 insertions(+) + create mode 100644 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c + create mode 100644 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h + +(limited to 'drivers/gpu/drm/bridge/analogix') + +diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig +index e930ff9b5cd4..29ba1b21019e 100644 +--- a/drivers/gpu/drm/bridge/analogix/Kconfig ++++ b/drivers/gpu/drm/bridge/analogix/Kconfig +@@ -1,4 +1,14 @@ + # SPDX-License-Identifier: GPL-2.0-only ++config DRM_ANALOGIX_ANX78XX ++ tristate "Analogix ANX78XX bridge" ++ select DRM_KMS_HELPER ++ select REGMAP_I2C ++ help ++ ANX78XX is an ultra-low power Full-HD SlimPort transmitter ++ designed for portable devices. The ANX78XX transforms ++ the HDMI output of an application processor to MyDP ++ or DisplayPort. ++ + config DRM_ANALOGIX_DP + tristate + depends on DRM +diff --git a/drivers/gpu/drm/bridge/analogix/Makefile b/drivers/gpu/drm/bridge/analogix/Makefile +index fdbf3fd2f087..6fcbfd3ee560 100644 +--- a/drivers/gpu/drm/bridge/analogix/Makefile ++++ b/drivers/gpu/drm/bridge/analogix/Makefile +@@ -1,3 +1,4 @@ + # SPDX-License-Identifier: GPL-2.0-only + analogix_dp-objs := analogix_dp_core.o analogix_dp_reg.o ++obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o + obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp.o +diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c +new file mode 100644 +index 000000000000..274989f96a91 +--- /dev/null ++++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c +@@ -0,0 +1,1529 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Copyright(c) 2016, Analogix Semiconductor. ++ * ++ * Based on anx7808 driver obtained from chromeos with copyright: ++ * Copyright(c) 2013, Google Inc. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "analogix-anx78xx.h" ++ ++#define I2C_NUM_ADDRESSES 5 ++#define I2C_IDX_TX_P0 0 ++#define I2C_IDX_TX_P1 1 ++#define I2C_IDX_TX_P2 2 ++#define I2C_IDX_RX_P0 3 ++#define I2C_IDX_RX_P1 4 ++ ++#define XTAL_CLK 270 /* 27M */ ++#define AUX_CH_BUFFER_SIZE 16 ++#define AUX_WAIT_TIMEOUT_MS 15 ++ ++static const u8 anx7808_i2c_addresses[] = { ++ [I2C_IDX_TX_P0] = 0x78, ++ [I2C_IDX_TX_P1] = 0x7a, ++ [I2C_IDX_TX_P2] = 0x72, ++ [I2C_IDX_RX_P0] = 0x7e, ++ [I2C_IDX_RX_P1] = 0x80, ++}; ++ ++static const u8 anx781x_i2c_addresses[] = { ++ [I2C_IDX_TX_P0] = 0x70, ++ [I2C_IDX_TX_P1] = 0x7a, ++ [I2C_IDX_TX_P2] = 0x72, ++ [I2C_IDX_RX_P0] = 0x7e, ++ [I2C_IDX_RX_P1] = 0x80, ++}; ++ ++struct anx78xx_platform_data { ++ struct regulator *dvdd10; ++ struct gpio_desc *gpiod_hpd; ++ struct gpio_desc *gpiod_pd; ++ struct gpio_desc *gpiod_reset; ++ ++ int hpd_irq; ++ int intp_irq; ++}; ++ ++struct anx78xx { ++ struct drm_dp_aux aux; ++ struct drm_bridge bridge; ++ struct i2c_client *client; ++ struct edid *edid; ++ struct drm_connector connector; ++ struct anx78xx_platform_data pdata; ++ struct mutex lock; ++ ++ /* ++ * I2C Slave addresses of ANX7814 are mapped as TX_P0, TX_P1, TX_P2, ++ * RX_P0 and RX_P1. ++ */ ++ struct i2c_client *i2c_dummy[I2C_NUM_ADDRESSES]; ++ struct regmap *map[I2C_NUM_ADDRESSES]; ++ ++ u16 chipid; ++ u8 dpcd[DP_RECEIVER_CAP_SIZE]; ++ ++ bool powered; ++}; ++ ++static inline struct anx78xx *connector_to_anx78xx(struct drm_connector *c) ++{ ++ return container_of(c, struct anx78xx, connector); ++} ++ ++static inline struct anx78xx *bridge_to_anx78xx(struct drm_bridge *bridge) ++{ ++ return container_of(bridge, struct anx78xx, bridge); ++} ++ ++static int anx78xx_set_bits(struct regmap *map, u8 reg, u8 mask) ++{ ++ return regmap_update_bits(map, reg, mask, mask); ++} ++ ++static int anx78xx_clear_bits(struct regmap *map, u8 reg, u8 mask) ++{ ++ return regmap_update_bits(map, reg, mask, 0); ++} ++ ++static bool anx78xx_aux_op_finished(struct anx78xx *anx78xx) ++{ ++ unsigned int value; ++ int err; ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL2_REG, ++ &value); ++ if (err < 0) ++ return false; ++ ++ return (value & SP_AUX_EN) == 0; ++} ++ ++static int anx78xx_aux_wait(struct anx78xx *anx78xx) ++{ ++ unsigned long timeout; ++ unsigned int status; ++ int err; ++ ++ timeout = jiffies + msecs_to_jiffies(AUX_WAIT_TIMEOUT_MS) + 1; ++ ++ while (!anx78xx_aux_op_finished(anx78xx)) { ++ if (time_after(jiffies, timeout)) { ++ if (!anx78xx_aux_op_finished(anx78xx)) { ++ DRM_ERROR("Timed out waiting AUX to finish\n"); ++ return -ETIMEDOUT; ++ } ++ ++ break; ++ } ++ ++ usleep_range(1000, 2000); ++ } ++ ++ /* Read the AUX channel access status */ ++ err = regmap_read(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_CH_STATUS_REG, ++ &status); ++ if (err < 0) { ++ DRM_ERROR("Failed to read from AUX channel: %d\n", err); ++ return err; ++ } ++ ++ if (status & SP_AUX_STATUS) { ++ DRM_ERROR("Failed to wait for AUX channel (status: %02x)\n", ++ status); ++ return -ETIMEDOUT; ++ } ++ ++ return 0; ++} ++ ++static int anx78xx_aux_address(struct anx78xx *anx78xx, unsigned int addr) ++{ ++ int err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_ADDR_7_0_REG, ++ addr & 0xff); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_ADDR_15_8_REG, ++ (addr & 0xff00) >> 8); ++ if (err) ++ return err; ++ ++ /* ++ * DP AUX CH Address Register #2, only update bits[3:0] ++ * [7:4] RESERVED ++ * [3:0] AUX_ADDR[19:16], Register control AUX CH address. ++ */ ++ err = regmap_update_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_AUX_ADDR_19_16_REG, ++ SP_AUX_ADDR_19_16_MASK, ++ (addr & 0xf0000) >> 16); ++ ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static ssize_t anx78xx_aux_transfer(struct drm_dp_aux *aux, ++ struct drm_dp_aux_msg *msg) ++{ ++ struct anx78xx *anx78xx = container_of(aux, struct anx78xx, aux); ++ u8 ctrl1 = msg->request; ++ u8 ctrl2 = SP_AUX_EN; ++ u8 *buffer = msg->buffer; ++ int err; ++ ++ /* The DP AUX transmit and receive buffer has 16 bytes. */ ++ if (WARN_ON(msg->size > AUX_CH_BUFFER_SIZE)) ++ return -E2BIG; ++ ++ /* Zero-sized messages specify address-only transactions. */ ++ if (msg->size < 1) ++ ctrl2 |= SP_ADDR_ONLY; ++ else /* For non-zero-sized set the length field. */ ++ ctrl1 |= (msg->size - 1) << SP_AUX_LENGTH_SHIFT; ++ ++ if ((msg->request & DP_AUX_I2C_READ) == 0) { ++ /* When WRITE | MOT write values to data buffer */ ++ err = regmap_bulk_write(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_BUF_DATA0_REG, buffer, ++ msg->size); ++ if (err) ++ return err; ++ } ++ ++ /* Write address and request */ ++ err = anx78xx_aux_address(anx78xx, msg->address); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL1_REG, ++ ctrl1); ++ if (err) ++ return err; ++ ++ /* Start transaction */ ++ err = regmap_update_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_AUX_CH_CTRL2_REG, SP_ADDR_ONLY | ++ SP_AUX_EN, ctrl2); ++ if (err) ++ return err; ++ ++ err = anx78xx_aux_wait(anx78xx); ++ if (err) ++ return err; ++ ++ msg->reply = DP_AUX_I2C_REPLY_ACK; ++ ++ if ((msg->size > 0) && (msg->request & DP_AUX_I2C_READ)) { ++ /* Read values from data buffer */ ++ err = regmap_bulk_read(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_BUF_DATA0_REG, buffer, ++ msg->size); ++ if (err) ++ return err; ++ } ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_AUX_CH_CTRL2_REG, SP_ADDR_ONLY); ++ if (err) ++ return err; ++ ++ return msg->size; ++} ++ ++static int anx78xx_set_hpd(struct anx78xx *anx78xx) ++{ ++ int err; ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0], ++ SP_TMDS_CTRL_BASE + 7, SP_PD_RT); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL3_REG, ++ SP_HPD_OUT); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static int anx78xx_clear_hpd(struct anx78xx *anx78xx) ++{ ++ int err; ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL3_REG, ++ SP_HPD_OUT); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], ++ SP_TMDS_CTRL_BASE + 7, SP_PD_RT); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static const struct reg_sequence tmds_phy_initialization[] = { ++ { SP_TMDS_CTRL_BASE + 1, 0x90 }, ++ { SP_TMDS_CTRL_BASE + 2, 0xa9 }, ++ { SP_TMDS_CTRL_BASE + 6, 0x92 }, ++ { SP_TMDS_CTRL_BASE + 7, 0x80 }, ++ { SP_TMDS_CTRL_BASE + 20, 0xf2 }, ++ { SP_TMDS_CTRL_BASE + 22, 0xc4 }, ++ { SP_TMDS_CTRL_BASE + 23, 0x18 }, ++}; ++ ++static int anx78xx_rx_initialization(struct anx78xx *anx78xx) ++{ ++ int err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_HDMI_MUTE_CTRL_REG, ++ SP_AUD_MUTE | SP_VID_MUTE); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], SP_CHIP_CTRL_REG, ++ SP_MAN_HDMI5V_DET | SP_PLLLOCK_CKDT_EN | ++ SP_DIGITAL_CKDT_EN); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], ++ SP_SOFTWARE_RESET1_REG, SP_HDCP_MAN_RST | ++ SP_SW_MAN_RST | SP_TMDS_RST | SP_VIDEO_RST); ++ if (err) ++ return err; ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0], ++ SP_SOFTWARE_RESET1_REG, SP_HDCP_MAN_RST | ++ SP_SW_MAN_RST | SP_TMDS_RST | SP_VIDEO_RST); ++ if (err) ++ return err; ++ ++ /* Sync detect change, GP set mute */ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], ++ SP_AUD_EXCEPTION_ENABLE_BASE + 1, BIT(5) | ++ BIT(6)); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], ++ SP_AUD_EXCEPTION_ENABLE_BASE + 3, ++ SP_AEC_EN21); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], SP_AUDVID_CTRL_REG, ++ SP_AVC_EN | SP_AAC_OE | SP_AAC_EN); ++ if (err) ++ return err; ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0], ++ SP_SYSTEM_POWER_DOWN1_REG, SP_PWDN_CTRL); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], ++ SP_VID_DATA_RANGE_CTRL_REG, SP_R2Y_INPUT_LIMIT); ++ if (err) ++ return err; ++ ++ /* Enable DDC stretch */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_EXTRA_I2C_DEV_ADDR_REG, SP_I2C_EXTRA_ADDR); ++ if (err) ++ return err; ++ ++ /* TMDS phy initialization */ ++ err = regmap_multi_reg_write(anx78xx->map[I2C_IDX_RX_P0], ++ tmds_phy_initialization, ++ ARRAY_SIZE(tmds_phy_initialization)); ++ if (err) ++ return err; ++ ++ err = anx78xx_clear_hpd(anx78xx); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static const u8 dp_tx_output_precise_tune_bits[20] = { ++ 0x01, 0x03, 0x07, 0x7f, 0x71, 0x6b, 0x7f, ++ 0x73, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, ++ 0x0c, 0x42, 0x1e, 0x3e, 0x72, 0x7e, ++}; ++ ++static int anx78xx_link_phy_initialization(struct anx78xx *anx78xx) ++{ ++ int err; ++ ++ /* ++ * REVISIT : It is writing to a RESERVED bits in Analog Control 0 ++ * register. ++ */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_ANALOG_CTRL0_REG, ++ 0x02); ++ if (err) ++ return err; ++ ++ /* ++ * Write DP TX output emphasis precise tune bits. ++ */ ++ err = regmap_bulk_write(anx78xx->map[I2C_IDX_TX_P1], ++ SP_DP_TX_LT_CTRL0_REG, ++ dp_tx_output_precise_tune_bits, ++ ARRAY_SIZE(dp_tx_output_precise_tune_bits)); ++ ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static int anx78xx_xtal_clk_sel(struct anx78xx *anx78xx) ++{ ++ unsigned int value; ++ int err; ++ ++ err = regmap_update_bits(anx78xx->map[I2C_IDX_TX_P2], ++ SP_ANALOG_DEBUG2_REG, ++ SP_XTAL_FRQ | SP_FORCE_SW_OFF_BYPASS, ++ SP_XTAL_FRQ_27M); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL3_REG, ++ XTAL_CLK & SP_WAIT_COUNTER_7_0_MASK); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL4_REG, ++ ((XTAL_CLK & 0xff00) >> 2) | (XTAL_CLK / 10)); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], ++ SP_I2C_GEN_10US_TIMER0_REG, XTAL_CLK & 0xff); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], ++ SP_I2C_GEN_10US_TIMER1_REG, ++ (XTAL_CLK & 0xff00) >> 8); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_MISC_CTRL_REG, ++ XTAL_CLK / 10 - 1); ++ if (err) ++ return err; ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_RX_P0], ++ SP_HDMI_US_TIMER_CTRL_REG, ++ &value); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], ++ SP_HDMI_US_TIMER_CTRL_REG, ++ (value & SP_MS_TIMER_MARGIN_10_8_MASK) | ++ ((((XTAL_CLK / 10) >> 1) - 2) << 3)); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static const struct reg_sequence otp_key_protect[] = { ++ { SP_OTP_KEY_PROTECT1_REG, SP_OTP_PSW1 }, ++ { SP_OTP_KEY_PROTECT2_REG, SP_OTP_PSW2 }, ++ { SP_OTP_KEY_PROTECT3_REG, SP_OTP_PSW3 }, ++}; ++ ++static int anx78xx_tx_initialization(struct anx78xx *anx78xx) ++{ ++ int err; ++ ++ /* Set terminal resistor to 50 ohm */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL2_REG, ++ 0x30); ++ if (err) ++ return err; ++ ++ /* Enable aux double diff output */ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_AUX_CH_CTRL2_REG, 0x08); ++ if (err) ++ return err; ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_HDCP_CTRL_REG, SP_AUTO_EN | ++ SP_AUTO_START); ++ if (err) ++ return err; ++ ++ err = regmap_multi_reg_write(anx78xx->map[I2C_IDX_TX_P0], ++ otp_key_protect, ++ ARRAY_SIZE(otp_key_protect)); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_HDCP_KEY_COMMAND_REG, SP_DISABLE_SYNC_HDCP); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL8_REG, ++ SP_VID_VRES_TH); ++ if (err) ++ return err; ++ ++ /* ++ * DP HDCP auto authentication wait timer (when downstream starts to ++ * auth, DP side will wait for this period then do auth automatically) ++ */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_HDCP_AUTO_TIMER_REG, ++ 0x00); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_HDCP_CTRL_REG, SP_LINK_POLLING); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_LINK_DEBUG_CTRL_REG, SP_M_VID_DEBUG); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], ++ SP_ANALOG_DEBUG2_REG, SP_POWERON_TIME_1P5MS); ++ if (err) ++ return err; ++ ++ err = anx78xx_xtal_clk_sel(anx78xx); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_DEFER_CTRL_REG, ++ SP_DEFER_CTRL_EN | 0x0c); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_POLLING_CTRL_REG, ++ SP_AUTO_POLLING_DISABLE); ++ if (err) ++ return err; ++ ++ /* ++ * Short the link integrity check timer to speed up bstatus ++ * polling for HDCP CTS item 1A-07 ++ */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], ++ SP_HDCP_LINK_CHECK_TIMER_REG, 0x1d); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_MISC_CTRL_REG, SP_EQ_TRAINING_LOOP); ++ if (err) ++ return err; ++ ++ /* Power down the main link by default */ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_ANALOG_POWER_DOWN_REG, SP_CH0_PD); ++ if (err) ++ return err; ++ ++ err = anx78xx_link_phy_initialization(anx78xx); ++ if (err) ++ return err; ++ ++ /* Gen m_clk with downspreading */ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_M_CALCULATION_CTRL_REG, SP_M_GEN_CLK_SEL); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static int anx78xx_enable_interrupts(struct anx78xx *anx78xx) ++{ ++ int err; ++ ++ /* ++ * BIT0: INT pin assertion polarity: 1 = assert high ++ * BIT1: INT pin output type: 0 = push/pull ++ */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_INT_CTRL_REG, 0x01); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], ++ SP_COMMON_INT_MASK4_REG, SP_HPD_LOST | SP_HPD_PLUG); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_MASK1_REG, ++ SP_TRAINING_FINISH); ++ if (err) ++ return err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_INT_MASK1_REG, ++ SP_CKDT_CHG | SP_SCDT_CHG); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static void anx78xx_poweron(struct anx78xx *anx78xx) ++{ ++ struct anx78xx_platform_data *pdata = &anx78xx->pdata; ++ int err; ++ ++ if (WARN_ON(anx78xx->powered)) ++ return; ++ ++ if (pdata->dvdd10) { ++ err = regulator_enable(pdata->dvdd10); ++ if (err) { ++ DRM_ERROR("Failed to enable DVDD10 regulator: %d\n", ++ err); ++ return; ++ } ++ ++ usleep_range(1000, 2000); ++ } ++ ++ gpiod_set_value_cansleep(pdata->gpiod_reset, 1); ++ usleep_range(1000, 2000); ++ ++ gpiod_set_value_cansleep(pdata->gpiod_pd, 0); ++ usleep_range(1000, 2000); ++ ++ gpiod_set_value_cansleep(pdata->gpiod_reset, 0); ++ ++ /* Power on registers module */ ++ anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG, ++ SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD | SP_LINK_PD); ++ anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG, ++ SP_REGISTER_PD | SP_TOTAL_PD); ++ ++ anx78xx->powered = true; ++} ++ ++static void anx78xx_poweroff(struct anx78xx *anx78xx) ++{ ++ struct anx78xx_platform_data *pdata = &anx78xx->pdata; ++ int err; ++ ++ if (WARN_ON(!anx78xx->powered)) ++ return; ++ ++ gpiod_set_value_cansleep(pdata->gpiod_reset, 1); ++ usleep_range(1000, 2000); ++ ++ gpiod_set_value_cansleep(pdata->gpiod_pd, 1); ++ usleep_range(1000, 2000); ++ ++ if (pdata->dvdd10) { ++ err = regulator_disable(pdata->dvdd10); ++ if (err) { ++ DRM_ERROR("Failed to disable DVDD10 regulator: %d\n", ++ err); ++ return; ++ } ++ ++ usleep_range(1000, 2000); ++ } ++ ++ anx78xx->powered = false; ++} ++ ++static int anx78xx_start(struct anx78xx *anx78xx) ++{ ++ int err; ++ ++ /* Power on all modules */ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], ++ SP_POWERDOWN_CTRL_REG, ++ SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD | ++ SP_LINK_PD); ++ ++ err = anx78xx_enable_interrupts(anx78xx); ++ if (err) { ++ DRM_ERROR("Failed to enable interrupts: %d\n", err); ++ goto err_poweroff; ++ } ++ ++ err = anx78xx_rx_initialization(anx78xx); ++ if (err) { ++ DRM_ERROR("Failed receiver initialization: %d\n", err); ++ goto err_poweroff; ++ } ++ ++ err = anx78xx_tx_initialization(anx78xx); ++ if (err) { ++ DRM_ERROR("Failed transmitter initialization: %d\n", err); ++ goto err_poweroff; ++ } ++ ++ /* ++ * This delay seems to help keep the hardware in a good state. Without ++ * it, there are times where it fails silently. ++ */ ++ usleep_range(10000, 15000); ++ ++ return 0; ++ ++err_poweroff: ++ DRM_ERROR("Failed SlimPort transmitter initialization: %d\n", err); ++ anx78xx_poweroff(anx78xx); ++ ++ return err; ++} ++ ++static int anx78xx_init_pdata(struct anx78xx *anx78xx) ++{ ++ struct anx78xx_platform_data *pdata = &anx78xx->pdata; ++ struct device *dev = &anx78xx->client->dev; ++ ++ /* 1.0V digital core power regulator */ ++ pdata->dvdd10 = devm_regulator_get(dev, "dvdd10"); ++ if (IS_ERR(pdata->dvdd10)) { ++ if (PTR_ERR(pdata->dvdd10) != -EPROBE_DEFER) ++ DRM_ERROR("DVDD10 regulator not found\n"); ++ ++ return PTR_ERR(pdata->dvdd10); ++ } ++ ++ /* GPIO for HPD */ ++ pdata->gpiod_hpd = devm_gpiod_get(dev, "hpd", GPIOD_IN); ++ if (IS_ERR(pdata->gpiod_hpd)) ++ return PTR_ERR(pdata->gpiod_hpd); ++ ++ /* GPIO for chip power down */ ++ pdata->gpiod_pd = devm_gpiod_get(dev, "pd", GPIOD_OUT_HIGH); ++ if (IS_ERR(pdata->gpiod_pd)) ++ return PTR_ERR(pdata->gpiod_pd); ++ ++ /* GPIO for chip reset */ ++ pdata->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); ++ ++ return PTR_ERR_OR_ZERO(pdata->gpiod_reset); ++} ++ ++static int anx78xx_dp_link_training(struct anx78xx *anx78xx) ++{ ++ u8 dp_bw, dpcd[2]; ++ int err; ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_HDMI_MUTE_CTRL_REG, ++ 0x0); ++ if (err) ++ return err; ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], ++ SP_POWERDOWN_CTRL_REG, ++ SP_TOTAL_PD); ++ if (err) ++ return err; ++ ++ err = drm_dp_dpcd_readb(&anx78xx->aux, DP_MAX_LINK_RATE, &dp_bw); ++ if (err < 0) ++ return err; ++ ++ switch (dp_bw) { ++ case DP_LINK_BW_1_62: ++ case DP_LINK_BW_2_7: ++ case DP_LINK_BW_5_4: ++ break; ++ ++ default: ++ DRM_DEBUG_KMS("DP bandwidth (%#02x) not supported\n", dp_bw); ++ return -EINVAL; ++ } ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG, ++ SP_VIDEO_MUTE); ++ if (err) ++ return err; ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], ++ SP_VID_CTRL1_REG, SP_VIDEO_EN); ++ if (err) ++ return err; ++ ++ /* Get DPCD info */ ++ err = drm_dp_dpcd_read(&anx78xx->aux, DP_DPCD_REV, ++ &anx78xx->dpcd, DP_RECEIVER_CAP_SIZE); ++ if (err < 0) { ++ DRM_ERROR("Failed to read DPCD: %d\n", err); ++ return err; ++ } ++ ++ /* Clear channel x SERDES power down */ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_ANALOG_POWER_DOWN_REG, SP_CH0_PD); ++ if (err) ++ return err; ++ ++ /* ++ * Power up the sink (DP_SET_POWER register is only available on DPCD ++ * v1.1 and later). ++ */ ++ if (anx78xx->dpcd[DP_DPCD_REV] >= 0x11) { ++ err = drm_dp_dpcd_readb(&anx78xx->aux, DP_SET_POWER, &dpcd[0]); ++ if (err < 0) { ++ DRM_ERROR("Failed to read DP_SET_POWER register: %d\n", ++ err); ++ return err; ++ } ++ ++ dpcd[0] &= ~DP_SET_POWER_MASK; ++ dpcd[0] |= DP_SET_POWER_D0; ++ ++ err = drm_dp_dpcd_writeb(&anx78xx->aux, DP_SET_POWER, dpcd[0]); ++ if (err < 0) { ++ DRM_ERROR("Failed to power up DisplayPort link: %d\n", ++ err); ++ return err; ++ } ++ ++ /* ++ * According to the DP 1.1 specification, a "Sink Device must ++ * exit the power saving state within 1 ms" (Section 2.5.3.1, ++ * Table 5-52, "Sink Control Field" (register 0x600). ++ */ ++ usleep_range(1000, 2000); ++ } ++ ++ /* Possibly enable downspread on the sink */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_DOWNSPREAD_CTRL1_REG, 0); ++ if (err) ++ return err; ++ ++ if (anx78xx->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5) { ++ DRM_DEBUG("Enable downspread on the sink\n"); ++ /* 4000PPM */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_DOWNSPREAD_CTRL1_REG, 8); ++ if (err) ++ return err; ++ ++ err = drm_dp_dpcd_writeb(&anx78xx->aux, DP_DOWNSPREAD_CTRL, ++ DP_SPREAD_AMP_0_5); ++ if (err < 0) ++ return err; ++ } else { ++ err = drm_dp_dpcd_writeb(&anx78xx->aux, DP_DOWNSPREAD_CTRL, 0); ++ if (err < 0) ++ return err; ++ } ++ ++ /* Set the lane count and the link rate on the sink */ ++ if (drm_dp_enhanced_frame_cap(anx78xx->dpcd)) ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_SYSTEM_CTRL_BASE + 4, ++ SP_ENHANCED_MODE); ++ else ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_SYSTEM_CTRL_BASE + 4, ++ SP_ENHANCED_MODE); ++ if (err) ++ return err; ++ ++ dpcd[0] = drm_dp_max_link_rate(anx78xx->dpcd); ++ dpcd[0] = drm_dp_link_rate_to_bw_code(dpcd[0]); ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], ++ SP_DP_MAIN_LINK_BW_SET_REG, dpcd[0]); ++ if (err) ++ return err; ++ ++ dpcd[1] = drm_dp_max_lane_count(anx78xx->dpcd); ++ ++ if (drm_dp_enhanced_frame_cap(anx78xx->dpcd)) ++ dpcd[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; ++ ++ err = drm_dp_dpcd_write(&anx78xx->aux, DP_LINK_BW_SET, dpcd, ++ sizeof(dpcd)); ++ if (err < 0) { ++ DRM_ERROR("Failed to configure link: %d\n", err); ++ return err; ++ } ++ ++ /* Start training on the source */ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_LT_CTRL_REG, ++ SP_LT_EN); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static int anx78xx_config_dp_output(struct anx78xx *anx78xx) ++{ ++ int err; ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG, ++ SP_VIDEO_MUTE); ++ if (err) ++ return err; ++ ++ /* Enable DP output */ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG, ++ SP_VIDEO_EN); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static int anx78xx_send_video_infoframe(struct anx78xx *anx78xx, ++ struct hdmi_avi_infoframe *frame) ++{ ++ u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; ++ int err; ++ ++ err = hdmi_avi_infoframe_pack(frame, buffer, sizeof(buffer)); ++ if (err < 0) { ++ DRM_ERROR("Failed to pack AVI infoframe: %d\n", err); ++ return err; ++ } ++ ++ err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_PACKET_SEND_CTRL_REG, SP_AVI_IF_EN); ++ if (err) ++ return err; ++ ++ err = regmap_bulk_write(anx78xx->map[I2C_IDX_TX_P2], ++ SP_INFOFRAME_AVI_DB1_REG, buffer, ++ frame->length); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_PACKET_SEND_CTRL_REG, SP_AVI_IF_UD); ++ if (err) ++ return err; ++ ++ err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0], ++ SP_PACKET_SEND_CTRL_REG, SP_AVI_IF_EN); ++ if (err) ++ return err; ++ ++ return 0; ++} ++ ++static int anx78xx_get_downstream_info(struct anx78xx *anx78xx) ++{ ++ u8 value; ++ int err; ++ ++ err = drm_dp_dpcd_readb(&anx78xx->aux, DP_SINK_COUNT, &value); ++ if (err < 0) { ++ DRM_ERROR("Get sink count failed %d\n", err); ++ return err; ++ } ++ ++ if (!DP_GET_SINK_COUNT(value)) { ++ DRM_ERROR("Downstream disconnected\n"); ++ return -EIO; ++ } ++ ++ return 0; ++} ++ ++static int anx78xx_get_modes(struct drm_connector *connector) ++{ ++ struct anx78xx *anx78xx = connector_to_anx78xx(connector); ++ int err, num_modes = 0; ++ ++ if (WARN_ON(!anx78xx->powered)) ++ return 0; ++ ++ if (anx78xx->edid) ++ return drm_add_edid_modes(connector, anx78xx->edid); ++ ++ mutex_lock(&anx78xx->lock); ++ ++ err = anx78xx_get_downstream_info(anx78xx); ++ if (err) { ++ DRM_ERROR("Failed to get downstream info: %d\n", err); ++ goto unlock; ++ } ++ ++ anx78xx->edid = drm_get_edid(connector, &anx78xx->aux.ddc); ++ if (!anx78xx->edid) { ++ DRM_ERROR("Failed to read EDID\n"); ++ goto unlock; ++ } ++ ++ err = drm_connector_update_edid_property(connector, ++ anx78xx->edid); ++ if (err) { ++ DRM_ERROR("Failed to update EDID property: %d\n", err); ++ goto unlock; ++ } ++ ++ num_modes = drm_add_edid_modes(connector, anx78xx->edid); ++ ++unlock: ++ mutex_unlock(&anx78xx->lock); ++ ++ return num_modes; ++} ++ ++static const struct drm_connector_helper_funcs anx78xx_connector_helper_funcs = { ++ .get_modes = anx78xx_get_modes, ++}; ++ ++static enum drm_connector_status anx78xx_detect(struct drm_connector *connector, ++ bool force) ++{ ++ struct anx78xx *anx78xx = connector_to_anx78xx(connector); ++ ++ if (!gpiod_get_value(anx78xx->pdata.gpiod_hpd)) ++ return connector_status_disconnected; ++ ++ return connector_status_connected; ++} ++ ++static const struct drm_connector_funcs anx78xx_connector_funcs = { ++ .fill_modes = drm_helper_probe_single_connector_modes, ++ .detect = anx78xx_detect, ++ .destroy = drm_connector_cleanup, ++ .reset = drm_atomic_helper_connector_reset, ++ .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, ++ .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, ++}; ++ ++static int anx78xx_bridge_attach(struct drm_bridge *bridge) ++{ ++ struct anx78xx *anx78xx = bridge_to_anx78xx(bridge); ++ int err; ++ ++ if (!bridge->encoder) { ++ DRM_ERROR("Parent encoder object not found"); ++ return -ENODEV; ++ } ++ ++ /* Register aux channel */ ++ anx78xx->aux.name = "DP-AUX"; ++ anx78xx->aux.dev = &anx78xx->client->dev; ++ anx78xx->aux.transfer = anx78xx_aux_transfer; ++ ++ err = drm_dp_aux_register(&anx78xx->aux); ++ if (err < 0) { ++ DRM_ERROR("Failed to register aux channel: %d\n", err); ++ return err; ++ } ++ ++ err = drm_connector_init(bridge->dev, &anx78xx->connector, ++ &anx78xx_connector_funcs, ++ DRM_MODE_CONNECTOR_DisplayPort); ++ if (err) { ++ DRM_ERROR("Failed to initialize connector: %d\n", err); ++ return err; ++ } ++ ++ drm_connector_helper_add(&anx78xx->connector, ++ &anx78xx_connector_helper_funcs); ++ ++ err = drm_connector_register(&anx78xx->connector); ++ if (err) { ++ DRM_ERROR("Failed to register connector: %d\n", err); ++ return err; ++ } ++ ++ anx78xx->connector.polled = DRM_CONNECTOR_POLL_HPD; ++ ++ err = drm_connector_attach_encoder(&anx78xx->connector, ++ bridge->encoder); ++ if (err) { ++ DRM_ERROR("Failed to link up connector to encoder: %d\n", err); ++ return err; ++ } ++ ++ return 0; ++} ++ ++static enum drm_mode_status ++anx78xx_bridge_mode_valid(struct drm_bridge *bridge, ++ const struct drm_display_mode *mode) ++{ ++ if (mode->flags & DRM_MODE_FLAG_INTERLACE) ++ return MODE_NO_INTERLACE; ++ ++ /* Max 1200p at 5.4 Ghz, one lane */ ++ if (mode->clock > 154000) ++ return MODE_CLOCK_HIGH; ++ ++ return MODE_OK; ++} ++ ++static void anx78xx_bridge_disable(struct drm_bridge *bridge) ++{ ++ struct anx78xx *anx78xx = bridge_to_anx78xx(bridge); ++ ++ /* Power off all modules except configuration registers access */ ++ anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG, ++ SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD | SP_LINK_PD); ++} ++ ++static void anx78xx_bridge_mode_set(struct drm_bridge *bridge, ++ const struct drm_display_mode *mode, ++ const struct drm_display_mode *adjusted_mode) ++{ ++ struct anx78xx *anx78xx = bridge_to_anx78xx(bridge); ++ struct hdmi_avi_infoframe frame; ++ int err; ++ ++ if (WARN_ON(!anx78xx->powered)) ++ return; ++ ++ mutex_lock(&anx78xx->lock); ++ ++ err = drm_hdmi_avi_infoframe_from_display_mode(&frame, ++ &anx78xx->connector, ++ adjusted_mode); ++ if (err) { ++ DRM_ERROR("Failed to setup AVI infoframe: %d\n", err); ++ goto unlock; ++ } ++ ++ err = anx78xx_send_video_infoframe(anx78xx, &frame); ++ if (err) ++ DRM_ERROR("Failed to send AVI infoframe: %d\n", err); ++ ++unlock: ++ mutex_unlock(&anx78xx->lock); ++} ++ ++static void anx78xx_bridge_enable(struct drm_bridge *bridge) ++{ ++ struct anx78xx *anx78xx = bridge_to_anx78xx(bridge); ++ int err; ++ ++ err = anx78xx_start(anx78xx); ++ if (err) { ++ DRM_ERROR("Failed to initialize: %d\n", err); ++ return; ++ } ++ ++ err = anx78xx_set_hpd(anx78xx); ++ if (err) ++ DRM_ERROR("Failed to set HPD: %d\n", err); ++} ++ ++static const struct drm_bridge_funcs anx78xx_bridge_funcs = { ++ .attach = anx78xx_bridge_attach, ++ .mode_valid = anx78xx_bridge_mode_valid, ++ .disable = anx78xx_bridge_disable, ++ .mode_set = anx78xx_bridge_mode_set, ++ .enable = anx78xx_bridge_enable, ++}; ++ ++static irqreturn_t anx78xx_hpd_threaded_handler(int irq, void *data) ++{ ++ struct anx78xx *anx78xx = data; ++ int err; ++ ++ if (anx78xx->powered) ++ return IRQ_HANDLED; ++ ++ mutex_lock(&anx78xx->lock); ++ ++ /* Cable is pulled, power on the chip */ ++ anx78xx_poweron(anx78xx); ++ ++ err = anx78xx_enable_interrupts(anx78xx); ++ if (err) ++ DRM_ERROR("Failed to enable interrupts: %d\n", err); ++ ++ mutex_unlock(&anx78xx->lock); ++ ++ return IRQ_HANDLED; ++} ++ ++static int anx78xx_handle_dp_int_1(struct anx78xx *anx78xx, u8 irq) ++{ ++ int err; ++ ++ DRM_DEBUG_KMS("Handle DP interrupt 1: %02x\n", irq); ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_STATUS1_REG, ++ irq); ++ if (err) ++ return err; ++ ++ if (irq & SP_TRAINING_FINISH) { ++ DRM_DEBUG_KMS("IRQ: hardware link training finished\n"); ++ err = anx78xx_config_dp_output(anx78xx); ++ } ++ ++ return err; ++} ++ ++static bool anx78xx_handle_common_int_4(struct anx78xx *anx78xx, u8 irq) ++{ ++ bool event = false; ++ int err; ++ ++ DRM_DEBUG_KMS("Handle common interrupt 4: %02x\n", irq); ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], ++ SP_COMMON_INT_STATUS4_REG, irq); ++ if (err) { ++ DRM_ERROR("Failed to write SP_COMMON_INT_STATUS4 %d\n", err); ++ return event; ++ } ++ ++ if (irq & SP_HPD_LOST) { ++ DRM_DEBUG_KMS("IRQ: Hot plug detect - cable is pulled out\n"); ++ event = true; ++ anx78xx_poweroff(anx78xx); ++ /* Free cached EDID */ ++ kfree(anx78xx->edid); ++ anx78xx->edid = NULL; ++ } else if (irq & SP_HPD_PLUG) { ++ DRM_DEBUG_KMS("IRQ: Hot plug detect - cable plug\n"); ++ event = true; ++ } ++ ++ return event; ++} ++ ++static void anx78xx_handle_hdmi_int_1(struct anx78xx *anx78xx, u8 irq) ++{ ++ unsigned int value; ++ int err; ++ ++ DRM_DEBUG_KMS("Handle HDMI interrupt 1: %02x\n", irq); ++ ++ err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_INT_STATUS1_REG, ++ irq); ++ if (err) { ++ DRM_ERROR("Write HDMI int 1 failed: %d\n", err); ++ return; ++ } ++ ++ if ((irq & SP_CKDT_CHG) || (irq & SP_SCDT_CHG)) { ++ DRM_DEBUG_KMS("IRQ: HDMI input detected\n"); ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_RX_P0], ++ SP_SYSTEM_STATUS_REG, &value); ++ if (err) { ++ DRM_ERROR("Read system status reg failed: %d\n", err); ++ return; ++ } ++ ++ if (!(value & SP_TMDS_CLOCK_DET)) { ++ DRM_DEBUG_KMS("IRQ: *** Waiting for HDMI clock ***\n"); ++ return; ++ } ++ ++ if (!(value & SP_TMDS_DE_DET)) { ++ DRM_DEBUG_KMS("IRQ: *** Waiting for HDMI signal ***\n"); ++ return; ++ } ++ ++ err = anx78xx_dp_link_training(anx78xx); ++ if (err) ++ DRM_ERROR("Failed to start link training: %d\n", err); ++ } ++} ++ ++static irqreturn_t anx78xx_intp_threaded_handler(int unused, void *data) ++{ ++ struct anx78xx *anx78xx = data; ++ bool event = false; ++ unsigned int irq; ++ int err; ++ ++ mutex_lock(&anx78xx->lock); ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_STATUS1_REG, ++ &irq); ++ if (err) { ++ DRM_ERROR("Failed to read DP interrupt 1 status: %d\n", err); ++ goto unlock; ++ } ++ ++ if (irq) ++ anx78xx_handle_dp_int_1(anx78xx, irq); ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], ++ SP_COMMON_INT_STATUS4_REG, &irq); ++ if (err) { ++ DRM_ERROR("Failed to read common interrupt 4 status: %d\n", ++ err); ++ goto unlock; ++ } ++ ++ if (irq) ++ event = anx78xx_handle_common_int_4(anx78xx, irq); ++ ++ /* Make sure we are still powered after handle HPD events */ ++ if (!anx78xx->powered) ++ goto unlock; ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_RX_P0], SP_INT_STATUS1_REG, ++ &irq); ++ if (err) { ++ DRM_ERROR("Failed to read HDMI int 1 status: %d\n", err); ++ goto unlock; ++ } ++ ++ if (irq) ++ anx78xx_handle_hdmi_int_1(anx78xx, irq); ++ ++unlock: ++ mutex_unlock(&anx78xx->lock); ++ ++ if (event) ++ drm_helper_hpd_irq_event(anx78xx->connector.dev); ++ ++ return IRQ_HANDLED; ++} ++ ++static void unregister_i2c_dummy_clients(struct anx78xx *anx78xx) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < ARRAY_SIZE(anx78xx->i2c_dummy); i++) ++ i2c_unregister_device(anx78xx->i2c_dummy[i]); ++} ++ ++static const struct regmap_config anx78xx_regmap_config = { ++ .reg_bits = 8, ++ .val_bits = 8, ++}; ++ ++static const u16 anx78xx_chipid_list[] = { ++ 0x7808, ++ 0x7812, ++ 0x7814, ++ 0x7818, ++}; ++ ++static int anx78xx_i2c_probe(struct i2c_client *client, ++ const struct i2c_device_id *id) ++{ ++ struct anx78xx *anx78xx; ++ struct anx78xx_platform_data *pdata; ++ unsigned int i, idl, idh, version; ++ const u8 *i2c_addresses; ++ bool found = false; ++ int err; ++ ++ anx78xx = devm_kzalloc(&client->dev, sizeof(*anx78xx), GFP_KERNEL); ++ if (!anx78xx) ++ return -ENOMEM; ++ ++ pdata = &anx78xx->pdata; ++ ++ mutex_init(&anx78xx->lock); ++ ++#if IS_ENABLED(CONFIG_OF) ++ anx78xx->bridge.of_node = client->dev.of_node; ++#endif ++ ++ anx78xx->client = client; ++ i2c_set_clientdata(client, anx78xx); ++ ++ err = anx78xx_init_pdata(anx78xx); ++ if (err) { ++ if (err != -EPROBE_DEFER) ++ DRM_ERROR("Failed to initialize pdata: %d\n", err); ++ ++ return err; ++ } ++ ++ pdata->hpd_irq = gpiod_to_irq(pdata->gpiod_hpd); ++ if (pdata->hpd_irq < 0) { ++ DRM_ERROR("Failed to get HPD IRQ: %d\n", pdata->hpd_irq); ++ return -ENODEV; ++ } ++ ++ pdata->intp_irq = client->irq; ++ if (!pdata->intp_irq) { ++ DRM_ERROR("Failed to get CABLE_DET and INTP IRQ\n"); ++ return -ENODEV; ++ } ++ ++ /* Map slave addresses of ANX7814 */ ++ i2c_addresses = device_get_match_data(&client->dev); ++ for (i = 0; i < I2C_NUM_ADDRESSES; i++) { ++ struct i2c_client *i2c_dummy; ++ ++ i2c_dummy = i2c_new_dummy_device(client->adapter, ++ i2c_addresses[i] >> 1); ++ if (IS_ERR(i2c_dummy)) { ++ err = PTR_ERR(i2c_dummy); ++ DRM_ERROR("Failed to reserve I2C bus %02x: %d\n", ++ i2c_addresses[i], err); ++ goto err_unregister_i2c; ++ } ++ ++ anx78xx->i2c_dummy[i] = i2c_dummy; ++ anx78xx->map[i] = devm_regmap_init_i2c(anx78xx->i2c_dummy[i], ++ &anx78xx_regmap_config); ++ if (IS_ERR(anx78xx->map[i])) { ++ err = PTR_ERR(anx78xx->map[i]); ++ DRM_ERROR("Failed regmap initialization %02x\n", ++ i2c_addresses[i]); ++ goto err_unregister_i2c; ++ } ++ } ++ ++ /* Look for supported chip ID */ ++ anx78xx_poweron(anx78xx); ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_IDL_REG, ++ &idl); ++ if (err) ++ goto err_poweroff; ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_IDH_REG, ++ &idh); ++ if (err) ++ goto err_poweroff; ++ ++ anx78xx->chipid = (u8)idl | ((u8)idh << 8); ++ ++ err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_VERSION_REG, ++ &version); ++ if (err) ++ goto err_poweroff; ++ ++ for (i = 0; i < ARRAY_SIZE(anx78xx_chipid_list); i++) { ++ if (anx78xx->chipid == anx78xx_chipid_list[i]) { ++ DRM_INFO("Found ANX%x (ver. %d) SlimPort Transmitter\n", ++ anx78xx->chipid, version); ++ found = true; ++ break; ++ } ++ } ++ ++ if (!found) { ++ DRM_ERROR("ANX%x (ver. %d) not supported by this driver\n", ++ anx78xx->chipid, version); ++ err = -ENODEV; ++ goto err_poweroff; ++ } ++ ++ err = devm_request_threaded_irq(&client->dev, pdata->hpd_irq, NULL, ++ anx78xx_hpd_threaded_handler, ++ IRQF_TRIGGER_RISING | IRQF_ONESHOT, ++ "anx78xx-hpd", anx78xx); ++ if (err) { ++ DRM_ERROR("Failed to request CABLE_DET threaded IRQ: %d\n", ++ err); ++ goto err_poweroff; ++ } ++ ++ err = devm_request_threaded_irq(&client->dev, pdata->intp_irq, NULL, ++ anx78xx_intp_threaded_handler, ++ IRQF_TRIGGER_RISING | IRQF_ONESHOT, ++ "anx78xx-intp", anx78xx); ++ if (err) { ++ DRM_ERROR("Failed to request INTP threaded IRQ: %d\n", err); ++ goto err_poweroff; ++ } ++ ++ anx78xx->bridge.funcs = &anx78xx_bridge_funcs; ++ ++ drm_bridge_add(&anx78xx->bridge); ++ ++ /* If cable is pulled out, just poweroff and wait for HPD event */ ++ if (!gpiod_get_value(anx78xx->pdata.gpiod_hpd)) ++ anx78xx_poweroff(anx78xx); ++ ++ return 0; ++ ++err_poweroff: ++ anx78xx_poweroff(anx78xx); ++ ++err_unregister_i2c: ++ unregister_i2c_dummy_clients(anx78xx); ++ return err; ++} ++ ++static int anx78xx_i2c_remove(struct i2c_client *client) ++{ ++ struct anx78xx *anx78xx = i2c_get_clientdata(client); ++ ++ drm_bridge_remove(&anx78xx->bridge); ++ ++ unregister_i2c_dummy_clients(anx78xx); ++ ++ kfree(anx78xx->edid); ++ ++ return 0; ++} ++ ++static const struct i2c_device_id anx78xx_id[] = { ++ { "anx7814", 0 }, ++ { /* sentinel */ } ++}; ++MODULE_DEVICE_TABLE(i2c, anx78xx_id); ++ ++#if IS_ENABLED(CONFIG_OF) ++static const struct of_device_id anx78xx_match_table[] = { ++ { .compatible = "analogix,anx7808", .data = anx7808_i2c_addresses }, ++ { .compatible = "analogix,anx7812", .data = anx781x_i2c_addresses }, ++ { .compatible = "analogix,anx7814", .data = anx781x_i2c_addresses }, ++ { .compatible = "analogix,anx7818", .data = anx781x_i2c_addresses }, ++ { /* sentinel */ }, ++}; ++MODULE_DEVICE_TABLE(of, anx78xx_match_table); ++#endif ++ ++static struct i2c_driver anx78xx_driver = { ++ .driver = { ++ .name = "anx7814", ++ .of_match_table = of_match_ptr(anx78xx_match_table), ++ }, ++ .probe = anx78xx_i2c_probe, ++ .remove = anx78xx_i2c_remove, ++ .id_table = anx78xx_id, ++}; ++module_i2c_driver(anx78xx_driver); ++ ++MODULE_DESCRIPTION("ANX78xx SlimPort Transmitter driver"); ++MODULE_AUTHOR("Enric Balletbo i Serra "); ++MODULE_LICENSE("GPL v2"); +diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h +new file mode 100644 +index 000000000000..55d6c2109740 +--- /dev/null ++++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h +@@ -0,0 +1,703 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++/* ++ * Copyright(c) 2016, Analogix Semiconductor. All rights reserved. ++ */ ++ ++#ifndef __ANX78xx_H ++#define __ANX78xx_H ++ ++/***************************************************************/ ++/* Register definitions for RX_PO */ ++/***************************************************************/ ++ ++/* ++ * System Control and Status ++ */ ++ ++/* Software Reset Register 1 */ ++#define SP_SOFTWARE_RESET1_REG 0x11 ++#define SP_VIDEO_RST BIT(4) ++#define SP_HDCP_MAN_RST BIT(2) ++#define SP_TMDS_RST BIT(1) ++#define SP_SW_MAN_RST BIT(0) ++ ++/* System Status Register */ ++#define SP_SYSTEM_STATUS_REG 0x14 ++#define SP_TMDS_CLOCK_DET BIT(1) ++#define SP_TMDS_DE_DET BIT(0) ++ ++/* HDMI Status Register */ ++#define SP_HDMI_STATUS_REG 0x15 ++#define SP_HDMI_AUD_LAYOUT BIT(3) ++#define SP_HDMI_DET BIT(0) ++# define SP_DVI_MODE 0 ++# define SP_HDMI_MODE 1 ++ ++/* HDMI Mute Control Register */ ++#define SP_HDMI_MUTE_CTRL_REG 0x16 ++#define SP_AUD_MUTE BIT(1) ++#define SP_VID_MUTE BIT(0) ++ ++/* System Power Down Register 1 */ ++#define SP_SYSTEM_POWER_DOWN1_REG 0x18 ++#define SP_PWDN_CTRL BIT(0) ++ ++/* ++ * Audio and Video Auto Control ++ */ ++ ++/* Auto Audio and Video Control register */ ++#define SP_AUDVID_CTRL_REG 0x20 ++#define SP_AVC_OE BIT(7) ++#define SP_AAC_OE BIT(6) ++#define SP_AVC_EN BIT(1) ++#define SP_AAC_EN BIT(0) ++ ++/* Audio Exception Enable Registers */ ++#define SP_AUD_EXCEPTION_ENABLE_BASE (0x24 - 1) ++/* Bits for Audio Exception Enable Register 3 */ ++#define SP_AEC_EN21 BIT(5) ++ ++/* ++ * Interrupt ++ */ ++ ++/* Interrupt Status Register 1 */ ++#define SP_INT_STATUS1_REG 0x31 ++/* Bits for Interrupt Status Register 1 */ ++#define SP_HDMI_DVI BIT(7) ++#define SP_CKDT_CHG BIT(6) ++#define SP_SCDT_CHG BIT(5) ++#define SP_PCLK_CHG BIT(4) ++#define SP_PLL_UNLOCK BIT(3) ++#define SP_CABLE_PLUG_CHG BIT(2) ++#define SP_SET_MUTE BIT(1) ++#define SP_SW_INTR BIT(0) ++/* Bits for Interrupt Status Register 2 */ ++#define SP_HDCP_ERR BIT(5) ++#define SP_AUDIO_SAMPLE_CHG BIT(0) /* undocumented */ ++/* Bits for Interrupt Status Register 3 */ ++#define SP_AUD_MODE_CHG BIT(0) ++/* Bits for Interrupt Status Register 5 */ ++#define SP_AUDIO_RCV BIT(0) ++/* Bits for Interrupt Status Register 6 */ ++#define SP_INT_STATUS6_REG 0x36 ++#define SP_CTS_RCV BIT(7) ++#define SP_NEW_AUD_PKT BIT(4) ++#define SP_NEW_AVI_PKT BIT(1) ++#define SP_NEW_CP_PKT BIT(0) ++/* Bits for Interrupt Status Register 7 */ ++#define SP_NO_VSI BIT(7) ++#define SP_NEW_VS BIT(4) ++ ++/* Interrupt Mask 1 Status Registers */ ++#define SP_INT_MASK1_REG 0x41 ++ ++/* HDMI US TIMER Control Register */ ++#define SP_HDMI_US_TIMER_CTRL_REG 0x49 ++#define SP_MS_TIMER_MARGIN_10_8_MASK 0x07 ++ ++/* ++ * TMDS Control ++ */ ++ ++/* TMDS Control Registers */ ++#define SP_TMDS_CTRL_BASE (0x50 - 1) ++/* Bits for TMDS Control Register 7 */ ++#define SP_PD_RT BIT(0) ++ ++/* ++ * Video Control ++ */ ++ ++/* Video Status Register */ ++#define SP_VIDEO_STATUS_REG 0x70 ++#define SP_COLOR_DEPTH_MASK 0xf0 ++#define SP_COLOR_DEPTH_SHIFT 4 ++# define SP_COLOR_DEPTH_MODE_LEGACY 0x00 ++# define SP_COLOR_DEPTH_MODE_24BIT 0x04 ++# define SP_COLOR_DEPTH_MODE_30BIT 0x05 ++# define SP_COLOR_DEPTH_MODE_36BIT 0x06 ++# define SP_COLOR_DEPTH_MODE_48BIT 0x07 ++ ++/* Video Data Range Control Register */ ++#define SP_VID_DATA_RANGE_CTRL_REG 0x83 ++#define SP_R2Y_INPUT_LIMIT BIT(1) ++ ++/* Pixel Clock High Resolution Counter Registers */ ++#define SP_PCLK_HIGHRES_CNT_BASE (0x8c - 1) ++ ++/* ++ * Audio Control ++ */ ++ ++/* Number of Audio Channels Status Registers */ ++#define SP_AUD_CH_STATUS_REG_NUM 6 ++ ++/* Audio IN S/PDIF Channel Status Registers */ ++#define SP_AUD_SPDIF_CH_STATUS_BASE 0xc7 ++ ++/* Audio IN S/PDIF Channel Status Register 4 */ ++#define SP_FS_FREQ_MASK 0x0f ++# define SP_FS_FREQ_44100HZ 0x00 ++# define SP_FS_FREQ_48000HZ 0x02 ++# define SP_FS_FREQ_32000HZ 0x03 ++# define SP_FS_FREQ_88200HZ 0x08 ++# define SP_FS_FREQ_96000HZ 0x0a ++# define SP_FS_FREQ_176400HZ 0x0c ++# define SP_FS_FREQ_192000HZ 0x0e ++ ++/* ++ * Micellaneous Control Block ++ */ ++ ++/* CHIP Control Register */ ++#define SP_CHIP_CTRL_REG 0xe3 ++#define SP_MAN_HDMI5V_DET BIT(3) ++#define SP_PLLLOCK_CKDT_EN BIT(2) ++#define SP_ANALOG_CKDT_EN BIT(1) ++#define SP_DIGITAL_CKDT_EN BIT(0) ++ ++/* Packet Receiving Status Register */ ++#define SP_PACKET_RECEIVING_STATUS_REG 0xf3 ++#define SP_AVI_RCVD BIT(5) ++#define SP_VSI_RCVD BIT(1) ++ ++/***************************************************************/ ++/* Register definitions for RX_P1 */ ++/***************************************************************/ ++ ++/* HDCP BCAPS Shadow Register */ ++#define SP_HDCP_BCAPS_SHADOW_REG 0x2a ++#define SP_BCAPS_REPEATER BIT(5) ++ ++/* HDCP Status Register */ ++#define SP_RX_HDCP_STATUS_REG 0x3f ++#define SP_AUTH_EN BIT(4) ++ ++/* ++ * InfoFrame and Control Packet Registers ++ */ ++ ++/* AVI InfoFrame packet checksum */ ++#define SP_AVI_INFOFRAME_CHECKSUM 0xa3 ++ ++/* AVI InfoFrame Registers */ ++#define SP_AVI_INFOFRAME_DATA_BASE 0xa4 ++ ++#define SP_AVI_COLOR_F_MASK 0x60 ++#define SP_AVI_COLOR_F_SHIFT 5 ++ ++/* Audio InfoFrame Registers */ ++#define SP_AUD_INFOFRAME_DATA_BASE 0xc4 ++#define SP_AUD_INFOFRAME_LAYOUT_MASK 0x0f ++ ++/* MPEG/HDMI Vendor Specific InfoFrame Packet type code */ ++#define SP_MPEG_VS_INFOFRAME_TYPE_REG 0xe0 ++ ++/* MPEG/HDMI Vendor Specific InfoFrame Packet length */ ++#define SP_MPEG_VS_INFOFRAME_LEN_REG 0xe2 ++ ++/* MPEG/HDMI Vendor Specific InfoFrame Packet version number */ ++#define SP_MPEG_VS_INFOFRAME_VER_REG 0xe1 ++ ++/* MPEG/HDMI Vendor Specific InfoFrame Packet content */ ++#define SP_MPEG_VS_INFOFRAME_DATA_BASE 0xe4 ++ ++/* General Control Packet Register */ ++#define SP_GENERAL_CTRL_PACKET_REG 0x9f ++#define SP_CLEAR_AVMUTE BIT(4) ++#define SP_SET_AVMUTE BIT(0) ++ ++/***************************************************************/ ++/* Register definitions for TX_P0 */ ++/***************************************************************/ ++ ++/* HDCP Status Register */ ++#define SP_TX_HDCP_STATUS_REG 0x00 ++#define SP_AUTH_FAIL BIT(5) ++#define SP_AUTHEN_PASS BIT(1) ++ ++/* HDCP Control Register 0 */ ++#define SP_HDCP_CTRL0_REG 0x01 ++#define SP_RX_REPEATER BIT(6) ++#define SP_RE_AUTH BIT(5) ++#define SP_SW_AUTH_OK BIT(4) ++#define SP_HARD_AUTH_EN BIT(3) ++#define SP_HDCP_ENC_EN BIT(2) ++#define SP_BKSV_SRM_PASS BIT(1) ++#define SP_KSVLIST_VLD BIT(0) ++/* HDCP Function Enabled */ ++#define SP_HDCP_FUNCTION_ENABLED (BIT(0) | BIT(1) | BIT(2) | BIT(3)) ++ ++/* HDCP Receiver BSTATUS Register 0 */ ++#define SP_HDCP_RX_BSTATUS0_REG 0x1b ++/* HDCP Receiver BSTATUS Register 1 */ ++#define SP_HDCP_RX_BSTATUS1_REG 0x1c ++ ++/* HDCP Embedded "Blue Screen" Content Registers */ ++#define SP_HDCP_VID0_BLUE_SCREEN_REG 0x2c ++#define SP_HDCP_VID1_BLUE_SCREEN_REG 0x2d ++#define SP_HDCP_VID2_BLUE_SCREEN_REG 0x2e ++ ++/* HDCP Wait R0 Timing Register */ ++#define SP_HDCP_WAIT_R0_TIME_REG 0x40 ++ ++/* HDCP Link Integrity Check Timer Register */ ++#define SP_HDCP_LINK_CHECK_TIMER_REG 0x41 ++ ++/* HDCP Repeater Ready Wait Timer Register */ ++#define SP_HDCP_RPTR_RDY_WAIT_TIME_REG 0x42 ++ ++/* HDCP Auto Timer Register */ ++#define SP_HDCP_AUTO_TIMER_REG 0x51 ++ ++/* HDCP Key Status Register */ ++#define SP_HDCP_KEY_STATUS_REG 0x5e ++ ++/* HDCP Key Command Register */ ++#define SP_HDCP_KEY_COMMAND_REG 0x5f ++#define SP_DISABLE_SYNC_HDCP BIT(2) ++ ++/* OTP Memory Key Protection Registers */ ++#define SP_OTP_KEY_PROTECT1_REG 0x60 ++#define SP_OTP_KEY_PROTECT2_REG 0x61 ++#define SP_OTP_KEY_PROTECT3_REG 0x62 ++#define SP_OTP_PSW1 0xa2 ++#define SP_OTP_PSW2 0x7e ++#define SP_OTP_PSW3 0xc6 ++ ++/* DP System Control Registers */ ++#define SP_DP_SYSTEM_CTRL_BASE (0x80 - 1) ++/* Bits for DP System Control Register 2 */ ++#define SP_CHA_STA BIT(2) ++/* Bits for DP System Control Register 3 */ ++#define SP_HPD_STATUS BIT(6) ++#define SP_STRM_VALID BIT(2) ++/* Bits for DP System Control Register 4 */ ++#define SP_ENHANCED_MODE BIT(3) ++ ++/* DP Video Control Register */ ++#define SP_DP_VIDEO_CTRL_REG 0x84 ++#define SP_COLOR_F_MASK 0x06 ++#define SP_COLOR_F_SHIFT 1 ++#define SP_BPC_MASK 0xe0 ++#define SP_BPC_SHIFT 5 ++# define SP_BPC_6BITS 0x00 ++# define SP_BPC_8BITS 0x01 ++# define SP_BPC_10BITS 0x02 ++# define SP_BPC_12BITS 0x03 ++ ++/* DP Audio Control Register */ ++#define SP_DP_AUDIO_CTRL_REG 0x87 ++#define SP_AUD_EN BIT(0) ++ ++/* 10us Pulse Generate Timer Registers */ ++#define SP_I2C_GEN_10US_TIMER0_REG 0x88 ++#define SP_I2C_GEN_10US_TIMER1_REG 0x89 ++ ++/* Packet Send Control Register */ ++#define SP_PACKET_SEND_CTRL_REG 0x90 ++#define SP_AUD_IF_UP BIT(7) ++#define SP_AVI_IF_UD BIT(6) ++#define SP_MPEG_IF_UD BIT(5) ++#define SP_SPD_IF_UD BIT(4) ++#define SP_AUD_IF_EN BIT(3) ++#define SP_AVI_IF_EN BIT(2) ++#define SP_MPEG_IF_EN BIT(1) ++#define SP_SPD_IF_EN BIT(0) ++ ++/* DP HDCP Control Register */ ++#define SP_DP_HDCP_CTRL_REG 0x92 ++#define SP_AUTO_EN BIT(7) ++#define SP_AUTO_START BIT(5) ++#define SP_LINK_POLLING BIT(1) ++ ++/* DP Main Link Bandwidth Setting Register */ ++#define SP_DP_MAIN_LINK_BW_SET_REG 0xa0 ++#define SP_LINK_BW_SET_MASK 0x1f ++#define SP_INITIAL_SLIM_M_AUD_SEL BIT(5) ++ ++/* DP Training Pattern Set Register */ ++#define SP_DP_TRAINING_PATTERN_SET_REG 0xa2 ++ ++/* DP Lane 0 Link Training Control Register */ ++#define SP_DP_LANE0_LT_CTRL_REG 0xa3 ++#define SP_TX_SW_SET_MASK 0x1b ++#define SP_MAX_PRE_REACH BIT(5) ++#define SP_MAX_DRIVE_REACH BIT(4) ++#define SP_PRE_EMP_LEVEL1 BIT(3) ++#define SP_DRVIE_CURRENT_LEVEL1 BIT(0) ++ ++/* DP Link Training Control Register */ ++#define SP_DP_LT_CTRL_REG 0xa8 ++#define SP_LT_ERROR_TYPE_MASK 0x70 ++# define SP_LT_NO_ERROR 0x00 ++# define SP_LT_AUX_WRITE_ERROR 0x01 ++# define SP_LT_MAX_DRIVE_REACHED 0x02 ++# define SP_LT_WRONG_LANE_COUNT_SET 0x03 ++# define SP_LT_LOOP_SAME_5_TIME 0x04 ++# define SP_LT_CR_FAIL_IN_EQ 0x05 ++# define SP_LT_EQ_LOOP_5_TIME 0x06 ++#define SP_LT_EN BIT(0) ++ ++/* DP CEP Training Control Registers */ ++#define SP_DP_CEP_TRAINING_CTRL0_REG 0xa9 ++#define SP_DP_CEP_TRAINING_CTRL1_REG 0xaa ++ ++/* DP Debug Register 1 */ ++#define SP_DP_DEBUG1_REG 0xb0 ++#define SP_DEBUG_PLL_LOCK BIT(4) ++#define SP_POLLING_EN BIT(1) ++ ++/* DP Polling Control Register */ ++#define SP_DP_POLLING_CTRL_REG 0xb4 ++#define SP_AUTO_POLLING_DISABLE BIT(0) ++ ++/* DP Link Debug Control Register */ ++#define SP_DP_LINK_DEBUG_CTRL_REG 0xb8 ++#define SP_M_VID_DEBUG BIT(5) ++#define SP_NEW_PRBS7 BIT(4) ++#define SP_INSERT_ER BIT(1) ++#define SP_PRBS31_EN BIT(0) ++ ++/* AUX Misc control Register */ ++#define SP_AUX_MISC_CTRL_REG 0xbf ++ ++/* DP PLL control Register */ ++#define SP_DP_PLL_CTRL_REG 0xc7 ++#define SP_PLL_RST BIT(6) ++ ++/* DP Analog Power Down Register */ ++#define SP_DP_ANALOG_POWER_DOWN_REG 0xc8 ++#define SP_CH0_PD BIT(0) ++ ++/* DP Misc Control Register */ ++#define SP_DP_MISC_CTRL_REG 0xcd ++#define SP_EQ_TRAINING_LOOP BIT(6) ++ ++/* DP Extra I2C Device Address Register */ ++#define SP_DP_EXTRA_I2C_DEV_ADDR_REG 0xce ++#define SP_I2C_STRETCH_DISABLE BIT(7) ++ ++#define SP_I2C_EXTRA_ADDR 0x50 ++ ++/* DP Downspread Control Register 1 */ ++#define SP_DP_DOWNSPREAD_CTRL1_REG 0xd0 ++ ++/* DP M Value Calculation Control Register */ ++#define SP_DP_M_CALCULATION_CTRL_REG 0xd9 ++#define SP_M_GEN_CLK_SEL BIT(0) ++ ++/* AUX Channel Access Status Register */ ++#define SP_AUX_CH_STATUS_REG 0xe0 ++#define SP_AUX_STATUS 0x0f ++ ++/* AUX Channel DEFER Control Register */ ++#define SP_AUX_DEFER_CTRL_REG 0xe2 ++#define SP_DEFER_CTRL_EN BIT(7) ++ ++/* DP Buffer Data Count Register */ ++#define SP_BUF_DATA_COUNT_REG 0xe4 ++#define SP_BUF_DATA_COUNT_MASK 0x1f ++#define SP_BUF_CLR BIT(7) ++ ++/* DP AUX Channel Control Register 1 */ ++#define SP_DP_AUX_CH_CTRL1_REG 0xe5 ++#define SP_AUX_TX_COMM_MASK 0x0f ++#define SP_AUX_LENGTH_MASK 0xf0 ++#define SP_AUX_LENGTH_SHIFT 4 ++ ++/* DP AUX CH Address Register 0 */ ++#define SP_AUX_ADDR_7_0_REG 0xe6 ++ ++/* DP AUX CH Address Register 1 */ ++#define SP_AUX_ADDR_15_8_REG 0xe7 ++ ++/* DP AUX CH Address Register 2 */ ++#define SP_AUX_ADDR_19_16_REG 0xe8 ++#define SP_AUX_ADDR_19_16_MASK 0x0f ++ ++/* DP AUX Channel Control Register 2 */ ++#define SP_DP_AUX_CH_CTRL2_REG 0xe9 ++#define SP_AUX_SEL_RXCM BIT(6) ++#define SP_AUX_CHSEL BIT(3) ++#define SP_AUX_PN_INV BIT(2) ++#define SP_ADDR_ONLY BIT(1) ++#define SP_AUX_EN BIT(0) ++ ++/* DP Video Stream Control InfoFrame Register */ ++#define SP_DP_3D_VSC_CTRL_REG 0xea ++#define SP_INFO_FRAME_VSC_EN BIT(0) ++ ++/* DP Video Stream Data Byte 1 Register */ ++#define SP_DP_VSC_DB1_REG 0xeb ++ ++/* DP AUX Channel Control Register 3 */ ++#define SP_DP_AUX_CH_CTRL3_REG 0xec ++#define SP_WAIT_COUNTER_7_0_MASK 0xff ++ ++/* DP AUX Channel Control Register 4 */ ++#define SP_DP_AUX_CH_CTRL4_REG 0xed ++ ++/* DP AUX Buffer Data Registers */ ++#define SP_DP_BUF_DATA0_REG 0xf0 ++ ++/***************************************************************/ ++/* Register definitions for TX_P2 */ ++/***************************************************************/ ++ ++/* ++ * Core Register Definitions ++ */ ++ ++/* Device ID Low Byte Register */ ++#define SP_DEVICE_IDL_REG 0x02 ++ ++/* Device ID High Byte Register */ ++#define SP_DEVICE_IDH_REG 0x03 ++ ++/* Device version register */ ++#define SP_DEVICE_VERSION_REG 0x04 ++ ++/* Power Down Control Register */ ++#define SP_POWERDOWN_CTRL_REG 0x05 ++#define SP_REGISTER_PD BIT(7) ++#define SP_HDCP_PD BIT(5) ++#define SP_AUDIO_PD BIT(4) ++#define SP_VIDEO_PD BIT(3) ++#define SP_LINK_PD BIT(2) ++#define SP_TOTAL_PD BIT(1) ++ ++/* Reset Control Register 1 */ ++#define SP_RESET_CTRL1_REG 0x06 ++#define SP_MISC_RST BIT(7) ++#define SP_VIDCAP_RST BIT(6) ++#define SP_VIDFIF_RST BIT(5) ++#define SP_AUDFIF_RST BIT(4) ++#define SP_AUDCAP_RST BIT(3) ++#define SP_HDCP_RST BIT(2) ++#define SP_SW_RST BIT(1) ++#define SP_HW_RST BIT(0) ++ ++/* Reset Control Register 2 */ ++#define SP_RESET_CTRL2_REG 0x07 ++#define SP_AUX_RST BIT(2) ++#define SP_SERDES_FIFO_RST BIT(1) ++#define SP_I2C_REG_RST BIT(0) ++ ++/* Video Control Register 1 */ ++#define SP_VID_CTRL1_REG 0x08 ++#define SP_VIDEO_EN BIT(7) ++#define SP_VIDEO_MUTE BIT(2) ++#define SP_DE_GEN BIT(1) ++#define SP_DEMUX BIT(0) ++ ++/* Video Control Register 2 */ ++#define SP_VID_CTRL2_REG 0x09 ++#define SP_IN_COLOR_F_MASK 0x03 ++#define SP_IN_YC_BIT_SEL BIT(2) ++#define SP_IN_BPC_MASK 0x70 ++#define SP_IN_BPC_SHIFT 4 ++# define SP_IN_BPC_12BIT 0x03 ++# define SP_IN_BPC_10BIT 0x02 ++# define SP_IN_BPC_8BIT 0x01 ++# define SP_IN_BPC_6BIT 0x00 ++#define SP_IN_D_RANGE BIT(7) ++ ++/* Video Control Register 3 */ ++#define SP_VID_CTRL3_REG 0x0a ++#define SP_HPD_OUT BIT(6) ++ ++/* Video Control Register 5 */ ++#define SP_VID_CTRL5_REG 0x0c ++#define SP_CSC_STD_SEL BIT(7) ++#define SP_XVYCC_RNG_LMT BIT(6) ++#define SP_RANGE_Y2R BIT(5) ++#define SP_CSPACE_Y2R BIT(4) ++#define SP_RGB_RNG_LMT BIT(3) ++#define SP_Y_RNG_LMT BIT(2) ++#define SP_RANGE_R2Y BIT(1) ++#define SP_CSPACE_R2Y BIT(0) ++ ++/* Video Control Register 6 */ ++#define SP_VID_CTRL6_REG 0x0d ++#define SP_TEST_PATTERN_EN BIT(7) ++#define SP_VIDEO_PROCESS_EN BIT(6) ++#define SP_VID_US_MODE BIT(3) ++#define SP_VID_DS_MODE BIT(2) ++#define SP_UP_SAMPLE BIT(1) ++#define SP_DOWN_SAMPLE BIT(0) ++ ++/* Video Control Register 8 */ ++#define SP_VID_CTRL8_REG 0x0f ++#define SP_VID_VRES_TH BIT(0) ++ ++/* Total Line Status Low Byte Register */ ++#define SP_TOTAL_LINE_STAL_REG 0x24 ++ ++/* Total Line Status High Byte Register */ ++#define SP_TOTAL_LINE_STAH_REG 0x25 ++ ++/* Active Line Status Low Byte Register */ ++#define SP_ACT_LINE_STAL_REG 0x26 ++ ++/* Active Line Status High Byte Register */ ++#define SP_ACT_LINE_STAH_REG 0x27 ++ ++/* Vertical Front Porch Status Register */ ++#define SP_V_F_PORCH_STA_REG 0x28 ++ ++/* Vertical SYNC Width Status Register */ ++#define SP_V_SYNC_STA_REG 0x29 ++ ++/* Vertical Back Porch Status Register */ ++#define SP_V_B_PORCH_STA_REG 0x2a ++ ++/* Total Pixel Status Low Byte Register */ ++#define SP_TOTAL_PIXEL_STAL_REG 0x2b ++ ++/* Total Pixel Status High Byte Register */ ++#define SP_TOTAL_PIXEL_STAH_REG 0x2c ++ ++/* Active Pixel Status Low Byte Register */ ++#define SP_ACT_PIXEL_STAL_REG 0x2d ++ ++/* Active Pixel Status High Byte Register */ ++#define SP_ACT_PIXEL_STAH_REG 0x2e ++ ++/* Horizontal Front Porch Status Low Byte Register */ ++#define SP_H_F_PORCH_STAL_REG 0x2f ++ ++/* Horizontal Front Porch Statys High Byte Register */ ++#define SP_H_F_PORCH_STAH_REG 0x30 ++ ++/* Horizontal SYNC Width Status Low Byte Register */ ++#define SP_H_SYNC_STAL_REG 0x31 ++ ++/* Horizontal SYNC Width Status High Byte Register */ ++#define SP_H_SYNC_STAH_REG 0x32 ++ ++/* Horizontal Back Porch Status Low Byte Register */ ++#define SP_H_B_PORCH_STAL_REG 0x33 ++ ++/* Horizontal Back Porch Status High Byte Register */ ++#define SP_H_B_PORCH_STAH_REG 0x34 ++ ++/* InfoFrame AVI Packet DB1 Register */ ++#define SP_INFOFRAME_AVI_DB1_REG 0x70 ++ ++/* Bit Control Specific Register */ ++#define SP_BIT_CTRL_SPECIFIC_REG 0x80 ++#define SP_BIT_CTRL_SELECT_SHIFT 1 ++#define SP_ENABLE_BIT_CTRL BIT(0) ++ ++/* InfoFrame Audio Packet DB1 Register */ ++#define SP_INFOFRAME_AUD_DB1_REG 0x83 ++ ++/* InfoFrame MPEG Packet DB1 Register */ ++#define SP_INFOFRAME_MPEG_DB1_REG 0xb0 ++ ++/* Audio Channel Status Registers */ ++#define SP_AUD_CH_STATUS_BASE 0xd0 ++ ++/* Audio Channel Num Register 5 */ ++#define SP_I2S_CHANNEL_NUM_MASK 0xe0 ++# define SP_I2S_CH_NUM_1 (0x00 << 5) ++# define SP_I2S_CH_NUM_2 (0x01 << 5) ++# define SP_I2S_CH_NUM_3 (0x02 << 5) ++# define SP_I2S_CH_NUM_4 (0x03 << 5) ++# define SP_I2S_CH_NUM_5 (0x04 << 5) ++# define SP_I2S_CH_NUM_6 (0x05 << 5) ++# define SP_I2S_CH_NUM_7 (0x06 << 5) ++# define SP_I2S_CH_NUM_8 (0x07 << 5) ++#define SP_EXT_VUCP BIT(2) ++#define SP_VBIT BIT(1) ++#define SP_AUDIO_LAYOUT BIT(0) ++ ++/* Analog Debug Register 2 */ ++#define SP_ANALOG_DEBUG2_REG 0xdd ++#define SP_FORCE_SW_OFF_BYPASS 0x20 ++#define SP_XTAL_FRQ 0x1c ++# define SP_XTAL_FRQ_19M2 (0x00 << 2) ++# define SP_XTAL_FRQ_24M (0x01 << 2) ++# define SP_XTAL_FRQ_25M (0x02 << 2) ++# define SP_XTAL_FRQ_26M (0x03 << 2) ++# define SP_XTAL_FRQ_27M (0x04 << 2) ++# define SP_XTAL_FRQ_38M4 (0x05 << 2) ++# define SP_XTAL_FRQ_52M (0x06 << 2) ++#define SP_POWERON_TIME_1P5MS 0x03 ++ ++/* Analog Control 0 Register */ ++#define SP_ANALOG_CTRL0_REG 0xe1 ++ ++/* Common Interrupt Status Register 1 */ ++#define SP_COMMON_INT_STATUS_BASE (0xf1 - 1) ++#define SP_PLL_LOCK_CHG 0x40 ++ ++/* Common Interrupt Status Register 2 */ ++#define SP_COMMON_INT_STATUS2 0xf2 ++#define SP_HDCP_AUTH_CHG BIT(1) ++#define SP_HDCP_AUTH_DONE BIT(0) ++ ++#define SP_HDCP_LINK_CHECK_FAIL BIT(0) ++ ++/* Common Interrupt Status Register 4 */ ++#define SP_COMMON_INT_STATUS4_REG 0xf4 ++#define SP_HPD_IRQ BIT(6) ++#define SP_HPD_ESYNC_ERR BIT(4) ++#define SP_HPD_CHG BIT(2) ++#define SP_HPD_LOST BIT(1) ++#define SP_HPD_PLUG BIT(0) ++ ++/* DP Interrupt Status Register */ ++#define SP_DP_INT_STATUS1_REG 0xf7 ++#define SP_TRAINING_FINISH BIT(5) ++#define SP_POLLING_ERR BIT(4) ++ ++/* Common Interrupt Mask Register */ ++#define SP_COMMON_INT_MASK_BASE (0xf8 - 1) ++ ++#define SP_COMMON_INT_MASK4_REG 0xfb ++ ++/* DP Interrupts Mask Register */ ++#define SP_DP_INT_MASK1_REG 0xfe ++ ++/* Interrupt Control Register */ ++#define SP_INT_CTRL_REG 0xff ++ ++/***************************************************************/ ++/* Register definitions for TX_P1 */ ++/***************************************************************/ ++ ++/* DP TX Link Training Control Register */ ++#define SP_DP_TX_LT_CTRL0_REG 0x30 ++ ++/* PD 1.2 Lint Training 80bit Pattern Register */ ++#define SP_DP_LT_80BIT_PATTERN0_REG 0x80 ++#define SP_DP_LT_80BIT_PATTERN_REG_NUM 10 ++ ++/* Audio Interface Control Register 0 */ ++#define SP_AUD_INTERFACE_CTRL0_REG 0x5f ++#define SP_AUD_INTERFACE_DISABLE 0x80 ++ ++/* Audio Interface Control Register 2 */ ++#define SP_AUD_INTERFACE_CTRL2_REG 0x60 ++#define SP_M_AUD_ADJUST_ST 0x04 ++ ++/* Audio Interface Control Register 3 */ ++#define SP_AUD_INTERFACE_CTRL3_REG 0x62 ++ ++/* Audio Interface Control Register 4 */ ++#define SP_AUD_INTERFACE_CTRL4_REG 0x67 ++ ++/* Audio Interface Control Register 5 */ ++#define SP_AUD_INTERFACE_CTRL5_REG 0x68 ++ ++/* Audio Interface Control Register 6 */ ++#define SP_AUD_INTERFACE_CTRL6_REG 0x69 ++ ++/* Firmware Version Register */ ++#define SP_FW_VER_REG 0xb7 ++ ++#endif +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0127-drm-bridge-split-some-definitions-of-ANX78xx-to-dedi.patch b/patch/kernel/sunxi-current/0002-split_some_definitions_of_ANX78xx_to_dedicated_headers.patch similarity index 93% rename from patch/kernel/sunxi-current/0127-drm-bridge-split-some-definitions-of-ANX78xx-to-dedi.patch rename to patch/kernel/sunxi-current/0002-split_some_definitions_of_ANX78xx_to_dedicated_headers.patch index 03b3802464..0ce5de57d1 100644 --- a/patch/kernel/sunxi-current/0127-drm-bridge-split-some-definitions-of-ANX78xx-to-dedi.patch +++ b/patch/kernel/sunxi-current/0002-split_some_definitions_of_ANX78xx_to_dedicated_headers.patch @@ -1,8 +1,7 @@ -From d369162154e5d904c62ed6275ec71d8c2cbcb024 Mon Sep 17 00:00:00 2001 +From ad9301a2a36b5ecc0152a97cb79a53e3765fb72b Mon Sep 17 00:00:00 2001 From: Icenowy Zheng -Date: Thu, 18 Oct 2018 15:33:20 +0800 -Subject: [PATCH 127/146] drm/bridge: split some definitions of ANX78xx to - dedicated headers +Date: Tue, 29 Oct 2019 13:16:57 +0100 +Subject: drm/bridge: split some definitions of ANX78xx to dedicated headers Some definitions currently in analogix-anx78xx.h are not restricted to the ANX78xx series, but also applicable to other DisplayPort @@ -12,39 +11,41 @@ Split out them to dedicated headers, and make analogix-anx78xx.h include them. Signed-off-by: Icenowy Zheng +Signed-off-by: Vasily Khoruzhick +Signed-off-by: Torsten Duwe +Reviewed-by: Andrzej Hajda +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20191107135212.4D41E68BE1@verein.lst.de --- - .../drm/bridge/analogix/analogix-anx78xx.h | 464 +----------------- - .../drm/bridge/analogix/analogix-i2c-dptx.h | 248 ++++++++++ - .../bridge/analogix/analogix-i2c-txcommon.h | 237 +++++++++ - 3 files changed, 490 insertions(+), 459 deletions(-) + drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h | 460 +-------------------- + .../gpu/drm/bridge/analogix/analogix-i2c-dptx.h | 245 +++++++++++ + .../drm/bridge/analogix/analogix-i2c-txcommon.h | 231 +++++++++++ + 3 files changed, 479 insertions(+), 457 deletions(-) create mode 100644 drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h create mode 100644 drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h +(limited to 'drivers/gpu/drm/bridge/analogix') + diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h -index 38753c870137..8aa1eca306d3 100644 +index 55d6c2109740..db2a2725acb2 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h -@@ -15,9 +15,12 @@ +@@ -6,6 +6,9 @@ #ifndef __ANX78xx_H #define __ANX78xx_H --#define TX_P0 0x70 +#include "analogix-i2c-dptx.h" +#include "analogix-i2c-txcommon.h" + -+#define TX_P0 ANALOGIX_I2C_DPTX - #define TX_P1 0x7a --#define TX_P2 0x72 -+#define TX_P2 ANALOGIX_I2C_TXCOMMON - - #define RX_P0 0x7e - #define RX_P1 0x80 -@@ -225,463 +228,6 @@ + /***************************************************************/ + /* Register definitions for RX_PO */ + /***************************************************************/ +@@ -209,463 +212,6 @@ #define SP_CLEAR_AVMUTE BIT(4) #define SP_SET_AVMUTE BIT(0) -/***************************************************************/ --/* Register definition of device address 0x70 */ +-/* Register definitions for TX_P0 */ -/***************************************************************/ - -/* HDCP Status Register */ @@ -278,7 +279,7 @@ index 38753c870137..8aa1eca306d3 100644 -#define SP_DP_BUF_DATA0_REG 0xf0 - -/***************************************************************/ --/* Register definition of device address 0x72 */ +-/* Register definitions for TX_P2 */ -/***************************************************************/ - -/* @@ -501,29 +502,26 @@ index 38753c870137..8aa1eca306d3 100644 -#define SP_INT_CTRL_REG 0xff - /***************************************************************/ - /* Register definition of device address 0x7a */ + /* Register definitions for TX_P1 */ /***************************************************************/ diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h new file mode 100644 -index 000000000000..bc0831b127bf +index 000000000000..4777e48c87a9 --- /dev/null +++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h -@@ -0,0 +1,248 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ +@@ -0,0 +1,245 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ +/* -+ * Copyright(c) 2017 Icenowy Zheng ++ * Copyright(c) 2016, Analogix Semiconductor. + * -+ * Based on analogix-anx78xx.h, which is: -+ * Copyright(c) 2016, Analogix Semiconductor. All rights reserved. ++ * Based on anx7808 driver obtained from chromeos with copyright: ++ * Copyright(c) 2013, Google Inc. + */ -+ +#ifndef _ANALOGIX_I2C_DPTX_H_ +#define _ANALOGIX_I2C_DPTX_H_ + -+#define ANALOGIX_I2C_DPTX 0x70 -+ +/***************************************************************/ -+/* Register definition of device address 0x70 */ ++/* Register definitions for TX_P0 */ +/***************************************************************/ + +/* HDCP Status Register */ @@ -759,25 +757,19 @@ index 000000000000..bc0831b127bf +#endif diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h b/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h new file mode 100644 -index 000000000000..7d683573e970 +index 000000000000..677e78fb862f --- /dev/null +++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h -@@ -0,0 +1,237 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ +@@ -0,0 +1,231 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ +/* -+ * Copyright(c) 2017 Icenowy Zheng -+ * -+ * Based on analogix-anx78xx.h, which is: -+ * Copyright(c) 2016, Analogix Semiconductor. All rights reserved. ++ * Copyright(c) 2016, Analogix Semiconductor. All rights reserved. + */ -+ +#ifndef _ANALOGIX_I2C_TXCOMMON_H_ +#define _ANALOGIX_I2C_TXCOMMON_H_ + -+#define ANALOGIX_I2C_TXCOMMON 0x72 -+ +/***************************************************************/ -+/* Register definition of device address 0x72 */ ++/* Register definitions for TX_P2 */ +/***************************************************************/ + +/* @@ -1001,5 +993,5 @@ index 000000000000..7d683573e970 + +#endif /* _ANALOGIX_I2C_TXCOMMON_H_ */ -- -2.17.1 +cgit 1.2-0.3.lf.el7 diff --git a/patch/kernel/sunxi-current/0128-drm-bridge-extract-some-Analogix-I2C-DP-common-code.patch b/patch/kernel/sunxi-current/0003-extract_some_Analogix_I2C_DP_common_code.patch similarity index 74% rename from patch/kernel/sunxi-current/0128-drm-bridge-extract-some-Analogix-I2C-DP-common-code.patch rename to patch/kernel/sunxi-current/0003-extract_some_Analogix_I2C_DP_common_code.patch index 08c54137b2..898bafb2e3 100644 --- a/patch/kernel/sunxi-current/0128-drm-bridge-extract-some-Analogix-I2C-DP-common-code.patch +++ b/patch/kernel/sunxi-current/0003-extract_some_Analogix_I2C_DP_common_code.patch @@ -1,63 +1,51 @@ -From d1f75332d44f26e734985493c134a727c79cb1f1 Mon Sep 17 00:00:00 2001 +From 0712eca92c3e6611ec4dc1bc127a30d3882c4336 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng -Date: Thu, 18 Oct 2018 15:33:21 +0800 -Subject: [PATCH 128/146] drm/bridge: extract some Analogix I2C DP common code +Date: Tue, 29 Oct 2019 13:16:57 +0100 +Subject: drm/bridge: extract some Analogix I2C DP common code Some code can be shared within different DP bridges by Analogix. - -Extract them to a new module. +Extract them to analogix_dp. Signed-off-by: Icenowy Zheng +Signed-off-by: Vasily Khoruzhick +Signed-off-by: Torsten Duwe +Reviewed-by: Andrzej Hajda +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20191107135214.966BD68BFE@verein.lst.de --- - drivers/gpu/drm/bridge/analogix/Kconfig | 4 + - drivers/gpu/drm/bridge/analogix/Makefile | 2 + - .../drm/bridge/analogix/analogix-anx78xx.c | 146 +-------------- - .../drm/bridge/analogix/analogix-i2c-dptx.c | 169 ++++++++++++++++++ - .../drm/bridge/analogix/analogix-i2c-dptx.h | 2 + - 5 files changed, 178 insertions(+), 145 deletions(-) + drivers/gpu/drm/bridge/analogix/Makefile | 2 +- + drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 146 +----------------- + .../gpu/drm/bridge/analogix/analogix-i2c-dptx.c | 165 +++++++++++++++++++++ + .../gpu/drm/bridge/analogix/analogix-i2c-dptx.h | 3 + + 4 files changed, 170 insertions(+), 146 deletions(-) create mode 100644 drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c -diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig -index 27b37aa2ea77..eb893b465dd8 100644 ---- a/drivers/gpu/drm/bridge/analogix/Kconfig -+++ b/drivers/gpu/drm/bridge/analogix/Kconfig -@@ -2,8 +2,12 @@ config DRM_ANALOGIX_DP - tristate - depends on DRM - -+config DRM_ANALOGIX_DP_I2C -+ tristate -+ - config DRM_ANALOGIX_ANX78XX - tristate "Analogix ANX78XX bridge" -+ select DRM_ANALOGIX_DP_I2C - select DRM_KMS_HELPER - select REGMAP_I2C - ---help--- +(limited to 'drivers/gpu/drm/bridge/analogix') + diff --git a/drivers/gpu/drm/bridge/analogix/Makefile b/drivers/gpu/drm/bridge/analogix/Makefile -index eb41be845055..c37e2ded8ce3 100644 +index 6fcbfd3ee560..7623b9b80167 100644 --- a/drivers/gpu/drm/bridge/analogix/Makefile +++ b/drivers/gpu/drm/bridge/analogix/Makefile -@@ -1,3 +1,5 @@ - analogix_dp-objs := analogix_dp_core.o analogix_dp_reg.o -+analogix_dp_i2c-objs := analogix-i2c-dptx.o - obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp.o -+obj-$(CONFIG_DRM_ANALOGIX_DP_I2C) += analogix_dp_i2c.o +@@ -1,4 +1,4 @@ + # SPDX-License-Identifier: GPL-2.0-only +-analogix_dp-objs := analogix_dp_core.o analogix_dp_reg.o ++analogix_dp-objs := analogix_dp_core.o analogix_dp_reg.o analogix-i2c-dptx.o obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o + obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp.o diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c -index f8433c93f463..bf8291d0ddd0 100644 +index 274989f96a91..41867be03751 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c -@@ -45,8 +45,6 @@ +@@ -36,8 +36,6 @@ #define I2C_IDX_RX_P1 4 #define XTAL_CLK 270 /* 27M */ -#define AUX_CH_BUFFER_SIZE 16 -#define AUX_WAIT_TIMEOUT_MS 15 - static const u8 anx78xx_i2c_addresses[] = { - [I2C_IDX_TX_P0] = TX_P0, -@@ -109,153 +107,11 @@ static int anx78xx_clear_bits(struct regmap *map, u8 reg, u8 mask) + static const u8 anx7808_i2c_addresses[] = { + [I2C_IDX_TX_P0] = 0x78, +@@ -107,153 +105,11 @@ static int anx78xx_clear_bits(struct regmap *map, u8 reg, u8 mask) return regmap_update_bits(map, reg, mask, 0); } @@ -208,42 +196,40 @@ index f8433c93f463..bf8291d0ddd0 100644 - return err; - - return msg->size; -+ return anx_aux_transfer(anx78xx->map[I2C_IDX_TX_P0], msg); ++ return anx_dp_aux_transfer(anx78xx->map[I2C_IDX_TX_P0], msg); } static int anx78xx_set_hpd(struct anx78xx *anx78xx) diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c new file mode 100644 -index 000000000000..9cb30962032e +index 000000000000..60707bb5afe7 --- /dev/null +++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c -@@ -0,0 +1,169 @@ -+// SPDX-License-Identifier: GPL-2.0 +@@ -0,0 +1,165 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ +/* -+ * Copyright(c) 2017 Icenowy Zheng ++ * Copyright(c) 2016, Analogix Semiconductor. + * -+ * Based on analogix-anx78xx.c, which is: -+ * Copyright(c) 2016, Analogix Semiconductor. All rights reserved. ++ * Based on anx7808 driver obtained from chromeos with copyright: ++ * Copyright(c) 2013, Google Inc. + */ -+ -+#include +#include + +#include -+#include +#include ++#include + +#include "analogix-i2c-dptx.h" + +#define AUX_WAIT_TIMEOUT_MS 15 +#define AUX_CH_BUFFER_SIZE 16 + -+static int anx_clear_bits(struct regmap *map, u8 reg, u8 mask) ++static int anx_i2c_dp_clear_bits(struct regmap *map, u8 reg, u8 mask) +{ + return regmap_update_bits(map, reg, mask, 0); +} + -+static bool anx_aux_op_finished(struct regmap *map_dptx) ++static bool anx_dp_aux_op_finished(struct regmap *map_dptx) +{ + unsigned int value; + int err; @@ -255,7 +241,7 @@ index 000000000000..9cb30962032e + return (value & SP_AUX_EN) == 0; +} + -+static int anx_aux_wait(struct regmap *map_dptx) ++static int anx_dp_aux_wait(struct regmap *map_dptx) +{ + unsigned long timeout; + unsigned int status; @@ -263,9 +249,9 @@ index 000000000000..9cb30962032e + + timeout = jiffies + msecs_to_jiffies(AUX_WAIT_TIMEOUT_MS) + 1; + -+ while (!anx_aux_op_finished(map_dptx)) { ++ while (!anx_dp_aux_op_finished(map_dptx)) { + if (time_after(jiffies, timeout)) { -+ if (!anx_aux_op_finished(map_dptx)) { ++ if (!anx_dp_aux_op_finished(map_dptx)) { + DRM_ERROR("Timed out waiting AUX to finish\n"); + return -ETIMEDOUT; + } @@ -292,7 +278,7 @@ index 000000000000..9cb30962032e + return 0; +} + -+static int anx_aux_address(struct regmap *map_dptx, unsigned int addr) ++static int anx_dp_aux_address(struct regmap *map_dptx, unsigned int addr) +{ + int err; + @@ -320,7 +306,8 @@ index 000000000000..9cb30962032e + return 0; +} + -+ssize_t anx_aux_transfer(struct regmap *map_dptx, struct drm_dp_aux_msg *msg) ++ssize_t anx_dp_aux_transfer(struct regmap *map_dptx, ++ struct drm_dp_aux_msg *msg) +{ + u8 ctrl1 = msg->request; + u8 ctrl2 = SP_AUX_EN; @@ -347,7 +334,7 @@ index 000000000000..9cb30962032e + } + + /* Write address and request */ -+ err = anx_aux_address(map_dptx, msg->address); ++ err = anx_dp_aux_address(map_dptx, msg->address); + if (err) + return err; + @@ -361,7 +348,7 @@ index 000000000000..9cb30962032e + if (err) + return err; + -+ err = anx_aux_wait(map_dptx); ++ err = anx_dp_aux_wait(map_dptx); + if (err) + return err; + @@ -376,28 +363,26 @@ index 000000000000..9cb30962032e + return err; + } + -+ err = anx_clear_bits(map_dptx, SP_DP_AUX_CH_CTRL2_REG, SP_ADDR_ONLY); ++ err = anx_i2c_dp_clear_bits(map_dptx, SP_DP_AUX_CH_CTRL2_REG, ++ SP_ADDR_ONLY); + if (err) + return err; + + return msg->size; +} -+EXPORT_SYMBOL(anx_aux_transfer); -+ -+MODULE_DESCRIPTION("Analogix DisplayPort Transmitter common code"); -+MODULE_AUTHOR("Icenowy Zheng "); -+MODULE_LICENSE("GPL v2"); ++EXPORT_SYMBOL_GPL(anx_dp_aux_transfer); diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h -index bc0831b127bf..c2ca854613a0 100644 +index 4777e48c87a9..db24f7290461 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h +++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h -@@ -245,4 +245,6 @@ +@@ -242,4 +242,7 @@ /* DP AUX Buffer Data Registers */ #define SP_DP_BUF_DATA0_REG 0xf0 -+ssize_t anx_aux_transfer(struct regmap *map_dptx, struct drm_dp_aux_msg *msg); ++ssize_t anx_dp_aux_transfer(struct regmap *map_dptx, ++ struct drm_dp_aux_msg *msg); + #endif -- -2.17.1 +cgit 1.2-0.3.lf.el7 diff --git a/patch/kernel/sunxi-current/0004-prepare-analogix-support.patch b/patch/kernel/sunxi-current/0004-prepare-analogix-support.patch new file mode 100644 index 0000000000..90a2b4b8d6 --- /dev/null +++ b/patch/kernel/sunxi-current/0004-prepare-analogix-support.patch @@ -0,0 +1,86 @@ +From dea73d61466e4f09c8184f7bb5375975878645b3 Mon Sep 17 00:00:00 2001 +From: Torsten Duwe +Date: Tue, 29 Oct 2019 13:16:57 +0100 +Subject: drm/bridge: Prepare Analogix anx6345 support + +Add bit definitions required for the anx6345 and add a +sanity check in anx_dp_aux_transfer. + +Signed-off-by: Icenowy Zheng +Signed-off-by: Vasily Khoruzhick +Signed-off-by: Torsten Duwe +Reviewed-by: Andrzej Hajda +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20191107135218.01C2168C4E@verein.lst.de +--- + drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c | 2 +- + drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h | 8 ++++++++ + drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h | 3 +++ + 3 files changed, 12 insertions(+), 1 deletion(-) + +(limited to 'drivers/gpu/drm/bridge/analogix') + +diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c +index 60707bb5afe7..fe40bab21530 100644 +--- a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c ++++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c +@@ -116,7 +116,7 @@ ssize_t anx_dp_aux_transfer(struct regmap *map_dptx, + else /* For non-zero-sized set the length field. */ + ctrl1 |= (msg->size - 1) << SP_AUX_LENGTH_SHIFT; + +- if ((msg->request & DP_AUX_I2C_READ) == 0) { ++ if ((msg->size > 0) && ((msg->request & DP_AUX_I2C_READ) == 0)) { + /* When WRITE | MOT write values to data buffer */ + err = regmap_bulk_write(map_dptx, + SP_DP_BUF_DATA0_REG, buffer, +diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h +index db24f7290461..663c4bea6e70 100644 +--- a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h ++++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h +@@ -72,7 +72,11 @@ + #define SP_CHA_STA BIT(2) + /* Bits for DP System Control Register 3 */ + #define SP_HPD_STATUS BIT(6) ++#define SP_HPD_FORCE BIT(5) ++#define SP_HPD_CTRL BIT(4) + #define SP_STRM_VALID BIT(2) ++#define SP_STRM_FORCE BIT(1) ++#define SP_STRM_CTRL BIT(0) + /* Bits for DP System Control Register 4 */ + #define SP_ENHANCED_MODE BIT(3) + +@@ -117,6 +121,9 @@ + #define SP_LINK_BW_SET_MASK 0x1f + #define SP_INITIAL_SLIM_M_AUD_SEL BIT(5) + ++/* DP Lane Count Setting Register */ ++#define SP_DP_LANE_COUNT_SET_REG 0xa1 ++ + /* DP Training Pattern Set Register */ + #define SP_DP_TRAINING_PATTERN_SET_REG 0xa2 + +@@ -130,6 +137,7 @@ + + /* DP Link Training Control Register */ + #define SP_DP_LT_CTRL_REG 0xa8 ++#define SP_DP_LT_INPROGRESS 0x80 + #define SP_LT_ERROR_TYPE_MASK 0x70 + # define SP_LT_NO_ERROR 0x00 + # define SP_LT_AUX_WRITE_ERROR 0x01 +diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h b/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h +index 677e78fb862f..3c843497d835 100644 +--- a/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h ++++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h +@@ -177,6 +177,9 @@ + #define SP_VBIT BIT(1) + #define SP_AUDIO_LAYOUT BIT(0) + ++/* Analog Debug Register 1 */ ++#define SP_ANALOG_DEBUG1_REG 0xdc ++ + /* Analog Debug Register 2 */ + #define SP_ANALOG_DEBUG2_REG 0xdd + #define SP_FORCE_SW_OFF_BYPASS 0x20 +-- +cgit 1.2-0.3.lf.el7 + diff --git a/patch/kernel/sunxi-current/0130-drm-bridge-Add-Analogix-anx6345-support.patch b/patch/kernel/sunxi-current/0005-add_nalogix_anx6345_support.patch similarity index 62% rename from patch/kernel/sunxi-current/0130-drm-bridge-Add-Analogix-anx6345-support.patch rename to patch/kernel/sunxi-current/0005-add_nalogix_anx6345_support.patch index fd3920124b..9eeed04071 100644 --- a/patch/kernel/sunxi-current/0130-drm-bridge-Add-Analogix-anx6345-support.patch +++ b/patch/kernel/sunxi-current/0005-add_nalogix_anx6345_support.patch @@ -1,36 +1,37 @@ -From 2da065ab8aa3f562a02dfd3df4ad971d1229b136 Mon Sep 17 00:00:00 2001 +From 6aa192698089b450b06d609355fc9c82c07856d2 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng -Date: Thu, 18 Oct 2018 15:33:23 +0800 -Subject: [PATCH 130/146] drm/bridge: Add Analogix anx6345 support +Date: Tue, 29 Oct 2019 13:16:57 +0100 +Subject: drm/bridge: Add Analogix anx6345 support The ANX6345 is an ultra-low power DisplayPower/eDP transmitter designed for portable devices. This driver adds initial support for RGB to eDP -mode, without HPD and interrupts, but with possibility to inject EDID. +mode, without HPD and interrupts. + This is a configuration usually seen in eDP applications. Signed-off-by: Icenowy Zheng +Signed-off-by: Vasily Khoruzhick +Signed-off-by: Torsten Duwe +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20191107135220.590D968BFE@verein.lst.de --- - drivers/gpu/drm/bridge/analogix/Kconfig | 11 + - drivers/gpu/drm/bridge/analogix/Makefile | 1 + - .../drm/bridge/analogix/analogix-anx6345.c | 862 ++++++++++++++++++ - .../drm/bridge/analogix/analogix-i2c-dptx.c | 2 +- - .../drm/bridge/analogix/analogix-i2c-dptx.h | 8 + - .../bridge/analogix/analogix-i2c-txcommon.h | 3 + - 6 files changed, 886 insertions(+), 1 deletion(-) + drivers/gpu/drm/bridge/analogix/Kconfig | 12 + + drivers/gpu/drm/bridge/analogix/Makefile | 1 + + drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 793 +++++++++++++++++++++ + 3 files changed, 806 insertions(+) create mode 100644 drivers/gpu/drm/bridge/analogix/analogix-anx6345.c +(limited to 'drivers/gpu/drm/bridge/analogix') + diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig -index eb893b465dd8..784ddca83b47 100644 +index 29ba1b21019e..1425a96a28c3 100644 --- a/drivers/gpu/drm/bridge/analogix/Kconfig +++ b/drivers/gpu/drm/bridge/analogix/Kconfig -@@ -15,3 +15,14 @@ config DRM_ANALOGIX_ANX78XX - designed for portable devices. The ANX78XX transforms - the HDMI output of an application processor to MyDP - or DisplayPort. -+ +@@ -1,6 +1,18 @@ + # SPDX-License-Identifier: GPL-2.0-only +config DRM_ANALOGIX_ANX6345 + tristate "Analogix ANX6345 bridge" -+ select DRM_ANALOGIX_DP_I2C ++ select DRM_ANALOGIX_DP + select DRM_KMS_HELPER + select REGMAP_I2C + help @@ -38,71 +39,73 @@ index eb893b465dd8..784ddca83b47 100644 + transmitter designed for portable devices. The + ANX6345 transforms the LVTTL RGB output of an + application processor to eDP or DisplayPort. ++ + config DRM_ANALOGIX_ANX78XX + tristate "Analogix ANX78XX bridge" ++ select DRM_ANALOGIX_DP + select DRM_KMS_HELPER + select REGMAP_I2C + help diff --git a/drivers/gpu/drm/bridge/analogix/Makefile b/drivers/gpu/drm/bridge/analogix/Makefile -index c37e2ded8ce3..3af9feab6e17 100644 +index 7623b9b80167..97669b374098 100644 --- a/drivers/gpu/drm/bridge/analogix/Makefile +++ b/drivers/gpu/drm/bridge/analogix/Makefile -@@ -3,3 +3,4 @@ analogix_dp_i2c-objs := analogix-i2c-dptx.o - obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp.o - obj-$(CONFIG_DRM_ANALOGIX_DP_I2C) += analogix_dp_i2c.o - obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o +@@ -1,4 +1,5 @@ + # SPDX-License-Identifier: GPL-2.0-only + analogix_dp-objs := analogix_dp_core.o analogix_dp_reg.o analogix-i2c-dptx.o +obj-$(CONFIG_DRM_ANALOGIX_ANX6345) += analogix-anx6345.o + obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o + obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp.o diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c new file mode 100644 -index 000000000000..81676407aa6d +index 000000000000..4574d6b264de --- /dev/null +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c -@@ -0,0 +1,863 @@ -+// SPDX-License-Identifier: GPL-2.0 +@@ -0,0 +1,793 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ +/* -+ * Copyright(c) Icenowy Zheng -+ * Based on analogix-anx6345.c, which is: -+ * Copyright(c) 2016, Analogix Semiconductor. ++ * Copyright(c) 2016, Analogix Semiconductor. ++ * Copyright(c) 2017, Icenowy Zheng ++ * ++ * Based on anx7808 driver obtained from chromeos with copyright: ++ * Copyright(c) 2013, Google Inc. + */ +#include +#include -+#include ++#include +#include ++#include +#include +#include -+#include +#include +#include -+#include -+#include +#include ++#include + -+#include +#include +#include +#include -+#include +#include +#include ++#include ++#include ++#include ++#include + +#include "analogix-i2c-dptx.h" +#include "analogix-i2c-txcommon.h" + -+#define I2C_NUM_ADDRESSES 2 -+#define I2C_IDX_DPTX 0 -+#define I2C_IDX_TXCOM 1 -+ -+#define XTAL_CLK 270 /* 27M */ -+ +#define POLL_DELAY 50000 /* us */ +#define POLL_TIMEOUT 5000000 /* us */ + -+static const u8 anx6345_i2c_addresses[] = { -+ [I2C_IDX_DPTX] = ANALOGIX_I2C_DPTX, -+ [I2C_IDX_TXCOM] = ANALOGIX_I2C_TXCOMMON, -+}; ++#define I2C_IDX_DPTX 0 ++#define I2C_IDX_TXCOM 1 + -+struct anx6345_platform_data { -+ struct regulator *dvdd12; -+ struct regulator *dvdd25; -+ struct regulator *vcc_panel; -+ struct gpio_desc *gpiod_reset; ++static const u8 anx6345_i2c_addresses[] = { ++ [I2C_IDX_DPTX] = 0x70, ++ [I2C_IDX_TXCOM] = 0x72, +}; ++#define I2C_NUM_ADDRESSES ARRAY_SIZE(anx6345_i2c_addresses) + +struct anx6345 { + struct drm_dp_aux aux; @@ -111,12 +114,13 @@ index 000000000000..81676407aa6d + struct edid *edid; + struct drm_connector connector; + struct drm_dp_link link; -+ struct anx6345_platform_data pdata; -+ struct mutex lock; ++ struct drm_panel *panel; ++ struct regulator *dvdd12; ++ struct regulator *dvdd25; ++ struct gpio_desc *gpiod_reset; ++ struct mutex lock; /* protect EDID access */ + -+ /* -+ * I2C Slave addresses of ANX6345 are mapped as DPTX and SYS -+ */ ++ /* I2C Slave addresses of ANX6345 are mapped as DPTX and SYS */ + struct i2c_client *i2c_clients[I2C_NUM_ADDRESSES]; + struct regmap *map[I2C_NUM_ADDRESSES]; + @@ -151,7 +155,7 @@ index 000000000000..81676407aa6d +{ + struct anx6345 *anx6345 = container_of(aux, struct anx6345, aux); + -+ return anx_aux_transfer(anx6345->map[I2C_IDX_DPTX], msg); ++ return anx_dp_aux_transfer(anx6345->map[I2C_IDX_DPTX], msg); +} + +static int anx6345_dp_link_training(struct anx6345 *anx6345) @@ -277,21 +281,17 @@ index 000000000000..81676407aa6d + if (err) + return err; + -+ err = regmap_read_poll_timeout(anx6345->map[I2C_IDX_DPTX], ++ return regmap_read_poll_timeout(anx6345->map[I2C_IDX_DPTX], + SP_DP_LT_CTRL_REG, + value, !(value & SP_DP_LT_INPROGRESS), + POLL_DELAY, POLL_TIMEOUT); -+ if (err) -+ return err; -+ -+ return 0; +} + +static int anx6345_tx_initialization(struct anx6345 *anx6345) +{ + int err, i; + -+ /* FIXME: hardcode color depth now */ ++ /* FIXME: colordepth is hardcoded for now */ + err = regmap_write(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL2_REG, + SP_IN_BPC_6BIT << SP_IN_BPC_SHIFT); + if (err) @@ -338,61 +338,41 @@ index 000000000000..81676407aa6d + if (err) + return err; + -+ err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM], ++ return anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM], + SP_RESET_CTRL2_REG, SP_AUX_RST); -+ if (err) -+ return err; -+ -+ err = anx6345_dp_link_training(anx6345); -+ if (err) -+ return err; -+ -+ return 0; +} + +static void anx6345_poweron(struct anx6345 *anx6345) +{ -+ struct anx6345_platform_data *pdata = &anx6345->pdata; + int err; + -+ if (WARN_ON(anx6345->powered)) -+ return; -+ -+ if (pdata->dvdd12) { -+ err = regulator_enable(pdata->dvdd12); -+ if (err) { -+ DRM_ERROR("Failed to enable DVDD12 regulator: %d\n", -+ err); -+ return; -+ } -+ -+ usleep_range(1000, 2000); -+ } -+ -+ if (pdata->dvdd25) { -+ err = regulator_enable(pdata->dvdd25); -+ if (err) { -+ DRM_ERROR("Failed to enable DVDD25 regulator: %d\n", -+ err); -+ return; -+ } -+ -+ usleep_range(5000, 10000); -+ } -+ -+ if (pdata->vcc_panel) { -+ err = regulator_enable(pdata->vcc_panel); -+ if (err) { -+ DRM_ERROR("Failed to enable panel regulator: %d\n", -+ err); -+ return; -+ } -+ } -+ -+ gpiod_set_value_cansleep(pdata->gpiod_reset, 0); ++ /* Ensure reset is asserted before starting power on sequence */ ++ gpiod_set_value_cansleep(anx6345->gpiod_reset, 1); + usleep_range(1000, 2000); + -+ gpiod_set_value_cansleep(pdata->gpiod_reset, 1); ++ err = regulator_enable(anx6345->dvdd12); ++ if (err) { ++ DRM_ERROR("Failed to enable dvdd12 regulator: %d\n", ++ err); ++ return; ++ } ++ ++ /* T1 - delay between VDD12 and VDD25 should be 0-2ms */ ++ usleep_range(1000, 2000); ++ ++ err = regulator_enable(anx6345->dvdd25); ++ if (err) { ++ DRM_ERROR("Failed to enable dvdd25 regulator: %d\n", ++ err); ++ return; ++ } ++ ++ /* T2 - delay between RESETN and all power rail stable, ++ * should be 2-5ms ++ */ ++ usleep_range(2000, 5000); ++ ++ gpiod_set_value_cansleep(anx6345->gpiod_reset, 0); + + /* Power on registers module */ + anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG, @@ -400,50 +380,39 @@ index 000000000000..81676407aa6d + anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG, + SP_REGISTER_PD | SP_TOTAL_PD); + ++ if (anx6345->panel) ++ drm_panel_prepare(anx6345->panel); ++ + anx6345->powered = true; +} + +static void anx6345_poweroff(struct anx6345 *anx6345) +{ -+ struct anx6345_platform_data *pdata = &anx6345->pdata; + int err; + -+ if (WARN_ON(!anx6345->powered)) -+ return; -+ -+ gpiod_set_value_cansleep(pdata->gpiod_reset, 1); ++ gpiod_set_value_cansleep(anx6345->gpiod_reset, 1); + usleep_range(1000, 2000); + -+ if (pdata->vcc_panel) { -+ err = regulator_disable(pdata->vcc_panel); -+ if (err) { -+ DRM_ERROR("Failed to disable panel regulator: %d\n", -+ err); -+ return; -+ } ++ if (anx6345->panel) ++ drm_panel_unprepare(anx6345->panel); ++ ++ err = regulator_disable(anx6345->dvdd25); ++ if (err) { ++ DRM_ERROR("Failed to disable dvdd25 regulator: %d\n", ++ err); ++ return; + } + -+ if (pdata->dvdd25) { -+ err = regulator_disable(pdata->dvdd25); -+ if (err) { -+ DRM_ERROR("Failed to disable DVDD25 regulator: %d\n", -+ err); -+ return; -+ } ++ usleep_range(5000, 10000); + -+ usleep_range(5000, 10000); ++ err = regulator_disable(anx6345->dvdd12); ++ if (err) { ++ DRM_ERROR("Failed to disable dvdd12 regulator: %d\n", ++ err); ++ return; + } + -+ if (pdata->dvdd12) { -+ err = regulator_disable(pdata->dvdd12); -+ if (err) { -+ DRM_ERROR("Failed to disable DVDD12 regulator: %d\n", -+ err); -+ return; -+ } -+ -+ usleep_range(1000, 2000); -+ } ++ usleep_range(1000, 2000); + + anx6345->powered = false; +} @@ -457,13 +426,21 @@ index 000000000000..81676407aa6d + + /* Power on needed modules */ + err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM], -+ SP_POWERDOWN_CTRL_REG, -+ SP_VIDEO_PD | SP_LINK_PD); ++ SP_POWERDOWN_CTRL_REG, ++ SP_VIDEO_PD | SP_LINK_PD); + + err = anx6345_tx_initialization(anx6345); + if (err) { -+ DRM_ERROR("Failed transmitter initialization: %d\n", err); -+ goto err_poweroff; ++ DRM_ERROR("Failed eDP transmitter initialization: %d\n", err); ++ anx6345_poweroff(anx6345); ++ return err; ++ } ++ ++ err = anx6345_dp_link_training(anx6345); ++ if (err) { ++ DRM_ERROR("Failed link training: %d\n", err); ++ anx6345_poweroff(anx6345); ++ return err; + } + + /* @@ -473,44 +450,6 @@ index 000000000000..81676407aa6d + usleep_range(10000, 15000); + + return 0; -+ -+err_poweroff: -+ DRM_ERROR("Failed DisplayPort transmitter initialization: %d\n", err); -+ anx6345_poweroff(anx6345); -+ -+ return err; -+} -+ -+static int anx6345_init_pdata(struct anx6345 *anx6345) -+{ -+ struct anx6345_platform_data *pdata = &anx6345->pdata; -+ struct device *dev = &anx6345->client->dev; -+ -+ /* 1.2V digital core power regulator */ -+ pdata->dvdd12 = devm_regulator_get(dev, "dvdd12"); -+ if (IS_ERR(pdata->dvdd12)) { -+ DRM_ERROR("DVDD12 regulator not found\n"); -+ return PTR_ERR(pdata->dvdd12); -+ } -+ -+ /* 2.5V digital core power regulator */ -+ pdata->dvdd25 = devm_regulator_get(dev, "dvdd25"); -+ if (IS_ERR(pdata->dvdd25)) { -+ DRM_ERROR("DVDD25 regulator not found\n"); -+ return PTR_ERR(pdata->dvdd25); -+ } -+ -+ /* panel power regulator */ -+ pdata->vcc_panel = devm_regulator_get(dev, "panel"); -+ if (IS_ERR(pdata->vcc_panel)) { -+ DRM_ERROR("panel regulator not found\n"); -+ return PTR_ERR(pdata->vcc_panel); -+ } -+ -+ /* GPIO for chip reset */ -+ pdata->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); -+ -+ return PTR_ERR_OR_ZERO(pdata->gpiod_reset); +} + +static int anx6345_config_dp_output(struct anx6345 *anx6345) @@ -529,13 +468,9 @@ index 000000000000..81676407aa6d + return err; + + /* Force stream valid */ -+ err = anx6345_set_bits(anx6345->map[I2C_IDX_DPTX], ++ return anx6345_set_bits(anx6345->map[I2C_IDX_DPTX], + SP_DP_SYSTEM_CTRL_BASE + 3, + SP_STRM_FORCE | SP_STRM_CTRL); -+ if (err) -+ return err; -+ -+ return 0; +} + +static int anx6345_get_downstream_info(struct anx6345 *anx6345) @@ -557,70 +492,49 @@ index 000000000000..81676407aa6d + return 0; +} + -+static int anx6345_probe_edid_from_of(struct anx6345 *anx6345) -+{ -+ const u8 *edidp; -+ int len; -+ -+ if (!anx6345->bridge.of_node) -+ return -ENODEV; -+ -+ edidp = of_get_property(anx6345->bridge.of_node, "edid", &len); -+ if (!edidp || len != EDID_LENGTH) -+ return -EINVAL; -+ -+ anx6345->edid = devm_kmemdup(&anx6345->client->dev, edidp, -+ len, GFP_KERNEL); -+ -+ if (!anx6345->edid) -+ return -ENOMEM; -+ -+ return 0; -+} -+ +static int anx6345_get_modes(struct drm_connector *connector) +{ + struct anx6345 *anx6345 = connector_to_anx6345(connector); + int err, num_modes = 0; -+ -+ if (WARN_ON(!anx6345->powered)) -+ return 0; -+ -+ if (anx6345->edid) -+ return drm_add_edid_modes(connector, anx6345->edid); ++ bool power_off = false; + + mutex_lock(&anx6345->lock); + -+ err = anx6345_get_downstream_info(anx6345); -+ if (err) { -+ DRM_ERROR("Failed to get downstream info: %d\n", err); -+ goto unlock; -+ } -+ -+ anx6345->edid = drm_get_edid(connector, &anx6345->aux.ddc); -+ if (!anx6345->edid) -+ DRM_ERROR("Failed to read EDID from panel\n"); -+ + if (!anx6345->edid) { -+ err = anx6345_probe_edid_from_of(anx6345); ++ if (!anx6345->powered) { ++ anx6345_poweron(anx6345); ++ power_off = true; ++ } ++ ++ err = anx6345_get_downstream_info(anx6345); + if (err) { -+ DRM_ERROR("Failed to probe EDID from device tree: %d\n", err); ++ DRM_ERROR("Failed to get downstream info: %d\n", err); ++ goto unlock; ++ } ++ ++ anx6345->edid = drm_get_edid(connector, &anx6345->aux.ddc); ++ if (!anx6345->edid) ++ DRM_ERROR("Failed to read EDID from panel\n"); ++ ++ err = drm_connector_update_edid_property(connector, ++ anx6345->edid); ++ if (err) { ++ DRM_ERROR("Failed to update EDID property: %d\n", err); + goto unlock; + } + } + -+ err = drm_connector_update_edid_property(connector, -+ anx6345->edid); -+ if (err) { -+ DRM_ERROR("Failed to update EDID property: %d\n", err); -+ goto unlock; -+ } -+ -+ num_modes = drm_add_edid_modes(connector, anx6345->edid); ++ num_modes += drm_add_edid_modes(connector, anx6345->edid); + +unlock: ++ if (power_off) ++ anx6345_poweroff(anx6345); ++ + mutex_unlock(&anx6345->lock); + ++ if (!num_modes && anx6345->panel) ++ num_modes += drm_panel_get_modes(anx6345->panel); ++ + return num_modes; +} + @@ -628,16 +542,19 @@ index 000000000000..81676407aa6d + .get_modes = anx6345_get_modes, +}; + -+static enum drm_connector_status anx6345_detect(struct drm_connector *connector, -+ bool force) ++static void ++anx6345_connector_destroy(struct drm_connector *connector) +{ -+ return connector_status_connected; ++ struct anx6345 *anx6345 = connector_to_anx6345(connector); ++ ++ if (anx6345->panel) ++ drm_panel_detach(anx6345->panel); ++ drm_connector_cleanup(connector); +} + +static const struct drm_connector_funcs anx6345_connector_funcs = { + .fill_modes = drm_helper_probe_single_connector_modes, -+ .detect = anx6345_detect, -+ .destroy = drm_connector_cleanup, ++ .destroy = anx6345_connector_destroy, + .reset = drm_atomic_helper_connector_reset, + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, @@ -690,21 +607,29 @@ index 000000000000..81676407aa6d + return err; + } + ++ if (anx6345->panel) { ++ err = drm_panel_attach(anx6345->panel, &anx6345->connector); ++ if (err) { ++ DRM_ERROR("Failed to attach panel: %d\n", err); ++ return err; ++ } ++ } ++ + return 0; +} + -+static bool anx6345_bridge_mode_fixup(struct drm_bridge *bridge, -+ const struct drm_display_mode *mode, -+ struct drm_display_mode *adjusted_mode) ++static enum drm_mode_status ++anx6345_bridge_mode_valid(struct drm_bridge *bridge, ++ const struct drm_display_mode *mode) +{ + if (mode->flags & DRM_MODE_FLAG_INTERLACE) -+ return false; ++ return MODE_NO_INTERLACE; + + /* Max 1200p at 5.4 Ghz, one lane */ + if (mode->clock > 154000) -+ return false; ++ return MODE_CLOCK_HIGH; + -+ return true; ++ return MODE_OK; +} + +static void anx6345_bridge_disable(struct drm_bridge *bridge) @@ -714,16 +639,11 @@ index 000000000000..81676407aa6d + /* Power off all modules except configuration registers access */ + anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG, + SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD | SP_LINK_PD); -+} ++ if (anx6345->panel) ++ drm_panel_disable(anx6345->panel); + -+static void anx6345_bridge_mode_set(struct drm_bridge *bridge, -+ const struct drm_display_mode *mode, -+ const struct drm_display_mode *adjusted_mode) -+{ -+ struct anx6345 *anx6345 = bridge_to_anx6345(bridge); -+ -+ if (WARN_ON(!anx6345->powered)) -+ return; ++ if (anx6345->powered) ++ anx6345_poweroff(anx6345); +} + +static void anx6345_bridge_enable(struct drm_bridge *bridge) @@ -731,6 +651,9 @@ index 000000000000..81676407aa6d + struct anx6345 *anx6345 = bridge_to_anx6345(bridge); + int err; + ++ if (anx6345->panel) ++ drm_panel_enable(anx6345->panel); ++ + err = anx6345_start(anx6345); + if (err) { + DRM_ERROR("Failed to initialize: %d\n", err); @@ -744,9 +667,8 @@ index 000000000000..81676407aa6d + +static const struct drm_bridge_funcs anx6345_bridge_funcs = { + .attach = anx6345_bridge_attach, -+ .mode_fixup = anx6345_bridge_mode_fixup, ++ .mode_valid = anx6345_bridge_mode_valid, + .disable = anx6345_bridge_disable, -+ .mode_set = anx6345_bridge_mode_set, + .enable = anx6345_bridge_enable, +}; + @@ -764,40 +686,90 @@ index 000000000000..81676407aa6d + .reg_bits = 8, + .val_bits = 8, + .max_register = 0xff, ++ .cache_type = REGCACHE_NONE, +}; + +static const u16 anx6345_chipid_list[] = { + 0x6345, +}; + ++static bool anx6345_get_chip_id(struct anx6345 *anx6345) ++{ ++ unsigned int i, idl, idh, version; ++ ++ if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_IDL_REG, &idl)) ++ return false; ++ ++ if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_IDH_REG, &idh)) ++ return false; ++ ++ anx6345->chipid = (u8)idl | ((u8)idh << 8); ++ ++ if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_VERSION_REG, ++ &version)) ++ return false; ++ ++ for (i = 0; i < ARRAY_SIZE(anx6345_chipid_list); i++) { ++ if (anx6345->chipid == anx6345_chipid_list[i]) { ++ DRM_INFO("Found ANX%x (ver. %d) eDP Transmitter\n", ++ anx6345->chipid, version); ++ return true; ++ } ++ } ++ ++ DRM_ERROR("ANX%x (ver. %d) not supported by this driver\n", ++ anx6345->chipid, version); ++ ++ return false; ++} ++ +static int anx6345_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct anx6345 *anx6345; -+ struct anx6345_platform_data *pdata; -+ unsigned int i, idl, idh, version; -+ bool found = false; -+ int err; ++ struct device *dev; ++ int i, err; + + anx6345 = devm_kzalloc(&client->dev, sizeof(*anx6345), GFP_KERNEL); + if (!anx6345) + return -ENOMEM; + -+ pdata = &anx6345->pdata; -+ + mutex_init(&anx6345->lock); + -+#if IS_ENABLED(CONFIG_OF) + anx6345->bridge.of_node = client->dev.of_node; -+#endif + + anx6345->client = client; + i2c_set_clientdata(client, anx6345); + -+ err = anx6345_init_pdata(anx6345); -+ if (err) { -+ DRM_ERROR("Failed to initialize pdata: %d\n", err); ++ dev = &anx6345->client->dev; ++ ++ err = drm_of_find_panel_or_bridge(client->dev.of_node, 1, 0, ++ &anx6345->panel, NULL); ++ if (err == -EPROBE_DEFER) + return err; ++ ++ if (err) ++ DRM_DEBUG("No panel found\n"); ++ ++ /* 1.2V digital core power regulator */ ++ anx6345->dvdd12 = devm_regulator_get(dev, "dvdd12-supply"); ++ if (IS_ERR(anx6345->dvdd12)) { ++ DRM_ERROR("dvdd12-supply not found\n"); ++ return PTR_ERR(anx6345->dvdd12); ++ } ++ ++ /* 2.5V digital core power regulator */ ++ anx6345->dvdd25 = devm_regulator_get(dev, "dvdd25-supply"); ++ if (IS_ERR(anx6345->dvdd25)) { ++ DRM_ERROR("dvdd25-supply not found\n"); ++ return PTR_ERR(anx6345->dvdd25); ++ } ++ ++ /* GPIO for chip reset */ ++ anx6345->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); ++ if (IS_ERR(anx6345->gpiod_reset)) { ++ DRM_ERROR("Reset gpio not found\n"); ++ return PTR_ERR(anx6345->gpiod_reset); + } + + /* Map slave addresses of ANX6345 */ @@ -827,49 +799,16 @@ index 000000000000..81676407aa6d + + /* Look for supported chip ID */ + anx6345_poweron(anx6345); ++ if (anx6345_get_chip_id(anx6345)) { ++ anx6345->bridge.funcs = &anx6345_bridge_funcs; ++ drm_bridge_add(&anx6345->bridge); + -+ err = regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_IDL_REG, -+ &idl); -+ if (err) -+ goto err_poweroff; -+ -+ err = regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_IDH_REG, -+ &idh); -+ if (err) -+ goto err_poweroff; -+ -+ anx6345->chipid = (u8)idl | ((u8)idh << 8); -+ -+ err = regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_VERSION_REG, -+ &version); -+ if (err) -+ goto err_poweroff; -+ -+ for (i = 0; i < ARRAY_SIZE(anx6345_chipid_list); i++) { -+ if (anx6345->chipid == anx6345_chipid_list[i]) { -+ DRM_INFO("Found ANX%x (ver. %d) eDP Transmitter\n", -+ anx6345->chipid, version); -+ found = true; -+ break; -+ } -+ } -+ -+ if (!found) { -+ DRM_ERROR("ANX%x (ver. %d) not supported by this driver\n", -+ anx6345->chipid, version); ++ return 0; ++ } else { ++ anx6345_poweroff(anx6345); + err = -ENODEV; -+ goto err_poweroff; + } + -+ anx6345->bridge.funcs = &anx6345_bridge_funcs; -+ -+ drm_bridge_add(&anx6345->bridge); -+ -+ return 0; -+ -+err_poweroff: -+ anx6345_poweroff(anx6345); -+ +err_unregister_i2c: + unregister_i2c_dummy_clients(anx6345); + return err; @@ -885,6 +824,8 @@ index 000000000000..81676407aa6d + + kfree(anx6345->edid); + ++ mutex_destroy(&anx6345->lock); ++ + return 0; +} + @@ -894,13 +835,11 @@ index 000000000000..81676407aa6d +}; +MODULE_DEVICE_TABLE(i2c, anx6345_id); + -+#if IS_ENABLED(CONFIG_OF) +static const struct of_device_id anx6345_match_table[] = { + { .compatible = "analogix,anx6345", }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, anx6345_match_table); -+#endif + +static struct i2c_driver anx6345_driver = { + .driver = { @@ -916,67 +855,6 @@ index 000000000000..81676407aa6d +MODULE_DESCRIPTION("ANX6345 eDP Transmitter driver"); +MODULE_AUTHOR("Icenowy Zheng "); +MODULE_LICENSE("GPL v2"); -diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c -index 9cb30962032e..53b0e73d6a24 100644 ---- a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c -+++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c -@@ -117,7 +117,7 @@ ssize_t anx_aux_transfer(struct regmap *map_dptx, struct drm_dp_aux_msg *msg) - else /* For non-zero-sized set the length field. */ - ctrl1 |= (msg->size - 1) << SP_AUX_LENGTH_SHIFT; - -- if ((msg->request & DP_AUX_I2C_READ) == 0) { -+ if ((msg->size > 0) && ((msg->request & DP_AUX_I2C_READ) == 0)) { - /* When WRITE | MOT write values to data buffer */ - err = regmap_bulk_write(map_dptx, - SP_DP_BUF_DATA0_REG, buffer, -diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h -index c2ca854613a0..b29a0b3bc23c 100644 ---- a/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h -+++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h -@@ -75,7 +75,11 @@ - #define SP_CHA_STA BIT(2) - /* Bits for DP System Control Register 3 */ - #define SP_HPD_STATUS BIT(6) -+#define SP_HPD_FORCE BIT(5) -+#define SP_HPD_CTRL BIT(4) - #define SP_STRM_VALID BIT(2) -+#define SP_STRM_FORCE BIT(1) -+#define SP_STRM_CTRL BIT(0) - /* Bits for DP System Control Register 4 */ - #define SP_ENHANCED_MODE BIT(3) - -@@ -120,6 +124,9 @@ - #define SP_LINK_BW_SET_MASK 0x1f - #define SP_INITIAL_SLIM_M_AUD_SEL BIT(5) - -+/* DP Lane Count Setting Register */ -+#define SP_DP_LANE_COUNT_SET_REG 0xa1 -+ - /* DP Training Pattern Set Register */ - #define SP_DP_TRAINING_PATTERN_SET_REG 0xa2 - -@@ -133,6 +140,7 @@ - - /* DP Link Training Control Register */ - #define SP_DP_LT_CTRL_REG 0xa8 -+#define SP_DP_LT_INPROGRESS 0x80 - #define SP_LT_ERROR_TYPE_MASK 0x70 - # define SP_LT_NO_ERROR 0x00 - # define SP_LT_AUX_WRITE_ERROR 0x01 -diff --git a/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h b/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h -index 7d683573e970..480c98a225b1 100644 ---- a/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h -+++ b/drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h -@@ -183,6 +183,9 @@ - #define SP_VBIT BIT(1) - #define SP_AUDIO_LAYOUT BIT(0) - -+/* Analog Debug Register 1 */ -+#define SP_ANALOG_DEBUG1_REG 0xdc -+ - /* Analog Debug Register 2 */ - #define SP_ANALOG_DEBUG2_REG 0xdd - #define SP_FORCE_SW_OFF_BYPASS 0x20 -- -2.17.1 +cgit 1.2-0.3.lf.el7 diff --git a/patch/kernel/sunxi-current/0006-add-anx6345-DP-eDP-bridge-for-Olimex-Teres-I.patch b/patch/kernel/sunxi-current/0006-add-anx6345-DP-eDP-bridge-for-Olimex-Teres-I.patch new file mode 100644 index 0000000000..ee102f9d8b --- /dev/null +++ b/patch/kernel/sunxi-current/0006-add-anx6345-DP-eDP-bridge-for-Olimex-Teres-I.patch @@ -0,0 +1,208 @@ +The anx6345 is an ultra-low power DisplayPort/eDP transmitter designed +for portable devices. + +Add a binding document for it. + +Signed-off-by: Icenowy Zheng +Signed-off-by: Vasily Khoruzhick +Reviewed-by: Rob Herring +Signed-off-by: Torsten Duwe +Reviewed-by: Laurent Pinchart +--- + .../bindings/display/bridge/anx6345.yaml | 102 ++++++++++++++++++++++ + 1 file changed, 102 insertions(+) + create mode 100644 Documentation/devicetree/bindings/display/bridge/anx6345.yaml + +diff --git a/Documentation/devicetree/bindings/display/bridge/anx6345.yaml b/Documentation/devicetree/bindings/display/bridge/anx6345.yaml +new file mode 100644 +index 000000000000..094e8e8a5faa +--- /dev/null ++++ b/Documentation/devicetree/bindings/display/bridge/anx6345.yaml +@@ -0,0 +1,102 @@ ++# SPDX-License-Identifier: GPL-2.0 ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/display/bridge/anx6345.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: Analogix ANX6345 eDP Transmitter Device Tree Bindings ++ ++maintainers: ++ - Torsten Duwe ++ ++description: | ++ The ANX6345 is an ultra-low power Full-HD eDP transmitter designed for ++ portable devices. ++ ++properties: ++ compatible: ++ const: analogix,anx6345 ++ ++ reg: ++ maxItems: 1 ++ description: base I2C address of the device ++ ++ reset-gpios: ++ maxItems: 1 ++ description: GPIO connected to active low reset ++ ++ dvdd12-supply: ++ maxItems: 1 ++ description: Regulator for 1.2V digital core power. ++ ++ dvdd25-supply: ++ maxItems: 1 ++ description: Regulator for 2.5V digital core power. ++ ++ ports: ++ type: object ++ ++ properties: ++ port@0: ++ type: object ++ description: | ++ Video port for LVTTL input ++ ++ port@1: ++ type: object ++ description: | ++ Video port for eDP output (panel or connector). ++ May be omitted if EDID works reliably. ++ ++ required: ++ - port@0 ++ ++required: ++ - compatible ++ - reg ++ - reset-gpios ++ - dvdd12-supply ++ - dvdd25-supply ++ - ports ++ ++additionalProperties: false ++ ++examples: ++ - | ++ i2c0 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ anx6345: anx6345@38 { ++ compatible = "analogix,anx6345"; ++ reg = <0x38>; ++ reset-gpios = <&pio42 1 /* GPIO_ACTIVE_LOW */>; ++ dvdd25-supply = <®_dldo2>; ++ dvdd12-supply = <®_fldo1>; ++ ++ ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ anx6345_in: port@0 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ reg = <0>; ++ anx6345_in_tcon0: endpoint@0 { ++ reg = <0>; ++ remote-endpoint = <&tcon0_out_anx6345>; ++ }; ++ }; ++ ++ anx6345_out: port@1 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ reg = <1>; ++ anx6345_out_panel: endpoint@0 { ++ reg = <0>; ++ remote-endpoint = <&panel_in_edp>; ++ }; ++ }; ++ }; ++ }; ++ }; + + +Teres-I has an anx6345 bridge connected to the RGB666 LCD output, and +the I2C controlling signals are connected to I2C0 bus. + +Enable it in the device tree, and enable the display engine, video mixer +and tcon0 as well. + +Signed-off-by: Icenowy Zheng +Signed-off-by: Torsten Duwe +--- + .../boot/dts/allwinner/sun50i-a64-teres-i.dts | 45 ++++++++++++++++++++-- + 1 file changed, 41 insertions(+), 4 deletions(-) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts +index 1069e7012c9c..970415106dcf 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts +@@ -100,18 +100,41 @@ + status = "okay"; + }; + ++&de { ++ status = "okay"; ++}; ++ + &ehci1 { + status = "okay"; + }; + + +-/* The ANX6345 eDP-bridge is on i2c0. There is no linux (mainline) +- * driver for this chip at the moment, the bootloader initializes it. +- * However it can be accessed with the i2c-dev driver from user space. +- */ + &i2c0 { + clock-frequency = <100000>; + status = "okay"; ++ ++ anx6345: anx6345@38 { ++ compatible = "analogix,anx6345"; ++ reg = <0x38>; ++ reset-gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */ ++ dvdd25-supply = <®_dldo2>; ++ dvdd12-supply = <®_dldo3>; ++ ++ ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ port@0 { ++ anx6345_in: endpoint { ++ remote-endpoint = <&tcon0_out_anx6345>; ++ }; ++ }; ++ }; ++ }; ++}; ++ ++&mixer0 { ++ status = "okay"; + }; + + &mmc0 { +@@ -319,6 +342,20 @@ + status = "okay"; + }; + ++&tcon0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&lcd_rgb666_pins>; ++ ++ status = "okay"; ++}; ++ ++&tcon0_out { ++ tcon0_out_anx6345: endpoint@0 { ++ reg = <0>; ++ remote-endpoint = <&anx6345_in>; ++ }; ++}; ++ + &uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_pb_pins>; diff --git a/patch/kernel/sunxi-current/0007-anx6345_fix_acquisition_of_the_regulators.patch b/patch/kernel/sunxi-current/0007-anx6345_fix_acquisition_of_the_regulators.patch new file mode 100644 index 0000000000..bb8ffa8c30 --- /dev/null +++ b/patch/kernel/sunxi-current/0007-anx6345_fix_acquisition_of_the_regulators.patch @@ -0,0 +1,40 @@ +From 8df6da42f1244573edd3d22d39dbe8fc66a01cbd Mon Sep 17 00:00:00 2001 +From: Icenowy Zheng +Date: Wed, 12 Feb 2020 00:01:29 +0800 +Subject: [PATCH] drm/bridge: analogix-anx6345: fix acquisition of the + regulators + +When calling regulator_get(), the regulator name should not contain +"-supply" (it will be attached to the regulator name to construct the DT +property name by regulator framework). However, the driver currently +passed bogus "-supply", which breaks the support to its DT binding. + +Fix this by remove the bogus "-supply" in regulator names. + +Fixes: 6aa192698089 ("drm/bridge: Add Analogix anx6345 support") +Signed-off-by: Icenowy Zheng +--- + drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c +index 56f55c53abfd8..0d8d083b02074 100644 +--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c ++++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c +@@ -712,14 +712,14 @@ static int anx6345_i2c_probe(struct i2c_client *client, + DRM_DEBUG("No panel found\n"); + + /* 1.2V digital core power regulator */ +- anx6345->dvdd12 = devm_regulator_get(dev, "dvdd12-supply"); ++ anx6345->dvdd12 = devm_regulator_get(dev, "dvdd12"); + if (IS_ERR(anx6345->dvdd12)) { + DRM_ERROR("dvdd12-supply not found\n"); + return PTR_ERR(anx6345->dvdd12); + } + + /* 2.5V digital core power regulator */ +- anx6345->dvdd25 = devm_regulator_get(dev, "dvdd25-supply"); ++ anx6345->dvdd25 = devm_regulator_get(dev, "dvdd25"); + if (IS_ERR(anx6345->dvdd25)) { + DRM_ERROR("dvdd25-supply not found\n"); + return PTR_ERR(anx6345->dvdd25); diff --git a/patch/kernel/sunxi-current/0132-arm64-allwinner-a64-enable-ANX6345-bridge-on-Pineboo.patch b/patch/kernel/sunxi-current/0009-enable_anx6345_bridge_pinebook.patch similarity index 60% rename from patch/kernel/sunxi-current/0132-arm64-allwinner-a64-enable-ANX6345-bridge-on-Pineboo.patch rename to patch/kernel/sunxi-current/0009-enable_anx6345_bridge_pinebook.patch index edd0bff355..e8270b3eb2 100644 --- a/patch/kernel/sunxi-current/0132-arm64-allwinner-a64-enable-ANX6345-bridge-on-Pineboo.patch +++ b/patch/kernel/sunxi-current/0009-enable_anx6345_bridge_pinebook.patch @@ -1,26 +1,35 @@ -From 82fe5562e8d5cb289e97ff8d259b21889e72b03b Mon Sep 17 00:00:00 2001 +From b68d225323c9a479b26ee22a2cb4bf4eefe13cc5 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng -Date: Thu, 18 Oct 2018 15:33:25 +0800 -Subject: [PATCH 132/146] arm64: allwinner: a64: enable ANX6345 bridge on - Pinebook +Date: Sun, 7 May 2017 14:41:24 +0800 +Subject: [PATCH] arm64: allwinner: a64: enable ANX6345 bridge on Pinebook Pinebook has an ANX6345 bridge connected to the RGB666 LCD output, and the I2C controlling signals are connected to R_I2C bus. -Enable it in the device tree, and add a usable EDID from the panel's -datasheet (at least 14" Pinebook used a panel without EDID). +Enable it in the device tree. Signed-off-by: Icenowy Zheng --- - .../dts/allwinner/sun50i-a64-pinebook.dts | 39 +++++++++++++++++++ - 1 file changed, 39 insertions(+) + .../dts/allwinner/sun50i-a64-pinebook.dts | 37 +++++++++++++++++++ + 1 file changed, 37 insertions(+) diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts -index b55ac4e1df37..8c9bd4dfbbba 100644 +index c06c540e6c08a..83f555a6995ce 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts -@@ -123,6 +123,10 @@ - }; +@@ -109,6 +109,10 @@ + status = "okay"; + }; + ++&de { ++ status = "okay"; ++}; ++ + &ehci0 { + phys = <&usbphy 0>; + phy-names = "usb"; +@@ -119,6 +123,10 @@ + status = "okay"; }; +&mixer0 { @@ -30,20 +39,15 @@ index b55ac4e1df37..8c9bd4dfbbba 100644 &mmc0 { pinctrl-names = "default"; pinctrl-0 = <&mmc0_pins>; -@@ -175,6 +179,27 @@ +@@ -183,6 +191,20 @@ + pinctrl-names = "default"; + pinctrl-0 = <&r_i2c_pl89_pins>; status = "okay"; - }; - -+&r_i2c { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&r_i2c_pins_a>; -+ status = "okay"; + + anx6345: anx6345@38 { + compatible = "analogix,anx6345"; + reg = <0x38>; -+ reset-gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */ -+ panel-supply = <®_dc1sw>; ++ reset-gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */ + dvdd25-supply = <®_dldo2>; + dvdd12-supply = <®_fldo1>; + @@ -53,12 +57,18 @@ index b55ac4e1df37..8c9bd4dfbbba 100644 + }; + }; + }; -+}; -+ - &r_rsb { - status = "okay"; + }; -@@ -348,6 +373,20 @@ + &r_pio { +@@ -238,6 +260,7 @@ + + ®_dc1sw { + regulator-name = "vcc-lcd"; ++ regulator-always-on; // HACK + }; + + ®_dcdc1 { +@@ -357,6 +380,20 @@ "MIC2", "Internal Microphone Right"; }; @@ -78,7 +88,4 @@ index b55ac4e1df37..8c9bd4dfbbba 100644 + &uart0 { pinctrl-names = "default"; - pinctrl-0 = <&uart0_pins_a>; --- -2.17.1 - + pinctrl-0 = <&uart0_pb_pins>; diff --git a/patch/kernel/sunxi-current/0126-drm-bridge-move-ANA78xx-driver-to-analogix-subdirect.patch b/patch/kernel/sunxi-current/0126-drm-bridge-move-ANA78xx-driver-to-analogix-subdirect.patch index 10a8226bfa..d58ce1bcaa 100644 --- a/patch/kernel/sunxi-current/0126-drm-bridge-move-ANA78xx-driver-to-analogix-subdirect.patch +++ b/patch/kernel/sunxi-current/0126-drm-bridge-move-ANA78xx-driver-to-analogix-subdirect.patch @@ -30,47 +30,3 @@ index 4934fcf..729a806 100644 obj-$(CONFIG_DRM_CDNS_DSI) += cdns-dsi.o obj-$(CONFIG_DRM_DUMB_VGA_DAC) += dumb-vga-dac.o obj-$(CONFIG_DRM_LVDS_ENCODER) += lvds-encoder.o -@@ -16,4 +15,6 @@ obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix/ - obj-$(CONFIG_DRM_I2C_ADV7511) += adv7511/ - obj-$(CONFIG_DRM_TI_SN65DSI86) += ti-sn65dsi86.o - obj-$(CONFIG_DRM_TI_TFP410) += ti-tfp410.o -+ -+obj-y += analogix/ - obj-y += synopsys/ -diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig -index 80f286fa3a69..27b37aa2ea77 100644 ---- a/drivers/gpu/drm/bridge/analogix/Kconfig -+++ b/drivers/gpu/drm/bridge/analogix/Kconfig -@@ -1,3 +1,13 @@ - config DRM_ANALOGIX_DP - tristate - depends on DRM -+ -+config DRM_ANALOGIX_ANX78XX -+ tristate "Analogix ANX78XX bridge" -+ select DRM_KMS_HELPER -+ select REGMAP_I2C -+ ---help--- -+ ANX78XX is an ultra-low Full-HD SlimPort transmitter -+ designed for portable devices. The ANX78XX transforms -+ the HDMI output of an application processor to MyDP -+ or DisplayPort. -diff --git a/drivers/gpu/drm/bridge/analogix/Makefile b/drivers/gpu/drm/bridge/analogix/Makefile -index cd4010ba6890..eb41be845055 100644 ---- a/drivers/gpu/drm/bridge/analogix/Makefile -+++ b/drivers/gpu/drm/bridge/analogix/Makefile -@@ -1,2 +1,3 @@ - analogix_dp-objs := analogix_dp_core.o analogix_dp_reg.o - obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp.o -+obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o -diff --git a/drivers/gpu/drm/bridge/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c -similarity index 100% -rename from drivers/gpu/drm/bridge/analogix-anx78xx.c -rename to drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c -diff --git a/drivers/gpu/drm/bridge/analogix-anx78xx.h b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h -similarity index 100% -rename from drivers/gpu/drm/bridge/analogix-anx78xx.h -rename to drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h --- -2.17.1 - diff --git a/patch/kernel/sunxi-current/0129-dt-bindings-Add-ANX6345-DP-eDP-transmitter-binding.patch b/patch/kernel/sunxi-current/0129-dt-bindings-Add-ANX6345-DP-eDP-transmitter-binding.patch deleted file mode 100644 index 5e76ebfb85..0000000000 --- a/patch/kernel/sunxi-current/0129-dt-bindings-Add-ANX6345-DP-eDP-transmitter-binding.patch +++ /dev/null @@ -1,64 +0,0 @@ -From db3c5b3983ab2395794ea3ebd5c73ab7b39d2caa Mon Sep 17 00:00:00 2001 -From: Icenowy Zheng -Date: Thu, 18 Oct 2018 15:33:22 +0800 -Subject: [PATCH 129/146] dt-bindings: Add ANX6345 DP/eDP transmitter binding - -The ANX6345 is an ultra-low power DisplayPort/eDP transmitter designed -for portable devices. - -Add a binding document for it. - -Signed-off-by: Icenowy Zheng ---- - .../bindings/display/bridge/anx6345.txt | 39 +++++++++++++++++++ - 1 file changed, 39 insertions(+) - create mode 100644 Documentation/devicetree/bindings/display/bridge/anx6345.txt - -diff --git a/Documentation/devicetree/bindings/display/bridge/anx6345.txt b/Documentation/devicetree/bindings/display/bridge/anx6345.txt -new file mode 100644 -index 000000000000..0689d4eb5f65 ---- /dev/null -+++ b/Documentation/devicetree/bindings/display/bridge/anx6345.txt -@@ -0,0 +1,39 @@ -+Analogix ANX6345 eDP Transmitter -+-------------------------------- -+ -+The ANX6345 is an ultra-low power Full-HD eDP transmitter designed for -+portable devices. -+ -+Required properties: -+ -+ - compatible : "analogix,anx6345" -+ - reg : I2C address of the device -+ - reset-gpios : Which GPIO to use for reset -+ -+Optional properties: -+ -+ - dvdd12-supply : Regulator for 1.2V digital core power. -+ - dvdd25-supply : Regulator for 2.5V digital core power. -+ - panel-supply : Regulator for the power of the panel. -+ - edid : verbatim EDID data block describing attached -+ panel, only used when the panel has no EDID info. -+ - Video port for RGB input, using the DT bindings defined in [1]. -+ -+[1]: Documentation/devicetree/bindings/media/video-interfaces.txt -+ -+Example: -+ -+anx6345: anx6345@38 { -+ compatible = "analogix,anx6345"; -+ reg = <0x38>; -+ reset-gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */ -+ panel-supply = <®_dc1sw>; -+ dvdd25-supply = <®_dldo2>; -+ dvdd12-supply = <®_fldo1>; -+ -+ port { -+ anx6345_in: endpoint { -+ remote-endpoint = <&tcon0_out_anx6345>; -+ }; -+ }; -+}; --- -2.17.1 - diff --git a/patch/kernel/sunxi-current/0133-arm64-allwinner-a64-enable-ANX6345-bridge-on-TERES-I.patch.disabled b/patch/kernel/sunxi-current/0133-arm64-allwinner-a64-enable-ANX6345-bridge-on-TERES-I.patch.disabled deleted file mode 100644 index 5098b5c9a7..0000000000 --- a/patch/kernel/sunxi-current/0133-arm64-allwinner-a64-enable-ANX6345-bridge-on-TERES-I.patch.disabled +++ /dev/null @@ -1,87 +0,0 @@ -From 955974c9ba484fc2b7e4396b5fdc6687a9a530a0 Mon Sep 17 00:00:00 2001 -From: Icenowy Zheng -Date: Thu, 18 Oct 2018 15:33:26 +0800 -Subject: [PATCH 133/146] arm64: allwinner: a64: enable ANX6345 bridge on - TERES-I - -TERES-I has an ANX6345 bridge connected to the RGB666 LCD output, and -the I2C controlling signals are connected to I2C0 bus. - -Enable it in the device tree. - -Signed-off-by: Icenowy Zheng ---- - .../boot/dts/allwinner/sun50i-a64-teres-i.dts | 40 +++++++++++++++++-- - 1 file changed, 36 insertions(+), 4 deletions(-) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -index 81f8e0098699..6c3318b3c648 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -@@ -72,20 +72,38 @@ - }; - }; - -+&de { -+ status = "okay"; -+}; -+ - &ehci1 { - status = "okay"; - }; - - --/* The ANX6345 eDP-bridge is on i2c0. There is no linux (mainline) -- * driver for this chip at the moment, the bootloader initializes it. -- * However it can be accessed with the i2c-dev driver from user space. -- */ - &i2c0 { - clock-frequency = <100000>; - pinctrl-names = "default"; - pinctrl-0 = <&i2c0_pins>; - status = "okay"; -+ -+ anx6345: anx6345@38 { -+ compatible = "analogix,anx6345"; -+ reg = <0x38>; -+ reset-gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */ -+ dvdd25-supply = <®_dldo2>; -+ dvdd12-supply = <®_dldo3>; -+ -+ port { -+ anx6345_in: endpoint { -+ remote-endpoint = <&tcon0_out_anx6345>; -+ }; -+ }; -+ }; -+}; -+ -+&mixer0 { -+ status = "okay"; - }; - - &mmc0 { -@@ -258,6 +276,20 @@ - vcc-hdmi-supply = <®_dldo1>; - }; - -+&tcon0 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&lcd_rgb666_pins>; -+ -+ status = "okay"; -+}; -+ -+&tcon0_out { -+ tcon0_out_anx6345: endpoint@0 { -+ reg = <0>; -+ remote-endpoint = <&anx6345_in>; -+ }; -+}; -+ - &uart0 { - pinctrl-names = "default"; - pinctrl-0 = <&uart0_pins_a>; --- -2.17.1 - diff --git a/patch/kernel/sunxi-current/0137-Pinebook-HDMI-audio.patch b/patch/kernel/sunxi-current/0137-Pinebook-HDMI-audio.patch deleted file mode 100644 index 2a881647f5..0000000000 --- a/patch/kernel/sunxi-current/0137-Pinebook-HDMI-audio.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 59197ec5632d29d173aae2fbe6c92402fc2f0a58 Mon Sep 17 00:00:00 2001 -From: Vasily Khoruzhick -Date: Sun, 28 Oct 2018 19:07:23 -0700 -Subject: [PATCH 137/146] Pinebook HDMI audio - -Signed-off-by: Vasily Khoruzhick ---- - arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts -index 8c9bd4dfbbba..0f788400ece0 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts -@@ -123,6 +123,10 @@ - }; - }; - -+&i2s2 { -+ status = "okay"; -+}; -+ - &mixer0 { - status = "okay"; - }; -@@ -373,6 +377,10 @@ - "MIC2", "Internal Microphone Right"; - }; - -+&sound_hdmi { -+ status = "okay"; -+}; -+ - &tcon0 { - pinctrl-names = "default"; - pinctrl-0 = <&lcd_rgb666_pins>; --- -2.17.1 - diff --git a/patch/kernel/sunxi-current/arm64-dts-allwinner-a64-pinebook-Fix-lid-wakeup.patch b/patch/kernel/sunxi-current/arm64-dts-allwinner-a64-pinebook-Fix-lid-wakeup.patch new file mode 100644 index 0000000000..211b43a4b6 --- /dev/null +++ b/patch/kernel/sunxi-current/arm64-dts-allwinner-a64-pinebook-Fix-lid-wakeup.patch @@ -0,0 +1,29 @@ +By default, gpio-keys configures the pin to trigger wakeup IRQs on +either edge. The lid switch should only trigger wakeup when opening the +lid, not when closing it. + +Signed-off-by: Samuel Holland +--- + arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +index 78c82a665c84..836ae51e5c2a 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +@@ -10,6 +10,7 @@ + #include "sun50i-a64.dtsi" + + #include ++#include + #include + #include + +@@ -60,6 +61,7 @@ + linux,code = ; + linux,can-disable; + wakeup-source; ++ wakeup-event-action = ; + }; + }; + diff --git a/patch/kernel/sunxi-current/xxx-teres-fixed.patch b/patch/kernel/sunxi-current/xxx-teres-fixed.patch deleted file mode 100644 index 2ae1188e0b..0000000000 --- a/patch/kernel/sunxi-current/xxx-teres-fixed.patch +++ /dev/null @@ -1,187 +0,0 @@ -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -index 1069e70..8fbdab7 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -@@ -19,6 +19,15 @@ - - aliases { - serial0 = &uart0; -+ ethernet0 = &rtl8723bs; -+ }; -+ -+ backlight: backlight { -+ compatible = "pwm-backlight"; -+ pwms = <&pwm 0 50000 0>; -+ brightness-levels = <0 5 10 15 20 30 40 55 70 85 100>; -+ default-brightness-level = <2>; -+ enable-gpios = <&pio 3 23 GPIO_ACTIVE_HIGH>; /* PD23 */ - }; - - backlight: backlight { -@@ -51,6 +60,17 @@ - }; - }; - -+ hdmi-connector { -+ compatible = "hdmi-connector"; -+ type = "a"; -+ -+ port { -+ hdmi_con_in: endpoint { -+ remote-endpoint = <&hdmi_out_con>; -+ }; -+ }; -+ }; -+ - leds { - compatible = "gpio-leds"; - -@@ -100,6 +120,16 @@ - status = "okay"; - }; - -+&de { -+ status = "okay"; -+}; -+ -+&ehci0 { -+ phys = <&usbphy 0>; -+ phy-names = "usb"; -+ status = "okay"; -+}; -+ - &ehci1 { - status = "okay"; - }; -@@ -112,6 +142,39 @@ - &i2c0 { - clock-frequency = <100000>; - status = "okay"; -+ -+ anx6345: anx6345@38 { -+ compatible = "analogix,anx6345"; -+ reg = <0x38>; -+ reset-gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */ -+ dvdd25-supply = <®_dldo2>; -+ dvdd12-supply = <®_dldo3>; -+ -+ port { -+ anx6345_in: endpoint { -+ remote-endpoint = <&tcon0_out_anx6345>; -+ }; -+ }; -+ }; -+}; -+ -+&hdmi { -+ hvcc-supply = <®_dldo1>; -+ status = "okay"; -+}; -+ -+&hdmi_out { -+ hdmi_out_con: endpoint { -+ remote-endpoint = <&hdmi_con_in>; -+ }; -+}; -+ -+&i2s2 { -+ status = "okay"; -+}; -+ -+&mixer0 { -+ status = "okay"; - }; - - &mmc0 { -@@ -153,6 +216,12 @@ - status = "okay"; - }; - -+&ohci0 { -+ phys = <&usbphy 0>; -+ phy-names = "usb"; -+ status = "okay"; -+}; -+ - &ohci1 { - status = "okay"; - }; -@@ -173,6 +242,29 @@ - }; - }; - -+&sound { -+ status = "okay"; -+ simple-audio-card,aux-devs = <&codec_analog>, <&speaker_amp>; -+ simple-audio-card,widgets = "Microphone", "Internal Microphone Left", -+ "Microphone", "Internal Microphone Right", -+ "Headphone", "Headphone Jack", -+ "Speaker", "Internal Speaker"; -+ simple-audio-card,routing = -+ "Left DAC", "AIF1 Slot 0 Left", -+ "Right DAC", "AIF1 Slot 0 Right", -+ "Speaker Amp INL", "LINEOUT", -+ "Speaker Amp INR", "LINEOUT", -+ "Internal Speaker", "Speaker Amp OUTL", -+ "Internal Speaker", "Speaker Amp OUTR", -+ "Headphone Jack", "HP", -+ "AIF1 Slot 0 Left ADC", "Left ADC", -+ "AIF1 Slot 0 Right ADC", "Right ADC", -+ "Internal Microphone Left", "MBIAS", -+ "MIC1", "Internal Microphone Left", -+ "Internal Microphone Right", "HBIAS", -+ "MIC2", "Internal Microphone Right"; -+}; -+ - #include "axp803.dtsi" - - &ac_power_supply { -@@ -319,12 +411,48 @@ - status = "okay"; - }; - -+&sound_hdmi { -+ status = "okay"; -+}; -+ -+&tcon0 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&lcd_rgb666_pins>; -+ -+ status = "okay"; -+}; -+ -+&tcon0_out { -+ tcon0_out_anx6345: endpoint@0 { -+ reg = <0>; -+ remote-endpoint = <&anx6345_in>; -+ }; -+}; -+ - &uart0 { - pinctrl-names = "default"; - pinctrl-0 = <&uart0_pb_pins>; - status = "okay"; - }; - -+&uart1 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; -+ status = "okay"; -+ -+ bluetooth { -+ compatible = "realtek,rtl8723bs-bt"; -+ reset-gpios = <&r_pio 0 4 GPIO_ACTIVE_LOW>; /* PL4 */ -+ device-wake-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */ -+ host-wake-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */ -+ firmware-postfix = "teres"; -+ }; -+}; -+ -+&usb_otg { -+ dr_mode = "host"; -+}; -+ - &usbphy { - usb1_vbus-supply = <®_usb1_vbus>; - status = "okay"; From 5d00834a478c26f58b3e60f900bc492eef4d9ce5 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Fri, 14 Feb 2020 21:04:01 +0100 Subject: [PATCH 44/54] Cleanup, add XU4 current upstream patch, remove deprecated patch --- config/kernel/linux-imx6-current.config | 3 +- config/kernel/linux-mvebu-current.config | 4 +- config/kernel/linux-mvebu-legacy.config | 6 +- config/kernel/linux-rockchip64-current.config | 19 +- config/kernel/linux-sunxi-current.config | 2 +- ...ify-driver-by-using-more-drm-helpers.patch | 21 +- ...crypto-amlogic-fix-removal-of-module.patch | 167 - .../03-patch-5.4.18-19.patch | 15537 ++++++++++++++++ 8 files changed, 15573 insertions(+), 186 deletions(-) delete mode 100644 patch/kernel/meson64-dev/crypto-amlogic-fix-removal-of-module.patch create mode 100644 patch/kernel/odroidxu4-current/03-patch-5.4.18-19.patch diff --git a/config/kernel/linux-imx6-current.config b/config/kernel/linux-imx6-current.config index ff6eeea80f..f140b3bbf2 100644 --- a/config/kernel/linux-imx6-current.config +++ b/config/kernel/linux-imx6-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.4.6 Kernel Configuration +# Linux/arm 5.4.19 Kernel Configuration # # @@ -908,6 +908,7 @@ CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=8 CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_HAVE_COPY_THREAD_TLS=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y diff --git a/config/kernel/linux-mvebu-current.config b/config/kernel/linux-mvebu-current.config index 1508002ce0..ece55f7642 100644 --- a/config/kernel/linux-mvebu-current.config +++ b/config/kernel/linux-mvebu-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 4.19.94 Kernel Configuration +# Linux/arm 4.19.103 Kernel Configuration # # @@ -3168,7 +3168,6 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set # CONFIG_CPU_THERMAL is not set # CONFIG_CLOCK_THERMAL is not set -# CONFIG_DEVFREQ_THERMAL is not set # CONFIG_THERMAL_EMULATION is not set # CONFIG_QORIQ_THERMAL is not set # CONFIG_DOVE_THERMAL is not set @@ -4076,7 +4075,6 @@ CONFIG_LEDS_TRIGGER_NETDEV=m # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y -# CONFIG_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y # CONFIG_RTC_HCTOSYS is not set diff --git a/config/kernel/linux-mvebu-legacy.config b/config/kernel/linux-mvebu-legacy.config index 5fd5580744..1d9e22fb4d 100644 --- a/config/kernel/linux-mvebu-legacy.config +++ b/config/kernel/linux-mvebu-legacy.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 4.14.135 Kernel Configuration +# Linux/arm 4.14.170 Kernel Configuration # CONFIG_ARM=y CONFIG_ARM_HAS_SG_CHAIN=y @@ -2344,7 +2344,6 @@ CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set # CONFIG_ATH10K_DEBUGFS is not set # CONFIG_WCN36XX is not set -CONFIG_RTL8188EU=m # CONFIG_WLAN_VENDOR_ATMEL is not set CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_B43=m @@ -2486,6 +2485,7 @@ CONFIG_RTL8XXXU_UNTESTED=y # CONFIG_WLAN_VENDOR_TI is not set CONFIG_RTL8822BU=m CONFIG_RTL8188EU=m +CONFIG_RTL8821CU=m CONFIG_RTL8812AU=m # CONFIG_WLAN_VENDOR_ZYDAS is not set CONFIG_WLAN_VENDOR_QUANTENNA=y @@ -3602,7 +3602,6 @@ CONFIG_USB_SERIAL_OPTION=m # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set -# CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set @@ -5256,6 +5255,7 @@ CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y +CONFIG_SGL_ALLOC=y # CONFIG_DMA_NOOP_OPS is not set # CONFIG_DMA_VIRT_OPS is not set CONFIG_CPU_RMAP=y diff --git a/config/kernel/linux-rockchip64-current.config b/config/kernel/linux-rockchip64-current.config index 47b9cc89ab..c03a0da10f 100644 --- a/config/kernel/linux-rockchip64-current.config +++ b/config/kernel/linux-rockchip64-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.4.13 Kernel Configuration +# Linux/arm64 5.4.19 Kernel Configuration # # @@ -1465,20 +1465,29 @@ CONFIG_BT_LEDS=y # # Bluetooth device drivers # +CONFIG_BT_BCM=m # CONFIG_BT_HCIBTUSB is not set # CONFIG_BT_HCIBTSDIO is not set CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_SERDEV=y CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_NOKIA=m # CONFIG_BT_HCIUART_BCSP is not set # CONFIG_BT_HCIUART_ATH3K is not set +# CONFIG_BT_HCIUART_LL is not set +# CONFIG_BT_HCIUART_3WIRE is not set # CONFIG_BT_HCIUART_INTEL is not set +# CONFIG_BT_HCIUART_BCM is not set +# CONFIG_BT_HCIUART_QCA is not set # CONFIG_BT_HCIUART_AG6XX is not set +# CONFIG_BT_HCIUART_MRVL is not set # CONFIG_BT_HCIBCM203X is not set # CONFIG_BT_HCIBPA10X is not set # CONFIG_BT_HCIBFUSB is not set # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set CONFIG_BT_MTKSDIO=m +CONFIG_BT_MTKUART=m # end of Bluetooth device drivers # CONFIG_AF_RXRPC is not set @@ -2370,7 +2379,9 @@ CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_QUALCOMM=y +CONFIG_QCA7000=m # CONFIG_QCA7000_SPI is not set +CONFIG_QCA7000_UART=m CONFIG_QCOM_EMAC=m # CONFIG_RMNET is not set CONFIG_NET_VENDOR_RDC=y @@ -2898,6 +2909,7 @@ CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set +CONFIG_INPUT_RAVE_SP_PWRBUTTON=m # CONFIG_RMI4_CORE is not set # @@ -3540,6 +3552,7 @@ CONFIG_BD70528_WATCHDOG=m # CONFIG_GPIO_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set +CONFIG_RAVE_SP_WATCHDOG=m # CONFIG_ARM_SP805_WATCHDOG is not set # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set @@ -3671,6 +3684,7 @@ CONFIG_MFD_ROHM_BD70528=m # CONFIG_MFD_STPMIC1 is not set CONFIG_MFD_STMFX=m CONFIG_MFD_VEXPRESS_SYSREG=y +CONFIG_RAVE_SP_CORE=m # end of Multifunction device drivers CONFIG_REGULATOR=y @@ -4651,6 +4665,7 @@ CONFIG_BACKLIGHT_LP855X=y # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_BACKLIGHT_ARCXCNN is not set +CONFIG_BACKLIGHT_RAVE_SP=m # end of Backlight & LCD device support CONFIG_VIDEOMODE_HELPERS=y @@ -6186,6 +6201,7 @@ CONFIG_XILINX_XADC=m # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set +CONFIG_PMS7003=m CONFIG_SENSIRION_SGP30=m CONFIG_SPS30=m # CONFIG_VZ89X is not set @@ -6571,6 +6587,7 @@ CONFIG_RAS=y CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_ROCKCHIP_EFUSE=y +CONFIG_RAVE_SP_EEPROM=m # # HW tracing support diff --git a/config/kernel/linux-sunxi-current.config b/config/kernel/linux-sunxi-current.config index 263ab759e3..2b680a4778 100644 --- a/config/kernel/linux-sunxi-current.config +++ b/config/kernel/linux-sunxi-current.config @@ -4439,8 +4439,8 @@ CONFIG_DRM_TOSHIBA_TC358764=m # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TI_TFP410 is not set CONFIG_DRM_TI_SN65DSI86=m -CONFIG_DRM_ANALOGIX_DP_I2C=m CONFIG_DRM_ANALOGIX_ANX6345=m +CONFIG_DRM_ANALOGIX_DP=m # CONFIG_DRM_I2C_ADV7511 is not set CONFIG_DRM_DW_HDMI=y CONFIG_DRM_DW_HDMI_AHB_AUDIO=m diff --git a/patch/kernel/meson64-current/2000-drm-lima-simplify-driver-by-using-more-drm-helpers.patch b/patch/kernel/meson64-current/2000-drm-lima-simplify-driver-by-using-more-drm-helpers.patch index a209a9f43c..fa9192a56b 100644 --- a/patch/kernel/meson64-current/2000-drm-lima-simplify-driver-by-using-more-drm-helpers.patch +++ b/patch/kernel/meson64-current/2000-drm-lima-simplify-driver-by-using-more-drm-helpers.patch @@ -127,22 +127,23 @@ index 6854f5867d51..a5e88c3e6d25 100644 /** * drm_gem_object_lookup - look up a GEM object from its handle diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c -index d74442d71048..486ca51d5662 100644 +index 5906c80c4..4dd94482c 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c -@@ -130,9 +130,9 @@ panfrost_lookup_bos(struct drm_device *dev, +@@ -144,9 +144,10 @@ panfrost_lookup_bos(struct drm_device *dev, if (!job->implicit_fences) return -ENOMEM; -- return drm_gem_objects_lookup(file_priv, -- (void __user *)(uintptr_t)args->bo_handles, -- job->bo_count, &job->bos); -+ return drm_gem_objects_lookup_user(file_priv, -+ (void __user *)(uintptr_t)args->bo_handles, -+ job->bo_count, &job->bos); - } +- ret = drm_gem_objects_lookup(file_priv, +- (void __user *)(uintptr_t)args->bo_handles, +- job->bo_count, &job->bos); ++ ret = drm_gem_objects_lookup_user(file_priv, ++ (void __user *)(uintptr_t)args->bo_handles, ++ job->bo_count, &job->bos); ++ + if (ret) + return ret; - /** diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 6aaba14f5972..354fc8d240e4 100644 --- a/include/drm/drm_gem.h diff --git a/patch/kernel/meson64-dev/crypto-amlogic-fix-removal-of-module.patch b/patch/kernel/meson64-dev/crypto-amlogic-fix-removal-of-module.patch deleted file mode 100644 index 753e42c2a7..0000000000 --- a/patch/kernel/meson64-dev/crypto-amlogic-fix-removal-of-module.patch +++ /dev/null @@ -1,167 +0,0 @@ -From patchwork Mon Jan 6 19:29:50 2020 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Corentin Labbe -X-Patchwork-Id: 11319983 -Return-Path: - -Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org - [172.30.200.123]) - by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 03E37930 - for ; - Mon, 6 Jan 2020 19:30:00 +0000 (UTC) -Received: from bombadil.infradead.org (bombadil.infradead.org - [198.137.202.133]) - (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) - (No client certificate requested) - by mail.kernel.org (Postfix) with ESMTPS id D525E207FD - for ; - Mon, 6 Jan 2020 19:29:59 +0000 (UTC) -Authentication-Results: mail.kernel.org; - dkim=pass (2048-bit key) header.d=lists.infradead.org - header.i=@lists.infradead.org header.b="mBnjrc6G"; - dkim=fail reason="signature verification failed" (2048-bit key) - header.d=gmail.com header.i=@gmail.com header.b="MFDHoVhh" -DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D525E207FD -Authentication-Results: mail.kernel.org; - dmarc=fail (p=none dis=none) header.from=gmail.com -Authentication-Results: mail.kernel.org; - spf=none - smtp.mailfrom=linux-amlogic-bounces+patchwork-linux-amlogic=patchwork.kernel.org@lists.infradead.org -DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; - d=lists.infradead.org; s=bombadil.20170209; h=Sender: - Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: - List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To - :From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: - Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: - List-Owner; bh=89cgIB5HlDb2I4iTttzHAUYk94MUSAaT2AEXpvjAJDE=; b=mBnjrc6Gy9iAMT - lne+XSeI6NxcyEGKoOUifNWQxjVbY0MarlOXLwHW5fhiiIjO3TpUSgch81QI3heZ5DmyogE41IjS2 - LKmbxz8p9YREJ0X/KxjoSxhrN8E66qu+CVp0I4dxfLnTNxEiVcvIPK8ZrhxargF+CExe2RuVkMNzo - hXBWXi20rUPCgUw9j+9ZC/bImvuoE9vWy0BvQrNWywasTi0UDUQLhabXW+27fgRkMDlbtC2v4LxmM - 5lgH+Iol9hHzW73U1EXRMwy7qlA6oGbLM1ommJAykyT1prFzOxOo32KQpjlLU5b2z/UyS/fn+GX+D - s+RlgYD2z17y1d8aC65g==; -Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) - by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) - id 1ioY4d-0008AS-Jo; Mon, 06 Jan 2020 19:29:59 +0000 -Received: from mail-wm1-x344.google.com ([2a00:1450:4864:20::344]) - by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) - id 1ioY4b-00089n-4m - for linux-amlogic@lists.infradead.org; Mon, 06 Jan 2020 19:29:58 +0000 -Received: by mail-wm1-x344.google.com with SMTP id c127so12589591wme.1 - for ; - Mon, 06 Jan 2020 11:29:55 -0800 (PST) -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; - h=from:to:cc:subject:date:message-id:mime-version - :content-transfer-encoding; - bh=9Ur3CxFG0cQbKNwUJ75Zx2lXsthVwW+wWDfRyfXmnKM=; - b=MFDHoVhhfNfJOoS+7B7TS0SyZvJrXkAmv9gGVyRrLcFaG6lMwTT7g8Nw48eUSo/ihd - iE09TrqHNUuJ1yrNx8eqPe/Bf6gJegD+DVCBYVFa3za5W8hLkWvdoLTpZDEEiHtar4+Q - pKqqaX4vnkREBw8bLnRfq2kh5v610vdQecjHN/TN8/sSUkLUv+JvKm8Jsa/rdrblmhq0 - uhLdN8vIor7xFd3r94ysMJs7hOqQZN08M/sKaaagiqHpkuGpBI7l5slMNOoFkja7LlFr - 5lUstKr4VwNTFvhDrVj8RMeFN1GPti+JFk5/Hjf9t0KfwFGuOpMcuYVstzFEf8e8EJkN - F22Q== -X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20161025; - h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version - :content-transfer-encoding; - bh=9Ur3CxFG0cQbKNwUJ75Zx2lXsthVwW+wWDfRyfXmnKM=; - b=qQPhdUPoMsvsgU9d2CukIwU9859TqatMH1SnTrZvkekTdxmntIRxFea1Dk2WreO0bt - pCD2n/L1u/S54H6MrTatwUoLSJIAJejD2g3CwmzlqlCdu3yEGqzvgSVOpCkMx5i0/NVU - 7G1wK9F6//q0DBPuQ/Jmrrf4zRQC9B5p0LNbwK4uoZE6mjD4e0kksw74U4sdGwaAycmH - tS8sM4mLinfSdoVNcmCk7itJHz50cofmJi7m7y1Rg516xiQVRRTjyFlV60m2s+szXvXs - +LvACnlw15R2/Afntx6ItBWkaSU7IXUZOtyEubgG0EA74mnlltHrGZA3qS+53V47/gti - bQLQ== -X-Gm-Message-State: APjAAAVfuqk7uAKGGw84URMNJS9uSoCXyf4sG0XPXD6739T3y9rglZlQ - CQ2OfZAGcNs0ZtfmrRUt1Fc= -X-Google-Smtp-Source: - APXvYqyQllloLFr5JAArKfaDOfayLtkqaScpZ+uJ6DkBjZ3d+DoyF58NzIDEURVT4mhNYEGilCH9JA== -X-Received: by 2002:a1c:1dd7:: with SMTP id d206mr34934742wmd.5.1578338994696; - Mon, 06 Jan 2020 11:29:54 -0800 (PST) -Received: from Red.localdomain ([2a01:cb1d:147:7200:2e56:dcff:fed2:c6d6]) - by smtp.googlemail.com with ESMTPSA id - g21sm23802398wmh.17.2020.01.06.11.29.53 - (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Mon, 06 Jan 2020 11:29:54 -0800 (PST) -From: Corentin Labbe -To: davem@davemloft.net, herbert@gondor.apana.org.au, narmstrong@baylibre.com -Subject: [PATCH] crypto: amlogic: fix removal of module -Date: Mon, 6 Jan 2020 20:29:50 +0100 -Message-Id: <20200106192950.23475-1-clabbe.montjoie@gmail.com> -X-Mailer: git-send-email 2.24.1 -MIME-Version: 1.0 -X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 -X-CRM114-CacheID: sfid-20200106_112957_186126_D53DE925 -X-CRM114-Status: UNSURE ( 9.71 ) -X-CRM114-Notice: Please train this message. -X-Spam-Score: -0.2 (/) -X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: - Content analysis details: (-0.2 points) - pts rule name description - ---- ---------------------- - -------------------------------------------------- - -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, - no trust [2a00:1450:4864:20:0:0:0:344 listed in] - [list.dnswl.org] - 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail - provider (clabbe.montjoie[at]gmail.com) - 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record - -0.0 SPF_PASS SPF: sender matches SPF record - -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature - -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from - author's domain - 0.1 DKIM_SIGNED Message has a DKIM or DK signature, - not necessarily - valid - -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from - envelope-from domain -X-BeenThere: linux-amlogic@lists.infradead.org -X-Mailman-Version: 2.1.29 -Precedence: list -List-Id: -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Cc: linux-amlogic@lists.infradead.org, - Corentin Labbe , linux-crypto@vger.kernel.org, - linux-kernel@vger.kernel.org -Sender: "linux-amlogic" -Errors-To: - linux-amlogic-bounces+patchwork-linux-amlogic=patchwork.kernel.org@lists.infradead.org - -Removing the driver cause an oops due to the fact we clean an extra -channel. -Let's give the right index to the cleaning function. -Fixes: 48fe583fe541 ("crypto: amlogic - Add crypto accelerator for amlogic GXL") - -Signed-off-by: Corentin Labbe ---- - drivers/crypto/amlogic/amlogic-gxl-core.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/crypto/amlogic/amlogic-gxl-core.c b/drivers/crypto/amlogic/amlogic-gxl-core.c -index fa05fce1c0de..9d4ead2f7ebb 100644 ---- a/drivers/crypto/amlogic/amlogic-gxl-core.c -+++ b/drivers/crypto/amlogic/amlogic-gxl-core.c -@@ -289,7 +289,7 @@ static int meson_crypto_probe(struct platform_device *pdev) - error_alg: - meson_unregister_algs(mc); - error_flow: -- meson_free_chanlist(mc, MAXFLOW); -+ meson_free_chanlist(mc, MAXFLOW - 1); - clk_disable_unprepare(mc->busclk); - return err; - } -@@ -304,7 +304,7 @@ static int meson_crypto_remove(struct platform_device *pdev) - - meson_unregister_algs(mc); - -- meson_free_chanlist(mc, MAXFLOW); -+ meson_free_chanlist(mc, MAXFLOW - 1); - - clk_disable_unprepare(mc->busclk); - return 0; diff --git a/patch/kernel/odroidxu4-current/03-patch-5.4.18-19.patch b/patch/kernel/odroidxu4-current/03-patch-5.4.18-19.patch new file mode 100644 index 0000000000..a769bba6e5 --- /dev/null +++ b/patch/kernel/odroidxu4-current/03-patch-5.4.18-19.patch @@ -0,0 +1,15537 @@ +diff --git a/MAINTAINERS b/MAINTAINERS +index 4f7ac27d8651..d1aeebb59e6a 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -8704,8 +8704,10 @@ L: isdn4linux@listserv.isdn4linux.de (subscribers-only) + L: netdev@vger.kernel.org + W: http://www.isdn4linux.de + S: Maintained +-F: drivers/isdn/mISDN +-F: drivers/isdn/hardware ++F: drivers/isdn/mISDN/ ++F: drivers/isdn/hardware/ ++F: drivers/isdn/Kconfig ++F: drivers/isdn/Makefile + + ISDN/CAPI SUBSYSTEM + M: Karsten Keil +diff --git a/Makefile b/Makefile +index b6c151fd5227..2f55d377f0db 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 18 ++SUBLEVEL = 19 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/Kconfig b/arch/Kconfig +index 5f8a5d84dbbe..43102756304c 100644 +--- a/arch/Kconfig ++++ b/arch/Kconfig +@@ -396,9 +396,6 @@ config HAVE_ARCH_JUMP_LABEL_RELATIVE + config HAVE_RCU_TABLE_FREE + bool + +-config HAVE_RCU_TABLE_NO_INVALIDATE +- bool +- + config HAVE_MMU_GATHER_PAGE_SIZE + bool + +diff --git a/arch/arm/include/asm/kvm_emulate.h b/arch/arm/include/asm/kvm_emulate.h +index 40002416efec..8e995ec796c8 100644 +--- a/arch/arm/include/asm/kvm_emulate.h ++++ b/arch/arm/include/asm/kvm_emulate.h +@@ -14,13 +14,25 @@ + #include + + /* arm64 compatibility macros */ ++#define PSR_AA32_MODE_FIQ FIQ_MODE ++#define PSR_AA32_MODE_SVC SVC_MODE + #define PSR_AA32_MODE_ABT ABT_MODE + #define PSR_AA32_MODE_UND UND_MODE + #define PSR_AA32_T_BIT PSR_T_BIT ++#define PSR_AA32_F_BIT PSR_F_BIT + #define PSR_AA32_I_BIT PSR_I_BIT + #define PSR_AA32_A_BIT PSR_A_BIT + #define PSR_AA32_E_BIT PSR_E_BIT + #define PSR_AA32_IT_MASK PSR_IT_MASK ++#define PSR_AA32_GE_MASK 0x000f0000 ++#define PSR_AA32_DIT_BIT 0x00200000 ++#define PSR_AA32_PAN_BIT 0x00400000 ++#define PSR_AA32_SSBS_BIT 0x00800000 ++#define PSR_AA32_Q_BIT PSR_Q_BIT ++#define PSR_AA32_V_BIT PSR_V_BIT ++#define PSR_AA32_C_BIT PSR_C_BIT ++#define PSR_AA32_Z_BIT PSR_Z_BIT ++#define PSR_AA32_N_BIT PSR_N_BIT + + unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num); + +@@ -41,6 +53,11 @@ static inline void vcpu_write_spsr(struct kvm_vcpu *vcpu, unsigned long v) + *__vcpu_spsr(vcpu) = v; + } + ++static inline unsigned long host_spsr_to_spsr32(unsigned long spsr) ++{ ++ return spsr; ++} ++ + static inline unsigned long vcpu_get_reg(struct kvm_vcpu *vcpu, + u8 reg_num) + { +@@ -177,6 +194,11 @@ static inline bool kvm_vcpu_dabt_issext(struct kvm_vcpu *vcpu) + return kvm_vcpu_get_hsr(vcpu) & HSR_SSE; + } + ++static inline bool kvm_vcpu_dabt_issf(const struct kvm_vcpu *vcpu) ++{ ++ return false; ++} ++ + static inline int kvm_vcpu_dabt_get_rd(struct kvm_vcpu *vcpu) + { + return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT; +diff --git a/arch/arm/include/asm/kvm_mmio.h b/arch/arm/include/asm/kvm_mmio.h +index 7c0eddb0adb2..32fbf82e3ebc 100644 +--- a/arch/arm/include/asm/kvm_mmio.h ++++ b/arch/arm/include/asm/kvm_mmio.h +@@ -14,6 +14,8 @@ + struct kvm_decode { + unsigned long rt; + bool sign_extend; ++ /* Not used on 32-bit arm */ ++ bool sixty_four; + }; + + void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data); +diff --git a/arch/arm/mach-tegra/sleep-tegra30.S b/arch/arm/mach-tegra/sleep-tegra30.S +index b408fa56eb89..6922dd8d3e2d 100644 +--- a/arch/arm/mach-tegra/sleep-tegra30.S ++++ b/arch/arm/mach-tegra/sleep-tegra30.S +@@ -370,6 +370,14 @@ _pll_m_c_x_done: + pll_locked r1, r0, CLK_RESET_PLLC_BASE + pll_locked r1, r0, CLK_RESET_PLLX_BASE + ++ tegra_get_soc_id TEGRA_APB_MISC_BASE, r1 ++ cmp r1, #TEGRA30 ++ beq 1f ++ ldr r1, [r0, #CLK_RESET_PLLP_BASE] ++ bic r1, r1, #(1<<31) @ disable PllP bypass ++ str r1, [r0, #CLK_RESET_PLLP_BASE] ++1: ++ + mov32 r7, TEGRA_TMRUS_BASE + ldr r1, [r7] + add r1, r1, #LOCK_DELAY +@@ -630,7 +638,10 @@ tegra30_switch_cpu_to_clk32k: + str r0, [r4, #PMC_PLLP_WB0_OVERRIDE] + + /* disable PLLP, PLLA, PLLC and PLLX */ ++ tegra_get_soc_id TEGRA_APB_MISC_BASE, r1 ++ cmp r1, #TEGRA30 + ldr r0, [r5, #CLK_RESET_PLLP_BASE] ++ orrne r0, r0, #(1 << 31) @ enable PllP bypass on fast cluster + bic r0, r0, #(1 << 30) + str r0, [r5, #CLK_RESET_PLLP_BASE] + ldr r0, [r5, #CLK_RESET_PLLA_BASE] +diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c +index 7d042d5c43e3..27576c7b836e 100644 +--- a/arch/arm/mm/dma-mapping.c ++++ b/arch/arm/mm/dma-mapping.c +@@ -221,7 +221,7 @@ EXPORT_SYMBOL(arm_coherent_dma_ops); + + static int __dma_supported(struct device *dev, u64 mask, bool warn) + { +- unsigned long max_dma_pfn = min(max_pfn, arm_dma_pfn_limit); ++ unsigned long max_dma_pfn = min(max_pfn - 1, arm_dma_pfn_limit); + + /* + * Translate the device's DMA mask to a PFN limit. This +diff --git a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi +index 501a7330dbc8..522d3ef72df5 100644 +--- a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi ++++ b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi +@@ -73,6 +73,7 @@ + regulator-always-on; + regulator-boot-on; + regulator-name = "vdd_apc"; ++ regulator-initial-mode = <1>; + regulator-min-microvolt = <1048000>; + regulator-max-microvolt = <1384000>; + }; +diff --git a/arch/arm64/crypto/ghash-ce-glue.c b/arch/arm64/crypto/ghash-ce-glue.c +index 70b1469783f9..24bc0a3f26e2 100644 +--- a/arch/arm64/crypto/ghash-ce-glue.c ++++ b/arch/arm64/crypto/ghash-ce-glue.c +@@ -261,7 +261,7 @@ static int ghash_setkey(struct crypto_shash *tfm, + static struct shash_alg ghash_alg[] = {{ + .base.cra_name = "ghash", + .base.cra_driver_name = "ghash-neon", +- .base.cra_priority = 100, ++ .base.cra_priority = 150, + .base.cra_blocksize = GHASH_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct ghash_key), + .base.cra_module = THIS_MODULE, +diff --git a/arch/arm64/include/asm/daifflags.h b/arch/arm64/include/asm/daifflags.h +index 063c964af705..48bfbf70dbb0 100644 +--- a/arch/arm64/include/asm/daifflags.h ++++ b/arch/arm64/include/asm/daifflags.h +@@ -36,7 +36,7 @@ static inline void local_daif_mask(void) + trace_hardirqs_off(); + } + +-static inline unsigned long local_daif_save(void) ++static inline unsigned long local_daif_save_flags(void) + { + unsigned long flags; + +@@ -48,6 +48,15 @@ static inline unsigned long local_daif_save(void) + flags |= PSR_I_BIT; + } + ++ return flags; ++} ++ ++static inline unsigned long local_daif_save(void) ++{ ++ unsigned long flags; ++ ++ flags = local_daif_save_flags(); ++ + local_daif_mask(); + + return flags; +diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h +index d69c1efc63e7..6ff84f1f3b4c 100644 +--- a/arch/arm64/include/asm/kvm_emulate.h ++++ b/arch/arm64/include/asm/kvm_emulate.h +@@ -204,6 +204,38 @@ static inline void vcpu_write_spsr(struct kvm_vcpu *vcpu, unsigned long v) + vcpu_gp_regs(vcpu)->spsr[KVM_SPSR_EL1] = v; + } + ++/* ++ * The layout of SPSR for an AArch32 state is different when observed from an ++ * AArch64 SPSR_ELx or an AArch32 SPSR_*. This function generates the AArch32 ++ * view given an AArch64 view. ++ * ++ * In ARM DDI 0487E.a see: ++ * ++ * - The AArch64 view (SPSR_EL2) in section C5.2.18, page C5-426 ++ * - The AArch32 view (SPSR_abt) in section G8.2.126, page G8-6256 ++ * - The AArch32 view (SPSR_und) in section G8.2.132, page G8-6280 ++ * ++ * Which show the following differences: ++ * ++ * | Bit | AA64 | AA32 | Notes | ++ * +-----+------+------+-----------------------------| ++ * | 24 | DIT | J | J is RES0 in ARMv8 | ++ * | 21 | SS | DIT | SS doesn't exist in AArch32 | ++ * ++ * ... and all other bits are (currently) common. ++ */ ++static inline unsigned long host_spsr_to_spsr32(unsigned long spsr) ++{ ++ const unsigned long overlap = BIT(24) | BIT(21); ++ unsigned long dit = !!(spsr & PSR_AA32_DIT_BIT); ++ ++ spsr &= ~overlap; ++ ++ spsr |= dit << 21; ++ ++ return spsr; ++} ++ + static inline bool vcpu_mode_priv(const struct kvm_vcpu *vcpu) + { + u32 mode; +@@ -263,6 +295,11 @@ static inline bool kvm_vcpu_dabt_issext(const struct kvm_vcpu *vcpu) + return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SSE); + } + ++static inline bool kvm_vcpu_dabt_issf(const struct kvm_vcpu *vcpu) ++{ ++ return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SF); ++} ++ + static inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu) + { + return (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT; +diff --git a/arch/arm64/include/asm/kvm_mmio.h b/arch/arm64/include/asm/kvm_mmio.h +index 02b5c48fd467..b204501a0c39 100644 +--- a/arch/arm64/include/asm/kvm_mmio.h ++++ b/arch/arm64/include/asm/kvm_mmio.h +@@ -10,13 +10,11 @@ + #include + #include + +-/* +- * This is annoying. The mmio code requires this, even if we don't +- * need any decoding. To be fixed. +- */ + struct kvm_decode { + unsigned long rt; + bool sign_extend; ++ /* Witdth of the register accessed by the faulting instruction is 64-bits */ ++ bool sixty_four; + }; + + void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data); +diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h +index fbebb411ae20..bf57308fcd63 100644 +--- a/arch/arm64/include/asm/ptrace.h ++++ b/arch/arm64/include/asm/ptrace.h +@@ -62,6 +62,7 @@ + #define PSR_AA32_I_BIT 0x00000080 + #define PSR_AA32_A_BIT 0x00000100 + #define PSR_AA32_E_BIT 0x00000200 ++#define PSR_AA32_PAN_BIT 0x00400000 + #define PSR_AA32_SSBS_BIT 0x00800000 + #define PSR_AA32_DIT_BIT 0x01000000 + #define PSR_AA32_Q_BIT 0x08000000 +diff --git a/arch/arm64/include/uapi/asm/ptrace.h b/arch/arm64/include/uapi/asm/ptrace.h +index 7ed9294e2004..d1bb5b69f1ce 100644 +--- a/arch/arm64/include/uapi/asm/ptrace.h ++++ b/arch/arm64/include/uapi/asm/ptrace.h +@@ -49,6 +49,7 @@ + #define PSR_SSBS_BIT 0x00001000 + #define PSR_PAN_BIT 0x00400000 + #define PSR_UAO_BIT 0x00800000 ++#define PSR_DIT_BIT 0x01000000 + #define PSR_V_BIT 0x10000000 + #define PSR_C_BIT 0x20000000 + #define PSR_Z_BIT 0x40000000 +diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c +index 3a58e9db5cfe..a100483b47c4 100644 +--- a/arch/arm64/kernel/acpi.c ++++ b/arch/arm64/kernel/acpi.c +@@ -274,7 +274,7 @@ int apei_claim_sea(struct pt_regs *regs) + if (!IS_ENABLED(CONFIG_ACPI_APEI_GHES)) + return err; + +- current_flags = arch_local_save_flags(); ++ current_flags = local_daif_save_flags(); + + /* + * SEA can interrupt SError, mask it and describe this as an NMI so +diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c +index a9d25a305af5..a364a4ad5479 100644 +--- a/arch/arm64/kvm/inject_fault.c ++++ b/arch/arm64/kvm/inject_fault.c +@@ -14,9 +14,6 @@ + #include + #include + +-#define PSTATE_FAULT_BITS_64 (PSR_MODE_EL1h | PSR_A_BIT | PSR_F_BIT | \ +- PSR_I_BIT | PSR_D_BIT) +- + #define CURRENT_EL_SP_EL0_VECTOR 0x0 + #define CURRENT_EL_SP_ELx_VECTOR 0x200 + #define LOWER_EL_AArch64_VECTOR 0x400 +@@ -50,6 +47,69 @@ static u64 get_except_vector(struct kvm_vcpu *vcpu, enum exception_type type) + return vcpu_read_sys_reg(vcpu, VBAR_EL1) + exc_offset + type; + } + ++/* ++ * When an exception is taken, most PSTATE fields are left unchanged in the ++ * handler. However, some are explicitly overridden (e.g. M[4:0]). Luckily all ++ * of the inherited bits have the same position in the AArch64/AArch32 SPSR_ELx ++ * layouts, so we don't need to shuffle these for exceptions from AArch32 EL0. ++ * ++ * For the SPSR_ELx layout for AArch64, see ARM DDI 0487E.a page C5-429. ++ * For the SPSR_ELx layout for AArch32, see ARM DDI 0487E.a page C5-426. ++ * ++ * Here we manipulate the fields in order of the AArch64 SPSR_ELx layout, from ++ * MSB to LSB. ++ */ ++static unsigned long get_except64_pstate(struct kvm_vcpu *vcpu) ++{ ++ unsigned long sctlr = vcpu_read_sys_reg(vcpu, SCTLR_EL1); ++ unsigned long old, new; ++ ++ old = *vcpu_cpsr(vcpu); ++ new = 0; ++ ++ new |= (old & PSR_N_BIT); ++ new |= (old & PSR_Z_BIT); ++ new |= (old & PSR_C_BIT); ++ new |= (old & PSR_V_BIT); ++ ++ // TODO: TCO (if/when ARMv8.5-MemTag is exposed to guests) ++ ++ new |= (old & PSR_DIT_BIT); ++ ++ // PSTATE.UAO is set to zero upon any exception to AArch64 ++ // See ARM DDI 0487E.a, page D5-2579. ++ ++ // PSTATE.PAN is unchanged unless SCTLR_ELx.SPAN == 0b0 ++ // SCTLR_ELx.SPAN is RES1 when ARMv8.1-PAN is not implemented ++ // See ARM DDI 0487E.a, page D5-2578. ++ new |= (old & PSR_PAN_BIT); ++ if (!(sctlr & SCTLR_EL1_SPAN)) ++ new |= PSR_PAN_BIT; ++ ++ // PSTATE.SS is set to zero upon any exception to AArch64 ++ // See ARM DDI 0487E.a, page D2-2452. ++ ++ // PSTATE.IL is set to zero upon any exception to AArch64 ++ // See ARM DDI 0487E.a, page D1-2306. ++ ++ // PSTATE.SSBS is set to SCTLR_ELx.DSSBS upon any exception to AArch64 ++ // See ARM DDI 0487E.a, page D13-3258 ++ if (sctlr & SCTLR_ELx_DSSBS) ++ new |= PSR_SSBS_BIT; ++ ++ // PSTATE.BTYPE is set to zero upon any exception to AArch64 ++ // See ARM DDI 0487E.a, pages D1-2293 to D1-2294. ++ ++ new |= PSR_D_BIT; ++ new |= PSR_A_BIT; ++ new |= PSR_I_BIT; ++ new |= PSR_F_BIT; ++ ++ new |= PSR_MODE_EL1h; ++ ++ return new; ++} ++ + static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr) + { + unsigned long cpsr = *vcpu_cpsr(vcpu); +@@ -59,7 +119,7 @@ static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr + vcpu_write_elr_el1(vcpu, *vcpu_pc(vcpu)); + *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); + +- *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; ++ *vcpu_cpsr(vcpu) = get_except64_pstate(vcpu); + vcpu_write_spsr(vcpu, cpsr); + + vcpu_write_sys_reg(vcpu, addr, FAR_EL1); +@@ -94,7 +154,7 @@ static void inject_undef64(struct kvm_vcpu *vcpu) + vcpu_write_elr_el1(vcpu, *vcpu_pc(vcpu)); + *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); + +- *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; ++ *vcpu_cpsr(vcpu) = get_except64_pstate(vcpu); + vcpu_write_spsr(vcpu, cpsr); + + /* +diff --git a/arch/mips/Makefile.postlink b/arch/mips/Makefile.postlink +index 4eea4188cb20..13e0beb9eee3 100644 +--- a/arch/mips/Makefile.postlink ++++ b/arch/mips/Makefile.postlink +@@ -12,7 +12,7 @@ __archpost: + include scripts/Kbuild.include + + CMD_RELOCS = arch/mips/boot/tools/relocs +-quiet_cmd_relocs = RELOCS $@ ++quiet_cmd_relocs = RELOCS $@ + cmd_relocs = $(CMD_RELOCS) $@ + + # `@true` prevents complaint when there is nothing to be done +diff --git a/arch/mips/boot/Makefile b/arch/mips/boot/Makefile +index 528bd73d530a..4ed45ade32a1 100644 +--- a/arch/mips/boot/Makefile ++++ b/arch/mips/boot/Makefile +@@ -123,7 +123,7 @@ $(obj)/vmlinux.its.S: $(addprefix $(srctree)/arch/mips/$(PLATFORM)/,$(ITS_INPUTS + targets += vmlinux.its + targets += vmlinux.gz.its + targets += vmlinux.bz2.its +-targets += vmlinux.lzmo.its ++targets += vmlinux.lzma.its + targets += vmlinux.lzo.its + + quiet_cmd_cpp_its_S = ITS $@ +diff --git a/arch/mips/kernel/syscalls/Makefile b/arch/mips/kernel/syscalls/Makefile +index a3d4bec695c6..6efb2f6889a7 100644 +--- a/arch/mips/kernel/syscalls/Makefile ++++ b/arch/mips/kernel/syscalls/Makefile +@@ -18,7 +18,7 @@ quiet_cmd_syshdr = SYSHDR $@ + '$(syshdr_pfx_$(basetarget))' \ + '$(syshdr_offset_$(basetarget))' + +-quiet_cmd_sysnr = SYSNR $@ ++quiet_cmd_sysnr = SYSNR $@ + cmd_sysnr = $(CONFIG_SHELL) '$(sysnr)' '$<' '$@' \ + '$(sysnr_abis_$(basetarget))' \ + '$(sysnr_pfx_$(basetarget))' \ +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 3e56c9c2f16e..2b1033f13210 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -221,8 +221,7 @@ config PPC + select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP +- select HAVE_RCU_TABLE_FREE if SMP +- select HAVE_RCU_TABLE_NO_INVALIDATE if HAVE_RCU_TABLE_FREE ++ select HAVE_RCU_TABLE_FREE + select HAVE_MMU_GATHER_PAGE_SIZE + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_RELIABLE_STACKTRACE if PPC_BOOK3S_64 && CPU_LITTLE_ENDIAN +@@ -237,6 +236,7 @@ config PPC + select NEED_DMA_MAP_STATE if PPC64 || NOT_COHERENT_CACHE + select NEED_SG_DMA_LENGTH + select OF ++ select OF_DMA_DEFAULT_COHERENT if !NOT_COHERENT_CACHE + select OF_EARLY_FLATTREE + select OLD_SIGACTION if PPC32 + select OLD_SIGSUSPEND +diff --git a/arch/powerpc/boot/4xx.c b/arch/powerpc/boot/4xx.c +index 1699e9531552..00c4d843a023 100644 +--- a/arch/powerpc/boot/4xx.c ++++ b/arch/powerpc/boot/4xx.c +@@ -228,7 +228,7 @@ void ibm4xx_denali_fixup_memsize(void) + dpath = 8; /* 64 bits */ + + /* get address pins (rows) */ +- val = SDRAM0_READ(DDR0_42); ++ val = SDRAM0_READ(DDR0_42); + + row = DDR_GET_VAL(val, DDR_APIN, DDR_APIN_SHIFT); + if (row > max_row) +diff --git a/arch/powerpc/include/asm/book3s/32/kup.h b/arch/powerpc/include/asm/book3s/32/kup.h +index f9dc597b0b86..91c8f1d9bcee 100644 +--- a/arch/powerpc/include/asm/book3s/32/kup.h ++++ b/arch/powerpc/include/asm/book3s/32/kup.h +@@ -102,11 +102,13 @@ static inline void kuap_update_sr(u32 sr, u32 addr, u32 end) + isync(); /* Context sync required after mtsrin() */ + } + +-static inline void allow_user_access(void __user *to, const void __user *from, u32 size) ++static __always_inline void allow_user_access(void __user *to, const void __user *from, ++ u32 size, unsigned long dir) + { + u32 addr, end; + +- if (__builtin_constant_p(to) && to == NULL) ++ BUILD_BUG_ON(!__builtin_constant_p(dir)); ++ if (!(dir & KUAP_WRITE)) + return; + + addr = (__force u32)to; +@@ -119,11 +121,16 @@ static inline void allow_user_access(void __user *to, const void __user *from, u + kuap_update_sr(mfsrin(addr) & ~SR_KS, addr, end); /* Clear Ks */ + } + +-static inline void prevent_user_access(void __user *to, const void __user *from, u32 size) ++static __always_inline void prevent_user_access(void __user *to, const void __user *from, ++ u32 size, unsigned long dir) + { + u32 addr = (__force u32)to; + u32 end = min(addr + size, TASK_SIZE); + ++ BUILD_BUG_ON(!__builtin_constant_p(dir)); ++ if (!(dir & KUAP_WRITE)) ++ return; ++ + if (!addr || addr >= TASK_SIZE || !size) + return; + +@@ -131,12 +138,17 @@ static inline void prevent_user_access(void __user *to, const void __user *from, + kuap_update_sr(mfsrin(addr) | SR_KS, addr, end); /* set Ks */ + } + +-static inline bool bad_kuap_fault(struct pt_regs *regs, bool is_write) ++static inline bool ++bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) + { ++ unsigned long begin = regs->kuap & 0xf0000000; ++ unsigned long end = regs->kuap << 28; ++ + if (!is_write) + return false; + +- return WARN(!regs->kuap, "Bug: write fault blocked by segment registers !"); ++ return WARN(address < begin || address >= end, ++ "Bug: write fault blocked by segment registers !"); + } + + #endif /* CONFIG_PPC_KUAP */ +diff --git a/arch/powerpc/include/asm/book3s/32/pgalloc.h b/arch/powerpc/include/asm/book3s/32/pgalloc.h +index 998317702630..dc5c039eb28e 100644 +--- a/arch/powerpc/include/asm/book3s/32/pgalloc.h ++++ b/arch/powerpc/include/asm/book3s/32/pgalloc.h +@@ -49,7 +49,6 @@ static inline void pgtable_free(void *table, unsigned index_size) + + #define get_hugepd_cache_index(x) (x) + +-#ifdef CONFIG_SMP + static inline void pgtable_free_tlb(struct mmu_gather *tlb, + void *table, int shift) + { +@@ -66,13 +65,6 @@ static inline void __tlb_remove_table(void *_table) + + pgtable_free(table, shift); + } +-#else +-static inline void pgtable_free_tlb(struct mmu_gather *tlb, +- void *table, int shift) +-{ +- pgtable_free(table, shift); +-} +-#endif + + static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, + unsigned long address) +diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h b/arch/powerpc/include/asm/book3s/64/kup-radix.h +index f254de956d6a..c8d1076e0ebb 100644 +--- a/arch/powerpc/include/asm/book3s/64/kup-radix.h ++++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h +@@ -77,25 +77,27 @@ static inline void set_kuap(unsigned long value) + isync(); + } + +-static inline void allow_user_access(void __user *to, const void __user *from, +- unsigned long size) ++static __always_inline void allow_user_access(void __user *to, const void __user *from, ++ unsigned long size, unsigned long dir) + { + // This is written so we can resolve to a single case at build time +- if (__builtin_constant_p(to) && to == NULL) ++ BUILD_BUG_ON(!__builtin_constant_p(dir)); ++ if (dir == KUAP_READ) + set_kuap(AMR_KUAP_BLOCK_WRITE); +- else if (__builtin_constant_p(from) && from == NULL) ++ else if (dir == KUAP_WRITE) + set_kuap(AMR_KUAP_BLOCK_READ); + else + set_kuap(0); + } + + static inline void prevent_user_access(void __user *to, const void __user *from, +- unsigned long size) ++ unsigned long size, unsigned long dir) + { + set_kuap(AMR_KUAP_BLOCKED); + } + +-static inline bool bad_kuap_fault(struct pt_regs *regs, bool is_write) ++static inline bool ++bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) + { + return WARN(mmu_has_feature(MMU_FTR_RADIX_KUAP) && + (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)), +diff --git a/arch/powerpc/include/asm/book3s/64/pgalloc.h b/arch/powerpc/include/asm/book3s/64/pgalloc.h +index d5a44912902f..cae9e814593a 100644 +--- a/arch/powerpc/include/asm/book3s/64/pgalloc.h ++++ b/arch/powerpc/include/asm/book3s/64/pgalloc.h +@@ -19,9 +19,7 @@ extern struct vmemmap_backing *vmemmap_list; + extern pmd_t *pmd_fragment_alloc(struct mm_struct *, unsigned long); + extern void pmd_fragment_free(unsigned long *); + extern void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift); +-#ifdef CONFIG_SMP + extern void __tlb_remove_table(void *_table); +-#endif + void pte_frag_destroy(void *pte_frag); + + static inline pgd_t *radix__pgd_alloc(struct mm_struct *mm) +diff --git a/arch/powerpc/include/asm/futex.h b/arch/powerpc/include/asm/futex.h +index eea28ca679db..bc7d9d06a6d9 100644 +--- a/arch/powerpc/include/asm/futex.h ++++ b/arch/powerpc/include/asm/futex.h +@@ -35,7 +35,7 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, + { + int oldval = 0, ret; + +- allow_write_to_user(uaddr, sizeof(*uaddr)); ++ allow_read_write_user(uaddr, uaddr, sizeof(*uaddr)); + pagefault_disable(); + + switch (op) { +@@ -62,7 +62,7 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, + + *oval = oldval; + +- prevent_write_to_user(uaddr, sizeof(*uaddr)); ++ prevent_read_write_user(uaddr, uaddr, sizeof(*uaddr)); + return ret; + } + +@@ -76,7 +76,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, + if (!access_ok(uaddr, sizeof(u32))) + return -EFAULT; + +- allow_write_to_user(uaddr, sizeof(*uaddr)); ++ allow_read_write_user(uaddr, uaddr, sizeof(*uaddr)); ++ + __asm__ __volatile__ ( + PPC_ATOMIC_ENTRY_BARRIER + "1: lwarx %1,0,%3 # futex_atomic_cmpxchg_inatomic\n\ +@@ -97,7 +98,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, + : "cc", "memory"); + + *uval = prev; +- prevent_write_to_user(uaddr, sizeof(*uaddr)); ++ prevent_read_write_user(uaddr, uaddr, sizeof(*uaddr)); ++ + return ret; + } + +diff --git a/arch/powerpc/include/asm/kup.h b/arch/powerpc/include/asm/kup.h +index 5b5e39643a27..94f24928916a 100644 +--- a/arch/powerpc/include/asm/kup.h ++++ b/arch/powerpc/include/asm/kup.h +@@ -2,6 +2,10 @@ + #ifndef _ASM_POWERPC_KUP_H_ + #define _ASM_POWERPC_KUP_H_ + ++#define KUAP_READ 1 ++#define KUAP_WRITE 2 ++#define KUAP_READ_WRITE (KUAP_READ | KUAP_WRITE) ++ + #ifdef CONFIG_PPC64 + #include + #endif +@@ -42,32 +46,48 @@ void setup_kuap(bool disabled); + #else + static inline void setup_kuap(bool disabled) { } + static inline void allow_user_access(void __user *to, const void __user *from, +- unsigned long size) { } ++ unsigned long size, unsigned long dir) { } + static inline void prevent_user_access(void __user *to, const void __user *from, +- unsigned long size) { } +-static inline bool bad_kuap_fault(struct pt_regs *regs, bool is_write) { return false; } ++ unsigned long size, unsigned long dir) { } ++static inline bool ++bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) ++{ ++ return false; ++} + #endif /* CONFIG_PPC_KUAP */ + + static inline void allow_read_from_user(const void __user *from, unsigned long size) + { +- allow_user_access(NULL, from, size); ++ allow_user_access(NULL, from, size, KUAP_READ); + } + + static inline void allow_write_to_user(void __user *to, unsigned long size) + { +- allow_user_access(to, NULL, size); ++ allow_user_access(to, NULL, size, KUAP_WRITE); ++} ++ ++static inline void allow_read_write_user(void __user *to, const void __user *from, ++ unsigned long size) ++{ ++ allow_user_access(to, from, size, KUAP_READ_WRITE); + } + + static inline void prevent_read_from_user(const void __user *from, unsigned long size) + { +- prevent_user_access(NULL, from, size); ++ prevent_user_access(NULL, from, size, KUAP_READ); + } + + static inline void prevent_write_to_user(void __user *to, unsigned long size) + { +- prevent_user_access(to, NULL, size); ++ prevent_user_access(to, NULL, size, KUAP_WRITE); ++} ++ ++static inline void prevent_read_write_user(void __user *to, const void __user *from, ++ unsigned long size) ++{ ++ prevent_user_access(to, from, size, KUAP_READ_WRITE); + } + + #endif /* !__ASSEMBLY__ */ + +-#endif /* _ASM_POWERPC_KUP_H_ */ ++#endif /* _ASM_POWERPC_KUAP_H_ */ +diff --git a/arch/powerpc/include/asm/nohash/32/kup-8xx.h b/arch/powerpc/include/asm/nohash/32/kup-8xx.h +index 1c3133b5f86a..6fe97465e350 100644 +--- a/arch/powerpc/include/asm/nohash/32/kup-8xx.h ++++ b/arch/powerpc/include/asm/nohash/32/kup-8xx.h +@@ -34,18 +34,19 @@ + #include + + static inline void allow_user_access(void __user *to, const void __user *from, +- unsigned long size) ++ unsigned long size, unsigned long dir) + { + mtspr(SPRN_MD_AP, MD_APG_INIT); + } + + static inline void prevent_user_access(void __user *to, const void __user *from, +- unsigned long size) ++ unsigned long size, unsigned long dir) + { + mtspr(SPRN_MD_AP, MD_APG_KUAP); + } + +-static inline bool bad_kuap_fault(struct pt_regs *regs, bool is_write) ++static inline bool ++bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) + { + return WARN(!((regs->kuap ^ MD_APG_KUAP) & 0xf0000000), + "Bug: fault blocked by AP register !"); +diff --git a/arch/powerpc/include/asm/nohash/pgalloc.h b/arch/powerpc/include/asm/nohash/pgalloc.h +index 332b13b4ecdb..29c43665a753 100644 +--- a/arch/powerpc/include/asm/nohash/pgalloc.h ++++ b/arch/powerpc/include/asm/nohash/pgalloc.h +@@ -46,7 +46,6 @@ static inline void pgtable_free(void *table, int shift) + + #define get_hugepd_cache_index(x) (x) + +-#ifdef CONFIG_SMP + static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift) + { + unsigned long pgf = (unsigned long)table; +@@ -64,13 +63,6 @@ static inline void __tlb_remove_table(void *_table) + pgtable_free(table, shift); + } + +-#else +-static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift) +-{ +- pgtable_free(table, shift); +-} +-#endif +- + static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, + unsigned long address) + { +diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h +index b2c0be93929d..7f3a8b902325 100644 +--- a/arch/powerpc/include/asm/tlb.h ++++ b/arch/powerpc/include/asm/tlb.h +@@ -26,6 +26,17 @@ + + #define tlb_flush tlb_flush + extern void tlb_flush(struct mmu_gather *tlb); ++/* ++ * book3s: ++ * Hash does not use the linux page-tables, so we can avoid ++ * the TLB invalidate for page-table freeing, Radix otoh does use the ++ * page-tables and needs the TLBI. ++ * ++ * nohash: ++ * We still do TLB invalidate in the __pte_free_tlb routine before we ++ * add the page table pages to mmu gather table batch. ++ */ ++#define tlb_needs_table_invalidate() radix_enabled() + + /* Get the generic bits... */ + #include +diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h +index c92fe7fe9692..cafad1960e76 100644 +--- a/arch/powerpc/include/asm/uaccess.h ++++ b/arch/powerpc/include/asm/uaccess.h +@@ -313,9 +313,9 @@ raw_copy_in_user(void __user *to, const void __user *from, unsigned long n) + unsigned long ret; + + barrier_nospec(); +- allow_user_access(to, from, n); ++ allow_read_write_user(to, from, n); + ret = __copy_tofrom_user(to, from, n); +- prevent_user_access(to, from, n); ++ prevent_read_write_user(to, from, n); + return ret; + } + #endif /* __powerpc64__ */ +diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S +index d60908ea37fb..59bb4f4ae316 100644 +--- a/arch/powerpc/kernel/entry_32.S ++++ b/arch/powerpc/kernel/entry_32.S +@@ -179,7 +179,7 @@ transfer_to_handler: + 2: /* if from kernel, check interrupted DOZE/NAP mode and + * check for stack overflow + */ +- kuap_save_and_lock r11, r12, r9, r2, r0 ++ kuap_save_and_lock r11, r12, r9, r2, r6 + addi r2, r12, -THREAD + lwz r9,KSP_LIMIT(r12) + cmplw r1,r9 /* if r1 <= ksp_limit */ +@@ -284,6 +284,7 @@ reenable_mmu: + rlwinm r9,r9,0,~MSR_EE + lwz r12,_LINK(r11) /* and return to address in LR */ + kuap_restore r11, r2, r3, r4, r5 ++ lwz r2, GPR2(r11) + b fast_exception_return + #endif + +diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c +index 709cf1fd4cf4..36abbe3c346d 100644 +--- a/arch/powerpc/kvm/book3s_hv.c ++++ b/arch/powerpc/kvm/book3s_hv.c +@@ -2354,7 +2354,7 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm, + mutex_unlock(&kvm->lock); + + if (!vcore) +- goto free_vcpu; ++ goto uninit_vcpu; + + spin_lock(&vcore->lock); + ++vcore->num_threads; +@@ -2371,6 +2371,8 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm, + + return vcpu; + ++uninit_vcpu: ++ kvm_vcpu_uninit(vcpu); + free_vcpu: + kmem_cache_free(kvm_vcpu_cache, vcpu); + out: +diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c +index cc65af8fe6f7..3f6ad3f58628 100644 +--- a/arch/powerpc/kvm/book3s_pr.c ++++ b/arch/powerpc/kvm/book3s_pr.c +@@ -1769,10 +1769,12 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_pr(struct kvm *kvm, + + err = kvmppc_mmu_init(vcpu); + if (err < 0) +- goto uninit_vcpu; ++ goto free_shared_page; + + return vcpu; + ++free_shared_page: ++ free_page((unsigned long)vcpu->arch.shared); + uninit_vcpu: + kvm_vcpu_uninit(vcpu); + free_shadow_vcpu: +diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c +index 5a3373e06e60..235d57d6c205 100644 +--- a/arch/powerpc/kvm/book3s_xive_native.c ++++ b/arch/powerpc/kvm/book3s_xive_native.c +@@ -638,7 +638,7 @@ static int kvmppc_xive_native_set_queue_config(struct kvmppc_xive *xive, + srcu_idx = srcu_read_lock(&kvm->srcu); + gfn = gpa_to_gfn(kvm_eq.qaddr); + +- page_size = kvm_host_page_size(kvm, gfn); ++ page_size = kvm_host_page_size(vcpu, gfn); + if (1ull << kvm_eq.qshift > page_size) { + srcu_read_unlock(&kvm->srcu, srcu_idx); + pr_warn("Incompatible host page size %lx!\n", page_size); +diff --git a/arch/powerpc/mm/book3s64/pgtable.c b/arch/powerpc/mm/book3s64/pgtable.c +index 75483b40fcb1..2bf7e1b4fd82 100644 +--- a/arch/powerpc/mm/book3s64/pgtable.c ++++ b/arch/powerpc/mm/book3s64/pgtable.c +@@ -378,7 +378,6 @@ static inline void pgtable_free(void *table, int index) + } + } + +-#ifdef CONFIG_SMP + void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int index) + { + unsigned long pgf = (unsigned long)table; +@@ -395,12 +394,6 @@ void __tlb_remove_table(void *_table) + + return pgtable_free(table, index); + } +-#else +-void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int index) +-{ +- return pgtable_free(table, index); +-} +-#endif + + #ifdef CONFIG_PROC_FS + atomic_long_t direct_pages_count[MMU_PAGE_COUNT]; +diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c +index 8432c281de92..9298905cfe74 100644 +--- a/arch/powerpc/mm/fault.c ++++ b/arch/powerpc/mm/fault.c +@@ -233,7 +233,7 @@ static bool bad_kernel_fault(struct pt_regs *regs, unsigned long error_code, + + // Read/write fault in a valid region (the exception table search passed + // above), but blocked by KUAP is bad, it can never succeed. +- if (bad_kuap_fault(regs, is_write)) ++ if (bad_kuap_fault(regs, address, is_write)) + return true; + + // What's left? Kernel fault on user in well defined regions (extable +diff --git a/arch/powerpc/mm/ptdump/ptdump.c b/arch/powerpc/mm/ptdump/ptdump.c +index 2f9ddc29c535..c73205172447 100644 +--- a/arch/powerpc/mm/ptdump/ptdump.c ++++ b/arch/powerpc/mm/ptdump/ptdump.c +@@ -173,10 +173,12 @@ static void dump_addr(struct pg_state *st, unsigned long addr) + + static void note_prot_wx(struct pg_state *st, unsigned long addr) + { ++ pte_t pte = __pte(st->current_flags); ++ + if (!IS_ENABLED(CONFIG_PPC_DEBUG_WX) || !st->check_wx) + return; + +- if (!((st->current_flags & pgprot_val(PAGE_KERNEL_X)) == pgprot_val(PAGE_KERNEL_X))) ++ if (!pte_write(pte) || !pte_exec(pte)) + return; + + WARN_ONCE(1, "powerpc/mm: Found insecure W+X mapping at address %p/%pS\n", +diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c +index 8e700390f3d6..4c3af2e9eb8e 100644 +--- a/arch/powerpc/platforms/pseries/hotplug-memory.c ++++ b/arch/powerpc/platforms/pseries/hotplug-memory.c +@@ -360,8 +360,10 @@ static bool lmb_is_removable(struct drmem_lmb *lmb) + + for (i = 0; i < scns_per_block; i++) { + pfn = PFN_DOWN(phys_addr); +- if (!pfn_present(pfn)) ++ if (!pfn_present(pfn)) { ++ phys_addr += MIN_MEMORY_BLOCK_SIZE; + continue; ++ } + + rc &= is_mem_section_removable(pfn, PAGES_PER_SECTION); + phys_addr += MIN_MEMORY_BLOCK_SIZE; +diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c +index d83364ebc5c5..8057aafd5f5e 100644 +--- a/arch/powerpc/xmon/xmon.c ++++ b/arch/powerpc/xmon/xmon.c +@@ -1894,15 +1894,14 @@ static void dump_300_sprs(void) + + printf("pidr = %.16lx tidr = %.16lx\n", + mfspr(SPRN_PID), mfspr(SPRN_TIDR)); +- printf("asdr = %.16lx psscr = %.16lx\n", +- mfspr(SPRN_ASDR), hv ? mfspr(SPRN_PSSCR) +- : mfspr(SPRN_PSSCR_PR)); ++ printf("psscr = %.16lx\n", ++ hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR)); + + if (!hv) + return; + +- printf("ptcr = %.16lx\n", +- mfspr(SPRN_PTCR)); ++ printf("ptcr = %.16lx asdr = %.16lx\n", ++ mfspr(SPRN_PTCR), mfspr(SPRN_ASDR)); + #endif + } + +diff --git a/arch/riscv/net/bpf_jit_comp.c b/arch/riscv/net/bpf_jit_comp.c +index 7fbf56aab661..e2279fed8f56 100644 +--- a/arch/riscv/net/bpf_jit_comp.c ++++ b/arch/riscv/net/bpf_jit_comp.c +@@ -120,6 +120,11 @@ static bool seen_reg(int reg, struct rv_jit_context *ctx) + return false; + } + ++static void mark_fp(struct rv_jit_context *ctx) ++{ ++ __set_bit(RV_CTX_F_SEEN_S5, &ctx->flags); ++} ++ + static void mark_call(struct rv_jit_context *ctx) + { + __set_bit(RV_CTX_F_SEEN_CALL, &ctx->flags); +@@ -596,7 +601,8 @@ static void __build_epilogue(u8 reg, struct rv_jit_context *ctx) + + emit(rv_addi(RV_REG_SP, RV_REG_SP, stack_adjust), ctx); + /* Set return value. */ +- emit(rv_addi(RV_REG_A0, RV_REG_A5, 0), ctx); ++ if (reg == RV_REG_RA) ++ emit(rv_addi(RV_REG_A0, RV_REG_A5, 0), ctx); + emit(rv_jalr(RV_REG_ZERO, reg, 0), ctx); + } + +@@ -1426,6 +1432,10 @@ static void build_prologue(struct rv_jit_context *ctx) + { + int stack_adjust = 0, store_offset, bpf_stack_adjust; + ++ bpf_stack_adjust = round_up(ctx->prog->aux->stack_depth, 16); ++ if (bpf_stack_adjust) ++ mark_fp(ctx); ++ + if (seen_reg(RV_REG_RA, ctx)) + stack_adjust += 8; + stack_adjust += 8; /* RV_REG_FP */ +@@ -1443,7 +1453,6 @@ static void build_prologue(struct rv_jit_context *ctx) + stack_adjust += 8; + + stack_adjust = round_up(stack_adjust, 16); +- bpf_stack_adjust = round_up(ctx->prog->aux->stack_depth, 16); + stack_adjust += bpf_stack_adjust; + + store_offset = stack_adjust - 8; +diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h +index 823578c6b9e2..3f5cb55cde35 100644 +--- a/arch/s390/include/asm/page.h ++++ b/arch/s390/include/asm/page.h +@@ -33,6 +33,8 @@ + #define ARCH_HAS_PREPARE_HUGEPAGE + #define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH + ++#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA ++ + #include + #ifndef __ASSEMBLY__ + +diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c +index d047e846e1b9..756c627f7e54 100644 +--- a/arch/s390/kvm/kvm-s390.c ++++ b/arch/s390/kvm/kvm-s390.c +@@ -2863,9 +2863,7 @@ static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu) + vcpu->arch.sie_block->gcr[14] = CR14_UNUSED_32 | + CR14_UNUSED_33 | + CR14_EXTERNAL_DAMAGE_SUBMASK; +- /* make sure the new fpc will be lazily loaded */ +- save_fpu_regs(); +- current->thread.fpu.fpc = 0; ++ vcpu->run->s.regs.fpc = 0; + vcpu->arch.sie_block->gbea = 1; + vcpu->arch.sie_block->pp = 0; + vcpu->arch.sie_block->fpf &= ~FPF_BPBC; +@@ -4354,7 +4352,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, + switch (ioctl) { + case KVM_S390_STORE_STATUS: + idx = srcu_read_lock(&vcpu->kvm->srcu); +- r = kvm_s390_vcpu_store_status(vcpu, arg); ++ r = kvm_s390_store_status_unloaded(vcpu, arg); + srcu_read_unlock(&vcpu->kvm->srcu, idx); + break; + case KVM_S390_SET_INITIAL_PSW: { +diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c +index b0246c705a19..5674710a4841 100644 +--- a/arch/s390/mm/hugetlbpage.c ++++ b/arch/s390/mm/hugetlbpage.c +@@ -2,7 +2,7 @@ + /* + * IBM System z Huge TLB Page Support for Kernel. + * +- * Copyright IBM Corp. 2007,2016 ++ * Copyright IBM Corp. 2007,2020 + * Author(s): Gerald Schaefer + */ + +@@ -11,6 +11,9 @@ + + #include + #include ++#include ++#include ++#include + + /* + * If the bit selected by single-bit bitmask "a" is set within "x", move +@@ -267,3 +270,98 @@ static __init int setup_hugepagesz(char *opt) + return 1; + } + __setup("hugepagesz=", setup_hugepagesz); ++ ++static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, ++ unsigned long addr, unsigned long len, ++ unsigned long pgoff, unsigned long flags) ++{ ++ struct hstate *h = hstate_file(file); ++ struct vm_unmapped_area_info info; ++ ++ info.flags = 0; ++ info.length = len; ++ info.low_limit = current->mm->mmap_base; ++ info.high_limit = TASK_SIZE; ++ info.align_mask = PAGE_MASK & ~huge_page_mask(h); ++ info.align_offset = 0; ++ return vm_unmapped_area(&info); ++} ++ ++static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, ++ unsigned long addr0, unsigned long len, ++ unsigned long pgoff, unsigned long flags) ++{ ++ struct hstate *h = hstate_file(file); ++ struct vm_unmapped_area_info info; ++ unsigned long addr; ++ ++ info.flags = VM_UNMAPPED_AREA_TOPDOWN; ++ info.length = len; ++ info.low_limit = max(PAGE_SIZE, mmap_min_addr); ++ info.high_limit = current->mm->mmap_base; ++ info.align_mask = PAGE_MASK & ~huge_page_mask(h); ++ info.align_offset = 0; ++ addr = vm_unmapped_area(&info); ++ ++ /* ++ * A failed mmap() very likely causes application failure, ++ * so fall back to the bottom-up function here. This scenario ++ * can happen with large stack limits and large mmap() ++ * allocations. ++ */ ++ if (addr & ~PAGE_MASK) { ++ VM_BUG_ON(addr != -ENOMEM); ++ info.flags = 0; ++ info.low_limit = TASK_UNMAPPED_BASE; ++ info.high_limit = TASK_SIZE; ++ addr = vm_unmapped_area(&info); ++ } ++ ++ return addr; ++} ++ ++unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, ++ unsigned long len, unsigned long pgoff, unsigned long flags) ++{ ++ struct hstate *h = hstate_file(file); ++ struct mm_struct *mm = current->mm; ++ struct vm_area_struct *vma; ++ int rc; ++ ++ if (len & ~huge_page_mask(h)) ++ return -EINVAL; ++ if (len > TASK_SIZE - mmap_min_addr) ++ return -ENOMEM; ++ ++ if (flags & MAP_FIXED) { ++ if (prepare_hugepage_range(file, addr, len)) ++ return -EINVAL; ++ goto check_asce_limit; ++ } ++ ++ if (addr) { ++ addr = ALIGN(addr, huge_page_size(h)); ++ vma = find_vma(mm, addr); ++ if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && ++ (!vma || addr + len <= vm_start_gap(vma))) ++ goto check_asce_limit; ++ } ++ ++ if (mm->get_unmapped_area == arch_get_unmapped_area) ++ addr = hugetlb_get_unmapped_area_bottomup(file, addr, len, ++ pgoff, flags); ++ else ++ addr = hugetlb_get_unmapped_area_topdown(file, addr, len, ++ pgoff, flags); ++ if (addr & ~PAGE_MASK) ++ return addr; ++ ++check_asce_limit: ++ if (addr + len > current->mm->context.asce_limit && ++ addr + len <= TASK_SIZE) { ++ rc = crst_table_upgrade(mm, addr + len); ++ if (rc) ++ return (unsigned long) rc; ++ } ++ return addr; ++} +diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig +index eb24cb1afc11..18e9fb6fcf1b 100644 +--- a/arch/sparc/Kconfig ++++ b/arch/sparc/Kconfig +@@ -65,7 +65,6 @@ config SPARC64 + select HAVE_KRETPROBES + select HAVE_KPROBES + select HAVE_RCU_TABLE_FREE if SMP +- select HAVE_RCU_TABLE_NO_INVALIDATE if HAVE_RCU_TABLE_FREE + select HAVE_MEMBLOCK_NODE_MAP + select HAVE_ARCH_TRANSPARENT_HUGEPAGE + select HAVE_DYNAMIC_FTRACE +diff --git a/arch/sparc/include/asm/tlb_64.h b/arch/sparc/include/asm/tlb_64.h +index a2f3fa61ee36..8cb8f3833239 100644 +--- a/arch/sparc/include/asm/tlb_64.h ++++ b/arch/sparc/include/asm/tlb_64.h +@@ -28,6 +28,15 @@ void flush_tlb_pending(void); + #define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) + #define tlb_flush(tlb) flush_tlb_pending() + ++/* ++ * SPARC64's hardware TLB fill does not use the Linux page-tables ++ * and therefore we don't need a TLBI when freeing page-table pages. ++ */ ++ ++#ifdef CONFIG_HAVE_RCU_TABLE_FREE ++#define tlb_needs_table_invalidate() (false) ++#endif ++ + #include + + #endif /* _SPARC64_TLB_H */ +diff --git a/arch/sparc/include/uapi/asm/ipcbuf.h b/arch/sparc/include/uapi/asm/ipcbuf.h +index 9d0d125500e2..084b8949ddff 100644 +--- a/arch/sparc/include/uapi/asm/ipcbuf.h ++++ b/arch/sparc/include/uapi/asm/ipcbuf.h +@@ -15,19 +15,19 @@ + + struct ipc64_perm + { +- __kernel_key_t key; +- __kernel_uid_t uid; +- __kernel_gid_t gid; +- __kernel_uid_t cuid; +- __kernel_gid_t cgid; ++ __kernel_key_t key; ++ __kernel_uid32_t uid; ++ __kernel_gid32_t gid; ++ __kernel_uid32_t cuid; ++ __kernel_gid32_t cgid; + #ifndef __arch64__ +- unsigned short __pad0; ++ unsigned short __pad0; + #endif +- __kernel_mode_t mode; +- unsigned short __pad1; +- unsigned short seq; +- unsigned long long __unused1; +- unsigned long long __unused2; ++ __kernel_mode_t mode; ++ unsigned short __pad1; ++ unsigned short seq; ++ unsigned long long __unused1; ++ unsigned long long __unused2; + }; + + #endif /* __SPARC_IPCBUF_H */ +diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h +index 2ebc17d9c72c..19e94af9cc5d 100644 +--- a/arch/x86/include/asm/apic.h ++++ b/arch/x86/include/asm/apic.h +@@ -140,6 +140,7 @@ extern void apic_soft_disable(void); + extern void lapic_shutdown(void); + extern void sync_Arb_IDs(void); + extern void init_bsp_APIC(void); ++extern void apic_intr_mode_select(void); + extern void apic_intr_mode_init(void); + extern void init_apic_mappings(void); + void register_lapic_address(unsigned long address); +@@ -188,6 +189,7 @@ static inline void disable_local_APIC(void) { } + # define setup_secondary_APIC_clock x86_init_noop + static inline void lapic_update_tsc_freq(void) { } + static inline void init_bsp_APIC(void) { } ++static inline void apic_intr_mode_select(void) { } + static inline void apic_intr_mode_init(void) { } + static inline void lapic_assign_system_vectors(void) { } + static inline void lapic_assign_legacy_vector(unsigned int i, bool r) { } +@@ -452,6 +454,14 @@ static inline void ack_APIC_irq(void) + apic_eoi(); + } + ++ ++static inline bool lapic_vector_set_in_irr(unsigned int vector) ++{ ++ u32 irr = apic_read(APIC_IRR + (vector / 32 * 0x10)); ++ ++ return !!(irr & (1U << (vector % 32))); ++} ++ + static inline unsigned default_get_apic_id(unsigned long x) + { + unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); +diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h +index 4fc61483919a..c1ed054c103c 100644 +--- a/arch/x86/include/asm/kvm_host.h ++++ b/arch/x86/include/asm/kvm_host.h +@@ -380,12 +380,12 @@ struct kvm_mmu { + void (*set_cr3)(struct kvm_vcpu *vcpu, unsigned long root); + unsigned long (*get_cr3)(struct kvm_vcpu *vcpu); + u64 (*get_pdptr)(struct kvm_vcpu *vcpu, int index); +- int (*page_fault)(struct kvm_vcpu *vcpu, gva_t gva, u32 err, ++ int (*page_fault)(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 err, + bool prefault); + void (*inject_page_fault)(struct kvm_vcpu *vcpu, + struct x86_exception *fault); +- gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t gva, u32 access, +- struct x86_exception *exception); ++ gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t gva_or_gpa, ++ u32 access, struct x86_exception *exception); + gpa_t (*translate_gpa)(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access, + struct x86_exception *exception); + int (*sync_page)(struct kvm_vcpu *vcpu, +@@ -667,10 +667,10 @@ struct kvm_vcpu_arch { + bool pvclock_set_guest_stopped_request; + + struct { ++ u8 preempted; + u64 msr_val; + u64 last_steal; +- struct gfn_to_hva_cache stime; +- struct kvm_steal_time steal; ++ struct gfn_to_pfn_cache cache; + } st; + + u64 tsc_offset; +@@ -1128,6 +1128,7 @@ struct kvm_x86_ops { + bool (*xsaves_supported)(void); + bool (*umip_emulated)(void); + bool (*pt_supported)(void); ++ bool (*pku_supported)(void); + + int (*check_nested_events)(struct kvm_vcpu *vcpu, bool external_intr); + void (*request_immediate_exit)(struct kvm_vcpu *vcpu); +@@ -1450,7 +1451,7 @@ void kvm_vcpu_deactivate_apicv(struct kvm_vcpu *vcpu); + + int kvm_emulate_hypercall(struct kvm_vcpu *vcpu); + +-int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva, u64 error_code, ++int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 error_code, + void *insn, int insn_len); + void kvm_mmu_invlpg(struct kvm_vcpu *vcpu, gva_t gva); + void kvm_mmu_invpcid_gva(struct kvm_vcpu *vcpu, gva_t gva, unsigned long pcid); +diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h +index 19435858df5f..96d9cd208610 100644 +--- a/arch/x86/include/asm/x86_init.h ++++ b/arch/x86/include/asm/x86_init.h +@@ -51,12 +51,14 @@ struct x86_init_resources { + * are set up. + * @intr_init: interrupt init code + * @trap_init: platform specific trap setup ++ * @intr_mode_select: interrupt delivery mode selection + * @intr_mode_init: interrupt delivery mode setup + */ + struct x86_init_irqs { + void (*pre_vector_init)(void); + void (*intr_init)(void); + void (*trap_init)(void); ++ void (*intr_mode_select)(void); + void (*intr_mode_init)(void); + }; + +diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c +index 2b0faf86da1b..df891f874614 100644 +--- a/arch/x86/kernel/apic/apic.c ++++ b/arch/x86/kernel/apic/apic.c +@@ -830,8 +830,17 @@ bool __init apic_needs_pit(void) + if (!tsc_khz || !cpu_khz) + return true; + +- /* Is there an APIC at all? */ +- if (!boot_cpu_has(X86_FEATURE_APIC)) ++ /* Is there an APIC at all or is it disabled? */ ++ if (!boot_cpu_has(X86_FEATURE_APIC) || disable_apic) ++ return true; ++ ++ /* ++ * If interrupt delivery mode is legacy PIC or virtual wire without ++ * configuration, the local APIC timer wont be set up. Make sure ++ * that the PIT is initialized. ++ */ ++ if (apic_intr_mode == APIC_PIC || ++ apic_intr_mode == APIC_VIRTUAL_WIRE_NO_CONFIG) + return true; + + /* Virt guests may lack ARAT, but still have DEADLINE */ +@@ -1322,7 +1331,7 @@ void __init sync_Arb_IDs(void) + + enum apic_intr_mode_id apic_intr_mode __ro_after_init; + +-static int __init apic_intr_mode_select(void) ++static int __init __apic_intr_mode_select(void) + { + /* Check kernel option */ + if (disable_apic) { +@@ -1384,6 +1393,12 @@ static int __init apic_intr_mode_select(void) + return APIC_SYMMETRIC_IO; + } + ++/* Select the interrupt delivery mode for the BSP */ ++void __init apic_intr_mode_select(void) ++{ ++ apic_intr_mode = __apic_intr_mode_select(); ++} ++ + /* + * An initial setup of the virtual wire mode. + */ +@@ -1440,8 +1455,6 @@ void __init apic_intr_mode_init(void) + { + bool upmode = IS_ENABLED(CONFIG_UP_LATE_INIT); + +- apic_intr_mode = apic_intr_mode_select(); +- + switch (apic_intr_mode) { + case APIC_PIC: + pr_info("APIC: Keep in PIC mode(8259)\n"); +diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c +index 7f7533462474..159bd0cb8548 100644 +--- a/arch/x86/kernel/apic/msi.c ++++ b/arch/x86/kernel/apic/msi.c +@@ -23,10 +23,8 @@ + + static struct irq_domain *msi_default_domain; + +-static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) ++static void __irq_msi_compose_msg(struct irq_cfg *cfg, struct msi_msg *msg) + { +- struct irq_cfg *cfg = irqd_cfg(data); +- + msg->address_hi = MSI_ADDR_BASE_HI; + + if (x2apic_enabled()) +@@ -47,6 +45,127 @@ static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) + MSI_DATA_VECTOR(cfg->vector); + } + ++static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) ++{ ++ __irq_msi_compose_msg(irqd_cfg(data), msg); ++} ++ ++static void irq_msi_update_msg(struct irq_data *irqd, struct irq_cfg *cfg) ++{ ++ struct msi_msg msg[2] = { [1] = { }, }; ++ ++ __irq_msi_compose_msg(cfg, msg); ++ irq_data_get_irq_chip(irqd)->irq_write_msi_msg(irqd, msg); ++} ++ ++static int ++msi_set_affinity(struct irq_data *irqd, const struct cpumask *mask, bool force) ++{ ++ struct irq_cfg old_cfg, *cfg = irqd_cfg(irqd); ++ struct irq_data *parent = irqd->parent_data; ++ unsigned int cpu; ++ int ret; ++ ++ /* Save the current configuration */ ++ cpu = cpumask_first(irq_data_get_effective_affinity_mask(irqd)); ++ old_cfg = *cfg; ++ ++ /* Allocate a new target vector */ ++ ret = parent->chip->irq_set_affinity(parent, mask, force); ++ if (ret < 0 || ret == IRQ_SET_MASK_OK_DONE) ++ return ret; ++ ++ /* ++ * For non-maskable and non-remapped MSI interrupts the migration ++ * to a different destination CPU and a different vector has to be ++ * done careful to handle the possible stray interrupt which can be ++ * caused by the non-atomic update of the address/data pair. ++ * ++ * Direct update is possible when: ++ * - The MSI is maskable (remapped MSI does not use this code path)). ++ * The quirk bit is not set in this case. ++ * - The new vector is the same as the old vector ++ * - The old vector is MANAGED_IRQ_SHUTDOWN_VECTOR (interrupt starts up) ++ * - The new destination CPU is the same as the old destination CPU ++ */ ++ if (!irqd_msi_nomask_quirk(irqd) || ++ cfg->vector == old_cfg.vector || ++ old_cfg.vector == MANAGED_IRQ_SHUTDOWN_VECTOR || ++ cfg->dest_apicid == old_cfg.dest_apicid) { ++ irq_msi_update_msg(irqd, cfg); ++ return ret; ++ } ++ ++ /* ++ * Paranoia: Validate that the interrupt target is the local ++ * CPU. ++ */ ++ if (WARN_ON_ONCE(cpu != smp_processor_id())) { ++ irq_msi_update_msg(irqd, cfg); ++ return ret; ++ } ++ ++ /* ++ * Redirect the interrupt to the new vector on the current CPU ++ * first. This might cause a spurious interrupt on this vector if ++ * the device raises an interrupt right between this update and the ++ * update to the final destination CPU. ++ * ++ * If the vector is in use then the installed device handler will ++ * denote it as spurious which is no harm as this is a rare event ++ * and interrupt handlers have to cope with spurious interrupts ++ * anyway. If the vector is unused, then it is marked so it won't ++ * trigger the 'No irq handler for vector' warning in do_IRQ(). ++ * ++ * This requires to hold vector lock to prevent concurrent updates to ++ * the affected vector. ++ */ ++ lock_vector_lock(); ++ ++ /* ++ * Mark the new target vector on the local CPU if it is currently ++ * unused. Reuse the VECTOR_RETRIGGERED state which is also used in ++ * the CPU hotplug path for a similar purpose. This cannot be ++ * undone here as the current CPU has interrupts disabled and ++ * cannot handle the interrupt before the whole set_affinity() ++ * section is done. In the CPU unplug case, the current CPU is ++ * about to vanish and will not handle any interrupts anymore. The ++ * vector is cleaned up when the CPU comes online again. ++ */ ++ if (IS_ERR_OR_NULL(this_cpu_read(vector_irq[cfg->vector]))) ++ this_cpu_write(vector_irq[cfg->vector], VECTOR_RETRIGGERED); ++ ++ /* Redirect it to the new vector on the local CPU temporarily */ ++ old_cfg.vector = cfg->vector; ++ irq_msi_update_msg(irqd, &old_cfg); ++ ++ /* Now transition it to the target CPU */ ++ irq_msi_update_msg(irqd, cfg); ++ ++ /* ++ * All interrupts after this point are now targeted at the new ++ * vector/CPU. ++ * ++ * Drop vector lock before testing whether the temporary assignment ++ * to the local CPU was hit by an interrupt raised in the device, ++ * because the retrigger function acquires vector lock again. ++ */ ++ unlock_vector_lock(); ++ ++ /* ++ * Check whether the transition raced with a device interrupt and ++ * is pending in the local APICs IRR. It is safe to do this outside ++ * of vector lock as the irq_desc::lock of this interrupt is still ++ * held and interrupts are disabled: The check is not accessing the ++ * underlying vector store. It's just checking the local APIC's ++ * IRR. ++ */ ++ if (lapic_vector_set_in_irr(cfg->vector)) ++ irq_data_get_irq_chip(irqd)->irq_retrigger(irqd); ++ ++ return ret; ++} ++ + /* + * IRQ Chip for MSI PCI/PCI-X/PCI-Express Devices, + * which implement the MSI or MSI-X Capability Structure. +@@ -58,6 +177,7 @@ static struct irq_chip pci_msi_controller = { + .irq_ack = irq_chip_ack_parent, + .irq_retrigger = irq_chip_retrigger_hierarchy, + .irq_compose_msi_msg = irq_msi_compose_msg, ++ .irq_set_affinity = msi_set_affinity, + .flags = IRQCHIP_SKIP_SET_WAKE, + }; + +@@ -146,6 +266,8 @@ void __init arch_init_msi_domain(struct irq_domain *parent) + } + if (!msi_default_domain) + pr_warn("failed to initialize irqdomain for MSI/MSI-x.\n"); ++ else ++ msi_default_domain->flags |= IRQ_DOMAIN_MSI_NOMASK_QUIRK; + } + + #ifdef CONFIG_IRQ_REMAP +diff --git a/arch/x86/kernel/cpu/tsx.c b/arch/x86/kernel/cpu/tsx.c +index 3e20d322bc98..032509adf9de 100644 +--- a/arch/x86/kernel/cpu/tsx.c ++++ b/arch/x86/kernel/cpu/tsx.c +@@ -115,11 +115,12 @@ void __init tsx_init(void) + tsx_disable(); + + /* +- * tsx_disable() will change the state of the +- * RTM CPUID bit. Clear it here since it is now +- * expected to be not set. ++ * tsx_disable() will change the state of the RTM and HLE CPUID ++ * bits. Clear them here since they are now expected to be not ++ * set. + */ + setup_clear_cpu_cap(X86_FEATURE_RTM); ++ setup_clear_cpu_cap(X86_FEATURE_HLE); + } else if (tsx_ctrl_state == TSX_CTRL_ENABLE) { + + /* +@@ -131,10 +132,10 @@ void __init tsx_init(void) + tsx_enable(); + + /* +- * tsx_enable() will change the state of the +- * RTM CPUID bit. Force it here since it is now +- * expected to be set. ++ * tsx_enable() will change the state of the RTM and HLE CPUID ++ * bits. Force them here since they are now expected to be set. + */ + setup_force_cpu_cap(X86_FEATURE_RTM); ++ setup_force_cpu_cap(X86_FEATURE_HLE); + } + } +diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c +index 7ce29cee9f9e..d8673d8a779b 100644 +--- a/arch/x86/kernel/time.c ++++ b/arch/x86/kernel/time.c +@@ -91,10 +91,18 @@ void __init hpet_time_init(void) + + static __init void x86_late_time_init(void) + { ++ /* ++ * Before PIT/HPET init, select the interrupt mode. This is required ++ * to make the decision whether PIT should be initialized correct. ++ */ ++ x86_init.irqs.intr_mode_select(); ++ ++ /* Setup the legacy timers */ + x86_init.timers.timer_init(); ++ + /* +- * After PIT/HPET timers init, select and setup +- * the final interrupt mode for delivering IRQs. ++ * After PIT/HPET timers init, set up the final interrupt mode for ++ * delivering IRQs. + */ + x86_init.irqs.intr_mode_init(); + tsc_init(); +diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c +index 18a799c8fa28..1838b10a299c 100644 +--- a/arch/x86/kernel/x86_init.c ++++ b/arch/x86/kernel/x86_init.c +@@ -58,6 +58,7 @@ struct x86_init_ops x86_init __initdata = { + .pre_vector_init = init_ISA_irqs, + .intr_init = native_init_IRQ, + .trap_init = x86_init_noop, ++ .intr_mode_select = apic_intr_mode_select, + .intr_mode_init = apic_intr_mode_init + }, + +diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c +index b1d5a8c94a57..6fa946f983c9 100644 +--- a/arch/x86/kvm/cpuid.c ++++ b/arch/x86/kvm/cpuid.c +@@ -352,6 +352,7 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index) + unsigned f_umip = kvm_x86_ops->umip_emulated() ? F(UMIP) : 0; + unsigned f_intel_pt = kvm_x86_ops->pt_supported() ? F(INTEL_PT) : 0; + unsigned f_la57; ++ unsigned f_pku = kvm_x86_ops->pku_supported() ? F(PKU) : 0; + + /* cpuid 7.0.ebx */ + const u32 kvm_cpuid_7_0_ebx_x86_features = +@@ -363,7 +364,7 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index) + + /* cpuid 7.0.ecx*/ + const u32 kvm_cpuid_7_0_ecx_x86_features = +- F(AVX512VBMI) | F(LA57) | F(PKU) | 0 /*OSPKE*/ | F(RDPID) | ++ F(AVX512VBMI) | F(LA57) | 0 /*PKU*/ | 0 /*OSPKE*/ | F(RDPID) | + F(AVX512_VPOPCNTDQ) | F(UMIP) | F(AVX512_VBMI2) | F(GFNI) | + F(VAES) | F(VPCLMULQDQ) | F(AVX512_VNNI) | F(AVX512_BITALG) | + F(CLDEMOTE) | F(MOVDIRI) | F(MOVDIR64B) | 0 /*WAITPKG*/; +@@ -392,6 +393,7 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index) + /* Set LA57 based on hardware capability. */ + entry->ecx |= f_la57; + entry->ecx |= f_umip; ++ entry->ecx |= f_pku; + /* PKU is not yet implemented for shadow paging. */ + if (!tdp_enabled || !boot_cpu_has(X86_FEATURE_OSPKE)) + entry->ecx &= ~F(PKU); +diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c +index 698efb8c3897..37aa9ce29b33 100644 +--- a/arch/x86/kvm/emulate.c ++++ b/arch/x86/kvm/emulate.c +@@ -22,6 +22,7 @@ + #include "kvm_cache_regs.h" + #include + #include ++#include + #include + #include + +@@ -1075,8 +1076,23 @@ static void fetch_register_operand(struct operand *op) + } + } + ++static void emulator_get_fpu(void) ++{ ++ fpregs_lock(); ++ ++ fpregs_assert_state_consistent(); ++ if (test_thread_flag(TIF_NEED_FPU_LOAD)) ++ switch_fpu_return(); ++} ++ ++static void emulator_put_fpu(void) ++{ ++ fpregs_unlock(); ++} ++ + static void read_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, int reg) + { ++ emulator_get_fpu(); + switch (reg) { + case 0: asm("movdqa %%xmm0, %0" : "=m"(*data)); break; + case 1: asm("movdqa %%xmm1, %0" : "=m"(*data)); break; +@@ -1098,11 +1114,13 @@ static void read_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, int reg) + #endif + default: BUG(); + } ++ emulator_put_fpu(); + } + + static void write_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, + int reg) + { ++ emulator_get_fpu(); + switch (reg) { + case 0: asm("movdqa %0, %%xmm0" : : "m"(*data)); break; + case 1: asm("movdqa %0, %%xmm1" : : "m"(*data)); break; +@@ -1124,10 +1142,12 @@ static void write_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, + #endif + default: BUG(); + } ++ emulator_put_fpu(); + } + + static void read_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg) + { ++ emulator_get_fpu(); + switch (reg) { + case 0: asm("movq %%mm0, %0" : "=m"(*data)); break; + case 1: asm("movq %%mm1, %0" : "=m"(*data)); break; +@@ -1139,10 +1159,12 @@ static void read_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg) + case 7: asm("movq %%mm7, %0" : "=m"(*data)); break; + default: BUG(); + } ++ emulator_put_fpu(); + } + + static void write_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg) + { ++ emulator_get_fpu(); + switch (reg) { + case 0: asm("movq %0, %%mm0" : : "m"(*data)); break; + case 1: asm("movq %0, %%mm1" : : "m"(*data)); break; +@@ -1154,6 +1176,7 @@ static void write_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg) + case 7: asm("movq %0, %%mm7" : : "m"(*data)); break; + default: BUG(); + } ++ emulator_put_fpu(); + } + + static int em_fninit(struct x86_emulate_ctxt *ctxt) +@@ -1161,7 +1184,9 @@ static int em_fninit(struct x86_emulate_ctxt *ctxt) + if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) + return emulate_nm(ctxt); + ++ emulator_get_fpu(); + asm volatile("fninit"); ++ emulator_put_fpu(); + return X86EMUL_CONTINUE; + } + +@@ -1172,7 +1197,9 @@ static int em_fnstcw(struct x86_emulate_ctxt *ctxt) + if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) + return emulate_nm(ctxt); + ++ emulator_get_fpu(); + asm volatile("fnstcw %0": "+m"(fcw)); ++ emulator_put_fpu(); + + ctxt->dst.val = fcw; + +@@ -1186,7 +1213,9 @@ static int em_fnstsw(struct x86_emulate_ctxt *ctxt) + if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) + return emulate_nm(ctxt); + ++ emulator_get_fpu(); + asm volatile("fnstsw %0": "+m"(fsw)); ++ emulator_put_fpu(); + + ctxt->dst.val = fsw; + +@@ -4094,8 +4123,12 @@ static int em_fxsave(struct x86_emulate_ctxt *ctxt) + if (rc != X86EMUL_CONTINUE) + return rc; + ++ emulator_get_fpu(); ++ + rc = asm_safe("fxsave %[fx]", , [fx] "+m"(fx_state)); + ++ emulator_put_fpu(); ++ + if (rc != X86EMUL_CONTINUE) + return rc; + +@@ -4138,6 +4171,8 @@ static int em_fxrstor(struct x86_emulate_ctxt *ctxt) + if (rc != X86EMUL_CONTINUE) + return rc; + ++ emulator_get_fpu(); ++ + if (size < __fxstate_size(16)) { + rc = fxregs_fixup(&fx_state, size); + if (rc != X86EMUL_CONTINUE) +@@ -4153,6 +4188,8 @@ static int em_fxrstor(struct x86_emulate_ctxt *ctxt) + rc = asm_safe("fxrstor %[fx]", : [fx] "m"(fx_state)); + + out: ++ emulator_put_fpu(); ++ + return rc; + } + +@@ -5212,16 +5249,28 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) + ctxt->ad_bytes = def_ad_bytes ^ 6; + break; + case 0x26: /* ES override */ ++ has_seg_override = true; ++ ctxt->seg_override = VCPU_SREG_ES; ++ break; + case 0x2e: /* CS override */ ++ has_seg_override = true; ++ ctxt->seg_override = VCPU_SREG_CS; ++ break; + case 0x36: /* SS override */ ++ has_seg_override = true; ++ ctxt->seg_override = VCPU_SREG_SS; ++ break; + case 0x3e: /* DS override */ + has_seg_override = true; +- ctxt->seg_override = (ctxt->b >> 3) & 3; ++ ctxt->seg_override = VCPU_SREG_DS; + break; + case 0x64: /* FS override */ ++ has_seg_override = true; ++ ctxt->seg_override = VCPU_SREG_FS; ++ break; + case 0x65: /* GS override */ + has_seg_override = true; +- ctxt->seg_override = ctxt->b & 7; ++ ctxt->seg_override = VCPU_SREG_GS; + break; + case 0x40 ... 0x4f: /* REX */ + if (mode != X86EMUL_MODE_PROT64) +@@ -5305,10 +5354,15 @@ done_prefixes: + } + break; + case Escape: +- if (ctxt->modrm > 0xbf) +- opcode = opcode.u.esc->high[ctxt->modrm - 0xc0]; +- else ++ if (ctxt->modrm > 0xbf) { ++ size_t size = ARRAY_SIZE(opcode.u.esc->high); ++ u32 index = array_index_nospec( ++ ctxt->modrm - 0xc0, size); ++ ++ opcode = opcode.u.esc->high[index]; ++ } else { + opcode = opcode.u.esc->op[(ctxt->modrm >> 3) & 7]; ++ } + break; + case InstrDual: + if ((ctxt->modrm >> 6) == 3) +@@ -5450,7 +5504,9 @@ static int flush_pending_x87_faults(struct x86_emulate_ctxt *ctxt) + { + int rc; + ++ emulator_get_fpu(); + rc = asm_safe("fwait"); ++ emulator_put_fpu(); + + if (unlikely(rc != X86EMUL_CONTINUE)) + return emulate_exception(ctxt, MF_VECTOR, 0, false); +diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c +index 23ff65504d7e..26408434b9bc 100644 +--- a/arch/x86/kvm/hyperv.c ++++ b/arch/x86/kvm/hyperv.c +@@ -809,11 +809,12 @@ static int kvm_hv_msr_get_crash_data(struct kvm_vcpu *vcpu, + u32 index, u64 *pdata) + { + struct kvm_hv *hv = &vcpu->kvm->arch.hyperv; ++ size_t size = ARRAY_SIZE(hv->hv_crash_param); + +- if (WARN_ON_ONCE(index >= ARRAY_SIZE(hv->hv_crash_param))) ++ if (WARN_ON_ONCE(index >= size)) + return -EINVAL; + +- *pdata = hv->hv_crash_param[index]; ++ *pdata = hv->hv_crash_param[array_index_nospec(index, size)]; + return 0; + } + +@@ -852,11 +853,12 @@ static int kvm_hv_msr_set_crash_data(struct kvm_vcpu *vcpu, + u32 index, u64 data) + { + struct kvm_hv *hv = &vcpu->kvm->arch.hyperv; ++ size_t size = ARRAY_SIZE(hv->hv_crash_param); + +- if (WARN_ON_ONCE(index >= ARRAY_SIZE(hv->hv_crash_param))) ++ if (WARN_ON_ONCE(index >= size)) + return -EINVAL; + +- hv->hv_crash_param[index] = data; ++ hv->hv_crash_param[array_index_nospec(index, size)] = data; + return 0; + } + +diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c +index 8b38bb4868a6..629a09ca9860 100644 +--- a/arch/x86/kvm/i8259.c ++++ b/arch/x86/kvm/i8259.c +@@ -460,10 +460,14 @@ static int picdev_write(struct kvm_pic *s, + switch (addr) { + case 0x20: + case 0x21: ++ pic_lock(s); ++ pic_ioport_write(&s->pics[0], addr, data); ++ pic_unlock(s); ++ break; + case 0xa0: + case 0xa1: + pic_lock(s); +- pic_ioport_write(&s->pics[addr >> 7], addr, data); ++ pic_ioport_write(&s->pics[1], addr, data); + pic_unlock(s); + break; + case 0x4d0: +diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c +index d859ae8890d0..24a6905d60ee 100644 +--- a/arch/x86/kvm/ioapic.c ++++ b/arch/x86/kvm/ioapic.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -68,13 +69,14 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic, + default: + { + u32 redir_index = (ioapic->ioregsel - 0x10) >> 1; +- u64 redir_content; ++ u64 redir_content = ~0ULL; + +- if (redir_index < IOAPIC_NUM_PINS) +- redir_content = +- ioapic->redirtbl[redir_index].bits; +- else +- redir_content = ~0ULL; ++ if (redir_index < IOAPIC_NUM_PINS) { ++ u32 index = array_index_nospec( ++ redir_index, IOAPIC_NUM_PINS); ++ ++ redir_content = ioapic->redirtbl[index].bits; ++ } + + result = (ioapic->ioregsel & 0x1) ? + (redir_content >> 32) & 0xffffffff : +@@ -291,6 +293,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) + + if (index >= IOAPIC_NUM_PINS) + return; ++ index = array_index_nospec(index, IOAPIC_NUM_PINS); + e = &ioapic->redirtbl[index]; + mask_before = e->fields.mask; + /* Preserve read-only fields */ +diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c +index b29d00b661ff..15728971a430 100644 +--- a/arch/x86/kvm/lapic.c ++++ b/arch/x86/kvm/lapic.c +@@ -1926,15 +1926,20 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) + case APIC_LVTTHMR: + case APIC_LVTPC: + case APIC_LVT1: +- case APIC_LVTERR: ++ case APIC_LVTERR: { + /* TODO: Check vector */ ++ size_t size; ++ u32 index; ++ + if (!kvm_apic_sw_enabled(apic)) + val |= APIC_LVT_MASKED; +- +- val &= apic_lvt_mask[(reg - APIC_LVTT) >> 4]; ++ size = ARRAY_SIZE(apic_lvt_mask); ++ index = array_index_nospec( ++ (reg - APIC_LVTT) >> 4, size); ++ val &= apic_lvt_mask[index]; + kvm_lapic_set_reg(apic, reg, val); +- + break; ++ } + + case APIC_LVTT: + if (!kvm_apic_sw_enabled(apic)) +diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c +index 2ce9da58611e..518100ea5ef4 100644 +--- a/arch/x86/kvm/mmu.c ++++ b/arch/x86/kvm/mmu.c +@@ -418,22 +418,24 @@ static inline bool is_access_track_spte(u64 spte) + * requires a full MMU zap). The flag is instead explicitly queried when + * checking for MMIO spte cache hits. + */ +-#define MMIO_SPTE_GEN_MASK GENMASK_ULL(18, 0) ++#define MMIO_SPTE_GEN_MASK GENMASK_ULL(17, 0) + + #define MMIO_SPTE_GEN_LOW_START 3 + #define MMIO_SPTE_GEN_LOW_END 11 + #define MMIO_SPTE_GEN_LOW_MASK GENMASK_ULL(MMIO_SPTE_GEN_LOW_END, \ + MMIO_SPTE_GEN_LOW_START) + +-#define MMIO_SPTE_GEN_HIGH_START 52 +-#define MMIO_SPTE_GEN_HIGH_END 61 ++#define MMIO_SPTE_GEN_HIGH_START PT64_SECOND_AVAIL_BITS_SHIFT ++#define MMIO_SPTE_GEN_HIGH_END 62 + #define MMIO_SPTE_GEN_HIGH_MASK GENMASK_ULL(MMIO_SPTE_GEN_HIGH_END, \ + MMIO_SPTE_GEN_HIGH_START) ++ + static u64 generation_mmio_spte_mask(u64 gen) + { + u64 mask; + + WARN_ON(gen & ~MMIO_SPTE_GEN_MASK); ++ BUILD_BUG_ON((MMIO_SPTE_GEN_HIGH_MASK | MMIO_SPTE_GEN_LOW_MASK) & SPTE_SPECIAL_MASK); + + mask = (gen << MMIO_SPTE_GEN_LOW_START) & MMIO_SPTE_GEN_LOW_MASK; + mask |= (gen << MMIO_SPTE_GEN_HIGH_START) & MMIO_SPTE_GEN_HIGH_MASK; +@@ -444,8 +446,6 @@ static u64 get_mmio_spte_generation(u64 spte) + { + u64 gen; + +- spte &= ~shadow_mmio_mask; +- + gen = (spte & MMIO_SPTE_GEN_LOW_MASK) >> MMIO_SPTE_GEN_LOW_START; + gen |= (spte & MMIO_SPTE_GEN_HIGH_MASK) >> MMIO_SPTE_GEN_HIGH_START; + return gen; +@@ -538,16 +538,20 @@ EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes); + static u8 kvm_get_shadow_phys_bits(void) + { + /* +- * boot_cpu_data.x86_phys_bits is reduced when MKTME is detected +- * in CPU detection code, but MKTME treats those reduced bits as +- * 'keyID' thus they are not reserved bits. Therefore for MKTME +- * we should still return physical address bits reported by CPUID. ++ * boot_cpu_data.x86_phys_bits is reduced when MKTME or SME are detected ++ * in CPU detection code, but the processor treats those reduced bits as ++ * 'keyID' thus they are not reserved bits. Therefore KVM needs to look at ++ * the physical address bits reported by CPUID. + */ +- if (!boot_cpu_has(X86_FEATURE_TME) || +- WARN_ON_ONCE(boot_cpu_data.extended_cpuid_level < 0x80000008)) +- return boot_cpu_data.x86_phys_bits; ++ if (likely(boot_cpu_data.extended_cpuid_level >= 0x80000008)) ++ return cpuid_eax(0x80000008) & 0xff; + +- return cpuid_eax(0x80000008) & 0xff; ++ /* ++ * Quite weird to have VMX or SVM but not MAXPHYADDR; probably a VM with ++ * custom CPUID. Proceed with whatever the kernel found since these features ++ * aren't virtualizable (SME/SEV also require CPUIDs higher than 0x80000008). ++ */ ++ return boot_cpu_data.x86_phys_bits; + } + + static void kvm_mmu_reset_all_pte_masks(void) +@@ -1282,12 +1286,12 @@ static bool mmu_gfn_lpage_is_disallowed(struct kvm_vcpu *vcpu, gfn_t gfn, + return __mmu_gfn_lpage_is_disallowed(gfn, level, slot); + } + +-static int host_mapping_level(struct kvm *kvm, gfn_t gfn) ++static int host_mapping_level(struct kvm_vcpu *vcpu, gfn_t gfn) + { + unsigned long page_size; + int i, ret = 0; + +- page_size = kvm_host_page_size(kvm, gfn); ++ page_size = kvm_host_page_size(vcpu, gfn); + + for (i = PT_PAGE_TABLE_LEVEL; i <= PT_MAX_HUGEPAGE_LEVEL; ++i) { + if (page_size >= KVM_HPAGE_SIZE(i)) +@@ -1337,7 +1341,7 @@ static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn, + if (unlikely(*force_pt_level)) + return PT_PAGE_TABLE_LEVEL; + +- host_level = host_mapping_level(vcpu->kvm, large_gfn); ++ host_level = host_mapping_level(vcpu, large_gfn); + + if (host_level == PT_PAGE_TABLE_LEVEL) + return host_level; +@@ -3528,7 +3532,7 @@ static bool is_access_allowed(u32 fault_err_code, u64 spte) + * - true: let the vcpu to access on the same address again. + * - false: let the real page fault path to fix it. + */ +-static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, ++static bool fast_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, int level, + u32 error_code) + { + struct kvm_shadow_walk_iterator iterator; +@@ -3548,7 +3552,7 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, + do { + u64 new_spte; + +- for_each_shadow_entry_lockless(vcpu, gva, iterator, spte) ++ for_each_shadow_entry_lockless(vcpu, cr2_or_gpa, iterator, spte) + if (!is_shadow_present_pte(spte) || + iterator.level < level) + break; +@@ -3626,7 +3630,7 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, + + } while (true); + +- trace_fast_page_fault(vcpu, gva, error_code, iterator.sptep, ++ trace_fast_page_fault(vcpu, cr2_or_gpa, error_code, iterator.sptep, + spte, fault_handled); + walk_shadow_page_lockless_end(vcpu); + +@@ -3634,10 +3638,11 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, + } + + static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, +- gva_t gva, kvm_pfn_t *pfn, bool write, bool *writable); ++ gpa_t cr2_or_gpa, kvm_pfn_t *pfn, bool write, ++ bool *writable); + static int make_mmu_pages_available(struct kvm_vcpu *vcpu); + +-static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, ++static int nonpaging_map(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, + gfn_t gfn, bool prefault) + { + int r; +@@ -3663,16 +3668,16 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, + gfn &= ~(KVM_PAGES_PER_HPAGE(level) - 1); + } + +- if (fast_page_fault(vcpu, v, level, error_code)) ++ if (fast_page_fault(vcpu, gpa, level, error_code)) + return RET_PF_RETRY; + + mmu_seq = vcpu->kvm->mmu_notifier_seq; + smp_rmb(); + +- if (try_async_pf(vcpu, prefault, gfn, v, &pfn, write, &map_writable)) ++ if (try_async_pf(vcpu, prefault, gfn, gpa, &pfn, write, &map_writable)) + return RET_PF_RETRY; + +- if (handle_abnormal_pfn(vcpu, v, gfn, pfn, ACC_ALL, &r)) ++ if (handle_abnormal_pfn(vcpu, gpa, gfn, pfn, ACC_ALL, &r)) + return r; + + r = RET_PF_RETRY; +@@ -3683,7 +3688,7 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, + goto out_unlock; + if (likely(!force_pt_level)) + transparent_hugepage_adjust(vcpu, gfn, &pfn, &level); +- r = __direct_map(vcpu, v, write, map_writable, level, pfn, ++ r = __direct_map(vcpu, gpa, write, map_writable, level, pfn, + prefault, false); + out_unlock: + spin_unlock(&vcpu->kvm->mmu_lock); +@@ -3981,7 +3986,7 @@ void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu) + } + EXPORT_SYMBOL_GPL(kvm_mmu_sync_roots); + +-static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gva_t vaddr, ++static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gpa_t vaddr, + u32 access, struct x86_exception *exception) + { + if (exception) +@@ -3989,7 +3994,7 @@ static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gva_t vaddr, + return vaddr; + } + +-static gpa_t nonpaging_gva_to_gpa_nested(struct kvm_vcpu *vcpu, gva_t vaddr, ++static gpa_t nonpaging_gva_to_gpa_nested(struct kvm_vcpu *vcpu, gpa_t vaddr, + u32 access, + struct x86_exception *exception) + { +@@ -4149,13 +4154,14 @@ static void shadow_page_table_clear_flood(struct kvm_vcpu *vcpu, gva_t addr) + walk_shadow_page_lockless_end(vcpu); + } + +-static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, ++static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, + u32 error_code, bool prefault) + { +- gfn_t gfn = gva >> PAGE_SHIFT; ++ gfn_t gfn = gpa >> PAGE_SHIFT; + int r; + +- pgprintk("%s: gva %lx error %x\n", __func__, gva, error_code); ++ /* Note, paging is disabled, ergo gva == gpa. */ ++ pgprintk("%s: gva %lx error %x\n", __func__, gpa, error_code); + + if (page_fault_handle_page_track(vcpu, error_code, gfn)) + return RET_PF_EMULATE; +@@ -4167,11 +4173,12 @@ static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, + MMU_WARN_ON(!VALID_PAGE(vcpu->arch.mmu->root_hpa)); + + +- return nonpaging_map(vcpu, gva & PAGE_MASK, ++ return nonpaging_map(vcpu, gpa & PAGE_MASK, + error_code, gfn, prefault); + } + +-static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn) ++static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, ++ gfn_t gfn) + { + struct kvm_arch_async_pf arch; + +@@ -4180,11 +4187,13 @@ static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn) + arch.direct_map = vcpu->arch.mmu->direct_map; + arch.cr3 = vcpu->arch.mmu->get_cr3(vcpu); + +- return kvm_setup_async_pf(vcpu, gva, kvm_vcpu_gfn_to_hva(vcpu, gfn), &arch); ++ return kvm_setup_async_pf(vcpu, cr2_or_gpa, ++ kvm_vcpu_gfn_to_hva(vcpu, gfn), &arch); + } + + static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, +- gva_t gva, kvm_pfn_t *pfn, bool write, bool *writable) ++ gpa_t cr2_or_gpa, kvm_pfn_t *pfn, bool write, ++ bool *writable) + { + struct kvm_memory_slot *slot; + bool async; +@@ -4204,12 +4213,12 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, + return false; /* *pfn has correct page already */ + + if (!prefault && kvm_can_do_async_pf(vcpu)) { +- trace_kvm_try_async_get_page(gva, gfn); ++ trace_kvm_try_async_get_page(cr2_or_gpa, gfn); + if (kvm_find_async_pf_gfn(vcpu, gfn)) { +- trace_kvm_async_pf_doublefault(gva, gfn); ++ trace_kvm_async_pf_doublefault(cr2_or_gpa, gfn); + kvm_make_request(KVM_REQ_APF_HALT, vcpu); + return true; +- } else if (kvm_arch_setup_async_pf(vcpu, gva, gfn)) ++ } else if (kvm_arch_setup_async_pf(vcpu, cr2_or_gpa, gfn)) + return true; + } + +@@ -4222,6 +4231,12 @@ int kvm_handle_page_fault(struct kvm_vcpu *vcpu, u64 error_code, + { + int r = 1; + ++#ifndef CONFIG_X86_64 ++ /* A 64-bit CR2 should be impossible on 32-bit KVM. */ ++ if (WARN_ON_ONCE(fault_address >> 32)) ++ return -EFAULT; ++#endif ++ + vcpu->arch.l1tf_flush_l1d = true; + switch (vcpu->arch.apf.host_apf_reason) { + default: +@@ -4259,7 +4274,7 @@ check_hugepage_cache_consistency(struct kvm_vcpu *vcpu, gfn_t gfn, int level) + return kvm_mtrr_check_gfn_range_consistency(vcpu, gfn, page_num); + } + +-static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, ++static int tdp_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, + bool prefault) + { + kvm_pfn_t pfn; +@@ -5516,7 +5531,7 @@ static int make_mmu_pages_available(struct kvm_vcpu *vcpu) + return 0; + } + +-int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, ++int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 error_code, + void *insn, int insn_len) + { + int r, emulation_type = 0; +@@ -5525,18 +5540,18 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, + /* With shadow page tables, fault_address contains a GVA or nGPA. */ + if (vcpu->arch.mmu->direct_map) { + vcpu->arch.gpa_available = true; +- vcpu->arch.gpa_val = cr2; ++ vcpu->arch.gpa_val = cr2_or_gpa; + } + + r = RET_PF_INVALID; + if (unlikely(error_code & PFERR_RSVD_MASK)) { +- r = handle_mmio_page_fault(vcpu, cr2, direct); ++ r = handle_mmio_page_fault(vcpu, cr2_or_gpa, direct); + if (r == RET_PF_EMULATE) + goto emulate; + } + + if (r == RET_PF_INVALID) { +- r = vcpu->arch.mmu->page_fault(vcpu, cr2, ++ r = vcpu->arch.mmu->page_fault(vcpu, cr2_or_gpa, + lower_32_bits(error_code), + false); + WARN_ON(r == RET_PF_INVALID); +@@ -5556,7 +5571,7 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, + */ + if (vcpu->arch.mmu->direct_map && + (error_code & PFERR_NESTED_GUEST_PAGE) == PFERR_NESTED_GUEST_PAGE) { +- kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(cr2)); ++ kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(cr2_or_gpa)); + return 1; + } + +@@ -5571,7 +5586,7 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, + * explicitly shadowing L1's page tables, i.e. unprotecting something + * for L1 isn't going to magically fix whatever issue cause L2 to fail. + */ +- if (!mmio_info_in_cache(vcpu, cr2, direct) && !is_guest_mode(vcpu)) ++ if (!mmio_info_in_cache(vcpu, cr2_or_gpa, direct) && !is_guest_mode(vcpu)) + emulation_type = EMULTYPE_ALLOW_RETRY; + emulate: + /* +@@ -5586,7 +5601,7 @@ emulate: + return 1; + } + +- return x86_emulate_instruction(vcpu, cr2, emulation_type, insn, ++ return x86_emulate_instruction(vcpu, cr2_or_gpa, emulation_type, insn, + insn_len); + } + EXPORT_SYMBOL_GPL(kvm_mmu_page_fault); +@@ -6249,7 +6264,7 @@ static void kvm_set_mmio_spte_mask(void) + * If reserved bit is not supported, clear the present bit to disable + * mmio page fault. + */ +- if (IS_ENABLED(CONFIG_X86_64) && shadow_phys_bits == 52) ++ if (shadow_phys_bits == 52) + mask &= ~1ull; + + kvm_mmu_set_mmio_spte_mask(mask, mask, ACC_WRITE_MASK | ACC_USER_MASK); +diff --git a/arch/x86/kvm/mmutrace.h b/arch/x86/kvm/mmutrace.h +index 7ca8831c7d1a..3c6522b84ff1 100644 +--- a/arch/x86/kvm/mmutrace.h ++++ b/arch/x86/kvm/mmutrace.h +@@ -249,13 +249,13 @@ TRACE_EVENT( + + TRACE_EVENT( + fast_page_fault, +- TP_PROTO(struct kvm_vcpu *vcpu, gva_t gva, u32 error_code, ++ TP_PROTO(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 error_code, + u64 *sptep, u64 old_spte, bool retry), +- TP_ARGS(vcpu, gva, error_code, sptep, old_spte, retry), ++ TP_ARGS(vcpu, cr2_or_gpa, error_code, sptep, old_spte, retry), + + TP_STRUCT__entry( + __field(int, vcpu_id) +- __field(gva_t, gva) ++ __field(gpa_t, cr2_or_gpa) + __field(u32, error_code) + __field(u64 *, sptep) + __field(u64, old_spte) +@@ -265,7 +265,7 @@ TRACE_EVENT( + + TP_fast_assign( + __entry->vcpu_id = vcpu->vcpu_id; +- __entry->gva = gva; ++ __entry->cr2_or_gpa = cr2_or_gpa; + __entry->error_code = error_code; + __entry->sptep = sptep; + __entry->old_spte = old_spte; +@@ -273,9 +273,9 @@ TRACE_EVENT( + __entry->retry = retry; + ), + +- TP_printk("vcpu %d gva %lx error_code %s sptep %p old %#llx" ++ TP_printk("vcpu %d gva %llx error_code %s sptep %p old %#llx" + " new %llx spurious %d fixed %d", __entry->vcpu_id, +- __entry->gva, __print_flags(__entry->error_code, "|", ++ __entry->cr2_or_gpa, __print_flags(__entry->error_code, "|", + kvm_mmu_trace_pferr_flags), __entry->sptep, + __entry->old_spte, __entry->new_spte, + __spte_satisfied(old_spte), __spte_satisfied(new_spte) +diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c +index 25ce3edd1872..7f0059aa30e1 100644 +--- a/arch/x86/kvm/mtrr.c ++++ b/arch/x86/kvm/mtrr.c +@@ -192,11 +192,15 @@ static bool fixed_msr_to_seg_unit(u32 msr, int *seg, int *unit) + break; + case MSR_MTRRfix16K_80000 ... MSR_MTRRfix16K_A0000: + *seg = 1; +- *unit = msr - MSR_MTRRfix16K_80000; ++ *unit = array_index_nospec( ++ msr - MSR_MTRRfix16K_80000, ++ MSR_MTRRfix16K_A0000 - MSR_MTRRfix16K_80000 + 1); + break; + case MSR_MTRRfix4K_C0000 ... MSR_MTRRfix4K_F8000: + *seg = 2; +- *unit = msr - MSR_MTRRfix4K_C0000; ++ *unit = array_index_nospec( ++ msr - MSR_MTRRfix4K_C0000, ++ MSR_MTRRfix4K_F8000 - MSR_MTRRfix4K_C0000 + 1); + break; + default: + return false; +diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h +index 97b21e7fd013..c1d7b866a03f 100644 +--- a/arch/x86/kvm/paging_tmpl.h ++++ b/arch/x86/kvm/paging_tmpl.h +@@ -291,11 +291,11 @@ static inline unsigned FNAME(gpte_pkeys)(struct kvm_vcpu *vcpu, u64 gpte) + } + + /* +- * Fetch a guest pte for a guest virtual address ++ * Fetch a guest pte for a guest virtual address, or for an L2's GPA. + */ + static int FNAME(walk_addr_generic)(struct guest_walker *walker, + struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, +- gva_t addr, u32 access) ++ gpa_t addr, u32 access) + { + int ret; + pt_element_t pte; +@@ -496,7 +496,7 @@ error: + } + + static int FNAME(walk_addr)(struct guest_walker *walker, +- struct kvm_vcpu *vcpu, gva_t addr, u32 access) ++ struct kvm_vcpu *vcpu, gpa_t addr, u32 access) + { + return FNAME(walk_addr_generic)(walker, vcpu, vcpu->arch.mmu, addr, + access); +@@ -611,7 +611,7 @@ static void FNAME(pte_prefetch)(struct kvm_vcpu *vcpu, struct guest_walker *gw, + * If the guest tries to write a write-protected page, we need to + * emulate this operation, return 1 to indicate this case. + */ +-static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, ++static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr, + struct guest_walker *gw, + int write_fault, int hlevel, + kvm_pfn_t pfn, bool map_writable, bool prefault, +@@ -765,7 +765,7 @@ FNAME(is_self_change_mapping)(struct kvm_vcpu *vcpu, + * Returns: 1 if we need to emulate the instruction, 0 otherwise, or + * a negative value on error. + */ +-static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code, ++static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gpa_t addr, u32 error_code, + bool prefault) + { + int write_fault = error_code & PFERR_WRITE_MASK; +@@ -945,18 +945,19 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva, hpa_t root_hpa) + spin_unlock(&vcpu->kvm->mmu_lock); + } + +-static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access, ++/* Note, @addr is a GPA when gva_to_gpa() translates an L2 GPA to an L1 GPA. */ ++static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t addr, u32 access, + struct x86_exception *exception) + { + struct guest_walker walker; + gpa_t gpa = UNMAPPED_GVA; + int r; + +- r = FNAME(walk_addr)(&walker, vcpu, vaddr, access); ++ r = FNAME(walk_addr)(&walker, vcpu, addr, access); + + if (r) { + gpa = gfn_to_gpa(walker.gfn); +- gpa |= vaddr & ~PAGE_MASK; ++ gpa |= addr & ~PAGE_MASK; + } else if (exception) + *exception = walker.fault; + +@@ -964,7 +965,8 @@ static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access, + } + + #if PTTYPE != PTTYPE_EPT +-static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr, ++/* Note, gva_to_gpa_nested() is only used to translate L2 GVAs. */ ++static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gpa_t vaddr, + u32 access, + struct x86_exception *exception) + { +@@ -972,6 +974,11 @@ static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr, + gpa_t gpa = UNMAPPED_GVA; + int r; + ++#ifndef CONFIG_X86_64 ++ /* A 64-bit GVA should be impossible on 32-bit KVM. */ ++ WARN_ON_ONCE(vaddr >> 32); ++#endif ++ + r = FNAME(walk_addr_nested)(&walker, vcpu, vaddr, access); + + if (r) { +diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h +index 58265f761c3b..3fc98afd72a8 100644 +--- a/arch/x86/kvm/pmu.h ++++ b/arch/x86/kvm/pmu.h +@@ -2,6 +2,8 @@ + #ifndef __KVM_X86_PMU_H + #define __KVM_X86_PMU_H + ++#include ++ + #define vcpu_to_pmu(vcpu) (&(vcpu)->arch.pmu) + #define pmu_to_vcpu(pmu) (container_of((pmu), struct kvm_vcpu, arch.pmu)) + #define pmc_to_pmu(pmc) (&(pmc)->vcpu->arch.pmu) +@@ -86,8 +88,12 @@ static inline bool pmc_is_enabled(struct kvm_pmc *pmc) + static inline struct kvm_pmc *get_gp_pmc(struct kvm_pmu *pmu, u32 msr, + u32 base) + { +- if (msr >= base && msr < base + pmu->nr_arch_gp_counters) +- return &pmu->gp_counters[msr - base]; ++ if (msr >= base && msr < base + pmu->nr_arch_gp_counters) { ++ u32 index = array_index_nospec(msr - base, ++ pmu->nr_arch_gp_counters); ++ ++ return &pmu->gp_counters[index]; ++ } + + return NULL; + } +@@ -97,8 +103,12 @@ static inline struct kvm_pmc *get_fixed_pmc(struct kvm_pmu *pmu, u32 msr) + { + int base = MSR_CORE_PERF_FIXED_CTR0; + +- if (msr >= base && msr < base + pmu->nr_arch_fixed_counters) +- return &pmu->fixed_counters[msr - base]; ++ if (msr >= base && msr < base + pmu->nr_arch_fixed_counters) { ++ u32 index = array_index_nospec(msr - base, ++ pmu->nr_arch_fixed_counters); ++ ++ return &pmu->fixed_counters[index]; ++ } + + return NULL; + } +diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c +index c5673bda4b66..8d1be7c61f10 100644 +--- a/arch/x86/kvm/svm.c ++++ b/arch/x86/kvm/svm.c +@@ -5986,6 +5986,11 @@ static bool svm_has_wbinvd_exit(void) + return true; + } + ++static bool svm_pku_supported(void) ++{ ++ return false; ++} ++ + #define PRE_EX(exit) { .exit_code = (exit), \ + .stage = X86_ICPT_PRE_EXCEPT, } + #define POST_EX(exit) { .exit_code = (exit), \ +@@ -7278,6 +7283,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = { + .xsaves_supported = svm_xsaves_supported, + .umip_emulated = svm_umip_emulated, + .pt_supported = svm_pt_supported, ++ .pku_supported = svm_pku_supported, + + .set_supported_cpuid = svm_set_supported_cpuid, + +diff --git a/arch/x86/kvm/vmx/capabilities.h b/arch/x86/kvm/vmx/capabilities.h +index 7aa69716d516..283bdb7071af 100644 +--- a/arch/x86/kvm/vmx/capabilities.h ++++ b/arch/x86/kvm/vmx/capabilities.h +@@ -145,6 +145,11 @@ static inline bool vmx_umip_emulated(void) + SECONDARY_EXEC_DESC; + } + ++static inline bool vmx_pku_supported(void) ++{ ++ return boot_cpu_has(X86_FEATURE_PKU); ++} ++ + static inline bool cpu_has_vmx_rdtscp(void) + { + return vmcs_config.cpu_based_2nd_exec_ctrl & +diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c +index d0523741fb03..931d3b5f3acd 100644 +--- a/arch/x86/kvm/vmx/nested.c ++++ b/arch/x86/kvm/vmx/nested.c +@@ -4663,8 +4663,10 @@ static int handle_vmread(struct kvm_vcpu *vcpu) + vmx_instruction_info, true, len, &gva)) + return 1; + /* _system ok, nested_vmx_check_permission has verified cpl=0 */ +- if (kvm_write_guest_virt_system(vcpu, gva, &field_value, len, &e)) ++ if (kvm_write_guest_virt_system(vcpu, gva, &field_value, len, &e)) { + kvm_inject_page_fault(vcpu, &e); ++ return 1; ++ } + } + + return nested_vmx_succeed(vcpu); +diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c +index 3e9c059099e9..f8998a7bc7d5 100644 +--- a/arch/x86/kvm/vmx/pmu_intel.c ++++ b/arch/x86/kvm/vmx/pmu_intel.c +@@ -84,10 +84,14 @@ static unsigned intel_find_arch_event(struct kvm_pmu *pmu, + + static unsigned intel_find_fixed_event(int idx) + { +- if (idx >= ARRAY_SIZE(fixed_pmc_events)) ++ u32 event; ++ size_t size = ARRAY_SIZE(fixed_pmc_events); ++ ++ if (idx >= size) + return PERF_COUNT_HW_MAX; + +- return intel_arch_events[fixed_pmc_events[idx]].event_type; ++ event = fixed_pmc_events[array_index_nospec(idx, size)]; ++ return intel_arch_events[event].event_type; + } + + /* check if a PMC is enabled by comparing it with globl_ctrl bits. */ +@@ -128,16 +132,20 @@ static struct kvm_pmc *intel_msr_idx_to_pmc(struct kvm_vcpu *vcpu, + struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); + bool fixed = idx & (1u << 30); + struct kvm_pmc *counters; ++ unsigned int num_counters; + + idx &= ~(3u << 30); +- if (!fixed && idx >= pmu->nr_arch_gp_counters) +- return NULL; +- if (fixed && idx >= pmu->nr_arch_fixed_counters) ++ if (fixed) { ++ counters = pmu->fixed_counters; ++ num_counters = pmu->nr_arch_fixed_counters; ++ } else { ++ counters = pmu->gp_counters; ++ num_counters = pmu->nr_arch_gp_counters; ++ } ++ if (idx >= num_counters) + return NULL; +- counters = fixed ? pmu->fixed_counters : pmu->gp_counters; + *mask &= pmu->counter_bitmask[fixed ? KVM_PMC_FIXED : KVM_PMC_GP]; +- +- return &counters[idx]; ++ return &counters[array_index_nospec(idx, num_counters)]; + } + + static bool intel_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr) +diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c +index f09a213fd5cb..dc7c166c4335 100644 +--- a/arch/x86/kvm/vmx/vmx.c ++++ b/arch/x86/kvm/vmx/vmx.c +@@ -2140,6 +2140,8 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + (index >= 2 * intel_pt_validate_cap(vmx->pt_desc.caps, + PT_CAP_num_address_ranges))) + return 1; ++ if (is_noncanonical_address(data, vcpu)) ++ return 1; + if (index % 2) + vmx->pt_desc.guest.addr_b[index / 2] = data; + else +@@ -7865,6 +7867,7 @@ static struct kvm_x86_ops vmx_x86_ops __ro_after_init = { + .xsaves_supported = vmx_xsaves_supported, + .umip_emulated = vmx_umip_emulated, + .pt_supported = vmx_pt_supported, ++ .pku_supported = vmx_pku_supported, + + .request_immediate_exit = vmx_request_immediate_exit, + +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index 8d82ec0482fc..edde5ee8c6f5 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -92,6 +92,8 @@ u64 __read_mostly efer_reserved_bits = ~((u64)(EFER_SCE | EFER_LME | EFER_LMA)); + static u64 __read_mostly efer_reserved_bits = ~((u64)EFER_SCE); + #endif + ++static u64 __read_mostly cr4_reserved_bits = CR4_RESERVED_BITS; ++ + #define VM_STAT(x, ...) offsetof(struct kvm, stat.x), KVM_STAT_VM, ## __VA_ARGS__ + #define VCPU_STAT(x, ...) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU, ## __VA_ARGS__ + +@@ -886,9 +888,38 @@ int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) + } + EXPORT_SYMBOL_GPL(kvm_set_xcr); + ++static u64 kvm_host_cr4_reserved_bits(struct cpuinfo_x86 *c) ++{ ++ u64 reserved_bits = CR4_RESERVED_BITS; ++ ++ if (!cpu_has(c, X86_FEATURE_XSAVE)) ++ reserved_bits |= X86_CR4_OSXSAVE; ++ ++ if (!cpu_has(c, X86_FEATURE_SMEP)) ++ reserved_bits |= X86_CR4_SMEP; ++ ++ if (!cpu_has(c, X86_FEATURE_SMAP)) ++ reserved_bits |= X86_CR4_SMAP; ++ ++ if (!cpu_has(c, X86_FEATURE_FSGSBASE)) ++ reserved_bits |= X86_CR4_FSGSBASE; ++ ++ if (!cpu_has(c, X86_FEATURE_PKU)) ++ reserved_bits |= X86_CR4_PKE; ++ ++ if (!cpu_has(c, X86_FEATURE_LA57) && ++ !(cpuid_ecx(0x7) & bit(X86_FEATURE_LA57))) ++ reserved_bits |= X86_CR4_LA57; ++ ++ if (!cpu_has(c, X86_FEATURE_UMIP) && !kvm_x86_ops->umip_emulated()) ++ reserved_bits |= X86_CR4_UMIP; ++ ++ return reserved_bits; ++} ++ + static int kvm_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) + { +- if (cr4 & CR4_RESERVED_BITS) ++ if (cr4 & cr4_reserved_bits) + return -EINVAL; + + if (!guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && (cr4 & X86_CR4_OSXSAVE)) +@@ -1054,9 +1085,11 @@ static u64 kvm_dr6_fixed(struct kvm_vcpu *vcpu) + + static int __kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val) + { ++ size_t size = ARRAY_SIZE(vcpu->arch.db); ++ + switch (dr) { + case 0 ... 3: +- vcpu->arch.db[dr] = val; ++ vcpu->arch.db[array_index_nospec(dr, size)] = val; + if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)) + vcpu->arch.eff_db[dr] = val; + break; +@@ -1093,9 +1126,11 @@ EXPORT_SYMBOL_GPL(kvm_set_dr); + + int kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val) + { ++ size_t size = ARRAY_SIZE(vcpu->arch.db); ++ + switch (dr) { + case 0 ... 3: +- *val = vcpu->arch.db[dr]; ++ *val = vcpu->arch.db[array_index_nospec(dr, size)]; + break; + case 4: + /* fall through */ +@@ -2490,7 +2525,10 @@ static int set_msr_mce(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + default: + if (msr >= MSR_IA32_MC0_CTL && + msr < MSR_IA32_MCx_CTL(bank_num)) { +- u32 offset = msr - MSR_IA32_MC0_CTL; ++ u32 offset = array_index_nospec( ++ msr - MSR_IA32_MC0_CTL, ++ MSR_IA32_MCx_CTL(bank_num) - MSR_IA32_MC0_CTL); ++ + /* only 0 or all 1s can be written to IA32_MCi_CTL + * some Linux kernels though clear bit 10 in bank 4 to + * workaround a BIOS/GART TBL issue on AMD K8s, ignore +@@ -2586,45 +2624,47 @@ static void kvm_vcpu_flush_tlb(struct kvm_vcpu *vcpu, bool invalidate_gpa) + + static void record_steal_time(struct kvm_vcpu *vcpu) + { ++ struct kvm_host_map map; ++ struct kvm_steal_time *st; ++ + if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) + return; + +- if (unlikely(kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal, sizeof(struct kvm_steal_time)))) ++ /* -EAGAIN is returned in atomic context so we can just return. */ ++ if (kvm_map_gfn(vcpu, vcpu->arch.st.msr_val >> PAGE_SHIFT, ++ &map, &vcpu->arch.st.cache, false)) + return; + ++ st = map.hva + ++ offset_in_page(vcpu->arch.st.msr_val & KVM_STEAL_VALID_BITS); ++ + /* + * Doing a TLB flush here, on the guest's behalf, can avoid + * expensive IPIs. + */ + trace_kvm_pv_tlb_flush(vcpu->vcpu_id, +- vcpu->arch.st.steal.preempted & KVM_VCPU_FLUSH_TLB); +- if (xchg(&vcpu->arch.st.steal.preempted, 0) & KVM_VCPU_FLUSH_TLB) ++ st->preempted & KVM_VCPU_FLUSH_TLB); ++ if (xchg(&st->preempted, 0) & KVM_VCPU_FLUSH_TLB) + kvm_vcpu_flush_tlb(vcpu, false); + +- if (vcpu->arch.st.steal.version & 1) +- vcpu->arch.st.steal.version += 1; /* first time write, random junk */ ++ vcpu->arch.st.preempted = 0; + +- vcpu->arch.st.steal.version += 1; ++ if (st->version & 1) ++ st->version += 1; /* first time write, random junk */ + +- kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal, sizeof(struct kvm_steal_time)); ++ st->version += 1; + + smp_wmb(); + +- vcpu->arch.st.steal.steal += current->sched_info.run_delay - ++ st->steal += current->sched_info.run_delay - + vcpu->arch.st.last_steal; + vcpu->arch.st.last_steal = current->sched_info.run_delay; + +- kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal, sizeof(struct kvm_steal_time)); +- + smp_wmb(); + +- vcpu->arch.st.steal.version += 1; ++ st->version += 1; + +- kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal, sizeof(struct kvm_steal_time)); ++ kvm_unmap_gfn(vcpu, &map, &vcpu->arch.st.cache, true, false); + } + + int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) +@@ -2777,11 +2817,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + if (data & KVM_STEAL_RESERVED_MASK) + return 1; + +- if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.st.stime, +- data & KVM_STEAL_VALID_BITS, +- sizeof(struct kvm_steal_time))) +- return 1; +- + vcpu->arch.st.msr_val = data; + + if (!(data & KVM_MSR_ENABLED)) +@@ -2917,7 +2952,10 @@ static int get_msr_mce(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, bool host) + default: + if (msr >= MSR_IA32_MC0_CTL && + msr < MSR_IA32_MCx_CTL(bank_num)) { +- u32 offset = msr - MSR_IA32_MC0_CTL; ++ u32 offset = array_index_nospec( ++ msr - MSR_IA32_MC0_CTL, ++ MSR_IA32_MCx_CTL(bank_num) - MSR_IA32_MC0_CTL); ++ + data = vcpu->arch.mce_banks[offset]; + break; + } +@@ -3443,10 +3481,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) + + kvm_x86_ops->vcpu_load(vcpu, cpu); + +- fpregs_assert_state_consistent(); +- if (test_thread_flag(TIF_NEED_FPU_LOAD)) +- switch_fpu_return(); +- + /* Apply any externally detected TSC adjustments (due to suspend) */ + if (unlikely(vcpu->arch.tsc_offset_adjustment)) { + adjust_tsc_offset_host(vcpu, vcpu->arch.tsc_offset_adjustment); +@@ -3486,15 +3520,25 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) + + static void kvm_steal_time_set_preempted(struct kvm_vcpu *vcpu) + { ++ struct kvm_host_map map; ++ struct kvm_steal_time *st; ++ + if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) + return; + +- vcpu->arch.st.steal.preempted = KVM_VCPU_PREEMPTED; ++ if (vcpu->arch.st.preempted) ++ return; ++ ++ if (kvm_map_gfn(vcpu, vcpu->arch.st.msr_val >> PAGE_SHIFT, &map, ++ &vcpu->arch.st.cache, true)) ++ return; + +- kvm_write_guest_offset_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal.preempted, +- offsetof(struct kvm_steal_time, preempted), +- sizeof(vcpu->arch.st.steal.preempted)); ++ st = map.hva + ++ offset_in_page(vcpu->arch.st.msr_val & KVM_STEAL_VALID_BITS); ++ ++ st->preempted = vcpu->arch.st.preempted = KVM_VCPU_PREEMPTED; ++ ++ kvm_unmap_gfn(vcpu, &map, &vcpu->arch.st.cache, true, true); + } + + void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) +@@ -6365,11 +6409,11 @@ static int handle_emulation_failure(struct kvm_vcpu *vcpu, int emulation_type) + return 1; + } + +-static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2, ++static bool reexecute_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, + bool write_fault_to_shadow_pgtable, + int emulation_type) + { +- gpa_t gpa = cr2; ++ gpa_t gpa = cr2_or_gpa; + kvm_pfn_t pfn; + + if (!(emulation_type & EMULTYPE_ALLOW_RETRY)) +@@ -6383,7 +6427,7 @@ static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2, + * Write permission should be allowed since only + * write access need to be emulated. + */ +- gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2, NULL); ++ gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2_or_gpa, NULL); + + /* + * If the mapping is invalid in guest, let cpu retry +@@ -6440,10 +6484,10 @@ static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2, + } + + static bool retry_instruction(struct x86_emulate_ctxt *ctxt, +- unsigned long cr2, int emulation_type) ++ gpa_t cr2_or_gpa, int emulation_type) + { + struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt); +- unsigned long last_retry_eip, last_retry_addr, gpa = cr2; ++ unsigned long last_retry_eip, last_retry_addr, gpa = cr2_or_gpa; + + last_retry_eip = vcpu->arch.last_retry_eip; + last_retry_addr = vcpu->arch.last_retry_addr; +@@ -6472,14 +6516,14 @@ static bool retry_instruction(struct x86_emulate_ctxt *ctxt, + if (x86_page_table_writing_insn(ctxt)) + return false; + +- if (ctxt->eip == last_retry_eip && last_retry_addr == cr2) ++ if (ctxt->eip == last_retry_eip && last_retry_addr == cr2_or_gpa) + return false; + + vcpu->arch.last_retry_eip = ctxt->eip; +- vcpu->arch.last_retry_addr = cr2; ++ vcpu->arch.last_retry_addr = cr2_or_gpa; + + if (!vcpu->arch.mmu->direct_map) +- gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2, NULL); ++ gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2_or_gpa, NULL); + + kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(gpa)); + +@@ -6625,11 +6669,8 @@ static bool is_vmware_backdoor_opcode(struct x86_emulate_ctxt *ctxt) + return false; + } + +-int x86_emulate_instruction(struct kvm_vcpu *vcpu, +- unsigned long cr2, +- int emulation_type, +- void *insn, +- int insn_len) ++int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, ++ int emulation_type, void *insn, int insn_len) + { + int r; + struct x86_emulate_ctxt *ctxt = &vcpu->arch.emulate_ctxt; +@@ -6675,8 +6716,9 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, + kvm_queue_exception(vcpu, UD_VECTOR); + return 1; + } +- if (reexecute_instruction(vcpu, cr2, write_fault_to_spt, +- emulation_type)) ++ if (reexecute_instruction(vcpu, cr2_or_gpa, ++ write_fault_to_spt, ++ emulation_type)) + return 1; + if (ctxt->have_exception) { + /* +@@ -6710,7 +6752,7 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, + return 1; + } + +- if (retry_instruction(ctxt, cr2, emulation_type)) ++ if (retry_instruction(ctxt, cr2_or_gpa, emulation_type)) + return 1; + + /* this is needed for vmware backdoor interface to work since it +@@ -6722,7 +6764,7 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, + + restart: + /* Save the faulting GPA (cr2) in the address field */ +- ctxt->exception.address = cr2; ++ ctxt->exception.address = cr2_or_gpa; + + r = x86_emulate_insn(ctxt); + +@@ -6730,7 +6772,7 @@ restart: + return 1; + + if (r == EMULATION_FAILED) { +- if (reexecute_instruction(vcpu, cr2, write_fault_to_spt, ++ if (reexecute_instruction(vcpu, cr2_or_gpa, write_fault_to_spt, + emulation_type)) + return 1; + +@@ -8172,8 +8214,9 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) + trace_kvm_entry(vcpu->vcpu_id); + guest_enter_irqoff(); + +- /* The preempt notifier should have taken care of the FPU already. */ +- WARN_ON_ONCE(test_thread_flag(TIF_NEED_FPU_LOAD)); ++ fpregs_assert_state_consistent(); ++ if (test_thread_flag(TIF_NEED_FPU_LOAD)) ++ switch_fpu_return(); + + if (unlikely(vcpu->arch.switch_db_regs)) { + set_debugreg(0, 7); +@@ -8445,12 +8488,26 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu) + return 0; + } + ++static void kvm_save_current_fpu(struct fpu *fpu) ++{ ++ /* ++ * If the target FPU state is not resident in the CPU registers, just ++ * memcpy() from current, else save CPU state directly to the target. ++ */ ++ if (test_thread_flag(TIF_NEED_FPU_LOAD)) ++ memcpy(&fpu->state, ¤t->thread.fpu.state, ++ fpu_kernel_xstate_size); ++ else ++ copy_fpregs_to_fpstate(fpu); ++} ++ + /* Swap (qemu) user FPU context for the guest FPU context. */ + static void kvm_load_guest_fpu(struct kvm_vcpu *vcpu) + { + fpregs_lock(); + +- copy_fpregs_to_fpstate(vcpu->arch.user_fpu); ++ kvm_save_current_fpu(vcpu->arch.user_fpu); ++ + /* PKRU is separately restored in kvm_x86_ops->run. */ + __copy_kernel_to_fpregs(&vcpu->arch.guest_fpu->state, + ~XFEATURE_MASK_PKRU); +@@ -8466,7 +8523,8 @@ static void kvm_put_guest_fpu(struct kvm_vcpu *vcpu) + { + fpregs_lock(); + +- copy_fpregs_to_fpstate(vcpu->arch.guest_fpu); ++ kvm_save_current_fpu(vcpu->arch.guest_fpu); ++ + copy_kernel_to_fpregs(&vcpu->arch.user_fpu->state); + + fpregs_mark_activate(); +@@ -8688,6 +8746,8 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, + struct kvm_mp_state *mp_state) + { + vcpu_load(vcpu); ++ if (kvm_mpx_supported()) ++ kvm_load_guest_fpu(vcpu); + + kvm_apic_accept_events(vcpu); + if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED && +@@ -8696,6 +8756,8 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, + else + mp_state->mp_state = vcpu->arch.mp_state; + ++ if (kvm_mpx_supported()) ++ kvm_put_guest_fpu(vcpu); + vcpu_put(vcpu); + return 0; + } +@@ -9055,6 +9117,9 @@ static void fx_init(struct kvm_vcpu *vcpu) + void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu) + { + void *wbinvd_dirty_mask = vcpu->arch.wbinvd_dirty_mask; ++ struct gfn_to_pfn_cache *cache = &vcpu->arch.st.cache; ++ ++ kvm_release_pfn(cache->pfn, cache->dirty, cache); + + kvmclock_reset(vcpu); + +@@ -9125,7 +9190,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) + kvm_mmu_unload(vcpu); + vcpu_put(vcpu); + +- kvm_x86_ops->vcpu_free(vcpu); ++ kvm_arch_vcpu_free(vcpu); + } + + void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) +@@ -9317,6 +9382,8 @@ int kvm_arch_hardware_setup(void) + if (r != 0) + return r; + ++ cr4_reserved_bits = kvm_host_cr4_reserved_bits(&boot_cpu_data); ++ + if (kvm_has_tsc_control) { + /* + * Make sure the user can only configure tsc_khz values that +@@ -9719,11 +9786,18 @@ out_free: + + void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) + { ++ struct kvm_vcpu *vcpu; ++ int i; ++ + /* + * memslots->generation has been incremented. + * mmio generation may have reached its maximum value. + */ + kvm_mmu_invalidate_mmio_sptes(kvm, gen); ++ ++ /* Force re-initialization of steal_time cache */ ++ kvm_for_each_vcpu(i, vcpu, kvm) ++ kvm_vcpu_kick(vcpu); + } + + int kvm_arch_prepare_memory_region(struct kvm *kvm, +@@ -9975,7 +10049,7 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work) + work->arch.cr3 != vcpu->arch.mmu->get_cr3(vcpu)) + return; + +- vcpu->arch.mmu->page_fault(vcpu, work->gva, 0, true); ++ vcpu->arch.mmu->page_fault(vcpu, work->cr2_or_gpa, 0, true); + } + + static inline u32 kvm_async_pf_hash_fn(gfn_t gfn) +@@ -10088,7 +10162,7 @@ void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu, + { + struct x86_exception fault; + +- trace_kvm_async_pf_not_present(work->arch.token, work->gva); ++ trace_kvm_async_pf_not_present(work->arch.token, work->cr2_or_gpa); + kvm_add_async_pf_gfn(vcpu, work->arch.gfn); + + if (kvm_can_deliver_async_pf(vcpu) && +@@ -10123,7 +10197,7 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu, + work->arch.token = ~0; /* broadcast wakeup */ + else + kvm_del_async_pf_gfn(vcpu, work->arch.gfn); +- trace_kvm_async_pf_ready(work->arch.token, work->gva); ++ trace_kvm_async_pf_ready(work->arch.token, work->cr2_or_gpa); + + if (vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED && + !apf_get_user(vcpu, &val)) { +diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h +index dbf7442a822b..de6b55484876 100644 +--- a/arch/x86/kvm/x86.h ++++ b/arch/x86/kvm/x86.h +@@ -286,7 +286,7 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata); + bool kvm_mtrr_check_gfn_range_consistency(struct kvm_vcpu *vcpu, gfn_t gfn, + int page_num); + bool kvm_vector_hashing_enabled(void); +-int x86_emulate_instruction(struct kvm_vcpu *vcpu, unsigned long cr2, ++int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, + int emulation_type, void *insn, int insn_len); + + #define KVM_SUPPORTED_XCR0 (XFEATURE_MASK_FP | XFEATURE_MASK_SSE \ +diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c +index 5bfea374a160..6ea215cdeada 100644 +--- a/arch/x86/xen/enlighten_pv.c ++++ b/arch/x86/xen/enlighten_pv.c +@@ -1215,6 +1215,7 @@ asmlinkage __visible void __init xen_start_kernel(void) + x86_platform.get_nmi_reason = xen_get_nmi_reason; + + x86_init.resources.memory_setup = xen_memory_setup; ++ x86_init.irqs.intr_mode_select = x86_init_noop; + x86_init.irqs.intr_mode_init = x86_init_noop; + x86_init.oem.arch_setup = xen_arch_setup; + x86_init.oem.banner = xen_banner; +diff --git a/crypto/algapi.c b/crypto/algapi.c +index de30ddc952d8..bb8329e49956 100644 +--- a/crypto/algapi.c ++++ b/crypto/algapi.c +@@ -257,6 +257,7 @@ void crypto_alg_tested(const char *name, int err) + struct crypto_alg *alg; + struct crypto_alg *q; + LIST_HEAD(list); ++ bool best; + + down_write(&crypto_alg_sem); + list_for_each_entry(q, &crypto_alg_list, cra_list) { +@@ -280,6 +281,21 @@ found: + + alg->cra_flags |= CRYPTO_ALG_TESTED; + ++ /* Only satisfy larval waiters if we are the best. */ ++ best = true; ++ list_for_each_entry(q, &crypto_alg_list, cra_list) { ++ if (crypto_is_moribund(q) || !crypto_is_larval(q)) ++ continue; ++ ++ if (strcmp(alg->cra_name, q->cra_name)) ++ continue; ++ ++ if (q->cra_priority > alg->cra_priority) { ++ best = false; ++ break; ++ } ++ } ++ + list_for_each_entry(q, &crypto_alg_list, cra_list) { + if (q == alg) + continue; +@@ -303,10 +319,12 @@ found: + continue; + if ((q->cra_flags ^ alg->cra_flags) & larval->mask) + continue; +- if (!crypto_mod_get(alg)) +- continue; + +- larval->adult = alg; ++ if (best && crypto_mod_get(alg)) ++ larval->adult = alg; ++ else ++ larval->adult = ERR_PTR(-EAGAIN); ++ + continue; + } + +@@ -669,11 +687,9 @@ EXPORT_SYMBOL_GPL(crypto_grab_spawn); + + void crypto_drop_spawn(struct crypto_spawn *spawn) + { +- if (!spawn->alg) +- return; +- + down_write(&crypto_alg_sem); +- list_del(&spawn->list); ++ if (spawn->alg) ++ list_del(&spawn->list); + up_write(&crypto_alg_sem); + } + EXPORT_SYMBOL_GPL(crypto_drop_spawn); +@@ -681,22 +697,16 @@ EXPORT_SYMBOL_GPL(crypto_drop_spawn); + static struct crypto_alg *crypto_spawn_alg(struct crypto_spawn *spawn) + { + struct crypto_alg *alg; +- struct crypto_alg *alg2; + + down_read(&crypto_alg_sem); + alg = spawn->alg; +- alg2 = alg; +- if (alg2) +- alg2 = crypto_mod_get(alg2); +- up_read(&crypto_alg_sem); +- +- if (!alg2) { +- if (alg) +- crypto_shoot_alg(alg); +- return ERR_PTR(-EAGAIN); ++ if (alg && !crypto_mod_get(alg)) { ++ alg->cra_flags |= CRYPTO_ALG_DYING; ++ alg = NULL; + } ++ up_read(&crypto_alg_sem); + +- return alg; ++ return alg ?: ERR_PTR(-EAGAIN); + } + + struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type, +diff --git a/crypto/api.c b/crypto/api.c +index d8ba54142620..eda0c56b8615 100644 +--- a/crypto/api.c ++++ b/crypto/api.c +@@ -97,7 +97,7 @@ static void crypto_larval_destroy(struct crypto_alg *alg) + struct crypto_larval *larval = (void *)alg; + + BUG_ON(!crypto_is_larval(alg)); +- if (larval->adult) ++ if (!IS_ERR_OR_NULL(larval->adult)) + crypto_mod_put(larval->adult); + kfree(larval); + } +@@ -178,6 +178,8 @@ static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg) + alg = ERR_PTR(-ETIMEDOUT); + else if (!alg) + alg = ERR_PTR(-ENOENT); ++ else if (IS_ERR(alg)) ++ ; + else if (crypto_is_test_larval(larval) && + !(alg->cra_flags & CRYPTO_ALG_TESTED)) + alg = ERR_PTR(-EAGAIN); +@@ -344,13 +346,12 @@ static unsigned int crypto_ctxsize(struct crypto_alg *alg, u32 type, u32 mask) + return len; + } + +-void crypto_shoot_alg(struct crypto_alg *alg) ++static void crypto_shoot_alg(struct crypto_alg *alg) + { + down_write(&crypto_alg_sem); + alg->cra_flags |= CRYPTO_ALG_DYING; + up_write(&crypto_alg_sem); + } +-EXPORT_SYMBOL_GPL(crypto_shoot_alg); + + struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, + u32 mask) +diff --git a/crypto/internal.h b/crypto/internal.h +index 93df7bec844a..e506a57e2243 100644 +--- a/crypto/internal.h ++++ b/crypto/internal.h +@@ -68,7 +68,6 @@ void crypto_alg_tested(const char *name, int err); + void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list, + struct crypto_alg *nalg); + void crypto_remove_final(struct list_head *list); +-void crypto_shoot_alg(struct crypto_alg *alg); + struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, + u32 mask); + void *crypto_create_tfm(struct crypto_alg *alg, +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index 81bbea7f2ba6..a4f3b3f342c8 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -24,6 +24,8 @@ static struct kset *pcrypt_kset; + + struct pcrypt_instance_ctx { + struct crypto_aead_spawn spawn; ++ struct padata_shell *psenc; ++ struct padata_shell *psdec; + atomic_t tfm_count; + }; + +@@ -32,6 +34,12 @@ struct pcrypt_aead_ctx { + unsigned int cb_cpu; + }; + ++static inline struct pcrypt_instance_ctx *pcrypt_tfm_ictx( ++ struct crypto_aead *tfm) ++{ ++ return aead_instance_ctx(aead_alg_instance(tfm)); ++} ++ + static int pcrypt_aead_setkey(struct crypto_aead *parent, + const u8 *key, unsigned int keylen) + { +@@ -63,7 +71,6 @@ static void pcrypt_aead_done(struct crypto_async_request *areq, int err) + struct padata_priv *padata = pcrypt_request_padata(preq); + + padata->info = err; +- req->base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; + + padata_do_serial(padata); + } +@@ -90,6 +97,9 @@ static int pcrypt_aead_encrypt(struct aead_request *req) + struct crypto_aead *aead = crypto_aead_reqtfm(req); + struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(aead); + u32 flags = aead_request_flags(req); ++ struct pcrypt_instance_ctx *ictx; ++ ++ ictx = pcrypt_tfm_ictx(aead); + + memset(padata, 0, sizeof(struct padata_priv)); + +@@ -103,7 +113,7 @@ static int pcrypt_aead_encrypt(struct aead_request *req) + req->cryptlen, req->iv); + aead_request_set_ad(creq, req->assoclen); + +- err = padata_do_parallel(pencrypt, padata, &ctx->cb_cpu); ++ err = padata_do_parallel(ictx->psenc, padata, &ctx->cb_cpu); + if (!err) + return -EINPROGRESS; + +@@ -132,6 +142,9 @@ static int pcrypt_aead_decrypt(struct aead_request *req) + struct crypto_aead *aead = crypto_aead_reqtfm(req); + struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(aead); + u32 flags = aead_request_flags(req); ++ struct pcrypt_instance_ctx *ictx; ++ ++ ictx = pcrypt_tfm_ictx(aead); + + memset(padata, 0, sizeof(struct padata_priv)); + +@@ -145,7 +158,7 @@ static int pcrypt_aead_decrypt(struct aead_request *req) + req->cryptlen, req->iv); + aead_request_set_ad(creq, req->assoclen); + +- err = padata_do_parallel(pdecrypt, padata, &ctx->cb_cpu); ++ err = padata_do_parallel(ictx->psdec, padata, &ctx->cb_cpu); + if (!err) + return -EINPROGRESS; + +@@ -192,6 +205,8 @@ static void pcrypt_free(struct aead_instance *inst) + struct pcrypt_instance_ctx *ctx = aead_instance_ctx(inst); + + crypto_drop_aead(&ctx->spawn); ++ padata_free_shell(ctx->psdec); ++ padata_free_shell(ctx->psenc); + kfree(inst); + } + +@@ -233,12 +248,22 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb, + if (!inst) + return -ENOMEM; + ++ err = -ENOMEM; ++ + ctx = aead_instance_ctx(inst); ++ ctx->psenc = padata_alloc_shell(pencrypt); ++ if (!ctx->psenc) ++ goto out_free_inst; ++ ++ ctx->psdec = padata_alloc_shell(pdecrypt); ++ if (!ctx->psdec) ++ goto out_free_psenc; ++ + crypto_set_aead_spawn(&ctx->spawn, aead_crypto_instance(inst)); + + err = crypto_grab_aead(&ctx->spawn, name, 0, 0); + if (err) +- goto out_free_inst; ++ goto out_free_psdec; + + alg = crypto_spawn_aead_alg(&ctx->spawn); + err = pcrypt_init_instance(aead_crypto_instance(inst), &alg->base); +@@ -271,6 +296,10 @@ out: + + out_drop_aead: + crypto_drop_aead(&ctx->spawn); ++out_free_psdec: ++ padata_free_shell(ctx->psdec); ++out_free_psenc: ++ padata_free_shell(ctx->psenc); + out_free_inst: + kfree(inst); + goto out; +diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c +index 558fedf8a7a1..254a7d98b9d4 100644 +--- a/drivers/acpi/battery.c ++++ b/drivers/acpi/battery.c +@@ -38,6 +38,8 @@ + #define PREFIX "ACPI: " + + #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF ++#define ACPI_BATTERY_CAPACITY_VALID(capacity) \ ++ ((capacity) != 0 && (capacity) != ACPI_BATTERY_VALUE_UNKNOWN) + + #define ACPI_BATTERY_DEVICE_NAME "Battery" + +@@ -192,7 +194,8 @@ static int acpi_battery_is_charged(struct acpi_battery *battery) + + static bool acpi_battery_is_degraded(struct acpi_battery *battery) + { +- return battery->full_charge_capacity && battery->design_capacity && ++ return ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) && ++ ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity) && + battery->full_charge_capacity < battery->design_capacity; + } + +@@ -214,7 +217,7 @@ static int acpi_battery_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) + { +- int ret = 0; ++ int full_capacity = ACPI_BATTERY_VALUE_UNKNOWN, ret = 0; + struct acpi_battery *battery = to_acpi_battery(psy); + + if (acpi_battery_present(battery)) { +@@ -263,14 +266,14 @@ static int acpi_battery_get_property(struct power_supply *psy, + break; + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: +- if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) ++ if (!ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) + ret = -ENODEV; + else + val->intval = battery->design_capacity * 1000; + break; + case POWER_SUPPLY_PROP_CHARGE_FULL: + case POWER_SUPPLY_PROP_ENERGY_FULL: +- if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN) ++ if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity)) + ret = -ENODEV; + else + val->intval = battery->full_charge_capacity * 1000; +@@ -283,11 +286,17 @@ static int acpi_battery_get_property(struct power_supply *psy, + val->intval = battery->capacity_now * 1000; + break; + case POWER_SUPPLY_PROP_CAPACITY: +- if (battery->capacity_now && battery->full_charge_capacity) +- val->intval = battery->capacity_now * 100/ +- battery->full_charge_capacity; ++ if (ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity)) ++ full_capacity = battery->full_charge_capacity; ++ else if (ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) ++ full_capacity = battery->design_capacity; ++ ++ if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN || ++ full_capacity == ACPI_BATTERY_VALUE_UNKNOWN) ++ ret = -ENODEV; + else +- val->intval = 0; ++ val->intval = battery->capacity_now * 100/ ++ full_capacity; + break; + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + if (battery->state & ACPI_BATTERY_STATE_CRITICAL) +@@ -333,6 +342,20 @@ static enum power_supply_property charge_battery_props[] = { + POWER_SUPPLY_PROP_SERIAL_NUMBER, + }; + ++static enum power_supply_property charge_battery_full_cap_broken_props[] = { ++ POWER_SUPPLY_PROP_STATUS, ++ POWER_SUPPLY_PROP_PRESENT, ++ POWER_SUPPLY_PROP_TECHNOLOGY, ++ POWER_SUPPLY_PROP_CYCLE_COUNT, ++ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_NOW, ++ POWER_SUPPLY_PROP_CURRENT_NOW, ++ POWER_SUPPLY_PROP_CHARGE_NOW, ++ POWER_SUPPLY_PROP_MODEL_NAME, ++ POWER_SUPPLY_PROP_MANUFACTURER, ++ POWER_SUPPLY_PROP_SERIAL_NUMBER, ++}; ++ + static enum power_supply_property energy_battery_props[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_PRESENT, +@@ -794,20 +817,34 @@ static void __exit battery_hook_exit(void) + static int sysfs_add_battery(struct acpi_battery *battery) + { + struct power_supply_config psy_cfg = { .drv_data = battery, }; ++ bool full_cap_broken = false; ++ ++ if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) && ++ !ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) ++ full_cap_broken = true; + + if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) { +- battery->bat_desc.properties = charge_battery_props; +- battery->bat_desc.num_properties = +- ARRAY_SIZE(charge_battery_props); +- } else if (battery->full_charge_capacity == 0) { +- battery->bat_desc.properties = +- energy_battery_full_cap_broken_props; +- battery->bat_desc.num_properties = +- ARRAY_SIZE(energy_battery_full_cap_broken_props); ++ if (full_cap_broken) { ++ battery->bat_desc.properties = ++ charge_battery_full_cap_broken_props; ++ battery->bat_desc.num_properties = ++ ARRAY_SIZE(charge_battery_full_cap_broken_props); ++ } else { ++ battery->bat_desc.properties = charge_battery_props; ++ battery->bat_desc.num_properties = ++ ARRAY_SIZE(charge_battery_props); ++ } + } else { +- battery->bat_desc.properties = energy_battery_props; +- battery->bat_desc.num_properties = +- ARRAY_SIZE(energy_battery_props); ++ if (full_cap_broken) { ++ battery->bat_desc.properties = ++ energy_battery_full_cap_broken_props; ++ battery->bat_desc.num_properties = ++ ARRAY_SIZE(energy_battery_full_cap_broken_props); ++ } else { ++ battery->bat_desc.properties = energy_battery_props; ++ battery->bat_desc.num_properties = ++ ARRAY_SIZE(energy_battery_props); ++ } + } + + battery->bat_desc.name = acpi_device_bid(battery->device); +diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c +index 31014c7d3793..e63fd7bfd3a5 100644 +--- a/drivers/acpi/video_detect.c ++++ b/drivers/acpi/video_detect.c +@@ -336,6 +336,11 @@ static const struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"), + }, + }, ++ ++ /* ++ * Desktops which falsely report a backlight and which our heuristics ++ * for this do not catch. ++ */ + { + .callback = video_detect_force_none, + .ident = "Dell OptiPlex 9020M", +@@ -344,6 +349,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 9020M"), + }, + }, ++ { ++ .callback = video_detect_force_none, ++ .ident = "MSI MS-7721", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "MSI"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "MS-7721"), ++ }, ++ }, + { }, + }; + +diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c +index 134a8af51511..0e99a760aebd 100644 +--- a/drivers/base/power/main.c ++++ b/drivers/base/power/main.c +@@ -273,10 +273,38 @@ static void dpm_wait_for_suppliers(struct device *dev, bool async) + device_links_read_unlock(idx); + } + +-static void dpm_wait_for_superior(struct device *dev, bool async) ++static bool dpm_wait_for_superior(struct device *dev, bool async) + { +- dpm_wait(dev->parent, async); ++ struct device *parent; ++ ++ /* ++ * If the device is resumed asynchronously and the parent's callback ++ * deletes both the device and the parent itself, the parent object may ++ * be freed while this function is running, so avoid that by reference ++ * counting the parent once more unless the device has been deleted ++ * already (in which case return right away). ++ */ ++ mutex_lock(&dpm_list_mtx); ++ ++ if (!device_pm_initialized(dev)) { ++ mutex_unlock(&dpm_list_mtx); ++ return false; ++ } ++ ++ parent = get_device(dev->parent); ++ ++ mutex_unlock(&dpm_list_mtx); ++ ++ dpm_wait(parent, async); ++ put_device(parent); ++ + dpm_wait_for_suppliers(dev, async); ++ ++ /* ++ * If the parent's callback has deleted the device, attempting to resume ++ * it would be invalid, so avoid doing that then. ++ */ ++ return device_pm_initialized(dev); + } + + static void dpm_wait_for_consumers(struct device *dev, bool async) +@@ -621,7 +649,8 @@ static int device_resume_noirq(struct device *dev, pm_message_t state, bool asyn + if (!dev->power.is_noirq_suspended) + goto Out; + +- dpm_wait_for_superior(dev, async); ++ if (!dpm_wait_for_superior(dev, async)) ++ goto Out; + + skip_resume = dev_pm_may_skip_resume(dev); + +@@ -829,7 +858,8 @@ static int device_resume_early(struct device *dev, pm_message_t state, bool asyn + if (!dev->power.is_late_suspended) + goto Out; + +- dpm_wait_for_superior(dev, async); ++ if (!dpm_wait_for_superior(dev, async)) ++ goto Out; + + callback = dpm_subsys_resume_early_cb(dev, state, &info); + +@@ -944,7 +974,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) + goto Complete; + } + +- dpm_wait_for_superior(dev, async); ++ if (!dpm_wait_for_superior(dev, async)) ++ goto Complete; ++ + dpm_watchdog_set(&wd, dev); + device_lock(dev); + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 4e7ef35f1c8f..9c3b063e1a1f 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -2850,7 +2850,7 @@ static int btusb_mtk_setup_firmware(struct hci_dev *hdev, const char *fwname) + err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params); + if (err < 0) { + bt_dev_err(hdev, "Failed to send wmt rst (%d)", err); +- return err; ++ goto err_release_fw; + } + + /* Wait a few moments for firmware activation done */ +@@ -3819,6 +3819,10 @@ static int btusb_probe(struct usb_interface *intf, + * (DEVICE_REMOTE_WAKEUP) + */ + set_bit(BTUSB_WAKEUP_DISABLE, &data->flags); ++ ++ err = usb_autopm_get_interface(intf); ++ if (err < 0) ++ goto out_free_dev; + } + + if (id->driver_info & BTUSB_AMP) { +diff --git a/drivers/clk/tegra/clk-tegra-periph.c b/drivers/clk/tegra/clk-tegra-periph.c +index 1ed85f120a1b..49b9f2f85bad 100644 +--- a/drivers/clk/tegra/clk-tegra-periph.c ++++ b/drivers/clk/tegra/clk-tegra-periph.c +@@ -785,7 +785,11 @@ static struct tegra_periph_init_data gate_clks[] = { + GATE("ahbdma", "hclk", 33, 0, tegra_clk_ahbdma, 0), + GATE("apbdma", "pclk", 34, 0, tegra_clk_apbdma, 0), + GATE("kbc", "clk_32k", 36, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_kbc, 0), +- GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, 0), ++ /* ++ * Critical for RAM re-repair operation, which must occur on resume ++ * from LP1 system suspend and as part of CCPLEX cluster switching. ++ */ ++ GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, CLK_IS_CRITICAL), + GATE("fuse_burn", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse_burn, 0), + GATE("kfuse", "clk_m", 40, TEGRA_PERIPH_ON_APB, tegra_clk_kfuse, 0), + GATE("apbif", "clk_m", 107, TEGRA_PERIPH_ON_APB, tegra_clk_apbif, 0), +diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c +index 8d8da763adc5..8910fd1ae3c6 100644 +--- a/drivers/cpufreq/cppc_cpufreq.c ++++ b/drivers/cpufreq/cppc_cpufreq.c +@@ -217,7 +217,7 @@ static int cppc_cpufreq_set_target(struct cpufreq_policy *policy, + return ret; + } + +-static int cppc_verify_policy(struct cpufreq_policy *policy) ++static int cppc_verify_policy(struct cpufreq_policy_data *policy) + { + cpufreq_verify_within_cpu_limits(policy); + return 0; +diff --git a/drivers/cpufreq/cpufreq-nforce2.c b/drivers/cpufreq/cpufreq-nforce2.c +index cd53272e2fa2..f7a7bcf6f52e 100644 +--- a/drivers/cpufreq/cpufreq-nforce2.c ++++ b/drivers/cpufreq/cpufreq-nforce2.c +@@ -291,7 +291,7 @@ static int nforce2_target(struct cpufreq_policy *policy, + * nforce2_verify - verifies a new CPUFreq policy + * @policy: new policy + */ +-static int nforce2_verify(struct cpufreq_policy *policy) ++static int nforce2_verify(struct cpufreq_policy_data *policy) + { + unsigned int fsb_pol_max; + +diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c +index a7db4f22a077..7679f8a91745 100644 +--- a/drivers/cpufreq/cpufreq.c ++++ b/drivers/cpufreq/cpufreq.c +@@ -74,6 +74,9 @@ static void cpufreq_exit_governor(struct cpufreq_policy *policy); + static int cpufreq_start_governor(struct cpufreq_policy *policy); + static void cpufreq_stop_governor(struct cpufreq_policy *policy); + static void cpufreq_governor_limits(struct cpufreq_policy *policy); ++static int cpufreq_set_policy(struct cpufreq_policy *policy, ++ struct cpufreq_governor *new_gov, ++ unsigned int new_pol); + + /** + * Two notifier lists: the "policy" list is involved in the +@@ -613,25 +616,22 @@ static struct cpufreq_governor *find_governor(const char *str_governor) + return NULL; + } + +-static int cpufreq_parse_policy(char *str_governor, +- struct cpufreq_policy *policy) ++static unsigned int cpufreq_parse_policy(char *str_governor) + { +- if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN)) { +- policy->policy = CPUFREQ_POLICY_PERFORMANCE; +- return 0; +- } +- if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) { +- policy->policy = CPUFREQ_POLICY_POWERSAVE; +- return 0; +- } +- return -EINVAL; ++ if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN)) ++ return CPUFREQ_POLICY_PERFORMANCE; ++ ++ if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) ++ return CPUFREQ_POLICY_POWERSAVE; ++ ++ return CPUFREQ_POLICY_UNKNOWN; + } + + /** + * cpufreq_parse_governor - parse a governor string only for has_target() ++ * @str_governor: Governor name. + */ +-static int cpufreq_parse_governor(char *str_governor, +- struct cpufreq_policy *policy) ++static struct cpufreq_governor *cpufreq_parse_governor(char *str_governor) + { + struct cpufreq_governor *t; + +@@ -645,7 +645,7 @@ static int cpufreq_parse_governor(char *str_governor, + + ret = request_module("cpufreq_%s", str_governor); + if (ret) +- return -EINVAL; ++ return NULL; + + mutex_lock(&cpufreq_governor_mutex); + +@@ -656,12 +656,7 @@ static int cpufreq_parse_governor(char *str_governor, + + mutex_unlock(&cpufreq_governor_mutex); + +- if (t) { +- policy->governor = t; +- return 0; +- } +- +- return -EINVAL; ++ return t; + } + + /** +@@ -762,28 +757,33 @@ static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf) + static ssize_t store_scaling_governor(struct cpufreq_policy *policy, + const char *buf, size_t count) + { ++ char str_governor[16]; + int ret; +- char str_governor[16]; +- struct cpufreq_policy new_policy; +- +- memcpy(&new_policy, policy, sizeof(*policy)); + + ret = sscanf(buf, "%15s", str_governor); + if (ret != 1) + return -EINVAL; + + if (cpufreq_driver->setpolicy) { +- if (cpufreq_parse_policy(str_governor, &new_policy)) ++ unsigned int new_pol; ++ ++ new_pol = cpufreq_parse_policy(str_governor); ++ if (!new_pol) + return -EINVAL; ++ ++ ret = cpufreq_set_policy(policy, NULL, new_pol); + } else { +- if (cpufreq_parse_governor(str_governor, &new_policy)) ++ struct cpufreq_governor *new_gov; ++ ++ new_gov = cpufreq_parse_governor(str_governor); ++ if (!new_gov) + return -EINVAL; +- } + +- ret = cpufreq_set_policy(policy, &new_policy); ++ ret = cpufreq_set_policy(policy, new_gov, ++ CPUFREQ_POLICY_UNKNOWN); + +- if (new_policy.governor) +- module_put(new_policy.governor->owner); ++ module_put(new_gov->owner); ++ } + + return ret ? ret : count; + } +@@ -1050,40 +1050,33 @@ __weak struct cpufreq_governor *cpufreq_default_governor(void) + + static int cpufreq_init_policy(struct cpufreq_policy *policy) + { +- struct cpufreq_governor *gov = NULL, *def_gov = NULL; +- struct cpufreq_policy new_policy; +- +- memcpy(&new_policy, policy, sizeof(*policy)); +- +- def_gov = cpufreq_default_governor(); ++ struct cpufreq_governor *def_gov = cpufreq_default_governor(); ++ struct cpufreq_governor *gov = NULL; ++ unsigned int pol = CPUFREQ_POLICY_UNKNOWN; + + if (has_target()) { +- /* +- * Update governor of new_policy to the governor used before +- * hotplug +- */ ++ /* Update policy governor to the one used before hotplug. */ + gov = find_governor(policy->last_governor); + if (gov) { + pr_debug("Restoring governor %s for cpu %d\n", +- policy->governor->name, policy->cpu); +- } else { +- if (!def_gov) +- return -ENODATA; ++ policy->governor->name, policy->cpu); ++ } else if (def_gov) { + gov = def_gov; ++ } else { ++ return -ENODATA; + } +- new_policy.governor = gov; + } else { + /* Use the default policy if there is no last_policy. */ + if (policy->last_policy) { +- new_policy.policy = policy->last_policy; ++ pol = policy->last_policy; ++ } else if (def_gov) { ++ pol = cpufreq_parse_policy(def_gov->name); + } else { +- if (!def_gov) +- return -ENODATA; +- cpufreq_parse_policy(def_gov->name, &new_policy); ++ return -ENODATA; + } + } + +- return cpufreq_set_policy(policy, &new_policy); ++ return cpufreq_set_policy(policy, gov, pol); + } + + static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) +@@ -1111,13 +1104,10 @@ static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cp + + void refresh_frequency_limits(struct cpufreq_policy *policy) + { +- struct cpufreq_policy new_policy; +- + if (!policy_is_inactive(policy)) { +- new_policy = *policy; + pr_debug("updating policy for CPU %u\n", policy->cpu); + +- cpufreq_set_policy(policy, &new_policy); ++ cpufreq_set_policy(policy, policy->governor, policy->policy); + } + } + EXPORT_SYMBOL(refresh_frequency_limits); +@@ -2361,43 +2351,46 @@ EXPORT_SYMBOL(cpufreq_get_policy); + /** + * cpufreq_set_policy - Modify cpufreq policy parameters. + * @policy: Policy object to modify. +- * @new_policy: New policy data. ++ * @new_gov: Policy governor pointer. ++ * @new_pol: Policy value (for drivers with built-in governors). + * +- * Pass @new_policy to the cpufreq driver's ->verify() callback. Next, copy the +- * min and max parameters of @new_policy to @policy and either invoke the +- * driver's ->setpolicy() callback (if present) or carry out a governor update +- * for @policy. That is, run the current governor's ->limits() callback (if the +- * governor field in @new_policy points to the same object as the one in +- * @policy) or replace the governor for @policy with the new one stored in +- * @new_policy. ++ * Invoke the cpufreq driver's ->verify() callback to sanity-check the frequency ++ * limits to be set for the policy, update @policy with the verified limits ++ * values and either invoke the driver's ->setpolicy() callback (if present) or ++ * carry out a governor update for @policy. That is, run the current governor's ++ * ->limits() callback (if @new_gov points to the same object as the one in ++ * @policy) or replace the governor for @policy with @new_gov. + * + * The cpuinfo part of @policy is not updated by this function. + */ +-int cpufreq_set_policy(struct cpufreq_policy *policy, +- struct cpufreq_policy *new_policy) ++static int cpufreq_set_policy(struct cpufreq_policy *policy, ++ struct cpufreq_governor *new_gov, ++ unsigned int new_pol) + { ++ struct cpufreq_policy_data new_data; + struct cpufreq_governor *old_gov; + int ret; + +- pr_debug("setting new policy for CPU %u: %u - %u kHz\n", +- new_policy->cpu, new_policy->min, new_policy->max); +- +- memcpy(&new_policy->cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); +- ++ memcpy(&new_data.cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); ++ new_data.freq_table = policy->freq_table; ++ new_data.cpu = policy->cpu; + /* + * PM QoS framework collects all the requests from users and provide us + * the final aggregated value here. + */ +- new_policy->min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN); +- new_policy->max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX); ++ new_data.min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN); ++ new_data.max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX); ++ ++ pr_debug("setting new policy for CPU %u: %u - %u kHz\n", ++ new_data.cpu, new_data.min, new_data.max); + + /* verify the cpu speed can be set within this limit */ +- ret = cpufreq_driver->verify(new_policy); ++ ret = cpufreq_driver->verify(&new_data); + if (ret) + return ret; + +- policy->min = new_policy->min; +- policy->max = new_policy->max; ++ policy->min = new_data.min; ++ policy->max = new_data.max; + trace_cpu_frequency_limits(policy); + + policy->cached_target_freq = UINT_MAX; +@@ -2406,12 +2399,12 @@ int cpufreq_set_policy(struct cpufreq_policy *policy, + policy->min, policy->max); + + if (cpufreq_driver->setpolicy) { +- policy->policy = new_policy->policy; ++ policy->policy = new_pol; + pr_debug("setting range\n"); + return cpufreq_driver->setpolicy(policy); + } + +- if (new_policy->governor == policy->governor) { ++ if (new_gov == policy->governor) { + pr_debug("governor limits update\n"); + cpufreq_governor_limits(policy); + return 0; +@@ -2428,7 +2421,7 @@ int cpufreq_set_policy(struct cpufreq_policy *policy, + } + + /* start new governor */ +- policy->governor = new_policy->governor; ++ policy->governor = new_gov; + ret = cpufreq_init_governor(policy); + if (!ret) { + ret = cpufreq_start_governor(policy); +diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c +index ded427e0a488..e117b0059123 100644 +--- a/drivers/cpufreq/freq_table.c ++++ b/drivers/cpufreq/freq_table.c +@@ -60,7 +60,7 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, + return 0; + } + +-int cpufreq_frequency_table_verify(struct cpufreq_policy *policy, ++int cpufreq_frequency_table_verify(struct cpufreq_policy_data *policy, + struct cpufreq_frequency_table *table) + { + struct cpufreq_frequency_table *pos; +@@ -100,7 +100,7 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_verify); + * Generic routine to verify policy & frequency table, requires driver to set + * policy->freq_table prior to it. + */ +-int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy) ++int cpufreq_generic_frequency_table_verify(struct cpufreq_policy_data *policy) + { + if (!policy->freq_table) + return -ENODEV; +diff --git a/drivers/cpufreq/gx-suspmod.c b/drivers/cpufreq/gx-suspmod.c +index e97b5733aa24..75b3ef7ec679 100644 +--- a/drivers/cpufreq/gx-suspmod.c ++++ b/drivers/cpufreq/gx-suspmod.c +@@ -328,7 +328,7 @@ static void gx_set_cpuspeed(struct cpufreq_policy *policy, unsigned int khz) + * for the hardware supported by the driver. + */ + +-static int cpufreq_gx_verify(struct cpufreq_policy *policy) ++static int cpufreq_gx_verify(struct cpufreq_policy_data *policy) + { + unsigned int tmp_freq = 0; + u8 tmp1, tmp2; +diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c +index 8ab31702cf6a..45499e0b9f2f 100644 +--- a/drivers/cpufreq/intel_pstate.c ++++ b/drivers/cpufreq/intel_pstate.c +@@ -2036,8 +2036,9 @@ static int intel_pstate_get_max_freq(struct cpudata *cpu) + cpu->pstate.max_freq : cpu->pstate.turbo_freq; + } + +-static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy, +- struct cpudata *cpu) ++static void intel_pstate_update_perf_limits(struct cpudata *cpu, ++ unsigned int policy_min, ++ unsigned int policy_max) + { + int max_freq = intel_pstate_get_max_freq(cpu); + int32_t max_policy_perf, min_policy_perf; +@@ -2056,18 +2057,17 @@ static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy, + turbo_max = cpu->pstate.turbo_pstate; + } + +- max_policy_perf = max_state * policy->max / max_freq; +- if (policy->max == policy->min) { ++ max_policy_perf = max_state * policy_max / max_freq; ++ if (policy_max == policy_min) { + min_policy_perf = max_policy_perf; + } else { +- min_policy_perf = max_state * policy->min / max_freq; ++ min_policy_perf = max_state * policy_min / max_freq; + min_policy_perf = clamp_t(int32_t, min_policy_perf, + 0, max_policy_perf); + } + + pr_debug("cpu:%d max_state %d min_policy_perf:%d max_policy_perf:%d\n", +- policy->cpu, max_state, +- min_policy_perf, max_policy_perf); ++ cpu->cpu, max_state, min_policy_perf, max_policy_perf); + + /* Normalize user input to [min_perf, max_perf] */ + if (per_cpu_limits) { +@@ -2081,7 +2081,7 @@ static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy, + global_min = DIV_ROUND_UP(turbo_max * global.min_perf_pct, 100); + global_min = clamp_t(int32_t, global_min, 0, global_max); + +- pr_debug("cpu:%d global_min:%d global_max:%d\n", policy->cpu, ++ pr_debug("cpu:%d global_min:%d global_max:%d\n", cpu->cpu, + global_min, global_max); + + cpu->min_perf_ratio = max(min_policy_perf, global_min); +@@ -2094,7 +2094,7 @@ static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy, + cpu->max_perf_ratio); + + } +- pr_debug("cpu:%d max_perf_ratio:%d min_perf_ratio:%d\n", policy->cpu, ++ pr_debug("cpu:%d max_perf_ratio:%d min_perf_ratio:%d\n", cpu->cpu, + cpu->max_perf_ratio, + cpu->min_perf_ratio); + } +@@ -2114,7 +2114,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy) + + mutex_lock(&intel_pstate_limits_lock); + +- intel_pstate_update_perf_limits(policy, cpu); ++ intel_pstate_update_perf_limits(cpu, policy->min, policy->max); + + if (cpu->policy == CPUFREQ_POLICY_PERFORMANCE) { + /* +@@ -2143,8 +2143,8 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy) + return 0; + } + +-static void intel_pstate_adjust_policy_max(struct cpufreq_policy *policy, +- struct cpudata *cpu) ++static void intel_pstate_adjust_policy_max(struct cpudata *cpu, ++ struct cpufreq_policy_data *policy) + { + if (!hwp_active && + cpu->pstate.max_pstate_physical > cpu->pstate.max_pstate && +@@ -2155,7 +2155,7 @@ static void intel_pstate_adjust_policy_max(struct cpufreq_policy *policy, + } + } + +-static int intel_pstate_verify_policy(struct cpufreq_policy *policy) ++static int intel_pstate_verify_policy(struct cpufreq_policy_data *policy) + { + struct cpudata *cpu = all_cpu_data[policy->cpu]; + +@@ -2163,11 +2163,7 @@ static int intel_pstate_verify_policy(struct cpufreq_policy *policy) + cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, + intel_pstate_get_max_freq(cpu)); + +- if (policy->policy != CPUFREQ_POLICY_POWERSAVE && +- policy->policy != CPUFREQ_POLICY_PERFORMANCE) +- return -EINVAL; +- +- intel_pstate_adjust_policy_max(policy, cpu); ++ intel_pstate_adjust_policy_max(cpu, policy); + + return 0; + } +@@ -2268,7 +2264,7 @@ static struct cpufreq_driver intel_pstate = { + .name = "intel_pstate", + }; + +-static int intel_cpufreq_verify_policy(struct cpufreq_policy *policy) ++static int intel_cpufreq_verify_policy(struct cpufreq_policy_data *policy) + { + struct cpudata *cpu = all_cpu_data[policy->cpu]; + +@@ -2276,9 +2272,9 @@ static int intel_cpufreq_verify_policy(struct cpufreq_policy *policy) + cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, + intel_pstate_get_max_freq(cpu)); + +- intel_pstate_adjust_policy_max(policy, cpu); ++ intel_pstate_adjust_policy_max(cpu, policy); + +- intel_pstate_update_perf_limits(policy, cpu); ++ intel_pstate_update_perf_limits(cpu, policy->min, policy->max); + + return 0; + } +diff --git a/drivers/cpufreq/longrun.c b/drivers/cpufreq/longrun.c +index 64b8689f7a4a..0b08be8bff76 100644 +--- a/drivers/cpufreq/longrun.c ++++ b/drivers/cpufreq/longrun.c +@@ -122,7 +122,7 @@ static int longrun_set_policy(struct cpufreq_policy *policy) + * Validates a new CPUFreq policy. This function has to be called with + * cpufreq_driver locked. + */ +-static int longrun_verify_policy(struct cpufreq_policy *policy) ++static int longrun_verify_policy(struct cpufreq_policy_data *policy) + { + if (!policy) + return -EINVAL; +@@ -130,10 +130,6 @@ static int longrun_verify_policy(struct cpufreq_policy *policy) + policy->cpu = 0; + cpufreq_verify_within_cpu_limits(policy); + +- if ((policy->policy != CPUFREQ_POLICY_POWERSAVE) && +- (policy->policy != CPUFREQ_POLICY_PERFORMANCE)) +- return -EINVAL; +- + return 0; + } + +diff --git a/drivers/cpufreq/pcc-cpufreq.c b/drivers/cpufreq/pcc-cpufreq.c +index fdc767fdbe6a..f90273006553 100644 +--- a/drivers/cpufreq/pcc-cpufreq.c ++++ b/drivers/cpufreq/pcc-cpufreq.c +@@ -109,7 +109,7 @@ struct pcc_cpu { + + static struct pcc_cpu __percpu *pcc_cpu_info; + +-static int pcc_cpufreq_verify(struct cpufreq_policy *policy) ++static int pcc_cpufreq_verify(struct cpufreq_policy_data *policy) + { + cpufreq_verify_within_cpu_limits(policy); + return 0; +diff --git a/drivers/cpufreq/sh-cpufreq.c b/drivers/cpufreq/sh-cpufreq.c +index 5096c0ab781b..0ac265d47ef0 100644 +--- a/drivers/cpufreq/sh-cpufreq.c ++++ b/drivers/cpufreq/sh-cpufreq.c +@@ -87,7 +87,7 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy, + return work_on_cpu(policy->cpu, __sh_cpufreq_target, &data); + } + +-static int sh_cpufreq_verify(struct cpufreq_policy *policy) ++static int sh_cpufreq_verify(struct cpufreq_policy_data *policy) + { + struct clk *cpuclk = &per_cpu(sh_cpuclk, policy->cpu); + struct cpufreq_frequency_table *freq_table; +diff --git a/drivers/cpufreq/unicore2-cpufreq.c b/drivers/cpufreq/unicore2-cpufreq.c +index 707dbc1b7ac8..98d392196df2 100644 +--- a/drivers/cpufreq/unicore2-cpufreq.c ++++ b/drivers/cpufreq/unicore2-cpufreq.c +@@ -22,7 +22,7 @@ static struct cpufreq_driver ucv2_driver; + /* make sure that only the "userspace" governor is run + * -- anything else wouldn't make sense on this platform, anyway. + */ +-static int ucv2_verify_speed(struct cpufreq_policy *policy) ++static int ucv2_verify_speed(struct cpufreq_policy_data *policy) + { + if (policy->cpu) + return -EINVAL; +diff --git a/drivers/crypto/atmel-aes.c b/drivers/crypto/atmel-aes.c +index db99cee1991c..89f79d763ab8 100644 +--- a/drivers/crypto/atmel-aes.c ++++ b/drivers/crypto/atmel-aes.c +@@ -88,7 +88,6 @@ + struct atmel_aes_caps { + bool has_dualbuff; + bool has_cfb64; +- bool has_ctr32; + bool has_gcm; + bool has_xts; + bool has_authenc; +@@ -1013,8 +1012,9 @@ static int atmel_aes_ctr_transfer(struct atmel_aes_dev *dd) + struct atmel_aes_ctr_ctx *ctx = atmel_aes_ctr_ctx_cast(dd->ctx); + struct ablkcipher_request *req = ablkcipher_request_cast(dd->areq); + struct scatterlist *src, *dst; +- u32 ctr, blocks; + size_t datalen; ++ u32 ctr; ++ u16 blocks, start, end; + bool use_dma, fragmented = false; + + /* Check for transfer completion. */ +@@ -1026,27 +1026,17 @@ static int atmel_aes_ctr_transfer(struct atmel_aes_dev *dd) + datalen = req->nbytes - ctx->offset; + blocks = DIV_ROUND_UP(datalen, AES_BLOCK_SIZE); + ctr = be32_to_cpu(ctx->iv[3]); +- if (dd->caps.has_ctr32) { +- /* Check 32bit counter overflow. */ +- u32 start = ctr; +- u32 end = start + blocks - 1; +- +- if (end < start) { +- ctr |= 0xffffffff; +- datalen = AES_BLOCK_SIZE * -start; +- fragmented = true; +- } +- } else { +- /* Check 16bit counter overflow. */ +- u16 start = ctr & 0xffff; +- u16 end = start + (u16)blocks - 1; +- +- if (blocks >> 16 || end < start) { +- ctr |= 0xffff; +- datalen = AES_BLOCK_SIZE * (0x10000-start); +- fragmented = true; +- } ++ ++ /* Check 16bit counter overflow. */ ++ start = ctr & 0xffff; ++ end = start + blocks - 1; ++ ++ if (blocks >> 16 || end < start) { ++ ctr |= 0xffff; ++ datalen = AES_BLOCK_SIZE * (0x10000 - start); ++ fragmented = true; + } ++ + use_dma = (datalen >= ATMEL_AES_DMA_THRESHOLD); + + /* Jump to offset. */ +@@ -2550,7 +2540,6 @@ static void atmel_aes_get_cap(struct atmel_aes_dev *dd) + { + dd->caps.has_dualbuff = 0; + dd->caps.has_cfb64 = 0; +- dd->caps.has_ctr32 = 0; + dd->caps.has_gcm = 0; + dd->caps.has_xts = 0; + dd->caps.has_authenc = 0; +@@ -2561,7 +2550,6 @@ static void atmel_aes_get_cap(struct atmel_aes_dev *dd) + case 0x500: + dd->caps.has_dualbuff = 1; + dd->caps.has_cfb64 = 1; +- dd->caps.has_ctr32 = 1; + dd->caps.has_gcm = 1; + dd->caps.has_xts = 1; + dd->caps.has_authenc = 1; +@@ -2570,7 +2558,6 @@ static void atmel_aes_get_cap(struct atmel_aes_dev *dd) + case 0x200: + dd->caps.has_dualbuff = 1; + dd->caps.has_cfb64 = 1; +- dd->caps.has_ctr32 = 1; + dd->caps.has_gcm = 1; + dd->caps.max_burst_size = 4; + break; +diff --git a/drivers/crypto/ccp/ccp-dev-v3.c b/drivers/crypto/ccp/ccp-dev-v3.c +index 0186b3df4c87..0d5576f6ad21 100644 +--- a/drivers/crypto/ccp/ccp-dev-v3.c ++++ b/drivers/crypto/ccp/ccp-dev-v3.c +@@ -586,6 +586,7 @@ const struct ccp_vdata ccpv3_platform = { + .setup = NULL, + .perform = &ccp3_actions, + .offset = 0, ++ .rsamax = CCP_RSA_MAX_WIDTH, + }; + + const struct ccp_vdata ccpv3 = { +diff --git a/drivers/crypto/ccree/cc_aead.c b/drivers/crypto/ccree/cc_aead.c +index d3e8faa03f15..3d7c8d9e54b9 100644 +--- a/drivers/crypto/ccree/cc_aead.c ++++ b/drivers/crypto/ccree/cc_aead.c +@@ -237,7 +237,7 @@ static void cc_aead_complete(struct device *dev, void *cc_req, int err) + * revealed the decrypted message --> zero its memory. + */ + sg_zero_buffer(areq->dst, sg_nents(areq->dst), +- areq->cryptlen, 0); ++ areq->cryptlen, areq->assoclen); + err = -EBADMSG; + } + /*ENCRYPT*/ +diff --git a/drivers/crypto/ccree/cc_cipher.c b/drivers/crypto/ccree/cc_cipher.c +index 254b48797799..cd9c60268bf8 100644 +--- a/drivers/crypto/ccree/cc_cipher.c ++++ b/drivers/crypto/ccree/cc_cipher.c +@@ -523,6 +523,7 @@ static void cc_setup_readiv_desc(struct crypto_tfm *tfm, + } + } + ++ + static void cc_setup_state_desc(struct crypto_tfm *tfm, + struct cipher_req_ctx *req_ctx, + unsigned int ivsize, unsigned int nbytes, +@@ -534,8 +535,6 @@ static void cc_setup_state_desc(struct crypto_tfm *tfm, + int cipher_mode = ctx_p->cipher_mode; + int flow_mode = ctx_p->flow_mode; + int direction = req_ctx->gen_ctx.op_type; +- dma_addr_t key_dma_addr = ctx_p->user.key_dma_addr; +- unsigned int key_len = ctx_p->keylen; + dma_addr_t iv_dma_addr = req_ctx->gen_ctx.iv_dma_addr; + unsigned int du_size = nbytes; + +@@ -570,6 +569,47 @@ static void cc_setup_state_desc(struct crypto_tfm *tfm, + break; + case DRV_CIPHER_XTS: + case DRV_CIPHER_ESSIV: ++ case DRV_CIPHER_BITLOCKER: ++ break; ++ default: ++ dev_err(dev, "Unsupported cipher mode (%d)\n", cipher_mode); ++ } ++} ++ ++ ++static void cc_setup_xex_state_desc(struct crypto_tfm *tfm, ++ struct cipher_req_ctx *req_ctx, ++ unsigned int ivsize, unsigned int nbytes, ++ struct cc_hw_desc desc[], ++ unsigned int *seq_size) ++{ ++ struct cc_cipher_ctx *ctx_p = crypto_tfm_ctx(tfm); ++ struct device *dev = drvdata_to_dev(ctx_p->drvdata); ++ int cipher_mode = ctx_p->cipher_mode; ++ int flow_mode = ctx_p->flow_mode; ++ int direction = req_ctx->gen_ctx.op_type; ++ dma_addr_t key_dma_addr = ctx_p->user.key_dma_addr; ++ unsigned int key_len = ctx_p->keylen; ++ dma_addr_t iv_dma_addr = req_ctx->gen_ctx.iv_dma_addr; ++ unsigned int du_size = nbytes; ++ ++ struct cc_crypto_alg *cc_alg = ++ container_of(tfm->__crt_alg, struct cc_crypto_alg, ++ skcipher_alg.base); ++ ++ if (cc_alg->data_unit) ++ du_size = cc_alg->data_unit; ++ ++ switch (cipher_mode) { ++ case DRV_CIPHER_ECB: ++ break; ++ case DRV_CIPHER_CBC: ++ case DRV_CIPHER_CBC_CTS: ++ case DRV_CIPHER_CTR: ++ case DRV_CIPHER_OFB: ++ break; ++ case DRV_CIPHER_XTS: ++ case DRV_CIPHER_ESSIV: + case DRV_CIPHER_BITLOCKER: + /* load XEX key */ + hw_desc_init(&desc[*seq_size]); +@@ -881,12 +921,14 @@ static int cc_cipher_process(struct skcipher_request *req, + + /* STAT_PHASE_2: Create sequence */ + +- /* Setup IV and XEX key used */ ++ /* Setup state (IV) */ + cc_setup_state_desc(tfm, req_ctx, ivsize, nbytes, desc, &seq_len); + /* Setup MLLI line, if needed */ + cc_setup_mlli_desc(tfm, req_ctx, dst, src, nbytes, req, desc, &seq_len); + /* Setup key */ + cc_setup_key_desc(tfm, req_ctx, nbytes, desc, &seq_len); ++ /* Setup state (IV and XEX key) */ ++ cc_setup_xex_state_desc(tfm, req_ctx, ivsize, nbytes, desc, &seq_len); + /* Data processing */ + cc_setup_flow_desc(tfm, req_ctx, dst, src, nbytes, desc, &seq_len); + /* Read next IV */ +diff --git a/drivers/crypto/ccree/cc_driver.h b/drivers/crypto/ccree/cc_driver.h +index ab31d4a68c80..7d2f7e2c0bb5 100644 +--- a/drivers/crypto/ccree/cc_driver.h ++++ b/drivers/crypto/ccree/cc_driver.h +@@ -161,6 +161,7 @@ struct cc_drvdata { + int std_bodies; + bool sec_disabled; + u32 comp_mask; ++ bool pm_on; + }; + + struct cc_crypto_alg { +diff --git a/drivers/crypto/ccree/cc_pm.c b/drivers/crypto/ccree/cc_pm.c +index dbc508fb719b..452bd77a9ba0 100644 +--- a/drivers/crypto/ccree/cc_pm.c ++++ b/drivers/crypto/ccree/cc_pm.c +@@ -22,14 +22,8 @@ const struct dev_pm_ops ccree_pm = { + int cc_pm_suspend(struct device *dev) + { + struct cc_drvdata *drvdata = dev_get_drvdata(dev); +- int rc; + + dev_dbg(dev, "set HOST_POWER_DOWN_EN\n"); +- rc = cc_suspend_req_queue(drvdata); +- if (rc) { +- dev_err(dev, "cc_suspend_req_queue (%x)\n", rc); +- return rc; +- } + fini_cc_regs(drvdata); + cc_iowrite(drvdata, CC_REG(HOST_POWER_DOWN_EN), POWER_DOWN_ENABLE); + cc_clk_off(drvdata); +@@ -63,13 +57,6 @@ int cc_pm_resume(struct device *dev) + /* check if tee fips error occurred during power down */ + cc_tee_handle_fips_error(drvdata); + +- rc = cc_resume_req_queue(drvdata); +- if (rc) { +- dev_err(dev, "cc_resume_req_queue (%x)\n", rc); +- return rc; +- } +- +- /* must be after the queue resuming as it uses the HW queue*/ + cc_init_hash_sram(drvdata); + + return 0; +@@ -80,12 +67,10 @@ int cc_pm_get(struct device *dev) + int rc = 0; + struct cc_drvdata *drvdata = dev_get_drvdata(dev); + +- if (cc_req_queue_suspended(drvdata)) ++ if (drvdata->pm_on) + rc = pm_runtime_get_sync(dev); +- else +- pm_runtime_get_noresume(dev); + +- return rc; ++ return (rc == 1 ? 0 : rc); + } + + int cc_pm_put_suspend(struct device *dev) +@@ -93,14 +78,11 @@ int cc_pm_put_suspend(struct device *dev) + int rc = 0; + struct cc_drvdata *drvdata = dev_get_drvdata(dev); + +- if (!cc_req_queue_suspended(drvdata)) { ++ if (drvdata->pm_on) { + pm_runtime_mark_last_busy(dev); + rc = pm_runtime_put_autosuspend(dev); +- } else { +- /* Something wrong happens*/ +- dev_err(dev, "request to suspend already suspended queue"); +- rc = -EBUSY; + } ++ + return rc; + } + +@@ -117,7 +99,7 @@ int cc_pm_init(struct cc_drvdata *drvdata) + /* must be before the enabling to avoid resdundent suspending */ + pm_runtime_set_autosuspend_delay(dev, CC_SUSPEND_TIMEOUT); + pm_runtime_use_autosuspend(dev); +- /* activate the PM module */ ++ /* set us as active - note we won't do PM ops until cc_pm_go()! */ + return pm_runtime_set_active(dev); + } + +@@ -125,9 +107,11 @@ int cc_pm_init(struct cc_drvdata *drvdata) + void cc_pm_go(struct cc_drvdata *drvdata) + { + pm_runtime_enable(drvdata_to_dev(drvdata)); ++ drvdata->pm_on = true; + } + + void cc_pm_fini(struct cc_drvdata *drvdata) + { + pm_runtime_disable(drvdata_to_dev(drvdata)); ++ drvdata->pm_on = false; + } +diff --git a/drivers/crypto/ccree/cc_request_mgr.c b/drivers/crypto/ccree/cc_request_mgr.c +index a947d5a2cf35..37e6fee37b13 100644 +--- a/drivers/crypto/ccree/cc_request_mgr.c ++++ b/drivers/crypto/ccree/cc_request_mgr.c +@@ -41,7 +41,6 @@ struct cc_req_mgr_handle { + #else + struct tasklet_struct comptask; + #endif +- bool is_runtime_suspended; + }; + + struct cc_bl_item { +@@ -404,6 +403,7 @@ static void cc_proc_backlog(struct cc_drvdata *drvdata) + spin_lock(&mgr->bl_lock); + list_del(&bli->list); + --mgr->bl_len; ++ kfree(bli); + } + + spin_unlock(&mgr->bl_lock); +@@ -677,52 +677,3 @@ static void comp_handler(unsigned long devarg) + cc_proc_backlog(drvdata); + dev_dbg(dev, "Comp. handler done.\n"); + } +- +-/* +- * resume the queue configuration - no need to take the lock as this happens +- * inside the spin lock protection +- */ +-#if defined(CONFIG_PM) +-int cc_resume_req_queue(struct cc_drvdata *drvdata) +-{ +- struct cc_req_mgr_handle *request_mgr_handle = +- drvdata->request_mgr_handle; +- +- spin_lock_bh(&request_mgr_handle->hw_lock); +- request_mgr_handle->is_runtime_suspended = false; +- spin_unlock_bh(&request_mgr_handle->hw_lock); +- +- return 0; +-} +- +-/* +- * suspend the queue configuration. Since it is used for the runtime suspend +- * only verify that the queue can be suspended. +- */ +-int cc_suspend_req_queue(struct cc_drvdata *drvdata) +-{ +- struct cc_req_mgr_handle *request_mgr_handle = +- drvdata->request_mgr_handle; +- +- /* lock the send_request */ +- spin_lock_bh(&request_mgr_handle->hw_lock); +- if (request_mgr_handle->req_queue_head != +- request_mgr_handle->req_queue_tail) { +- spin_unlock_bh(&request_mgr_handle->hw_lock); +- return -EBUSY; +- } +- request_mgr_handle->is_runtime_suspended = true; +- spin_unlock_bh(&request_mgr_handle->hw_lock); +- +- return 0; +-} +- +-bool cc_req_queue_suspended(struct cc_drvdata *drvdata) +-{ +- struct cc_req_mgr_handle *request_mgr_handle = +- drvdata->request_mgr_handle; +- +- return request_mgr_handle->is_runtime_suspended; +-} +- +-#endif +diff --git a/drivers/crypto/ccree/cc_request_mgr.h b/drivers/crypto/ccree/cc_request_mgr.h +index f46cf766fe4d..ff7746aaaf35 100644 +--- a/drivers/crypto/ccree/cc_request_mgr.h ++++ b/drivers/crypto/ccree/cc_request_mgr.h +@@ -40,12 +40,4 @@ void complete_request(struct cc_drvdata *drvdata); + + void cc_req_mgr_fini(struct cc_drvdata *drvdata); + +-#if defined(CONFIG_PM) +-int cc_resume_req_queue(struct cc_drvdata *drvdata); +- +-int cc_suspend_req_queue(struct cc_drvdata *drvdata); +- +-bool cc_req_queue_suspended(struct cc_drvdata *drvdata); +-#endif +- + #endif /*__REQUEST_MGR_H__*/ +diff --git a/drivers/crypto/hisilicon/Kconfig b/drivers/crypto/hisilicon/Kconfig +index 504daff7687d..f7f0a1fb6895 100644 +--- a/drivers/crypto/hisilicon/Kconfig ++++ b/drivers/crypto/hisilicon/Kconfig +@@ -35,6 +35,5 @@ config CRYPTO_DEV_HISI_ZIP + depends on ARM64 && PCI && PCI_MSI + select CRYPTO_DEV_HISI_QM + select CRYPTO_HISI_SGL +- select SG_SPLIT + help + Support for HiSilicon ZIP Driver +diff --git a/drivers/crypto/hisilicon/zip/zip.h b/drivers/crypto/hisilicon/zip/zip.h +index ffb00d987d02..99f21d848d4f 100644 +--- a/drivers/crypto/hisilicon/zip/zip.h ++++ b/drivers/crypto/hisilicon/zip/zip.h +@@ -12,6 +12,10 @@ + + /* hisi_zip_sqe dw3 */ + #define HZIP_BD_STATUS_M GENMASK(7, 0) ++/* hisi_zip_sqe dw7 */ ++#define HZIP_IN_SGE_DATA_OFFSET_M GENMASK(23, 0) ++/* hisi_zip_sqe dw8 */ ++#define HZIP_OUT_SGE_DATA_OFFSET_M GENMASK(23, 0) + /* hisi_zip_sqe dw9 */ + #define HZIP_REQ_TYPE_M GENMASK(7, 0) + #define HZIP_ALG_TYPE_ZLIB 0x02 +diff --git a/drivers/crypto/hisilicon/zip/zip_crypto.c b/drivers/crypto/hisilicon/zip/zip_crypto.c +index 59023545a1c4..cf34bfdfb3e6 100644 +--- a/drivers/crypto/hisilicon/zip/zip_crypto.c ++++ b/drivers/crypto/hisilicon/zip/zip_crypto.c +@@ -45,10 +45,8 @@ enum hisi_zip_alg_type { + + struct hisi_zip_req { + struct acomp_req *req; +- struct scatterlist *src; +- struct scatterlist *dst; +- size_t slen; +- size_t dlen; ++ int sskip; ++ int dskip; + struct hisi_acc_hw_sgl *hw_src; + struct hisi_acc_hw_sgl *hw_dst; + dma_addr_t dma_src; +@@ -94,13 +92,15 @@ static void hisi_zip_config_tag(struct hisi_zip_sqe *sqe, u32 tag) + + static void hisi_zip_fill_sqe(struct hisi_zip_sqe *sqe, u8 req_type, + dma_addr_t s_addr, dma_addr_t d_addr, u32 slen, +- u32 dlen) ++ u32 dlen, int sskip, int dskip) + { + memset(sqe, 0, sizeof(struct hisi_zip_sqe)); + +- sqe->input_data_length = slen; ++ sqe->input_data_length = slen - sskip; ++ sqe->dw7 = FIELD_PREP(HZIP_IN_SGE_DATA_OFFSET_M, sskip); ++ sqe->dw8 = FIELD_PREP(HZIP_OUT_SGE_DATA_OFFSET_M, dskip); + sqe->dw9 = FIELD_PREP(HZIP_REQ_TYPE_M, req_type); +- sqe->dest_avail_out = dlen; ++ sqe->dest_avail_out = dlen - dskip; + sqe->source_addr_l = lower_32_bits(s_addr); + sqe->source_addr_h = upper_32_bits(s_addr); + sqe->dest_addr_l = lower_32_bits(d_addr); +@@ -301,11 +301,6 @@ static void hisi_zip_remove_req(struct hisi_zip_qp_ctx *qp_ctx, + { + struct hisi_zip_req_q *req_q = &qp_ctx->req_q; + +- if (qp_ctx->qp->alg_type == HZIP_ALG_TYPE_COMP) +- kfree(req->dst); +- else +- kfree(req->src); +- + write_lock(&req_q->req_lock); + clear_bit(req->req_id, req_q->req_bitmap); + memset(req, 0, sizeof(struct hisi_zip_req)); +@@ -333,8 +328,8 @@ static void hisi_zip_acomp_cb(struct hisi_qp *qp, void *data) + } + dlen = sqe->produced; + +- hisi_acc_sg_buf_unmap(dev, req->src, req->hw_src); +- hisi_acc_sg_buf_unmap(dev, req->dst, req->hw_dst); ++ hisi_acc_sg_buf_unmap(dev, acomp_req->src, req->hw_src); ++ hisi_acc_sg_buf_unmap(dev, acomp_req->dst, req->hw_dst); + + head_size = (qp->alg_type == 0) ? TO_HEAD_SIZE(qp->req_type) : 0; + acomp_req->dlen = dlen + head_size; +@@ -428,20 +423,6 @@ static size_t get_comp_head_size(struct scatterlist *src, u8 req_type) + } + } + +-static int get_sg_skip_bytes(struct scatterlist *sgl, size_t bytes, +- size_t remains, struct scatterlist **out) +-{ +-#define SPLIT_NUM 2 +- size_t split_sizes[SPLIT_NUM]; +- int out_mapped_nents[SPLIT_NUM]; +- +- split_sizes[0] = bytes; +- split_sizes[1] = remains; +- +- return sg_split(sgl, 0, 0, SPLIT_NUM, split_sizes, out, +- out_mapped_nents, GFP_KERNEL); +-} +- + static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req, + struct hisi_zip_qp_ctx *qp_ctx, + size_t head_size, bool is_comp) +@@ -449,31 +430,7 @@ static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req, + struct hisi_zip_req_q *req_q = &qp_ctx->req_q; + struct hisi_zip_req *q = req_q->q; + struct hisi_zip_req *req_cache; +- struct scatterlist *out[2]; +- struct scatterlist *sgl; +- size_t len; +- int ret, req_id; +- +- /* +- * remove/add zlib/gzip head, as hardware operations do not include +- * comp head. so split req->src to get sgl without heads in acomp, or +- * add comp head to req->dst ahead of that hardware output compressed +- * data in sgl splited from req->dst without comp head. +- */ +- if (is_comp) { +- sgl = req->dst; +- len = req->dlen - head_size; +- } else { +- sgl = req->src; +- len = req->slen - head_size; +- } +- +- ret = get_sg_skip_bytes(sgl, head_size, len, out); +- if (ret) +- return ERR_PTR(ret); +- +- /* sgl for comp head is useless, so free it now */ +- kfree(out[0]); ++ int req_id; + + write_lock(&req_q->req_lock); + +@@ -481,7 +438,6 @@ static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req, + if (req_id >= req_q->size) { + write_unlock(&req_q->req_lock); + dev_dbg(&qp_ctx->qp->qm->pdev->dev, "req cache is full!\n"); +- kfree(out[1]); + return ERR_PTR(-EBUSY); + } + set_bit(req_id, req_q->req_bitmap); +@@ -489,16 +445,13 @@ static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req, + req_cache = q + req_id; + req_cache->req_id = req_id; + req_cache->req = req; ++ + if (is_comp) { +- req_cache->src = req->src; +- req_cache->dst = out[1]; +- req_cache->slen = req->slen; +- req_cache->dlen = req->dlen - head_size; ++ req_cache->sskip = 0; ++ req_cache->dskip = head_size; + } else { +- req_cache->src = out[1]; +- req_cache->dst = req->dst; +- req_cache->slen = req->slen - head_size; +- req_cache->dlen = req->dlen; ++ req_cache->sskip = head_size; ++ req_cache->dskip = 0; + } + + write_unlock(&req_q->req_lock); +@@ -510,6 +463,7 @@ static int hisi_zip_do_work(struct hisi_zip_req *req, + struct hisi_zip_qp_ctx *qp_ctx) + { + struct hisi_zip_sqe *zip_sqe = &qp_ctx->zip_sqe; ++ struct acomp_req *a_req = req->req; + struct hisi_qp *qp = qp_ctx->qp; + struct device *dev = &qp->qm->pdev->dev; + struct hisi_acc_sgl_pool *pool = &qp_ctx->sgl_pool; +@@ -517,16 +471,16 @@ static int hisi_zip_do_work(struct hisi_zip_req *req, + dma_addr_t output; + int ret; + +- if (!req->src || !req->slen || !req->dst || !req->dlen) ++ if (!a_req->src || !a_req->slen || !a_req->dst || !a_req->dlen) + return -EINVAL; + +- req->hw_src = hisi_acc_sg_buf_map_to_hw_sgl(dev, req->src, pool, ++ req->hw_src = hisi_acc_sg_buf_map_to_hw_sgl(dev, a_req->src, pool, + req->req_id << 1, &input); + if (IS_ERR(req->hw_src)) + return PTR_ERR(req->hw_src); + req->dma_src = input; + +- req->hw_dst = hisi_acc_sg_buf_map_to_hw_sgl(dev, req->dst, pool, ++ req->hw_dst = hisi_acc_sg_buf_map_to_hw_sgl(dev, a_req->dst, pool, + (req->req_id << 1) + 1, + &output); + if (IS_ERR(req->hw_dst)) { +@@ -535,8 +489,8 @@ static int hisi_zip_do_work(struct hisi_zip_req *req, + } + req->dma_dst = output; + +- hisi_zip_fill_sqe(zip_sqe, qp->req_type, input, output, req->slen, +- req->dlen); ++ hisi_zip_fill_sqe(zip_sqe, qp->req_type, input, output, a_req->slen, ++ a_req->dlen, req->sskip, req->dskip); + hisi_zip_config_buf_type(zip_sqe, HZIP_SGL); + hisi_zip_config_tag(zip_sqe, req->req_id); + +@@ -548,9 +502,9 @@ static int hisi_zip_do_work(struct hisi_zip_req *req, + return -EINPROGRESS; + + err_unmap_output: +- hisi_acc_sg_buf_unmap(dev, req->dst, req->hw_dst); ++ hisi_acc_sg_buf_unmap(dev, a_req->dst, req->hw_dst); + err_unmap_input: +- hisi_acc_sg_buf_unmap(dev, req->src, req->hw_src); ++ hisi_acc_sg_buf_unmap(dev, a_req->src, req->hw_src); + return ret; + } + +diff --git a/drivers/crypto/picoxcell_crypto.c b/drivers/crypto/picoxcell_crypto.c +index 3cbefb41b099..2680e1525db5 100644 +--- a/drivers/crypto/picoxcell_crypto.c ++++ b/drivers/crypto/picoxcell_crypto.c +@@ -1613,6 +1613,11 @@ static const struct of_device_id spacc_of_id_table[] = { + MODULE_DEVICE_TABLE(of, spacc_of_id_table); + #endif /* CONFIG_OF */ + ++static void spacc_tasklet_kill(void *data) ++{ ++ tasklet_kill(data); ++} ++ + static int spacc_probe(struct platform_device *pdev) + { + int i, err, ret; +@@ -1655,6 +1660,14 @@ static int spacc_probe(struct platform_device *pdev) + return -ENXIO; + } + ++ tasklet_init(&engine->complete, spacc_spacc_complete, ++ (unsigned long)engine); ++ ++ ret = devm_add_action(&pdev->dev, spacc_tasklet_kill, ++ &engine->complete); ++ if (ret) ++ return ret; ++ + if (devm_request_irq(&pdev->dev, irq->start, spacc_spacc_irq, 0, + engine->name, engine)) { + dev_err(engine->dev, "failed to request IRQ\n"); +@@ -1712,8 +1725,6 @@ static int spacc_probe(struct platform_device *pdev) + INIT_LIST_HEAD(&engine->completed); + INIT_LIST_HEAD(&engine->in_progress); + engine->in_flight = 0; +- tasklet_init(&engine->complete, spacc_spacc_complete, +- (unsigned long)engine); + + platform_set_drvdata(pdev, engine); + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +index ee1dc75f5ddc..1d733b57e60f 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +@@ -247,7 +247,8 @@ bool dm_helpers_dp_mst_write_payload_allocation_table( + drm_dp_mst_reset_vcpi_slots(mst_mgr, mst_port); + } + +- ret = drm_dp_update_payload_part1(mst_mgr); ++ /* It's OK for this to fail */ ++ drm_dp_update_payload_part1(mst_mgr); + + /* mst_mgr->->payloads are VC payload notify MST branch using DPCD or + * AUX message. The sequence is slot 1-63 allocated sequence for each +@@ -256,9 +257,6 @@ bool dm_helpers_dp_mst_write_payload_allocation_table( + + get_payload_table(aconnector, proposed_table); + +- if (ret) +- return false; +- + return true; + } + +@@ -316,7 +314,6 @@ bool dm_helpers_dp_mst_send_payload_allocation( + struct amdgpu_dm_connector *aconnector; + struct drm_dp_mst_topology_mgr *mst_mgr; + struct drm_dp_mst_port *mst_port; +- int ret; + + aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context; + +@@ -330,10 +327,8 @@ bool dm_helpers_dp_mst_send_payload_allocation( + if (!mst_mgr->mst_state) + return false; + +- ret = drm_dp_update_payload_part2(mst_mgr); +- +- if (ret) +- return false; ++ /* It's OK for this to fail */ ++ drm_dp_update_payload_part2(mst_mgr); + + if (!enable) + drm_dp_mst_deallocate_vcpi(mst_mgr, mst_port); +diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +index f2e73e6d46b8..10985134ce0b 100644 +--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c ++++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +@@ -73,7 +73,11 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) + unsigned long prate; + unsigned int mask = ATMEL_HLCDC_CLKDIV_MASK | ATMEL_HLCDC_CLKPOL; + unsigned int cfg = 0; +- int div; ++ int div, ret; ++ ++ ret = clk_prepare_enable(crtc->dc->hlcdc->sys_clk); ++ if (ret) ++ return; + + vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; + vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; +@@ -95,14 +99,14 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) + (adj->crtc_hdisplay - 1) | + ((adj->crtc_vdisplay - 1) << 16)); + ++ prate = clk_get_rate(crtc->dc->hlcdc->sys_clk); ++ mode_rate = adj->crtc_clock * 1000; + if (!crtc->dc->desc->fixed_clksrc) { ++ prate *= 2; + cfg |= ATMEL_HLCDC_CLKSEL; + mask |= ATMEL_HLCDC_CLKSEL; + } + +- prate = 2 * clk_get_rate(crtc->dc->hlcdc->sys_clk); +- mode_rate = adj->crtc_clock * 1000; +- + div = DIV_ROUND_UP(prate, mode_rate); + if (div < 2) { + div = 2; +@@ -117,8 +121,8 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) + int div_low = prate / mode_rate; + + if (div_low >= 2 && +- ((prate / div_low - mode_rate) < +- 10 * (mode_rate - prate / div))) ++ (10 * (prate / div_low - mode_rate) < ++ (mode_rate - prate / div))) + /* + * At least 10 times better when using a higher + * frequency than requested, instead of a lower. +@@ -147,6 +151,8 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) + ATMEL_HLCDC_VSPSU | ATMEL_HLCDC_VSPHO | + ATMEL_HLCDC_GUARDTIME_MASK | ATMEL_HLCDC_MODE_MASK, + cfg); ++ ++ clk_disable_unprepare(crtc->dc->hlcdc->sys_clk); + } + + static enum drm_mode_status +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index a48a4c21b1b3..c5e9e2305fff 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -2694,6 +2694,7 @@ static bool drm_dp_get_vc_payload_bw(int dp_link_bw, + int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state) + { + int ret = 0; ++ int i = 0; + struct drm_dp_mst_branch *mstb = NULL; + + mutex_lock(&mgr->lock); +@@ -2754,10 +2755,21 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms + /* this can fail if the device is gone */ + drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); + ret = 0; ++ mutex_lock(&mgr->payload_lock); + memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload)); + mgr->payload_mask = 0; + set_bit(0, &mgr->payload_mask); ++ for (i = 0; i < mgr->max_payloads; i++) { ++ struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i]; ++ ++ if (vcpi) { ++ vcpi->vcpi = 0; ++ vcpi->num_slots = 0; ++ } ++ mgr->proposed_vcpis[i] = NULL; ++ } + mgr->vcpi_mask = 0; ++ mutex_unlock(&mgr->payload_lock); + } + + out_unlock: +diff --git a/drivers/gpu/drm/drm_rect.c b/drivers/gpu/drm/drm_rect.c +index b8363aaa9032..818738e83d06 100644 +--- a/drivers/gpu/drm/drm_rect.c ++++ b/drivers/gpu/drm/drm_rect.c +@@ -54,7 +54,12 @@ EXPORT_SYMBOL(drm_rect_intersect); + + static u32 clip_scaled(u32 src, u32 dst, u32 clip) + { +- u64 tmp = mul_u32_u32(src, dst - clip); ++ u64 tmp; ++ ++ if (dst == 0) ++ return 0; ++ ++ tmp = mul_u32_u32(src, dst - clip); + + /* + * Round toward 1.0 when clipping so that we don't accidentally +diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c +index 772f0753ed38..aaf2f26f8505 100644 +--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c ++++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c +@@ -121,7 +121,7 @@ static void mdp4_dsi_encoder_enable(struct drm_encoder *encoder) + if (mdp4_dsi_encoder->enabled) + return; + +- mdp4_crtc_set_config(encoder->crtc, ++ mdp4_crtc_set_config(encoder->crtc, + MDP4_DMA_CONFIG_PACK_ALIGN_MSB | + MDP4_DMA_CONFIG_DEFLKR_EN | + MDP4_DMA_CONFIG_DITHER_EN | +diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c +index 34bd73526afd..930674117533 100644 +--- a/drivers/hv/hv_balloon.c ++++ b/drivers/hv/hv_balloon.c +@@ -1213,10 +1213,7 @@ static unsigned int alloc_balloon_pages(struct hv_dynmem_device *dm, + unsigned int i, j; + struct page *pg; + +- if (num_pages < alloc_unit) +- return 0; +- +- for (i = 0; (i * alloc_unit) < num_pages; i++) { ++ for (i = 0; i < num_pages / alloc_unit; i++) { + if (bl_resp->hdr.size + sizeof(union dm_mem_page_range) > + PAGE_SIZE) + return i * alloc_unit; +@@ -1254,7 +1251,7 @@ static unsigned int alloc_balloon_pages(struct hv_dynmem_device *dm, + + } + +- return num_pages; ++ return i * alloc_unit; + } + + static void balloon_up(struct work_struct *dummy) +@@ -1269,9 +1266,6 @@ static void balloon_up(struct work_struct *dummy) + long avail_pages; + unsigned long floor; + +- /* The host balloons pages in 2M granularity. */ +- WARN_ON_ONCE(num_pages % PAGES_IN_2M != 0); +- + /* + * We will attempt 2M allocations. However, if we fail to + * allocate 2M chunks, we will go back to 4k allocations. +@@ -1281,14 +1275,13 @@ static void balloon_up(struct work_struct *dummy) + avail_pages = si_mem_available(); + floor = compute_balloon_floor(); + +- /* Refuse to balloon below the floor, keep the 2M granularity. */ ++ /* Refuse to balloon below the floor. */ + if (avail_pages < num_pages || avail_pages - num_pages < floor) { + pr_warn("Balloon request will be partially fulfilled. %s\n", + avail_pages < num_pages ? "Not enough memory." : + "Balloon floor reached."); + + num_pages = avail_pages > floor ? (avail_pages - floor) : 0; +- num_pages -= num_pages % PAGES_IN_2M; + } + + while (!done) { +diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c +index 163ff7ba92b7..fedf6829cdec 100644 +--- a/drivers/infiniband/core/umem_odp.c ++++ b/drivers/infiniband/core/umem_odp.c +@@ -632,7 +632,7 @@ int ib_umem_odp_map_dma_pages(struct ib_umem_odp *umem_odp, u64 user_virt, + + while (bcnt > 0) { + const size_t gup_num_pages = min_t(size_t, +- (bcnt + BIT(page_shift) - 1) >> page_shift, ++ ALIGN(bcnt, PAGE_SIZE) / PAGE_SIZE, + PAGE_SIZE / sizeof(struct page *)); + + down_read(&owning_mm->mmap_sem); +diff --git a/drivers/infiniband/hw/mlx5/gsi.c b/drivers/infiniband/hw/mlx5/gsi.c +index 4950df3f71b6..5c73c0a790fa 100644 +--- a/drivers/infiniband/hw/mlx5/gsi.c ++++ b/drivers/infiniband/hw/mlx5/gsi.c +@@ -507,8 +507,7 @@ int mlx5_ib_gsi_post_send(struct ib_qp *qp, const struct ib_send_wr *wr, + ret = ib_post_send(tx_qp, &cur_wr.wr, bad_wr); + if (ret) { + /* Undo the effect of adding the outstanding wr */ +- gsi->outstanding_pi = (gsi->outstanding_pi - 1) % +- gsi->cap.max_send_wr; ++ gsi->outstanding_pi--; + goto err; + } + spin_unlock_irqrestore(&gsi->lock, flags); +diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h +index deb924e1d790..3d2b63585da9 100644 +--- a/drivers/md/bcache/bcache.h ++++ b/drivers/md/bcache/bcache.h +@@ -329,6 +329,9 @@ struct cached_dev { + */ + atomic_t has_dirty; + ++#define BCH_CACHE_READA_ALL 0 ++#define BCH_CACHE_READA_META_ONLY 1 ++ unsigned int cache_readahead_policy; + struct bch_ratelimit writeback_rate; + struct delayed_work writeback_rate_update; + +diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c +index 41adcd1546f1..4045ae748f17 100644 +--- a/drivers/md/bcache/request.c ++++ b/drivers/md/bcache/request.c +@@ -391,13 +391,20 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) + goto skip; + + /* +- * Flag for bypass if the IO is for read-ahead or background, +- * unless the read-ahead request is for metadata ++ * If the bio is for read-ahead or background IO, bypass it or ++ * not depends on the following situations, ++ * - If the IO is for meta data, always cache it and no bypass ++ * - If the IO is not meta data, check dc->cache_reada_policy, ++ * BCH_CACHE_READA_ALL: cache it and not bypass ++ * BCH_CACHE_READA_META_ONLY: not cache it and bypass ++ * That is, read-ahead request for metadata always get cached + * (eg, for gfs2 or xfs). + */ +- if (bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND) && +- !(bio->bi_opf & (REQ_META|REQ_PRIO))) +- goto skip; ++ if ((bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND))) { ++ if (!(bio->bi_opf & (REQ_META|REQ_PRIO)) && ++ (dc->cache_readahead_policy != BCH_CACHE_READA_ALL)) ++ goto skip; ++ } + + if (bio->bi_iter.bi_sector & (c->sb.block_size - 1) || + bio_sectors(bio) & (c->sb.block_size - 1)) { +diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c +index 627dcea0f5b6..7f0fb4b5755a 100644 +--- a/drivers/md/bcache/sysfs.c ++++ b/drivers/md/bcache/sysfs.c +@@ -27,6 +27,12 @@ static const char * const bch_cache_modes[] = { + NULL + }; + ++static const char * const bch_reada_cache_policies[] = { ++ "all", ++ "meta-only", ++ NULL ++}; ++ + /* Default is 0 ("auto") */ + static const char * const bch_stop_on_failure_modes[] = { + "auto", +@@ -100,6 +106,7 @@ rw_attribute(congested_write_threshold_us); + rw_attribute(sequential_cutoff); + rw_attribute(data_csum); + rw_attribute(cache_mode); ++rw_attribute(readahead_cache_policy); + rw_attribute(stop_when_cache_set_failed); + rw_attribute(writeback_metadata); + rw_attribute(writeback_running); +@@ -167,6 +174,11 @@ SHOW(__bch_cached_dev) + bch_cache_modes, + BDEV_CACHE_MODE(&dc->sb)); + ++ if (attr == &sysfs_readahead_cache_policy) ++ return bch_snprint_string_list(buf, PAGE_SIZE, ++ bch_reada_cache_policies, ++ dc->cache_readahead_policy); ++ + if (attr == &sysfs_stop_when_cache_set_failed) + return bch_snprint_string_list(buf, PAGE_SIZE, + bch_stop_on_failure_modes, +@@ -352,6 +364,15 @@ STORE(__cached_dev) + } + } + ++ if (attr == &sysfs_readahead_cache_policy) { ++ v = __sysfs_match_string(bch_reada_cache_policies, -1, buf); ++ if (v < 0) ++ return v; ++ ++ if ((unsigned int) v != dc->cache_readahead_policy) ++ dc->cache_readahead_policy = v; ++ } ++ + if (attr == &sysfs_stop_when_cache_set_failed) { + v = __sysfs_match_string(bch_stop_on_failure_modes, -1, buf); + if (v < 0) +@@ -466,6 +487,7 @@ static struct attribute *bch_cached_dev_files[] = { + &sysfs_data_csum, + #endif + &sysfs_cache_mode, ++ &sysfs_readahead_cache_policy, + &sysfs_stop_when_cache_set_failed, + &sysfs_writeback_metadata, + &sysfs_writeback_running, +diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c +index eb9782fc93fe..492bbe0584d9 100644 +--- a/drivers/md/dm-crypt.c ++++ b/drivers/md/dm-crypt.c +@@ -331,8 +331,14 @@ static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, + static int crypt_iv_benbi_ctr(struct crypt_config *cc, struct dm_target *ti, + const char *opts) + { +- unsigned bs = crypto_skcipher_blocksize(any_tfm(cc)); +- int log = ilog2(bs); ++ unsigned bs; ++ int log; ++ ++ if (test_bit(CRYPT_MODE_INTEGRITY_AEAD, &cc->cipher_flags)) ++ bs = crypto_aead_blocksize(any_tfm_aead(cc)); ++ else ++ bs = crypto_skcipher_blocksize(any_tfm(cc)); ++ log = ilog2(bs); + + /* we need to calculate how far we must shift the sector count + * to get the cipher block count, we use this shift in _gen */ +@@ -717,7 +723,7 @@ static int crypt_iv_eboiv_gen(struct crypt_config *cc, u8 *iv, + struct crypto_wait wait; + int err; + +- req = skcipher_request_alloc(any_tfm(cc), GFP_KERNEL | GFP_NOFS); ++ req = skcipher_request_alloc(any_tfm(cc), GFP_NOIO); + if (!req) + return -ENOMEM; + +diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c +index b88d6d701f5b..8bb723f1a569 100644 +--- a/drivers/md/dm-thin-metadata.c ++++ b/drivers/md/dm-thin-metadata.c +@@ -387,16 +387,15 @@ static int subtree_equal(void *context, const void *value1_le, const void *value + * Variant that is used for in-core only changes or code that + * shouldn't put the pool in service on its own (e.g. commit). + */ +-static inline void __pmd_write_lock(struct dm_pool_metadata *pmd) ++static inline void pmd_write_lock_in_core(struct dm_pool_metadata *pmd) + __acquires(pmd->root_lock) + { + down_write(&pmd->root_lock); + } +-#define pmd_write_lock_in_core(pmd) __pmd_write_lock((pmd)) + + static inline void pmd_write_lock(struct dm_pool_metadata *pmd) + { +- __pmd_write_lock(pmd); ++ pmd_write_lock_in_core(pmd); + if (unlikely(!pmd->in_service)) + pmd->in_service = true; + } +@@ -831,6 +830,7 @@ static int __commit_transaction(struct dm_pool_metadata *pmd) + * We need to know if the thin_disk_superblock exceeds a 512-byte sector. + */ + BUILD_BUG_ON(sizeof(struct thin_disk_superblock) > 512); ++ BUG_ON(!rwsem_is_locked(&pmd->root_lock)); + + if (unlikely(!pmd->in_service)) + return 0; +@@ -953,6 +953,7 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd) + return -EBUSY; + } + ++ pmd_write_lock_in_core(pmd); + if (!dm_bm_is_read_only(pmd->bm) && !pmd->fail_io) { + r = __commit_transaction(pmd); + if (r < 0) +@@ -961,6 +962,7 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd) + } + if (!pmd->fail_io) + __destroy_persistent_data_objects(pmd); ++ pmd_write_unlock(pmd); + + kfree(pmd); + return 0; +@@ -1841,7 +1843,7 @@ int dm_pool_commit_metadata(struct dm_pool_metadata *pmd) + * Care is taken to not have commit be what + * triggers putting the thin-pool in-service. + */ +- __pmd_write_lock(pmd); ++ pmd_write_lock_in_core(pmd); + if (pmd->fail_io) + goto out; + +diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c +index 43d1af1d8173..07c1b0334f57 100644 +--- a/drivers/md/dm-writecache.c ++++ b/drivers/md/dm-writecache.c +@@ -442,7 +442,13 @@ static void writecache_notify_io(unsigned long error, void *context) + complete(&endio->c); + } + +-static void ssd_commit_flushed(struct dm_writecache *wc) ++static void writecache_wait_for_ios(struct dm_writecache *wc, int direction) ++{ ++ wait_event(wc->bio_in_progress_wait[direction], ++ !atomic_read(&wc->bio_in_progress[direction])); ++} ++ ++static void ssd_commit_flushed(struct dm_writecache *wc, bool wait_for_ios) + { + struct dm_io_region region; + struct dm_io_request req; +@@ -488,17 +494,20 @@ static void ssd_commit_flushed(struct dm_writecache *wc) + writecache_notify_io(0, &endio); + wait_for_completion_io(&endio.c); + ++ if (wait_for_ios) ++ writecache_wait_for_ios(wc, WRITE); ++ + writecache_disk_flush(wc, wc->ssd_dev); + + memset(wc->dirty_bitmap, 0, wc->dirty_bitmap_size); + } + +-static void writecache_commit_flushed(struct dm_writecache *wc) ++static void writecache_commit_flushed(struct dm_writecache *wc, bool wait_for_ios) + { + if (WC_MODE_PMEM(wc)) + wmb(); + else +- ssd_commit_flushed(wc); ++ ssd_commit_flushed(wc, wait_for_ios); + } + + static void writecache_disk_flush(struct dm_writecache *wc, struct dm_dev *dev) +@@ -522,12 +531,6 @@ static void writecache_disk_flush(struct dm_writecache *wc, struct dm_dev *dev) + writecache_error(wc, r, "error flushing metadata: %d", r); + } + +-static void writecache_wait_for_ios(struct dm_writecache *wc, int direction) +-{ +- wait_event(wc->bio_in_progress_wait[direction], +- !atomic_read(&wc->bio_in_progress[direction])); +-} +- + #define WFE_RETURN_FOLLOWING 1 + #define WFE_LOWEST_SEQ 2 + +@@ -724,15 +727,12 @@ static void writecache_flush(struct dm_writecache *wc) + e = e2; + cond_resched(); + } +- writecache_commit_flushed(wc); +- +- if (!WC_MODE_PMEM(wc)) +- writecache_wait_for_ios(wc, WRITE); ++ writecache_commit_flushed(wc, true); + + wc->seq_count++; + pmem_assign(sb(wc)->seq_count, cpu_to_le64(wc->seq_count)); + writecache_flush_region(wc, &sb(wc)->seq_count, sizeof sb(wc)->seq_count); +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + + wc->overwrote_committed = false; + +@@ -756,7 +756,7 @@ static void writecache_flush(struct dm_writecache *wc) + } + + if (need_flush_after_free) +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + } + + static void writecache_flush_work(struct work_struct *work) +@@ -809,7 +809,7 @@ static void writecache_discard(struct dm_writecache *wc, sector_t start, sector_ + } + + if (discarded_something) +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + } + + static bool writecache_wait_for_writeback(struct dm_writecache *wc) +@@ -958,7 +958,7 @@ erase_this: + + if (need_flush) { + writecache_flush_all_metadata(wc); +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + } + + wc_unlock(wc); +@@ -1342,7 +1342,7 @@ static void __writecache_endio_pmem(struct dm_writecache *wc, struct list_head * + wc->writeback_size--; + n_walked++; + if (unlikely(n_walked >= ENDIO_LATENCY)) { +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + wc_unlock(wc); + wc_lock(wc); + n_walked = 0; +@@ -1423,7 +1423,7 @@ pop_from_list: + writecache_wait_for_ios(wc, READ); + } + +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + + wc_unlock(wc); + } +@@ -1766,10 +1766,10 @@ static int init_memory(struct dm_writecache *wc) + write_original_sector_seq_count(wc, &wc->entries[b], -1, -1); + + writecache_flush_all_metadata(wc); +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + pmem_assign(sb(wc)->magic, cpu_to_le32(MEMORY_SUPERBLOCK_MAGIC)); + writecache_flush_region(wc, &sb(wc)->magic, sizeof sb(wc)->magic); +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + + return 0; + } +diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c +index ac1179ca80d9..5205cf9bbfd9 100644 +--- a/drivers/md/dm-zoned-metadata.c ++++ b/drivers/md/dm-zoned-metadata.c +@@ -134,6 +134,7 @@ struct dmz_metadata { + + sector_t zone_bitmap_size; + unsigned int zone_nr_bitmap_blocks; ++ unsigned int zone_bits_per_mblk; + + unsigned int nr_bitmap_blocks; + unsigned int nr_map_blocks; +@@ -1167,7 +1168,10 @@ static int dmz_init_zones(struct dmz_metadata *zmd) + + /* Init */ + zmd->zone_bitmap_size = dev->zone_nr_blocks >> 3; +- zmd->zone_nr_bitmap_blocks = zmd->zone_bitmap_size >> DMZ_BLOCK_SHIFT; ++ zmd->zone_nr_bitmap_blocks = ++ max_t(sector_t, 1, zmd->zone_bitmap_size >> DMZ_BLOCK_SHIFT); ++ zmd->zone_bits_per_mblk = min_t(sector_t, dev->zone_nr_blocks, ++ DMZ_BLOCK_SIZE_BITS); + + /* Allocate zone array */ + zmd->zones = kcalloc(dev->nr_zones, sizeof(struct dm_zone), GFP_KERNEL); +@@ -1991,7 +1995,7 @@ int dmz_copy_valid_blocks(struct dmz_metadata *zmd, struct dm_zone *from_zone, + dmz_release_mblock(zmd, to_mblk); + dmz_release_mblock(zmd, from_mblk); + +- chunk_block += DMZ_BLOCK_SIZE_BITS; ++ chunk_block += zmd->zone_bits_per_mblk; + } + + to_zone->weight = from_zone->weight; +@@ -2052,7 +2056,7 @@ int dmz_validate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone, + + /* Set bits */ + bit = chunk_block & DMZ_BLOCK_MASK_BITS; +- nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); ++ nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); + + count = dmz_set_bits((unsigned long *)mblk->data, bit, nr_bits); + if (count) { +@@ -2131,7 +2135,7 @@ int dmz_invalidate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone, + + /* Clear bits */ + bit = chunk_block & DMZ_BLOCK_MASK_BITS; +- nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); ++ nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); + + count = dmz_clear_bits((unsigned long *)mblk->data, + bit, nr_bits); +@@ -2191,6 +2195,7 @@ static int dmz_to_next_set_block(struct dmz_metadata *zmd, struct dm_zone *zone, + { + struct dmz_mblock *mblk; + unsigned int bit, set_bit, nr_bits; ++ unsigned int zone_bits = zmd->zone_bits_per_mblk; + unsigned long *bitmap; + int n = 0; + +@@ -2205,15 +2210,15 @@ static int dmz_to_next_set_block(struct dmz_metadata *zmd, struct dm_zone *zone, + /* Get offset */ + bitmap = (unsigned long *) mblk->data; + bit = chunk_block & DMZ_BLOCK_MASK_BITS; +- nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); ++ nr_bits = min(nr_blocks, zone_bits - bit); + if (set) +- set_bit = find_next_bit(bitmap, DMZ_BLOCK_SIZE_BITS, bit); ++ set_bit = find_next_bit(bitmap, zone_bits, bit); + else +- set_bit = find_next_zero_bit(bitmap, DMZ_BLOCK_SIZE_BITS, bit); ++ set_bit = find_next_zero_bit(bitmap, zone_bits, bit); + dmz_release_mblock(zmd, mblk); + + n += set_bit - bit; +- if (set_bit < DMZ_BLOCK_SIZE_BITS) ++ if (set_bit < zone_bits) + break; + + nr_blocks -= nr_bits; +@@ -2316,7 +2321,7 @@ static void dmz_get_zone_weight(struct dmz_metadata *zmd, struct dm_zone *zone) + /* Count bits in this block */ + bitmap = mblk->data; + bit = chunk_block & DMZ_BLOCK_MASK_BITS; +- nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); ++ nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); + n += dmz_count_bits(bitmap, bit, nr_bits); + + dmz_release_mblock(zmd, mblk); +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index 1a5e328c443a..6d3cc235f842 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -1880,6 +1880,7 @@ static void dm_init_normal_md_queue(struct mapped_device *md) + /* + * Initialize aspects of queue that aren't relevant for blk-mq + */ ++ md->queue->backing_dev_info->congested_data = md; + md->queue->backing_dev_info->congested_fn = dm_any_congested; + } + +@@ -1970,7 +1971,12 @@ static struct mapped_device *alloc_dev(int minor) + if (!md->queue) + goto bad; + md->queue->queuedata = md; +- md->queue->backing_dev_info->congested_data = md; ++ /* ++ * default to bio-based required ->make_request_fn until DM ++ * table is loaded and md->type established. If request-based ++ * table is loaded: blk-mq will override accordingly. ++ */ ++ blk_queue_make_request(md->queue, dm_make_request); + + md->disk = alloc_disk_node(1, md->numa_node_id); + if (!md->disk) +@@ -2285,7 +2291,6 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t) + case DM_TYPE_DAX_BIO_BASED: + case DM_TYPE_NVME_BIO_BASED: + dm_init_normal_md_queue(md); +- blk_queue_make_request(md->queue, dm_make_request); + break; + case DM_TYPE_NONE: + WARN_ON_ONCE(true); +diff --git a/drivers/md/persistent-data/dm-space-map-common.c b/drivers/md/persistent-data/dm-space-map-common.c +index bd68f6fef694..d8b4125e338c 100644 +--- a/drivers/md/persistent-data/dm-space-map-common.c ++++ b/drivers/md/persistent-data/dm-space-map-common.c +@@ -380,6 +380,33 @@ int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin, + return -ENOSPC; + } + ++int sm_ll_find_common_free_block(struct ll_disk *old_ll, struct ll_disk *new_ll, ++ dm_block_t begin, dm_block_t end, dm_block_t *b) ++{ ++ int r; ++ uint32_t count; ++ ++ do { ++ r = sm_ll_find_free_block(new_ll, begin, new_ll->nr_blocks, b); ++ if (r) ++ break; ++ ++ /* double check this block wasn't used in the old transaction */ ++ if (*b >= old_ll->nr_blocks) ++ count = 0; ++ else { ++ r = sm_ll_lookup(old_ll, *b, &count); ++ if (r) ++ break; ++ ++ if (count) ++ begin = *b + 1; ++ } ++ } while (count); ++ ++ return r; ++} ++ + static int sm_ll_mutate(struct ll_disk *ll, dm_block_t b, + int (*mutator)(void *context, uint32_t old, uint32_t *new), + void *context, enum allocation_event *ev) +diff --git a/drivers/md/persistent-data/dm-space-map-common.h b/drivers/md/persistent-data/dm-space-map-common.h +index b3078d5eda0c..8de63ce39bdd 100644 +--- a/drivers/md/persistent-data/dm-space-map-common.h ++++ b/drivers/md/persistent-data/dm-space-map-common.h +@@ -109,6 +109,8 @@ int sm_ll_lookup_bitmap(struct ll_disk *ll, dm_block_t b, uint32_t *result); + int sm_ll_lookup(struct ll_disk *ll, dm_block_t b, uint32_t *result); + int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin, + dm_block_t end, dm_block_t *result); ++int sm_ll_find_common_free_block(struct ll_disk *old_ll, struct ll_disk *new_ll, ++ dm_block_t begin, dm_block_t end, dm_block_t *result); + int sm_ll_insert(struct ll_disk *ll, dm_block_t b, uint32_t ref_count, enum allocation_event *ev); + int sm_ll_inc(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev); + int sm_ll_dec(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev); +diff --git a/drivers/md/persistent-data/dm-space-map-disk.c b/drivers/md/persistent-data/dm-space-map-disk.c +index 32adf6b4a9c7..bf4c5e2ccb6f 100644 +--- a/drivers/md/persistent-data/dm-space-map-disk.c ++++ b/drivers/md/persistent-data/dm-space-map-disk.c +@@ -167,8 +167,10 @@ static int sm_disk_new_block(struct dm_space_map *sm, dm_block_t *b) + enum allocation_event ev; + struct sm_disk *smd = container_of(sm, struct sm_disk, sm); + +- /* FIXME: we should loop round a couple of times */ +- r = sm_ll_find_free_block(&smd->old_ll, smd->begin, smd->old_ll.nr_blocks, b); ++ /* ++ * Any block we allocate has to be free in both the old and current ll. ++ */ ++ r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, smd->begin, smd->ll.nr_blocks, b); + if (r) + return r; + +diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c +index 25328582cc48..9e3c64ec2026 100644 +--- a/drivers/md/persistent-data/dm-space-map-metadata.c ++++ b/drivers/md/persistent-data/dm-space-map-metadata.c +@@ -448,7 +448,10 @@ static int sm_metadata_new_block_(struct dm_space_map *sm, dm_block_t *b) + enum allocation_event ev; + struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); + +- r = sm_ll_find_free_block(&smm->old_ll, smm->begin, smm->old_ll.nr_blocks, b); ++ /* ++ * Any block we allocate has to be free in both the old and current ll. ++ */ ++ r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, smm->begin, smm->ll.nr_blocks, b); + if (r) + return r; + +diff --git a/drivers/media/rc/iguanair.c b/drivers/media/rc/iguanair.c +index 872d6441e512..a7deca1fefb7 100644 +--- a/drivers/media/rc/iguanair.c ++++ b/drivers/media/rc/iguanair.c +@@ -413,7 +413,7 @@ static int iguanair_probe(struct usb_interface *intf, + int ret, pipein, pipeout; + struct usb_host_interface *idesc; + +- idesc = intf->altsetting; ++ idesc = intf->cur_altsetting; + if (idesc->desc.bNumEndpoints < 2) + return -ENODEV; + +diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c +index 7741151606ef..6f80c251f641 100644 +--- a/drivers/media/rc/rc-main.c ++++ b/drivers/media/rc/rc-main.c +@@ -1891,23 +1891,28 @@ int rc_register_device(struct rc_dev *dev) + + dev->registered = true; + +- if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { +- rc = rc_setup_rx_device(dev); +- if (rc) +- goto out_dev; +- } +- +- /* Ensure that the lirc kfifo is setup before we start the thread */ ++ /* ++ * once the the input device is registered in rc_setup_rx_device, ++ * userspace can open the input device and rc_open() will be called ++ * as a result. This results in driver code being allowed to submit ++ * keycodes with rc_keydown, so lirc must be registered first. ++ */ + if (dev->allowed_protocols != RC_PROTO_BIT_CEC) { + rc = ir_lirc_register(dev); + if (rc < 0) +- goto out_rx; ++ goto out_dev; ++ } ++ ++ if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { ++ rc = rc_setup_rx_device(dev); ++ if (rc) ++ goto out_lirc; + } + + if (dev->driver_type == RC_DRIVER_IR_RAW) { + rc = ir_raw_event_register(dev); + if (rc < 0) +- goto out_lirc; ++ goto out_rx; + } + + dev_dbg(&dev->dev, "Registered rc%u (driver: %s)\n", dev->minor, +@@ -1915,11 +1920,11 @@ int rc_register_device(struct rc_dev *dev) + + return 0; + ++out_rx: ++ rc_free_rx_device(dev); + out_lirc: + if (dev->allowed_protocols != RC_PROTO_BIT_CEC) + ir_lirc_unregister(dev); +-out_rx: +- rc_free_rx_device(dev); + out_dev: + device_del(&dev->dev); + out_rx_free: +diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c +index 428235ca2635..2b688cc39bb8 100644 +--- a/drivers/media/usb/uvc/uvc_driver.c ++++ b/drivers/media/usb/uvc/uvc_driver.c +@@ -1493,6 +1493,11 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, + break; + if (forward == prev) + continue; ++ if (forward->chain.next || forward->chain.prev) { ++ uvc_trace(UVC_TRACE_DESCR, "Found reference to " ++ "entity %d already in chain.\n", forward->id); ++ return -EINVAL; ++ } + + switch (UVC_ENTITY_TYPE(forward)) { + case UVC_VC_EXTENSION_UNIT: +@@ -1574,6 +1579,13 @@ static int uvc_scan_chain_backward(struct uvc_video_chain *chain, + return -1; + } + ++ if (term->chain.next || term->chain.prev) { ++ uvc_trace(UVC_TRACE_DESCR, "Found reference to " ++ "entity %d already in chain.\n", ++ term->id); ++ return -EINVAL; ++ } ++ + if (uvc_trace_param & UVC_TRACE_PROBE) + printk(KERN_CONT " %d", term->id); + +diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +index e1eaf1135c7f..7ad6db8dd9f6 100644 +--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c ++++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +@@ -1183,36 +1183,38 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + u32 aux_space; + int compatible_arg = 1; + long err = 0; ++ unsigned int ncmd; + + /* + * 1. When struct size is different, converts the command. + */ + switch (cmd) { +- case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break; +- case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break; +- case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break; +- case VIDIOC_G_FBUF32: cmd = VIDIOC_G_FBUF; break; +- case VIDIOC_S_FBUF32: cmd = VIDIOC_S_FBUF; break; +- case VIDIOC_QBUF32: cmd = VIDIOC_QBUF; break; +- case VIDIOC_DQBUF32: cmd = VIDIOC_DQBUF; break; +- case VIDIOC_ENUMSTD32: cmd = VIDIOC_ENUMSTD; break; +- case VIDIOC_ENUMINPUT32: cmd = VIDIOC_ENUMINPUT; break; +- case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; +- case VIDIOC_G_EXT_CTRLS32: cmd = VIDIOC_G_EXT_CTRLS; break; +- case VIDIOC_S_EXT_CTRLS32: cmd = VIDIOC_S_EXT_CTRLS; break; +- case VIDIOC_TRY_EXT_CTRLS32: cmd = VIDIOC_TRY_EXT_CTRLS; break; +- case VIDIOC_DQEVENT32: cmd = VIDIOC_DQEVENT; break; +- case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break; +- case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break; +- case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break; +- case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; +- case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; +- case VIDIOC_G_OUTPUT32: cmd = VIDIOC_G_OUTPUT; break; +- case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break; +- case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break; +- case VIDIOC_PREPARE_BUF32: cmd = VIDIOC_PREPARE_BUF; break; +- case VIDIOC_G_EDID32: cmd = VIDIOC_G_EDID; break; +- case VIDIOC_S_EDID32: cmd = VIDIOC_S_EDID; break; ++ case VIDIOC_G_FMT32: ncmd = VIDIOC_G_FMT; break; ++ case VIDIOC_S_FMT32: ncmd = VIDIOC_S_FMT; break; ++ case VIDIOC_QUERYBUF32: ncmd = VIDIOC_QUERYBUF; break; ++ case VIDIOC_G_FBUF32: ncmd = VIDIOC_G_FBUF; break; ++ case VIDIOC_S_FBUF32: ncmd = VIDIOC_S_FBUF; break; ++ case VIDIOC_QBUF32: ncmd = VIDIOC_QBUF; break; ++ case VIDIOC_DQBUF32: ncmd = VIDIOC_DQBUF; break; ++ case VIDIOC_ENUMSTD32: ncmd = VIDIOC_ENUMSTD; break; ++ case VIDIOC_ENUMINPUT32: ncmd = VIDIOC_ENUMINPUT; break; ++ case VIDIOC_TRY_FMT32: ncmd = VIDIOC_TRY_FMT; break; ++ case VIDIOC_G_EXT_CTRLS32: ncmd = VIDIOC_G_EXT_CTRLS; break; ++ case VIDIOC_S_EXT_CTRLS32: ncmd = VIDIOC_S_EXT_CTRLS; break; ++ case VIDIOC_TRY_EXT_CTRLS32: ncmd = VIDIOC_TRY_EXT_CTRLS; break; ++ case VIDIOC_DQEVENT32: ncmd = VIDIOC_DQEVENT; break; ++ case VIDIOC_OVERLAY32: ncmd = VIDIOC_OVERLAY; break; ++ case VIDIOC_STREAMON32: ncmd = VIDIOC_STREAMON; break; ++ case VIDIOC_STREAMOFF32: ncmd = VIDIOC_STREAMOFF; break; ++ case VIDIOC_G_INPUT32: ncmd = VIDIOC_G_INPUT; break; ++ case VIDIOC_S_INPUT32: ncmd = VIDIOC_S_INPUT; break; ++ case VIDIOC_G_OUTPUT32: ncmd = VIDIOC_G_OUTPUT; break; ++ case VIDIOC_S_OUTPUT32: ncmd = VIDIOC_S_OUTPUT; break; ++ case VIDIOC_CREATE_BUFS32: ncmd = VIDIOC_CREATE_BUFS; break; ++ case VIDIOC_PREPARE_BUF32: ncmd = VIDIOC_PREPARE_BUF; break; ++ case VIDIOC_G_EDID32: ncmd = VIDIOC_G_EDID; break; ++ case VIDIOC_S_EDID32: ncmd = VIDIOC_S_EDID; break; ++ default: ncmd = cmd; break; + } + + /* +@@ -1221,11 +1223,11 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + * argument into it. + */ + switch (cmd) { +- case VIDIOC_OVERLAY: +- case VIDIOC_STREAMON: +- case VIDIOC_STREAMOFF: +- case VIDIOC_S_INPUT: +- case VIDIOC_S_OUTPUT: ++ case VIDIOC_OVERLAY32: ++ case VIDIOC_STREAMON32: ++ case VIDIOC_STREAMOFF32: ++ case VIDIOC_S_INPUT32: ++ case VIDIOC_S_OUTPUT32: + err = alloc_userspace(sizeof(unsigned int), 0, &new_p64); + if (!err && assign_in_user((unsigned int __user *)new_p64, + (compat_uint_t __user *)p32)) +@@ -1233,23 +1235,23 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_G_INPUT: +- case VIDIOC_G_OUTPUT: ++ case VIDIOC_G_INPUT32: ++ case VIDIOC_G_OUTPUT32: + err = alloc_userspace(sizeof(unsigned int), 0, &new_p64); + compatible_arg = 0; + break; + +- case VIDIOC_G_EDID: +- case VIDIOC_S_EDID: ++ case VIDIOC_G_EDID32: ++ case VIDIOC_S_EDID32: + err = alloc_userspace(sizeof(struct v4l2_edid), 0, &new_p64); + if (!err) + err = get_v4l2_edid32(new_p64, p32); + compatible_arg = 0; + break; + +- case VIDIOC_G_FMT: +- case VIDIOC_S_FMT: +- case VIDIOC_TRY_FMT: ++ case VIDIOC_G_FMT32: ++ case VIDIOC_S_FMT32: ++ case VIDIOC_TRY_FMT32: + err = bufsize_v4l2_format(p32, &aux_space); + if (!err) + err = alloc_userspace(sizeof(struct v4l2_format), +@@ -1262,7 +1264,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_CREATE_BUFS: ++ case VIDIOC_CREATE_BUFS32: + err = bufsize_v4l2_create(p32, &aux_space); + if (!err) + err = alloc_userspace(sizeof(struct v4l2_create_buffers), +@@ -1275,10 +1277,10 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_PREPARE_BUF: +- case VIDIOC_QUERYBUF: +- case VIDIOC_QBUF: +- case VIDIOC_DQBUF: ++ case VIDIOC_PREPARE_BUF32: ++ case VIDIOC_QUERYBUF32: ++ case VIDIOC_QBUF32: ++ case VIDIOC_DQBUF32: + err = bufsize_v4l2_buffer(p32, &aux_space); + if (!err) + err = alloc_userspace(sizeof(struct v4l2_buffer), +@@ -1291,7 +1293,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_S_FBUF: ++ case VIDIOC_S_FBUF32: + err = alloc_userspace(sizeof(struct v4l2_framebuffer), 0, + &new_p64); + if (!err) +@@ -1299,13 +1301,13 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_G_FBUF: ++ case VIDIOC_G_FBUF32: + err = alloc_userspace(sizeof(struct v4l2_framebuffer), 0, + &new_p64); + compatible_arg = 0; + break; + +- case VIDIOC_ENUMSTD: ++ case VIDIOC_ENUMSTD32: + err = alloc_userspace(sizeof(struct v4l2_standard), 0, + &new_p64); + if (!err) +@@ -1313,16 +1315,16 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_ENUMINPUT: ++ case VIDIOC_ENUMINPUT32: + err = alloc_userspace(sizeof(struct v4l2_input), 0, &new_p64); + if (!err) + err = get_v4l2_input32(new_p64, p32); + compatible_arg = 0; + break; + +- case VIDIOC_G_EXT_CTRLS: +- case VIDIOC_S_EXT_CTRLS: +- case VIDIOC_TRY_EXT_CTRLS: ++ case VIDIOC_G_EXT_CTRLS32: ++ case VIDIOC_S_EXT_CTRLS32: ++ case VIDIOC_TRY_EXT_CTRLS32: + err = bufsize_v4l2_ext_controls(p32, &aux_space); + if (!err) + err = alloc_userspace(sizeof(struct v4l2_ext_controls), +@@ -1334,7 +1336,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + } + compatible_arg = 0; + break; +- case VIDIOC_DQEVENT: ++ case VIDIOC_DQEVENT32: + err = alloc_userspace(sizeof(struct v4l2_event), 0, &new_p64); + compatible_arg = 0; + break; +@@ -1352,9 +1354,9 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + * Otherwise, it will pass the newly allocated @new_p64 argument. + */ + if (compatible_arg) +- err = native_ioctl(file, cmd, (unsigned long)p32); ++ err = native_ioctl(file, ncmd, (unsigned long)p32); + else +- err = native_ioctl(file, cmd, (unsigned long)new_p64); ++ err = native_ioctl(file, ncmd, (unsigned long)new_p64); + + if (err == -ENOTTY) + return err; +@@ -1370,13 +1372,13 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + * the blocks to maximum allowed value. + */ + switch (cmd) { +- case VIDIOC_G_EXT_CTRLS: +- case VIDIOC_S_EXT_CTRLS: +- case VIDIOC_TRY_EXT_CTRLS: ++ case VIDIOC_G_EXT_CTRLS32: ++ case VIDIOC_S_EXT_CTRLS32: ++ case VIDIOC_TRY_EXT_CTRLS32: + if (put_v4l2_ext_controls32(file, new_p64, p32)) + err = -EFAULT; + break; +- case VIDIOC_S_EDID: ++ case VIDIOC_S_EDID32: + if (put_v4l2_edid32(new_p64, p32)) + err = -EFAULT; + break; +@@ -1389,49 +1391,49 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + * the original 32 bits structure. + */ + switch (cmd) { +- case VIDIOC_S_INPUT: +- case VIDIOC_S_OUTPUT: +- case VIDIOC_G_INPUT: +- case VIDIOC_G_OUTPUT: ++ case VIDIOC_S_INPUT32: ++ case VIDIOC_S_OUTPUT32: ++ case VIDIOC_G_INPUT32: ++ case VIDIOC_G_OUTPUT32: + if (assign_in_user((compat_uint_t __user *)p32, + ((unsigned int __user *)new_p64))) + err = -EFAULT; + break; + +- case VIDIOC_G_FBUF: ++ case VIDIOC_G_FBUF32: + err = put_v4l2_framebuffer32(new_p64, p32); + break; + +- case VIDIOC_DQEVENT: ++ case VIDIOC_DQEVENT32: + err = put_v4l2_event32(new_p64, p32); + break; + +- case VIDIOC_G_EDID: ++ case VIDIOC_G_EDID32: + err = put_v4l2_edid32(new_p64, p32); + break; + +- case VIDIOC_G_FMT: +- case VIDIOC_S_FMT: +- case VIDIOC_TRY_FMT: ++ case VIDIOC_G_FMT32: ++ case VIDIOC_S_FMT32: ++ case VIDIOC_TRY_FMT32: + err = put_v4l2_format32(new_p64, p32); + break; + +- case VIDIOC_CREATE_BUFS: ++ case VIDIOC_CREATE_BUFS32: + err = put_v4l2_create32(new_p64, p32); + break; + +- case VIDIOC_PREPARE_BUF: +- case VIDIOC_QUERYBUF: +- case VIDIOC_QBUF: +- case VIDIOC_DQBUF: ++ case VIDIOC_PREPARE_BUF32: ++ case VIDIOC_QUERYBUF32: ++ case VIDIOC_QBUF32: ++ case VIDIOC_DQBUF32: + err = put_v4l2_buffer32(new_p64, p32); + break; + +- case VIDIOC_ENUMSTD: ++ case VIDIOC_ENUMSTD32: + err = put_v4l2_standard32(new_p64, p32); + break; + +- case VIDIOC_ENUMINPUT: ++ case VIDIOC_ENUMINPUT32: + err = put_v4l2_input32(new_p64, p32); + break; + } +diff --git a/drivers/media/v4l2-core/videobuf-dma-sg.c b/drivers/media/v4l2-core/videobuf-dma-sg.c +index 66a6c6c236a7..28262190c3ab 100644 +--- a/drivers/media/v4l2-core/videobuf-dma-sg.c ++++ b/drivers/media/v4l2-core/videobuf-dma-sg.c +@@ -349,8 +349,11 @@ int videobuf_dma_free(struct videobuf_dmabuf *dma) + BUG_ON(dma->sglen); + + if (dma->pages) { +- for (i = 0; i < dma->nr_pages; i++) ++ for (i = 0; i < dma->nr_pages; i++) { ++ if (dma->direction == DMA_FROM_DEVICE) ++ set_page_dirty_lock(dma->pages[i]); + put_page(dma->pages[i]); ++ } + kfree(dma->pages); + dma->pages = NULL; + } +diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c +index a4aaadaa0cb0..aa59496e4376 100644 +--- a/drivers/mfd/axp20x.c ++++ b/drivers/mfd/axp20x.c +@@ -126,7 +126,7 @@ static const struct regmap_range axp288_writeable_ranges[] = { + static const struct regmap_range axp288_volatile_ranges[] = { + regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP288_POWER_REASON), + regmap_reg_range(AXP288_BC_GLOBAL, AXP288_BC_GLOBAL), +- regmap_reg_range(AXP288_BC_DET_STAT, AXP288_BC_DET_STAT), ++ regmap_reg_range(AXP288_BC_DET_STAT, AXP20X_VBUS_IPSOUT_MGMT), + regmap_reg_range(AXP20X_CHRG_BAK_CTRL, AXP20X_CHRG_BAK_CTRL), + regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IPSOUT_V_HIGH_L), + regmap_reg_range(AXP20X_TIMER_CTRL, AXP20X_TIMER_CTRL), +diff --git a/drivers/mfd/da9062-core.c b/drivers/mfd/da9062-core.c +index e69626867c26..9143de7b77b8 100644 +--- a/drivers/mfd/da9062-core.c ++++ b/drivers/mfd/da9062-core.c +@@ -248,7 +248,7 @@ static const struct mfd_cell da9062_devs[] = { + .name = "da9062-watchdog", + .num_resources = ARRAY_SIZE(da9062_wdt_resources), + .resources = da9062_wdt_resources, +- .of_compatible = "dlg,da9062-wdt", ++ .of_compatible = "dlg,da9062-watchdog", + }, + { + .name = "da9062-thermal", +diff --git a/drivers/mfd/dln2.c b/drivers/mfd/dln2.c +index 381593fbe50f..7841c11411d0 100644 +--- a/drivers/mfd/dln2.c ++++ b/drivers/mfd/dln2.c +@@ -722,6 +722,8 @@ static int dln2_probe(struct usb_interface *interface, + const struct usb_device_id *usb_id) + { + struct usb_host_interface *hostif = interface->cur_altsetting; ++ struct usb_endpoint_descriptor *epin; ++ struct usb_endpoint_descriptor *epout; + struct device *dev = &interface->dev; + struct dln2_dev *dln2; + int ret; +@@ -731,12 +733,19 @@ static int dln2_probe(struct usb_interface *interface, + hostif->desc.bNumEndpoints < 2) + return -ENODEV; + ++ epin = &hostif->endpoint[0].desc; ++ epout = &hostif->endpoint[1].desc; ++ if (!usb_endpoint_is_bulk_out(epout)) ++ return -ENODEV; ++ if (!usb_endpoint_is_bulk_in(epin)) ++ return -ENODEV; ++ + dln2 = kzalloc(sizeof(*dln2), GFP_KERNEL); + if (!dln2) + return -ENOMEM; + +- dln2->ep_out = hostif->endpoint[0].desc.bEndpointAddress; +- dln2->ep_in = hostif->endpoint[1].desc.bEndpointAddress; ++ dln2->ep_out = epout->bEndpointAddress; ++ dln2->ep_in = epin->bEndpointAddress; + dln2->usb_dev = usb_get_dev(interface_to_usbdev(interface)); + dln2->interface = interface; + usb_set_intfdata(interface, dln2); +diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c +index da5cd9c92a59..ead2e79036a9 100644 +--- a/drivers/mfd/rn5t618.c ++++ b/drivers/mfd/rn5t618.c +@@ -26,6 +26,7 @@ static bool rn5t618_volatile_reg(struct device *dev, unsigned int reg) + case RN5T618_WATCHDOGCNT: + case RN5T618_DCIRQ: + case RN5T618_ILIMDATAH ... RN5T618_AIN0DATAL: ++ case RN5T618_ADCCNT3: + case RN5T618_IR_ADC1 ... RN5T618_IR_ADC3: + case RN5T618_IR_GPR: + case RN5T618_IR_GPF: +diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c +index 66e354d51ee9..7083d8ddd495 100644 +--- a/drivers/mmc/host/mmc_spi.c ++++ b/drivers/mmc/host/mmc_spi.c +@@ -1134,17 +1134,22 @@ static void mmc_spi_initsequence(struct mmc_spi_host *host) + * SPI protocol. Another is that when chipselect is released while + * the card returns BUSY status, the clock must issue several cycles + * with chipselect high before the card will stop driving its output. ++ * ++ * SPI_CS_HIGH means "asserted" here. In some cases like when using ++ * GPIOs for chip select, SPI_CS_HIGH is set but this will be logically ++ * inverted by gpiolib, so if we want to ascertain to drive it high ++ * we should toggle the default with an XOR as we do here. + */ +- host->spi->mode |= SPI_CS_HIGH; ++ host->spi->mode ^= SPI_CS_HIGH; + if (spi_setup(host->spi) != 0) { + /* Just warn; most cards work without it. */ + dev_warn(&host->spi->dev, + "can't change chip-select polarity\n"); +- host->spi->mode &= ~SPI_CS_HIGH; ++ host->spi->mode ^= SPI_CS_HIGH; + } else { + mmc_spi_readbytes(host, 18); + +- host->spi->mode &= ~SPI_CS_HIGH; ++ host->spi->mode ^= SPI_CS_HIGH; + if (spi_setup(host->spi) != 0) { + /* Wot, we can't get the same setup we had before? */ + dev_err(&host->spi->dev, +diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c +index 0ae986c42bc8..9378d5dc86c8 100644 +--- a/drivers/mmc/host/sdhci-of-at91.c ++++ b/drivers/mmc/host/sdhci-of-at91.c +@@ -324,19 +324,22 @@ static int sdhci_at91_probe(struct platform_device *pdev) + priv->mainck = devm_clk_get(&pdev->dev, "baseclk"); + if (IS_ERR(priv->mainck)) { + dev_err(&pdev->dev, "failed to get baseclk\n"); +- return PTR_ERR(priv->mainck); ++ ret = PTR_ERR(priv->mainck); ++ goto sdhci_pltfm_free; + } + + priv->hclock = devm_clk_get(&pdev->dev, "hclock"); + if (IS_ERR(priv->hclock)) { + dev_err(&pdev->dev, "failed to get hclock\n"); +- return PTR_ERR(priv->hclock); ++ ret = PTR_ERR(priv->hclock); ++ goto sdhci_pltfm_free; + } + + priv->gck = devm_clk_get(&pdev->dev, "multclk"); + if (IS_ERR(priv->gck)) { + dev_err(&pdev->dev, "failed to get multclk\n"); +- return PTR_ERR(priv->gck); ++ ret = PTR_ERR(priv->gck); ++ goto sdhci_pltfm_free; + } + + ret = sdhci_at91_set_clks_presets(&pdev->dev); +diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c +index c9ea365c248c..5091e2c1c0e5 100644 +--- a/drivers/mmc/host/sdhci-pci-core.c ++++ b/drivers/mmc/host/sdhci-pci-core.c +@@ -1604,7 +1604,7 @@ static u32 sdhci_read_present_state(struct sdhci_host *host) + return sdhci_readl(host, SDHCI_PRESENT_STATE); + } + +-void amd_sdhci_reset(struct sdhci_host *host, u8 mask) ++static void amd_sdhci_reset(struct sdhci_host *host, u8 mask) + { + struct sdhci_pci_slot *slot = sdhci_priv(host); + struct pci_dev *pdev = slot->chip->pdev; +diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c +index 309c808351ac..f417fb680cd8 100644 +--- a/drivers/mtd/spi-nor/spi-nor.c ++++ b/drivers/mtd/spi-nor/spi-nor.c +@@ -2310,15 +2310,16 @@ static const struct flash_info spi_nor_ids[] = { + { "n25q256a", INFO(0x20ba19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { "n25q256ax1", INFO(0x20bb19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ) }, + { "n25q512ax3", INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) }, ++ { "mt25qu512a", INFO6(0x20bb20, 0x104400, 64 * 1024, 1024, ++ SECT_4K | USE_FSR | SPI_NOR_DUAL_READ | ++ SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, ++ { "n25q512a", INFO(0x20bb20, 0, 64 * 1024, 1024, SECT_4K | ++ SPI_NOR_QUAD_READ) }, + { "n25q00", INFO(0x20ba21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, + { "n25q00a", INFO(0x20bb21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, + { "mt25ql02g", INFO(0x20ba22, 0, 64 * 1024, 4096, + SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | + NO_CHIP_ERASE) }, +- { "mt25qu512a (n25q512a)", INFO(0x20bb20, 0, 64 * 1024, 1024, +- SECT_4K | USE_FSR | SPI_NOR_DUAL_READ | +- SPI_NOR_QUAD_READ | +- SPI_NOR_4B_OPCODES) }, + { "mt25qu02g", INFO(0x20bb22, 0, 64 * 1024, 4096, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, + + /* Micron */ +diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c +index 30621c67721a..604772fc4a96 100644 +--- a/drivers/mtd/ubi/fastmap.c ++++ b/drivers/mtd/ubi/fastmap.c +@@ -64,7 +64,7 @@ static int self_check_seen(struct ubi_device *ubi, unsigned long *seen) + return 0; + + for (pnum = 0; pnum < ubi->peb_count; pnum++) { +- if (test_bit(pnum, seen) && ubi->lookuptbl[pnum]) { ++ if (!test_bit(pnum, seen) && ubi->lookuptbl[pnum]) { + ubi_err(ubi, "self-check failed for PEB %d, fastmap didn't see it", pnum); + ret = -EINVAL; + } +@@ -1137,7 +1137,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + struct rb_node *tmp_rb; + int ret, i, j, free_peb_count, used_peb_count, vol_count; + int scrub_peb_count, erase_peb_count; +- unsigned long *seen_pebs = NULL; ++ unsigned long *seen_pebs; + + fm_raw = ubi->fm_buf; + memset(ubi->fm_buf, 0, ubi->fm_size); +@@ -1151,7 +1151,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + dvbuf = new_fm_vbuf(ubi, UBI_FM_DATA_VOLUME_ID); + if (!dvbuf) { + ret = -ENOMEM; +- goto out_kfree; ++ goto out_free_avbuf; + } + + avhdr = ubi_get_vid_hdr(avbuf); +@@ -1160,7 +1160,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + seen_pebs = init_seen(ubi); + if (IS_ERR(seen_pebs)) { + ret = PTR_ERR(seen_pebs); +- goto out_kfree; ++ goto out_free_dvbuf; + } + + spin_lock(&ubi->volumes_lock); +@@ -1328,7 +1328,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + ret = ubi_io_write_vid_hdr(ubi, new_fm->e[0]->pnum, avbuf); + if (ret) { + ubi_err(ubi, "unable to write vid_hdr to fastmap SB!"); +- goto out_kfree; ++ goto out_free_seen; + } + + for (i = 0; i < new_fm->used_blocks; i++) { +@@ -1350,7 +1350,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + if (ret) { + ubi_err(ubi, "unable to write vid_hdr to PEB %i!", + new_fm->e[i]->pnum); +- goto out_kfree; ++ goto out_free_seen; + } + } + +@@ -1360,7 +1360,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + if (ret) { + ubi_err(ubi, "unable to write fastmap to PEB %i!", + new_fm->e[i]->pnum); +- goto out_kfree; ++ goto out_free_seen; + } + } + +@@ -1370,10 +1370,13 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + ret = self_check_seen(ubi, seen_pebs); + dbg_bld("fastmap written!"); + +-out_kfree: +- ubi_free_vid_buf(avbuf); +- ubi_free_vid_buf(dvbuf); ++out_free_seen: + free_seen(seen_pebs); ++out_free_dvbuf: ++ ubi_free_vid_buf(dvbuf); ++out_free_avbuf: ++ ubi_free_vid_buf(avbuf); ++ + out: + return ret; + } +diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c +index 4f2e6910c623..1cc2cd894f87 100644 +--- a/drivers/net/bonding/bond_alb.c ++++ b/drivers/net/bonding/bond_alb.c +@@ -1383,26 +1383,31 @@ netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) + bool do_tx_balance = true; + u32 hash_index = 0; + const u8 *hash_start = NULL; +- struct ipv6hdr *ip6hdr; + + skb_reset_mac_header(skb); + eth_data = eth_hdr(skb); + + switch (ntohs(skb->protocol)) { + case ETH_P_IP: { +- const struct iphdr *iph = ip_hdr(skb); ++ const struct iphdr *iph; + + if (is_broadcast_ether_addr(eth_data->h_dest) || +- iph->daddr == ip_bcast || +- iph->protocol == IPPROTO_IGMP) { ++ !pskb_network_may_pull(skb, sizeof(*iph))) { ++ do_tx_balance = false; ++ break; ++ } ++ iph = ip_hdr(skb); ++ if (iph->daddr == ip_bcast || iph->protocol == IPPROTO_IGMP) { + do_tx_balance = false; + break; + } + hash_start = (char *)&(iph->daddr); + hash_size = sizeof(iph->daddr); +- } + break; +- case ETH_P_IPV6: ++ } ++ case ETH_P_IPV6: { ++ const struct ipv6hdr *ip6hdr; ++ + /* IPv6 doesn't really use broadcast mac address, but leave + * that here just in case. + */ +@@ -1419,7 +1424,11 @@ netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) + break; + } + +- /* Additianally, DAD probes should not be tx-balanced as that ++ if (!pskb_network_may_pull(skb, sizeof(*ip6hdr))) { ++ do_tx_balance = false; ++ break; ++ } ++ /* Additionally, DAD probes should not be tx-balanced as that + * will lead to false positives for duplicate addresses and + * prevent address configuration from working. + */ +@@ -1429,17 +1438,26 @@ netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) + break; + } + +- hash_start = (char *)&(ipv6_hdr(skb)->daddr); +- hash_size = sizeof(ipv6_hdr(skb)->daddr); ++ hash_start = (char *)&ip6hdr->daddr; ++ hash_size = sizeof(ip6hdr->daddr); + break; +- case ETH_P_IPX: +- if (ipx_hdr(skb)->ipx_checksum != IPX_NO_CHECKSUM) { ++ } ++ case ETH_P_IPX: { ++ const struct ipxhdr *ipxhdr; ++ ++ if (pskb_network_may_pull(skb, sizeof(*ipxhdr))) { ++ do_tx_balance = false; ++ break; ++ } ++ ipxhdr = (struct ipxhdr *)skb_network_header(skb); ++ ++ if (ipxhdr->ipx_checksum != IPX_NO_CHECKSUM) { + /* something is wrong with this packet */ + do_tx_balance = false; + break; + } + +- if (ipx_hdr(skb)->ipx_type != IPX_TYPE_NCP) { ++ if (ipxhdr->ipx_type != IPX_TYPE_NCP) { + /* The only protocol worth balancing in + * this family since it has an "ARP" like + * mechanism +@@ -1448,9 +1466,11 @@ netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) + break; + } + ++ eth_data = eth_hdr(skb); + hash_start = (char *)eth_data->h_dest; + hash_size = ETH_ALEN; + break; ++ } + case ETH_P_ARP: + do_tx_balance = false; + if (bond_info->rlb_enabled) +diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c +index a7132c1593c3..7ed667b304d1 100644 +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -680,7 +680,7 @@ int b53_configure_vlan(struct dsa_switch *ds) + b53_do_vlan_op(dev, VTA_CMD_CLEAR); + } + +- b53_enable_vlan(dev, false, ds->vlan_filtering); ++ b53_enable_vlan(dev, dev->vlan_enabled, ds->vlan_filtering); + + b53_for_each_port(dev, i) + b53_write16(dev, B53_VLAN_PAGE, +diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c +index 47b21096b577..fecd5e674e04 100644 +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -68,7 +68,9 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) + + /* Force link status for IMP port */ + reg = core_readl(priv, offset); +- reg |= (MII_SW_OR | LINK_STS | GMII_SPEED_UP_2G); ++ reg |= (MII_SW_OR | LINK_STS); ++ if (priv->type == BCM7278_DEVICE_ID) ++ reg |= GMII_SPEED_UP_2G; + core_writel(priv, reg, offset); + + /* Enable Broadcast, Multicast, Unicast forwarding to IMP port */ +diff --git a/drivers/net/dsa/microchip/ksz9477_spi.c b/drivers/net/dsa/microchip/ksz9477_spi.c +index c5f64959a184..1142768969c2 100644 +--- a/drivers/net/dsa/microchip/ksz9477_spi.c ++++ b/drivers/net/dsa/microchip/ksz9477_spi.c +@@ -101,6 +101,12 @@ static struct spi_driver ksz9477_spi_driver = { + + module_spi_driver(ksz9477_spi_driver); + ++MODULE_ALIAS("spi:ksz9477"); ++MODULE_ALIAS("spi:ksz9897"); ++MODULE_ALIAS("spi:ksz9893"); ++MODULE_ALIAS("spi:ksz9563"); ++MODULE_ALIAS("spi:ksz8563"); ++MODULE_ALIAS("spi:ksz9567"); + MODULE_AUTHOR("Woojung Huh "); + MODULE_DESCRIPTION("Microchip KSZ9477 Series Switch SPI access Driver"); + MODULE_LICENSE("GPL"); +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c +index b4c664957266..4a27577e137b 100644 +--- a/drivers/net/ethernet/broadcom/bcmsysport.c ++++ b/drivers/net/ethernet/broadcom/bcmsysport.c +@@ -2728,6 +2728,9 @@ static int __maybe_unused bcm_sysport_resume(struct device *d) + + umac_reset(priv); + ++ /* Disable the UniMAC RX/TX */ ++ umac_enable_set(priv, CMD_RX_EN | CMD_TX_EN, 0); ++ + /* We may have been suspended and never received a WOL event that + * would turn off MPD detection, take care of that now + */ +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index cf292f7c3d3c..41297533b4a8 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -7873,7 +7873,7 @@ static void bnxt_setup_msix(struct bnxt *bp) + int tcs, i; + + tcs = netdev_get_num_tc(dev); +- if (tcs > 1) { ++ if (tcs) { + int i, off, count; + + for (i = 0; i < tcs; i++) { +@@ -9273,10 +9273,6 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init, + bnxt_debug_dev_exit(bp); + bnxt_disable_napi(bp); + del_timer_sync(&bp->timer); +- if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state) && +- pci_is_enabled(bp->pdev)) +- pci_disable_device(bp->pdev); +- + bnxt_free_skbs(bp); + + /* Save ring stats before shutdown */ +@@ -10052,8 +10048,15 @@ static void bnxt_fw_reset_close(struct bnxt *bp) + { + __bnxt_close_nic(bp, true, false); + bnxt_ulp_irq_stop(bp); ++ /* When firmware is fatal state, disable PCI device to prevent ++ * any potential bad DMAs before freeing kernel memory. ++ */ ++ if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state)) ++ pci_disable_device(bp->pdev); + bnxt_clear_int_mode(bp); + bnxt_hwrm_func_drv_unrgtr(bp); ++ if (pci_is_enabled(bp->pdev)) ++ pci_disable_device(bp->pdev); + bnxt_free_ctx_mem(bp); + kfree(bp->ctx); + bp->ctx = NULL; +@@ -11359,9 +11362,9 @@ static void bnxt_remove_one(struct pci_dev *pdev) + bnxt_sriov_disable(bp); + + bnxt_dl_fw_reporters_destroy(bp, true); +- bnxt_dl_unregister(bp); + pci_disable_pcie_error_reporting(pdev); + unregister_netdev(dev); ++ bnxt_dl_unregister(bp); + bnxt_shutdown_tc(bp); + bnxt_cancel_sp_work(bp); + bp->sp_event = 0; +@@ -11850,11 +11853,14 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + bnxt_init_tc(bp); + } + ++ bnxt_dl_register(bp); ++ + rc = register_netdev(dev); + if (rc) +- goto init_err_cleanup_tc; ++ goto init_err_cleanup; + +- bnxt_dl_register(bp); ++ if (BNXT_PF(bp)) ++ devlink_port_type_eth_set(&bp->dl_port, bp->dev); + bnxt_dl_fw_reporters_create(bp); + + netdev_info(dev, "%s found at mem %lx, node addr %pM\n", +@@ -11864,7 +11870,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + + return 0; + +-init_err_cleanup_tc: ++init_err_cleanup: ++ bnxt_dl_unregister(bp); + bnxt_shutdown_tc(bp); + bnxt_clear_int_mode(bp); + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +index 1e236e74ff2f..2d817ba0602c 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +@@ -482,7 +482,6 @@ int bnxt_dl_register(struct bnxt *bp) + netdev_err(bp->dev, "devlink_port_register failed"); + goto err_dl_param_unreg; + } +- devlink_port_type_eth_set(&bp->dl_port, bp->dev); + + rc = devlink_port_params_register(&bp->dl_port, bnxt_dl_port_params, + ARRAY_SIZE(bnxt_dl_port_params)); +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index f496b248bda3..95a94507cec1 100644 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -73,7 +73,11 @@ struct sifive_fu540_macb_mgmt { + /* Max length of transmit frame must be a multiple of 8 bytes */ + #define MACB_TX_LEN_ALIGN 8 + #define MACB_MAX_TX_LEN ((unsigned int)((1 << MACB_TX_FRMLEN_SIZE) - 1) & ~((unsigned int)(MACB_TX_LEN_ALIGN - 1))) +-#define GEM_MAX_TX_LEN ((unsigned int)((1 << GEM_TX_FRMLEN_SIZE) - 1) & ~((unsigned int)(MACB_TX_LEN_ALIGN - 1))) ++/* Limit maximum TX length as per Cadence TSO errata. This is to avoid a ++ * false amba_error in TX path from the DMA assuming there is not enough ++ * space in the SRAM (16KB) even when there is. ++ */ ++#define GEM_MAX_TX_LEN (unsigned int)(0x3FC0) + + #define GEM_MTU_MIN_SIZE ETH_MIN_MTU + #define MACB_NETIF_LSO NETIF_F_TSO +@@ -1664,16 +1668,14 @@ static netdev_features_t macb_features_check(struct sk_buff *skb, + + /* Validate LSO compatibility */ + +- /* there is only one buffer */ +- if (!skb_is_nonlinear(skb)) ++ /* there is only one buffer or protocol is not UDP */ ++ if (!skb_is_nonlinear(skb) || (ip_hdr(skb)->protocol != IPPROTO_UDP)) + return features; + + /* length of header */ + hdrlen = skb_transport_offset(skb); +- if (ip_hdr(skb)->protocol == IPPROTO_TCP) +- hdrlen += tcp_hdrlen(skb); + +- /* For LSO: ++ /* For UFO only: + * When software supplies two or more payload buffers all payload buffers + * apart from the last must be a multiple of 8 bytes in size. + */ +diff --git a/drivers/net/ethernet/dec/tulip/dmfe.c b/drivers/net/ethernet/dec/tulip/dmfe.c +index 0efdbd1a4a6f..32d470d4122a 100644 +--- a/drivers/net/ethernet/dec/tulip/dmfe.c ++++ b/drivers/net/ethernet/dec/tulip/dmfe.c +@@ -2214,15 +2214,16 @@ static int __init dmfe_init_module(void) + if (cr6set) + dmfe_cr6_user_set = cr6set; + +- switch(mode) { +- case DMFE_10MHF: ++ switch (mode) { ++ case DMFE_10MHF: + case DMFE_100MHF: + case DMFE_10MFD: + case DMFE_100MFD: + case DMFE_1M_HPNA: + dmfe_media_mode = mode; + break; +- default:dmfe_media_mode = DMFE_AUTO; ++ default: ++ dmfe_media_mode = DMFE_AUTO; + break; + } + +diff --git a/drivers/net/ethernet/dec/tulip/uli526x.c b/drivers/net/ethernet/dec/tulip/uli526x.c +index b1f30b194300..117ffe08800d 100644 +--- a/drivers/net/ethernet/dec/tulip/uli526x.c ++++ b/drivers/net/ethernet/dec/tulip/uli526x.c +@@ -1809,8 +1809,8 @@ static int __init uli526x_init_module(void) + if (cr6set) + uli526x_cr6_user_set = cr6set; + +- switch (mode) { +- case ULI526X_10MHF: ++ switch (mode) { ++ case ULI526X_10MHF: + case ULI526X_100MHF: + case ULI526X_10MFD: + case ULI526X_100MFD: +diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +index fcbe01f61aa4..e130233b5085 100644 +--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c ++++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +@@ -2483,6 +2483,9 @@ static void dpaa_adjust_link(struct net_device *net_dev) + mac_dev->adjust_link(mac_dev); + } + ++/* The Aquantia PHYs are capable of performing rate adaptation */ ++#define PHY_VEND_AQUANTIA 0x03a1b400 ++ + static int dpaa_phy_init(struct net_device *net_dev) + { + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +@@ -2501,9 +2504,14 @@ static int dpaa_phy_init(struct net_device *net_dev) + return -ENODEV; + } + +- /* Remove any features not supported by the controller */ +- ethtool_convert_legacy_u32_to_link_mode(mask, mac_dev->if_support); +- linkmode_and(phy_dev->supported, phy_dev->supported, mask); ++ /* Unless the PHY is capable of rate adaptation */ ++ if (mac_dev->phy_if != PHY_INTERFACE_MODE_XGMII || ++ ((phy_dev->drv->phy_id & GENMASK(31, 10)) != PHY_VEND_AQUANTIA)) { ++ /* remove any features not supported by the controller */ ++ ethtool_convert_legacy_u32_to_link_mode(mask, ++ mac_dev->if_support); ++ linkmode_and(phy_dev->supported, phy_dev->supported, mask); ++ } + + phy_support_asym_pause(phy_dev); + +diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c +index e49820675c8c..6b1a81df1465 100644 +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -388,6 +388,8 @@ struct mvneta_pcpu_stats { + struct u64_stats_sync syncp; + u64 rx_packets; + u64 rx_bytes; ++ u64 rx_dropped; ++ u64 rx_errors; + u64 tx_packets; + u64 tx_bytes; + }; +@@ -706,6 +708,8 @@ mvneta_get_stats64(struct net_device *dev, + struct mvneta_pcpu_stats *cpu_stats; + u64 rx_packets; + u64 rx_bytes; ++ u64 rx_dropped; ++ u64 rx_errors; + u64 tx_packets; + u64 tx_bytes; + +@@ -714,19 +718,20 @@ mvneta_get_stats64(struct net_device *dev, + start = u64_stats_fetch_begin_irq(&cpu_stats->syncp); + rx_packets = cpu_stats->rx_packets; + rx_bytes = cpu_stats->rx_bytes; ++ rx_dropped = cpu_stats->rx_dropped; ++ rx_errors = cpu_stats->rx_errors; + tx_packets = cpu_stats->tx_packets; + tx_bytes = cpu_stats->tx_bytes; + } while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start)); + + stats->rx_packets += rx_packets; + stats->rx_bytes += rx_bytes; ++ stats->rx_dropped += rx_dropped; ++ stats->rx_errors += rx_errors; + stats->tx_packets += tx_packets; + stats->tx_bytes += tx_bytes; + } + +- stats->rx_errors = dev->stats.rx_errors; +- stats->rx_dropped = dev->stats.rx_dropped; +- + stats->tx_dropped = dev->stats.tx_dropped; + } + +@@ -1703,8 +1708,14 @@ static u32 mvneta_txq_desc_csum(int l3_offs, int l3_proto, + static void mvneta_rx_error(struct mvneta_port *pp, + struct mvneta_rx_desc *rx_desc) + { ++ struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats); + u32 status = rx_desc->status; + ++ /* update per-cpu counter */ ++ u64_stats_update_begin(&stats->syncp); ++ stats->rx_errors++; ++ u64_stats_update_end(&stats->syncp); ++ + switch (status & MVNETA_RXD_ERR_CODE_MASK) { + case MVNETA_RXD_ERR_CRC: + netdev_err(pp->dev, "bad rx status %08x (crc error), size=%d\n", +@@ -1965,7 +1976,6 @@ static int mvneta_rx_swbm(struct napi_struct *napi, + /* Check errors only for FIRST descriptor */ + if (rx_status & MVNETA_RXD_ERR_SUMMARY) { + mvneta_rx_error(pp, rx_desc); +- dev->stats.rx_errors++; + /* leave the descriptor untouched */ + continue; + } +@@ -1976,11 +1986,17 @@ static int mvneta_rx_swbm(struct napi_struct *napi, + skb_size = max(rx_copybreak, rx_header_size); + rxq->skb = netdev_alloc_skb_ip_align(dev, skb_size); + if (unlikely(!rxq->skb)) { ++ struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats); ++ + netdev_err(dev, + "Can't allocate skb on queue %d\n", + rxq->id); +- dev->stats.rx_dropped++; ++ + rxq->skb_alloc_err++; ++ ++ u64_stats_update_begin(&stats->syncp); ++ stats->rx_dropped++; ++ u64_stats_update_end(&stats->syncp); + continue; + } + copy_size = min(skb_size, rx_bytes); +@@ -2137,7 +2153,6 @@ err_drop_frame_ret_pool: + mvneta_bm_pool_put_bp(pp->bm_priv, bm_pool, + rx_desc->buf_phys_addr); + err_drop_frame: +- dev->stats.rx_errors++; + mvneta_rx_error(pp, rx_desc); + /* leave the descriptor untouched */ + continue; +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.h b/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.h +index d787bc0a4155..e09bc3858d57 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.h +@@ -45,7 +45,7 @@ void mlx5_ktls_destroy_key(struct mlx5_core_dev *mdev, u32 key_id); + + static inline bool mlx5_accel_is_ktls_device(struct mlx5_core_dev *mdev) + { +- if (!MLX5_CAP_GEN(mdev, tls)) ++ if (!MLX5_CAP_GEN(mdev, tls_tx)) + return false; + + if (!MLX5_CAP_GEN(mdev, log_max_dek)) +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c +index 71384ad1a443..ef1ed15a53b4 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c +@@ -269,7 +269,7 @@ struct sk_buff *mlx5e_tls_handle_tx_skb(struct net_device *netdev, + int datalen; + u32 skb_seq; + +- if (MLX5_CAP_GEN(sq->channel->mdev, tls)) { ++ if (MLX5_CAP_GEN(sq->channel->mdev, tls_tx)) { + skb = mlx5e_ktls_handle_tx_skb(netdev, sq, skb, wqe, pi); + goto out; + } +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c +index c76da309506b..72232e570af7 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c +@@ -850,6 +850,7 @@ void mlx5_fpga_ipsec_delete_sa_ctx(void *context) + mutex_lock(&fpga_xfrm->lock); + if (!--fpga_xfrm->num_rules) { + mlx5_fpga_ipsec_release_sa_ctx(fpga_xfrm->sa_ctx); ++ kfree(fpga_xfrm->sa_ctx); + fpga_xfrm->sa_ctx = NULL; + } + mutex_unlock(&fpga_xfrm->lock); +@@ -1478,7 +1479,7 @@ int mlx5_fpga_esp_modify_xfrm(struct mlx5_accel_esp_xfrm *xfrm, + if (!memcmp(&xfrm->attrs, attrs, sizeof(xfrm->attrs))) + return 0; + +- if (!mlx5_fpga_esp_validate_xfrm_attrs(mdev, attrs)) { ++ if (mlx5_fpga_esp_validate_xfrm_attrs(mdev, attrs)) { + mlx5_core_warn(mdev, "Tried to create an esp with unsupported attrs\n"); + return -EOPNOTSUPP; + } +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +index 791e14ac26f4..86e6bbb57482 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +@@ -1555,16 +1555,16 @@ struct match_list_head { + struct match_list first; + }; + +-static void free_match_list(struct match_list_head *head) ++static void free_match_list(struct match_list_head *head, bool ft_locked) + { + if (!list_empty(&head->list)) { + struct match_list *iter, *match_tmp; + + list_del(&head->first.list); +- tree_put_node(&head->first.g->node, false); ++ tree_put_node(&head->first.g->node, ft_locked); + list_for_each_entry_safe(iter, match_tmp, &head->list, + list) { +- tree_put_node(&iter->g->node, false); ++ tree_put_node(&iter->g->node, ft_locked); + list_del(&iter->list); + kfree(iter); + } +@@ -1573,7 +1573,8 @@ static void free_match_list(struct match_list_head *head) + + static int build_match_list(struct match_list_head *match_head, + struct mlx5_flow_table *ft, +- const struct mlx5_flow_spec *spec) ++ const struct mlx5_flow_spec *spec, ++ bool ft_locked) + { + struct rhlist_head *tmp, *list; + struct mlx5_flow_group *g; +@@ -1598,7 +1599,7 @@ static int build_match_list(struct match_list_head *match_head, + + curr_match = kmalloc(sizeof(*curr_match), GFP_ATOMIC); + if (!curr_match) { +- free_match_list(match_head); ++ free_match_list(match_head, ft_locked); + err = -ENOMEM; + goto out; + } +@@ -1778,7 +1779,7 @@ search_again_locked: + version = atomic_read(&ft->node.version); + + /* Collect all fgs which has a matching match_criteria */ +- err = build_match_list(&match_head, ft, spec); ++ err = build_match_list(&match_head, ft, spec, take_write); + if (err) { + if (take_write) + up_write_ref_node(&ft->node, false); +@@ -1792,7 +1793,7 @@ search_again_locked: + + rule = try_add_to_existing_fg(ft, &match_head.list, spec, flow_act, dest, + dest_num, version); +- free_match_list(&match_head); ++ free_match_list(&match_head, take_write); + if (!IS_ERR(rule) || + (PTR_ERR(rule) != -ENOENT && PTR_ERR(rule) != -EAGAIN)) { + if (take_write) +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw.c b/drivers/net/ethernet/mellanox/mlx5/core/fw.c +index a19790dee7b2..13e86f0b42f5 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fw.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fw.c +@@ -239,7 +239,7 @@ int mlx5_query_hca_caps(struct mlx5_core_dev *dev) + return err; + } + +- if (MLX5_CAP_GEN(dev, tls)) { ++ if (MLX5_CAP_GEN(dev, tls_tx)) { + err = mlx5_core_get_caps(dev, MLX5_CAP_TLS); + if (err) + return err; +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_if.h b/drivers/net/ethernet/pensando/ionic/ionic_if.h +index 5bfdda19f64d..d8745f87f065 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_if.h ++++ b/drivers/net/ethernet/pensando/ionic/ionic_if.h +@@ -862,7 +862,7 @@ struct ionic_rxq_comp { + #define IONIC_RXQ_COMP_CSUM_F_VLAN 0x40 + #define IONIC_RXQ_COMP_CSUM_F_CALC 0x80 + u8 pkt_type_color; +-#define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x0f ++#define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x7f + }; + + enum ionic_pkt_type { +diff --git a/drivers/net/ethernet/qlogic/qed/qed_ptp.c b/drivers/net/ethernet/qlogic/qed/qed_ptp.c +index 0dacf2c18c09..3e613058e225 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_ptp.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_ptp.c +@@ -44,8 +44,8 @@ + /* Add/subtract the Adjustment_Value when making a Drift adjustment */ + #define QED_DRIFT_CNTR_DIRECTION_SHIFT 31 + #define QED_TIMESTAMP_MASK BIT(16) +-/* Param mask for Hardware to detect/timestamp the unicast PTP packets */ +-#define QED_PTP_UCAST_PARAM_MASK 0xF ++/* Param mask for Hardware to detect/timestamp the L2/L4 unicast PTP packets */ ++#define QED_PTP_UCAST_PARAM_MASK 0x70F + + static enum qed_resc_lock qed_ptcdev_to_resc(struct qed_hwfn *p_hwfn) + { +diff --git a/drivers/net/ethernet/smsc/smc911x.c b/drivers/net/ethernet/smsc/smc911x.c +index 8d88e4083456..7b65e79d6ae9 100644 +--- a/drivers/net/ethernet/smsc/smc911x.c ++++ b/drivers/net/ethernet/smsc/smc911x.c +@@ -936,7 +936,7 @@ static void smc911x_phy_configure(struct work_struct *work) + if (lp->ctl_rspeed != 100) + my_ad_caps &= ~(ADVERTISE_100BASE4|ADVERTISE_100FULL|ADVERTISE_100HALF); + +- if (!lp->ctl_rfduplx) ++ if (!lp->ctl_rfduplx) + my_ad_caps &= ~(ADVERTISE_100FULL|ADVERTISE_10FULL); + + /* Update our Auto-Neg Advertisement Register */ +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c +index 7ec895407d23..e0a5fe83d8e0 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c +@@ -413,6 +413,7 @@ static int ethqos_configure(struct qcom_ethqos *ethqos) + dll_lock = rgmii_readl(ethqos, SDC4_STATUS); + if (dll_lock & SDC4_STATUS_DLL_LOCK) + break; ++ retry--; + } while (retry > 0); + if (!retry) + dev_err(ðqos->pdev->dev, +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 06dd65c419c4..582176d869c3 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -4763,6 +4763,7 @@ int stmmac_suspend(struct device *dev) + { + struct net_device *ndev = dev_get_drvdata(dev); + struct stmmac_priv *priv = netdev_priv(ndev); ++ u32 chan; + + if (!ndev || !netif_running(ndev)) + return 0; +@@ -4776,6 +4777,9 @@ int stmmac_suspend(struct device *dev) + + stmmac_disable_all_queues(priv); + ++ for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) ++ del_timer_sync(&priv->tx_queue[chan].txtimer); ++ + /* Stop TX/RX DMA */ + stmmac_stop_all_dma(priv); + +diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c +index 9b3ba98726d7..3a53d222bfcc 100644 +--- a/drivers/net/gtp.c ++++ b/drivers/net/gtp.c +@@ -767,12 +767,12 @@ static int gtp_hashtable_new(struct gtp_dev *gtp, int hsize) + int i; + + gtp->addr_hash = kmalloc_array(hsize, sizeof(struct hlist_head), +- GFP_KERNEL); ++ GFP_KERNEL | __GFP_NOWARN); + if (gtp->addr_hash == NULL) + return -ENOMEM; + + gtp->tid_hash = kmalloc_array(hsize, sizeof(struct hlist_head), +- GFP_KERNEL); ++ GFP_KERNEL | __GFP_NOWARN); + if (gtp->tid_hash == NULL) + goto err1; + +diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c +index 44c2d857a7fa..91b302f0192f 100644 +--- a/drivers/net/netdevsim/dev.c ++++ b/drivers/net/netdevsim/dev.c +@@ -73,7 +73,7 @@ static const struct file_operations nsim_dev_take_snapshot_fops = { + + static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev) + { +- char dev_ddir_name[16]; ++ char dev_ddir_name[sizeof(DRV_NAME) + 10]; + + sprintf(dev_ddir_name, DRV_NAME "%u", nsim_dev->nsim_bus_dev->dev.id); + nsim_dev->ddir = debugfs_create_dir(dev_ddir_name, nsim_dev_ddir); +diff --git a/drivers/net/ppp/ppp_async.c b/drivers/net/ppp/ppp_async.c +index a7b9cf3269bf..29a0917a81e6 100644 +--- a/drivers/net/ppp/ppp_async.c ++++ b/drivers/net/ppp/ppp_async.c +@@ -874,15 +874,15 @@ ppp_async_input(struct asyncppp *ap, const unsigned char *buf, + skb = dev_alloc_skb(ap->mru + PPP_HDRLEN + 2); + if (!skb) + goto nomem; +- ap->rpkt = skb; +- } +- if (skb->len == 0) { +- /* Try to get the payload 4-byte aligned. +- * This should match the +- * PPP_ALLSTATIONS/PPP_UI/compressed tests in +- * process_input_packet, but we do not have +- * enough chars here to test buf[1] and buf[2]. +- */ ++ ap->rpkt = skb; ++ } ++ if (skb->len == 0) { ++ /* Try to get the payload 4-byte aligned. ++ * This should match the ++ * PPP_ALLSTATIONS/PPP_UI/compressed tests in ++ * process_input_packet, but we do not have ++ * enough chars here to test buf[1] and buf[2]. ++ */ + if (buf[0] != PPP_ALLSTATIONS) + skb_reserve(skb, 2 + (buf[0] & 1)); + } +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +index 7cdfde9b3dea..575ed19e9195 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +@@ -430,6 +430,7 @@ fail: + usb_free_urb(req->urb); + list_del(q->next); + } ++ kfree(reqs); + return NULL; + + } +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +index b3768d5d852a..8ad2d889179c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +@@ -3321,6 +3321,10 @@ static int iwl_mvm_send_sta_igtk(struct iwl_mvm *mvm, + igtk_cmd.sta_id = cpu_to_le32(sta_id); + + if (remove_key) { ++ /* This is a valid situation for IGTK */ ++ if (sta_id == IWL_MVM_INVALID_STA) ++ return 0; ++ + igtk_cmd.ctrl_flags |= cpu_to_le32(STA_KEY_NOT_VALID); + } else { + struct ieee80211_key_seq seq; +@@ -3575,9 +3579,9 @@ int iwl_mvm_remove_sta_key(struct iwl_mvm *mvm, + IWL_DEBUG_WEP(mvm, "mvm remove dynamic key: idx=%d sta=%d\n", + keyconf->keyidx, sta_id); + +- if (mvm_sta && (keyconf->cipher == WLAN_CIPHER_SUITE_AES_CMAC || +- keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || +- keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256)) ++ if (keyconf->cipher == WLAN_CIPHER_SUITE_AES_CMAC || ++ keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || ++ keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256) + return iwl_mvm_send_sta_igtk(mvm, keyconf, sta_id, true); + + if (!__test_and_clear_bit(keyconf->hw_key_idx, mvm->fw_key_table)) { +diff --git a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +index 6dd835f1efc2..fbfa0b15d0c8 100644 +--- a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c ++++ b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +@@ -232,6 +232,7 @@ static int mwifiex_process_country_ie(struct mwifiex_private *priv, + + if (country_ie_len > + (IEEE80211_COUNTRY_STRING_LEN + MWIFIEX_MAX_TRIPLET_802_11D)) { ++ rcu_read_unlock(); + mwifiex_dbg(priv->adapter, ERROR, + "11D: country_ie_len overflow!, deauth AP\n"); + return -EINVAL; +diff --git a/drivers/nfc/pn544/pn544.c b/drivers/nfc/pn544/pn544.c +index cda996f6954e..2b83156efe3f 100644 +--- a/drivers/nfc/pn544/pn544.c ++++ b/drivers/nfc/pn544/pn544.c +@@ -693,7 +693,7 @@ static int pn544_hci_check_presence(struct nfc_hci_dev *hdev, + target->nfcid1_len != 10) + return -EOPNOTSUPP; + +- return nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE, ++ return nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE, + PN544_RF_READER_CMD_ACTIVATE_NEXT, + target->nfcid1, target->nfcid1_len, NULL); + } else if (target->supported_protocols & (NFC_PROTO_JEWEL_MASK | +diff --git a/drivers/nvme/target/fabrics-cmd.c b/drivers/nvme/target/fabrics-cmd.c +index d16b55ffe79f..4e9004fe5c6f 100644 +--- a/drivers/nvme/target/fabrics-cmd.c ++++ b/drivers/nvme/target/fabrics-cmd.c +@@ -105,6 +105,7 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req) + u16 qid = le16_to_cpu(c->qid); + u16 sqsize = le16_to_cpu(c->sqsize); + struct nvmet_ctrl *old; ++ u16 ret; + + old = cmpxchg(&req->sq->ctrl, NULL, ctrl); + if (old) { +@@ -115,7 +116,8 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req) + if (!sqsize) { + pr_warn("queue size zero!\n"); + req->error_loc = offsetof(struct nvmf_connect_command, sqsize); +- return NVME_SC_CONNECT_INVALID_PARAM | NVME_SC_DNR; ++ ret = NVME_SC_CONNECT_INVALID_PARAM | NVME_SC_DNR; ++ goto err; + } + + /* note: convert queue size from 0's-based value to 1's-based value */ +@@ -128,16 +130,19 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req) + } + + if (ctrl->ops->install_queue) { +- u16 ret = ctrl->ops->install_queue(req->sq); +- ++ ret = ctrl->ops->install_queue(req->sq); + if (ret) { + pr_err("failed to install queue %d cntlid %d ret %x\n", +- qid, ret, ctrl->cntlid); +- return ret; ++ qid, ctrl->cntlid, ret); ++ goto err; + } + } + + return 0; ++ ++err: ++ req->sq->ctrl = NULL; ++ return ret; + } + + static void nvmet_execute_admin_connect(struct nvmet_req *req) +diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c +index 057d1ff87d5d..960542dea5ad 100644 +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -110,7 +110,7 @@ static void nvmem_cell_drop(struct nvmem_cell *cell) + list_del(&cell->node); + mutex_unlock(&nvmem_mutex); + of_node_put(cell->np); +- kfree(cell->name); ++ kfree_const(cell->name); + kfree(cell); + } + +@@ -137,7 +137,9 @@ static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem, + cell->nvmem = nvmem; + cell->offset = info->offset; + cell->bytes = info->bytes; +- cell->name = info->name; ++ cell->name = kstrdup_const(info->name, GFP_KERNEL); ++ if (!cell->name) ++ return -ENOMEM; + + cell->bit_offset = info->bit_offset; + cell->nbits = info->nbits; +@@ -327,7 +329,7 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) + dev_err(dev, "cell %s unaligned to nvmem stride %d\n", + cell->name, nvmem->stride); + /* Cells already added will be freed later. */ +- kfree(cell->name); ++ kfree_const(cell->name); + kfree(cell); + return -EINVAL; + } +diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig +index 37c2ccbefecd..d91618641be6 100644 +--- a/drivers/of/Kconfig ++++ b/drivers/of/Kconfig +@@ -103,4 +103,8 @@ config OF_OVERLAY + config OF_NUMA + bool + ++config OF_DMA_DEFAULT_COHERENT ++ # arches should select this if DMA is coherent by default for OF devices ++ bool ++ + endif # OF +diff --git a/drivers/of/address.c b/drivers/of/address.c +index 978427a9d5e6..8f74c4626e0e 100644 +--- a/drivers/of/address.c ++++ b/drivers/of/address.c +@@ -998,12 +998,16 @@ EXPORT_SYMBOL_GPL(of_dma_get_range); + * @np: device node + * + * It returns true if "dma-coherent" property was found +- * for this device in DT. ++ * for this device in the DT, or if DMA is coherent by ++ * default for OF devices on the current platform. + */ + bool of_dma_is_coherent(struct device_node *np) + { + struct device_node *node = of_node_get(np); + ++ if (IS_ENABLED(CONFIG_OF_DMA_DEFAULT_COHERENT)) ++ return true; ++ + while (node) { + if (of_property_read_bool(node, "dma-coherent")) { + of_node_put(node); +diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c +index af677254a072..c8c702c494a2 100644 +--- a/drivers/pci/controller/dwc/pci-keystone.c ++++ b/drivers/pci/controller/dwc/pci-keystone.c +@@ -422,7 +422,7 @@ static void ks_pcie_setup_rc_app_regs(struct keystone_pcie *ks_pcie) + lower_32_bits(start) | OB_ENABLEN); + ks_pcie_app_writel(ks_pcie, OB_OFFSET_HI(i), + upper_32_bits(start)); +- start += OB_WIN_SIZE; ++ start += OB_WIN_SIZE * SZ_1M; + } + + val = ks_pcie_app_readl(ks_pcie, CMD_STATUS); +@@ -510,7 +510,7 @@ static void ks_pcie_stop_link(struct dw_pcie *pci) + /* Disable Link training */ + val = ks_pcie_app_readl(ks_pcie, CMD_STATUS); + val &= ~LTSSM_EN_VAL; +- ks_pcie_app_writel(ks_pcie, CMD_STATUS, LTSSM_EN_VAL | val); ++ ks_pcie_app_writel(ks_pcie, CMD_STATUS, val); + } + + static int ks_pcie_start_link(struct dw_pcie *pci) +@@ -1354,7 +1354,7 @@ static int __init ks_pcie_probe(struct platform_device *pdev) + ret = of_property_read_u32(np, "num-viewport", &num_viewport); + if (ret < 0) { + dev_err(dev, "unable to read *num-viewport* property\n"); +- return ret; ++ goto err_get_sync; + } + + /* +diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c +index 673a1725ef38..090b632965e2 100644 +--- a/drivers/pci/controller/pci-tegra.c ++++ b/drivers/pci/controller/pci-tegra.c +@@ -2798,7 +2798,7 @@ static int tegra_pcie_probe(struct platform_device *pdev) + + pm_runtime_enable(pcie->dev); + err = pm_runtime_get_sync(pcie->dev); +- if (err) { ++ if (err < 0) { + dev_err(dev, "fail to enable pcie controller: %d\n", err); + goto teardown_msi; + } +diff --git a/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c b/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c +index 42bc5150dd92..febe0aef68d4 100644 +--- a/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c ++++ b/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c +@@ -80,7 +80,7 @@ static int read_poll_timeout(void __iomem *addr, u32 mask) + if (readl_relaxed(addr) & mask) + return 0; + +- usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50); ++ usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50); + } while (!time_after(jiffies, timeout)); + + return (readl_relaxed(addr) & mask) ? 0 : -ETIMEDOUT; +diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c +index cdab916fbf92..e330ec73c465 100644 +--- a/drivers/platform/x86/intel_scu_ipc.c ++++ b/drivers/platform/x86/intel_scu_ipc.c +@@ -67,26 +67,22 @@ + struct intel_scu_ipc_pdata_t { + u32 i2c_base; + u32 i2c_len; +- u8 irq_mode; + }; + + static const struct intel_scu_ipc_pdata_t intel_scu_ipc_lincroft_pdata = { + .i2c_base = 0xff12b000, + .i2c_len = 0x10, +- .irq_mode = 0, + }; + + /* Penwell and Cloverview */ + static const struct intel_scu_ipc_pdata_t intel_scu_ipc_penwell_pdata = { + .i2c_base = 0xff12b000, + .i2c_len = 0x10, +- .irq_mode = 1, + }; + + static const struct intel_scu_ipc_pdata_t intel_scu_ipc_tangier_pdata = { + .i2c_base = 0xff00d000, + .i2c_len = 0x10, +- .irq_mode = 0, + }; + + struct intel_scu_ipc_dev { +@@ -99,6 +95,9 @@ struct intel_scu_ipc_dev { + + static struct intel_scu_ipc_dev ipcdev; /* Only one for now */ + ++#define IPC_STATUS 0x04 ++#define IPC_STATUS_IRQ BIT(2) ++ + /* + * IPC Read Buffer (Read Only): + * 16 byte buffer for receiving data from SCU, if IPC command +@@ -120,11 +119,8 @@ static DEFINE_MUTEX(ipclock); /* lock used to prevent multiple call to SCU */ + */ + static inline void ipc_command(struct intel_scu_ipc_dev *scu, u32 cmd) + { +- if (scu->irq_mode) { +- reinit_completion(&scu->cmd_complete); +- writel(cmd | IPC_IOC, scu->ipc_base); +- } +- writel(cmd, scu->ipc_base); ++ reinit_completion(&scu->cmd_complete); ++ writel(cmd | IPC_IOC, scu->ipc_base); + } + + /* +@@ -610,9 +606,10 @@ EXPORT_SYMBOL(intel_scu_ipc_i2c_cntrl); + static irqreturn_t ioc(int irq, void *dev_id) + { + struct intel_scu_ipc_dev *scu = dev_id; ++ int status = ipc_read_status(scu); + +- if (scu->irq_mode) +- complete(&scu->cmd_complete); ++ writel(status | IPC_STATUS_IRQ, scu->ipc_base + IPC_STATUS); ++ complete(&scu->cmd_complete); + + return IRQ_HANDLED; + } +@@ -638,8 +635,6 @@ static int ipc_probe(struct pci_dev *pdev, const struct pci_device_id *id) + if (!pdata) + return -ENODEV; + +- scu->irq_mode = pdata->irq_mode; +- + err = pcim_enable_device(pdev); + if (err) + return err; +diff --git a/drivers/power/supply/axp20x_ac_power.c b/drivers/power/supply/axp20x_ac_power.c +index 0d34a932b6d5..f74b0556bb6b 100644 +--- a/drivers/power/supply/axp20x_ac_power.c ++++ b/drivers/power/supply/axp20x_ac_power.c +@@ -23,6 +23,8 @@ + #define AXP20X_PWR_STATUS_ACIN_PRESENT BIT(7) + #define AXP20X_PWR_STATUS_ACIN_AVAIL BIT(6) + ++#define AXP813_ACIN_PATH_SEL BIT(7) ++ + #define AXP813_VHOLD_MASK GENMASK(5, 3) + #define AXP813_VHOLD_UV_TO_BIT(x) ((((x) / 100000) - 40) << 3) + #define AXP813_VHOLD_REG_TO_UV(x) \ +@@ -40,6 +42,7 @@ struct axp20x_ac_power { + struct power_supply *supply; + struct iio_channel *acin_v; + struct iio_channel *acin_i; ++ bool has_acin_path_sel; + }; + + static irqreturn_t axp20x_ac_power_irq(int irq, void *devid) +@@ -86,6 +89,17 @@ static int axp20x_ac_power_get_property(struct power_supply *psy, + return ret; + + val->intval = !!(reg & AXP20X_PWR_STATUS_ACIN_AVAIL); ++ ++ /* ACIN_PATH_SEL disables ACIN even if ACIN_AVAIL is set. */ ++ if (val->intval && power->has_acin_path_sel) { ++ ret = regmap_read(power->regmap, AXP813_ACIN_PATH_CTRL, ++ ®); ++ if (ret) ++ return ret; ++ ++ val->intval = !!(reg & AXP813_ACIN_PATH_SEL); ++ } ++ + return 0; + + case POWER_SUPPLY_PROP_VOLTAGE_NOW: +@@ -224,21 +238,25 @@ static const struct power_supply_desc axp813_ac_power_desc = { + struct axp_data { + const struct power_supply_desc *power_desc; + bool acin_adc; ++ bool acin_path_sel; + }; + + static const struct axp_data axp20x_data = { +- .power_desc = &axp20x_ac_power_desc, +- .acin_adc = true, ++ .power_desc = &axp20x_ac_power_desc, ++ .acin_adc = true, ++ .acin_path_sel = false, + }; + + static const struct axp_data axp22x_data = { +- .power_desc = &axp22x_ac_power_desc, +- .acin_adc = false, ++ .power_desc = &axp22x_ac_power_desc, ++ .acin_adc = false, ++ .acin_path_sel = false, + }; + + static const struct axp_data axp813_data = { +- .power_desc = &axp813_ac_power_desc, +- .acin_adc = false, ++ .power_desc = &axp813_ac_power_desc, ++ .acin_adc = false, ++ .acin_path_sel = true, + }; + + static int axp20x_ac_power_probe(struct platform_device *pdev) +@@ -282,6 +300,7 @@ static int axp20x_ac_power_probe(struct platform_device *pdev) + } + + power->regmap = dev_get_regmap(pdev->dev.parent, NULL); ++ power->has_acin_path_sel = axp_data->acin_path_sel; + + platform_set_drvdata(pdev, power); + +diff --git a/drivers/power/supply/ltc2941-battery-gauge.c b/drivers/power/supply/ltc2941-battery-gauge.c +index da49436176cd..30a9014b2f95 100644 +--- a/drivers/power/supply/ltc2941-battery-gauge.c ++++ b/drivers/power/supply/ltc2941-battery-gauge.c +@@ -449,7 +449,7 @@ static int ltc294x_i2c_remove(struct i2c_client *client) + { + struct ltc294x_info *info = i2c_get_clientdata(client); + +- cancel_delayed_work(&info->work); ++ cancel_delayed_work_sync(&info->work); + power_supply_unregister(info->supply); + return 0; + } +diff --git a/drivers/regulator/helpers.c b/drivers/regulator/helpers.c +index ca3dc3f3bb29..bb16c465426e 100644 +--- a/drivers/regulator/helpers.c ++++ b/drivers/regulator/helpers.c +@@ -13,6 +13,8 @@ + #include + #include + ++#include "internal.h" ++ + /** + * regulator_is_enabled_regmap - standard is_enabled() for regmap users + * +@@ -881,3 +883,15 @@ void regulator_bulk_set_supply_names(struct regulator_bulk_data *consumers, + consumers[i].supply = supply_names[i]; + } + EXPORT_SYMBOL_GPL(regulator_bulk_set_supply_names); ++ ++/** ++ * regulator_is_equal - test whether two regulators are the same ++ * ++ * @reg1: first regulator to operate on ++ * @reg2: second regulator to operate on ++ */ ++bool regulator_is_equal(struct regulator *reg1, struct regulator *reg2) ++{ ++ return reg1->rdev == reg2->rdev; ++} ++EXPORT_SYMBOL_GPL(regulator_is_equal); +diff --git a/drivers/scsi/csiostor/csio_scsi.c b/drivers/scsi/csiostor/csio_scsi.c +index 469d0bc9f5fe..00cf33573136 100644 +--- a/drivers/scsi/csiostor/csio_scsi.c ++++ b/drivers/scsi/csiostor/csio_scsi.c +@@ -1383,7 +1383,7 @@ csio_device_reset(struct device *dev, + return -EINVAL; + + /* Delete NPIV lnodes */ +- csio_lnodes_exit(hw, 1); ++ csio_lnodes_exit(hw, 1); + + /* Block upper IOs */ + csio_lnodes_block_request(hw); +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index 42cf38c1ea99..0cbe6740e0c9 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -4392,7 +4392,8 @@ dcmd_timeout_ocr_possible(struct megasas_instance *instance) { + if (instance->adapter_type == MFI_SERIES) + return KILL_ADAPTER; + else if (instance->unload || +- test_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags)) ++ test_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, ++ &instance->reset_flags)) + return IGNORE_TIMEOUT; + else + return INITIATE_OCR; +diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c +index e301458bcbae..46bc062d873e 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c ++++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c +@@ -4847,6 +4847,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason) + if (instance->requestorId && !instance->skip_heartbeat_timer_del) + del_timer_sync(&instance->sriov_heartbeat_timer); + set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); ++ set_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); + atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING); + instance->instancet->disable_intr(instance); + megasas_sync_irqs((unsigned long)instance); +@@ -5046,7 +5047,7 @@ kill_hba: + instance->skip_heartbeat_timer_del = 1; + retval = FAILED; + out: +- clear_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); ++ clear_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); + mutex_unlock(&instance->reset_mutex); + return retval; + } +diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.h b/drivers/scsi/megaraid/megaraid_sas_fusion.h +index c013c80fe4e6..dd2e37e40d6b 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_fusion.h ++++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h +@@ -89,6 +89,7 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE { + + #define MEGASAS_FP_CMD_LEN 16 + #define MEGASAS_FUSION_IN_RESET 0 ++#define MEGASAS_FUSION_OCR_NOT_POSSIBLE 1 + #define RAID_1_PEER_CMDS 2 + #define JBOD_MAPS_COUNT 2 + #define MEGASAS_REDUCE_QD_COUNT 64 +diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c +index 30afc59c1870..7bbff91f8883 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.c ++++ b/drivers/scsi/qla2xxx/qla_dbg.c +@@ -2519,12 +2519,6 @@ qla83xx_fw_dump_failed: + /* Driver Debug Functions. */ + /****************************************************************************/ + +-static inline int +-ql_mask_match(uint level) +-{ +- return (level & ql2xextended_error_logging) == level; +-} +- + /* + * This function is for formatting and logging debug information. + * It is to be used when vha is available. It formats the message +diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h +index bb01b680ce9f..433e95502808 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.h ++++ b/drivers/scsi/qla2xxx/qla_dbg.h +@@ -374,3 +374,9 @@ extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *, + extern void qla24xx_pause_risc(struct device_reg_24xx __iomem *, + struct qla_hw_data *); + extern int qla24xx_soft_reset(struct qla_hw_data *); ++ ++static inline int ++ql_mask_match(uint level) ++{ ++ return (level & ql2xextended_error_logging) == level; ++} +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 1eb3fe281cc3..c57b95a20688 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -2402,6 +2402,7 @@ typedef struct fc_port { + unsigned int scan_needed:1; + unsigned int n2n_flag:1; + unsigned int explicit_logout:1; ++ unsigned int prli_pend_timer:1; + + struct completion nvme_del_done; + uint32_t nvme_prli_service_param; +@@ -2428,6 +2429,7 @@ typedef struct fc_port { + struct work_struct free_work; + struct work_struct reg_work; + uint64_t jiffies_at_registration; ++ unsigned long prli_expired; + struct qlt_plogi_ack_t *plogi_link[QLT_PLOGI_LINK_MAX]; + + uint16_t tgt_id; +@@ -4821,6 +4823,9 @@ struct sff_8247_a0 { + ha->current_topology == ISP_CFG_N || \ + !ha->current_topology) + ++#define PRLI_PHASE(_cls) \ ++ ((_cls == DSC_LS_PRLI_PEND) || (_cls == DSC_LS_PRLI_COMP)) ++ + #include "qla_target.h" + #include "qla_gbl.h" + #include "qla_dbg.h" +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 9ffaa920fc8f..ac4c47fc5f4c 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -686,7 +686,7 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + port_id_t id; + u64 wwn; + u16 data[2]; +- u8 current_login_state; ++ u8 current_login_state, nvme_cls; + + fcport = ea->fcport; + ql_dbg(ql_dbg_disc, vha, 0xffff, +@@ -745,10 +745,17 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + + loop_id = le16_to_cpu(e->nport_handle); + loop_id = (loop_id & 0x7fff); +- if (fcport->fc4f_nvme) +- current_login_state = e->current_login_state >> 4; +- else +- current_login_state = e->current_login_state & 0xf; ++ nvme_cls = e->current_login_state >> 4; ++ current_login_state = e->current_login_state & 0xf; ++ ++ if (PRLI_PHASE(nvme_cls)) { ++ current_login_state = nvme_cls; ++ fcport->fc4_type &= ~FS_FC4TYPE_FCP; ++ fcport->fc4_type |= FS_FC4TYPE_NVME; ++ } else if (PRLI_PHASE(current_login_state)) { ++ fcport->fc4_type |= FS_FC4TYPE_FCP; ++ fcport->fc4_type &= ~FS_FC4TYPE_NVME; ++ } + + + ql_dbg(ql_dbg_disc, vha, 0x20e2, +@@ -1219,12 +1226,19 @@ qla24xx_async_prli(struct scsi_qla_host *vha, fc_port_t *fcport) + struct srb_iocb *lio; + int rval = QLA_FUNCTION_FAILED; + +- if (!vha->flags.online) ++ if (!vha->flags.online) { ++ ql_dbg(ql_dbg_disc, vha, 0xffff, "%s %d %8phC exit\n", ++ __func__, __LINE__, fcport->port_name); + return rval; ++ } + +- if (fcport->fw_login_state == DSC_LS_PLOGI_PEND || +- fcport->fw_login_state == DSC_LS_PRLI_PEND) ++ if ((fcport->fw_login_state == DSC_LS_PLOGI_PEND || ++ fcport->fw_login_state == DSC_LS_PRLI_PEND) && ++ qla_dual_mode_enabled(vha)) { ++ ql_dbg(ql_dbg_disc, vha, 0xffff, "%s %d %8phC exit\n", ++ __func__, __LINE__, fcport->port_name); + return rval; ++ } + + sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); + if (!sp) +@@ -1602,6 +1616,10 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) + break; + default: + if (fcport->login_pause) { ++ ql_dbg(ql_dbg_disc, vha, 0x20d8, ++ "%s %d %8phC exit\n", ++ __func__, __LINE__, ++ fcport->port_name); + fcport->last_rscn_gen = fcport->rscn_gen; + fcport->last_login_gen = fcport->login_gen; + set_bit(RELOGIN_NEEDED, &vha->dpc_flags); +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 7c5f2736ebee..3e9c5768815e 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -1897,6 +1897,18 @@ static void qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, + inbuf = (uint32_t *)&sts->nvme_ersp_data; + outbuf = (uint32_t *)fd->rspaddr; + iocb->u.nvme.rsp_pyld_len = le16_to_cpu(sts->nvme_rsp_pyld_len); ++ if (unlikely(iocb->u.nvme.rsp_pyld_len > ++ sizeof(struct nvme_fc_ersp_iu))) { ++ if (ql_mask_match(ql_dbg_io)) { ++ WARN_ONCE(1, "Unexpected response payload length %u.\n", ++ iocb->u.nvme.rsp_pyld_len); ++ ql_log(ql_log_warn, fcport->vha, 0x5100, ++ "Unexpected response payload length %u.\n", ++ iocb->u.nvme.rsp_pyld_len); ++ } ++ iocb->u.nvme.rsp_pyld_len = ++ sizeof(struct nvme_fc_ersp_iu); ++ } + iter = iocb->u.nvme.rsp_pyld_len >> 2; + for (; iter; iter--) + *outbuf++ = swab32(*inbuf++); +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index eac76e934cbe..1ef8907314e5 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -6151,9 +6151,8 @@ qla2x00_dump_mctp_data(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t addr, + mcp->mb[7] = LSW(MSD(req_dma)); + mcp->mb[8] = MSW(addr); + /* Setting RAM ID to valid */ +- mcp->mb[10] |= BIT_7; + /* For MCTP RAM ID is 0x40 */ +- mcp->mb[10] |= 0x40; ++ mcp->mb[10] = BIT_7 | 0x40; + + mcp->out_mb |= MBX_10|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1| + MBX_0; +diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c +index 2b2028f2383e..c855d013ba8a 100644 +--- a/drivers/scsi/qla2xxx/qla_nx.c ++++ b/drivers/scsi/qla2xxx/qla_nx.c +@@ -1612,8 +1612,7 @@ qla82xx_get_bootld_offset(struct qla_hw_data *ha) + return (u8 *)&ha->hablob->fw->data[offset]; + } + +-static __le32 +-qla82xx_get_fw_size(struct qla_hw_data *ha) ++static u32 qla82xx_get_fw_size(struct qla_hw_data *ha) + { + struct qla82xx_uri_data_desc *uri_desc = NULL; + +@@ -1624,7 +1623,7 @@ qla82xx_get_fw_size(struct qla_hw_data *ha) + return cpu_to_le32(uri_desc->size); + } + +- return cpu_to_le32(*(u32 *)&ha->hablob->fw->data[FW_SIZE_OFFSET]); ++ return get_unaligned_le32(&ha->hablob->fw->data[FW_SIZE_OFFSET]); + } + + static u8 * +@@ -1816,7 +1815,7 @@ qla82xx_fw_load_from_blob(struct qla_hw_data *ha) + } + + flashaddr = FLASH_ADDR_START; +- size = (__force u32)qla82xx_get_fw_size(ha) / 8; ++ size = qla82xx_get_fw_size(ha) / 8; + ptr64 = (u64 *)qla82xx_get_fw_offs(ha); + + for (i = 0; i < size; i++) { +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 74a378a91b71..cb8a892e2d39 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -1257,6 +1257,7 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess) + sess->deleted = QLA_SESS_DELETION_IN_PROGRESS; + spin_unlock_irqrestore(&sess->vha->work_lock, flags); + ++ sess->prli_pend_timer = 0; + sess->disc_state = DSC_DELETE_PEND; + + qla24xx_chk_fcp_state(sess); +diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c +index 2323432a0edb..5504ab11decc 100644 +--- a/drivers/scsi/qla4xxx/ql4_os.c ++++ b/drivers/scsi/qla4xxx/ql4_os.c +@@ -4145,7 +4145,7 @@ static void qla4xxx_mem_free(struct scsi_qla_host *ha) + dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues, + ha->queues_dma); + +- if (ha->fw_dump) ++ if (ha->fw_dump) + vfree(ha->fw_dump); + + ha->queues_len = 0; +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index 1e38bb967871..0d41a7dc1d6b 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -5023,6 +5023,7 @@ static int ufshcd_disable_auto_bkops(struct ufs_hba *hba) + + hba->auto_bkops_enabled = false; + trace_ufshcd_auto_bkops_state(dev_name(hba->dev), "Disabled"); ++ hba->is_urgent_bkops_lvl_checked = false; + out: + return err; + } +@@ -5047,6 +5048,7 @@ static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba) + hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS; + ufshcd_disable_auto_bkops(hba); + } ++ hba->is_urgent_bkops_lvl_checked = false; + } + + static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status) +@@ -5093,6 +5095,7 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, + err = ufshcd_enable_auto_bkops(hba); + else + err = ufshcd_disable_auto_bkops(hba); ++ hba->urgent_bkops_lvl = curr_status; + out: + return err; + } +diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h +index 1c8b349379af..77c4a9abe365 100644 +--- a/drivers/usb/dwc3/core.h ++++ b/drivers/usb/dwc3/core.h +@@ -688,7 +688,9 @@ struct dwc3_ep { + #define DWC3_EP_STALL BIT(1) + #define DWC3_EP_WEDGE BIT(2) + #define DWC3_EP_TRANSFER_STARTED BIT(3) ++#define DWC3_EP_END_TRANSFER_PENDING BIT(4) + #define DWC3_EP_PENDING_REQUEST BIT(5) ++#define DWC3_EP_DELAY_START BIT(6) + + /* This last one is specific to EP0 */ + #define DWC3_EP0_DIR_IN BIT(31) +diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c +index fd1b100d2927..6dee4dabc0a4 100644 +--- a/drivers/usb/dwc3/ep0.c ++++ b/drivers/usb/dwc3/ep0.c +@@ -1136,8 +1136,10 @@ void dwc3_ep0_interrupt(struct dwc3 *dwc, + case DWC3_DEPEVT_EPCMDCMPLT: + cmd = DEPEVT_PARAMETER_CMD(event->parameters); + +- if (cmd == DWC3_DEPCMD_ENDTRANSFER) ++ if (cmd == DWC3_DEPCMD_ENDTRANSFER) { ++ dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING; + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; ++ } + break; + } + } +diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c +index 154f3f3e8cff..8b95be897078 100644 +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -1447,6 +1447,12 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) + list_add_tail(&req->list, &dep->pending_list); + req->status = DWC3_REQUEST_STATUS_QUEUED; + ++ /* Start the transfer only after the END_TRANSFER is completed */ ++ if (dep->flags & DWC3_EP_END_TRANSFER_PENDING) { ++ dep->flags |= DWC3_EP_DELAY_START; ++ return 0; ++ } ++ + /* + * NOTICE: Isochronous endpoints should NEVER be prestarted. We must + * wait for a XferNotReady event so we will know what's the current +@@ -2625,8 +2631,14 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, + cmd = DEPEVT_PARAMETER_CMD(event->parameters); + + if (cmd == DWC3_DEPCMD_ENDTRANSFER) { ++ dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING; + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; + dwc3_gadget_ep_cleanup_cancelled_requests(dep); ++ if ((dep->flags & DWC3_EP_DELAY_START) && ++ !usb_endpoint_xfer_isoc(dep->endpoint.desc)) ++ __dwc3_gadget_kick_transfer(dep); ++ ++ dep->flags &= ~DWC3_EP_DELAY_START; + } + break; + case DWC3_DEPEVT_STREAMEVT: +@@ -2683,7 +2695,8 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, + u32 cmd; + int ret; + +- if (!(dep->flags & DWC3_EP_TRANSFER_STARTED)) ++ if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) || ++ (dep->flags & DWC3_EP_END_TRANSFER_PENDING)) + return; + + /* +@@ -2728,6 +2741,8 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, + + if (!interrupt) + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; ++ else ++ dep->flags |= DWC3_EP_END_TRANSFER_PENDING; + + if (dwc3_is_usb31(dwc) || dwc->revision < DWC3_REVISION_310A) + udelay(100); +diff --git a/drivers/usb/gadget/function/f_ecm.c b/drivers/usb/gadget/function/f_ecm.c +index 460d5d7c984f..7f5cf488b2b1 100644 +--- a/drivers/usb/gadget/function/f_ecm.c ++++ b/drivers/usb/gadget/function/f_ecm.c +@@ -52,6 +52,7 @@ struct f_ecm { + struct usb_ep *notify; + struct usb_request *notify_req; + u8 notify_state; ++ atomic_t notify_count; + bool is_open; + + /* FIXME is_open needs some irq-ish locking +@@ -380,7 +381,7 @@ static void ecm_do_notify(struct f_ecm *ecm) + int status; + + /* notification already in flight? */ +- if (!req) ++ if (atomic_read(&ecm->notify_count)) + return; + + event = req->buf; +@@ -420,10 +421,10 @@ static void ecm_do_notify(struct f_ecm *ecm) + event->bmRequestType = 0xA1; + event->wIndex = cpu_to_le16(ecm->ctrl_id); + +- ecm->notify_req = NULL; ++ atomic_inc(&ecm->notify_count); + status = usb_ep_queue(ecm->notify, req, GFP_ATOMIC); + if (status < 0) { +- ecm->notify_req = req; ++ atomic_dec(&ecm->notify_count); + DBG(cdev, "notify --> %d\n", status); + } + } +@@ -448,17 +449,19 @@ static void ecm_notify_complete(struct usb_ep *ep, struct usb_request *req) + switch (req->status) { + case 0: + /* no fault */ ++ atomic_dec(&ecm->notify_count); + break; + case -ECONNRESET: + case -ESHUTDOWN: ++ atomic_set(&ecm->notify_count, 0); + ecm->notify_state = ECM_NOTIFY_NONE; + break; + default: + DBG(cdev, "event %02x --> %d\n", + event->bNotificationType, req->status); ++ atomic_dec(&ecm->notify_count); + break; + } +- ecm->notify_req = req; + ecm_do_notify(ecm); + } + +@@ -907,6 +910,11 @@ static void ecm_unbind(struct usb_configuration *c, struct usb_function *f) + + usb_free_all_descriptors(f); + ++ if (atomic_read(&ecm->notify_count)) { ++ usb_ep_dequeue(ecm->notify, ecm->notify_req); ++ atomic_set(&ecm->notify_count, 0); ++ } ++ + kfree(ecm->notify_req->buf); + usb_ep_free_request(ecm->notify, ecm->notify_req); + } +diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c +index 59d9d512dcda..ced2581cf99f 100644 +--- a/drivers/usb/gadget/function/f_fs.c ++++ b/drivers/usb/gadget/function/f_fs.c +@@ -1062,6 +1062,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) + req->num_sgs = io_data->sgt.nents; + } else { + req->buf = data; ++ req->num_sgs = 0; + } + req->length = data_len; + +@@ -1105,6 +1106,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) + req->num_sgs = io_data->sgt.nents; + } else { + req->buf = data; ++ req->num_sgs = 0; + } + req->length = data_len; + +diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c +index 2d6e76e4cffa..1d900081b1f0 100644 +--- a/drivers/usb/gadget/function/f_ncm.c ++++ b/drivers/usb/gadget/function/f_ncm.c +@@ -53,6 +53,7 @@ struct f_ncm { + struct usb_ep *notify; + struct usb_request *notify_req; + u8 notify_state; ++ atomic_t notify_count; + bool is_open; + + const struct ndp_parser_opts *parser_opts; +@@ -547,7 +548,7 @@ static void ncm_do_notify(struct f_ncm *ncm) + int status; + + /* notification already in flight? */ +- if (!req) ++ if (atomic_read(&ncm->notify_count)) + return; + + event = req->buf; +@@ -587,7 +588,8 @@ static void ncm_do_notify(struct f_ncm *ncm) + event->bmRequestType = 0xA1; + event->wIndex = cpu_to_le16(ncm->ctrl_id); + +- ncm->notify_req = NULL; ++ atomic_inc(&ncm->notify_count); ++ + /* + * In double buffering if there is a space in FIFO, + * completion callback can be called right after the call, +@@ -597,7 +599,7 @@ static void ncm_do_notify(struct f_ncm *ncm) + status = usb_ep_queue(ncm->notify, req, GFP_ATOMIC); + spin_lock(&ncm->lock); + if (status < 0) { +- ncm->notify_req = req; ++ atomic_dec(&ncm->notify_count); + DBG(cdev, "notify --> %d\n", status); + } + } +@@ -632,17 +634,19 @@ static void ncm_notify_complete(struct usb_ep *ep, struct usb_request *req) + case 0: + VDBG(cdev, "Notification %02x sent\n", + event->bNotificationType); ++ atomic_dec(&ncm->notify_count); + break; + case -ECONNRESET: + case -ESHUTDOWN: ++ atomic_set(&ncm->notify_count, 0); + ncm->notify_state = NCM_NOTIFY_NONE; + break; + default: + DBG(cdev, "event %02x --> %d\n", + event->bNotificationType, req->status); ++ atomic_dec(&ncm->notify_count); + break; + } +- ncm->notify_req = req; + ncm_do_notify(ncm); + spin_unlock(&ncm->lock); + } +@@ -1649,6 +1653,11 @@ static void ncm_unbind(struct usb_configuration *c, struct usb_function *f) + ncm_string_defs[0].id = 0; + usb_free_all_descriptors(f); + ++ if (atomic_read(&ncm->notify_count)) { ++ usb_ep_dequeue(ncm->notify, ncm->notify_req); ++ atomic_set(&ncm->notify_count, 0); ++ } ++ + kfree(ncm->notify_req->buf); + usb_ep_free_request(ncm->notify, ncm->notify_req); + } +diff --git a/drivers/usb/gadget/legacy/cdc2.c b/drivers/usb/gadget/legacy/cdc2.c +index da1c37933ca1..8d7a556ece30 100644 +--- a/drivers/usb/gadget/legacy/cdc2.c ++++ b/drivers/usb/gadget/legacy/cdc2.c +@@ -225,7 +225,7 @@ static struct usb_composite_driver cdc_driver = { + .name = "g_cdc", + .dev = &device_desc, + .strings = dev_strings, +- .max_speed = USB_SPEED_HIGH, ++ .max_speed = USB_SPEED_SUPER, + .bind = cdc_bind, + .unbind = cdc_unbind, + }; +diff --git a/drivers/usb/gadget/legacy/g_ffs.c b/drivers/usb/gadget/legacy/g_ffs.c +index b640ed3fcf70..ae6d8f7092b8 100644 +--- a/drivers/usb/gadget/legacy/g_ffs.c ++++ b/drivers/usb/gadget/legacy/g_ffs.c +@@ -149,7 +149,7 @@ static struct usb_composite_driver gfs_driver = { + .name = DRIVER_NAME, + .dev = &gfs_dev_desc, + .strings = gfs_dev_strings, +- .max_speed = USB_SPEED_HIGH, ++ .max_speed = USB_SPEED_SUPER, + .bind = gfs_bind, + .unbind = gfs_unbind, + }; +diff --git a/drivers/usb/gadget/legacy/multi.c b/drivers/usb/gadget/legacy/multi.c +index 50515f9e1022..ec9749845660 100644 +--- a/drivers/usb/gadget/legacy/multi.c ++++ b/drivers/usb/gadget/legacy/multi.c +@@ -482,7 +482,7 @@ static struct usb_composite_driver multi_driver = { + .name = "g_multi", + .dev = &device_desc, + .strings = dev_strings, +- .max_speed = USB_SPEED_HIGH, ++ .max_speed = USB_SPEED_SUPER, + .bind = multi_bind, + .unbind = multi_unbind, + .needs_serial = 1, +diff --git a/drivers/usb/gadget/legacy/ncm.c b/drivers/usb/gadget/legacy/ncm.c +index 8465f081e921..c61e71ba7045 100644 +--- a/drivers/usb/gadget/legacy/ncm.c ++++ b/drivers/usb/gadget/legacy/ncm.c +@@ -197,7 +197,7 @@ static struct usb_composite_driver ncm_driver = { + .name = "g_ncm", + .dev = &device_desc, + .strings = dev_strings, +- .max_speed = USB_SPEED_HIGH, ++ .max_speed = USB_SPEED_SUPER, + .bind = gncm_bind, + .unbind = gncm_unbind, + }; +diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c +index 8b4ff9fff340..753645bb2527 100644 +--- a/drivers/usb/typec/tcpm/tcpci.c ++++ b/drivers/usb/typec/tcpm/tcpci.c +@@ -591,6 +591,12 @@ static int tcpci_probe(struct i2c_client *client, + static int tcpci_remove(struct i2c_client *client) + { + struct tcpci_chip *chip = i2c_get_clientdata(client); ++ int err; ++ ++ /* Disable chip interrupts before unregistering port */ ++ err = tcpci_write16(chip->tcpci, TCPC_ALERT_MASK, 0); ++ if (err < 0) ++ return err; + + tcpci_unregister_port(chip->tcpci); + +diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c +index 9f4117766bb1..c962d9b370c6 100644 +--- a/drivers/virtio/virtio_balloon.c ++++ b/drivers/virtio/virtio_balloon.c +@@ -474,7 +474,9 @@ static int init_vqs(struct virtio_balloon *vb) + names[VIRTIO_BALLOON_VQ_INFLATE] = "inflate"; + callbacks[VIRTIO_BALLOON_VQ_DEFLATE] = balloon_ack; + names[VIRTIO_BALLOON_VQ_DEFLATE] = "deflate"; ++ callbacks[VIRTIO_BALLOON_VQ_STATS] = NULL; + names[VIRTIO_BALLOON_VQ_STATS] = NULL; ++ callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL; + names[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL; + + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) { +@@ -898,8 +900,7 @@ static int virtballoon_probe(struct virtio_device *vdev) + vb->vb_dev_info.inode = alloc_anon_inode(balloon_mnt->mnt_sb); + if (IS_ERR(vb->vb_dev_info.inode)) { + err = PTR_ERR(vb->vb_dev_info.inode); +- kern_unmount(balloon_mnt); +- goto out_del_vqs; ++ goto out_kern_unmount; + } + vb->vb_dev_info.inode->i_mapping->a_ops = &balloon_aops; + #endif +@@ -910,13 +911,13 @@ static int virtballoon_probe(struct virtio_device *vdev) + */ + if (virtqueue_get_vring_size(vb->free_page_vq) < 2) { + err = -ENOSPC; +- goto out_del_vqs; ++ goto out_iput; + } + vb->balloon_wq = alloc_workqueue("balloon-wq", + WQ_FREEZABLE | WQ_CPU_INTENSIVE, 0); + if (!vb->balloon_wq) { + err = -ENOMEM; +- goto out_del_vqs; ++ goto out_iput; + } + INIT_WORK(&vb->report_free_page_work, report_free_page_func); + vb->cmd_id_received_cache = VIRTIO_BALLOON_CMD_ID_STOP; +@@ -950,6 +951,12 @@ static int virtballoon_probe(struct virtio_device *vdev) + out_del_balloon_wq: + if (virtio_has_feature(vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) + destroy_workqueue(vb->balloon_wq); ++out_iput: ++#ifdef CONFIG_BALLOON_COMPACTION ++ iput(vb->vb_dev_info.inode); ++out_kern_unmount: ++ kern_unmount(balloon_mnt); ++#endif + out_del_vqs: + vdev->config->del_vqs(vdev); + out_free_vb: +@@ -965,6 +972,10 @@ static void remove_common(struct virtio_balloon *vb) + leak_balloon(vb, vb->num_pages); + update_balloon_size(vb); + ++ /* There might be free pages that are being reported: release them. */ ++ if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) ++ return_free_pages_to_mm(vb, ULONG_MAX); ++ + /* Now we reset the device so we can clean up the queues. */ + vb->vdev->config->reset(vb->vdev); + +diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c +index f2862f66c2ac..222d630c41fc 100644 +--- a/drivers/virtio/virtio_pci_common.c ++++ b/drivers/virtio/virtio_pci_common.c +@@ -294,7 +294,7 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned nvqs, + /* Best option: one for change interrupt, one per vq. */ + nvectors = 1; + for (i = 0; i < nvqs; ++i) +- if (callbacks[i]) ++ if (names[i] && callbacks[i]) + ++nvectors; + } else { + /* Second best: one for change, shared for all vqs. */ +diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c +index 21e8085b848b..861daf4f37b2 100644 +--- a/drivers/watchdog/watchdog_core.c ++++ b/drivers/watchdog/watchdog_core.c +@@ -147,6 +147,25 @@ int watchdog_init_timeout(struct watchdog_device *wdd, + } + EXPORT_SYMBOL_GPL(watchdog_init_timeout); + ++static int watchdog_reboot_notifier(struct notifier_block *nb, ++ unsigned long code, void *data) ++{ ++ struct watchdog_device *wdd; ++ ++ wdd = container_of(nb, struct watchdog_device, reboot_nb); ++ if (code == SYS_DOWN || code == SYS_HALT) { ++ if (watchdog_active(wdd)) { ++ int ret; ++ ++ ret = wdd->ops->stop(wdd); ++ if (ret) ++ return NOTIFY_BAD; ++ } ++ } ++ ++ return NOTIFY_DONE; ++} ++ + static int watchdog_restart_notifier(struct notifier_block *nb, + unsigned long action, void *data) + { +@@ -235,6 +254,19 @@ static int __watchdog_register_device(struct watchdog_device *wdd) + } + } + ++ if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) { ++ wdd->reboot_nb.notifier_call = watchdog_reboot_notifier; ++ ++ ret = register_reboot_notifier(&wdd->reboot_nb); ++ if (ret) { ++ pr_err("watchdog%d: Cannot register reboot notifier (%d)\n", ++ wdd->id, ret); ++ watchdog_dev_unregister(wdd); ++ ida_simple_remove(&watchdog_ida, id); ++ return ret; ++ } ++ } ++ + if (wdd->ops->restart) { + wdd->restart_nb.notifier_call = watchdog_restart_notifier; + +@@ -289,6 +321,9 @@ static void __watchdog_unregister_device(struct watchdog_device *wdd) + if (wdd->ops->restart) + unregister_restart_handler(&wdd->restart_nb); + ++ if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) ++ unregister_reboot_notifier(&wdd->reboot_nb); ++ + watchdog_dev_unregister(wdd); + ida_simple_remove(&watchdog_ida, wdd->id); + } +diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c +index 62483a99105c..ce04edc69e5f 100644 +--- a/drivers/watchdog/watchdog_dev.c ++++ b/drivers/watchdog/watchdog_dev.c +@@ -38,7 +38,6 @@ + #include /* For handling misc devices */ + #include /* For module stuff/... */ + #include /* For mutexes */ +-#include /* For reboot notifier */ + #include /* For memory functions */ + #include /* For standard types (like size_t) */ + #include /* For watchdog specific items */ +@@ -1077,25 +1076,6 @@ static void watchdog_cdev_unregister(struct watchdog_device *wdd) + put_device(&wd_data->dev); + } + +-static int watchdog_reboot_notifier(struct notifier_block *nb, +- unsigned long code, void *data) +-{ +- struct watchdog_device *wdd; +- +- wdd = container_of(nb, struct watchdog_device, reboot_nb); +- if (code == SYS_DOWN || code == SYS_HALT) { +- if (watchdog_active(wdd)) { +- int ret; +- +- ret = wdd->ops->stop(wdd); +- if (ret) +- return NOTIFY_BAD; +- } +- } +- +- return NOTIFY_DONE; +-} +- + /* + * watchdog_dev_register: register a watchdog device + * @wdd: watchdog device +@@ -1114,22 +1094,8 @@ int watchdog_dev_register(struct watchdog_device *wdd) + return ret; + + ret = watchdog_register_pretimeout(wdd); +- if (ret) { ++ if (ret) + watchdog_cdev_unregister(wdd); +- return ret; +- } +- +- if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) { +- wdd->reboot_nb.notifier_call = watchdog_reboot_notifier; +- +- ret = devm_register_reboot_notifier(&wdd->wd_data->dev, +- &wdd->reboot_nb); +- if (ret) { +- pr_err("watchdog%d: Cannot register reboot notifier (%d)\n", +- wdd->id, ret); +- watchdog_dev_unregister(wdd); +- } +- } + + return ret; + } +diff --git a/drivers/xen/xen-balloon.c b/drivers/xen/xen-balloon.c +index 6d12fc368210..a8d24433c8e9 100644 +--- a/drivers/xen/xen-balloon.c ++++ b/drivers/xen/xen-balloon.c +@@ -94,7 +94,7 @@ static void watch_target(struct xenbus_watch *watch, + "%llu", &static_max) == 1)) + static_max >>= PAGE_SHIFT - 10; + else +- static_max = new_target; ++ static_max = balloon_stats.current_pages; + + target_diff = (xen_pv_domain() || xen_initial_domain()) ? 0 + : static_max - balloon_stats.target_pages; +diff --git a/fs/aio.c b/fs/aio.c +index 0d9a559d488c..4115d5ad6b90 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -1610,6 +1610,14 @@ static int aio_fsync(struct fsync_iocb *req, const struct iocb *iocb, + return 0; + } + ++static void aio_poll_put_work(struct work_struct *work) ++{ ++ struct poll_iocb *req = container_of(work, struct poll_iocb, work); ++ struct aio_kiocb *iocb = container_of(req, struct aio_kiocb, poll); ++ ++ iocb_put(iocb); ++} ++ + static void aio_poll_complete_work(struct work_struct *work) + { + struct poll_iocb *req = container_of(work, struct poll_iocb, work); +@@ -1674,6 +1682,8 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, + list_del_init(&req->wait.entry); + + if (mask && spin_trylock_irqsave(&iocb->ki_ctx->ctx_lock, flags)) { ++ struct kioctx *ctx = iocb->ki_ctx; ++ + /* + * Try to complete the iocb inline if we can. Use + * irqsave/irqrestore because not all filesystems (e.g. fuse) +@@ -1683,8 +1693,14 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, + list_del(&iocb->ki_list); + iocb->ki_res.res = mangle_poll(mask); + req->done = true; +- spin_unlock_irqrestore(&iocb->ki_ctx->ctx_lock, flags); +- iocb_put(iocb); ++ if (iocb->ki_eventfd && eventfd_signal_count()) { ++ iocb = NULL; ++ INIT_WORK(&req->work, aio_poll_put_work); ++ schedule_work(&req->work); ++ } ++ spin_unlock_irqrestore(&ctx->ctx_lock, flags); ++ if (iocb) ++ iocb_put(iocb); + } else { + schedule_work(&req->work); + } +diff --git a/fs/attr.c b/fs/attr.c +index df28035aa23e..b4bbdbd4c8ca 100644 +--- a/fs/attr.c ++++ b/fs/attr.c +@@ -183,18 +183,12 @@ void setattr_copy(struct inode *inode, const struct iattr *attr) + inode->i_uid = attr->ia_uid; + if (ia_valid & ATTR_GID) + inode->i_gid = attr->ia_gid; +- if (ia_valid & ATTR_ATIME) { +- inode->i_atime = timestamp_truncate(attr->ia_atime, +- inode); +- } +- if (ia_valid & ATTR_MTIME) { +- inode->i_mtime = timestamp_truncate(attr->ia_mtime, +- inode); +- } +- if (ia_valid & ATTR_CTIME) { +- inode->i_ctime = timestamp_truncate(attr->ia_ctime, +- inode); +- } ++ if (ia_valid & ATTR_ATIME) ++ inode->i_atime = attr->ia_atime; ++ if (ia_valid & ATTR_MTIME) ++ inode->i_mtime = attr->ia_mtime; ++ if (ia_valid & ATTR_CTIME) ++ inode->i_ctime = attr->ia_ctime; + if (ia_valid & ATTR_MODE) { + umode_t mode = attr->ia_mode; + +@@ -268,8 +262,13 @@ int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **de + attr->ia_ctime = now; + if (!(ia_valid & ATTR_ATIME_SET)) + attr->ia_atime = now; ++ else ++ attr->ia_atime = timestamp_truncate(attr->ia_atime, inode); + if (!(ia_valid & ATTR_MTIME_SET)) + attr->ia_mtime = now; ++ else ++ attr->ia_mtime = timestamp_truncate(attr->ia_mtime, inode); ++ + if (ia_valid & ATTR_KILL_PRIV) { + error = security_inode_need_killpriv(dentry); + if (error < 0) +diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c +index da9b0f060a9d..a989105d39c8 100644 +--- a/fs/btrfs/ctree.c ++++ b/fs/btrfs/ctree.c +@@ -330,12 +330,10 @@ u64 btrfs_get_tree_mod_seq(struct btrfs_fs_info *fs_info, + struct seq_list *elem) + { + write_lock(&fs_info->tree_mod_log_lock); +- spin_lock(&fs_info->tree_mod_seq_lock); + if (!elem->seq) { + elem->seq = btrfs_inc_tree_mod_seq(fs_info); + list_add_tail(&elem->list, &fs_info->tree_mod_seq_list); + } +- spin_unlock(&fs_info->tree_mod_seq_lock); + write_unlock(&fs_info->tree_mod_log_lock); + + return elem->seq; +@@ -355,7 +353,7 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, + if (!seq_putting) + return; + +- spin_lock(&fs_info->tree_mod_seq_lock); ++ write_lock(&fs_info->tree_mod_log_lock); + list_del(&elem->list); + elem->seq = 0; + +@@ -366,19 +364,17 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, + * blocker with lower sequence number exists, we + * cannot remove anything from the log + */ +- spin_unlock(&fs_info->tree_mod_seq_lock); ++ write_unlock(&fs_info->tree_mod_log_lock); + return; + } + min_seq = cur_elem->seq; + } + } +- spin_unlock(&fs_info->tree_mod_seq_lock); + + /* + * anything that's lower than the lowest existing (read: blocked) + * sequence number can be removed from the tree. + */ +- write_lock(&fs_info->tree_mod_log_lock); + tm_root = &fs_info->tree_mod_log; + for (node = rb_first(tm_root); node; node = next) { + next = rb_next(node); +diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h +index 5e9f80b28fcf..290ca193c6c0 100644 +--- a/fs/btrfs/ctree.h ++++ b/fs/btrfs/ctree.h +@@ -671,14 +671,12 @@ struct btrfs_fs_info { + atomic_t nr_delayed_iputs; + wait_queue_head_t delayed_iputs_wait; + +- /* this protects tree_mod_seq_list */ +- spinlock_t tree_mod_seq_lock; + atomic64_t tree_mod_seq; +- struct list_head tree_mod_seq_list; + +- /* this protects tree_mod_log */ ++ /* this protects tree_mod_log and tree_mod_seq_list */ + rwlock_t tree_mod_log_lock; + struct rb_root tree_mod_log; ++ struct list_head tree_mod_seq_list; + + atomic_t async_delalloc_pages; + +diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c +index df3bd880061d..dfdb7d4f8406 100644 +--- a/fs/btrfs/delayed-ref.c ++++ b/fs/btrfs/delayed-ref.c +@@ -492,7 +492,7 @@ void btrfs_merge_delayed_refs(struct btrfs_trans_handle *trans, + if (head->is_data) + return; + +- spin_lock(&fs_info->tree_mod_seq_lock); ++ read_lock(&fs_info->tree_mod_log_lock); + if (!list_empty(&fs_info->tree_mod_seq_list)) { + struct seq_list *elem; + +@@ -500,7 +500,7 @@ void btrfs_merge_delayed_refs(struct btrfs_trans_handle *trans, + struct seq_list, list); + seq = elem->seq; + } +- spin_unlock(&fs_info->tree_mod_seq_lock); ++ read_unlock(&fs_info->tree_mod_log_lock); + + again: + for (node = rb_first_cached(&head->ref_tree); node; +@@ -518,7 +518,7 @@ int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, u64 seq) + struct seq_list *elem; + int ret = 0; + +- spin_lock(&fs_info->tree_mod_seq_lock); ++ read_lock(&fs_info->tree_mod_log_lock); + if (!list_empty(&fs_info->tree_mod_seq_list)) { + elem = list_first_entry(&fs_info->tree_mod_seq_list, + struct seq_list, list); +@@ -531,7 +531,7 @@ int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, u64 seq) + } + } + +- spin_unlock(&fs_info->tree_mod_seq_lock); ++ read_unlock(&fs_info->tree_mod_log_lock); + return ret; + } + +diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c +index bae334212ee2..7becc5e96f92 100644 +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -2016,7 +2016,7 @@ static void free_root_extent_buffers(struct btrfs_root *root) + } + + /* helper to cleanup tree roots */ +-static void free_root_pointers(struct btrfs_fs_info *info, int chunk_root) ++static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root) + { + free_root_extent_buffers(info->tree_root); + +@@ -2025,7 +2025,7 @@ static void free_root_pointers(struct btrfs_fs_info *info, int chunk_root) + free_root_extent_buffers(info->csum_root); + free_root_extent_buffers(info->quota_root); + free_root_extent_buffers(info->uuid_root); +- if (chunk_root) ++ if (free_chunk_root) + free_root_extent_buffers(info->chunk_root); + free_root_extent_buffers(info->free_space_root); + } +@@ -2652,7 +2652,6 @@ int open_ctree(struct super_block *sb, + spin_lock_init(&fs_info->fs_roots_radix_lock); + spin_lock_init(&fs_info->delayed_iput_lock); + spin_lock_init(&fs_info->defrag_inodes_lock); +- spin_lock_init(&fs_info->tree_mod_seq_lock); + spin_lock_init(&fs_info->super_lock); + spin_lock_init(&fs_info->buffer_lock); + spin_lock_init(&fs_info->unused_bgs_lock); +@@ -3324,7 +3323,7 @@ fail_block_groups: + btrfs_put_block_group_cache(fs_info); + + fail_tree_roots: +- free_root_pointers(fs_info, 1); ++ free_root_pointers(fs_info, true); + invalidate_inode_pages2(fs_info->btree_inode->i_mapping); + + fail_sb_buffer: +@@ -3356,7 +3355,7 @@ recovery_tree_root: + if (!btrfs_test_opt(fs_info, USEBACKUPROOT)) + goto fail_tree_roots; + +- free_root_pointers(fs_info, 0); ++ free_root_pointers(fs_info, false); + + /* don't use the log in recovery mode, it won't be valid */ + btrfs_set_super_log_root(disk_super, 0); +@@ -4047,10 +4046,17 @@ void close_ctree(struct btrfs_fs_info *fs_info) + invalidate_inode_pages2(fs_info->btree_inode->i_mapping); + btrfs_stop_all_workers(fs_info); + +- btrfs_free_block_groups(fs_info); +- + clear_bit(BTRFS_FS_OPEN, &fs_info->flags); +- free_root_pointers(fs_info, 1); ++ free_root_pointers(fs_info, true); ++ ++ /* ++ * We must free the block groups after dropping the fs_roots as we could ++ * have had an IO error and have left over tree log blocks that aren't ++ * cleaned up until the fs roots are freed. This makes the block group ++ * accounting appear to be wrong because there's pending reserved bytes, ++ * so make sure we do the block group cleanup afterwards. ++ */ ++ btrfs_free_block_groups(fs_info); + + iput(fs_info->btree_inode); + +diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c +index 33c6b191ca59..284540cdbbd9 100644 +--- a/fs/btrfs/extent_io.c ++++ b/fs/btrfs/extent_io.c +@@ -1583,21 +1583,25 @@ void find_first_clear_extent_bit(struct extent_io_tree *tree, u64 start, + /* Find first extent with bits cleared */ + while (1) { + node = __etree_search(tree, start, &next, &prev, NULL, NULL); +- if (!node) { ++ if (!node && !next && !prev) { ++ /* ++ * Tree is completely empty, send full range and let ++ * caller deal with it ++ */ ++ *start_ret = 0; ++ *end_ret = -1; ++ goto out; ++ } else if (!node && !next) { ++ /* ++ * We are past the last allocated chunk, set start at ++ * the end of the last extent. ++ */ ++ state = rb_entry(prev, struct extent_state, rb_node); ++ *start_ret = state->end + 1; ++ *end_ret = -1; ++ goto out; ++ } else if (!node) { + node = next; +- if (!node) { +- /* +- * We are past the last allocated chunk, +- * set start at the end of the last extent. The +- * device alloc tree should never be empty so +- * prev is always set. +- */ +- ASSERT(prev); +- state = rb_entry(prev, struct extent_state, rb_node); +- *start_ret = state->end + 1; +- *end_ret = -1; +- goto out; +- } + } + /* + * At this point 'node' either contains 'start' or start is +@@ -3938,6 +3942,11 @@ int btree_write_cache_pages(struct address_space *mapping, + if (wbc->range_cyclic) { + index = mapping->writeback_index; /* Start from prev offset */ + end = -1; ++ /* ++ * Start from the beginning does not need to cycle over the ++ * range, mark it as scanned. ++ */ ++ scanned = (index == 0); + } else { + index = wbc->range_start >> PAGE_SHIFT; + end = wbc->range_end >> PAGE_SHIFT; +@@ -3955,7 +3964,6 @@ retry: + tag))) { + unsigned i; + +- scanned = 1; + for (i = 0; i < nr_pages; i++) { + struct page *page = pvec.pages[i]; + +@@ -4084,6 +4092,11 @@ static int extent_write_cache_pages(struct address_space *mapping, + if (wbc->range_cyclic) { + index = mapping->writeback_index; /* Start from prev offset */ + end = -1; ++ /* ++ * Start from the beginning does not need to cycle over the ++ * range, mark it as scanned. ++ */ ++ scanned = (index == 0); + } else { + index = wbc->range_start >> PAGE_SHIFT; + end = wbc->range_end >> PAGE_SHIFT; +@@ -4117,7 +4130,6 @@ retry: + &index, end, tag))) { + unsigned i; + +- scanned = 1; + for (i = 0; i < nr_pages; i++) { + struct page *page = pvec.pages[i]; + +@@ -4177,7 +4189,16 @@ retry: + */ + scanned = 1; + index = 0; +- goto retry; ++ ++ /* ++ * If we're looping we could run into a page that is locked by a ++ * writer and that writer could be waiting on writeback for a ++ * page in our current bio, and thus deadlock, so flush the ++ * write bio here. ++ */ ++ ret = flush_write_bio(epd); ++ if (!ret) ++ goto retry; + } + + if (wbc->range_cyclic || (wbc->nr_to_write > 0 && range_whole)) +diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c +index 8e86b2d700c4..d88b8d8897cc 100644 +--- a/fs/btrfs/ioctl.c ++++ b/fs/btrfs/ioctl.c +@@ -3244,6 +3244,7 @@ static void btrfs_double_extent_lock(struct inode *inode1, u64 loff1, + static int btrfs_extent_same_range(struct inode *src, u64 loff, u64 len, + struct inode *dst, u64 dst_loff) + { ++ const u64 bs = BTRFS_I(src)->root->fs_info->sb->s_blocksize; + int ret; + + /* +@@ -3251,7 +3252,7 @@ static int btrfs_extent_same_range(struct inode *src, u64 loff, u64 len, + * source range to serialize with relocation. + */ + btrfs_double_extent_lock(src, loff, dst, dst_loff, len); +- ret = btrfs_clone(src, dst, loff, len, len, dst_loff, 1); ++ ret = btrfs_clone(src, dst, loff, len, ALIGN(len, bs), dst_loff, 1); + btrfs_double_extent_unlock(src, loff, dst, dst_loff, len); + + return ret; +diff --git a/fs/btrfs/tests/btrfs-tests.c b/fs/btrfs/tests/btrfs-tests.c +index 99fe9bf3fdac..98f9684e7ffc 100644 +--- a/fs/btrfs/tests/btrfs-tests.c ++++ b/fs/btrfs/tests/btrfs-tests.c +@@ -121,7 +121,6 @@ struct btrfs_fs_info *btrfs_alloc_dummy_fs_info(u32 nodesize, u32 sectorsize) + spin_lock_init(&fs_info->qgroup_lock); + spin_lock_init(&fs_info->super_lock); + spin_lock_init(&fs_info->fs_roots_radix_lock); +- spin_lock_init(&fs_info->tree_mod_seq_lock); + mutex_init(&fs_info->qgroup_ioctl_lock); + mutex_init(&fs_info->qgroup_rescan_lock); + rwlock_init(&fs_info->tree_mod_log_lock); +diff --git a/fs/btrfs/tests/extent-io-tests.c b/fs/btrfs/tests/extent-io-tests.c +index 123d9a614357..df7ce874a74b 100644 +--- a/fs/btrfs/tests/extent-io-tests.c ++++ b/fs/btrfs/tests/extent-io-tests.c +@@ -441,8 +441,17 @@ static int test_find_first_clear_extent_bit(void) + int ret = -EINVAL; + + test_msg("running find_first_clear_extent_bit test"); ++ + extent_io_tree_init(NULL, &tree, IO_TREE_SELFTEST, NULL); + ++ /* Test correct handling of empty tree */ ++ find_first_clear_extent_bit(&tree, 0, &start, &end, CHUNK_TRIMMED); ++ if (start != 0 || end != -1) { ++ test_err( ++ "error getting a range from completely empty tree: start %llu end %llu", ++ start, end); ++ goto out; ++ } + /* + * Set 1M-4M alloc/discard and 32M-64M thus leaving a hole between + * 4M-32M +diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c +index 8624bdee8c5b..ceffec752234 100644 +--- a/fs/btrfs/transaction.c ++++ b/fs/btrfs/transaction.c +@@ -77,13 +77,14 @@ void btrfs_put_transaction(struct btrfs_transaction *transaction) + } + } + +-static noinline void switch_commit_roots(struct btrfs_transaction *trans) ++static noinline void switch_commit_roots(struct btrfs_trans_handle *trans) + { ++ struct btrfs_transaction *cur_trans = trans->transaction; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root, *tmp; + + down_write(&fs_info->commit_root_sem); +- list_for_each_entry_safe(root, tmp, &trans->switch_commits, ++ list_for_each_entry_safe(root, tmp, &cur_trans->switch_commits, + dirty_list) { + list_del_init(&root->dirty_list); + free_extent_buffer(root->commit_root); +@@ -95,16 +96,17 @@ static noinline void switch_commit_roots(struct btrfs_transaction *trans) + } + + /* We can free old roots now. */ +- spin_lock(&trans->dropped_roots_lock); +- while (!list_empty(&trans->dropped_roots)) { +- root = list_first_entry(&trans->dropped_roots, ++ spin_lock(&cur_trans->dropped_roots_lock); ++ while (!list_empty(&cur_trans->dropped_roots)) { ++ root = list_first_entry(&cur_trans->dropped_roots, + struct btrfs_root, root_list); + list_del_init(&root->root_list); +- spin_unlock(&trans->dropped_roots_lock); ++ spin_unlock(&cur_trans->dropped_roots_lock); ++ btrfs_free_log(trans, root); + btrfs_drop_and_free_fs_root(fs_info, root); +- spin_lock(&trans->dropped_roots_lock); ++ spin_lock(&cur_trans->dropped_roots_lock); + } +- spin_unlock(&trans->dropped_roots_lock); ++ spin_unlock(&cur_trans->dropped_roots_lock); + up_write(&fs_info->commit_root_sem); + } + +@@ -1359,7 +1361,7 @@ static int qgroup_account_snapshot(struct btrfs_trans_handle *trans, + ret = commit_cowonly_roots(trans); + if (ret) + goto out; +- switch_commit_roots(trans->transaction); ++ switch_commit_roots(trans); + ret = btrfs_write_and_wait_transaction(trans); + if (ret) + btrfs_handle_fs_error(fs_info, ret, +@@ -1949,6 +1951,14 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) + struct btrfs_transaction *prev_trans = NULL; + int ret; + ++ /* ++ * Some places just start a transaction to commit it. We need to make ++ * sure that if this commit fails that the abort code actually marks the ++ * transaction as failed, so set trans->dirty to make the abort code do ++ * the right thing. ++ */ ++ trans->dirty = true; ++ + /* Stop the commit early if ->aborted is set */ + if (unlikely(READ_ONCE(cur_trans->aborted))) { + ret = cur_trans->aborted; +@@ -2237,7 +2247,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) + list_add_tail(&fs_info->chunk_root->dirty_list, + &cur_trans->switch_commits); + +- switch_commit_roots(cur_trans); ++ switch_commit_roots(trans); + + ASSERT(list_empty(&cur_trans->dirty_bgs)); + ASSERT(list_empty(&cur_trans->io_bgs)); +diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c +index ab27e6cd9b3e..6f2178618c22 100644 +--- a/fs/btrfs/tree-log.c ++++ b/fs/btrfs/tree-log.c +@@ -3953,7 +3953,7 @@ static int log_csums(struct btrfs_trans_handle *trans, + static noinline int copy_items(struct btrfs_trans_handle *trans, + struct btrfs_inode *inode, + struct btrfs_path *dst_path, +- struct btrfs_path *src_path, u64 *last_extent, ++ struct btrfs_path *src_path, + int start_slot, int nr, int inode_only, + u64 logged_isize) + { +@@ -3964,7 +3964,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + struct btrfs_file_extent_item *extent; + struct btrfs_inode_item *inode_item; + struct extent_buffer *src = src_path->nodes[0]; +- struct btrfs_key first_key, last_key, key; + int ret; + struct btrfs_key *ins_keys; + u32 *ins_sizes; +@@ -3972,9 +3971,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + int i; + struct list_head ordered_sums; + int skip_csum = inode->flags & BTRFS_INODE_NODATASUM; +- bool has_extents = false; +- bool need_find_last_extent = true; +- bool done = false; + + INIT_LIST_HEAD(&ordered_sums); + +@@ -3983,8 +3979,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + if (!ins_data) + return -ENOMEM; + +- first_key.objectid = (u64)-1; +- + ins_sizes = (u32 *)ins_data; + ins_keys = (struct btrfs_key *)(ins_data + nr * sizeof(u32)); + +@@ -4005,9 +3999,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + + src_offset = btrfs_item_ptr_offset(src, start_slot + i); + +- if (i == nr - 1) +- last_key = ins_keys[i]; +- + if (ins_keys[i].type == BTRFS_INODE_ITEM_KEY) { + inode_item = btrfs_item_ptr(dst_path->nodes[0], + dst_path->slots[0], +@@ -4021,20 +4012,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + src_offset, ins_sizes[i]); + } + +- /* +- * We set need_find_last_extent here in case we know we were +- * processing other items and then walk into the first extent in +- * the inode. If we don't hit an extent then nothing changes, +- * we'll do the last search the next time around. +- */ +- if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY) { +- has_extents = true; +- if (first_key.objectid == (u64)-1) +- first_key = ins_keys[i]; +- } else { +- need_find_last_extent = false; +- } +- + /* take a reference on file data extents so that truncates + * or deletes of this inode don't have to relog the inode + * again +@@ -4100,167 +4077,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + kfree(sums); + } + +- if (!has_extents) +- return ret; +- +- if (need_find_last_extent && *last_extent == first_key.offset) { +- /* +- * We don't have any leafs between our current one and the one +- * we processed before that can have file extent items for our +- * inode (and have a generation number smaller than our current +- * transaction id). +- */ +- need_find_last_extent = false; +- } +- +- /* +- * Because we use btrfs_search_forward we could skip leaves that were +- * not modified and then assume *last_extent is valid when it really +- * isn't. So back up to the previous leaf and read the end of the last +- * extent before we go and fill in holes. +- */ +- if (need_find_last_extent) { +- u64 len; +- +- ret = btrfs_prev_leaf(inode->root, src_path); +- if (ret < 0) +- return ret; +- if (ret) +- goto fill_holes; +- if (src_path->slots[0]) +- src_path->slots[0]--; +- src = src_path->nodes[0]; +- btrfs_item_key_to_cpu(src, &key, src_path->slots[0]); +- if (key.objectid != btrfs_ino(inode) || +- key.type != BTRFS_EXTENT_DATA_KEY) +- goto fill_holes; +- extent = btrfs_item_ptr(src, src_path->slots[0], +- struct btrfs_file_extent_item); +- if (btrfs_file_extent_type(src, extent) == +- BTRFS_FILE_EXTENT_INLINE) { +- len = btrfs_file_extent_ram_bytes(src, extent); +- *last_extent = ALIGN(key.offset + len, +- fs_info->sectorsize); +- } else { +- len = btrfs_file_extent_num_bytes(src, extent); +- *last_extent = key.offset + len; +- } +- } +-fill_holes: +- /* So we did prev_leaf, now we need to move to the next leaf, but a few +- * things could have happened +- * +- * 1) A merge could have happened, so we could currently be on a leaf +- * that holds what we were copying in the first place. +- * 2) A split could have happened, and now not all of the items we want +- * are on the same leaf. +- * +- * So we need to adjust how we search for holes, we need to drop the +- * path and re-search for the first extent key we found, and then walk +- * forward until we hit the last one we copied. +- */ +- if (need_find_last_extent) { +- /* btrfs_prev_leaf could return 1 without releasing the path */ +- btrfs_release_path(src_path); +- ret = btrfs_search_slot(NULL, inode->root, &first_key, +- src_path, 0, 0); +- if (ret < 0) +- return ret; +- ASSERT(ret == 0); +- src = src_path->nodes[0]; +- i = src_path->slots[0]; +- } else { +- i = start_slot; +- } +- +- /* +- * Ok so here we need to go through and fill in any holes we may have +- * to make sure that holes are punched for those areas in case they had +- * extents previously. +- */ +- while (!done) { +- u64 offset, len; +- u64 extent_end; +- +- if (i >= btrfs_header_nritems(src_path->nodes[0])) { +- ret = btrfs_next_leaf(inode->root, src_path); +- if (ret < 0) +- return ret; +- ASSERT(ret == 0); +- src = src_path->nodes[0]; +- i = 0; +- need_find_last_extent = true; +- } +- +- btrfs_item_key_to_cpu(src, &key, i); +- if (!btrfs_comp_cpu_keys(&key, &last_key)) +- done = true; +- if (key.objectid != btrfs_ino(inode) || +- key.type != BTRFS_EXTENT_DATA_KEY) { +- i++; +- continue; +- } +- extent = btrfs_item_ptr(src, i, struct btrfs_file_extent_item); +- if (btrfs_file_extent_type(src, extent) == +- BTRFS_FILE_EXTENT_INLINE) { +- len = btrfs_file_extent_ram_bytes(src, extent); +- extent_end = ALIGN(key.offset + len, +- fs_info->sectorsize); +- } else { +- len = btrfs_file_extent_num_bytes(src, extent); +- extent_end = key.offset + len; +- } +- i++; +- +- if (*last_extent == key.offset) { +- *last_extent = extent_end; +- continue; +- } +- offset = *last_extent; +- len = key.offset - *last_extent; +- ret = btrfs_insert_file_extent(trans, log, btrfs_ino(inode), +- offset, 0, 0, len, 0, len, 0, 0, 0); +- if (ret) +- break; +- *last_extent = extent_end; +- } +- +- /* +- * Check if there is a hole between the last extent found in our leaf +- * and the first extent in the next leaf. If there is one, we need to +- * log an explicit hole so that at replay time we can punch the hole. +- */ +- if (ret == 0 && +- key.objectid == btrfs_ino(inode) && +- key.type == BTRFS_EXTENT_DATA_KEY && +- i == btrfs_header_nritems(src_path->nodes[0])) { +- ret = btrfs_next_leaf(inode->root, src_path); +- need_find_last_extent = true; +- if (ret > 0) { +- ret = 0; +- } else if (ret == 0) { +- btrfs_item_key_to_cpu(src_path->nodes[0], &key, +- src_path->slots[0]); +- if (key.objectid == btrfs_ino(inode) && +- key.type == BTRFS_EXTENT_DATA_KEY && +- *last_extent < key.offset) { +- const u64 len = key.offset - *last_extent; +- +- ret = btrfs_insert_file_extent(trans, log, +- btrfs_ino(inode), +- *last_extent, 0, +- 0, len, 0, len, +- 0, 0, 0); +- *last_extent += len; +- } +- } +- } +- /* +- * Need to let the callers know we dropped the path so they should +- * re-search. +- */ +- if (!ret && need_find_last_extent) +- ret = 1; + return ret; + } + +@@ -4425,7 +4241,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + const u64 i_size = i_size_read(&inode->vfs_inode); + const u64 ino = btrfs_ino(inode); + struct btrfs_path *dst_path = NULL; +- u64 last_extent = (u64)-1; ++ bool dropped_extents = false; + int ins_nr = 0; + int start_slot; + int ret; +@@ -4447,8 +4263,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + if (slot >= btrfs_header_nritems(leaf)) { + if (ins_nr > 0) { + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, start_slot, +- ins_nr, 1, 0); ++ start_slot, ins_nr, 1, 0); + if (ret < 0) + goto out; + ins_nr = 0; +@@ -4472,8 +4287,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + path->slots[0]++; + continue; + } +- if (last_extent == (u64)-1) { +- last_extent = key.offset; ++ if (!dropped_extents) { + /* + * Avoid logging extent items logged in past fsync calls + * and leading to duplicate keys in the log tree. +@@ -4487,6 +4301,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + } while (ret == -EAGAIN); + if (ret) + goto out; ++ dropped_extents = true; + } + if (ins_nr == 0) + start_slot = slot; +@@ -4501,7 +4316,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + } + } + if (ins_nr > 0) { +- ret = copy_items(trans, inode, dst_path, path, &last_extent, ++ ret = copy_items(trans, inode, dst_path, path, + start_slot, ins_nr, 1, 0); + if (ret > 0) + ret = 0; +@@ -4688,13 +4503,8 @@ static int btrfs_log_all_xattrs(struct btrfs_trans_handle *trans, + + if (slot >= nritems) { + if (ins_nr > 0) { +- u64 last_extent = 0; +- + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, start_slot, +- ins_nr, 1, 0); +- /* can't be 1, extent items aren't processed */ +- ASSERT(ret <= 0); ++ start_slot, ins_nr, 1, 0); + if (ret < 0) + return ret; + ins_nr = 0; +@@ -4718,13 +4528,8 @@ static int btrfs_log_all_xattrs(struct btrfs_trans_handle *trans, + cond_resched(); + } + if (ins_nr > 0) { +- u64 last_extent = 0; +- + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, start_slot, +- ins_nr, 1, 0); +- /* can't be 1, extent items aren't processed */ +- ASSERT(ret <= 0); ++ start_slot, ins_nr, 1, 0); + if (ret < 0) + return ret; + } +@@ -4733,100 +4538,119 @@ static int btrfs_log_all_xattrs(struct btrfs_trans_handle *trans, + } + + /* +- * If the no holes feature is enabled we need to make sure any hole between the +- * last extent and the i_size of our inode is explicitly marked in the log. This +- * is to make sure that doing something like: +- * +- * 1) create file with 128Kb of data +- * 2) truncate file to 64Kb +- * 3) truncate file to 256Kb +- * 4) fsync file +- * 5) +- * 6) mount fs and trigger log replay +- * +- * Will give us a file with a size of 256Kb, the first 64Kb of data match what +- * the file had in its first 64Kb of data at step 1 and the last 192Kb of the +- * file correspond to a hole. The presence of explicit holes in a log tree is +- * what guarantees that log replay will remove/adjust file extent items in the +- * fs/subvol tree. +- * +- * Here we do not need to care about holes between extents, that is already done +- * by copy_items(). We also only need to do this in the full sync path, where we +- * lookup for extents from the fs/subvol tree only. In the fast path case, we +- * lookup the list of modified extent maps and if any represents a hole, we +- * insert a corresponding extent representing a hole in the log tree. ++ * When using the NO_HOLES feature if we punched a hole that causes the ++ * deletion of entire leafs or all the extent items of the first leaf (the one ++ * that contains the inode item and references) we may end up not processing ++ * any extents, because there are no leafs with a generation matching the ++ * current transaction that have extent items for our inode. So we need to find ++ * if any holes exist and then log them. We also need to log holes after any ++ * truncate operation that changes the inode's size. + */ +-static int btrfs_log_trailing_hole(struct btrfs_trans_handle *trans, +- struct btrfs_root *root, +- struct btrfs_inode *inode, +- struct btrfs_path *path) ++static int btrfs_log_holes(struct btrfs_trans_handle *trans, ++ struct btrfs_root *root, ++ struct btrfs_inode *inode, ++ struct btrfs_path *path) + { + struct btrfs_fs_info *fs_info = root->fs_info; +- int ret; + struct btrfs_key key; +- u64 hole_start; +- u64 hole_size; +- struct extent_buffer *leaf; +- struct btrfs_root *log = root->log_root; + const u64 ino = btrfs_ino(inode); + const u64 i_size = i_size_read(&inode->vfs_inode); ++ u64 prev_extent_end = 0; ++ int ret; + +- if (!btrfs_fs_incompat(fs_info, NO_HOLES)) ++ if (!btrfs_fs_incompat(fs_info, NO_HOLES) || i_size == 0) + return 0; + + key.objectid = ino; + key.type = BTRFS_EXTENT_DATA_KEY; +- key.offset = (u64)-1; ++ key.offset = 0; + + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); +- ASSERT(ret != 0); + if (ret < 0) + return ret; + +- ASSERT(path->slots[0] > 0); +- path->slots[0]--; +- leaf = path->nodes[0]; +- btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); +- +- if (key.objectid != ino || key.type != BTRFS_EXTENT_DATA_KEY) { +- /* inode does not have any extents */ +- hole_start = 0; +- hole_size = i_size; +- } else { ++ while (true) { + struct btrfs_file_extent_item *extent; ++ struct extent_buffer *leaf = path->nodes[0]; + u64 len; + +- /* +- * If there's an extent beyond i_size, an explicit hole was +- * already inserted by copy_items(). +- */ +- if (key.offset >= i_size) +- return 0; ++ if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { ++ ret = btrfs_next_leaf(root, path); ++ if (ret < 0) ++ return ret; ++ if (ret > 0) { ++ ret = 0; ++ break; ++ } ++ leaf = path->nodes[0]; ++ } ++ ++ btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); ++ if (key.objectid != ino || key.type != BTRFS_EXTENT_DATA_KEY) ++ break; ++ ++ /* We have a hole, log it. */ ++ if (prev_extent_end < key.offset) { ++ const u64 hole_len = key.offset - prev_extent_end; ++ ++ /* ++ * Release the path to avoid deadlocks with other code ++ * paths that search the root while holding locks on ++ * leafs from the log root. ++ */ ++ btrfs_release_path(path); ++ ret = btrfs_insert_file_extent(trans, root->log_root, ++ ino, prev_extent_end, 0, ++ 0, hole_len, 0, hole_len, ++ 0, 0, 0); ++ if (ret < 0) ++ return ret; ++ ++ /* ++ * Search for the same key again in the root. Since it's ++ * an extent item and we are holding the inode lock, the ++ * key must still exist. If it doesn't just emit warning ++ * and return an error to fall back to a transaction ++ * commit. ++ */ ++ ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); ++ if (ret < 0) ++ return ret; ++ if (WARN_ON(ret > 0)) ++ return -ENOENT; ++ leaf = path->nodes[0]; ++ } + + extent = btrfs_item_ptr(leaf, path->slots[0], + struct btrfs_file_extent_item); +- + if (btrfs_file_extent_type(leaf, extent) == +- BTRFS_FILE_EXTENT_INLINE) +- return 0; ++ BTRFS_FILE_EXTENT_INLINE) { ++ len = btrfs_file_extent_ram_bytes(leaf, extent); ++ prev_extent_end = ALIGN(key.offset + len, ++ fs_info->sectorsize); ++ } else { ++ len = btrfs_file_extent_num_bytes(leaf, extent); ++ prev_extent_end = key.offset + len; ++ } + +- len = btrfs_file_extent_num_bytes(leaf, extent); +- /* Last extent goes beyond i_size, no need to log a hole. */ +- if (key.offset + len > i_size) +- return 0; +- hole_start = key.offset + len; +- hole_size = i_size - hole_start; ++ path->slots[0]++; ++ cond_resched(); + } +- btrfs_release_path(path); + +- /* Last extent ends at i_size. */ +- if (hole_size == 0) +- return 0; ++ if (prev_extent_end < i_size) { ++ u64 hole_len; + +- hole_size = ALIGN(hole_size, fs_info->sectorsize); +- ret = btrfs_insert_file_extent(trans, log, ino, hole_start, 0, 0, +- hole_size, 0, hole_size, 0, 0, 0); +- return ret; ++ btrfs_release_path(path); ++ hole_len = ALIGN(i_size - prev_extent_end, fs_info->sectorsize); ++ ret = btrfs_insert_file_extent(trans, root->log_root, ++ ino, prev_extent_end, 0, 0, ++ hole_len, 0, hole_len, ++ 0, 0, 0); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; + } + + /* +@@ -5030,6 +4854,50 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, + } + continue; + } ++ /* ++ * If the inode was already logged skip it - otherwise we can ++ * hit an infinite loop. Example: ++ * ++ * From the commit root (previous transaction) we have the ++ * following inodes: ++ * ++ * inode 257 a directory ++ * inode 258 with references "zz" and "zz_link" on inode 257 ++ * inode 259 with reference "a" on inode 257 ++ * ++ * And in the current (uncommitted) transaction we have: ++ * ++ * inode 257 a directory, unchanged ++ * inode 258 with references "a" and "a2" on inode 257 ++ * inode 259 with reference "zz_link" on inode 257 ++ * inode 261 with reference "zz" on inode 257 ++ * ++ * When logging inode 261 the following infinite loop could ++ * happen if we don't skip already logged inodes: ++ * ++ * - we detect inode 258 as a conflicting inode, with inode 261 ++ * on reference "zz", and log it; ++ * ++ * - we detect inode 259 as a conflicting inode, with inode 258 ++ * on reference "a", and log it; ++ * ++ * - we detect inode 258 as a conflicting inode, with inode 259 ++ * on reference "zz_link", and log it - again! After this we ++ * repeat the above steps forever. ++ */ ++ spin_lock(&BTRFS_I(inode)->lock); ++ /* ++ * Check the inode's logged_trans only instead of ++ * btrfs_inode_in_log(). This is because the last_log_commit of ++ * the inode is not updated when we only log that it exists and ++ * and it has the full sync bit set (see btrfs_log_inode()). ++ */ ++ if (BTRFS_I(inode)->logged_trans == trans->transid) { ++ spin_unlock(&BTRFS_I(inode)->lock); ++ btrfs_add_delayed_iput(inode); ++ continue; ++ } ++ spin_unlock(&BTRFS_I(inode)->lock); + /* + * We are safe logging the other inode without acquiring its + * lock as long as we log with the LOG_INODE_EXISTS mode. We +@@ -5129,7 +4997,6 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, + struct btrfs_key min_key; + struct btrfs_key max_key; + struct btrfs_root *log = root->log_root; +- u64 last_extent = 0; + int err = 0; + int ret; + int nritems; +@@ -5307,7 +5174,7 @@ again: + ins_start_slot = path->slots[0]; + } + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, ins_start_slot, ++ ins_start_slot, + ins_nr, inode_only, + logged_isize); + if (ret < 0) { +@@ -5330,17 +5197,13 @@ again: + if (ins_nr == 0) + goto next_slot; + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, ins_start_slot, ++ ins_start_slot, + ins_nr, inode_only, logged_isize); + if (ret < 0) { + err = ret; + goto out_unlock; + } + ins_nr = 0; +- if (ret) { +- btrfs_release_path(path); +- continue; +- } + goto next_slot; + } + +@@ -5353,18 +5216,13 @@ again: + goto next_slot; + } + +- ret = copy_items(trans, inode, dst_path, path, &last_extent, ++ ret = copy_items(trans, inode, dst_path, path, + ins_start_slot, ins_nr, inode_only, + logged_isize); + if (ret < 0) { + err = ret; + goto out_unlock; + } +- if (ret) { +- ins_nr = 0; +- btrfs_release_path(path); +- continue; +- } + ins_nr = 1; + ins_start_slot = path->slots[0]; + next_slot: +@@ -5378,13 +5236,12 @@ next_slot: + } + if (ins_nr) { + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, ins_start_slot, ++ ins_start_slot, + ins_nr, inode_only, logged_isize); + if (ret < 0) { + err = ret; + goto out_unlock; + } +- ret = 0; + ins_nr = 0; + } + btrfs_release_path(path); +@@ -5399,14 +5256,13 @@ next_key: + } + } + if (ins_nr) { +- ret = copy_items(trans, inode, dst_path, path, &last_extent, ++ ret = copy_items(trans, inode, dst_path, path, + ins_start_slot, ins_nr, inode_only, + logged_isize); + if (ret < 0) { + err = ret; + goto out_unlock; + } +- ret = 0; + ins_nr = 0; + } + +@@ -5419,7 +5275,7 @@ next_key: + if (max_key.type >= BTRFS_EXTENT_DATA_KEY && !fast_search) { + btrfs_release_path(path); + btrfs_release_path(dst_path); +- err = btrfs_log_trailing_hole(trans, root, inode, path); ++ err = btrfs_log_holes(trans, root, inode, path); + if (err) + goto out_unlock; + } +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index 97f1ba7c18b2..f7d9fc1a6fc2 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -881,17 +881,28 @@ static struct btrfs_fs_devices *find_fsid_changed( + /* + * Handles the case where scanned device is part of an fs that had + * multiple successful changes of FSID but curently device didn't +- * observe it. Meaning our fsid will be different than theirs. ++ * observe it. Meaning our fsid will be different than theirs. We need ++ * to handle two subcases : ++ * 1 - The fs still continues to have different METADATA/FSID uuids. ++ * 2 - The fs is switched back to its original FSID (METADATA/FSID ++ * are equal). + */ + list_for_each_entry(fs_devices, &fs_uuids, fs_list) { ++ /* Changed UUIDs */ + if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid, + BTRFS_FSID_SIZE) != 0 && + memcmp(fs_devices->metadata_uuid, disk_super->metadata_uuid, + BTRFS_FSID_SIZE) == 0 && + memcmp(fs_devices->fsid, disk_super->fsid, +- BTRFS_FSID_SIZE) != 0) { ++ BTRFS_FSID_SIZE) != 0) ++ return fs_devices; ++ ++ /* Unchanged UUIDs */ ++ if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid, ++ BTRFS_FSID_SIZE) == 0 && ++ memcmp(fs_devices->fsid, disk_super->metadata_uuid, ++ BTRFS_FSID_SIZE) == 0) + return fs_devices; +- } + } + + return NULL; +diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c +index e1cac715d19e..06d932ed097e 100644 +--- a/fs/cifs/smb2pdu.c ++++ b/fs/cifs/smb2pdu.c +@@ -350,9 +350,14 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon) + } + + rc = cifs_negotiate_protocol(0, tcon->ses); +- if (!rc && tcon->ses->need_reconnect) ++ if (!rc && tcon->ses->need_reconnect) { + rc = cifs_setup_session(0, tcon->ses, nls_codepage); +- ++ if ((rc == -EACCES) && !tcon->retry) { ++ rc = -EHOSTDOWN; ++ mutex_unlock(&tcon->ses->session_mutex); ++ goto failed; ++ } ++ } + if (rc || !tcon->need_reconnect) { + mutex_unlock(&tcon->ses->session_mutex); + goto out; +@@ -397,6 +402,7 @@ out: + case SMB2_SET_INFO: + rc = -EAGAIN; + } ++failed: + unload_nls(nls_codepage); + return rc; + } +diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c +index 680aba9c00d5..fd0b5dd68f9e 100644 +--- a/fs/configfs/inode.c ++++ b/fs/configfs/inode.c +@@ -76,14 +76,11 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr) + if (ia_valid & ATTR_GID) + sd_iattr->ia_gid = iattr->ia_gid; + if (ia_valid & ATTR_ATIME) +- sd_iattr->ia_atime = timestamp_truncate(iattr->ia_atime, +- inode); ++ sd_iattr->ia_atime = iattr->ia_atime; + if (ia_valid & ATTR_MTIME) +- sd_iattr->ia_mtime = timestamp_truncate(iattr->ia_mtime, +- inode); ++ sd_iattr->ia_mtime = iattr->ia_mtime; + if (ia_valid & ATTR_CTIME) +- sd_iattr->ia_ctime = timestamp_truncate(iattr->ia_ctime, +- inode); ++ sd_iattr->ia_ctime = iattr->ia_ctime; + if (ia_valid & ATTR_MODE) { + umode_t mode = iattr->ia_mode; + +diff --git a/fs/crypto/keyring.c b/fs/crypto/keyring.c +index c34fa7c61b43..4ee65b2b6247 100644 +--- a/fs/crypto/keyring.c ++++ b/fs/crypto/keyring.c +@@ -664,9 +664,6 @@ static int check_for_busy_inodes(struct super_block *sb, + struct list_head *pos; + size_t busy_count = 0; + unsigned long ino; +- struct dentry *dentry; +- char _path[256]; +- char *path = NULL; + + spin_lock(&mk->mk_decrypted_inodes_lock); + +@@ -685,22 +682,14 @@ static int check_for_busy_inodes(struct super_block *sb, + struct fscrypt_info, + ci_master_key_link)->ci_inode; + ino = inode->i_ino; +- dentry = d_find_alias(inode); + } + spin_unlock(&mk->mk_decrypted_inodes_lock); + +- if (dentry) { +- path = dentry_path(dentry, _path, sizeof(_path)); +- dput(dentry); +- } +- if (IS_ERR_OR_NULL(path)) +- path = "(unknown)"; +- + fscrypt_warn(NULL, +- "%s: %zu inode(s) still busy after removing key with %s %*phN, including ino %lu (%s)", ++ "%s: %zu inode(s) still busy after removing key with %s %*phN, including ino %lu", + sb->s_id, busy_count, master_key_spec_type(&mk->mk_spec), + master_key_spec_len(&mk->mk_spec), (u8 *)&mk->mk_spec.u, +- ino, path); ++ ino); + return -EBUSY; + } + +diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c +index 19f89f9fb10c..23b74b8e8f96 100644 +--- a/fs/erofs/decompressor.c ++++ b/fs/erofs/decompressor.c +@@ -306,24 +306,22 @@ static int z_erofs_shifted_transform(const struct z_erofs_decompress_req *rq, + } + + src = kmap_atomic(*rq->in); +- if (!rq->out[0]) { +- dst = NULL; +- } else { ++ if (rq->out[0]) { + dst = kmap_atomic(rq->out[0]); + memcpy(dst + rq->pageofs_out, src, righthalf); ++ kunmap_atomic(dst); + } + +- if (rq->out[1] == *rq->in) { +- memmove(src, src + righthalf, rq->pageofs_out); +- } else if (nrpages_out == 2) { +- if (dst) +- kunmap_atomic(dst); ++ if (nrpages_out == 2) { + DBG_BUGON(!rq->out[1]); +- dst = kmap_atomic(rq->out[1]); +- memcpy(dst, src + righthalf, rq->pageofs_out); ++ if (rq->out[1] == *rq->in) { ++ memmove(src, src + righthalf, rq->pageofs_out); ++ } else { ++ dst = kmap_atomic(rq->out[1]); ++ memcpy(dst, src + righthalf, rq->pageofs_out); ++ kunmap_atomic(dst); ++ } + } +- if (dst) +- kunmap_atomic(dst); + kunmap_atomic(src); + return 0; + } +diff --git a/fs/eventfd.c b/fs/eventfd.c +index 8aa0ea8c55e8..78e41c7c3d05 100644 +--- a/fs/eventfd.c ++++ b/fs/eventfd.c +@@ -24,6 +24,8 @@ + #include + #include + ++DEFINE_PER_CPU(int, eventfd_wake_count); ++ + static DEFINE_IDA(eventfd_ida); + + struct eventfd_ctx { +@@ -60,12 +62,25 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) + { + unsigned long flags; + ++ /* ++ * Deadlock or stack overflow issues can happen if we recurse here ++ * through waitqueue wakeup handlers. If the caller users potentially ++ * nested waitqueues with custom wakeup handlers, then it should ++ * check eventfd_signal_count() before calling this function. If ++ * it returns true, the eventfd_signal() call should be deferred to a ++ * safe context. ++ */ ++ if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count))) ++ return 0; ++ + spin_lock_irqsave(&ctx->wqh.lock, flags); ++ this_cpu_inc(eventfd_wake_count); + if (ULLONG_MAX - ctx->count < n) + n = ULLONG_MAX - ctx->count; + ctx->count += n; + if (waitqueue_active(&ctx->wqh)) + wake_up_locked_poll(&ctx->wqh, EPOLLIN); ++ this_cpu_dec(eventfd_wake_count); + spin_unlock_irqrestore(&ctx->wqh.lock, flags); + + return n; +diff --git a/fs/ext2/super.c b/fs/ext2/super.c +index 30c630d73f0f..065cd2d1bdc6 100644 +--- a/fs/ext2/super.c ++++ b/fs/ext2/super.c +@@ -1082,9 +1082,9 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) + + if (EXT2_BLOCKS_PER_GROUP(sb) == 0) + goto cantfind_ext2; +- sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - +- le32_to_cpu(es->s_first_data_block) - 1) +- / EXT2_BLOCKS_PER_GROUP(sb)) + 1; ++ sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - ++ le32_to_cpu(es->s_first_data_block) - 1) ++ / EXT2_BLOCKS_PER_GROUP(sb)) + 1; + db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / + EXT2_DESC_PER_BLOCK(sb); + sbi->s_group_desc = kmalloc_array (db_count, +diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c +index 6305d5ec25af..5ef8d7ae231b 100644 +--- a/fs/ext4/dir.c ++++ b/fs/ext4/dir.c +@@ -673,9 +673,11 @@ static int ext4_d_compare(const struct dentry *dentry, unsigned int len, + const char *str, const struct qstr *name) + { + struct qstr qstr = {.name = str, .len = len }; +- struct inode *inode = dentry->d_parent->d_inode; ++ const struct dentry *parent = READ_ONCE(dentry->d_parent); ++ const struct inode *inode = READ_ONCE(parent->d_inode); + +- if (!IS_CASEFOLDED(inode) || !EXT4_SB(inode->i_sb)->s_encoding) { ++ if (!inode || !IS_CASEFOLDED(inode) || ++ !EXT4_SB(inode->i_sb)->s_encoding) { + if (len != name->len) + return -1; + return memcmp(str, name->name, len); +@@ -688,10 +690,11 @@ static int ext4_d_hash(const struct dentry *dentry, struct qstr *str) + { + const struct ext4_sb_info *sbi = EXT4_SB(dentry->d_sb); + const struct unicode_map *um = sbi->s_encoding; ++ const struct inode *inode = READ_ONCE(dentry->d_inode); + unsigned char *norm; + int len, ret = 0; + +- if (!IS_CASEFOLDED(dentry->d_inode) || !um) ++ if (!inode || !IS_CASEFOLDED(inode) || !um) + return 0; + + norm = kmalloc(PATH_MAX, GFP_ATOMIC); +diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c +index 12ceadef32c5..2cc9f2168b9e 100644 +--- a/fs/ext4/page-io.c ++++ b/fs/ext4/page-io.c +@@ -478,17 +478,26 @@ int ext4_bio_write_page(struct ext4_io_submit *io, + gfp_t gfp_flags = GFP_NOFS; + unsigned int enc_bytes = round_up(len, i_blocksize(inode)); + ++ /* ++ * Since bounce page allocation uses a mempool, we can only use ++ * a waiting mask (i.e. request guaranteed allocation) on the ++ * first page of the bio. Otherwise it can deadlock. ++ */ ++ if (io->io_bio) ++ gfp_flags = GFP_NOWAIT | __GFP_NOWARN; + retry_encrypt: + bounce_page = fscrypt_encrypt_pagecache_blocks(page, enc_bytes, + 0, gfp_flags); + if (IS_ERR(bounce_page)) { + ret = PTR_ERR(bounce_page); +- if (ret == -ENOMEM && wbc->sync_mode == WB_SYNC_ALL) { +- if (io->io_bio) { ++ if (ret == -ENOMEM && ++ (io->io_bio || wbc->sync_mode == WB_SYNC_ALL)) { ++ gfp_flags = GFP_NOFS; ++ if (io->io_bio) + ext4_io_submit(io); +- congestion_wait(BLK_RW_ASYNC, HZ/50); +- } +- gfp_flags |= __GFP_NOFAIL; ++ else ++ gfp_flags |= __GFP_NOFAIL; ++ congestion_wait(BLK_RW_ASYNC, HZ/50); + goto retry_encrypt; + } + bounce_page = NULL; +diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c +index 4033778bcbbf..84280ad3786c 100644 +--- a/fs/f2fs/dir.c ++++ b/fs/f2fs/dir.c +@@ -1068,24 +1068,27 @@ static int f2fs_d_compare(const struct dentry *dentry, unsigned int len, + const char *str, const struct qstr *name) + { + struct qstr qstr = {.name = str, .len = len }; ++ const struct dentry *parent = READ_ONCE(dentry->d_parent); ++ const struct inode *inode = READ_ONCE(parent->d_inode); + +- if (!IS_CASEFOLDED(dentry->d_parent->d_inode)) { ++ if (!inode || !IS_CASEFOLDED(inode)) { + if (len != name->len) + return -1; +- return memcmp(str, name, len); ++ return memcmp(str, name->name, len); + } + +- return f2fs_ci_compare(dentry->d_parent->d_inode, name, &qstr, false); ++ return f2fs_ci_compare(inode, name, &qstr, false); + } + + static int f2fs_d_hash(const struct dentry *dentry, struct qstr *str) + { + struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); + const struct unicode_map *um = sbi->s_encoding; ++ const struct inode *inode = READ_ONCE(dentry->d_inode); + unsigned char *norm; + int len, ret = 0; + +- if (!IS_CASEFOLDED(dentry->d_inode)) ++ if (!inode || !IS_CASEFOLDED(inode)) + return 0; + + norm = f2fs_kmalloc(sbi, PATH_MAX, GFP_ATOMIC); +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index fae665691481..72f308790a8e 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -751,18 +751,12 @@ static void __setattr_copy(struct inode *inode, const struct iattr *attr) + inode->i_uid = attr->ia_uid; + if (ia_valid & ATTR_GID) + inode->i_gid = attr->ia_gid; +- if (ia_valid & ATTR_ATIME) { +- inode->i_atime = timestamp_truncate(attr->ia_atime, +- inode); +- } +- if (ia_valid & ATTR_MTIME) { +- inode->i_mtime = timestamp_truncate(attr->ia_mtime, +- inode); +- } +- if (ia_valid & ATTR_CTIME) { +- inode->i_ctime = timestamp_truncate(attr->ia_ctime, +- inode); +- } ++ if (ia_valid & ATTR_ATIME) ++ inode->i_atime = attr->ia_atime; ++ if (ia_valid & ATTR_MTIME) ++ inode->i_mtime = attr->ia_mtime; ++ if (ia_valid & ATTR_CTIME) ++ inode->i_ctime = attr->ia_ctime; + if (ia_valid & ATTR_MODE) { + umode_t mode = attr->ia_mode; + +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index 1443cee15863..ea8dbf1458c9 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -1213,9 +1213,11 @@ static int f2fs_statfs_project(struct super_block *sb, + return PTR_ERR(dquot); + spin_lock(&dquot->dq_dqb_lock); + +- limit = (dquot->dq_dqb.dqb_bsoftlimit ? +- dquot->dq_dqb.dqb_bsoftlimit : +- dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits; ++ limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit, ++ dquot->dq_dqb.dqb_bhardlimit); ++ if (limit) ++ limit >>= sb->s_blocksize_bits; ++ + if (limit && buf->f_blocks > limit) { + curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits; + buf->f_blocks = limit; +@@ -1224,9 +1226,9 @@ static int f2fs_statfs_project(struct super_block *sb, + (buf->f_blocks - curblock) : 0; + } + +- limit = dquot->dq_dqb.dqb_isoftlimit ? +- dquot->dq_dqb.dqb_isoftlimit : +- dquot->dq_dqb.dqb_ihardlimit; ++ limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit, ++ dquot->dq_dqb.dqb_ihardlimit); ++ + if (limit && buf->f_files > limit) { + buf->f_files = limit; + buf->f_ffree = +diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c +index 335607b8c5c0..76ac9c7d32ec 100644 +--- a/fs/fs-writeback.c ++++ b/fs/fs-writeback.c +@@ -2063,7 +2063,7 @@ void wb_workfn(struct work_struct *work) + struct bdi_writeback, dwork); + long pages_written; + +- set_worker_desc("flush-%s", dev_name(wb->bdi->dev)); ++ set_worker_desc("flush-%s", bdi_dev_name(wb->bdi)); + current->flags |= PF_SWAPWRITE; + + if (likely(!current_is_workqueue_rescuer() || +diff --git a/fs/fuse/file.c b/fs/fuse/file.c +index ce715380143c..695369f46f92 100644 +--- a/fs/fuse/file.c ++++ b/fs/fuse/file.c +@@ -1465,6 +1465,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, + } + ia = NULL; + if (nres < 0) { ++ iov_iter_revert(iter, nbytes); + err = nres; + break; + } +@@ -1473,8 +1474,10 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, + count -= nres; + res += nres; + pos += nres; +- if (nres != nbytes) ++ if (nres != nbytes) { ++ iov_iter_revert(iter, nbytes - nres); + break; ++ } + if (count) { + max_pages = iov_iter_npages(iter, fc->max_pages); + ia = fuse_io_alloc(io, max_pages); +diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c +index 01ff37b76652..4a10b4e7092a 100644 +--- a/fs/gfs2/file.c ++++ b/fs/gfs2/file.c +@@ -833,7 +833,7 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from) + struct file *file = iocb->ki_filp; + struct inode *inode = file_inode(file); + struct gfs2_inode *ip = GFS2_I(inode); +- ssize_t written = 0, ret; ++ ssize_t ret; + + ret = gfs2_rsqa_alloc(ip); + if (ret) +@@ -853,68 +853,58 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from) + inode_lock(inode); + ret = generic_write_checks(iocb, from); + if (ret <= 0) +- goto out; +- +- /* We can write back this queue in page reclaim */ +- current->backing_dev_info = inode_to_bdi(inode); ++ goto out_unlock; + + ret = file_remove_privs(file); + if (ret) +- goto out2; ++ goto out_unlock; + + ret = file_update_time(file); + if (ret) +- goto out2; ++ goto out_unlock; + + if (iocb->ki_flags & IOCB_DIRECT) { + struct address_space *mapping = file->f_mapping; +- loff_t pos, endbyte; +- ssize_t buffered; ++ ssize_t buffered, ret2; + +- written = gfs2_file_direct_write(iocb, from); +- if (written < 0 || !iov_iter_count(from)) +- goto out2; ++ ret = gfs2_file_direct_write(iocb, from); ++ if (ret < 0 || !iov_iter_count(from)) ++ goto out_unlock; + +- ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); +- if (unlikely(ret < 0)) +- goto out2; +- buffered = ret; ++ iocb->ki_flags |= IOCB_DSYNC; ++ current->backing_dev_info = inode_to_bdi(inode); ++ buffered = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); ++ current->backing_dev_info = NULL; ++ if (unlikely(buffered <= 0)) ++ goto out_unlock; + + /* + * We need to ensure that the page cache pages are written to + * disk and invalidated to preserve the expected O_DIRECT +- * semantics. ++ * semantics. If the writeback or invalidate fails, only report ++ * the direct I/O range as we don't know if the buffered pages ++ * made it to disk. + */ +- pos = iocb->ki_pos; +- endbyte = pos + buffered - 1; +- ret = filemap_write_and_wait_range(mapping, pos, endbyte); +- if (!ret) { +- iocb->ki_pos += buffered; +- written += buffered; +- invalidate_mapping_pages(mapping, +- pos >> PAGE_SHIFT, +- endbyte >> PAGE_SHIFT); +- } else { +- /* +- * We don't know how much we wrote, so just return +- * the number of bytes which were direct-written +- */ +- } ++ iocb->ki_pos += buffered; ++ ret2 = generic_write_sync(iocb, buffered); ++ invalidate_mapping_pages(mapping, ++ (iocb->ki_pos - buffered) >> PAGE_SHIFT, ++ (iocb->ki_pos - 1) >> PAGE_SHIFT); ++ if (!ret || ret2 > 0) ++ ret += ret2; + } else { ++ current->backing_dev_info = inode_to_bdi(inode); + ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); +- if (likely(ret > 0)) ++ current->backing_dev_info = NULL; ++ if (likely(ret > 0)) { + iocb->ki_pos += ret; ++ ret = generic_write_sync(iocb, ret); ++ } + } + +-out2: +- current->backing_dev_info = NULL; +-out: ++out_unlock: + inode_unlock(inode); +- if (likely(ret > 0)) { +- /* Handle various SYNC-type writes */ +- ret = generic_write_sync(iocb, ret); +- } +- return written ? written : ret; ++ return ret; + } + + static int fallocate_chunk(struct inode *inode, loff_t offset, loff_t len, +diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c +index e7b9d39955d4..7ca84be20cf6 100644 +--- a/fs/gfs2/lops.c ++++ b/fs/gfs2/lops.c +@@ -421,7 +421,7 @@ static bool gfs2_jhead_pg_srch(struct gfs2_jdesc *jd, + + for (offset = 0; offset < PAGE_SIZE; offset += sdp->sd_sb.sb_bsize) { + if (!__get_log_header(sdp, kaddr + offset, 0, &lh)) { +- if (lh.lh_sequence > head->lh_sequence) ++ if (lh.lh_sequence >= head->lh_sequence) + *head = lh; + else { + ret = true; +diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c +index 1c58859aa592..ef485f892d1b 100644 +--- a/fs/jbd2/journal.c ++++ b/fs/jbd2/journal.c +@@ -981,6 +981,7 @@ static void *jbd2_seq_info_start(struct seq_file *seq, loff_t *pos) + + static void *jbd2_seq_info_next(struct seq_file *seq, void *v, loff_t *pos) + { ++ (*pos)++; + return NULL; + } + +diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c +index e180033e35cf..05ed7be8a634 100644 +--- a/fs/nfs/dir.c ++++ b/fs/nfs/dir.c +@@ -162,6 +162,17 @@ typedef struct { + bool eof; + } nfs_readdir_descriptor_t; + ++static ++void nfs_readdir_init_array(struct page *page) ++{ ++ struct nfs_cache_array *array; ++ ++ array = kmap_atomic(page); ++ memset(array, 0, sizeof(struct nfs_cache_array)); ++ array->eof_index = -1; ++ kunmap_atomic(array); ++} ++ + /* + * we are freeing strings created by nfs_add_to_readdir_array() + */ +@@ -174,6 +185,7 @@ void nfs_readdir_clear_array(struct page *page) + array = kmap_atomic(page); + for (i = 0; i < array->size; i++) + kfree(array->array[i].string.name); ++ array->size = 0; + kunmap_atomic(array); + } + +@@ -610,6 +622,8 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, + int status = -ENOMEM; + unsigned int array_size = ARRAY_SIZE(pages); + ++ nfs_readdir_init_array(page); ++ + entry.prev_cookie = 0; + entry.cookie = desc->last_cookie; + entry.eof = 0; +@@ -626,8 +640,6 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, + } + + array = kmap(page); +- memset(array, 0, sizeof(struct nfs_cache_array)); +- array->eof_index = -1; + + status = nfs_readdir_alloc_pages(pages, array_size); + if (status < 0) +@@ -682,6 +694,7 @@ int nfs_readdir_filler(void *data, struct page* page) + unlock_page(page); + return 0; + error: ++ nfs_readdir_clear_array(page); + unlock_page(page); + return ret; + } +@@ -689,8 +702,6 @@ int nfs_readdir_filler(void *data, struct page* page) + static + void cache_page_release(nfs_readdir_descriptor_t *desc) + { +- if (!desc->page->mapping) +- nfs_readdir_clear_array(desc->page); + put_page(desc->page); + desc->page = NULL; + } +@@ -704,19 +715,28 @@ struct page *get_cache_page(nfs_readdir_descriptor_t *desc) + + /* + * Returns 0 if desc->dir_cookie was found on page desc->page_index ++ * and locks the page to prevent removal from the page cache. + */ + static +-int find_cache_page(nfs_readdir_descriptor_t *desc) ++int find_and_lock_cache_page(nfs_readdir_descriptor_t *desc) + { + int res; + + desc->page = get_cache_page(desc); + if (IS_ERR(desc->page)) + return PTR_ERR(desc->page); +- +- res = nfs_readdir_search_array(desc); ++ res = lock_page_killable(desc->page); + if (res != 0) +- cache_page_release(desc); ++ goto error; ++ res = -EAGAIN; ++ if (desc->page->mapping != NULL) { ++ res = nfs_readdir_search_array(desc); ++ if (res == 0) ++ return 0; ++ } ++ unlock_page(desc->page); ++error: ++ cache_page_release(desc); + return res; + } + +@@ -731,7 +751,7 @@ int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) + desc->last_cookie = 0; + } + do { +- res = find_cache_page(desc); ++ res = find_and_lock_cache_page(desc); + } while (res == -EAGAIN); + return res; + } +@@ -770,7 +790,6 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc) + desc->eof = true; + + kunmap(desc->page); +- cache_page_release(desc); + dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n", + (unsigned long long)*desc->dir_cookie, res); + return res; +@@ -816,13 +835,13 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc) + + status = nfs_do_filldir(desc); + ++ out_release: ++ nfs_readdir_clear_array(desc->page); ++ cache_page_release(desc); + out: + dfprintk(DIRCACHE, "NFS: %s: returns %d\n", + __func__, status); + return status; +- out_release: +- cache_page_release(desc); +- goto out; + } + + /* The file offset position represents the dirent entry number. A +@@ -887,6 +906,8 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) + break; + + res = nfs_do_filldir(desc); ++ unlock_page(desc->page); ++ cache_page_release(desc); + if (res < 0) + break; + } while (!desc->eof); +diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c +index ef55e9b1cd4e..3007b8945d38 100644 +--- a/fs/nfsd/filecache.c ++++ b/fs/nfsd/filecache.c +@@ -791,6 +791,7 @@ nfsd_file_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp, + struct nfsd_file *nf, *new; + struct inode *inode; + unsigned int hashval; ++ bool retry = true; + + /* FIXME: skip this if fh_dentry is already set? */ + status = fh_verify(rqstp, fhp, S_IFREG, +@@ -826,6 +827,11 @@ wait_for_construction: + + /* Did construction of this file fail? */ + if (!test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { ++ if (!retry) { ++ status = nfserr_jukebox; ++ goto out; ++ } ++ retry = false; + nfsd_file_put_noref(nf); + goto retry; + } +diff --git a/fs/nfsd/nfs4layouts.c b/fs/nfsd/nfs4layouts.c +index 2681c70283ce..e12409eca7cc 100644 +--- a/fs/nfsd/nfs4layouts.c ++++ b/fs/nfsd/nfs4layouts.c +@@ -675,7 +675,7 @@ nfsd4_cb_layout_done(struct nfsd4_callback *cb, struct rpc_task *task) + + /* Client gets 2 lease periods to return it */ + cutoff = ktime_add_ns(task->tk_start, +- nn->nfsd4_lease * NSEC_PER_SEC * 2); ++ (u64)nn->nfsd4_lease * NSEC_PER_SEC * 2); + + if (ktime_before(now, cutoff)) { + rpc_delay(task, HZ/100); /* 10 mili-seconds */ +diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c +index 08f6eb2b73f8..1c82d7dd54df 100644 +--- a/fs/nfsd/nfs4state.c ++++ b/fs/nfsd/nfs4state.c +@@ -6550,7 +6550,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, + } + + if (fl_flags & FL_SLEEP) { +- nbl->nbl_time = jiffies; ++ nbl->nbl_time = get_seconds(); + spin_lock(&nn->blocked_locks_lock); + list_add_tail(&nbl->nbl_list, &lock_sop->lo_blocked); + list_add_tail(&nbl->nbl_lru, &nn->blocked_locks_lru); +diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h +index 46f56afb6cb8..a080789b4d13 100644 +--- a/fs/nfsd/state.h ++++ b/fs/nfsd/state.h +@@ -605,7 +605,7 @@ static inline bool nfsd4_stateid_generation_after(stateid_t *a, stateid_t *b) + struct nfsd4_blocked_lock { + struct list_head nbl_list; + struct list_head nbl_lru; +- unsigned long nbl_time; ++ time_t nbl_time; + struct file_lock nbl_lock; + struct knfsd_fh nbl_fh; + struct nfsd4_callback nbl_cb; +diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c +index cf423fea0c6f..fc38b9fe4549 100644 +--- a/fs/nfsd/vfs.c ++++ b/fs/nfsd/vfs.c +@@ -975,6 +975,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, + host_err = vfs_iter_write(file, &iter, &pos, flags); + if (host_err < 0) + goto out_nfserr; ++ *cnt = host_err; + nfsdstats.io_write += *cnt; + fsnotify_modify(file); + +diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c +index 6c7388430ad3..d4359a1df3d5 100644 +--- a/fs/ntfs/inode.c ++++ b/fs/ntfs/inode.c +@@ -2899,18 +2899,12 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr) + ia_valid |= ATTR_MTIME | ATTR_CTIME; + } + } +- if (ia_valid & ATTR_ATIME) { +- vi->i_atime = timestamp_truncate(attr->ia_atime, +- vi); +- } +- if (ia_valid & ATTR_MTIME) { +- vi->i_mtime = timestamp_truncate(attr->ia_mtime, +- vi); +- } +- if (ia_valid & ATTR_CTIME) { +- vi->i_ctime = timestamp_truncate(attr->ia_ctime, +- vi); +- } ++ if (ia_valid & ATTR_ATIME) ++ vi->i_atime = attr->ia_atime; ++ if (ia_valid & ATTR_MTIME) ++ vi->i_mtime = attr->ia_mtime; ++ if (ia_valid & ATTR_CTIME) ++ vi->i_ctime = attr->ia_ctime; + mark_inode_dirty(vi); + out: + return err; +diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c +index 9876db52913a..6cd5e4924e4d 100644 +--- a/fs/ocfs2/file.c ++++ b/fs/ocfs2/file.c +@@ -2101,17 +2101,15 @@ static int ocfs2_is_io_unaligned(struct inode *inode, size_t count, loff_t pos) + static int ocfs2_inode_lock_for_extent_tree(struct inode *inode, + struct buffer_head **di_bh, + int meta_level, +- int overwrite_io, + int write_sem, + int wait) + { + int ret = 0; + + if (wait) +- ret = ocfs2_inode_lock(inode, NULL, meta_level); ++ ret = ocfs2_inode_lock(inode, di_bh, meta_level); + else +- ret = ocfs2_try_inode_lock(inode, +- overwrite_io ? NULL : di_bh, meta_level); ++ ret = ocfs2_try_inode_lock(inode, di_bh, meta_level); + if (ret < 0) + goto out; + +@@ -2136,6 +2134,7 @@ static int ocfs2_inode_lock_for_extent_tree(struct inode *inode, + + out_unlock: + brelse(*di_bh); ++ *di_bh = NULL; + ocfs2_inode_unlock(inode, meta_level); + out: + return ret; +@@ -2177,7 +2176,6 @@ static int ocfs2_prepare_inode_for_write(struct file *file, + ret = ocfs2_inode_lock_for_extent_tree(inode, + &di_bh, + meta_level, +- overwrite_io, + write_sem, + wait); + if (ret < 0) { +@@ -2233,13 +2231,13 @@ static int ocfs2_prepare_inode_for_write(struct file *file, + &di_bh, + meta_level, + write_sem); ++ meta_level = 1; ++ write_sem = 1; + ret = ocfs2_inode_lock_for_extent_tree(inode, + &di_bh, + meta_level, +- overwrite_io, +- 1, ++ write_sem, + wait); +- write_sem = 1; + if (ret < 0) { + if (ret != -EAGAIN) + mlog_errno(ret); +diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c +index e235a635d9ec..15e4fa288475 100644 +--- a/fs/overlayfs/file.c ++++ b/fs/overlayfs/file.c +@@ -146,7 +146,7 @@ static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) + struct inode *inode = file_inode(file); + struct fd real; + const struct cred *old_cred; +- ssize_t ret; ++ loff_t ret; + + /* + * The two special cases below do not need to involve real fs, +diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c +index 47a91c9733a5..7255e6a5838f 100644 +--- a/fs/overlayfs/readdir.c ++++ b/fs/overlayfs/readdir.c +@@ -504,7 +504,13 @@ get: + if (err) + goto fail; + +- WARN_ON_ONCE(dir->d_sb->s_dev != stat.dev); ++ /* ++ * Directory inode is always on overlay st_dev. ++ * Non-dir with ovl_same_dev() could be on pseudo st_dev in case ++ * of xino bits overflow. ++ */ ++ WARN_ON_ONCE(S_ISDIR(stat.mode) && ++ dir->d_sb->s_dev != stat.dev); + ino = stat.ino; + } else if (xinobits && !OVL_TYPE_UPPER(type)) { + ino = ovl_remap_lower_ino(ino, xinobits, +diff --git a/fs/read_write.c b/fs/read_write.c +index 5bbf587f5bc1..7458fccc59e1 100644 +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -1777,10 +1777,9 @@ static int remap_verify_area(struct file *file, loff_t pos, loff_t len, + * else. Assume that the offsets have already been checked for block + * alignment. + * +- * For deduplication we always scale down to the previous block because we +- * can't meaningfully compare post-EOF contents. +- * +- * For clone we only link a partial EOF block above the destination file's EOF. ++ * For clone we only link a partial EOF block above or at the destination file's ++ * EOF. For deduplication we accept a partial EOF block only if it ends at the ++ * destination file's EOF (can not link it into the middle of a file). + * + * Shorten the request if possible. + */ +@@ -1796,8 +1795,7 @@ static int generic_remap_check_len(struct inode *inode_in, + if ((*len & blkmask) == 0) + return 0; + +- if ((remap_flags & REMAP_FILE_DEDUP) || +- pos_out + *len < i_size_read(inode_out)) ++ if (pos_out + *len < i_size_read(inode_out)) + new_len &= ~blkmask; + + if (new_len == *len) +diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c +index 0b98e3c8b461..6c0e19f7a21f 100644 +--- a/fs/ubifs/dir.c ++++ b/fs/ubifs/dir.c +@@ -228,6 +228,8 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, + if (nm.hash) { + ubifs_assert(c, fname_len(&nm) == 0); + ubifs_assert(c, fname_name(&nm) == NULL); ++ if (nm.hash & ~UBIFS_S_KEY_HASH_MASK) ++ goto done; /* ENOENT */ + dent_key_init_hash(c, &key, dir->i_ino, nm.hash); + err = ubifs_tnc_lookup_dh(c, &key, dent, nm.minor_hash); + } else { +diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c +index cd52585c8f4f..a771273fba7e 100644 +--- a/fs/ubifs/file.c ++++ b/fs/ubifs/file.c +@@ -786,7 +786,9 @@ static int ubifs_do_bulk_read(struct ubifs_info *c, struct bu_info *bu, + + if (page_offset > end_index) + break; +- page = find_or_create_page(mapping, page_offset, ra_gfp_mask); ++ page = pagecache_get_page(mapping, page_offset, ++ FGP_LOCK|FGP_ACCESSED|FGP_CREAT|FGP_NOWAIT, ++ ra_gfp_mask); + if (!page) + break; + if (!PageUptodate(page)) +@@ -1078,18 +1080,12 @@ static void do_attr_changes(struct inode *inode, const struct iattr *attr) + inode->i_uid = attr->ia_uid; + if (attr->ia_valid & ATTR_GID) + inode->i_gid = attr->ia_gid; +- if (attr->ia_valid & ATTR_ATIME) { +- inode->i_atime = timestamp_truncate(attr->ia_atime, +- inode); +- } +- if (attr->ia_valid & ATTR_MTIME) { +- inode->i_mtime = timestamp_truncate(attr->ia_mtime, +- inode); +- } +- if (attr->ia_valid & ATTR_CTIME) { +- inode->i_ctime = timestamp_truncate(attr->ia_ctime, +- inode); +- } ++ if (attr->ia_valid & ATTR_ATIME) ++ inode->i_atime = attr->ia_atime; ++ if (attr->ia_valid & ATTR_MTIME) ++ inode->i_mtime = attr->ia_mtime; ++ if (attr->ia_valid & ATTR_CTIME) ++ inode->i_ctime = attr->ia_ctime; + if (attr->ia_valid & ATTR_MODE) { + umode_t mode = attr->ia_mode; + +diff --git a/fs/ubifs/ioctl.c b/fs/ubifs/ioctl.c +index 5dc5abca11c7..eeb1be259888 100644 +--- a/fs/ubifs/ioctl.c ++++ b/fs/ubifs/ioctl.c +@@ -113,7 +113,8 @@ static int setflags(struct inode *inode, int flags) + if (err) + goto out_unlock; + +- ui->flags = ioctl2ubifs(flags); ++ ui->flags &= ~ioctl2ubifs(UBIFS_SUPPORTED_IOCTL_FLAGS); ++ ui->flags |= ioctl2ubifs(flags); + ubifs_set_inode_flags(inode); + inode->i_ctime = current_time(inode); + release = ui->dirty; +diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c +index a551eb3e9b89..6681c18e52b8 100644 +--- a/fs/ubifs/sb.c ++++ b/fs/ubifs/sb.c +@@ -161,7 +161,7 @@ static int create_default_filesystem(struct ubifs_info *c) + sup = kzalloc(ALIGN(UBIFS_SB_NODE_SZ, c->min_io_size), GFP_KERNEL); + mst = kzalloc(c->mst_node_alsz, GFP_KERNEL); + idx_node_size = ubifs_idx_node_sz(c, 1); +- idx = kzalloc(ALIGN(tmp, c->min_io_size), GFP_KERNEL); ++ idx = kzalloc(ALIGN(idx_node_size, c->min_io_size), GFP_KERNEL); + ino = kzalloc(ALIGN(UBIFS_INO_NODE_SZ, c->min_io_size), GFP_KERNEL); + cs = kzalloc(ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size), GFP_KERNEL); + +diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c +index 5e1e8ec0589e..7fc2f3f07c16 100644 +--- a/fs/ubifs/super.c ++++ b/fs/ubifs/super.c +@@ -1599,6 +1599,7 @@ out_free: + vfree(c->ileb_buf); + vfree(c->sbuf); + kfree(c->bottom_up_buf); ++ kfree(c->sup_node); + ubifs_debugging_exit(c); + return err; + } +@@ -1641,6 +1642,7 @@ static void ubifs_umount(struct ubifs_info *c) + vfree(c->ileb_buf); + vfree(c->sbuf); + kfree(c->bottom_up_buf); ++ kfree(c->sup_node); + ubifs_debugging_exit(c); + } + +diff --git a/fs/utimes.c b/fs/utimes.c +index 1ba3f7883870..090739322463 100644 +--- a/fs/utimes.c ++++ b/fs/utimes.c +@@ -36,14 +36,14 @@ static int utimes_common(const struct path *path, struct timespec64 *times) + if (times[0].tv_nsec == UTIME_OMIT) + newattrs.ia_valid &= ~ATTR_ATIME; + else if (times[0].tv_nsec != UTIME_NOW) { +- newattrs.ia_atime = timestamp_truncate(times[0], inode); ++ newattrs.ia_atime = times[0]; + newattrs.ia_valid |= ATTR_ATIME_SET; + } + + if (times[1].tv_nsec == UTIME_OMIT) + newattrs.ia_valid &= ~ATTR_MTIME; + else if (times[1].tv_nsec != UTIME_NOW) { +- newattrs.ia_mtime = timestamp_truncate(times[1], inode); ++ newattrs.ia_mtime = times[1]; + newattrs.ia_valid |= ATTR_MTIME_SET; + } + /* +diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h +index 04c0644006fd..c716ea81e653 100644 +--- a/include/asm-generic/tlb.h ++++ b/include/asm-generic/tlb.h +@@ -137,13 +137,6 @@ + * When used, an architecture is expected to provide __tlb_remove_table() + * which does the actual freeing of these pages. + * +- * HAVE_RCU_TABLE_NO_INVALIDATE +- * +- * This makes HAVE_RCU_TABLE_FREE avoid calling tlb_flush_mmu_tlbonly() before +- * freeing the page-table pages. This can be avoided if you use +- * HAVE_RCU_TABLE_FREE and your architecture does _NOT_ use the Linux +- * page-tables natively. +- * + * MMU_GATHER_NO_RANGE + * + * Use this if your architecture lacks an efficient flush_tlb_range(). +@@ -189,8 +182,23 @@ struct mmu_table_batch { + + extern void tlb_remove_table(struct mmu_gather *tlb, void *table); + ++/* ++ * This allows an architecture that does not use the linux page-tables for ++ * hardware to skip the TLBI when freeing page tables. ++ */ ++#ifndef tlb_needs_table_invalidate ++#define tlb_needs_table_invalidate() (true) ++#endif ++ ++#else ++ ++#ifdef tlb_needs_table_invalidate ++#error tlb_needs_table_invalidate() requires HAVE_RCU_TABLE_FREE + #endif + ++#endif /* CONFIG_HAVE_RCU_TABLE_FREE */ ++ ++ + #ifndef CONFIG_HAVE_MMU_GATHER_NO_GATHER + /* + * If we can't allocate a page to make a big batch of page pointers +diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h +index 97967ce06de3..f88197c1ffc2 100644 +--- a/include/linux/backing-dev.h ++++ b/include/linux/backing-dev.h +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -504,4 +505,13 @@ static inline int bdi_rw_congested(struct backing_dev_info *bdi) + (1 << WB_async_congested)); + } + ++extern const char *bdi_unknown_name; ++ ++static inline const char *bdi_dev_name(struct backing_dev_info *bdi) ++{ ++ if (!bdi || !bdi->dev) ++ return bdi_unknown_name; ++ return dev_name(bdi->dev); ++} ++ + #endif /* _LINUX_BACKING_DEV_H */ +diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h +index 31b1b0e03df8..018dce868de6 100644 +--- a/include/linux/cpufreq.h ++++ b/include/linux/cpufreq.h +@@ -148,6 +148,20 @@ struct cpufreq_policy { + struct notifier_block nb_max; + }; + ++/* ++ * Used for passing new cpufreq policy data to the cpufreq driver's ->verify() ++ * callback for sanitization. That callback is only expected to modify the min ++ * and max values, if necessary, and specifically it must not update the ++ * frequency table. ++ */ ++struct cpufreq_policy_data { ++ struct cpufreq_cpuinfo cpuinfo; ++ struct cpufreq_frequency_table *freq_table; ++ unsigned int cpu; ++ unsigned int min; /* in kHz */ ++ unsigned int max; /* in kHz */ ++}; ++ + struct cpufreq_freqs { + struct cpufreq_policy *policy; + unsigned int old; +@@ -201,8 +215,6 @@ u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy); + struct cpufreq_policy *cpufreq_cpu_acquire(unsigned int cpu); + void cpufreq_cpu_release(struct cpufreq_policy *policy); + int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu); +-int cpufreq_set_policy(struct cpufreq_policy *policy, +- struct cpufreq_policy *new_policy); + void refresh_frequency_limits(struct cpufreq_policy *policy); + void cpufreq_update_policy(unsigned int cpu); + void cpufreq_update_limits(unsigned int cpu); +@@ -284,7 +296,7 @@ struct cpufreq_driver { + + /* needed by all drivers */ + int (*init)(struct cpufreq_policy *policy); +- int (*verify)(struct cpufreq_policy *policy); ++ int (*verify)(struct cpufreq_policy_data *policy); + + /* define one out of two */ + int (*setpolicy)(struct cpufreq_policy *policy); +@@ -415,8 +427,9 @@ static inline int cpufreq_thermal_control_enabled(struct cpufreq_driver *drv) + (drv->flags & CPUFREQ_IS_COOLING_DEV); + } + +-static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, +- unsigned int min, unsigned int max) ++static inline void cpufreq_verify_within_limits(struct cpufreq_policy_data *policy, ++ unsigned int min, ++ unsigned int max) + { + if (policy->min < min) + policy->min = min; +@@ -432,10 +445,10 @@ static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, + } + + static inline void +-cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy) ++cpufreq_verify_within_cpu_limits(struct cpufreq_policy_data *policy) + { + cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, +- policy->cpuinfo.max_freq); ++ policy->cpuinfo.max_freq); + } + + #ifdef CONFIG_CPU_FREQ +@@ -513,6 +526,7 @@ static inline unsigned long cpufreq_scale(unsigned long old, u_int div, + * CPUFREQ GOVERNORS * + *********************************************************************/ + ++#define CPUFREQ_POLICY_UNKNOWN (0) + /* + * If (cpufreq_driver->target) exists, the ->governor decides what frequency + * within the limits is used. If (cpufreq_driver->setpolicy> exists, these +@@ -684,9 +698,9 @@ static inline void dev_pm_opp_free_cpufreq_table(struct device *dev, + int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, + struct cpufreq_frequency_table *table); + +-int cpufreq_frequency_table_verify(struct cpufreq_policy *policy, ++int cpufreq_frequency_table_verify(struct cpufreq_policy_data *policy, + struct cpufreq_frequency_table *table); +-int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy); ++int cpufreq_generic_frequency_table_verify(struct cpufreq_policy_data *policy); + + int cpufreq_table_index_unsorted(struct cpufreq_policy *policy, + unsigned int target_freq, +diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h +index ffcc7724ca21..dc4fd8a6644d 100644 +--- a/include/linux/eventfd.h ++++ b/include/linux/eventfd.h +@@ -12,6 +12,8 @@ + #include + #include + #include ++#include ++#include + + /* + * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining +@@ -40,6 +42,13 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n); + int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait, + __u64 *cnt); + ++DECLARE_PER_CPU(int, eventfd_wake_count); ++ ++static inline bool eventfd_signal_count(void) ++{ ++ return this_cpu_read(eventfd_wake_count); ++} ++ + #else /* CONFIG_EVENTFD */ + + /* +@@ -68,6 +77,11 @@ static inline int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, + return -ENOSYS; + } + ++static inline bool eventfd_signal_count(void) ++{ ++ return false; ++} ++ + #endif + + #endif /* _LINUX_EVENTFD_H */ +diff --git a/include/linux/irq.h b/include/linux/irq.h +index fb301cf29148..f8755e5fcd74 100644 +--- a/include/linux/irq.h ++++ b/include/linux/irq.h +@@ -209,6 +209,8 @@ struct irq_data { + * IRQD_SINGLE_TARGET - IRQ allows only a single affinity target + * IRQD_DEFAULT_TRIGGER_SET - Expected trigger already been set + * IRQD_CAN_RESERVE - Can use reservation mode ++ * IRQD_MSI_NOMASK_QUIRK - Non-maskable MSI quirk for affinity change ++ * required + */ + enum { + IRQD_TRIGGER_MASK = 0xf, +@@ -231,6 +233,7 @@ enum { + IRQD_SINGLE_TARGET = (1 << 24), + IRQD_DEFAULT_TRIGGER_SET = (1 << 25), + IRQD_CAN_RESERVE = (1 << 26), ++ IRQD_MSI_NOMASK_QUIRK = (1 << 27), + }; + + #define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors) +@@ -390,6 +393,21 @@ static inline bool irqd_can_reserve(struct irq_data *d) + return __irqd_to_state(d) & IRQD_CAN_RESERVE; + } + ++static inline void irqd_set_msi_nomask_quirk(struct irq_data *d) ++{ ++ __irqd_to_state(d) |= IRQD_MSI_NOMASK_QUIRK; ++} ++ ++static inline void irqd_clr_msi_nomask_quirk(struct irq_data *d) ++{ ++ __irqd_to_state(d) &= ~IRQD_MSI_NOMASK_QUIRK; ++} ++ ++static inline bool irqd_msi_nomask_quirk(struct irq_data *d) ++{ ++ return __irqd_to_state(d) & IRQD_MSI_NOMASK_QUIRK; ++} ++ + #undef __irqd_to_state + + static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) +diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h +index 583e7abd07f9..aba5ada373d6 100644 +--- a/include/linux/irqdomain.h ++++ b/include/linux/irqdomain.h +@@ -205,6 +205,13 @@ enum { + /* Irq domain implements MSI remapping */ + IRQ_DOMAIN_FLAG_MSI_REMAP = (1 << 5), + ++ /* ++ * Quirk to handle MSI implementations which do not provide ++ * masking. Currently known to affect x86, but partially ++ * handled in core code. ++ */ ++ IRQ_DOMAIN_MSI_NOMASK_QUIRK = (1 << 6), ++ + /* + * Flags starting from IRQ_DOMAIN_FLAG_NONCORE are reserved + * for implementation specific purposes and ignored by the +diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h +index d41c521a39da..b81f0f1ded5f 100644 +--- a/include/linux/kvm_host.h ++++ b/include/linux/kvm_host.h +@@ -204,7 +204,7 @@ struct kvm_async_pf { + struct list_head queue; + struct kvm_vcpu *vcpu; + struct mm_struct *mm; +- gva_t gva; ++ gpa_t cr2_or_gpa; + unsigned long addr; + struct kvm_arch_async_pf arch; + bool wakeup_all; +@@ -212,8 +212,8 @@ struct kvm_async_pf { + + void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu); + void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu); +-int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, +- struct kvm_arch_async_pf *arch); ++int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, ++ unsigned long hva, struct kvm_arch_async_pf *arch); + int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); + #endif + +@@ -728,6 +728,7 @@ void kvm_set_pfn_dirty(kvm_pfn_t pfn); + void kvm_set_pfn_accessed(kvm_pfn_t pfn); + void kvm_get_pfn(kvm_pfn_t pfn); + ++void kvm_release_pfn(kvm_pfn_t pfn, bool dirty, struct gfn_to_pfn_cache *cache); + int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, + int len); + int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, +@@ -750,7 +751,7 @@ int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); + int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); + struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); + bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); +-unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn); ++unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn); + void mark_page_dirty(struct kvm *kvm, gfn_t gfn); + + struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu); +@@ -758,8 +759,12 @@ struct kvm_memory_slot *kvm_vcpu_gfn_to_memslot(struct kvm_vcpu *vcpu, gfn_t gfn + kvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn); + kvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn); + int kvm_vcpu_map(struct kvm_vcpu *vcpu, gpa_t gpa, struct kvm_host_map *map); ++int kvm_map_gfn(struct kvm_vcpu *vcpu, gfn_t gfn, struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, bool atomic); + struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn); + void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty); ++int kvm_unmap_gfn(struct kvm_vcpu *vcpu, struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, bool dirty, bool atomic); + unsigned long kvm_vcpu_gfn_to_hva(struct kvm_vcpu *vcpu, gfn_t gfn); + unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *writable); + int kvm_vcpu_read_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, void *data, int offset, +diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h +index bde5374ae021..2382cb58969d 100644 +--- a/include/linux/kvm_types.h ++++ b/include/linux/kvm_types.h +@@ -18,7 +18,7 @@ struct kvm_memslots; + + enum kvm_mr_change; + +-#include ++#include + + /* + * Address types: +@@ -49,4 +49,11 @@ struct gfn_to_hva_cache { + struct kvm_memory_slot *memslot; + }; + ++struct gfn_to_pfn_cache { ++ u64 generation; ++ gfn_t gfn; ++ kvm_pfn_t pfn; ++ bool dirty; ++}; ++ + #endif /* __KVM_TYPES_H__ */ +diff --git a/include/linux/mfd/rohm-bd70528.h b/include/linux/mfd/rohm-bd70528.h +index 1013e60c5b25..b0109ee6dae2 100644 +--- a/include/linux/mfd/rohm-bd70528.h ++++ b/include/linux/mfd/rohm-bd70528.h +@@ -317,7 +317,7 @@ enum { + #define BD70528_MASK_RTC_MINUTE 0x7f + #define BD70528_MASK_RTC_HOUR_24H 0x80 + #define BD70528_MASK_RTC_HOUR_PM 0x20 +-#define BD70528_MASK_RTC_HOUR 0x1f ++#define BD70528_MASK_RTC_HOUR 0x3f + #define BD70528_MASK_RTC_DAY 0x3f + #define BD70528_MASK_RTC_WEEK 0x07 + #define BD70528_MASK_RTC_MONTH 0x1f +diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h +index 0836fe232f97..0cdc8d12785a 100644 +--- a/include/linux/mlx5/mlx5_ifc.h ++++ b/include/linux/mlx5/mlx5_ifc.h +@@ -1417,14 +1417,15 @@ struct mlx5_ifc_cmd_hca_cap_bits { + + u8 reserved_at_440[0x20]; + +- u8 tls[0x1]; +- u8 reserved_at_461[0x2]; ++ u8 reserved_at_460[0x3]; + u8 log_max_uctx[0x5]; + u8 reserved_at_468[0x3]; + u8 log_max_umem[0x5]; + u8 max_num_eqs[0x10]; + +- u8 reserved_at_480[0x3]; ++ u8 reserved_at_480[0x1]; ++ u8 tls_tx[0x1]; ++ u8 reserved_at_482[0x1]; + u8 log_max_l2_table[0x5]; + u8 reserved_at_488[0x8]; + u8 log_uar_page_sz[0x10]; +diff --git a/include/linux/padata.h b/include/linux/padata.h +index 23717eeaad23..cccab7a59787 100644 +--- a/include/linux/padata.h ++++ b/include/linux/padata.h +@@ -9,6 +9,7 @@ + #ifndef PADATA_H + #define PADATA_H + ++#include + #include + #include + #include +@@ -98,7 +99,7 @@ struct padata_cpumask { + * struct parallel_data - Internal control structure, covers everything + * that depends on the cpumask in use. + * +- * @pinst: padata instance. ++ * @sh: padata_shell object. + * @pqueue: percpu padata queues used for parallelization. + * @squeue: percpu padata queues used for serialuzation. + * @reorder_objects: Number of objects waiting in the reorder queues. +@@ -111,7 +112,7 @@ struct padata_cpumask { + * @lock: Reorder lock. + */ + struct parallel_data { +- struct padata_instance *pinst; ++ struct padata_shell *ps; + struct padata_parallel_queue __percpu *pqueue; + struct padata_serial_queue __percpu *squeue; + atomic_t reorder_objects; +@@ -124,14 +125,33 @@ struct parallel_data { + spinlock_t lock ____cacheline_aligned; + }; + ++/** ++ * struct padata_shell - Wrapper around struct parallel_data, its ++ * purpose is to allow the underlying control structure to be replaced ++ * on the fly using RCU. ++ * ++ * @pinst: padat instance. ++ * @pd: Actual parallel_data structure which may be substituted on the fly. ++ * @opd: Pointer to old pd to be freed by padata_replace. ++ * @list: List entry in padata_instance list. ++ */ ++struct padata_shell { ++ struct padata_instance *pinst; ++ struct parallel_data __rcu *pd; ++ struct parallel_data *opd; ++ struct list_head list; ++}; ++ + /** + * struct padata_instance - The overall control structure. + * + * @cpu_notifier: cpu hotplug notifier. + * @parallel_wq: The workqueue used for parallel work. + * @serial_wq: The workqueue used for serial work. +- * @pd: The internal control structure. ++ * @pslist: List of padata_shell objects attached to this instance. + * @cpumask: User supplied cpumasks for parallel and serial works. ++ * @rcpumask: Actual cpumasks based on user cpumask and cpu_online_mask. ++ * @omask: Temporary storage used to compute the notification mask. + * @cpumask_change_notifier: Notifiers chain for user-defined notify + * callbacks that will be called when either @pcpu or @cbcpu + * or both cpumasks change. +@@ -143,8 +163,10 @@ struct padata_instance { + struct hlist_node node; + struct workqueue_struct *parallel_wq; + struct workqueue_struct *serial_wq; +- struct parallel_data *pd; ++ struct list_head pslist; + struct padata_cpumask cpumask; ++ struct padata_cpumask rcpumask; ++ cpumask_var_t omask; + struct blocking_notifier_head cpumask_change_notifier; + struct kobject kobj; + struct mutex lock; +@@ -156,7 +178,9 @@ struct padata_instance { + + extern struct padata_instance *padata_alloc_possible(const char *name); + extern void padata_free(struct padata_instance *pinst); +-extern int padata_do_parallel(struct padata_instance *pinst, ++extern struct padata_shell *padata_alloc_shell(struct padata_instance *pinst); ++extern void padata_free_shell(struct padata_shell *ps); ++extern int padata_do_parallel(struct padata_shell *ps, + struct padata_priv *padata, int *cb_cpu); + extern void padata_do_serial(struct padata_priv *padata); + extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, +diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h +index a6fabd865211..176bfbd52d97 100644 +--- a/include/linux/percpu-defs.h ++++ b/include/linux/percpu-defs.h +@@ -175,8 +175,7 @@ + * Declaration/definition used for per-CPU variables that should be accessed + * as decrypted when memory encryption is enabled in the guest. + */ +-#if defined(CONFIG_VIRTUALIZATION) && defined(CONFIG_AMD_MEM_ENCRYPT) +- ++#ifdef CONFIG_AMD_MEM_ENCRYPT + #define DECLARE_PER_CPU_DECRYPTED(type, name) \ + DECLARE_PER_CPU_SECTION(type, name, "..decrypted") + +diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h +index 337a46391527..6a92fd3105a3 100644 +--- a/include/linux/regulator/consumer.h ++++ b/include/linux/regulator/consumer.h +@@ -287,6 +287,8 @@ void regulator_bulk_set_supply_names(struct regulator_bulk_data *consumers, + const char *const *supply_names, + unsigned int num_supplies); + ++bool regulator_is_equal(struct regulator *reg1, struct regulator *reg2); ++ + #else + + /* +@@ -593,6 +595,11 @@ regulator_bulk_set_supply_names(struct regulator_bulk_data *consumers, + { + } + ++static inline bool ++regulator_is_equal(struct regulator *reg1, struct regulator *reg2) ++{ ++ return false; ++} + #endif + + static inline int regulator_set_voltage_triplet(struct regulator *regulator, +diff --git a/include/media/v4l2-rect.h b/include/media/v4l2-rect.h +index c86474dc7b55..8800a640c224 100644 +--- a/include/media/v4l2-rect.h ++++ b/include/media/v4l2-rect.h +@@ -63,10 +63,10 @@ static inline void v4l2_rect_map_inside(struct v4l2_rect *r, + r->left = boundary->left; + if (r->top < boundary->top) + r->top = boundary->top; +- if (r->left + r->width > boundary->width) +- r->left = boundary->width - r->width; +- if (r->top + r->height > boundary->height) +- r->top = boundary->height - r->height; ++ if (r->left + r->width > boundary->left + boundary->width) ++ r->left = boundary->left + boundary->width - r->width; ++ if (r->top + r->height > boundary->top + boundary->height) ++ r->top = boundary->top + boundary->height - r->height; + } + + /** +diff --git a/include/net/ipx.h b/include/net/ipx.h +index baf090390998..9d1342807b59 100644 +--- a/include/net/ipx.h ++++ b/include/net/ipx.h +@@ -47,11 +47,6 @@ struct ipxhdr { + /* From af_ipx.c */ + extern int sysctl_ipx_pprop_broadcasting; + +-static __inline__ struct ipxhdr *ipx_hdr(struct sk_buff *skb) +-{ +- return (struct ipxhdr *)skb_transport_header(skb); +-} +- + struct ipx_interface { + /* IPX address */ + __be32 if_netnum; +diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h +index e05b95e83d5a..fb9dce4c6928 100644 +--- a/include/sound/hdaudio.h ++++ b/include/sound/hdaudio.h +@@ -8,6 +8,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -330,6 +331,7 @@ struct hdac_bus { + bool chip_init:1; /* h/w initialized */ + + /* behavior flags */ ++ bool aligned_mmio:1; /* aligned MMIO access */ + bool sync_write:1; /* sync after verb write */ + bool use_posbuf:1; /* use position buffer */ + bool snoop:1; /* enable snooping */ +@@ -405,34 +407,61 @@ void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus); + unsigned int snd_hdac_aligned_read(void __iomem *addr, unsigned int mask); + void snd_hdac_aligned_write(unsigned int val, void __iomem *addr, + unsigned int mask); +-#define snd_hdac_reg_writeb(v, addr) snd_hdac_aligned_write(v, addr, 0xff) +-#define snd_hdac_reg_writew(v, addr) snd_hdac_aligned_write(v, addr, 0xffff) +-#define snd_hdac_reg_readb(addr) snd_hdac_aligned_read(addr, 0xff) +-#define snd_hdac_reg_readw(addr) snd_hdac_aligned_read(addr, 0xffff) +-#else /* CONFIG_SND_HDA_ALIGNED_MMIO */ +-#define snd_hdac_reg_writeb(val, addr) writeb(val, addr) +-#define snd_hdac_reg_writew(val, addr) writew(val, addr) +-#define snd_hdac_reg_readb(addr) readb(addr) +-#define snd_hdac_reg_readw(addr) readw(addr) +-#endif /* CONFIG_SND_HDA_ALIGNED_MMIO */ +-#define snd_hdac_reg_writel(val, addr) writel(val, addr) +-#define snd_hdac_reg_readl(addr) readl(addr) ++#define snd_hdac_aligned_mmio(bus) (bus)->aligned_mmio ++#else ++#define snd_hdac_aligned_mmio(bus) false ++#define snd_hdac_aligned_read(addr, mask) 0 ++#define snd_hdac_aligned_write(val, addr, mask) do {} while (0) ++#endif ++ ++static inline void snd_hdac_reg_writeb(struct hdac_bus *bus, void __iomem *addr, ++ u8 val) ++{ ++ if (snd_hdac_aligned_mmio(bus)) ++ snd_hdac_aligned_write(val, addr, 0xff); ++ else ++ writeb(val, addr); ++} ++ ++static inline void snd_hdac_reg_writew(struct hdac_bus *bus, void __iomem *addr, ++ u16 val) ++{ ++ if (snd_hdac_aligned_mmio(bus)) ++ snd_hdac_aligned_write(val, addr, 0xffff); ++ else ++ writew(val, addr); ++} ++ ++static inline u8 snd_hdac_reg_readb(struct hdac_bus *bus, void __iomem *addr) ++{ ++ return snd_hdac_aligned_mmio(bus) ? ++ snd_hdac_aligned_read(addr, 0xff) : readb(addr); ++} ++ ++static inline u16 snd_hdac_reg_readw(struct hdac_bus *bus, void __iomem *addr) ++{ ++ return snd_hdac_aligned_mmio(bus) ? ++ snd_hdac_aligned_read(addr, 0xffff) : readw(addr); ++} ++ ++#define snd_hdac_reg_writel(bus, addr, val) writel(val, addr) ++#define snd_hdac_reg_readl(bus, addr) readl(addr) + + /* + * macros for easy use + */ + #define _snd_hdac_chip_writeb(chip, reg, value) \ +- snd_hdac_reg_writeb(value, (chip)->remap_addr + (reg)) ++ snd_hdac_reg_writeb(chip, (chip)->remap_addr + (reg), value) + #define _snd_hdac_chip_readb(chip, reg) \ +- snd_hdac_reg_readb((chip)->remap_addr + (reg)) ++ snd_hdac_reg_readb(chip, (chip)->remap_addr + (reg)) + #define _snd_hdac_chip_writew(chip, reg, value) \ +- snd_hdac_reg_writew(value, (chip)->remap_addr + (reg)) ++ snd_hdac_reg_writew(chip, (chip)->remap_addr + (reg), value) + #define _snd_hdac_chip_readw(chip, reg) \ +- snd_hdac_reg_readw((chip)->remap_addr + (reg)) ++ snd_hdac_reg_readw(chip, (chip)->remap_addr + (reg)) + #define _snd_hdac_chip_writel(chip, reg, value) \ +- snd_hdac_reg_writel(value, (chip)->remap_addr + (reg)) ++ snd_hdac_reg_writel(chip, (chip)->remap_addr + (reg), value) + #define _snd_hdac_chip_readl(chip, reg) \ +- snd_hdac_reg_readl((chip)->remap_addr + (reg)) ++ snd_hdac_reg_readl(chip, (chip)->remap_addr + (reg)) + + /* read/write a register, pass without AZX_REG_ prefix */ + #define snd_hdac_chip_writel(chip, reg, value) \ +@@ -540,17 +569,17 @@ int snd_hdac_get_stream_stripe_ctl(struct hdac_bus *bus, + */ + /* read/write a register, pass without AZX_REG_ prefix */ + #define snd_hdac_stream_writel(dev, reg, value) \ +- snd_hdac_reg_writel(value, (dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_writel((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) + #define snd_hdac_stream_writew(dev, reg, value) \ +- snd_hdac_reg_writew(value, (dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_writew((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) + #define snd_hdac_stream_writeb(dev, reg, value) \ +- snd_hdac_reg_writeb(value, (dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_writeb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) + #define snd_hdac_stream_readl(dev, reg) \ +- snd_hdac_reg_readl((dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_readl((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) + #define snd_hdac_stream_readw(dev, reg) \ +- snd_hdac_reg_readw((dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_readw((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) + #define snd_hdac_stream_readb(dev, reg) \ +- snd_hdac_reg_readb((dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_readb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) + + /* update a register, pass without AZX_REG_ prefix */ + #define snd_hdac_stream_updatel(dev, reg, mask, val) \ +diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h +index c2ce6480b4b1..66282552db20 100644 +--- a/include/trace/events/writeback.h ++++ b/include/trace/events/writeback.h +@@ -67,8 +67,8 @@ DECLARE_EVENT_CLASS(writeback_page_template, + + TP_fast_assign( + strscpy_pad(__entry->name, +- mapping ? dev_name(inode_to_bdi(mapping->host)->dev) : "(unknown)", +- 32); ++ bdi_dev_name(mapping ? inode_to_bdi(mapping->host) : ++ NULL), 32); + __entry->ino = mapping ? mapping->host->i_ino : 0; + __entry->index = page->index; + ), +@@ -111,8 +111,7 @@ DECLARE_EVENT_CLASS(writeback_dirty_inode_template, + struct backing_dev_info *bdi = inode_to_bdi(inode); + + /* may be called for files on pseudo FSes w/ unregistered bdi */ +- strscpy_pad(__entry->name, +- bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32); ++ strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); + __entry->ino = inode->i_ino; + __entry->state = inode->i_state; + __entry->flags = flags; +@@ -193,7 +192,7 @@ TRACE_EVENT(inode_foreign_history, + ), + + TP_fast_assign( +- strncpy(__entry->name, dev_name(inode_to_bdi(inode)->dev), 32); ++ strncpy(__entry->name, bdi_dev_name(inode_to_bdi(inode)), 32); + __entry->ino = inode->i_ino; + __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); + __entry->history = history; +@@ -222,7 +221,7 @@ TRACE_EVENT(inode_switch_wbs, + ), + + TP_fast_assign( +- strncpy(__entry->name, dev_name(old_wb->bdi->dev), 32); ++ strncpy(__entry->name, bdi_dev_name(old_wb->bdi), 32); + __entry->ino = inode->i_ino; + __entry->old_cgroup_ino = __trace_wb_assign_cgroup(old_wb); + __entry->new_cgroup_ino = __trace_wb_assign_cgroup(new_wb); +@@ -255,7 +254,7 @@ TRACE_EVENT(track_foreign_dirty, + struct address_space *mapping = page_mapping(page); + struct inode *inode = mapping ? mapping->host : NULL; + +- strncpy(__entry->name, dev_name(wb->bdi->dev), 32); ++ strncpy(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->bdi_id = wb->bdi->id; + __entry->ino = inode ? inode->i_ino : 0; + __entry->memcg_id = wb->memcg_css->id; +@@ -288,7 +287,7 @@ TRACE_EVENT(flush_foreign, + ), + + TP_fast_assign( +- strncpy(__entry->name, dev_name(wb->bdi->dev), 32); ++ strncpy(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); + __entry->frn_bdi_id = frn_bdi_id; + __entry->frn_memcg_id = frn_memcg_id; +@@ -318,7 +317,7 @@ DECLARE_EVENT_CLASS(writeback_write_inode_template, + + TP_fast_assign( + strscpy_pad(__entry->name, +- dev_name(inode_to_bdi(inode)->dev), 32); ++ bdi_dev_name(inode_to_bdi(inode)), 32); + __entry->ino = inode->i_ino; + __entry->sync_mode = wbc->sync_mode; + __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); +@@ -361,9 +360,7 @@ DECLARE_EVENT_CLASS(writeback_work_class, + __field(unsigned int, cgroup_ino) + ), + TP_fast_assign( +- strscpy_pad(__entry->name, +- wb->bdi->dev ? dev_name(wb->bdi->dev) : +- "(unknown)", 32); ++ strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->nr_pages = work->nr_pages; + __entry->sb_dev = work->sb ? work->sb->s_dev : 0; + __entry->sync_mode = work->sync_mode; +@@ -416,7 +413,7 @@ DECLARE_EVENT_CLASS(writeback_class, + __field(unsigned int, cgroup_ino) + ), + TP_fast_assign( +- strscpy_pad(__entry->name, dev_name(wb->bdi->dev), 32); ++ strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); + ), + TP_printk("bdi %s: cgroup_ino=%u", +@@ -438,7 +435,7 @@ TRACE_EVENT(writeback_bdi_register, + __array(char, name, 32) + ), + TP_fast_assign( +- strscpy_pad(__entry->name, dev_name(bdi->dev), 32); ++ strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); + ), + TP_printk("bdi %s", + __entry->name +@@ -463,7 +460,7 @@ DECLARE_EVENT_CLASS(wbc_class, + ), + + TP_fast_assign( +- strscpy_pad(__entry->name, dev_name(bdi->dev), 32); ++ strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); + __entry->nr_to_write = wbc->nr_to_write; + __entry->pages_skipped = wbc->pages_skipped; + __entry->sync_mode = wbc->sync_mode; +@@ -514,7 +511,7 @@ TRACE_EVENT(writeback_queue_io, + ), + TP_fast_assign( + unsigned long *older_than_this = work->older_than_this; +- strscpy_pad(__entry->name, dev_name(wb->bdi->dev), 32); ++ strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->older = older_than_this ? *older_than_this : 0; + __entry->age = older_than_this ? + (jiffies - *older_than_this) * 1000 / HZ : -1; +@@ -600,7 +597,7 @@ TRACE_EVENT(bdi_dirty_ratelimit, + ), + + TP_fast_assign( +- strscpy_pad(__entry->bdi, dev_name(wb->bdi->dev), 32); ++ strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32); + __entry->write_bw = KBps(wb->write_bandwidth); + __entry->avg_write_bw = KBps(wb->avg_write_bandwidth); + __entry->dirty_rate = KBps(dirty_rate); +@@ -665,7 +662,7 @@ TRACE_EVENT(balance_dirty_pages, + + TP_fast_assign( + unsigned long freerun = (thresh + bg_thresh) / 2; +- strscpy_pad(__entry->bdi, dev_name(wb->bdi->dev), 32); ++ strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32); + + __entry->limit = global_wb_domain.dirty_limit; + __entry->setpoint = (global_wb_domain.dirty_limit + +@@ -726,7 +723,7 @@ TRACE_EVENT(writeback_sb_inodes_requeue, + + TP_fast_assign( + strscpy_pad(__entry->name, +- dev_name(inode_to_bdi(inode)->dev), 32); ++ bdi_dev_name(inode_to_bdi(inode)), 32); + __entry->ino = inode->i_ino; + __entry->state = inode->i_state; + __entry->dirtied_when = inode->dirtied_when; +@@ -800,7 +797,7 @@ DECLARE_EVENT_CLASS(writeback_single_inode_template, + + TP_fast_assign( + strscpy_pad(__entry->name, +- dev_name(inode_to_bdi(inode)->dev), 32); ++ bdi_dev_name(inode_to_bdi(inode)), 32); + __entry->ino = inode->i_ino; + __entry->state = inode->i_state; + __entry->dirtied_when = inode->dirtied_when; +diff --git a/ipc/msg.c b/ipc/msg.c +index 8dec945fa030..767587ab45a3 100644 +--- a/ipc/msg.c ++++ b/ipc/msg.c +@@ -377,7 +377,7 @@ copy_msqid_from_user(struct msqid64_ds *out, void __user *buf, int version) + * NOTE: no locks must be held, the rwsem is taken inside this function. + */ + static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, +- struct msqid64_ds *msqid64) ++ struct ipc64_perm *perm, int msg_qbytes) + { + struct kern_ipc_perm *ipcp; + struct msg_queue *msq; +@@ -387,7 +387,7 @@ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, + rcu_read_lock(); + + ipcp = ipcctl_obtain_check(ns, &msg_ids(ns), msqid, cmd, +- &msqid64->msg_perm, msqid64->msg_qbytes); ++ perm, msg_qbytes); + if (IS_ERR(ipcp)) { + err = PTR_ERR(ipcp); + goto out_unlock1; +@@ -409,18 +409,18 @@ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, + { + DEFINE_WAKE_Q(wake_q); + +- if (msqid64->msg_qbytes > ns->msg_ctlmnb && ++ if (msg_qbytes > ns->msg_ctlmnb && + !capable(CAP_SYS_RESOURCE)) { + err = -EPERM; + goto out_unlock1; + } + + ipc_lock_object(&msq->q_perm); +- err = ipc_update_perm(&msqid64->msg_perm, ipcp); ++ err = ipc_update_perm(perm, ipcp); + if (err) + goto out_unlock0; + +- msq->q_qbytes = msqid64->msg_qbytes; ++ msq->q_qbytes = msg_qbytes; + + msq->q_ctime = ktime_get_real_seconds(); + /* +@@ -601,9 +601,10 @@ static long ksys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf, int ver + case IPC_SET: + if (copy_msqid_from_user(&msqid64, buf, version)) + return -EFAULT; +- /* fallthru */ ++ return msgctl_down(ns, msqid, cmd, &msqid64.msg_perm, ++ msqid64.msg_qbytes); + case IPC_RMID: +- return msgctl_down(ns, msqid, cmd, &msqid64); ++ return msgctl_down(ns, msqid, cmd, NULL, 0); + default: + return -EINVAL; + } +@@ -735,9 +736,9 @@ static long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr, int versio + case IPC_SET: + if (copy_compat_msqid_from_user(&msqid64, uptr, version)) + return -EFAULT; +- /* fallthru */ ++ return msgctl_down(ns, msqid, cmd, &msqid64.msg_perm, msqid64.msg_qbytes); + case IPC_RMID: +- return msgctl_down(ns, msqid, cmd, &msqid64); ++ return msgctl_down(ns, msqid, cmd, NULL, 0); + default: + return -EINVAL; + } +diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c +index 3d3d61b5985b..b4b6b77f309c 100644 +--- a/kernel/bpf/devmap.c ++++ b/kernel/bpf/devmap.c +@@ -293,7 +293,8 @@ struct bpf_dtab_netdev *__dev_map_hash_lookup_elem(struct bpf_map *map, u32 key) + struct hlist_head *head = dev_map_index_hash(dtab, key); + struct bpf_dtab_netdev *dev; + +- hlist_for_each_entry_rcu(dev, head, index_hlist) ++ hlist_for_each_entry_rcu(dev, head, index_hlist, ++ lockdep_is_held(&dtab->index_lock)) + if (dev->idx == key) + return dev; + +diff --git a/kernel/events/core.c b/kernel/events/core.c +index 6c829e22bad3..15b123bdcaf5 100644 +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -5823,7 +5823,15 @@ accounting: + */ + user_lock_limit *= num_online_cpus(); + +- user_locked = atomic_long_read(&user->locked_vm) + user_extra; ++ user_locked = atomic_long_read(&user->locked_vm); ++ ++ /* ++ * sysctl_perf_event_mlock may have changed, so that ++ * user->locked_vm > user_lock_limit ++ */ ++ if (user_locked > user_lock_limit) ++ user_locked = user_lock_limit; ++ user_locked += user_extra; + + if (user_locked <= user_lock_limit) { + /* charge all to locked_vm */ +diff --git a/kernel/irq/debugfs.c b/kernel/irq/debugfs.c +index c1eccd4f6520..a949bd39e343 100644 +--- a/kernel/irq/debugfs.c ++++ b/kernel/irq/debugfs.c +@@ -114,6 +114,7 @@ static const struct irq_bit_descr irqdata_states[] = { + BIT_MASK_DESCR(IRQD_AFFINITY_MANAGED), + BIT_MASK_DESCR(IRQD_MANAGED_SHUTDOWN), + BIT_MASK_DESCR(IRQD_CAN_RESERVE), ++ BIT_MASK_DESCR(IRQD_MSI_NOMASK_QUIRK), + + BIT_MASK_DESCR(IRQD_FORWARDED_TO_VCPU), + +diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c +index dd822fd8a7d5..480df3659720 100644 +--- a/kernel/irq/irqdomain.c ++++ b/kernel/irq/irqdomain.c +@@ -1459,6 +1459,7 @@ int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg) + if (rv) { + /* Restore the original irq_data. */ + *root_irq_data = *child_irq_data; ++ kfree(child_irq_data); + goto error; + } + +diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c +index ad26fbcfbfc8..eb95f6106a1e 100644 +--- a/kernel/irq/msi.c ++++ b/kernel/irq/msi.c +@@ -453,8 +453,11 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, + continue; + + irq_data = irq_domain_get_irq_data(domain, desc->irq); +- if (!can_reserve) ++ if (!can_reserve) { + irqd_clr_can_reserve(irq_data); ++ if (domain->flags & IRQ_DOMAIN_MSI_NOMASK_QUIRK) ++ irqd_set_msi_nomask_quirk(irq_data); ++ } + ret = irq_domain_activate_irq(irq_data, can_reserve); + if (ret) + goto cleanup; +diff --git a/kernel/padata.c b/kernel/padata.c +index c3fec1413295..9c82ee4a9732 100644 +--- a/kernel/padata.c ++++ b/kernel/padata.c +@@ -35,6 +35,8 @@ + + #define MAX_OBJ_NUM 1000 + ++static void padata_free_pd(struct parallel_data *pd); ++ + static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index) + { + int cpu, target_cpu; +@@ -87,7 +89,7 @@ static void padata_parallel_worker(struct work_struct *parallel_work) + /** + * padata_do_parallel - padata parallelization function + * +- * @pinst: padata instance ++ * @ps: padatashell + * @padata: object to be parallelized + * @cb_cpu: pointer to the CPU that the serialization callback function should + * run on. If it's not in the serial cpumask of @pinst +@@ -98,16 +100,17 @@ static void padata_parallel_worker(struct work_struct *parallel_work) + * Note: Every object which is parallelized by padata_do_parallel + * must be seen by padata_do_serial. + */ +-int padata_do_parallel(struct padata_instance *pinst, ++int padata_do_parallel(struct padata_shell *ps, + struct padata_priv *padata, int *cb_cpu) + { ++ struct padata_instance *pinst = ps->pinst; + int i, cpu, cpu_index, target_cpu, err; + struct padata_parallel_queue *queue; + struct parallel_data *pd; + + rcu_read_lock_bh(); + +- pd = rcu_dereference_bh(pinst->pd); ++ pd = rcu_dereference_bh(ps->pd); + + err = -EINVAL; + if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID) +@@ -210,10 +213,10 @@ static struct padata_priv *padata_find_next(struct parallel_data *pd, + + static void padata_reorder(struct parallel_data *pd) + { ++ struct padata_instance *pinst = pd->ps->pinst; + int cb_cpu; + struct padata_priv *padata; + struct padata_serial_queue *squeue; +- struct padata_instance *pinst = pd->pinst; + struct padata_parallel_queue *next_queue; + + /* +@@ -283,6 +286,7 @@ static void padata_serial_worker(struct work_struct *serial_work) + struct padata_serial_queue *squeue; + struct parallel_data *pd; + LIST_HEAD(local_list); ++ int cnt; + + local_bh_disable(); + squeue = container_of(serial_work, struct padata_serial_queue, work); +@@ -292,6 +296,8 @@ static void padata_serial_worker(struct work_struct *serial_work) + list_replace_init(&squeue->serial.list, &local_list); + spin_unlock(&squeue->serial.lock); + ++ cnt = 0; ++ + while (!list_empty(&local_list)) { + struct padata_priv *padata; + +@@ -301,9 +307,12 @@ static void padata_serial_worker(struct work_struct *serial_work) + list_del_init(&padata->list); + + padata->serial(padata); +- atomic_dec(&pd->refcnt); ++ cnt++; + } + local_bh_enable(); ++ ++ if (atomic_sub_and_test(cnt, &pd->refcnt)) ++ padata_free_pd(pd); + } + + /** +@@ -341,36 +350,39 @@ void padata_do_serial(struct padata_priv *padata) + } + EXPORT_SYMBOL(padata_do_serial); + +-static int padata_setup_cpumasks(struct parallel_data *pd, +- const struct cpumask *pcpumask, +- const struct cpumask *cbcpumask) ++static int padata_setup_cpumasks(struct padata_instance *pinst) + { + struct workqueue_attrs *attrs; ++ int err; ++ ++ attrs = alloc_workqueue_attrs(); ++ if (!attrs) ++ return -ENOMEM; ++ ++ /* Restrict parallel_wq workers to pd->cpumask.pcpu. */ ++ cpumask_copy(attrs->cpumask, pinst->cpumask.pcpu); ++ err = apply_workqueue_attrs(pinst->parallel_wq, attrs); ++ free_workqueue_attrs(attrs); ++ ++ return err; ++} ++ ++static int pd_setup_cpumasks(struct parallel_data *pd, ++ const struct cpumask *pcpumask, ++ const struct cpumask *cbcpumask) ++{ + int err = -ENOMEM; + + if (!alloc_cpumask_var(&pd->cpumask.pcpu, GFP_KERNEL)) + goto out; +- cpumask_and(pd->cpumask.pcpu, pcpumask, cpu_online_mask); +- + if (!alloc_cpumask_var(&pd->cpumask.cbcpu, GFP_KERNEL)) + goto free_pcpu_mask; +- cpumask_and(pd->cpumask.cbcpu, cbcpumask, cpu_online_mask); +- +- attrs = alloc_workqueue_attrs(); +- if (!attrs) +- goto free_cbcpu_mask; + +- /* Restrict parallel_wq workers to pd->cpumask.pcpu. */ +- cpumask_copy(attrs->cpumask, pd->cpumask.pcpu); +- err = apply_workqueue_attrs(pd->pinst->parallel_wq, attrs); +- free_workqueue_attrs(attrs); +- if (err < 0) +- goto free_cbcpu_mask; ++ cpumask_copy(pd->cpumask.pcpu, pcpumask); ++ cpumask_copy(pd->cpumask.cbcpu, cbcpumask); + + return 0; + +-free_cbcpu_mask: +- free_cpumask_var(pd->cpumask.cbcpu); + free_pcpu_mask: + free_cpumask_var(pd->cpumask.pcpu); + out: +@@ -414,12 +426,16 @@ static void padata_init_pqueues(struct parallel_data *pd) + } + + /* Allocate and initialize the internal cpumask dependend resources. */ +-static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst, +- const struct cpumask *pcpumask, +- const struct cpumask *cbcpumask) ++static struct parallel_data *padata_alloc_pd(struct padata_shell *ps) + { ++ struct padata_instance *pinst = ps->pinst; ++ const struct cpumask *cbcpumask; ++ const struct cpumask *pcpumask; + struct parallel_data *pd; + ++ cbcpumask = pinst->rcpumask.cbcpu; ++ pcpumask = pinst->rcpumask.pcpu; ++ + pd = kzalloc(sizeof(struct parallel_data), GFP_KERNEL); + if (!pd) + goto err; +@@ -432,15 +448,15 @@ static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst, + if (!pd->squeue) + goto err_free_pqueue; + +- pd->pinst = pinst; +- if (padata_setup_cpumasks(pd, pcpumask, cbcpumask) < 0) ++ pd->ps = ps; ++ if (pd_setup_cpumasks(pd, pcpumask, cbcpumask)) + goto err_free_squeue; + + padata_init_pqueues(pd); + padata_init_squeues(pd); + atomic_set(&pd->seq_nr, -1); + atomic_set(&pd->reorder_objects, 0); +- atomic_set(&pd->refcnt, 0); ++ atomic_set(&pd->refcnt, 1); + spin_lock_init(&pd->lock); + pd->cpu = cpumask_first(pd->cpumask.pcpu); + INIT_WORK(&pd->reorder_work, invoke_padata_reorder); +@@ -466,29 +482,6 @@ static void padata_free_pd(struct parallel_data *pd) + kfree(pd); + } + +-/* Flush all objects out of the padata queues. */ +-static void padata_flush_queues(struct parallel_data *pd) +-{ +- int cpu; +- struct padata_parallel_queue *pqueue; +- struct padata_serial_queue *squeue; +- +- for_each_cpu(cpu, pd->cpumask.pcpu) { +- pqueue = per_cpu_ptr(pd->pqueue, cpu); +- flush_work(&pqueue->work); +- } +- +- if (atomic_read(&pd->reorder_objects)) +- padata_reorder(pd); +- +- for_each_cpu(cpu, pd->cpumask.cbcpu) { +- squeue = per_cpu_ptr(pd->squeue, cpu); +- flush_work(&squeue->work); +- } +- +- BUG_ON(atomic_read(&pd->refcnt) != 0); +-} +- + static void __padata_start(struct padata_instance *pinst) + { + pinst->flags |= PADATA_INIT; +@@ -502,39 +495,67 @@ static void __padata_stop(struct padata_instance *pinst) + pinst->flags &= ~PADATA_INIT; + + synchronize_rcu(); +- +- get_online_cpus(); +- padata_flush_queues(pinst->pd); +- put_online_cpus(); + } + + /* Replace the internal control structure with a new one. */ +-static void padata_replace(struct padata_instance *pinst, +- struct parallel_data *pd_new) ++static int padata_replace_one(struct padata_shell *ps) + { +- struct parallel_data *pd_old = pinst->pd; +- int notification_mask = 0; ++ struct parallel_data *pd_new; + +- pinst->flags |= PADATA_RESET; ++ pd_new = padata_alloc_pd(ps); ++ if (!pd_new) ++ return -ENOMEM; + +- rcu_assign_pointer(pinst->pd, pd_new); ++ ps->opd = rcu_dereference_protected(ps->pd, 1); ++ rcu_assign_pointer(ps->pd, pd_new); + +- synchronize_rcu(); ++ return 0; ++} ++ ++static int padata_replace(struct padata_instance *pinst, int cpu) ++{ ++ int notification_mask = 0; ++ struct padata_shell *ps; ++ int err; ++ ++ pinst->flags |= PADATA_RESET; + +- if (!cpumask_equal(pd_old->cpumask.pcpu, pd_new->cpumask.pcpu)) ++ cpumask_copy(pinst->omask, pinst->rcpumask.pcpu); ++ cpumask_and(pinst->rcpumask.pcpu, pinst->cpumask.pcpu, ++ cpu_online_mask); ++ if (cpu >= 0) ++ cpumask_clear_cpu(cpu, pinst->rcpumask.pcpu); ++ if (!cpumask_equal(pinst->omask, pinst->rcpumask.pcpu)) + notification_mask |= PADATA_CPU_PARALLEL; +- if (!cpumask_equal(pd_old->cpumask.cbcpu, pd_new->cpumask.cbcpu)) ++ ++ cpumask_copy(pinst->omask, pinst->rcpumask.cbcpu); ++ cpumask_and(pinst->rcpumask.cbcpu, pinst->cpumask.cbcpu, ++ cpu_online_mask); ++ if (cpu >= 0) ++ cpumask_clear_cpu(cpu, pinst->rcpumask.cbcpu); ++ if (!cpumask_equal(pinst->omask, pinst->rcpumask.cbcpu)) + notification_mask |= PADATA_CPU_SERIAL; + +- padata_flush_queues(pd_old); +- padata_free_pd(pd_old); ++ list_for_each_entry(ps, &pinst->pslist, list) { ++ err = padata_replace_one(ps); ++ if (err) ++ break; ++ } ++ ++ synchronize_rcu(); ++ ++ list_for_each_entry_continue_reverse(ps, &pinst->pslist, list) ++ if (atomic_dec_and_test(&ps->opd->refcnt)) ++ padata_free_pd(ps->opd); + + if (notification_mask) + blocking_notifier_call_chain(&pinst->cpumask_change_notifier, + notification_mask, +- &pd_new->cpumask); ++ &pinst->cpumask); + + pinst->flags &= ~PADATA_RESET; ++ ++ return err; + } + + /** +@@ -587,7 +608,7 @@ static int __padata_set_cpumasks(struct padata_instance *pinst, + cpumask_var_t cbcpumask) + { + int valid; +- struct parallel_data *pd; ++ int err; + + valid = padata_validate_cpumask(pinst, pcpumask); + if (!valid) { +@@ -600,19 +621,15 @@ static int __padata_set_cpumasks(struct padata_instance *pinst, + __padata_stop(pinst); + + out_replace: +- pd = padata_alloc_pd(pinst, pcpumask, cbcpumask); +- if (!pd) +- return -ENOMEM; +- + cpumask_copy(pinst->cpumask.pcpu, pcpumask); + cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); + +- padata_replace(pinst, pd); ++ err = padata_setup_cpumasks(pinst) ?: padata_replace(pinst, -1); + + if (valid) + __padata_start(pinst); + +- return 0; ++ return err; + } + + /** +@@ -695,46 +712,32 @@ EXPORT_SYMBOL(padata_stop); + + static int __padata_add_cpu(struct padata_instance *pinst, int cpu) + { +- struct parallel_data *pd; ++ int err = 0; + + if (cpumask_test_cpu(cpu, cpu_online_mask)) { +- pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu, +- pinst->cpumask.cbcpu); +- if (!pd) +- return -ENOMEM; +- +- padata_replace(pinst, pd); ++ err = padata_replace(pinst, -1); + + if (padata_validate_cpumask(pinst, pinst->cpumask.pcpu) && + padata_validate_cpumask(pinst, pinst->cpumask.cbcpu)) + __padata_start(pinst); + } + +- return 0; ++ return err; + } + + static int __padata_remove_cpu(struct padata_instance *pinst, int cpu) + { +- struct parallel_data *pd = NULL; ++ int err = 0; + + if (cpumask_test_cpu(cpu, cpu_online_mask)) { +- + if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) || + !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu)) + __padata_stop(pinst); + +- pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu, +- pinst->cpumask.cbcpu); +- if (!pd) +- return -ENOMEM; +- +- padata_replace(pinst, pd); +- +- cpumask_clear_cpu(cpu, pd->cpumask.cbcpu); +- cpumask_clear_cpu(cpu, pd->cpumask.pcpu); ++ err = padata_replace(pinst, cpu); + } + +- return 0; ++ return err; + } + + /** +@@ -817,8 +820,12 @@ static void __padata_free(struct padata_instance *pinst) + cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node); + #endif + ++ WARN_ON(!list_empty(&pinst->pslist)); ++ + padata_stop(pinst); +- padata_free_pd(pinst->pd); ++ free_cpumask_var(pinst->omask); ++ free_cpumask_var(pinst->rcpumask.cbcpu); ++ free_cpumask_var(pinst->rcpumask.pcpu); + free_cpumask_var(pinst->cpumask.pcpu); + free_cpumask_var(pinst->cpumask.cbcpu); + destroy_workqueue(pinst->serial_wq); +@@ -965,7 +972,6 @@ static struct padata_instance *padata_alloc(const char *name, + const struct cpumask *cbcpumask) + { + struct padata_instance *pinst; +- struct parallel_data *pd = NULL; + + pinst = kzalloc(sizeof(struct padata_instance), GFP_KERNEL); + if (!pinst) +@@ -993,14 +999,22 @@ static struct padata_instance *padata_alloc(const char *name, + !padata_validate_cpumask(pinst, cbcpumask)) + goto err_free_masks; + +- pd = padata_alloc_pd(pinst, pcpumask, cbcpumask); +- if (!pd) ++ if (!alloc_cpumask_var(&pinst->rcpumask.pcpu, GFP_KERNEL)) + goto err_free_masks; ++ if (!alloc_cpumask_var(&pinst->rcpumask.cbcpu, GFP_KERNEL)) ++ goto err_free_rcpumask_pcpu; ++ if (!alloc_cpumask_var(&pinst->omask, GFP_KERNEL)) ++ goto err_free_rcpumask_cbcpu; + +- rcu_assign_pointer(pinst->pd, pd); ++ INIT_LIST_HEAD(&pinst->pslist); + + cpumask_copy(pinst->cpumask.pcpu, pcpumask); + cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); ++ cpumask_and(pinst->rcpumask.pcpu, pcpumask, cpu_online_mask); ++ cpumask_and(pinst->rcpumask.cbcpu, cbcpumask, cpu_online_mask); ++ ++ if (padata_setup_cpumasks(pinst)) ++ goto err_free_omask; + + pinst->flags = 0; + +@@ -1016,6 +1030,12 @@ static struct padata_instance *padata_alloc(const char *name, + + return pinst; + ++err_free_omask: ++ free_cpumask_var(pinst->omask); ++err_free_rcpumask_cbcpu: ++ free_cpumask_var(pinst->rcpumask.cbcpu); ++err_free_rcpumask_pcpu: ++ free_cpumask_var(pinst->rcpumask.pcpu); + err_free_masks: + free_cpumask_var(pinst->cpumask.pcpu); + free_cpumask_var(pinst->cpumask.cbcpu); +@@ -1054,6 +1074,61 @@ void padata_free(struct padata_instance *pinst) + } + EXPORT_SYMBOL(padata_free); + ++/** ++ * padata_alloc_shell - Allocate and initialize padata shell. ++ * ++ * @pinst: Parent padata_instance object. ++ */ ++struct padata_shell *padata_alloc_shell(struct padata_instance *pinst) ++{ ++ struct parallel_data *pd; ++ struct padata_shell *ps; ++ ++ ps = kzalloc(sizeof(*ps), GFP_KERNEL); ++ if (!ps) ++ goto out; ++ ++ ps->pinst = pinst; ++ ++ get_online_cpus(); ++ pd = padata_alloc_pd(ps); ++ put_online_cpus(); ++ ++ if (!pd) ++ goto out_free_ps; ++ ++ mutex_lock(&pinst->lock); ++ RCU_INIT_POINTER(ps->pd, pd); ++ list_add(&ps->list, &pinst->pslist); ++ mutex_unlock(&pinst->lock); ++ ++ return ps; ++ ++out_free_ps: ++ kfree(ps); ++out: ++ return NULL; ++} ++EXPORT_SYMBOL(padata_alloc_shell); ++ ++/** ++ * padata_free_shell - free a padata shell ++ * ++ * @ps: padata shell to free ++ */ ++void padata_free_shell(struct padata_shell *ps) ++{ ++ struct padata_instance *pinst = ps->pinst; ++ ++ mutex_lock(&pinst->lock); ++ list_del(&ps->list); ++ padata_free_pd(rcu_dereference_protected(ps->pd, 1)); ++ mutex_unlock(&pinst->lock); ++ ++ kfree(ps); ++} ++EXPORT_SYMBOL(padata_free_shell); ++ + #ifdef CONFIG_HOTPLUG_CPU + + static __init int padata_driver_init(void) +diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c +index 5dffade2d7cd..21acdff3bd27 100644 +--- a/kernel/rcu/srcutree.c ++++ b/kernel/rcu/srcutree.c +@@ -530,7 +530,7 @@ static void srcu_gp_end(struct srcu_struct *ssp) + idx = rcu_seq_state(ssp->srcu_gp_seq); + WARN_ON_ONCE(idx != SRCU_STATE_SCAN2); + cbdelay = srcu_get_delay(ssp); +- ssp->srcu_last_gp_end = ktime_get_mono_fast_ns(); ++ WRITE_ONCE(ssp->srcu_last_gp_end, ktime_get_mono_fast_ns()); + rcu_seq_end(&ssp->srcu_gp_seq); + gpseq = rcu_seq_current(&ssp->srcu_gp_seq); + if (ULONG_CMP_LT(ssp->srcu_gp_seq_needed_exp, gpseq)) +@@ -762,6 +762,7 @@ static bool srcu_might_be_idle(struct srcu_struct *ssp) + unsigned long flags; + struct srcu_data *sdp; + unsigned long t; ++ unsigned long tlast; + + /* If the local srcu_data structure has callbacks, not idle. */ + local_irq_save(flags); +@@ -780,9 +781,9 @@ static bool srcu_might_be_idle(struct srcu_struct *ssp) + + /* First, see if enough time has passed since the last GP. */ + t = ktime_get_mono_fast_ns(); ++ tlast = READ_ONCE(ssp->srcu_last_gp_end); + if (exp_holdoff == 0 || +- time_in_range_open(t, ssp->srcu_last_gp_end, +- ssp->srcu_last_gp_end + exp_holdoff)) ++ time_in_range_open(t, tlast, tlast + exp_holdoff)) + return false; /* Too soon after last GP. */ + + /* Next, check for probable idleness. */ +diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h +index d632cd019597..69c5aa64fcfd 100644 +--- a/kernel/rcu/tree_exp.h ++++ b/kernel/rcu/tree_exp.h +@@ -134,7 +134,7 @@ static void __maybe_unused sync_exp_reset_tree(void) + rcu_for_each_node_breadth_first(rnp) { + raw_spin_lock_irqsave_rcu_node(rnp, flags); + WARN_ON_ONCE(rnp->expmask); +- rnp->expmask = rnp->expmaskinit; ++ WRITE_ONCE(rnp->expmask, rnp->expmaskinit); + raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + } + } +@@ -211,7 +211,7 @@ static void __rcu_report_exp_rnp(struct rcu_node *rnp, + rnp = rnp->parent; + raw_spin_lock_rcu_node(rnp); /* irqs already disabled */ + WARN_ON_ONCE(!(rnp->expmask & mask)); +- rnp->expmask &= ~mask; ++ WRITE_ONCE(rnp->expmask, rnp->expmask & ~mask); + } + } + +@@ -241,7 +241,7 @@ static void rcu_report_exp_cpu_mult(struct rcu_node *rnp, + raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + return; + } +- rnp->expmask &= ~mask; ++ WRITE_ONCE(rnp->expmask, rnp->expmask & ~mask); + __rcu_report_exp_rnp(rnp, wake, flags); /* Releases rnp->lock. */ + } + +@@ -372,12 +372,10 @@ static void sync_rcu_exp_select_node_cpus(struct work_struct *wp) + raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + + /* IPI the remaining CPUs for expedited quiescent state. */ +- for_each_leaf_node_cpu_mask(rnp, cpu, rnp->expmask) { ++ for_each_leaf_node_cpu_mask(rnp, cpu, mask_ofl_ipi) { + unsigned long mask = leaf_node_cpu_bit(rnp, cpu); + struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu); + +- if (!(mask_ofl_ipi & mask)) +- continue; + retry_ipi: + if (rcu_dynticks_in_eqs_since(rdp, rdp->exp_dynticks_snap)) { + mask_ofl_test |= mask; +@@ -491,7 +489,7 @@ static void synchronize_sched_expedited_wait(void) + struct rcu_data *rdp; + + mask = leaf_node_cpu_bit(rnp, cpu); +- if (!(rnp->expmask & mask)) ++ if (!(READ_ONCE(rnp->expmask) & mask)) + continue; + ndetected++; + rdp = per_cpu_ptr(&rcu_data, cpu); +@@ -503,7 +501,8 @@ static void synchronize_sched_expedited_wait(void) + } + pr_cont(" } %lu jiffies s: %lu root: %#lx/%c\n", + jiffies - jiffies_start, rcu_state.expedited_sequence, +- rnp_root->expmask, ".T"[!!rnp_root->exp_tasks]); ++ READ_ONCE(rnp_root->expmask), ++ ".T"[!!rnp_root->exp_tasks]); + if (ndetected) { + pr_err("blocking rcu_node structures:"); + rcu_for_each_node_breadth_first(rnp) { +@@ -513,7 +512,7 @@ static void synchronize_sched_expedited_wait(void) + continue; + pr_cont(" l=%u:%d-%d:%#lx/%c", + rnp->level, rnp->grplo, rnp->grphi, +- rnp->expmask, ++ READ_ONCE(rnp->expmask), + ".T"[!!rnp->exp_tasks]); + } + pr_cont("\n"); +@@ -521,7 +520,7 @@ static void synchronize_sched_expedited_wait(void) + rcu_for_each_leaf_node(rnp) { + for_each_leaf_node_possible_cpu(rnp, cpu) { + mask = leaf_node_cpu_bit(rnp, cpu); +- if (!(rnp->expmask & mask)) ++ if (!(READ_ONCE(rnp->expmask) & mask)) + continue; + dump_cpu_task(cpu); + } +diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h +index fa08d55f7040..f849e7429816 100644 +--- a/kernel/rcu/tree_plugin.h ++++ b/kernel/rcu/tree_plugin.h +@@ -220,7 +220,7 @@ static void rcu_preempt_ctxt_queue(struct rcu_node *rnp, struct rcu_data *rdp) + * blocked tasks. + */ + if (!rnp->gp_tasks && (blkd_state & RCU_GP_BLKD)) { +- rnp->gp_tasks = &t->rcu_node_entry; ++ WRITE_ONCE(rnp->gp_tasks, &t->rcu_node_entry); + WARN_ON_ONCE(rnp->completedqs == rnp->gp_seq); + } + if (!rnp->exp_tasks && (blkd_state & RCU_EXP_BLKD)) +@@ -340,7 +340,7 @@ EXPORT_SYMBOL_GPL(rcu_note_context_switch); + */ + static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp) + { +- return rnp->gp_tasks != NULL; ++ return READ_ONCE(rnp->gp_tasks) != NULL; + } + + /* Bias and limit values for ->rcu_read_lock_nesting. */ +@@ -493,7 +493,7 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, unsigned long flags) + trace_rcu_unlock_preempted_task(TPS("rcu_preempt"), + rnp->gp_seq, t->pid); + if (&t->rcu_node_entry == rnp->gp_tasks) +- rnp->gp_tasks = np; ++ WRITE_ONCE(rnp->gp_tasks, np); + if (&t->rcu_node_entry == rnp->exp_tasks) + rnp->exp_tasks = np; + if (IS_ENABLED(CONFIG_RCU_BOOST)) { +@@ -612,7 +612,7 @@ static void rcu_read_unlock_special(struct task_struct *t) + + t->rcu_read_unlock_special.b.exp_hint = false; + exp = (t->rcu_blocked_node && t->rcu_blocked_node->exp_tasks) || +- (rdp->grpmask & rnp->expmask) || ++ (rdp->grpmask & READ_ONCE(rnp->expmask)) || + tick_nohz_full_cpu(rdp->cpu); + // Need to defer quiescent state until everything is enabled. + if (irqs_were_disabled && use_softirq && +@@ -663,7 +663,7 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) + dump_blkd_tasks(rnp, 10); + if (rcu_preempt_has_tasks(rnp) && + (rnp->qsmaskinit || rnp->wait_blkd_tasks)) { +- rnp->gp_tasks = rnp->blkd_tasks.next; ++ WRITE_ONCE(rnp->gp_tasks, rnp->blkd_tasks.next); + t = container_of(rnp->gp_tasks, struct task_struct, + rcu_node_entry); + trace_rcu_unlock_preempted_task(TPS("rcu_preempt-GPS"), +@@ -757,7 +757,8 @@ dump_blkd_tasks(struct rcu_node *rnp, int ncheck) + pr_info("%s: %d:%d ->qsmask %#lx ->qsmaskinit %#lx ->qsmaskinitnext %#lx\n", + __func__, rnp1->grplo, rnp1->grphi, rnp1->qsmask, rnp1->qsmaskinit, rnp1->qsmaskinitnext); + pr_info("%s: ->gp_tasks %p ->boost_tasks %p ->exp_tasks %p\n", +- __func__, rnp->gp_tasks, rnp->boost_tasks, rnp->exp_tasks); ++ __func__, READ_ONCE(rnp->gp_tasks), rnp->boost_tasks, ++ rnp->exp_tasks); + pr_info("%s: ->blkd_tasks", __func__); + i = 0; + list_for_each(lhp, &rnp->blkd_tasks) { +diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c +index 451f9d05ccfe..4b11f0309eee 100644 +--- a/kernel/time/alarmtimer.c ++++ b/kernel/time/alarmtimer.c +@@ -88,6 +88,7 @@ static int alarmtimer_rtc_add_device(struct device *dev, + unsigned long flags; + struct rtc_device *rtc = to_rtc_device(dev); + struct wakeup_source *__ws; ++ int ret = 0; + + if (rtcdev) + return -EBUSY; +@@ -102,8 +103,8 @@ static int alarmtimer_rtc_add_device(struct device *dev, + spin_lock_irqsave(&rtcdev_lock, flags); + if (!rtcdev) { + if (!try_module_get(rtc->owner)) { +- spin_unlock_irqrestore(&rtcdev_lock, flags); +- return -1; ++ ret = -1; ++ goto unlock; + } + + rtcdev = rtc; +@@ -112,11 +113,12 @@ static int alarmtimer_rtc_add_device(struct device *dev, + ws = __ws; + __ws = NULL; + } ++unlock: + spin_unlock_irqrestore(&rtcdev_lock, flags); + + wakeup_source_unregister(__ws); + +- return 0; ++ return ret; + } + + static inline void alarmtimer_rtc_timer_init(void) +diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c +index fff5f64981c6..428beb69426a 100644 +--- a/kernel/time/clocksource.c ++++ b/kernel/time/clocksource.c +@@ -293,8 +293,15 @@ static void clocksource_watchdog(struct timer_list *unused) + next_cpu = cpumask_next(raw_smp_processor_id(), cpu_online_mask); + if (next_cpu >= nr_cpu_ids) + next_cpu = cpumask_first(cpu_online_mask); +- watchdog_timer.expires += WATCHDOG_INTERVAL; +- add_timer_on(&watchdog_timer, next_cpu); ++ ++ /* ++ * Arm timer if not already pending: could race with concurrent ++ * pair clocksource_stop_watchdog() clocksource_start_watchdog(). ++ */ ++ if (!timer_pending(&watchdog_timer)) { ++ watchdog_timer.expires += WATCHDOG_INTERVAL; ++ add_timer_on(&watchdog_timer, next_cpu); ++ } + out: + spin_unlock(&watchdog_lock); + } +diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c +index 0708a41cfe2d..407d8bf4ed93 100644 +--- a/kernel/trace/ftrace.c ++++ b/kernel/trace/ftrace.c +@@ -5102,8 +5102,8 @@ static const struct file_operations ftrace_notrace_fops = { + + static DEFINE_MUTEX(graph_lock); + +-struct ftrace_hash *ftrace_graph_hash = EMPTY_HASH; +-struct ftrace_hash *ftrace_graph_notrace_hash = EMPTY_HASH; ++struct ftrace_hash __rcu *ftrace_graph_hash = EMPTY_HASH; ++struct ftrace_hash __rcu *ftrace_graph_notrace_hash = EMPTY_HASH; + + enum graph_filter_type { + GRAPH_FILTER_NOTRACE = 0, +@@ -5378,8 +5378,15 @@ ftrace_graph_release(struct inode *inode, struct file *file) + + mutex_unlock(&graph_lock); + +- /* Wait till all users are no longer using the old hash */ +- synchronize_rcu(); ++ /* ++ * We need to do a hard force of sched synchronization. ++ * This is because we use preempt_disable() to do RCU, but ++ * the function tracers can be called where RCU is not watching ++ * (like before user_exit()). We can not rely on the RCU ++ * infrastructure to do the synchronization, thus we must do it ++ * ourselves. ++ */ ++ schedule_on_each_cpu(ftrace_sync); + + free_ftrace_hash(old_hash); + } +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index d685c61085c0..a3c29d5fcc61 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -932,22 +932,31 @@ extern void __trace_graph_return(struct trace_array *tr, + unsigned long flags, int pc); + + #ifdef CONFIG_DYNAMIC_FTRACE +-extern struct ftrace_hash *ftrace_graph_hash; +-extern struct ftrace_hash *ftrace_graph_notrace_hash; ++extern struct ftrace_hash __rcu *ftrace_graph_hash; ++extern struct ftrace_hash __rcu *ftrace_graph_notrace_hash; + + static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace) + { + unsigned long addr = trace->func; + int ret = 0; ++ struct ftrace_hash *hash; + + preempt_disable_notrace(); + +- if (ftrace_hash_empty(ftrace_graph_hash)) { ++ /* ++ * Have to open code "rcu_dereference_sched()" because the ++ * function graph tracer can be called when RCU is not ++ * "watching". ++ * Protected with schedule_on_each_cpu(ftrace_sync) ++ */ ++ hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible()); ++ ++ if (ftrace_hash_empty(hash)) { + ret = 1; + goto out; + } + +- if (ftrace_lookup_ip(ftrace_graph_hash, addr)) { ++ if (ftrace_lookup_ip(hash, addr)) { + + /* + * This needs to be cleared on the return functions +@@ -983,10 +992,20 @@ static inline void ftrace_graph_addr_finish(struct ftrace_graph_ret *trace) + static inline int ftrace_graph_notrace_addr(unsigned long addr) + { + int ret = 0; ++ struct ftrace_hash *notrace_hash; + + preempt_disable_notrace(); + +- if (ftrace_lookup_ip(ftrace_graph_notrace_hash, addr)) ++ /* ++ * Have to open code "rcu_dereference_sched()" because the ++ * function graph tracer can be called when RCU is not ++ * "watching". ++ * Protected with schedule_on_each_cpu(ftrace_sync) ++ */ ++ notrace_hash = rcu_dereference_protected(ftrace_graph_notrace_hash, ++ !preemptible()); ++ ++ if (ftrace_lookup_ip(notrace_hash, addr)) + ret = 1; + + preempt_enable_notrace(); +diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c +index 205692181e7b..4be7fc84d6b6 100644 +--- a/kernel/trace/trace_events_hist.c ++++ b/kernel/trace/trace_events_hist.c +@@ -470,11 +470,12 @@ struct action_data { + * When a histogram trigger is hit, the values of any + * references to variables, including variables being passed + * as parameters to synthetic events, are collected into a +- * var_ref_vals array. This var_ref_idx is the index of the +- * first param in the array to be passed to the synthetic +- * event invocation. ++ * var_ref_vals array. This var_ref_idx array is an array of ++ * indices into the var_ref_vals array, one for each synthetic ++ * event param, and is passed to the synthetic event ++ * invocation. + */ +- unsigned int var_ref_idx; ++ unsigned int var_ref_idx[TRACING_MAP_VARS_MAX]; + struct synth_event *synth_event; + bool use_trace_keyword; + char *synth_event_name; +@@ -875,14 +876,14 @@ static struct trace_event_functions synth_event_funcs = { + + static notrace void trace_event_raw_event_synth(void *__data, + u64 *var_ref_vals, +- unsigned int var_ref_idx) ++ unsigned int *var_ref_idx) + { + struct trace_event_file *trace_file = __data; + struct synth_trace_event *entry; + struct trace_event_buffer fbuffer; + struct ring_buffer *buffer; + struct synth_event *event; +- unsigned int i, n_u64; ++ unsigned int i, n_u64, val_idx; + int fields_size = 0; + + event = trace_file->event_call->data; +@@ -905,15 +906,16 @@ static notrace void trace_event_raw_event_synth(void *__data, + goto out; + + for (i = 0, n_u64 = 0; i < event->n_fields; i++) { ++ val_idx = var_ref_idx[i]; + if (event->fields[i]->is_string) { +- char *str_val = (char *)(long)var_ref_vals[var_ref_idx + i]; ++ char *str_val = (char *)(long)var_ref_vals[val_idx]; + char *str_field = (char *)&entry->fields[n_u64]; + + strscpy(str_field, str_val, STR_VAR_LEN_MAX); + n_u64 += STR_VAR_LEN_MAX / sizeof(u64); + } else { + struct synth_field *field = event->fields[i]; +- u64 val = var_ref_vals[var_ref_idx + i]; ++ u64 val = var_ref_vals[val_idx]; + + switch (field->size) { + case 1: +@@ -1113,10 +1115,10 @@ static struct tracepoint *alloc_synth_tracepoint(char *name) + } + + typedef void (*synth_probe_func_t) (void *__data, u64 *var_ref_vals, +- unsigned int var_ref_idx); ++ unsigned int *var_ref_idx); + + static inline void trace_synth(struct synth_event *event, u64 *var_ref_vals, +- unsigned int var_ref_idx) ++ unsigned int *var_ref_idx) + { + struct tracepoint *tp = event->tp; + +@@ -2655,6 +2657,22 @@ static int init_var_ref(struct hist_field *ref_field, + goto out; + } + ++static int find_var_ref_idx(struct hist_trigger_data *hist_data, ++ struct hist_field *var_field) ++{ ++ struct hist_field *ref_field; ++ int i; ++ ++ for (i = 0; i < hist_data->n_var_refs; i++) { ++ ref_field = hist_data->var_refs[i]; ++ if (ref_field->var.idx == var_field->var.idx && ++ ref_field->var.hist_data == var_field->hist_data) ++ return i; ++ } ++ ++ return -ENOENT; ++} ++ + /** + * create_var_ref - Create a variable reference and attach it to trigger + * @hist_data: The trigger that will be referencing the variable +@@ -4228,11 +4246,11 @@ static int trace_action_create(struct hist_trigger_data *hist_data, + struct trace_array *tr = hist_data->event_file->tr; + char *event_name, *param, *system = NULL; + struct hist_field *hist_field, *var_ref; +- unsigned int i, var_ref_idx; ++ unsigned int i; + unsigned int field_pos = 0; + struct synth_event *event; + char *synth_event_name; +- int ret = 0; ++ int var_ref_idx, ret = 0; + + lockdep_assert_held(&event_mutex); + +@@ -4249,8 +4267,6 @@ static int trace_action_create(struct hist_trigger_data *hist_data, + + event->ref++; + +- var_ref_idx = hist_data->n_var_refs; +- + for (i = 0; i < data->n_params; i++) { + char *p; + +@@ -4299,6 +4315,14 @@ static int trace_action_create(struct hist_trigger_data *hist_data, + goto err; + } + ++ var_ref_idx = find_var_ref_idx(hist_data, var_ref); ++ if (WARN_ON(var_ref_idx < 0)) { ++ ret = var_ref_idx; ++ goto err; ++ } ++ ++ data->var_ref_idx[i] = var_ref_idx; ++ + field_pos++; + kfree(p); + continue; +@@ -4317,7 +4341,6 @@ static int trace_action_create(struct hist_trigger_data *hist_data, + } + + data->synth_event = event; +- data->var_ref_idx = var_ref_idx; + out: + return ret; + err: +diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c +index 9ae87be422f2..ab8b6436d53f 100644 +--- a/kernel/trace/trace_probe.c ++++ b/kernel/trace/trace_probe.c +@@ -876,7 +876,8 @@ static int __set_print_fmt(struct trace_probe *tp, char *buf, int len, + for (i = 0; i < tp->nr_args; i++) { + parg = tp->args + i; + if (parg->count) { +- if (strcmp(parg->type->name, "string") == 0) ++ if ((strcmp(parg->type->name, "string") == 0) || ++ (strcmp(parg->type->name, "ustring") == 0)) + fmt = ", __get_str(%s[%d])"; + else + fmt = ", REC->%s[%d]"; +@@ -884,7 +885,8 @@ static int __set_print_fmt(struct trace_probe *tp, char *buf, int len, + pos += snprintf(buf + pos, LEN_OR_ZERO, + fmt, parg->name, j); + } else { +- if (strcmp(parg->type->name, "string") == 0) ++ if ((strcmp(parg->type->name, "string") == 0) || ++ (strcmp(parg->type->name, "ustring") == 0)) + fmt = ", __get_str(%s)"; + else + fmt = ", REC->%s"; +diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c +index e288168661e1..e304196d7c28 100644 +--- a/kernel/trace/trace_sched_switch.c ++++ b/kernel/trace/trace_sched_switch.c +@@ -89,8 +89,10 @@ static void tracing_sched_unregister(void) + + static void tracing_start_sched_switch(int ops) + { +- bool sched_register = (!sched_cmdline_ref && !sched_tgid_ref); ++ bool sched_register; ++ + mutex_lock(&sched_register_mutex); ++ sched_register = (!sched_cmdline_ref && !sched_tgid_ref); + + switch (ops) { + case RECORD_CMDLINE: +diff --git a/lib/test_kasan.c b/lib/test_kasan.c +index 49cc4d570a40..bd3d9ef7d39e 100644 +--- a/lib/test_kasan.c ++++ b/lib/test_kasan.c +@@ -157,6 +157,7 @@ static noinline void __init kmalloc_oob_krealloc_more(void) + if (!ptr1 || !ptr2) { + pr_err("Allocation failed\n"); + kfree(ptr1); ++ kfree(ptr2); + return; + } + +diff --git a/mm/backing-dev.c b/mm/backing-dev.c +index c360f6a6c844..62f05f605fb5 100644 +--- a/mm/backing-dev.c ++++ b/mm/backing-dev.c +@@ -21,6 +21,7 @@ struct backing_dev_info noop_backing_dev_info = { + EXPORT_SYMBOL_GPL(noop_backing_dev_info); + + static struct class *bdi_class; ++const char *bdi_unknown_name = "(unknown)"; + + /* + * bdi_lock protects bdi_tree and updates to bdi_list. bdi_list has RCU +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index ef4e9eb572a4..b5b4e310fe70 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -5465,14 +5465,6 @@ static int mem_cgroup_move_account(struct page *page, + __mod_lruvec_state(to_vec, NR_WRITEBACK, nr_pages); + } + +-#ifdef CONFIG_TRANSPARENT_HUGEPAGE +- if (compound && !list_empty(page_deferred_list(page))) { +- spin_lock(&from->deferred_split_queue.split_queue_lock); +- list_del_init(page_deferred_list(page)); +- from->deferred_split_queue.split_queue_len--; +- spin_unlock(&from->deferred_split_queue.split_queue_lock); +- } +-#endif + /* + * It is safe to change page->mem_cgroup here because the page + * is referenced, charged, and isolated - we can't race with +@@ -5482,16 +5474,6 @@ static int mem_cgroup_move_account(struct page *page, + /* caller should have done css_get */ + page->mem_cgroup = to; + +-#ifdef CONFIG_TRANSPARENT_HUGEPAGE +- if (compound && list_empty(page_deferred_list(page))) { +- spin_lock(&to->deferred_split_queue.split_queue_lock); +- list_add_tail(page_deferred_list(page), +- &to->deferred_split_queue.split_queue); +- to->deferred_split_queue.split_queue_len++; +- spin_unlock(&to->deferred_split_queue.split_queue_lock); +- } +-#endif +- + spin_unlock_irqrestore(&from->move_lock, flags); + + ret = 0; +diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c +index fab540685279..0aa154be3a52 100644 +--- a/mm/memory_hotplug.c ++++ b/mm/memory_hotplug.c +@@ -1738,8 +1738,6 @@ static int __ref try_remove_memory(int nid, u64 start, u64 size) + + BUG_ON(check_hotplug_memory_range(start, size)); + +- mem_hotplug_begin(); +- + /* + * All memory blocks must be offlined before removing memory. Check + * whether all memory blocks in question are offline and return error +@@ -1754,9 +1752,14 @@ static int __ref try_remove_memory(int nid, u64 start, u64 size) + memblock_free(start, size); + memblock_remove(start, size); + +- /* remove memory block devices before removing memory */ ++ /* ++ * Memory block device removal under the device_hotplug_lock is ++ * a barrier against racing online attempts. ++ */ + remove_memory_block_devices(start, size); + ++ mem_hotplug_begin(); ++ + arch_remove_memory(nid, start, size, NULL); + __release_memory_resource(start, size); + +diff --git a/mm/migrate.c b/mm/migrate.c +index 6956627ebf8b..c4c313e47f12 100644 +--- a/mm/migrate.c ++++ b/mm/migrate.c +@@ -1631,8 +1631,19 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes, + start = i; + } else if (node != current_node) { + err = do_move_pages_to_node(mm, &pagelist, current_node); +- if (err) ++ if (err) { ++ /* ++ * Positive err means the number of failed ++ * pages to migrate. Since we are going to ++ * abort and return the number of non-migrated ++ * pages, so need to incude the rest of the ++ * nr_pages that have not been attempted as ++ * well. ++ */ ++ if (err > 0) ++ err += nr_pages - i - 1; + goto out; ++ } + err = store_status(status, start, current_node, i - start); + if (err) + goto out; +@@ -1663,8 +1674,11 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes, + goto out_flush; + + err = do_move_pages_to_node(mm, &pagelist, current_node); +- if (err) ++ if (err) { ++ if (err > 0) ++ err += nr_pages - i - 1; + goto out; ++ } + if (i > start) { + err = store_status(status, start, current_node, i - start); + if (err) +@@ -1678,6 +1692,13 @@ out_flush: + + /* Make sure we do not overwrite the existing error */ + err1 = do_move_pages_to_node(mm, &pagelist, current_node); ++ /* ++ * Don't have to report non-attempted pages here since: ++ * - If the above loop is done gracefully all pages have been ++ * attempted. ++ * - If the above loop is aborted it means a fatal error ++ * happened, should return ret. ++ */ + if (!err1) + err1 = store_status(status, start, current_node, i - start); + if (err >= 0) +diff --git a/mm/mmu_gather.c b/mm/mmu_gather.c +index 7d70e5c78f97..7c1b8f67af7b 100644 +--- a/mm/mmu_gather.c ++++ b/mm/mmu_gather.c +@@ -102,14 +102,14 @@ bool __tlb_remove_page_size(struct mmu_gather *tlb, struct page *page, int page_ + */ + static inline void tlb_table_invalidate(struct mmu_gather *tlb) + { +-#ifndef CONFIG_HAVE_RCU_TABLE_NO_INVALIDATE +- /* +- * Invalidate page-table caches used by hardware walkers. Then we still +- * need to RCU-sched wait while freeing the pages because software +- * walkers can still be in-flight. +- */ +- tlb_flush_mmu_tlbonly(tlb); +-#endif ++ if (tlb_needs_table_invalidate()) { ++ /* ++ * Invalidate page-table caches used by hardware walkers. Then ++ * we still need to RCU-sched wait while freeing the pages ++ * because software walkers can still be in-flight. ++ */ ++ tlb_flush_mmu_tlbonly(tlb); ++ } + } + + static void tlb_remove_table_smp_sync(void *arg) +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index 45e39131a716..d387ca74cb5a 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -6933,7 +6933,8 @@ static u64 zero_pfn_range(unsigned long spfn, unsigned long epfn) + * This function also addresses a similar issue where struct pages are left + * uninitialized because the physical address range is not covered by + * memblock.memory or memblock.reserved. That could happen when memblock +- * layout is manually configured via memmap=. ++ * layout is manually configured via memmap=, or when the highest physical ++ * address (max_pfn) does not end on a section boundary. + */ + void __init zero_resv_unavail(void) + { +@@ -6951,7 +6952,16 @@ void __init zero_resv_unavail(void) + pgcnt += zero_pfn_range(PFN_DOWN(next), PFN_UP(start)); + next = end; + } +- pgcnt += zero_pfn_range(PFN_DOWN(next), max_pfn); ++ ++ /* ++ * Early sections always have a fully populated memmap for the whole ++ * section - see pfn_valid(). If the last section has holes at the ++ * end and that section is marked "online", the memmap will be ++ * considered initialized. Make sure that memmap has a well defined ++ * state. ++ */ ++ pgcnt += zero_pfn_range(PFN_DOWN(next), ++ round_up(max_pfn, PAGES_PER_SECTION)); + + /* + * Struct pages that do not have backing memory. This could be because +diff --git a/mm/sparse.c b/mm/sparse.c +index 1100fdb9649c..69b41b6046a5 100644 +--- a/mm/sparse.c ++++ b/mm/sparse.c +@@ -787,7 +787,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, + ms->usage = NULL; + } + memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); +- ms->section_mem_map = sparse_encode_mem_map(NULL, section_nr); ++ ms->section_mem_map = (unsigned long)NULL; + } + + if (section_is_early && memmap) +diff --git a/net/core/devlink.c b/net/core/devlink.c +index ae614965c8c2..61bc67047f56 100644 +--- a/net/core/devlink.c ++++ b/net/core/devlink.c +@@ -3863,6 +3863,12 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb, + goto out_unlock; + } + ++ /* return 0 if there is no further data to read */ ++ if (start_offset >= region->size) { ++ err = 0; ++ goto out_unlock; ++ } ++ + hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, + &devlink_nl_family, NLM_F_ACK | NLM_F_MULTI, + DEVLINK_CMD_REGION_READ); +diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c +index 536e032d95c8..246a258b1fac 100644 +--- a/net/core/drop_monitor.c ++++ b/net/core/drop_monitor.c +@@ -1004,8 +1004,10 @@ static void net_dm_hw_monitor_stop(struct netlink_ext_ack *extack) + { + int cpu; + +- if (!monitor_hw) ++ if (!monitor_hw) { + NL_SET_ERR_MSG_MOD(extack, "Hardware monitoring already disabled"); ++ return; ++ } + + monitor_hw = false; + +diff --git a/net/hsr/hsr_slave.c b/net/hsr/hsr_slave.c +index ee561297d8a7..fbfd0db182b7 100644 +--- a/net/hsr/hsr_slave.c ++++ b/net/hsr/hsr_slave.c +@@ -27,6 +27,8 @@ static rx_handler_result_t hsr_handle_frame(struct sk_buff **pskb) + + rcu_read_lock(); /* hsr->node_db, hsr->ports */ + port = hsr_port_get_rcu(skb->dev); ++ if (!port) ++ goto finish_pass; + + if (hsr_addr_is_self(port->hsr, eth_hdr(skb)->h_source)) { + /* Directly kill frames sent by ourselves */ +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 3640e8563a10..deb466fc3d1f 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -2618,10 +2618,12 @@ int tcp_disconnect(struct sock *sk, int flags) + tp->snd_cwnd = TCP_INIT_CWND; + tp->snd_cwnd_cnt = 0; + tp->window_clamp = 0; ++ tp->delivered = 0; + tp->delivered_ce = 0; + tcp_set_ca_state(sk, TCP_CA_Open); + tp->is_sack_reneg = 0; + tcp_clear_retrans(tp); ++ tp->total_retrans = 0; + inet_csk_delack_init(sk); + /* Initialize rcv_mss to TCP_MIN_MSS to avoid division by 0 + * issue in __tcp_select_window() +@@ -2633,10 +2635,14 @@ int tcp_disconnect(struct sock *sk, int flags) + sk->sk_rx_dst = NULL; + tcp_saved_syn_free(tp); + tp->compressed_ack = 0; ++ tp->segs_in = 0; ++ tp->segs_out = 0; + tp->bytes_sent = 0; + tp->bytes_acked = 0; + tp->bytes_received = 0; + tp->bytes_retrans = 0; ++ tp->data_segs_in = 0; ++ tp->data_segs_out = 0; + tp->duplicate_sack[0].start_seq = 0; + tp->duplicate_sack[0].end_seq = 0; + tp->dsack_dups = 0; +diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c +index f9b5690e94fd..b11ccb53c7e0 100644 +--- a/net/ipv6/addrconf.c ++++ b/net/ipv6/addrconf.c +@@ -5719,6 +5719,9 @@ static int inet6_set_link_af(struct net_device *dev, const struct nlattr *nla) + struct nlattr *tb[IFLA_INET6_MAX + 1]; + int err; + ++ if (!idev) ++ return -EAFNOSUPPORT; ++ + if (nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla, NULL, NULL) < 0) + BUG(); + +diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c +index f82ea12bac37..425b95eb7e87 100644 +--- a/net/l2tp/l2tp_core.c ++++ b/net/l2tp/l2tp_core.c +@@ -322,8 +322,13 @@ int l2tp_session_register(struct l2tp_session *session, + + spin_lock_bh(&pn->l2tp_session_hlist_lock); + ++ /* IP encap expects session IDs to be globally unique, while ++ * UDP encap doesn't. ++ */ + hlist_for_each_entry(session_walk, g_head, global_hlist) +- if (session_walk->session_id == session->session_id) { ++ if (session_walk->session_id == session->session_id && ++ (session_walk->tunnel->encap == L2TP_ENCAPTYPE_IP || ++ tunnel->encap == L2TP_ENCAPTYPE_IP)) { + err = -EEXIST; + goto err_tlock_pnlock; + } +diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c +index d8143a8c034d..a9df9dac57b2 100644 +--- a/net/netfilter/ipset/ip_set_core.c ++++ b/net/netfilter/ipset/ip_set_core.c +@@ -1293,31 +1293,34 @@ ip_set_dump_policy[IPSET_ATTR_CMD_MAX + 1] = { + }; + + static int +-dump_init(struct netlink_callback *cb, struct ip_set_net *inst) ++ip_set_dump_start(struct netlink_callback *cb) + { + struct nlmsghdr *nlh = nlmsg_hdr(cb->skb); + int min_len = nlmsg_total_size(sizeof(struct nfgenmsg)); + struct nlattr *cda[IPSET_ATTR_CMD_MAX + 1]; + struct nlattr *attr = (void *)nlh + min_len; ++ struct sk_buff *skb = cb->skb; ++ struct ip_set_net *inst = ip_set_pernet(sock_net(skb->sk)); + u32 dump_type; +- ip_set_id_t index; + int ret; + + ret = nla_parse(cda, IPSET_ATTR_CMD_MAX, attr, + nlh->nlmsg_len - min_len, + ip_set_dump_policy, NULL); + if (ret) +- return ret; ++ goto error; + + cb->args[IPSET_CB_PROTO] = nla_get_u8(cda[IPSET_ATTR_PROTOCOL]); + if (cda[IPSET_ATTR_SETNAME]) { ++ ip_set_id_t index; + struct ip_set *set; + + set = find_set_and_id(inst, nla_data(cda[IPSET_ATTR_SETNAME]), + &index); +- if (!set) +- return -ENOENT; +- ++ if (!set) { ++ ret = -ENOENT; ++ goto error; ++ } + dump_type = DUMP_ONE; + cb->args[IPSET_CB_INDEX] = index; + } else { +@@ -1333,10 +1336,17 @@ dump_init(struct netlink_callback *cb, struct ip_set_net *inst) + cb->args[IPSET_CB_DUMP] = dump_type; + + return 0; ++ ++error: ++ /* We have to create and send the error message manually :-( */ ++ if (nlh->nlmsg_flags & NLM_F_ACK) { ++ netlink_ack(cb->skb, nlh, ret, NULL); ++ } ++ return ret; + } + + static int +-ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb) ++ip_set_dump_do(struct sk_buff *skb, struct netlink_callback *cb) + { + ip_set_id_t index = IPSET_INVALID_ID, max; + struct ip_set *set = NULL; +@@ -1347,18 +1357,8 @@ ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb) + bool is_destroyed; + int ret = 0; + +- if (!cb->args[IPSET_CB_DUMP]) { +- ret = dump_init(cb, inst); +- if (ret < 0) { +- nlh = nlmsg_hdr(cb->skb); +- /* We have to create and send the error message +- * manually :-( +- */ +- if (nlh->nlmsg_flags & NLM_F_ACK) +- netlink_ack(cb->skb, nlh, ret, NULL); +- return ret; +- } +- } ++ if (!cb->args[IPSET_CB_DUMP]) ++ return -EINVAL; + + if (cb->args[IPSET_CB_INDEX] >= inst->ip_set_max) + goto out; +@@ -1494,7 +1494,8 @@ static int ip_set_dump(struct net *net, struct sock *ctnl, struct sk_buff *skb, + + { + struct netlink_dump_control c = { +- .dump = ip_set_dump_start, ++ .start = ip_set_dump_start, ++ .dump = ip_set_dump_do, + .done = ip_set_dump_done, + }; + return netlink_dump_start(ctnl, skb, nlh, &c); +diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c +index d72ddb67bb74..4a6ca9723a12 100644 +--- a/net/rxrpc/af_rxrpc.c ++++ b/net/rxrpc/af_rxrpc.c +@@ -194,6 +194,7 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len) + service_in_use: + write_unlock(&local->services_lock); + rxrpc_unuse_local(local); ++ rxrpc_put_local(local); + ret = -EADDRINUSE; + error_unlock: + release_sock(&rx->sk); +@@ -899,6 +900,7 @@ static int rxrpc_release_sock(struct sock *sk) + rxrpc_purge_queue(&sk->sk_receive_queue); + + rxrpc_unuse_local(rx->local); ++ rxrpc_put_local(rx->local); + rx->local = NULL; + key_put(rx->key); + rx->key = NULL; +diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h +index 5e99df80e80a..7d730c438404 100644 +--- a/net/rxrpc/ar-internal.h ++++ b/net/rxrpc/ar-internal.h +@@ -490,6 +490,7 @@ enum rxrpc_call_flag { + RXRPC_CALL_RX_HEARD, /* The peer responded at least once to this call */ + RXRPC_CALL_RX_UNDERRUN, /* Got data underrun */ + RXRPC_CALL_IS_INTR, /* The call is interruptible */ ++ RXRPC_CALL_DISCONNECTED, /* The call has been disconnected */ + }; + + /* +@@ -1021,6 +1022,16 @@ void rxrpc_unuse_local(struct rxrpc_local *); + void rxrpc_queue_local(struct rxrpc_local *); + void rxrpc_destroy_all_locals(struct rxrpc_net *); + ++static inline bool __rxrpc_unuse_local(struct rxrpc_local *local) ++{ ++ return atomic_dec_return(&local->active_users) == 0; ++} ++ ++static inline bool __rxrpc_use_local(struct rxrpc_local *local) ++{ ++ return atomic_fetch_add_unless(&local->active_users, 1, 0) != 0; ++} ++ + /* + * misc.c + */ +diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c +index a31c18c09894..dbdbc4f18b5e 100644 +--- a/net/rxrpc/call_object.c ++++ b/net/rxrpc/call_object.c +@@ -493,7 +493,7 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call) + + _debug("RELEASE CALL %p (%d CONN %p)", call, call->debug_id, conn); + +- if (conn) ++ if (conn && !test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) + rxrpc_disconnect_call(call); + if (call->security) + call->security->free_call_crypto(call); +@@ -569,6 +569,7 @@ static void rxrpc_rcu_destroy_call(struct rcu_head *rcu) + struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu); + struct rxrpc_net *rxnet = call->rxnet; + ++ rxrpc_put_connection(call->conn); + rxrpc_put_peer(call->peer); + kfree(call->rxtx_buffer); + kfree(call->rxtx_annotations); +@@ -590,7 +591,6 @@ void rxrpc_cleanup_call(struct rxrpc_call *call) + + ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE); + ASSERT(test_bit(RXRPC_CALL_RELEASED, &call->flags)); +- ASSERTCMP(call->conn, ==, NULL); + + rxrpc_cleanup_ring(call); + rxrpc_free_skb(call->tx_pending, rxrpc_skb_cleaned); +diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c +index 376370cd9285..ea7d4c21f889 100644 +--- a/net/rxrpc/conn_client.c ++++ b/net/rxrpc/conn_client.c +@@ -785,6 +785,7 @@ void rxrpc_disconnect_client_call(struct rxrpc_call *call) + u32 cid; + + spin_lock(&conn->channel_lock); ++ set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); + + cid = call->cid; + if (cid) { +@@ -792,7 +793,6 @@ void rxrpc_disconnect_client_call(struct rxrpc_call *call) + chan = &conn->channels[channel]; + } + trace_rxrpc_client(conn, channel, rxrpc_client_chan_disconnect); +- call->conn = NULL; + + /* Calls that have never actually been assigned a channel can simply be + * discarded. If the conn didn't get used either, it will follow +@@ -908,7 +908,6 @@ out: + spin_unlock(&rxnet->client_conn_cache_lock); + out_2: + spin_unlock(&conn->channel_lock); +- rxrpc_put_connection(conn); + _leave(""); + return; + +diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c +index 808a4723f868..06fcff2ebbba 100644 +--- a/net/rxrpc/conn_event.c ++++ b/net/rxrpc/conn_event.c +@@ -438,16 +438,12 @@ again: + /* + * connection-level event processor + */ +-void rxrpc_process_connection(struct work_struct *work) ++static void rxrpc_do_process_connection(struct rxrpc_connection *conn) + { +- struct rxrpc_connection *conn = +- container_of(work, struct rxrpc_connection, processor); + struct sk_buff *skb; + u32 abort_code = RX_PROTOCOL_ERROR; + int ret; + +- rxrpc_see_connection(conn); +- + if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events)) + rxrpc_secure_connection(conn); + +@@ -475,18 +471,32 @@ void rxrpc_process_connection(struct work_struct *work) + } + } + +-out: +- rxrpc_put_connection(conn); +- _leave(""); + return; + + requeue_and_leave: + skb_queue_head(&conn->rx_queue, skb); +- goto out; ++ return; + + protocol_error: + if (rxrpc_abort_connection(conn, ret, abort_code) < 0) + goto requeue_and_leave; + rxrpc_free_skb(skb, rxrpc_skb_freed); +- goto out; ++ return; ++} ++ ++void rxrpc_process_connection(struct work_struct *work) ++{ ++ struct rxrpc_connection *conn = ++ container_of(work, struct rxrpc_connection, processor); ++ ++ rxrpc_see_connection(conn); ++ ++ if (__rxrpc_use_local(conn->params.local)) { ++ rxrpc_do_process_connection(conn); ++ rxrpc_unuse_local(conn->params.local); ++ } ++ ++ rxrpc_put_connection(conn); ++ _leave(""); ++ return; + } +diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c +index 38d718e90dc6..19e141eeed17 100644 +--- a/net/rxrpc/conn_object.c ++++ b/net/rxrpc/conn_object.c +@@ -223,9 +223,8 @@ void rxrpc_disconnect_call(struct rxrpc_call *call) + __rxrpc_disconnect_call(conn, call); + spin_unlock(&conn->channel_lock); + +- call->conn = NULL; ++ set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); + conn->idle_timestamp = jiffies; +- rxrpc_put_connection(conn); + } + + /* +diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c +index 96d54e5bf7bc..ef10fbf71b15 100644 +--- a/net/rxrpc/input.c ++++ b/net/rxrpc/input.c +@@ -599,10 +599,8 @@ ack: + false, true, + rxrpc_propose_ack_input_data); + +- if (seq0 == READ_ONCE(call->rx_hard_ack) + 1) { +- trace_rxrpc_notify_socket(call->debug_id, serial); +- rxrpc_notify_socket(call); +- } ++ trace_rxrpc_notify_socket(call->debug_id, serial); ++ rxrpc_notify_socket(call); + + unlock: + spin_unlock(&call->input_lock); +diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c +index 36587260cabd..a6c1349e965d 100644 +--- a/net/rxrpc/local_object.c ++++ b/net/rxrpc/local_object.c +@@ -364,11 +364,14 @@ void rxrpc_queue_local(struct rxrpc_local *local) + void rxrpc_put_local(struct rxrpc_local *local) + { + const void *here = __builtin_return_address(0); ++ unsigned int debug_id; + int n; + + if (local) { ++ debug_id = local->debug_id; ++ + n = atomic_dec_return(&local->usage); +- trace_rxrpc_local(local->debug_id, rxrpc_local_put, n, here); ++ trace_rxrpc_local(debug_id, rxrpc_local_put, n, here); + + if (n == 0) + call_rcu(&local->rcu, rxrpc_local_rcu); +@@ -380,14 +383,11 @@ void rxrpc_put_local(struct rxrpc_local *local) + */ + struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local) + { +- unsigned int au; +- + local = rxrpc_get_local_maybe(local); + if (!local) + return NULL; + +- au = atomic_fetch_add_unless(&local->active_users, 1, 0); +- if (au == 0) { ++ if (!__rxrpc_use_local(local)) { + rxrpc_put_local(local); + return NULL; + } +@@ -401,14 +401,11 @@ struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local) + */ + void rxrpc_unuse_local(struct rxrpc_local *local) + { +- unsigned int au; +- + if (local) { +- au = atomic_dec_return(&local->active_users); +- if (au == 0) ++ if (__rxrpc_unuse_local(local)) { ++ rxrpc_get_local(local); + rxrpc_queue_local(local); +- else +- rxrpc_put_local(local); ++ } + } + } + +@@ -465,7 +462,7 @@ static void rxrpc_local_processor(struct work_struct *work) + + do { + again = false; +- if (atomic_read(&local->active_users) == 0) { ++ if (!__rxrpc_use_local(local)) { + rxrpc_local_destroyer(local); + break; + } +@@ -479,6 +476,8 @@ static void rxrpc_local_processor(struct work_struct *work) + rxrpc_process_local_events(local); + again = true; + } ++ ++ __rxrpc_unuse_local(local); + } while (again); + + rxrpc_put_local(local); +diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c +index 935bb60fff56..bad3d2420344 100644 +--- a/net/rxrpc/output.c ++++ b/net/rxrpc/output.c +@@ -129,7 +129,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, + int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, + rxrpc_serial_t *_serial) + { +- struct rxrpc_connection *conn = NULL; ++ struct rxrpc_connection *conn; + struct rxrpc_ack_buffer *pkt; + struct msghdr msg; + struct kvec iov[2]; +@@ -139,18 +139,14 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, + int ret; + u8 reason; + +- spin_lock_bh(&call->lock); +- if (call->conn) +- conn = rxrpc_get_connection_maybe(call->conn); +- spin_unlock_bh(&call->lock); +- if (!conn) ++ if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) + return -ECONNRESET; + + pkt = kzalloc(sizeof(*pkt), GFP_KERNEL); +- if (!pkt) { +- rxrpc_put_connection(conn); ++ if (!pkt) + return -ENOMEM; +- } ++ ++ conn = call->conn; + + msg.msg_name = &call->peer->srx.transport; + msg.msg_namelen = call->peer->srx.transport_len; +@@ -244,7 +240,6 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, + } + + out: +- rxrpc_put_connection(conn); + kfree(pkt); + return ret; + } +@@ -254,7 +249,7 @@ out: + */ + int rxrpc_send_abort_packet(struct rxrpc_call *call) + { +- struct rxrpc_connection *conn = NULL; ++ struct rxrpc_connection *conn; + struct rxrpc_abort_buffer pkt; + struct msghdr msg; + struct kvec iov[1]; +@@ -271,13 +266,11 @@ int rxrpc_send_abort_packet(struct rxrpc_call *call) + test_bit(RXRPC_CALL_TX_LAST, &call->flags)) + return 0; + +- spin_lock_bh(&call->lock); +- if (call->conn) +- conn = rxrpc_get_connection_maybe(call->conn); +- spin_unlock_bh(&call->lock); +- if (!conn) ++ if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) + return -ECONNRESET; + ++ conn = call->conn; ++ + msg.msg_name = &call->peer->srx.transport; + msg.msg_namelen = call->peer->srx.transport_len; + msg.msg_control = NULL; +@@ -312,8 +305,6 @@ int rxrpc_send_abort_packet(struct rxrpc_call *call) + trace_rxrpc_tx_packet(call->debug_id, &pkt.whdr, + rxrpc_tx_point_call_abort); + rxrpc_tx_backoff(call, ret); +- +- rxrpc_put_connection(conn); + return ret; + } + +diff --git a/net/rxrpc/peer_event.c b/net/rxrpc/peer_event.c +index 48f67a9b1037..923b263c401b 100644 +--- a/net/rxrpc/peer_event.c ++++ b/net/rxrpc/peer_event.c +@@ -364,27 +364,31 @@ static void rxrpc_peer_keepalive_dispatch(struct rxrpc_net *rxnet, + if (!rxrpc_get_peer_maybe(peer)) + continue; + +- spin_unlock_bh(&rxnet->peer_hash_lock); +- +- keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; +- slot = keepalive_at - base; +- _debug("%02x peer %u t=%d {%pISp}", +- cursor, peer->debug_id, slot, &peer->srx.transport); ++ if (__rxrpc_use_local(peer->local)) { ++ spin_unlock_bh(&rxnet->peer_hash_lock); ++ ++ keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; ++ slot = keepalive_at - base; ++ _debug("%02x peer %u t=%d {%pISp}", ++ cursor, peer->debug_id, slot, &peer->srx.transport); ++ ++ if (keepalive_at <= base || ++ keepalive_at > base + RXRPC_KEEPALIVE_TIME) { ++ rxrpc_send_keepalive(peer); ++ slot = RXRPC_KEEPALIVE_TIME; ++ } + +- if (keepalive_at <= base || +- keepalive_at > base + RXRPC_KEEPALIVE_TIME) { +- rxrpc_send_keepalive(peer); +- slot = RXRPC_KEEPALIVE_TIME; ++ /* A transmission to this peer occurred since last we ++ * examined it so put it into the appropriate future ++ * bucket. ++ */ ++ slot += cursor; ++ slot &= mask; ++ spin_lock_bh(&rxnet->peer_hash_lock); ++ list_add_tail(&peer->keepalive_link, ++ &rxnet->peer_keepalive[slot & mask]); ++ rxrpc_unuse_local(peer->local); + } +- +- /* A transmission to this peer occurred since last we examined +- * it so put it into the appropriate future bucket. +- */ +- slot += cursor; +- slot &= mask; +- spin_lock_bh(&rxnet->peer_hash_lock); +- list_add_tail(&peer->keepalive_link, +- &rxnet->peer_keepalive[slot & mask]); + rxrpc_put_peer_locked(peer); + } + +diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h +index c22624131949..d36949d9382c 100644 +--- a/net/sched/cls_rsvp.h ++++ b/net/sched/cls_rsvp.h +@@ -463,10 +463,8 @@ static u32 gen_tunnel(struct rsvp_head *data) + + static const struct nla_policy rsvp_policy[TCA_RSVP_MAX + 1] = { + [TCA_RSVP_CLASSID] = { .type = NLA_U32 }, +- [TCA_RSVP_DST] = { .type = NLA_BINARY, +- .len = RSVP_DST_LEN * sizeof(u32) }, +- [TCA_RSVP_SRC] = { .type = NLA_BINARY, +- .len = RSVP_DST_LEN * sizeof(u32) }, ++ [TCA_RSVP_DST] = { .len = RSVP_DST_LEN * sizeof(u32) }, ++ [TCA_RSVP_SRC] = { .len = RSVP_DST_LEN * sizeof(u32) }, + [TCA_RSVP_PINFO] = { .len = sizeof(struct tc_rsvp_pinfo) }, + }; + +diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c +index 3d4a1280352f..09b7dc5fe7e0 100644 +--- a/net/sched/cls_tcindex.c ++++ b/net/sched/cls_tcindex.c +@@ -333,12 +333,31 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, + cp->fall_through = p->fall_through; + cp->tp = tp; + ++ if (tb[TCA_TCINDEX_HASH]) ++ cp->hash = nla_get_u32(tb[TCA_TCINDEX_HASH]); ++ ++ if (tb[TCA_TCINDEX_MASK]) ++ cp->mask = nla_get_u16(tb[TCA_TCINDEX_MASK]); ++ ++ if (tb[TCA_TCINDEX_SHIFT]) ++ cp->shift = nla_get_u32(tb[TCA_TCINDEX_SHIFT]); ++ ++ if (!cp->hash) { ++ /* Hash not specified, use perfect hash if the upper limit ++ * of the hashing index is below the threshold. ++ */ ++ if ((cp->mask >> cp->shift) < PERFECT_HASH_THRESHOLD) ++ cp->hash = (cp->mask >> cp->shift) + 1; ++ else ++ cp->hash = DEFAULT_HASH_SIZE; ++ } ++ + if (p->perfect) { + int i; + + if (tcindex_alloc_perfect_hash(net, cp) < 0) + goto errout; +- for (i = 0; i < cp->hash; i++) ++ for (i = 0; i < min(cp->hash, p->hash); i++) + cp->perfect[i].res = p->perfect[i].res; + balloc = 1; + } +@@ -346,19 +365,10 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, + + err = tcindex_filter_result_init(&new_filter_result, net); + if (err < 0) +- goto errout1; ++ goto errout_alloc; + if (old_r) + cr = r->res; + +- if (tb[TCA_TCINDEX_HASH]) +- cp->hash = nla_get_u32(tb[TCA_TCINDEX_HASH]); +- +- if (tb[TCA_TCINDEX_MASK]) +- cp->mask = nla_get_u16(tb[TCA_TCINDEX_MASK]); +- +- if (tb[TCA_TCINDEX_SHIFT]) +- cp->shift = nla_get_u32(tb[TCA_TCINDEX_SHIFT]); +- + err = -EBUSY; + + /* Hash already allocated, make sure that we still meet the +@@ -376,16 +386,6 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, + if (tb[TCA_TCINDEX_FALL_THROUGH]) + cp->fall_through = nla_get_u32(tb[TCA_TCINDEX_FALL_THROUGH]); + +- if (!cp->hash) { +- /* Hash not specified, use perfect hash if the upper limit +- * of the hashing index is below the threshold. +- */ +- if ((cp->mask >> cp->shift) < PERFECT_HASH_THRESHOLD) +- cp->hash = (cp->mask >> cp->shift) + 1; +- else +- cp->hash = DEFAULT_HASH_SIZE; +- } +- + if (!cp->perfect && !cp->h) + cp->alloc_hash = cp->hash; + +@@ -484,7 +484,6 @@ errout_alloc: + tcindex_free_perfect_hash(cp); + else if (balloc == 2) + kfree(cp->h); +-errout1: + tcf_exts_destroy(&new_filter_result.exts); + errout: + kfree(cp); +diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c +index c609373c8661..660fc45ee40f 100644 +--- a/net/sched/sch_taprio.c ++++ b/net/sched/sch_taprio.c +@@ -31,6 +31,7 @@ static DEFINE_SPINLOCK(taprio_list_lock); + + #define TXTIME_ASSIST_IS_ENABLED(flags) ((flags) & TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST) + #define FULL_OFFLOAD_IS_ENABLED(flags) ((flags) & TCA_TAPRIO_ATTR_FLAG_FULL_OFFLOAD) ++#define TAPRIO_FLAGS_INVALID U32_MAX + + struct sched_entry { + struct list_head list; +@@ -766,6 +767,7 @@ static const struct nla_policy taprio_policy[TCA_TAPRIO_ATTR_MAX + 1] = { + [TCA_TAPRIO_ATTR_SCHED_CLOCKID] = { .type = NLA_S32 }, + [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME] = { .type = NLA_S64 }, + [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION] = { .type = NLA_S64 }, ++ [TCA_TAPRIO_ATTR_FLAGS] = { .type = NLA_U32 }, + }; + + static int fill_sched_entry(struct nlattr **tb, struct sched_entry *entry, +@@ -1367,6 +1369,33 @@ static int taprio_mqprio_cmp(const struct net_device *dev, + return 0; + } + ++/* The semantics of the 'flags' argument in relation to 'change()' ++ * requests, are interpreted following two rules (which are applied in ++ * this order): (1) an omitted 'flags' argument is interpreted as ++ * zero; (2) the 'flags' of a "running" taprio instance cannot be ++ * changed. ++ */ ++static int taprio_new_flags(const struct nlattr *attr, u32 old, ++ struct netlink_ext_ack *extack) ++{ ++ u32 new = 0; ++ ++ if (attr) ++ new = nla_get_u32(attr); ++ ++ if (old != TAPRIO_FLAGS_INVALID && old != new) { ++ NL_SET_ERR_MSG_MOD(extack, "Changing 'flags' of a running schedule is not supported"); ++ return -EOPNOTSUPP; ++ } ++ ++ if (!taprio_flags_valid(new)) { ++ NL_SET_ERR_MSG_MOD(extack, "Specified 'flags' are not valid"); ++ return -EINVAL; ++ } ++ ++ return new; ++} ++ + static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + struct netlink_ext_ack *extack) + { +@@ -1375,7 +1404,6 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + struct taprio_sched *q = qdisc_priv(sch); + struct net_device *dev = qdisc_dev(sch); + struct tc_mqprio_qopt *mqprio = NULL; +- u32 taprio_flags = 0; + unsigned long flags; + ktime_t start; + int i, err; +@@ -1388,21 +1416,14 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + if (tb[TCA_TAPRIO_ATTR_PRIOMAP]) + mqprio = nla_data(tb[TCA_TAPRIO_ATTR_PRIOMAP]); + +- if (tb[TCA_TAPRIO_ATTR_FLAGS]) { +- taprio_flags = nla_get_u32(tb[TCA_TAPRIO_ATTR_FLAGS]); +- +- if (q->flags != 0 && q->flags != taprio_flags) { +- NL_SET_ERR_MSG_MOD(extack, "Changing 'flags' of a running schedule is not supported"); +- return -EOPNOTSUPP; +- } else if (!taprio_flags_valid(taprio_flags)) { +- NL_SET_ERR_MSG_MOD(extack, "Specified 'flags' are not valid"); +- return -EINVAL; +- } ++ err = taprio_new_flags(tb[TCA_TAPRIO_ATTR_FLAGS], ++ q->flags, extack); ++ if (err < 0) ++ return err; + +- q->flags = taprio_flags; +- } ++ q->flags = err; + +- err = taprio_parse_mqprio_opt(dev, mqprio, extack, taprio_flags); ++ err = taprio_parse_mqprio_opt(dev, mqprio, extack, q->flags); + if (err < 0) + return err; + +@@ -1444,7 +1465,20 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + + taprio_set_picos_per_byte(dev, q); + +- if (FULL_OFFLOAD_IS_ENABLED(taprio_flags)) ++ if (mqprio) { ++ netdev_set_num_tc(dev, mqprio->num_tc); ++ for (i = 0; i < mqprio->num_tc; i++) ++ netdev_set_tc_queue(dev, i, ++ mqprio->count[i], ++ mqprio->offset[i]); ++ ++ /* Always use supplied priority mappings */ ++ for (i = 0; i <= TC_BITMASK; i++) ++ netdev_set_prio_tc_map(dev, i, ++ mqprio->prio_tc_map[i]); ++ } ++ ++ if (FULL_OFFLOAD_IS_ENABLED(q->flags)) + err = taprio_enable_offload(dev, mqprio, q, new_admin, extack); + else + err = taprio_disable_offload(dev, q, extack); +@@ -1464,27 +1498,14 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + q->txtime_delay = nla_get_u32(tb[TCA_TAPRIO_ATTR_TXTIME_DELAY]); + } + +- if (!TXTIME_ASSIST_IS_ENABLED(taprio_flags) && +- !FULL_OFFLOAD_IS_ENABLED(taprio_flags) && ++ if (!TXTIME_ASSIST_IS_ENABLED(q->flags) && ++ !FULL_OFFLOAD_IS_ENABLED(q->flags) && + !hrtimer_active(&q->advance_timer)) { + hrtimer_init(&q->advance_timer, q->clockid, HRTIMER_MODE_ABS); + q->advance_timer.function = advance_sched; + } + +- if (mqprio) { +- netdev_set_num_tc(dev, mqprio->num_tc); +- for (i = 0; i < mqprio->num_tc; i++) +- netdev_set_tc_queue(dev, i, +- mqprio->count[i], +- mqprio->offset[i]); +- +- /* Always use supplied priority mappings */ +- for (i = 0; i <= TC_BITMASK; i++) +- netdev_set_prio_tc_map(dev, i, +- mqprio->prio_tc_map[i]); +- } +- +- if (FULL_OFFLOAD_IS_ENABLED(taprio_flags)) { ++ if (FULL_OFFLOAD_IS_ENABLED(q->flags)) { + q->dequeue = taprio_dequeue_offload; + q->peek = taprio_peek_offload; + } else { +@@ -1501,9 +1522,9 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + goto unlock; + } + +- if (TXTIME_ASSIST_IS_ENABLED(taprio_flags)) { +- setup_txtime(q, new_admin, start); ++ setup_txtime(q, new_admin, start); + ++ if (TXTIME_ASSIST_IS_ENABLED(q->flags)) { + if (!oper) { + rcu_assign_pointer(q->oper_sched, new_admin); + err = 0; +@@ -1528,7 +1549,7 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + + spin_unlock_irqrestore(&q->current_entry_lock, flags); + +- if (FULL_OFFLOAD_IS_ENABLED(taprio_flags)) ++ if (FULL_OFFLOAD_IS_ENABLED(q->flags)) + taprio_offload_config_changed(q); + } + +@@ -1567,7 +1588,7 @@ static void taprio_destroy(struct Qdisc *sch) + } + q->qdiscs = NULL; + +- netdev_set_num_tc(dev, 0); ++ netdev_reset_tc(dev); + + if (q->oper_sched) + call_rcu(&q->oper_sched->rcu, taprio_free_sched_cb); +@@ -1597,6 +1618,7 @@ static int taprio_init(struct Qdisc *sch, struct nlattr *opt, + * and get the valid one on taprio_change(). + */ + q->clockid = -1; ++ q->flags = TAPRIO_FLAGS_INVALID; + + spin_lock(&taprio_list_lock); + list_add(&q->taprio_list, &taprio_list); +diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c +index 908b60a72d95..ed20fa8a6f70 100644 +--- a/net/sunrpc/auth_gss/svcauth_gss.c ++++ b/net/sunrpc/auth_gss/svcauth_gss.c +@@ -1245,6 +1245,7 @@ static int gss_proxy_save_rsc(struct cache_detail *cd, + dprintk("RPC: No creds found!\n"); + goto out; + } else { ++ struct timespec64 boot; + + /* steal creds */ + rsci.cred = ud->creds; +@@ -1265,6 +1266,9 @@ static int gss_proxy_save_rsc(struct cache_detail *cd, + &expiry, GFP_KERNEL); + if (status) + goto out; ++ ++ getboottime64(&boot); ++ expiry -= boot.tv_sec; + } + + rsci.h.expiry_time = expiry; +diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile +index 42b571cde177..e7ad48c605e0 100644 +--- a/samples/bpf/Makefile ++++ b/samples/bpf/Makefile +@@ -236,7 +236,7 @@ all: + + clean: + $(MAKE) -C ../../ M=$(CURDIR) clean +- @rm -f *~ ++ @find $(CURDIR) -type f -name '*~' -delete + + $(LIBBPF): FORCE + # Fix up variables inherited from Kbuild that tools/ build system won't like +diff --git a/samples/bpf/xdp_redirect_cpu_user.c b/samples/bpf/xdp_redirect_cpu_user.c +index 0da6e9e7132e..8b862a7a6c6a 100644 +--- a/samples/bpf/xdp_redirect_cpu_user.c ++++ b/samples/bpf/xdp_redirect_cpu_user.c +@@ -16,6 +16,10 @@ static const char *__doc__ = + #include + #include + #include ++#include ++ ++#define __must_check ++#include + + #include + #include +@@ -46,6 +50,10 @@ static int cpus_count_map_fd; + static int cpus_iterator_map_fd; + static int exception_cnt_map_fd; + ++#define NUM_TP 5 ++struct bpf_link *tp_links[NUM_TP] = { 0 }; ++static int tp_cnt = 0; ++ + /* Exit return codes */ + #define EXIT_OK 0 + #define EXIT_FAIL 1 +@@ -88,6 +96,10 @@ static void int_exit(int sig) + printf("program on interface changed, not removing\n"); + } + } ++ /* Detach tracepoints */ ++ while (tp_cnt) ++ bpf_link__destroy(tp_links[--tp_cnt]); ++ + exit(EXIT_OK); + } + +@@ -588,23 +600,61 @@ static void stats_poll(int interval, bool use_separators, char *prog_name, + free_stats_record(prev); + } + ++static struct bpf_link * attach_tp(struct bpf_object *obj, ++ const char *tp_category, ++ const char* tp_name) ++{ ++ struct bpf_program *prog; ++ struct bpf_link *link; ++ char sec_name[PATH_MAX]; ++ int len; ++ ++ len = snprintf(sec_name, PATH_MAX, "tracepoint/%s/%s", ++ tp_category, tp_name); ++ if (len < 0) ++ exit(EXIT_FAIL); ++ ++ prog = bpf_object__find_program_by_title(obj, sec_name); ++ if (!prog) { ++ fprintf(stderr, "ERR: finding progsec: %s\n", sec_name); ++ exit(EXIT_FAIL_BPF); ++ } ++ ++ link = bpf_program__attach_tracepoint(prog, tp_category, tp_name); ++ if (IS_ERR(link)) ++ exit(EXIT_FAIL_BPF); ++ ++ return link; ++} ++ ++static void init_tracepoints(struct bpf_object *obj) { ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_redirect_err"); ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_redirect_map_err"); ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_exception"); ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_cpumap_enqueue"); ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_cpumap_kthread"); ++} ++ + static int init_map_fds(struct bpf_object *obj) + { +- cpu_map_fd = bpf_object__find_map_fd_by_name(obj, "cpu_map"); +- rx_cnt_map_fd = bpf_object__find_map_fd_by_name(obj, "rx_cnt"); ++ /* Maps updated by tracepoints */ + redirect_err_cnt_map_fd = + bpf_object__find_map_fd_by_name(obj, "redirect_err_cnt"); ++ exception_cnt_map_fd = ++ bpf_object__find_map_fd_by_name(obj, "exception_cnt"); + cpumap_enqueue_cnt_map_fd = + bpf_object__find_map_fd_by_name(obj, "cpumap_enqueue_cnt"); + cpumap_kthread_cnt_map_fd = + bpf_object__find_map_fd_by_name(obj, "cpumap_kthread_cnt"); ++ ++ /* Maps used by XDP */ ++ rx_cnt_map_fd = bpf_object__find_map_fd_by_name(obj, "rx_cnt"); ++ cpu_map_fd = bpf_object__find_map_fd_by_name(obj, "cpu_map"); + cpus_available_map_fd = + bpf_object__find_map_fd_by_name(obj, "cpus_available"); + cpus_count_map_fd = bpf_object__find_map_fd_by_name(obj, "cpus_count"); + cpus_iterator_map_fd = + bpf_object__find_map_fd_by_name(obj, "cpus_iterator"); +- exception_cnt_map_fd = +- bpf_object__find_map_fd_by_name(obj, "exception_cnt"); + + if (cpu_map_fd < 0 || rx_cnt_map_fd < 0 || + redirect_err_cnt_map_fd < 0 || cpumap_enqueue_cnt_map_fd < 0 || +@@ -662,6 +712,7 @@ int main(int argc, char **argv) + strerror(errno)); + return EXIT_FAIL; + } ++ init_tracepoints(obj); + if (init_map_fds(obj) < 0) { + fprintf(stderr, "bpf_object__find_map_fd_by_name failed\n"); + return EXIT_FAIL; +diff --git a/scripts/find-unused-docs.sh b/scripts/find-unused-docs.sh +index 3f46f8977dc4..ee6a50e33aba 100755 +--- a/scripts/find-unused-docs.sh ++++ b/scripts/find-unused-docs.sh +@@ -54,7 +54,7 @@ for file in `find $1 -name '*.c'`; do + if [[ ${FILES_INCLUDED[$file]+_} ]]; then + continue; + fi +- str=$(scripts/kernel-doc -text -export "$file" 2>/dev/null) ++ str=$(scripts/kernel-doc -export "$file" 2>/dev/null) + if [[ -n "$str" ]]; then + echo "$file" + fi +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index abeb09c30633..ad22066eba04 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -2832,42 +2832,39 @@ static int smack_socket_connect(struct socket *sock, struct sockaddr *sap, + int addrlen) + { + int rc = 0; +-#if IS_ENABLED(CONFIG_IPV6) +- struct sockaddr_in6 *sip = (struct sockaddr_in6 *)sap; +-#endif +-#ifdef SMACK_IPV6_SECMARK_LABELING +- struct smack_known *rsp; +- struct socket_smack *ssp; +-#endif + + if (sock->sk == NULL) + return 0; +- ++ if (sock->sk->sk_family != PF_INET && ++ (!IS_ENABLED(CONFIG_IPV6) || sock->sk->sk_family != PF_INET6)) ++ return 0; ++ if (addrlen < offsetofend(struct sockaddr, sa_family)) ++ return 0; ++ if (IS_ENABLED(CONFIG_IPV6) && sap->sa_family == AF_INET6) { ++ struct sockaddr_in6 *sip = (struct sockaddr_in6 *)sap; + #ifdef SMACK_IPV6_SECMARK_LABELING +- ssp = sock->sk->sk_security; ++ struct smack_known *rsp; + #endif + +- switch (sock->sk->sk_family) { +- case PF_INET: +- if (addrlen < sizeof(struct sockaddr_in) || +- sap->sa_family != AF_INET) +- return -EINVAL; +- rc = smack_netlabel_send(sock->sk, (struct sockaddr_in *)sap); +- break; +- case PF_INET6: +- if (addrlen < SIN6_LEN_RFC2133 || sap->sa_family != AF_INET6) +- return -EINVAL; ++ if (addrlen < SIN6_LEN_RFC2133) ++ return 0; + #ifdef SMACK_IPV6_SECMARK_LABELING + rsp = smack_ipv6host_label(sip); +- if (rsp != NULL) ++ if (rsp != NULL) { ++ struct socket_smack *ssp = sock->sk->sk_security; ++ + rc = smk_ipv6_check(ssp->smk_out, rsp, sip, +- SMK_CONNECTING); ++ SMK_CONNECTING); ++ } + #endif + #ifdef SMACK_IPV6_PORT_LABELING + rc = smk_ipv6_port_check(sock->sk, sip, SMK_CONNECTING); + #endif +- break; ++ return rc; + } ++ if (sap->sa_family != AF_INET || addrlen < sizeof(struct sockaddr_in)) ++ return 0; ++ rc = smack_netlabel_send(sock->sk, (struct sockaddr_in *)sap); + return rc; + } + +diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c +index aee7c04d49e5..b61ba0321a72 100644 +--- a/sound/drivers/dummy.c ++++ b/sound/drivers/dummy.c +@@ -915,7 +915,7 @@ static void print_formats(struct snd_dummy *dummy, + { + int i; + +- for (i = 0; i < SNDRV_PCM_FORMAT_LAST; i++) { ++ for (i = 0; i <= SNDRV_PCM_FORMAT_LAST; i++) { + if (dummy->pcm_hw.formats & (1ULL << i)) + snd_iprintf(buffer, " %s", snd_pcm_format_name(i)); + } +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c +index f6cbb831b86a..85beb172d810 100644 +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2156,6 +2156,8 @@ static struct snd_pci_quirk power_save_blacklist[] = { + /* https://bugzilla.redhat.com/show_bug.cgi?id=1581607 */ + SND_PCI_QUIRK(0x1558, 0x3501, "Clevo W35xSS_370SS", 0), + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ ++ SND_PCI_QUIRK(0x1558, 0x6504, "Clevo W65_67SB", 0), ++ /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ + SND_PCI_QUIRK(0x1028, 0x0497, "Dell Precision T3600", 0), + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ + /* Note the P55A-UD3 and Z87-D3HP share the subsys id for the HDA dev */ +@@ -2415,6 +2417,8 @@ static const struct pci_device_id azx_ids[] = { + /* Jasperlake */ + { PCI_DEVICE(0x8086, 0x38c8), + .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, ++ { PCI_DEVICE(0x8086, 0x4dc8), ++ .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, + /* Tigerlake */ + { PCI_DEVICE(0x8086, 0xa0c8), + .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, +diff --git a/sound/pci/hda/hda_tegra.c b/sound/pci/hda/hda_tegra.c +index 8350954b7986..e5191584638a 100644 +--- a/sound/pci/hda/hda_tegra.c ++++ b/sound/pci/hda/hda_tegra.c +@@ -398,6 +398,7 @@ static int hda_tegra_create(struct snd_card *card, + return err; + + chip->bus.needs_damn_long_delay = 1; ++ chip->bus.core.aligned_mmio = 1; + + err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); + if (err < 0) { +diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c +index 488c17c9f375..8ac805a634f4 100644 +--- a/sound/pci/hda/patch_hdmi.c ++++ b/sound/pci/hda/patch_hdmi.c +@@ -4153,6 +4153,7 @@ HDA_CODEC_ENTRY(0x8086280c, "Cannonlake HDMI", patch_i915_glk_hdmi), + HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_glk_hdmi), + HDA_CODEC_ENTRY(0x8086280f, "Icelake HDMI", patch_i915_icl_hdmi), + HDA_CODEC_ENTRY(0x80862812, "Tigerlake HDMI", patch_i915_tgl_hdmi), ++HDA_CODEC_ENTRY(0x8086281a, "Jasperlake HDMI", patch_i915_icl_hdmi), + HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi), + HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi), + HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi), +diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c +index aa1f9637d895..e949b372cead 100644 +--- a/sound/soc/codecs/sgtl5000.c ++++ b/sound/soc/codecs/sgtl5000.c +@@ -1344,7 +1344,8 @@ static int sgtl5000_set_power_regs(struct snd_soc_component *component) + * if vddio == vdda the source of charge pump should be + * assigned manually to VDDIO + */ +- if (vddio == vdda) { ++ if (regulator_is_equal(sgtl5000->supplies[VDDA].consumer, ++ sgtl5000->supplies[VDDIO].consumer)) { + lreg_ctrl |= SGTL5000_VDDC_ASSN_OVRD; + lreg_ctrl |= SGTL5000_VDDC_MAN_ASSN_VDDIO << + SGTL5000_VDDC_MAN_ASSN_SHIFT; +diff --git a/sound/soc/intel/boards/skl_hda_dsp_common.c b/sound/soc/intel/boards/skl_hda_dsp_common.c +index 58409b6e476e..e3d405e57c5f 100644 +--- a/sound/soc/intel/boards/skl_hda_dsp_common.c ++++ b/sound/soc/intel/boards/skl_hda_dsp_common.c +@@ -38,16 +38,19 @@ int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device) + return 0; + } + +-SND_SOC_DAILINK_DEFS(idisp1, +- DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")), ++SND_SOC_DAILINK_DEF(idisp1_cpu, ++ DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin"))); ++SND_SOC_DAILINK_DEF(idisp1_codec, + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1"))); + +-SND_SOC_DAILINK_DEFS(idisp2, +- DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")), ++SND_SOC_DAILINK_DEF(idisp2_cpu, ++ DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin"))); ++SND_SOC_DAILINK_DEF(idisp2_codec, + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2"))); + +-SND_SOC_DAILINK_DEFS(idisp3, +- DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")), ++SND_SOC_DAILINK_DEF(idisp3_cpu, ++ DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin"))); ++SND_SOC_DAILINK_DEF(idisp3_codec, + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3"))); + + SND_SOC_DAILINK_DEF(analog_cpu, +@@ -80,21 +83,21 @@ struct snd_soc_dai_link skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = { + .id = 1, + .dpcm_playback = 1, + .no_pcm = 1, +- SND_SOC_DAILINK_REG(idisp1), ++ SND_SOC_DAILINK_REG(idisp1_cpu, idisp1_codec, platform), + }, + { + .name = "iDisp2", + .id = 2, + .dpcm_playback = 1, + .no_pcm = 1, +- SND_SOC_DAILINK_REG(idisp2), ++ SND_SOC_DAILINK_REG(idisp2_cpu, idisp2_codec, platform), + }, + { + .name = "iDisp3", + .id = 3, + .dpcm_playback = 1, + .no_pcm = 1, +- SND_SOC_DAILINK_REG(idisp3), ++ SND_SOC_DAILINK_REG(idisp3_cpu, idisp3_codec, platform), + }, + { + .name = "Analog Playback and Capture", +diff --git a/sound/soc/meson/axg-fifo.c b/sound/soc/meson/axg-fifo.c +index 5a3749938900..d286dff3171d 100644 +--- a/sound/soc/meson/axg-fifo.c ++++ b/sound/soc/meson/axg-fifo.c +@@ -108,10 +108,12 @@ static int axg_fifo_pcm_hw_params(struct snd_pcm_substream *ss, + { + struct snd_pcm_runtime *runtime = ss->runtime; + struct axg_fifo *fifo = axg_fifo_data(ss); ++ unsigned int burst_num, period, threshold; + dma_addr_t end_ptr; +- unsigned int burst_num; + int ret; + ++ period = params_period_bytes(params); ++ + ret = snd_pcm_lib_malloc_pages(ss, params_buffer_bytes(params)); + if (ret < 0) + return ret; +@@ -122,9 +124,25 @@ static int axg_fifo_pcm_hw_params(struct snd_pcm_substream *ss, + regmap_write(fifo->map, FIFO_FINISH_ADDR, end_ptr); + + /* Setup interrupt periodicity */ +- burst_num = params_period_bytes(params) / AXG_FIFO_BURST; ++ burst_num = period / AXG_FIFO_BURST; + regmap_write(fifo->map, FIFO_INT_ADDR, burst_num); + ++ /* ++ * Start the fifo request on the smallest of the following: ++ * - Half the fifo size ++ * - Half the period size ++ */ ++ threshold = min(period / 2, ++ (unsigned int)AXG_FIFO_MIN_DEPTH / 2); ++ ++ /* ++ * With the threshold in bytes, register value is: ++ * V = (threshold / burst) - 1 ++ */ ++ threshold /= AXG_FIFO_BURST; ++ regmap_field_write(fifo->field_threshold, ++ threshold ? threshold - 1 : 0); ++ + /* Enable block count irq */ + regmap_update_bits(fifo->map, FIFO_CTRL0, + CTRL0_INT_EN(FIFO_INT_COUNT_REPEAT), +@@ -360,6 +378,11 @@ int axg_fifo_probe(struct platform_device *pdev) + return fifo->irq; + } + ++ fifo->field_threshold = ++ devm_regmap_field_alloc(dev, fifo->map, data->field_threshold); ++ if (IS_ERR(fifo->field_threshold)) ++ return PTR_ERR(fifo->field_threshold); ++ + return devm_snd_soc_register_component(dev, data->component_drv, + data->dai_drv, 1); + } +diff --git a/sound/soc/meson/axg-fifo.h b/sound/soc/meson/axg-fifo.h +index bb1e2ce50256..ab546a3cf940 100644 +--- a/sound/soc/meson/axg-fifo.h ++++ b/sound/soc/meson/axg-fifo.h +@@ -9,7 +9,9 @@ + + struct clk; + struct platform_device; ++struct reg_field; + struct regmap; ++struct regmap_field; + struct reset_control; + + struct snd_soc_component_driver; +@@ -50,8 +52,6 @@ struct snd_soc_pcm_runtime; + #define CTRL1_STATUS2_SEL_MASK GENMASK(11, 8) + #define CTRL1_STATUS2_SEL(x) ((x) << 8) + #define STATUS2_SEL_DDR_READ 0 +-#define CTRL1_THRESHOLD_MASK GENMASK(23, 16) +-#define CTRL1_THRESHOLD(x) ((x) << 16) + #define CTRL1_FRDDR_DEPTH_MASK GENMASK(31, 24) + #define CTRL1_FRDDR_DEPTH(x) ((x) << 24) + #define FIFO_START_ADDR 0x08 +@@ -67,12 +67,14 @@ struct axg_fifo { + struct regmap *map; + struct clk *pclk; + struct reset_control *arb; ++ struct regmap_field *field_threshold; + int irq; + }; + + struct axg_fifo_match_data { + const struct snd_soc_component_driver *component_drv; + struct snd_soc_dai_driver *dai_drv; ++ struct reg_field field_threshold; + }; + + extern const struct snd_pcm_ops axg_fifo_pcm_ops; +diff --git a/sound/soc/meson/axg-frddr.c b/sound/soc/meson/axg-frddr.c +index 6ab111c31b28..09773a9ae964 100644 +--- a/sound/soc/meson/axg-frddr.c ++++ b/sound/soc/meson/axg-frddr.c +@@ -50,7 +50,7 @@ static int axg_frddr_dai_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) + { + struct axg_fifo *fifo = snd_soc_dai_get_drvdata(dai); +- unsigned int fifo_depth, fifo_threshold; ++ unsigned int fifo_depth; + int ret; + + /* Enable pclk to access registers and clock the fifo ip */ +@@ -68,11 +68,8 @@ static int axg_frddr_dai_startup(struct snd_pcm_substream *substream, + * Depth and threshold are zero based. + */ + fifo_depth = AXG_FIFO_MIN_CNT - 1; +- fifo_threshold = (AXG_FIFO_MIN_CNT / 2) - 1; +- regmap_update_bits(fifo->map, FIFO_CTRL1, +- CTRL1_FRDDR_DEPTH_MASK | CTRL1_THRESHOLD_MASK, +- CTRL1_FRDDR_DEPTH(fifo_depth) | +- CTRL1_THRESHOLD(fifo_threshold)); ++ regmap_update_bits(fifo->map, FIFO_CTRL1, CTRL1_FRDDR_DEPTH_MASK, ++ CTRL1_FRDDR_DEPTH(fifo_depth)); + + return 0; + } +@@ -153,8 +150,9 @@ static const struct snd_soc_component_driver axg_frddr_component_drv = { + }; + + static const struct axg_fifo_match_data axg_frddr_match_data = { +- .component_drv = &axg_frddr_component_drv, +- .dai_drv = &axg_frddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &axg_frddr_component_drv, ++ .dai_drv = &axg_frddr_dai_drv + }; + + static const struct snd_soc_dai_ops g12a_frddr_ops = { +@@ -271,8 +269,9 @@ static const struct snd_soc_component_driver g12a_frddr_component_drv = { + }; + + static const struct axg_fifo_match_data g12a_frddr_match_data = { +- .component_drv = &g12a_frddr_component_drv, +- .dai_drv = &g12a_frddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &g12a_frddr_component_drv, ++ .dai_drv = &g12a_frddr_dai_drv + }; + + /* On SM1, the output selection in on CTRL2 */ +@@ -335,8 +334,9 @@ static const struct snd_soc_component_driver sm1_frddr_component_drv = { + }; + + static const struct axg_fifo_match_data sm1_frddr_match_data = { +- .component_drv = &sm1_frddr_component_drv, +- .dai_drv = &g12a_frddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &sm1_frddr_component_drv, ++ .dai_drv = &g12a_frddr_dai_drv + }; + + static const struct of_device_id axg_frddr_of_match[] = { +diff --git a/sound/soc/meson/axg-toddr.c b/sound/soc/meson/axg-toddr.c +index c8ea2145f576..ecf41c7549a6 100644 +--- a/sound/soc/meson/axg-toddr.c ++++ b/sound/soc/meson/axg-toddr.c +@@ -89,7 +89,6 @@ static int axg_toddr_dai_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) + { + struct axg_fifo *fifo = snd_soc_dai_get_drvdata(dai); +- unsigned int fifo_threshold; + int ret; + + /* Enable pclk to access registers and clock the fifo ip */ +@@ -107,11 +106,6 @@ static int axg_toddr_dai_startup(struct snd_pcm_substream *substream, + /* Apply single buffer mode to the interface */ + regmap_update_bits(fifo->map, FIFO_CTRL0, CTRL0_TODDR_PP_MODE, 0); + +- /* TODDR does not have a configurable fifo depth */ +- fifo_threshold = AXG_FIFO_MIN_CNT - 1; +- regmap_update_bits(fifo->map, FIFO_CTRL1, CTRL1_THRESHOLD_MASK, +- CTRL1_THRESHOLD(fifo_threshold)); +- + return 0; + } + +@@ -185,8 +179,9 @@ static const struct snd_soc_component_driver axg_toddr_component_drv = { + }; + + static const struct axg_fifo_match_data axg_toddr_match_data = { +- .component_drv = &axg_toddr_component_drv, +- .dai_drv = &axg_toddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &axg_toddr_component_drv, ++ .dai_drv = &axg_toddr_dai_drv + }; + + static const struct snd_soc_dai_ops g12a_toddr_ops = { +@@ -218,8 +213,9 @@ static const struct snd_soc_component_driver g12a_toddr_component_drv = { + }; + + static const struct axg_fifo_match_data g12a_toddr_match_data = { +- .component_drv = &g12a_toddr_component_drv, +- .dai_drv = &g12a_toddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &g12a_toddr_component_drv, ++ .dai_drv = &g12a_toddr_dai_drv + }; + + static const char * const sm1_toddr_sel_texts[] = { +@@ -282,8 +278,9 @@ static const struct snd_soc_component_driver sm1_toddr_component_drv = { + }; + + static const struct axg_fifo_match_data sm1_toddr_match_data = { +- .component_drv = &sm1_toddr_component_drv, +- .dai_drv = &g12a_toddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 12, 23), ++ .component_drv = &sm1_toddr_component_drv, ++ .dai_drv = &g12a_toddr_dai_drv + }; + + static const struct of_device_id axg_toddr_of_match[] = { +diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c +index 81f28f7ff1a0..12aec140819a 100644 +--- a/sound/soc/sof/core.c ++++ b/sound/soc/sof/core.c +@@ -288,6 +288,46 @@ static int sof_machine_check(struct snd_sof_dev *sdev) + #endif + } + ++/* ++ * FW Boot State Transition Diagram ++ * ++ * +-----------------------------------------------------------------------+ ++ * | | ++ * ------------------ ------------------ | ++ * | | | | | ++ * | BOOT_FAILED | | READY_FAILED |-------------------------+ | ++ * | | | | | | ++ * ------------------ ------------------ | | ++ * ^ ^ | | ++ * | | | | ++ * (FW Boot Timeout) (FW_READY FAIL) | | ++ * | | | | ++ * | | | | ++ * ------------------ | ------------------ | | ++ * | | | | | | | ++ * | IN_PROGRESS |---------------+------------->| COMPLETE | | | ++ * | | (FW Boot OK) (FW_READY OK) | | | | ++ * ------------------ ------------------ | | ++ * ^ | | | ++ * | | | | ++ * (FW Loading OK) (System Suspend/Runtime Suspend) ++ * | | | | ++ * | | | | ++ * ------------------ ------------------ | | | ++ * | | | |<-----+ | | ++ * | PREPARE | | NOT_STARTED |<---------------------+ | ++ * | | | |<---------------------------+ ++ * ------------------ ------------------ ++ * | ^ | ^ ++ * | | | | ++ * | +-----------------------+ | ++ * | (DSP Probe OK) | ++ * | | ++ * | | ++ * +------------------------------------+ ++ * (System Suspend/Runtime Suspend) ++ */ ++ + static int sof_probe_continue(struct snd_sof_dev *sdev) + { + struct snd_sof_pdata *plat_data = sdev->pdata; +@@ -303,6 +343,8 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + return ret; + } + ++ sdev->fw_state = SOF_FW_BOOT_PREPARE; ++ + /* check machine info */ + ret = sof_machine_check(sdev); + if (ret < 0) { +@@ -342,7 +384,12 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + goto fw_load_err; + } + +- /* boot the firmware */ ++ sdev->fw_state = SOF_FW_BOOT_IN_PROGRESS; ++ ++ /* ++ * Boot the firmware. The FW boot status will be modified ++ * in snd_sof_run_firmware() depending on the outcome. ++ */ + ret = snd_sof_run_firmware(sdev); + if (ret < 0) { + dev_err(sdev->dev, "error: failed to boot DSP firmware %d\n", +@@ -368,7 +415,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + if (ret < 0) { + dev_err(sdev->dev, + "error: failed to register DSP DAI driver %d\n", ret); +- goto fw_run_err; ++ goto fw_trace_err; + } + + drv_name = plat_data->machine->drv_name; +@@ -382,7 +429,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + + if (IS_ERR(plat_data->pdev_mach)) { + ret = PTR_ERR(plat_data->pdev_mach); +- goto fw_run_err; ++ goto fw_trace_err; + } + + dev_dbg(sdev->dev, "created machine %s\n", +@@ -393,7 +440,8 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + + return 0; + +-#if !IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE) ++fw_trace_err: ++ snd_sof_free_trace(sdev); + fw_run_err: + snd_sof_fw_unload(sdev); + fw_load_err: +@@ -402,21 +450,10 @@ ipc_err: + snd_sof_free_debug(sdev); + dbg_err: + snd_sof_remove(sdev); +-#else +- +- /* +- * when the probe_continue is handled in a work queue, the +- * probe does not fail so we don't release resources here. +- * They will be released with an explicit call to +- * snd_sof_device_remove() when the PCI/ACPI device is removed +- */ + +-fw_run_err: +-fw_load_err: +-ipc_err: +-dbg_err: +- +-#endif ++ /* all resources freed, update state to match */ ++ sdev->fw_state = SOF_FW_BOOT_NOT_STARTED; ++ sdev->first_boot = true; + + return ret; + } +@@ -447,6 +484,7 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) + + sdev->pdata = plat_data; + sdev->first_boot = true; ++ sdev->fw_state = SOF_FW_BOOT_NOT_STARTED; + dev_set_drvdata(dev, sdev); + + /* check all mandatory ops */ +@@ -494,10 +532,12 @@ int snd_sof_device_remove(struct device *dev) + if (IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)) + cancel_work_sync(&sdev->probe_work); + +- snd_sof_fw_unload(sdev); +- snd_sof_ipc_free(sdev); +- snd_sof_free_debug(sdev); +- snd_sof_free_trace(sdev); ++ if (sdev->fw_state > SOF_FW_BOOT_NOT_STARTED) { ++ snd_sof_fw_unload(sdev); ++ snd_sof_ipc_free(sdev); ++ snd_sof_free_debug(sdev); ++ snd_sof_free_trace(sdev); ++ } + + /* + * Unregister machine driver. This will unbind the snd_card which +@@ -513,7 +553,8 @@ int snd_sof_device_remove(struct device *dev) + * scheduled on, when they are unloaded. Therefore, the DSP must be + * removed only after the topology has been unloaded. + */ +- snd_sof_remove(sdev); ++ if (sdev->fw_state > SOF_FW_BOOT_NOT_STARTED) ++ snd_sof_remove(sdev); + + /* release firmware */ + release_firmware(pdata->fw); +diff --git a/sound/soc/sof/intel/hda-loader.c b/sound/soc/sof/intel/hda-loader.c +index 65c2af3fcaab..356bb134ae93 100644 +--- a/sound/soc/sof/intel/hda-loader.c ++++ b/sound/soc/sof/intel/hda-loader.c +@@ -278,7 +278,6 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev) + + /* init for booting wait */ + init_waitqueue_head(&sdev->boot_wait); +- sdev->boot_complete = false; + + /* prepare DMA for code loader stream */ + tag = cl_stream_prepare(sdev, 0x40, stripped_firmware.size, +diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c +index 5a5163eef2ef..3c4b604412f0 100644 +--- a/sound/soc/sof/intel/hda.c ++++ b/sound/soc/sof/intel/hda.c +@@ -166,7 +166,7 @@ void hda_dsp_dump_skl(struct snd_sof_dev *sdev, u32 flags) + panic = snd_sof_dsp_read(sdev, HDA_DSP_BAR, + HDA_ADSP_ERROR_CODE_SKL + 0x4); + +- if (sdev->boot_complete) { ++ if (sdev->fw_state == SOF_FW_BOOT_COMPLETE) { + hda_dsp_get_registers(sdev, &xoops, &panic_info, stack, + HDA_DSP_STACK_DUMP_SIZE); + snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, +@@ -193,7 +193,7 @@ void hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags) + HDA_DSP_SRAM_REG_FW_STATUS); + panic = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_FW_TRACEP); + +- if (sdev->boot_complete) { ++ if (sdev->fw_state == SOF_FW_BOOT_COMPLETE) { + hda_dsp_get_registers(sdev, &xoops, &panic_info, stack, + HDA_DSP_STACK_DUMP_SIZE); + snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, +diff --git a/sound/soc/sof/ipc.c b/sound/soc/sof/ipc.c +index 7b6d69783e16..8984d965037d 100644 +--- a/sound/soc/sof/ipc.c ++++ b/sound/soc/sof/ipc.c +@@ -348,19 +348,12 @@ void snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev) + break; + case SOF_IPC_FW_READY: + /* check for FW boot completion */ +- if (!sdev->boot_complete) { ++ if (sdev->fw_state == SOF_FW_BOOT_IN_PROGRESS) { + err = sof_ops(sdev)->fw_ready(sdev, cmd); +- if (err < 0) { +- /* +- * this indicates a mismatch in ABI +- * between the driver and fw +- */ +- dev_err(sdev->dev, "error: ABI mismatch %d\n", +- err); +- } else { +- /* firmware boot completed OK */ +- sdev->boot_complete = true; +- } ++ if (err < 0) ++ sdev->fw_state = SOF_FW_BOOT_READY_FAILED; ++ else ++ sdev->fw_state = SOF_FW_BOOT_COMPLETE; + + /* wake up firmware loader */ + wake_up(&sdev->boot_wait); +diff --git a/sound/soc/sof/loader.c b/sound/soc/sof/loader.c +index a041adf0669d..ce114df5e4fc 100644 +--- a/sound/soc/sof/loader.c ++++ b/sound/soc/sof/loader.c +@@ -511,7 +511,6 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev) + int init_core_mask; + + init_waitqueue_head(&sdev->boot_wait); +- sdev->boot_complete = false; + + /* create read-only fw_version debugfs to store boot version info */ + if (sdev->first_boot) { +@@ -543,19 +542,27 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev) + + init_core_mask = ret; + +- /* now wait for the DSP to boot */ +- ret = wait_event_timeout(sdev->boot_wait, sdev->boot_complete, ++ /* ++ * now wait for the DSP to boot. There are 3 possible outcomes: ++ * 1. Boot wait times out indicating FW boot failure. ++ * 2. FW boots successfully and fw_ready op succeeds. ++ * 3. FW boots but fw_ready op fails. ++ */ ++ ret = wait_event_timeout(sdev->boot_wait, ++ sdev->fw_state > SOF_FW_BOOT_IN_PROGRESS, + msecs_to_jiffies(sdev->boot_timeout)); + if (ret == 0) { + dev_err(sdev->dev, "error: firmware boot failure\n"); + snd_sof_dsp_dbg_dump(sdev, SOF_DBG_REGS | SOF_DBG_MBOX | + SOF_DBG_TEXT | SOF_DBG_PCI); +- /* after this point FW_READY msg should be ignored */ +- sdev->boot_complete = true; ++ sdev->fw_state = SOF_FW_BOOT_FAILED; + return -EIO; + } + +- dev_info(sdev->dev, "firmware boot complete\n"); ++ if (sdev->fw_state == SOF_FW_BOOT_COMPLETE) ++ dev_info(sdev->dev, "firmware boot complete\n"); ++ else ++ return -EIO; /* FW boots but fw_ready op failed */ + + /* perform post fw run operations */ + ret = snd_sof_dsp_post_fw_run(sdev); +diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c +index e23beaeefe00..195af259e78e 100644 +--- a/sound/soc/sof/pm.c ++++ b/sound/soc/sof/pm.c +@@ -269,6 +269,10 @@ static int sof_resume(struct device *dev, bool runtime_resume) + if (!sof_ops(sdev)->resume || !sof_ops(sdev)->runtime_resume) + return 0; + ++ /* DSP was never successfully started, nothing to resume */ ++ if (sdev->first_boot) ++ return 0; ++ + /* + * if the runtime_resume flag is set, call the runtime_resume routine + * or else call the system resume routine +@@ -283,6 +287,8 @@ static int sof_resume(struct device *dev, bool runtime_resume) + return ret; + } + ++ sdev->fw_state = SOF_FW_BOOT_PREPARE; ++ + /* load the firmware */ + ret = snd_sof_load_firmware(sdev); + if (ret < 0) { +@@ -292,7 +298,12 @@ static int sof_resume(struct device *dev, bool runtime_resume) + return ret; + } + +- /* boot the firmware */ ++ sdev->fw_state = SOF_FW_BOOT_IN_PROGRESS; ++ ++ /* ++ * Boot the firmware. The FW boot status will be modified ++ * in snd_sof_run_firmware() depending on the outcome. ++ */ + ret = snd_sof_run_firmware(sdev); + if (ret < 0) { + dev_err(sdev->dev, +@@ -338,6 +349,9 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) + if (!sof_ops(sdev)->suspend) + return 0; + ++ if (sdev->fw_state != SOF_FW_BOOT_COMPLETE) ++ goto power_down; ++ + /* release trace */ + snd_sof_release_trace(sdev); + +@@ -375,6 +389,12 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) + ret); + } + ++power_down: ++ ++ /* return if the DSP was not probed successfully */ ++ if (sdev->fw_state == SOF_FW_BOOT_NOT_STARTED) ++ return 0; ++ + /* power down all DSP cores */ + if (runtime_suspend) + ret = snd_sof_dsp_runtime_suspend(sdev); +@@ -385,6 +405,9 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) + "error: failed to power down DSP during suspend %d\n", + ret); + ++ /* reset FW state */ ++ sdev->fw_state = SOF_FW_BOOT_NOT_STARTED; ++ + return ret; + } + +diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h +index 730f3259dd02..7b329bd99674 100644 +--- a/sound/soc/sof/sof-priv.h ++++ b/sound/soc/sof/sof-priv.h +@@ -356,6 +356,15 @@ struct snd_sof_dai { + struct list_head list; /* list in sdev dai list */ + }; + ++enum snd_sof_fw_state { ++ SOF_FW_BOOT_NOT_STARTED = 0, ++ SOF_FW_BOOT_PREPARE, ++ SOF_FW_BOOT_IN_PROGRESS, ++ SOF_FW_BOOT_FAILED, ++ SOF_FW_BOOT_READY_FAILED, /* firmware booted but fw_ready op failed */ ++ SOF_FW_BOOT_COMPLETE, ++}; ++ + /* + * SOF Device Level. + */ +@@ -372,7 +381,7 @@ struct snd_sof_dev { + + /* DSP firmware boot */ + wait_queue_head_t boot_wait; +- u32 boot_complete; ++ enum snd_sof_fw_state fw_state; + u32 first_boot; + + /* work queue in case the probe is implemented in two steps */ +diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c +index 94b903d95afa..74c00c905d24 100644 +--- a/sound/usb/mixer_scarlett_gen2.c ++++ b/sound/usb/mixer_scarlett_gen2.c +@@ -558,11 +558,11 @@ static const struct scarlett2_config + + /* proprietary request/response format */ + struct scarlett2_usb_packet { +- u32 cmd; +- u16 size; +- u16 seq; +- u32 error; +- u32 pad; ++ __le32 cmd; ++ __le16 size; ++ __le16 seq; ++ __le32 error; ++ __le32 pad; + u8 data[]; + }; + +@@ -664,11 +664,11 @@ static int scarlett2_usb( + "Scarlett Gen 2 USB invalid response; " + "cmd tx/rx %d/%d seq %d/%d size %d/%d " + "error %d pad %d\n", +- le16_to_cpu(req->cmd), le16_to_cpu(resp->cmd), ++ le32_to_cpu(req->cmd), le32_to_cpu(resp->cmd), + le16_to_cpu(req->seq), le16_to_cpu(resp->seq), + resp_size, le16_to_cpu(resp->size), +- le16_to_cpu(resp->error), +- le16_to_cpu(resp->pad)); ++ le32_to_cpu(resp->error), ++ le32_to_cpu(resp->pad)); + err = -EINVAL; + goto unlock; + } +@@ -687,7 +687,7 @@ error: + /* Send SCARLETT2_USB_DATA_CMD SCARLETT2_USB_CONFIG_SAVE */ + static void scarlett2_config_save(struct usb_mixer_interface *mixer) + { +- u32 req = cpu_to_le32(SCARLETT2_USB_CONFIG_SAVE); ++ __le32 req = cpu_to_le32(SCARLETT2_USB_CONFIG_SAVE); + + scarlett2_usb(mixer, SCARLETT2_USB_DATA_CMD, + &req, sizeof(u32), +@@ -713,11 +713,11 @@ static int scarlett2_usb_set_config( + const struct scarlett2_config config_item = + scarlett2_config_items[config_item_num]; + struct { +- u32 offset; +- u32 bytes; +- s32 value; ++ __le32 offset; ++ __le32 bytes; ++ __le32 value; + } __packed req; +- u32 req2; ++ __le32 req2; + int err; + struct scarlett2_mixer_data *private = mixer->private_data; + +@@ -753,8 +753,8 @@ static int scarlett2_usb_get( + int offset, void *buf, int size) + { + struct { +- u32 offset; +- u32 size; ++ __le32 offset; ++ __le32 size; + } __packed req; + + req.offset = cpu_to_le32(offset); +@@ -794,8 +794,8 @@ static int scarlett2_usb_set_mix(struct usb_mixer_interface *mixer, + const struct scarlett2_device_info *info = private->info; + + struct { +- u16 mix_num; +- u16 data[SCARLETT2_INPUT_MIX_MAX]; ++ __le16 mix_num; ++ __le16 data[SCARLETT2_INPUT_MIX_MAX]; + } __packed req; + + int i, j; +@@ -850,9 +850,9 @@ static int scarlett2_usb_set_mux(struct usb_mixer_interface *mixer) + }; + + struct { +- u16 pad; +- u16 num; +- u32 data[SCARLETT2_MUX_MAX]; ++ __le16 pad; ++ __le16 num; ++ __le32 data[SCARLETT2_MUX_MAX]; + } __packed req; + + req.pad = 0; +@@ -911,9 +911,9 @@ static int scarlett2_usb_get_meter_levels(struct usb_mixer_interface *mixer, + u16 *levels) + { + struct { +- u16 pad; +- u16 num_meters; +- u32 magic; ++ __le16 pad; ++ __le16 num_meters; ++ __le32 magic; + } __packed req; + u32 resp[SCARLETT2_NUM_METERS]; + int i, err; +diff --git a/sound/usb/validate.c b/sound/usb/validate.c +index 389e8657434a..5a3c4f7882b0 100644 +--- a/sound/usb/validate.c ++++ b/sound/usb/validate.c +@@ -110,7 +110,7 @@ static bool validate_processing_unit(const void *p, + default: + if (v->type == UAC1_EXTENSION_UNIT) + return true; /* OK */ +- switch (d->wProcessType) { ++ switch (le16_to_cpu(d->wProcessType)) { + case UAC_PROCESS_UP_DOWNMIX: + case UAC_PROCESS_DOLBY_PROLOGIC: + if (d->bLength < len + 1) /* bNrModes */ +@@ -125,7 +125,7 @@ static bool validate_processing_unit(const void *p, + case UAC_VERSION_2: + if (v->type == UAC2_EXTENSION_UNIT_V2) + return true; /* OK */ +- switch (d->wProcessType) { ++ switch (le16_to_cpu(d->wProcessType)) { + case UAC2_PROCESS_UP_DOWNMIX: + case UAC2_PROCESS_DOLBY_PROLOCIC: /* SiC! */ + if (d->bLength < len + 1) /* bNrModes */ +@@ -142,7 +142,7 @@ static bool validate_processing_unit(const void *p, + len += 2; /* wClusterDescrID */ + break; + } +- switch (d->wProcessType) { ++ switch (le16_to_cpu(d->wProcessType)) { + case UAC3_PROCESS_UP_DOWNMIX: + if (d->bLength < len + 1) /* bNrModes */ + return false; +diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat +index ad1b9e646c49..4cf93110c259 100755 +--- a/tools/kvm/kvm_stat/kvm_stat ++++ b/tools/kvm/kvm_stat/kvm_stat +@@ -270,6 +270,7 @@ class ArchX86(Arch): + def __init__(self, exit_reasons): + self.sc_perf_evt_open = 298 + self.ioctl_numbers = IOCTL_NUMBERS ++ self.exit_reason_field = 'exit_reason' + self.exit_reasons = exit_reasons + + def debugfs_is_child(self, field): +@@ -289,6 +290,7 @@ class ArchPPC(Arch): + # numbers depend on the wordsize. + char_ptr_size = ctypes.sizeof(ctypes.c_char_p) + self.ioctl_numbers['SET_FILTER'] = 0x80002406 | char_ptr_size << 16 ++ self.exit_reason_field = 'exit_nr' + self.exit_reasons = {} + + def debugfs_is_child(self, field): +@@ -300,6 +302,7 @@ class ArchA64(Arch): + def __init__(self): + self.sc_perf_evt_open = 241 + self.ioctl_numbers = IOCTL_NUMBERS ++ self.exit_reason_field = 'esr_ec' + self.exit_reasons = AARCH64_EXIT_REASONS + + def debugfs_is_child(self, field): +@@ -311,6 +314,7 @@ class ArchS390(Arch): + def __init__(self): + self.sc_perf_evt_open = 331 + self.ioctl_numbers = IOCTL_NUMBERS ++ self.exit_reason_field = None + self.exit_reasons = None + + def debugfs_is_child(self, field): +@@ -541,8 +545,8 @@ class TracepointProvider(Provider): + """ + filters = {} + filters['kvm_userspace_exit'] = ('reason', USERSPACE_EXIT_REASONS) +- if ARCH.exit_reasons: +- filters['kvm_exit'] = ('exit_reason', ARCH.exit_reasons) ++ if ARCH.exit_reason_field and ARCH.exit_reasons: ++ filters['kvm_exit'] = (ARCH.exit_reason_field, ARCH.exit_reasons) + return filters + + def _get_available_fields(self): +diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c +index d98838c5820c..b6403712c2f4 100644 +--- a/tools/lib/bpf/libbpf.c ++++ b/tools/lib/bpf/libbpf.c +@@ -2541,7 +2541,9 @@ static struct ids_vec *bpf_core_find_cands(const struct btf *local_btf, + if (strncmp(local_name, targ_name, local_essent_len) == 0) { + pr_debug("[%d] %s: found candidate [%d] %s\n", + local_type_id, local_name, i, targ_name); +- new_ids = realloc(cand_ids->data, cand_ids->len + 1); ++ new_ids = reallocarray(cand_ids->data, ++ cand_ids->len + 1, ++ sizeof(*cand_ids->data)); + if (!new_ids) { + err = -ENOMEM; + goto err_out; +diff --git a/tools/objtool/sync-check.sh b/tools/objtool/sync-check.sh +index 0a832e265a50..c3ae1e8ae119 100755 +--- a/tools/objtool/sync-check.sh ++++ b/tools/objtool/sync-check.sh +@@ -47,5 +47,3 @@ check arch/x86/include/asm/inat.h '-I "^#include [\"<]\(asm/\)*inat_types.h[ + check arch/x86/include/asm/insn.h '-I "^#include [\"<]\(asm/\)*inat.h[\">]"' + check arch/x86/lib/inat.c '-I "^#include [\"<]\(../include/\)*asm/insn.h[\">]"' + check arch/x86/lib/insn.c '-I "^#include [\"<]\(../include/\)*asm/in\(at\|sn\).h[\">]"' +- +-cd - +diff --git a/tools/power/cpupower/lib/cpufreq.c b/tools/power/cpupower/lib/cpufreq.c +index 2f55d4d23446..6e04304560ca 100644 +--- a/tools/power/cpupower/lib/cpufreq.c ++++ b/tools/power/cpupower/lib/cpufreq.c +@@ -332,21 +332,74 @@ void cpufreq_put_available_governors(struct cpufreq_available_governors *any) + } + + +-struct cpufreq_frequencies +-*cpufreq_get_frequencies(const char *type, unsigned int cpu) ++struct cpufreq_available_frequencies ++*cpufreq_get_available_frequencies(unsigned int cpu) + { +- struct cpufreq_frequencies *first = NULL; +- struct cpufreq_frequencies *current = NULL; ++ struct cpufreq_available_frequencies *first = NULL; ++ struct cpufreq_available_frequencies *current = NULL; + char one_value[SYSFS_PATH_MAX]; + char linebuf[MAX_LINE_LEN]; +- char fname[MAX_LINE_LEN]; + unsigned int pos, i; + unsigned int len; + +- snprintf(fname, MAX_LINE_LEN, "scaling_%s_frequencies", type); ++ len = sysfs_cpufreq_read_file(cpu, "scaling_available_frequencies", ++ linebuf, sizeof(linebuf)); ++ if (len == 0) ++ return NULL; + +- len = sysfs_cpufreq_read_file(cpu, fname, +- linebuf, sizeof(linebuf)); ++ pos = 0; ++ for (i = 0; i < len; i++) { ++ if (linebuf[i] == ' ' || linebuf[i] == '\n') { ++ if (i - pos < 2) ++ continue; ++ if (i - pos >= SYSFS_PATH_MAX) ++ goto error_out; ++ if (current) { ++ current->next = malloc(sizeof(*current)); ++ if (!current->next) ++ goto error_out; ++ current = current->next; ++ } else { ++ first = malloc(sizeof(*first)); ++ if (!first) ++ goto error_out; ++ current = first; ++ } ++ current->first = first; ++ current->next = NULL; ++ ++ memcpy(one_value, linebuf + pos, i - pos); ++ one_value[i - pos] = '\0'; ++ if (sscanf(one_value, "%lu", ¤t->frequency) != 1) ++ goto error_out; ++ ++ pos = i + 1; ++ } ++ } ++ ++ return first; ++ ++ error_out: ++ while (first) { ++ current = first->next; ++ free(first); ++ first = current; ++ } ++ return NULL; ++} ++ ++struct cpufreq_available_frequencies ++*cpufreq_get_boost_frequencies(unsigned int cpu) ++{ ++ struct cpufreq_available_frequencies *first = NULL; ++ struct cpufreq_available_frequencies *current = NULL; ++ char one_value[SYSFS_PATH_MAX]; ++ char linebuf[MAX_LINE_LEN]; ++ unsigned int pos, i; ++ unsigned int len; ++ ++ len = sysfs_cpufreq_read_file(cpu, "scaling_boost_frequencies", ++ linebuf, sizeof(linebuf)); + if (len == 0) + return NULL; + +@@ -391,9 +444,9 @@ struct cpufreq_frequencies + return NULL; + } + +-void cpufreq_put_frequencies(struct cpufreq_frequencies *any) ++void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies *any) + { +- struct cpufreq_frequencies *tmp, *next; ++ struct cpufreq_available_frequencies *tmp, *next; + + if (!any) + return; +@@ -406,6 +459,11 @@ void cpufreq_put_frequencies(struct cpufreq_frequencies *any) + } + } + ++void cpufreq_put_boost_frequencies(struct cpufreq_available_frequencies *any) ++{ ++ cpufreq_put_available_frequencies(any); ++} ++ + static struct cpufreq_affected_cpus *sysfs_get_cpu_list(unsigned int cpu, + const char *file) + { +diff --git a/tools/power/cpupower/lib/cpufreq.h b/tools/power/cpupower/lib/cpufreq.h +index a55f0d19215b..95f4fd9e2656 100644 +--- a/tools/power/cpupower/lib/cpufreq.h ++++ b/tools/power/cpupower/lib/cpufreq.h +@@ -20,10 +20,10 @@ struct cpufreq_available_governors { + struct cpufreq_available_governors *first; + }; + +-struct cpufreq_frequencies { ++struct cpufreq_available_frequencies { + unsigned long frequency; +- struct cpufreq_frequencies *next; +- struct cpufreq_frequencies *first; ++ struct cpufreq_available_frequencies *next; ++ struct cpufreq_available_frequencies *first; + }; + + +@@ -124,11 +124,17 @@ void cpufreq_put_available_governors( + * cpufreq_put_frequencies after use. + */ + +-struct cpufreq_frequencies +-*cpufreq_get_frequencies(const char *type, unsigned int cpu); ++struct cpufreq_available_frequencies ++*cpufreq_get_available_frequencies(unsigned int cpu); + +-void cpufreq_put_frequencies( +- struct cpufreq_frequencies *first); ++void cpufreq_put_available_frequencies( ++ struct cpufreq_available_frequencies *first); ++ ++struct cpufreq_available_frequencies ++*cpufreq_get_boost_frequencies(unsigned int cpu); ++ ++void cpufreq_put_boost_frequencies( ++ struct cpufreq_available_frequencies *first); + + + /* determine affected CPUs +diff --git a/tools/power/cpupower/utils/cpufreq-info.c b/tools/power/cpupower/utils/cpufreq-info.c +index e63cf55f81cf..6efc0f6b1b11 100644 +--- a/tools/power/cpupower/utils/cpufreq-info.c ++++ b/tools/power/cpupower/utils/cpufreq-info.c +@@ -244,14 +244,14 @@ static int get_boost_mode_x86(unsigned int cpu) + + static int get_boost_mode(unsigned int cpu) + { +- struct cpufreq_frequencies *freqs; ++ struct cpufreq_available_frequencies *freqs; + + if (cpupower_cpu_info.vendor == X86_VENDOR_AMD || + cpupower_cpu_info.vendor == X86_VENDOR_HYGON || + cpupower_cpu_info.vendor == X86_VENDOR_INTEL) + return get_boost_mode_x86(cpu); + +- freqs = cpufreq_get_frequencies("boost", cpu); ++ freqs = cpufreq_get_boost_frequencies(cpu); + if (freqs) { + printf(_(" boost frequency steps: ")); + while (freqs->next) { +@@ -261,7 +261,7 @@ static int get_boost_mode(unsigned int cpu) + } + print_speed(freqs->frequency); + printf("\n"); +- cpufreq_put_frequencies(freqs); ++ cpufreq_put_available_frequencies(freqs); + } + + return 0; +@@ -475,7 +475,7 @@ static int get_latency(unsigned int cpu, unsigned int human) + + static void debug_output_one(unsigned int cpu) + { +- struct cpufreq_frequencies *freqs; ++ struct cpufreq_available_frequencies *freqs; + + get_driver(cpu); + get_related_cpus(cpu); +@@ -483,7 +483,7 @@ static void debug_output_one(unsigned int cpu) + get_latency(cpu, 1); + get_hardware_limits(cpu, 1); + +- freqs = cpufreq_get_frequencies("available", cpu); ++ freqs = cpufreq_get_available_frequencies(cpu); + if (freqs) { + printf(_(" available frequency steps: ")); + while (freqs->next) { +@@ -493,7 +493,7 @@ static void debug_output_one(unsigned int cpu) + } + print_speed(freqs->frequency); + printf("\n"); +- cpufreq_put_frequencies(freqs); ++ cpufreq_put_available_frequencies(freqs); + } + + get_available_governors(cpu); +diff --git a/tools/testing/selftests/bpf/prog_tests/attach_probe.c b/tools/testing/selftests/bpf/prog_tests/attach_probe.c +index 5ecc267d98b0..fad615c22e4d 100644 +--- a/tools/testing/selftests/bpf/prog_tests/attach_probe.c ++++ b/tools/testing/selftests/bpf/prog_tests/attach_probe.c +@@ -2,7 +2,7 @@ + #include + + ssize_t get_base_addr() { +- size_t start; ++ size_t start, offset; + char buf[256]; + FILE *f; + +@@ -10,10 +10,11 @@ ssize_t get_base_addr() { + if (!f) + return -errno; + +- while (fscanf(f, "%zx-%*x %s %*s\n", &start, buf) == 2) { ++ while (fscanf(f, "%zx-%*x %s %zx %*[^\n]\n", ++ &start, buf, &offset) == 3) { + if (strcmp(buf, "r-xp") == 0) { + fclose(f); +- return start; ++ return start - offset; + } + } + +diff --git a/tools/testing/selftests/bpf/prog_tests/perf_buffer.c b/tools/testing/selftests/bpf/prog_tests/perf_buffer.c +index 3003fddc0613..cf6c87936c69 100644 +--- a/tools/testing/selftests/bpf/prog_tests/perf_buffer.c ++++ b/tools/testing/selftests/bpf/prog_tests/perf_buffer.c +@@ -4,6 +4,7 @@ + #include + #include + #include ++#include "libbpf_internal.h" + + static void on_sample(void *ctx, int cpu, void *data, __u32 size) + { +@@ -19,7 +20,7 @@ static void on_sample(void *ctx, int cpu, void *data, __u32 size) + + void test_perf_buffer(void) + { +- int err, prog_fd, nr_cpus, i, duration = 0; ++ int err, prog_fd, on_len, nr_on_cpus = 0, nr_cpus, i, duration = 0; + const char *prog_name = "kprobe/sys_nanosleep"; + const char *file = "./test_perf_buffer.o"; + struct perf_buffer_opts pb_opts = {}; +@@ -29,15 +30,27 @@ void test_perf_buffer(void) + struct bpf_object *obj; + struct perf_buffer *pb; + struct bpf_link *link; ++ bool *online; + + nr_cpus = libbpf_num_possible_cpus(); + if (CHECK(nr_cpus < 0, "nr_cpus", "err %d\n", nr_cpus)) + return; + ++ err = parse_cpu_mask_file("/sys/devices/system/cpu/online", ++ &online, &on_len); ++ if (CHECK(err, "nr_on_cpus", "err %d\n", err)) ++ return; ++ ++ for (i = 0; i < on_len; i++) ++ if (online[i]) ++ nr_on_cpus++; ++ + /* load program */ + err = bpf_prog_load(file, BPF_PROG_TYPE_KPROBE, &obj, &prog_fd); +- if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno)) +- return; ++ if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno)) { ++ obj = NULL; ++ goto out_close; ++ } + + prog = bpf_object__find_program_by_title(obj, prog_name); + if (CHECK(!prog, "find_probe", "prog '%s' not found\n", prog_name)) +@@ -64,6 +77,11 @@ void test_perf_buffer(void) + /* trigger kprobe on every CPU */ + CPU_ZERO(&cpu_seen); + for (i = 0; i < nr_cpus; i++) { ++ if (i >= on_len || !online[i]) { ++ printf("skipping offline CPU #%d\n", i); ++ continue; ++ } ++ + CPU_ZERO(&cpu_set); + CPU_SET(i, &cpu_set); + +@@ -81,8 +99,8 @@ void test_perf_buffer(void) + if (CHECK(err < 0, "perf_buffer__poll", "err %d\n", err)) + goto out_free_pb; + +- if (CHECK(CPU_COUNT(&cpu_seen) != nr_cpus, "seen_cpu_cnt", +- "expect %d, seen %d\n", nr_cpus, CPU_COUNT(&cpu_seen))) ++ if (CHECK(CPU_COUNT(&cpu_seen) != nr_on_cpus, "seen_cpu_cnt", ++ "expect %d, seen %d\n", nr_on_cpus, CPU_COUNT(&cpu_seen))) + goto out_free_pb; + + out_free_pb: +@@ -91,4 +109,5 @@ out_detach: + bpf_link__destroy(link); + out_close: + bpf_object__close(obj); ++ free(online); + } +diff --git a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +index f62aa0eb959b..1735faf17536 100644 +--- a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c ++++ b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +@@ -49,8 +49,12 @@ retry: + pmu_fd = syscall(__NR_perf_event_open, &attr, -1 /* pid */, + 0 /* cpu 0 */, -1 /* group id */, + 0 /* flags */); +- if (CHECK(pmu_fd < 0, "perf_event_open", +- "err %d errno %d. Does the test host support PERF_COUNT_HW_CPU_CYCLES?\n", ++ if (pmu_fd < 0 && errno == ENOENT) { ++ printf("%s:SKIP:no PERF_COUNT_HW_CPU_CYCLES\n", __func__); ++ test__skip(); ++ goto cleanup; ++ } ++ if (CHECK(pmu_fd < 0, "perf_event_open", "err %d errno %d\n", + pmu_fd, errno)) + goto close_prog; + +diff --git a/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c b/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c +index ea7d84f01235..e6be383a003f 100644 +--- a/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c ++++ b/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c +@@ -113,6 +113,12 @@ int _select_by_skb_data(struct sk_reuseport_md *reuse_md) + data_check.skb_ports[0] = th->source; + data_check.skb_ports[1] = th->dest; + ++ if (th->fin) ++ /* The connection is being torn down at the end of a ++ * test. It can't contain a cmd, so return early. ++ */ ++ return SK_PASS; ++ + if ((th->doff << 2) + sizeof(*cmd) > data_check.len) + GOTO_DONE(DROP_ERR_SKB_DATA); + if (bpf_skb_load_bytes(reuse_md, th->doff << 2, &cmd_copy, +diff --git a/tools/testing/selftests/bpf/test_sockmap.c b/tools/testing/selftests/bpf/test_sockmap.c +index 4a851513c842..779e11da979c 100644 +--- a/tools/testing/selftests/bpf/test_sockmap.c ++++ b/tools/testing/selftests/bpf/test_sockmap.c +@@ -331,7 +331,7 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + FILE *file; + int i, fp; + +- file = fopen(".sendpage_tst.tmp", "w+"); ++ file = tmpfile(); + if (!file) { + perror("create file for sendpage"); + return 1; +@@ -340,13 +340,8 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + fwrite(&k, sizeof(char), 1, file); + fflush(file); + fseek(file, 0, SEEK_SET); +- fclose(file); + +- fp = open(".sendpage_tst.tmp", O_RDONLY); +- if (fp < 0) { +- perror("reopen file for sendpage"); +- return 1; +- } ++ fp = fileno(file); + + clock_gettime(CLOCK_MONOTONIC, &s->start); + for (i = 0; i < cnt; i++) { +@@ -354,11 +349,11 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + + if (!drop && sent < 0) { + perror("send loop error"); +- close(fp); ++ fclose(file); + return sent; + } else if (drop && sent >= 0) { + printf("sendpage loop error expected: %i\n", sent); +- close(fp); ++ fclose(file); + return -EIO; + } + +@@ -366,7 +361,7 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + s->bytes_sent += sent; + } + clock_gettime(CLOCK_MONOTONIC, &s->end); +- close(fp); ++ fclose(file); + return 0; + } + +diff --git a/tools/testing/selftests/tc-testing/plugin-lib/buildebpfPlugin.py b/tools/testing/selftests/tc-testing/plugin-lib/buildebpfPlugin.py +index e98c36750fae..d34fe06268d2 100644 +--- a/tools/testing/selftests/tc-testing/plugin-lib/buildebpfPlugin.py ++++ b/tools/testing/selftests/tc-testing/plugin-lib/buildebpfPlugin.py +@@ -54,7 +54,7 @@ class SubPlugin(TdcPlugin): + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, +- env=ENVIR) ++ env=os.environ.copy()) + (rawout, serr) = proc.communicate() + + if proc.returncode != 0 and len(serr) > 0: +diff --git a/virt/kvm/arm/aarch32.c b/virt/kvm/arm/aarch32.c +index c4c57ba99e90..631d397ac81b 100644 +--- a/virt/kvm/arm/aarch32.c ++++ b/virt/kvm/arm/aarch32.c +@@ -10,6 +10,7 @@ + * Author: Christoffer Dall + */ + ++#include + #include + #include + #include +@@ -28,25 +29,115 @@ static const u8 return_offsets[8][2] = { + [7] = { 4, 4 }, /* FIQ, unused */ + }; + ++/* ++ * When an exception is taken, most CPSR fields are left unchanged in the ++ * handler. However, some are explicitly overridden (e.g. M[4:0]). ++ * ++ * The SPSR/SPSR_ELx layouts differ, and the below is intended to work with ++ * either format. Note: SPSR.J bit doesn't exist in SPSR_ELx, but this bit was ++ * obsoleted by the ARMv7 virtualization extensions and is RES0. ++ * ++ * For the SPSR layout seen from AArch32, see: ++ * - ARM DDI 0406C.d, page B1-1148 ++ * - ARM DDI 0487E.a, page G8-6264 ++ * ++ * For the SPSR_ELx layout for AArch32 seen from AArch64, see: ++ * - ARM DDI 0487E.a, page C5-426 ++ * ++ * Here we manipulate the fields in order of the AArch32 SPSR_ELx layout, from ++ * MSB to LSB. ++ */ ++static unsigned long get_except32_cpsr(struct kvm_vcpu *vcpu, u32 mode) ++{ ++ u32 sctlr = vcpu_cp15(vcpu, c1_SCTLR); ++ unsigned long old, new; ++ ++ old = *vcpu_cpsr(vcpu); ++ new = 0; ++ ++ new |= (old & PSR_AA32_N_BIT); ++ new |= (old & PSR_AA32_Z_BIT); ++ new |= (old & PSR_AA32_C_BIT); ++ new |= (old & PSR_AA32_V_BIT); ++ new |= (old & PSR_AA32_Q_BIT); ++ ++ // CPSR.IT[7:0] are set to zero upon any exception ++ // See ARM DDI 0487E.a, section G1.12.3 ++ // See ARM DDI 0406C.d, section B1.8.3 ++ ++ new |= (old & PSR_AA32_DIT_BIT); ++ ++ // CPSR.SSBS is set to SCTLR.DSSBS upon any exception ++ // See ARM DDI 0487E.a, page G8-6244 ++ if (sctlr & BIT(31)) ++ new |= PSR_AA32_SSBS_BIT; ++ ++ // CPSR.PAN is unchanged unless SCTLR.SPAN == 0b0 ++ // SCTLR.SPAN is RES1 when ARMv8.1-PAN is not implemented ++ // See ARM DDI 0487E.a, page G8-6246 ++ new |= (old & PSR_AA32_PAN_BIT); ++ if (!(sctlr & BIT(23))) ++ new |= PSR_AA32_PAN_BIT; ++ ++ // SS does not exist in AArch32, so ignore ++ ++ // CPSR.IL is set to zero upon any exception ++ // See ARM DDI 0487E.a, page G1-5527 ++ ++ new |= (old & PSR_AA32_GE_MASK); ++ ++ // CPSR.IT[7:0] are set to zero upon any exception ++ // See prior comment above ++ ++ // CPSR.E is set to SCTLR.EE upon any exception ++ // See ARM DDI 0487E.a, page G8-6245 ++ // See ARM DDI 0406C.d, page B4-1701 ++ if (sctlr & BIT(25)) ++ new |= PSR_AA32_E_BIT; ++ ++ // CPSR.A is unchanged upon an exception to Undefined, Supervisor ++ // CPSR.A is set upon an exception to other modes ++ // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 ++ // See ARM DDI 0406C.d, page B1-1182 ++ new |= (old & PSR_AA32_A_BIT); ++ if (mode != PSR_AA32_MODE_UND && mode != PSR_AA32_MODE_SVC) ++ new |= PSR_AA32_A_BIT; ++ ++ // CPSR.I is set upon any exception ++ // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 ++ // See ARM DDI 0406C.d, page B1-1182 ++ new |= PSR_AA32_I_BIT; ++ ++ // CPSR.F is set upon an exception to FIQ ++ // CPSR.F is unchanged upon an exception to other modes ++ // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 ++ // See ARM DDI 0406C.d, page B1-1182 ++ new |= (old & PSR_AA32_F_BIT); ++ if (mode == PSR_AA32_MODE_FIQ) ++ new |= PSR_AA32_F_BIT; ++ ++ // CPSR.T is set to SCTLR.TE upon any exception ++ // See ARM DDI 0487E.a, page G8-5514 ++ // See ARM DDI 0406C.d, page B1-1181 ++ if (sctlr & BIT(30)) ++ new |= PSR_AA32_T_BIT; ++ ++ new |= mode; ++ ++ return new; ++} ++ + static void prepare_fault32(struct kvm_vcpu *vcpu, u32 mode, u32 vect_offset) + { +- unsigned long cpsr; +- unsigned long new_spsr_value = *vcpu_cpsr(vcpu); +- bool is_thumb = (new_spsr_value & PSR_AA32_T_BIT); ++ unsigned long spsr = *vcpu_cpsr(vcpu); ++ bool is_thumb = (spsr & PSR_AA32_T_BIT); + u32 return_offset = return_offsets[vect_offset >> 2][is_thumb]; + u32 sctlr = vcpu_cp15(vcpu, c1_SCTLR); + +- cpsr = mode | PSR_AA32_I_BIT; +- +- if (sctlr & (1 << 30)) +- cpsr |= PSR_AA32_T_BIT; +- if (sctlr & (1 << 25)) +- cpsr |= PSR_AA32_E_BIT; +- +- *vcpu_cpsr(vcpu) = cpsr; ++ *vcpu_cpsr(vcpu) = get_except32_cpsr(vcpu, mode); + + /* Note: These now point to the banked copies */ +- vcpu_write_spsr(vcpu, new_spsr_value); ++ vcpu_write_spsr(vcpu, host_spsr_to_spsr32(spsr)); + *vcpu_reg32(vcpu, 14) = *vcpu_pc(vcpu) + return_offset; + + /* Branch to exception vector */ +@@ -84,7 +175,7 @@ static void inject_abt32(struct kvm_vcpu *vcpu, bool is_pabt, + fsr = &vcpu_cp15(vcpu, c5_DFSR); + } + +- prepare_fault32(vcpu, PSR_AA32_MODE_ABT | PSR_AA32_A_BIT, vect_offset); ++ prepare_fault32(vcpu, PSR_AA32_MODE_ABT, vect_offset); + + *far = addr; + +diff --git a/virt/kvm/arm/mmio.c b/virt/kvm/arm/mmio.c +index 6af5c91337f2..f274fabb4301 100644 +--- a/virt/kvm/arm/mmio.c ++++ b/virt/kvm/arm/mmio.c +@@ -105,6 +105,9 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) + data = (data ^ mask) - mask; + } + ++ if (!vcpu->arch.mmio_decode.sixty_four) ++ data = data & 0xffffffff; ++ + trace_kvm_mmio(KVM_TRACE_MMIO_READ, len, run->mmio.phys_addr, + &data); + data = vcpu_data_host_to_guest(vcpu, data, len); +@@ -125,6 +128,7 @@ static int decode_hsr(struct kvm_vcpu *vcpu, bool *is_write, int *len) + unsigned long rt; + int access_size; + bool sign_extend; ++ bool sixty_four; + + if (kvm_vcpu_dabt_iss1tw(vcpu)) { + /* page table accesses IO mem: tell guest to fix its TTBR */ +@@ -138,11 +142,13 @@ static int decode_hsr(struct kvm_vcpu *vcpu, bool *is_write, int *len) + + *is_write = kvm_vcpu_dabt_iswrite(vcpu); + sign_extend = kvm_vcpu_dabt_issext(vcpu); ++ sixty_four = kvm_vcpu_dabt_issf(vcpu); + rt = kvm_vcpu_dabt_get_rd(vcpu); + + *len = access_size; + vcpu->arch.mmio_decode.sign_extend = sign_extend; + vcpu->arch.mmio_decode.rt = rt; ++ vcpu->arch.mmio_decode.sixty_four = sixty_four; + + return 0; + } +diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c +index 35305d6e68cc..d8ef708a2ef6 100644 +--- a/virt/kvm/async_pf.c ++++ b/virt/kvm/async_pf.c +@@ -64,7 +64,7 @@ static void async_pf_execute(struct work_struct *work) + struct mm_struct *mm = apf->mm; + struct kvm_vcpu *vcpu = apf->vcpu; + unsigned long addr = apf->addr; +- gva_t gva = apf->gva; ++ gpa_t cr2_or_gpa = apf->cr2_or_gpa; + int locked = 1; + + might_sleep(); +@@ -92,7 +92,7 @@ static void async_pf_execute(struct work_struct *work) + * this point + */ + +- trace_kvm_async_pf_completed(addr, gva); ++ trace_kvm_async_pf_completed(addr, cr2_or_gpa); + + if (swq_has_sleeper(&vcpu->wq)) + swake_up_one(&vcpu->wq); +@@ -165,8 +165,8 @@ void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu) + } + } + +-int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, +- struct kvm_arch_async_pf *arch) ++int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, ++ unsigned long hva, struct kvm_arch_async_pf *arch) + { + struct kvm_async_pf *work; + +@@ -185,7 +185,7 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, + + work->wakeup_all = false; + work->vcpu = vcpu; +- work->gva = gva; ++ work->cr2_or_gpa = cr2_or_gpa; + work->addr = hva; + work->arch = *arch; + work->mm = current->mm; +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index 13efc291b1c7..b5ea1bafe513 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -1394,14 +1394,14 @@ bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn) + } + EXPORT_SYMBOL_GPL(kvm_is_visible_gfn); + +-unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn) ++unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn) + { + struct vm_area_struct *vma; + unsigned long addr, size; + + size = PAGE_SIZE; + +- addr = gfn_to_hva(kvm, gfn); ++ addr = kvm_vcpu_gfn_to_hva_prot(vcpu, gfn, NULL); + if (kvm_is_error_hva(addr)) + return PAGE_SIZE; + +@@ -1809,26 +1809,72 @@ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) + } + EXPORT_SYMBOL_GPL(gfn_to_page); + +-static int __kvm_map_gfn(struct kvm_memory_slot *slot, gfn_t gfn, +- struct kvm_host_map *map) ++void kvm_release_pfn(kvm_pfn_t pfn, bool dirty, struct gfn_to_pfn_cache *cache) ++{ ++ if (pfn == 0) ++ return; ++ ++ if (cache) ++ cache->pfn = cache->gfn = 0; ++ ++ if (dirty) ++ kvm_release_pfn_dirty(pfn); ++ else ++ kvm_release_pfn_clean(pfn); ++} ++ ++static void kvm_cache_gfn_to_pfn(struct kvm_memory_slot *slot, gfn_t gfn, ++ struct gfn_to_pfn_cache *cache, u64 gen) ++{ ++ kvm_release_pfn(cache->pfn, cache->dirty, cache); ++ ++ cache->pfn = gfn_to_pfn_memslot(slot, gfn); ++ cache->gfn = gfn; ++ cache->dirty = false; ++ cache->generation = gen; ++} ++ ++static int __kvm_map_gfn(struct kvm_memslots *slots, gfn_t gfn, ++ struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, ++ bool atomic) + { + kvm_pfn_t pfn; + void *hva = NULL; + struct page *page = KVM_UNMAPPED_PAGE; ++ struct kvm_memory_slot *slot = __gfn_to_memslot(slots, gfn); ++ u64 gen = slots->generation; + + if (!map) + return -EINVAL; + +- pfn = gfn_to_pfn_memslot(slot, gfn); ++ if (cache) { ++ if (!cache->pfn || cache->gfn != gfn || ++ cache->generation != gen) { ++ if (atomic) ++ return -EAGAIN; ++ kvm_cache_gfn_to_pfn(slot, gfn, cache, gen); ++ } ++ pfn = cache->pfn; ++ } else { ++ if (atomic) ++ return -EAGAIN; ++ pfn = gfn_to_pfn_memslot(slot, gfn); ++ } + if (is_error_noslot_pfn(pfn)) + return -EINVAL; + + if (pfn_valid(pfn)) { + page = pfn_to_page(pfn); +- hva = kmap(page); ++ if (atomic) ++ hva = kmap_atomic(page); ++ else ++ hva = kmap(page); + #ifdef CONFIG_HAS_IOMEM +- } else { ++ } else if (!atomic) { + hva = memremap(pfn_to_hpa(pfn), PAGE_SIZE, MEMREMAP_WB); ++ } else { ++ return -EINVAL; + #endif + } + +@@ -1843,14 +1889,25 @@ static int __kvm_map_gfn(struct kvm_memory_slot *slot, gfn_t gfn, + return 0; + } + ++int kvm_map_gfn(struct kvm_vcpu *vcpu, gfn_t gfn, struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, bool atomic) ++{ ++ return __kvm_map_gfn(kvm_memslots(vcpu->kvm), gfn, map, ++ cache, atomic); ++} ++EXPORT_SYMBOL_GPL(kvm_map_gfn); ++ + int kvm_vcpu_map(struct kvm_vcpu *vcpu, gfn_t gfn, struct kvm_host_map *map) + { +- return __kvm_map_gfn(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn, map); ++ return __kvm_map_gfn(kvm_vcpu_memslots(vcpu), gfn, map, ++ NULL, false); + } + EXPORT_SYMBOL_GPL(kvm_vcpu_map); + +-void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, +- bool dirty) ++static void __kvm_unmap_gfn(struct kvm_memory_slot *memslot, ++ struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, ++ bool dirty, bool atomic) + { + if (!map) + return; +@@ -1858,23 +1915,45 @@ void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, + if (!map->hva) + return; + +- if (map->page != KVM_UNMAPPED_PAGE) +- kunmap(map->page); ++ if (map->page != KVM_UNMAPPED_PAGE) { ++ if (atomic) ++ kunmap_atomic(map->hva); ++ else ++ kunmap(map->page); ++ } + #ifdef CONFIG_HAS_IOMEM +- else ++ else if (!atomic) + memunmap(map->hva); ++ else ++ WARN_ONCE(1, "Unexpected unmapping in atomic context"); + #endif + +- if (dirty) { +- kvm_vcpu_mark_page_dirty(vcpu, map->gfn); +- kvm_release_pfn_dirty(map->pfn); +- } else { +- kvm_release_pfn_clean(map->pfn); +- } ++ if (dirty) ++ mark_page_dirty_in_slot(memslot, map->gfn); ++ ++ if (cache) ++ cache->dirty |= dirty; ++ else ++ kvm_release_pfn(map->pfn, dirty, NULL); + + map->hva = NULL; + map->page = NULL; + } ++ ++int kvm_unmap_gfn(struct kvm_vcpu *vcpu, struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, bool dirty, bool atomic) ++{ ++ __kvm_unmap_gfn(gfn_to_memslot(vcpu->kvm, map->gfn), map, ++ cache, dirty, atomic); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(kvm_unmap_gfn); ++ ++void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty) ++{ ++ __kvm_unmap_gfn(kvm_vcpu_gfn_to_memslot(vcpu, map->gfn), map, NULL, ++ dirty, false); ++} + EXPORT_SYMBOL_GPL(kvm_vcpu_unmap); + + struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn) From 658885bd22e3de1749a029b29aa5123b183ad240 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Fri, 14 Feb 2020 21:31:05 +0100 Subject: [PATCH 45/54] Few more config cleanups --- config/kernel/linux-sunxi-dev.config | 3 ++- config/kernel/linux-sunxi64-dev.config | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/config/kernel/linux-sunxi-dev.config b/config/kernel/linux-sunxi-dev.config index 66ff9f6f3a..5a7b4dc819 100644 --- a/config/kernel/linux-sunxi-dev.config +++ b/config/kernel/linux-sunxi-dev.config @@ -3411,7 +3411,7 @@ CONFIG_MFD_SUN4I_GPADC=m # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AC100 is not set +CONFIG_MFD_AC100=m CONFIG_MFD_AC200=m CONFIG_MFD_AXP20X=y CONFIG_MFD_AXP20X_I2C=y @@ -5359,6 +5359,7 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_ABB5ZES3 is not set CONFIG_RTC_DRV_ABEOZ9=m # CONFIG_RTC_DRV_ABX80X is not set +CONFIG_RTC_DRV_AC100=m CONFIG_RTC_DRV_DS1307=m # CONFIG_RTC_DRV_DS1307_CENTURY is not set # CONFIG_RTC_DRV_DS1374 is not set diff --git a/config/kernel/linux-sunxi64-dev.config b/config/kernel/linux-sunxi64-dev.config index abb8c30b55..bbeb3185a3 100644 --- a/config/kernel/linux-sunxi64-dev.config +++ b/config/kernel/linux-sunxi64-dev.config @@ -3339,7 +3339,7 @@ CONFIG_MFD_SUN4I_GPADC=y # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set CONFIG_MFD_BD9571MWV=m -# CONFIG_MFD_AC100 is not set +CONFIG_MFD_AC100=m CONFIG_MFD_AC200=m CONFIG_MFD_AXP20X=y CONFIG_MFD_AXP20X_I2C=y @@ -4456,6 +4456,7 @@ CONFIG_SND_SOC_PCM3060_I2C=m CONFIG_SND_SOC_PCM3060_SPI=m # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set +CONFIG_SND_SOC_PCM5102A=m # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set CONFIG_SND_SOC_RK3328=m @@ -5145,6 +5146,7 @@ CONFIG_RTC_INTF_DEV=y CONFIG_RTC_DRV_ABB5ZES3=m CONFIG_RTC_DRV_ABEOZ9=m CONFIG_RTC_DRV_ABX80X=m +CONFIG_RTC_DRV_AC100=m CONFIG_RTC_DRV_DS1307=m CONFIG_RTC_DRV_DS1307_CENTURY=y CONFIG_RTC_DRV_DS1374=m From bd5e1568b5d648a21b8e24304968d3959d2e339f Mon Sep 17 00:00:00 2001 From: 5kft <5kft@users.noreply.github.com> Date: Sat, 15 Feb 2020 07:53:01 -0800 Subject: [PATCH 46/54] [ sunxi-current ] add upstream patches --- config/kernel/linux-sunxi-current.config | 2 +- config/kernel/linux-sunxi64-current.config | 5 +- .../patch-5.4.18-19-modified.patch | 15538 ++++++++++++++++ .../sunxi-current/patch-5.4.19-20.patch | 3553 ++++ 4 files changed, 19095 insertions(+), 3 deletions(-) create mode 100644 patch/kernel/sunxi-current/patch-5.4.18-19-modified.patch create mode 100644 patch/kernel/sunxi-current/patch-5.4.19-20.patch diff --git a/config/kernel/linux-sunxi-current.config b/config/kernel/linux-sunxi-current.config index 2b680a4778..9a9e6790b3 100644 --- a/config/kernel/linux-sunxi-current.config +++ b/config/kernel/linux-sunxi-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.4.18 Kernel Configuration +# Linux/arm 5.4.20 Kernel Configuration # # diff --git a/config/kernel/linux-sunxi64-current.config b/config/kernel/linux-sunxi64-current.config index 032427b257..36221a03e5 100644 --- a/config/kernel/linux-sunxi64-current.config +++ b/config/kernel/linux-sunxi64-current.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.4.18 Kernel Configuration +# Linux/arm64 5.4.20 Kernel Configuration # # @@ -4178,8 +4178,8 @@ CONFIG_DRM_TOSHIBA_TC358764=m # CONFIG_DRM_TOSHIBA_TC358767 is not set # CONFIG_DRM_TI_TFP410 is not set CONFIG_DRM_TI_SN65DSI86=m -CONFIG_DRM_ANALOGIX_DP_I2C=m CONFIG_DRM_ANALOGIX_ANX6345=m +CONFIG_DRM_ANALOGIX_DP=m # CONFIG_DRM_I2C_ADV7511 is not set CONFIG_DRM_DW_HDMI=y CONFIG_DRM_DW_HDMI_AHB_AUDIO=m @@ -4471,6 +4471,7 @@ CONFIG_SND_SOC_PCM3060_I2C=m CONFIG_SND_SOC_PCM3060_SPI=m # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM5102A is not set # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set CONFIG_SND_SOC_RK3328=m diff --git a/patch/kernel/sunxi-current/patch-5.4.18-19-modified.patch b/patch/kernel/sunxi-current/patch-5.4.18-19-modified.patch new file mode 100644 index 0000000000..1bdcfeb869 --- /dev/null +++ b/patch/kernel/sunxi-current/patch-5.4.18-19-modified.patch @@ -0,0 +1,15538 @@ +diff --git a/MAINTAINERS b/MAINTAINERS +index 4f7ac27d8651..d1aeebb59e6a 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -8704,8 +8704,10 @@ L: isdn4linux@listserv.isdn4linux.de (subscribers-only) + L: netdev@vger.kernel.org + W: http://www.isdn4linux.de + S: Maintained +-F: drivers/isdn/mISDN +-F: drivers/isdn/hardware ++F: drivers/isdn/mISDN/ ++F: drivers/isdn/hardware/ ++F: drivers/isdn/Kconfig ++F: drivers/isdn/Makefile + + ISDN/CAPI SUBSYSTEM + M: Karsten Keil +diff --git a/Makefile b/Makefile +index b6c151fd5227..2f55d377f0db 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 18 ++SUBLEVEL = 19 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/Kconfig b/arch/Kconfig +index 5f8a5d84dbbe..43102756304c 100644 +--- a/arch/Kconfig ++++ b/arch/Kconfig +@@ -396,9 +396,6 @@ config HAVE_ARCH_JUMP_LABEL_RELATIVE + config HAVE_RCU_TABLE_FREE + bool + +-config HAVE_RCU_TABLE_NO_INVALIDATE +- bool +- + config HAVE_MMU_GATHER_PAGE_SIZE + bool + +diff --git a/arch/arm/include/asm/kvm_emulate.h b/arch/arm/include/asm/kvm_emulate.h +index 40002416efec..8e995ec796c8 100644 +--- a/arch/arm/include/asm/kvm_emulate.h ++++ b/arch/arm/include/asm/kvm_emulate.h +@@ -14,13 +14,25 @@ + #include + + /* arm64 compatibility macros */ ++#define PSR_AA32_MODE_FIQ FIQ_MODE ++#define PSR_AA32_MODE_SVC SVC_MODE + #define PSR_AA32_MODE_ABT ABT_MODE + #define PSR_AA32_MODE_UND UND_MODE + #define PSR_AA32_T_BIT PSR_T_BIT ++#define PSR_AA32_F_BIT PSR_F_BIT + #define PSR_AA32_I_BIT PSR_I_BIT + #define PSR_AA32_A_BIT PSR_A_BIT + #define PSR_AA32_E_BIT PSR_E_BIT + #define PSR_AA32_IT_MASK PSR_IT_MASK ++#define PSR_AA32_GE_MASK 0x000f0000 ++#define PSR_AA32_DIT_BIT 0x00200000 ++#define PSR_AA32_PAN_BIT 0x00400000 ++#define PSR_AA32_SSBS_BIT 0x00800000 ++#define PSR_AA32_Q_BIT PSR_Q_BIT ++#define PSR_AA32_V_BIT PSR_V_BIT ++#define PSR_AA32_C_BIT PSR_C_BIT ++#define PSR_AA32_Z_BIT PSR_Z_BIT ++#define PSR_AA32_N_BIT PSR_N_BIT + + unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num); + +@@ -41,6 +53,11 @@ static inline void vcpu_write_spsr(struct kvm_vcpu *vcpu, unsigned long v) + *__vcpu_spsr(vcpu) = v; + } + ++static inline unsigned long host_spsr_to_spsr32(unsigned long spsr) ++{ ++ return spsr; ++} ++ + static inline unsigned long vcpu_get_reg(struct kvm_vcpu *vcpu, + u8 reg_num) + { +@@ -177,6 +194,11 @@ static inline bool kvm_vcpu_dabt_issext(struct kvm_vcpu *vcpu) + return kvm_vcpu_get_hsr(vcpu) & HSR_SSE; + } + ++static inline bool kvm_vcpu_dabt_issf(const struct kvm_vcpu *vcpu) ++{ ++ return false; ++} ++ + static inline int kvm_vcpu_dabt_get_rd(struct kvm_vcpu *vcpu) + { + return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT; +diff --git a/arch/arm/include/asm/kvm_mmio.h b/arch/arm/include/asm/kvm_mmio.h +index 7c0eddb0adb2..32fbf82e3ebc 100644 +--- a/arch/arm/include/asm/kvm_mmio.h ++++ b/arch/arm/include/asm/kvm_mmio.h +@@ -14,6 +14,8 @@ + struct kvm_decode { + unsigned long rt; + bool sign_extend; ++ /* Not used on 32-bit arm */ ++ bool sixty_four; + }; + + void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data); +diff --git a/arch/arm/mach-tegra/sleep-tegra30.S b/arch/arm/mach-tegra/sleep-tegra30.S +index b408fa56eb89..6922dd8d3e2d 100644 +--- a/arch/arm/mach-tegra/sleep-tegra30.S ++++ b/arch/arm/mach-tegra/sleep-tegra30.S +@@ -370,6 +370,14 @@ _pll_m_c_x_done: + pll_locked r1, r0, CLK_RESET_PLLC_BASE + pll_locked r1, r0, CLK_RESET_PLLX_BASE + ++ tegra_get_soc_id TEGRA_APB_MISC_BASE, r1 ++ cmp r1, #TEGRA30 ++ beq 1f ++ ldr r1, [r0, #CLK_RESET_PLLP_BASE] ++ bic r1, r1, #(1<<31) @ disable PllP bypass ++ str r1, [r0, #CLK_RESET_PLLP_BASE] ++1: ++ + mov32 r7, TEGRA_TMRUS_BASE + ldr r1, [r7] + add r1, r1, #LOCK_DELAY +@@ -630,7 +638,10 @@ tegra30_switch_cpu_to_clk32k: + str r0, [r4, #PMC_PLLP_WB0_OVERRIDE] + + /* disable PLLP, PLLA, PLLC and PLLX */ ++ tegra_get_soc_id TEGRA_APB_MISC_BASE, r1 ++ cmp r1, #TEGRA30 + ldr r0, [r5, #CLK_RESET_PLLP_BASE] ++ orrne r0, r0, #(1 << 31) @ enable PllP bypass on fast cluster + bic r0, r0, #(1 << 30) + str r0, [r5, #CLK_RESET_PLLP_BASE] + ldr r0, [r5, #CLK_RESET_PLLA_BASE] +diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c +index 7d042d5c43e3..27576c7b836e 100644 +--- a/arch/arm/mm/dma-mapping.c ++++ b/arch/arm/mm/dma-mapping.c +@@ -221,7 +221,7 @@ EXPORT_SYMBOL(arm_coherent_dma_ops); + + static int __dma_supported(struct device *dev, u64 mask, bool warn) + { +- unsigned long max_dma_pfn = min(max_pfn, arm_dma_pfn_limit); ++ unsigned long max_dma_pfn = min(max_pfn - 1, arm_dma_pfn_limit); + + /* + * Translate the device's DMA mask to a PFN limit. This +diff --git a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi +index 501a7330dbc8..522d3ef72df5 100644 +--- a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi ++++ b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi +@@ -73,6 +73,7 @@ + regulator-always-on; + regulator-boot-on; + regulator-name = "vdd_apc"; ++ regulator-initial-mode = <1>; + regulator-min-microvolt = <1048000>; + regulator-max-microvolt = <1384000>; + }; +diff --git a/arch/arm64/crypto/ghash-ce-glue.c b/arch/arm64/crypto/ghash-ce-glue.c +index 70b1469783f9..24bc0a3f26e2 100644 +--- a/arch/arm64/crypto/ghash-ce-glue.c ++++ b/arch/arm64/crypto/ghash-ce-glue.c +@@ -261,7 +261,7 @@ static int ghash_setkey(struct crypto_shash *tfm, + static struct shash_alg ghash_alg[] = {{ + .base.cra_name = "ghash", + .base.cra_driver_name = "ghash-neon", +- .base.cra_priority = 100, ++ .base.cra_priority = 150, + .base.cra_blocksize = GHASH_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct ghash_key), + .base.cra_module = THIS_MODULE, +diff --git a/arch/arm64/include/asm/daifflags.h b/arch/arm64/include/asm/daifflags.h +index 063c964af705..48bfbf70dbb0 100644 +--- a/arch/arm64/include/asm/daifflags.h ++++ b/arch/arm64/include/asm/daifflags.h +@@ -36,7 +36,7 @@ static inline void local_daif_mask(void) + trace_hardirqs_off(); + } + +-static inline unsigned long local_daif_save(void) ++static inline unsigned long local_daif_save_flags(void) + { + unsigned long flags; + +@@ -48,6 +48,15 @@ static inline unsigned long local_daif_save(void) + flags |= PSR_I_BIT; + } + ++ return flags; ++} ++ ++static inline unsigned long local_daif_save(void) ++{ ++ unsigned long flags; ++ ++ flags = local_daif_save_flags(); ++ + local_daif_mask(); + + return flags; +diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h +index d69c1efc63e7..6ff84f1f3b4c 100644 +--- a/arch/arm64/include/asm/kvm_emulate.h ++++ b/arch/arm64/include/asm/kvm_emulate.h +@@ -204,6 +204,38 @@ static inline void vcpu_write_spsr(struct kvm_vcpu *vcpu, unsigned long v) + vcpu_gp_regs(vcpu)->spsr[KVM_SPSR_EL1] = v; + } + ++/* ++ * The layout of SPSR for an AArch32 state is different when observed from an ++ * AArch64 SPSR_ELx or an AArch32 SPSR_*. This function generates the AArch32 ++ * view given an AArch64 view. ++ * ++ * In ARM DDI 0487E.a see: ++ * ++ * - The AArch64 view (SPSR_EL2) in section C5.2.18, page C5-426 ++ * - The AArch32 view (SPSR_abt) in section G8.2.126, page G8-6256 ++ * - The AArch32 view (SPSR_und) in section G8.2.132, page G8-6280 ++ * ++ * Which show the following differences: ++ * ++ * | Bit | AA64 | AA32 | Notes | ++ * +-----+------+------+-----------------------------| ++ * | 24 | DIT | J | J is RES0 in ARMv8 | ++ * | 21 | SS | DIT | SS doesn't exist in AArch32 | ++ * ++ * ... and all other bits are (currently) common. ++ */ ++static inline unsigned long host_spsr_to_spsr32(unsigned long spsr) ++{ ++ const unsigned long overlap = BIT(24) | BIT(21); ++ unsigned long dit = !!(spsr & PSR_AA32_DIT_BIT); ++ ++ spsr &= ~overlap; ++ ++ spsr |= dit << 21; ++ ++ return spsr; ++} ++ + static inline bool vcpu_mode_priv(const struct kvm_vcpu *vcpu) + { + u32 mode; +@@ -263,6 +295,11 @@ static inline bool kvm_vcpu_dabt_issext(const struct kvm_vcpu *vcpu) + return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SSE); + } + ++static inline bool kvm_vcpu_dabt_issf(const struct kvm_vcpu *vcpu) ++{ ++ return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SF); ++} ++ + static inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu) + { + return (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT; +diff --git a/arch/arm64/include/asm/kvm_mmio.h b/arch/arm64/include/asm/kvm_mmio.h +index 02b5c48fd467..b204501a0c39 100644 +--- a/arch/arm64/include/asm/kvm_mmio.h ++++ b/arch/arm64/include/asm/kvm_mmio.h +@@ -10,13 +10,11 @@ + #include + #include + +-/* +- * This is annoying. The mmio code requires this, even if we don't +- * need any decoding. To be fixed. +- */ + struct kvm_decode { + unsigned long rt; + bool sign_extend; ++ /* Witdth of the register accessed by the faulting instruction is 64-bits */ ++ bool sixty_four; + }; + + void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data); +diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h +index fbebb411ae20..bf57308fcd63 100644 +--- a/arch/arm64/include/asm/ptrace.h ++++ b/arch/arm64/include/asm/ptrace.h +@@ -62,6 +62,7 @@ + #define PSR_AA32_I_BIT 0x00000080 + #define PSR_AA32_A_BIT 0x00000100 + #define PSR_AA32_E_BIT 0x00000200 ++#define PSR_AA32_PAN_BIT 0x00400000 + #define PSR_AA32_SSBS_BIT 0x00800000 + #define PSR_AA32_DIT_BIT 0x01000000 + #define PSR_AA32_Q_BIT 0x08000000 +diff --git a/arch/arm64/include/uapi/asm/ptrace.h b/arch/arm64/include/uapi/asm/ptrace.h +index 7ed9294e2004..d1bb5b69f1ce 100644 +--- a/arch/arm64/include/uapi/asm/ptrace.h ++++ b/arch/arm64/include/uapi/asm/ptrace.h +@@ -49,6 +49,7 @@ + #define PSR_SSBS_BIT 0x00001000 + #define PSR_PAN_BIT 0x00400000 + #define PSR_UAO_BIT 0x00800000 ++#define PSR_DIT_BIT 0x01000000 + #define PSR_V_BIT 0x10000000 + #define PSR_C_BIT 0x20000000 + #define PSR_Z_BIT 0x40000000 +diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c +index 3a58e9db5cfe..a100483b47c4 100644 +--- a/arch/arm64/kernel/acpi.c ++++ b/arch/arm64/kernel/acpi.c +@@ -274,7 +274,7 @@ int apei_claim_sea(struct pt_regs *regs) + if (!IS_ENABLED(CONFIG_ACPI_APEI_GHES)) + return err; + +- current_flags = arch_local_save_flags(); ++ current_flags = local_daif_save_flags(); + + /* + * SEA can interrupt SError, mask it and describe this as an NMI so +diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c +index a9d25a305af5..a364a4ad5479 100644 +--- a/arch/arm64/kvm/inject_fault.c ++++ b/arch/arm64/kvm/inject_fault.c +@@ -14,9 +14,6 @@ + #include + #include + +-#define PSTATE_FAULT_BITS_64 (PSR_MODE_EL1h | PSR_A_BIT | PSR_F_BIT | \ +- PSR_I_BIT | PSR_D_BIT) +- + #define CURRENT_EL_SP_EL0_VECTOR 0x0 + #define CURRENT_EL_SP_ELx_VECTOR 0x200 + #define LOWER_EL_AArch64_VECTOR 0x400 +@@ -50,6 +47,69 @@ static u64 get_except_vector(struct kvm_vcpu *vcpu, enum exception_type type) + return vcpu_read_sys_reg(vcpu, VBAR_EL1) + exc_offset + type; + } + ++/* ++ * When an exception is taken, most PSTATE fields are left unchanged in the ++ * handler. However, some are explicitly overridden (e.g. M[4:0]). Luckily all ++ * of the inherited bits have the same position in the AArch64/AArch32 SPSR_ELx ++ * layouts, so we don't need to shuffle these for exceptions from AArch32 EL0. ++ * ++ * For the SPSR_ELx layout for AArch64, see ARM DDI 0487E.a page C5-429. ++ * For the SPSR_ELx layout for AArch32, see ARM DDI 0487E.a page C5-426. ++ * ++ * Here we manipulate the fields in order of the AArch64 SPSR_ELx layout, from ++ * MSB to LSB. ++ */ ++static unsigned long get_except64_pstate(struct kvm_vcpu *vcpu) ++{ ++ unsigned long sctlr = vcpu_read_sys_reg(vcpu, SCTLR_EL1); ++ unsigned long old, new; ++ ++ old = *vcpu_cpsr(vcpu); ++ new = 0; ++ ++ new |= (old & PSR_N_BIT); ++ new |= (old & PSR_Z_BIT); ++ new |= (old & PSR_C_BIT); ++ new |= (old & PSR_V_BIT); ++ ++ // TODO: TCO (if/when ARMv8.5-MemTag is exposed to guests) ++ ++ new |= (old & PSR_DIT_BIT); ++ ++ // PSTATE.UAO is set to zero upon any exception to AArch64 ++ // See ARM DDI 0487E.a, page D5-2579. ++ ++ // PSTATE.PAN is unchanged unless SCTLR_ELx.SPAN == 0b0 ++ // SCTLR_ELx.SPAN is RES1 when ARMv8.1-PAN is not implemented ++ // See ARM DDI 0487E.a, page D5-2578. ++ new |= (old & PSR_PAN_BIT); ++ if (!(sctlr & SCTLR_EL1_SPAN)) ++ new |= PSR_PAN_BIT; ++ ++ // PSTATE.SS is set to zero upon any exception to AArch64 ++ // See ARM DDI 0487E.a, page D2-2452. ++ ++ // PSTATE.IL is set to zero upon any exception to AArch64 ++ // See ARM DDI 0487E.a, page D1-2306. ++ ++ // PSTATE.SSBS is set to SCTLR_ELx.DSSBS upon any exception to AArch64 ++ // See ARM DDI 0487E.a, page D13-3258 ++ if (sctlr & SCTLR_ELx_DSSBS) ++ new |= PSR_SSBS_BIT; ++ ++ // PSTATE.BTYPE is set to zero upon any exception to AArch64 ++ // See ARM DDI 0487E.a, pages D1-2293 to D1-2294. ++ ++ new |= PSR_D_BIT; ++ new |= PSR_A_BIT; ++ new |= PSR_I_BIT; ++ new |= PSR_F_BIT; ++ ++ new |= PSR_MODE_EL1h; ++ ++ return new; ++} ++ + static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr) + { + unsigned long cpsr = *vcpu_cpsr(vcpu); +@@ -59,7 +119,7 @@ static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr + vcpu_write_elr_el1(vcpu, *vcpu_pc(vcpu)); + *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); + +- *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; ++ *vcpu_cpsr(vcpu) = get_except64_pstate(vcpu); + vcpu_write_spsr(vcpu, cpsr); + + vcpu_write_sys_reg(vcpu, addr, FAR_EL1); +@@ -94,7 +154,7 @@ static void inject_undef64(struct kvm_vcpu *vcpu) + vcpu_write_elr_el1(vcpu, *vcpu_pc(vcpu)); + *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); + +- *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; ++ *vcpu_cpsr(vcpu) = get_except64_pstate(vcpu); + vcpu_write_spsr(vcpu, cpsr); + + /* +diff --git a/arch/mips/Makefile.postlink b/arch/mips/Makefile.postlink +index 4eea4188cb20..13e0beb9eee3 100644 +--- a/arch/mips/Makefile.postlink ++++ b/arch/mips/Makefile.postlink +@@ -12,7 +12,7 @@ __archpost: + include scripts/Kbuild.include + + CMD_RELOCS = arch/mips/boot/tools/relocs +-quiet_cmd_relocs = RELOCS $@ ++quiet_cmd_relocs = RELOCS $@ + cmd_relocs = $(CMD_RELOCS) $@ + + # `@true` prevents complaint when there is nothing to be done +diff --git a/arch/mips/boot/Makefile b/arch/mips/boot/Makefile +index 528bd73d530a..4ed45ade32a1 100644 +--- a/arch/mips/boot/Makefile ++++ b/arch/mips/boot/Makefile +@@ -123,7 +123,7 @@ $(obj)/vmlinux.its.S: $(addprefix $(srctree)/arch/mips/$(PLATFORM)/,$(ITS_INPUTS + targets += vmlinux.its + targets += vmlinux.gz.its + targets += vmlinux.bz2.its +-targets += vmlinux.lzmo.its ++targets += vmlinux.lzma.its + targets += vmlinux.lzo.its + + quiet_cmd_cpp_its_S = ITS $@ +diff --git a/arch/mips/kernel/syscalls/Makefile b/arch/mips/kernel/syscalls/Makefile +index a3d4bec695c6..6efb2f6889a7 100644 +--- a/arch/mips/kernel/syscalls/Makefile ++++ b/arch/mips/kernel/syscalls/Makefile +@@ -18,7 +18,7 @@ quiet_cmd_syshdr = SYSHDR $@ + '$(syshdr_pfx_$(basetarget))' \ + '$(syshdr_offset_$(basetarget))' + +-quiet_cmd_sysnr = SYSNR $@ ++quiet_cmd_sysnr = SYSNR $@ + cmd_sysnr = $(CONFIG_SHELL) '$(sysnr)' '$<' '$@' \ + '$(sysnr_abis_$(basetarget))' \ + '$(sysnr_pfx_$(basetarget))' \ +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 3e56c9c2f16e..2b1033f13210 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -221,8 +221,7 @@ config PPC + select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP +- select HAVE_RCU_TABLE_FREE if SMP +- select HAVE_RCU_TABLE_NO_INVALIDATE if HAVE_RCU_TABLE_FREE ++ select HAVE_RCU_TABLE_FREE + select HAVE_MMU_GATHER_PAGE_SIZE + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_RELIABLE_STACKTRACE if PPC_BOOK3S_64 && CPU_LITTLE_ENDIAN +@@ -237,6 +236,7 @@ config PPC + select NEED_DMA_MAP_STATE if PPC64 || NOT_COHERENT_CACHE + select NEED_SG_DMA_LENGTH + select OF ++ select OF_DMA_DEFAULT_COHERENT if !NOT_COHERENT_CACHE + select OF_EARLY_FLATTREE + select OLD_SIGACTION if PPC32 + select OLD_SIGSUSPEND +diff --git a/arch/powerpc/boot/4xx.c b/arch/powerpc/boot/4xx.c +index 1699e9531552..00c4d843a023 100644 +--- a/arch/powerpc/boot/4xx.c ++++ b/arch/powerpc/boot/4xx.c +@@ -228,7 +228,7 @@ void ibm4xx_denali_fixup_memsize(void) + dpath = 8; /* 64 bits */ + + /* get address pins (rows) */ +- val = SDRAM0_READ(DDR0_42); ++ val = SDRAM0_READ(DDR0_42); + + row = DDR_GET_VAL(val, DDR_APIN, DDR_APIN_SHIFT); + if (row > max_row) +diff --git a/arch/powerpc/include/asm/book3s/32/kup.h b/arch/powerpc/include/asm/book3s/32/kup.h +index f9dc597b0b86..91c8f1d9bcee 100644 +--- a/arch/powerpc/include/asm/book3s/32/kup.h ++++ b/arch/powerpc/include/asm/book3s/32/kup.h +@@ -102,11 +102,13 @@ static inline void kuap_update_sr(u32 sr, u32 addr, u32 end) + isync(); /* Context sync required after mtsrin() */ + } + +-static inline void allow_user_access(void __user *to, const void __user *from, u32 size) ++static __always_inline void allow_user_access(void __user *to, const void __user *from, ++ u32 size, unsigned long dir) + { + u32 addr, end; + +- if (__builtin_constant_p(to) && to == NULL) ++ BUILD_BUG_ON(!__builtin_constant_p(dir)); ++ if (!(dir & KUAP_WRITE)) + return; + + addr = (__force u32)to; +@@ -119,11 +121,16 @@ static inline void allow_user_access(void __user *to, const void __user *from, u + kuap_update_sr(mfsrin(addr) & ~SR_KS, addr, end); /* Clear Ks */ + } + +-static inline void prevent_user_access(void __user *to, const void __user *from, u32 size) ++static __always_inline void prevent_user_access(void __user *to, const void __user *from, ++ u32 size, unsigned long dir) + { + u32 addr = (__force u32)to; + u32 end = min(addr + size, TASK_SIZE); + ++ BUILD_BUG_ON(!__builtin_constant_p(dir)); ++ if (!(dir & KUAP_WRITE)) ++ return; ++ + if (!addr || addr >= TASK_SIZE || !size) + return; + +@@ -131,12 +138,17 @@ static inline void prevent_user_access(void __user *to, const void __user *from, + kuap_update_sr(mfsrin(addr) | SR_KS, addr, end); /* set Ks */ + } + +-static inline bool bad_kuap_fault(struct pt_regs *regs, bool is_write) ++static inline bool ++bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) + { ++ unsigned long begin = regs->kuap & 0xf0000000; ++ unsigned long end = regs->kuap << 28; ++ + if (!is_write) + return false; + +- return WARN(!regs->kuap, "Bug: write fault blocked by segment registers !"); ++ return WARN(address < begin || address >= end, ++ "Bug: write fault blocked by segment registers !"); + } + + #endif /* CONFIG_PPC_KUAP */ +diff --git a/arch/powerpc/include/asm/book3s/32/pgalloc.h b/arch/powerpc/include/asm/book3s/32/pgalloc.h +index 998317702630..dc5c039eb28e 100644 +--- a/arch/powerpc/include/asm/book3s/32/pgalloc.h ++++ b/arch/powerpc/include/asm/book3s/32/pgalloc.h +@@ -49,7 +49,6 @@ static inline void pgtable_free(void *table, unsigned index_size) + + #define get_hugepd_cache_index(x) (x) + +-#ifdef CONFIG_SMP + static inline void pgtable_free_tlb(struct mmu_gather *tlb, + void *table, int shift) + { +@@ -66,13 +65,6 @@ static inline void __tlb_remove_table(void *_table) + + pgtable_free(table, shift); + } +-#else +-static inline void pgtable_free_tlb(struct mmu_gather *tlb, +- void *table, int shift) +-{ +- pgtable_free(table, shift); +-} +-#endif + + static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, + unsigned long address) +diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h b/arch/powerpc/include/asm/book3s/64/kup-radix.h +index f254de956d6a..c8d1076e0ebb 100644 +--- a/arch/powerpc/include/asm/book3s/64/kup-radix.h ++++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h +@@ -77,25 +77,27 @@ static inline void set_kuap(unsigned long value) + isync(); + } + +-static inline void allow_user_access(void __user *to, const void __user *from, +- unsigned long size) ++static __always_inline void allow_user_access(void __user *to, const void __user *from, ++ unsigned long size, unsigned long dir) + { + // This is written so we can resolve to a single case at build time +- if (__builtin_constant_p(to) && to == NULL) ++ BUILD_BUG_ON(!__builtin_constant_p(dir)); ++ if (dir == KUAP_READ) + set_kuap(AMR_KUAP_BLOCK_WRITE); +- else if (__builtin_constant_p(from) && from == NULL) ++ else if (dir == KUAP_WRITE) + set_kuap(AMR_KUAP_BLOCK_READ); + else + set_kuap(0); + } + + static inline void prevent_user_access(void __user *to, const void __user *from, +- unsigned long size) ++ unsigned long size, unsigned long dir) + { + set_kuap(AMR_KUAP_BLOCKED); + } + +-static inline bool bad_kuap_fault(struct pt_regs *regs, bool is_write) ++static inline bool ++bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) + { + return WARN(mmu_has_feature(MMU_FTR_RADIX_KUAP) && + (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)), +diff --git a/arch/powerpc/include/asm/book3s/64/pgalloc.h b/arch/powerpc/include/asm/book3s/64/pgalloc.h +index d5a44912902f..cae9e814593a 100644 +--- a/arch/powerpc/include/asm/book3s/64/pgalloc.h ++++ b/arch/powerpc/include/asm/book3s/64/pgalloc.h +@@ -19,9 +19,7 @@ extern struct vmemmap_backing *vmemmap_list; + extern pmd_t *pmd_fragment_alloc(struct mm_struct *, unsigned long); + extern void pmd_fragment_free(unsigned long *); + extern void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift); +-#ifdef CONFIG_SMP + extern void __tlb_remove_table(void *_table); +-#endif + void pte_frag_destroy(void *pte_frag); + + static inline pgd_t *radix__pgd_alloc(struct mm_struct *mm) +diff --git a/arch/powerpc/include/asm/futex.h b/arch/powerpc/include/asm/futex.h +index eea28ca679db..bc7d9d06a6d9 100644 +--- a/arch/powerpc/include/asm/futex.h ++++ b/arch/powerpc/include/asm/futex.h +@@ -35,7 +35,7 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, + { + int oldval = 0, ret; + +- allow_write_to_user(uaddr, sizeof(*uaddr)); ++ allow_read_write_user(uaddr, uaddr, sizeof(*uaddr)); + pagefault_disable(); + + switch (op) { +@@ -62,7 +62,7 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, + + *oval = oldval; + +- prevent_write_to_user(uaddr, sizeof(*uaddr)); ++ prevent_read_write_user(uaddr, uaddr, sizeof(*uaddr)); + return ret; + } + +@@ -76,7 +76,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, + if (!access_ok(uaddr, sizeof(u32))) + return -EFAULT; + +- allow_write_to_user(uaddr, sizeof(*uaddr)); ++ allow_read_write_user(uaddr, uaddr, sizeof(*uaddr)); ++ + __asm__ __volatile__ ( + PPC_ATOMIC_ENTRY_BARRIER + "1: lwarx %1,0,%3 # futex_atomic_cmpxchg_inatomic\n\ +@@ -97,7 +98,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, + : "cc", "memory"); + + *uval = prev; +- prevent_write_to_user(uaddr, sizeof(*uaddr)); ++ prevent_read_write_user(uaddr, uaddr, sizeof(*uaddr)); ++ + return ret; + } + +diff --git a/arch/powerpc/include/asm/kup.h b/arch/powerpc/include/asm/kup.h +index 5b5e39643a27..94f24928916a 100644 +--- a/arch/powerpc/include/asm/kup.h ++++ b/arch/powerpc/include/asm/kup.h +@@ -2,6 +2,10 @@ + #ifndef _ASM_POWERPC_KUP_H_ + #define _ASM_POWERPC_KUP_H_ + ++#define KUAP_READ 1 ++#define KUAP_WRITE 2 ++#define KUAP_READ_WRITE (KUAP_READ | KUAP_WRITE) ++ + #ifdef CONFIG_PPC64 + #include + #endif +@@ -42,32 +46,48 @@ void setup_kuap(bool disabled); + #else + static inline void setup_kuap(bool disabled) { } + static inline void allow_user_access(void __user *to, const void __user *from, +- unsigned long size) { } ++ unsigned long size, unsigned long dir) { } + static inline void prevent_user_access(void __user *to, const void __user *from, +- unsigned long size) { } +-static inline bool bad_kuap_fault(struct pt_regs *regs, bool is_write) { return false; } ++ unsigned long size, unsigned long dir) { } ++static inline bool ++bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) ++{ ++ return false; ++} + #endif /* CONFIG_PPC_KUAP */ + + static inline void allow_read_from_user(const void __user *from, unsigned long size) + { +- allow_user_access(NULL, from, size); ++ allow_user_access(NULL, from, size, KUAP_READ); + } + + static inline void allow_write_to_user(void __user *to, unsigned long size) + { +- allow_user_access(to, NULL, size); ++ allow_user_access(to, NULL, size, KUAP_WRITE); ++} ++ ++static inline void allow_read_write_user(void __user *to, const void __user *from, ++ unsigned long size) ++{ ++ allow_user_access(to, from, size, KUAP_READ_WRITE); + } + + static inline void prevent_read_from_user(const void __user *from, unsigned long size) + { +- prevent_user_access(NULL, from, size); ++ prevent_user_access(NULL, from, size, KUAP_READ); + } + + static inline void prevent_write_to_user(void __user *to, unsigned long size) + { +- prevent_user_access(to, NULL, size); ++ prevent_user_access(to, NULL, size, KUAP_WRITE); ++} ++ ++static inline void prevent_read_write_user(void __user *to, const void __user *from, ++ unsigned long size) ++{ ++ prevent_user_access(to, from, size, KUAP_READ_WRITE); + } + + #endif /* !__ASSEMBLY__ */ + +-#endif /* _ASM_POWERPC_KUP_H_ */ ++#endif /* _ASM_POWERPC_KUAP_H_ */ +diff --git a/arch/powerpc/include/asm/nohash/32/kup-8xx.h b/arch/powerpc/include/asm/nohash/32/kup-8xx.h +index 1c3133b5f86a..6fe97465e350 100644 +--- a/arch/powerpc/include/asm/nohash/32/kup-8xx.h ++++ b/arch/powerpc/include/asm/nohash/32/kup-8xx.h +@@ -34,18 +34,19 @@ + #include + + static inline void allow_user_access(void __user *to, const void __user *from, +- unsigned long size) ++ unsigned long size, unsigned long dir) + { + mtspr(SPRN_MD_AP, MD_APG_INIT); + } + + static inline void prevent_user_access(void __user *to, const void __user *from, +- unsigned long size) ++ unsigned long size, unsigned long dir) + { + mtspr(SPRN_MD_AP, MD_APG_KUAP); + } + +-static inline bool bad_kuap_fault(struct pt_regs *regs, bool is_write) ++static inline bool ++bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write) + { + return WARN(!((regs->kuap ^ MD_APG_KUAP) & 0xf0000000), + "Bug: fault blocked by AP register !"); +diff --git a/arch/powerpc/include/asm/nohash/pgalloc.h b/arch/powerpc/include/asm/nohash/pgalloc.h +index 332b13b4ecdb..29c43665a753 100644 +--- a/arch/powerpc/include/asm/nohash/pgalloc.h ++++ b/arch/powerpc/include/asm/nohash/pgalloc.h +@@ -46,7 +46,6 @@ static inline void pgtable_free(void *table, int shift) + + #define get_hugepd_cache_index(x) (x) + +-#ifdef CONFIG_SMP + static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift) + { + unsigned long pgf = (unsigned long)table; +@@ -64,13 +63,6 @@ static inline void __tlb_remove_table(void *_table) + pgtable_free(table, shift); + } + +-#else +-static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift) +-{ +- pgtable_free(table, shift); +-} +-#endif +- + static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, + unsigned long address) + { +diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h +index b2c0be93929d..7f3a8b902325 100644 +--- a/arch/powerpc/include/asm/tlb.h ++++ b/arch/powerpc/include/asm/tlb.h +@@ -26,6 +26,17 @@ + + #define tlb_flush tlb_flush + extern void tlb_flush(struct mmu_gather *tlb); ++/* ++ * book3s: ++ * Hash does not use the linux page-tables, so we can avoid ++ * the TLB invalidate for page-table freeing, Radix otoh does use the ++ * page-tables and needs the TLBI. ++ * ++ * nohash: ++ * We still do TLB invalidate in the __pte_free_tlb routine before we ++ * add the page table pages to mmu gather table batch. ++ */ ++#define tlb_needs_table_invalidate() radix_enabled() + + /* Get the generic bits... */ + #include +diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h +index c92fe7fe9692..cafad1960e76 100644 +--- a/arch/powerpc/include/asm/uaccess.h ++++ b/arch/powerpc/include/asm/uaccess.h +@@ -313,9 +313,9 @@ raw_copy_in_user(void __user *to, const void __user *from, unsigned long n) + unsigned long ret; + + barrier_nospec(); +- allow_user_access(to, from, n); ++ allow_read_write_user(to, from, n); + ret = __copy_tofrom_user(to, from, n); +- prevent_user_access(to, from, n); ++ prevent_read_write_user(to, from, n); + return ret; + } + #endif /* __powerpc64__ */ +diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S +index d60908ea37fb..59bb4f4ae316 100644 +--- a/arch/powerpc/kernel/entry_32.S ++++ b/arch/powerpc/kernel/entry_32.S +@@ -179,7 +179,7 @@ transfer_to_handler: + 2: /* if from kernel, check interrupted DOZE/NAP mode and + * check for stack overflow + */ +- kuap_save_and_lock r11, r12, r9, r2, r0 ++ kuap_save_and_lock r11, r12, r9, r2, r6 + addi r2, r12, -THREAD + lwz r9,KSP_LIMIT(r12) + cmplw r1,r9 /* if r1 <= ksp_limit */ +@@ -284,6 +284,7 @@ reenable_mmu: + rlwinm r9,r9,0,~MSR_EE + lwz r12,_LINK(r11) /* and return to address in LR */ + kuap_restore r11, r2, r3, r4, r5 ++ lwz r2, GPR2(r11) + b fast_exception_return + #endif + +diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c +index 709cf1fd4cf4..36abbe3c346d 100644 +--- a/arch/powerpc/kvm/book3s_hv.c ++++ b/arch/powerpc/kvm/book3s_hv.c +@@ -2354,7 +2354,7 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm, + mutex_unlock(&kvm->lock); + + if (!vcore) +- goto free_vcpu; ++ goto uninit_vcpu; + + spin_lock(&vcore->lock); + ++vcore->num_threads; +@@ -2371,6 +2371,8 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm, + + return vcpu; + ++uninit_vcpu: ++ kvm_vcpu_uninit(vcpu); + free_vcpu: + kmem_cache_free(kvm_vcpu_cache, vcpu); + out: +diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c +index cc65af8fe6f7..3f6ad3f58628 100644 +--- a/arch/powerpc/kvm/book3s_pr.c ++++ b/arch/powerpc/kvm/book3s_pr.c +@@ -1769,10 +1769,12 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_pr(struct kvm *kvm, + + err = kvmppc_mmu_init(vcpu); + if (err < 0) +- goto uninit_vcpu; ++ goto free_shared_page; + + return vcpu; + ++free_shared_page: ++ free_page((unsigned long)vcpu->arch.shared); + uninit_vcpu: + kvm_vcpu_uninit(vcpu); + free_shadow_vcpu: +diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c +index 5a3373e06e60..235d57d6c205 100644 +--- a/arch/powerpc/kvm/book3s_xive_native.c ++++ b/arch/powerpc/kvm/book3s_xive_native.c +@@ -638,7 +638,7 @@ static int kvmppc_xive_native_set_queue_config(struct kvmppc_xive *xive, + srcu_idx = srcu_read_lock(&kvm->srcu); + gfn = gpa_to_gfn(kvm_eq.qaddr); + +- page_size = kvm_host_page_size(kvm, gfn); ++ page_size = kvm_host_page_size(vcpu, gfn); + if (1ull << kvm_eq.qshift > page_size) { + srcu_read_unlock(&kvm->srcu, srcu_idx); + pr_warn("Incompatible host page size %lx!\n", page_size); +diff --git a/arch/powerpc/mm/book3s64/pgtable.c b/arch/powerpc/mm/book3s64/pgtable.c +index 75483b40fcb1..2bf7e1b4fd82 100644 +--- a/arch/powerpc/mm/book3s64/pgtable.c ++++ b/arch/powerpc/mm/book3s64/pgtable.c +@@ -378,7 +378,6 @@ static inline void pgtable_free(void *table, int index) + } + } + +-#ifdef CONFIG_SMP + void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int index) + { + unsigned long pgf = (unsigned long)table; +@@ -395,12 +394,6 @@ void __tlb_remove_table(void *_table) + + return pgtable_free(table, index); + } +-#else +-void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int index) +-{ +- return pgtable_free(table, index); +-} +-#endif + + #ifdef CONFIG_PROC_FS + atomic_long_t direct_pages_count[MMU_PAGE_COUNT]; +diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c +index 8432c281de92..9298905cfe74 100644 +--- a/arch/powerpc/mm/fault.c ++++ b/arch/powerpc/mm/fault.c +@@ -233,7 +233,7 @@ static bool bad_kernel_fault(struct pt_regs *regs, unsigned long error_code, + + // Read/write fault in a valid region (the exception table search passed + // above), but blocked by KUAP is bad, it can never succeed. +- if (bad_kuap_fault(regs, is_write)) ++ if (bad_kuap_fault(regs, address, is_write)) + return true; + + // What's left? Kernel fault on user in well defined regions (extable +diff --git a/arch/powerpc/mm/ptdump/ptdump.c b/arch/powerpc/mm/ptdump/ptdump.c +index 2f9ddc29c535..c73205172447 100644 +--- a/arch/powerpc/mm/ptdump/ptdump.c ++++ b/arch/powerpc/mm/ptdump/ptdump.c +@@ -173,10 +173,12 @@ static void dump_addr(struct pg_state *st, unsigned long addr) + + static void note_prot_wx(struct pg_state *st, unsigned long addr) + { ++ pte_t pte = __pte(st->current_flags); ++ + if (!IS_ENABLED(CONFIG_PPC_DEBUG_WX) || !st->check_wx) + return; + +- if (!((st->current_flags & pgprot_val(PAGE_KERNEL_X)) == pgprot_val(PAGE_KERNEL_X))) ++ if (!pte_write(pte) || !pte_exec(pte)) + return; + + WARN_ONCE(1, "powerpc/mm: Found insecure W+X mapping at address %p/%pS\n", +diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c +index 8e700390f3d6..4c3af2e9eb8e 100644 +--- a/arch/powerpc/platforms/pseries/hotplug-memory.c ++++ b/arch/powerpc/platforms/pseries/hotplug-memory.c +@@ -360,8 +360,10 @@ static bool lmb_is_removable(struct drmem_lmb *lmb) + + for (i = 0; i < scns_per_block; i++) { + pfn = PFN_DOWN(phys_addr); +- if (!pfn_present(pfn)) ++ if (!pfn_present(pfn)) { ++ phys_addr += MIN_MEMORY_BLOCK_SIZE; + continue; ++ } + + rc &= is_mem_section_removable(pfn, PAGES_PER_SECTION); + phys_addr += MIN_MEMORY_BLOCK_SIZE; +diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c +index d83364ebc5c5..8057aafd5f5e 100644 +--- a/arch/powerpc/xmon/xmon.c ++++ b/arch/powerpc/xmon/xmon.c +@@ -1894,15 +1894,14 @@ static void dump_300_sprs(void) + + printf("pidr = %.16lx tidr = %.16lx\n", + mfspr(SPRN_PID), mfspr(SPRN_TIDR)); +- printf("asdr = %.16lx psscr = %.16lx\n", +- mfspr(SPRN_ASDR), hv ? mfspr(SPRN_PSSCR) +- : mfspr(SPRN_PSSCR_PR)); ++ printf("psscr = %.16lx\n", ++ hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR)); + + if (!hv) + return; + +- printf("ptcr = %.16lx\n", +- mfspr(SPRN_PTCR)); ++ printf("ptcr = %.16lx asdr = %.16lx\n", ++ mfspr(SPRN_PTCR), mfspr(SPRN_ASDR)); + #endif + } + +diff --git a/arch/riscv/net/bpf_jit_comp.c b/arch/riscv/net/bpf_jit_comp.c +index 7fbf56aab661..e2279fed8f56 100644 +--- a/arch/riscv/net/bpf_jit_comp.c ++++ b/arch/riscv/net/bpf_jit_comp.c +@@ -120,6 +120,11 @@ static bool seen_reg(int reg, struct rv_jit_context *ctx) + return false; + } + ++static void mark_fp(struct rv_jit_context *ctx) ++{ ++ __set_bit(RV_CTX_F_SEEN_S5, &ctx->flags); ++} ++ + static void mark_call(struct rv_jit_context *ctx) + { + __set_bit(RV_CTX_F_SEEN_CALL, &ctx->flags); +@@ -596,7 +601,8 @@ static void __build_epilogue(u8 reg, struct rv_jit_context *ctx) + + emit(rv_addi(RV_REG_SP, RV_REG_SP, stack_adjust), ctx); + /* Set return value. */ +- emit(rv_addi(RV_REG_A0, RV_REG_A5, 0), ctx); ++ if (reg == RV_REG_RA) ++ emit(rv_addi(RV_REG_A0, RV_REG_A5, 0), ctx); + emit(rv_jalr(RV_REG_ZERO, reg, 0), ctx); + } + +@@ -1426,6 +1432,10 @@ static void build_prologue(struct rv_jit_context *ctx) + { + int stack_adjust = 0, store_offset, bpf_stack_adjust; + ++ bpf_stack_adjust = round_up(ctx->prog->aux->stack_depth, 16); ++ if (bpf_stack_adjust) ++ mark_fp(ctx); ++ + if (seen_reg(RV_REG_RA, ctx)) + stack_adjust += 8; + stack_adjust += 8; /* RV_REG_FP */ +@@ -1443,7 +1453,6 @@ static void build_prologue(struct rv_jit_context *ctx) + stack_adjust += 8; + + stack_adjust = round_up(stack_adjust, 16); +- bpf_stack_adjust = round_up(ctx->prog->aux->stack_depth, 16); + stack_adjust += bpf_stack_adjust; + + store_offset = stack_adjust - 8; +diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h +index 823578c6b9e2..3f5cb55cde35 100644 +--- a/arch/s390/include/asm/page.h ++++ b/arch/s390/include/asm/page.h +@@ -33,6 +33,8 @@ + #define ARCH_HAS_PREPARE_HUGEPAGE + #define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH + ++#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA ++ + #include + #ifndef __ASSEMBLY__ + +diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c +index d047e846e1b9..756c627f7e54 100644 +--- a/arch/s390/kvm/kvm-s390.c ++++ b/arch/s390/kvm/kvm-s390.c +@@ -2863,9 +2863,7 @@ static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu) + vcpu->arch.sie_block->gcr[14] = CR14_UNUSED_32 | + CR14_UNUSED_33 | + CR14_EXTERNAL_DAMAGE_SUBMASK; +- /* make sure the new fpc will be lazily loaded */ +- save_fpu_regs(); +- current->thread.fpu.fpc = 0; ++ vcpu->run->s.regs.fpc = 0; + vcpu->arch.sie_block->gbea = 1; + vcpu->arch.sie_block->pp = 0; + vcpu->arch.sie_block->fpf &= ~FPF_BPBC; +@@ -4354,7 +4352,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, + switch (ioctl) { + case KVM_S390_STORE_STATUS: + idx = srcu_read_lock(&vcpu->kvm->srcu); +- r = kvm_s390_vcpu_store_status(vcpu, arg); ++ r = kvm_s390_store_status_unloaded(vcpu, arg); + srcu_read_unlock(&vcpu->kvm->srcu, idx); + break; + case KVM_S390_SET_INITIAL_PSW: { +diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c +index b0246c705a19..5674710a4841 100644 +--- a/arch/s390/mm/hugetlbpage.c ++++ b/arch/s390/mm/hugetlbpage.c +@@ -2,7 +2,7 @@ + /* + * IBM System z Huge TLB Page Support for Kernel. + * +- * Copyright IBM Corp. 2007,2016 ++ * Copyright IBM Corp. 2007,2020 + * Author(s): Gerald Schaefer + */ + +@@ -11,6 +11,9 @@ + + #include + #include ++#include ++#include ++#include + + /* + * If the bit selected by single-bit bitmask "a" is set within "x", move +@@ -267,3 +270,98 @@ static __init int setup_hugepagesz(char *opt) + return 1; + } + __setup("hugepagesz=", setup_hugepagesz); ++ ++static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, ++ unsigned long addr, unsigned long len, ++ unsigned long pgoff, unsigned long flags) ++{ ++ struct hstate *h = hstate_file(file); ++ struct vm_unmapped_area_info info; ++ ++ info.flags = 0; ++ info.length = len; ++ info.low_limit = current->mm->mmap_base; ++ info.high_limit = TASK_SIZE; ++ info.align_mask = PAGE_MASK & ~huge_page_mask(h); ++ info.align_offset = 0; ++ return vm_unmapped_area(&info); ++} ++ ++static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, ++ unsigned long addr0, unsigned long len, ++ unsigned long pgoff, unsigned long flags) ++{ ++ struct hstate *h = hstate_file(file); ++ struct vm_unmapped_area_info info; ++ unsigned long addr; ++ ++ info.flags = VM_UNMAPPED_AREA_TOPDOWN; ++ info.length = len; ++ info.low_limit = max(PAGE_SIZE, mmap_min_addr); ++ info.high_limit = current->mm->mmap_base; ++ info.align_mask = PAGE_MASK & ~huge_page_mask(h); ++ info.align_offset = 0; ++ addr = vm_unmapped_area(&info); ++ ++ /* ++ * A failed mmap() very likely causes application failure, ++ * so fall back to the bottom-up function here. This scenario ++ * can happen with large stack limits and large mmap() ++ * allocations. ++ */ ++ if (addr & ~PAGE_MASK) { ++ VM_BUG_ON(addr != -ENOMEM); ++ info.flags = 0; ++ info.low_limit = TASK_UNMAPPED_BASE; ++ info.high_limit = TASK_SIZE; ++ addr = vm_unmapped_area(&info); ++ } ++ ++ return addr; ++} ++ ++unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, ++ unsigned long len, unsigned long pgoff, unsigned long flags) ++{ ++ struct hstate *h = hstate_file(file); ++ struct mm_struct *mm = current->mm; ++ struct vm_area_struct *vma; ++ int rc; ++ ++ if (len & ~huge_page_mask(h)) ++ return -EINVAL; ++ if (len > TASK_SIZE - mmap_min_addr) ++ return -ENOMEM; ++ ++ if (flags & MAP_FIXED) { ++ if (prepare_hugepage_range(file, addr, len)) ++ return -EINVAL; ++ goto check_asce_limit; ++ } ++ ++ if (addr) { ++ addr = ALIGN(addr, huge_page_size(h)); ++ vma = find_vma(mm, addr); ++ if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && ++ (!vma || addr + len <= vm_start_gap(vma))) ++ goto check_asce_limit; ++ } ++ ++ if (mm->get_unmapped_area == arch_get_unmapped_area) ++ addr = hugetlb_get_unmapped_area_bottomup(file, addr, len, ++ pgoff, flags); ++ else ++ addr = hugetlb_get_unmapped_area_topdown(file, addr, len, ++ pgoff, flags); ++ if (addr & ~PAGE_MASK) ++ return addr; ++ ++check_asce_limit: ++ if (addr + len > current->mm->context.asce_limit && ++ addr + len <= TASK_SIZE) { ++ rc = crst_table_upgrade(mm, addr + len); ++ if (rc) ++ return (unsigned long) rc; ++ } ++ return addr; ++} +diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig +index eb24cb1afc11..18e9fb6fcf1b 100644 +--- a/arch/sparc/Kconfig ++++ b/arch/sparc/Kconfig +@@ -65,7 +65,6 @@ config SPARC64 + select HAVE_KRETPROBES + select HAVE_KPROBES + select HAVE_RCU_TABLE_FREE if SMP +- select HAVE_RCU_TABLE_NO_INVALIDATE if HAVE_RCU_TABLE_FREE + select HAVE_MEMBLOCK_NODE_MAP + select HAVE_ARCH_TRANSPARENT_HUGEPAGE + select HAVE_DYNAMIC_FTRACE +diff --git a/arch/sparc/include/asm/tlb_64.h b/arch/sparc/include/asm/tlb_64.h +index a2f3fa61ee36..8cb8f3833239 100644 +--- a/arch/sparc/include/asm/tlb_64.h ++++ b/arch/sparc/include/asm/tlb_64.h +@@ -28,6 +28,15 @@ void flush_tlb_pending(void); + #define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) + #define tlb_flush(tlb) flush_tlb_pending() + ++/* ++ * SPARC64's hardware TLB fill does not use the Linux page-tables ++ * and therefore we don't need a TLBI when freeing page-table pages. ++ */ ++ ++#ifdef CONFIG_HAVE_RCU_TABLE_FREE ++#define tlb_needs_table_invalidate() (false) ++#endif ++ + #include + + #endif /* _SPARC64_TLB_H */ +diff --git a/arch/sparc/include/uapi/asm/ipcbuf.h b/arch/sparc/include/uapi/asm/ipcbuf.h +index 9d0d125500e2..084b8949ddff 100644 +--- a/arch/sparc/include/uapi/asm/ipcbuf.h ++++ b/arch/sparc/include/uapi/asm/ipcbuf.h +@@ -15,19 +15,19 @@ + + struct ipc64_perm + { +- __kernel_key_t key; +- __kernel_uid_t uid; +- __kernel_gid_t gid; +- __kernel_uid_t cuid; +- __kernel_gid_t cgid; ++ __kernel_key_t key; ++ __kernel_uid32_t uid; ++ __kernel_gid32_t gid; ++ __kernel_uid32_t cuid; ++ __kernel_gid32_t cgid; + #ifndef __arch64__ +- unsigned short __pad0; ++ unsigned short __pad0; + #endif +- __kernel_mode_t mode; +- unsigned short __pad1; +- unsigned short seq; +- unsigned long long __unused1; +- unsigned long long __unused2; ++ __kernel_mode_t mode; ++ unsigned short __pad1; ++ unsigned short seq; ++ unsigned long long __unused1; ++ unsigned long long __unused2; + }; + + #endif /* __SPARC_IPCBUF_H */ +diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h +index 2ebc17d9c72c..19e94af9cc5d 100644 +--- a/arch/x86/include/asm/apic.h ++++ b/arch/x86/include/asm/apic.h +@@ -140,6 +140,7 @@ extern void apic_soft_disable(void); + extern void lapic_shutdown(void); + extern void sync_Arb_IDs(void); + extern void init_bsp_APIC(void); ++extern void apic_intr_mode_select(void); + extern void apic_intr_mode_init(void); + extern void init_apic_mappings(void); + void register_lapic_address(unsigned long address); +@@ -188,6 +189,7 @@ static inline void disable_local_APIC(void) { } + # define setup_secondary_APIC_clock x86_init_noop + static inline void lapic_update_tsc_freq(void) { } + static inline void init_bsp_APIC(void) { } ++static inline void apic_intr_mode_select(void) { } + static inline void apic_intr_mode_init(void) { } + static inline void lapic_assign_system_vectors(void) { } + static inline void lapic_assign_legacy_vector(unsigned int i, bool r) { } +@@ -452,6 +454,14 @@ static inline void ack_APIC_irq(void) + apic_eoi(); + } + ++ ++static inline bool lapic_vector_set_in_irr(unsigned int vector) ++{ ++ u32 irr = apic_read(APIC_IRR + (vector / 32 * 0x10)); ++ ++ return !!(irr & (1U << (vector % 32))); ++} ++ + static inline unsigned default_get_apic_id(unsigned long x) + { + unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); +diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h +index 4fc61483919a..c1ed054c103c 100644 +--- a/arch/x86/include/asm/kvm_host.h ++++ b/arch/x86/include/asm/kvm_host.h +@@ -380,12 +380,12 @@ struct kvm_mmu { + void (*set_cr3)(struct kvm_vcpu *vcpu, unsigned long root); + unsigned long (*get_cr3)(struct kvm_vcpu *vcpu); + u64 (*get_pdptr)(struct kvm_vcpu *vcpu, int index); +- int (*page_fault)(struct kvm_vcpu *vcpu, gva_t gva, u32 err, ++ int (*page_fault)(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 err, + bool prefault); + void (*inject_page_fault)(struct kvm_vcpu *vcpu, + struct x86_exception *fault); +- gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t gva, u32 access, +- struct x86_exception *exception); ++ gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t gva_or_gpa, ++ u32 access, struct x86_exception *exception); + gpa_t (*translate_gpa)(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access, + struct x86_exception *exception); + int (*sync_page)(struct kvm_vcpu *vcpu, +@@ -667,10 +667,10 @@ struct kvm_vcpu_arch { + bool pvclock_set_guest_stopped_request; + + struct { ++ u8 preempted; + u64 msr_val; + u64 last_steal; +- struct gfn_to_hva_cache stime; +- struct kvm_steal_time steal; ++ struct gfn_to_pfn_cache cache; + } st; + + u64 tsc_offset; +@@ -1128,6 +1128,7 @@ struct kvm_x86_ops { + bool (*xsaves_supported)(void); + bool (*umip_emulated)(void); + bool (*pt_supported)(void); ++ bool (*pku_supported)(void); + + int (*check_nested_events)(struct kvm_vcpu *vcpu, bool external_intr); + void (*request_immediate_exit)(struct kvm_vcpu *vcpu); +@@ -1450,7 +1451,7 @@ void kvm_vcpu_deactivate_apicv(struct kvm_vcpu *vcpu); + + int kvm_emulate_hypercall(struct kvm_vcpu *vcpu); + +-int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva, u64 error_code, ++int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 error_code, + void *insn, int insn_len); + void kvm_mmu_invlpg(struct kvm_vcpu *vcpu, gva_t gva); + void kvm_mmu_invpcid_gva(struct kvm_vcpu *vcpu, gva_t gva, unsigned long pcid); +diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h +index 19435858df5f..96d9cd208610 100644 +--- a/arch/x86/include/asm/x86_init.h ++++ b/arch/x86/include/asm/x86_init.h +@@ -51,12 +51,14 @@ struct x86_init_resources { + * are set up. + * @intr_init: interrupt init code + * @trap_init: platform specific trap setup ++ * @intr_mode_select: interrupt delivery mode selection + * @intr_mode_init: interrupt delivery mode setup + */ + struct x86_init_irqs { + void (*pre_vector_init)(void); + void (*intr_init)(void); + void (*trap_init)(void); ++ void (*intr_mode_select)(void); + void (*intr_mode_init)(void); + }; + +diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c +index 2b0faf86da1b..df891f874614 100644 +--- a/arch/x86/kernel/apic/apic.c ++++ b/arch/x86/kernel/apic/apic.c +@@ -830,8 +830,17 @@ bool __init apic_needs_pit(void) + if (!tsc_khz || !cpu_khz) + return true; + +- /* Is there an APIC at all? */ +- if (!boot_cpu_has(X86_FEATURE_APIC)) ++ /* Is there an APIC at all or is it disabled? */ ++ if (!boot_cpu_has(X86_FEATURE_APIC) || disable_apic) ++ return true; ++ ++ /* ++ * If interrupt delivery mode is legacy PIC or virtual wire without ++ * configuration, the local APIC timer wont be set up. Make sure ++ * that the PIT is initialized. ++ */ ++ if (apic_intr_mode == APIC_PIC || ++ apic_intr_mode == APIC_VIRTUAL_WIRE_NO_CONFIG) + return true; + + /* Virt guests may lack ARAT, but still have DEADLINE */ +@@ -1322,7 +1331,7 @@ void __init sync_Arb_IDs(void) + + enum apic_intr_mode_id apic_intr_mode __ro_after_init; + +-static int __init apic_intr_mode_select(void) ++static int __init __apic_intr_mode_select(void) + { + /* Check kernel option */ + if (disable_apic) { +@@ -1384,6 +1393,12 @@ static int __init apic_intr_mode_select(void) + return APIC_SYMMETRIC_IO; + } + ++/* Select the interrupt delivery mode for the BSP */ ++void __init apic_intr_mode_select(void) ++{ ++ apic_intr_mode = __apic_intr_mode_select(); ++} ++ + /* + * An initial setup of the virtual wire mode. + */ +@@ -1440,8 +1455,6 @@ void __init apic_intr_mode_init(void) + { + bool upmode = IS_ENABLED(CONFIG_UP_LATE_INIT); + +- apic_intr_mode = apic_intr_mode_select(); +- + switch (apic_intr_mode) { + case APIC_PIC: + pr_info("APIC: Keep in PIC mode(8259)\n"); +diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c +index 7f7533462474..159bd0cb8548 100644 +--- a/arch/x86/kernel/apic/msi.c ++++ b/arch/x86/kernel/apic/msi.c +@@ -23,10 +23,8 @@ + + static struct irq_domain *msi_default_domain; + +-static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) ++static void __irq_msi_compose_msg(struct irq_cfg *cfg, struct msi_msg *msg) + { +- struct irq_cfg *cfg = irqd_cfg(data); +- + msg->address_hi = MSI_ADDR_BASE_HI; + + if (x2apic_enabled()) +@@ -47,6 +45,127 @@ static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) + MSI_DATA_VECTOR(cfg->vector); + } + ++static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) ++{ ++ __irq_msi_compose_msg(irqd_cfg(data), msg); ++} ++ ++static void irq_msi_update_msg(struct irq_data *irqd, struct irq_cfg *cfg) ++{ ++ struct msi_msg msg[2] = { [1] = { }, }; ++ ++ __irq_msi_compose_msg(cfg, msg); ++ irq_data_get_irq_chip(irqd)->irq_write_msi_msg(irqd, msg); ++} ++ ++static int ++msi_set_affinity(struct irq_data *irqd, const struct cpumask *mask, bool force) ++{ ++ struct irq_cfg old_cfg, *cfg = irqd_cfg(irqd); ++ struct irq_data *parent = irqd->parent_data; ++ unsigned int cpu; ++ int ret; ++ ++ /* Save the current configuration */ ++ cpu = cpumask_first(irq_data_get_effective_affinity_mask(irqd)); ++ old_cfg = *cfg; ++ ++ /* Allocate a new target vector */ ++ ret = parent->chip->irq_set_affinity(parent, mask, force); ++ if (ret < 0 || ret == IRQ_SET_MASK_OK_DONE) ++ return ret; ++ ++ /* ++ * For non-maskable and non-remapped MSI interrupts the migration ++ * to a different destination CPU and a different vector has to be ++ * done careful to handle the possible stray interrupt which can be ++ * caused by the non-atomic update of the address/data pair. ++ * ++ * Direct update is possible when: ++ * - The MSI is maskable (remapped MSI does not use this code path)). ++ * The quirk bit is not set in this case. ++ * - The new vector is the same as the old vector ++ * - The old vector is MANAGED_IRQ_SHUTDOWN_VECTOR (interrupt starts up) ++ * - The new destination CPU is the same as the old destination CPU ++ */ ++ if (!irqd_msi_nomask_quirk(irqd) || ++ cfg->vector == old_cfg.vector || ++ old_cfg.vector == MANAGED_IRQ_SHUTDOWN_VECTOR || ++ cfg->dest_apicid == old_cfg.dest_apicid) { ++ irq_msi_update_msg(irqd, cfg); ++ return ret; ++ } ++ ++ /* ++ * Paranoia: Validate that the interrupt target is the local ++ * CPU. ++ */ ++ if (WARN_ON_ONCE(cpu != smp_processor_id())) { ++ irq_msi_update_msg(irqd, cfg); ++ return ret; ++ } ++ ++ /* ++ * Redirect the interrupt to the new vector on the current CPU ++ * first. This might cause a spurious interrupt on this vector if ++ * the device raises an interrupt right between this update and the ++ * update to the final destination CPU. ++ * ++ * If the vector is in use then the installed device handler will ++ * denote it as spurious which is no harm as this is a rare event ++ * and interrupt handlers have to cope with spurious interrupts ++ * anyway. If the vector is unused, then it is marked so it won't ++ * trigger the 'No irq handler for vector' warning in do_IRQ(). ++ * ++ * This requires to hold vector lock to prevent concurrent updates to ++ * the affected vector. ++ */ ++ lock_vector_lock(); ++ ++ /* ++ * Mark the new target vector on the local CPU if it is currently ++ * unused. Reuse the VECTOR_RETRIGGERED state which is also used in ++ * the CPU hotplug path for a similar purpose. This cannot be ++ * undone here as the current CPU has interrupts disabled and ++ * cannot handle the interrupt before the whole set_affinity() ++ * section is done. In the CPU unplug case, the current CPU is ++ * about to vanish and will not handle any interrupts anymore. The ++ * vector is cleaned up when the CPU comes online again. ++ */ ++ if (IS_ERR_OR_NULL(this_cpu_read(vector_irq[cfg->vector]))) ++ this_cpu_write(vector_irq[cfg->vector], VECTOR_RETRIGGERED); ++ ++ /* Redirect it to the new vector on the local CPU temporarily */ ++ old_cfg.vector = cfg->vector; ++ irq_msi_update_msg(irqd, &old_cfg); ++ ++ /* Now transition it to the target CPU */ ++ irq_msi_update_msg(irqd, cfg); ++ ++ /* ++ * All interrupts after this point are now targeted at the new ++ * vector/CPU. ++ * ++ * Drop vector lock before testing whether the temporary assignment ++ * to the local CPU was hit by an interrupt raised in the device, ++ * because the retrigger function acquires vector lock again. ++ */ ++ unlock_vector_lock(); ++ ++ /* ++ * Check whether the transition raced with a device interrupt and ++ * is pending in the local APICs IRR. It is safe to do this outside ++ * of vector lock as the irq_desc::lock of this interrupt is still ++ * held and interrupts are disabled: The check is not accessing the ++ * underlying vector store. It's just checking the local APIC's ++ * IRR. ++ */ ++ if (lapic_vector_set_in_irr(cfg->vector)) ++ irq_data_get_irq_chip(irqd)->irq_retrigger(irqd); ++ ++ return ret; ++} ++ + /* + * IRQ Chip for MSI PCI/PCI-X/PCI-Express Devices, + * which implement the MSI or MSI-X Capability Structure. +@@ -58,6 +177,7 @@ static struct irq_chip pci_msi_controller = { + .irq_ack = irq_chip_ack_parent, + .irq_retrigger = irq_chip_retrigger_hierarchy, + .irq_compose_msi_msg = irq_msi_compose_msg, ++ .irq_set_affinity = msi_set_affinity, + .flags = IRQCHIP_SKIP_SET_WAKE, + }; + +@@ -146,6 +266,8 @@ void __init arch_init_msi_domain(struct irq_domain *parent) + } + if (!msi_default_domain) + pr_warn("failed to initialize irqdomain for MSI/MSI-x.\n"); ++ else ++ msi_default_domain->flags |= IRQ_DOMAIN_MSI_NOMASK_QUIRK; + } + + #ifdef CONFIG_IRQ_REMAP +diff --git a/arch/x86/kernel/cpu/tsx.c b/arch/x86/kernel/cpu/tsx.c +index 3e20d322bc98..032509adf9de 100644 +--- a/arch/x86/kernel/cpu/tsx.c ++++ b/arch/x86/kernel/cpu/tsx.c +@@ -115,11 +115,12 @@ void __init tsx_init(void) + tsx_disable(); + + /* +- * tsx_disable() will change the state of the +- * RTM CPUID bit. Clear it here since it is now +- * expected to be not set. ++ * tsx_disable() will change the state of the RTM and HLE CPUID ++ * bits. Clear them here since they are now expected to be not ++ * set. + */ + setup_clear_cpu_cap(X86_FEATURE_RTM); ++ setup_clear_cpu_cap(X86_FEATURE_HLE); + } else if (tsx_ctrl_state == TSX_CTRL_ENABLE) { + + /* +@@ -131,10 +132,10 @@ void __init tsx_init(void) + tsx_enable(); + + /* +- * tsx_enable() will change the state of the +- * RTM CPUID bit. Force it here since it is now +- * expected to be set. ++ * tsx_enable() will change the state of the RTM and HLE CPUID ++ * bits. Force them here since they are now expected to be set. + */ + setup_force_cpu_cap(X86_FEATURE_RTM); ++ setup_force_cpu_cap(X86_FEATURE_HLE); + } + } +diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c +index 7ce29cee9f9e..d8673d8a779b 100644 +--- a/arch/x86/kernel/time.c ++++ b/arch/x86/kernel/time.c +@@ -91,10 +91,18 @@ void __init hpet_time_init(void) + + static __init void x86_late_time_init(void) + { ++ /* ++ * Before PIT/HPET init, select the interrupt mode. This is required ++ * to make the decision whether PIT should be initialized correct. ++ */ ++ x86_init.irqs.intr_mode_select(); ++ ++ /* Setup the legacy timers */ + x86_init.timers.timer_init(); ++ + /* +- * After PIT/HPET timers init, select and setup +- * the final interrupt mode for delivering IRQs. ++ * After PIT/HPET timers init, set up the final interrupt mode for ++ * delivering IRQs. + */ + x86_init.irqs.intr_mode_init(); + tsc_init(); +diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c +index 18a799c8fa28..1838b10a299c 100644 +--- a/arch/x86/kernel/x86_init.c ++++ b/arch/x86/kernel/x86_init.c +@@ -58,6 +58,7 @@ struct x86_init_ops x86_init __initdata = { + .pre_vector_init = init_ISA_irqs, + .intr_init = native_init_IRQ, + .trap_init = x86_init_noop, ++ .intr_mode_select = apic_intr_mode_select, + .intr_mode_init = apic_intr_mode_init + }, + +diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c +index b1d5a8c94a57..6fa946f983c9 100644 +--- a/arch/x86/kvm/cpuid.c ++++ b/arch/x86/kvm/cpuid.c +@@ -352,6 +352,7 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index) + unsigned f_umip = kvm_x86_ops->umip_emulated() ? F(UMIP) : 0; + unsigned f_intel_pt = kvm_x86_ops->pt_supported() ? F(INTEL_PT) : 0; + unsigned f_la57; ++ unsigned f_pku = kvm_x86_ops->pku_supported() ? F(PKU) : 0; + + /* cpuid 7.0.ebx */ + const u32 kvm_cpuid_7_0_ebx_x86_features = +@@ -363,7 +364,7 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index) + + /* cpuid 7.0.ecx*/ + const u32 kvm_cpuid_7_0_ecx_x86_features = +- F(AVX512VBMI) | F(LA57) | F(PKU) | 0 /*OSPKE*/ | F(RDPID) | ++ F(AVX512VBMI) | F(LA57) | 0 /*PKU*/ | 0 /*OSPKE*/ | F(RDPID) | + F(AVX512_VPOPCNTDQ) | F(UMIP) | F(AVX512_VBMI2) | F(GFNI) | + F(VAES) | F(VPCLMULQDQ) | F(AVX512_VNNI) | F(AVX512_BITALG) | + F(CLDEMOTE) | F(MOVDIRI) | F(MOVDIR64B) | 0 /*WAITPKG*/; +@@ -392,6 +393,7 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index) + /* Set LA57 based on hardware capability. */ + entry->ecx |= f_la57; + entry->ecx |= f_umip; ++ entry->ecx |= f_pku; + /* PKU is not yet implemented for shadow paging. */ + if (!tdp_enabled || !boot_cpu_has(X86_FEATURE_OSPKE)) + entry->ecx &= ~F(PKU); +diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c +index 698efb8c3897..37aa9ce29b33 100644 +--- a/arch/x86/kvm/emulate.c ++++ b/arch/x86/kvm/emulate.c +@@ -22,6 +22,7 @@ + #include "kvm_cache_regs.h" + #include + #include ++#include + #include + #include + +@@ -1075,8 +1076,23 @@ static void fetch_register_operand(struct operand *op) + } + } + ++static void emulator_get_fpu(void) ++{ ++ fpregs_lock(); ++ ++ fpregs_assert_state_consistent(); ++ if (test_thread_flag(TIF_NEED_FPU_LOAD)) ++ switch_fpu_return(); ++} ++ ++static void emulator_put_fpu(void) ++{ ++ fpregs_unlock(); ++} ++ + static void read_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, int reg) + { ++ emulator_get_fpu(); + switch (reg) { + case 0: asm("movdqa %%xmm0, %0" : "=m"(*data)); break; + case 1: asm("movdqa %%xmm1, %0" : "=m"(*data)); break; +@@ -1098,11 +1114,13 @@ static void read_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, int reg) + #endif + default: BUG(); + } ++ emulator_put_fpu(); + } + + static void write_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, + int reg) + { ++ emulator_get_fpu(); + switch (reg) { + case 0: asm("movdqa %0, %%xmm0" : : "m"(*data)); break; + case 1: asm("movdqa %0, %%xmm1" : : "m"(*data)); break; +@@ -1124,10 +1142,12 @@ static void write_sse_reg(struct x86_emulate_ctxt *ctxt, sse128_t *data, + #endif + default: BUG(); + } ++ emulator_put_fpu(); + } + + static void read_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg) + { ++ emulator_get_fpu(); + switch (reg) { + case 0: asm("movq %%mm0, %0" : "=m"(*data)); break; + case 1: asm("movq %%mm1, %0" : "=m"(*data)); break; +@@ -1139,10 +1159,12 @@ static void read_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg) + case 7: asm("movq %%mm7, %0" : "=m"(*data)); break; + default: BUG(); + } ++ emulator_put_fpu(); + } + + static void write_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg) + { ++ emulator_get_fpu(); + switch (reg) { + case 0: asm("movq %0, %%mm0" : : "m"(*data)); break; + case 1: asm("movq %0, %%mm1" : : "m"(*data)); break; +@@ -1154,6 +1176,7 @@ static void write_mmx_reg(struct x86_emulate_ctxt *ctxt, u64 *data, int reg) + case 7: asm("movq %0, %%mm7" : : "m"(*data)); break; + default: BUG(); + } ++ emulator_put_fpu(); + } + + static int em_fninit(struct x86_emulate_ctxt *ctxt) +@@ -1161,7 +1184,9 @@ static int em_fninit(struct x86_emulate_ctxt *ctxt) + if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) + return emulate_nm(ctxt); + ++ emulator_get_fpu(); + asm volatile("fninit"); ++ emulator_put_fpu(); + return X86EMUL_CONTINUE; + } + +@@ -1172,7 +1197,9 @@ static int em_fnstcw(struct x86_emulate_ctxt *ctxt) + if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) + return emulate_nm(ctxt); + ++ emulator_get_fpu(); + asm volatile("fnstcw %0": "+m"(fcw)); ++ emulator_put_fpu(); + + ctxt->dst.val = fcw; + +@@ -1186,7 +1213,9 @@ static int em_fnstsw(struct x86_emulate_ctxt *ctxt) + if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) + return emulate_nm(ctxt); + ++ emulator_get_fpu(); + asm volatile("fnstsw %0": "+m"(fsw)); ++ emulator_put_fpu(); + + ctxt->dst.val = fsw; + +@@ -4094,8 +4123,12 @@ static int em_fxsave(struct x86_emulate_ctxt *ctxt) + if (rc != X86EMUL_CONTINUE) + return rc; + ++ emulator_get_fpu(); ++ + rc = asm_safe("fxsave %[fx]", , [fx] "+m"(fx_state)); + ++ emulator_put_fpu(); ++ + if (rc != X86EMUL_CONTINUE) + return rc; + +@@ -4138,6 +4171,8 @@ static int em_fxrstor(struct x86_emulate_ctxt *ctxt) + if (rc != X86EMUL_CONTINUE) + return rc; + ++ emulator_get_fpu(); ++ + if (size < __fxstate_size(16)) { + rc = fxregs_fixup(&fx_state, size); + if (rc != X86EMUL_CONTINUE) +@@ -4153,6 +4188,8 @@ static int em_fxrstor(struct x86_emulate_ctxt *ctxt) + rc = asm_safe("fxrstor %[fx]", : [fx] "m"(fx_state)); + + out: ++ emulator_put_fpu(); ++ + return rc; + } + +@@ -5212,16 +5249,28 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) + ctxt->ad_bytes = def_ad_bytes ^ 6; + break; + case 0x26: /* ES override */ ++ has_seg_override = true; ++ ctxt->seg_override = VCPU_SREG_ES; ++ break; + case 0x2e: /* CS override */ ++ has_seg_override = true; ++ ctxt->seg_override = VCPU_SREG_CS; ++ break; + case 0x36: /* SS override */ ++ has_seg_override = true; ++ ctxt->seg_override = VCPU_SREG_SS; ++ break; + case 0x3e: /* DS override */ + has_seg_override = true; +- ctxt->seg_override = (ctxt->b >> 3) & 3; ++ ctxt->seg_override = VCPU_SREG_DS; + break; + case 0x64: /* FS override */ ++ has_seg_override = true; ++ ctxt->seg_override = VCPU_SREG_FS; ++ break; + case 0x65: /* GS override */ + has_seg_override = true; +- ctxt->seg_override = ctxt->b & 7; ++ ctxt->seg_override = VCPU_SREG_GS; + break; + case 0x40 ... 0x4f: /* REX */ + if (mode != X86EMUL_MODE_PROT64) +@@ -5305,10 +5354,15 @@ done_prefixes: + } + break; + case Escape: +- if (ctxt->modrm > 0xbf) +- opcode = opcode.u.esc->high[ctxt->modrm - 0xc0]; +- else ++ if (ctxt->modrm > 0xbf) { ++ size_t size = ARRAY_SIZE(opcode.u.esc->high); ++ u32 index = array_index_nospec( ++ ctxt->modrm - 0xc0, size); ++ ++ opcode = opcode.u.esc->high[index]; ++ } else { + opcode = opcode.u.esc->op[(ctxt->modrm >> 3) & 7]; ++ } + break; + case InstrDual: + if ((ctxt->modrm >> 6) == 3) +@@ -5450,7 +5504,9 @@ static int flush_pending_x87_faults(struct x86_emulate_ctxt *ctxt) + { + int rc; + ++ emulator_get_fpu(); + rc = asm_safe("fwait"); ++ emulator_put_fpu(); + + if (unlikely(rc != X86EMUL_CONTINUE)) + return emulate_exception(ctxt, MF_VECTOR, 0, false); +diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c +index 23ff65504d7e..26408434b9bc 100644 +--- a/arch/x86/kvm/hyperv.c ++++ b/arch/x86/kvm/hyperv.c +@@ -809,11 +809,12 @@ static int kvm_hv_msr_get_crash_data(struct kvm_vcpu *vcpu, + u32 index, u64 *pdata) + { + struct kvm_hv *hv = &vcpu->kvm->arch.hyperv; ++ size_t size = ARRAY_SIZE(hv->hv_crash_param); + +- if (WARN_ON_ONCE(index >= ARRAY_SIZE(hv->hv_crash_param))) ++ if (WARN_ON_ONCE(index >= size)) + return -EINVAL; + +- *pdata = hv->hv_crash_param[index]; ++ *pdata = hv->hv_crash_param[array_index_nospec(index, size)]; + return 0; + } + +@@ -852,11 +853,12 @@ static int kvm_hv_msr_set_crash_data(struct kvm_vcpu *vcpu, + u32 index, u64 data) + { + struct kvm_hv *hv = &vcpu->kvm->arch.hyperv; ++ size_t size = ARRAY_SIZE(hv->hv_crash_param); + +- if (WARN_ON_ONCE(index >= ARRAY_SIZE(hv->hv_crash_param))) ++ if (WARN_ON_ONCE(index >= size)) + return -EINVAL; + +- hv->hv_crash_param[index] = data; ++ hv->hv_crash_param[array_index_nospec(index, size)] = data; + return 0; + } + +diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c +index 8b38bb4868a6..629a09ca9860 100644 +--- a/arch/x86/kvm/i8259.c ++++ b/arch/x86/kvm/i8259.c +@@ -460,10 +460,14 @@ static int picdev_write(struct kvm_pic *s, + switch (addr) { + case 0x20: + case 0x21: ++ pic_lock(s); ++ pic_ioport_write(&s->pics[0], addr, data); ++ pic_unlock(s); ++ break; + case 0xa0: + case 0xa1: + pic_lock(s); +- pic_ioport_write(&s->pics[addr >> 7], addr, data); ++ pic_ioport_write(&s->pics[1], addr, data); + pic_unlock(s); + break; + case 0x4d0: +diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c +index d859ae8890d0..24a6905d60ee 100644 +--- a/arch/x86/kvm/ioapic.c ++++ b/arch/x86/kvm/ioapic.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -68,13 +69,14 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic, + default: + { + u32 redir_index = (ioapic->ioregsel - 0x10) >> 1; +- u64 redir_content; ++ u64 redir_content = ~0ULL; + +- if (redir_index < IOAPIC_NUM_PINS) +- redir_content = +- ioapic->redirtbl[redir_index].bits; +- else +- redir_content = ~0ULL; ++ if (redir_index < IOAPIC_NUM_PINS) { ++ u32 index = array_index_nospec( ++ redir_index, IOAPIC_NUM_PINS); ++ ++ redir_content = ioapic->redirtbl[index].bits; ++ } + + result = (ioapic->ioregsel & 0x1) ? + (redir_content >> 32) & 0xffffffff : +@@ -291,6 +293,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) + + if (index >= IOAPIC_NUM_PINS) + return; ++ index = array_index_nospec(index, IOAPIC_NUM_PINS); + e = &ioapic->redirtbl[index]; + mask_before = e->fields.mask; + /* Preserve read-only fields */ +diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c +index b29d00b661ff..15728971a430 100644 +--- a/arch/x86/kvm/lapic.c ++++ b/arch/x86/kvm/lapic.c +@@ -1926,15 +1926,20 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) + case APIC_LVTTHMR: + case APIC_LVTPC: + case APIC_LVT1: +- case APIC_LVTERR: ++ case APIC_LVTERR: { + /* TODO: Check vector */ ++ size_t size; ++ u32 index; ++ + if (!kvm_apic_sw_enabled(apic)) + val |= APIC_LVT_MASKED; +- +- val &= apic_lvt_mask[(reg - APIC_LVTT) >> 4]; ++ size = ARRAY_SIZE(apic_lvt_mask); ++ index = array_index_nospec( ++ (reg - APIC_LVTT) >> 4, size); ++ val &= apic_lvt_mask[index]; + kvm_lapic_set_reg(apic, reg, val); +- + break; ++ } + + case APIC_LVTT: + if (!kvm_apic_sw_enabled(apic)) +diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c +index 2ce9da58611e..518100ea5ef4 100644 +--- a/arch/x86/kvm/mmu.c ++++ b/arch/x86/kvm/mmu.c +@@ -418,22 +418,24 @@ static inline bool is_access_track_spte(u64 spte) + * requires a full MMU zap). The flag is instead explicitly queried when + * checking for MMIO spte cache hits. + */ +-#define MMIO_SPTE_GEN_MASK GENMASK_ULL(18, 0) ++#define MMIO_SPTE_GEN_MASK GENMASK_ULL(17, 0) + + #define MMIO_SPTE_GEN_LOW_START 3 + #define MMIO_SPTE_GEN_LOW_END 11 + #define MMIO_SPTE_GEN_LOW_MASK GENMASK_ULL(MMIO_SPTE_GEN_LOW_END, \ + MMIO_SPTE_GEN_LOW_START) + +-#define MMIO_SPTE_GEN_HIGH_START 52 +-#define MMIO_SPTE_GEN_HIGH_END 61 ++#define MMIO_SPTE_GEN_HIGH_START PT64_SECOND_AVAIL_BITS_SHIFT ++#define MMIO_SPTE_GEN_HIGH_END 62 + #define MMIO_SPTE_GEN_HIGH_MASK GENMASK_ULL(MMIO_SPTE_GEN_HIGH_END, \ + MMIO_SPTE_GEN_HIGH_START) ++ + static u64 generation_mmio_spte_mask(u64 gen) + { + u64 mask; + + WARN_ON(gen & ~MMIO_SPTE_GEN_MASK); ++ BUILD_BUG_ON((MMIO_SPTE_GEN_HIGH_MASK | MMIO_SPTE_GEN_LOW_MASK) & SPTE_SPECIAL_MASK); + + mask = (gen << MMIO_SPTE_GEN_LOW_START) & MMIO_SPTE_GEN_LOW_MASK; + mask |= (gen << MMIO_SPTE_GEN_HIGH_START) & MMIO_SPTE_GEN_HIGH_MASK; +@@ -444,8 +446,6 @@ static u64 get_mmio_spte_generation(u64 spte) + { + u64 gen; + +- spte &= ~shadow_mmio_mask; +- + gen = (spte & MMIO_SPTE_GEN_LOW_MASK) >> MMIO_SPTE_GEN_LOW_START; + gen |= (spte & MMIO_SPTE_GEN_HIGH_MASK) >> MMIO_SPTE_GEN_HIGH_START; + return gen; +@@ -538,16 +538,20 @@ EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes); + static u8 kvm_get_shadow_phys_bits(void) + { + /* +- * boot_cpu_data.x86_phys_bits is reduced when MKTME is detected +- * in CPU detection code, but MKTME treats those reduced bits as +- * 'keyID' thus they are not reserved bits. Therefore for MKTME +- * we should still return physical address bits reported by CPUID. ++ * boot_cpu_data.x86_phys_bits is reduced when MKTME or SME are detected ++ * in CPU detection code, but the processor treats those reduced bits as ++ * 'keyID' thus they are not reserved bits. Therefore KVM needs to look at ++ * the physical address bits reported by CPUID. + */ +- if (!boot_cpu_has(X86_FEATURE_TME) || +- WARN_ON_ONCE(boot_cpu_data.extended_cpuid_level < 0x80000008)) +- return boot_cpu_data.x86_phys_bits; ++ if (likely(boot_cpu_data.extended_cpuid_level >= 0x80000008)) ++ return cpuid_eax(0x80000008) & 0xff; + +- return cpuid_eax(0x80000008) & 0xff; ++ /* ++ * Quite weird to have VMX or SVM but not MAXPHYADDR; probably a VM with ++ * custom CPUID. Proceed with whatever the kernel found since these features ++ * aren't virtualizable (SME/SEV also require CPUIDs higher than 0x80000008). ++ */ ++ return boot_cpu_data.x86_phys_bits; + } + + static void kvm_mmu_reset_all_pte_masks(void) +@@ -1282,12 +1286,12 @@ static bool mmu_gfn_lpage_is_disallowed(struct kvm_vcpu *vcpu, gfn_t gfn, + return __mmu_gfn_lpage_is_disallowed(gfn, level, slot); + } + +-static int host_mapping_level(struct kvm *kvm, gfn_t gfn) ++static int host_mapping_level(struct kvm_vcpu *vcpu, gfn_t gfn) + { + unsigned long page_size; + int i, ret = 0; + +- page_size = kvm_host_page_size(kvm, gfn); ++ page_size = kvm_host_page_size(vcpu, gfn); + + for (i = PT_PAGE_TABLE_LEVEL; i <= PT_MAX_HUGEPAGE_LEVEL; ++i) { + if (page_size >= KVM_HPAGE_SIZE(i)) +@@ -1337,7 +1341,7 @@ static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn, + if (unlikely(*force_pt_level)) + return PT_PAGE_TABLE_LEVEL; + +- host_level = host_mapping_level(vcpu->kvm, large_gfn); ++ host_level = host_mapping_level(vcpu, large_gfn); + + if (host_level == PT_PAGE_TABLE_LEVEL) + return host_level; +@@ -3528,7 +3532,7 @@ static bool is_access_allowed(u32 fault_err_code, u64 spte) + * - true: let the vcpu to access on the same address again. + * - false: let the real page fault path to fix it. + */ +-static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, ++static bool fast_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, int level, + u32 error_code) + { + struct kvm_shadow_walk_iterator iterator; +@@ -3548,7 +3552,7 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, + do { + u64 new_spte; + +- for_each_shadow_entry_lockless(vcpu, gva, iterator, spte) ++ for_each_shadow_entry_lockless(vcpu, cr2_or_gpa, iterator, spte) + if (!is_shadow_present_pte(spte) || + iterator.level < level) + break; +@@ -3626,7 +3630,7 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, + + } while (true); + +- trace_fast_page_fault(vcpu, gva, error_code, iterator.sptep, ++ trace_fast_page_fault(vcpu, cr2_or_gpa, error_code, iterator.sptep, + spte, fault_handled); + walk_shadow_page_lockless_end(vcpu); + +@@ -3634,10 +3638,11 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, + } + + static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, +- gva_t gva, kvm_pfn_t *pfn, bool write, bool *writable); ++ gpa_t cr2_or_gpa, kvm_pfn_t *pfn, bool write, ++ bool *writable); + static int make_mmu_pages_available(struct kvm_vcpu *vcpu); + +-static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, ++static int nonpaging_map(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, + gfn_t gfn, bool prefault) + { + int r; +@@ -3663,16 +3668,16 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, + gfn &= ~(KVM_PAGES_PER_HPAGE(level) - 1); + } + +- if (fast_page_fault(vcpu, v, level, error_code)) ++ if (fast_page_fault(vcpu, gpa, level, error_code)) + return RET_PF_RETRY; + + mmu_seq = vcpu->kvm->mmu_notifier_seq; + smp_rmb(); + +- if (try_async_pf(vcpu, prefault, gfn, v, &pfn, write, &map_writable)) ++ if (try_async_pf(vcpu, prefault, gfn, gpa, &pfn, write, &map_writable)) + return RET_PF_RETRY; + +- if (handle_abnormal_pfn(vcpu, v, gfn, pfn, ACC_ALL, &r)) ++ if (handle_abnormal_pfn(vcpu, gpa, gfn, pfn, ACC_ALL, &r)) + return r; + + r = RET_PF_RETRY; +@@ -3683,7 +3688,7 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, + goto out_unlock; + if (likely(!force_pt_level)) + transparent_hugepage_adjust(vcpu, gfn, &pfn, &level); +- r = __direct_map(vcpu, v, write, map_writable, level, pfn, ++ r = __direct_map(vcpu, gpa, write, map_writable, level, pfn, + prefault, false); + out_unlock: + spin_unlock(&vcpu->kvm->mmu_lock); +@@ -3981,7 +3986,7 @@ void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu) + } + EXPORT_SYMBOL_GPL(kvm_mmu_sync_roots); + +-static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gva_t vaddr, ++static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gpa_t vaddr, + u32 access, struct x86_exception *exception) + { + if (exception) +@@ -3989,7 +3994,7 @@ static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gva_t vaddr, + return vaddr; + } + +-static gpa_t nonpaging_gva_to_gpa_nested(struct kvm_vcpu *vcpu, gva_t vaddr, ++static gpa_t nonpaging_gva_to_gpa_nested(struct kvm_vcpu *vcpu, gpa_t vaddr, + u32 access, + struct x86_exception *exception) + { +@@ -4149,13 +4154,14 @@ static void shadow_page_table_clear_flood(struct kvm_vcpu *vcpu, gva_t addr) + walk_shadow_page_lockless_end(vcpu); + } + +-static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, ++static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, + u32 error_code, bool prefault) + { +- gfn_t gfn = gva >> PAGE_SHIFT; ++ gfn_t gfn = gpa >> PAGE_SHIFT; + int r; + +- pgprintk("%s: gva %lx error %x\n", __func__, gva, error_code); ++ /* Note, paging is disabled, ergo gva == gpa. */ ++ pgprintk("%s: gva %lx error %x\n", __func__, gpa, error_code); + + if (page_fault_handle_page_track(vcpu, error_code, gfn)) + return RET_PF_EMULATE; +@@ -4167,11 +4173,12 @@ static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, + MMU_WARN_ON(!VALID_PAGE(vcpu->arch.mmu->root_hpa)); + + +- return nonpaging_map(vcpu, gva & PAGE_MASK, ++ return nonpaging_map(vcpu, gpa & PAGE_MASK, + error_code, gfn, prefault); + } + +-static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn) ++static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, ++ gfn_t gfn) + { + struct kvm_arch_async_pf arch; + +@@ -4180,11 +4187,13 @@ static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn) + arch.direct_map = vcpu->arch.mmu->direct_map; + arch.cr3 = vcpu->arch.mmu->get_cr3(vcpu); + +- return kvm_setup_async_pf(vcpu, gva, kvm_vcpu_gfn_to_hva(vcpu, gfn), &arch); ++ return kvm_setup_async_pf(vcpu, cr2_or_gpa, ++ kvm_vcpu_gfn_to_hva(vcpu, gfn), &arch); + } + + static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, +- gva_t gva, kvm_pfn_t *pfn, bool write, bool *writable) ++ gpa_t cr2_or_gpa, kvm_pfn_t *pfn, bool write, ++ bool *writable) + { + struct kvm_memory_slot *slot; + bool async; +@@ -4204,12 +4213,12 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, + return false; /* *pfn has correct page already */ + + if (!prefault && kvm_can_do_async_pf(vcpu)) { +- trace_kvm_try_async_get_page(gva, gfn); ++ trace_kvm_try_async_get_page(cr2_or_gpa, gfn); + if (kvm_find_async_pf_gfn(vcpu, gfn)) { +- trace_kvm_async_pf_doublefault(gva, gfn); ++ trace_kvm_async_pf_doublefault(cr2_or_gpa, gfn); + kvm_make_request(KVM_REQ_APF_HALT, vcpu); + return true; +- } else if (kvm_arch_setup_async_pf(vcpu, gva, gfn)) ++ } else if (kvm_arch_setup_async_pf(vcpu, cr2_or_gpa, gfn)) + return true; + } + +@@ -4222,6 +4231,12 @@ int kvm_handle_page_fault(struct kvm_vcpu *vcpu, u64 error_code, + { + int r = 1; + ++#ifndef CONFIG_X86_64 ++ /* A 64-bit CR2 should be impossible on 32-bit KVM. */ ++ if (WARN_ON_ONCE(fault_address >> 32)) ++ return -EFAULT; ++#endif ++ + vcpu->arch.l1tf_flush_l1d = true; + switch (vcpu->arch.apf.host_apf_reason) { + default: +@@ -4259,7 +4274,7 @@ check_hugepage_cache_consistency(struct kvm_vcpu *vcpu, gfn_t gfn, int level) + return kvm_mtrr_check_gfn_range_consistency(vcpu, gfn, page_num); + } + +-static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, ++static int tdp_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, + bool prefault) + { + kvm_pfn_t pfn; +@@ -5516,7 +5531,7 @@ static int make_mmu_pages_available(struct kvm_vcpu *vcpu) + return 0; + } + +-int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, ++int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 error_code, + void *insn, int insn_len) + { + int r, emulation_type = 0; +@@ -5525,18 +5540,18 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, + /* With shadow page tables, fault_address contains a GVA or nGPA. */ + if (vcpu->arch.mmu->direct_map) { + vcpu->arch.gpa_available = true; +- vcpu->arch.gpa_val = cr2; ++ vcpu->arch.gpa_val = cr2_or_gpa; + } + + r = RET_PF_INVALID; + if (unlikely(error_code & PFERR_RSVD_MASK)) { +- r = handle_mmio_page_fault(vcpu, cr2, direct); ++ r = handle_mmio_page_fault(vcpu, cr2_or_gpa, direct); + if (r == RET_PF_EMULATE) + goto emulate; + } + + if (r == RET_PF_INVALID) { +- r = vcpu->arch.mmu->page_fault(vcpu, cr2, ++ r = vcpu->arch.mmu->page_fault(vcpu, cr2_or_gpa, + lower_32_bits(error_code), + false); + WARN_ON(r == RET_PF_INVALID); +@@ -5556,7 +5571,7 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, + */ + if (vcpu->arch.mmu->direct_map && + (error_code & PFERR_NESTED_GUEST_PAGE) == PFERR_NESTED_GUEST_PAGE) { +- kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(cr2)); ++ kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(cr2_or_gpa)); + return 1; + } + +@@ -5571,7 +5586,7 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, + * explicitly shadowing L1's page tables, i.e. unprotecting something + * for L1 isn't going to magically fix whatever issue cause L2 to fail. + */ +- if (!mmio_info_in_cache(vcpu, cr2, direct) && !is_guest_mode(vcpu)) ++ if (!mmio_info_in_cache(vcpu, cr2_or_gpa, direct) && !is_guest_mode(vcpu)) + emulation_type = EMULTYPE_ALLOW_RETRY; + emulate: + /* +@@ -5586,7 +5601,7 @@ emulate: + return 1; + } + +- return x86_emulate_instruction(vcpu, cr2, emulation_type, insn, ++ return x86_emulate_instruction(vcpu, cr2_or_gpa, emulation_type, insn, + insn_len); + } + EXPORT_SYMBOL_GPL(kvm_mmu_page_fault); +@@ -6249,7 +6264,7 @@ static void kvm_set_mmio_spte_mask(void) + * If reserved bit is not supported, clear the present bit to disable + * mmio page fault. + */ +- if (IS_ENABLED(CONFIG_X86_64) && shadow_phys_bits == 52) ++ if (shadow_phys_bits == 52) + mask &= ~1ull; + + kvm_mmu_set_mmio_spte_mask(mask, mask, ACC_WRITE_MASK | ACC_USER_MASK); +diff --git a/arch/x86/kvm/mmutrace.h b/arch/x86/kvm/mmutrace.h +index 7ca8831c7d1a..3c6522b84ff1 100644 +--- a/arch/x86/kvm/mmutrace.h ++++ b/arch/x86/kvm/mmutrace.h +@@ -249,13 +249,13 @@ TRACE_EVENT( + + TRACE_EVENT( + fast_page_fault, +- TP_PROTO(struct kvm_vcpu *vcpu, gva_t gva, u32 error_code, ++ TP_PROTO(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 error_code, + u64 *sptep, u64 old_spte, bool retry), +- TP_ARGS(vcpu, gva, error_code, sptep, old_spte, retry), ++ TP_ARGS(vcpu, cr2_or_gpa, error_code, sptep, old_spte, retry), + + TP_STRUCT__entry( + __field(int, vcpu_id) +- __field(gva_t, gva) ++ __field(gpa_t, cr2_or_gpa) + __field(u32, error_code) + __field(u64 *, sptep) + __field(u64, old_spte) +@@ -265,7 +265,7 @@ TRACE_EVENT( + + TP_fast_assign( + __entry->vcpu_id = vcpu->vcpu_id; +- __entry->gva = gva; ++ __entry->cr2_or_gpa = cr2_or_gpa; + __entry->error_code = error_code; + __entry->sptep = sptep; + __entry->old_spte = old_spte; +@@ -273,9 +273,9 @@ TRACE_EVENT( + __entry->retry = retry; + ), + +- TP_printk("vcpu %d gva %lx error_code %s sptep %p old %#llx" ++ TP_printk("vcpu %d gva %llx error_code %s sptep %p old %#llx" + " new %llx spurious %d fixed %d", __entry->vcpu_id, +- __entry->gva, __print_flags(__entry->error_code, "|", ++ __entry->cr2_or_gpa, __print_flags(__entry->error_code, "|", + kvm_mmu_trace_pferr_flags), __entry->sptep, + __entry->old_spte, __entry->new_spte, + __spte_satisfied(old_spte), __spte_satisfied(new_spte) +diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c +index 25ce3edd1872..7f0059aa30e1 100644 +--- a/arch/x86/kvm/mtrr.c ++++ b/arch/x86/kvm/mtrr.c +@@ -192,11 +192,15 @@ static bool fixed_msr_to_seg_unit(u32 msr, int *seg, int *unit) + break; + case MSR_MTRRfix16K_80000 ... MSR_MTRRfix16K_A0000: + *seg = 1; +- *unit = msr - MSR_MTRRfix16K_80000; ++ *unit = array_index_nospec( ++ msr - MSR_MTRRfix16K_80000, ++ MSR_MTRRfix16K_A0000 - MSR_MTRRfix16K_80000 + 1); + break; + case MSR_MTRRfix4K_C0000 ... MSR_MTRRfix4K_F8000: + *seg = 2; +- *unit = msr - MSR_MTRRfix4K_C0000; ++ *unit = array_index_nospec( ++ msr - MSR_MTRRfix4K_C0000, ++ MSR_MTRRfix4K_F8000 - MSR_MTRRfix4K_C0000 + 1); + break; + default: + return false; +diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h +index 97b21e7fd013..c1d7b866a03f 100644 +--- a/arch/x86/kvm/paging_tmpl.h ++++ b/arch/x86/kvm/paging_tmpl.h +@@ -291,11 +291,11 @@ static inline unsigned FNAME(gpte_pkeys)(struct kvm_vcpu *vcpu, u64 gpte) + } + + /* +- * Fetch a guest pte for a guest virtual address ++ * Fetch a guest pte for a guest virtual address, or for an L2's GPA. + */ + static int FNAME(walk_addr_generic)(struct guest_walker *walker, + struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, +- gva_t addr, u32 access) ++ gpa_t addr, u32 access) + { + int ret; + pt_element_t pte; +@@ -496,7 +496,7 @@ error: + } + + static int FNAME(walk_addr)(struct guest_walker *walker, +- struct kvm_vcpu *vcpu, gva_t addr, u32 access) ++ struct kvm_vcpu *vcpu, gpa_t addr, u32 access) + { + return FNAME(walk_addr_generic)(walker, vcpu, vcpu->arch.mmu, addr, + access); +@@ -611,7 +611,7 @@ static void FNAME(pte_prefetch)(struct kvm_vcpu *vcpu, struct guest_walker *gw, + * If the guest tries to write a write-protected page, we need to + * emulate this operation, return 1 to indicate this case. + */ +-static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, ++static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr, + struct guest_walker *gw, + int write_fault, int hlevel, + kvm_pfn_t pfn, bool map_writable, bool prefault, +@@ -765,7 +765,7 @@ FNAME(is_self_change_mapping)(struct kvm_vcpu *vcpu, + * Returns: 1 if we need to emulate the instruction, 0 otherwise, or + * a negative value on error. + */ +-static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code, ++static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gpa_t addr, u32 error_code, + bool prefault) + { + int write_fault = error_code & PFERR_WRITE_MASK; +@@ -945,18 +945,19 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva, hpa_t root_hpa) + spin_unlock(&vcpu->kvm->mmu_lock); + } + +-static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access, ++/* Note, @addr is a GPA when gva_to_gpa() translates an L2 GPA to an L1 GPA. */ ++static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t addr, u32 access, + struct x86_exception *exception) + { + struct guest_walker walker; + gpa_t gpa = UNMAPPED_GVA; + int r; + +- r = FNAME(walk_addr)(&walker, vcpu, vaddr, access); ++ r = FNAME(walk_addr)(&walker, vcpu, addr, access); + + if (r) { + gpa = gfn_to_gpa(walker.gfn); +- gpa |= vaddr & ~PAGE_MASK; ++ gpa |= addr & ~PAGE_MASK; + } else if (exception) + *exception = walker.fault; + +@@ -964,7 +965,8 @@ static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access, + } + + #if PTTYPE != PTTYPE_EPT +-static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr, ++/* Note, gva_to_gpa_nested() is only used to translate L2 GVAs. */ ++static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gpa_t vaddr, + u32 access, + struct x86_exception *exception) + { +@@ -972,6 +974,11 @@ static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr, + gpa_t gpa = UNMAPPED_GVA; + int r; + ++#ifndef CONFIG_X86_64 ++ /* A 64-bit GVA should be impossible on 32-bit KVM. */ ++ WARN_ON_ONCE(vaddr >> 32); ++#endif ++ + r = FNAME(walk_addr_nested)(&walker, vcpu, vaddr, access); + + if (r) { +diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h +index 58265f761c3b..3fc98afd72a8 100644 +--- a/arch/x86/kvm/pmu.h ++++ b/arch/x86/kvm/pmu.h +@@ -2,6 +2,8 @@ + #ifndef __KVM_X86_PMU_H + #define __KVM_X86_PMU_H + ++#include ++ + #define vcpu_to_pmu(vcpu) (&(vcpu)->arch.pmu) + #define pmu_to_vcpu(pmu) (container_of((pmu), struct kvm_vcpu, arch.pmu)) + #define pmc_to_pmu(pmc) (&(pmc)->vcpu->arch.pmu) +@@ -86,8 +88,12 @@ static inline bool pmc_is_enabled(struct kvm_pmc *pmc) + static inline struct kvm_pmc *get_gp_pmc(struct kvm_pmu *pmu, u32 msr, + u32 base) + { +- if (msr >= base && msr < base + pmu->nr_arch_gp_counters) +- return &pmu->gp_counters[msr - base]; ++ if (msr >= base && msr < base + pmu->nr_arch_gp_counters) { ++ u32 index = array_index_nospec(msr - base, ++ pmu->nr_arch_gp_counters); ++ ++ return &pmu->gp_counters[index]; ++ } + + return NULL; + } +@@ -97,8 +103,12 @@ static inline struct kvm_pmc *get_fixed_pmc(struct kvm_pmu *pmu, u32 msr) + { + int base = MSR_CORE_PERF_FIXED_CTR0; + +- if (msr >= base && msr < base + pmu->nr_arch_fixed_counters) +- return &pmu->fixed_counters[msr - base]; ++ if (msr >= base && msr < base + pmu->nr_arch_fixed_counters) { ++ u32 index = array_index_nospec(msr - base, ++ pmu->nr_arch_fixed_counters); ++ ++ return &pmu->fixed_counters[index]; ++ } + + return NULL; + } +diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c +index c5673bda4b66..8d1be7c61f10 100644 +--- a/arch/x86/kvm/svm.c ++++ b/arch/x86/kvm/svm.c +@@ -5986,6 +5986,11 @@ static bool svm_has_wbinvd_exit(void) + return true; + } + ++static bool svm_pku_supported(void) ++{ ++ return false; ++} ++ + #define PRE_EX(exit) { .exit_code = (exit), \ + .stage = X86_ICPT_PRE_EXCEPT, } + #define POST_EX(exit) { .exit_code = (exit), \ +@@ -7278,6 +7283,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = { + .xsaves_supported = svm_xsaves_supported, + .umip_emulated = svm_umip_emulated, + .pt_supported = svm_pt_supported, ++ .pku_supported = svm_pku_supported, + + .set_supported_cpuid = svm_set_supported_cpuid, + +diff --git a/arch/x86/kvm/vmx/capabilities.h b/arch/x86/kvm/vmx/capabilities.h +index 7aa69716d516..283bdb7071af 100644 +--- a/arch/x86/kvm/vmx/capabilities.h ++++ b/arch/x86/kvm/vmx/capabilities.h +@@ -145,6 +145,11 @@ static inline bool vmx_umip_emulated(void) + SECONDARY_EXEC_DESC; + } + ++static inline bool vmx_pku_supported(void) ++{ ++ return boot_cpu_has(X86_FEATURE_PKU); ++} ++ + static inline bool cpu_has_vmx_rdtscp(void) + { + return vmcs_config.cpu_based_2nd_exec_ctrl & +diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c +index d0523741fb03..931d3b5f3acd 100644 +--- a/arch/x86/kvm/vmx/nested.c ++++ b/arch/x86/kvm/vmx/nested.c +@@ -4663,8 +4663,10 @@ static int handle_vmread(struct kvm_vcpu *vcpu) + vmx_instruction_info, true, len, &gva)) + return 1; + /* _system ok, nested_vmx_check_permission has verified cpl=0 */ +- if (kvm_write_guest_virt_system(vcpu, gva, &field_value, len, &e)) ++ if (kvm_write_guest_virt_system(vcpu, gva, &field_value, len, &e)) { + kvm_inject_page_fault(vcpu, &e); ++ return 1; ++ } + } + + return nested_vmx_succeed(vcpu); +diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c +index 3e9c059099e9..f8998a7bc7d5 100644 +--- a/arch/x86/kvm/vmx/pmu_intel.c ++++ b/arch/x86/kvm/vmx/pmu_intel.c +@@ -84,10 +84,14 @@ static unsigned intel_find_arch_event(struct kvm_pmu *pmu, + + static unsigned intel_find_fixed_event(int idx) + { +- if (idx >= ARRAY_SIZE(fixed_pmc_events)) ++ u32 event; ++ size_t size = ARRAY_SIZE(fixed_pmc_events); ++ ++ if (idx >= size) + return PERF_COUNT_HW_MAX; + +- return intel_arch_events[fixed_pmc_events[idx]].event_type; ++ event = fixed_pmc_events[array_index_nospec(idx, size)]; ++ return intel_arch_events[event].event_type; + } + + /* check if a PMC is enabled by comparing it with globl_ctrl bits. */ +@@ -128,16 +132,20 @@ static struct kvm_pmc *intel_msr_idx_to_pmc(struct kvm_vcpu *vcpu, + struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); + bool fixed = idx & (1u << 30); + struct kvm_pmc *counters; ++ unsigned int num_counters; + + idx &= ~(3u << 30); +- if (!fixed && idx >= pmu->nr_arch_gp_counters) +- return NULL; +- if (fixed && idx >= pmu->nr_arch_fixed_counters) ++ if (fixed) { ++ counters = pmu->fixed_counters; ++ num_counters = pmu->nr_arch_fixed_counters; ++ } else { ++ counters = pmu->gp_counters; ++ num_counters = pmu->nr_arch_gp_counters; ++ } ++ if (idx >= num_counters) + return NULL; +- counters = fixed ? pmu->fixed_counters : pmu->gp_counters; + *mask &= pmu->counter_bitmask[fixed ? KVM_PMC_FIXED : KVM_PMC_GP]; +- +- return &counters[idx]; ++ return &counters[array_index_nospec(idx, num_counters)]; + } + + static bool intel_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr) +diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c +index f09a213fd5cb..dc7c166c4335 100644 +--- a/arch/x86/kvm/vmx/vmx.c ++++ b/arch/x86/kvm/vmx/vmx.c +@@ -2140,6 +2140,8 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + (index >= 2 * intel_pt_validate_cap(vmx->pt_desc.caps, + PT_CAP_num_address_ranges))) + return 1; ++ if (is_noncanonical_address(data, vcpu)) ++ return 1; + if (index % 2) + vmx->pt_desc.guest.addr_b[index / 2] = data; + else +@@ -7865,6 +7867,7 @@ static struct kvm_x86_ops vmx_x86_ops __ro_after_init = { + .xsaves_supported = vmx_xsaves_supported, + .umip_emulated = vmx_umip_emulated, + .pt_supported = vmx_pt_supported, ++ .pku_supported = vmx_pku_supported, + + .request_immediate_exit = vmx_request_immediate_exit, + +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index 8d82ec0482fc..edde5ee8c6f5 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -92,6 +92,8 @@ u64 __read_mostly efer_reserved_bits = ~((u64)(EFER_SCE | EFER_LME | EFER_LMA)); + static u64 __read_mostly efer_reserved_bits = ~((u64)EFER_SCE); + #endif + ++static u64 __read_mostly cr4_reserved_bits = CR4_RESERVED_BITS; ++ + #define VM_STAT(x, ...) offsetof(struct kvm, stat.x), KVM_STAT_VM, ## __VA_ARGS__ + #define VCPU_STAT(x, ...) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU, ## __VA_ARGS__ + +@@ -886,9 +888,38 @@ int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) + } + EXPORT_SYMBOL_GPL(kvm_set_xcr); + ++static u64 kvm_host_cr4_reserved_bits(struct cpuinfo_x86 *c) ++{ ++ u64 reserved_bits = CR4_RESERVED_BITS; ++ ++ if (!cpu_has(c, X86_FEATURE_XSAVE)) ++ reserved_bits |= X86_CR4_OSXSAVE; ++ ++ if (!cpu_has(c, X86_FEATURE_SMEP)) ++ reserved_bits |= X86_CR4_SMEP; ++ ++ if (!cpu_has(c, X86_FEATURE_SMAP)) ++ reserved_bits |= X86_CR4_SMAP; ++ ++ if (!cpu_has(c, X86_FEATURE_FSGSBASE)) ++ reserved_bits |= X86_CR4_FSGSBASE; ++ ++ if (!cpu_has(c, X86_FEATURE_PKU)) ++ reserved_bits |= X86_CR4_PKE; ++ ++ if (!cpu_has(c, X86_FEATURE_LA57) && ++ !(cpuid_ecx(0x7) & bit(X86_FEATURE_LA57))) ++ reserved_bits |= X86_CR4_LA57; ++ ++ if (!cpu_has(c, X86_FEATURE_UMIP) && !kvm_x86_ops->umip_emulated()) ++ reserved_bits |= X86_CR4_UMIP; ++ ++ return reserved_bits; ++} ++ + static int kvm_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) + { +- if (cr4 & CR4_RESERVED_BITS) ++ if (cr4 & cr4_reserved_bits) + return -EINVAL; + + if (!guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && (cr4 & X86_CR4_OSXSAVE)) +@@ -1054,9 +1085,11 @@ static u64 kvm_dr6_fixed(struct kvm_vcpu *vcpu) + + static int __kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val) + { ++ size_t size = ARRAY_SIZE(vcpu->arch.db); ++ + switch (dr) { + case 0 ... 3: +- vcpu->arch.db[dr] = val; ++ vcpu->arch.db[array_index_nospec(dr, size)] = val; + if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)) + vcpu->arch.eff_db[dr] = val; + break; +@@ -1093,9 +1126,11 @@ EXPORT_SYMBOL_GPL(kvm_set_dr); + + int kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val) + { ++ size_t size = ARRAY_SIZE(vcpu->arch.db); ++ + switch (dr) { + case 0 ... 3: +- *val = vcpu->arch.db[dr]; ++ *val = vcpu->arch.db[array_index_nospec(dr, size)]; + break; + case 4: + /* fall through */ +@@ -2490,7 +2525,10 @@ static int set_msr_mce(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + default: + if (msr >= MSR_IA32_MC0_CTL && + msr < MSR_IA32_MCx_CTL(bank_num)) { +- u32 offset = msr - MSR_IA32_MC0_CTL; ++ u32 offset = array_index_nospec( ++ msr - MSR_IA32_MC0_CTL, ++ MSR_IA32_MCx_CTL(bank_num) - MSR_IA32_MC0_CTL); ++ + /* only 0 or all 1s can be written to IA32_MCi_CTL + * some Linux kernels though clear bit 10 in bank 4 to + * workaround a BIOS/GART TBL issue on AMD K8s, ignore +@@ -2586,45 +2624,47 @@ static void kvm_vcpu_flush_tlb(struct kvm_vcpu *vcpu, bool invalidate_gpa) + + static void record_steal_time(struct kvm_vcpu *vcpu) + { ++ struct kvm_host_map map; ++ struct kvm_steal_time *st; ++ + if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) + return; + +- if (unlikely(kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal, sizeof(struct kvm_steal_time)))) ++ /* -EAGAIN is returned in atomic context so we can just return. */ ++ if (kvm_map_gfn(vcpu, vcpu->arch.st.msr_val >> PAGE_SHIFT, ++ &map, &vcpu->arch.st.cache, false)) + return; + ++ st = map.hva + ++ offset_in_page(vcpu->arch.st.msr_val & KVM_STEAL_VALID_BITS); ++ + /* + * Doing a TLB flush here, on the guest's behalf, can avoid + * expensive IPIs. + */ + trace_kvm_pv_tlb_flush(vcpu->vcpu_id, +- vcpu->arch.st.steal.preempted & KVM_VCPU_FLUSH_TLB); +- if (xchg(&vcpu->arch.st.steal.preempted, 0) & KVM_VCPU_FLUSH_TLB) ++ st->preempted & KVM_VCPU_FLUSH_TLB); ++ if (xchg(&st->preempted, 0) & KVM_VCPU_FLUSH_TLB) + kvm_vcpu_flush_tlb(vcpu, false); + +- if (vcpu->arch.st.steal.version & 1) +- vcpu->arch.st.steal.version += 1; /* first time write, random junk */ ++ vcpu->arch.st.preempted = 0; + +- vcpu->arch.st.steal.version += 1; ++ if (st->version & 1) ++ st->version += 1; /* first time write, random junk */ + +- kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal, sizeof(struct kvm_steal_time)); ++ st->version += 1; + + smp_wmb(); + +- vcpu->arch.st.steal.steal += current->sched_info.run_delay - ++ st->steal += current->sched_info.run_delay - + vcpu->arch.st.last_steal; + vcpu->arch.st.last_steal = current->sched_info.run_delay; + +- kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal, sizeof(struct kvm_steal_time)); +- + smp_wmb(); + +- vcpu->arch.st.steal.version += 1; ++ st->version += 1; + +- kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal, sizeof(struct kvm_steal_time)); ++ kvm_unmap_gfn(vcpu, &map, &vcpu->arch.st.cache, true, false); + } + + int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) +@@ -2777,11 +2817,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + if (data & KVM_STEAL_RESERVED_MASK) + return 1; + +- if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.st.stime, +- data & KVM_STEAL_VALID_BITS, +- sizeof(struct kvm_steal_time))) +- return 1; +- + vcpu->arch.st.msr_val = data; + + if (!(data & KVM_MSR_ENABLED)) +@@ -2917,7 +2952,10 @@ static int get_msr_mce(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, bool host) + default: + if (msr >= MSR_IA32_MC0_CTL && + msr < MSR_IA32_MCx_CTL(bank_num)) { +- u32 offset = msr - MSR_IA32_MC0_CTL; ++ u32 offset = array_index_nospec( ++ msr - MSR_IA32_MC0_CTL, ++ MSR_IA32_MCx_CTL(bank_num) - MSR_IA32_MC0_CTL); ++ + data = vcpu->arch.mce_banks[offset]; + break; + } +@@ -3443,10 +3481,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) + + kvm_x86_ops->vcpu_load(vcpu, cpu); + +- fpregs_assert_state_consistent(); +- if (test_thread_flag(TIF_NEED_FPU_LOAD)) +- switch_fpu_return(); +- + /* Apply any externally detected TSC adjustments (due to suspend) */ + if (unlikely(vcpu->arch.tsc_offset_adjustment)) { + adjust_tsc_offset_host(vcpu, vcpu->arch.tsc_offset_adjustment); +@@ -3486,15 +3520,25 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) + + static void kvm_steal_time_set_preempted(struct kvm_vcpu *vcpu) + { ++ struct kvm_host_map map; ++ struct kvm_steal_time *st; ++ + if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) + return; + +- vcpu->arch.st.steal.preempted = KVM_VCPU_PREEMPTED; ++ if (vcpu->arch.st.preempted) ++ return; ++ ++ if (kvm_map_gfn(vcpu, vcpu->arch.st.msr_val >> PAGE_SHIFT, &map, ++ &vcpu->arch.st.cache, true)) ++ return; + +- kvm_write_guest_offset_cached(vcpu->kvm, &vcpu->arch.st.stime, +- &vcpu->arch.st.steal.preempted, +- offsetof(struct kvm_steal_time, preempted), +- sizeof(vcpu->arch.st.steal.preempted)); ++ st = map.hva + ++ offset_in_page(vcpu->arch.st.msr_val & KVM_STEAL_VALID_BITS); ++ ++ st->preempted = vcpu->arch.st.preempted = KVM_VCPU_PREEMPTED; ++ ++ kvm_unmap_gfn(vcpu, &map, &vcpu->arch.st.cache, true, true); + } + + void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) +@@ -6365,11 +6409,11 @@ static int handle_emulation_failure(struct kvm_vcpu *vcpu, int emulation_type) + return 1; + } + +-static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2, ++static bool reexecute_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, + bool write_fault_to_shadow_pgtable, + int emulation_type) + { +- gpa_t gpa = cr2; ++ gpa_t gpa = cr2_or_gpa; + kvm_pfn_t pfn; + + if (!(emulation_type & EMULTYPE_ALLOW_RETRY)) +@@ -6383,7 +6427,7 @@ static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2, + * Write permission should be allowed since only + * write access need to be emulated. + */ +- gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2, NULL); ++ gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2_or_gpa, NULL); + + /* + * If the mapping is invalid in guest, let cpu retry +@@ -6440,10 +6484,10 @@ static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2, + } + + static bool retry_instruction(struct x86_emulate_ctxt *ctxt, +- unsigned long cr2, int emulation_type) ++ gpa_t cr2_or_gpa, int emulation_type) + { + struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt); +- unsigned long last_retry_eip, last_retry_addr, gpa = cr2; ++ unsigned long last_retry_eip, last_retry_addr, gpa = cr2_or_gpa; + + last_retry_eip = vcpu->arch.last_retry_eip; + last_retry_addr = vcpu->arch.last_retry_addr; +@@ -6472,14 +6516,14 @@ static bool retry_instruction(struct x86_emulate_ctxt *ctxt, + if (x86_page_table_writing_insn(ctxt)) + return false; + +- if (ctxt->eip == last_retry_eip && last_retry_addr == cr2) ++ if (ctxt->eip == last_retry_eip && last_retry_addr == cr2_or_gpa) + return false; + + vcpu->arch.last_retry_eip = ctxt->eip; +- vcpu->arch.last_retry_addr = cr2; ++ vcpu->arch.last_retry_addr = cr2_or_gpa; + + if (!vcpu->arch.mmu->direct_map) +- gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2, NULL); ++ gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2_or_gpa, NULL); + + kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(gpa)); + +@@ -6625,11 +6669,8 @@ static bool is_vmware_backdoor_opcode(struct x86_emulate_ctxt *ctxt) + return false; + } + +-int x86_emulate_instruction(struct kvm_vcpu *vcpu, +- unsigned long cr2, +- int emulation_type, +- void *insn, +- int insn_len) ++int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, ++ int emulation_type, void *insn, int insn_len) + { + int r; + struct x86_emulate_ctxt *ctxt = &vcpu->arch.emulate_ctxt; +@@ -6675,8 +6716,9 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, + kvm_queue_exception(vcpu, UD_VECTOR); + return 1; + } +- if (reexecute_instruction(vcpu, cr2, write_fault_to_spt, +- emulation_type)) ++ if (reexecute_instruction(vcpu, cr2_or_gpa, ++ write_fault_to_spt, ++ emulation_type)) + return 1; + if (ctxt->have_exception) { + /* +@@ -6710,7 +6752,7 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, + return 1; + } + +- if (retry_instruction(ctxt, cr2, emulation_type)) ++ if (retry_instruction(ctxt, cr2_or_gpa, emulation_type)) + return 1; + + /* this is needed for vmware backdoor interface to work since it +@@ -6722,7 +6764,7 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, + + restart: + /* Save the faulting GPA (cr2) in the address field */ +- ctxt->exception.address = cr2; ++ ctxt->exception.address = cr2_or_gpa; + + r = x86_emulate_insn(ctxt); + +@@ -6730,7 +6772,7 @@ restart: + return 1; + + if (r == EMULATION_FAILED) { +- if (reexecute_instruction(vcpu, cr2, write_fault_to_spt, ++ if (reexecute_instruction(vcpu, cr2_or_gpa, write_fault_to_spt, + emulation_type)) + return 1; + +@@ -8172,8 +8214,9 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) + trace_kvm_entry(vcpu->vcpu_id); + guest_enter_irqoff(); + +- /* The preempt notifier should have taken care of the FPU already. */ +- WARN_ON_ONCE(test_thread_flag(TIF_NEED_FPU_LOAD)); ++ fpregs_assert_state_consistent(); ++ if (test_thread_flag(TIF_NEED_FPU_LOAD)) ++ switch_fpu_return(); + + if (unlikely(vcpu->arch.switch_db_regs)) { + set_debugreg(0, 7); +@@ -8445,12 +8488,26 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu) + return 0; + } + ++static void kvm_save_current_fpu(struct fpu *fpu) ++{ ++ /* ++ * If the target FPU state is not resident in the CPU registers, just ++ * memcpy() from current, else save CPU state directly to the target. ++ */ ++ if (test_thread_flag(TIF_NEED_FPU_LOAD)) ++ memcpy(&fpu->state, ¤t->thread.fpu.state, ++ fpu_kernel_xstate_size); ++ else ++ copy_fpregs_to_fpstate(fpu); ++} ++ + /* Swap (qemu) user FPU context for the guest FPU context. */ + static void kvm_load_guest_fpu(struct kvm_vcpu *vcpu) + { + fpregs_lock(); + +- copy_fpregs_to_fpstate(vcpu->arch.user_fpu); ++ kvm_save_current_fpu(vcpu->arch.user_fpu); ++ + /* PKRU is separately restored in kvm_x86_ops->run. */ + __copy_kernel_to_fpregs(&vcpu->arch.guest_fpu->state, + ~XFEATURE_MASK_PKRU); +@@ -8466,7 +8523,8 @@ static void kvm_put_guest_fpu(struct kvm_vcpu *vcpu) + { + fpregs_lock(); + +- copy_fpregs_to_fpstate(vcpu->arch.guest_fpu); ++ kvm_save_current_fpu(vcpu->arch.guest_fpu); ++ + copy_kernel_to_fpregs(&vcpu->arch.user_fpu->state); + + fpregs_mark_activate(); +@@ -8688,6 +8746,8 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, + struct kvm_mp_state *mp_state) + { + vcpu_load(vcpu); ++ if (kvm_mpx_supported()) ++ kvm_load_guest_fpu(vcpu); + + kvm_apic_accept_events(vcpu); + if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED && +@@ -8696,6 +8756,8 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, + else + mp_state->mp_state = vcpu->arch.mp_state; + ++ if (kvm_mpx_supported()) ++ kvm_put_guest_fpu(vcpu); + vcpu_put(vcpu); + return 0; + } +@@ -9055,6 +9117,9 @@ static void fx_init(struct kvm_vcpu *vcpu) + void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu) + { + void *wbinvd_dirty_mask = vcpu->arch.wbinvd_dirty_mask; ++ struct gfn_to_pfn_cache *cache = &vcpu->arch.st.cache; ++ ++ kvm_release_pfn(cache->pfn, cache->dirty, cache); + + kvmclock_reset(vcpu); + +@@ -9125,7 +9190,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) + kvm_mmu_unload(vcpu); + vcpu_put(vcpu); + +- kvm_x86_ops->vcpu_free(vcpu); ++ kvm_arch_vcpu_free(vcpu); + } + + void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) +@@ -9317,6 +9382,8 @@ int kvm_arch_hardware_setup(void) + if (r != 0) + return r; + ++ cr4_reserved_bits = kvm_host_cr4_reserved_bits(&boot_cpu_data); ++ + if (kvm_has_tsc_control) { + /* + * Make sure the user can only configure tsc_khz values that +@@ -9719,11 +9786,18 @@ out_free: + + void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) + { ++ struct kvm_vcpu *vcpu; ++ int i; ++ + /* + * memslots->generation has been incremented. + * mmio generation may have reached its maximum value. + */ + kvm_mmu_invalidate_mmio_sptes(kvm, gen); ++ ++ /* Force re-initialization of steal_time cache */ ++ kvm_for_each_vcpu(i, vcpu, kvm) ++ kvm_vcpu_kick(vcpu); + } + + int kvm_arch_prepare_memory_region(struct kvm *kvm, +@@ -9975,7 +10049,7 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work) + work->arch.cr3 != vcpu->arch.mmu->get_cr3(vcpu)) + return; + +- vcpu->arch.mmu->page_fault(vcpu, work->gva, 0, true); ++ vcpu->arch.mmu->page_fault(vcpu, work->cr2_or_gpa, 0, true); + } + + static inline u32 kvm_async_pf_hash_fn(gfn_t gfn) +@@ -10088,7 +10162,7 @@ void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu, + { + struct x86_exception fault; + +- trace_kvm_async_pf_not_present(work->arch.token, work->gva); ++ trace_kvm_async_pf_not_present(work->arch.token, work->cr2_or_gpa); + kvm_add_async_pf_gfn(vcpu, work->arch.gfn); + + if (kvm_can_deliver_async_pf(vcpu) && +@@ -10123,7 +10197,7 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu, + work->arch.token = ~0; /* broadcast wakeup */ + else + kvm_del_async_pf_gfn(vcpu, work->arch.gfn); +- trace_kvm_async_pf_ready(work->arch.token, work->gva); ++ trace_kvm_async_pf_ready(work->arch.token, work->cr2_or_gpa); + + if (vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED && + !apf_get_user(vcpu, &val)) { +diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h +index dbf7442a822b..de6b55484876 100644 +--- a/arch/x86/kvm/x86.h ++++ b/arch/x86/kvm/x86.h +@@ -286,7 +286,7 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata); + bool kvm_mtrr_check_gfn_range_consistency(struct kvm_vcpu *vcpu, gfn_t gfn, + int page_num); + bool kvm_vector_hashing_enabled(void); +-int x86_emulate_instruction(struct kvm_vcpu *vcpu, unsigned long cr2, ++int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, + int emulation_type, void *insn, int insn_len); + + #define KVM_SUPPORTED_XCR0 (XFEATURE_MASK_FP | XFEATURE_MASK_SSE \ +diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c +index 5bfea374a160..6ea215cdeada 100644 +--- a/arch/x86/xen/enlighten_pv.c ++++ b/arch/x86/xen/enlighten_pv.c +@@ -1215,6 +1215,7 @@ asmlinkage __visible void __init xen_start_kernel(void) + x86_platform.get_nmi_reason = xen_get_nmi_reason; + + x86_init.resources.memory_setup = xen_memory_setup; ++ x86_init.irqs.intr_mode_select = x86_init_noop; + x86_init.irqs.intr_mode_init = x86_init_noop; + x86_init.oem.arch_setup = xen_arch_setup; + x86_init.oem.banner = xen_banner; +diff --git a/crypto/algapi.c b/crypto/algapi.c +index de30ddc952d8..bb8329e49956 100644 +--- a/crypto/algapi.c ++++ b/crypto/algapi.c +@@ -257,6 +257,7 @@ void crypto_alg_tested(const char *name, int err) + struct crypto_alg *alg; + struct crypto_alg *q; + LIST_HEAD(list); ++ bool best; + + down_write(&crypto_alg_sem); + list_for_each_entry(q, &crypto_alg_list, cra_list) { +@@ -280,6 +281,21 @@ found: + + alg->cra_flags |= CRYPTO_ALG_TESTED; + ++ /* Only satisfy larval waiters if we are the best. */ ++ best = true; ++ list_for_each_entry(q, &crypto_alg_list, cra_list) { ++ if (crypto_is_moribund(q) || !crypto_is_larval(q)) ++ continue; ++ ++ if (strcmp(alg->cra_name, q->cra_name)) ++ continue; ++ ++ if (q->cra_priority > alg->cra_priority) { ++ best = false; ++ break; ++ } ++ } ++ + list_for_each_entry(q, &crypto_alg_list, cra_list) { + if (q == alg) + continue; +@@ -303,10 +319,12 @@ found: + continue; + if ((q->cra_flags ^ alg->cra_flags) & larval->mask) + continue; +- if (!crypto_mod_get(alg)) +- continue; + +- larval->adult = alg; ++ if (best && crypto_mod_get(alg)) ++ larval->adult = alg; ++ else ++ larval->adult = ERR_PTR(-EAGAIN); ++ + continue; + } + +@@ -669,11 +687,9 @@ EXPORT_SYMBOL_GPL(crypto_grab_spawn); + + void crypto_drop_spawn(struct crypto_spawn *spawn) + { +- if (!spawn->alg) +- return; +- + down_write(&crypto_alg_sem); +- list_del(&spawn->list); ++ if (spawn->alg) ++ list_del(&spawn->list); + up_write(&crypto_alg_sem); + } + EXPORT_SYMBOL_GPL(crypto_drop_spawn); +@@ -681,22 +697,16 @@ EXPORT_SYMBOL_GPL(crypto_drop_spawn); + static struct crypto_alg *crypto_spawn_alg(struct crypto_spawn *spawn) + { + struct crypto_alg *alg; +- struct crypto_alg *alg2; + + down_read(&crypto_alg_sem); + alg = spawn->alg; +- alg2 = alg; +- if (alg2) +- alg2 = crypto_mod_get(alg2); +- up_read(&crypto_alg_sem); +- +- if (!alg2) { +- if (alg) +- crypto_shoot_alg(alg); +- return ERR_PTR(-EAGAIN); ++ if (alg && !crypto_mod_get(alg)) { ++ alg->cra_flags |= CRYPTO_ALG_DYING; ++ alg = NULL; + } ++ up_read(&crypto_alg_sem); + +- return alg; ++ return alg ?: ERR_PTR(-EAGAIN); + } + + struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type, +diff --git a/crypto/api.c b/crypto/api.c +index d8ba54142620..eda0c56b8615 100644 +--- a/crypto/api.c ++++ b/crypto/api.c +@@ -97,7 +97,7 @@ static void crypto_larval_destroy(struct crypto_alg *alg) + struct crypto_larval *larval = (void *)alg; + + BUG_ON(!crypto_is_larval(alg)); +- if (larval->adult) ++ if (!IS_ERR_OR_NULL(larval->adult)) + crypto_mod_put(larval->adult); + kfree(larval); + } +@@ -178,6 +178,8 @@ static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg) + alg = ERR_PTR(-ETIMEDOUT); + else if (!alg) + alg = ERR_PTR(-ENOENT); ++ else if (IS_ERR(alg)) ++ ; + else if (crypto_is_test_larval(larval) && + !(alg->cra_flags & CRYPTO_ALG_TESTED)) + alg = ERR_PTR(-EAGAIN); +@@ -344,13 +346,12 @@ static unsigned int crypto_ctxsize(struct crypto_alg *alg, u32 type, u32 mask) + return len; + } + +-void crypto_shoot_alg(struct crypto_alg *alg) ++static void crypto_shoot_alg(struct crypto_alg *alg) + { + down_write(&crypto_alg_sem); + alg->cra_flags |= CRYPTO_ALG_DYING; + up_write(&crypto_alg_sem); + } +-EXPORT_SYMBOL_GPL(crypto_shoot_alg); + + struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, + u32 mask) +diff --git a/crypto/internal.h b/crypto/internal.h +index 93df7bec844a..e506a57e2243 100644 +--- a/crypto/internal.h ++++ b/crypto/internal.h +@@ -68,7 +68,6 @@ void crypto_alg_tested(const char *name, int err); + void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list, + struct crypto_alg *nalg); + void crypto_remove_final(struct list_head *list); +-void crypto_shoot_alg(struct crypto_alg *alg); + struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, + u32 mask); + void *crypto_create_tfm(struct crypto_alg *alg, +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index 81bbea7f2ba6..a4f3b3f342c8 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -24,6 +24,8 @@ static struct kset *pcrypt_kset; + + struct pcrypt_instance_ctx { + struct crypto_aead_spawn spawn; ++ struct padata_shell *psenc; ++ struct padata_shell *psdec; + atomic_t tfm_count; + }; + +@@ -32,6 +34,12 @@ struct pcrypt_aead_ctx { + unsigned int cb_cpu; + }; + ++static inline struct pcrypt_instance_ctx *pcrypt_tfm_ictx( ++ struct crypto_aead *tfm) ++{ ++ return aead_instance_ctx(aead_alg_instance(tfm)); ++} ++ + static int pcrypt_aead_setkey(struct crypto_aead *parent, + const u8 *key, unsigned int keylen) + { +@@ -63,7 +71,6 @@ static void pcrypt_aead_done(struct crypto_async_request *areq, int err) + struct padata_priv *padata = pcrypt_request_padata(preq); + + padata->info = err; +- req->base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; + + padata_do_serial(padata); + } +@@ -90,6 +97,9 @@ static int pcrypt_aead_encrypt(struct aead_request *req) + struct crypto_aead *aead = crypto_aead_reqtfm(req); + struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(aead); + u32 flags = aead_request_flags(req); ++ struct pcrypt_instance_ctx *ictx; ++ ++ ictx = pcrypt_tfm_ictx(aead); + + memset(padata, 0, sizeof(struct padata_priv)); + +@@ -103,7 +113,7 @@ static int pcrypt_aead_encrypt(struct aead_request *req) + req->cryptlen, req->iv); + aead_request_set_ad(creq, req->assoclen); + +- err = padata_do_parallel(pencrypt, padata, &ctx->cb_cpu); ++ err = padata_do_parallel(ictx->psenc, padata, &ctx->cb_cpu); + if (!err) + return -EINPROGRESS; + +@@ -132,6 +142,9 @@ static int pcrypt_aead_decrypt(struct aead_request *req) + struct crypto_aead *aead = crypto_aead_reqtfm(req); + struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(aead); + u32 flags = aead_request_flags(req); ++ struct pcrypt_instance_ctx *ictx; ++ ++ ictx = pcrypt_tfm_ictx(aead); + + memset(padata, 0, sizeof(struct padata_priv)); + +@@ -145,7 +158,7 @@ static int pcrypt_aead_decrypt(struct aead_request *req) + req->cryptlen, req->iv); + aead_request_set_ad(creq, req->assoclen); + +- err = padata_do_parallel(pdecrypt, padata, &ctx->cb_cpu); ++ err = padata_do_parallel(ictx->psdec, padata, &ctx->cb_cpu); + if (!err) + return -EINPROGRESS; + +@@ -192,6 +205,8 @@ static void pcrypt_free(struct aead_instance *inst) + struct pcrypt_instance_ctx *ctx = aead_instance_ctx(inst); + + crypto_drop_aead(&ctx->spawn); ++ padata_free_shell(ctx->psdec); ++ padata_free_shell(ctx->psenc); + kfree(inst); + } + +@@ -233,12 +248,22 @@ static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb, + if (!inst) + return -ENOMEM; + ++ err = -ENOMEM; ++ + ctx = aead_instance_ctx(inst); ++ ctx->psenc = padata_alloc_shell(pencrypt); ++ if (!ctx->psenc) ++ goto out_free_inst; ++ ++ ctx->psdec = padata_alloc_shell(pdecrypt); ++ if (!ctx->psdec) ++ goto out_free_psenc; ++ + crypto_set_aead_spawn(&ctx->spawn, aead_crypto_instance(inst)); + + err = crypto_grab_aead(&ctx->spawn, name, 0, 0); + if (err) +- goto out_free_inst; ++ goto out_free_psdec; + + alg = crypto_spawn_aead_alg(&ctx->spawn); + err = pcrypt_init_instance(aead_crypto_instance(inst), &alg->base); +@@ -271,6 +296,10 @@ out: + + out_drop_aead: + crypto_drop_aead(&ctx->spawn); ++out_free_psdec: ++ padata_free_shell(ctx->psdec); ++out_free_psenc: ++ padata_free_shell(ctx->psenc); + out_free_inst: + kfree(inst); + goto out; +diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c +index 558fedf8a7a1..254a7d98b9d4 100644 +--- a/drivers/acpi/battery.c ++++ b/drivers/acpi/battery.c +@@ -38,6 +38,8 @@ + #define PREFIX "ACPI: " + + #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF ++#define ACPI_BATTERY_CAPACITY_VALID(capacity) \ ++ ((capacity) != 0 && (capacity) != ACPI_BATTERY_VALUE_UNKNOWN) + + #define ACPI_BATTERY_DEVICE_NAME "Battery" + +@@ -192,7 +194,8 @@ static int acpi_battery_is_charged(struct acpi_battery *battery) + + static bool acpi_battery_is_degraded(struct acpi_battery *battery) + { +- return battery->full_charge_capacity && battery->design_capacity && ++ return ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) && ++ ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity) && + battery->full_charge_capacity < battery->design_capacity; + } + +@@ -214,7 +217,7 @@ static int acpi_battery_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) + { +- int ret = 0; ++ int full_capacity = ACPI_BATTERY_VALUE_UNKNOWN, ret = 0; + struct acpi_battery *battery = to_acpi_battery(psy); + + if (acpi_battery_present(battery)) { +@@ -263,14 +266,14 @@ static int acpi_battery_get_property(struct power_supply *psy, + break; + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: +- if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) ++ if (!ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) + ret = -ENODEV; + else + val->intval = battery->design_capacity * 1000; + break; + case POWER_SUPPLY_PROP_CHARGE_FULL: + case POWER_SUPPLY_PROP_ENERGY_FULL: +- if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN) ++ if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity)) + ret = -ENODEV; + else + val->intval = battery->full_charge_capacity * 1000; +@@ -283,11 +286,17 @@ static int acpi_battery_get_property(struct power_supply *psy, + val->intval = battery->capacity_now * 1000; + break; + case POWER_SUPPLY_PROP_CAPACITY: +- if (battery->capacity_now && battery->full_charge_capacity) +- val->intval = battery->capacity_now * 100/ +- battery->full_charge_capacity; ++ if (ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity)) ++ full_capacity = battery->full_charge_capacity; ++ else if (ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) ++ full_capacity = battery->design_capacity; ++ ++ if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN || ++ full_capacity == ACPI_BATTERY_VALUE_UNKNOWN) ++ ret = -ENODEV; + else +- val->intval = 0; ++ val->intval = battery->capacity_now * 100/ ++ full_capacity; + break; + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + if (battery->state & ACPI_BATTERY_STATE_CRITICAL) +@@ -333,6 +342,20 @@ static enum power_supply_property charge_battery_props[] = { + POWER_SUPPLY_PROP_SERIAL_NUMBER, + }; + ++static enum power_supply_property charge_battery_full_cap_broken_props[] = { ++ POWER_SUPPLY_PROP_STATUS, ++ POWER_SUPPLY_PROP_PRESENT, ++ POWER_SUPPLY_PROP_TECHNOLOGY, ++ POWER_SUPPLY_PROP_CYCLE_COUNT, ++ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_NOW, ++ POWER_SUPPLY_PROP_CURRENT_NOW, ++ POWER_SUPPLY_PROP_CHARGE_NOW, ++ POWER_SUPPLY_PROP_MODEL_NAME, ++ POWER_SUPPLY_PROP_MANUFACTURER, ++ POWER_SUPPLY_PROP_SERIAL_NUMBER, ++}; ++ + static enum power_supply_property energy_battery_props[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_PRESENT, +@@ -794,20 +817,34 @@ static void __exit battery_hook_exit(void) + static int sysfs_add_battery(struct acpi_battery *battery) + { + struct power_supply_config psy_cfg = { .drv_data = battery, }; ++ bool full_cap_broken = false; ++ ++ if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) && ++ !ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) ++ full_cap_broken = true; + + if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) { +- battery->bat_desc.properties = charge_battery_props; +- battery->bat_desc.num_properties = +- ARRAY_SIZE(charge_battery_props); +- } else if (battery->full_charge_capacity == 0) { +- battery->bat_desc.properties = +- energy_battery_full_cap_broken_props; +- battery->bat_desc.num_properties = +- ARRAY_SIZE(energy_battery_full_cap_broken_props); ++ if (full_cap_broken) { ++ battery->bat_desc.properties = ++ charge_battery_full_cap_broken_props; ++ battery->bat_desc.num_properties = ++ ARRAY_SIZE(charge_battery_full_cap_broken_props); ++ } else { ++ battery->bat_desc.properties = charge_battery_props; ++ battery->bat_desc.num_properties = ++ ARRAY_SIZE(charge_battery_props); ++ } + } else { +- battery->bat_desc.properties = energy_battery_props; +- battery->bat_desc.num_properties = +- ARRAY_SIZE(energy_battery_props); ++ if (full_cap_broken) { ++ battery->bat_desc.properties = ++ energy_battery_full_cap_broken_props; ++ battery->bat_desc.num_properties = ++ ARRAY_SIZE(energy_battery_full_cap_broken_props); ++ } else { ++ battery->bat_desc.properties = energy_battery_props; ++ battery->bat_desc.num_properties = ++ ARRAY_SIZE(energy_battery_props); ++ } + } + + battery->bat_desc.name = acpi_device_bid(battery->device); +diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c +index 31014c7d3793..e63fd7bfd3a5 100644 +--- a/drivers/acpi/video_detect.c ++++ b/drivers/acpi/video_detect.c +@@ -336,6 +336,11 @@ static const struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"), + }, + }, ++ ++ /* ++ * Desktops which falsely report a backlight and which our heuristics ++ * for this do not catch. ++ */ + { + .callback = video_detect_force_none, + .ident = "Dell OptiPlex 9020M", +@@ -344,6 +349,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 9020M"), + }, + }, ++ { ++ .callback = video_detect_force_none, ++ .ident = "MSI MS-7721", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "MSI"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "MS-7721"), ++ }, ++ }, + { }, + }; + +diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c +index 134a8af51511..0e99a760aebd 100644 +--- a/drivers/base/power/main.c ++++ b/drivers/base/power/main.c +@@ -273,10 +273,38 @@ static void dpm_wait_for_suppliers(struct device *dev, bool async) + device_links_read_unlock(idx); + } + +-static void dpm_wait_for_superior(struct device *dev, bool async) ++static bool dpm_wait_for_superior(struct device *dev, bool async) + { +- dpm_wait(dev->parent, async); ++ struct device *parent; ++ ++ /* ++ * If the device is resumed asynchronously and the parent's callback ++ * deletes both the device and the parent itself, the parent object may ++ * be freed while this function is running, so avoid that by reference ++ * counting the parent once more unless the device has been deleted ++ * already (in which case return right away). ++ */ ++ mutex_lock(&dpm_list_mtx); ++ ++ if (!device_pm_initialized(dev)) { ++ mutex_unlock(&dpm_list_mtx); ++ return false; ++ } ++ ++ parent = get_device(dev->parent); ++ ++ mutex_unlock(&dpm_list_mtx); ++ ++ dpm_wait(parent, async); ++ put_device(parent); ++ + dpm_wait_for_suppliers(dev, async); ++ ++ /* ++ * If the parent's callback has deleted the device, attempting to resume ++ * it would be invalid, so avoid doing that then. ++ */ ++ return device_pm_initialized(dev); + } + + static void dpm_wait_for_consumers(struct device *dev, bool async) +@@ -621,7 +649,8 @@ static int device_resume_noirq(struct device *dev, pm_message_t state, bool asyn + if (!dev->power.is_noirq_suspended) + goto Out; + +- dpm_wait_for_superior(dev, async); ++ if (!dpm_wait_for_superior(dev, async)) ++ goto Out; + + skip_resume = dev_pm_may_skip_resume(dev); + +@@ -829,7 +858,8 @@ static int device_resume_early(struct device *dev, pm_message_t state, bool asyn + if (!dev->power.is_late_suspended) + goto Out; + +- dpm_wait_for_superior(dev, async); ++ if (!dpm_wait_for_superior(dev, async)) ++ goto Out; + + callback = dpm_subsys_resume_early_cb(dev, state, &info); + +@@ -944,7 +974,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) + goto Complete; + } + +- dpm_wait_for_superior(dev, async); ++ if (!dpm_wait_for_superior(dev, async)) ++ goto Complete; ++ + dpm_watchdog_set(&wd, dev); + device_lock(dev); + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 4e7ef35f1c8f..9c3b063e1a1f 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -2850,7 +2850,7 @@ static int btusb_mtk_setup_firmware(struct hci_dev *hdev, const char *fwname) + err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params); + if (err < 0) { + bt_dev_err(hdev, "Failed to send wmt rst (%d)", err); +- return err; ++ goto err_release_fw; + } + + /* Wait a few moments for firmware activation done */ +@@ -3819,6 +3819,10 @@ static int btusb_probe(struct usb_interface *intf, + * (DEVICE_REMOTE_WAKEUP) + */ + set_bit(BTUSB_WAKEUP_DISABLE, &data->flags); ++ ++ err = usb_autopm_get_interface(intf); ++ if (err < 0) ++ goto out_free_dev; + } + + if (id->driver_info & BTUSB_AMP) { +diff --git a/drivers/clk/tegra/clk-tegra-periph.c b/drivers/clk/tegra/clk-tegra-periph.c +index 1ed85f120a1b..49b9f2f85bad 100644 +--- a/drivers/clk/tegra/clk-tegra-periph.c ++++ b/drivers/clk/tegra/clk-tegra-periph.c +@@ -785,7 +785,11 @@ static struct tegra_periph_init_data gate_clks[] = { + GATE("ahbdma", "hclk", 33, 0, tegra_clk_ahbdma, 0), + GATE("apbdma", "pclk", 34, 0, tegra_clk_apbdma, 0), + GATE("kbc", "clk_32k", 36, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_kbc, 0), +- GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, 0), ++ /* ++ * Critical for RAM re-repair operation, which must occur on resume ++ * from LP1 system suspend and as part of CCPLEX cluster switching. ++ */ ++ GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, CLK_IS_CRITICAL), + GATE("fuse_burn", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse_burn, 0), + GATE("kfuse", "clk_m", 40, TEGRA_PERIPH_ON_APB, tegra_clk_kfuse, 0), + GATE("apbif", "clk_m", 107, TEGRA_PERIPH_ON_APB, tegra_clk_apbif, 0), +diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c +index 8d8da763adc5..8910fd1ae3c6 100644 +--- a/drivers/cpufreq/cppc_cpufreq.c ++++ b/drivers/cpufreq/cppc_cpufreq.c +@@ -217,7 +217,7 @@ static int cppc_cpufreq_set_target(struct cpufreq_policy *policy, + return ret; + } + +-static int cppc_verify_policy(struct cpufreq_policy *policy) ++static int cppc_verify_policy(struct cpufreq_policy_data *policy) + { + cpufreq_verify_within_cpu_limits(policy); + return 0; +diff --git a/drivers/cpufreq/cpufreq-nforce2.c b/drivers/cpufreq/cpufreq-nforce2.c +index cd53272e2fa2..f7a7bcf6f52e 100644 +--- a/drivers/cpufreq/cpufreq-nforce2.c ++++ b/drivers/cpufreq/cpufreq-nforce2.c +@@ -291,7 +291,7 @@ static int nforce2_target(struct cpufreq_policy *policy, + * nforce2_verify - verifies a new CPUFreq policy + * @policy: new policy + */ +-static int nforce2_verify(struct cpufreq_policy *policy) ++static int nforce2_verify(struct cpufreq_policy_data *policy) + { + unsigned int fsb_pol_max; + +diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c +index a7db4f22a077..7679f8a91745 100644 +--- a/drivers/cpufreq/cpufreq.c ++++ b/drivers/cpufreq/cpufreq.c +@@ -74,6 +74,9 @@ static void cpufreq_exit_governor(struct cpufreq_policy *policy); + static int cpufreq_start_governor(struct cpufreq_policy *policy); + static void cpufreq_stop_governor(struct cpufreq_policy *policy); + static void cpufreq_governor_limits(struct cpufreq_policy *policy); ++static int cpufreq_set_policy(struct cpufreq_policy *policy, ++ struct cpufreq_governor *new_gov, ++ unsigned int new_pol); + + /** + * Two notifier lists: the "policy" list is involved in the +@@ -613,25 +616,22 @@ static struct cpufreq_governor *find_governor(const char *str_governor) + return NULL; + } + +-static int cpufreq_parse_policy(char *str_governor, +- struct cpufreq_policy *policy) ++static unsigned int cpufreq_parse_policy(char *str_governor) + { +- if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN)) { +- policy->policy = CPUFREQ_POLICY_PERFORMANCE; +- return 0; +- } +- if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) { +- policy->policy = CPUFREQ_POLICY_POWERSAVE; +- return 0; +- } +- return -EINVAL; ++ if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN)) ++ return CPUFREQ_POLICY_PERFORMANCE; ++ ++ if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) ++ return CPUFREQ_POLICY_POWERSAVE; ++ ++ return CPUFREQ_POLICY_UNKNOWN; + } + + /** + * cpufreq_parse_governor - parse a governor string only for has_target() ++ * @str_governor: Governor name. + */ +-static int cpufreq_parse_governor(char *str_governor, +- struct cpufreq_policy *policy) ++static struct cpufreq_governor *cpufreq_parse_governor(char *str_governor) + { + struct cpufreq_governor *t; + +@@ -645,7 +645,7 @@ static int cpufreq_parse_governor(char *str_governor, + + ret = request_module("cpufreq_%s", str_governor); + if (ret) +- return -EINVAL; ++ return NULL; + + mutex_lock(&cpufreq_governor_mutex); + +@@ -656,12 +656,7 @@ static int cpufreq_parse_governor(char *str_governor, + + mutex_unlock(&cpufreq_governor_mutex); + +- if (t) { +- policy->governor = t; +- return 0; +- } +- +- return -EINVAL; ++ return t; + } + + /** +@@ -762,28 +757,33 @@ static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf) + static ssize_t store_scaling_governor(struct cpufreq_policy *policy, + const char *buf, size_t count) + { ++ char str_governor[16]; + int ret; +- char str_governor[16]; +- struct cpufreq_policy new_policy; +- +- memcpy(&new_policy, policy, sizeof(*policy)); + + ret = sscanf(buf, "%15s", str_governor); + if (ret != 1) + return -EINVAL; + + if (cpufreq_driver->setpolicy) { +- if (cpufreq_parse_policy(str_governor, &new_policy)) ++ unsigned int new_pol; ++ ++ new_pol = cpufreq_parse_policy(str_governor); ++ if (!new_pol) + return -EINVAL; ++ ++ ret = cpufreq_set_policy(policy, NULL, new_pol); + } else { +- if (cpufreq_parse_governor(str_governor, &new_policy)) ++ struct cpufreq_governor *new_gov; ++ ++ new_gov = cpufreq_parse_governor(str_governor); ++ if (!new_gov) + return -EINVAL; +- } + +- ret = cpufreq_set_policy(policy, &new_policy); ++ ret = cpufreq_set_policy(policy, new_gov, ++ CPUFREQ_POLICY_UNKNOWN); + +- if (new_policy.governor) +- module_put(new_policy.governor->owner); ++ module_put(new_gov->owner); ++ } + + return ret ? ret : count; + } +@@ -1050,40 +1050,33 @@ __weak struct cpufreq_governor *cpufreq_default_governor(void) + + static int cpufreq_init_policy(struct cpufreq_policy *policy) + { +- struct cpufreq_governor *gov = NULL, *def_gov = NULL; +- struct cpufreq_policy new_policy; +- +- memcpy(&new_policy, policy, sizeof(*policy)); +- +- def_gov = cpufreq_default_governor(); ++ struct cpufreq_governor *def_gov = cpufreq_default_governor(); ++ struct cpufreq_governor *gov = NULL; ++ unsigned int pol = CPUFREQ_POLICY_UNKNOWN; + + if (has_target()) { +- /* +- * Update governor of new_policy to the governor used before +- * hotplug +- */ ++ /* Update policy governor to the one used before hotplug. */ + gov = find_governor(policy->last_governor); + if (gov) { + pr_debug("Restoring governor %s for cpu %d\n", +- policy->governor->name, policy->cpu); +- } else { +- if (!def_gov) +- return -ENODATA; ++ policy->governor->name, policy->cpu); ++ } else if (def_gov) { + gov = def_gov; ++ } else { ++ return -ENODATA; + } +- new_policy.governor = gov; + } else { + /* Use the default policy if there is no last_policy. */ + if (policy->last_policy) { +- new_policy.policy = policy->last_policy; ++ pol = policy->last_policy; ++ } else if (def_gov) { ++ pol = cpufreq_parse_policy(def_gov->name); + } else { +- if (!def_gov) +- return -ENODATA; +- cpufreq_parse_policy(def_gov->name, &new_policy); ++ return -ENODATA; + } + } + +- return cpufreq_set_policy(policy, &new_policy); ++ return cpufreq_set_policy(policy, gov, pol); + } + + static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) +@@ -1111,13 +1104,10 @@ static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cp + + void refresh_frequency_limits(struct cpufreq_policy *policy) + { +- struct cpufreq_policy new_policy; +- + if (!policy_is_inactive(policy)) { +- new_policy = *policy; + pr_debug("updating policy for CPU %u\n", policy->cpu); + +- cpufreq_set_policy(policy, &new_policy); ++ cpufreq_set_policy(policy, policy->governor, policy->policy); + } + } + EXPORT_SYMBOL(refresh_frequency_limits); +@@ -2361,43 +2351,46 @@ EXPORT_SYMBOL(cpufreq_get_policy); + /** + * cpufreq_set_policy - Modify cpufreq policy parameters. + * @policy: Policy object to modify. +- * @new_policy: New policy data. ++ * @new_gov: Policy governor pointer. ++ * @new_pol: Policy value (for drivers with built-in governors). + * +- * Pass @new_policy to the cpufreq driver's ->verify() callback. Next, copy the +- * min and max parameters of @new_policy to @policy and either invoke the +- * driver's ->setpolicy() callback (if present) or carry out a governor update +- * for @policy. That is, run the current governor's ->limits() callback (if the +- * governor field in @new_policy points to the same object as the one in +- * @policy) or replace the governor for @policy with the new one stored in +- * @new_policy. ++ * Invoke the cpufreq driver's ->verify() callback to sanity-check the frequency ++ * limits to be set for the policy, update @policy with the verified limits ++ * values and either invoke the driver's ->setpolicy() callback (if present) or ++ * carry out a governor update for @policy. That is, run the current governor's ++ * ->limits() callback (if @new_gov points to the same object as the one in ++ * @policy) or replace the governor for @policy with @new_gov. + * + * The cpuinfo part of @policy is not updated by this function. + */ +-int cpufreq_set_policy(struct cpufreq_policy *policy, +- struct cpufreq_policy *new_policy) ++static int cpufreq_set_policy(struct cpufreq_policy *policy, ++ struct cpufreq_governor *new_gov, ++ unsigned int new_pol) + { ++ struct cpufreq_policy_data new_data; + struct cpufreq_governor *old_gov; + int ret; + +- pr_debug("setting new policy for CPU %u: %u - %u kHz\n", +- new_policy->cpu, new_policy->min, new_policy->max); +- +- memcpy(&new_policy->cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); +- ++ memcpy(&new_data.cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); ++ new_data.freq_table = policy->freq_table; ++ new_data.cpu = policy->cpu; + /* + * PM QoS framework collects all the requests from users and provide us + * the final aggregated value here. + */ +- new_policy->min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN); +- new_policy->max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX); ++ new_data.min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN); ++ new_data.max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX); ++ ++ pr_debug("setting new policy for CPU %u: %u - %u kHz\n", ++ new_data.cpu, new_data.min, new_data.max); + + /* verify the cpu speed can be set within this limit */ +- ret = cpufreq_driver->verify(new_policy); ++ ret = cpufreq_driver->verify(&new_data); + if (ret) + return ret; + +- policy->min = new_policy->min; +- policy->max = new_policy->max; ++ policy->min = new_data.min; ++ policy->max = new_data.max; + trace_cpu_frequency_limits(policy); + + policy->cached_target_freq = UINT_MAX; +@@ -2406,12 +2399,12 @@ int cpufreq_set_policy(struct cpufreq_policy *policy, + policy->min, policy->max); + + if (cpufreq_driver->setpolicy) { +- policy->policy = new_policy->policy; ++ policy->policy = new_pol; + pr_debug("setting range\n"); + return cpufreq_driver->setpolicy(policy); + } + +- if (new_policy->governor == policy->governor) { ++ if (new_gov == policy->governor) { + pr_debug("governor limits update\n"); + cpufreq_governor_limits(policy); + return 0; +@@ -2428,7 +2421,7 @@ int cpufreq_set_policy(struct cpufreq_policy *policy, + } + + /* start new governor */ +- policy->governor = new_policy->governor; ++ policy->governor = new_gov; + ret = cpufreq_init_governor(policy); + if (!ret) { + ret = cpufreq_start_governor(policy); +diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c +index ded427e0a488..e117b0059123 100644 +--- a/drivers/cpufreq/freq_table.c ++++ b/drivers/cpufreq/freq_table.c +@@ -60,7 +60,7 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, + return 0; + } + +-int cpufreq_frequency_table_verify(struct cpufreq_policy *policy, ++int cpufreq_frequency_table_verify(struct cpufreq_policy_data *policy, + struct cpufreq_frequency_table *table) + { + struct cpufreq_frequency_table *pos; +@@ -100,7 +100,7 @@ EXPORT_SYMBOL_GPL(cpufreq_frequency_table_verify); + * Generic routine to verify policy & frequency table, requires driver to set + * policy->freq_table prior to it. + */ +-int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy) ++int cpufreq_generic_frequency_table_verify(struct cpufreq_policy_data *policy) + { + if (!policy->freq_table) + return -ENODEV; +diff --git a/drivers/cpufreq/gx-suspmod.c b/drivers/cpufreq/gx-suspmod.c +index e97b5733aa24..75b3ef7ec679 100644 +--- a/drivers/cpufreq/gx-suspmod.c ++++ b/drivers/cpufreq/gx-suspmod.c +@@ -328,7 +328,7 @@ static void gx_set_cpuspeed(struct cpufreq_policy *policy, unsigned int khz) + * for the hardware supported by the driver. + */ + +-static int cpufreq_gx_verify(struct cpufreq_policy *policy) ++static int cpufreq_gx_verify(struct cpufreq_policy_data *policy) + { + unsigned int tmp_freq = 0; + u8 tmp1, tmp2; +diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c +index 8ab31702cf6a..45499e0b9f2f 100644 +--- a/drivers/cpufreq/intel_pstate.c ++++ b/drivers/cpufreq/intel_pstate.c +@@ -2036,8 +2036,9 @@ static int intel_pstate_get_max_freq(struct cpudata *cpu) + cpu->pstate.max_freq : cpu->pstate.turbo_freq; + } + +-static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy, +- struct cpudata *cpu) ++static void intel_pstate_update_perf_limits(struct cpudata *cpu, ++ unsigned int policy_min, ++ unsigned int policy_max) + { + int max_freq = intel_pstate_get_max_freq(cpu); + int32_t max_policy_perf, min_policy_perf; +@@ -2056,18 +2057,17 @@ static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy, + turbo_max = cpu->pstate.turbo_pstate; + } + +- max_policy_perf = max_state * policy->max / max_freq; +- if (policy->max == policy->min) { ++ max_policy_perf = max_state * policy_max / max_freq; ++ if (policy_max == policy_min) { + min_policy_perf = max_policy_perf; + } else { +- min_policy_perf = max_state * policy->min / max_freq; ++ min_policy_perf = max_state * policy_min / max_freq; + min_policy_perf = clamp_t(int32_t, min_policy_perf, + 0, max_policy_perf); + } + + pr_debug("cpu:%d max_state %d min_policy_perf:%d max_policy_perf:%d\n", +- policy->cpu, max_state, +- min_policy_perf, max_policy_perf); ++ cpu->cpu, max_state, min_policy_perf, max_policy_perf); + + /* Normalize user input to [min_perf, max_perf] */ + if (per_cpu_limits) { +@@ -2081,7 +2081,7 @@ static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy, + global_min = DIV_ROUND_UP(turbo_max * global.min_perf_pct, 100); + global_min = clamp_t(int32_t, global_min, 0, global_max); + +- pr_debug("cpu:%d global_min:%d global_max:%d\n", policy->cpu, ++ pr_debug("cpu:%d global_min:%d global_max:%d\n", cpu->cpu, + global_min, global_max); + + cpu->min_perf_ratio = max(min_policy_perf, global_min); +@@ -2094,7 +2094,7 @@ static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy, + cpu->max_perf_ratio); + + } +- pr_debug("cpu:%d max_perf_ratio:%d min_perf_ratio:%d\n", policy->cpu, ++ pr_debug("cpu:%d max_perf_ratio:%d min_perf_ratio:%d\n", cpu->cpu, + cpu->max_perf_ratio, + cpu->min_perf_ratio); + } +@@ -2114,7 +2114,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy) + + mutex_lock(&intel_pstate_limits_lock); + +- intel_pstate_update_perf_limits(policy, cpu); ++ intel_pstate_update_perf_limits(cpu, policy->min, policy->max); + + if (cpu->policy == CPUFREQ_POLICY_PERFORMANCE) { + /* +@@ -2143,8 +2143,8 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy) + return 0; + } + +-static void intel_pstate_adjust_policy_max(struct cpufreq_policy *policy, +- struct cpudata *cpu) ++static void intel_pstate_adjust_policy_max(struct cpudata *cpu, ++ struct cpufreq_policy_data *policy) + { + if (!hwp_active && + cpu->pstate.max_pstate_physical > cpu->pstate.max_pstate && +@@ -2155,7 +2155,7 @@ static void intel_pstate_adjust_policy_max(struct cpufreq_policy *policy, + } + } + +-static int intel_pstate_verify_policy(struct cpufreq_policy *policy) ++static int intel_pstate_verify_policy(struct cpufreq_policy_data *policy) + { + struct cpudata *cpu = all_cpu_data[policy->cpu]; + +@@ -2163,11 +2163,7 @@ static int intel_pstate_verify_policy(struct cpufreq_policy *policy) + cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, + intel_pstate_get_max_freq(cpu)); + +- if (policy->policy != CPUFREQ_POLICY_POWERSAVE && +- policy->policy != CPUFREQ_POLICY_PERFORMANCE) +- return -EINVAL; +- +- intel_pstate_adjust_policy_max(policy, cpu); ++ intel_pstate_adjust_policy_max(cpu, policy); + + return 0; + } +@@ -2268,7 +2264,7 @@ static struct cpufreq_driver intel_pstate = { + .name = "intel_pstate", + }; + +-static int intel_cpufreq_verify_policy(struct cpufreq_policy *policy) ++static int intel_cpufreq_verify_policy(struct cpufreq_policy_data *policy) + { + struct cpudata *cpu = all_cpu_data[policy->cpu]; + +@@ -2276,9 +2272,9 @@ static int intel_cpufreq_verify_policy(struct cpufreq_policy *policy) + cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, + intel_pstate_get_max_freq(cpu)); + +- intel_pstate_adjust_policy_max(policy, cpu); ++ intel_pstate_adjust_policy_max(cpu, policy); + +- intel_pstate_update_perf_limits(policy, cpu); ++ intel_pstate_update_perf_limits(cpu, policy->min, policy->max); + + return 0; + } +diff --git a/drivers/cpufreq/longrun.c b/drivers/cpufreq/longrun.c +index 64b8689f7a4a..0b08be8bff76 100644 +--- a/drivers/cpufreq/longrun.c ++++ b/drivers/cpufreq/longrun.c +@@ -122,7 +122,7 @@ static int longrun_set_policy(struct cpufreq_policy *policy) + * Validates a new CPUFreq policy. This function has to be called with + * cpufreq_driver locked. + */ +-static int longrun_verify_policy(struct cpufreq_policy *policy) ++static int longrun_verify_policy(struct cpufreq_policy_data *policy) + { + if (!policy) + return -EINVAL; +@@ -130,10 +130,6 @@ static int longrun_verify_policy(struct cpufreq_policy *policy) + policy->cpu = 0; + cpufreq_verify_within_cpu_limits(policy); + +- if ((policy->policy != CPUFREQ_POLICY_POWERSAVE) && +- (policy->policy != CPUFREQ_POLICY_PERFORMANCE)) +- return -EINVAL; +- + return 0; + } + +diff --git a/drivers/cpufreq/pcc-cpufreq.c b/drivers/cpufreq/pcc-cpufreq.c +index fdc767fdbe6a..f90273006553 100644 +--- a/drivers/cpufreq/pcc-cpufreq.c ++++ b/drivers/cpufreq/pcc-cpufreq.c +@@ -109,7 +109,7 @@ struct pcc_cpu { + + static struct pcc_cpu __percpu *pcc_cpu_info; + +-static int pcc_cpufreq_verify(struct cpufreq_policy *policy) ++static int pcc_cpufreq_verify(struct cpufreq_policy_data *policy) + { + cpufreq_verify_within_cpu_limits(policy); + return 0; +diff --git a/drivers/cpufreq/sh-cpufreq.c b/drivers/cpufreq/sh-cpufreq.c +index 5096c0ab781b..0ac265d47ef0 100644 +--- a/drivers/cpufreq/sh-cpufreq.c ++++ b/drivers/cpufreq/sh-cpufreq.c +@@ -87,7 +87,7 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy, + return work_on_cpu(policy->cpu, __sh_cpufreq_target, &data); + } + +-static int sh_cpufreq_verify(struct cpufreq_policy *policy) ++static int sh_cpufreq_verify(struct cpufreq_policy_data *policy) + { + struct clk *cpuclk = &per_cpu(sh_cpuclk, policy->cpu); + struct cpufreq_frequency_table *freq_table; +diff --git a/drivers/cpufreq/unicore2-cpufreq.c b/drivers/cpufreq/unicore2-cpufreq.c +index 707dbc1b7ac8..98d392196df2 100644 +--- a/drivers/cpufreq/unicore2-cpufreq.c ++++ b/drivers/cpufreq/unicore2-cpufreq.c +@@ -22,7 +22,7 @@ static struct cpufreq_driver ucv2_driver; + /* make sure that only the "userspace" governor is run + * -- anything else wouldn't make sense on this platform, anyway. + */ +-static int ucv2_verify_speed(struct cpufreq_policy *policy) ++static int ucv2_verify_speed(struct cpufreq_policy_data *policy) + { + if (policy->cpu) + return -EINVAL; +diff --git a/drivers/crypto/atmel-aes.c b/drivers/crypto/atmel-aes.c +index db99cee1991c..89f79d763ab8 100644 +--- a/drivers/crypto/atmel-aes.c ++++ b/drivers/crypto/atmel-aes.c +@@ -88,7 +88,6 @@ + struct atmel_aes_caps { + bool has_dualbuff; + bool has_cfb64; +- bool has_ctr32; + bool has_gcm; + bool has_xts; + bool has_authenc; +@@ -1013,8 +1012,9 @@ static int atmel_aes_ctr_transfer(struct atmel_aes_dev *dd) + struct atmel_aes_ctr_ctx *ctx = atmel_aes_ctr_ctx_cast(dd->ctx); + struct ablkcipher_request *req = ablkcipher_request_cast(dd->areq); + struct scatterlist *src, *dst; +- u32 ctr, blocks; + size_t datalen; ++ u32 ctr; ++ u16 blocks, start, end; + bool use_dma, fragmented = false; + + /* Check for transfer completion. */ +@@ -1026,27 +1026,17 @@ static int atmel_aes_ctr_transfer(struct atmel_aes_dev *dd) + datalen = req->nbytes - ctx->offset; + blocks = DIV_ROUND_UP(datalen, AES_BLOCK_SIZE); + ctr = be32_to_cpu(ctx->iv[3]); +- if (dd->caps.has_ctr32) { +- /* Check 32bit counter overflow. */ +- u32 start = ctr; +- u32 end = start + blocks - 1; +- +- if (end < start) { +- ctr |= 0xffffffff; +- datalen = AES_BLOCK_SIZE * -start; +- fragmented = true; +- } +- } else { +- /* Check 16bit counter overflow. */ +- u16 start = ctr & 0xffff; +- u16 end = start + (u16)blocks - 1; +- +- if (blocks >> 16 || end < start) { +- ctr |= 0xffff; +- datalen = AES_BLOCK_SIZE * (0x10000-start); +- fragmented = true; +- } ++ ++ /* Check 16bit counter overflow. */ ++ start = ctr & 0xffff; ++ end = start + blocks - 1; ++ ++ if (blocks >> 16 || end < start) { ++ ctr |= 0xffff; ++ datalen = AES_BLOCK_SIZE * (0x10000 - start); ++ fragmented = true; + } ++ + use_dma = (datalen >= ATMEL_AES_DMA_THRESHOLD); + + /* Jump to offset. */ +@@ -2550,7 +2540,6 @@ static void atmel_aes_get_cap(struct atmel_aes_dev *dd) + { + dd->caps.has_dualbuff = 0; + dd->caps.has_cfb64 = 0; +- dd->caps.has_ctr32 = 0; + dd->caps.has_gcm = 0; + dd->caps.has_xts = 0; + dd->caps.has_authenc = 0; +@@ -2561,7 +2550,6 @@ static void atmel_aes_get_cap(struct atmel_aes_dev *dd) + case 0x500: + dd->caps.has_dualbuff = 1; + dd->caps.has_cfb64 = 1; +- dd->caps.has_ctr32 = 1; + dd->caps.has_gcm = 1; + dd->caps.has_xts = 1; + dd->caps.has_authenc = 1; +@@ -2570,7 +2558,6 @@ static void atmel_aes_get_cap(struct atmel_aes_dev *dd) + case 0x200: + dd->caps.has_dualbuff = 1; + dd->caps.has_cfb64 = 1; +- dd->caps.has_ctr32 = 1; + dd->caps.has_gcm = 1; + dd->caps.max_burst_size = 4; + break; +diff --git a/drivers/crypto/ccp/ccp-dev-v3.c b/drivers/crypto/ccp/ccp-dev-v3.c +index 0186b3df4c87..0d5576f6ad21 100644 +--- a/drivers/crypto/ccp/ccp-dev-v3.c ++++ b/drivers/crypto/ccp/ccp-dev-v3.c +@@ -586,6 +586,7 @@ const struct ccp_vdata ccpv3_platform = { + .setup = NULL, + .perform = &ccp3_actions, + .offset = 0, ++ .rsamax = CCP_RSA_MAX_WIDTH, + }; + + const struct ccp_vdata ccpv3 = { +diff --git a/drivers/crypto/ccree/cc_aead.c b/drivers/crypto/ccree/cc_aead.c +index d3e8faa03f15..3d7c8d9e54b9 100644 +--- a/drivers/crypto/ccree/cc_aead.c ++++ b/drivers/crypto/ccree/cc_aead.c +@@ -237,7 +237,7 @@ static void cc_aead_complete(struct device *dev, void *cc_req, int err) + * revealed the decrypted message --> zero its memory. + */ + sg_zero_buffer(areq->dst, sg_nents(areq->dst), +- areq->cryptlen, 0); ++ areq->cryptlen, areq->assoclen); + err = -EBADMSG; + } + /*ENCRYPT*/ +diff --git a/drivers/crypto/ccree/cc_cipher.c b/drivers/crypto/ccree/cc_cipher.c +index 254b48797799..cd9c60268bf8 100644 +--- a/drivers/crypto/ccree/cc_cipher.c ++++ b/drivers/crypto/ccree/cc_cipher.c +@@ -523,6 +523,7 @@ static void cc_setup_readiv_desc(struct crypto_tfm *tfm, + } + } + ++ + static void cc_setup_state_desc(struct crypto_tfm *tfm, + struct cipher_req_ctx *req_ctx, + unsigned int ivsize, unsigned int nbytes, +@@ -534,8 +535,6 @@ static void cc_setup_state_desc(struct crypto_tfm *tfm, + int cipher_mode = ctx_p->cipher_mode; + int flow_mode = ctx_p->flow_mode; + int direction = req_ctx->gen_ctx.op_type; +- dma_addr_t key_dma_addr = ctx_p->user.key_dma_addr; +- unsigned int key_len = ctx_p->keylen; + dma_addr_t iv_dma_addr = req_ctx->gen_ctx.iv_dma_addr; + unsigned int du_size = nbytes; + +@@ -570,6 +569,47 @@ static void cc_setup_state_desc(struct crypto_tfm *tfm, + break; + case DRV_CIPHER_XTS: + case DRV_CIPHER_ESSIV: ++ case DRV_CIPHER_BITLOCKER: ++ break; ++ default: ++ dev_err(dev, "Unsupported cipher mode (%d)\n", cipher_mode); ++ } ++} ++ ++ ++static void cc_setup_xex_state_desc(struct crypto_tfm *tfm, ++ struct cipher_req_ctx *req_ctx, ++ unsigned int ivsize, unsigned int nbytes, ++ struct cc_hw_desc desc[], ++ unsigned int *seq_size) ++{ ++ struct cc_cipher_ctx *ctx_p = crypto_tfm_ctx(tfm); ++ struct device *dev = drvdata_to_dev(ctx_p->drvdata); ++ int cipher_mode = ctx_p->cipher_mode; ++ int flow_mode = ctx_p->flow_mode; ++ int direction = req_ctx->gen_ctx.op_type; ++ dma_addr_t key_dma_addr = ctx_p->user.key_dma_addr; ++ unsigned int key_len = ctx_p->keylen; ++ dma_addr_t iv_dma_addr = req_ctx->gen_ctx.iv_dma_addr; ++ unsigned int du_size = nbytes; ++ ++ struct cc_crypto_alg *cc_alg = ++ container_of(tfm->__crt_alg, struct cc_crypto_alg, ++ skcipher_alg.base); ++ ++ if (cc_alg->data_unit) ++ du_size = cc_alg->data_unit; ++ ++ switch (cipher_mode) { ++ case DRV_CIPHER_ECB: ++ break; ++ case DRV_CIPHER_CBC: ++ case DRV_CIPHER_CBC_CTS: ++ case DRV_CIPHER_CTR: ++ case DRV_CIPHER_OFB: ++ break; ++ case DRV_CIPHER_XTS: ++ case DRV_CIPHER_ESSIV: + case DRV_CIPHER_BITLOCKER: + /* load XEX key */ + hw_desc_init(&desc[*seq_size]); +@@ -881,12 +921,14 @@ static int cc_cipher_process(struct skcipher_request *req, + + /* STAT_PHASE_2: Create sequence */ + +- /* Setup IV and XEX key used */ ++ /* Setup state (IV) */ + cc_setup_state_desc(tfm, req_ctx, ivsize, nbytes, desc, &seq_len); + /* Setup MLLI line, if needed */ + cc_setup_mlli_desc(tfm, req_ctx, dst, src, nbytes, req, desc, &seq_len); + /* Setup key */ + cc_setup_key_desc(tfm, req_ctx, nbytes, desc, &seq_len); ++ /* Setup state (IV and XEX key) */ ++ cc_setup_xex_state_desc(tfm, req_ctx, ivsize, nbytes, desc, &seq_len); + /* Data processing */ + cc_setup_flow_desc(tfm, req_ctx, dst, src, nbytes, desc, &seq_len); + /* Read next IV */ +diff --git a/drivers/crypto/ccree/cc_driver.h b/drivers/crypto/ccree/cc_driver.h +index ab31d4a68c80..7d2f7e2c0bb5 100644 +--- a/drivers/crypto/ccree/cc_driver.h ++++ b/drivers/crypto/ccree/cc_driver.h +@@ -161,6 +161,7 @@ struct cc_drvdata { + int std_bodies; + bool sec_disabled; + u32 comp_mask; ++ bool pm_on; + }; + + struct cc_crypto_alg { +diff --git a/drivers/crypto/ccree/cc_pm.c b/drivers/crypto/ccree/cc_pm.c +index dbc508fb719b..452bd77a9ba0 100644 +--- a/drivers/crypto/ccree/cc_pm.c ++++ b/drivers/crypto/ccree/cc_pm.c +@@ -22,14 +22,8 @@ const struct dev_pm_ops ccree_pm = { + int cc_pm_suspend(struct device *dev) + { + struct cc_drvdata *drvdata = dev_get_drvdata(dev); +- int rc; + + dev_dbg(dev, "set HOST_POWER_DOWN_EN\n"); +- rc = cc_suspend_req_queue(drvdata); +- if (rc) { +- dev_err(dev, "cc_suspend_req_queue (%x)\n", rc); +- return rc; +- } + fini_cc_regs(drvdata); + cc_iowrite(drvdata, CC_REG(HOST_POWER_DOWN_EN), POWER_DOWN_ENABLE); + cc_clk_off(drvdata); +@@ -63,13 +57,6 @@ int cc_pm_resume(struct device *dev) + /* check if tee fips error occurred during power down */ + cc_tee_handle_fips_error(drvdata); + +- rc = cc_resume_req_queue(drvdata); +- if (rc) { +- dev_err(dev, "cc_resume_req_queue (%x)\n", rc); +- return rc; +- } +- +- /* must be after the queue resuming as it uses the HW queue*/ + cc_init_hash_sram(drvdata); + + return 0; +@@ -80,12 +67,10 @@ int cc_pm_get(struct device *dev) + int rc = 0; + struct cc_drvdata *drvdata = dev_get_drvdata(dev); + +- if (cc_req_queue_suspended(drvdata)) ++ if (drvdata->pm_on) + rc = pm_runtime_get_sync(dev); +- else +- pm_runtime_get_noresume(dev); + +- return rc; ++ return (rc == 1 ? 0 : rc); + } + + int cc_pm_put_suspend(struct device *dev) +@@ -93,14 +78,11 @@ int cc_pm_put_suspend(struct device *dev) + int rc = 0; + struct cc_drvdata *drvdata = dev_get_drvdata(dev); + +- if (!cc_req_queue_suspended(drvdata)) { ++ if (drvdata->pm_on) { + pm_runtime_mark_last_busy(dev); + rc = pm_runtime_put_autosuspend(dev); +- } else { +- /* Something wrong happens*/ +- dev_err(dev, "request to suspend already suspended queue"); +- rc = -EBUSY; + } ++ + return rc; + } + +@@ -117,7 +99,7 @@ int cc_pm_init(struct cc_drvdata *drvdata) + /* must be before the enabling to avoid resdundent suspending */ + pm_runtime_set_autosuspend_delay(dev, CC_SUSPEND_TIMEOUT); + pm_runtime_use_autosuspend(dev); +- /* activate the PM module */ ++ /* set us as active - note we won't do PM ops until cc_pm_go()! */ + return pm_runtime_set_active(dev); + } + +@@ -125,9 +107,11 @@ int cc_pm_init(struct cc_drvdata *drvdata) + void cc_pm_go(struct cc_drvdata *drvdata) + { + pm_runtime_enable(drvdata_to_dev(drvdata)); ++ drvdata->pm_on = true; + } + + void cc_pm_fini(struct cc_drvdata *drvdata) + { + pm_runtime_disable(drvdata_to_dev(drvdata)); ++ drvdata->pm_on = false; + } +diff --git a/drivers/crypto/ccree/cc_request_mgr.c b/drivers/crypto/ccree/cc_request_mgr.c +index a947d5a2cf35..37e6fee37b13 100644 +--- a/drivers/crypto/ccree/cc_request_mgr.c ++++ b/drivers/crypto/ccree/cc_request_mgr.c +@@ -41,7 +41,6 @@ struct cc_req_mgr_handle { + #else + struct tasklet_struct comptask; + #endif +- bool is_runtime_suspended; + }; + + struct cc_bl_item { +@@ -404,6 +403,7 @@ static void cc_proc_backlog(struct cc_drvdata *drvdata) + spin_lock(&mgr->bl_lock); + list_del(&bli->list); + --mgr->bl_len; ++ kfree(bli); + } + + spin_unlock(&mgr->bl_lock); +@@ -677,52 +677,3 @@ static void comp_handler(unsigned long devarg) + cc_proc_backlog(drvdata); + dev_dbg(dev, "Comp. handler done.\n"); + } +- +-/* +- * resume the queue configuration - no need to take the lock as this happens +- * inside the spin lock protection +- */ +-#if defined(CONFIG_PM) +-int cc_resume_req_queue(struct cc_drvdata *drvdata) +-{ +- struct cc_req_mgr_handle *request_mgr_handle = +- drvdata->request_mgr_handle; +- +- spin_lock_bh(&request_mgr_handle->hw_lock); +- request_mgr_handle->is_runtime_suspended = false; +- spin_unlock_bh(&request_mgr_handle->hw_lock); +- +- return 0; +-} +- +-/* +- * suspend the queue configuration. Since it is used for the runtime suspend +- * only verify that the queue can be suspended. +- */ +-int cc_suspend_req_queue(struct cc_drvdata *drvdata) +-{ +- struct cc_req_mgr_handle *request_mgr_handle = +- drvdata->request_mgr_handle; +- +- /* lock the send_request */ +- spin_lock_bh(&request_mgr_handle->hw_lock); +- if (request_mgr_handle->req_queue_head != +- request_mgr_handle->req_queue_tail) { +- spin_unlock_bh(&request_mgr_handle->hw_lock); +- return -EBUSY; +- } +- request_mgr_handle->is_runtime_suspended = true; +- spin_unlock_bh(&request_mgr_handle->hw_lock); +- +- return 0; +-} +- +-bool cc_req_queue_suspended(struct cc_drvdata *drvdata) +-{ +- struct cc_req_mgr_handle *request_mgr_handle = +- drvdata->request_mgr_handle; +- +- return request_mgr_handle->is_runtime_suspended; +-} +- +-#endif +diff --git a/drivers/crypto/ccree/cc_request_mgr.h b/drivers/crypto/ccree/cc_request_mgr.h +index f46cf766fe4d..ff7746aaaf35 100644 +--- a/drivers/crypto/ccree/cc_request_mgr.h ++++ b/drivers/crypto/ccree/cc_request_mgr.h +@@ -40,12 +40,4 @@ void complete_request(struct cc_drvdata *drvdata); + + void cc_req_mgr_fini(struct cc_drvdata *drvdata); + +-#if defined(CONFIG_PM) +-int cc_resume_req_queue(struct cc_drvdata *drvdata); +- +-int cc_suspend_req_queue(struct cc_drvdata *drvdata); +- +-bool cc_req_queue_suspended(struct cc_drvdata *drvdata); +-#endif +- + #endif /*__REQUEST_MGR_H__*/ +diff --git a/drivers/crypto/hisilicon/Kconfig b/drivers/crypto/hisilicon/Kconfig +index 504daff7687d..f7f0a1fb6895 100644 +--- a/drivers/crypto/hisilicon/Kconfig ++++ b/drivers/crypto/hisilicon/Kconfig +@@ -35,6 +35,5 @@ config CRYPTO_DEV_HISI_ZIP + depends on ARM64 && PCI && PCI_MSI + select CRYPTO_DEV_HISI_QM + select CRYPTO_HISI_SGL +- select SG_SPLIT + help + Support for HiSilicon ZIP Driver +diff --git a/drivers/crypto/hisilicon/zip/zip.h b/drivers/crypto/hisilicon/zip/zip.h +index ffb00d987d02..99f21d848d4f 100644 +--- a/drivers/crypto/hisilicon/zip/zip.h ++++ b/drivers/crypto/hisilicon/zip/zip.h +@@ -12,6 +12,10 @@ + + /* hisi_zip_sqe dw3 */ + #define HZIP_BD_STATUS_M GENMASK(7, 0) ++/* hisi_zip_sqe dw7 */ ++#define HZIP_IN_SGE_DATA_OFFSET_M GENMASK(23, 0) ++/* hisi_zip_sqe dw8 */ ++#define HZIP_OUT_SGE_DATA_OFFSET_M GENMASK(23, 0) + /* hisi_zip_sqe dw9 */ + #define HZIP_REQ_TYPE_M GENMASK(7, 0) + #define HZIP_ALG_TYPE_ZLIB 0x02 +diff --git a/drivers/crypto/hisilicon/zip/zip_crypto.c b/drivers/crypto/hisilicon/zip/zip_crypto.c +index 59023545a1c4..cf34bfdfb3e6 100644 +--- a/drivers/crypto/hisilicon/zip/zip_crypto.c ++++ b/drivers/crypto/hisilicon/zip/zip_crypto.c +@@ -45,10 +45,8 @@ enum hisi_zip_alg_type { + + struct hisi_zip_req { + struct acomp_req *req; +- struct scatterlist *src; +- struct scatterlist *dst; +- size_t slen; +- size_t dlen; ++ int sskip; ++ int dskip; + struct hisi_acc_hw_sgl *hw_src; + struct hisi_acc_hw_sgl *hw_dst; + dma_addr_t dma_src; +@@ -94,13 +92,15 @@ static void hisi_zip_config_tag(struct hisi_zip_sqe *sqe, u32 tag) + + static void hisi_zip_fill_sqe(struct hisi_zip_sqe *sqe, u8 req_type, + dma_addr_t s_addr, dma_addr_t d_addr, u32 slen, +- u32 dlen) ++ u32 dlen, int sskip, int dskip) + { + memset(sqe, 0, sizeof(struct hisi_zip_sqe)); + +- sqe->input_data_length = slen; ++ sqe->input_data_length = slen - sskip; ++ sqe->dw7 = FIELD_PREP(HZIP_IN_SGE_DATA_OFFSET_M, sskip); ++ sqe->dw8 = FIELD_PREP(HZIP_OUT_SGE_DATA_OFFSET_M, dskip); + sqe->dw9 = FIELD_PREP(HZIP_REQ_TYPE_M, req_type); +- sqe->dest_avail_out = dlen; ++ sqe->dest_avail_out = dlen - dskip; + sqe->source_addr_l = lower_32_bits(s_addr); + sqe->source_addr_h = upper_32_bits(s_addr); + sqe->dest_addr_l = lower_32_bits(d_addr); +@@ -301,11 +301,6 @@ static void hisi_zip_remove_req(struct hisi_zip_qp_ctx *qp_ctx, + { + struct hisi_zip_req_q *req_q = &qp_ctx->req_q; + +- if (qp_ctx->qp->alg_type == HZIP_ALG_TYPE_COMP) +- kfree(req->dst); +- else +- kfree(req->src); +- + write_lock(&req_q->req_lock); + clear_bit(req->req_id, req_q->req_bitmap); + memset(req, 0, sizeof(struct hisi_zip_req)); +@@ -333,8 +328,8 @@ static void hisi_zip_acomp_cb(struct hisi_qp *qp, void *data) + } + dlen = sqe->produced; + +- hisi_acc_sg_buf_unmap(dev, req->src, req->hw_src); +- hisi_acc_sg_buf_unmap(dev, req->dst, req->hw_dst); ++ hisi_acc_sg_buf_unmap(dev, acomp_req->src, req->hw_src); ++ hisi_acc_sg_buf_unmap(dev, acomp_req->dst, req->hw_dst); + + head_size = (qp->alg_type == 0) ? TO_HEAD_SIZE(qp->req_type) : 0; + acomp_req->dlen = dlen + head_size; +@@ -428,20 +423,6 @@ static size_t get_comp_head_size(struct scatterlist *src, u8 req_type) + } + } + +-static int get_sg_skip_bytes(struct scatterlist *sgl, size_t bytes, +- size_t remains, struct scatterlist **out) +-{ +-#define SPLIT_NUM 2 +- size_t split_sizes[SPLIT_NUM]; +- int out_mapped_nents[SPLIT_NUM]; +- +- split_sizes[0] = bytes; +- split_sizes[1] = remains; +- +- return sg_split(sgl, 0, 0, SPLIT_NUM, split_sizes, out, +- out_mapped_nents, GFP_KERNEL); +-} +- + static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req, + struct hisi_zip_qp_ctx *qp_ctx, + size_t head_size, bool is_comp) +@@ -449,31 +430,7 @@ static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req, + struct hisi_zip_req_q *req_q = &qp_ctx->req_q; + struct hisi_zip_req *q = req_q->q; + struct hisi_zip_req *req_cache; +- struct scatterlist *out[2]; +- struct scatterlist *sgl; +- size_t len; +- int ret, req_id; +- +- /* +- * remove/add zlib/gzip head, as hardware operations do not include +- * comp head. so split req->src to get sgl without heads in acomp, or +- * add comp head to req->dst ahead of that hardware output compressed +- * data in sgl splited from req->dst without comp head. +- */ +- if (is_comp) { +- sgl = req->dst; +- len = req->dlen - head_size; +- } else { +- sgl = req->src; +- len = req->slen - head_size; +- } +- +- ret = get_sg_skip_bytes(sgl, head_size, len, out); +- if (ret) +- return ERR_PTR(ret); +- +- /* sgl for comp head is useless, so free it now */ +- kfree(out[0]); ++ int req_id; + + write_lock(&req_q->req_lock); + +@@ -481,7 +438,6 @@ static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req, + if (req_id >= req_q->size) { + write_unlock(&req_q->req_lock); + dev_dbg(&qp_ctx->qp->qm->pdev->dev, "req cache is full!\n"); +- kfree(out[1]); + return ERR_PTR(-EBUSY); + } + set_bit(req_id, req_q->req_bitmap); +@@ -489,16 +445,13 @@ static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req, + req_cache = q + req_id; + req_cache->req_id = req_id; + req_cache->req = req; ++ + if (is_comp) { +- req_cache->src = req->src; +- req_cache->dst = out[1]; +- req_cache->slen = req->slen; +- req_cache->dlen = req->dlen - head_size; ++ req_cache->sskip = 0; ++ req_cache->dskip = head_size; + } else { +- req_cache->src = out[1]; +- req_cache->dst = req->dst; +- req_cache->slen = req->slen - head_size; +- req_cache->dlen = req->dlen; ++ req_cache->sskip = head_size; ++ req_cache->dskip = 0; + } + + write_unlock(&req_q->req_lock); +@@ -510,6 +463,7 @@ static int hisi_zip_do_work(struct hisi_zip_req *req, + struct hisi_zip_qp_ctx *qp_ctx) + { + struct hisi_zip_sqe *zip_sqe = &qp_ctx->zip_sqe; ++ struct acomp_req *a_req = req->req; + struct hisi_qp *qp = qp_ctx->qp; + struct device *dev = &qp->qm->pdev->dev; + struct hisi_acc_sgl_pool *pool = &qp_ctx->sgl_pool; +@@ -517,16 +471,16 @@ static int hisi_zip_do_work(struct hisi_zip_req *req, + dma_addr_t output; + int ret; + +- if (!req->src || !req->slen || !req->dst || !req->dlen) ++ if (!a_req->src || !a_req->slen || !a_req->dst || !a_req->dlen) + return -EINVAL; + +- req->hw_src = hisi_acc_sg_buf_map_to_hw_sgl(dev, req->src, pool, ++ req->hw_src = hisi_acc_sg_buf_map_to_hw_sgl(dev, a_req->src, pool, + req->req_id << 1, &input); + if (IS_ERR(req->hw_src)) + return PTR_ERR(req->hw_src); + req->dma_src = input; + +- req->hw_dst = hisi_acc_sg_buf_map_to_hw_sgl(dev, req->dst, pool, ++ req->hw_dst = hisi_acc_sg_buf_map_to_hw_sgl(dev, a_req->dst, pool, + (req->req_id << 1) + 1, + &output); + if (IS_ERR(req->hw_dst)) { +@@ -535,8 +489,8 @@ static int hisi_zip_do_work(struct hisi_zip_req *req, + } + req->dma_dst = output; + +- hisi_zip_fill_sqe(zip_sqe, qp->req_type, input, output, req->slen, +- req->dlen); ++ hisi_zip_fill_sqe(zip_sqe, qp->req_type, input, output, a_req->slen, ++ a_req->dlen, req->sskip, req->dskip); + hisi_zip_config_buf_type(zip_sqe, HZIP_SGL); + hisi_zip_config_tag(zip_sqe, req->req_id); + +@@ -548,9 +502,9 @@ static int hisi_zip_do_work(struct hisi_zip_req *req, + return -EINPROGRESS; + + err_unmap_output: +- hisi_acc_sg_buf_unmap(dev, req->dst, req->hw_dst); ++ hisi_acc_sg_buf_unmap(dev, a_req->dst, req->hw_dst); + err_unmap_input: +- hisi_acc_sg_buf_unmap(dev, req->src, req->hw_src); ++ hisi_acc_sg_buf_unmap(dev, a_req->src, req->hw_src); + return ret; + } + +diff --git a/drivers/crypto/picoxcell_crypto.c b/drivers/crypto/picoxcell_crypto.c +index 3cbefb41b099..2680e1525db5 100644 +--- a/drivers/crypto/picoxcell_crypto.c ++++ b/drivers/crypto/picoxcell_crypto.c +@@ -1613,6 +1613,11 @@ static const struct of_device_id spacc_of_id_table[] = { + MODULE_DEVICE_TABLE(of, spacc_of_id_table); + #endif /* CONFIG_OF */ + ++static void spacc_tasklet_kill(void *data) ++{ ++ tasklet_kill(data); ++} ++ + static int spacc_probe(struct platform_device *pdev) + { + int i, err, ret; +@@ -1655,6 +1660,14 @@ static int spacc_probe(struct platform_device *pdev) + return -ENXIO; + } + ++ tasklet_init(&engine->complete, spacc_spacc_complete, ++ (unsigned long)engine); ++ ++ ret = devm_add_action(&pdev->dev, spacc_tasklet_kill, ++ &engine->complete); ++ if (ret) ++ return ret; ++ + if (devm_request_irq(&pdev->dev, irq->start, spacc_spacc_irq, 0, + engine->name, engine)) { + dev_err(engine->dev, "failed to request IRQ\n"); +@@ -1712,8 +1725,6 @@ static int spacc_probe(struct platform_device *pdev) + INIT_LIST_HEAD(&engine->completed); + INIT_LIST_HEAD(&engine->in_progress); + engine->in_flight = 0; +- tasklet_init(&engine->complete, spacc_spacc_complete, +- (unsigned long)engine); + + platform_set_drvdata(pdev, engine); + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +index ee1dc75f5ddc..1d733b57e60f 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +@@ -247,7 +247,8 @@ bool dm_helpers_dp_mst_write_payload_allocation_table( + drm_dp_mst_reset_vcpi_slots(mst_mgr, mst_port); + } + +- ret = drm_dp_update_payload_part1(mst_mgr); ++ /* It's OK for this to fail */ ++ drm_dp_update_payload_part1(mst_mgr); + + /* mst_mgr->->payloads are VC payload notify MST branch using DPCD or + * AUX message. The sequence is slot 1-63 allocated sequence for each +@@ -256,9 +257,6 @@ bool dm_helpers_dp_mst_write_payload_allocation_table( + + get_payload_table(aconnector, proposed_table); + +- if (ret) +- return false; +- + return true; + } + +@@ -316,7 +314,6 @@ bool dm_helpers_dp_mst_send_payload_allocation( + struct amdgpu_dm_connector *aconnector; + struct drm_dp_mst_topology_mgr *mst_mgr; + struct drm_dp_mst_port *mst_port; +- int ret; + + aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context; + +@@ -330,10 +327,8 @@ bool dm_helpers_dp_mst_send_payload_allocation( + if (!mst_mgr->mst_state) + return false; + +- ret = drm_dp_update_payload_part2(mst_mgr); +- +- if (ret) +- return false; ++ /* It's OK for this to fail */ ++ drm_dp_update_payload_part2(mst_mgr); + + if (!enable) + drm_dp_mst_deallocate_vcpi(mst_mgr, mst_port); +diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +index f2e73e6d46b8..10985134ce0b 100644 +--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c ++++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +@@ -73,7 +73,11 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) + unsigned long prate; + unsigned int mask = ATMEL_HLCDC_CLKDIV_MASK | ATMEL_HLCDC_CLKPOL; + unsigned int cfg = 0; +- int div; ++ int div, ret; ++ ++ ret = clk_prepare_enable(crtc->dc->hlcdc->sys_clk); ++ if (ret) ++ return; + + vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; + vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; +@@ -95,14 +99,14 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) + (adj->crtc_hdisplay - 1) | + ((adj->crtc_vdisplay - 1) << 16)); + ++ prate = clk_get_rate(crtc->dc->hlcdc->sys_clk); ++ mode_rate = adj->crtc_clock * 1000; + if (!crtc->dc->desc->fixed_clksrc) { ++ prate *= 2; + cfg |= ATMEL_HLCDC_CLKSEL; + mask |= ATMEL_HLCDC_CLKSEL; + } + +- prate = 2 * clk_get_rate(crtc->dc->hlcdc->sys_clk); +- mode_rate = adj->crtc_clock * 1000; +- + div = DIV_ROUND_UP(prate, mode_rate); + if (div < 2) { + div = 2; +@@ -117,8 +121,8 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) + int div_low = prate / mode_rate; + + if (div_low >= 2 && +- ((prate / div_low - mode_rate) < +- 10 * (mode_rate - prate / div))) ++ (10 * (prate / div_low - mode_rate) < ++ (mode_rate - prate / div))) + /* + * At least 10 times better when using a higher + * frequency than requested, instead of a lower. +@@ -147,6 +151,8 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) + ATMEL_HLCDC_VSPSU | ATMEL_HLCDC_VSPHO | + ATMEL_HLCDC_GUARDTIME_MASK | ATMEL_HLCDC_MODE_MASK, + cfg); ++ ++ clk_disable_unprepare(crtc->dc->hlcdc->sys_clk); + } + + static enum drm_mode_status +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index a48a4c21b1b3..c5e9e2305fff 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -2694,6 +2694,7 @@ static bool drm_dp_get_vc_payload_bw(int dp_link_bw, + int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state) + { + int ret = 0; ++ int i = 0; + struct drm_dp_mst_branch *mstb = NULL; + + mutex_lock(&mgr->lock); +@@ -2754,10 +2755,21 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms + /* this can fail if the device is gone */ + drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); + ret = 0; ++ mutex_lock(&mgr->payload_lock); + memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload)); + mgr->payload_mask = 0; + set_bit(0, &mgr->payload_mask); ++ for (i = 0; i < mgr->max_payloads; i++) { ++ struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i]; ++ ++ if (vcpi) { ++ vcpi->vcpi = 0; ++ vcpi->num_slots = 0; ++ } ++ mgr->proposed_vcpis[i] = NULL; ++ } + mgr->vcpi_mask = 0; ++ mutex_unlock(&mgr->payload_lock); + } + + out_unlock: +diff --git a/drivers/gpu/drm/drm_rect.c b/drivers/gpu/drm/drm_rect.c +index b8363aaa9032..818738e83d06 100644 +--- a/drivers/gpu/drm/drm_rect.c ++++ b/drivers/gpu/drm/drm_rect.c +@@ -54,7 +54,12 @@ EXPORT_SYMBOL(drm_rect_intersect); + + static u32 clip_scaled(u32 src, u32 dst, u32 clip) + { +- u64 tmp = mul_u32_u32(src, dst - clip); ++ u64 tmp; ++ ++ if (dst == 0) ++ return 0; ++ ++ tmp = mul_u32_u32(src, dst - clip); + + /* + * Round toward 1.0 when clipping so that we don't accidentally +diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c +index 772f0753ed38..aaf2f26f8505 100644 +--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c ++++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c +@@ -121,7 +121,7 @@ static void mdp4_dsi_encoder_enable(struct drm_encoder *encoder) + if (mdp4_dsi_encoder->enabled) + return; + +- mdp4_crtc_set_config(encoder->crtc, ++ mdp4_crtc_set_config(encoder->crtc, + MDP4_DMA_CONFIG_PACK_ALIGN_MSB | + MDP4_DMA_CONFIG_DEFLKR_EN | + MDP4_DMA_CONFIG_DITHER_EN | +diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c +index 34bd73526afd..930674117533 100644 +--- a/drivers/hv/hv_balloon.c ++++ b/drivers/hv/hv_balloon.c +@@ -1213,10 +1213,7 @@ static unsigned int alloc_balloon_pages(struct hv_dynmem_device *dm, + unsigned int i, j; + struct page *pg; + +- if (num_pages < alloc_unit) +- return 0; +- +- for (i = 0; (i * alloc_unit) < num_pages; i++) { ++ for (i = 0; i < num_pages / alloc_unit; i++) { + if (bl_resp->hdr.size + sizeof(union dm_mem_page_range) > + PAGE_SIZE) + return i * alloc_unit; +@@ -1254,7 +1251,7 @@ static unsigned int alloc_balloon_pages(struct hv_dynmem_device *dm, + + } + +- return num_pages; ++ return i * alloc_unit; + } + + static void balloon_up(struct work_struct *dummy) +@@ -1269,9 +1266,6 @@ static void balloon_up(struct work_struct *dummy) + long avail_pages; + unsigned long floor; + +- /* The host balloons pages in 2M granularity. */ +- WARN_ON_ONCE(num_pages % PAGES_IN_2M != 0); +- + /* + * We will attempt 2M allocations. However, if we fail to + * allocate 2M chunks, we will go back to 4k allocations. +@@ -1281,14 +1275,13 @@ static void balloon_up(struct work_struct *dummy) + avail_pages = si_mem_available(); + floor = compute_balloon_floor(); + +- /* Refuse to balloon below the floor, keep the 2M granularity. */ ++ /* Refuse to balloon below the floor. */ + if (avail_pages < num_pages || avail_pages - num_pages < floor) { + pr_warn("Balloon request will be partially fulfilled. %s\n", + avail_pages < num_pages ? "Not enough memory." : + "Balloon floor reached."); + + num_pages = avail_pages > floor ? (avail_pages - floor) : 0; +- num_pages -= num_pages % PAGES_IN_2M; + } + + while (!done) { +diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c +index 163ff7ba92b7..fedf6829cdec 100644 +--- a/drivers/infiniband/core/umem_odp.c ++++ b/drivers/infiniband/core/umem_odp.c +@@ -632,7 +632,7 @@ int ib_umem_odp_map_dma_pages(struct ib_umem_odp *umem_odp, u64 user_virt, + + while (bcnt > 0) { + const size_t gup_num_pages = min_t(size_t, +- (bcnt + BIT(page_shift) - 1) >> page_shift, ++ ALIGN(bcnt, PAGE_SIZE) / PAGE_SIZE, + PAGE_SIZE / sizeof(struct page *)); + + down_read(&owning_mm->mmap_sem); +diff --git a/drivers/infiniband/hw/mlx5/gsi.c b/drivers/infiniband/hw/mlx5/gsi.c +index 4950df3f71b6..5c73c0a790fa 100644 +--- a/drivers/infiniband/hw/mlx5/gsi.c ++++ b/drivers/infiniband/hw/mlx5/gsi.c +@@ -507,8 +507,7 @@ int mlx5_ib_gsi_post_send(struct ib_qp *qp, const struct ib_send_wr *wr, + ret = ib_post_send(tx_qp, &cur_wr.wr, bad_wr); + if (ret) { + /* Undo the effect of adding the outstanding wr */ +- gsi->outstanding_pi = (gsi->outstanding_pi - 1) % +- gsi->cap.max_send_wr; ++ gsi->outstanding_pi--; + goto err; + } + spin_unlock_irqrestore(&gsi->lock, flags); +diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h +index deb924e1d790..3d2b63585da9 100644 +--- a/drivers/md/bcache/bcache.h ++++ b/drivers/md/bcache/bcache.h +@@ -329,6 +329,9 @@ struct cached_dev { + */ + atomic_t has_dirty; + ++#define BCH_CACHE_READA_ALL 0 ++#define BCH_CACHE_READA_META_ONLY 1 ++ unsigned int cache_readahead_policy; + struct bch_ratelimit writeback_rate; + struct delayed_work writeback_rate_update; + +diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c +index 41adcd1546f1..4045ae748f17 100644 +--- a/drivers/md/bcache/request.c ++++ b/drivers/md/bcache/request.c +@@ -391,13 +391,20 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) + goto skip; + + /* +- * Flag for bypass if the IO is for read-ahead or background, +- * unless the read-ahead request is for metadata ++ * If the bio is for read-ahead or background IO, bypass it or ++ * not depends on the following situations, ++ * - If the IO is for meta data, always cache it and no bypass ++ * - If the IO is not meta data, check dc->cache_reada_policy, ++ * BCH_CACHE_READA_ALL: cache it and not bypass ++ * BCH_CACHE_READA_META_ONLY: not cache it and bypass ++ * That is, read-ahead request for metadata always get cached + * (eg, for gfs2 or xfs). + */ +- if (bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND) && +- !(bio->bi_opf & (REQ_META|REQ_PRIO))) +- goto skip; ++ if ((bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND))) { ++ if (!(bio->bi_opf & (REQ_META|REQ_PRIO)) && ++ (dc->cache_readahead_policy != BCH_CACHE_READA_ALL)) ++ goto skip; ++ } + + if (bio->bi_iter.bi_sector & (c->sb.block_size - 1) || + bio_sectors(bio) & (c->sb.block_size - 1)) { +diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c +index 627dcea0f5b6..7f0fb4b5755a 100644 +--- a/drivers/md/bcache/sysfs.c ++++ b/drivers/md/bcache/sysfs.c +@@ -27,6 +27,12 @@ static const char * const bch_cache_modes[] = { + NULL + }; + ++static const char * const bch_reada_cache_policies[] = { ++ "all", ++ "meta-only", ++ NULL ++}; ++ + /* Default is 0 ("auto") */ + static const char * const bch_stop_on_failure_modes[] = { + "auto", +@@ -100,6 +106,7 @@ rw_attribute(congested_write_threshold_us); + rw_attribute(sequential_cutoff); + rw_attribute(data_csum); + rw_attribute(cache_mode); ++rw_attribute(readahead_cache_policy); + rw_attribute(stop_when_cache_set_failed); + rw_attribute(writeback_metadata); + rw_attribute(writeback_running); +@@ -167,6 +174,11 @@ SHOW(__bch_cached_dev) + bch_cache_modes, + BDEV_CACHE_MODE(&dc->sb)); + ++ if (attr == &sysfs_readahead_cache_policy) ++ return bch_snprint_string_list(buf, PAGE_SIZE, ++ bch_reada_cache_policies, ++ dc->cache_readahead_policy); ++ + if (attr == &sysfs_stop_when_cache_set_failed) + return bch_snprint_string_list(buf, PAGE_SIZE, + bch_stop_on_failure_modes, +@@ -352,6 +364,15 @@ STORE(__cached_dev) + } + } + ++ if (attr == &sysfs_readahead_cache_policy) { ++ v = __sysfs_match_string(bch_reada_cache_policies, -1, buf); ++ if (v < 0) ++ return v; ++ ++ if ((unsigned int) v != dc->cache_readahead_policy) ++ dc->cache_readahead_policy = v; ++ } ++ + if (attr == &sysfs_stop_when_cache_set_failed) { + v = __sysfs_match_string(bch_stop_on_failure_modes, -1, buf); + if (v < 0) +@@ -466,6 +487,7 @@ static struct attribute *bch_cached_dev_files[] = { + &sysfs_data_csum, + #endif + &sysfs_cache_mode, ++ &sysfs_readahead_cache_policy, + &sysfs_stop_when_cache_set_failed, + &sysfs_writeback_metadata, + &sysfs_writeback_running, +diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c +index eb9782fc93fe..492bbe0584d9 100644 +--- a/drivers/md/dm-crypt.c ++++ b/drivers/md/dm-crypt.c +@@ -331,8 +331,14 @@ static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, + static int crypt_iv_benbi_ctr(struct crypt_config *cc, struct dm_target *ti, + const char *opts) + { +- unsigned bs = crypto_skcipher_blocksize(any_tfm(cc)); +- int log = ilog2(bs); ++ unsigned bs; ++ int log; ++ ++ if (test_bit(CRYPT_MODE_INTEGRITY_AEAD, &cc->cipher_flags)) ++ bs = crypto_aead_blocksize(any_tfm_aead(cc)); ++ else ++ bs = crypto_skcipher_blocksize(any_tfm(cc)); ++ log = ilog2(bs); + + /* we need to calculate how far we must shift the sector count + * to get the cipher block count, we use this shift in _gen */ +@@ -717,7 +723,7 @@ static int crypt_iv_eboiv_gen(struct crypt_config *cc, u8 *iv, + struct crypto_wait wait; + int err; + +- req = skcipher_request_alloc(any_tfm(cc), GFP_KERNEL | GFP_NOFS); ++ req = skcipher_request_alloc(any_tfm(cc), GFP_NOIO); + if (!req) + return -ENOMEM; + +diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c +index b88d6d701f5b..8bb723f1a569 100644 +--- a/drivers/md/dm-thin-metadata.c ++++ b/drivers/md/dm-thin-metadata.c +@@ -387,16 +387,15 @@ static int subtree_equal(void *context, const void *value1_le, const void *value + * Variant that is used for in-core only changes or code that + * shouldn't put the pool in service on its own (e.g. commit). + */ +-static inline void __pmd_write_lock(struct dm_pool_metadata *pmd) ++static inline void pmd_write_lock_in_core(struct dm_pool_metadata *pmd) + __acquires(pmd->root_lock) + { + down_write(&pmd->root_lock); + } +-#define pmd_write_lock_in_core(pmd) __pmd_write_lock((pmd)) + + static inline void pmd_write_lock(struct dm_pool_metadata *pmd) + { +- __pmd_write_lock(pmd); ++ pmd_write_lock_in_core(pmd); + if (unlikely(!pmd->in_service)) + pmd->in_service = true; + } +@@ -831,6 +830,7 @@ static int __commit_transaction(struct dm_pool_metadata *pmd) + * We need to know if the thin_disk_superblock exceeds a 512-byte sector. + */ + BUILD_BUG_ON(sizeof(struct thin_disk_superblock) > 512); ++ BUG_ON(!rwsem_is_locked(&pmd->root_lock)); + + if (unlikely(!pmd->in_service)) + return 0; +@@ -953,6 +953,7 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd) + return -EBUSY; + } + ++ pmd_write_lock_in_core(pmd); + if (!dm_bm_is_read_only(pmd->bm) && !pmd->fail_io) { + r = __commit_transaction(pmd); + if (r < 0) +@@ -961,6 +962,7 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd) + } + if (!pmd->fail_io) + __destroy_persistent_data_objects(pmd); ++ pmd_write_unlock(pmd); + + kfree(pmd); + return 0; +@@ -1841,7 +1843,7 @@ int dm_pool_commit_metadata(struct dm_pool_metadata *pmd) + * Care is taken to not have commit be what + * triggers putting the thin-pool in-service. + */ +- __pmd_write_lock(pmd); ++ pmd_write_lock_in_core(pmd); + if (pmd->fail_io) + goto out; + +diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c +index 43d1af1d8173..07c1b0334f57 100644 +--- a/drivers/md/dm-writecache.c ++++ b/drivers/md/dm-writecache.c +@@ -442,7 +442,13 @@ static void writecache_notify_io(unsigned long error, void *context) + complete(&endio->c); + } + +-static void ssd_commit_flushed(struct dm_writecache *wc) ++static void writecache_wait_for_ios(struct dm_writecache *wc, int direction) ++{ ++ wait_event(wc->bio_in_progress_wait[direction], ++ !atomic_read(&wc->bio_in_progress[direction])); ++} ++ ++static void ssd_commit_flushed(struct dm_writecache *wc, bool wait_for_ios) + { + struct dm_io_region region; + struct dm_io_request req; +@@ -488,17 +494,20 @@ static void ssd_commit_flushed(struct dm_writecache *wc) + writecache_notify_io(0, &endio); + wait_for_completion_io(&endio.c); + ++ if (wait_for_ios) ++ writecache_wait_for_ios(wc, WRITE); ++ + writecache_disk_flush(wc, wc->ssd_dev); + + memset(wc->dirty_bitmap, 0, wc->dirty_bitmap_size); + } + +-static void writecache_commit_flushed(struct dm_writecache *wc) ++static void writecache_commit_flushed(struct dm_writecache *wc, bool wait_for_ios) + { + if (WC_MODE_PMEM(wc)) + wmb(); + else +- ssd_commit_flushed(wc); ++ ssd_commit_flushed(wc, wait_for_ios); + } + + static void writecache_disk_flush(struct dm_writecache *wc, struct dm_dev *dev) +@@ -522,12 +531,6 @@ static void writecache_disk_flush(struct dm_writecache *wc, struct dm_dev *dev) + writecache_error(wc, r, "error flushing metadata: %d", r); + } + +-static void writecache_wait_for_ios(struct dm_writecache *wc, int direction) +-{ +- wait_event(wc->bio_in_progress_wait[direction], +- !atomic_read(&wc->bio_in_progress[direction])); +-} +- + #define WFE_RETURN_FOLLOWING 1 + #define WFE_LOWEST_SEQ 2 + +@@ -724,15 +727,12 @@ static void writecache_flush(struct dm_writecache *wc) + e = e2; + cond_resched(); + } +- writecache_commit_flushed(wc); +- +- if (!WC_MODE_PMEM(wc)) +- writecache_wait_for_ios(wc, WRITE); ++ writecache_commit_flushed(wc, true); + + wc->seq_count++; + pmem_assign(sb(wc)->seq_count, cpu_to_le64(wc->seq_count)); + writecache_flush_region(wc, &sb(wc)->seq_count, sizeof sb(wc)->seq_count); +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + + wc->overwrote_committed = false; + +@@ -756,7 +756,7 @@ static void writecache_flush(struct dm_writecache *wc) + } + + if (need_flush_after_free) +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + } + + static void writecache_flush_work(struct work_struct *work) +@@ -809,7 +809,7 @@ static void writecache_discard(struct dm_writecache *wc, sector_t start, sector_ + } + + if (discarded_something) +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + } + + static bool writecache_wait_for_writeback(struct dm_writecache *wc) +@@ -958,7 +958,7 @@ erase_this: + + if (need_flush) { + writecache_flush_all_metadata(wc); +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + } + + wc_unlock(wc); +@@ -1342,7 +1342,7 @@ static void __writecache_endio_pmem(struct dm_writecache *wc, struct list_head * + wc->writeback_size--; + n_walked++; + if (unlikely(n_walked >= ENDIO_LATENCY)) { +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + wc_unlock(wc); + wc_lock(wc); + n_walked = 0; +@@ -1423,7 +1423,7 @@ pop_from_list: + writecache_wait_for_ios(wc, READ); + } + +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + + wc_unlock(wc); + } +@@ -1766,10 +1766,10 @@ static int init_memory(struct dm_writecache *wc) + write_original_sector_seq_count(wc, &wc->entries[b], -1, -1); + + writecache_flush_all_metadata(wc); +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + pmem_assign(sb(wc)->magic, cpu_to_le32(MEMORY_SUPERBLOCK_MAGIC)); + writecache_flush_region(wc, &sb(wc)->magic, sizeof sb(wc)->magic); +- writecache_commit_flushed(wc); ++ writecache_commit_flushed(wc, false); + + return 0; + } +diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c +index ac1179ca80d9..5205cf9bbfd9 100644 +--- a/drivers/md/dm-zoned-metadata.c ++++ b/drivers/md/dm-zoned-metadata.c +@@ -134,6 +134,7 @@ struct dmz_metadata { + + sector_t zone_bitmap_size; + unsigned int zone_nr_bitmap_blocks; ++ unsigned int zone_bits_per_mblk; + + unsigned int nr_bitmap_blocks; + unsigned int nr_map_blocks; +@@ -1167,7 +1168,10 @@ static int dmz_init_zones(struct dmz_metadata *zmd) + + /* Init */ + zmd->zone_bitmap_size = dev->zone_nr_blocks >> 3; +- zmd->zone_nr_bitmap_blocks = zmd->zone_bitmap_size >> DMZ_BLOCK_SHIFT; ++ zmd->zone_nr_bitmap_blocks = ++ max_t(sector_t, 1, zmd->zone_bitmap_size >> DMZ_BLOCK_SHIFT); ++ zmd->zone_bits_per_mblk = min_t(sector_t, dev->zone_nr_blocks, ++ DMZ_BLOCK_SIZE_BITS); + + /* Allocate zone array */ + zmd->zones = kcalloc(dev->nr_zones, sizeof(struct dm_zone), GFP_KERNEL); +@@ -1991,7 +1995,7 @@ int dmz_copy_valid_blocks(struct dmz_metadata *zmd, struct dm_zone *from_zone, + dmz_release_mblock(zmd, to_mblk); + dmz_release_mblock(zmd, from_mblk); + +- chunk_block += DMZ_BLOCK_SIZE_BITS; ++ chunk_block += zmd->zone_bits_per_mblk; + } + + to_zone->weight = from_zone->weight; +@@ -2052,7 +2056,7 @@ int dmz_validate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone, + + /* Set bits */ + bit = chunk_block & DMZ_BLOCK_MASK_BITS; +- nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); ++ nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); + + count = dmz_set_bits((unsigned long *)mblk->data, bit, nr_bits); + if (count) { +@@ -2131,7 +2135,7 @@ int dmz_invalidate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone, + + /* Clear bits */ + bit = chunk_block & DMZ_BLOCK_MASK_BITS; +- nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); ++ nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); + + count = dmz_clear_bits((unsigned long *)mblk->data, + bit, nr_bits); +@@ -2191,6 +2195,7 @@ static int dmz_to_next_set_block(struct dmz_metadata *zmd, struct dm_zone *zone, + { + struct dmz_mblock *mblk; + unsigned int bit, set_bit, nr_bits; ++ unsigned int zone_bits = zmd->zone_bits_per_mblk; + unsigned long *bitmap; + int n = 0; + +@@ -2205,15 +2210,15 @@ static int dmz_to_next_set_block(struct dmz_metadata *zmd, struct dm_zone *zone, + /* Get offset */ + bitmap = (unsigned long *) mblk->data; + bit = chunk_block & DMZ_BLOCK_MASK_BITS; +- nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); ++ nr_bits = min(nr_blocks, zone_bits - bit); + if (set) +- set_bit = find_next_bit(bitmap, DMZ_BLOCK_SIZE_BITS, bit); ++ set_bit = find_next_bit(bitmap, zone_bits, bit); + else +- set_bit = find_next_zero_bit(bitmap, DMZ_BLOCK_SIZE_BITS, bit); ++ set_bit = find_next_zero_bit(bitmap, zone_bits, bit); + dmz_release_mblock(zmd, mblk); + + n += set_bit - bit; +- if (set_bit < DMZ_BLOCK_SIZE_BITS) ++ if (set_bit < zone_bits) + break; + + nr_blocks -= nr_bits; +@@ -2316,7 +2321,7 @@ static void dmz_get_zone_weight(struct dmz_metadata *zmd, struct dm_zone *zone) + /* Count bits in this block */ + bitmap = mblk->data; + bit = chunk_block & DMZ_BLOCK_MASK_BITS; +- nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); ++ nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); + n += dmz_count_bits(bitmap, bit, nr_bits); + + dmz_release_mblock(zmd, mblk); +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index 1a5e328c443a..6d3cc235f842 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -1880,6 +1880,7 @@ static void dm_init_normal_md_queue(struct mapped_device *md) + /* + * Initialize aspects of queue that aren't relevant for blk-mq + */ ++ md->queue->backing_dev_info->congested_data = md; + md->queue->backing_dev_info->congested_fn = dm_any_congested; + } + +@@ -1970,7 +1971,12 @@ static struct mapped_device *alloc_dev(int minor) + if (!md->queue) + goto bad; + md->queue->queuedata = md; +- md->queue->backing_dev_info->congested_data = md; ++ /* ++ * default to bio-based required ->make_request_fn until DM ++ * table is loaded and md->type established. If request-based ++ * table is loaded: blk-mq will override accordingly. ++ */ ++ blk_queue_make_request(md->queue, dm_make_request); + + md->disk = alloc_disk_node(1, md->numa_node_id); + if (!md->disk) +@@ -2285,7 +2291,6 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t) + case DM_TYPE_DAX_BIO_BASED: + case DM_TYPE_NVME_BIO_BASED: + dm_init_normal_md_queue(md); +- blk_queue_make_request(md->queue, dm_make_request); + break; + case DM_TYPE_NONE: + WARN_ON_ONCE(true); +diff --git a/drivers/md/persistent-data/dm-space-map-common.c b/drivers/md/persistent-data/dm-space-map-common.c +index bd68f6fef694..d8b4125e338c 100644 +--- a/drivers/md/persistent-data/dm-space-map-common.c ++++ b/drivers/md/persistent-data/dm-space-map-common.c +@@ -380,6 +380,33 @@ int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin, + return -ENOSPC; + } + ++int sm_ll_find_common_free_block(struct ll_disk *old_ll, struct ll_disk *new_ll, ++ dm_block_t begin, dm_block_t end, dm_block_t *b) ++{ ++ int r; ++ uint32_t count; ++ ++ do { ++ r = sm_ll_find_free_block(new_ll, begin, new_ll->nr_blocks, b); ++ if (r) ++ break; ++ ++ /* double check this block wasn't used in the old transaction */ ++ if (*b >= old_ll->nr_blocks) ++ count = 0; ++ else { ++ r = sm_ll_lookup(old_ll, *b, &count); ++ if (r) ++ break; ++ ++ if (count) ++ begin = *b + 1; ++ } ++ } while (count); ++ ++ return r; ++} ++ + static int sm_ll_mutate(struct ll_disk *ll, dm_block_t b, + int (*mutator)(void *context, uint32_t old, uint32_t *new), + void *context, enum allocation_event *ev) +diff --git a/drivers/md/persistent-data/dm-space-map-common.h b/drivers/md/persistent-data/dm-space-map-common.h +index b3078d5eda0c..8de63ce39bdd 100644 +--- a/drivers/md/persistent-data/dm-space-map-common.h ++++ b/drivers/md/persistent-data/dm-space-map-common.h +@@ -109,6 +109,8 @@ int sm_ll_lookup_bitmap(struct ll_disk *ll, dm_block_t b, uint32_t *result); + int sm_ll_lookup(struct ll_disk *ll, dm_block_t b, uint32_t *result); + int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin, + dm_block_t end, dm_block_t *result); ++int sm_ll_find_common_free_block(struct ll_disk *old_ll, struct ll_disk *new_ll, ++ dm_block_t begin, dm_block_t end, dm_block_t *result); + int sm_ll_insert(struct ll_disk *ll, dm_block_t b, uint32_t ref_count, enum allocation_event *ev); + int sm_ll_inc(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev); + int sm_ll_dec(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev); +diff --git a/drivers/md/persistent-data/dm-space-map-disk.c b/drivers/md/persistent-data/dm-space-map-disk.c +index 32adf6b4a9c7..bf4c5e2ccb6f 100644 +--- a/drivers/md/persistent-data/dm-space-map-disk.c ++++ b/drivers/md/persistent-data/dm-space-map-disk.c +@@ -167,8 +167,10 @@ static int sm_disk_new_block(struct dm_space_map *sm, dm_block_t *b) + enum allocation_event ev; + struct sm_disk *smd = container_of(sm, struct sm_disk, sm); + +- /* FIXME: we should loop round a couple of times */ +- r = sm_ll_find_free_block(&smd->old_ll, smd->begin, smd->old_ll.nr_blocks, b); ++ /* ++ * Any block we allocate has to be free in both the old and current ll. ++ */ ++ r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, smd->begin, smd->ll.nr_blocks, b); + if (r) + return r; + +diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c +index 25328582cc48..9e3c64ec2026 100644 +--- a/drivers/md/persistent-data/dm-space-map-metadata.c ++++ b/drivers/md/persistent-data/dm-space-map-metadata.c +@@ -448,7 +448,10 @@ static int sm_metadata_new_block_(struct dm_space_map *sm, dm_block_t *b) + enum allocation_event ev; + struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); + +- r = sm_ll_find_free_block(&smm->old_ll, smm->begin, smm->old_ll.nr_blocks, b); ++ /* ++ * Any block we allocate has to be free in both the old and current ll. ++ */ ++ r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, smm->begin, smm->ll.nr_blocks, b); + if (r) + return r; + +diff --git a/drivers/media/rc/iguanair.c b/drivers/media/rc/iguanair.c +index 872d6441e512..a7deca1fefb7 100644 +--- a/drivers/media/rc/iguanair.c ++++ b/drivers/media/rc/iguanair.c +@@ -413,7 +413,7 @@ static int iguanair_probe(struct usb_interface *intf, + int ret, pipein, pipeout; + struct usb_host_interface *idesc; + +- idesc = intf->altsetting; ++ idesc = intf->cur_altsetting; + if (idesc->desc.bNumEndpoints < 2) + return -ENODEV; + +diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c +index 7741151606ef..6f80c251f641 100644 +--- a/drivers/media/rc/rc-main.c ++++ b/drivers/media/rc/rc-main.c +@@ -1891,23 +1891,28 @@ int rc_register_device(struct rc_dev *dev) + + dev->registered = true; + +- if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { +- rc = rc_setup_rx_device(dev); +- if (rc) +- goto out_dev; +- } +- +- /* Ensure that the lirc kfifo is setup before we start the thread */ ++ /* ++ * once the the input device is registered in rc_setup_rx_device, ++ * userspace can open the input device and rc_open() will be called ++ * as a result. This results in driver code being allowed to submit ++ * keycodes with rc_keydown, so lirc must be registered first. ++ */ + if (dev->allowed_protocols != RC_PROTO_BIT_CEC) { + rc = ir_lirc_register(dev); + if (rc < 0) +- goto out_rx; ++ goto out_dev; ++ } ++ ++ if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { ++ rc = rc_setup_rx_device(dev); ++ if (rc) ++ goto out_lirc; + } + + if (dev->driver_type == RC_DRIVER_IR_RAW) { + rc = ir_raw_event_register(dev); + if (rc < 0) +- goto out_lirc; ++ goto out_rx; + } + + dev_dbg(&dev->dev, "Registered rc%u (driver: %s)\n", dev->minor, +@@ -1915,11 +1920,11 @@ int rc_register_device(struct rc_dev *dev) + + return 0; + ++out_rx: ++ rc_free_rx_device(dev); + out_lirc: + if (dev->allowed_protocols != RC_PROTO_BIT_CEC) + ir_lirc_unregister(dev); +-out_rx: +- rc_free_rx_device(dev); + out_dev: + device_del(&dev->dev); + out_rx_free: +diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c +index 428235ca2635..2b688cc39bb8 100644 +--- a/drivers/media/usb/uvc/uvc_driver.c ++++ b/drivers/media/usb/uvc/uvc_driver.c +@@ -1493,6 +1493,11 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, + break; + if (forward == prev) + continue; ++ if (forward->chain.next || forward->chain.prev) { ++ uvc_trace(UVC_TRACE_DESCR, "Found reference to " ++ "entity %d already in chain.\n", forward->id); ++ return -EINVAL; ++ } + + switch (UVC_ENTITY_TYPE(forward)) { + case UVC_VC_EXTENSION_UNIT: +@@ -1574,6 +1579,13 @@ static int uvc_scan_chain_backward(struct uvc_video_chain *chain, + return -1; + } + ++ if (term->chain.next || term->chain.prev) { ++ uvc_trace(UVC_TRACE_DESCR, "Found reference to " ++ "entity %d already in chain.\n", ++ term->id); ++ return -EINVAL; ++ } ++ + if (uvc_trace_param & UVC_TRACE_PROBE) + printk(KERN_CONT " %d", term->id); + +diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +index e1eaf1135c7f..7ad6db8dd9f6 100644 +--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c ++++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +@@ -1183,36 +1183,38 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + u32 aux_space; + int compatible_arg = 1; + long err = 0; ++ unsigned int ncmd; + + /* + * 1. When struct size is different, converts the command. + */ + switch (cmd) { +- case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break; +- case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break; +- case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break; +- case VIDIOC_G_FBUF32: cmd = VIDIOC_G_FBUF; break; +- case VIDIOC_S_FBUF32: cmd = VIDIOC_S_FBUF; break; +- case VIDIOC_QBUF32: cmd = VIDIOC_QBUF; break; +- case VIDIOC_DQBUF32: cmd = VIDIOC_DQBUF; break; +- case VIDIOC_ENUMSTD32: cmd = VIDIOC_ENUMSTD; break; +- case VIDIOC_ENUMINPUT32: cmd = VIDIOC_ENUMINPUT; break; +- case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; +- case VIDIOC_G_EXT_CTRLS32: cmd = VIDIOC_G_EXT_CTRLS; break; +- case VIDIOC_S_EXT_CTRLS32: cmd = VIDIOC_S_EXT_CTRLS; break; +- case VIDIOC_TRY_EXT_CTRLS32: cmd = VIDIOC_TRY_EXT_CTRLS; break; +- case VIDIOC_DQEVENT32: cmd = VIDIOC_DQEVENT; break; +- case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break; +- case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break; +- case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break; +- case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; +- case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; +- case VIDIOC_G_OUTPUT32: cmd = VIDIOC_G_OUTPUT; break; +- case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break; +- case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break; +- case VIDIOC_PREPARE_BUF32: cmd = VIDIOC_PREPARE_BUF; break; +- case VIDIOC_G_EDID32: cmd = VIDIOC_G_EDID; break; +- case VIDIOC_S_EDID32: cmd = VIDIOC_S_EDID; break; ++ case VIDIOC_G_FMT32: ncmd = VIDIOC_G_FMT; break; ++ case VIDIOC_S_FMT32: ncmd = VIDIOC_S_FMT; break; ++ case VIDIOC_QUERYBUF32: ncmd = VIDIOC_QUERYBUF; break; ++ case VIDIOC_G_FBUF32: ncmd = VIDIOC_G_FBUF; break; ++ case VIDIOC_S_FBUF32: ncmd = VIDIOC_S_FBUF; break; ++ case VIDIOC_QBUF32: ncmd = VIDIOC_QBUF; break; ++ case VIDIOC_DQBUF32: ncmd = VIDIOC_DQBUF; break; ++ case VIDIOC_ENUMSTD32: ncmd = VIDIOC_ENUMSTD; break; ++ case VIDIOC_ENUMINPUT32: ncmd = VIDIOC_ENUMINPUT; break; ++ case VIDIOC_TRY_FMT32: ncmd = VIDIOC_TRY_FMT; break; ++ case VIDIOC_G_EXT_CTRLS32: ncmd = VIDIOC_G_EXT_CTRLS; break; ++ case VIDIOC_S_EXT_CTRLS32: ncmd = VIDIOC_S_EXT_CTRLS; break; ++ case VIDIOC_TRY_EXT_CTRLS32: ncmd = VIDIOC_TRY_EXT_CTRLS; break; ++ case VIDIOC_DQEVENT32: ncmd = VIDIOC_DQEVENT; break; ++ case VIDIOC_OVERLAY32: ncmd = VIDIOC_OVERLAY; break; ++ case VIDIOC_STREAMON32: ncmd = VIDIOC_STREAMON; break; ++ case VIDIOC_STREAMOFF32: ncmd = VIDIOC_STREAMOFF; break; ++ case VIDIOC_G_INPUT32: ncmd = VIDIOC_G_INPUT; break; ++ case VIDIOC_S_INPUT32: ncmd = VIDIOC_S_INPUT; break; ++ case VIDIOC_G_OUTPUT32: ncmd = VIDIOC_G_OUTPUT; break; ++ case VIDIOC_S_OUTPUT32: ncmd = VIDIOC_S_OUTPUT; break; ++ case VIDIOC_CREATE_BUFS32: ncmd = VIDIOC_CREATE_BUFS; break; ++ case VIDIOC_PREPARE_BUF32: ncmd = VIDIOC_PREPARE_BUF; break; ++ case VIDIOC_G_EDID32: ncmd = VIDIOC_G_EDID; break; ++ case VIDIOC_S_EDID32: ncmd = VIDIOC_S_EDID; break; ++ default: ncmd = cmd; break; + } + + /* +@@ -1221,11 +1223,11 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + * argument into it. + */ + switch (cmd) { +- case VIDIOC_OVERLAY: +- case VIDIOC_STREAMON: +- case VIDIOC_STREAMOFF: +- case VIDIOC_S_INPUT: +- case VIDIOC_S_OUTPUT: ++ case VIDIOC_OVERLAY32: ++ case VIDIOC_STREAMON32: ++ case VIDIOC_STREAMOFF32: ++ case VIDIOC_S_INPUT32: ++ case VIDIOC_S_OUTPUT32: + err = alloc_userspace(sizeof(unsigned int), 0, &new_p64); + if (!err && assign_in_user((unsigned int __user *)new_p64, + (compat_uint_t __user *)p32)) +@@ -1233,23 +1235,23 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_G_INPUT: +- case VIDIOC_G_OUTPUT: ++ case VIDIOC_G_INPUT32: ++ case VIDIOC_G_OUTPUT32: + err = alloc_userspace(sizeof(unsigned int), 0, &new_p64); + compatible_arg = 0; + break; + +- case VIDIOC_G_EDID: +- case VIDIOC_S_EDID: ++ case VIDIOC_G_EDID32: ++ case VIDIOC_S_EDID32: + err = alloc_userspace(sizeof(struct v4l2_edid), 0, &new_p64); + if (!err) + err = get_v4l2_edid32(new_p64, p32); + compatible_arg = 0; + break; + +- case VIDIOC_G_FMT: +- case VIDIOC_S_FMT: +- case VIDIOC_TRY_FMT: ++ case VIDIOC_G_FMT32: ++ case VIDIOC_S_FMT32: ++ case VIDIOC_TRY_FMT32: + err = bufsize_v4l2_format(p32, &aux_space); + if (!err) + err = alloc_userspace(sizeof(struct v4l2_format), +@@ -1262,7 +1264,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_CREATE_BUFS: ++ case VIDIOC_CREATE_BUFS32: + err = bufsize_v4l2_create(p32, &aux_space); + if (!err) + err = alloc_userspace(sizeof(struct v4l2_create_buffers), +@@ -1275,10 +1277,10 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_PREPARE_BUF: +- case VIDIOC_QUERYBUF: +- case VIDIOC_QBUF: +- case VIDIOC_DQBUF: ++ case VIDIOC_PREPARE_BUF32: ++ case VIDIOC_QUERYBUF32: ++ case VIDIOC_QBUF32: ++ case VIDIOC_DQBUF32: + err = bufsize_v4l2_buffer(p32, &aux_space); + if (!err) + err = alloc_userspace(sizeof(struct v4l2_buffer), +@@ -1291,7 +1293,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_S_FBUF: ++ case VIDIOC_S_FBUF32: + err = alloc_userspace(sizeof(struct v4l2_framebuffer), 0, + &new_p64); + if (!err) +@@ -1299,13 +1301,13 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_G_FBUF: ++ case VIDIOC_G_FBUF32: + err = alloc_userspace(sizeof(struct v4l2_framebuffer), 0, + &new_p64); + compatible_arg = 0; + break; + +- case VIDIOC_ENUMSTD: ++ case VIDIOC_ENUMSTD32: + err = alloc_userspace(sizeof(struct v4l2_standard), 0, + &new_p64); + if (!err) +@@ -1313,16 +1315,16 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + compatible_arg = 0; + break; + +- case VIDIOC_ENUMINPUT: ++ case VIDIOC_ENUMINPUT32: + err = alloc_userspace(sizeof(struct v4l2_input), 0, &new_p64); + if (!err) + err = get_v4l2_input32(new_p64, p32); + compatible_arg = 0; + break; + +- case VIDIOC_G_EXT_CTRLS: +- case VIDIOC_S_EXT_CTRLS: +- case VIDIOC_TRY_EXT_CTRLS: ++ case VIDIOC_G_EXT_CTRLS32: ++ case VIDIOC_S_EXT_CTRLS32: ++ case VIDIOC_TRY_EXT_CTRLS32: + err = bufsize_v4l2_ext_controls(p32, &aux_space); + if (!err) + err = alloc_userspace(sizeof(struct v4l2_ext_controls), +@@ -1334,7 +1336,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + } + compatible_arg = 0; + break; +- case VIDIOC_DQEVENT: ++ case VIDIOC_DQEVENT32: + err = alloc_userspace(sizeof(struct v4l2_event), 0, &new_p64); + compatible_arg = 0; + break; +@@ -1352,9 +1354,9 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + * Otherwise, it will pass the newly allocated @new_p64 argument. + */ + if (compatible_arg) +- err = native_ioctl(file, cmd, (unsigned long)p32); ++ err = native_ioctl(file, ncmd, (unsigned long)p32); + else +- err = native_ioctl(file, cmd, (unsigned long)new_p64); ++ err = native_ioctl(file, ncmd, (unsigned long)new_p64); + + if (err == -ENOTTY) + return err; +@@ -1370,13 +1372,13 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + * the blocks to maximum allowed value. + */ + switch (cmd) { +- case VIDIOC_G_EXT_CTRLS: +- case VIDIOC_S_EXT_CTRLS: +- case VIDIOC_TRY_EXT_CTRLS: ++ case VIDIOC_G_EXT_CTRLS32: ++ case VIDIOC_S_EXT_CTRLS32: ++ case VIDIOC_TRY_EXT_CTRLS32: + if (put_v4l2_ext_controls32(file, new_p64, p32)) + err = -EFAULT; + break; +- case VIDIOC_S_EDID: ++ case VIDIOC_S_EDID32: + if (put_v4l2_edid32(new_p64, p32)) + err = -EFAULT; + break; +@@ -1389,49 +1391,49 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar + * the original 32 bits structure. + */ + switch (cmd) { +- case VIDIOC_S_INPUT: +- case VIDIOC_S_OUTPUT: +- case VIDIOC_G_INPUT: +- case VIDIOC_G_OUTPUT: ++ case VIDIOC_S_INPUT32: ++ case VIDIOC_S_OUTPUT32: ++ case VIDIOC_G_INPUT32: ++ case VIDIOC_G_OUTPUT32: + if (assign_in_user((compat_uint_t __user *)p32, + ((unsigned int __user *)new_p64))) + err = -EFAULT; + break; + +- case VIDIOC_G_FBUF: ++ case VIDIOC_G_FBUF32: + err = put_v4l2_framebuffer32(new_p64, p32); + break; + +- case VIDIOC_DQEVENT: ++ case VIDIOC_DQEVENT32: + err = put_v4l2_event32(new_p64, p32); + break; + +- case VIDIOC_G_EDID: ++ case VIDIOC_G_EDID32: + err = put_v4l2_edid32(new_p64, p32); + break; + +- case VIDIOC_G_FMT: +- case VIDIOC_S_FMT: +- case VIDIOC_TRY_FMT: ++ case VIDIOC_G_FMT32: ++ case VIDIOC_S_FMT32: ++ case VIDIOC_TRY_FMT32: + err = put_v4l2_format32(new_p64, p32); + break; + +- case VIDIOC_CREATE_BUFS: ++ case VIDIOC_CREATE_BUFS32: + err = put_v4l2_create32(new_p64, p32); + break; + +- case VIDIOC_PREPARE_BUF: +- case VIDIOC_QUERYBUF: +- case VIDIOC_QBUF: +- case VIDIOC_DQBUF: ++ case VIDIOC_PREPARE_BUF32: ++ case VIDIOC_QUERYBUF32: ++ case VIDIOC_QBUF32: ++ case VIDIOC_DQBUF32: + err = put_v4l2_buffer32(new_p64, p32); + break; + +- case VIDIOC_ENUMSTD: ++ case VIDIOC_ENUMSTD32: + err = put_v4l2_standard32(new_p64, p32); + break; + +- case VIDIOC_ENUMINPUT: ++ case VIDIOC_ENUMINPUT32: + err = put_v4l2_input32(new_p64, p32); + break; + } +diff --git a/drivers/media/v4l2-core/videobuf-dma-sg.c b/drivers/media/v4l2-core/videobuf-dma-sg.c +index 66a6c6c236a7..28262190c3ab 100644 +--- a/drivers/media/v4l2-core/videobuf-dma-sg.c ++++ b/drivers/media/v4l2-core/videobuf-dma-sg.c +@@ -349,8 +349,11 @@ int videobuf_dma_free(struct videobuf_dmabuf *dma) + BUG_ON(dma->sglen); + + if (dma->pages) { +- for (i = 0; i < dma->nr_pages; i++) ++ for (i = 0; i < dma->nr_pages; i++) { ++ if (dma->direction == DMA_FROM_DEVICE) ++ set_page_dirty_lock(dma->pages[i]); + put_page(dma->pages[i]); ++ } + kfree(dma->pages); + dma->pages = NULL; + } +diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c +index a4aaadaa0cb0..aa59496e4376 100644 +--- a/drivers/mfd/axp20x.c ++++ b/drivers/mfd/axp20x.c +@@ -126,7 +126,7 @@ static const struct regmap_range axp288_writeable_ranges[] = { + static const struct regmap_range axp288_volatile_ranges[] = { + regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP288_POWER_REASON), + regmap_reg_range(AXP288_BC_GLOBAL, AXP288_BC_GLOBAL), +- regmap_reg_range(AXP288_BC_DET_STAT, AXP288_BC_DET_STAT), ++ regmap_reg_range(AXP288_BC_DET_STAT, AXP20X_VBUS_IPSOUT_MGMT), + regmap_reg_range(AXP20X_CHRG_BAK_CTRL, AXP20X_CHRG_BAK_CTRL), + regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IPSOUT_V_HIGH_L), + regmap_reg_range(AXP20X_TIMER_CTRL, AXP20X_TIMER_CTRL), +diff --git a/drivers/mfd/da9062-core.c b/drivers/mfd/da9062-core.c +index e69626867c26..9143de7b77b8 100644 +--- a/drivers/mfd/da9062-core.c ++++ b/drivers/mfd/da9062-core.c +@@ -248,7 +248,7 @@ static const struct mfd_cell da9062_devs[] = { + .name = "da9062-watchdog", + .num_resources = ARRAY_SIZE(da9062_wdt_resources), + .resources = da9062_wdt_resources, +- .of_compatible = "dlg,da9062-wdt", ++ .of_compatible = "dlg,da9062-watchdog", + }, + { + .name = "da9062-thermal", +diff --git a/drivers/mfd/dln2.c b/drivers/mfd/dln2.c +index 381593fbe50f..7841c11411d0 100644 +--- a/drivers/mfd/dln2.c ++++ b/drivers/mfd/dln2.c +@@ -722,6 +722,8 @@ static int dln2_probe(struct usb_interface *interface, + const struct usb_device_id *usb_id) + { + struct usb_host_interface *hostif = interface->cur_altsetting; ++ struct usb_endpoint_descriptor *epin; ++ struct usb_endpoint_descriptor *epout; + struct device *dev = &interface->dev; + struct dln2_dev *dln2; + int ret; +@@ -731,12 +733,19 @@ static int dln2_probe(struct usb_interface *interface, + hostif->desc.bNumEndpoints < 2) + return -ENODEV; + ++ epin = &hostif->endpoint[0].desc; ++ epout = &hostif->endpoint[1].desc; ++ if (!usb_endpoint_is_bulk_out(epout)) ++ return -ENODEV; ++ if (!usb_endpoint_is_bulk_in(epin)) ++ return -ENODEV; ++ + dln2 = kzalloc(sizeof(*dln2), GFP_KERNEL); + if (!dln2) + return -ENOMEM; + +- dln2->ep_out = hostif->endpoint[0].desc.bEndpointAddress; +- dln2->ep_in = hostif->endpoint[1].desc.bEndpointAddress; ++ dln2->ep_out = epout->bEndpointAddress; ++ dln2->ep_in = epin->bEndpointAddress; + dln2->usb_dev = usb_get_dev(interface_to_usbdev(interface)); + dln2->interface = interface; + usb_set_intfdata(interface, dln2); +diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c +index da5cd9c92a59..ead2e79036a9 100644 +--- a/drivers/mfd/rn5t618.c ++++ b/drivers/mfd/rn5t618.c +@@ -26,6 +26,7 @@ static bool rn5t618_volatile_reg(struct device *dev, unsigned int reg) + case RN5T618_WATCHDOGCNT: + case RN5T618_DCIRQ: + case RN5T618_ILIMDATAH ... RN5T618_AIN0DATAL: ++ case RN5T618_ADCCNT3: + case RN5T618_IR_ADC1 ... RN5T618_IR_ADC3: + case RN5T618_IR_GPR: + case RN5T618_IR_GPF: +diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c +index 66e354d51ee9..7083d8ddd495 100644 +--- a/drivers/mmc/host/mmc_spi.c ++++ b/drivers/mmc/host/mmc_spi.c +@@ -1134,17 +1134,22 @@ static void mmc_spi_initsequence(struct mmc_spi_host *host) + * SPI protocol. Another is that when chipselect is released while + * the card returns BUSY status, the clock must issue several cycles + * with chipselect high before the card will stop driving its output. ++ * ++ * SPI_CS_HIGH means "asserted" here. In some cases like when using ++ * GPIOs for chip select, SPI_CS_HIGH is set but this will be logically ++ * inverted by gpiolib, so if we want to ascertain to drive it high ++ * we should toggle the default with an XOR as we do here. + */ +- host->spi->mode |= SPI_CS_HIGH; ++ host->spi->mode ^= SPI_CS_HIGH; + if (spi_setup(host->spi) != 0) { + /* Just warn; most cards work without it. */ + dev_warn(&host->spi->dev, + "can't change chip-select polarity\n"); +- host->spi->mode &= ~SPI_CS_HIGH; ++ host->spi->mode ^= SPI_CS_HIGH; + } else { + mmc_spi_readbytes(host, 18); + +- host->spi->mode &= ~SPI_CS_HIGH; ++ host->spi->mode ^= SPI_CS_HIGH; + if (spi_setup(host->spi) != 0) { + /* Wot, we can't get the same setup we had before? */ + dev_err(&host->spi->dev, +diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c +index 0ae986c42bc8..9378d5dc86c8 100644 +--- a/drivers/mmc/host/sdhci-of-at91.c ++++ b/drivers/mmc/host/sdhci-of-at91.c +@@ -324,19 +324,22 @@ static int sdhci_at91_probe(struct platform_device *pdev) + priv->mainck = devm_clk_get(&pdev->dev, "baseclk"); + if (IS_ERR(priv->mainck)) { + dev_err(&pdev->dev, "failed to get baseclk\n"); +- return PTR_ERR(priv->mainck); ++ ret = PTR_ERR(priv->mainck); ++ goto sdhci_pltfm_free; + } + + priv->hclock = devm_clk_get(&pdev->dev, "hclock"); + if (IS_ERR(priv->hclock)) { + dev_err(&pdev->dev, "failed to get hclock\n"); +- return PTR_ERR(priv->hclock); ++ ret = PTR_ERR(priv->hclock); ++ goto sdhci_pltfm_free; + } + + priv->gck = devm_clk_get(&pdev->dev, "multclk"); + if (IS_ERR(priv->gck)) { + dev_err(&pdev->dev, "failed to get multclk\n"); +- return PTR_ERR(priv->gck); ++ ret = PTR_ERR(priv->gck); ++ goto sdhci_pltfm_free; + } + + ret = sdhci_at91_set_clks_presets(&pdev->dev); +diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c +index c9ea365c248c..5091e2c1c0e5 100644 +--- a/drivers/mmc/host/sdhci-pci-core.c ++++ b/drivers/mmc/host/sdhci-pci-core.c +@@ -1604,7 +1604,7 @@ static u32 sdhci_read_present_state(struct sdhci_host *host) + return sdhci_readl(host, SDHCI_PRESENT_STATE); + } + +-void amd_sdhci_reset(struct sdhci_host *host, u8 mask) ++static void amd_sdhci_reset(struct sdhci_host *host, u8 mask) + { + struct sdhci_pci_slot *slot = sdhci_priv(host); + struct pci_dev *pdev = slot->chip->pdev; +diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c +index 309c808351ac..f417fb680cd8 100644 +--- a/drivers/mtd/spi-nor/spi-nor.c ++++ b/drivers/mtd/spi-nor/spi-nor.c +@@ -2310,15 +2310,16 @@ static const struct flash_info spi_nor_ids[] = { + { "n25q256a", INFO(0x20ba19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { "n25q256ax1", INFO(0x20bb19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ) }, + { "n25q512ax3", INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) }, ++ { "mt25qu512a", INFO6(0x20bb20, 0x104400, 64 * 1024, 1024, ++ SECT_4K | USE_FSR | SPI_NOR_DUAL_READ | ++ SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, ++ { "n25q512a", INFO(0x20bb20, 0, 64 * 1024, 1024, SECT_4K | ++ SPI_NOR_QUAD_READ) }, + { "n25q00", INFO(0x20ba21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, + { "n25q00a", INFO(0x20bb21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, + { "mt25ql02g", INFO(0x20ba22, 0, 64 * 1024, 4096, + SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | + NO_CHIP_ERASE) }, +- { "mt25qu512a (n25q512a)", INFO(0x20bb20, 0, 64 * 1024, 1024, +- SECT_4K | USE_FSR | SPI_NOR_DUAL_READ | +- SPI_NOR_QUAD_READ | +- SPI_NOR_4B_OPCODES) }, + { "mt25qu02g", INFO(0x20bb22, 0, 64 * 1024, 4096, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, + + /* Micron */ +diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c +index 30621c67721a..604772fc4a96 100644 +--- a/drivers/mtd/ubi/fastmap.c ++++ b/drivers/mtd/ubi/fastmap.c +@@ -64,7 +64,7 @@ static int self_check_seen(struct ubi_device *ubi, unsigned long *seen) + return 0; + + for (pnum = 0; pnum < ubi->peb_count; pnum++) { +- if (test_bit(pnum, seen) && ubi->lookuptbl[pnum]) { ++ if (!test_bit(pnum, seen) && ubi->lookuptbl[pnum]) { + ubi_err(ubi, "self-check failed for PEB %d, fastmap didn't see it", pnum); + ret = -EINVAL; + } +@@ -1137,7 +1137,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + struct rb_node *tmp_rb; + int ret, i, j, free_peb_count, used_peb_count, vol_count; + int scrub_peb_count, erase_peb_count; +- unsigned long *seen_pebs = NULL; ++ unsigned long *seen_pebs; + + fm_raw = ubi->fm_buf; + memset(ubi->fm_buf, 0, ubi->fm_size); +@@ -1151,7 +1151,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + dvbuf = new_fm_vbuf(ubi, UBI_FM_DATA_VOLUME_ID); + if (!dvbuf) { + ret = -ENOMEM; +- goto out_kfree; ++ goto out_free_avbuf; + } + + avhdr = ubi_get_vid_hdr(avbuf); +@@ -1160,7 +1160,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + seen_pebs = init_seen(ubi); + if (IS_ERR(seen_pebs)) { + ret = PTR_ERR(seen_pebs); +- goto out_kfree; ++ goto out_free_dvbuf; + } + + spin_lock(&ubi->volumes_lock); +@@ -1328,7 +1328,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + ret = ubi_io_write_vid_hdr(ubi, new_fm->e[0]->pnum, avbuf); + if (ret) { + ubi_err(ubi, "unable to write vid_hdr to fastmap SB!"); +- goto out_kfree; ++ goto out_free_seen; + } + + for (i = 0; i < new_fm->used_blocks; i++) { +@@ -1350,7 +1350,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + if (ret) { + ubi_err(ubi, "unable to write vid_hdr to PEB %i!", + new_fm->e[i]->pnum); +- goto out_kfree; ++ goto out_free_seen; + } + } + +@@ -1360,7 +1360,7 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + if (ret) { + ubi_err(ubi, "unable to write fastmap to PEB %i!", + new_fm->e[i]->pnum); +- goto out_kfree; ++ goto out_free_seen; + } + } + +@@ -1370,10 +1370,13 @@ static int ubi_write_fastmap(struct ubi_device *ubi, + ret = self_check_seen(ubi, seen_pebs); + dbg_bld("fastmap written!"); + +-out_kfree: +- ubi_free_vid_buf(avbuf); +- ubi_free_vid_buf(dvbuf); ++out_free_seen: + free_seen(seen_pebs); ++out_free_dvbuf: ++ ubi_free_vid_buf(dvbuf); ++out_free_avbuf: ++ ubi_free_vid_buf(avbuf); ++ + out: + return ret; + } +diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c +index 4f2e6910c623..1cc2cd894f87 100644 +--- a/drivers/net/bonding/bond_alb.c ++++ b/drivers/net/bonding/bond_alb.c +@@ -1383,26 +1383,31 @@ netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) + bool do_tx_balance = true; + u32 hash_index = 0; + const u8 *hash_start = NULL; +- struct ipv6hdr *ip6hdr; + + skb_reset_mac_header(skb); + eth_data = eth_hdr(skb); + + switch (ntohs(skb->protocol)) { + case ETH_P_IP: { +- const struct iphdr *iph = ip_hdr(skb); ++ const struct iphdr *iph; + + if (is_broadcast_ether_addr(eth_data->h_dest) || +- iph->daddr == ip_bcast || +- iph->protocol == IPPROTO_IGMP) { ++ !pskb_network_may_pull(skb, sizeof(*iph))) { ++ do_tx_balance = false; ++ break; ++ } ++ iph = ip_hdr(skb); ++ if (iph->daddr == ip_bcast || iph->protocol == IPPROTO_IGMP) { + do_tx_balance = false; + break; + } + hash_start = (char *)&(iph->daddr); + hash_size = sizeof(iph->daddr); +- } + break; +- case ETH_P_IPV6: ++ } ++ case ETH_P_IPV6: { ++ const struct ipv6hdr *ip6hdr; ++ + /* IPv6 doesn't really use broadcast mac address, but leave + * that here just in case. + */ +@@ -1419,7 +1424,11 @@ netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) + break; + } + +- /* Additianally, DAD probes should not be tx-balanced as that ++ if (!pskb_network_may_pull(skb, sizeof(*ip6hdr))) { ++ do_tx_balance = false; ++ break; ++ } ++ /* Additionally, DAD probes should not be tx-balanced as that + * will lead to false positives for duplicate addresses and + * prevent address configuration from working. + */ +@@ -1429,17 +1438,26 @@ netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) + break; + } + +- hash_start = (char *)&(ipv6_hdr(skb)->daddr); +- hash_size = sizeof(ipv6_hdr(skb)->daddr); ++ hash_start = (char *)&ip6hdr->daddr; ++ hash_size = sizeof(ip6hdr->daddr); + break; +- case ETH_P_IPX: +- if (ipx_hdr(skb)->ipx_checksum != IPX_NO_CHECKSUM) { ++ } ++ case ETH_P_IPX: { ++ const struct ipxhdr *ipxhdr; ++ ++ if (pskb_network_may_pull(skb, sizeof(*ipxhdr))) { ++ do_tx_balance = false; ++ break; ++ } ++ ipxhdr = (struct ipxhdr *)skb_network_header(skb); ++ ++ if (ipxhdr->ipx_checksum != IPX_NO_CHECKSUM) { + /* something is wrong with this packet */ + do_tx_balance = false; + break; + } + +- if (ipx_hdr(skb)->ipx_type != IPX_TYPE_NCP) { ++ if (ipxhdr->ipx_type != IPX_TYPE_NCP) { + /* The only protocol worth balancing in + * this family since it has an "ARP" like + * mechanism +@@ -1448,9 +1466,11 @@ netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) + break; + } + ++ eth_data = eth_hdr(skb); + hash_start = (char *)eth_data->h_dest; + hash_size = ETH_ALEN; + break; ++ } + case ETH_P_ARP: + do_tx_balance = false; + if (bond_info->rlb_enabled) +diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c +index a7132c1593c3..7ed667b304d1 100644 +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -680,7 +680,7 @@ int b53_configure_vlan(struct dsa_switch *ds) + b53_do_vlan_op(dev, VTA_CMD_CLEAR); + } + +- b53_enable_vlan(dev, false, ds->vlan_filtering); ++ b53_enable_vlan(dev, dev->vlan_enabled, ds->vlan_filtering); + + b53_for_each_port(dev, i) + b53_write16(dev, B53_VLAN_PAGE, +diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c +index 47b21096b577..fecd5e674e04 100644 +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -68,7 +68,9 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) + + /* Force link status for IMP port */ + reg = core_readl(priv, offset); +- reg |= (MII_SW_OR | LINK_STS | GMII_SPEED_UP_2G); ++ reg |= (MII_SW_OR | LINK_STS); ++ if (priv->type == BCM7278_DEVICE_ID) ++ reg |= GMII_SPEED_UP_2G; + core_writel(priv, reg, offset); + + /* Enable Broadcast, Multicast, Unicast forwarding to IMP port */ +diff --git a/drivers/net/dsa/microchip/ksz9477_spi.c b/drivers/net/dsa/microchip/ksz9477_spi.c +index c5f64959a184..1142768969c2 100644 +--- a/drivers/net/dsa/microchip/ksz9477_spi.c ++++ b/drivers/net/dsa/microchip/ksz9477_spi.c +@@ -101,6 +101,12 @@ static struct spi_driver ksz9477_spi_driver = { + + module_spi_driver(ksz9477_spi_driver); + ++MODULE_ALIAS("spi:ksz9477"); ++MODULE_ALIAS("spi:ksz9897"); ++MODULE_ALIAS("spi:ksz9893"); ++MODULE_ALIAS("spi:ksz9563"); ++MODULE_ALIAS("spi:ksz8563"); ++MODULE_ALIAS("spi:ksz9567"); + MODULE_AUTHOR("Woojung Huh "); + MODULE_DESCRIPTION("Microchip KSZ9477 Series Switch SPI access Driver"); + MODULE_LICENSE("GPL"); +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c +index b4c664957266..4a27577e137b 100644 +--- a/drivers/net/ethernet/broadcom/bcmsysport.c ++++ b/drivers/net/ethernet/broadcom/bcmsysport.c +@@ -2728,6 +2728,9 @@ static int __maybe_unused bcm_sysport_resume(struct device *d) + + umac_reset(priv); + ++ /* Disable the UniMAC RX/TX */ ++ umac_enable_set(priv, CMD_RX_EN | CMD_TX_EN, 0); ++ + /* We may have been suspended and never received a WOL event that + * would turn off MPD detection, take care of that now + */ +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index cf292f7c3d3c..41297533b4a8 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -7873,7 +7873,7 @@ static void bnxt_setup_msix(struct bnxt *bp) + int tcs, i; + + tcs = netdev_get_num_tc(dev); +- if (tcs > 1) { ++ if (tcs) { + int i, off, count; + + for (i = 0; i < tcs; i++) { +@@ -9273,10 +9273,6 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init, + bnxt_debug_dev_exit(bp); + bnxt_disable_napi(bp); + del_timer_sync(&bp->timer); +- if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state) && +- pci_is_enabled(bp->pdev)) +- pci_disable_device(bp->pdev); +- + bnxt_free_skbs(bp); + + /* Save ring stats before shutdown */ +@@ -10052,8 +10048,15 @@ static void bnxt_fw_reset_close(struct bnxt *bp) + { + __bnxt_close_nic(bp, true, false); + bnxt_ulp_irq_stop(bp); ++ /* When firmware is fatal state, disable PCI device to prevent ++ * any potential bad DMAs before freeing kernel memory. ++ */ ++ if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state)) ++ pci_disable_device(bp->pdev); + bnxt_clear_int_mode(bp); + bnxt_hwrm_func_drv_unrgtr(bp); ++ if (pci_is_enabled(bp->pdev)) ++ pci_disable_device(bp->pdev); + bnxt_free_ctx_mem(bp); + kfree(bp->ctx); + bp->ctx = NULL; +@@ -11359,9 +11362,9 @@ static void bnxt_remove_one(struct pci_dev *pdev) + bnxt_sriov_disable(bp); + + bnxt_dl_fw_reporters_destroy(bp, true); +- bnxt_dl_unregister(bp); + pci_disable_pcie_error_reporting(pdev); + unregister_netdev(dev); ++ bnxt_dl_unregister(bp); + bnxt_shutdown_tc(bp); + bnxt_cancel_sp_work(bp); + bp->sp_event = 0; +@@ -11850,11 +11853,14 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + bnxt_init_tc(bp); + } + ++ bnxt_dl_register(bp); ++ + rc = register_netdev(dev); + if (rc) +- goto init_err_cleanup_tc; ++ goto init_err_cleanup; + +- bnxt_dl_register(bp); ++ if (BNXT_PF(bp)) ++ devlink_port_type_eth_set(&bp->dl_port, bp->dev); + bnxt_dl_fw_reporters_create(bp); + + netdev_info(dev, "%s found at mem %lx, node addr %pM\n", +@@ -11864,7 +11870,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + + return 0; + +-init_err_cleanup_tc: ++init_err_cleanup: ++ bnxt_dl_unregister(bp); + bnxt_shutdown_tc(bp); + bnxt_clear_int_mode(bp); + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +index 1e236e74ff2f..2d817ba0602c 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +@@ -482,7 +482,6 @@ int bnxt_dl_register(struct bnxt *bp) + netdev_err(bp->dev, "devlink_port_register failed"); + goto err_dl_param_unreg; + } +- devlink_port_type_eth_set(&bp->dl_port, bp->dev); + + rc = devlink_port_params_register(&bp->dl_port, bnxt_dl_port_params, + ARRAY_SIZE(bnxt_dl_port_params)); +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index f496b248bda3..95a94507cec1 100644 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -73,7 +73,11 @@ struct sifive_fu540_macb_mgmt { + /* Max length of transmit frame must be a multiple of 8 bytes */ + #define MACB_TX_LEN_ALIGN 8 + #define MACB_MAX_TX_LEN ((unsigned int)((1 << MACB_TX_FRMLEN_SIZE) - 1) & ~((unsigned int)(MACB_TX_LEN_ALIGN - 1))) +-#define GEM_MAX_TX_LEN ((unsigned int)((1 << GEM_TX_FRMLEN_SIZE) - 1) & ~((unsigned int)(MACB_TX_LEN_ALIGN - 1))) ++/* Limit maximum TX length as per Cadence TSO errata. This is to avoid a ++ * false amba_error in TX path from the DMA assuming there is not enough ++ * space in the SRAM (16KB) even when there is. ++ */ ++#define GEM_MAX_TX_LEN (unsigned int)(0x3FC0) + + #define GEM_MTU_MIN_SIZE ETH_MIN_MTU + #define MACB_NETIF_LSO NETIF_F_TSO +@@ -1664,16 +1668,14 @@ static netdev_features_t macb_features_check(struct sk_buff *skb, + + /* Validate LSO compatibility */ + +- /* there is only one buffer */ +- if (!skb_is_nonlinear(skb)) ++ /* there is only one buffer or protocol is not UDP */ ++ if (!skb_is_nonlinear(skb) || (ip_hdr(skb)->protocol != IPPROTO_UDP)) + return features; + + /* length of header */ + hdrlen = skb_transport_offset(skb); +- if (ip_hdr(skb)->protocol == IPPROTO_TCP) +- hdrlen += tcp_hdrlen(skb); + +- /* For LSO: ++ /* For UFO only: + * When software supplies two or more payload buffers all payload buffers + * apart from the last must be a multiple of 8 bytes in size. + */ +diff --git a/drivers/net/ethernet/dec/tulip/dmfe.c b/drivers/net/ethernet/dec/tulip/dmfe.c +index 0efdbd1a4a6f..32d470d4122a 100644 +--- a/drivers/net/ethernet/dec/tulip/dmfe.c ++++ b/drivers/net/ethernet/dec/tulip/dmfe.c +@@ -2214,15 +2214,16 @@ static int __init dmfe_init_module(void) + if (cr6set) + dmfe_cr6_user_set = cr6set; + +- switch(mode) { +- case DMFE_10MHF: ++ switch (mode) { ++ case DMFE_10MHF: + case DMFE_100MHF: + case DMFE_10MFD: + case DMFE_100MFD: + case DMFE_1M_HPNA: + dmfe_media_mode = mode; + break; +- default:dmfe_media_mode = DMFE_AUTO; ++ default: ++ dmfe_media_mode = DMFE_AUTO; + break; + } + +diff --git a/drivers/net/ethernet/dec/tulip/uli526x.c b/drivers/net/ethernet/dec/tulip/uli526x.c +index b1f30b194300..117ffe08800d 100644 +--- a/drivers/net/ethernet/dec/tulip/uli526x.c ++++ b/drivers/net/ethernet/dec/tulip/uli526x.c +@@ -1809,8 +1809,8 @@ static int __init uli526x_init_module(void) + if (cr6set) + uli526x_cr6_user_set = cr6set; + +- switch (mode) { +- case ULI526X_10MHF: ++ switch (mode) { ++ case ULI526X_10MHF: + case ULI526X_100MHF: + case ULI526X_10MFD: + case ULI526X_100MFD: +diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +index fcbe01f61aa4..e130233b5085 100644 +--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c ++++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +@@ -2483,6 +2483,9 @@ static void dpaa_adjust_link(struct net_device *net_dev) + mac_dev->adjust_link(mac_dev); + } + ++/* The Aquantia PHYs are capable of performing rate adaptation */ ++#define PHY_VEND_AQUANTIA 0x03a1b400 ++ + static int dpaa_phy_init(struct net_device *net_dev) + { + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +@@ -2501,9 +2504,14 @@ static int dpaa_phy_init(struct net_device *net_dev) + return -ENODEV; + } + +- /* Remove any features not supported by the controller */ +- ethtool_convert_legacy_u32_to_link_mode(mask, mac_dev->if_support); +- linkmode_and(phy_dev->supported, phy_dev->supported, mask); ++ /* Unless the PHY is capable of rate adaptation */ ++ if (mac_dev->phy_if != PHY_INTERFACE_MODE_XGMII || ++ ((phy_dev->drv->phy_id & GENMASK(31, 10)) != PHY_VEND_AQUANTIA)) { ++ /* remove any features not supported by the controller */ ++ ethtool_convert_legacy_u32_to_link_mode(mask, ++ mac_dev->if_support); ++ linkmode_and(phy_dev->supported, phy_dev->supported, mask); ++ } + + phy_support_asym_pause(phy_dev); + +diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c +index e49820675c8c..6b1a81df1465 100644 +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -388,6 +388,8 @@ struct mvneta_pcpu_stats { + struct u64_stats_sync syncp; + u64 rx_packets; + u64 rx_bytes; ++ u64 rx_dropped; ++ u64 rx_errors; + u64 tx_packets; + u64 tx_bytes; + }; +@@ -706,6 +708,8 @@ mvneta_get_stats64(struct net_device *dev, + struct mvneta_pcpu_stats *cpu_stats; + u64 rx_packets; + u64 rx_bytes; ++ u64 rx_dropped; ++ u64 rx_errors; + u64 tx_packets; + u64 tx_bytes; + +@@ -714,19 +718,20 @@ mvneta_get_stats64(struct net_device *dev, + start = u64_stats_fetch_begin_irq(&cpu_stats->syncp); + rx_packets = cpu_stats->rx_packets; + rx_bytes = cpu_stats->rx_bytes; ++ rx_dropped = cpu_stats->rx_dropped; ++ rx_errors = cpu_stats->rx_errors; + tx_packets = cpu_stats->tx_packets; + tx_bytes = cpu_stats->tx_bytes; + } while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start)); + + stats->rx_packets += rx_packets; + stats->rx_bytes += rx_bytes; ++ stats->rx_dropped += rx_dropped; ++ stats->rx_errors += rx_errors; + stats->tx_packets += tx_packets; + stats->tx_bytes += tx_bytes; + } + +- stats->rx_errors = dev->stats.rx_errors; +- stats->rx_dropped = dev->stats.rx_dropped; +- + stats->tx_dropped = dev->stats.tx_dropped; + } + +@@ -1703,8 +1708,14 @@ static u32 mvneta_txq_desc_csum(int l3_offs, int l3_proto, + static void mvneta_rx_error(struct mvneta_port *pp, + struct mvneta_rx_desc *rx_desc) + { ++ struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats); + u32 status = rx_desc->status; + ++ /* update per-cpu counter */ ++ u64_stats_update_begin(&stats->syncp); ++ stats->rx_errors++; ++ u64_stats_update_end(&stats->syncp); ++ + switch (status & MVNETA_RXD_ERR_CODE_MASK) { + case MVNETA_RXD_ERR_CRC: + netdev_err(pp->dev, "bad rx status %08x (crc error), size=%d\n", +@@ -1965,7 +1976,6 @@ static int mvneta_rx_swbm(struct napi_struct *napi, + /* Check errors only for FIRST descriptor */ + if (rx_status & MVNETA_RXD_ERR_SUMMARY) { + mvneta_rx_error(pp, rx_desc); +- dev->stats.rx_errors++; + /* leave the descriptor untouched */ + continue; + } +@@ -1976,11 +1986,17 @@ static int mvneta_rx_swbm(struct napi_struct *napi, + skb_size = max(rx_copybreak, rx_header_size); + rxq->skb = netdev_alloc_skb_ip_align(dev, skb_size); + if (unlikely(!rxq->skb)) { ++ struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats); ++ + netdev_err(dev, + "Can't allocate skb on queue %d\n", + rxq->id); +- dev->stats.rx_dropped++; ++ + rxq->skb_alloc_err++; ++ ++ u64_stats_update_begin(&stats->syncp); ++ stats->rx_dropped++; ++ u64_stats_update_end(&stats->syncp); + continue; + } + copy_size = min(skb_size, rx_bytes); +@@ -2137,7 +2153,6 @@ err_drop_frame_ret_pool: + mvneta_bm_pool_put_bp(pp->bm_priv, bm_pool, + rx_desc->buf_phys_addr); + err_drop_frame: +- dev->stats.rx_errors++; + mvneta_rx_error(pp, rx_desc); + /* leave the descriptor untouched */ + continue; +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.h b/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.h +index d787bc0a4155..e09bc3858d57 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.h +@@ -45,7 +45,7 @@ void mlx5_ktls_destroy_key(struct mlx5_core_dev *mdev, u32 key_id); + + static inline bool mlx5_accel_is_ktls_device(struct mlx5_core_dev *mdev) + { +- if (!MLX5_CAP_GEN(mdev, tls)) ++ if (!MLX5_CAP_GEN(mdev, tls_tx)) + return false; + + if (!MLX5_CAP_GEN(mdev, log_max_dek)) +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c +index 71384ad1a443..ef1ed15a53b4 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c +@@ -269,7 +269,7 @@ struct sk_buff *mlx5e_tls_handle_tx_skb(struct net_device *netdev, + int datalen; + u32 skb_seq; + +- if (MLX5_CAP_GEN(sq->channel->mdev, tls)) { ++ if (MLX5_CAP_GEN(sq->channel->mdev, tls_tx)) { + skb = mlx5e_ktls_handle_tx_skb(netdev, sq, skb, wqe, pi); + goto out; + } +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c +index c76da309506b..72232e570af7 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c +@@ -850,6 +850,7 @@ void mlx5_fpga_ipsec_delete_sa_ctx(void *context) + mutex_lock(&fpga_xfrm->lock); + if (!--fpga_xfrm->num_rules) { + mlx5_fpga_ipsec_release_sa_ctx(fpga_xfrm->sa_ctx); ++ kfree(fpga_xfrm->sa_ctx); + fpga_xfrm->sa_ctx = NULL; + } + mutex_unlock(&fpga_xfrm->lock); +@@ -1478,7 +1479,7 @@ int mlx5_fpga_esp_modify_xfrm(struct mlx5_accel_esp_xfrm *xfrm, + if (!memcmp(&xfrm->attrs, attrs, sizeof(xfrm->attrs))) + return 0; + +- if (!mlx5_fpga_esp_validate_xfrm_attrs(mdev, attrs)) { ++ if (mlx5_fpga_esp_validate_xfrm_attrs(mdev, attrs)) { + mlx5_core_warn(mdev, "Tried to create an esp with unsupported attrs\n"); + return -EOPNOTSUPP; + } +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +index 791e14ac26f4..86e6bbb57482 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +@@ -1555,16 +1555,16 @@ struct match_list_head { + struct match_list first; + }; + +-static void free_match_list(struct match_list_head *head) ++static void free_match_list(struct match_list_head *head, bool ft_locked) + { + if (!list_empty(&head->list)) { + struct match_list *iter, *match_tmp; + + list_del(&head->first.list); +- tree_put_node(&head->first.g->node, false); ++ tree_put_node(&head->first.g->node, ft_locked); + list_for_each_entry_safe(iter, match_tmp, &head->list, + list) { +- tree_put_node(&iter->g->node, false); ++ tree_put_node(&iter->g->node, ft_locked); + list_del(&iter->list); + kfree(iter); + } +@@ -1573,7 +1573,8 @@ static void free_match_list(struct match_list_head *head) + + static int build_match_list(struct match_list_head *match_head, + struct mlx5_flow_table *ft, +- const struct mlx5_flow_spec *spec) ++ const struct mlx5_flow_spec *spec, ++ bool ft_locked) + { + struct rhlist_head *tmp, *list; + struct mlx5_flow_group *g; +@@ -1598,7 +1599,7 @@ static int build_match_list(struct match_list_head *match_head, + + curr_match = kmalloc(sizeof(*curr_match), GFP_ATOMIC); + if (!curr_match) { +- free_match_list(match_head); ++ free_match_list(match_head, ft_locked); + err = -ENOMEM; + goto out; + } +@@ -1778,7 +1779,7 @@ search_again_locked: + version = atomic_read(&ft->node.version); + + /* Collect all fgs which has a matching match_criteria */ +- err = build_match_list(&match_head, ft, spec); ++ err = build_match_list(&match_head, ft, spec, take_write); + if (err) { + if (take_write) + up_write_ref_node(&ft->node, false); +@@ -1792,7 +1793,7 @@ search_again_locked: + + rule = try_add_to_existing_fg(ft, &match_head.list, spec, flow_act, dest, + dest_num, version); +- free_match_list(&match_head); ++ free_match_list(&match_head, take_write); + if (!IS_ERR(rule) || + (PTR_ERR(rule) != -ENOENT && PTR_ERR(rule) != -EAGAIN)) { + if (take_write) +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw.c b/drivers/net/ethernet/mellanox/mlx5/core/fw.c +index a19790dee7b2..13e86f0b42f5 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fw.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fw.c +@@ -239,7 +239,7 @@ int mlx5_query_hca_caps(struct mlx5_core_dev *dev) + return err; + } + +- if (MLX5_CAP_GEN(dev, tls)) { ++ if (MLX5_CAP_GEN(dev, tls_tx)) { + err = mlx5_core_get_caps(dev, MLX5_CAP_TLS); + if (err) + return err; +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_if.h b/drivers/net/ethernet/pensando/ionic/ionic_if.h +index 5bfdda19f64d..d8745f87f065 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_if.h ++++ b/drivers/net/ethernet/pensando/ionic/ionic_if.h +@@ -862,7 +862,7 @@ struct ionic_rxq_comp { + #define IONIC_RXQ_COMP_CSUM_F_VLAN 0x40 + #define IONIC_RXQ_COMP_CSUM_F_CALC 0x80 + u8 pkt_type_color; +-#define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x0f ++#define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x7f + }; + + enum ionic_pkt_type { +diff --git a/drivers/net/ethernet/qlogic/qed/qed_ptp.c b/drivers/net/ethernet/qlogic/qed/qed_ptp.c +index 0dacf2c18c09..3e613058e225 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_ptp.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_ptp.c +@@ -44,8 +44,8 @@ + /* Add/subtract the Adjustment_Value when making a Drift adjustment */ + #define QED_DRIFT_CNTR_DIRECTION_SHIFT 31 + #define QED_TIMESTAMP_MASK BIT(16) +-/* Param mask for Hardware to detect/timestamp the unicast PTP packets */ +-#define QED_PTP_UCAST_PARAM_MASK 0xF ++/* Param mask for Hardware to detect/timestamp the L2/L4 unicast PTP packets */ ++#define QED_PTP_UCAST_PARAM_MASK 0x70F + + static enum qed_resc_lock qed_ptcdev_to_resc(struct qed_hwfn *p_hwfn) + { +diff --git a/drivers/net/ethernet/smsc/smc911x.c b/drivers/net/ethernet/smsc/smc911x.c +index 8d88e4083456..7b65e79d6ae9 100644 +--- a/drivers/net/ethernet/smsc/smc911x.c ++++ b/drivers/net/ethernet/smsc/smc911x.c +@@ -936,7 +936,7 @@ static void smc911x_phy_configure(struct work_struct *work) + if (lp->ctl_rspeed != 100) + my_ad_caps &= ~(ADVERTISE_100BASE4|ADVERTISE_100FULL|ADVERTISE_100HALF); + +- if (!lp->ctl_rfduplx) ++ if (!lp->ctl_rfduplx) + my_ad_caps &= ~(ADVERTISE_100FULL|ADVERTISE_10FULL); + + /* Update our Auto-Neg Advertisement Register */ +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c +index 7ec895407d23..e0a5fe83d8e0 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c +@@ -413,6 +413,7 @@ static int ethqos_configure(struct qcom_ethqos *ethqos) + dll_lock = rgmii_readl(ethqos, SDC4_STATUS); + if (dll_lock & SDC4_STATUS_DLL_LOCK) + break; ++ retry--; + } while (retry > 0); + if (!retry) + dev_err(ðqos->pdev->dev, +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 06dd65c419c4..582176d869c3 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -4763,6 +4763,7 @@ int stmmac_suspend(struct device *dev) + { + struct net_device *ndev = dev_get_drvdata(dev); + struct stmmac_priv *priv = netdev_priv(ndev); ++ u32 chan; + + if (!ndev || !netif_running(ndev)) + return 0; +@@ -4776,6 +4777,9 @@ int stmmac_suspend(struct device *dev) + + stmmac_disable_all_queues(priv); + ++ for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) ++ del_timer_sync(&priv->tx_queue[chan].txtimer); ++ + /* Stop TX/RX DMA */ + stmmac_stop_all_dma(priv); + +diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c +index 9b3ba98726d7..3a53d222bfcc 100644 +--- a/drivers/net/gtp.c ++++ b/drivers/net/gtp.c +@@ -767,12 +767,12 @@ static int gtp_hashtable_new(struct gtp_dev *gtp, int hsize) + int i; + + gtp->addr_hash = kmalloc_array(hsize, sizeof(struct hlist_head), +- GFP_KERNEL); ++ GFP_KERNEL | __GFP_NOWARN); + if (gtp->addr_hash == NULL) + return -ENOMEM; + + gtp->tid_hash = kmalloc_array(hsize, sizeof(struct hlist_head), +- GFP_KERNEL); ++ GFP_KERNEL | __GFP_NOWARN); + if (gtp->tid_hash == NULL) + goto err1; + +diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c +index 44c2d857a7fa..91b302f0192f 100644 +--- a/drivers/net/netdevsim/dev.c ++++ b/drivers/net/netdevsim/dev.c +@@ -73,7 +73,7 @@ static const struct file_operations nsim_dev_take_snapshot_fops = { + + static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev) + { +- char dev_ddir_name[16]; ++ char dev_ddir_name[sizeof(DRV_NAME) + 10]; + + sprintf(dev_ddir_name, DRV_NAME "%u", nsim_dev->nsim_bus_dev->dev.id); + nsim_dev->ddir = debugfs_create_dir(dev_ddir_name, nsim_dev_ddir); +diff --git a/drivers/net/ppp/ppp_async.c b/drivers/net/ppp/ppp_async.c +index a7b9cf3269bf..29a0917a81e6 100644 +--- a/drivers/net/ppp/ppp_async.c ++++ b/drivers/net/ppp/ppp_async.c +@@ -874,15 +874,15 @@ ppp_async_input(struct asyncppp *ap, const unsigned char *buf, + skb = dev_alloc_skb(ap->mru + PPP_HDRLEN + 2); + if (!skb) + goto nomem; +- ap->rpkt = skb; +- } +- if (skb->len == 0) { +- /* Try to get the payload 4-byte aligned. +- * This should match the +- * PPP_ALLSTATIONS/PPP_UI/compressed tests in +- * process_input_packet, but we do not have +- * enough chars here to test buf[1] and buf[2]. +- */ ++ ap->rpkt = skb; ++ } ++ if (skb->len == 0) { ++ /* Try to get the payload 4-byte aligned. ++ * This should match the ++ * PPP_ALLSTATIONS/PPP_UI/compressed tests in ++ * process_input_packet, but we do not have ++ * enough chars here to test buf[1] and buf[2]. ++ */ + if (buf[0] != PPP_ALLSTATIONS) + skb_reserve(skb, 2 + (buf[0] & 1)); + } +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +index 7cdfde9b3dea..575ed19e9195 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +@@ -430,6 +430,7 @@ fail: + usb_free_urb(req->urb); + list_del(q->next); + } ++ kfree(reqs); + return NULL; + + } +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +index b3768d5d852a..8ad2d889179c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +@@ -3321,6 +3321,10 @@ static int iwl_mvm_send_sta_igtk(struct iwl_mvm *mvm, + igtk_cmd.sta_id = cpu_to_le32(sta_id); + + if (remove_key) { ++ /* This is a valid situation for IGTK */ ++ if (sta_id == IWL_MVM_INVALID_STA) ++ return 0; ++ + igtk_cmd.ctrl_flags |= cpu_to_le32(STA_KEY_NOT_VALID); + } else { + struct ieee80211_key_seq seq; +@@ -3575,9 +3579,9 @@ int iwl_mvm_remove_sta_key(struct iwl_mvm *mvm, + IWL_DEBUG_WEP(mvm, "mvm remove dynamic key: idx=%d sta=%d\n", + keyconf->keyidx, sta_id); + +- if (mvm_sta && (keyconf->cipher == WLAN_CIPHER_SUITE_AES_CMAC || +- keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || +- keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256)) ++ if (keyconf->cipher == WLAN_CIPHER_SUITE_AES_CMAC || ++ keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || ++ keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256) + return iwl_mvm_send_sta_igtk(mvm, keyconf, sta_id, true); + + if (!__test_and_clear_bit(keyconf->hw_key_idx, mvm->fw_key_table)) { +diff --git a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +index 6dd835f1efc2..fbfa0b15d0c8 100644 +--- a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c ++++ b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +@@ -232,6 +232,7 @@ static int mwifiex_process_country_ie(struct mwifiex_private *priv, + + if (country_ie_len > + (IEEE80211_COUNTRY_STRING_LEN + MWIFIEX_MAX_TRIPLET_802_11D)) { ++ rcu_read_unlock(); + mwifiex_dbg(priv->adapter, ERROR, + "11D: country_ie_len overflow!, deauth AP\n"); + return -EINVAL; +diff --git a/drivers/nfc/pn544/pn544.c b/drivers/nfc/pn544/pn544.c +index cda996f6954e..2b83156efe3f 100644 +--- a/drivers/nfc/pn544/pn544.c ++++ b/drivers/nfc/pn544/pn544.c +@@ -693,7 +693,7 @@ static int pn544_hci_check_presence(struct nfc_hci_dev *hdev, + target->nfcid1_len != 10) + return -EOPNOTSUPP; + +- return nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE, ++ return nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE, + PN544_RF_READER_CMD_ACTIVATE_NEXT, + target->nfcid1, target->nfcid1_len, NULL); + } else if (target->supported_protocols & (NFC_PROTO_JEWEL_MASK | +diff --git a/drivers/nvme/target/fabrics-cmd.c b/drivers/nvme/target/fabrics-cmd.c +index d16b55ffe79f..4e9004fe5c6f 100644 +--- a/drivers/nvme/target/fabrics-cmd.c ++++ b/drivers/nvme/target/fabrics-cmd.c +@@ -105,6 +105,7 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req) + u16 qid = le16_to_cpu(c->qid); + u16 sqsize = le16_to_cpu(c->sqsize); + struct nvmet_ctrl *old; ++ u16 ret; + + old = cmpxchg(&req->sq->ctrl, NULL, ctrl); + if (old) { +@@ -115,7 +116,8 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req) + if (!sqsize) { + pr_warn("queue size zero!\n"); + req->error_loc = offsetof(struct nvmf_connect_command, sqsize); +- return NVME_SC_CONNECT_INVALID_PARAM | NVME_SC_DNR; ++ ret = NVME_SC_CONNECT_INVALID_PARAM | NVME_SC_DNR; ++ goto err; + } + + /* note: convert queue size from 0's-based value to 1's-based value */ +@@ -128,16 +130,19 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req) + } + + if (ctrl->ops->install_queue) { +- u16 ret = ctrl->ops->install_queue(req->sq); +- ++ ret = ctrl->ops->install_queue(req->sq); + if (ret) { + pr_err("failed to install queue %d cntlid %d ret %x\n", +- qid, ret, ctrl->cntlid); +- return ret; ++ qid, ctrl->cntlid, ret); ++ goto err; + } + } + + return 0; ++ ++err: ++ req->sq->ctrl = NULL; ++ return ret; + } + + static void nvmet_execute_admin_connect(struct nvmet_req *req) +diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c +index 057d1ff87d5d..960542dea5ad 100644 +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -110,7 +110,7 @@ static void nvmem_cell_drop(struct nvmem_cell *cell) + list_del(&cell->node); + mutex_unlock(&nvmem_mutex); + of_node_put(cell->np); +- kfree(cell->name); ++ kfree_const(cell->name); + kfree(cell); + } + +@@ -137,7 +137,9 @@ static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem, + cell->nvmem = nvmem; + cell->offset = info->offset; + cell->bytes = info->bytes; +- cell->name = info->name; ++ cell->name = kstrdup_const(info->name, GFP_KERNEL); ++ if (!cell->name) ++ return -ENOMEM; + + cell->bit_offset = info->bit_offset; + cell->nbits = info->nbits; +@@ -327,7 +329,7 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) + dev_err(dev, "cell %s unaligned to nvmem stride %d\n", + cell->name, nvmem->stride); + /* Cells already added will be freed later. */ +- kfree(cell->name); ++ kfree_const(cell->name); + kfree(cell); + return -EINVAL; + } +diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig +index 37c2ccbefecd..d91618641be6 100644 +--- a/drivers/of/Kconfig ++++ b/drivers/of/Kconfig +@@ -103,4 +103,8 @@ config OF_OVERLAY + config OF_NUMA + bool + ++config OF_DMA_DEFAULT_COHERENT ++ # arches should select this if DMA is coherent by default for OF devices ++ bool ++ + endif # OF +diff --git a/drivers/of/address.c b/drivers/of/address.c +index 978427a9d5e6..8f74c4626e0e 100644 +--- a/drivers/of/address.c ++++ b/drivers/of/address.c +@@ -998,12 +998,16 @@ EXPORT_SYMBOL_GPL(of_dma_get_range); + * @np: device node + * + * It returns true if "dma-coherent" property was found +- * for this device in DT. ++ * for this device in the DT, or if DMA is coherent by ++ * default for OF devices on the current platform. + */ + bool of_dma_is_coherent(struct device_node *np) + { + struct device_node *node = of_node_get(np); + ++ if (IS_ENABLED(CONFIG_OF_DMA_DEFAULT_COHERENT)) ++ return true; ++ + while (node) { + if (of_property_read_bool(node, "dma-coherent")) { + of_node_put(node); +diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c +index af677254a072..c8c702c494a2 100644 +--- a/drivers/pci/controller/dwc/pci-keystone.c ++++ b/drivers/pci/controller/dwc/pci-keystone.c +@@ -422,7 +422,7 @@ static void ks_pcie_setup_rc_app_regs(struct keystone_pcie *ks_pcie) + lower_32_bits(start) | OB_ENABLEN); + ks_pcie_app_writel(ks_pcie, OB_OFFSET_HI(i), + upper_32_bits(start)); +- start += OB_WIN_SIZE; ++ start += OB_WIN_SIZE * SZ_1M; + } + + val = ks_pcie_app_readl(ks_pcie, CMD_STATUS); +@@ -510,7 +510,7 @@ static void ks_pcie_stop_link(struct dw_pcie *pci) + /* Disable Link training */ + val = ks_pcie_app_readl(ks_pcie, CMD_STATUS); + val &= ~LTSSM_EN_VAL; +- ks_pcie_app_writel(ks_pcie, CMD_STATUS, LTSSM_EN_VAL | val); ++ ks_pcie_app_writel(ks_pcie, CMD_STATUS, val); + } + + static int ks_pcie_start_link(struct dw_pcie *pci) +@@ -1354,7 +1354,7 @@ static int __init ks_pcie_probe(struct platform_device *pdev) + ret = of_property_read_u32(np, "num-viewport", &num_viewport); + if (ret < 0) { + dev_err(dev, "unable to read *num-viewport* property\n"); +- return ret; ++ goto err_get_sync; + } + + /* +diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c +index 673a1725ef38..090b632965e2 100644 +--- a/drivers/pci/controller/pci-tegra.c ++++ b/drivers/pci/controller/pci-tegra.c +@@ -2798,7 +2798,7 @@ static int tegra_pcie_probe(struct platform_device *pdev) + + pm_runtime_enable(pcie->dev); + err = pm_runtime_get_sync(pcie->dev); +- if (err) { ++ if (err < 0) { + dev_err(dev, "fail to enable pcie controller: %d\n", err); + goto teardown_msi; + } +diff --git a/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c b/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c +index 42bc5150dd92..febe0aef68d4 100644 +--- a/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c ++++ b/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c +@@ -80,7 +80,7 @@ static int read_poll_timeout(void __iomem *addr, u32 mask) + if (readl_relaxed(addr) & mask) + return 0; + +- usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50); ++ usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50); + } while (!time_after(jiffies, timeout)); + + return (readl_relaxed(addr) & mask) ? 0 : -ETIMEDOUT; +diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c +index cdab916fbf92..e330ec73c465 100644 +--- a/drivers/platform/x86/intel_scu_ipc.c ++++ b/drivers/platform/x86/intel_scu_ipc.c +@@ -67,26 +67,22 @@ + struct intel_scu_ipc_pdata_t { + u32 i2c_base; + u32 i2c_len; +- u8 irq_mode; + }; + + static const struct intel_scu_ipc_pdata_t intel_scu_ipc_lincroft_pdata = { + .i2c_base = 0xff12b000, + .i2c_len = 0x10, +- .irq_mode = 0, + }; + + /* Penwell and Cloverview */ + static const struct intel_scu_ipc_pdata_t intel_scu_ipc_penwell_pdata = { + .i2c_base = 0xff12b000, + .i2c_len = 0x10, +- .irq_mode = 1, + }; + + static const struct intel_scu_ipc_pdata_t intel_scu_ipc_tangier_pdata = { + .i2c_base = 0xff00d000, + .i2c_len = 0x10, +- .irq_mode = 0, + }; + + struct intel_scu_ipc_dev { +@@ -99,6 +95,9 @@ struct intel_scu_ipc_dev { + + static struct intel_scu_ipc_dev ipcdev; /* Only one for now */ + ++#define IPC_STATUS 0x04 ++#define IPC_STATUS_IRQ BIT(2) ++ + /* + * IPC Read Buffer (Read Only): + * 16 byte buffer for receiving data from SCU, if IPC command +@@ -120,11 +119,8 @@ static DEFINE_MUTEX(ipclock); /* lock used to prevent multiple call to SCU */ + */ + static inline void ipc_command(struct intel_scu_ipc_dev *scu, u32 cmd) + { +- if (scu->irq_mode) { +- reinit_completion(&scu->cmd_complete); +- writel(cmd | IPC_IOC, scu->ipc_base); +- } +- writel(cmd, scu->ipc_base); ++ reinit_completion(&scu->cmd_complete); ++ writel(cmd | IPC_IOC, scu->ipc_base); + } + + /* +@@ -610,9 +606,10 @@ EXPORT_SYMBOL(intel_scu_ipc_i2c_cntrl); + static irqreturn_t ioc(int irq, void *dev_id) + { + struct intel_scu_ipc_dev *scu = dev_id; ++ int status = ipc_read_status(scu); + +- if (scu->irq_mode) +- complete(&scu->cmd_complete); ++ writel(status | IPC_STATUS_IRQ, scu->ipc_base + IPC_STATUS); ++ complete(&scu->cmd_complete); + + return IRQ_HANDLED; + } +@@ -638,8 +635,6 @@ static int ipc_probe(struct pci_dev *pdev, const struct pci_device_id *id) + if (!pdata) + return -ENODEV; + +- scu->irq_mode = pdata->irq_mode; +- + err = pcim_enable_device(pdev); + if (err) + return err; +diff --git a/drivers/power/supply/axp20x_ac_power.c b/drivers/power/supply/axp20x_ac_power.c +index 0d34a932b6d5..f74b0556bb6b 100644 +--- a/drivers/power/supply/axp20x_ac_power.c ++++ b/drivers/power/supply/axp20x_ac_power.c +@@ -23,6 +23,8 @@ + #define AXP20X_PWR_STATUS_ACIN_PRESENT BIT(7) + #define AXP20X_PWR_STATUS_ACIN_AVAIL BIT(6) + ++#define AXP813_ACIN_PATH_SEL BIT(7) ++ + #define AXP813_VHOLD_MASK GENMASK(5, 3) + #define AXP813_VHOLD_UV_TO_BIT(x) ((((x) / 100000) - 40) << 3) + #define AXP813_VHOLD_REG_TO_UV(x) \ +@@ -40,6 +42,7 @@ struct axp20x_ac_power { + struct power_supply *supply; + struct iio_channel *acin_v; + struct iio_channel *acin_i; + unsigned int irqs[ACIN_IRQS]; ++ bool has_acin_path_sel; + }; + + static irqreturn_t axp20x_ac_power_irq(int irq, void *devid) +@@ -86,6 +89,17 @@ static int axp20x_ac_power_get_property(struct power_supply *psy, + return ret; + + val->intval = !!(reg & AXP20X_PWR_STATUS_ACIN_AVAIL); ++ ++ /* ACIN_PATH_SEL disables ACIN even if ACIN_AVAIL is set. */ ++ if (val->intval && power->has_acin_path_sel) { ++ ret = regmap_read(power->regmap, AXP813_ACIN_PATH_CTRL, ++ ®); ++ if (ret) ++ return ret; ++ ++ val->intval = !!(reg & AXP813_ACIN_PATH_SEL); ++ } ++ + return 0; + + case POWER_SUPPLY_PROP_VOLTAGE_NOW: +@@ -224,21 +238,25 @@ static const struct power_supply_desc axp813_ac_power_desc = { + struct axp_data { + const struct power_supply_desc *power_desc; + bool acin_adc; ++ bool acin_path_sel; + }; + + static const struct axp_data axp20x_data = { +- .power_desc = &axp20x_ac_power_desc, +- .acin_adc = true, ++ .power_desc = &axp20x_ac_power_desc, ++ .acin_adc = true, ++ .acin_path_sel = false, + }; + + static const struct axp_data axp22x_data = { +- .power_desc = &axp22x_ac_power_desc, +- .acin_adc = false, ++ .power_desc = &axp22x_ac_power_desc, ++ .acin_adc = false, ++ .acin_path_sel = false, + }; + + static const struct axp_data axp813_data = { +- .power_desc = &axp813_ac_power_desc, +- .acin_adc = false, ++ .power_desc = &axp813_ac_power_desc, ++ .acin_adc = false, ++ .acin_path_sel = true, + }; + + static int axp20x_ac_power_probe(struct platform_device *pdev) +@@ -282,6 +300,7 @@ static int axp20x_ac_power_probe(struct platform_device *pdev) + } + + power->regmap = dev_get_regmap(pdev->dev.parent, NULL); ++ power->has_acin_path_sel = axp_data->acin_path_sel; + + platform_set_drvdata(pdev, power); + +diff --git a/drivers/power/supply/ltc2941-battery-gauge.c b/drivers/power/supply/ltc2941-battery-gauge.c +index da49436176cd..30a9014b2f95 100644 +--- a/drivers/power/supply/ltc2941-battery-gauge.c ++++ b/drivers/power/supply/ltc2941-battery-gauge.c +@@ -449,7 +449,7 @@ static int ltc294x_i2c_remove(struct i2c_client *client) + { + struct ltc294x_info *info = i2c_get_clientdata(client); + +- cancel_delayed_work(&info->work); ++ cancel_delayed_work_sync(&info->work); + power_supply_unregister(info->supply); + return 0; + } +diff --git a/drivers/regulator/helpers.c b/drivers/regulator/helpers.c +index ca3dc3f3bb29..bb16c465426e 100644 +--- a/drivers/regulator/helpers.c ++++ b/drivers/regulator/helpers.c +@@ -13,6 +13,8 @@ + #include + #include + ++#include "internal.h" ++ + /** + * regulator_is_enabled_regmap - standard is_enabled() for regmap users + * +@@ -881,3 +883,15 @@ void regulator_bulk_set_supply_names(struct regulator_bulk_data *consumers, + consumers[i].supply = supply_names[i]; + } + EXPORT_SYMBOL_GPL(regulator_bulk_set_supply_names); ++ ++/** ++ * regulator_is_equal - test whether two regulators are the same ++ * ++ * @reg1: first regulator to operate on ++ * @reg2: second regulator to operate on ++ */ ++bool regulator_is_equal(struct regulator *reg1, struct regulator *reg2) ++{ ++ return reg1->rdev == reg2->rdev; ++} ++EXPORT_SYMBOL_GPL(regulator_is_equal); +diff --git a/drivers/scsi/csiostor/csio_scsi.c b/drivers/scsi/csiostor/csio_scsi.c +index 469d0bc9f5fe..00cf33573136 100644 +--- a/drivers/scsi/csiostor/csio_scsi.c ++++ b/drivers/scsi/csiostor/csio_scsi.c +@@ -1383,7 +1383,7 @@ csio_device_reset(struct device *dev, + return -EINVAL; + + /* Delete NPIV lnodes */ +- csio_lnodes_exit(hw, 1); ++ csio_lnodes_exit(hw, 1); + + /* Block upper IOs */ + csio_lnodes_block_request(hw); +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index 42cf38c1ea99..0cbe6740e0c9 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -4392,7 +4392,8 @@ dcmd_timeout_ocr_possible(struct megasas_instance *instance) { + if (instance->adapter_type == MFI_SERIES) + return KILL_ADAPTER; + else if (instance->unload || +- test_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags)) ++ test_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, ++ &instance->reset_flags)) + return IGNORE_TIMEOUT; + else + return INITIATE_OCR; +diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c +index e301458bcbae..46bc062d873e 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c ++++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c +@@ -4847,6 +4847,7 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason) + if (instance->requestorId && !instance->skip_heartbeat_timer_del) + del_timer_sync(&instance->sriov_heartbeat_timer); + set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); ++ set_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); + atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING); + instance->instancet->disable_intr(instance); + megasas_sync_irqs((unsigned long)instance); +@@ -5046,7 +5047,7 @@ kill_hba: + instance->skip_heartbeat_timer_del = 1; + retval = FAILED; + out: +- clear_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); ++ clear_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); + mutex_unlock(&instance->reset_mutex); + return retval; + } +diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.h b/drivers/scsi/megaraid/megaraid_sas_fusion.h +index c013c80fe4e6..dd2e37e40d6b 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_fusion.h ++++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h +@@ -89,6 +89,7 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE { + + #define MEGASAS_FP_CMD_LEN 16 + #define MEGASAS_FUSION_IN_RESET 0 ++#define MEGASAS_FUSION_OCR_NOT_POSSIBLE 1 + #define RAID_1_PEER_CMDS 2 + #define JBOD_MAPS_COUNT 2 + #define MEGASAS_REDUCE_QD_COUNT 64 +diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c +index 30afc59c1870..7bbff91f8883 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.c ++++ b/drivers/scsi/qla2xxx/qla_dbg.c +@@ -2519,12 +2519,6 @@ qla83xx_fw_dump_failed: + /* Driver Debug Functions. */ + /****************************************************************************/ + +-static inline int +-ql_mask_match(uint level) +-{ +- return (level & ql2xextended_error_logging) == level; +-} +- + /* + * This function is for formatting and logging debug information. + * It is to be used when vha is available. It formats the message +diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h +index bb01b680ce9f..433e95502808 100644 +--- a/drivers/scsi/qla2xxx/qla_dbg.h ++++ b/drivers/scsi/qla2xxx/qla_dbg.h +@@ -374,3 +374,9 @@ extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *, + extern void qla24xx_pause_risc(struct device_reg_24xx __iomem *, + struct qla_hw_data *); + extern int qla24xx_soft_reset(struct qla_hw_data *); ++ ++static inline int ++ql_mask_match(uint level) ++{ ++ return (level & ql2xextended_error_logging) == level; ++} +diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h +index 1eb3fe281cc3..c57b95a20688 100644 +--- a/drivers/scsi/qla2xxx/qla_def.h ++++ b/drivers/scsi/qla2xxx/qla_def.h +@@ -2402,6 +2402,7 @@ typedef struct fc_port { + unsigned int scan_needed:1; + unsigned int n2n_flag:1; + unsigned int explicit_logout:1; ++ unsigned int prli_pend_timer:1; + + struct completion nvme_del_done; + uint32_t nvme_prli_service_param; +@@ -2428,6 +2429,7 @@ typedef struct fc_port { + struct work_struct free_work; + struct work_struct reg_work; + uint64_t jiffies_at_registration; ++ unsigned long prli_expired; + struct qlt_plogi_ack_t *plogi_link[QLT_PLOGI_LINK_MAX]; + + uint16_t tgt_id; +@@ -4821,6 +4823,9 @@ struct sff_8247_a0 { + ha->current_topology == ISP_CFG_N || \ + !ha->current_topology) + ++#define PRLI_PHASE(_cls) \ ++ ((_cls == DSC_LS_PRLI_PEND) || (_cls == DSC_LS_PRLI_COMP)) ++ + #include "qla_target.h" + #include "qla_gbl.h" + #include "qla_dbg.h" +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 9ffaa920fc8f..ac4c47fc5f4c 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -686,7 +686,7 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + port_id_t id; + u64 wwn; + u16 data[2]; +- u8 current_login_state; ++ u8 current_login_state, nvme_cls; + + fcport = ea->fcport; + ql_dbg(ql_dbg_disc, vha, 0xffff, +@@ -745,10 +745,17 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, + + loop_id = le16_to_cpu(e->nport_handle); + loop_id = (loop_id & 0x7fff); +- if (fcport->fc4f_nvme) +- current_login_state = e->current_login_state >> 4; +- else +- current_login_state = e->current_login_state & 0xf; ++ nvme_cls = e->current_login_state >> 4; ++ current_login_state = e->current_login_state & 0xf; ++ ++ if (PRLI_PHASE(nvme_cls)) { ++ current_login_state = nvme_cls; ++ fcport->fc4_type &= ~FS_FC4TYPE_FCP; ++ fcport->fc4_type |= FS_FC4TYPE_NVME; ++ } else if (PRLI_PHASE(current_login_state)) { ++ fcport->fc4_type |= FS_FC4TYPE_FCP; ++ fcport->fc4_type &= ~FS_FC4TYPE_NVME; ++ } + + + ql_dbg(ql_dbg_disc, vha, 0x20e2, +@@ -1219,12 +1226,19 @@ qla24xx_async_prli(struct scsi_qla_host *vha, fc_port_t *fcport) + struct srb_iocb *lio; + int rval = QLA_FUNCTION_FAILED; + +- if (!vha->flags.online) ++ if (!vha->flags.online) { ++ ql_dbg(ql_dbg_disc, vha, 0xffff, "%s %d %8phC exit\n", ++ __func__, __LINE__, fcport->port_name); + return rval; ++ } + +- if (fcport->fw_login_state == DSC_LS_PLOGI_PEND || +- fcport->fw_login_state == DSC_LS_PRLI_PEND) ++ if ((fcport->fw_login_state == DSC_LS_PLOGI_PEND || ++ fcport->fw_login_state == DSC_LS_PRLI_PEND) && ++ qla_dual_mode_enabled(vha)) { ++ ql_dbg(ql_dbg_disc, vha, 0xffff, "%s %d %8phC exit\n", ++ __func__, __LINE__, fcport->port_name); + return rval; ++ } + + sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); + if (!sp) +@@ -1602,6 +1616,10 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport) + break; + default: + if (fcport->login_pause) { ++ ql_dbg(ql_dbg_disc, vha, 0x20d8, ++ "%s %d %8phC exit\n", ++ __func__, __LINE__, ++ fcport->port_name); + fcport->last_rscn_gen = fcport->rscn_gen; + fcport->last_login_gen = fcport->login_gen; + set_bit(RELOGIN_NEEDED, &vha->dpc_flags); +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 7c5f2736ebee..3e9c5768815e 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -1897,6 +1897,18 @@ static void qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, + inbuf = (uint32_t *)&sts->nvme_ersp_data; + outbuf = (uint32_t *)fd->rspaddr; + iocb->u.nvme.rsp_pyld_len = le16_to_cpu(sts->nvme_rsp_pyld_len); ++ if (unlikely(iocb->u.nvme.rsp_pyld_len > ++ sizeof(struct nvme_fc_ersp_iu))) { ++ if (ql_mask_match(ql_dbg_io)) { ++ WARN_ONCE(1, "Unexpected response payload length %u.\n", ++ iocb->u.nvme.rsp_pyld_len); ++ ql_log(ql_log_warn, fcport->vha, 0x5100, ++ "Unexpected response payload length %u.\n", ++ iocb->u.nvme.rsp_pyld_len); ++ } ++ iocb->u.nvme.rsp_pyld_len = ++ sizeof(struct nvme_fc_ersp_iu); ++ } + iter = iocb->u.nvme.rsp_pyld_len >> 2; + for (; iter; iter--) + *outbuf++ = swab32(*inbuf++); +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index eac76e934cbe..1ef8907314e5 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -6151,9 +6151,8 @@ qla2x00_dump_mctp_data(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t addr, + mcp->mb[7] = LSW(MSD(req_dma)); + mcp->mb[8] = MSW(addr); + /* Setting RAM ID to valid */ +- mcp->mb[10] |= BIT_7; + /* For MCTP RAM ID is 0x40 */ +- mcp->mb[10] |= 0x40; ++ mcp->mb[10] = BIT_7 | 0x40; + + mcp->out_mb |= MBX_10|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1| + MBX_0; +diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c +index 2b2028f2383e..c855d013ba8a 100644 +--- a/drivers/scsi/qla2xxx/qla_nx.c ++++ b/drivers/scsi/qla2xxx/qla_nx.c +@@ -1612,8 +1612,7 @@ qla82xx_get_bootld_offset(struct qla_hw_data *ha) + return (u8 *)&ha->hablob->fw->data[offset]; + } + +-static __le32 +-qla82xx_get_fw_size(struct qla_hw_data *ha) ++static u32 qla82xx_get_fw_size(struct qla_hw_data *ha) + { + struct qla82xx_uri_data_desc *uri_desc = NULL; + +@@ -1624,7 +1623,7 @@ qla82xx_get_fw_size(struct qla_hw_data *ha) + return cpu_to_le32(uri_desc->size); + } + +- return cpu_to_le32(*(u32 *)&ha->hablob->fw->data[FW_SIZE_OFFSET]); ++ return get_unaligned_le32(&ha->hablob->fw->data[FW_SIZE_OFFSET]); + } + + static u8 * +@@ -1816,7 +1815,7 @@ qla82xx_fw_load_from_blob(struct qla_hw_data *ha) + } + + flashaddr = FLASH_ADDR_START; +- size = (__force u32)qla82xx_get_fw_size(ha) / 8; ++ size = qla82xx_get_fw_size(ha) / 8; + ptr64 = (u64 *)qla82xx_get_fw_offs(ha); + + for (i = 0; i < size; i++) { +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 74a378a91b71..cb8a892e2d39 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -1257,6 +1257,7 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess) + sess->deleted = QLA_SESS_DELETION_IN_PROGRESS; + spin_unlock_irqrestore(&sess->vha->work_lock, flags); + ++ sess->prli_pend_timer = 0; + sess->disc_state = DSC_DELETE_PEND; + + qla24xx_chk_fcp_state(sess); +diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c +index 2323432a0edb..5504ab11decc 100644 +--- a/drivers/scsi/qla4xxx/ql4_os.c ++++ b/drivers/scsi/qla4xxx/ql4_os.c +@@ -4145,7 +4145,7 @@ static void qla4xxx_mem_free(struct scsi_qla_host *ha) + dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues, + ha->queues_dma); + +- if (ha->fw_dump) ++ if (ha->fw_dump) + vfree(ha->fw_dump); + + ha->queues_len = 0; +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index 1e38bb967871..0d41a7dc1d6b 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -5023,6 +5023,7 @@ static int ufshcd_disable_auto_bkops(struct ufs_hba *hba) + + hba->auto_bkops_enabled = false; + trace_ufshcd_auto_bkops_state(dev_name(hba->dev), "Disabled"); ++ hba->is_urgent_bkops_lvl_checked = false; + out: + return err; + } +@@ -5047,6 +5048,7 @@ static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba) + hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS; + ufshcd_disable_auto_bkops(hba); + } ++ hba->is_urgent_bkops_lvl_checked = false; + } + + static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status) +@@ -5093,6 +5095,7 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, + err = ufshcd_enable_auto_bkops(hba); + else + err = ufshcd_disable_auto_bkops(hba); ++ hba->urgent_bkops_lvl = curr_status; + out: + return err; + } +diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h +index 1c8b349379af..77c4a9abe365 100644 +--- a/drivers/usb/dwc3/core.h ++++ b/drivers/usb/dwc3/core.h +@@ -688,7 +688,9 @@ struct dwc3_ep { + #define DWC3_EP_STALL BIT(1) + #define DWC3_EP_WEDGE BIT(2) + #define DWC3_EP_TRANSFER_STARTED BIT(3) ++#define DWC3_EP_END_TRANSFER_PENDING BIT(4) + #define DWC3_EP_PENDING_REQUEST BIT(5) ++#define DWC3_EP_DELAY_START BIT(6) + + /* This last one is specific to EP0 */ + #define DWC3_EP0_DIR_IN BIT(31) +diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c +index fd1b100d2927..6dee4dabc0a4 100644 +--- a/drivers/usb/dwc3/ep0.c ++++ b/drivers/usb/dwc3/ep0.c +@@ -1136,8 +1136,10 @@ void dwc3_ep0_interrupt(struct dwc3 *dwc, + case DWC3_DEPEVT_EPCMDCMPLT: + cmd = DEPEVT_PARAMETER_CMD(event->parameters); + +- if (cmd == DWC3_DEPCMD_ENDTRANSFER) ++ if (cmd == DWC3_DEPCMD_ENDTRANSFER) { ++ dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING; + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; ++ } + break; + } + } +diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c +index 154f3f3e8cff..8b95be897078 100644 +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -1447,6 +1447,12 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) + list_add_tail(&req->list, &dep->pending_list); + req->status = DWC3_REQUEST_STATUS_QUEUED; + ++ /* Start the transfer only after the END_TRANSFER is completed */ ++ if (dep->flags & DWC3_EP_END_TRANSFER_PENDING) { ++ dep->flags |= DWC3_EP_DELAY_START; ++ return 0; ++ } ++ + /* + * NOTICE: Isochronous endpoints should NEVER be prestarted. We must + * wait for a XferNotReady event so we will know what's the current +@@ -2625,8 +2631,14 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, + cmd = DEPEVT_PARAMETER_CMD(event->parameters); + + if (cmd == DWC3_DEPCMD_ENDTRANSFER) { ++ dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING; + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; + dwc3_gadget_ep_cleanup_cancelled_requests(dep); ++ if ((dep->flags & DWC3_EP_DELAY_START) && ++ !usb_endpoint_xfer_isoc(dep->endpoint.desc)) ++ __dwc3_gadget_kick_transfer(dep); ++ ++ dep->flags &= ~DWC3_EP_DELAY_START; + } + break; + case DWC3_DEPEVT_STREAMEVT: +@@ -2683,7 +2695,8 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, + u32 cmd; + int ret; + +- if (!(dep->flags & DWC3_EP_TRANSFER_STARTED)) ++ if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) || ++ (dep->flags & DWC3_EP_END_TRANSFER_PENDING)) + return; + + /* +@@ -2728,6 +2741,8 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, + + if (!interrupt) + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; ++ else ++ dep->flags |= DWC3_EP_END_TRANSFER_PENDING; + + if (dwc3_is_usb31(dwc) || dwc->revision < DWC3_REVISION_310A) + udelay(100); +diff --git a/drivers/usb/gadget/function/f_ecm.c b/drivers/usb/gadget/function/f_ecm.c +index 460d5d7c984f..7f5cf488b2b1 100644 +--- a/drivers/usb/gadget/function/f_ecm.c ++++ b/drivers/usb/gadget/function/f_ecm.c +@@ -52,6 +52,7 @@ struct f_ecm { + struct usb_ep *notify; + struct usb_request *notify_req; + u8 notify_state; ++ atomic_t notify_count; + bool is_open; + + /* FIXME is_open needs some irq-ish locking +@@ -380,7 +381,7 @@ static void ecm_do_notify(struct f_ecm *ecm) + int status; + + /* notification already in flight? */ +- if (!req) ++ if (atomic_read(&ecm->notify_count)) + return; + + event = req->buf; +@@ -420,10 +421,10 @@ static void ecm_do_notify(struct f_ecm *ecm) + event->bmRequestType = 0xA1; + event->wIndex = cpu_to_le16(ecm->ctrl_id); + +- ecm->notify_req = NULL; ++ atomic_inc(&ecm->notify_count); + status = usb_ep_queue(ecm->notify, req, GFP_ATOMIC); + if (status < 0) { +- ecm->notify_req = req; ++ atomic_dec(&ecm->notify_count); + DBG(cdev, "notify --> %d\n", status); + } + } +@@ -448,17 +449,19 @@ static void ecm_notify_complete(struct usb_ep *ep, struct usb_request *req) + switch (req->status) { + case 0: + /* no fault */ ++ atomic_dec(&ecm->notify_count); + break; + case -ECONNRESET: + case -ESHUTDOWN: ++ atomic_set(&ecm->notify_count, 0); + ecm->notify_state = ECM_NOTIFY_NONE; + break; + default: + DBG(cdev, "event %02x --> %d\n", + event->bNotificationType, req->status); ++ atomic_dec(&ecm->notify_count); + break; + } +- ecm->notify_req = req; + ecm_do_notify(ecm); + } + +@@ -907,6 +910,11 @@ static void ecm_unbind(struct usb_configuration *c, struct usb_function *f) + + usb_free_all_descriptors(f); + ++ if (atomic_read(&ecm->notify_count)) { ++ usb_ep_dequeue(ecm->notify, ecm->notify_req); ++ atomic_set(&ecm->notify_count, 0); ++ } ++ + kfree(ecm->notify_req->buf); + usb_ep_free_request(ecm->notify, ecm->notify_req); + } +diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c +index 59d9d512dcda..ced2581cf99f 100644 +--- a/drivers/usb/gadget/function/f_fs.c ++++ b/drivers/usb/gadget/function/f_fs.c +@@ -1062,6 +1062,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) + req->num_sgs = io_data->sgt.nents; + } else { + req->buf = data; ++ req->num_sgs = 0; + } + req->length = data_len; + +@@ -1105,6 +1106,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) + req->num_sgs = io_data->sgt.nents; + } else { + req->buf = data; ++ req->num_sgs = 0; + } + req->length = data_len; + +diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c +index 2d6e76e4cffa..1d900081b1f0 100644 +--- a/drivers/usb/gadget/function/f_ncm.c ++++ b/drivers/usb/gadget/function/f_ncm.c +@@ -53,6 +53,7 @@ struct f_ncm { + struct usb_ep *notify; + struct usb_request *notify_req; + u8 notify_state; ++ atomic_t notify_count; + bool is_open; + + const struct ndp_parser_opts *parser_opts; +@@ -547,7 +548,7 @@ static void ncm_do_notify(struct f_ncm *ncm) + int status; + + /* notification already in flight? */ +- if (!req) ++ if (atomic_read(&ncm->notify_count)) + return; + + event = req->buf; +@@ -587,7 +588,8 @@ static void ncm_do_notify(struct f_ncm *ncm) + event->bmRequestType = 0xA1; + event->wIndex = cpu_to_le16(ncm->ctrl_id); + +- ncm->notify_req = NULL; ++ atomic_inc(&ncm->notify_count); ++ + /* + * In double buffering if there is a space in FIFO, + * completion callback can be called right after the call, +@@ -597,7 +599,7 @@ static void ncm_do_notify(struct f_ncm *ncm) + status = usb_ep_queue(ncm->notify, req, GFP_ATOMIC); + spin_lock(&ncm->lock); + if (status < 0) { +- ncm->notify_req = req; ++ atomic_dec(&ncm->notify_count); + DBG(cdev, "notify --> %d\n", status); + } + } +@@ -632,17 +634,19 @@ static void ncm_notify_complete(struct usb_ep *ep, struct usb_request *req) + case 0: + VDBG(cdev, "Notification %02x sent\n", + event->bNotificationType); ++ atomic_dec(&ncm->notify_count); + break; + case -ECONNRESET: + case -ESHUTDOWN: ++ atomic_set(&ncm->notify_count, 0); + ncm->notify_state = NCM_NOTIFY_NONE; + break; + default: + DBG(cdev, "event %02x --> %d\n", + event->bNotificationType, req->status); ++ atomic_dec(&ncm->notify_count); + break; + } +- ncm->notify_req = req; + ncm_do_notify(ncm); + spin_unlock(&ncm->lock); + } +@@ -1649,6 +1653,11 @@ static void ncm_unbind(struct usb_configuration *c, struct usb_function *f) + ncm_string_defs[0].id = 0; + usb_free_all_descriptors(f); + ++ if (atomic_read(&ncm->notify_count)) { ++ usb_ep_dequeue(ncm->notify, ncm->notify_req); ++ atomic_set(&ncm->notify_count, 0); ++ } ++ + kfree(ncm->notify_req->buf); + usb_ep_free_request(ncm->notify, ncm->notify_req); + } +diff --git a/drivers/usb/gadget/legacy/cdc2.c b/drivers/usb/gadget/legacy/cdc2.c +index da1c37933ca1..8d7a556ece30 100644 +--- a/drivers/usb/gadget/legacy/cdc2.c ++++ b/drivers/usb/gadget/legacy/cdc2.c +@@ -225,7 +225,7 @@ static struct usb_composite_driver cdc_driver = { + .name = "g_cdc", + .dev = &device_desc, + .strings = dev_strings, +- .max_speed = USB_SPEED_HIGH, ++ .max_speed = USB_SPEED_SUPER, + .bind = cdc_bind, + .unbind = cdc_unbind, + }; +diff --git a/drivers/usb/gadget/legacy/g_ffs.c b/drivers/usb/gadget/legacy/g_ffs.c +index b640ed3fcf70..ae6d8f7092b8 100644 +--- a/drivers/usb/gadget/legacy/g_ffs.c ++++ b/drivers/usb/gadget/legacy/g_ffs.c +@@ -149,7 +149,7 @@ static struct usb_composite_driver gfs_driver = { + .name = DRIVER_NAME, + .dev = &gfs_dev_desc, + .strings = gfs_dev_strings, +- .max_speed = USB_SPEED_HIGH, ++ .max_speed = USB_SPEED_SUPER, + .bind = gfs_bind, + .unbind = gfs_unbind, + }; +diff --git a/drivers/usb/gadget/legacy/multi.c b/drivers/usb/gadget/legacy/multi.c +index 50515f9e1022..ec9749845660 100644 +--- a/drivers/usb/gadget/legacy/multi.c ++++ b/drivers/usb/gadget/legacy/multi.c +@@ -482,7 +482,7 @@ static struct usb_composite_driver multi_driver = { + .name = "g_multi", + .dev = &device_desc, + .strings = dev_strings, +- .max_speed = USB_SPEED_HIGH, ++ .max_speed = USB_SPEED_SUPER, + .bind = multi_bind, + .unbind = multi_unbind, + .needs_serial = 1, +diff --git a/drivers/usb/gadget/legacy/ncm.c b/drivers/usb/gadget/legacy/ncm.c +index 8465f081e921..c61e71ba7045 100644 +--- a/drivers/usb/gadget/legacy/ncm.c ++++ b/drivers/usb/gadget/legacy/ncm.c +@@ -197,7 +197,7 @@ static struct usb_composite_driver ncm_driver = { + .name = "g_ncm", + .dev = &device_desc, + .strings = dev_strings, +- .max_speed = USB_SPEED_HIGH, ++ .max_speed = USB_SPEED_SUPER, + .bind = gncm_bind, + .unbind = gncm_unbind, + }; +diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c +index 8b4ff9fff340..753645bb2527 100644 +--- a/drivers/usb/typec/tcpm/tcpci.c ++++ b/drivers/usb/typec/tcpm/tcpci.c +@@ -591,6 +591,12 @@ static int tcpci_probe(struct i2c_client *client, + static int tcpci_remove(struct i2c_client *client) + { + struct tcpci_chip *chip = i2c_get_clientdata(client); ++ int err; ++ ++ /* Disable chip interrupts before unregistering port */ ++ err = tcpci_write16(chip->tcpci, TCPC_ALERT_MASK, 0); ++ if (err < 0) ++ return err; + + tcpci_unregister_port(chip->tcpci); + +diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c +index 9f4117766bb1..c962d9b370c6 100644 +--- a/drivers/virtio/virtio_balloon.c ++++ b/drivers/virtio/virtio_balloon.c +@@ -474,7 +474,9 @@ static int init_vqs(struct virtio_balloon *vb) + names[VIRTIO_BALLOON_VQ_INFLATE] = "inflate"; + callbacks[VIRTIO_BALLOON_VQ_DEFLATE] = balloon_ack; + names[VIRTIO_BALLOON_VQ_DEFLATE] = "deflate"; ++ callbacks[VIRTIO_BALLOON_VQ_STATS] = NULL; + names[VIRTIO_BALLOON_VQ_STATS] = NULL; ++ callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL; + names[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL; + + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) { +@@ -898,8 +900,7 @@ static int virtballoon_probe(struct virtio_device *vdev) + vb->vb_dev_info.inode = alloc_anon_inode(balloon_mnt->mnt_sb); + if (IS_ERR(vb->vb_dev_info.inode)) { + err = PTR_ERR(vb->vb_dev_info.inode); +- kern_unmount(balloon_mnt); +- goto out_del_vqs; ++ goto out_kern_unmount; + } + vb->vb_dev_info.inode->i_mapping->a_ops = &balloon_aops; + #endif +@@ -910,13 +911,13 @@ static int virtballoon_probe(struct virtio_device *vdev) + */ + if (virtqueue_get_vring_size(vb->free_page_vq) < 2) { + err = -ENOSPC; +- goto out_del_vqs; ++ goto out_iput; + } + vb->balloon_wq = alloc_workqueue("balloon-wq", + WQ_FREEZABLE | WQ_CPU_INTENSIVE, 0); + if (!vb->balloon_wq) { + err = -ENOMEM; +- goto out_del_vqs; ++ goto out_iput; + } + INIT_WORK(&vb->report_free_page_work, report_free_page_func); + vb->cmd_id_received_cache = VIRTIO_BALLOON_CMD_ID_STOP; +@@ -950,6 +951,12 @@ static int virtballoon_probe(struct virtio_device *vdev) + out_del_balloon_wq: + if (virtio_has_feature(vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) + destroy_workqueue(vb->balloon_wq); ++out_iput: ++#ifdef CONFIG_BALLOON_COMPACTION ++ iput(vb->vb_dev_info.inode); ++out_kern_unmount: ++ kern_unmount(balloon_mnt); ++#endif + out_del_vqs: + vdev->config->del_vqs(vdev); + out_free_vb: +@@ -965,6 +972,10 @@ static void remove_common(struct virtio_balloon *vb) + leak_balloon(vb, vb->num_pages); + update_balloon_size(vb); + ++ /* There might be free pages that are being reported: release them. */ ++ if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) ++ return_free_pages_to_mm(vb, ULONG_MAX); ++ + /* Now we reset the device so we can clean up the queues. */ + vb->vdev->config->reset(vb->vdev); + +diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c +index f2862f66c2ac..222d630c41fc 100644 +--- a/drivers/virtio/virtio_pci_common.c ++++ b/drivers/virtio/virtio_pci_common.c +@@ -294,7 +294,7 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned nvqs, + /* Best option: one for change interrupt, one per vq. */ + nvectors = 1; + for (i = 0; i < nvqs; ++i) +- if (callbacks[i]) ++ if (names[i] && callbacks[i]) + ++nvectors; + } else { + /* Second best: one for change, shared for all vqs. */ +diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c +index 21e8085b848b..861daf4f37b2 100644 +--- a/drivers/watchdog/watchdog_core.c ++++ b/drivers/watchdog/watchdog_core.c +@@ -147,6 +147,25 @@ int watchdog_init_timeout(struct watchdog_device *wdd, + } + EXPORT_SYMBOL_GPL(watchdog_init_timeout); + ++static int watchdog_reboot_notifier(struct notifier_block *nb, ++ unsigned long code, void *data) ++{ ++ struct watchdog_device *wdd; ++ ++ wdd = container_of(nb, struct watchdog_device, reboot_nb); ++ if (code == SYS_DOWN || code == SYS_HALT) { ++ if (watchdog_active(wdd)) { ++ int ret; ++ ++ ret = wdd->ops->stop(wdd); ++ if (ret) ++ return NOTIFY_BAD; ++ } ++ } ++ ++ return NOTIFY_DONE; ++} ++ + static int watchdog_restart_notifier(struct notifier_block *nb, + unsigned long action, void *data) + { +@@ -235,6 +254,19 @@ static int __watchdog_register_device(struct watchdog_device *wdd) + } + } + ++ if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) { ++ wdd->reboot_nb.notifier_call = watchdog_reboot_notifier; ++ ++ ret = register_reboot_notifier(&wdd->reboot_nb); ++ if (ret) { ++ pr_err("watchdog%d: Cannot register reboot notifier (%d)\n", ++ wdd->id, ret); ++ watchdog_dev_unregister(wdd); ++ ida_simple_remove(&watchdog_ida, id); ++ return ret; ++ } ++ } ++ + if (wdd->ops->restart) { + wdd->restart_nb.notifier_call = watchdog_restart_notifier; + +@@ -289,6 +321,9 @@ static void __watchdog_unregister_device(struct watchdog_device *wdd) + if (wdd->ops->restart) + unregister_restart_handler(&wdd->restart_nb); + ++ if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) ++ unregister_reboot_notifier(&wdd->reboot_nb); ++ + watchdog_dev_unregister(wdd); + ida_simple_remove(&watchdog_ida, wdd->id); + } +diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c +index 62483a99105c..ce04edc69e5f 100644 +--- a/drivers/watchdog/watchdog_dev.c ++++ b/drivers/watchdog/watchdog_dev.c +@@ -38,7 +38,6 @@ + #include /* For handling misc devices */ + #include /* For module stuff/... */ + #include /* For mutexes */ +-#include /* For reboot notifier */ + #include /* For memory functions */ + #include /* For standard types (like size_t) */ + #include /* For watchdog specific items */ +@@ -1077,25 +1076,6 @@ static void watchdog_cdev_unregister(struct watchdog_device *wdd) + put_device(&wd_data->dev); + } + +-static int watchdog_reboot_notifier(struct notifier_block *nb, +- unsigned long code, void *data) +-{ +- struct watchdog_device *wdd; +- +- wdd = container_of(nb, struct watchdog_device, reboot_nb); +- if (code == SYS_DOWN || code == SYS_HALT) { +- if (watchdog_active(wdd)) { +- int ret; +- +- ret = wdd->ops->stop(wdd); +- if (ret) +- return NOTIFY_BAD; +- } +- } +- +- return NOTIFY_DONE; +-} +- + /* + * watchdog_dev_register: register a watchdog device + * @wdd: watchdog device +@@ -1114,22 +1094,8 @@ int watchdog_dev_register(struct watchdog_device *wdd) + return ret; + + ret = watchdog_register_pretimeout(wdd); +- if (ret) { ++ if (ret) + watchdog_cdev_unregister(wdd); +- return ret; +- } +- +- if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) { +- wdd->reboot_nb.notifier_call = watchdog_reboot_notifier; +- +- ret = devm_register_reboot_notifier(&wdd->wd_data->dev, +- &wdd->reboot_nb); +- if (ret) { +- pr_err("watchdog%d: Cannot register reboot notifier (%d)\n", +- wdd->id, ret); +- watchdog_dev_unregister(wdd); +- } +- } + + return ret; + } +diff --git a/drivers/xen/xen-balloon.c b/drivers/xen/xen-balloon.c +index 6d12fc368210..a8d24433c8e9 100644 +--- a/drivers/xen/xen-balloon.c ++++ b/drivers/xen/xen-balloon.c +@@ -94,7 +94,7 @@ static void watch_target(struct xenbus_watch *watch, + "%llu", &static_max) == 1)) + static_max >>= PAGE_SHIFT - 10; + else +- static_max = new_target; ++ static_max = balloon_stats.current_pages; + + target_diff = (xen_pv_domain() || xen_initial_domain()) ? 0 + : static_max - balloon_stats.target_pages; +diff --git a/fs/aio.c b/fs/aio.c +index 0d9a559d488c..4115d5ad6b90 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -1610,6 +1610,14 @@ static int aio_fsync(struct fsync_iocb *req, const struct iocb *iocb, + return 0; + } + ++static void aio_poll_put_work(struct work_struct *work) ++{ ++ struct poll_iocb *req = container_of(work, struct poll_iocb, work); ++ struct aio_kiocb *iocb = container_of(req, struct aio_kiocb, poll); ++ ++ iocb_put(iocb); ++} ++ + static void aio_poll_complete_work(struct work_struct *work) + { + struct poll_iocb *req = container_of(work, struct poll_iocb, work); +@@ -1674,6 +1682,8 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, + list_del_init(&req->wait.entry); + + if (mask && spin_trylock_irqsave(&iocb->ki_ctx->ctx_lock, flags)) { ++ struct kioctx *ctx = iocb->ki_ctx; ++ + /* + * Try to complete the iocb inline if we can. Use + * irqsave/irqrestore because not all filesystems (e.g. fuse) +@@ -1683,8 +1693,14 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, + list_del(&iocb->ki_list); + iocb->ki_res.res = mangle_poll(mask); + req->done = true; +- spin_unlock_irqrestore(&iocb->ki_ctx->ctx_lock, flags); +- iocb_put(iocb); ++ if (iocb->ki_eventfd && eventfd_signal_count()) { ++ iocb = NULL; ++ INIT_WORK(&req->work, aio_poll_put_work); ++ schedule_work(&req->work); ++ } ++ spin_unlock_irqrestore(&ctx->ctx_lock, flags); ++ if (iocb) ++ iocb_put(iocb); + } else { + schedule_work(&req->work); + } +diff --git a/fs/attr.c b/fs/attr.c +index df28035aa23e..b4bbdbd4c8ca 100644 +--- a/fs/attr.c ++++ b/fs/attr.c +@@ -183,18 +183,12 @@ void setattr_copy(struct inode *inode, const struct iattr *attr) + inode->i_uid = attr->ia_uid; + if (ia_valid & ATTR_GID) + inode->i_gid = attr->ia_gid; +- if (ia_valid & ATTR_ATIME) { +- inode->i_atime = timestamp_truncate(attr->ia_atime, +- inode); +- } +- if (ia_valid & ATTR_MTIME) { +- inode->i_mtime = timestamp_truncate(attr->ia_mtime, +- inode); +- } +- if (ia_valid & ATTR_CTIME) { +- inode->i_ctime = timestamp_truncate(attr->ia_ctime, +- inode); +- } ++ if (ia_valid & ATTR_ATIME) ++ inode->i_atime = attr->ia_atime; ++ if (ia_valid & ATTR_MTIME) ++ inode->i_mtime = attr->ia_mtime; ++ if (ia_valid & ATTR_CTIME) ++ inode->i_ctime = attr->ia_ctime; + if (ia_valid & ATTR_MODE) { + umode_t mode = attr->ia_mode; + +@@ -268,8 +262,13 @@ int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **de + attr->ia_ctime = now; + if (!(ia_valid & ATTR_ATIME_SET)) + attr->ia_atime = now; ++ else ++ attr->ia_atime = timestamp_truncate(attr->ia_atime, inode); + if (!(ia_valid & ATTR_MTIME_SET)) + attr->ia_mtime = now; ++ else ++ attr->ia_mtime = timestamp_truncate(attr->ia_mtime, inode); ++ + if (ia_valid & ATTR_KILL_PRIV) { + error = security_inode_need_killpriv(dentry); + if (error < 0) +diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c +index da9b0f060a9d..a989105d39c8 100644 +--- a/fs/btrfs/ctree.c ++++ b/fs/btrfs/ctree.c +@@ -330,12 +330,10 @@ u64 btrfs_get_tree_mod_seq(struct btrfs_fs_info *fs_info, + struct seq_list *elem) + { + write_lock(&fs_info->tree_mod_log_lock); +- spin_lock(&fs_info->tree_mod_seq_lock); + if (!elem->seq) { + elem->seq = btrfs_inc_tree_mod_seq(fs_info); + list_add_tail(&elem->list, &fs_info->tree_mod_seq_list); + } +- spin_unlock(&fs_info->tree_mod_seq_lock); + write_unlock(&fs_info->tree_mod_log_lock); + + return elem->seq; +@@ -355,7 +353,7 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, + if (!seq_putting) + return; + +- spin_lock(&fs_info->tree_mod_seq_lock); ++ write_lock(&fs_info->tree_mod_log_lock); + list_del(&elem->list); + elem->seq = 0; + +@@ -366,19 +364,17 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, + * blocker with lower sequence number exists, we + * cannot remove anything from the log + */ +- spin_unlock(&fs_info->tree_mod_seq_lock); ++ write_unlock(&fs_info->tree_mod_log_lock); + return; + } + min_seq = cur_elem->seq; + } + } +- spin_unlock(&fs_info->tree_mod_seq_lock); + + /* + * anything that's lower than the lowest existing (read: blocked) + * sequence number can be removed from the tree. + */ +- write_lock(&fs_info->tree_mod_log_lock); + tm_root = &fs_info->tree_mod_log; + for (node = rb_first(tm_root); node; node = next) { + next = rb_next(node); +diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h +index 5e9f80b28fcf..290ca193c6c0 100644 +--- a/fs/btrfs/ctree.h ++++ b/fs/btrfs/ctree.h +@@ -671,14 +671,12 @@ struct btrfs_fs_info { + atomic_t nr_delayed_iputs; + wait_queue_head_t delayed_iputs_wait; + +- /* this protects tree_mod_seq_list */ +- spinlock_t tree_mod_seq_lock; + atomic64_t tree_mod_seq; +- struct list_head tree_mod_seq_list; + +- /* this protects tree_mod_log */ ++ /* this protects tree_mod_log and tree_mod_seq_list */ + rwlock_t tree_mod_log_lock; + struct rb_root tree_mod_log; ++ struct list_head tree_mod_seq_list; + + atomic_t async_delalloc_pages; + +diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c +index df3bd880061d..dfdb7d4f8406 100644 +--- a/fs/btrfs/delayed-ref.c ++++ b/fs/btrfs/delayed-ref.c +@@ -492,7 +492,7 @@ void btrfs_merge_delayed_refs(struct btrfs_trans_handle *trans, + if (head->is_data) + return; + +- spin_lock(&fs_info->tree_mod_seq_lock); ++ read_lock(&fs_info->tree_mod_log_lock); + if (!list_empty(&fs_info->tree_mod_seq_list)) { + struct seq_list *elem; + +@@ -500,7 +500,7 @@ void btrfs_merge_delayed_refs(struct btrfs_trans_handle *trans, + struct seq_list, list); + seq = elem->seq; + } +- spin_unlock(&fs_info->tree_mod_seq_lock); ++ read_unlock(&fs_info->tree_mod_log_lock); + + again: + for (node = rb_first_cached(&head->ref_tree); node; +@@ -518,7 +518,7 @@ int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, u64 seq) + struct seq_list *elem; + int ret = 0; + +- spin_lock(&fs_info->tree_mod_seq_lock); ++ read_lock(&fs_info->tree_mod_log_lock); + if (!list_empty(&fs_info->tree_mod_seq_list)) { + elem = list_first_entry(&fs_info->tree_mod_seq_list, + struct seq_list, list); +@@ -531,7 +531,7 @@ int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, u64 seq) + } + } + +- spin_unlock(&fs_info->tree_mod_seq_lock); ++ read_unlock(&fs_info->tree_mod_log_lock); + return ret; + } + +diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c +index bae334212ee2..7becc5e96f92 100644 +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -2016,7 +2016,7 @@ static void free_root_extent_buffers(struct btrfs_root *root) + } + + /* helper to cleanup tree roots */ +-static void free_root_pointers(struct btrfs_fs_info *info, int chunk_root) ++static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root) + { + free_root_extent_buffers(info->tree_root); + +@@ -2025,7 +2025,7 @@ static void free_root_pointers(struct btrfs_fs_info *info, int chunk_root) + free_root_extent_buffers(info->csum_root); + free_root_extent_buffers(info->quota_root); + free_root_extent_buffers(info->uuid_root); +- if (chunk_root) ++ if (free_chunk_root) + free_root_extent_buffers(info->chunk_root); + free_root_extent_buffers(info->free_space_root); + } +@@ -2652,7 +2652,6 @@ int open_ctree(struct super_block *sb, + spin_lock_init(&fs_info->fs_roots_radix_lock); + spin_lock_init(&fs_info->delayed_iput_lock); + spin_lock_init(&fs_info->defrag_inodes_lock); +- spin_lock_init(&fs_info->tree_mod_seq_lock); + spin_lock_init(&fs_info->super_lock); + spin_lock_init(&fs_info->buffer_lock); + spin_lock_init(&fs_info->unused_bgs_lock); +@@ -3324,7 +3323,7 @@ fail_block_groups: + btrfs_put_block_group_cache(fs_info); + + fail_tree_roots: +- free_root_pointers(fs_info, 1); ++ free_root_pointers(fs_info, true); + invalidate_inode_pages2(fs_info->btree_inode->i_mapping); + + fail_sb_buffer: +@@ -3356,7 +3355,7 @@ recovery_tree_root: + if (!btrfs_test_opt(fs_info, USEBACKUPROOT)) + goto fail_tree_roots; + +- free_root_pointers(fs_info, 0); ++ free_root_pointers(fs_info, false); + + /* don't use the log in recovery mode, it won't be valid */ + btrfs_set_super_log_root(disk_super, 0); +@@ -4047,10 +4046,17 @@ void close_ctree(struct btrfs_fs_info *fs_info) + invalidate_inode_pages2(fs_info->btree_inode->i_mapping); + btrfs_stop_all_workers(fs_info); + +- btrfs_free_block_groups(fs_info); +- + clear_bit(BTRFS_FS_OPEN, &fs_info->flags); +- free_root_pointers(fs_info, 1); ++ free_root_pointers(fs_info, true); ++ ++ /* ++ * We must free the block groups after dropping the fs_roots as we could ++ * have had an IO error and have left over tree log blocks that aren't ++ * cleaned up until the fs roots are freed. This makes the block group ++ * accounting appear to be wrong because there's pending reserved bytes, ++ * so make sure we do the block group cleanup afterwards. ++ */ ++ btrfs_free_block_groups(fs_info); + + iput(fs_info->btree_inode); + +diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c +index 33c6b191ca59..284540cdbbd9 100644 +--- a/fs/btrfs/extent_io.c ++++ b/fs/btrfs/extent_io.c +@@ -1583,21 +1583,25 @@ void find_first_clear_extent_bit(struct extent_io_tree *tree, u64 start, + /* Find first extent with bits cleared */ + while (1) { + node = __etree_search(tree, start, &next, &prev, NULL, NULL); +- if (!node) { ++ if (!node && !next && !prev) { ++ /* ++ * Tree is completely empty, send full range and let ++ * caller deal with it ++ */ ++ *start_ret = 0; ++ *end_ret = -1; ++ goto out; ++ } else if (!node && !next) { ++ /* ++ * We are past the last allocated chunk, set start at ++ * the end of the last extent. ++ */ ++ state = rb_entry(prev, struct extent_state, rb_node); ++ *start_ret = state->end + 1; ++ *end_ret = -1; ++ goto out; ++ } else if (!node) { + node = next; +- if (!node) { +- /* +- * We are past the last allocated chunk, +- * set start at the end of the last extent. The +- * device alloc tree should never be empty so +- * prev is always set. +- */ +- ASSERT(prev); +- state = rb_entry(prev, struct extent_state, rb_node); +- *start_ret = state->end + 1; +- *end_ret = -1; +- goto out; +- } + } + /* + * At this point 'node' either contains 'start' or start is +@@ -3938,6 +3942,11 @@ int btree_write_cache_pages(struct address_space *mapping, + if (wbc->range_cyclic) { + index = mapping->writeback_index; /* Start from prev offset */ + end = -1; ++ /* ++ * Start from the beginning does not need to cycle over the ++ * range, mark it as scanned. ++ */ ++ scanned = (index == 0); + } else { + index = wbc->range_start >> PAGE_SHIFT; + end = wbc->range_end >> PAGE_SHIFT; +@@ -3955,7 +3964,6 @@ retry: + tag))) { + unsigned i; + +- scanned = 1; + for (i = 0; i < nr_pages; i++) { + struct page *page = pvec.pages[i]; + +@@ -4084,6 +4092,11 @@ static int extent_write_cache_pages(struct address_space *mapping, + if (wbc->range_cyclic) { + index = mapping->writeback_index; /* Start from prev offset */ + end = -1; ++ /* ++ * Start from the beginning does not need to cycle over the ++ * range, mark it as scanned. ++ */ ++ scanned = (index == 0); + } else { + index = wbc->range_start >> PAGE_SHIFT; + end = wbc->range_end >> PAGE_SHIFT; +@@ -4117,7 +4130,6 @@ retry: + &index, end, tag))) { + unsigned i; + +- scanned = 1; + for (i = 0; i < nr_pages; i++) { + struct page *page = pvec.pages[i]; + +@@ -4177,7 +4189,16 @@ retry: + */ + scanned = 1; + index = 0; +- goto retry; ++ ++ /* ++ * If we're looping we could run into a page that is locked by a ++ * writer and that writer could be waiting on writeback for a ++ * page in our current bio, and thus deadlock, so flush the ++ * write bio here. ++ */ ++ ret = flush_write_bio(epd); ++ if (!ret) ++ goto retry; + } + + if (wbc->range_cyclic || (wbc->nr_to_write > 0 && range_whole)) +diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c +index 8e86b2d700c4..d88b8d8897cc 100644 +--- a/fs/btrfs/ioctl.c ++++ b/fs/btrfs/ioctl.c +@@ -3244,6 +3244,7 @@ static void btrfs_double_extent_lock(struct inode *inode1, u64 loff1, + static int btrfs_extent_same_range(struct inode *src, u64 loff, u64 len, + struct inode *dst, u64 dst_loff) + { ++ const u64 bs = BTRFS_I(src)->root->fs_info->sb->s_blocksize; + int ret; + + /* +@@ -3251,7 +3252,7 @@ static int btrfs_extent_same_range(struct inode *src, u64 loff, u64 len, + * source range to serialize with relocation. + */ + btrfs_double_extent_lock(src, loff, dst, dst_loff, len); +- ret = btrfs_clone(src, dst, loff, len, len, dst_loff, 1); ++ ret = btrfs_clone(src, dst, loff, len, ALIGN(len, bs), dst_loff, 1); + btrfs_double_extent_unlock(src, loff, dst, dst_loff, len); + + return ret; +diff --git a/fs/btrfs/tests/btrfs-tests.c b/fs/btrfs/tests/btrfs-tests.c +index 99fe9bf3fdac..98f9684e7ffc 100644 +--- a/fs/btrfs/tests/btrfs-tests.c ++++ b/fs/btrfs/tests/btrfs-tests.c +@@ -121,7 +121,6 @@ struct btrfs_fs_info *btrfs_alloc_dummy_fs_info(u32 nodesize, u32 sectorsize) + spin_lock_init(&fs_info->qgroup_lock); + spin_lock_init(&fs_info->super_lock); + spin_lock_init(&fs_info->fs_roots_radix_lock); +- spin_lock_init(&fs_info->tree_mod_seq_lock); + mutex_init(&fs_info->qgroup_ioctl_lock); + mutex_init(&fs_info->qgroup_rescan_lock); + rwlock_init(&fs_info->tree_mod_log_lock); +diff --git a/fs/btrfs/tests/extent-io-tests.c b/fs/btrfs/tests/extent-io-tests.c +index 123d9a614357..df7ce874a74b 100644 +--- a/fs/btrfs/tests/extent-io-tests.c ++++ b/fs/btrfs/tests/extent-io-tests.c +@@ -441,8 +441,17 @@ static int test_find_first_clear_extent_bit(void) + int ret = -EINVAL; + + test_msg("running find_first_clear_extent_bit test"); ++ + extent_io_tree_init(NULL, &tree, IO_TREE_SELFTEST, NULL); + ++ /* Test correct handling of empty tree */ ++ find_first_clear_extent_bit(&tree, 0, &start, &end, CHUNK_TRIMMED); ++ if (start != 0 || end != -1) { ++ test_err( ++ "error getting a range from completely empty tree: start %llu end %llu", ++ start, end); ++ goto out; ++ } + /* + * Set 1M-4M alloc/discard and 32M-64M thus leaving a hole between + * 4M-32M +diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c +index 8624bdee8c5b..ceffec752234 100644 +--- a/fs/btrfs/transaction.c ++++ b/fs/btrfs/transaction.c +@@ -77,13 +77,14 @@ void btrfs_put_transaction(struct btrfs_transaction *transaction) + } + } + +-static noinline void switch_commit_roots(struct btrfs_transaction *trans) ++static noinline void switch_commit_roots(struct btrfs_trans_handle *trans) + { ++ struct btrfs_transaction *cur_trans = trans->transaction; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root, *tmp; + + down_write(&fs_info->commit_root_sem); +- list_for_each_entry_safe(root, tmp, &trans->switch_commits, ++ list_for_each_entry_safe(root, tmp, &cur_trans->switch_commits, + dirty_list) { + list_del_init(&root->dirty_list); + free_extent_buffer(root->commit_root); +@@ -95,16 +96,17 @@ static noinline void switch_commit_roots(struct btrfs_transaction *trans) + } + + /* We can free old roots now. */ +- spin_lock(&trans->dropped_roots_lock); +- while (!list_empty(&trans->dropped_roots)) { +- root = list_first_entry(&trans->dropped_roots, ++ spin_lock(&cur_trans->dropped_roots_lock); ++ while (!list_empty(&cur_trans->dropped_roots)) { ++ root = list_first_entry(&cur_trans->dropped_roots, + struct btrfs_root, root_list); + list_del_init(&root->root_list); +- spin_unlock(&trans->dropped_roots_lock); ++ spin_unlock(&cur_trans->dropped_roots_lock); ++ btrfs_free_log(trans, root); + btrfs_drop_and_free_fs_root(fs_info, root); +- spin_lock(&trans->dropped_roots_lock); ++ spin_lock(&cur_trans->dropped_roots_lock); + } +- spin_unlock(&trans->dropped_roots_lock); ++ spin_unlock(&cur_trans->dropped_roots_lock); + up_write(&fs_info->commit_root_sem); + } + +@@ -1359,7 +1361,7 @@ static int qgroup_account_snapshot(struct btrfs_trans_handle *trans, + ret = commit_cowonly_roots(trans); + if (ret) + goto out; +- switch_commit_roots(trans->transaction); ++ switch_commit_roots(trans); + ret = btrfs_write_and_wait_transaction(trans); + if (ret) + btrfs_handle_fs_error(fs_info, ret, +@@ -1949,6 +1951,14 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) + struct btrfs_transaction *prev_trans = NULL; + int ret; + ++ /* ++ * Some places just start a transaction to commit it. We need to make ++ * sure that if this commit fails that the abort code actually marks the ++ * transaction as failed, so set trans->dirty to make the abort code do ++ * the right thing. ++ */ ++ trans->dirty = true; ++ + /* Stop the commit early if ->aborted is set */ + if (unlikely(READ_ONCE(cur_trans->aborted))) { + ret = cur_trans->aborted; +@@ -2237,7 +2247,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) + list_add_tail(&fs_info->chunk_root->dirty_list, + &cur_trans->switch_commits); + +- switch_commit_roots(cur_trans); ++ switch_commit_roots(trans); + + ASSERT(list_empty(&cur_trans->dirty_bgs)); + ASSERT(list_empty(&cur_trans->io_bgs)); +diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c +index ab27e6cd9b3e..6f2178618c22 100644 +--- a/fs/btrfs/tree-log.c ++++ b/fs/btrfs/tree-log.c +@@ -3953,7 +3953,7 @@ static int log_csums(struct btrfs_trans_handle *trans, + static noinline int copy_items(struct btrfs_trans_handle *trans, + struct btrfs_inode *inode, + struct btrfs_path *dst_path, +- struct btrfs_path *src_path, u64 *last_extent, ++ struct btrfs_path *src_path, + int start_slot, int nr, int inode_only, + u64 logged_isize) + { +@@ -3964,7 +3964,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + struct btrfs_file_extent_item *extent; + struct btrfs_inode_item *inode_item; + struct extent_buffer *src = src_path->nodes[0]; +- struct btrfs_key first_key, last_key, key; + int ret; + struct btrfs_key *ins_keys; + u32 *ins_sizes; +@@ -3972,9 +3971,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + int i; + struct list_head ordered_sums; + int skip_csum = inode->flags & BTRFS_INODE_NODATASUM; +- bool has_extents = false; +- bool need_find_last_extent = true; +- bool done = false; + + INIT_LIST_HEAD(&ordered_sums); + +@@ -3983,8 +3979,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + if (!ins_data) + return -ENOMEM; + +- first_key.objectid = (u64)-1; +- + ins_sizes = (u32 *)ins_data; + ins_keys = (struct btrfs_key *)(ins_data + nr * sizeof(u32)); + +@@ -4005,9 +3999,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + + src_offset = btrfs_item_ptr_offset(src, start_slot + i); + +- if (i == nr - 1) +- last_key = ins_keys[i]; +- + if (ins_keys[i].type == BTRFS_INODE_ITEM_KEY) { + inode_item = btrfs_item_ptr(dst_path->nodes[0], + dst_path->slots[0], +@@ -4021,20 +4012,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + src_offset, ins_sizes[i]); + } + +- /* +- * We set need_find_last_extent here in case we know we were +- * processing other items and then walk into the first extent in +- * the inode. If we don't hit an extent then nothing changes, +- * we'll do the last search the next time around. +- */ +- if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY) { +- has_extents = true; +- if (first_key.objectid == (u64)-1) +- first_key = ins_keys[i]; +- } else { +- need_find_last_extent = false; +- } +- + /* take a reference on file data extents so that truncates + * or deletes of this inode don't have to relog the inode + * again +@@ -4100,167 +4077,6 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, + kfree(sums); + } + +- if (!has_extents) +- return ret; +- +- if (need_find_last_extent && *last_extent == first_key.offset) { +- /* +- * We don't have any leafs between our current one and the one +- * we processed before that can have file extent items for our +- * inode (and have a generation number smaller than our current +- * transaction id). +- */ +- need_find_last_extent = false; +- } +- +- /* +- * Because we use btrfs_search_forward we could skip leaves that were +- * not modified and then assume *last_extent is valid when it really +- * isn't. So back up to the previous leaf and read the end of the last +- * extent before we go and fill in holes. +- */ +- if (need_find_last_extent) { +- u64 len; +- +- ret = btrfs_prev_leaf(inode->root, src_path); +- if (ret < 0) +- return ret; +- if (ret) +- goto fill_holes; +- if (src_path->slots[0]) +- src_path->slots[0]--; +- src = src_path->nodes[0]; +- btrfs_item_key_to_cpu(src, &key, src_path->slots[0]); +- if (key.objectid != btrfs_ino(inode) || +- key.type != BTRFS_EXTENT_DATA_KEY) +- goto fill_holes; +- extent = btrfs_item_ptr(src, src_path->slots[0], +- struct btrfs_file_extent_item); +- if (btrfs_file_extent_type(src, extent) == +- BTRFS_FILE_EXTENT_INLINE) { +- len = btrfs_file_extent_ram_bytes(src, extent); +- *last_extent = ALIGN(key.offset + len, +- fs_info->sectorsize); +- } else { +- len = btrfs_file_extent_num_bytes(src, extent); +- *last_extent = key.offset + len; +- } +- } +-fill_holes: +- /* So we did prev_leaf, now we need to move to the next leaf, but a few +- * things could have happened +- * +- * 1) A merge could have happened, so we could currently be on a leaf +- * that holds what we were copying in the first place. +- * 2) A split could have happened, and now not all of the items we want +- * are on the same leaf. +- * +- * So we need to adjust how we search for holes, we need to drop the +- * path and re-search for the first extent key we found, and then walk +- * forward until we hit the last one we copied. +- */ +- if (need_find_last_extent) { +- /* btrfs_prev_leaf could return 1 without releasing the path */ +- btrfs_release_path(src_path); +- ret = btrfs_search_slot(NULL, inode->root, &first_key, +- src_path, 0, 0); +- if (ret < 0) +- return ret; +- ASSERT(ret == 0); +- src = src_path->nodes[0]; +- i = src_path->slots[0]; +- } else { +- i = start_slot; +- } +- +- /* +- * Ok so here we need to go through and fill in any holes we may have +- * to make sure that holes are punched for those areas in case they had +- * extents previously. +- */ +- while (!done) { +- u64 offset, len; +- u64 extent_end; +- +- if (i >= btrfs_header_nritems(src_path->nodes[0])) { +- ret = btrfs_next_leaf(inode->root, src_path); +- if (ret < 0) +- return ret; +- ASSERT(ret == 0); +- src = src_path->nodes[0]; +- i = 0; +- need_find_last_extent = true; +- } +- +- btrfs_item_key_to_cpu(src, &key, i); +- if (!btrfs_comp_cpu_keys(&key, &last_key)) +- done = true; +- if (key.objectid != btrfs_ino(inode) || +- key.type != BTRFS_EXTENT_DATA_KEY) { +- i++; +- continue; +- } +- extent = btrfs_item_ptr(src, i, struct btrfs_file_extent_item); +- if (btrfs_file_extent_type(src, extent) == +- BTRFS_FILE_EXTENT_INLINE) { +- len = btrfs_file_extent_ram_bytes(src, extent); +- extent_end = ALIGN(key.offset + len, +- fs_info->sectorsize); +- } else { +- len = btrfs_file_extent_num_bytes(src, extent); +- extent_end = key.offset + len; +- } +- i++; +- +- if (*last_extent == key.offset) { +- *last_extent = extent_end; +- continue; +- } +- offset = *last_extent; +- len = key.offset - *last_extent; +- ret = btrfs_insert_file_extent(trans, log, btrfs_ino(inode), +- offset, 0, 0, len, 0, len, 0, 0, 0); +- if (ret) +- break; +- *last_extent = extent_end; +- } +- +- /* +- * Check if there is a hole between the last extent found in our leaf +- * and the first extent in the next leaf. If there is one, we need to +- * log an explicit hole so that at replay time we can punch the hole. +- */ +- if (ret == 0 && +- key.objectid == btrfs_ino(inode) && +- key.type == BTRFS_EXTENT_DATA_KEY && +- i == btrfs_header_nritems(src_path->nodes[0])) { +- ret = btrfs_next_leaf(inode->root, src_path); +- need_find_last_extent = true; +- if (ret > 0) { +- ret = 0; +- } else if (ret == 0) { +- btrfs_item_key_to_cpu(src_path->nodes[0], &key, +- src_path->slots[0]); +- if (key.objectid == btrfs_ino(inode) && +- key.type == BTRFS_EXTENT_DATA_KEY && +- *last_extent < key.offset) { +- const u64 len = key.offset - *last_extent; +- +- ret = btrfs_insert_file_extent(trans, log, +- btrfs_ino(inode), +- *last_extent, 0, +- 0, len, 0, len, +- 0, 0, 0); +- *last_extent += len; +- } +- } +- } +- /* +- * Need to let the callers know we dropped the path so they should +- * re-search. +- */ +- if (!ret && need_find_last_extent) +- ret = 1; + return ret; + } + +@@ -4425,7 +4241,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + const u64 i_size = i_size_read(&inode->vfs_inode); + const u64 ino = btrfs_ino(inode); + struct btrfs_path *dst_path = NULL; +- u64 last_extent = (u64)-1; ++ bool dropped_extents = false; + int ins_nr = 0; + int start_slot; + int ret; +@@ -4447,8 +4263,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + if (slot >= btrfs_header_nritems(leaf)) { + if (ins_nr > 0) { + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, start_slot, +- ins_nr, 1, 0); ++ start_slot, ins_nr, 1, 0); + if (ret < 0) + goto out; + ins_nr = 0; +@@ -4472,8 +4287,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + path->slots[0]++; + continue; + } +- if (last_extent == (u64)-1) { +- last_extent = key.offset; ++ if (!dropped_extents) { + /* + * Avoid logging extent items logged in past fsync calls + * and leading to duplicate keys in the log tree. +@@ -4487,6 +4301,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + } while (ret == -EAGAIN); + if (ret) + goto out; ++ dropped_extents = true; + } + if (ins_nr == 0) + start_slot = slot; +@@ -4501,7 +4316,7 @@ static int btrfs_log_prealloc_extents(struct btrfs_trans_handle *trans, + } + } + if (ins_nr > 0) { +- ret = copy_items(trans, inode, dst_path, path, &last_extent, ++ ret = copy_items(trans, inode, dst_path, path, + start_slot, ins_nr, 1, 0); + if (ret > 0) + ret = 0; +@@ -4688,13 +4503,8 @@ static int btrfs_log_all_xattrs(struct btrfs_trans_handle *trans, + + if (slot >= nritems) { + if (ins_nr > 0) { +- u64 last_extent = 0; +- + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, start_slot, +- ins_nr, 1, 0); +- /* can't be 1, extent items aren't processed */ +- ASSERT(ret <= 0); ++ start_slot, ins_nr, 1, 0); + if (ret < 0) + return ret; + ins_nr = 0; +@@ -4718,13 +4528,8 @@ static int btrfs_log_all_xattrs(struct btrfs_trans_handle *trans, + cond_resched(); + } + if (ins_nr > 0) { +- u64 last_extent = 0; +- + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, start_slot, +- ins_nr, 1, 0); +- /* can't be 1, extent items aren't processed */ +- ASSERT(ret <= 0); ++ start_slot, ins_nr, 1, 0); + if (ret < 0) + return ret; + } +@@ -4733,100 +4538,119 @@ static int btrfs_log_all_xattrs(struct btrfs_trans_handle *trans, + } + + /* +- * If the no holes feature is enabled we need to make sure any hole between the +- * last extent and the i_size of our inode is explicitly marked in the log. This +- * is to make sure that doing something like: +- * +- * 1) create file with 128Kb of data +- * 2) truncate file to 64Kb +- * 3) truncate file to 256Kb +- * 4) fsync file +- * 5) +- * 6) mount fs and trigger log replay +- * +- * Will give us a file with a size of 256Kb, the first 64Kb of data match what +- * the file had in its first 64Kb of data at step 1 and the last 192Kb of the +- * file correspond to a hole. The presence of explicit holes in a log tree is +- * what guarantees that log replay will remove/adjust file extent items in the +- * fs/subvol tree. +- * +- * Here we do not need to care about holes between extents, that is already done +- * by copy_items(). We also only need to do this in the full sync path, where we +- * lookup for extents from the fs/subvol tree only. In the fast path case, we +- * lookup the list of modified extent maps and if any represents a hole, we +- * insert a corresponding extent representing a hole in the log tree. ++ * When using the NO_HOLES feature if we punched a hole that causes the ++ * deletion of entire leafs or all the extent items of the first leaf (the one ++ * that contains the inode item and references) we may end up not processing ++ * any extents, because there are no leafs with a generation matching the ++ * current transaction that have extent items for our inode. So we need to find ++ * if any holes exist and then log them. We also need to log holes after any ++ * truncate operation that changes the inode's size. + */ +-static int btrfs_log_trailing_hole(struct btrfs_trans_handle *trans, +- struct btrfs_root *root, +- struct btrfs_inode *inode, +- struct btrfs_path *path) ++static int btrfs_log_holes(struct btrfs_trans_handle *trans, ++ struct btrfs_root *root, ++ struct btrfs_inode *inode, ++ struct btrfs_path *path) + { + struct btrfs_fs_info *fs_info = root->fs_info; +- int ret; + struct btrfs_key key; +- u64 hole_start; +- u64 hole_size; +- struct extent_buffer *leaf; +- struct btrfs_root *log = root->log_root; + const u64 ino = btrfs_ino(inode); + const u64 i_size = i_size_read(&inode->vfs_inode); ++ u64 prev_extent_end = 0; ++ int ret; + +- if (!btrfs_fs_incompat(fs_info, NO_HOLES)) ++ if (!btrfs_fs_incompat(fs_info, NO_HOLES) || i_size == 0) + return 0; + + key.objectid = ino; + key.type = BTRFS_EXTENT_DATA_KEY; +- key.offset = (u64)-1; ++ key.offset = 0; + + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); +- ASSERT(ret != 0); + if (ret < 0) + return ret; + +- ASSERT(path->slots[0] > 0); +- path->slots[0]--; +- leaf = path->nodes[0]; +- btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); +- +- if (key.objectid != ino || key.type != BTRFS_EXTENT_DATA_KEY) { +- /* inode does not have any extents */ +- hole_start = 0; +- hole_size = i_size; +- } else { ++ while (true) { + struct btrfs_file_extent_item *extent; ++ struct extent_buffer *leaf = path->nodes[0]; + u64 len; + +- /* +- * If there's an extent beyond i_size, an explicit hole was +- * already inserted by copy_items(). +- */ +- if (key.offset >= i_size) +- return 0; ++ if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { ++ ret = btrfs_next_leaf(root, path); ++ if (ret < 0) ++ return ret; ++ if (ret > 0) { ++ ret = 0; ++ break; ++ } ++ leaf = path->nodes[0]; ++ } ++ ++ btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); ++ if (key.objectid != ino || key.type != BTRFS_EXTENT_DATA_KEY) ++ break; ++ ++ /* We have a hole, log it. */ ++ if (prev_extent_end < key.offset) { ++ const u64 hole_len = key.offset - prev_extent_end; ++ ++ /* ++ * Release the path to avoid deadlocks with other code ++ * paths that search the root while holding locks on ++ * leafs from the log root. ++ */ ++ btrfs_release_path(path); ++ ret = btrfs_insert_file_extent(trans, root->log_root, ++ ino, prev_extent_end, 0, ++ 0, hole_len, 0, hole_len, ++ 0, 0, 0); ++ if (ret < 0) ++ return ret; ++ ++ /* ++ * Search for the same key again in the root. Since it's ++ * an extent item and we are holding the inode lock, the ++ * key must still exist. If it doesn't just emit warning ++ * and return an error to fall back to a transaction ++ * commit. ++ */ ++ ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); ++ if (ret < 0) ++ return ret; ++ if (WARN_ON(ret > 0)) ++ return -ENOENT; ++ leaf = path->nodes[0]; ++ } + + extent = btrfs_item_ptr(leaf, path->slots[0], + struct btrfs_file_extent_item); +- + if (btrfs_file_extent_type(leaf, extent) == +- BTRFS_FILE_EXTENT_INLINE) +- return 0; ++ BTRFS_FILE_EXTENT_INLINE) { ++ len = btrfs_file_extent_ram_bytes(leaf, extent); ++ prev_extent_end = ALIGN(key.offset + len, ++ fs_info->sectorsize); ++ } else { ++ len = btrfs_file_extent_num_bytes(leaf, extent); ++ prev_extent_end = key.offset + len; ++ } + +- len = btrfs_file_extent_num_bytes(leaf, extent); +- /* Last extent goes beyond i_size, no need to log a hole. */ +- if (key.offset + len > i_size) +- return 0; +- hole_start = key.offset + len; +- hole_size = i_size - hole_start; ++ path->slots[0]++; ++ cond_resched(); + } +- btrfs_release_path(path); + +- /* Last extent ends at i_size. */ +- if (hole_size == 0) +- return 0; ++ if (prev_extent_end < i_size) { ++ u64 hole_len; + +- hole_size = ALIGN(hole_size, fs_info->sectorsize); +- ret = btrfs_insert_file_extent(trans, log, ino, hole_start, 0, 0, +- hole_size, 0, hole_size, 0, 0, 0); +- return ret; ++ btrfs_release_path(path); ++ hole_len = ALIGN(i_size - prev_extent_end, fs_info->sectorsize); ++ ret = btrfs_insert_file_extent(trans, root->log_root, ++ ino, prev_extent_end, 0, 0, ++ hole_len, 0, hole_len, ++ 0, 0, 0); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; + } + + /* +@@ -5030,6 +4854,50 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, + } + continue; + } ++ /* ++ * If the inode was already logged skip it - otherwise we can ++ * hit an infinite loop. Example: ++ * ++ * From the commit root (previous transaction) we have the ++ * following inodes: ++ * ++ * inode 257 a directory ++ * inode 258 with references "zz" and "zz_link" on inode 257 ++ * inode 259 with reference "a" on inode 257 ++ * ++ * And in the current (uncommitted) transaction we have: ++ * ++ * inode 257 a directory, unchanged ++ * inode 258 with references "a" and "a2" on inode 257 ++ * inode 259 with reference "zz_link" on inode 257 ++ * inode 261 with reference "zz" on inode 257 ++ * ++ * When logging inode 261 the following infinite loop could ++ * happen if we don't skip already logged inodes: ++ * ++ * - we detect inode 258 as a conflicting inode, with inode 261 ++ * on reference "zz", and log it; ++ * ++ * - we detect inode 259 as a conflicting inode, with inode 258 ++ * on reference "a", and log it; ++ * ++ * - we detect inode 258 as a conflicting inode, with inode 259 ++ * on reference "zz_link", and log it - again! After this we ++ * repeat the above steps forever. ++ */ ++ spin_lock(&BTRFS_I(inode)->lock); ++ /* ++ * Check the inode's logged_trans only instead of ++ * btrfs_inode_in_log(). This is because the last_log_commit of ++ * the inode is not updated when we only log that it exists and ++ * and it has the full sync bit set (see btrfs_log_inode()). ++ */ ++ if (BTRFS_I(inode)->logged_trans == trans->transid) { ++ spin_unlock(&BTRFS_I(inode)->lock); ++ btrfs_add_delayed_iput(inode); ++ continue; ++ } ++ spin_unlock(&BTRFS_I(inode)->lock); + /* + * We are safe logging the other inode without acquiring its + * lock as long as we log with the LOG_INODE_EXISTS mode. We +@@ -5129,7 +4997,6 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, + struct btrfs_key min_key; + struct btrfs_key max_key; + struct btrfs_root *log = root->log_root; +- u64 last_extent = 0; + int err = 0; + int ret; + int nritems; +@@ -5307,7 +5174,7 @@ again: + ins_start_slot = path->slots[0]; + } + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, ins_start_slot, ++ ins_start_slot, + ins_nr, inode_only, + logged_isize); + if (ret < 0) { +@@ -5330,17 +5197,13 @@ again: + if (ins_nr == 0) + goto next_slot; + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, ins_start_slot, ++ ins_start_slot, + ins_nr, inode_only, logged_isize); + if (ret < 0) { + err = ret; + goto out_unlock; + } + ins_nr = 0; +- if (ret) { +- btrfs_release_path(path); +- continue; +- } + goto next_slot; + } + +@@ -5353,18 +5216,13 @@ again: + goto next_slot; + } + +- ret = copy_items(trans, inode, dst_path, path, &last_extent, ++ ret = copy_items(trans, inode, dst_path, path, + ins_start_slot, ins_nr, inode_only, + logged_isize); + if (ret < 0) { + err = ret; + goto out_unlock; + } +- if (ret) { +- ins_nr = 0; +- btrfs_release_path(path); +- continue; +- } + ins_nr = 1; + ins_start_slot = path->slots[0]; + next_slot: +@@ -5378,13 +5236,12 @@ next_slot: + } + if (ins_nr) { + ret = copy_items(trans, inode, dst_path, path, +- &last_extent, ins_start_slot, ++ ins_start_slot, + ins_nr, inode_only, logged_isize); + if (ret < 0) { + err = ret; + goto out_unlock; + } +- ret = 0; + ins_nr = 0; + } + btrfs_release_path(path); +@@ -5399,14 +5256,13 @@ next_key: + } + } + if (ins_nr) { +- ret = copy_items(trans, inode, dst_path, path, &last_extent, ++ ret = copy_items(trans, inode, dst_path, path, + ins_start_slot, ins_nr, inode_only, + logged_isize); + if (ret < 0) { + err = ret; + goto out_unlock; + } +- ret = 0; + ins_nr = 0; + } + +@@ -5419,7 +5275,7 @@ next_key: + if (max_key.type >= BTRFS_EXTENT_DATA_KEY && !fast_search) { + btrfs_release_path(path); + btrfs_release_path(dst_path); +- err = btrfs_log_trailing_hole(trans, root, inode, path); ++ err = btrfs_log_holes(trans, root, inode, path); + if (err) + goto out_unlock; + } +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index 97f1ba7c18b2..f7d9fc1a6fc2 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -881,17 +881,28 @@ static struct btrfs_fs_devices *find_fsid_changed( + /* + * Handles the case where scanned device is part of an fs that had + * multiple successful changes of FSID but curently device didn't +- * observe it. Meaning our fsid will be different than theirs. ++ * observe it. Meaning our fsid will be different than theirs. We need ++ * to handle two subcases : ++ * 1 - The fs still continues to have different METADATA/FSID uuids. ++ * 2 - The fs is switched back to its original FSID (METADATA/FSID ++ * are equal). + */ + list_for_each_entry(fs_devices, &fs_uuids, fs_list) { ++ /* Changed UUIDs */ + if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid, + BTRFS_FSID_SIZE) != 0 && + memcmp(fs_devices->metadata_uuid, disk_super->metadata_uuid, + BTRFS_FSID_SIZE) == 0 && + memcmp(fs_devices->fsid, disk_super->fsid, +- BTRFS_FSID_SIZE) != 0) { ++ BTRFS_FSID_SIZE) != 0) ++ return fs_devices; ++ ++ /* Unchanged UUIDs */ ++ if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid, ++ BTRFS_FSID_SIZE) == 0 && ++ memcmp(fs_devices->fsid, disk_super->metadata_uuid, ++ BTRFS_FSID_SIZE) == 0) + return fs_devices; +- } + } + + return NULL; +diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c +index e1cac715d19e..06d932ed097e 100644 +--- a/fs/cifs/smb2pdu.c ++++ b/fs/cifs/smb2pdu.c +@@ -350,9 +350,14 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon) + } + + rc = cifs_negotiate_protocol(0, tcon->ses); +- if (!rc && tcon->ses->need_reconnect) ++ if (!rc && tcon->ses->need_reconnect) { + rc = cifs_setup_session(0, tcon->ses, nls_codepage); +- ++ if ((rc == -EACCES) && !tcon->retry) { ++ rc = -EHOSTDOWN; ++ mutex_unlock(&tcon->ses->session_mutex); ++ goto failed; ++ } ++ } + if (rc || !tcon->need_reconnect) { + mutex_unlock(&tcon->ses->session_mutex); + goto out; +@@ -397,6 +402,7 @@ out: + case SMB2_SET_INFO: + rc = -EAGAIN; + } ++failed: + unload_nls(nls_codepage); + return rc; + } +diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c +index 680aba9c00d5..fd0b5dd68f9e 100644 +--- a/fs/configfs/inode.c ++++ b/fs/configfs/inode.c +@@ -76,14 +76,11 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr) + if (ia_valid & ATTR_GID) + sd_iattr->ia_gid = iattr->ia_gid; + if (ia_valid & ATTR_ATIME) +- sd_iattr->ia_atime = timestamp_truncate(iattr->ia_atime, +- inode); ++ sd_iattr->ia_atime = iattr->ia_atime; + if (ia_valid & ATTR_MTIME) +- sd_iattr->ia_mtime = timestamp_truncate(iattr->ia_mtime, +- inode); ++ sd_iattr->ia_mtime = iattr->ia_mtime; + if (ia_valid & ATTR_CTIME) +- sd_iattr->ia_ctime = timestamp_truncate(iattr->ia_ctime, +- inode); ++ sd_iattr->ia_ctime = iattr->ia_ctime; + if (ia_valid & ATTR_MODE) { + umode_t mode = iattr->ia_mode; + +diff --git a/fs/crypto/keyring.c b/fs/crypto/keyring.c +index c34fa7c61b43..4ee65b2b6247 100644 +--- a/fs/crypto/keyring.c ++++ b/fs/crypto/keyring.c +@@ -664,9 +664,6 @@ static int check_for_busy_inodes(struct super_block *sb, + struct list_head *pos; + size_t busy_count = 0; + unsigned long ino; +- struct dentry *dentry; +- char _path[256]; +- char *path = NULL; + + spin_lock(&mk->mk_decrypted_inodes_lock); + +@@ -685,22 +682,14 @@ static int check_for_busy_inodes(struct super_block *sb, + struct fscrypt_info, + ci_master_key_link)->ci_inode; + ino = inode->i_ino; +- dentry = d_find_alias(inode); + } + spin_unlock(&mk->mk_decrypted_inodes_lock); + +- if (dentry) { +- path = dentry_path(dentry, _path, sizeof(_path)); +- dput(dentry); +- } +- if (IS_ERR_OR_NULL(path)) +- path = "(unknown)"; +- + fscrypt_warn(NULL, +- "%s: %zu inode(s) still busy after removing key with %s %*phN, including ino %lu (%s)", ++ "%s: %zu inode(s) still busy after removing key with %s %*phN, including ino %lu", + sb->s_id, busy_count, master_key_spec_type(&mk->mk_spec), + master_key_spec_len(&mk->mk_spec), (u8 *)&mk->mk_spec.u, +- ino, path); ++ ino); + return -EBUSY; + } + +diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c +index 19f89f9fb10c..23b74b8e8f96 100644 +--- a/fs/erofs/decompressor.c ++++ b/fs/erofs/decompressor.c +@@ -306,24 +306,22 @@ static int z_erofs_shifted_transform(const struct z_erofs_decompress_req *rq, + } + + src = kmap_atomic(*rq->in); +- if (!rq->out[0]) { +- dst = NULL; +- } else { ++ if (rq->out[0]) { + dst = kmap_atomic(rq->out[0]); + memcpy(dst + rq->pageofs_out, src, righthalf); ++ kunmap_atomic(dst); + } + +- if (rq->out[1] == *rq->in) { +- memmove(src, src + righthalf, rq->pageofs_out); +- } else if (nrpages_out == 2) { +- if (dst) +- kunmap_atomic(dst); ++ if (nrpages_out == 2) { + DBG_BUGON(!rq->out[1]); +- dst = kmap_atomic(rq->out[1]); +- memcpy(dst, src + righthalf, rq->pageofs_out); ++ if (rq->out[1] == *rq->in) { ++ memmove(src, src + righthalf, rq->pageofs_out); ++ } else { ++ dst = kmap_atomic(rq->out[1]); ++ memcpy(dst, src + righthalf, rq->pageofs_out); ++ kunmap_atomic(dst); ++ } + } +- if (dst) +- kunmap_atomic(dst); + kunmap_atomic(src); + return 0; + } +diff --git a/fs/eventfd.c b/fs/eventfd.c +index 8aa0ea8c55e8..78e41c7c3d05 100644 +--- a/fs/eventfd.c ++++ b/fs/eventfd.c +@@ -24,6 +24,8 @@ + #include + #include + ++DEFINE_PER_CPU(int, eventfd_wake_count); ++ + static DEFINE_IDA(eventfd_ida); + + struct eventfd_ctx { +@@ -60,12 +62,25 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) + { + unsigned long flags; + ++ /* ++ * Deadlock or stack overflow issues can happen if we recurse here ++ * through waitqueue wakeup handlers. If the caller users potentially ++ * nested waitqueues with custom wakeup handlers, then it should ++ * check eventfd_signal_count() before calling this function. If ++ * it returns true, the eventfd_signal() call should be deferred to a ++ * safe context. ++ */ ++ if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count))) ++ return 0; ++ + spin_lock_irqsave(&ctx->wqh.lock, flags); ++ this_cpu_inc(eventfd_wake_count); + if (ULLONG_MAX - ctx->count < n) + n = ULLONG_MAX - ctx->count; + ctx->count += n; + if (waitqueue_active(&ctx->wqh)) + wake_up_locked_poll(&ctx->wqh, EPOLLIN); ++ this_cpu_dec(eventfd_wake_count); + spin_unlock_irqrestore(&ctx->wqh.lock, flags); + + return n; +diff --git a/fs/ext2/super.c b/fs/ext2/super.c +index 30c630d73f0f..065cd2d1bdc6 100644 +--- a/fs/ext2/super.c ++++ b/fs/ext2/super.c +@@ -1082,9 +1082,9 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) + + if (EXT2_BLOCKS_PER_GROUP(sb) == 0) + goto cantfind_ext2; +- sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - +- le32_to_cpu(es->s_first_data_block) - 1) +- / EXT2_BLOCKS_PER_GROUP(sb)) + 1; ++ sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - ++ le32_to_cpu(es->s_first_data_block) - 1) ++ / EXT2_BLOCKS_PER_GROUP(sb)) + 1; + db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / + EXT2_DESC_PER_BLOCK(sb); + sbi->s_group_desc = kmalloc_array (db_count, +diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c +index 6305d5ec25af..5ef8d7ae231b 100644 +--- a/fs/ext4/dir.c ++++ b/fs/ext4/dir.c +@@ -673,9 +673,11 @@ static int ext4_d_compare(const struct dentry *dentry, unsigned int len, + const char *str, const struct qstr *name) + { + struct qstr qstr = {.name = str, .len = len }; +- struct inode *inode = dentry->d_parent->d_inode; ++ const struct dentry *parent = READ_ONCE(dentry->d_parent); ++ const struct inode *inode = READ_ONCE(parent->d_inode); + +- if (!IS_CASEFOLDED(inode) || !EXT4_SB(inode->i_sb)->s_encoding) { ++ if (!inode || !IS_CASEFOLDED(inode) || ++ !EXT4_SB(inode->i_sb)->s_encoding) { + if (len != name->len) + return -1; + return memcmp(str, name->name, len); +@@ -688,10 +690,11 @@ static int ext4_d_hash(const struct dentry *dentry, struct qstr *str) + { + const struct ext4_sb_info *sbi = EXT4_SB(dentry->d_sb); + const struct unicode_map *um = sbi->s_encoding; ++ const struct inode *inode = READ_ONCE(dentry->d_inode); + unsigned char *norm; + int len, ret = 0; + +- if (!IS_CASEFOLDED(dentry->d_inode) || !um) ++ if (!inode || !IS_CASEFOLDED(inode) || !um) + return 0; + + norm = kmalloc(PATH_MAX, GFP_ATOMIC); +diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c +index 12ceadef32c5..2cc9f2168b9e 100644 +--- a/fs/ext4/page-io.c ++++ b/fs/ext4/page-io.c +@@ -478,17 +478,26 @@ int ext4_bio_write_page(struct ext4_io_submit *io, + gfp_t gfp_flags = GFP_NOFS; + unsigned int enc_bytes = round_up(len, i_blocksize(inode)); + ++ /* ++ * Since bounce page allocation uses a mempool, we can only use ++ * a waiting mask (i.e. request guaranteed allocation) on the ++ * first page of the bio. Otherwise it can deadlock. ++ */ ++ if (io->io_bio) ++ gfp_flags = GFP_NOWAIT | __GFP_NOWARN; + retry_encrypt: + bounce_page = fscrypt_encrypt_pagecache_blocks(page, enc_bytes, + 0, gfp_flags); + if (IS_ERR(bounce_page)) { + ret = PTR_ERR(bounce_page); +- if (ret == -ENOMEM && wbc->sync_mode == WB_SYNC_ALL) { +- if (io->io_bio) { ++ if (ret == -ENOMEM && ++ (io->io_bio || wbc->sync_mode == WB_SYNC_ALL)) { ++ gfp_flags = GFP_NOFS; ++ if (io->io_bio) + ext4_io_submit(io); +- congestion_wait(BLK_RW_ASYNC, HZ/50); +- } +- gfp_flags |= __GFP_NOFAIL; ++ else ++ gfp_flags |= __GFP_NOFAIL; ++ congestion_wait(BLK_RW_ASYNC, HZ/50); + goto retry_encrypt; + } + bounce_page = NULL; +diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c +index 4033778bcbbf..84280ad3786c 100644 +--- a/fs/f2fs/dir.c ++++ b/fs/f2fs/dir.c +@@ -1068,24 +1068,27 @@ static int f2fs_d_compare(const struct dentry *dentry, unsigned int len, + const char *str, const struct qstr *name) + { + struct qstr qstr = {.name = str, .len = len }; ++ const struct dentry *parent = READ_ONCE(dentry->d_parent); ++ const struct inode *inode = READ_ONCE(parent->d_inode); + +- if (!IS_CASEFOLDED(dentry->d_parent->d_inode)) { ++ if (!inode || !IS_CASEFOLDED(inode)) { + if (len != name->len) + return -1; +- return memcmp(str, name, len); ++ return memcmp(str, name->name, len); + } + +- return f2fs_ci_compare(dentry->d_parent->d_inode, name, &qstr, false); ++ return f2fs_ci_compare(inode, name, &qstr, false); + } + + static int f2fs_d_hash(const struct dentry *dentry, struct qstr *str) + { + struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); + const struct unicode_map *um = sbi->s_encoding; ++ const struct inode *inode = READ_ONCE(dentry->d_inode); + unsigned char *norm; + int len, ret = 0; + +- if (!IS_CASEFOLDED(dentry->d_inode)) ++ if (!inode || !IS_CASEFOLDED(inode)) + return 0; + + norm = f2fs_kmalloc(sbi, PATH_MAX, GFP_ATOMIC); +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index fae665691481..72f308790a8e 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -751,18 +751,12 @@ static void __setattr_copy(struct inode *inode, const struct iattr *attr) + inode->i_uid = attr->ia_uid; + if (ia_valid & ATTR_GID) + inode->i_gid = attr->ia_gid; +- if (ia_valid & ATTR_ATIME) { +- inode->i_atime = timestamp_truncate(attr->ia_atime, +- inode); +- } +- if (ia_valid & ATTR_MTIME) { +- inode->i_mtime = timestamp_truncate(attr->ia_mtime, +- inode); +- } +- if (ia_valid & ATTR_CTIME) { +- inode->i_ctime = timestamp_truncate(attr->ia_ctime, +- inode); +- } ++ if (ia_valid & ATTR_ATIME) ++ inode->i_atime = attr->ia_atime; ++ if (ia_valid & ATTR_MTIME) ++ inode->i_mtime = attr->ia_mtime; ++ if (ia_valid & ATTR_CTIME) ++ inode->i_ctime = attr->ia_ctime; + if (ia_valid & ATTR_MODE) { + umode_t mode = attr->ia_mode; + +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index 1443cee15863..ea8dbf1458c9 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -1213,9 +1213,11 @@ static int f2fs_statfs_project(struct super_block *sb, + return PTR_ERR(dquot); + spin_lock(&dquot->dq_dqb_lock); + +- limit = (dquot->dq_dqb.dqb_bsoftlimit ? +- dquot->dq_dqb.dqb_bsoftlimit : +- dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits; ++ limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit, ++ dquot->dq_dqb.dqb_bhardlimit); ++ if (limit) ++ limit >>= sb->s_blocksize_bits; ++ + if (limit && buf->f_blocks > limit) { + curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits; + buf->f_blocks = limit; +@@ -1224,9 +1226,9 @@ static int f2fs_statfs_project(struct super_block *sb, + (buf->f_blocks - curblock) : 0; + } + +- limit = dquot->dq_dqb.dqb_isoftlimit ? +- dquot->dq_dqb.dqb_isoftlimit : +- dquot->dq_dqb.dqb_ihardlimit; ++ limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit, ++ dquot->dq_dqb.dqb_ihardlimit); ++ + if (limit && buf->f_files > limit) { + buf->f_files = limit; + buf->f_ffree = +diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c +index 335607b8c5c0..76ac9c7d32ec 100644 +--- a/fs/fs-writeback.c ++++ b/fs/fs-writeback.c +@@ -2063,7 +2063,7 @@ void wb_workfn(struct work_struct *work) + struct bdi_writeback, dwork); + long pages_written; + +- set_worker_desc("flush-%s", dev_name(wb->bdi->dev)); ++ set_worker_desc("flush-%s", bdi_dev_name(wb->bdi)); + current->flags |= PF_SWAPWRITE; + + if (likely(!current_is_workqueue_rescuer() || +diff --git a/fs/fuse/file.c b/fs/fuse/file.c +index ce715380143c..695369f46f92 100644 +--- a/fs/fuse/file.c ++++ b/fs/fuse/file.c +@@ -1465,6 +1465,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, + } + ia = NULL; + if (nres < 0) { ++ iov_iter_revert(iter, nbytes); + err = nres; + break; + } +@@ -1473,8 +1474,10 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, + count -= nres; + res += nres; + pos += nres; +- if (nres != nbytes) ++ if (nres != nbytes) { ++ iov_iter_revert(iter, nbytes - nres); + break; ++ } + if (count) { + max_pages = iov_iter_npages(iter, fc->max_pages); + ia = fuse_io_alloc(io, max_pages); +diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c +index 01ff37b76652..4a10b4e7092a 100644 +--- a/fs/gfs2/file.c ++++ b/fs/gfs2/file.c +@@ -833,7 +833,7 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from) + struct file *file = iocb->ki_filp; + struct inode *inode = file_inode(file); + struct gfs2_inode *ip = GFS2_I(inode); +- ssize_t written = 0, ret; ++ ssize_t ret; + + ret = gfs2_rsqa_alloc(ip); + if (ret) +@@ -853,68 +853,58 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from) + inode_lock(inode); + ret = generic_write_checks(iocb, from); + if (ret <= 0) +- goto out; +- +- /* We can write back this queue in page reclaim */ +- current->backing_dev_info = inode_to_bdi(inode); ++ goto out_unlock; + + ret = file_remove_privs(file); + if (ret) +- goto out2; ++ goto out_unlock; + + ret = file_update_time(file); + if (ret) +- goto out2; ++ goto out_unlock; + + if (iocb->ki_flags & IOCB_DIRECT) { + struct address_space *mapping = file->f_mapping; +- loff_t pos, endbyte; +- ssize_t buffered; ++ ssize_t buffered, ret2; + +- written = gfs2_file_direct_write(iocb, from); +- if (written < 0 || !iov_iter_count(from)) +- goto out2; ++ ret = gfs2_file_direct_write(iocb, from); ++ if (ret < 0 || !iov_iter_count(from)) ++ goto out_unlock; + +- ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); +- if (unlikely(ret < 0)) +- goto out2; +- buffered = ret; ++ iocb->ki_flags |= IOCB_DSYNC; ++ current->backing_dev_info = inode_to_bdi(inode); ++ buffered = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); ++ current->backing_dev_info = NULL; ++ if (unlikely(buffered <= 0)) ++ goto out_unlock; + + /* + * We need to ensure that the page cache pages are written to + * disk and invalidated to preserve the expected O_DIRECT +- * semantics. ++ * semantics. If the writeback or invalidate fails, only report ++ * the direct I/O range as we don't know if the buffered pages ++ * made it to disk. + */ +- pos = iocb->ki_pos; +- endbyte = pos + buffered - 1; +- ret = filemap_write_and_wait_range(mapping, pos, endbyte); +- if (!ret) { +- iocb->ki_pos += buffered; +- written += buffered; +- invalidate_mapping_pages(mapping, +- pos >> PAGE_SHIFT, +- endbyte >> PAGE_SHIFT); +- } else { +- /* +- * We don't know how much we wrote, so just return +- * the number of bytes which were direct-written +- */ +- } ++ iocb->ki_pos += buffered; ++ ret2 = generic_write_sync(iocb, buffered); ++ invalidate_mapping_pages(mapping, ++ (iocb->ki_pos - buffered) >> PAGE_SHIFT, ++ (iocb->ki_pos - 1) >> PAGE_SHIFT); ++ if (!ret || ret2 > 0) ++ ret += ret2; + } else { ++ current->backing_dev_info = inode_to_bdi(inode); + ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); +- if (likely(ret > 0)) ++ current->backing_dev_info = NULL; ++ if (likely(ret > 0)) { + iocb->ki_pos += ret; ++ ret = generic_write_sync(iocb, ret); ++ } + } + +-out2: +- current->backing_dev_info = NULL; +-out: ++out_unlock: + inode_unlock(inode); +- if (likely(ret > 0)) { +- /* Handle various SYNC-type writes */ +- ret = generic_write_sync(iocb, ret); +- } +- return written ? written : ret; ++ return ret; + } + + static int fallocate_chunk(struct inode *inode, loff_t offset, loff_t len, +diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c +index e7b9d39955d4..7ca84be20cf6 100644 +--- a/fs/gfs2/lops.c ++++ b/fs/gfs2/lops.c +@@ -421,7 +421,7 @@ static bool gfs2_jhead_pg_srch(struct gfs2_jdesc *jd, + + for (offset = 0; offset < PAGE_SIZE; offset += sdp->sd_sb.sb_bsize) { + if (!__get_log_header(sdp, kaddr + offset, 0, &lh)) { +- if (lh.lh_sequence > head->lh_sequence) ++ if (lh.lh_sequence >= head->lh_sequence) + *head = lh; + else { + ret = true; +diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c +index 1c58859aa592..ef485f892d1b 100644 +--- a/fs/jbd2/journal.c ++++ b/fs/jbd2/journal.c +@@ -981,6 +981,7 @@ static void *jbd2_seq_info_start(struct seq_file *seq, loff_t *pos) + + static void *jbd2_seq_info_next(struct seq_file *seq, void *v, loff_t *pos) + { ++ (*pos)++; + return NULL; + } + +diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c +index e180033e35cf..05ed7be8a634 100644 +--- a/fs/nfs/dir.c ++++ b/fs/nfs/dir.c +@@ -162,6 +162,17 @@ typedef struct { + bool eof; + } nfs_readdir_descriptor_t; + ++static ++void nfs_readdir_init_array(struct page *page) ++{ ++ struct nfs_cache_array *array; ++ ++ array = kmap_atomic(page); ++ memset(array, 0, sizeof(struct nfs_cache_array)); ++ array->eof_index = -1; ++ kunmap_atomic(array); ++} ++ + /* + * we are freeing strings created by nfs_add_to_readdir_array() + */ +@@ -174,6 +185,7 @@ void nfs_readdir_clear_array(struct page *page) + array = kmap_atomic(page); + for (i = 0; i < array->size; i++) + kfree(array->array[i].string.name); ++ array->size = 0; + kunmap_atomic(array); + } + +@@ -610,6 +622,8 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, + int status = -ENOMEM; + unsigned int array_size = ARRAY_SIZE(pages); + ++ nfs_readdir_init_array(page); ++ + entry.prev_cookie = 0; + entry.cookie = desc->last_cookie; + entry.eof = 0; +@@ -626,8 +640,6 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, + } + + array = kmap(page); +- memset(array, 0, sizeof(struct nfs_cache_array)); +- array->eof_index = -1; + + status = nfs_readdir_alloc_pages(pages, array_size); + if (status < 0) +@@ -682,6 +694,7 @@ int nfs_readdir_filler(void *data, struct page* page) + unlock_page(page); + return 0; + error: ++ nfs_readdir_clear_array(page); + unlock_page(page); + return ret; + } +@@ -689,8 +702,6 @@ int nfs_readdir_filler(void *data, struct page* page) + static + void cache_page_release(nfs_readdir_descriptor_t *desc) + { +- if (!desc->page->mapping) +- nfs_readdir_clear_array(desc->page); + put_page(desc->page); + desc->page = NULL; + } +@@ -704,19 +715,28 @@ struct page *get_cache_page(nfs_readdir_descriptor_t *desc) + + /* + * Returns 0 if desc->dir_cookie was found on page desc->page_index ++ * and locks the page to prevent removal from the page cache. + */ + static +-int find_cache_page(nfs_readdir_descriptor_t *desc) ++int find_and_lock_cache_page(nfs_readdir_descriptor_t *desc) + { + int res; + + desc->page = get_cache_page(desc); + if (IS_ERR(desc->page)) + return PTR_ERR(desc->page); +- +- res = nfs_readdir_search_array(desc); ++ res = lock_page_killable(desc->page); + if (res != 0) +- cache_page_release(desc); ++ goto error; ++ res = -EAGAIN; ++ if (desc->page->mapping != NULL) { ++ res = nfs_readdir_search_array(desc); ++ if (res == 0) ++ return 0; ++ } ++ unlock_page(desc->page); ++error: ++ cache_page_release(desc); + return res; + } + +@@ -731,7 +751,7 @@ int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) + desc->last_cookie = 0; + } + do { +- res = find_cache_page(desc); ++ res = find_and_lock_cache_page(desc); + } while (res == -EAGAIN); + return res; + } +@@ -770,7 +790,6 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc) + desc->eof = true; + + kunmap(desc->page); +- cache_page_release(desc); + dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n", + (unsigned long long)*desc->dir_cookie, res); + return res; +@@ -816,13 +835,13 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc) + + status = nfs_do_filldir(desc); + ++ out_release: ++ nfs_readdir_clear_array(desc->page); ++ cache_page_release(desc); + out: + dfprintk(DIRCACHE, "NFS: %s: returns %d\n", + __func__, status); + return status; +- out_release: +- cache_page_release(desc); +- goto out; + } + + /* The file offset position represents the dirent entry number. A +@@ -887,6 +906,8 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) + break; + + res = nfs_do_filldir(desc); ++ unlock_page(desc->page); ++ cache_page_release(desc); + if (res < 0) + break; + } while (!desc->eof); +diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c +index ef55e9b1cd4e..3007b8945d38 100644 +--- a/fs/nfsd/filecache.c ++++ b/fs/nfsd/filecache.c +@@ -791,6 +791,7 @@ nfsd_file_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp, + struct nfsd_file *nf, *new; + struct inode *inode; + unsigned int hashval; ++ bool retry = true; + + /* FIXME: skip this if fh_dentry is already set? */ + status = fh_verify(rqstp, fhp, S_IFREG, +@@ -826,6 +827,11 @@ wait_for_construction: + + /* Did construction of this file fail? */ + if (!test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { ++ if (!retry) { ++ status = nfserr_jukebox; ++ goto out; ++ } ++ retry = false; + nfsd_file_put_noref(nf); + goto retry; + } +diff --git a/fs/nfsd/nfs4layouts.c b/fs/nfsd/nfs4layouts.c +index 2681c70283ce..e12409eca7cc 100644 +--- a/fs/nfsd/nfs4layouts.c ++++ b/fs/nfsd/nfs4layouts.c +@@ -675,7 +675,7 @@ nfsd4_cb_layout_done(struct nfsd4_callback *cb, struct rpc_task *task) + + /* Client gets 2 lease periods to return it */ + cutoff = ktime_add_ns(task->tk_start, +- nn->nfsd4_lease * NSEC_PER_SEC * 2); ++ (u64)nn->nfsd4_lease * NSEC_PER_SEC * 2); + + if (ktime_before(now, cutoff)) { + rpc_delay(task, HZ/100); /* 10 mili-seconds */ +diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c +index 08f6eb2b73f8..1c82d7dd54df 100644 +--- a/fs/nfsd/nfs4state.c ++++ b/fs/nfsd/nfs4state.c +@@ -6550,7 +6550,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, + } + + if (fl_flags & FL_SLEEP) { +- nbl->nbl_time = jiffies; ++ nbl->nbl_time = get_seconds(); + spin_lock(&nn->blocked_locks_lock); + list_add_tail(&nbl->nbl_list, &lock_sop->lo_blocked); + list_add_tail(&nbl->nbl_lru, &nn->blocked_locks_lru); +diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h +index 46f56afb6cb8..a080789b4d13 100644 +--- a/fs/nfsd/state.h ++++ b/fs/nfsd/state.h +@@ -605,7 +605,7 @@ static inline bool nfsd4_stateid_generation_after(stateid_t *a, stateid_t *b) + struct nfsd4_blocked_lock { + struct list_head nbl_list; + struct list_head nbl_lru; +- unsigned long nbl_time; ++ time_t nbl_time; + struct file_lock nbl_lock; + struct knfsd_fh nbl_fh; + struct nfsd4_callback nbl_cb; +diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c +index cf423fea0c6f..fc38b9fe4549 100644 +--- a/fs/nfsd/vfs.c ++++ b/fs/nfsd/vfs.c +@@ -975,6 +975,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, + host_err = vfs_iter_write(file, &iter, &pos, flags); + if (host_err < 0) + goto out_nfserr; ++ *cnt = host_err; + nfsdstats.io_write += *cnt; + fsnotify_modify(file); + +diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c +index 6c7388430ad3..d4359a1df3d5 100644 +--- a/fs/ntfs/inode.c ++++ b/fs/ntfs/inode.c +@@ -2899,18 +2899,12 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr) + ia_valid |= ATTR_MTIME | ATTR_CTIME; + } + } +- if (ia_valid & ATTR_ATIME) { +- vi->i_atime = timestamp_truncate(attr->ia_atime, +- vi); +- } +- if (ia_valid & ATTR_MTIME) { +- vi->i_mtime = timestamp_truncate(attr->ia_mtime, +- vi); +- } +- if (ia_valid & ATTR_CTIME) { +- vi->i_ctime = timestamp_truncate(attr->ia_ctime, +- vi); +- } ++ if (ia_valid & ATTR_ATIME) ++ vi->i_atime = attr->ia_atime; ++ if (ia_valid & ATTR_MTIME) ++ vi->i_mtime = attr->ia_mtime; ++ if (ia_valid & ATTR_CTIME) ++ vi->i_ctime = attr->ia_ctime; + mark_inode_dirty(vi); + out: + return err; +diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c +index 9876db52913a..6cd5e4924e4d 100644 +--- a/fs/ocfs2/file.c ++++ b/fs/ocfs2/file.c +@@ -2101,17 +2101,15 @@ static int ocfs2_is_io_unaligned(struct inode *inode, size_t count, loff_t pos) + static int ocfs2_inode_lock_for_extent_tree(struct inode *inode, + struct buffer_head **di_bh, + int meta_level, +- int overwrite_io, + int write_sem, + int wait) + { + int ret = 0; + + if (wait) +- ret = ocfs2_inode_lock(inode, NULL, meta_level); ++ ret = ocfs2_inode_lock(inode, di_bh, meta_level); + else +- ret = ocfs2_try_inode_lock(inode, +- overwrite_io ? NULL : di_bh, meta_level); ++ ret = ocfs2_try_inode_lock(inode, di_bh, meta_level); + if (ret < 0) + goto out; + +@@ -2136,6 +2134,7 @@ static int ocfs2_inode_lock_for_extent_tree(struct inode *inode, + + out_unlock: + brelse(*di_bh); ++ *di_bh = NULL; + ocfs2_inode_unlock(inode, meta_level); + out: + return ret; +@@ -2177,7 +2176,6 @@ static int ocfs2_prepare_inode_for_write(struct file *file, + ret = ocfs2_inode_lock_for_extent_tree(inode, + &di_bh, + meta_level, +- overwrite_io, + write_sem, + wait); + if (ret < 0) { +@@ -2233,13 +2231,13 @@ static int ocfs2_prepare_inode_for_write(struct file *file, + &di_bh, + meta_level, + write_sem); ++ meta_level = 1; ++ write_sem = 1; + ret = ocfs2_inode_lock_for_extent_tree(inode, + &di_bh, + meta_level, +- overwrite_io, +- 1, ++ write_sem, + wait); +- write_sem = 1; + if (ret < 0) { + if (ret != -EAGAIN) + mlog_errno(ret); +diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c +index e235a635d9ec..15e4fa288475 100644 +--- a/fs/overlayfs/file.c ++++ b/fs/overlayfs/file.c +@@ -146,7 +146,7 @@ static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) + struct inode *inode = file_inode(file); + struct fd real; + const struct cred *old_cred; +- ssize_t ret; ++ loff_t ret; + + /* + * The two special cases below do not need to involve real fs, +diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c +index 47a91c9733a5..7255e6a5838f 100644 +--- a/fs/overlayfs/readdir.c ++++ b/fs/overlayfs/readdir.c +@@ -504,7 +504,13 @@ get: + if (err) + goto fail; + +- WARN_ON_ONCE(dir->d_sb->s_dev != stat.dev); ++ /* ++ * Directory inode is always on overlay st_dev. ++ * Non-dir with ovl_same_dev() could be on pseudo st_dev in case ++ * of xino bits overflow. ++ */ ++ WARN_ON_ONCE(S_ISDIR(stat.mode) && ++ dir->d_sb->s_dev != stat.dev); + ino = stat.ino; + } else if (xinobits && !OVL_TYPE_UPPER(type)) { + ino = ovl_remap_lower_ino(ino, xinobits, +diff --git a/fs/read_write.c b/fs/read_write.c +index 5bbf587f5bc1..7458fccc59e1 100644 +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -1777,10 +1777,9 @@ static int remap_verify_area(struct file *file, loff_t pos, loff_t len, + * else. Assume that the offsets have already been checked for block + * alignment. + * +- * For deduplication we always scale down to the previous block because we +- * can't meaningfully compare post-EOF contents. +- * +- * For clone we only link a partial EOF block above the destination file's EOF. ++ * For clone we only link a partial EOF block above or at the destination file's ++ * EOF. For deduplication we accept a partial EOF block only if it ends at the ++ * destination file's EOF (can not link it into the middle of a file). + * + * Shorten the request if possible. + */ +@@ -1796,8 +1795,7 @@ static int generic_remap_check_len(struct inode *inode_in, + if ((*len & blkmask) == 0) + return 0; + +- if ((remap_flags & REMAP_FILE_DEDUP) || +- pos_out + *len < i_size_read(inode_out)) ++ if (pos_out + *len < i_size_read(inode_out)) + new_len &= ~blkmask; + + if (new_len == *len) +diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c +index 0b98e3c8b461..6c0e19f7a21f 100644 +--- a/fs/ubifs/dir.c ++++ b/fs/ubifs/dir.c +@@ -228,6 +228,8 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, + if (nm.hash) { + ubifs_assert(c, fname_len(&nm) == 0); + ubifs_assert(c, fname_name(&nm) == NULL); ++ if (nm.hash & ~UBIFS_S_KEY_HASH_MASK) ++ goto done; /* ENOENT */ + dent_key_init_hash(c, &key, dir->i_ino, nm.hash); + err = ubifs_tnc_lookup_dh(c, &key, dent, nm.minor_hash); + } else { +diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c +index cd52585c8f4f..a771273fba7e 100644 +--- a/fs/ubifs/file.c ++++ b/fs/ubifs/file.c +@@ -786,7 +786,9 @@ static int ubifs_do_bulk_read(struct ubifs_info *c, struct bu_info *bu, + + if (page_offset > end_index) + break; +- page = find_or_create_page(mapping, page_offset, ra_gfp_mask); ++ page = pagecache_get_page(mapping, page_offset, ++ FGP_LOCK|FGP_ACCESSED|FGP_CREAT|FGP_NOWAIT, ++ ra_gfp_mask); + if (!page) + break; + if (!PageUptodate(page)) +@@ -1078,18 +1080,12 @@ static void do_attr_changes(struct inode *inode, const struct iattr *attr) + inode->i_uid = attr->ia_uid; + if (attr->ia_valid & ATTR_GID) + inode->i_gid = attr->ia_gid; +- if (attr->ia_valid & ATTR_ATIME) { +- inode->i_atime = timestamp_truncate(attr->ia_atime, +- inode); +- } +- if (attr->ia_valid & ATTR_MTIME) { +- inode->i_mtime = timestamp_truncate(attr->ia_mtime, +- inode); +- } +- if (attr->ia_valid & ATTR_CTIME) { +- inode->i_ctime = timestamp_truncate(attr->ia_ctime, +- inode); +- } ++ if (attr->ia_valid & ATTR_ATIME) ++ inode->i_atime = attr->ia_atime; ++ if (attr->ia_valid & ATTR_MTIME) ++ inode->i_mtime = attr->ia_mtime; ++ if (attr->ia_valid & ATTR_CTIME) ++ inode->i_ctime = attr->ia_ctime; + if (attr->ia_valid & ATTR_MODE) { + umode_t mode = attr->ia_mode; + +diff --git a/fs/ubifs/ioctl.c b/fs/ubifs/ioctl.c +index 5dc5abca11c7..eeb1be259888 100644 +--- a/fs/ubifs/ioctl.c ++++ b/fs/ubifs/ioctl.c +@@ -113,7 +113,8 @@ static int setflags(struct inode *inode, int flags) + if (err) + goto out_unlock; + +- ui->flags = ioctl2ubifs(flags); ++ ui->flags &= ~ioctl2ubifs(UBIFS_SUPPORTED_IOCTL_FLAGS); ++ ui->flags |= ioctl2ubifs(flags); + ubifs_set_inode_flags(inode); + inode->i_ctime = current_time(inode); + release = ui->dirty; +diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c +index a551eb3e9b89..6681c18e52b8 100644 +--- a/fs/ubifs/sb.c ++++ b/fs/ubifs/sb.c +@@ -161,7 +161,7 @@ static int create_default_filesystem(struct ubifs_info *c) + sup = kzalloc(ALIGN(UBIFS_SB_NODE_SZ, c->min_io_size), GFP_KERNEL); + mst = kzalloc(c->mst_node_alsz, GFP_KERNEL); + idx_node_size = ubifs_idx_node_sz(c, 1); +- idx = kzalloc(ALIGN(tmp, c->min_io_size), GFP_KERNEL); ++ idx = kzalloc(ALIGN(idx_node_size, c->min_io_size), GFP_KERNEL); + ino = kzalloc(ALIGN(UBIFS_INO_NODE_SZ, c->min_io_size), GFP_KERNEL); + cs = kzalloc(ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size), GFP_KERNEL); + +diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c +index 5e1e8ec0589e..7fc2f3f07c16 100644 +--- a/fs/ubifs/super.c ++++ b/fs/ubifs/super.c +@@ -1599,6 +1599,7 @@ out_free: + vfree(c->ileb_buf); + vfree(c->sbuf); + kfree(c->bottom_up_buf); ++ kfree(c->sup_node); + ubifs_debugging_exit(c); + return err; + } +@@ -1641,6 +1642,7 @@ static void ubifs_umount(struct ubifs_info *c) + vfree(c->ileb_buf); + vfree(c->sbuf); + kfree(c->bottom_up_buf); ++ kfree(c->sup_node); + ubifs_debugging_exit(c); + } + +diff --git a/fs/utimes.c b/fs/utimes.c +index 1ba3f7883870..090739322463 100644 +--- a/fs/utimes.c ++++ b/fs/utimes.c +@@ -36,14 +36,14 @@ static int utimes_common(const struct path *path, struct timespec64 *times) + if (times[0].tv_nsec == UTIME_OMIT) + newattrs.ia_valid &= ~ATTR_ATIME; + else if (times[0].tv_nsec != UTIME_NOW) { +- newattrs.ia_atime = timestamp_truncate(times[0], inode); ++ newattrs.ia_atime = times[0]; + newattrs.ia_valid |= ATTR_ATIME_SET; + } + + if (times[1].tv_nsec == UTIME_OMIT) + newattrs.ia_valid &= ~ATTR_MTIME; + else if (times[1].tv_nsec != UTIME_NOW) { +- newattrs.ia_mtime = timestamp_truncate(times[1], inode); ++ newattrs.ia_mtime = times[1]; + newattrs.ia_valid |= ATTR_MTIME_SET; + } + /* +diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h +index 04c0644006fd..c716ea81e653 100644 +--- a/include/asm-generic/tlb.h ++++ b/include/asm-generic/tlb.h +@@ -137,13 +137,6 @@ + * When used, an architecture is expected to provide __tlb_remove_table() + * which does the actual freeing of these pages. + * +- * HAVE_RCU_TABLE_NO_INVALIDATE +- * +- * This makes HAVE_RCU_TABLE_FREE avoid calling tlb_flush_mmu_tlbonly() before +- * freeing the page-table pages. This can be avoided if you use +- * HAVE_RCU_TABLE_FREE and your architecture does _NOT_ use the Linux +- * page-tables natively. +- * + * MMU_GATHER_NO_RANGE + * + * Use this if your architecture lacks an efficient flush_tlb_range(). +@@ -189,8 +182,23 @@ struct mmu_table_batch { + + extern void tlb_remove_table(struct mmu_gather *tlb, void *table); + ++/* ++ * This allows an architecture that does not use the linux page-tables for ++ * hardware to skip the TLBI when freeing page tables. ++ */ ++#ifndef tlb_needs_table_invalidate ++#define tlb_needs_table_invalidate() (true) ++#endif ++ ++#else ++ ++#ifdef tlb_needs_table_invalidate ++#error tlb_needs_table_invalidate() requires HAVE_RCU_TABLE_FREE + #endif + ++#endif /* CONFIG_HAVE_RCU_TABLE_FREE */ ++ ++ + #ifndef CONFIG_HAVE_MMU_GATHER_NO_GATHER + /* + * If we can't allocate a page to make a big batch of page pointers +diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h +index 97967ce06de3..f88197c1ffc2 100644 +--- a/include/linux/backing-dev.h ++++ b/include/linux/backing-dev.h +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -504,4 +505,13 @@ static inline int bdi_rw_congested(struct backing_dev_info *bdi) + (1 << WB_async_congested)); + } + ++extern const char *bdi_unknown_name; ++ ++static inline const char *bdi_dev_name(struct backing_dev_info *bdi) ++{ ++ if (!bdi || !bdi->dev) ++ return bdi_unknown_name; ++ return dev_name(bdi->dev); ++} ++ + #endif /* _LINUX_BACKING_DEV_H */ +diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h +index 31b1b0e03df8..018dce868de6 100644 +--- a/include/linux/cpufreq.h ++++ b/include/linux/cpufreq.h +@@ -148,6 +148,20 @@ struct cpufreq_policy { + struct notifier_block nb_max; + }; + ++/* ++ * Used for passing new cpufreq policy data to the cpufreq driver's ->verify() ++ * callback for sanitization. That callback is only expected to modify the min ++ * and max values, if necessary, and specifically it must not update the ++ * frequency table. ++ */ ++struct cpufreq_policy_data { ++ struct cpufreq_cpuinfo cpuinfo; ++ struct cpufreq_frequency_table *freq_table; ++ unsigned int cpu; ++ unsigned int min; /* in kHz */ ++ unsigned int max; /* in kHz */ ++}; ++ + struct cpufreq_freqs { + struct cpufreq_policy *policy; + unsigned int old; +@@ -201,8 +215,6 @@ u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy); + struct cpufreq_policy *cpufreq_cpu_acquire(unsigned int cpu); + void cpufreq_cpu_release(struct cpufreq_policy *policy); + int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu); +-int cpufreq_set_policy(struct cpufreq_policy *policy, +- struct cpufreq_policy *new_policy); + void refresh_frequency_limits(struct cpufreq_policy *policy); + void cpufreq_update_policy(unsigned int cpu); + void cpufreq_update_limits(unsigned int cpu); +@@ -284,7 +296,7 @@ struct cpufreq_driver { + + /* needed by all drivers */ + int (*init)(struct cpufreq_policy *policy); +- int (*verify)(struct cpufreq_policy *policy); ++ int (*verify)(struct cpufreq_policy_data *policy); + + /* define one out of two */ + int (*setpolicy)(struct cpufreq_policy *policy); +@@ -415,8 +427,9 @@ static inline int cpufreq_thermal_control_enabled(struct cpufreq_driver *drv) + (drv->flags & CPUFREQ_IS_COOLING_DEV); + } + +-static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, +- unsigned int min, unsigned int max) ++static inline void cpufreq_verify_within_limits(struct cpufreq_policy_data *policy, ++ unsigned int min, ++ unsigned int max) + { + if (policy->min < min) + policy->min = min; +@@ -432,10 +445,10 @@ static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, + } + + static inline void +-cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy) ++cpufreq_verify_within_cpu_limits(struct cpufreq_policy_data *policy) + { + cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, +- policy->cpuinfo.max_freq); ++ policy->cpuinfo.max_freq); + } + + #ifdef CONFIG_CPU_FREQ +@@ -513,6 +526,7 @@ static inline unsigned long cpufreq_scale(unsigned long old, u_int div, + * CPUFREQ GOVERNORS * + *********************************************************************/ + ++#define CPUFREQ_POLICY_UNKNOWN (0) + /* + * If (cpufreq_driver->target) exists, the ->governor decides what frequency + * within the limits is used. If (cpufreq_driver->setpolicy> exists, these +@@ -684,9 +698,9 @@ static inline void dev_pm_opp_free_cpufreq_table(struct device *dev, + int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, + struct cpufreq_frequency_table *table); + +-int cpufreq_frequency_table_verify(struct cpufreq_policy *policy, ++int cpufreq_frequency_table_verify(struct cpufreq_policy_data *policy, + struct cpufreq_frequency_table *table); +-int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy); ++int cpufreq_generic_frequency_table_verify(struct cpufreq_policy_data *policy); + + int cpufreq_table_index_unsorted(struct cpufreq_policy *policy, + unsigned int target_freq, +diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h +index ffcc7724ca21..dc4fd8a6644d 100644 +--- a/include/linux/eventfd.h ++++ b/include/linux/eventfd.h +@@ -12,6 +12,8 @@ + #include + #include + #include ++#include ++#include + + /* + * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining +@@ -40,6 +42,13 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n); + int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait, + __u64 *cnt); + ++DECLARE_PER_CPU(int, eventfd_wake_count); ++ ++static inline bool eventfd_signal_count(void) ++{ ++ return this_cpu_read(eventfd_wake_count); ++} ++ + #else /* CONFIG_EVENTFD */ + + /* +@@ -68,6 +77,11 @@ static inline int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, + return -ENOSYS; + } + ++static inline bool eventfd_signal_count(void) ++{ ++ return false; ++} ++ + #endif + + #endif /* _LINUX_EVENTFD_H */ +diff --git a/include/linux/irq.h b/include/linux/irq.h +index fb301cf29148..f8755e5fcd74 100644 +--- a/include/linux/irq.h ++++ b/include/linux/irq.h +@@ -209,6 +209,8 @@ struct irq_data { + * IRQD_SINGLE_TARGET - IRQ allows only a single affinity target + * IRQD_DEFAULT_TRIGGER_SET - Expected trigger already been set + * IRQD_CAN_RESERVE - Can use reservation mode ++ * IRQD_MSI_NOMASK_QUIRK - Non-maskable MSI quirk for affinity change ++ * required + */ + enum { + IRQD_TRIGGER_MASK = 0xf, +@@ -231,6 +233,7 @@ enum { + IRQD_SINGLE_TARGET = (1 << 24), + IRQD_DEFAULT_TRIGGER_SET = (1 << 25), + IRQD_CAN_RESERVE = (1 << 26), ++ IRQD_MSI_NOMASK_QUIRK = (1 << 27), + }; + + #define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors) +@@ -390,6 +393,21 @@ static inline bool irqd_can_reserve(struct irq_data *d) + return __irqd_to_state(d) & IRQD_CAN_RESERVE; + } + ++static inline void irqd_set_msi_nomask_quirk(struct irq_data *d) ++{ ++ __irqd_to_state(d) |= IRQD_MSI_NOMASK_QUIRK; ++} ++ ++static inline void irqd_clr_msi_nomask_quirk(struct irq_data *d) ++{ ++ __irqd_to_state(d) &= ~IRQD_MSI_NOMASK_QUIRK; ++} ++ ++static inline bool irqd_msi_nomask_quirk(struct irq_data *d) ++{ ++ return __irqd_to_state(d) & IRQD_MSI_NOMASK_QUIRK; ++} ++ + #undef __irqd_to_state + + static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) +diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h +index 583e7abd07f9..aba5ada373d6 100644 +--- a/include/linux/irqdomain.h ++++ b/include/linux/irqdomain.h +@@ -205,6 +205,13 @@ enum { + /* Irq domain implements MSI remapping */ + IRQ_DOMAIN_FLAG_MSI_REMAP = (1 << 5), + ++ /* ++ * Quirk to handle MSI implementations which do not provide ++ * masking. Currently known to affect x86, but partially ++ * handled in core code. ++ */ ++ IRQ_DOMAIN_MSI_NOMASK_QUIRK = (1 << 6), ++ + /* + * Flags starting from IRQ_DOMAIN_FLAG_NONCORE are reserved + * for implementation specific purposes and ignored by the +diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h +index d41c521a39da..b81f0f1ded5f 100644 +--- a/include/linux/kvm_host.h ++++ b/include/linux/kvm_host.h +@@ -204,7 +204,7 @@ struct kvm_async_pf { + struct list_head queue; + struct kvm_vcpu *vcpu; + struct mm_struct *mm; +- gva_t gva; ++ gpa_t cr2_or_gpa; + unsigned long addr; + struct kvm_arch_async_pf arch; + bool wakeup_all; +@@ -212,8 +212,8 @@ struct kvm_async_pf { + + void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu); + void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu); +-int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, +- struct kvm_arch_async_pf *arch); ++int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, ++ unsigned long hva, struct kvm_arch_async_pf *arch); + int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); + #endif + +@@ -728,6 +728,7 @@ void kvm_set_pfn_dirty(kvm_pfn_t pfn); + void kvm_set_pfn_accessed(kvm_pfn_t pfn); + void kvm_get_pfn(kvm_pfn_t pfn); + ++void kvm_release_pfn(kvm_pfn_t pfn, bool dirty, struct gfn_to_pfn_cache *cache); + int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, + int len); + int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, +@@ -750,7 +751,7 @@ int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); + int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); + struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); + bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); +-unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn); ++unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn); + void mark_page_dirty(struct kvm *kvm, gfn_t gfn); + + struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu); +@@ -758,8 +759,12 @@ struct kvm_memory_slot *kvm_vcpu_gfn_to_memslot(struct kvm_vcpu *vcpu, gfn_t gfn + kvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn); + kvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn); + int kvm_vcpu_map(struct kvm_vcpu *vcpu, gpa_t gpa, struct kvm_host_map *map); ++int kvm_map_gfn(struct kvm_vcpu *vcpu, gfn_t gfn, struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, bool atomic); + struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn); + void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty); ++int kvm_unmap_gfn(struct kvm_vcpu *vcpu, struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, bool dirty, bool atomic); + unsigned long kvm_vcpu_gfn_to_hva(struct kvm_vcpu *vcpu, gfn_t gfn); + unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *writable); + int kvm_vcpu_read_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, void *data, int offset, +diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h +index bde5374ae021..2382cb58969d 100644 +--- a/include/linux/kvm_types.h ++++ b/include/linux/kvm_types.h +@@ -18,7 +18,7 @@ struct kvm_memslots; + + enum kvm_mr_change; + +-#include ++#include + + /* + * Address types: +@@ -49,4 +49,11 @@ struct gfn_to_hva_cache { + struct kvm_memory_slot *memslot; + }; + ++struct gfn_to_pfn_cache { ++ u64 generation; ++ gfn_t gfn; ++ kvm_pfn_t pfn; ++ bool dirty; ++}; ++ + #endif /* __KVM_TYPES_H__ */ +diff --git a/include/linux/mfd/rohm-bd70528.h b/include/linux/mfd/rohm-bd70528.h +index 1013e60c5b25..b0109ee6dae2 100644 +--- a/include/linux/mfd/rohm-bd70528.h ++++ b/include/linux/mfd/rohm-bd70528.h +@@ -317,7 +317,7 @@ enum { + #define BD70528_MASK_RTC_MINUTE 0x7f + #define BD70528_MASK_RTC_HOUR_24H 0x80 + #define BD70528_MASK_RTC_HOUR_PM 0x20 +-#define BD70528_MASK_RTC_HOUR 0x1f ++#define BD70528_MASK_RTC_HOUR 0x3f + #define BD70528_MASK_RTC_DAY 0x3f + #define BD70528_MASK_RTC_WEEK 0x07 + #define BD70528_MASK_RTC_MONTH 0x1f +diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h +index 0836fe232f97..0cdc8d12785a 100644 +--- a/include/linux/mlx5/mlx5_ifc.h ++++ b/include/linux/mlx5/mlx5_ifc.h +@@ -1417,14 +1417,15 @@ struct mlx5_ifc_cmd_hca_cap_bits { + + u8 reserved_at_440[0x20]; + +- u8 tls[0x1]; +- u8 reserved_at_461[0x2]; ++ u8 reserved_at_460[0x3]; + u8 log_max_uctx[0x5]; + u8 reserved_at_468[0x3]; + u8 log_max_umem[0x5]; + u8 max_num_eqs[0x10]; + +- u8 reserved_at_480[0x3]; ++ u8 reserved_at_480[0x1]; ++ u8 tls_tx[0x1]; ++ u8 reserved_at_482[0x1]; + u8 log_max_l2_table[0x5]; + u8 reserved_at_488[0x8]; + u8 log_uar_page_sz[0x10]; +diff --git a/include/linux/padata.h b/include/linux/padata.h +index 23717eeaad23..cccab7a59787 100644 +--- a/include/linux/padata.h ++++ b/include/linux/padata.h +@@ -9,6 +9,7 @@ + #ifndef PADATA_H + #define PADATA_H + ++#include + #include + #include + #include +@@ -98,7 +99,7 @@ struct padata_cpumask { + * struct parallel_data - Internal control structure, covers everything + * that depends on the cpumask in use. + * +- * @pinst: padata instance. ++ * @sh: padata_shell object. + * @pqueue: percpu padata queues used for parallelization. + * @squeue: percpu padata queues used for serialuzation. + * @reorder_objects: Number of objects waiting in the reorder queues. +@@ -111,7 +112,7 @@ struct padata_cpumask { + * @lock: Reorder lock. + */ + struct parallel_data { +- struct padata_instance *pinst; ++ struct padata_shell *ps; + struct padata_parallel_queue __percpu *pqueue; + struct padata_serial_queue __percpu *squeue; + atomic_t reorder_objects; +@@ -124,14 +125,33 @@ struct parallel_data { + spinlock_t lock ____cacheline_aligned; + }; + ++/** ++ * struct padata_shell - Wrapper around struct parallel_data, its ++ * purpose is to allow the underlying control structure to be replaced ++ * on the fly using RCU. ++ * ++ * @pinst: padat instance. ++ * @pd: Actual parallel_data structure which may be substituted on the fly. ++ * @opd: Pointer to old pd to be freed by padata_replace. ++ * @list: List entry in padata_instance list. ++ */ ++struct padata_shell { ++ struct padata_instance *pinst; ++ struct parallel_data __rcu *pd; ++ struct parallel_data *opd; ++ struct list_head list; ++}; ++ + /** + * struct padata_instance - The overall control structure. + * + * @cpu_notifier: cpu hotplug notifier. + * @parallel_wq: The workqueue used for parallel work. + * @serial_wq: The workqueue used for serial work. +- * @pd: The internal control structure. ++ * @pslist: List of padata_shell objects attached to this instance. + * @cpumask: User supplied cpumasks for parallel and serial works. ++ * @rcpumask: Actual cpumasks based on user cpumask and cpu_online_mask. ++ * @omask: Temporary storage used to compute the notification mask. + * @cpumask_change_notifier: Notifiers chain for user-defined notify + * callbacks that will be called when either @pcpu or @cbcpu + * or both cpumasks change. +@@ -143,8 +163,10 @@ struct padata_instance { + struct hlist_node node; + struct workqueue_struct *parallel_wq; + struct workqueue_struct *serial_wq; +- struct parallel_data *pd; ++ struct list_head pslist; + struct padata_cpumask cpumask; ++ struct padata_cpumask rcpumask; ++ cpumask_var_t omask; + struct blocking_notifier_head cpumask_change_notifier; + struct kobject kobj; + struct mutex lock; +@@ -156,7 +178,9 @@ struct padata_instance { + + extern struct padata_instance *padata_alloc_possible(const char *name); + extern void padata_free(struct padata_instance *pinst); +-extern int padata_do_parallel(struct padata_instance *pinst, ++extern struct padata_shell *padata_alloc_shell(struct padata_instance *pinst); ++extern void padata_free_shell(struct padata_shell *ps); ++extern int padata_do_parallel(struct padata_shell *ps, + struct padata_priv *padata, int *cb_cpu); + extern void padata_do_serial(struct padata_priv *padata); + extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, +diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h +index a6fabd865211..176bfbd52d97 100644 +--- a/include/linux/percpu-defs.h ++++ b/include/linux/percpu-defs.h +@@ -175,8 +175,7 @@ + * Declaration/definition used for per-CPU variables that should be accessed + * as decrypted when memory encryption is enabled in the guest. + */ +-#if defined(CONFIG_VIRTUALIZATION) && defined(CONFIG_AMD_MEM_ENCRYPT) +- ++#ifdef CONFIG_AMD_MEM_ENCRYPT + #define DECLARE_PER_CPU_DECRYPTED(type, name) \ + DECLARE_PER_CPU_SECTION(type, name, "..decrypted") + +diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h +index 337a46391527..6a92fd3105a3 100644 +--- a/include/linux/regulator/consumer.h ++++ b/include/linux/regulator/consumer.h +@@ -287,6 +287,8 @@ void regulator_bulk_set_supply_names(struct regulator_bulk_data *consumers, + const char *const *supply_names, + unsigned int num_supplies); + ++bool regulator_is_equal(struct regulator *reg1, struct regulator *reg2); ++ + #else + + /* +@@ -593,6 +595,11 @@ regulator_bulk_set_supply_names(struct regulator_bulk_data *consumers, + { + } + ++static inline bool ++regulator_is_equal(struct regulator *reg1, struct regulator *reg2) ++{ ++ return false; ++} + #endif + + static inline int regulator_set_voltage_triplet(struct regulator *regulator, +diff --git a/include/media/v4l2-rect.h b/include/media/v4l2-rect.h +index c86474dc7b55..8800a640c224 100644 +--- a/include/media/v4l2-rect.h ++++ b/include/media/v4l2-rect.h +@@ -63,10 +63,10 @@ static inline void v4l2_rect_map_inside(struct v4l2_rect *r, + r->left = boundary->left; + if (r->top < boundary->top) + r->top = boundary->top; +- if (r->left + r->width > boundary->width) +- r->left = boundary->width - r->width; +- if (r->top + r->height > boundary->height) +- r->top = boundary->height - r->height; ++ if (r->left + r->width > boundary->left + boundary->width) ++ r->left = boundary->left + boundary->width - r->width; ++ if (r->top + r->height > boundary->top + boundary->height) ++ r->top = boundary->top + boundary->height - r->height; + } + + /** +diff --git a/include/net/ipx.h b/include/net/ipx.h +index baf090390998..9d1342807b59 100644 +--- a/include/net/ipx.h ++++ b/include/net/ipx.h +@@ -47,11 +47,6 @@ struct ipxhdr { + /* From af_ipx.c */ + extern int sysctl_ipx_pprop_broadcasting; + +-static __inline__ struct ipxhdr *ipx_hdr(struct sk_buff *skb) +-{ +- return (struct ipxhdr *)skb_transport_header(skb); +-} +- + struct ipx_interface { + /* IPX address */ + __be32 if_netnum; +diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h +index e05b95e83d5a..fb9dce4c6928 100644 +--- a/include/sound/hdaudio.h ++++ b/include/sound/hdaudio.h +@@ -8,6 +8,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -330,6 +331,7 @@ struct hdac_bus { + bool chip_init:1; /* h/w initialized */ + + /* behavior flags */ ++ bool aligned_mmio:1; /* aligned MMIO access */ + bool sync_write:1; /* sync after verb write */ + bool use_posbuf:1; /* use position buffer */ + bool snoop:1; /* enable snooping */ +@@ -405,34 +407,61 @@ void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus); + unsigned int snd_hdac_aligned_read(void __iomem *addr, unsigned int mask); + void snd_hdac_aligned_write(unsigned int val, void __iomem *addr, + unsigned int mask); +-#define snd_hdac_reg_writeb(v, addr) snd_hdac_aligned_write(v, addr, 0xff) +-#define snd_hdac_reg_writew(v, addr) snd_hdac_aligned_write(v, addr, 0xffff) +-#define snd_hdac_reg_readb(addr) snd_hdac_aligned_read(addr, 0xff) +-#define snd_hdac_reg_readw(addr) snd_hdac_aligned_read(addr, 0xffff) +-#else /* CONFIG_SND_HDA_ALIGNED_MMIO */ +-#define snd_hdac_reg_writeb(val, addr) writeb(val, addr) +-#define snd_hdac_reg_writew(val, addr) writew(val, addr) +-#define snd_hdac_reg_readb(addr) readb(addr) +-#define snd_hdac_reg_readw(addr) readw(addr) +-#endif /* CONFIG_SND_HDA_ALIGNED_MMIO */ +-#define snd_hdac_reg_writel(val, addr) writel(val, addr) +-#define snd_hdac_reg_readl(addr) readl(addr) ++#define snd_hdac_aligned_mmio(bus) (bus)->aligned_mmio ++#else ++#define snd_hdac_aligned_mmio(bus) false ++#define snd_hdac_aligned_read(addr, mask) 0 ++#define snd_hdac_aligned_write(val, addr, mask) do {} while (0) ++#endif ++ ++static inline void snd_hdac_reg_writeb(struct hdac_bus *bus, void __iomem *addr, ++ u8 val) ++{ ++ if (snd_hdac_aligned_mmio(bus)) ++ snd_hdac_aligned_write(val, addr, 0xff); ++ else ++ writeb(val, addr); ++} ++ ++static inline void snd_hdac_reg_writew(struct hdac_bus *bus, void __iomem *addr, ++ u16 val) ++{ ++ if (snd_hdac_aligned_mmio(bus)) ++ snd_hdac_aligned_write(val, addr, 0xffff); ++ else ++ writew(val, addr); ++} ++ ++static inline u8 snd_hdac_reg_readb(struct hdac_bus *bus, void __iomem *addr) ++{ ++ return snd_hdac_aligned_mmio(bus) ? ++ snd_hdac_aligned_read(addr, 0xff) : readb(addr); ++} ++ ++static inline u16 snd_hdac_reg_readw(struct hdac_bus *bus, void __iomem *addr) ++{ ++ return snd_hdac_aligned_mmio(bus) ? ++ snd_hdac_aligned_read(addr, 0xffff) : readw(addr); ++} ++ ++#define snd_hdac_reg_writel(bus, addr, val) writel(val, addr) ++#define snd_hdac_reg_readl(bus, addr) readl(addr) + + /* + * macros for easy use + */ + #define _snd_hdac_chip_writeb(chip, reg, value) \ +- snd_hdac_reg_writeb(value, (chip)->remap_addr + (reg)) ++ snd_hdac_reg_writeb(chip, (chip)->remap_addr + (reg), value) + #define _snd_hdac_chip_readb(chip, reg) \ +- snd_hdac_reg_readb((chip)->remap_addr + (reg)) ++ snd_hdac_reg_readb(chip, (chip)->remap_addr + (reg)) + #define _snd_hdac_chip_writew(chip, reg, value) \ +- snd_hdac_reg_writew(value, (chip)->remap_addr + (reg)) ++ snd_hdac_reg_writew(chip, (chip)->remap_addr + (reg), value) + #define _snd_hdac_chip_readw(chip, reg) \ +- snd_hdac_reg_readw((chip)->remap_addr + (reg)) ++ snd_hdac_reg_readw(chip, (chip)->remap_addr + (reg)) + #define _snd_hdac_chip_writel(chip, reg, value) \ +- snd_hdac_reg_writel(value, (chip)->remap_addr + (reg)) ++ snd_hdac_reg_writel(chip, (chip)->remap_addr + (reg), value) + #define _snd_hdac_chip_readl(chip, reg) \ +- snd_hdac_reg_readl((chip)->remap_addr + (reg)) ++ snd_hdac_reg_readl(chip, (chip)->remap_addr + (reg)) + + /* read/write a register, pass without AZX_REG_ prefix */ + #define snd_hdac_chip_writel(chip, reg, value) \ +@@ -540,17 +569,17 @@ int snd_hdac_get_stream_stripe_ctl(struct hdac_bus *bus, + */ + /* read/write a register, pass without AZX_REG_ prefix */ + #define snd_hdac_stream_writel(dev, reg, value) \ +- snd_hdac_reg_writel(value, (dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_writel((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) + #define snd_hdac_stream_writew(dev, reg, value) \ +- snd_hdac_reg_writew(value, (dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_writew((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) + #define snd_hdac_stream_writeb(dev, reg, value) \ +- snd_hdac_reg_writeb(value, (dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_writeb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg, value) + #define snd_hdac_stream_readl(dev, reg) \ +- snd_hdac_reg_readl((dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_readl((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) + #define snd_hdac_stream_readw(dev, reg) \ +- snd_hdac_reg_readw((dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_readw((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) + #define snd_hdac_stream_readb(dev, reg) \ +- snd_hdac_reg_readb((dev)->sd_addr + AZX_REG_ ## reg) ++ snd_hdac_reg_readb((dev)->bus, (dev)->sd_addr + AZX_REG_ ## reg) + + /* update a register, pass without AZX_REG_ prefix */ + #define snd_hdac_stream_updatel(dev, reg, mask, val) \ +diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h +index c2ce6480b4b1..66282552db20 100644 +--- a/include/trace/events/writeback.h ++++ b/include/trace/events/writeback.h +@@ -67,8 +67,8 @@ DECLARE_EVENT_CLASS(writeback_page_template, + + TP_fast_assign( + strscpy_pad(__entry->name, +- mapping ? dev_name(inode_to_bdi(mapping->host)->dev) : "(unknown)", +- 32); ++ bdi_dev_name(mapping ? inode_to_bdi(mapping->host) : ++ NULL), 32); + __entry->ino = mapping ? mapping->host->i_ino : 0; + __entry->index = page->index; + ), +@@ -111,8 +111,7 @@ DECLARE_EVENT_CLASS(writeback_dirty_inode_template, + struct backing_dev_info *bdi = inode_to_bdi(inode); + + /* may be called for files on pseudo FSes w/ unregistered bdi */ +- strscpy_pad(__entry->name, +- bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32); ++ strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); + __entry->ino = inode->i_ino; + __entry->state = inode->i_state; + __entry->flags = flags; +@@ -193,7 +192,7 @@ TRACE_EVENT(inode_foreign_history, + ), + + TP_fast_assign( +- strncpy(__entry->name, dev_name(inode_to_bdi(inode)->dev), 32); ++ strncpy(__entry->name, bdi_dev_name(inode_to_bdi(inode)), 32); + __entry->ino = inode->i_ino; + __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); + __entry->history = history; +@@ -222,7 +221,7 @@ TRACE_EVENT(inode_switch_wbs, + ), + + TP_fast_assign( +- strncpy(__entry->name, dev_name(old_wb->bdi->dev), 32); ++ strncpy(__entry->name, bdi_dev_name(old_wb->bdi), 32); + __entry->ino = inode->i_ino; + __entry->old_cgroup_ino = __trace_wb_assign_cgroup(old_wb); + __entry->new_cgroup_ino = __trace_wb_assign_cgroup(new_wb); +@@ -255,7 +254,7 @@ TRACE_EVENT(track_foreign_dirty, + struct address_space *mapping = page_mapping(page); + struct inode *inode = mapping ? mapping->host : NULL; + +- strncpy(__entry->name, dev_name(wb->bdi->dev), 32); ++ strncpy(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->bdi_id = wb->bdi->id; + __entry->ino = inode ? inode->i_ino : 0; + __entry->memcg_id = wb->memcg_css->id; +@@ -288,7 +287,7 @@ TRACE_EVENT(flush_foreign, + ), + + TP_fast_assign( +- strncpy(__entry->name, dev_name(wb->bdi->dev), 32); ++ strncpy(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); + __entry->frn_bdi_id = frn_bdi_id; + __entry->frn_memcg_id = frn_memcg_id; +@@ -318,7 +317,7 @@ DECLARE_EVENT_CLASS(writeback_write_inode_template, + + TP_fast_assign( + strscpy_pad(__entry->name, +- dev_name(inode_to_bdi(inode)->dev), 32); ++ bdi_dev_name(inode_to_bdi(inode)), 32); + __entry->ino = inode->i_ino; + __entry->sync_mode = wbc->sync_mode; + __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); +@@ -361,9 +360,7 @@ DECLARE_EVENT_CLASS(writeback_work_class, + __field(unsigned int, cgroup_ino) + ), + TP_fast_assign( +- strscpy_pad(__entry->name, +- wb->bdi->dev ? dev_name(wb->bdi->dev) : +- "(unknown)", 32); ++ strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->nr_pages = work->nr_pages; + __entry->sb_dev = work->sb ? work->sb->s_dev : 0; + __entry->sync_mode = work->sync_mode; +@@ -416,7 +413,7 @@ DECLARE_EVENT_CLASS(writeback_class, + __field(unsigned int, cgroup_ino) + ), + TP_fast_assign( +- strscpy_pad(__entry->name, dev_name(wb->bdi->dev), 32); ++ strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); + ), + TP_printk("bdi %s: cgroup_ino=%u", +@@ -438,7 +435,7 @@ TRACE_EVENT(writeback_bdi_register, + __array(char, name, 32) + ), + TP_fast_assign( +- strscpy_pad(__entry->name, dev_name(bdi->dev), 32); ++ strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); + ), + TP_printk("bdi %s", + __entry->name +@@ -463,7 +460,7 @@ DECLARE_EVENT_CLASS(wbc_class, + ), + + TP_fast_assign( +- strscpy_pad(__entry->name, dev_name(bdi->dev), 32); ++ strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); + __entry->nr_to_write = wbc->nr_to_write; + __entry->pages_skipped = wbc->pages_skipped; + __entry->sync_mode = wbc->sync_mode; +@@ -514,7 +511,7 @@ TRACE_EVENT(writeback_queue_io, + ), + TP_fast_assign( + unsigned long *older_than_this = work->older_than_this; +- strscpy_pad(__entry->name, dev_name(wb->bdi->dev), 32); ++ strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); + __entry->older = older_than_this ? *older_than_this : 0; + __entry->age = older_than_this ? + (jiffies - *older_than_this) * 1000 / HZ : -1; +@@ -600,7 +597,7 @@ TRACE_EVENT(bdi_dirty_ratelimit, + ), + + TP_fast_assign( +- strscpy_pad(__entry->bdi, dev_name(wb->bdi->dev), 32); ++ strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32); + __entry->write_bw = KBps(wb->write_bandwidth); + __entry->avg_write_bw = KBps(wb->avg_write_bandwidth); + __entry->dirty_rate = KBps(dirty_rate); +@@ -665,7 +662,7 @@ TRACE_EVENT(balance_dirty_pages, + + TP_fast_assign( + unsigned long freerun = (thresh + bg_thresh) / 2; +- strscpy_pad(__entry->bdi, dev_name(wb->bdi->dev), 32); ++ strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32); + + __entry->limit = global_wb_domain.dirty_limit; + __entry->setpoint = (global_wb_domain.dirty_limit + +@@ -726,7 +723,7 @@ TRACE_EVENT(writeback_sb_inodes_requeue, + + TP_fast_assign( + strscpy_pad(__entry->name, +- dev_name(inode_to_bdi(inode)->dev), 32); ++ bdi_dev_name(inode_to_bdi(inode)), 32); + __entry->ino = inode->i_ino; + __entry->state = inode->i_state; + __entry->dirtied_when = inode->dirtied_when; +@@ -800,7 +797,7 @@ DECLARE_EVENT_CLASS(writeback_single_inode_template, + + TP_fast_assign( + strscpy_pad(__entry->name, +- dev_name(inode_to_bdi(inode)->dev), 32); ++ bdi_dev_name(inode_to_bdi(inode)), 32); + __entry->ino = inode->i_ino; + __entry->state = inode->i_state; + __entry->dirtied_when = inode->dirtied_when; +diff --git a/ipc/msg.c b/ipc/msg.c +index 8dec945fa030..767587ab45a3 100644 +--- a/ipc/msg.c ++++ b/ipc/msg.c +@@ -377,7 +377,7 @@ copy_msqid_from_user(struct msqid64_ds *out, void __user *buf, int version) + * NOTE: no locks must be held, the rwsem is taken inside this function. + */ + static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, +- struct msqid64_ds *msqid64) ++ struct ipc64_perm *perm, int msg_qbytes) + { + struct kern_ipc_perm *ipcp; + struct msg_queue *msq; +@@ -387,7 +387,7 @@ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, + rcu_read_lock(); + + ipcp = ipcctl_obtain_check(ns, &msg_ids(ns), msqid, cmd, +- &msqid64->msg_perm, msqid64->msg_qbytes); ++ perm, msg_qbytes); + if (IS_ERR(ipcp)) { + err = PTR_ERR(ipcp); + goto out_unlock1; +@@ -409,18 +409,18 @@ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, + { + DEFINE_WAKE_Q(wake_q); + +- if (msqid64->msg_qbytes > ns->msg_ctlmnb && ++ if (msg_qbytes > ns->msg_ctlmnb && + !capable(CAP_SYS_RESOURCE)) { + err = -EPERM; + goto out_unlock1; + } + + ipc_lock_object(&msq->q_perm); +- err = ipc_update_perm(&msqid64->msg_perm, ipcp); ++ err = ipc_update_perm(perm, ipcp); + if (err) + goto out_unlock0; + +- msq->q_qbytes = msqid64->msg_qbytes; ++ msq->q_qbytes = msg_qbytes; + + msq->q_ctime = ktime_get_real_seconds(); + /* +@@ -601,9 +601,10 @@ static long ksys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf, int ver + case IPC_SET: + if (copy_msqid_from_user(&msqid64, buf, version)) + return -EFAULT; +- /* fallthru */ ++ return msgctl_down(ns, msqid, cmd, &msqid64.msg_perm, ++ msqid64.msg_qbytes); + case IPC_RMID: +- return msgctl_down(ns, msqid, cmd, &msqid64); ++ return msgctl_down(ns, msqid, cmd, NULL, 0); + default: + return -EINVAL; + } +@@ -735,9 +736,9 @@ static long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr, int versio + case IPC_SET: + if (copy_compat_msqid_from_user(&msqid64, uptr, version)) + return -EFAULT; +- /* fallthru */ ++ return msgctl_down(ns, msqid, cmd, &msqid64.msg_perm, msqid64.msg_qbytes); + case IPC_RMID: +- return msgctl_down(ns, msqid, cmd, &msqid64); ++ return msgctl_down(ns, msqid, cmd, NULL, 0); + default: + return -EINVAL; + } +diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c +index 3d3d61b5985b..b4b6b77f309c 100644 +--- a/kernel/bpf/devmap.c ++++ b/kernel/bpf/devmap.c +@@ -293,7 +293,8 @@ struct bpf_dtab_netdev *__dev_map_hash_lookup_elem(struct bpf_map *map, u32 key) + struct hlist_head *head = dev_map_index_hash(dtab, key); + struct bpf_dtab_netdev *dev; + +- hlist_for_each_entry_rcu(dev, head, index_hlist) ++ hlist_for_each_entry_rcu(dev, head, index_hlist, ++ lockdep_is_held(&dtab->index_lock)) + if (dev->idx == key) + return dev; + +diff --git a/kernel/events/core.c b/kernel/events/core.c +index 6c829e22bad3..15b123bdcaf5 100644 +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -5823,7 +5823,15 @@ accounting: + */ + user_lock_limit *= num_online_cpus(); + +- user_locked = atomic_long_read(&user->locked_vm) + user_extra; ++ user_locked = atomic_long_read(&user->locked_vm); ++ ++ /* ++ * sysctl_perf_event_mlock may have changed, so that ++ * user->locked_vm > user_lock_limit ++ */ ++ if (user_locked > user_lock_limit) ++ user_locked = user_lock_limit; ++ user_locked += user_extra; + + if (user_locked <= user_lock_limit) { + /* charge all to locked_vm */ +diff --git a/kernel/irq/debugfs.c b/kernel/irq/debugfs.c +index c1eccd4f6520..a949bd39e343 100644 +--- a/kernel/irq/debugfs.c ++++ b/kernel/irq/debugfs.c +@@ -114,6 +114,7 @@ static const struct irq_bit_descr irqdata_states[] = { + BIT_MASK_DESCR(IRQD_AFFINITY_MANAGED), + BIT_MASK_DESCR(IRQD_MANAGED_SHUTDOWN), + BIT_MASK_DESCR(IRQD_CAN_RESERVE), ++ BIT_MASK_DESCR(IRQD_MSI_NOMASK_QUIRK), + + BIT_MASK_DESCR(IRQD_FORWARDED_TO_VCPU), + +diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c +index dd822fd8a7d5..480df3659720 100644 +--- a/kernel/irq/irqdomain.c ++++ b/kernel/irq/irqdomain.c +@@ -1459,6 +1459,7 @@ int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg) + if (rv) { + /* Restore the original irq_data. */ + *root_irq_data = *child_irq_data; ++ kfree(child_irq_data); + goto error; + } + +diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c +index ad26fbcfbfc8..eb95f6106a1e 100644 +--- a/kernel/irq/msi.c ++++ b/kernel/irq/msi.c +@@ -453,8 +453,11 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, + continue; + + irq_data = irq_domain_get_irq_data(domain, desc->irq); +- if (!can_reserve) ++ if (!can_reserve) { + irqd_clr_can_reserve(irq_data); ++ if (domain->flags & IRQ_DOMAIN_MSI_NOMASK_QUIRK) ++ irqd_set_msi_nomask_quirk(irq_data); ++ } + ret = irq_domain_activate_irq(irq_data, can_reserve); + if (ret) + goto cleanup; +diff --git a/kernel/padata.c b/kernel/padata.c +index c3fec1413295..9c82ee4a9732 100644 +--- a/kernel/padata.c ++++ b/kernel/padata.c +@@ -35,6 +35,8 @@ + + #define MAX_OBJ_NUM 1000 + ++static void padata_free_pd(struct parallel_data *pd); ++ + static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index) + { + int cpu, target_cpu; +@@ -87,7 +89,7 @@ static void padata_parallel_worker(struct work_struct *parallel_work) + /** + * padata_do_parallel - padata parallelization function + * +- * @pinst: padata instance ++ * @ps: padatashell + * @padata: object to be parallelized + * @cb_cpu: pointer to the CPU that the serialization callback function should + * run on. If it's not in the serial cpumask of @pinst +@@ -98,16 +100,17 @@ static void padata_parallel_worker(struct work_struct *parallel_work) + * Note: Every object which is parallelized by padata_do_parallel + * must be seen by padata_do_serial. + */ +-int padata_do_parallel(struct padata_instance *pinst, ++int padata_do_parallel(struct padata_shell *ps, + struct padata_priv *padata, int *cb_cpu) + { ++ struct padata_instance *pinst = ps->pinst; + int i, cpu, cpu_index, target_cpu, err; + struct padata_parallel_queue *queue; + struct parallel_data *pd; + + rcu_read_lock_bh(); + +- pd = rcu_dereference_bh(pinst->pd); ++ pd = rcu_dereference_bh(ps->pd); + + err = -EINVAL; + if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID) +@@ -210,10 +213,10 @@ static struct padata_priv *padata_find_next(struct parallel_data *pd, + + static void padata_reorder(struct parallel_data *pd) + { ++ struct padata_instance *pinst = pd->ps->pinst; + int cb_cpu; + struct padata_priv *padata; + struct padata_serial_queue *squeue; +- struct padata_instance *pinst = pd->pinst; + struct padata_parallel_queue *next_queue; + + /* +@@ -283,6 +286,7 @@ static void padata_serial_worker(struct work_struct *serial_work) + struct padata_serial_queue *squeue; + struct parallel_data *pd; + LIST_HEAD(local_list); ++ int cnt; + + local_bh_disable(); + squeue = container_of(serial_work, struct padata_serial_queue, work); +@@ -292,6 +296,8 @@ static void padata_serial_worker(struct work_struct *serial_work) + list_replace_init(&squeue->serial.list, &local_list); + spin_unlock(&squeue->serial.lock); + ++ cnt = 0; ++ + while (!list_empty(&local_list)) { + struct padata_priv *padata; + +@@ -301,9 +307,12 @@ static void padata_serial_worker(struct work_struct *serial_work) + list_del_init(&padata->list); + + padata->serial(padata); +- atomic_dec(&pd->refcnt); ++ cnt++; + } + local_bh_enable(); ++ ++ if (atomic_sub_and_test(cnt, &pd->refcnt)) ++ padata_free_pd(pd); + } + + /** +@@ -341,36 +350,39 @@ void padata_do_serial(struct padata_priv *padata) + } + EXPORT_SYMBOL(padata_do_serial); + +-static int padata_setup_cpumasks(struct parallel_data *pd, +- const struct cpumask *pcpumask, +- const struct cpumask *cbcpumask) ++static int padata_setup_cpumasks(struct padata_instance *pinst) + { + struct workqueue_attrs *attrs; ++ int err; ++ ++ attrs = alloc_workqueue_attrs(); ++ if (!attrs) ++ return -ENOMEM; ++ ++ /* Restrict parallel_wq workers to pd->cpumask.pcpu. */ ++ cpumask_copy(attrs->cpumask, pinst->cpumask.pcpu); ++ err = apply_workqueue_attrs(pinst->parallel_wq, attrs); ++ free_workqueue_attrs(attrs); ++ ++ return err; ++} ++ ++static int pd_setup_cpumasks(struct parallel_data *pd, ++ const struct cpumask *pcpumask, ++ const struct cpumask *cbcpumask) ++{ + int err = -ENOMEM; + + if (!alloc_cpumask_var(&pd->cpumask.pcpu, GFP_KERNEL)) + goto out; +- cpumask_and(pd->cpumask.pcpu, pcpumask, cpu_online_mask); +- + if (!alloc_cpumask_var(&pd->cpumask.cbcpu, GFP_KERNEL)) + goto free_pcpu_mask; +- cpumask_and(pd->cpumask.cbcpu, cbcpumask, cpu_online_mask); +- +- attrs = alloc_workqueue_attrs(); +- if (!attrs) +- goto free_cbcpu_mask; + +- /* Restrict parallel_wq workers to pd->cpumask.pcpu. */ +- cpumask_copy(attrs->cpumask, pd->cpumask.pcpu); +- err = apply_workqueue_attrs(pd->pinst->parallel_wq, attrs); +- free_workqueue_attrs(attrs); +- if (err < 0) +- goto free_cbcpu_mask; ++ cpumask_copy(pd->cpumask.pcpu, pcpumask); ++ cpumask_copy(pd->cpumask.cbcpu, cbcpumask); + + return 0; + +-free_cbcpu_mask: +- free_cpumask_var(pd->cpumask.cbcpu); + free_pcpu_mask: + free_cpumask_var(pd->cpumask.pcpu); + out: +@@ -414,12 +426,16 @@ static void padata_init_pqueues(struct parallel_data *pd) + } + + /* Allocate and initialize the internal cpumask dependend resources. */ +-static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst, +- const struct cpumask *pcpumask, +- const struct cpumask *cbcpumask) ++static struct parallel_data *padata_alloc_pd(struct padata_shell *ps) + { ++ struct padata_instance *pinst = ps->pinst; ++ const struct cpumask *cbcpumask; ++ const struct cpumask *pcpumask; + struct parallel_data *pd; + ++ cbcpumask = pinst->rcpumask.cbcpu; ++ pcpumask = pinst->rcpumask.pcpu; ++ + pd = kzalloc(sizeof(struct parallel_data), GFP_KERNEL); + if (!pd) + goto err; +@@ -432,15 +448,15 @@ static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst, + if (!pd->squeue) + goto err_free_pqueue; + +- pd->pinst = pinst; +- if (padata_setup_cpumasks(pd, pcpumask, cbcpumask) < 0) ++ pd->ps = ps; ++ if (pd_setup_cpumasks(pd, pcpumask, cbcpumask)) + goto err_free_squeue; + + padata_init_pqueues(pd); + padata_init_squeues(pd); + atomic_set(&pd->seq_nr, -1); + atomic_set(&pd->reorder_objects, 0); +- atomic_set(&pd->refcnt, 0); ++ atomic_set(&pd->refcnt, 1); + spin_lock_init(&pd->lock); + pd->cpu = cpumask_first(pd->cpumask.pcpu); + INIT_WORK(&pd->reorder_work, invoke_padata_reorder); +@@ -466,29 +482,6 @@ static void padata_free_pd(struct parallel_data *pd) + kfree(pd); + } + +-/* Flush all objects out of the padata queues. */ +-static void padata_flush_queues(struct parallel_data *pd) +-{ +- int cpu; +- struct padata_parallel_queue *pqueue; +- struct padata_serial_queue *squeue; +- +- for_each_cpu(cpu, pd->cpumask.pcpu) { +- pqueue = per_cpu_ptr(pd->pqueue, cpu); +- flush_work(&pqueue->work); +- } +- +- if (atomic_read(&pd->reorder_objects)) +- padata_reorder(pd); +- +- for_each_cpu(cpu, pd->cpumask.cbcpu) { +- squeue = per_cpu_ptr(pd->squeue, cpu); +- flush_work(&squeue->work); +- } +- +- BUG_ON(atomic_read(&pd->refcnt) != 0); +-} +- + static void __padata_start(struct padata_instance *pinst) + { + pinst->flags |= PADATA_INIT; +@@ -502,39 +495,67 @@ static void __padata_stop(struct padata_instance *pinst) + pinst->flags &= ~PADATA_INIT; + + synchronize_rcu(); +- +- get_online_cpus(); +- padata_flush_queues(pinst->pd); +- put_online_cpus(); + } + + /* Replace the internal control structure with a new one. */ +-static void padata_replace(struct padata_instance *pinst, +- struct parallel_data *pd_new) ++static int padata_replace_one(struct padata_shell *ps) + { +- struct parallel_data *pd_old = pinst->pd; +- int notification_mask = 0; ++ struct parallel_data *pd_new; + +- pinst->flags |= PADATA_RESET; ++ pd_new = padata_alloc_pd(ps); ++ if (!pd_new) ++ return -ENOMEM; + +- rcu_assign_pointer(pinst->pd, pd_new); ++ ps->opd = rcu_dereference_protected(ps->pd, 1); ++ rcu_assign_pointer(ps->pd, pd_new); + +- synchronize_rcu(); ++ return 0; ++} ++ ++static int padata_replace(struct padata_instance *pinst, int cpu) ++{ ++ int notification_mask = 0; ++ struct padata_shell *ps; ++ int err; ++ ++ pinst->flags |= PADATA_RESET; + +- if (!cpumask_equal(pd_old->cpumask.pcpu, pd_new->cpumask.pcpu)) ++ cpumask_copy(pinst->omask, pinst->rcpumask.pcpu); ++ cpumask_and(pinst->rcpumask.pcpu, pinst->cpumask.pcpu, ++ cpu_online_mask); ++ if (cpu >= 0) ++ cpumask_clear_cpu(cpu, pinst->rcpumask.pcpu); ++ if (!cpumask_equal(pinst->omask, pinst->rcpumask.pcpu)) + notification_mask |= PADATA_CPU_PARALLEL; +- if (!cpumask_equal(pd_old->cpumask.cbcpu, pd_new->cpumask.cbcpu)) ++ ++ cpumask_copy(pinst->omask, pinst->rcpumask.cbcpu); ++ cpumask_and(pinst->rcpumask.cbcpu, pinst->cpumask.cbcpu, ++ cpu_online_mask); ++ if (cpu >= 0) ++ cpumask_clear_cpu(cpu, pinst->rcpumask.cbcpu); ++ if (!cpumask_equal(pinst->omask, pinst->rcpumask.cbcpu)) + notification_mask |= PADATA_CPU_SERIAL; + +- padata_flush_queues(pd_old); +- padata_free_pd(pd_old); ++ list_for_each_entry(ps, &pinst->pslist, list) { ++ err = padata_replace_one(ps); ++ if (err) ++ break; ++ } ++ ++ synchronize_rcu(); ++ ++ list_for_each_entry_continue_reverse(ps, &pinst->pslist, list) ++ if (atomic_dec_and_test(&ps->opd->refcnt)) ++ padata_free_pd(ps->opd); + + if (notification_mask) + blocking_notifier_call_chain(&pinst->cpumask_change_notifier, + notification_mask, +- &pd_new->cpumask); ++ &pinst->cpumask); + + pinst->flags &= ~PADATA_RESET; ++ ++ return err; + } + + /** +@@ -587,7 +608,7 @@ static int __padata_set_cpumasks(struct padata_instance *pinst, + cpumask_var_t cbcpumask) + { + int valid; +- struct parallel_data *pd; ++ int err; + + valid = padata_validate_cpumask(pinst, pcpumask); + if (!valid) { +@@ -600,19 +621,15 @@ static int __padata_set_cpumasks(struct padata_instance *pinst, + __padata_stop(pinst); + + out_replace: +- pd = padata_alloc_pd(pinst, pcpumask, cbcpumask); +- if (!pd) +- return -ENOMEM; +- + cpumask_copy(pinst->cpumask.pcpu, pcpumask); + cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); + +- padata_replace(pinst, pd); ++ err = padata_setup_cpumasks(pinst) ?: padata_replace(pinst, -1); + + if (valid) + __padata_start(pinst); + +- return 0; ++ return err; + } + + /** +@@ -695,46 +712,32 @@ EXPORT_SYMBOL(padata_stop); + + static int __padata_add_cpu(struct padata_instance *pinst, int cpu) + { +- struct parallel_data *pd; ++ int err = 0; + + if (cpumask_test_cpu(cpu, cpu_online_mask)) { +- pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu, +- pinst->cpumask.cbcpu); +- if (!pd) +- return -ENOMEM; +- +- padata_replace(pinst, pd); ++ err = padata_replace(pinst, -1); + + if (padata_validate_cpumask(pinst, pinst->cpumask.pcpu) && + padata_validate_cpumask(pinst, pinst->cpumask.cbcpu)) + __padata_start(pinst); + } + +- return 0; ++ return err; + } + + static int __padata_remove_cpu(struct padata_instance *pinst, int cpu) + { +- struct parallel_data *pd = NULL; ++ int err = 0; + + if (cpumask_test_cpu(cpu, cpu_online_mask)) { +- + if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) || + !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu)) + __padata_stop(pinst); + +- pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu, +- pinst->cpumask.cbcpu); +- if (!pd) +- return -ENOMEM; +- +- padata_replace(pinst, pd); +- +- cpumask_clear_cpu(cpu, pd->cpumask.cbcpu); +- cpumask_clear_cpu(cpu, pd->cpumask.pcpu); ++ err = padata_replace(pinst, cpu); + } + +- return 0; ++ return err; + } + + /** +@@ -817,8 +820,12 @@ static void __padata_free(struct padata_instance *pinst) + cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node); + #endif + ++ WARN_ON(!list_empty(&pinst->pslist)); ++ + padata_stop(pinst); +- padata_free_pd(pinst->pd); ++ free_cpumask_var(pinst->omask); ++ free_cpumask_var(pinst->rcpumask.cbcpu); ++ free_cpumask_var(pinst->rcpumask.pcpu); + free_cpumask_var(pinst->cpumask.pcpu); + free_cpumask_var(pinst->cpumask.cbcpu); + destroy_workqueue(pinst->serial_wq); +@@ -965,7 +972,6 @@ static struct padata_instance *padata_alloc(const char *name, + const struct cpumask *cbcpumask) + { + struct padata_instance *pinst; +- struct parallel_data *pd = NULL; + + pinst = kzalloc(sizeof(struct padata_instance), GFP_KERNEL); + if (!pinst) +@@ -993,14 +999,22 @@ static struct padata_instance *padata_alloc(const char *name, + !padata_validate_cpumask(pinst, cbcpumask)) + goto err_free_masks; + +- pd = padata_alloc_pd(pinst, pcpumask, cbcpumask); +- if (!pd) ++ if (!alloc_cpumask_var(&pinst->rcpumask.pcpu, GFP_KERNEL)) + goto err_free_masks; ++ if (!alloc_cpumask_var(&pinst->rcpumask.cbcpu, GFP_KERNEL)) ++ goto err_free_rcpumask_pcpu; ++ if (!alloc_cpumask_var(&pinst->omask, GFP_KERNEL)) ++ goto err_free_rcpumask_cbcpu; + +- rcu_assign_pointer(pinst->pd, pd); ++ INIT_LIST_HEAD(&pinst->pslist); + + cpumask_copy(pinst->cpumask.pcpu, pcpumask); + cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); ++ cpumask_and(pinst->rcpumask.pcpu, pcpumask, cpu_online_mask); ++ cpumask_and(pinst->rcpumask.cbcpu, cbcpumask, cpu_online_mask); ++ ++ if (padata_setup_cpumasks(pinst)) ++ goto err_free_omask; + + pinst->flags = 0; + +@@ -1016,6 +1030,12 @@ static struct padata_instance *padata_alloc(const char *name, + + return pinst; + ++err_free_omask: ++ free_cpumask_var(pinst->omask); ++err_free_rcpumask_cbcpu: ++ free_cpumask_var(pinst->rcpumask.cbcpu); ++err_free_rcpumask_pcpu: ++ free_cpumask_var(pinst->rcpumask.pcpu); + err_free_masks: + free_cpumask_var(pinst->cpumask.pcpu); + free_cpumask_var(pinst->cpumask.cbcpu); +@@ -1054,6 +1074,61 @@ void padata_free(struct padata_instance *pinst) + } + EXPORT_SYMBOL(padata_free); + ++/** ++ * padata_alloc_shell - Allocate and initialize padata shell. ++ * ++ * @pinst: Parent padata_instance object. ++ */ ++struct padata_shell *padata_alloc_shell(struct padata_instance *pinst) ++{ ++ struct parallel_data *pd; ++ struct padata_shell *ps; ++ ++ ps = kzalloc(sizeof(*ps), GFP_KERNEL); ++ if (!ps) ++ goto out; ++ ++ ps->pinst = pinst; ++ ++ get_online_cpus(); ++ pd = padata_alloc_pd(ps); ++ put_online_cpus(); ++ ++ if (!pd) ++ goto out_free_ps; ++ ++ mutex_lock(&pinst->lock); ++ RCU_INIT_POINTER(ps->pd, pd); ++ list_add(&ps->list, &pinst->pslist); ++ mutex_unlock(&pinst->lock); ++ ++ return ps; ++ ++out_free_ps: ++ kfree(ps); ++out: ++ return NULL; ++} ++EXPORT_SYMBOL(padata_alloc_shell); ++ ++/** ++ * padata_free_shell - free a padata shell ++ * ++ * @ps: padata shell to free ++ */ ++void padata_free_shell(struct padata_shell *ps) ++{ ++ struct padata_instance *pinst = ps->pinst; ++ ++ mutex_lock(&pinst->lock); ++ list_del(&ps->list); ++ padata_free_pd(rcu_dereference_protected(ps->pd, 1)); ++ mutex_unlock(&pinst->lock); ++ ++ kfree(ps); ++} ++EXPORT_SYMBOL(padata_free_shell); ++ + #ifdef CONFIG_HOTPLUG_CPU + + static __init int padata_driver_init(void) +diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c +index 5dffade2d7cd..21acdff3bd27 100644 +--- a/kernel/rcu/srcutree.c ++++ b/kernel/rcu/srcutree.c +@@ -530,7 +530,7 @@ static void srcu_gp_end(struct srcu_struct *ssp) + idx = rcu_seq_state(ssp->srcu_gp_seq); + WARN_ON_ONCE(idx != SRCU_STATE_SCAN2); + cbdelay = srcu_get_delay(ssp); +- ssp->srcu_last_gp_end = ktime_get_mono_fast_ns(); ++ WRITE_ONCE(ssp->srcu_last_gp_end, ktime_get_mono_fast_ns()); + rcu_seq_end(&ssp->srcu_gp_seq); + gpseq = rcu_seq_current(&ssp->srcu_gp_seq); + if (ULONG_CMP_LT(ssp->srcu_gp_seq_needed_exp, gpseq)) +@@ -762,6 +762,7 @@ static bool srcu_might_be_idle(struct srcu_struct *ssp) + unsigned long flags; + struct srcu_data *sdp; + unsigned long t; ++ unsigned long tlast; + + /* If the local srcu_data structure has callbacks, not idle. */ + local_irq_save(flags); +@@ -780,9 +781,9 @@ static bool srcu_might_be_idle(struct srcu_struct *ssp) + + /* First, see if enough time has passed since the last GP. */ + t = ktime_get_mono_fast_ns(); ++ tlast = READ_ONCE(ssp->srcu_last_gp_end); + if (exp_holdoff == 0 || +- time_in_range_open(t, ssp->srcu_last_gp_end, +- ssp->srcu_last_gp_end + exp_holdoff)) ++ time_in_range_open(t, tlast, tlast + exp_holdoff)) + return false; /* Too soon after last GP. */ + + /* Next, check for probable idleness. */ +diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h +index d632cd019597..69c5aa64fcfd 100644 +--- a/kernel/rcu/tree_exp.h ++++ b/kernel/rcu/tree_exp.h +@@ -134,7 +134,7 @@ static void __maybe_unused sync_exp_reset_tree(void) + rcu_for_each_node_breadth_first(rnp) { + raw_spin_lock_irqsave_rcu_node(rnp, flags); + WARN_ON_ONCE(rnp->expmask); +- rnp->expmask = rnp->expmaskinit; ++ WRITE_ONCE(rnp->expmask, rnp->expmaskinit); + raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + } + } +@@ -211,7 +211,7 @@ static void __rcu_report_exp_rnp(struct rcu_node *rnp, + rnp = rnp->parent; + raw_spin_lock_rcu_node(rnp); /* irqs already disabled */ + WARN_ON_ONCE(!(rnp->expmask & mask)); +- rnp->expmask &= ~mask; ++ WRITE_ONCE(rnp->expmask, rnp->expmask & ~mask); + } + } + +@@ -241,7 +241,7 @@ static void rcu_report_exp_cpu_mult(struct rcu_node *rnp, + raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + return; + } +- rnp->expmask &= ~mask; ++ WRITE_ONCE(rnp->expmask, rnp->expmask & ~mask); + __rcu_report_exp_rnp(rnp, wake, flags); /* Releases rnp->lock. */ + } + +@@ -372,12 +372,10 @@ static void sync_rcu_exp_select_node_cpus(struct work_struct *wp) + raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + + /* IPI the remaining CPUs for expedited quiescent state. */ +- for_each_leaf_node_cpu_mask(rnp, cpu, rnp->expmask) { ++ for_each_leaf_node_cpu_mask(rnp, cpu, mask_ofl_ipi) { + unsigned long mask = leaf_node_cpu_bit(rnp, cpu); + struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu); + +- if (!(mask_ofl_ipi & mask)) +- continue; + retry_ipi: + if (rcu_dynticks_in_eqs_since(rdp, rdp->exp_dynticks_snap)) { + mask_ofl_test |= mask; +@@ -491,7 +489,7 @@ static void synchronize_sched_expedited_wait(void) + struct rcu_data *rdp; + + mask = leaf_node_cpu_bit(rnp, cpu); +- if (!(rnp->expmask & mask)) ++ if (!(READ_ONCE(rnp->expmask) & mask)) + continue; + ndetected++; + rdp = per_cpu_ptr(&rcu_data, cpu); +@@ -503,7 +501,8 @@ static void synchronize_sched_expedited_wait(void) + } + pr_cont(" } %lu jiffies s: %lu root: %#lx/%c\n", + jiffies - jiffies_start, rcu_state.expedited_sequence, +- rnp_root->expmask, ".T"[!!rnp_root->exp_tasks]); ++ READ_ONCE(rnp_root->expmask), ++ ".T"[!!rnp_root->exp_tasks]); + if (ndetected) { + pr_err("blocking rcu_node structures:"); + rcu_for_each_node_breadth_first(rnp) { +@@ -513,7 +512,7 @@ static void synchronize_sched_expedited_wait(void) + continue; + pr_cont(" l=%u:%d-%d:%#lx/%c", + rnp->level, rnp->grplo, rnp->grphi, +- rnp->expmask, ++ READ_ONCE(rnp->expmask), + ".T"[!!rnp->exp_tasks]); + } + pr_cont("\n"); +@@ -521,7 +520,7 @@ static void synchronize_sched_expedited_wait(void) + rcu_for_each_leaf_node(rnp) { + for_each_leaf_node_possible_cpu(rnp, cpu) { + mask = leaf_node_cpu_bit(rnp, cpu); +- if (!(rnp->expmask & mask)) ++ if (!(READ_ONCE(rnp->expmask) & mask)) + continue; + dump_cpu_task(cpu); + } +diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h +index fa08d55f7040..f849e7429816 100644 +--- a/kernel/rcu/tree_plugin.h ++++ b/kernel/rcu/tree_plugin.h +@@ -220,7 +220,7 @@ static void rcu_preempt_ctxt_queue(struct rcu_node *rnp, struct rcu_data *rdp) + * blocked tasks. + */ + if (!rnp->gp_tasks && (blkd_state & RCU_GP_BLKD)) { +- rnp->gp_tasks = &t->rcu_node_entry; ++ WRITE_ONCE(rnp->gp_tasks, &t->rcu_node_entry); + WARN_ON_ONCE(rnp->completedqs == rnp->gp_seq); + } + if (!rnp->exp_tasks && (blkd_state & RCU_EXP_BLKD)) +@@ -340,7 +340,7 @@ EXPORT_SYMBOL_GPL(rcu_note_context_switch); + */ + static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp) + { +- return rnp->gp_tasks != NULL; ++ return READ_ONCE(rnp->gp_tasks) != NULL; + } + + /* Bias and limit values for ->rcu_read_lock_nesting. */ +@@ -493,7 +493,7 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, unsigned long flags) + trace_rcu_unlock_preempted_task(TPS("rcu_preempt"), + rnp->gp_seq, t->pid); + if (&t->rcu_node_entry == rnp->gp_tasks) +- rnp->gp_tasks = np; ++ WRITE_ONCE(rnp->gp_tasks, np); + if (&t->rcu_node_entry == rnp->exp_tasks) + rnp->exp_tasks = np; + if (IS_ENABLED(CONFIG_RCU_BOOST)) { +@@ -612,7 +612,7 @@ static void rcu_read_unlock_special(struct task_struct *t) + + t->rcu_read_unlock_special.b.exp_hint = false; + exp = (t->rcu_blocked_node && t->rcu_blocked_node->exp_tasks) || +- (rdp->grpmask & rnp->expmask) || ++ (rdp->grpmask & READ_ONCE(rnp->expmask)) || + tick_nohz_full_cpu(rdp->cpu); + // Need to defer quiescent state until everything is enabled. + if (irqs_were_disabled && use_softirq && +@@ -663,7 +663,7 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) + dump_blkd_tasks(rnp, 10); + if (rcu_preempt_has_tasks(rnp) && + (rnp->qsmaskinit || rnp->wait_blkd_tasks)) { +- rnp->gp_tasks = rnp->blkd_tasks.next; ++ WRITE_ONCE(rnp->gp_tasks, rnp->blkd_tasks.next); + t = container_of(rnp->gp_tasks, struct task_struct, + rcu_node_entry); + trace_rcu_unlock_preempted_task(TPS("rcu_preempt-GPS"), +@@ -757,7 +757,8 @@ dump_blkd_tasks(struct rcu_node *rnp, int ncheck) + pr_info("%s: %d:%d ->qsmask %#lx ->qsmaskinit %#lx ->qsmaskinitnext %#lx\n", + __func__, rnp1->grplo, rnp1->grphi, rnp1->qsmask, rnp1->qsmaskinit, rnp1->qsmaskinitnext); + pr_info("%s: ->gp_tasks %p ->boost_tasks %p ->exp_tasks %p\n", +- __func__, rnp->gp_tasks, rnp->boost_tasks, rnp->exp_tasks); ++ __func__, READ_ONCE(rnp->gp_tasks), rnp->boost_tasks, ++ rnp->exp_tasks); + pr_info("%s: ->blkd_tasks", __func__); + i = 0; + list_for_each(lhp, &rnp->blkd_tasks) { +diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c +index 451f9d05ccfe..4b11f0309eee 100644 +--- a/kernel/time/alarmtimer.c ++++ b/kernel/time/alarmtimer.c +@@ -88,6 +88,7 @@ static int alarmtimer_rtc_add_device(struct device *dev, + unsigned long flags; + struct rtc_device *rtc = to_rtc_device(dev); + struct wakeup_source *__ws; ++ int ret = 0; + + if (rtcdev) + return -EBUSY; +@@ -102,8 +103,8 @@ static int alarmtimer_rtc_add_device(struct device *dev, + spin_lock_irqsave(&rtcdev_lock, flags); + if (!rtcdev) { + if (!try_module_get(rtc->owner)) { +- spin_unlock_irqrestore(&rtcdev_lock, flags); +- return -1; ++ ret = -1; ++ goto unlock; + } + + rtcdev = rtc; +@@ -112,11 +113,12 @@ static int alarmtimer_rtc_add_device(struct device *dev, + ws = __ws; + __ws = NULL; + } ++unlock: + spin_unlock_irqrestore(&rtcdev_lock, flags); + + wakeup_source_unregister(__ws); + +- return 0; ++ return ret; + } + + static inline void alarmtimer_rtc_timer_init(void) +diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c +index fff5f64981c6..428beb69426a 100644 +--- a/kernel/time/clocksource.c ++++ b/kernel/time/clocksource.c +@@ -293,8 +293,15 @@ static void clocksource_watchdog(struct timer_list *unused) + next_cpu = cpumask_next(raw_smp_processor_id(), cpu_online_mask); + if (next_cpu >= nr_cpu_ids) + next_cpu = cpumask_first(cpu_online_mask); +- watchdog_timer.expires += WATCHDOG_INTERVAL; +- add_timer_on(&watchdog_timer, next_cpu); ++ ++ /* ++ * Arm timer if not already pending: could race with concurrent ++ * pair clocksource_stop_watchdog() clocksource_start_watchdog(). ++ */ ++ if (!timer_pending(&watchdog_timer)) { ++ watchdog_timer.expires += WATCHDOG_INTERVAL; ++ add_timer_on(&watchdog_timer, next_cpu); ++ } + out: + spin_unlock(&watchdog_lock); + } +diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c +index 0708a41cfe2d..407d8bf4ed93 100644 +--- a/kernel/trace/ftrace.c ++++ b/kernel/trace/ftrace.c +@@ -5102,8 +5102,8 @@ static const struct file_operations ftrace_notrace_fops = { + + static DEFINE_MUTEX(graph_lock); + +-struct ftrace_hash *ftrace_graph_hash = EMPTY_HASH; +-struct ftrace_hash *ftrace_graph_notrace_hash = EMPTY_HASH; ++struct ftrace_hash __rcu *ftrace_graph_hash = EMPTY_HASH; ++struct ftrace_hash __rcu *ftrace_graph_notrace_hash = EMPTY_HASH; + + enum graph_filter_type { + GRAPH_FILTER_NOTRACE = 0, +@@ -5378,8 +5378,15 @@ ftrace_graph_release(struct inode *inode, struct file *file) + + mutex_unlock(&graph_lock); + +- /* Wait till all users are no longer using the old hash */ +- synchronize_rcu(); ++ /* ++ * We need to do a hard force of sched synchronization. ++ * This is because we use preempt_disable() to do RCU, but ++ * the function tracers can be called where RCU is not watching ++ * (like before user_exit()). We can not rely on the RCU ++ * infrastructure to do the synchronization, thus we must do it ++ * ourselves. ++ */ ++ schedule_on_each_cpu(ftrace_sync); + + free_ftrace_hash(old_hash); + } +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index d685c61085c0..a3c29d5fcc61 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -932,22 +932,31 @@ extern void __trace_graph_return(struct trace_array *tr, + unsigned long flags, int pc); + + #ifdef CONFIG_DYNAMIC_FTRACE +-extern struct ftrace_hash *ftrace_graph_hash; +-extern struct ftrace_hash *ftrace_graph_notrace_hash; ++extern struct ftrace_hash __rcu *ftrace_graph_hash; ++extern struct ftrace_hash __rcu *ftrace_graph_notrace_hash; + + static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace) + { + unsigned long addr = trace->func; + int ret = 0; ++ struct ftrace_hash *hash; + + preempt_disable_notrace(); + +- if (ftrace_hash_empty(ftrace_graph_hash)) { ++ /* ++ * Have to open code "rcu_dereference_sched()" because the ++ * function graph tracer can be called when RCU is not ++ * "watching". ++ * Protected with schedule_on_each_cpu(ftrace_sync) ++ */ ++ hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible()); ++ ++ if (ftrace_hash_empty(hash)) { + ret = 1; + goto out; + } + +- if (ftrace_lookup_ip(ftrace_graph_hash, addr)) { ++ if (ftrace_lookup_ip(hash, addr)) { + + /* + * This needs to be cleared on the return functions +@@ -983,10 +992,20 @@ static inline void ftrace_graph_addr_finish(struct ftrace_graph_ret *trace) + static inline int ftrace_graph_notrace_addr(unsigned long addr) + { + int ret = 0; ++ struct ftrace_hash *notrace_hash; + + preempt_disable_notrace(); + +- if (ftrace_lookup_ip(ftrace_graph_notrace_hash, addr)) ++ /* ++ * Have to open code "rcu_dereference_sched()" because the ++ * function graph tracer can be called when RCU is not ++ * "watching". ++ * Protected with schedule_on_each_cpu(ftrace_sync) ++ */ ++ notrace_hash = rcu_dereference_protected(ftrace_graph_notrace_hash, ++ !preemptible()); ++ ++ if (ftrace_lookup_ip(notrace_hash, addr)) + ret = 1; + + preempt_enable_notrace(); +diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c +index 205692181e7b..4be7fc84d6b6 100644 +--- a/kernel/trace/trace_events_hist.c ++++ b/kernel/trace/trace_events_hist.c +@@ -470,11 +470,12 @@ struct action_data { + * When a histogram trigger is hit, the values of any + * references to variables, including variables being passed + * as parameters to synthetic events, are collected into a +- * var_ref_vals array. This var_ref_idx is the index of the +- * first param in the array to be passed to the synthetic +- * event invocation. ++ * var_ref_vals array. This var_ref_idx array is an array of ++ * indices into the var_ref_vals array, one for each synthetic ++ * event param, and is passed to the synthetic event ++ * invocation. + */ +- unsigned int var_ref_idx; ++ unsigned int var_ref_idx[TRACING_MAP_VARS_MAX]; + struct synth_event *synth_event; + bool use_trace_keyword; + char *synth_event_name; +@@ -875,14 +876,14 @@ static struct trace_event_functions synth_event_funcs = { + + static notrace void trace_event_raw_event_synth(void *__data, + u64 *var_ref_vals, +- unsigned int var_ref_idx) ++ unsigned int *var_ref_idx) + { + struct trace_event_file *trace_file = __data; + struct synth_trace_event *entry; + struct trace_event_buffer fbuffer; + struct ring_buffer *buffer; + struct synth_event *event; +- unsigned int i, n_u64; ++ unsigned int i, n_u64, val_idx; + int fields_size = 0; + + event = trace_file->event_call->data; +@@ -905,15 +906,16 @@ static notrace void trace_event_raw_event_synth(void *__data, + goto out; + + for (i = 0, n_u64 = 0; i < event->n_fields; i++) { ++ val_idx = var_ref_idx[i]; + if (event->fields[i]->is_string) { +- char *str_val = (char *)(long)var_ref_vals[var_ref_idx + i]; ++ char *str_val = (char *)(long)var_ref_vals[val_idx]; + char *str_field = (char *)&entry->fields[n_u64]; + + strscpy(str_field, str_val, STR_VAR_LEN_MAX); + n_u64 += STR_VAR_LEN_MAX / sizeof(u64); + } else { + struct synth_field *field = event->fields[i]; +- u64 val = var_ref_vals[var_ref_idx + i]; ++ u64 val = var_ref_vals[val_idx]; + + switch (field->size) { + case 1: +@@ -1113,10 +1115,10 @@ static struct tracepoint *alloc_synth_tracepoint(char *name) + } + + typedef void (*synth_probe_func_t) (void *__data, u64 *var_ref_vals, +- unsigned int var_ref_idx); ++ unsigned int *var_ref_idx); + + static inline void trace_synth(struct synth_event *event, u64 *var_ref_vals, +- unsigned int var_ref_idx) ++ unsigned int *var_ref_idx) + { + struct tracepoint *tp = event->tp; + +@@ -2655,6 +2657,22 @@ static int init_var_ref(struct hist_field *ref_field, + goto out; + } + ++static int find_var_ref_idx(struct hist_trigger_data *hist_data, ++ struct hist_field *var_field) ++{ ++ struct hist_field *ref_field; ++ int i; ++ ++ for (i = 0; i < hist_data->n_var_refs; i++) { ++ ref_field = hist_data->var_refs[i]; ++ if (ref_field->var.idx == var_field->var.idx && ++ ref_field->var.hist_data == var_field->hist_data) ++ return i; ++ } ++ ++ return -ENOENT; ++} ++ + /** + * create_var_ref - Create a variable reference and attach it to trigger + * @hist_data: The trigger that will be referencing the variable +@@ -4228,11 +4246,11 @@ static int trace_action_create(struct hist_trigger_data *hist_data, + struct trace_array *tr = hist_data->event_file->tr; + char *event_name, *param, *system = NULL; + struct hist_field *hist_field, *var_ref; +- unsigned int i, var_ref_idx; ++ unsigned int i; + unsigned int field_pos = 0; + struct synth_event *event; + char *synth_event_name; +- int ret = 0; ++ int var_ref_idx, ret = 0; + + lockdep_assert_held(&event_mutex); + +@@ -4249,8 +4267,6 @@ static int trace_action_create(struct hist_trigger_data *hist_data, + + event->ref++; + +- var_ref_idx = hist_data->n_var_refs; +- + for (i = 0; i < data->n_params; i++) { + char *p; + +@@ -4299,6 +4315,14 @@ static int trace_action_create(struct hist_trigger_data *hist_data, + goto err; + } + ++ var_ref_idx = find_var_ref_idx(hist_data, var_ref); ++ if (WARN_ON(var_ref_idx < 0)) { ++ ret = var_ref_idx; ++ goto err; ++ } ++ ++ data->var_ref_idx[i] = var_ref_idx; ++ + field_pos++; + kfree(p); + continue; +@@ -4317,7 +4341,6 @@ static int trace_action_create(struct hist_trigger_data *hist_data, + } + + data->synth_event = event; +- data->var_ref_idx = var_ref_idx; + out: + return ret; + err: +diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c +index 9ae87be422f2..ab8b6436d53f 100644 +--- a/kernel/trace/trace_probe.c ++++ b/kernel/trace/trace_probe.c +@@ -876,7 +876,8 @@ static int __set_print_fmt(struct trace_probe *tp, char *buf, int len, + for (i = 0; i < tp->nr_args; i++) { + parg = tp->args + i; + if (parg->count) { +- if (strcmp(parg->type->name, "string") == 0) ++ if ((strcmp(parg->type->name, "string") == 0) || ++ (strcmp(parg->type->name, "ustring") == 0)) + fmt = ", __get_str(%s[%d])"; + else + fmt = ", REC->%s[%d]"; +@@ -884,7 +885,8 @@ static int __set_print_fmt(struct trace_probe *tp, char *buf, int len, + pos += snprintf(buf + pos, LEN_OR_ZERO, + fmt, parg->name, j); + } else { +- if (strcmp(parg->type->name, "string") == 0) ++ if ((strcmp(parg->type->name, "string") == 0) || ++ (strcmp(parg->type->name, "ustring") == 0)) + fmt = ", __get_str(%s)"; + else + fmt = ", REC->%s"; +diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c +index e288168661e1..e304196d7c28 100644 +--- a/kernel/trace/trace_sched_switch.c ++++ b/kernel/trace/trace_sched_switch.c +@@ -89,8 +89,10 @@ static void tracing_sched_unregister(void) + + static void tracing_start_sched_switch(int ops) + { +- bool sched_register = (!sched_cmdline_ref && !sched_tgid_ref); ++ bool sched_register; ++ + mutex_lock(&sched_register_mutex); ++ sched_register = (!sched_cmdline_ref && !sched_tgid_ref); + + switch (ops) { + case RECORD_CMDLINE: +diff --git a/lib/test_kasan.c b/lib/test_kasan.c +index 49cc4d570a40..bd3d9ef7d39e 100644 +--- a/lib/test_kasan.c ++++ b/lib/test_kasan.c +@@ -157,6 +157,7 @@ static noinline void __init kmalloc_oob_krealloc_more(void) + if (!ptr1 || !ptr2) { + pr_err("Allocation failed\n"); + kfree(ptr1); ++ kfree(ptr2); + return; + } + +diff --git a/mm/backing-dev.c b/mm/backing-dev.c +index c360f6a6c844..62f05f605fb5 100644 +--- a/mm/backing-dev.c ++++ b/mm/backing-dev.c +@@ -21,6 +21,7 @@ struct backing_dev_info noop_backing_dev_info = { + EXPORT_SYMBOL_GPL(noop_backing_dev_info); + + static struct class *bdi_class; ++const char *bdi_unknown_name = "(unknown)"; + + /* + * bdi_lock protects bdi_tree and updates to bdi_list. bdi_list has RCU +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index ef4e9eb572a4..b5b4e310fe70 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -5465,14 +5465,6 @@ static int mem_cgroup_move_account(struct page *page, + __mod_lruvec_state(to_vec, NR_WRITEBACK, nr_pages); + } + +-#ifdef CONFIG_TRANSPARENT_HUGEPAGE +- if (compound && !list_empty(page_deferred_list(page))) { +- spin_lock(&from->deferred_split_queue.split_queue_lock); +- list_del_init(page_deferred_list(page)); +- from->deferred_split_queue.split_queue_len--; +- spin_unlock(&from->deferred_split_queue.split_queue_lock); +- } +-#endif + /* + * It is safe to change page->mem_cgroup here because the page + * is referenced, charged, and isolated - we can't race with +@@ -5482,16 +5474,6 @@ static int mem_cgroup_move_account(struct page *page, + /* caller should have done css_get */ + page->mem_cgroup = to; + +-#ifdef CONFIG_TRANSPARENT_HUGEPAGE +- if (compound && list_empty(page_deferred_list(page))) { +- spin_lock(&to->deferred_split_queue.split_queue_lock); +- list_add_tail(page_deferred_list(page), +- &to->deferred_split_queue.split_queue); +- to->deferred_split_queue.split_queue_len++; +- spin_unlock(&to->deferred_split_queue.split_queue_lock); +- } +-#endif +- + spin_unlock_irqrestore(&from->move_lock, flags); + + ret = 0; +diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c +index fab540685279..0aa154be3a52 100644 +--- a/mm/memory_hotplug.c ++++ b/mm/memory_hotplug.c +@@ -1738,8 +1738,6 @@ static int __ref try_remove_memory(int nid, u64 start, u64 size) + + BUG_ON(check_hotplug_memory_range(start, size)); + +- mem_hotplug_begin(); +- + /* + * All memory blocks must be offlined before removing memory. Check + * whether all memory blocks in question are offline and return error +@@ -1754,9 +1752,14 @@ static int __ref try_remove_memory(int nid, u64 start, u64 size) + memblock_free(start, size); + memblock_remove(start, size); + +- /* remove memory block devices before removing memory */ ++ /* ++ * Memory block device removal under the device_hotplug_lock is ++ * a barrier against racing online attempts. ++ */ + remove_memory_block_devices(start, size); + ++ mem_hotplug_begin(); ++ + arch_remove_memory(nid, start, size, NULL); + __release_memory_resource(start, size); + +diff --git a/mm/migrate.c b/mm/migrate.c +index 6956627ebf8b..c4c313e47f12 100644 +--- a/mm/migrate.c ++++ b/mm/migrate.c +@@ -1631,8 +1631,19 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes, + start = i; + } else if (node != current_node) { + err = do_move_pages_to_node(mm, &pagelist, current_node); +- if (err) ++ if (err) { ++ /* ++ * Positive err means the number of failed ++ * pages to migrate. Since we are going to ++ * abort and return the number of non-migrated ++ * pages, so need to incude the rest of the ++ * nr_pages that have not been attempted as ++ * well. ++ */ ++ if (err > 0) ++ err += nr_pages - i - 1; + goto out; ++ } + err = store_status(status, start, current_node, i - start); + if (err) + goto out; +@@ -1663,8 +1674,11 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes, + goto out_flush; + + err = do_move_pages_to_node(mm, &pagelist, current_node); +- if (err) ++ if (err) { ++ if (err > 0) ++ err += nr_pages - i - 1; + goto out; ++ } + if (i > start) { + err = store_status(status, start, current_node, i - start); + if (err) +@@ -1678,6 +1692,13 @@ out_flush: + + /* Make sure we do not overwrite the existing error */ + err1 = do_move_pages_to_node(mm, &pagelist, current_node); ++ /* ++ * Don't have to report non-attempted pages here since: ++ * - If the above loop is done gracefully all pages have been ++ * attempted. ++ * - If the above loop is aborted it means a fatal error ++ * happened, should return ret. ++ */ + if (!err1) + err1 = store_status(status, start, current_node, i - start); + if (err >= 0) +diff --git a/mm/mmu_gather.c b/mm/mmu_gather.c +index 7d70e5c78f97..7c1b8f67af7b 100644 +--- a/mm/mmu_gather.c ++++ b/mm/mmu_gather.c +@@ -102,14 +102,14 @@ bool __tlb_remove_page_size(struct mmu_gather *tlb, struct page *page, int page_ + */ + static inline void tlb_table_invalidate(struct mmu_gather *tlb) + { +-#ifndef CONFIG_HAVE_RCU_TABLE_NO_INVALIDATE +- /* +- * Invalidate page-table caches used by hardware walkers. Then we still +- * need to RCU-sched wait while freeing the pages because software +- * walkers can still be in-flight. +- */ +- tlb_flush_mmu_tlbonly(tlb); +-#endif ++ if (tlb_needs_table_invalidate()) { ++ /* ++ * Invalidate page-table caches used by hardware walkers. Then ++ * we still need to RCU-sched wait while freeing the pages ++ * because software walkers can still be in-flight. ++ */ ++ tlb_flush_mmu_tlbonly(tlb); ++ } + } + + static void tlb_remove_table_smp_sync(void *arg) +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index 45e39131a716..d387ca74cb5a 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -6933,7 +6933,8 @@ static u64 zero_pfn_range(unsigned long spfn, unsigned long epfn) + * This function also addresses a similar issue where struct pages are left + * uninitialized because the physical address range is not covered by + * memblock.memory or memblock.reserved. That could happen when memblock +- * layout is manually configured via memmap=. ++ * layout is manually configured via memmap=, or when the highest physical ++ * address (max_pfn) does not end on a section boundary. + */ + void __init zero_resv_unavail(void) + { +@@ -6951,7 +6952,16 @@ void __init zero_resv_unavail(void) + pgcnt += zero_pfn_range(PFN_DOWN(next), PFN_UP(start)); + next = end; + } +- pgcnt += zero_pfn_range(PFN_DOWN(next), max_pfn); ++ ++ /* ++ * Early sections always have a fully populated memmap for the whole ++ * section - see pfn_valid(). If the last section has holes at the ++ * end and that section is marked "online", the memmap will be ++ * considered initialized. Make sure that memmap has a well defined ++ * state. ++ */ ++ pgcnt += zero_pfn_range(PFN_DOWN(next), ++ round_up(max_pfn, PAGES_PER_SECTION)); + + /* + * Struct pages that do not have backing memory. This could be because +diff --git a/mm/sparse.c b/mm/sparse.c +index 1100fdb9649c..69b41b6046a5 100644 +--- a/mm/sparse.c ++++ b/mm/sparse.c +@@ -787,7 +787,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, + ms->usage = NULL; + } + memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); +- ms->section_mem_map = sparse_encode_mem_map(NULL, section_nr); ++ ms->section_mem_map = (unsigned long)NULL; + } + + if (section_is_early && memmap) +diff --git a/net/core/devlink.c b/net/core/devlink.c +index ae614965c8c2..61bc67047f56 100644 +--- a/net/core/devlink.c ++++ b/net/core/devlink.c +@@ -3863,6 +3863,12 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb, + goto out_unlock; + } + ++ /* return 0 if there is no further data to read */ ++ if (start_offset >= region->size) { ++ err = 0; ++ goto out_unlock; ++ } ++ + hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, + &devlink_nl_family, NLM_F_ACK | NLM_F_MULTI, + DEVLINK_CMD_REGION_READ); +diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c +index 536e032d95c8..246a258b1fac 100644 +--- a/net/core/drop_monitor.c ++++ b/net/core/drop_monitor.c +@@ -1004,8 +1004,10 @@ static void net_dm_hw_monitor_stop(struct netlink_ext_ack *extack) + { + int cpu; + +- if (!monitor_hw) ++ if (!monitor_hw) { + NL_SET_ERR_MSG_MOD(extack, "Hardware monitoring already disabled"); ++ return; ++ } + + monitor_hw = false; + +diff --git a/net/hsr/hsr_slave.c b/net/hsr/hsr_slave.c +index ee561297d8a7..fbfd0db182b7 100644 +--- a/net/hsr/hsr_slave.c ++++ b/net/hsr/hsr_slave.c +@@ -27,6 +27,8 @@ static rx_handler_result_t hsr_handle_frame(struct sk_buff **pskb) + + rcu_read_lock(); /* hsr->node_db, hsr->ports */ + port = hsr_port_get_rcu(skb->dev); ++ if (!port) ++ goto finish_pass; + + if (hsr_addr_is_self(port->hsr, eth_hdr(skb)->h_source)) { + /* Directly kill frames sent by ourselves */ +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 3640e8563a10..deb466fc3d1f 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -2618,10 +2618,12 @@ int tcp_disconnect(struct sock *sk, int flags) + tp->snd_cwnd = TCP_INIT_CWND; + tp->snd_cwnd_cnt = 0; + tp->window_clamp = 0; ++ tp->delivered = 0; + tp->delivered_ce = 0; + tcp_set_ca_state(sk, TCP_CA_Open); + tp->is_sack_reneg = 0; + tcp_clear_retrans(tp); ++ tp->total_retrans = 0; + inet_csk_delack_init(sk); + /* Initialize rcv_mss to TCP_MIN_MSS to avoid division by 0 + * issue in __tcp_select_window() +@@ -2633,10 +2635,14 @@ int tcp_disconnect(struct sock *sk, int flags) + sk->sk_rx_dst = NULL; + tcp_saved_syn_free(tp); + tp->compressed_ack = 0; ++ tp->segs_in = 0; ++ tp->segs_out = 0; + tp->bytes_sent = 0; + tp->bytes_acked = 0; + tp->bytes_received = 0; + tp->bytes_retrans = 0; ++ tp->data_segs_in = 0; ++ tp->data_segs_out = 0; + tp->duplicate_sack[0].start_seq = 0; + tp->duplicate_sack[0].end_seq = 0; + tp->dsack_dups = 0; +diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c +index f9b5690e94fd..b11ccb53c7e0 100644 +--- a/net/ipv6/addrconf.c ++++ b/net/ipv6/addrconf.c +@@ -5719,6 +5719,9 @@ static int inet6_set_link_af(struct net_device *dev, const struct nlattr *nla) + struct nlattr *tb[IFLA_INET6_MAX + 1]; + int err; + ++ if (!idev) ++ return -EAFNOSUPPORT; ++ + if (nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla, NULL, NULL) < 0) + BUG(); + +diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c +index f82ea12bac37..425b95eb7e87 100644 +--- a/net/l2tp/l2tp_core.c ++++ b/net/l2tp/l2tp_core.c +@@ -322,8 +322,13 @@ int l2tp_session_register(struct l2tp_session *session, + + spin_lock_bh(&pn->l2tp_session_hlist_lock); + ++ /* IP encap expects session IDs to be globally unique, while ++ * UDP encap doesn't. ++ */ + hlist_for_each_entry(session_walk, g_head, global_hlist) +- if (session_walk->session_id == session->session_id) { ++ if (session_walk->session_id == session->session_id && ++ (session_walk->tunnel->encap == L2TP_ENCAPTYPE_IP || ++ tunnel->encap == L2TP_ENCAPTYPE_IP)) { + err = -EEXIST; + goto err_tlock_pnlock; + } +diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c +index d8143a8c034d..a9df9dac57b2 100644 +--- a/net/netfilter/ipset/ip_set_core.c ++++ b/net/netfilter/ipset/ip_set_core.c +@@ -1293,31 +1293,34 @@ ip_set_dump_policy[IPSET_ATTR_CMD_MAX + 1] = { + }; + + static int +-dump_init(struct netlink_callback *cb, struct ip_set_net *inst) ++ip_set_dump_start(struct netlink_callback *cb) + { + struct nlmsghdr *nlh = nlmsg_hdr(cb->skb); + int min_len = nlmsg_total_size(sizeof(struct nfgenmsg)); + struct nlattr *cda[IPSET_ATTR_CMD_MAX + 1]; + struct nlattr *attr = (void *)nlh + min_len; ++ struct sk_buff *skb = cb->skb; ++ struct ip_set_net *inst = ip_set_pernet(sock_net(skb->sk)); + u32 dump_type; +- ip_set_id_t index; + int ret; + + ret = nla_parse(cda, IPSET_ATTR_CMD_MAX, attr, + nlh->nlmsg_len - min_len, + ip_set_dump_policy, NULL); + if (ret) +- return ret; ++ goto error; + + cb->args[IPSET_CB_PROTO] = nla_get_u8(cda[IPSET_ATTR_PROTOCOL]); + if (cda[IPSET_ATTR_SETNAME]) { ++ ip_set_id_t index; + struct ip_set *set; + + set = find_set_and_id(inst, nla_data(cda[IPSET_ATTR_SETNAME]), + &index); +- if (!set) +- return -ENOENT; +- ++ if (!set) { ++ ret = -ENOENT; ++ goto error; ++ } + dump_type = DUMP_ONE; + cb->args[IPSET_CB_INDEX] = index; + } else { +@@ -1333,10 +1336,17 @@ dump_init(struct netlink_callback *cb, struct ip_set_net *inst) + cb->args[IPSET_CB_DUMP] = dump_type; + + return 0; ++ ++error: ++ /* We have to create and send the error message manually :-( */ ++ if (nlh->nlmsg_flags & NLM_F_ACK) { ++ netlink_ack(cb->skb, nlh, ret, NULL); ++ } ++ return ret; + } + + static int +-ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb) ++ip_set_dump_do(struct sk_buff *skb, struct netlink_callback *cb) + { + ip_set_id_t index = IPSET_INVALID_ID, max; + struct ip_set *set = NULL; +@@ -1347,18 +1357,8 @@ ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb) + bool is_destroyed; + int ret = 0; + +- if (!cb->args[IPSET_CB_DUMP]) { +- ret = dump_init(cb, inst); +- if (ret < 0) { +- nlh = nlmsg_hdr(cb->skb); +- /* We have to create and send the error message +- * manually :-( +- */ +- if (nlh->nlmsg_flags & NLM_F_ACK) +- netlink_ack(cb->skb, nlh, ret, NULL); +- return ret; +- } +- } ++ if (!cb->args[IPSET_CB_DUMP]) ++ return -EINVAL; + + if (cb->args[IPSET_CB_INDEX] >= inst->ip_set_max) + goto out; +@@ -1494,7 +1494,8 @@ static int ip_set_dump(struct net *net, struct sock *ctnl, struct sk_buff *skb, + + { + struct netlink_dump_control c = { +- .dump = ip_set_dump_start, ++ .start = ip_set_dump_start, ++ .dump = ip_set_dump_do, + .done = ip_set_dump_done, + }; + return netlink_dump_start(ctnl, skb, nlh, &c); +diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c +index d72ddb67bb74..4a6ca9723a12 100644 +--- a/net/rxrpc/af_rxrpc.c ++++ b/net/rxrpc/af_rxrpc.c +@@ -194,6 +194,7 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len) + service_in_use: + write_unlock(&local->services_lock); + rxrpc_unuse_local(local); ++ rxrpc_put_local(local); + ret = -EADDRINUSE; + error_unlock: + release_sock(&rx->sk); +@@ -899,6 +900,7 @@ static int rxrpc_release_sock(struct sock *sk) + rxrpc_purge_queue(&sk->sk_receive_queue); + + rxrpc_unuse_local(rx->local); ++ rxrpc_put_local(rx->local); + rx->local = NULL; + key_put(rx->key); + rx->key = NULL; +diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h +index 5e99df80e80a..7d730c438404 100644 +--- a/net/rxrpc/ar-internal.h ++++ b/net/rxrpc/ar-internal.h +@@ -490,6 +490,7 @@ enum rxrpc_call_flag { + RXRPC_CALL_RX_HEARD, /* The peer responded at least once to this call */ + RXRPC_CALL_RX_UNDERRUN, /* Got data underrun */ + RXRPC_CALL_IS_INTR, /* The call is interruptible */ ++ RXRPC_CALL_DISCONNECTED, /* The call has been disconnected */ + }; + + /* +@@ -1021,6 +1022,16 @@ void rxrpc_unuse_local(struct rxrpc_local *); + void rxrpc_queue_local(struct rxrpc_local *); + void rxrpc_destroy_all_locals(struct rxrpc_net *); + ++static inline bool __rxrpc_unuse_local(struct rxrpc_local *local) ++{ ++ return atomic_dec_return(&local->active_users) == 0; ++} ++ ++static inline bool __rxrpc_use_local(struct rxrpc_local *local) ++{ ++ return atomic_fetch_add_unless(&local->active_users, 1, 0) != 0; ++} ++ + /* + * misc.c + */ +diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c +index a31c18c09894..dbdbc4f18b5e 100644 +--- a/net/rxrpc/call_object.c ++++ b/net/rxrpc/call_object.c +@@ -493,7 +493,7 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call) + + _debug("RELEASE CALL %p (%d CONN %p)", call, call->debug_id, conn); + +- if (conn) ++ if (conn && !test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) + rxrpc_disconnect_call(call); + if (call->security) + call->security->free_call_crypto(call); +@@ -569,6 +569,7 @@ static void rxrpc_rcu_destroy_call(struct rcu_head *rcu) + struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu); + struct rxrpc_net *rxnet = call->rxnet; + ++ rxrpc_put_connection(call->conn); + rxrpc_put_peer(call->peer); + kfree(call->rxtx_buffer); + kfree(call->rxtx_annotations); +@@ -590,7 +591,6 @@ void rxrpc_cleanup_call(struct rxrpc_call *call) + + ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE); + ASSERT(test_bit(RXRPC_CALL_RELEASED, &call->flags)); +- ASSERTCMP(call->conn, ==, NULL); + + rxrpc_cleanup_ring(call); + rxrpc_free_skb(call->tx_pending, rxrpc_skb_cleaned); +diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c +index 376370cd9285..ea7d4c21f889 100644 +--- a/net/rxrpc/conn_client.c ++++ b/net/rxrpc/conn_client.c +@@ -785,6 +785,7 @@ void rxrpc_disconnect_client_call(struct rxrpc_call *call) + u32 cid; + + spin_lock(&conn->channel_lock); ++ set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); + + cid = call->cid; + if (cid) { +@@ -792,7 +793,6 @@ void rxrpc_disconnect_client_call(struct rxrpc_call *call) + chan = &conn->channels[channel]; + } + trace_rxrpc_client(conn, channel, rxrpc_client_chan_disconnect); +- call->conn = NULL; + + /* Calls that have never actually been assigned a channel can simply be + * discarded. If the conn didn't get used either, it will follow +@@ -908,7 +908,6 @@ out: + spin_unlock(&rxnet->client_conn_cache_lock); + out_2: + spin_unlock(&conn->channel_lock); +- rxrpc_put_connection(conn); + _leave(""); + return; + +diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c +index 808a4723f868..06fcff2ebbba 100644 +--- a/net/rxrpc/conn_event.c ++++ b/net/rxrpc/conn_event.c +@@ -438,16 +438,12 @@ again: + /* + * connection-level event processor + */ +-void rxrpc_process_connection(struct work_struct *work) ++static void rxrpc_do_process_connection(struct rxrpc_connection *conn) + { +- struct rxrpc_connection *conn = +- container_of(work, struct rxrpc_connection, processor); + struct sk_buff *skb; + u32 abort_code = RX_PROTOCOL_ERROR; + int ret; + +- rxrpc_see_connection(conn); +- + if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events)) + rxrpc_secure_connection(conn); + +@@ -475,18 +471,32 @@ void rxrpc_process_connection(struct work_struct *work) + } + } + +-out: +- rxrpc_put_connection(conn); +- _leave(""); + return; + + requeue_and_leave: + skb_queue_head(&conn->rx_queue, skb); +- goto out; ++ return; + + protocol_error: + if (rxrpc_abort_connection(conn, ret, abort_code) < 0) + goto requeue_and_leave; + rxrpc_free_skb(skb, rxrpc_skb_freed); +- goto out; ++ return; ++} ++ ++void rxrpc_process_connection(struct work_struct *work) ++{ ++ struct rxrpc_connection *conn = ++ container_of(work, struct rxrpc_connection, processor); ++ ++ rxrpc_see_connection(conn); ++ ++ if (__rxrpc_use_local(conn->params.local)) { ++ rxrpc_do_process_connection(conn); ++ rxrpc_unuse_local(conn->params.local); ++ } ++ ++ rxrpc_put_connection(conn); ++ _leave(""); ++ return; + } +diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c +index 38d718e90dc6..19e141eeed17 100644 +--- a/net/rxrpc/conn_object.c ++++ b/net/rxrpc/conn_object.c +@@ -223,9 +223,8 @@ void rxrpc_disconnect_call(struct rxrpc_call *call) + __rxrpc_disconnect_call(conn, call); + spin_unlock(&conn->channel_lock); + +- call->conn = NULL; ++ set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); + conn->idle_timestamp = jiffies; +- rxrpc_put_connection(conn); + } + + /* +diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c +index 96d54e5bf7bc..ef10fbf71b15 100644 +--- a/net/rxrpc/input.c ++++ b/net/rxrpc/input.c +@@ -599,10 +599,8 @@ ack: + false, true, + rxrpc_propose_ack_input_data); + +- if (seq0 == READ_ONCE(call->rx_hard_ack) + 1) { +- trace_rxrpc_notify_socket(call->debug_id, serial); +- rxrpc_notify_socket(call); +- } ++ trace_rxrpc_notify_socket(call->debug_id, serial); ++ rxrpc_notify_socket(call); + + unlock: + spin_unlock(&call->input_lock); +diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c +index 36587260cabd..a6c1349e965d 100644 +--- a/net/rxrpc/local_object.c ++++ b/net/rxrpc/local_object.c +@@ -364,11 +364,14 @@ void rxrpc_queue_local(struct rxrpc_local *local) + void rxrpc_put_local(struct rxrpc_local *local) + { + const void *here = __builtin_return_address(0); ++ unsigned int debug_id; + int n; + + if (local) { ++ debug_id = local->debug_id; ++ + n = atomic_dec_return(&local->usage); +- trace_rxrpc_local(local->debug_id, rxrpc_local_put, n, here); ++ trace_rxrpc_local(debug_id, rxrpc_local_put, n, here); + + if (n == 0) + call_rcu(&local->rcu, rxrpc_local_rcu); +@@ -380,14 +383,11 @@ void rxrpc_put_local(struct rxrpc_local *local) + */ + struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local) + { +- unsigned int au; +- + local = rxrpc_get_local_maybe(local); + if (!local) + return NULL; + +- au = atomic_fetch_add_unless(&local->active_users, 1, 0); +- if (au == 0) { ++ if (!__rxrpc_use_local(local)) { + rxrpc_put_local(local); + return NULL; + } +@@ -401,14 +401,11 @@ struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local) + */ + void rxrpc_unuse_local(struct rxrpc_local *local) + { +- unsigned int au; +- + if (local) { +- au = atomic_dec_return(&local->active_users); +- if (au == 0) ++ if (__rxrpc_unuse_local(local)) { ++ rxrpc_get_local(local); + rxrpc_queue_local(local); +- else +- rxrpc_put_local(local); ++ } + } + } + +@@ -465,7 +462,7 @@ static void rxrpc_local_processor(struct work_struct *work) + + do { + again = false; +- if (atomic_read(&local->active_users) == 0) { ++ if (!__rxrpc_use_local(local)) { + rxrpc_local_destroyer(local); + break; + } +@@ -479,6 +476,8 @@ static void rxrpc_local_processor(struct work_struct *work) + rxrpc_process_local_events(local); + again = true; + } ++ ++ __rxrpc_unuse_local(local); + } while (again); + + rxrpc_put_local(local); +diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c +index 935bb60fff56..bad3d2420344 100644 +--- a/net/rxrpc/output.c ++++ b/net/rxrpc/output.c +@@ -129,7 +129,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, + int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, + rxrpc_serial_t *_serial) + { +- struct rxrpc_connection *conn = NULL; ++ struct rxrpc_connection *conn; + struct rxrpc_ack_buffer *pkt; + struct msghdr msg; + struct kvec iov[2]; +@@ -139,18 +139,14 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, + int ret; + u8 reason; + +- spin_lock_bh(&call->lock); +- if (call->conn) +- conn = rxrpc_get_connection_maybe(call->conn); +- spin_unlock_bh(&call->lock); +- if (!conn) ++ if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) + return -ECONNRESET; + + pkt = kzalloc(sizeof(*pkt), GFP_KERNEL); +- if (!pkt) { +- rxrpc_put_connection(conn); ++ if (!pkt) + return -ENOMEM; +- } ++ ++ conn = call->conn; + + msg.msg_name = &call->peer->srx.transport; + msg.msg_namelen = call->peer->srx.transport_len; +@@ -244,7 +240,6 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, + } + + out: +- rxrpc_put_connection(conn); + kfree(pkt); + return ret; + } +@@ -254,7 +249,7 @@ out: + */ + int rxrpc_send_abort_packet(struct rxrpc_call *call) + { +- struct rxrpc_connection *conn = NULL; ++ struct rxrpc_connection *conn; + struct rxrpc_abort_buffer pkt; + struct msghdr msg; + struct kvec iov[1]; +@@ -271,13 +266,11 @@ int rxrpc_send_abort_packet(struct rxrpc_call *call) + test_bit(RXRPC_CALL_TX_LAST, &call->flags)) + return 0; + +- spin_lock_bh(&call->lock); +- if (call->conn) +- conn = rxrpc_get_connection_maybe(call->conn); +- spin_unlock_bh(&call->lock); +- if (!conn) ++ if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) + return -ECONNRESET; + ++ conn = call->conn; ++ + msg.msg_name = &call->peer->srx.transport; + msg.msg_namelen = call->peer->srx.transport_len; + msg.msg_control = NULL; +@@ -312,8 +305,6 @@ int rxrpc_send_abort_packet(struct rxrpc_call *call) + trace_rxrpc_tx_packet(call->debug_id, &pkt.whdr, + rxrpc_tx_point_call_abort); + rxrpc_tx_backoff(call, ret); +- +- rxrpc_put_connection(conn); + return ret; + } + +diff --git a/net/rxrpc/peer_event.c b/net/rxrpc/peer_event.c +index 48f67a9b1037..923b263c401b 100644 +--- a/net/rxrpc/peer_event.c ++++ b/net/rxrpc/peer_event.c +@@ -364,27 +364,31 @@ static void rxrpc_peer_keepalive_dispatch(struct rxrpc_net *rxnet, + if (!rxrpc_get_peer_maybe(peer)) + continue; + +- spin_unlock_bh(&rxnet->peer_hash_lock); +- +- keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; +- slot = keepalive_at - base; +- _debug("%02x peer %u t=%d {%pISp}", +- cursor, peer->debug_id, slot, &peer->srx.transport); ++ if (__rxrpc_use_local(peer->local)) { ++ spin_unlock_bh(&rxnet->peer_hash_lock); ++ ++ keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; ++ slot = keepalive_at - base; ++ _debug("%02x peer %u t=%d {%pISp}", ++ cursor, peer->debug_id, slot, &peer->srx.transport); ++ ++ if (keepalive_at <= base || ++ keepalive_at > base + RXRPC_KEEPALIVE_TIME) { ++ rxrpc_send_keepalive(peer); ++ slot = RXRPC_KEEPALIVE_TIME; ++ } + +- if (keepalive_at <= base || +- keepalive_at > base + RXRPC_KEEPALIVE_TIME) { +- rxrpc_send_keepalive(peer); +- slot = RXRPC_KEEPALIVE_TIME; ++ /* A transmission to this peer occurred since last we ++ * examined it so put it into the appropriate future ++ * bucket. ++ */ ++ slot += cursor; ++ slot &= mask; ++ spin_lock_bh(&rxnet->peer_hash_lock); ++ list_add_tail(&peer->keepalive_link, ++ &rxnet->peer_keepalive[slot & mask]); ++ rxrpc_unuse_local(peer->local); + } +- +- /* A transmission to this peer occurred since last we examined +- * it so put it into the appropriate future bucket. +- */ +- slot += cursor; +- slot &= mask; +- spin_lock_bh(&rxnet->peer_hash_lock); +- list_add_tail(&peer->keepalive_link, +- &rxnet->peer_keepalive[slot & mask]); + rxrpc_put_peer_locked(peer); + } + +diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h +index c22624131949..d36949d9382c 100644 +--- a/net/sched/cls_rsvp.h ++++ b/net/sched/cls_rsvp.h +@@ -463,10 +463,8 @@ static u32 gen_tunnel(struct rsvp_head *data) + + static const struct nla_policy rsvp_policy[TCA_RSVP_MAX + 1] = { + [TCA_RSVP_CLASSID] = { .type = NLA_U32 }, +- [TCA_RSVP_DST] = { .type = NLA_BINARY, +- .len = RSVP_DST_LEN * sizeof(u32) }, +- [TCA_RSVP_SRC] = { .type = NLA_BINARY, +- .len = RSVP_DST_LEN * sizeof(u32) }, ++ [TCA_RSVP_DST] = { .len = RSVP_DST_LEN * sizeof(u32) }, ++ [TCA_RSVP_SRC] = { .len = RSVP_DST_LEN * sizeof(u32) }, + [TCA_RSVP_PINFO] = { .len = sizeof(struct tc_rsvp_pinfo) }, + }; + +diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c +index 3d4a1280352f..09b7dc5fe7e0 100644 +--- a/net/sched/cls_tcindex.c ++++ b/net/sched/cls_tcindex.c +@@ -333,12 +333,31 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, + cp->fall_through = p->fall_through; + cp->tp = tp; + ++ if (tb[TCA_TCINDEX_HASH]) ++ cp->hash = nla_get_u32(tb[TCA_TCINDEX_HASH]); ++ ++ if (tb[TCA_TCINDEX_MASK]) ++ cp->mask = nla_get_u16(tb[TCA_TCINDEX_MASK]); ++ ++ if (tb[TCA_TCINDEX_SHIFT]) ++ cp->shift = nla_get_u32(tb[TCA_TCINDEX_SHIFT]); ++ ++ if (!cp->hash) { ++ /* Hash not specified, use perfect hash if the upper limit ++ * of the hashing index is below the threshold. ++ */ ++ if ((cp->mask >> cp->shift) < PERFECT_HASH_THRESHOLD) ++ cp->hash = (cp->mask >> cp->shift) + 1; ++ else ++ cp->hash = DEFAULT_HASH_SIZE; ++ } ++ + if (p->perfect) { + int i; + + if (tcindex_alloc_perfect_hash(net, cp) < 0) + goto errout; +- for (i = 0; i < cp->hash; i++) ++ for (i = 0; i < min(cp->hash, p->hash); i++) + cp->perfect[i].res = p->perfect[i].res; + balloc = 1; + } +@@ -346,19 +365,10 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, + + err = tcindex_filter_result_init(&new_filter_result, net); + if (err < 0) +- goto errout1; ++ goto errout_alloc; + if (old_r) + cr = r->res; + +- if (tb[TCA_TCINDEX_HASH]) +- cp->hash = nla_get_u32(tb[TCA_TCINDEX_HASH]); +- +- if (tb[TCA_TCINDEX_MASK]) +- cp->mask = nla_get_u16(tb[TCA_TCINDEX_MASK]); +- +- if (tb[TCA_TCINDEX_SHIFT]) +- cp->shift = nla_get_u32(tb[TCA_TCINDEX_SHIFT]); +- + err = -EBUSY; + + /* Hash already allocated, make sure that we still meet the +@@ -376,16 +386,6 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, + if (tb[TCA_TCINDEX_FALL_THROUGH]) + cp->fall_through = nla_get_u32(tb[TCA_TCINDEX_FALL_THROUGH]); + +- if (!cp->hash) { +- /* Hash not specified, use perfect hash if the upper limit +- * of the hashing index is below the threshold. +- */ +- if ((cp->mask >> cp->shift) < PERFECT_HASH_THRESHOLD) +- cp->hash = (cp->mask >> cp->shift) + 1; +- else +- cp->hash = DEFAULT_HASH_SIZE; +- } +- + if (!cp->perfect && !cp->h) + cp->alloc_hash = cp->hash; + +@@ -484,7 +484,6 @@ errout_alloc: + tcindex_free_perfect_hash(cp); + else if (balloc == 2) + kfree(cp->h); +-errout1: + tcf_exts_destroy(&new_filter_result.exts); + errout: + kfree(cp); +diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c +index c609373c8661..660fc45ee40f 100644 +--- a/net/sched/sch_taprio.c ++++ b/net/sched/sch_taprio.c +@@ -31,6 +31,7 @@ static DEFINE_SPINLOCK(taprio_list_lock); + + #define TXTIME_ASSIST_IS_ENABLED(flags) ((flags) & TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST) + #define FULL_OFFLOAD_IS_ENABLED(flags) ((flags) & TCA_TAPRIO_ATTR_FLAG_FULL_OFFLOAD) ++#define TAPRIO_FLAGS_INVALID U32_MAX + + struct sched_entry { + struct list_head list; +@@ -766,6 +767,7 @@ static const struct nla_policy taprio_policy[TCA_TAPRIO_ATTR_MAX + 1] = { + [TCA_TAPRIO_ATTR_SCHED_CLOCKID] = { .type = NLA_S32 }, + [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME] = { .type = NLA_S64 }, + [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION] = { .type = NLA_S64 }, ++ [TCA_TAPRIO_ATTR_FLAGS] = { .type = NLA_U32 }, + }; + + static int fill_sched_entry(struct nlattr **tb, struct sched_entry *entry, +@@ -1367,6 +1369,33 @@ static int taprio_mqprio_cmp(const struct net_device *dev, + return 0; + } + ++/* The semantics of the 'flags' argument in relation to 'change()' ++ * requests, are interpreted following two rules (which are applied in ++ * this order): (1) an omitted 'flags' argument is interpreted as ++ * zero; (2) the 'flags' of a "running" taprio instance cannot be ++ * changed. ++ */ ++static int taprio_new_flags(const struct nlattr *attr, u32 old, ++ struct netlink_ext_ack *extack) ++{ ++ u32 new = 0; ++ ++ if (attr) ++ new = nla_get_u32(attr); ++ ++ if (old != TAPRIO_FLAGS_INVALID && old != new) { ++ NL_SET_ERR_MSG_MOD(extack, "Changing 'flags' of a running schedule is not supported"); ++ return -EOPNOTSUPP; ++ } ++ ++ if (!taprio_flags_valid(new)) { ++ NL_SET_ERR_MSG_MOD(extack, "Specified 'flags' are not valid"); ++ return -EINVAL; ++ } ++ ++ return new; ++} ++ + static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + struct netlink_ext_ack *extack) + { +@@ -1375,7 +1404,6 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + struct taprio_sched *q = qdisc_priv(sch); + struct net_device *dev = qdisc_dev(sch); + struct tc_mqprio_qopt *mqprio = NULL; +- u32 taprio_flags = 0; + unsigned long flags; + ktime_t start; + int i, err; +@@ -1388,21 +1416,14 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + if (tb[TCA_TAPRIO_ATTR_PRIOMAP]) + mqprio = nla_data(tb[TCA_TAPRIO_ATTR_PRIOMAP]); + +- if (tb[TCA_TAPRIO_ATTR_FLAGS]) { +- taprio_flags = nla_get_u32(tb[TCA_TAPRIO_ATTR_FLAGS]); +- +- if (q->flags != 0 && q->flags != taprio_flags) { +- NL_SET_ERR_MSG_MOD(extack, "Changing 'flags' of a running schedule is not supported"); +- return -EOPNOTSUPP; +- } else if (!taprio_flags_valid(taprio_flags)) { +- NL_SET_ERR_MSG_MOD(extack, "Specified 'flags' are not valid"); +- return -EINVAL; +- } ++ err = taprio_new_flags(tb[TCA_TAPRIO_ATTR_FLAGS], ++ q->flags, extack); ++ if (err < 0) ++ return err; + +- q->flags = taprio_flags; +- } ++ q->flags = err; + +- err = taprio_parse_mqprio_opt(dev, mqprio, extack, taprio_flags); ++ err = taprio_parse_mqprio_opt(dev, mqprio, extack, q->flags); + if (err < 0) + return err; + +@@ -1444,7 +1465,20 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + + taprio_set_picos_per_byte(dev, q); + +- if (FULL_OFFLOAD_IS_ENABLED(taprio_flags)) ++ if (mqprio) { ++ netdev_set_num_tc(dev, mqprio->num_tc); ++ for (i = 0; i < mqprio->num_tc; i++) ++ netdev_set_tc_queue(dev, i, ++ mqprio->count[i], ++ mqprio->offset[i]); ++ ++ /* Always use supplied priority mappings */ ++ for (i = 0; i <= TC_BITMASK; i++) ++ netdev_set_prio_tc_map(dev, i, ++ mqprio->prio_tc_map[i]); ++ } ++ ++ if (FULL_OFFLOAD_IS_ENABLED(q->flags)) + err = taprio_enable_offload(dev, mqprio, q, new_admin, extack); + else + err = taprio_disable_offload(dev, q, extack); +@@ -1464,27 +1498,14 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + q->txtime_delay = nla_get_u32(tb[TCA_TAPRIO_ATTR_TXTIME_DELAY]); + } + +- if (!TXTIME_ASSIST_IS_ENABLED(taprio_flags) && +- !FULL_OFFLOAD_IS_ENABLED(taprio_flags) && ++ if (!TXTIME_ASSIST_IS_ENABLED(q->flags) && ++ !FULL_OFFLOAD_IS_ENABLED(q->flags) && + !hrtimer_active(&q->advance_timer)) { + hrtimer_init(&q->advance_timer, q->clockid, HRTIMER_MODE_ABS); + q->advance_timer.function = advance_sched; + } + +- if (mqprio) { +- netdev_set_num_tc(dev, mqprio->num_tc); +- for (i = 0; i < mqprio->num_tc; i++) +- netdev_set_tc_queue(dev, i, +- mqprio->count[i], +- mqprio->offset[i]); +- +- /* Always use supplied priority mappings */ +- for (i = 0; i <= TC_BITMASK; i++) +- netdev_set_prio_tc_map(dev, i, +- mqprio->prio_tc_map[i]); +- } +- +- if (FULL_OFFLOAD_IS_ENABLED(taprio_flags)) { ++ if (FULL_OFFLOAD_IS_ENABLED(q->flags)) { + q->dequeue = taprio_dequeue_offload; + q->peek = taprio_peek_offload; + } else { +@@ -1501,9 +1522,9 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + goto unlock; + } + +- if (TXTIME_ASSIST_IS_ENABLED(taprio_flags)) { +- setup_txtime(q, new_admin, start); ++ setup_txtime(q, new_admin, start); + ++ if (TXTIME_ASSIST_IS_ENABLED(q->flags)) { + if (!oper) { + rcu_assign_pointer(q->oper_sched, new_admin); + err = 0; +@@ -1528,7 +1549,7 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, + + spin_unlock_irqrestore(&q->current_entry_lock, flags); + +- if (FULL_OFFLOAD_IS_ENABLED(taprio_flags)) ++ if (FULL_OFFLOAD_IS_ENABLED(q->flags)) + taprio_offload_config_changed(q); + } + +@@ -1567,7 +1588,7 @@ static void taprio_destroy(struct Qdisc *sch) + } + q->qdiscs = NULL; + +- netdev_set_num_tc(dev, 0); ++ netdev_reset_tc(dev); + + if (q->oper_sched) + call_rcu(&q->oper_sched->rcu, taprio_free_sched_cb); +@@ -1597,6 +1618,7 @@ static int taprio_init(struct Qdisc *sch, struct nlattr *opt, + * and get the valid one on taprio_change(). + */ + q->clockid = -1; ++ q->flags = TAPRIO_FLAGS_INVALID; + + spin_lock(&taprio_list_lock); + list_add(&q->taprio_list, &taprio_list); +diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c +index 908b60a72d95..ed20fa8a6f70 100644 +--- a/net/sunrpc/auth_gss/svcauth_gss.c ++++ b/net/sunrpc/auth_gss/svcauth_gss.c +@@ -1245,6 +1245,7 @@ static int gss_proxy_save_rsc(struct cache_detail *cd, + dprintk("RPC: No creds found!\n"); + goto out; + } else { ++ struct timespec64 boot; + + /* steal creds */ + rsci.cred = ud->creds; +@@ -1265,6 +1266,9 @@ static int gss_proxy_save_rsc(struct cache_detail *cd, + &expiry, GFP_KERNEL); + if (status) + goto out; ++ ++ getboottime64(&boot); ++ expiry -= boot.tv_sec; + } + + rsci.h.expiry_time = expiry; +diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile +index 42b571cde177..e7ad48c605e0 100644 +--- a/samples/bpf/Makefile ++++ b/samples/bpf/Makefile +@@ -236,7 +236,7 @@ all: + + clean: + $(MAKE) -C ../../ M=$(CURDIR) clean +- @rm -f *~ ++ @find $(CURDIR) -type f -name '*~' -delete + + $(LIBBPF): FORCE + # Fix up variables inherited from Kbuild that tools/ build system won't like +diff --git a/samples/bpf/xdp_redirect_cpu_user.c b/samples/bpf/xdp_redirect_cpu_user.c +index 0da6e9e7132e..8b862a7a6c6a 100644 +--- a/samples/bpf/xdp_redirect_cpu_user.c ++++ b/samples/bpf/xdp_redirect_cpu_user.c +@@ -16,6 +16,10 @@ static const char *__doc__ = + #include + #include + #include ++#include ++ ++#define __must_check ++#include + + #include + #include +@@ -46,6 +50,10 @@ static int cpus_count_map_fd; + static int cpus_iterator_map_fd; + static int exception_cnt_map_fd; + ++#define NUM_TP 5 ++struct bpf_link *tp_links[NUM_TP] = { 0 }; ++static int tp_cnt = 0; ++ + /* Exit return codes */ + #define EXIT_OK 0 + #define EXIT_FAIL 1 +@@ -88,6 +96,10 @@ static void int_exit(int sig) + printf("program on interface changed, not removing\n"); + } + } ++ /* Detach tracepoints */ ++ while (tp_cnt) ++ bpf_link__destroy(tp_links[--tp_cnt]); ++ + exit(EXIT_OK); + } + +@@ -588,23 +600,61 @@ static void stats_poll(int interval, bool use_separators, char *prog_name, + free_stats_record(prev); + } + ++static struct bpf_link * attach_tp(struct bpf_object *obj, ++ const char *tp_category, ++ const char* tp_name) ++{ ++ struct bpf_program *prog; ++ struct bpf_link *link; ++ char sec_name[PATH_MAX]; ++ int len; ++ ++ len = snprintf(sec_name, PATH_MAX, "tracepoint/%s/%s", ++ tp_category, tp_name); ++ if (len < 0) ++ exit(EXIT_FAIL); ++ ++ prog = bpf_object__find_program_by_title(obj, sec_name); ++ if (!prog) { ++ fprintf(stderr, "ERR: finding progsec: %s\n", sec_name); ++ exit(EXIT_FAIL_BPF); ++ } ++ ++ link = bpf_program__attach_tracepoint(prog, tp_category, tp_name); ++ if (IS_ERR(link)) ++ exit(EXIT_FAIL_BPF); ++ ++ return link; ++} ++ ++static void init_tracepoints(struct bpf_object *obj) { ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_redirect_err"); ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_redirect_map_err"); ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_exception"); ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_cpumap_enqueue"); ++ tp_links[tp_cnt++] = attach_tp(obj, "xdp", "xdp_cpumap_kthread"); ++} ++ + static int init_map_fds(struct bpf_object *obj) + { +- cpu_map_fd = bpf_object__find_map_fd_by_name(obj, "cpu_map"); +- rx_cnt_map_fd = bpf_object__find_map_fd_by_name(obj, "rx_cnt"); ++ /* Maps updated by tracepoints */ + redirect_err_cnt_map_fd = + bpf_object__find_map_fd_by_name(obj, "redirect_err_cnt"); ++ exception_cnt_map_fd = ++ bpf_object__find_map_fd_by_name(obj, "exception_cnt"); + cpumap_enqueue_cnt_map_fd = + bpf_object__find_map_fd_by_name(obj, "cpumap_enqueue_cnt"); + cpumap_kthread_cnt_map_fd = + bpf_object__find_map_fd_by_name(obj, "cpumap_kthread_cnt"); ++ ++ /* Maps used by XDP */ ++ rx_cnt_map_fd = bpf_object__find_map_fd_by_name(obj, "rx_cnt"); ++ cpu_map_fd = bpf_object__find_map_fd_by_name(obj, "cpu_map"); + cpus_available_map_fd = + bpf_object__find_map_fd_by_name(obj, "cpus_available"); + cpus_count_map_fd = bpf_object__find_map_fd_by_name(obj, "cpus_count"); + cpus_iterator_map_fd = + bpf_object__find_map_fd_by_name(obj, "cpus_iterator"); +- exception_cnt_map_fd = +- bpf_object__find_map_fd_by_name(obj, "exception_cnt"); + + if (cpu_map_fd < 0 || rx_cnt_map_fd < 0 || + redirect_err_cnt_map_fd < 0 || cpumap_enqueue_cnt_map_fd < 0 || +@@ -662,6 +712,7 @@ int main(int argc, char **argv) + strerror(errno)); + return EXIT_FAIL; + } ++ init_tracepoints(obj); + if (init_map_fds(obj) < 0) { + fprintf(stderr, "bpf_object__find_map_fd_by_name failed\n"); + return EXIT_FAIL; +diff --git a/scripts/find-unused-docs.sh b/scripts/find-unused-docs.sh +index 3f46f8977dc4..ee6a50e33aba 100755 +--- a/scripts/find-unused-docs.sh ++++ b/scripts/find-unused-docs.sh +@@ -54,7 +54,7 @@ for file in `find $1 -name '*.c'`; do + if [[ ${FILES_INCLUDED[$file]+_} ]]; then + continue; + fi +- str=$(scripts/kernel-doc -text -export "$file" 2>/dev/null) ++ str=$(scripts/kernel-doc -export "$file" 2>/dev/null) + if [[ -n "$str" ]]; then + echo "$file" + fi +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index abeb09c30633..ad22066eba04 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -2832,42 +2832,39 @@ static int smack_socket_connect(struct socket *sock, struct sockaddr *sap, + int addrlen) + { + int rc = 0; +-#if IS_ENABLED(CONFIG_IPV6) +- struct sockaddr_in6 *sip = (struct sockaddr_in6 *)sap; +-#endif +-#ifdef SMACK_IPV6_SECMARK_LABELING +- struct smack_known *rsp; +- struct socket_smack *ssp; +-#endif + + if (sock->sk == NULL) + return 0; +- ++ if (sock->sk->sk_family != PF_INET && ++ (!IS_ENABLED(CONFIG_IPV6) || sock->sk->sk_family != PF_INET6)) ++ return 0; ++ if (addrlen < offsetofend(struct sockaddr, sa_family)) ++ return 0; ++ if (IS_ENABLED(CONFIG_IPV6) && sap->sa_family == AF_INET6) { ++ struct sockaddr_in6 *sip = (struct sockaddr_in6 *)sap; + #ifdef SMACK_IPV6_SECMARK_LABELING +- ssp = sock->sk->sk_security; ++ struct smack_known *rsp; + #endif + +- switch (sock->sk->sk_family) { +- case PF_INET: +- if (addrlen < sizeof(struct sockaddr_in) || +- sap->sa_family != AF_INET) +- return -EINVAL; +- rc = smack_netlabel_send(sock->sk, (struct sockaddr_in *)sap); +- break; +- case PF_INET6: +- if (addrlen < SIN6_LEN_RFC2133 || sap->sa_family != AF_INET6) +- return -EINVAL; ++ if (addrlen < SIN6_LEN_RFC2133) ++ return 0; + #ifdef SMACK_IPV6_SECMARK_LABELING + rsp = smack_ipv6host_label(sip); +- if (rsp != NULL) ++ if (rsp != NULL) { ++ struct socket_smack *ssp = sock->sk->sk_security; ++ + rc = smk_ipv6_check(ssp->smk_out, rsp, sip, +- SMK_CONNECTING); ++ SMK_CONNECTING); ++ } + #endif + #ifdef SMACK_IPV6_PORT_LABELING + rc = smk_ipv6_port_check(sock->sk, sip, SMK_CONNECTING); + #endif +- break; ++ return rc; + } ++ if (sap->sa_family != AF_INET || addrlen < sizeof(struct sockaddr_in)) ++ return 0; ++ rc = smack_netlabel_send(sock->sk, (struct sockaddr_in *)sap); + return rc; + } + +diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c +index aee7c04d49e5..b61ba0321a72 100644 +--- a/sound/drivers/dummy.c ++++ b/sound/drivers/dummy.c +@@ -915,7 +915,7 @@ static void print_formats(struct snd_dummy *dummy, + { + int i; + +- for (i = 0; i < SNDRV_PCM_FORMAT_LAST; i++) { ++ for (i = 0; i <= SNDRV_PCM_FORMAT_LAST; i++) { + if (dummy->pcm_hw.formats & (1ULL << i)) + snd_iprintf(buffer, " %s", snd_pcm_format_name(i)); + } +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c +index f6cbb831b86a..85beb172d810 100644 +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2156,6 +2156,8 @@ static struct snd_pci_quirk power_save_blacklist[] = { + /* https://bugzilla.redhat.com/show_bug.cgi?id=1581607 */ + SND_PCI_QUIRK(0x1558, 0x3501, "Clevo W35xSS_370SS", 0), + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ ++ SND_PCI_QUIRK(0x1558, 0x6504, "Clevo W65_67SB", 0), ++ /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ + SND_PCI_QUIRK(0x1028, 0x0497, "Dell Precision T3600", 0), + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ + /* Note the P55A-UD3 and Z87-D3HP share the subsys id for the HDA dev */ +@@ -2415,6 +2417,8 @@ static const struct pci_device_id azx_ids[] = { + /* Jasperlake */ + { PCI_DEVICE(0x8086, 0x38c8), + .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, ++ { PCI_DEVICE(0x8086, 0x4dc8), ++ .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, + /* Tigerlake */ + { PCI_DEVICE(0x8086, 0xa0c8), + .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, +diff --git a/sound/pci/hda/hda_tegra.c b/sound/pci/hda/hda_tegra.c +index 8350954b7986..e5191584638a 100644 +--- a/sound/pci/hda/hda_tegra.c ++++ b/sound/pci/hda/hda_tegra.c +@@ -398,6 +398,7 @@ static int hda_tegra_create(struct snd_card *card, + return err; + + chip->bus.needs_damn_long_delay = 1; ++ chip->bus.core.aligned_mmio = 1; + + err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); + if (err < 0) { +diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c +index 488c17c9f375..8ac805a634f4 100644 +--- a/sound/pci/hda/patch_hdmi.c ++++ b/sound/pci/hda/patch_hdmi.c +@@ -4153,6 +4153,7 @@ HDA_CODEC_ENTRY(0x8086280c, "Cannonlake HDMI", patch_i915_glk_hdmi), + HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_glk_hdmi), + HDA_CODEC_ENTRY(0x8086280f, "Icelake HDMI", patch_i915_icl_hdmi), + HDA_CODEC_ENTRY(0x80862812, "Tigerlake HDMI", patch_i915_tgl_hdmi), ++HDA_CODEC_ENTRY(0x8086281a, "Jasperlake HDMI", patch_i915_icl_hdmi), + HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi), + HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi), + HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi), +diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c +index aa1f9637d895..e949b372cead 100644 +--- a/sound/soc/codecs/sgtl5000.c ++++ b/sound/soc/codecs/sgtl5000.c +@@ -1344,7 +1344,8 @@ static int sgtl5000_set_power_regs(struct snd_soc_component *component) + * if vddio == vdda the source of charge pump should be + * assigned manually to VDDIO + */ +- if (vddio == vdda) { ++ if (regulator_is_equal(sgtl5000->supplies[VDDA].consumer, ++ sgtl5000->supplies[VDDIO].consumer)) { + lreg_ctrl |= SGTL5000_VDDC_ASSN_OVRD; + lreg_ctrl |= SGTL5000_VDDC_MAN_ASSN_VDDIO << + SGTL5000_VDDC_MAN_ASSN_SHIFT; +diff --git a/sound/soc/intel/boards/skl_hda_dsp_common.c b/sound/soc/intel/boards/skl_hda_dsp_common.c +index 58409b6e476e..e3d405e57c5f 100644 +--- a/sound/soc/intel/boards/skl_hda_dsp_common.c ++++ b/sound/soc/intel/boards/skl_hda_dsp_common.c +@@ -38,16 +38,19 @@ int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device) + return 0; + } + +-SND_SOC_DAILINK_DEFS(idisp1, +- DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")), ++SND_SOC_DAILINK_DEF(idisp1_cpu, ++ DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin"))); ++SND_SOC_DAILINK_DEF(idisp1_codec, + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1"))); + +-SND_SOC_DAILINK_DEFS(idisp2, +- DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")), ++SND_SOC_DAILINK_DEF(idisp2_cpu, ++ DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin"))); ++SND_SOC_DAILINK_DEF(idisp2_codec, + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2"))); + +-SND_SOC_DAILINK_DEFS(idisp3, +- DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")), ++SND_SOC_DAILINK_DEF(idisp3_cpu, ++ DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin"))); ++SND_SOC_DAILINK_DEF(idisp3_codec, + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3"))); + + SND_SOC_DAILINK_DEF(analog_cpu, +@@ -80,21 +83,21 @@ struct snd_soc_dai_link skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = { + .id = 1, + .dpcm_playback = 1, + .no_pcm = 1, +- SND_SOC_DAILINK_REG(idisp1), ++ SND_SOC_DAILINK_REG(idisp1_cpu, idisp1_codec, platform), + }, + { + .name = "iDisp2", + .id = 2, + .dpcm_playback = 1, + .no_pcm = 1, +- SND_SOC_DAILINK_REG(idisp2), ++ SND_SOC_DAILINK_REG(idisp2_cpu, idisp2_codec, platform), + }, + { + .name = "iDisp3", + .id = 3, + .dpcm_playback = 1, + .no_pcm = 1, +- SND_SOC_DAILINK_REG(idisp3), ++ SND_SOC_DAILINK_REG(idisp3_cpu, idisp3_codec, platform), + }, + { + .name = "Analog Playback and Capture", +diff --git a/sound/soc/meson/axg-fifo.c b/sound/soc/meson/axg-fifo.c +index 5a3749938900..d286dff3171d 100644 +--- a/sound/soc/meson/axg-fifo.c ++++ b/sound/soc/meson/axg-fifo.c +@@ -108,10 +108,12 @@ static int axg_fifo_pcm_hw_params(struct snd_pcm_substream *ss, + { + struct snd_pcm_runtime *runtime = ss->runtime; + struct axg_fifo *fifo = axg_fifo_data(ss); ++ unsigned int burst_num, period, threshold; + dma_addr_t end_ptr; +- unsigned int burst_num; + int ret; + ++ period = params_period_bytes(params); ++ + ret = snd_pcm_lib_malloc_pages(ss, params_buffer_bytes(params)); + if (ret < 0) + return ret; +@@ -122,9 +124,25 @@ static int axg_fifo_pcm_hw_params(struct snd_pcm_substream *ss, + regmap_write(fifo->map, FIFO_FINISH_ADDR, end_ptr); + + /* Setup interrupt periodicity */ +- burst_num = params_period_bytes(params) / AXG_FIFO_BURST; ++ burst_num = period / AXG_FIFO_BURST; + regmap_write(fifo->map, FIFO_INT_ADDR, burst_num); + ++ /* ++ * Start the fifo request on the smallest of the following: ++ * - Half the fifo size ++ * - Half the period size ++ */ ++ threshold = min(period / 2, ++ (unsigned int)AXG_FIFO_MIN_DEPTH / 2); ++ ++ /* ++ * With the threshold in bytes, register value is: ++ * V = (threshold / burst) - 1 ++ */ ++ threshold /= AXG_FIFO_BURST; ++ regmap_field_write(fifo->field_threshold, ++ threshold ? threshold - 1 : 0); ++ + /* Enable block count irq */ + regmap_update_bits(fifo->map, FIFO_CTRL0, + CTRL0_INT_EN(FIFO_INT_COUNT_REPEAT), +@@ -360,6 +378,11 @@ int axg_fifo_probe(struct platform_device *pdev) + return fifo->irq; + } + ++ fifo->field_threshold = ++ devm_regmap_field_alloc(dev, fifo->map, data->field_threshold); ++ if (IS_ERR(fifo->field_threshold)) ++ return PTR_ERR(fifo->field_threshold); ++ + return devm_snd_soc_register_component(dev, data->component_drv, + data->dai_drv, 1); + } +diff --git a/sound/soc/meson/axg-fifo.h b/sound/soc/meson/axg-fifo.h +index bb1e2ce50256..ab546a3cf940 100644 +--- a/sound/soc/meson/axg-fifo.h ++++ b/sound/soc/meson/axg-fifo.h +@@ -9,7 +9,9 @@ + + struct clk; + struct platform_device; ++struct reg_field; + struct regmap; ++struct regmap_field; + struct reset_control; + + struct snd_soc_component_driver; +@@ -50,8 +52,6 @@ struct snd_soc_pcm_runtime; + #define CTRL1_STATUS2_SEL_MASK GENMASK(11, 8) + #define CTRL1_STATUS2_SEL(x) ((x) << 8) + #define STATUS2_SEL_DDR_READ 0 +-#define CTRL1_THRESHOLD_MASK GENMASK(23, 16) +-#define CTRL1_THRESHOLD(x) ((x) << 16) + #define CTRL1_FRDDR_DEPTH_MASK GENMASK(31, 24) + #define CTRL1_FRDDR_DEPTH(x) ((x) << 24) + #define FIFO_START_ADDR 0x08 +@@ -67,12 +67,14 @@ struct axg_fifo { + struct regmap *map; + struct clk *pclk; + struct reset_control *arb; ++ struct regmap_field *field_threshold; + int irq; + }; + + struct axg_fifo_match_data { + const struct snd_soc_component_driver *component_drv; + struct snd_soc_dai_driver *dai_drv; ++ struct reg_field field_threshold; + }; + + extern const struct snd_pcm_ops axg_fifo_pcm_ops; +diff --git a/sound/soc/meson/axg-frddr.c b/sound/soc/meson/axg-frddr.c +index 6ab111c31b28..09773a9ae964 100644 +--- a/sound/soc/meson/axg-frddr.c ++++ b/sound/soc/meson/axg-frddr.c +@@ -50,7 +50,7 @@ static int axg_frddr_dai_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) + { + struct axg_fifo *fifo = snd_soc_dai_get_drvdata(dai); +- unsigned int fifo_depth, fifo_threshold; ++ unsigned int fifo_depth; + int ret; + + /* Enable pclk to access registers and clock the fifo ip */ +@@ -68,11 +68,8 @@ static int axg_frddr_dai_startup(struct snd_pcm_substream *substream, + * Depth and threshold are zero based. + */ + fifo_depth = AXG_FIFO_MIN_CNT - 1; +- fifo_threshold = (AXG_FIFO_MIN_CNT / 2) - 1; +- regmap_update_bits(fifo->map, FIFO_CTRL1, +- CTRL1_FRDDR_DEPTH_MASK | CTRL1_THRESHOLD_MASK, +- CTRL1_FRDDR_DEPTH(fifo_depth) | +- CTRL1_THRESHOLD(fifo_threshold)); ++ regmap_update_bits(fifo->map, FIFO_CTRL1, CTRL1_FRDDR_DEPTH_MASK, ++ CTRL1_FRDDR_DEPTH(fifo_depth)); + + return 0; + } +@@ -153,8 +150,9 @@ static const struct snd_soc_component_driver axg_frddr_component_drv = { + }; + + static const struct axg_fifo_match_data axg_frddr_match_data = { +- .component_drv = &axg_frddr_component_drv, +- .dai_drv = &axg_frddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &axg_frddr_component_drv, ++ .dai_drv = &axg_frddr_dai_drv + }; + + static const struct snd_soc_dai_ops g12a_frddr_ops = { +@@ -271,8 +269,9 @@ static const struct snd_soc_component_driver g12a_frddr_component_drv = { + }; + + static const struct axg_fifo_match_data g12a_frddr_match_data = { +- .component_drv = &g12a_frddr_component_drv, +- .dai_drv = &g12a_frddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &g12a_frddr_component_drv, ++ .dai_drv = &g12a_frddr_dai_drv + }; + + /* On SM1, the output selection in on CTRL2 */ +@@ -335,8 +334,9 @@ static const struct snd_soc_component_driver sm1_frddr_component_drv = { + }; + + static const struct axg_fifo_match_data sm1_frddr_match_data = { +- .component_drv = &sm1_frddr_component_drv, +- .dai_drv = &g12a_frddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &sm1_frddr_component_drv, ++ .dai_drv = &g12a_frddr_dai_drv + }; + + static const struct of_device_id axg_frddr_of_match[] = { +diff --git a/sound/soc/meson/axg-toddr.c b/sound/soc/meson/axg-toddr.c +index c8ea2145f576..ecf41c7549a6 100644 +--- a/sound/soc/meson/axg-toddr.c ++++ b/sound/soc/meson/axg-toddr.c +@@ -89,7 +89,6 @@ static int axg_toddr_dai_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) + { + struct axg_fifo *fifo = snd_soc_dai_get_drvdata(dai); +- unsigned int fifo_threshold; + int ret; + + /* Enable pclk to access registers and clock the fifo ip */ +@@ -107,11 +106,6 @@ static int axg_toddr_dai_startup(struct snd_pcm_substream *substream, + /* Apply single buffer mode to the interface */ + regmap_update_bits(fifo->map, FIFO_CTRL0, CTRL0_TODDR_PP_MODE, 0); + +- /* TODDR does not have a configurable fifo depth */ +- fifo_threshold = AXG_FIFO_MIN_CNT - 1; +- regmap_update_bits(fifo->map, FIFO_CTRL1, CTRL1_THRESHOLD_MASK, +- CTRL1_THRESHOLD(fifo_threshold)); +- + return 0; + } + +@@ -185,8 +179,9 @@ static const struct snd_soc_component_driver axg_toddr_component_drv = { + }; + + static const struct axg_fifo_match_data axg_toddr_match_data = { +- .component_drv = &axg_toddr_component_drv, +- .dai_drv = &axg_toddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &axg_toddr_component_drv, ++ .dai_drv = &axg_toddr_dai_drv + }; + + static const struct snd_soc_dai_ops g12a_toddr_ops = { +@@ -218,8 +213,9 @@ static const struct snd_soc_component_driver g12a_toddr_component_drv = { + }; + + static const struct axg_fifo_match_data g12a_toddr_match_data = { +- .component_drv = &g12a_toddr_component_drv, +- .dai_drv = &g12a_toddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 16, 23), ++ .component_drv = &g12a_toddr_component_drv, ++ .dai_drv = &g12a_toddr_dai_drv + }; + + static const char * const sm1_toddr_sel_texts[] = { +@@ -282,8 +278,9 @@ static const struct snd_soc_component_driver sm1_toddr_component_drv = { + }; + + static const struct axg_fifo_match_data sm1_toddr_match_data = { +- .component_drv = &sm1_toddr_component_drv, +- .dai_drv = &g12a_toddr_dai_drv ++ .field_threshold = REG_FIELD(FIFO_CTRL1, 12, 23), ++ .component_drv = &sm1_toddr_component_drv, ++ .dai_drv = &g12a_toddr_dai_drv + }; + + static const struct of_device_id axg_toddr_of_match[] = { +diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c +index 81f28f7ff1a0..12aec140819a 100644 +--- a/sound/soc/sof/core.c ++++ b/sound/soc/sof/core.c +@@ -288,6 +288,46 @@ static int sof_machine_check(struct snd_sof_dev *sdev) + #endif + } + ++/* ++ * FW Boot State Transition Diagram ++ * ++ * +-----------------------------------------------------------------------+ ++ * | | ++ * ------------------ ------------------ | ++ * | | | | | ++ * | BOOT_FAILED | | READY_FAILED |-------------------------+ | ++ * | | | | | | ++ * ------------------ ------------------ | | ++ * ^ ^ | | ++ * | | | | ++ * (FW Boot Timeout) (FW_READY FAIL) | | ++ * | | | | ++ * | | | | ++ * ------------------ | ------------------ | | ++ * | | | | | | | ++ * | IN_PROGRESS |---------------+------------->| COMPLETE | | | ++ * | | (FW Boot OK) (FW_READY OK) | | | | ++ * ------------------ ------------------ | | ++ * ^ | | | ++ * | | | | ++ * (FW Loading OK) (System Suspend/Runtime Suspend) ++ * | | | | ++ * | | | | ++ * ------------------ ------------------ | | | ++ * | | | |<-----+ | | ++ * | PREPARE | | NOT_STARTED |<---------------------+ | ++ * | | | |<---------------------------+ ++ * ------------------ ------------------ ++ * | ^ | ^ ++ * | | | | ++ * | +-----------------------+ | ++ * | (DSP Probe OK) | ++ * | | ++ * | | ++ * +------------------------------------+ ++ * (System Suspend/Runtime Suspend) ++ */ ++ + static int sof_probe_continue(struct snd_sof_dev *sdev) + { + struct snd_sof_pdata *plat_data = sdev->pdata; +@@ -303,6 +343,8 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + return ret; + } + ++ sdev->fw_state = SOF_FW_BOOT_PREPARE; ++ + /* check machine info */ + ret = sof_machine_check(sdev); + if (ret < 0) { +@@ -342,7 +384,12 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + goto fw_load_err; + } + +- /* boot the firmware */ ++ sdev->fw_state = SOF_FW_BOOT_IN_PROGRESS; ++ ++ /* ++ * Boot the firmware. The FW boot status will be modified ++ * in snd_sof_run_firmware() depending on the outcome. ++ */ + ret = snd_sof_run_firmware(sdev); + if (ret < 0) { + dev_err(sdev->dev, "error: failed to boot DSP firmware %d\n", +@@ -368,7 +415,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + if (ret < 0) { + dev_err(sdev->dev, + "error: failed to register DSP DAI driver %d\n", ret); +- goto fw_run_err; ++ goto fw_trace_err; + } + + drv_name = plat_data->machine->drv_name; +@@ -382,7 +429,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + + if (IS_ERR(plat_data->pdev_mach)) { + ret = PTR_ERR(plat_data->pdev_mach); +- goto fw_run_err; ++ goto fw_trace_err; + } + + dev_dbg(sdev->dev, "created machine %s\n", +@@ -393,7 +440,8 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + + return 0; + +-#if !IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE) ++fw_trace_err: ++ snd_sof_free_trace(sdev); + fw_run_err: + snd_sof_fw_unload(sdev); + fw_load_err: +@@ -402,21 +450,10 @@ ipc_err: + snd_sof_free_debug(sdev); + dbg_err: + snd_sof_remove(sdev); +-#else +- +- /* +- * when the probe_continue is handled in a work queue, the +- * probe does not fail so we don't release resources here. +- * They will be released with an explicit call to +- * snd_sof_device_remove() when the PCI/ACPI device is removed +- */ + +-fw_run_err: +-fw_load_err: +-ipc_err: +-dbg_err: +- +-#endif ++ /* all resources freed, update state to match */ ++ sdev->fw_state = SOF_FW_BOOT_NOT_STARTED; ++ sdev->first_boot = true; + + return ret; + } +@@ -447,6 +484,7 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) + + sdev->pdata = plat_data; + sdev->first_boot = true; ++ sdev->fw_state = SOF_FW_BOOT_NOT_STARTED; + dev_set_drvdata(dev, sdev); + + /* check all mandatory ops */ +@@ -494,10 +532,12 @@ int snd_sof_device_remove(struct device *dev) + if (IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)) + cancel_work_sync(&sdev->probe_work); + +- snd_sof_fw_unload(sdev); +- snd_sof_ipc_free(sdev); +- snd_sof_free_debug(sdev); +- snd_sof_free_trace(sdev); ++ if (sdev->fw_state > SOF_FW_BOOT_NOT_STARTED) { ++ snd_sof_fw_unload(sdev); ++ snd_sof_ipc_free(sdev); ++ snd_sof_free_debug(sdev); ++ snd_sof_free_trace(sdev); ++ } + + /* + * Unregister machine driver. This will unbind the snd_card which +@@ -513,7 +553,8 @@ int snd_sof_device_remove(struct device *dev) + * scheduled on, when they are unloaded. Therefore, the DSP must be + * removed only after the topology has been unloaded. + */ +- snd_sof_remove(sdev); ++ if (sdev->fw_state > SOF_FW_BOOT_NOT_STARTED) ++ snd_sof_remove(sdev); + + /* release firmware */ + release_firmware(pdata->fw); +diff --git a/sound/soc/sof/intel/hda-loader.c b/sound/soc/sof/intel/hda-loader.c +index 65c2af3fcaab..356bb134ae93 100644 +--- a/sound/soc/sof/intel/hda-loader.c ++++ b/sound/soc/sof/intel/hda-loader.c +@@ -278,7 +278,6 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev) + + /* init for booting wait */ + init_waitqueue_head(&sdev->boot_wait); +- sdev->boot_complete = false; + + /* prepare DMA for code loader stream */ + tag = cl_stream_prepare(sdev, 0x40, stripped_firmware.size, +diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c +index 5a5163eef2ef..3c4b604412f0 100644 +--- a/sound/soc/sof/intel/hda.c ++++ b/sound/soc/sof/intel/hda.c +@@ -166,7 +166,7 @@ void hda_dsp_dump_skl(struct snd_sof_dev *sdev, u32 flags) + panic = snd_sof_dsp_read(sdev, HDA_DSP_BAR, + HDA_ADSP_ERROR_CODE_SKL + 0x4); + +- if (sdev->boot_complete) { ++ if (sdev->fw_state == SOF_FW_BOOT_COMPLETE) { + hda_dsp_get_registers(sdev, &xoops, &panic_info, stack, + HDA_DSP_STACK_DUMP_SIZE); + snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, +@@ -193,7 +193,7 @@ void hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags) + HDA_DSP_SRAM_REG_FW_STATUS); + panic = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_FW_TRACEP); + +- if (sdev->boot_complete) { ++ if (sdev->fw_state == SOF_FW_BOOT_COMPLETE) { + hda_dsp_get_registers(sdev, &xoops, &panic_info, stack, + HDA_DSP_STACK_DUMP_SIZE); + snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, +diff --git a/sound/soc/sof/ipc.c b/sound/soc/sof/ipc.c +index 7b6d69783e16..8984d965037d 100644 +--- a/sound/soc/sof/ipc.c ++++ b/sound/soc/sof/ipc.c +@@ -348,19 +348,12 @@ void snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev) + break; + case SOF_IPC_FW_READY: + /* check for FW boot completion */ +- if (!sdev->boot_complete) { ++ if (sdev->fw_state == SOF_FW_BOOT_IN_PROGRESS) { + err = sof_ops(sdev)->fw_ready(sdev, cmd); +- if (err < 0) { +- /* +- * this indicates a mismatch in ABI +- * between the driver and fw +- */ +- dev_err(sdev->dev, "error: ABI mismatch %d\n", +- err); +- } else { +- /* firmware boot completed OK */ +- sdev->boot_complete = true; +- } ++ if (err < 0) ++ sdev->fw_state = SOF_FW_BOOT_READY_FAILED; ++ else ++ sdev->fw_state = SOF_FW_BOOT_COMPLETE; + + /* wake up firmware loader */ + wake_up(&sdev->boot_wait); +diff --git a/sound/soc/sof/loader.c b/sound/soc/sof/loader.c +index a041adf0669d..ce114df5e4fc 100644 +--- a/sound/soc/sof/loader.c ++++ b/sound/soc/sof/loader.c +@@ -511,7 +511,6 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev) + int init_core_mask; + + init_waitqueue_head(&sdev->boot_wait); +- sdev->boot_complete = false; + + /* create read-only fw_version debugfs to store boot version info */ + if (sdev->first_boot) { +@@ -543,19 +542,27 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev) + + init_core_mask = ret; + +- /* now wait for the DSP to boot */ +- ret = wait_event_timeout(sdev->boot_wait, sdev->boot_complete, ++ /* ++ * now wait for the DSP to boot. There are 3 possible outcomes: ++ * 1. Boot wait times out indicating FW boot failure. ++ * 2. FW boots successfully and fw_ready op succeeds. ++ * 3. FW boots but fw_ready op fails. ++ */ ++ ret = wait_event_timeout(sdev->boot_wait, ++ sdev->fw_state > SOF_FW_BOOT_IN_PROGRESS, + msecs_to_jiffies(sdev->boot_timeout)); + if (ret == 0) { + dev_err(sdev->dev, "error: firmware boot failure\n"); + snd_sof_dsp_dbg_dump(sdev, SOF_DBG_REGS | SOF_DBG_MBOX | + SOF_DBG_TEXT | SOF_DBG_PCI); +- /* after this point FW_READY msg should be ignored */ +- sdev->boot_complete = true; ++ sdev->fw_state = SOF_FW_BOOT_FAILED; + return -EIO; + } + +- dev_info(sdev->dev, "firmware boot complete\n"); ++ if (sdev->fw_state == SOF_FW_BOOT_COMPLETE) ++ dev_info(sdev->dev, "firmware boot complete\n"); ++ else ++ return -EIO; /* FW boots but fw_ready op failed */ + + /* perform post fw run operations */ + ret = snd_sof_dsp_post_fw_run(sdev); +diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c +index e23beaeefe00..195af259e78e 100644 +--- a/sound/soc/sof/pm.c ++++ b/sound/soc/sof/pm.c +@@ -269,6 +269,10 @@ static int sof_resume(struct device *dev, bool runtime_resume) + if (!sof_ops(sdev)->resume || !sof_ops(sdev)->runtime_resume) + return 0; + ++ /* DSP was never successfully started, nothing to resume */ ++ if (sdev->first_boot) ++ return 0; ++ + /* + * if the runtime_resume flag is set, call the runtime_resume routine + * or else call the system resume routine +@@ -283,6 +287,8 @@ static int sof_resume(struct device *dev, bool runtime_resume) + return ret; + } + ++ sdev->fw_state = SOF_FW_BOOT_PREPARE; ++ + /* load the firmware */ + ret = snd_sof_load_firmware(sdev); + if (ret < 0) { +@@ -292,7 +298,12 @@ static int sof_resume(struct device *dev, bool runtime_resume) + return ret; + } + +- /* boot the firmware */ ++ sdev->fw_state = SOF_FW_BOOT_IN_PROGRESS; ++ ++ /* ++ * Boot the firmware. The FW boot status will be modified ++ * in snd_sof_run_firmware() depending on the outcome. ++ */ + ret = snd_sof_run_firmware(sdev); + if (ret < 0) { + dev_err(sdev->dev, +@@ -338,6 +349,9 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) + if (!sof_ops(sdev)->suspend) + return 0; + ++ if (sdev->fw_state != SOF_FW_BOOT_COMPLETE) ++ goto power_down; ++ + /* release trace */ + snd_sof_release_trace(sdev); + +@@ -375,6 +389,12 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) + ret); + } + ++power_down: ++ ++ /* return if the DSP was not probed successfully */ ++ if (sdev->fw_state == SOF_FW_BOOT_NOT_STARTED) ++ return 0; ++ + /* power down all DSP cores */ + if (runtime_suspend) + ret = snd_sof_dsp_runtime_suspend(sdev); +@@ -385,6 +405,9 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) + "error: failed to power down DSP during suspend %d\n", + ret); + ++ /* reset FW state */ ++ sdev->fw_state = SOF_FW_BOOT_NOT_STARTED; ++ + return ret; + } + +diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h +index 730f3259dd02..7b329bd99674 100644 +--- a/sound/soc/sof/sof-priv.h ++++ b/sound/soc/sof/sof-priv.h +@@ -356,6 +356,15 @@ struct snd_sof_dai { + struct list_head list; /* list in sdev dai list */ + }; + ++enum snd_sof_fw_state { ++ SOF_FW_BOOT_NOT_STARTED = 0, ++ SOF_FW_BOOT_PREPARE, ++ SOF_FW_BOOT_IN_PROGRESS, ++ SOF_FW_BOOT_FAILED, ++ SOF_FW_BOOT_READY_FAILED, /* firmware booted but fw_ready op failed */ ++ SOF_FW_BOOT_COMPLETE, ++}; ++ + /* + * SOF Device Level. + */ +@@ -372,7 +381,7 @@ struct snd_sof_dev { + + /* DSP firmware boot */ + wait_queue_head_t boot_wait; +- u32 boot_complete; ++ enum snd_sof_fw_state fw_state; + u32 first_boot; + + /* work queue in case the probe is implemented in two steps */ +diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c +index 94b903d95afa..74c00c905d24 100644 +--- a/sound/usb/mixer_scarlett_gen2.c ++++ b/sound/usb/mixer_scarlett_gen2.c +@@ -558,11 +558,11 @@ static const struct scarlett2_config + + /* proprietary request/response format */ + struct scarlett2_usb_packet { +- u32 cmd; +- u16 size; +- u16 seq; +- u32 error; +- u32 pad; ++ __le32 cmd; ++ __le16 size; ++ __le16 seq; ++ __le32 error; ++ __le32 pad; + u8 data[]; + }; + +@@ -664,11 +664,11 @@ static int scarlett2_usb( + "Scarlett Gen 2 USB invalid response; " + "cmd tx/rx %d/%d seq %d/%d size %d/%d " + "error %d pad %d\n", +- le16_to_cpu(req->cmd), le16_to_cpu(resp->cmd), ++ le32_to_cpu(req->cmd), le32_to_cpu(resp->cmd), + le16_to_cpu(req->seq), le16_to_cpu(resp->seq), + resp_size, le16_to_cpu(resp->size), +- le16_to_cpu(resp->error), +- le16_to_cpu(resp->pad)); ++ le32_to_cpu(resp->error), ++ le32_to_cpu(resp->pad)); + err = -EINVAL; + goto unlock; + } +@@ -687,7 +687,7 @@ error: + /* Send SCARLETT2_USB_DATA_CMD SCARLETT2_USB_CONFIG_SAVE */ + static void scarlett2_config_save(struct usb_mixer_interface *mixer) + { +- u32 req = cpu_to_le32(SCARLETT2_USB_CONFIG_SAVE); ++ __le32 req = cpu_to_le32(SCARLETT2_USB_CONFIG_SAVE); + + scarlett2_usb(mixer, SCARLETT2_USB_DATA_CMD, + &req, sizeof(u32), +@@ -713,11 +713,11 @@ static int scarlett2_usb_set_config( + const struct scarlett2_config config_item = + scarlett2_config_items[config_item_num]; + struct { +- u32 offset; +- u32 bytes; +- s32 value; ++ __le32 offset; ++ __le32 bytes; ++ __le32 value; + } __packed req; +- u32 req2; ++ __le32 req2; + int err; + struct scarlett2_mixer_data *private = mixer->private_data; + +@@ -753,8 +753,8 @@ static int scarlett2_usb_get( + int offset, void *buf, int size) + { + struct { +- u32 offset; +- u32 size; ++ __le32 offset; ++ __le32 size; + } __packed req; + + req.offset = cpu_to_le32(offset); +@@ -794,8 +794,8 @@ static int scarlett2_usb_set_mix(struct usb_mixer_interface *mixer, + const struct scarlett2_device_info *info = private->info; + + struct { +- u16 mix_num; +- u16 data[SCARLETT2_INPUT_MIX_MAX]; ++ __le16 mix_num; ++ __le16 data[SCARLETT2_INPUT_MIX_MAX]; + } __packed req; + + int i, j; +@@ -850,9 +850,9 @@ static int scarlett2_usb_set_mux(struct usb_mixer_interface *mixer) + }; + + struct { +- u16 pad; +- u16 num; +- u32 data[SCARLETT2_MUX_MAX]; ++ __le16 pad; ++ __le16 num; ++ __le32 data[SCARLETT2_MUX_MAX]; + } __packed req; + + req.pad = 0; +@@ -911,9 +911,9 @@ static int scarlett2_usb_get_meter_levels(struct usb_mixer_interface *mixer, + u16 *levels) + { + struct { +- u16 pad; +- u16 num_meters; +- u32 magic; ++ __le16 pad; ++ __le16 num_meters; ++ __le32 magic; + } __packed req; + u32 resp[SCARLETT2_NUM_METERS]; + int i, err; +diff --git a/sound/usb/validate.c b/sound/usb/validate.c +index 389e8657434a..5a3c4f7882b0 100644 +--- a/sound/usb/validate.c ++++ b/sound/usb/validate.c +@@ -110,7 +110,7 @@ static bool validate_processing_unit(const void *p, + default: + if (v->type == UAC1_EXTENSION_UNIT) + return true; /* OK */ +- switch (d->wProcessType) { ++ switch (le16_to_cpu(d->wProcessType)) { + case UAC_PROCESS_UP_DOWNMIX: + case UAC_PROCESS_DOLBY_PROLOGIC: + if (d->bLength < len + 1) /* bNrModes */ +@@ -125,7 +125,7 @@ static bool validate_processing_unit(const void *p, + case UAC_VERSION_2: + if (v->type == UAC2_EXTENSION_UNIT_V2) + return true; /* OK */ +- switch (d->wProcessType) { ++ switch (le16_to_cpu(d->wProcessType)) { + case UAC2_PROCESS_UP_DOWNMIX: + case UAC2_PROCESS_DOLBY_PROLOCIC: /* SiC! */ + if (d->bLength < len + 1) /* bNrModes */ +@@ -142,7 +142,7 @@ static bool validate_processing_unit(const void *p, + len += 2; /* wClusterDescrID */ + break; + } +- switch (d->wProcessType) { ++ switch (le16_to_cpu(d->wProcessType)) { + case UAC3_PROCESS_UP_DOWNMIX: + if (d->bLength < len + 1) /* bNrModes */ + return false; +diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat +index ad1b9e646c49..4cf93110c259 100755 +--- a/tools/kvm/kvm_stat/kvm_stat ++++ b/tools/kvm/kvm_stat/kvm_stat +@@ -270,6 +270,7 @@ class ArchX86(Arch): + def __init__(self, exit_reasons): + self.sc_perf_evt_open = 298 + self.ioctl_numbers = IOCTL_NUMBERS ++ self.exit_reason_field = 'exit_reason' + self.exit_reasons = exit_reasons + + def debugfs_is_child(self, field): +@@ -289,6 +290,7 @@ class ArchPPC(Arch): + # numbers depend on the wordsize. + char_ptr_size = ctypes.sizeof(ctypes.c_char_p) + self.ioctl_numbers['SET_FILTER'] = 0x80002406 | char_ptr_size << 16 ++ self.exit_reason_field = 'exit_nr' + self.exit_reasons = {} + + def debugfs_is_child(self, field): +@@ -300,6 +302,7 @@ class ArchA64(Arch): + def __init__(self): + self.sc_perf_evt_open = 241 + self.ioctl_numbers = IOCTL_NUMBERS ++ self.exit_reason_field = 'esr_ec' + self.exit_reasons = AARCH64_EXIT_REASONS + + def debugfs_is_child(self, field): +@@ -311,6 +314,7 @@ class ArchS390(Arch): + def __init__(self): + self.sc_perf_evt_open = 331 + self.ioctl_numbers = IOCTL_NUMBERS ++ self.exit_reason_field = None + self.exit_reasons = None + + def debugfs_is_child(self, field): +@@ -541,8 +545,8 @@ class TracepointProvider(Provider): + """ + filters = {} + filters['kvm_userspace_exit'] = ('reason', USERSPACE_EXIT_REASONS) +- if ARCH.exit_reasons: +- filters['kvm_exit'] = ('exit_reason', ARCH.exit_reasons) ++ if ARCH.exit_reason_field and ARCH.exit_reasons: ++ filters['kvm_exit'] = (ARCH.exit_reason_field, ARCH.exit_reasons) + return filters + + def _get_available_fields(self): +diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c +index d98838c5820c..b6403712c2f4 100644 +--- a/tools/lib/bpf/libbpf.c ++++ b/tools/lib/bpf/libbpf.c +@@ -2541,7 +2541,9 @@ static struct ids_vec *bpf_core_find_cands(const struct btf *local_btf, + if (strncmp(local_name, targ_name, local_essent_len) == 0) { + pr_debug("[%d] %s: found candidate [%d] %s\n", + local_type_id, local_name, i, targ_name); +- new_ids = realloc(cand_ids->data, cand_ids->len + 1); ++ new_ids = reallocarray(cand_ids->data, ++ cand_ids->len + 1, ++ sizeof(*cand_ids->data)); + if (!new_ids) { + err = -ENOMEM; + goto err_out; +diff --git a/tools/objtool/sync-check.sh b/tools/objtool/sync-check.sh +index 0a832e265a50..c3ae1e8ae119 100755 +--- a/tools/objtool/sync-check.sh ++++ b/tools/objtool/sync-check.sh +@@ -47,5 +47,3 @@ check arch/x86/include/asm/inat.h '-I "^#include [\"<]\(asm/\)*inat_types.h[ + check arch/x86/include/asm/insn.h '-I "^#include [\"<]\(asm/\)*inat.h[\">]"' + check arch/x86/lib/inat.c '-I "^#include [\"<]\(../include/\)*asm/insn.h[\">]"' + check arch/x86/lib/insn.c '-I "^#include [\"<]\(../include/\)*asm/in\(at\|sn\).h[\">]"' +- +-cd - +diff --git a/tools/power/cpupower/lib/cpufreq.c b/tools/power/cpupower/lib/cpufreq.c +index 2f55d4d23446..6e04304560ca 100644 +--- a/tools/power/cpupower/lib/cpufreq.c ++++ b/tools/power/cpupower/lib/cpufreq.c +@@ -332,21 +332,74 @@ void cpufreq_put_available_governors(struct cpufreq_available_governors *any) + } + + +-struct cpufreq_frequencies +-*cpufreq_get_frequencies(const char *type, unsigned int cpu) ++struct cpufreq_available_frequencies ++*cpufreq_get_available_frequencies(unsigned int cpu) + { +- struct cpufreq_frequencies *first = NULL; +- struct cpufreq_frequencies *current = NULL; ++ struct cpufreq_available_frequencies *first = NULL; ++ struct cpufreq_available_frequencies *current = NULL; + char one_value[SYSFS_PATH_MAX]; + char linebuf[MAX_LINE_LEN]; +- char fname[MAX_LINE_LEN]; + unsigned int pos, i; + unsigned int len; + +- snprintf(fname, MAX_LINE_LEN, "scaling_%s_frequencies", type); ++ len = sysfs_cpufreq_read_file(cpu, "scaling_available_frequencies", ++ linebuf, sizeof(linebuf)); ++ if (len == 0) ++ return NULL; + +- len = sysfs_cpufreq_read_file(cpu, fname, +- linebuf, sizeof(linebuf)); ++ pos = 0; ++ for (i = 0; i < len; i++) { ++ if (linebuf[i] == ' ' || linebuf[i] == '\n') { ++ if (i - pos < 2) ++ continue; ++ if (i - pos >= SYSFS_PATH_MAX) ++ goto error_out; ++ if (current) { ++ current->next = malloc(sizeof(*current)); ++ if (!current->next) ++ goto error_out; ++ current = current->next; ++ } else { ++ first = malloc(sizeof(*first)); ++ if (!first) ++ goto error_out; ++ current = first; ++ } ++ current->first = first; ++ current->next = NULL; ++ ++ memcpy(one_value, linebuf + pos, i - pos); ++ one_value[i - pos] = '\0'; ++ if (sscanf(one_value, "%lu", ¤t->frequency) != 1) ++ goto error_out; ++ ++ pos = i + 1; ++ } ++ } ++ ++ return first; ++ ++ error_out: ++ while (first) { ++ current = first->next; ++ free(first); ++ first = current; ++ } ++ return NULL; ++} ++ ++struct cpufreq_available_frequencies ++*cpufreq_get_boost_frequencies(unsigned int cpu) ++{ ++ struct cpufreq_available_frequencies *first = NULL; ++ struct cpufreq_available_frequencies *current = NULL; ++ char one_value[SYSFS_PATH_MAX]; ++ char linebuf[MAX_LINE_LEN]; ++ unsigned int pos, i; ++ unsigned int len; ++ ++ len = sysfs_cpufreq_read_file(cpu, "scaling_boost_frequencies", ++ linebuf, sizeof(linebuf)); + if (len == 0) + return NULL; + +@@ -391,9 +444,9 @@ struct cpufreq_frequencies + return NULL; + } + +-void cpufreq_put_frequencies(struct cpufreq_frequencies *any) ++void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies *any) + { +- struct cpufreq_frequencies *tmp, *next; ++ struct cpufreq_available_frequencies *tmp, *next; + + if (!any) + return; +@@ -406,6 +459,11 @@ void cpufreq_put_frequencies(struct cpufreq_frequencies *any) + } + } + ++void cpufreq_put_boost_frequencies(struct cpufreq_available_frequencies *any) ++{ ++ cpufreq_put_available_frequencies(any); ++} ++ + static struct cpufreq_affected_cpus *sysfs_get_cpu_list(unsigned int cpu, + const char *file) + { +diff --git a/tools/power/cpupower/lib/cpufreq.h b/tools/power/cpupower/lib/cpufreq.h +index a55f0d19215b..95f4fd9e2656 100644 +--- a/tools/power/cpupower/lib/cpufreq.h ++++ b/tools/power/cpupower/lib/cpufreq.h +@@ -20,10 +20,10 @@ struct cpufreq_available_governors { + struct cpufreq_available_governors *first; + }; + +-struct cpufreq_frequencies { ++struct cpufreq_available_frequencies { + unsigned long frequency; +- struct cpufreq_frequencies *next; +- struct cpufreq_frequencies *first; ++ struct cpufreq_available_frequencies *next; ++ struct cpufreq_available_frequencies *first; + }; + + +@@ -124,11 +124,17 @@ void cpufreq_put_available_governors( + * cpufreq_put_frequencies after use. + */ + +-struct cpufreq_frequencies +-*cpufreq_get_frequencies(const char *type, unsigned int cpu); ++struct cpufreq_available_frequencies ++*cpufreq_get_available_frequencies(unsigned int cpu); + +-void cpufreq_put_frequencies( +- struct cpufreq_frequencies *first); ++void cpufreq_put_available_frequencies( ++ struct cpufreq_available_frequencies *first); ++ ++struct cpufreq_available_frequencies ++*cpufreq_get_boost_frequencies(unsigned int cpu); ++ ++void cpufreq_put_boost_frequencies( ++ struct cpufreq_available_frequencies *first); + + + /* determine affected CPUs +diff --git a/tools/power/cpupower/utils/cpufreq-info.c b/tools/power/cpupower/utils/cpufreq-info.c +index e63cf55f81cf..6efc0f6b1b11 100644 +--- a/tools/power/cpupower/utils/cpufreq-info.c ++++ b/tools/power/cpupower/utils/cpufreq-info.c +@@ -244,14 +244,14 @@ static int get_boost_mode_x86(unsigned int cpu) + + static int get_boost_mode(unsigned int cpu) + { +- struct cpufreq_frequencies *freqs; ++ struct cpufreq_available_frequencies *freqs; + + if (cpupower_cpu_info.vendor == X86_VENDOR_AMD || + cpupower_cpu_info.vendor == X86_VENDOR_HYGON || + cpupower_cpu_info.vendor == X86_VENDOR_INTEL) + return get_boost_mode_x86(cpu); + +- freqs = cpufreq_get_frequencies("boost", cpu); ++ freqs = cpufreq_get_boost_frequencies(cpu); + if (freqs) { + printf(_(" boost frequency steps: ")); + while (freqs->next) { +@@ -261,7 +261,7 @@ static int get_boost_mode(unsigned int cpu) + } + print_speed(freqs->frequency); + printf("\n"); +- cpufreq_put_frequencies(freqs); ++ cpufreq_put_available_frequencies(freqs); + } + + return 0; +@@ -475,7 +475,7 @@ static int get_latency(unsigned int cpu, unsigned int human) + + static void debug_output_one(unsigned int cpu) + { +- struct cpufreq_frequencies *freqs; ++ struct cpufreq_available_frequencies *freqs; + + get_driver(cpu); + get_related_cpus(cpu); +@@ -483,7 +483,7 @@ static void debug_output_one(unsigned int cpu) + get_latency(cpu, 1); + get_hardware_limits(cpu, 1); + +- freqs = cpufreq_get_frequencies("available", cpu); ++ freqs = cpufreq_get_available_frequencies(cpu); + if (freqs) { + printf(_(" available frequency steps: ")); + while (freqs->next) { +@@ -493,7 +493,7 @@ static void debug_output_one(unsigned int cpu) + } + print_speed(freqs->frequency); + printf("\n"); +- cpufreq_put_frequencies(freqs); ++ cpufreq_put_available_frequencies(freqs); + } + + get_available_governors(cpu); +diff --git a/tools/testing/selftests/bpf/prog_tests/attach_probe.c b/tools/testing/selftests/bpf/prog_tests/attach_probe.c +index 5ecc267d98b0..fad615c22e4d 100644 +--- a/tools/testing/selftests/bpf/prog_tests/attach_probe.c ++++ b/tools/testing/selftests/bpf/prog_tests/attach_probe.c +@@ -2,7 +2,7 @@ + #include + + ssize_t get_base_addr() { +- size_t start; ++ size_t start, offset; + char buf[256]; + FILE *f; + +@@ -10,10 +10,11 @@ ssize_t get_base_addr() { + if (!f) + return -errno; + +- while (fscanf(f, "%zx-%*x %s %*s\n", &start, buf) == 2) { ++ while (fscanf(f, "%zx-%*x %s %zx %*[^\n]\n", ++ &start, buf, &offset) == 3) { + if (strcmp(buf, "r-xp") == 0) { + fclose(f); +- return start; ++ return start - offset; + } + } + +diff --git a/tools/testing/selftests/bpf/prog_tests/perf_buffer.c b/tools/testing/selftests/bpf/prog_tests/perf_buffer.c +index 3003fddc0613..cf6c87936c69 100644 +--- a/tools/testing/selftests/bpf/prog_tests/perf_buffer.c ++++ b/tools/testing/selftests/bpf/prog_tests/perf_buffer.c +@@ -4,6 +4,7 @@ + #include + #include + #include ++#include "libbpf_internal.h" + + static void on_sample(void *ctx, int cpu, void *data, __u32 size) + { +@@ -19,7 +20,7 @@ static void on_sample(void *ctx, int cpu, void *data, __u32 size) + + void test_perf_buffer(void) + { +- int err, prog_fd, nr_cpus, i, duration = 0; ++ int err, prog_fd, on_len, nr_on_cpus = 0, nr_cpus, i, duration = 0; + const char *prog_name = "kprobe/sys_nanosleep"; + const char *file = "./test_perf_buffer.o"; + struct perf_buffer_opts pb_opts = {}; +@@ -29,15 +30,27 @@ void test_perf_buffer(void) + struct bpf_object *obj; + struct perf_buffer *pb; + struct bpf_link *link; ++ bool *online; + + nr_cpus = libbpf_num_possible_cpus(); + if (CHECK(nr_cpus < 0, "nr_cpus", "err %d\n", nr_cpus)) + return; + ++ err = parse_cpu_mask_file("/sys/devices/system/cpu/online", ++ &online, &on_len); ++ if (CHECK(err, "nr_on_cpus", "err %d\n", err)) ++ return; ++ ++ for (i = 0; i < on_len; i++) ++ if (online[i]) ++ nr_on_cpus++; ++ + /* load program */ + err = bpf_prog_load(file, BPF_PROG_TYPE_KPROBE, &obj, &prog_fd); +- if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno)) +- return; ++ if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno)) { ++ obj = NULL; ++ goto out_close; ++ } + + prog = bpf_object__find_program_by_title(obj, prog_name); + if (CHECK(!prog, "find_probe", "prog '%s' not found\n", prog_name)) +@@ -64,6 +77,11 @@ void test_perf_buffer(void) + /* trigger kprobe on every CPU */ + CPU_ZERO(&cpu_seen); + for (i = 0; i < nr_cpus; i++) { ++ if (i >= on_len || !online[i]) { ++ printf("skipping offline CPU #%d\n", i); ++ continue; ++ } ++ + CPU_ZERO(&cpu_set); + CPU_SET(i, &cpu_set); + +@@ -81,8 +99,8 @@ void test_perf_buffer(void) + if (CHECK(err < 0, "perf_buffer__poll", "err %d\n", err)) + goto out_free_pb; + +- if (CHECK(CPU_COUNT(&cpu_seen) != nr_cpus, "seen_cpu_cnt", +- "expect %d, seen %d\n", nr_cpus, CPU_COUNT(&cpu_seen))) ++ if (CHECK(CPU_COUNT(&cpu_seen) != nr_on_cpus, "seen_cpu_cnt", ++ "expect %d, seen %d\n", nr_on_cpus, CPU_COUNT(&cpu_seen))) + goto out_free_pb; + + out_free_pb: +@@ -91,4 +109,5 @@ out_detach: + bpf_link__destroy(link); + out_close: + bpf_object__close(obj); ++ free(online); + } +diff --git a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +index f62aa0eb959b..1735faf17536 100644 +--- a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c ++++ b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +@@ -49,8 +49,12 @@ retry: + pmu_fd = syscall(__NR_perf_event_open, &attr, -1 /* pid */, + 0 /* cpu 0 */, -1 /* group id */, + 0 /* flags */); +- if (CHECK(pmu_fd < 0, "perf_event_open", +- "err %d errno %d. Does the test host support PERF_COUNT_HW_CPU_CYCLES?\n", ++ if (pmu_fd < 0 && errno == ENOENT) { ++ printf("%s:SKIP:no PERF_COUNT_HW_CPU_CYCLES\n", __func__); ++ test__skip(); ++ goto cleanup; ++ } ++ if (CHECK(pmu_fd < 0, "perf_event_open", "err %d errno %d\n", + pmu_fd, errno)) + goto close_prog; + +diff --git a/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c b/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c +index ea7d84f01235..e6be383a003f 100644 +--- a/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c ++++ b/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c +@@ -113,6 +113,12 @@ int _select_by_skb_data(struct sk_reuseport_md *reuse_md) + data_check.skb_ports[0] = th->source; + data_check.skb_ports[1] = th->dest; + ++ if (th->fin) ++ /* The connection is being torn down at the end of a ++ * test. It can't contain a cmd, so return early. ++ */ ++ return SK_PASS; ++ + if ((th->doff << 2) + sizeof(*cmd) > data_check.len) + GOTO_DONE(DROP_ERR_SKB_DATA); + if (bpf_skb_load_bytes(reuse_md, th->doff << 2, &cmd_copy, +diff --git a/tools/testing/selftests/bpf/test_sockmap.c b/tools/testing/selftests/bpf/test_sockmap.c +index 4a851513c842..779e11da979c 100644 +--- a/tools/testing/selftests/bpf/test_sockmap.c ++++ b/tools/testing/selftests/bpf/test_sockmap.c +@@ -331,7 +331,7 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + FILE *file; + int i, fp; + +- file = fopen(".sendpage_tst.tmp", "w+"); ++ file = tmpfile(); + if (!file) { + perror("create file for sendpage"); + return 1; +@@ -340,13 +340,8 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + fwrite(&k, sizeof(char), 1, file); + fflush(file); + fseek(file, 0, SEEK_SET); +- fclose(file); + +- fp = open(".sendpage_tst.tmp", O_RDONLY); +- if (fp < 0) { +- perror("reopen file for sendpage"); +- return 1; +- } ++ fp = fileno(file); + + clock_gettime(CLOCK_MONOTONIC, &s->start); + for (i = 0; i < cnt; i++) { +@@ -354,11 +349,11 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + + if (!drop && sent < 0) { + perror("send loop error"); +- close(fp); ++ fclose(file); + return sent; + } else if (drop && sent >= 0) { + printf("sendpage loop error expected: %i\n", sent); +- close(fp); ++ fclose(file); + return -EIO; + } + +@@ -366,7 +361,7 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + s->bytes_sent += sent; + } + clock_gettime(CLOCK_MONOTONIC, &s->end); +- close(fp); ++ fclose(file); + return 0; + } + +diff --git a/tools/testing/selftests/tc-testing/plugin-lib/buildebpfPlugin.py b/tools/testing/selftests/tc-testing/plugin-lib/buildebpfPlugin.py +index e98c36750fae..d34fe06268d2 100644 +--- a/tools/testing/selftests/tc-testing/plugin-lib/buildebpfPlugin.py ++++ b/tools/testing/selftests/tc-testing/plugin-lib/buildebpfPlugin.py +@@ -54,7 +54,7 @@ class SubPlugin(TdcPlugin): + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, +- env=ENVIR) ++ env=os.environ.copy()) + (rawout, serr) = proc.communicate() + + if proc.returncode != 0 and len(serr) > 0: +diff --git a/virt/kvm/arm/aarch32.c b/virt/kvm/arm/aarch32.c +index c4c57ba99e90..631d397ac81b 100644 +--- a/virt/kvm/arm/aarch32.c ++++ b/virt/kvm/arm/aarch32.c +@@ -10,6 +10,7 @@ + * Author: Christoffer Dall + */ + ++#include + #include + #include + #include +@@ -28,25 +29,115 @@ static const u8 return_offsets[8][2] = { + [7] = { 4, 4 }, /* FIQ, unused */ + }; + ++/* ++ * When an exception is taken, most CPSR fields are left unchanged in the ++ * handler. However, some are explicitly overridden (e.g. M[4:0]). ++ * ++ * The SPSR/SPSR_ELx layouts differ, and the below is intended to work with ++ * either format. Note: SPSR.J bit doesn't exist in SPSR_ELx, but this bit was ++ * obsoleted by the ARMv7 virtualization extensions and is RES0. ++ * ++ * For the SPSR layout seen from AArch32, see: ++ * - ARM DDI 0406C.d, page B1-1148 ++ * - ARM DDI 0487E.a, page G8-6264 ++ * ++ * For the SPSR_ELx layout for AArch32 seen from AArch64, see: ++ * - ARM DDI 0487E.a, page C5-426 ++ * ++ * Here we manipulate the fields in order of the AArch32 SPSR_ELx layout, from ++ * MSB to LSB. ++ */ ++static unsigned long get_except32_cpsr(struct kvm_vcpu *vcpu, u32 mode) ++{ ++ u32 sctlr = vcpu_cp15(vcpu, c1_SCTLR); ++ unsigned long old, new; ++ ++ old = *vcpu_cpsr(vcpu); ++ new = 0; ++ ++ new |= (old & PSR_AA32_N_BIT); ++ new |= (old & PSR_AA32_Z_BIT); ++ new |= (old & PSR_AA32_C_BIT); ++ new |= (old & PSR_AA32_V_BIT); ++ new |= (old & PSR_AA32_Q_BIT); ++ ++ // CPSR.IT[7:0] are set to zero upon any exception ++ // See ARM DDI 0487E.a, section G1.12.3 ++ // See ARM DDI 0406C.d, section B1.8.3 ++ ++ new |= (old & PSR_AA32_DIT_BIT); ++ ++ // CPSR.SSBS is set to SCTLR.DSSBS upon any exception ++ // See ARM DDI 0487E.a, page G8-6244 ++ if (sctlr & BIT(31)) ++ new |= PSR_AA32_SSBS_BIT; ++ ++ // CPSR.PAN is unchanged unless SCTLR.SPAN == 0b0 ++ // SCTLR.SPAN is RES1 when ARMv8.1-PAN is not implemented ++ // See ARM DDI 0487E.a, page G8-6246 ++ new |= (old & PSR_AA32_PAN_BIT); ++ if (!(sctlr & BIT(23))) ++ new |= PSR_AA32_PAN_BIT; ++ ++ // SS does not exist in AArch32, so ignore ++ ++ // CPSR.IL is set to zero upon any exception ++ // See ARM DDI 0487E.a, page G1-5527 ++ ++ new |= (old & PSR_AA32_GE_MASK); ++ ++ // CPSR.IT[7:0] are set to zero upon any exception ++ // See prior comment above ++ ++ // CPSR.E is set to SCTLR.EE upon any exception ++ // See ARM DDI 0487E.a, page G8-6245 ++ // See ARM DDI 0406C.d, page B4-1701 ++ if (sctlr & BIT(25)) ++ new |= PSR_AA32_E_BIT; ++ ++ // CPSR.A is unchanged upon an exception to Undefined, Supervisor ++ // CPSR.A is set upon an exception to other modes ++ // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 ++ // See ARM DDI 0406C.d, page B1-1182 ++ new |= (old & PSR_AA32_A_BIT); ++ if (mode != PSR_AA32_MODE_UND && mode != PSR_AA32_MODE_SVC) ++ new |= PSR_AA32_A_BIT; ++ ++ // CPSR.I is set upon any exception ++ // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 ++ // See ARM DDI 0406C.d, page B1-1182 ++ new |= PSR_AA32_I_BIT; ++ ++ // CPSR.F is set upon an exception to FIQ ++ // CPSR.F is unchanged upon an exception to other modes ++ // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 ++ // See ARM DDI 0406C.d, page B1-1182 ++ new |= (old & PSR_AA32_F_BIT); ++ if (mode == PSR_AA32_MODE_FIQ) ++ new |= PSR_AA32_F_BIT; ++ ++ // CPSR.T is set to SCTLR.TE upon any exception ++ // See ARM DDI 0487E.a, page G8-5514 ++ // See ARM DDI 0406C.d, page B1-1181 ++ if (sctlr & BIT(30)) ++ new |= PSR_AA32_T_BIT; ++ ++ new |= mode; ++ ++ return new; ++} ++ + static void prepare_fault32(struct kvm_vcpu *vcpu, u32 mode, u32 vect_offset) + { +- unsigned long cpsr; +- unsigned long new_spsr_value = *vcpu_cpsr(vcpu); +- bool is_thumb = (new_spsr_value & PSR_AA32_T_BIT); ++ unsigned long spsr = *vcpu_cpsr(vcpu); ++ bool is_thumb = (spsr & PSR_AA32_T_BIT); + u32 return_offset = return_offsets[vect_offset >> 2][is_thumb]; + u32 sctlr = vcpu_cp15(vcpu, c1_SCTLR); + +- cpsr = mode | PSR_AA32_I_BIT; +- +- if (sctlr & (1 << 30)) +- cpsr |= PSR_AA32_T_BIT; +- if (sctlr & (1 << 25)) +- cpsr |= PSR_AA32_E_BIT; +- +- *vcpu_cpsr(vcpu) = cpsr; ++ *vcpu_cpsr(vcpu) = get_except32_cpsr(vcpu, mode); + + /* Note: These now point to the banked copies */ +- vcpu_write_spsr(vcpu, new_spsr_value); ++ vcpu_write_spsr(vcpu, host_spsr_to_spsr32(spsr)); + *vcpu_reg32(vcpu, 14) = *vcpu_pc(vcpu) + return_offset; + + /* Branch to exception vector */ +@@ -84,7 +175,7 @@ static void inject_abt32(struct kvm_vcpu *vcpu, bool is_pabt, + fsr = &vcpu_cp15(vcpu, c5_DFSR); + } + +- prepare_fault32(vcpu, PSR_AA32_MODE_ABT | PSR_AA32_A_BIT, vect_offset); ++ prepare_fault32(vcpu, PSR_AA32_MODE_ABT, vect_offset); + + *far = addr; + +diff --git a/virt/kvm/arm/mmio.c b/virt/kvm/arm/mmio.c +index 6af5c91337f2..f274fabb4301 100644 +--- a/virt/kvm/arm/mmio.c ++++ b/virt/kvm/arm/mmio.c +@@ -105,6 +105,9 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) + data = (data ^ mask) - mask; + } + ++ if (!vcpu->arch.mmio_decode.sixty_four) ++ data = data & 0xffffffff; ++ + trace_kvm_mmio(KVM_TRACE_MMIO_READ, len, run->mmio.phys_addr, + &data); + data = vcpu_data_host_to_guest(vcpu, data, len); +@@ -125,6 +128,7 @@ static int decode_hsr(struct kvm_vcpu *vcpu, bool *is_write, int *len) + unsigned long rt; + int access_size; + bool sign_extend; ++ bool sixty_four; + + if (kvm_vcpu_dabt_iss1tw(vcpu)) { + /* page table accesses IO mem: tell guest to fix its TTBR */ +@@ -138,11 +142,13 @@ static int decode_hsr(struct kvm_vcpu *vcpu, bool *is_write, int *len) + + *is_write = kvm_vcpu_dabt_iswrite(vcpu); + sign_extend = kvm_vcpu_dabt_issext(vcpu); ++ sixty_four = kvm_vcpu_dabt_issf(vcpu); + rt = kvm_vcpu_dabt_get_rd(vcpu); + + *len = access_size; + vcpu->arch.mmio_decode.sign_extend = sign_extend; + vcpu->arch.mmio_decode.rt = rt; ++ vcpu->arch.mmio_decode.sixty_four = sixty_four; + + return 0; + } +diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c +index 35305d6e68cc..d8ef708a2ef6 100644 +--- a/virt/kvm/async_pf.c ++++ b/virt/kvm/async_pf.c +@@ -64,7 +64,7 @@ static void async_pf_execute(struct work_struct *work) + struct mm_struct *mm = apf->mm; + struct kvm_vcpu *vcpu = apf->vcpu; + unsigned long addr = apf->addr; +- gva_t gva = apf->gva; ++ gpa_t cr2_or_gpa = apf->cr2_or_gpa; + int locked = 1; + + might_sleep(); +@@ -92,7 +92,7 @@ static void async_pf_execute(struct work_struct *work) + * this point + */ + +- trace_kvm_async_pf_completed(addr, gva); ++ trace_kvm_async_pf_completed(addr, cr2_or_gpa); + + if (swq_has_sleeper(&vcpu->wq)) + swake_up_one(&vcpu->wq); +@@ -165,8 +165,8 @@ void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu) + } + } + +-int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, +- struct kvm_arch_async_pf *arch) ++int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, ++ unsigned long hva, struct kvm_arch_async_pf *arch) + { + struct kvm_async_pf *work; + +@@ -185,7 +185,7 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, + + work->wakeup_all = false; + work->vcpu = vcpu; +- work->gva = gva; ++ work->cr2_or_gpa = cr2_or_gpa; + work->addr = hva; + work->arch = *arch; + work->mm = current->mm; +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index 13efc291b1c7..b5ea1bafe513 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -1394,14 +1394,14 @@ bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn) + } + EXPORT_SYMBOL_GPL(kvm_is_visible_gfn); + +-unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn) ++unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn) + { + struct vm_area_struct *vma; + unsigned long addr, size; + + size = PAGE_SIZE; + +- addr = gfn_to_hva(kvm, gfn); ++ addr = kvm_vcpu_gfn_to_hva_prot(vcpu, gfn, NULL); + if (kvm_is_error_hva(addr)) + return PAGE_SIZE; + +@@ -1809,26 +1809,72 @@ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) + } + EXPORT_SYMBOL_GPL(gfn_to_page); + +-static int __kvm_map_gfn(struct kvm_memory_slot *slot, gfn_t gfn, +- struct kvm_host_map *map) ++void kvm_release_pfn(kvm_pfn_t pfn, bool dirty, struct gfn_to_pfn_cache *cache) ++{ ++ if (pfn == 0) ++ return; ++ ++ if (cache) ++ cache->pfn = cache->gfn = 0; ++ ++ if (dirty) ++ kvm_release_pfn_dirty(pfn); ++ else ++ kvm_release_pfn_clean(pfn); ++} ++ ++static void kvm_cache_gfn_to_pfn(struct kvm_memory_slot *slot, gfn_t gfn, ++ struct gfn_to_pfn_cache *cache, u64 gen) ++{ ++ kvm_release_pfn(cache->pfn, cache->dirty, cache); ++ ++ cache->pfn = gfn_to_pfn_memslot(slot, gfn); ++ cache->gfn = gfn; ++ cache->dirty = false; ++ cache->generation = gen; ++} ++ ++static int __kvm_map_gfn(struct kvm_memslots *slots, gfn_t gfn, ++ struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, ++ bool atomic) + { + kvm_pfn_t pfn; + void *hva = NULL; + struct page *page = KVM_UNMAPPED_PAGE; ++ struct kvm_memory_slot *slot = __gfn_to_memslot(slots, gfn); ++ u64 gen = slots->generation; + + if (!map) + return -EINVAL; + +- pfn = gfn_to_pfn_memslot(slot, gfn); ++ if (cache) { ++ if (!cache->pfn || cache->gfn != gfn || ++ cache->generation != gen) { ++ if (atomic) ++ return -EAGAIN; ++ kvm_cache_gfn_to_pfn(slot, gfn, cache, gen); ++ } ++ pfn = cache->pfn; ++ } else { ++ if (atomic) ++ return -EAGAIN; ++ pfn = gfn_to_pfn_memslot(slot, gfn); ++ } + if (is_error_noslot_pfn(pfn)) + return -EINVAL; + + if (pfn_valid(pfn)) { + page = pfn_to_page(pfn); +- hva = kmap(page); ++ if (atomic) ++ hva = kmap_atomic(page); ++ else ++ hva = kmap(page); + #ifdef CONFIG_HAS_IOMEM +- } else { ++ } else if (!atomic) { + hva = memremap(pfn_to_hpa(pfn), PAGE_SIZE, MEMREMAP_WB); ++ } else { ++ return -EINVAL; + #endif + } + +@@ -1843,14 +1889,25 @@ static int __kvm_map_gfn(struct kvm_memory_slot *slot, gfn_t gfn, + return 0; + } + ++int kvm_map_gfn(struct kvm_vcpu *vcpu, gfn_t gfn, struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, bool atomic) ++{ ++ return __kvm_map_gfn(kvm_memslots(vcpu->kvm), gfn, map, ++ cache, atomic); ++} ++EXPORT_SYMBOL_GPL(kvm_map_gfn); ++ + int kvm_vcpu_map(struct kvm_vcpu *vcpu, gfn_t gfn, struct kvm_host_map *map) + { +- return __kvm_map_gfn(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn, map); ++ return __kvm_map_gfn(kvm_vcpu_memslots(vcpu), gfn, map, ++ NULL, false); + } + EXPORT_SYMBOL_GPL(kvm_vcpu_map); + +-void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, +- bool dirty) ++static void __kvm_unmap_gfn(struct kvm_memory_slot *memslot, ++ struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, ++ bool dirty, bool atomic) + { + if (!map) + return; +@@ -1858,23 +1915,45 @@ void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, + if (!map->hva) + return; + +- if (map->page != KVM_UNMAPPED_PAGE) +- kunmap(map->page); ++ if (map->page != KVM_UNMAPPED_PAGE) { ++ if (atomic) ++ kunmap_atomic(map->hva); ++ else ++ kunmap(map->page); ++ } + #ifdef CONFIG_HAS_IOMEM +- else ++ else if (!atomic) + memunmap(map->hva); ++ else ++ WARN_ONCE(1, "Unexpected unmapping in atomic context"); + #endif + +- if (dirty) { +- kvm_vcpu_mark_page_dirty(vcpu, map->gfn); +- kvm_release_pfn_dirty(map->pfn); +- } else { +- kvm_release_pfn_clean(map->pfn); +- } ++ if (dirty) ++ mark_page_dirty_in_slot(memslot, map->gfn); ++ ++ if (cache) ++ cache->dirty |= dirty; ++ else ++ kvm_release_pfn(map->pfn, dirty, NULL); + + map->hva = NULL; + map->page = NULL; + } ++ ++int kvm_unmap_gfn(struct kvm_vcpu *vcpu, struct kvm_host_map *map, ++ struct gfn_to_pfn_cache *cache, bool dirty, bool atomic) ++{ ++ __kvm_unmap_gfn(gfn_to_memslot(vcpu->kvm, map->gfn), map, ++ cache, dirty, atomic); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(kvm_unmap_gfn); ++ ++void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty) ++{ ++ __kvm_unmap_gfn(kvm_vcpu_gfn_to_memslot(vcpu, map->gfn), map, NULL, ++ dirty, false); ++} + EXPORT_SYMBOL_GPL(kvm_vcpu_unmap); + + struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn) diff --git a/patch/kernel/sunxi-current/patch-5.4.19-20.patch b/patch/kernel/sunxi-current/patch-5.4.19-20.patch new file mode 100644 index 0000000000..8237f6ad13 --- /dev/null +++ b/patch/kernel/sunxi-current/patch-5.4.19-20.patch @@ -0,0 +1,3553 @@ +diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml +index cc544fdc38be..bc8aed17800d 100644 +--- a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml ++++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml +@@ -85,7 +85,7 @@ properties: + Must be the device tree identifier of the over-sampling + mode pins. As the line is active high, it should be marked + GPIO_ACTIVE_HIGH. +- maxItems: 1 ++ maxItems: 3 + + adi,sw-mode: + description: +@@ -128,9 +128,9 @@ examples: + adi,conversion-start-gpios = <&gpio 17 GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio 27 GPIO_ACTIVE_HIGH>; + adi,first-data-gpios = <&gpio 22 GPIO_ACTIVE_HIGH>; +- adi,oversampling-ratio-gpios = <&gpio 18 GPIO_ACTIVE_HIGH +- &gpio 23 GPIO_ACTIVE_HIGH +- &gpio 26 GPIO_ACTIVE_HIGH>; ++ adi,oversampling-ratio-gpios = <&gpio 18 GPIO_ACTIVE_HIGH>, ++ <&gpio 23 GPIO_ACTIVE_HIGH>, ++ <&gpio 26 GPIO_ACTIVE_HIGH>; + standby-gpios = <&gpio 24 GPIO_ACTIVE_LOW>; + adi,sw-mode; + }; +diff --git a/Makefile b/Makefile +index 2f55d377f0db..21e58bd54715 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 19 ++SUBLEVEL = 20 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/arc/boot/dts/axs10x_mb.dtsi b/arch/arc/boot/dts/axs10x_mb.dtsi +index 08bcfed6b80f..134cc223ea81 100644 +--- a/arch/arc/boot/dts/axs10x_mb.dtsi ++++ b/arch/arc/boot/dts/axs10x_mb.dtsi +@@ -77,6 +77,7 @@ + interrupt-names = "macirq"; + phy-mode = "rgmii"; + snps,pbl = < 32 >; ++ snps,multicast-filter-bins = <256>; + clocks = <&apbclk>; + clock-names = "stmmaceth"; + max-speed = <100>; +diff --git a/arch/arm/boot/dts/am43xx-clocks.dtsi b/arch/arm/boot/dts/am43xx-clocks.dtsi +index 091356f2a8c1..c726cd8dbdf1 100644 +--- a/arch/arm/boot/dts/am43xx-clocks.dtsi ++++ b/arch/arm/boot/dts/am43xx-clocks.dtsi +@@ -704,6 +704,60 @@ + ti,bit-shift = <8>; + reg = <0x2a48>; + }; ++ ++ clkout1_osc_div_ck: clkout1-osc-div-ck { ++ #clock-cells = <0>; ++ compatible = "ti,divider-clock"; ++ clocks = <&sys_clkin_ck>; ++ ti,bit-shift = <20>; ++ ti,max-div = <4>; ++ reg = <0x4100>; ++ }; ++ ++ clkout1_src2_mux_ck: clkout1-src2-mux-ck { ++ #clock-cells = <0>; ++ compatible = "ti,mux-clock"; ++ clocks = <&clk_rc32k_ck>, <&sysclk_div>, <&dpll_ddr_m2_ck>, ++ <&dpll_per_m2_ck>, <&dpll_disp_m2_ck>, ++ <&dpll_mpu_m2_ck>; ++ reg = <0x4100>; ++ }; ++ ++ clkout1_src2_pre_div_ck: clkout1-src2-pre-div-ck { ++ #clock-cells = <0>; ++ compatible = "ti,divider-clock"; ++ clocks = <&clkout1_src2_mux_ck>; ++ ti,bit-shift = <4>; ++ ti,max-div = <8>; ++ reg = <0x4100>; ++ }; ++ ++ clkout1_src2_post_div_ck: clkout1-src2-post-div-ck { ++ #clock-cells = <0>; ++ compatible = "ti,divider-clock"; ++ clocks = <&clkout1_src2_pre_div_ck>; ++ ti,bit-shift = <8>; ++ ti,max-div = <32>; ++ ti,index-power-of-two; ++ reg = <0x4100>; ++ }; ++ ++ clkout1_mux_ck: clkout1-mux-ck { ++ #clock-cells = <0>; ++ compatible = "ti,mux-clock"; ++ clocks = <&clkout1_osc_div_ck>, <&clk_rc32k_ck>, ++ <&clkout1_src2_post_div_ck>, <&dpll_extdev_m2_ck>; ++ ti,bit-shift = <16>; ++ reg = <0x4100>; ++ }; ++ ++ clkout1_ck: clkout1-ck { ++ #clock-cells = <0>; ++ compatible = "ti,gate-clock"; ++ clocks = <&clkout1_mux_ck>; ++ ti,bit-shift = <23>; ++ reg = <0x4100>; ++ }; + }; + + &prcm { +diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi +index dee9c0c8a096..16c6fd3c4246 100644 +--- a/arch/arm/boot/dts/at91sam9260.dtsi ++++ b/arch/arm/boot/dts/at91sam9260.dtsi +@@ -187,7 +187,7 @@ + usart0 { + pinctrl_usart0: usart0-0 { + atmel,pins = +- ; + }; + +@@ -221,7 +221,7 @@ + usart1 { + pinctrl_usart1: usart1-0 { + atmel,pins = +- ; + }; + +@@ -239,7 +239,7 @@ + usart2 { + pinctrl_usart2: usart2-0 { + atmel,pins = +- ; + }; + +@@ -257,7 +257,7 @@ + usart3 { + pinctrl_usart3: usart3-0 { + atmel,pins = +- ; + }; + +@@ -275,7 +275,7 @@ + uart0 { + pinctrl_uart0: uart0-0 { + atmel,pins = +- ; + }; + }; +@@ -283,7 +283,7 @@ + uart1 { + pinctrl_uart1: uart1-0 { + atmel,pins = +- ; + }; + }; +diff --git a/arch/arm/boot/dts/at91sam9261.dtsi b/arch/arm/boot/dts/at91sam9261.dtsi +index dba025a98527..5ed3d745ac86 100644 +--- a/arch/arm/boot/dts/at91sam9261.dtsi ++++ b/arch/arm/boot/dts/at91sam9261.dtsi +@@ -329,7 +329,7 @@ + usart0 { + pinctrl_usart0: usart0-0 { + atmel,pins = +- , ++ , + ; + }; + +@@ -347,7 +347,7 @@ + usart1 { + pinctrl_usart1: usart1-0 { + atmel,pins = +- , ++ , + ; + }; + +@@ -365,7 +365,7 @@ + usart2 { + pinctrl_usart2: usart2-0 { + atmel,pins = +- , ++ , + ; + }; + +diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi +index 99678abdda93..5c990cfae254 100644 +--- a/arch/arm/boot/dts/at91sam9263.dtsi ++++ b/arch/arm/boot/dts/at91sam9263.dtsi +@@ -183,7 +183,7 @@ + usart0 { + pinctrl_usart0: usart0-0 { + atmel,pins = +- ; + }; + +@@ -201,7 +201,7 @@ + usart1 { + pinctrl_usart1: usart1-0 { + atmel,pins = +- ; + }; + +@@ -219,7 +219,7 @@ + usart2 { + pinctrl_usart2: usart2-0 { + atmel,pins = +- ; + }; + +diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi +index 691c95ea6175..fd179097a4bf 100644 +--- a/arch/arm/boot/dts/at91sam9g45.dtsi ++++ b/arch/arm/boot/dts/at91sam9g45.dtsi +@@ -556,7 +556,7 @@ + usart0 { + pinctrl_usart0: usart0-0 { + atmel,pins = +- ; + }; + +@@ -574,7 +574,7 @@ + usart1 { + pinctrl_usart1: usart1-0 { + atmel,pins = +- ; + }; + +@@ -592,7 +592,7 @@ + usart2 { + pinctrl_usart2: usart2-0 { + atmel,pins = +- ; + }; + +@@ -610,7 +610,7 @@ + usart3 { + pinctrl_usart3: usart3-0 { + atmel,pins = +- ; + }; + +diff --git a/arch/arm/boot/dts/at91sam9rl.dtsi b/arch/arm/boot/dts/at91sam9rl.dtsi +index 8643b7151565..ea024e4b6e09 100644 +--- a/arch/arm/boot/dts/at91sam9rl.dtsi ++++ b/arch/arm/boot/dts/at91sam9rl.dtsi +@@ -682,7 +682,7 @@ + usart0 { + pinctrl_usart0: usart0-0 { + atmel,pins = +- , ++ , + ; + }; + +@@ -721,7 +721,7 @@ + usart1 { + pinctrl_usart1: usart1-0 { + atmel,pins = +- , ++ , + ; + }; + +@@ -744,7 +744,7 @@ + usart2 { + pinctrl_usart2: usart2-0 { + atmel,pins = +- , ++ , + ; + }; + +@@ -767,7 +767,7 @@ + usart3 { + pinctrl_usart3: usart3-0 { + atmel,pins = +- , ++ , + ; + }; + +diff --git a/arch/arm/boot/dts/meson8.dtsi b/arch/arm/boot/dts/meson8.dtsi +index 3c534cd50ee3..db2033f674c6 100644 +--- a/arch/arm/boot/dts/meson8.dtsi ++++ b/arch/arm/boot/dts/meson8.dtsi +@@ -129,8 +129,8 @@ + gpu_opp_table: gpu-opp-table { + compatible = "operating-points-v2"; + +- opp-182150000 { +- opp-hz = /bits/ 64 <182150000>; ++ opp-182142857 { ++ opp-hz = /bits/ 64 <182142857>; + opp-microvolt = <1150000>; + }; + opp-318750000 { +diff --git a/arch/arm/boot/dts/meson8b.dtsi b/arch/arm/boot/dts/meson8b.dtsi +index 099bf8e711c9..1e8c5d7bc824 100644 +--- a/arch/arm/boot/dts/meson8b.dtsi ++++ b/arch/arm/boot/dts/meson8b.dtsi +@@ -125,8 +125,8 @@ + opp-hz = /bits/ 64 <255000000>; + opp-microvolt = <1100000>; + }; +- opp-364300000 { +- opp-hz = /bits/ 64 <364300000>; ++ opp-364285714 { ++ opp-hz = /bits/ 64 <364285714>; + opp-microvolt = <1100000>; + }; + opp-425000000 { +diff --git a/arch/arm/boot/dts/sama5d3.dtsi b/arch/arm/boot/dts/sama5d3.dtsi +index f770aace0efd..203d40be70a5 100644 +--- a/arch/arm/boot/dts/sama5d3.dtsi ++++ b/arch/arm/boot/dts/sama5d3.dtsi +@@ -1188,49 +1188,49 @@ + usart0_clk: usart0_clk { + #clock-cells = <0>; + reg = <12>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + usart1_clk: usart1_clk { + #clock-cells = <0>; + reg = <13>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + usart2_clk: usart2_clk { + #clock-cells = <0>; + reg = <14>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + usart3_clk: usart3_clk { + #clock-cells = <0>; + reg = <15>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + uart0_clk: uart0_clk { + #clock-cells = <0>; + reg = <16>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + twi0_clk: twi0_clk { + reg = <18>; + #clock-cells = <0>; +- atmel,clk-output-range = <0 16625000>; ++ atmel,clk-output-range = <0 41500000>; + }; + + twi1_clk: twi1_clk { + #clock-cells = <0>; + reg = <19>; +- atmel,clk-output-range = <0 16625000>; ++ atmel,clk-output-range = <0 41500000>; + }; + + twi2_clk: twi2_clk { + #clock-cells = <0>; + reg = <20>; +- atmel,clk-output-range = <0 16625000>; ++ atmel,clk-output-range = <0 41500000>; + }; + + mci0_clk: mci0_clk { +@@ -1246,19 +1246,19 @@ + spi0_clk: spi0_clk { + #clock-cells = <0>; + reg = <24>; +- atmel,clk-output-range = <0 133000000>; ++ atmel,clk-output-range = <0 166000000>; + }; + + spi1_clk: spi1_clk { + #clock-cells = <0>; + reg = <25>; +- atmel,clk-output-range = <0 133000000>; ++ atmel,clk-output-range = <0 166000000>; + }; + + tcb0_clk: tcb0_clk { + #clock-cells = <0>; + reg = <26>; +- atmel,clk-output-range = <0 133000000>; ++ atmel,clk-output-range = <0 166000000>; + }; + + pwm_clk: pwm_clk { +@@ -1269,7 +1269,7 @@ + adc_clk: adc_clk { + #clock-cells = <0>; + reg = <29>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + dma0_clk: dma0_clk { +@@ -1300,13 +1300,13 @@ + ssc0_clk: ssc0_clk { + #clock-cells = <0>; + reg = <38>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + ssc1_clk: ssc1_clk { + #clock-cells = <0>; + reg = <39>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + sha_clk: sha_clk { +diff --git a/arch/arm/boot/dts/sama5d3_can.dtsi b/arch/arm/boot/dts/sama5d3_can.dtsi +index cf06a018ed0f..2470dd3fff25 100644 +--- a/arch/arm/boot/dts/sama5d3_can.dtsi ++++ b/arch/arm/boot/dts/sama5d3_can.dtsi +@@ -36,13 +36,13 @@ + can0_clk: can0_clk { + #clock-cells = <0>; + reg = <40>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + can1_clk: can1_clk { + #clock-cells = <0>; + reg = <41>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + }; + }; +diff --git a/arch/arm/boot/dts/sama5d3_tcb1.dtsi b/arch/arm/boot/dts/sama5d3_tcb1.dtsi +index 1584035daf51..215802b8db30 100644 +--- a/arch/arm/boot/dts/sama5d3_tcb1.dtsi ++++ b/arch/arm/boot/dts/sama5d3_tcb1.dtsi +@@ -22,6 +22,7 @@ + tcb1_clk: tcb1_clk { + #clock-cells = <0>; + reg = <27>; ++ atmel,clk-output-range = <0 166000000>; + }; + }; + }; +diff --git a/arch/arm/boot/dts/sama5d3_uart.dtsi b/arch/arm/boot/dts/sama5d3_uart.dtsi +index 4316bdbdc25d..cb62adbd28ed 100644 +--- a/arch/arm/boot/dts/sama5d3_uart.dtsi ++++ b/arch/arm/boot/dts/sama5d3_uart.dtsi +@@ -41,13 +41,13 @@ + uart0_clk: uart0_clk { + #clock-cells = <0>; + reg = <16>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + + uart1_clk: uart1_clk { + #clock-cells = <0>; + reg = <17>; +- atmel,clk-output-range = <0 66000000>; ++ atmel,clk-output-range = <0 83000000>; + }; + }; + }; +diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c +index d5af6aedc02c..52665f30d236 100644 +--- a/arch/arm/mach-at91/pm.c ++++ b/arch/arm/mach-at91/pm.c +@@ -691,6 +691,12 @@ static void __init at91_pm_use_default_mode(int pm_mode) + soc_pm.data.suspend_mode = AT91_PM_ULP0; + } + ++static const struct of_device_id atmel_shdwc_ids[] = { ++ { .compatible = "atmel,sama5d2-shdwc" }, ++ { .compatible = "microchip,sam9x60-shdwc" }, ++ { /* sentinel. */ } ++}; ++ + static void __init at91_pm_modes_init(void) + { + struct device_node *np; +@@ -700,7 +706,7 @@ static void __init at91_pm_modes_init(void) + !at91_is_pm_mode_active(AT91_PM_ULP1)) + return; + +- np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-shdwc"); ++ np = of_find_matching_node(NULL, atmel_shdwc_ids); + if (!np) { + pr_warn("%s: failed to find shdwc!\n", __func__); + goto ulp1_default; +@@ -751,6 +757,7 @@ static const struct of_device_id atmel_pmc_ids[] __initconst = { + { .compatible = "atmel,sama5d3-pmc", .data = &pmc_infos[1] }, + { .compatible = "atmel,sama5d4-pmc", .data = &pmc_infos[1] }, + { .compatible = "atmel,sama5d2-pmc", .data = &pmc_infos[1] }, ++ { .compatible = "microchip,sam9x60-pmc", .data = &pmc_infos[1] }, + { /* sentinel */ }, + }; + +diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c +index b4be3baa83d4..6f19ba53fd1f 100644 +--- a/arch/arm/mm/init.c ++++ b/arch/arm/mm/init.c +@@ -323,7 +323,7 @@ static inline void poison_init_mem(void *s, size_t count) + *p++ = 0xe7fddef0; + } + +-static inline void ++static inline void __init + free_memmap(unsigned long start_pfn, unsigned long end_pfn) + { + struct page *start_pg, *end_pg; +diff --git a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts +index bd4aab6092e0..e31813a4f972 100644 +--- a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts ++++ b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts +@@ -143,6 +143,7 @@ + phy-mode = "sgmii"; + status = "okay"; + managed = "in-band-status"; ++ phys = <&comphy1 0>; + sfp = <&sfp_eth0>; + }; + +@@ -150,11 +151,14 @@ + phy-mode = "sgmii"; + status = "okay"; + managed = "in-band-status"; ++ phys = <&comphy0 1>; + sfp = <&sfp_eth1>; + }; + + &usb3 { + status = "okay"; ++ phys = <&usb2_utmi_otg_phy>; ++ phy-names = "usb2-utmi-otg-phy"; + }; + + &uart0 { +diff --git a/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts b/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts +index bd881497b872..a211a046b2f2 100644 +--- a/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts ++++ b/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts +@@ -408,6 +408,8 @@ + reg = <5>; + label = "cpu"; + ethernet = <&cp1_eth2>; ++ phy-mode = "2500base-x"; ++ managed = "in-band-status"; + }; + }; + +diff --git a/arch/arm64/boot/dts/qcom/msm8998.dtsi b/arch/arm64/boot/dts/qcom/msm8998.dtsi +index ffb64fc239ee..ccd535edbf4e 100644 +--- a/arch/arm64/boot/dts/qcom/msm8998.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8998.dtsi +@@ -985,7 +985,7 @@ + + tcsr_mutex_regs: syscon@1f40000 { + compatible = "syscon"; +- reg = <0x01f40000 0x20000>; ++ reg = <0x01f40000 0x40000>; + }; + + tlmm: pinctrl@3400000 { +diff --git a/arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts b/arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts +index b38f9d442fc0..e6d700f8c194 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts ++++ b/arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts +@@ -636,7 +636,6 @@ + /* audio_clkout0/1/2/3 */ + #clock-cells = <1>; + clock-frequency = <12288000 11289600>; +- clkout-lr-synchronous; + + status = "okay"; + +diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c +index 80f459ad0190..f400cb29b811 100644 +--- a/arch/arm64/kernel/cpufeature.c ++++ b/arch/arm64/kernel/cpufeature.c +@@ -32,9 +32,7 @@ static unsigned long elf_hwcap __read_mostly; + #define COMPAT_ELF_HWCAP_DEFAULT \ + (COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\ + COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\ +- COMPAT_HWCAP_TLS|COMPAT_HWCAP_VFP|\ +- COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\ +- COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV|\ ++ COMPAT_HWCAP_TLS|COMPAT_HWCAP_IDIV|\ + COMPAT_HWCAP_LPAE) + unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT; + unsigned int compat_elf_hwcap2 __read_mostly; +@@ -1367,7 +1365,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = { + { + /* FP/SIMD is not implemented */ + .capability = ARM64_HAS_NO_FPSIMD, +- .type = ARM64_CPUCAP_SYSTEM_FEATURE, ++ .type = ARM64_CPUCAP_BOOT_RESTRICTED_CPU_LOCAL_FEATURE, + .min_field_value = 0, + .matches = has_no_fpsimd, + }, +@@ -1595,6 +1593,12 @@ static const struct arm64_cpu_capabilities arm64_features[] = { + .match_list = list, \ + } + ++#define HWCAP_CAP_MATCH(match, cap_type, cap) \ ++ { \ ++ __HWCAP_CAP(#cap, cap_type, cap) \ ++ .matches = match, \ ++ } ++ + #ifdef CONFIG_ARM64_PTR_AUTH + static const struct arm64_cpu_capabilities ptr_auth_hwcap_addr_matches[] = { + { +@@ -1668,8 +1672,35 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = { + {}, + }; + ++#ifdef CONFIG_COMPAT ++static bool compat_has_neon(const struct arm64_cpu_capabilities *cap, int scope) ++{ ++ /* ++ * Check that all of MVFR1_EL1.{SIMDSP, SIMDInt, SIMDLS} are available, ++ * in line with that of arm32 as in vfp_init(). We make sure that the ++ * check is future proof, by making sure value is non-zero. ++ */ ++ u32 mvfr1; ++ ++ WARN_ON(scope == SCOPE_LOCAL_CPU && preemptible()); ++ if (scope == SCOPE_SYSTEM) ++ mvfr1 = read_sanitised_ftr_reg(SYS_MVFR1_EL1); ++ else ++ mvfr1 = read_sysreg_s(SYS_MVFR1_EL1); ++ ++ return cpuid_feature_extract_unsigned_field(mvfr1, MVFR1_SIMDSP_SHIFT) && ++ cpuid_feature_extract_unsigned_field(mvfr1, MVFR1_SIMDINT_SHIFT) && ++ cpuid_feature_extract_unsigned_field(mvfr1, MVFR1_SIMDLS_SHIFT); ++} ++#endif ++ + static const struct arm64_cpu_capabilities compat_elf_hwcaps[] = { + #ifdef CONFIG_COMPAT ++ HWCAP_CAP_MATCH(compat_has_neon, CAP_COMPAT_HWCAP, COMPAT_HWCAP_NEON), ++ HWCAP_CAP(SYS_MVFR1_EL1, MVFR1_SIMDFMAC_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv4), ++ /* Arm v8 mandates MVFR0.FPDP == {0, 2}. So, piggy back on this for the presence of VFP support */ ++ HWCAP_CAP(SYS_MVFR0_EL1, MVFR0_FPDP_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFP), ++ HWCAP_CAP(SYS_MVFR0_EL1, MVFR0_FPDP_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv3), + HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL), + HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES), + HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA1_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA1), +diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c +index 37d3912cfe06..1765e5284994 100644 +--- a/arch/arm64/kernel/fpsimd.c ++++ b/arch/arm64/kernel/fpsimd.c +@@ -269,6 +269,7 @@ static void sve_free(struct task_struct *task) + */ + static void task_fpsimd_load(void) + { ++ WARN_ON(!system_supports_fpsimd()); + WARN_ON(!have_cpu_fpsimd_context()); + + if (system_supports_sve() && test_thread_flag(TIF_SVE)) +@@ -289,6 +290,7 @@ static void fpsimd_save(void) + this_cpu_ptr(&fpsimd_last_state); + /* set by fpsimd_bind_task_to_cpu() or fpsimd_bind_state_to_cpu() */ + ++ WARN_ON(!system_supports_fpsimd()); + WARN_ON(!have_cpu_fpsimd_context()); + + if (!test_thread_flag(TIF_FOREIGN_FPSTATE)) { +@@ -1092,6 +1094,7 @@ void fpsimd_bind_task_to_cpu(void) + struct fpsimd_last_state_struct *last = + this_cpu_ptr(&fpsimd_last_state); + ++ WARN_ON(!system_supports_fpsimd()); + last->st = ¤t->thread.uw.fpsimd_state; + last->sve_state = current->thread.sve_state; + last->sve_vl = current->thread.sve_vl; +@@ -1114,6 +1117,7 @@ void fpsimd_bind_state_to_cpu(struct user_fpsimd_state *st, void *sve_state, + struct fpsimd_last_state_struct *last = + this_cpu_ptr(&fpsimd_last_state); + ++ WARN_ON(!system_supports_fpsimd()); + WARN_ON(!in_softirq() && !irqs_disabled()); + + last->st = st; +@@ -1128,8 +1132,19 @@ void fpsimd_bind_state_to_cpu(struct user_fpsimd_state *st, void *sve_state, + */ + void fpsimd_restore_current_state(void) + { +- if (!system_supports_fpsimd()) ++ /* ++ * For the tasks that were created before we detected the absence of ++ * FP/SIMD, the TIF_FOREIGN_FPSTATE could be set via fpsimd_thread_switch(), ++ * e.g, init. This could be then inherited by the children processes. ++ * If we later detect that the system doesn't support FP/SIMD, ++ * we must clear the flag for all the tasks to indicate that the ++ * FPSTATE is clean (as we can't have one) to avoid looping for ever in ++ * do_notify_resume(). ++ */ ++ if (!system_supports_fpsimd()) { ++ clear_thread_flag(TIF_FOREIGN_FPSTATE); + return; ++ } + + get_cpu_fpsimd_context(); + +@@ -1148,7 +1163,7 @@ void fpsimd_restore_current_state(void) + */ + void fpsimd_update_current_state(struct user_fpsimd_state const *state) + { +- if (!system_supports_fpsimd()) ++ if (WARN_ON(!system_supports_fpsimd())) + return; + + get_cpu_fpsimd_context(); +@@ -1179,7 +1194,13 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state) + void fpsimd_flush_task_state(struct task_struct *t) + { + t->thread.fpsimd_cpu = NR_CPUS; +- ++ /* ++ * If we don't support fpsimd, bail out after we have ++ * reset the fpsimd_cpu for this task and clear the ++ * FPSTATE. ++ */ ++ if (!system_supports_fpsimd()) ++ return; + barrier(); + set_tsk_thread_flag(t, TIF_FOREIGN_FPSTATE); + +@@ -1193,6 +1214,7 @@ void fpsimd_flush_task_state(struct task_struct *t) + */ + static void fpsimd_flush_cpu_state(void) + { ++ WARN_ON(!system_supports_fpsimd()); + __this_cpu_write(fpsimd_last_state.st, NULL); + set_thread_flag(TIF_FOREIGN_FPSTATE); + } +@@ -1203,6 +1225,8 @@ static void fpsimd_flush_cpu_state(void) + */ + void fpsimd_save_and_flush_cpu_state(void) + { ++ if (!system_supports_fpsimd()) ++ return; + WARN_ON(preemptible()); + __get_cpu_fpsimd_context(); + fpsimd_save(); +diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c +index 21176d02e21a..9168c4f1a37f 100644 +--- a/arch/arm64/kernel/ptrace.c ++++ b/arch/arm64/kernel/ptrace.c +@@ -615,6 +615,13 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset, + return 0; + } + ++static int fpr_active(struct task_struct *target, const struct user_regset *regset) ++{ ++ if (!system_supports_fpsimd()) ++ return -ENODEV; ++ return regset->n; ++} ++ + /* + * TODO: update fp accessors for lazy context switching (sync/flush hwstate) + */ +@@ -637,6 +644,9 @@ static int fpr_get(struct task_struct *target, const struct user_regset *regset, + unsigned int pos, unsigned int count, + void *kbuf, void __user *ubuf) + { ++ if (!system_supports_fpsimd()) ++ return -EINVAL; ++ + if (target == current) + fpsimd_preserve_current_state(); + +@@ -676,6 +686,9 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset, + { + int ret; + ++ if (!system_supports_fpsimd()) ++ return -EINVAL; ++ + ret = __fpr_set(target, regset, pos, count, kbuf, ubuf, 0); + if (ret) + return ret; +@@ -1134,6 +1147,7 @@ static const struct user_regset aarch64_regsets[] = { + */ + .size = sizeof(u32), + .align = sizeof(u32), ++ .active = fpr_active, + .get = fpr_get, + .set = fpr_set + }, +@@ -1348,6 +1362,9 @@ static int compat_vfp_get(struct task_struct *target, + compat_ulong_t fpscr; + int ret, vregs_end_pos; + ++ if (!system_supports_fpsimd()) ++ return -EINVAL; ++ + uregs = &target->thread.uw.fpsimd_state; + + if (target == current) +@@ -1381,6 +1398,9 @@ static int compat_vfp_set(struct task_struct *target, + compat_ulong_t fpscr; + int ret, vregs_end_pos; + ++ if (!system_supports_fpsimd()) ++ return -EINVAL; ++ + uregs = &target->thread.uw.fpsimd_state; + + vregs_end_pos = VFP_STATE_SIZE - sizeof(compat_ulong_t); +@@ -1438,6 +1458,7 @@ static const struct user_regset aarch32_regsets[] = { + .n = VFP_STATE_SIZE / sizeof(compat_ulong_t), + .size = sizeof(compat_ulong_t), + .align = sizeof(compat_ulong_t), ++ .active = fpr_active, + .get = compat_vfp_get, + .set = compat_vfp_set + }, +diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c +index 799e84a40335..d76a3d39b269 100644 +--- a/arch/arm64/kvm/hyp/switch.c ++++ b/arch/arm64/kvm/hyp/switch.c +@@ -28,7 +28,15 @@ + /* Check whether the FP regs were dirtied while in the host-side run loop: */ + static bool __hyp_text update_fp_enabled(struct kvm_vcpu *vcpu) + { +- if (vcpu->arch.host_thread_info->flags & _TIF_FOREIGN_FPSTATE) ++ /* ++ * When the system doesn't support FP/SIMD, we cannot rely on ++ * the _TIF_FOREIGN_FPSTATE flag. However, we always inject an ++ * abort on the very first access to FP and thus we should never ++ * see KVM_ARM64_FP_ENABLED. For added safety, make sure we always ++ * trap the accesses. ++ */ ++ if (!system_supports_fpsimd() || ++ vcpu->arch.host_thread_info->flags & _TIF_FOREIGN_FPSTATE) + vcpu->arch.flags &= ~(KVM_ARM64_FP_ENABLED | + KVM_ARM64_FP_HOST); + +diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug +index c59920920ddc..b915fe658979 100644 +--- a/arch/powerpc/Kconfig.debug ++++ b/arch/powerpc/Kconfig.debug +@@ -371,7 +371,7 @@ config PPC_PTDUMP + + config PPC_DEBUG_WX + bool "Warn on W+X mappings at boot" +- depends on PPC_PTDUMP ++ depends on PPC_PTDUMP && STRICT_KERNEL_RWX + help + Generate a warning if any W+X mappings are found at boot. + +diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c +index 8ec5dfb65b2e..784cae9f5697 100644 +--- a/arch/powerpc/mm/pgtable_32.c ++++ b/arch/powerpc/mm/pgtable_32.c +@@ -221,6 +221,7 @@ void mark_rodata_ro(void) + + if (v_block_mapped((unsigned long)_sinittext)) { + mmu_mark_rodata_ro(); ++ ptdump_check_wx(); + return; + } + +diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c +index 6ba081dd61c9..b4ce9d472dfe 100644 +--- a/arch/powerpc/platforms/pseries/iommu.c ++++ b/arch/powerpc/platforms/pseries/iommu.c +@@ -36,7 +36,6 @@ + #include + #include + #include +-#include + + #include "pseries.h" + +@@ -133,10 +132,10 @@ static unsigned long tce_get_pseries(struct iommu_table *tbl, long index) + return be64_to_cpu(*tcep); + } + +-static void tce_free_pSeriesLP(struct iommu_table*, long, long); ++static void tce_free_pSeriesLP(unsigned long liobn, long, long); + static void tce_freemulti_pSeriesLP(struct iommu_table*, long, long); + +-static int tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, ++static int tce_build_pSeriesLP(unsigned long liobn, long tcenum, long tceshift, + long npages, unsigned long uaddr, + enum dma_data_direction direction, + unsigned long attrs) +@@ -147,25 +146,25 @@ static int tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, + int ret = 0; + long tcenum_start = tcenum, npages_start = npages; + +- rpn = __pa(uaddr) >> TCE_SHIFT; ++ rpn = __pa(uaddr) >> tceshift; + proto_tce = TCE_PCI_READ; + if (direction != DMA_TO_DEVICE) + proto_tce |= TCE_PCI_WRITE; + + while (npages--) { +- tce = proto_tce | (rpn & TCE_RPN_MASK) << TCE_RPN_SHIFT; +- rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, tce); ++ tce = proto_tce | (rpn & TCE_RPN_MASK) << tceshift; ++ rc = plpar_tce_put((u64)liobn, (u64)tcenum << tceshift, tce); + + if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) { + ret = (int)rc; +- tce_free_pSeriesLP(tbl, tcenum_start, ++ tce_free_pSeriesLP(liobn, tcenum_start, + (npages_start - (npages + 1))); + break; + } + + if (rc && printk_ratelimit()) { + printk("tce_build_pSeriesLP: plpar_tce_put failed. rc=%lld\n", rc); +- printk("\tindex = 0x%llx\n", (u64)tbl->it_index); ++ printk("\tindex = 0x%llx\n", (u64)liobn); + printk("\ttcenum = 0x%llx\n", (u64)tcenum); + printk("\ttce val = 0x%llx\n", tce ); + dump_stack(); +@@ -194,7 +193,8 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + unsigned long flags; + + if ((npages == 1) || !firmware_has_feature(FW_FEATURE_MULTITCE)) { +- return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, ++ return tce_build_pSeriesLP(tbl->it_index, tcenum, ++ tbl->it_page_shift, npages, uaddr, + direction, attrs); + } + +@@ -210,8 +210,9 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + /* If allocation fails, fall back to the loop implementation */ + if (!tcep) { + local_irq_restore(flags); +- return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, +- direction, attrs); ++ return tce_build_pSeriesLP(tbl->it_index, tcenum, ++ tbl->it_page_shift, ++ npages, uaddr, direction, attrs); + } + __this_cpu_write(tce_page, tcep); + } +@@ -262,16 +263,16 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + return ret; + } + +-static void tce_free_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages) ++static void tce_free_pSeriesLP(unsigned long liobn, long tcenum, long npages) + { + u64 rc; + + while (npages--) { +- rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, 0); ++ rc = plpar_tce_put((u64)liobn, (u64)tcenum << 12, 0); + + if (rc && printk_ratelimit()) { + printk("tce_free_pSeriesLP: plpar_tce_put failed. rc=%lld\n", rc); +- printk("\tindex = 0x%llx\n", (u64)tbl->it_index); ++ printk("\tindex = 0x%llx\n", (u64)liobn); + printk("\ttcenum = 0x%llx\n", (u64)tcenum); + dump_stack(); + } +@@ -286,7 +287,7 @@ static void tce_freemulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long n + u64 rc; + + if (!firmware_has_feature(FW_FEATURE_MULTITCE)) +- return tce_free_pSeriesLP(tbl, tcenum, npages); ++ return tce_free_pSeriesLP(tbl->it_index, tcenum, npages); + + rc = plpar_tce_stuff((u64)tbl->it_index, (u64)tcenum << 12, 0, npages); + +@@ -401,6 +402,19 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn, + u64 rc = 0; + long l, limit; + ++ if (!firmware_has_feature(FW_FEATURE_MULTITCE)) { ++ unsigned long tceshift = be32_to_cpu(maprange->tce_shift); ++ unsigned long dmastart = (start_pfn << PAGE_SHIFT) + ++ be64_to_cpu(maprange->dma_base); ++ unsigned long tcenum = dmastart >> tceshift; ++ unsigned long npages = num_pfn << PAGE_SHIFT >> tceshift; ++ void *uaddr = __va(start_pfn << PAGE_SHIFT); ++ ++ return tce_build_pSeriesLP(be32_to_cpu(maprange->liobn), ++ tcenum, tceshift, npages, (unsigned long) uaddr, ++ DMA_BIDIRECTIONAL, 0); ++ } ++ + local_irq_disable(); /* to protect tcep and the page behind it */ + tcep = __this_cpu_read(tce_page); + +@@ -1320,15 +1334,7 @@ void iommu_init_early_pSeries(void) + of_reconfig_notifier_register(&iommu_reconfig_nb); + register_memory_notifier(&iommu_mem_nb); + +- /* +- * Secure guest memory is inacessible to devices so regular DMA isn't +- * possible. +- * +- * In that case keep devices' dma_map_ops as NULL so that the generic +- * DMA code path will use SWIOTLB to bounce buffers for DMA. +- */ +- if (!is_secure_guest()) +- set_pci_dma_ops(&dma_iommu_ops); ++ set_pci_dma_ops(&dma_iommu_ops); + } + + static int __init disable_multitce(char *str) +diff --git a/arch/powerpc/platforms/pseries/papr_scm.c b/arch/powerpc/platforms/pseries/papr_scm.c +index ee07d0718bf1..66fd517c4816 100644 +--- a/arch/powerpc/platforms/pseries/papr_scm.c ++++ b/arch/powerpc/platforms/pseries/papr_scm.c +@@ -342,6 +342,7 @@ static int papr_scm_nvdimm_init(struct papr_scm_priv *p) + p->bus = nvdimm_bus_register(NULL, &p->bus_desc); + if (!p->bus) { + dev_err(dev, "Error creating nvdimm bus %pOF\n", p->dn); ++ kfree(p->bus_desc.provider_name); + return -ENXIO; + } + +@@ -498,6 +499,7 @@ static int papr_scm_remove(struct platform_device *pdev) + + nvdimm_bus_unregister(p->bus); + drc_pmem_unbind(p); ++ kfree(p->bus_desc.provider_name); + kfree(p); + + return 0; +diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c +index 79e2287991db..f682b7babc09 100644 +--- a/arch/powerpc/platforms/pseries/vio.c ++++ b/arch/powerpc/platforms/pseries/vio.c +@@ -1176,6 +1176,8 @@ static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev) + if (tbl == NULL) + return NULL; + ++ kref_init(&tbl->it_kref); ++ + of_parse_dma_window(dev->dev.of_node, dma_window, + &tbl->it_index, &offset, &size); + +diff --git a/arch/x86/boot/compressed/acpi.c b/arch/x86/boot/compressed/acpi.c +index 25019d42ae93..ef2ad7253cd5 100644 +--- a/arch/x86/boot/compressed/acpi.c ++++ b/arch/x86/boot/compressed/acpi.c +@@ -393,7 +393,13 @@ int count_immovable_mem_regions(void) + table = table_addr + sizeof(struct acpi_table_srat); + + while (table + sizeof(struct acpi_subtable_header) < table_end) { ++ + sub_table = (struct acpi_subtable_header *)table; ++ if (!sub_table->length) { ++ debug_putstr("Invalid zero length SRAT subtable.\n"); ++ return 0; ++ } ++ + if (sub_table->type == ACPI_SRAT_TYPE_MEMORY_AFFINITY) { + struct acpi_srat_mem_affinity *ma; + +diff --git a/crypto/testmgr.c b/crypto/testmgr.c +index c39e39e55dc2..7473c5bc06b1 100644 +--- a/crypto/testmgr.c ++++ b/crypto/testmgr.c +@@ -2102,6 +2102,7 @@ static void generate_random_aead_testvec(struct aead_request *req, + * If the key or authentication tag size couldn't be set, no need to + * continue to encrypt. + */ ++ vec->crypt_error = 0; + if (vec->setkey_error || vec->setauthsize_error) + goto done; + +@@ -2245,10 +2246,12 @@ static int test_aead_vs_generic_impl(const char *driver, + req, tsgls); + if (err) + goto out; +- err = test_aead_vec_cfg(driver, DECRYPT, &vec, vec_name, cfg, +- req, tsgls); +- if (err) +- goto out; ++ if (vec.crypt_error == 0) { ++ err = test_aead_vec_cfg(driver, DECRYPT, &vec, vec_name, ++ cfg, req, tsgls); ++ if (err) ++ goto out; ++ } + cond_resched(); + } + err = 0; +@@ -2678,6 +2681,15 @@ static void generate_random_cipher_testvec(struct skcipher_request *req, + skcipher_request_set_callback(req, 0, crypto_req_done, &wait); + skcipher_request_set_crypt(req, &src, &dst, vec->len, iv); + vec->crypt_error = crypto_wait_req(crypto_skcipher_encrypt(req), &wait); ++ if (vec->crypt_error != 0) { ++ /* ++ * The only acceptable error here is for an invalid length, so ++ * skcipher decryption should fail with the same error too. ++ * We'll test for this. But to keep the API usage well-defined, ++ * explicitly initialize the ciphertext buffer too. ++ */ ++ memset((u8 *)vec->ctext, 0, vec->len); ++ } + done: + snprintf(name, max_namelen, "\"random: len=%u klen=%u\"", + vec->len, vec->klen); +diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c +index 19f57ccfbe1d..59f911e57719 100644 +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -1488,11 +1488,18 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg, + + WARN_ON(!map->bus); + +- /* Check for unwritable registers before we start */ +- for (i = 0; i < val_len / map->format.val_bytes; i++) +- if (!regmap_writeable(map, +- reg + regmap_get_offset(map, i))) +- return -EINVAL; ++ /* Check for unwritable or noinc registers in range ++ * before we start ++ */ ++ if (!regmap_writeable_noinc(map, reg)) { ++ for (i = 0; i < val_len / map->format.val_bytes; i++) { ++ unsigned int element = ++ reg + regmap_get_offset(map, i); ++ if (!regmap_writeable(map, element) || ++ regmap_writeable_noinc(map, element)) ++ return -EINVAL; ++ } ++ } + + if (!map->cache_bypass && map->format.parse_val) { + unsigned int ival; +diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c +index b3af61cc6fb9..d2760a021301 100644 +--- a/drivers/clk/meson/g12a.c ++++ b/drivers/clk/meson/g12a.c +@@ -4692,6 +4692,7 @@ static struct clk_regmap *const g12a_clk_regmaps[] = { + &g12a_bt656, + &g12a_usb1_to_ddr, + &g12a_mmc_pclk, ++ &g12a_uart2, + &g12a_vpu_intr, + &g12a_gic, + &g12a_sd_emmc_a_clk0, +diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c +index d32626458e67..1f9c16395a3f 100644 +--- a/drivers/crypto/atmel-sha.c ++++ b/drivers/crypto/atmel-sha.c +@@ -1918,12 +1918,7 @@ static int atmel_sha_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, + { + struct atmel_sha_hmac_ctx *hmac = crypto_ahash_ctx(tfm); + +- if (atmel_sha_hmac_key_set(&hmac->hkey, key, keylen)) { +- crypto_ahash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +- return -EINVAL; +- } +- +- return 0; ++ return atmel_sha_hmac_key_set(&hmac->hkey, key, keylen); + } + + static int atmel_sha_hmac_init(struct ahash_request *req) +diff --git a/drivers/crypto/axis/artpec6_crypto.c b/drivers/crypto/axis/artpec6_crypto.c +index 4b20606983a4..22ebe40f09f5 100644 +--- a/drivers/crypto/axis/artpec6_crypto.c ++++ b/drivers/crypto/axis/artpec6_crypto.c +@@ -1251,7 +1251,7 @@ static int artpec6_crypto_aead_set_key(struct crypto_aead *tfm, const u8 *key, + + if (len != 16 && len != 24 && len != 32) { + crypto_aead_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +- return -1; ++ return -EINVAL; + } + + ctx->key_length = len; +diff --git a/drivers/crypto/caam/caamalg_qi2.c b/drivers/crypto/caam/caamalg_qi2.c +index 3443f6d6dd83..6863d7097674 100644 +--- a/drivers/crypto/caam/caamalg_qi2.c ++++ b/drivers/crypto/caam/caamalg_qi2.c +@@ -2481,7 +2481,7 @@ static struct caam_aead_alg driver_aeads[] = { + .cra_name = "echainiv(authenc(hmac(sha256)," + "cbc(des)))", + .cra_driver_name = "echainiv-authenc-" +- "hmac-sha256-cbc-desi-" ++ "hmac-sha256-cbc-des-" + "caam-qi2", + .cra_blocksize = DES_BLOCK_SIZE, + }, +diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c +index a0ee404b736e..f1d149e32839 100644 +--- a/drivers/dma/dma-axi-dmac.c ++++ b/drivers/dma/dma-axi-dmac.c +@@ -830,6 +830,7 @@ static int axi_dmac_probe(struct platform_device *pdev) + struct dma_device *dma_dev; + struct axi_dmac *dmac; + struct resource *res; ++ struct regmap *regmap; + int ret; + + dmac = devm_kzalloc(&pdev->dev, sizeof(*dmac), GFP_KERNEL); +@@ -921,10 +922,17 @@ static int axi_dmac_probe(struct platform_device *pdev) + + platform_set_drvdata(pdev, dmac); + +- devm_regmap_init_mmio(&pdev->dev, dmac->base, &axi_dmac_regmap_config); ++ regmap = devm_regmap_init_mmio(&pdev->dev, dmac->base, ++ &axi_dmac_regmap_config); ++ if (IS_ERR(regmap)) { ++ ret = PTR_ERR(regmap); ++ goto err_free_irq; ++ } + + return 0; + ++err_free_irq: ++ free_irq(dmac->irq, dmac); + err_unregister_of: + of_dma_controller_free(pdev->dev.of_node); + err_unregister_device: +diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c +index 606fa6d86685..1753a9801b70 100644 +--- a/drivers/infiniband/core/addr.c ++++ b/drivers/infiniband/core/addr.c +@@ -139,7 +139,7 @@ int ib_nl_handle_ip_res_resp(struct sk_buff *skb, + if (ib_nl_is_good_ip_resp(nlh)) + ib_nl_process_good_ip_rsep(nlh); + +- return skb->len; ++ return 0; + } + + static int ib_nl_ip_send_msg(struct rdma_dev_addr *dev_addr, +diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c +index 50052e9a1731..9008937f8ed8 100644 +--- a/drivers/infiniband/core/cma.c ++++ b/drivers/infiniband/core/cma.c +@@ -3091,6 +3091,7 @@ static int cma_resolve_loopback(struct rdma_id_private *id_priv) + rdma_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid); + rdma_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid); + ++ atomic_inc(&id_priv->refcount); + cma_init_resolve_addr_work(work, id_priv); + queue_work(cma_wq, &work->work); + return 0; +@@ -3117,6 +3118,7 @@ static int cma_resolve_ib_addr(struct rdma_id_private *id_priv) + rdma_addr_set_dgid(&id_priv->id.route.addr.dev_addr, (union ib_gid *) + &(((struct sockaddr_ib *) &id_priv->id.route.addr.dst_addr)->sib_addr)); + ++ atomic_inc(&id_priv->refcount); + cma_init_resolve_addr_work(work, id_priv); + queue_work(cma_wq, &work->work); + return 0; +diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c +index 17fc2936c077..bddb5434fbed 100644 +--- a/drivers/infiniband/core/sa_query.c ++++ b/drivers/infiniband/core/sa_query.c +@@ -1068,7 +1068,7 @@ int ib_nl_handle_set_timeout(struct sk_buff *skb, + } + + settimeout_out: +- return skb->len; ++ return 0; + } + + static inline int ib_nl_is_good_resolve_resp(const struct nlmsghdr *nlh) +@@ -1139,7 +1139,7 @@ int ib_nl_handle_resolve_resp(struct sk_buff *skb, + } + + resp_out: +- return skb->len; ++ return 0; + } + + static void free_sm_ah(struct kref *kref) +diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c +index 24244a2f68cc..0d42ba8c0b69 100644 +--- a/drivers/infiniband/core/umem.c ++++ b/drivers/infiniband/core/umem.c +@@ -166,10 +166,13 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem, + * for any address. + */ + mask |= (sg_dma_address(sg) + pgoff) ^ va; +- if (i && i != (umem->nmap - 1)) +- /* restrict by length as well for interior SGEs */ +- mask |= sg_dma_len(sg); + va += sg_dma_len(sg) - pgoff; ++ /* Except for the last entry, the ending iova alignment sets ++ * the maximum possible page size as the low bits of the iova ++ * must be zero when starting the next chunk. ++ */ ++ if (i != (umem->nmap - 1)) ++ mask |= va; + pgoff = 0; + } + best_pg_bit = rdma_find_pg_bit(mask, pgsz_bitmap); +diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c +index db98111b47f4..f2a2d1246c19 100644 +--- a/drivers/infiniband/core/uverbs_main.c ++++ b/drivers/infiniband/core/uverbs_main.c +@@ -220,7 +220,6 @@ void ib_uverbs_release_file(struct kref *ref) + } + + static ssize_t ib_uverbs_event_read(struct ib_uverbs_event_queue *ev_queue, +- struct ib_uverbs_file *uverbs_file, + struct file *filp, char __user *buf, + size_t count, loff_t *pos, + size_t eventsz) +@@ -238,19 +237,16 @@ static ssize_t ib_uverbs_event_read(struct ib_uverbs_event_queue *ev_queue, + + if (wait_event_interruptible(ev_queue->poll_wait, + (!list_empty(&ev_queue->event_list) || +- /* The barriers built into wait_event_interruptible() +- * and wake_up() guarentee this will see the null set +- * without using RCU +- */ +- !uverbs_file->device->ib_dev))) ++ ev_queue->is_closed))) + return -ERESTARTSYS; + ++ spin_lock_irq(&ev_queue->lock); ++ + /* If device was disassociated and no event exists set an error */ +- if (list_empty(&ev_queue->event_list) && +- !uverbs_file->device->ib_dev) ++ if (list_empty(&ev_queue->event_list) && ev_queue->is_closed) { ++ spin_unlock_irq(&ev_queue->lock); + return -EIO; +- +- spin_lock_irq(&ev_queue->lock); ++ } + } + + event = list_entry(ev_queue->event_list.next, struct ib_uverbs_event, list); +@@ -285,8 +281,7 @@ static ssize_t ib_uverbs_async_event_read(struct file *filp, char __user *buf, + { + struct ib_uverbs_async_event_file *file = filp->private_data; + +- return ib_uverbs_event_read(&file->ev_queue, file->uverbs_file, filp, +- buf, count, pos, ++ return ib_uverbs_event_read(&file->ev_queue, filp, buf, count, pos, + sizeof(struct ib_uverbs_async_event_desc)); + } + +@@ -296,9 +291,8 @@ static ssize_t ib_uverbs_comp_event_read(struct file *filp, char __user *buf, + struct ib_uverbs_completion_event_file *comp_ev_file = + filp->private_data; + +- return ib_uverbs_event_read(&comp_ev_file->ev_queue, +- comp_ev_file->uobj.ufile, filp, +- buf, count, pos, ++ return ib_uverbs_event_read(&comp_ev_file->ev_queue, filp, buf, count, ++ pos, + sizeof(struct ib_uverbs_comp_event_desc)); + } + +@@ -321,7 +315,9 @@ static __poll_t ib_uverbs_event_poll(struct ib_uverbs_event_queue *ev_queue, + static __poll_t ib_uverbs_async_event_poll(struct file *filp, + struct poll_table_struct *wait) + { +- return ib_uverbs_event_poll(filp->private_data, filp, wait); ++ struct ib_uverbs_async_event_file *file = filp->private_data; ++ ++ return ib_uverbs_event_poll(&file->ev_queue, filp, wait); + } + + static __poll_t ib_uverbs_comp_event_poll(struct file *filp, +@@ -335,9 +331,9 @@ static __poll_t ib_uverbs_comp_event_poll(struct file *filp, + + static int ib_uverbs_async_event_fasync(int fd, struct file *filp, int on) + { +- struct ib_uverbs_event_queue *ev_queue = filp->private_data; ++ struct ib_uverbs_async_event_file *file = filp->private_data; + +- return fasync_helper(fd, filp, on, &ev_queue->async_queue); ++ return fasync_helper(fd, filp, on, &file->ev_queue.async_queue); + } + + static int ib_uverbs_comp_event_fasync(int fd, struct file *filp, int on) +diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c +index d44cf33df81a..238614370927 100644 +--- a/drivers/infiniband/hw/i40iw/i40iw_main.c ++++ b/drivers/infiniband/hw/i40iw/i40iw_main.c +@@ -1225,6 +1225,8 @@ static void i40iw_add_ipv4_addr(struct i40iw_device *iwdev) + const struct in_ifaddr *ifa; + + idev = in_dev_get(dev); ++ if (!idev) ++ continue; + in_dev_for_each_ifa_rtnl(ifa, idev) { + i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_CM, + "IP=%pI4, vlan_id=%d, MAC=%pM\n", &ifa->ifa_address, +diff --git a/drivers/infiniband/hw/mlx4/cm.c b/drivers/infiniband/hw/mlx4/cm.c +index ecd6cadd529a..b591861934b3 100644 +--- a/drivers/infiniband/hw/mlx4/cm.c ++++ b/drivers/infiniband/hw/mlx4/cm.c +@@ -186,23 +186,6 @@ out: + kfree(ent); + } + +-static void id_map_find_del(struct ib_device *ibdev, int pv_cm_id) +-{ +- struct mlx4_ib_sriov *sriov = &to_mdev(ibdev)->sriov; +- struct rb_root *sl_id_map = &sriov->sl_id_map; +- struct id_map_entry *ent, *found_ent; +- +- spin_lock(&sriov->id_map_lock); +- ent = xa_erase(&sriov->pv_id_table, pv_cm_id); +- if (!ent) +- goto out; +- found_ent = id_map_find_by_sl_id(ibdev, ent->slave_id, ent->sl_cm_id); +- if (found_ent && found_ent == ent) +- rb_erase(&found_ent->node, sl_id_map); +-out: +- spin_unlock(&sriov->id_map_lock); +-} +- + static void sl_id_map_add(struct ib_device *ibdev, struct id_map_entry *new) + { + struct rb_root *sl_id_map = &to_mdev(ibdev)->sriov.sl_id_map; +@@ -294,7 +277,7 @@ static void schedule_delayed(struct ib_device *ibdev, struct id_map_entry *id) + spin_lock(&sriov->id_map_lock); + spin_lock_irqsave(&sriov->going_down_lock, flags); + /*make sure that there is no schedule inside the scheduled work.*/ +- if (!sriov->is_going_down) { ++ if (!sriov->is_going_down && !id->scheduled_delete) { + id->scheduled_delete = 1; + schedule_delayed_work(&id->timeout, CM_CLEANUP_CACHE_TIMEOUT); + } +@@ -341,9 +324,6 @@ cont: + + if (mad->mad_hdr.attr_id == CM_DREQ_ATTR_ID) + schedule_delayed(ibdev, id); +- else if (mad->mad_hdr.attr_id == CM_DREP_ATTR_ID) +- id_map_find_del(ibdev, pv_cm_id); +- + return 0; + } + +@@ -382,12 +362,9 @@ int mlx4_ib_demux_cm_handler(struct ib_device *ibdev, int port, int *slave, + *slave = id->slave_id; + set_remote_comm_id(mad, id->sl_cm_id); + +- if (mad->mad_hdr.attr_id == CM_DREQ_ATTR_ID) ++ if (mad->mad_hdr.attr_id == CM_DREQ_ATTR_ID || ++ mad->mad_hdr.attr_id == CM_REJ_ATTR_ID) + schedule_delayed(ibdev, id); +- else if (mad->mad_hdr.attr_id == CM_REJ_ATTR_ID || +- mad->mad_hdr.attr_id == CM_DREP_ATTR_ID) { +- id_map_find_del(ibdev, (int) pv_cm_id); +- } + + return 0; + } +diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c +index 907d99822bf0..369a203332a2 100644 +--- a/drivers/infiniband/hw/mlx4/main.c ++++ b/drivers/infiniband/hw/mlx4/main.c +@@ -246,6 +246,13 @@ static int mlx4_ib_update_gids(struct gid_entry *gids, + return mlx4_ib_update_gids_v1(gids, ibdev, port_num); + } + ++static void free_gid_entry(struct gid_entry *entry) ++{ ++ memset(&entry->gid, 0, sizeof(entry->gid)); ++ kfree(entry->ctx); ++ entry->ctx = NULL; ++} ++ + static int mlx4_ib_add_gid(const struct ib_gid_attr *attr, void **context) + { + struct mlx4_ib_dev *ibdev = to_mdev(attr->device); +@@ -306,6 +313,8 @@ static int mlx4_ib_add_gid(const struct ib_gid_attr *attr, void **context) + GFP_ATOMIC); + if (!gids) { + ret = -ENOMEM; ++ *context = NULL; ++ free_gid_entry(&port_gid_table->gids[free]); + } else { + for (i = 0; i < MLX4_MAX_PORT_GIDS; i++) { + memcpy(&gids[i].gid, &port_gid_table->gids[i].gid, sizeof(union ib_gid)); +@@ -317,6 +326,12 @@ static int mlx4_ib_add_gid(const struct ib_gid_attr *attr, void **context) + + if (!ret && hw_update) { + ret = mlx4_ib_update_gids(gids, ibdev, attr->port_num); ++ if (ret) { ++ spin_lock_bh(&iboe->lock); ++ *context = NULL; ++ free_gid_entry(&port_gid_table->gids[free]); ++ spin_unlock_bh(&iboe->lock); ++ } + kfree(gids); + } + +@@ -346,10 +361,7 @@ static int mlx4_ib_del_gid(const struct ib_gid_attr *attr, void **context) + if (!ctx->refcount) { + unsigned int real_index = ctx->real_index; + +- memset(&port_gid_table->gids[real_index].gid, 0, +- sizeof(port_gid_table->gids[real_index].gid)); +- kfree(port_gid_table->gids[real_index].ctx); +- port_gid_table->gids[real_index].ctx = NULL; ++ free_gid_entry(&port_gid_table->gids[real_index]); + hw_update = 1; + } + } +diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c +index b5960351bec0..8708ed5477e9 100644 +--- a/drivers/infiniband/ulp/srp/ib_srp.c ++++ b/drivers/infiniband/ulp/srp/ib_srp.c +@@ -2536,7 +2536,8 @@ static void srp_cm_rep_handler(struct ib_cm_id *cm_id, + if (lrsp->opcode == SRP_LOGIN_RSP) { + ch->max_ti_iu_len = be32_to_cpu(lrsp->max_ti_iu_len); + ch->req_lim = be32_to_cpu(lrsp->req_lim_delta); +- ch->use_imm_data = lrsp->rsp_flags & SRP_LOGIN_RSP_IMMED_SUPP; ++ ch->use_imm_data = srp_use_imm_data && ++ (lrsp->rsp_flags & SRP_LOGIN_RSP_IMMED_SUPP); + ch->max_it_iu_len = srp_max_it_iu_len(target->cmd_sg_cnt, + ch->use_imm_data); + WARN_ON_ONCE(ch->max_it_iu_len > +diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c +index ed90361b84dc..ee8d48d863e1 100644 +--- a/drivers/iommu/arm-smmu-v3.c ++++ b/drivers/iommu/arm-smmu-v3.c +@@ -856,6 +856,7 @@ static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent) + cmd[1] |= FIELD_PREP(CMDQ_CFGI_1_RANGE, 31); + break; + case CMDQ_OP_TLBI_NH_VA: ++ cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid); + cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_ASID, ent->tlbi.asid); + cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_LEAF, ent->tlbi.leaf); + cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_VA_MASK; +diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c +index be2a2a201603..33ddc5269e8d 100644 +--- a/drivers/md/bcache/journal.c ++++ b/drivers/md/bcache/journal.c +@@ -417,10 +417,14 @@ err: + + /* Journalling */ + ++#define nr_to_fifo_front(p, front_p, mask) (((p) - (front_p)) & (mask)) ++ + static void btree_flush_write(struct cache_set *c) + { + struct btree *b, *t, *btree_nodes[BTREE_FLUSH_NR]; +- unsigned int i, n; ++ unsigned int i, nr, ref_nr; ++ atomic_t *fifo_front_p, *now_fifo_front_p; ++ size_t mask; + + if (c->journal.btree_flushing) + return; +@@ -433,12 +437,50 @@ static void btree_flush_write(struct cache_set *c) + c->journal.btree_flushing = true; + spin_unlock(&c->journal.flush_write_lock); + ++ /* get the oldest journal entry and check its refcount */ ++ spin_lock(&c->journal.lock); ++ fifo_front_p = &fifo_front(&c->journal.pin); ++ ref_nr = atomic_read(fifo_front_p); ++ if (ref_nr <= 0) { ++ /* ++ * do nothing if no btree node references ++ * the oldest journal entry ++ */ ++ spin_unlock(&c->journal.lock); ++ goto out; ++ } ++ spin_unlock(&c->journal.lock); ++ ++ mask = c->journal.pin.mask; ++ nr = 0; + atomic_long_inc(&c->flush_write); + memset(btree_nodes, 0, sizeof(btree_nodes)); +- n = 0; + + mutex_lock(&c->bucket_lock); + list_for_each_entry_safe_reverse(b, t, &c->btree_cache, list) { ++ /* ++ * It is safe to get now_fifo_front_p without holding ++ * c->journal.lock here, because we don't need to know ++ * the exactly accurate value, just check whether the ++ * front pointer of c->journal.pin is changed. ++ */ ++ now_fifo_front_p = &fifo_front(&c->journal.pin); ++ /* ++ * If the oldest journal entry is reclaimed and front ++ * pointer of c->journal.pin changes, it is unnecessary ++ * to scan c->btree_cache anymore, just quit the loop and ++ * flush out what we have already. ++ */ ++ if (now_fifo_front_p != fifo_front_p) ++ break; ++ /* ++ * quit this loop if all matching btree nodes are ++ * scanned and record in btree_nodes[] already. ++ */ ++ ref_nr = atomic_read(fifo_front_p); ++ if (nr >= ref_nr) ++ break; ++ + if (btree_node_journal_flush(b)) + pr_err("BUG: flush_write bit should not be set here!"); + +@@ -454,17 +496,44 @@ static void btree_flush_write(struct cache_set *c) + continue; + } + ++ /* ++ * Only select the btree node which exactly references ++ * the oldest journal entry. ++ * ++ * If the journal entry pointed by fifo_front_p is ++ * reclaimed in parallel, don't worry: ++ * - the list_for_each_xxx loop will quit when checking ++ * next now_fifo_front_p. ++ * - If there are matched nodes recorded in btree_nodes[], ++ * they are clean now (this is why and how the oldest ++ * journal entry can be reclaimed). These selected nodes ++ * will be ignored and skipped in the folowing for-loop. ++ */ ++ if (nr_to_fifo_front(btree_current_write(b)->journal, ++ fifo_front_p, ++ mask) != 0) { ++ mutex_unlock(&b->write_lock); ++ continue; ++ } ++ + set_btree_node_journal_flush(b); + + mutex_unlock(&b->write_lock); + +- btree_nodes[n++] = b; +- if (n == BTREE_FLUSH_NR) ++ btree_nodes[nr++] = b; ++ /* ++ * To avoid holding c->bucket_lock too long time, ++ * only scan for BTREE_FLUSH_NR matched btree nodes ++ * at most. If there are more btree nodes reference ++ * the oldest journal entry, try to flush them next ++ * time when btree_flush_write() is called. ++ */ ++ if (nr == BTREE_FLUSH_NR) + break; + } + mutex_unlock(&c->bucket_lock); + +- for (i = 0; i < n; i++) { ++ for (i = 0; i < nr; i++) { + b = btree_nodes[i]; + if (!b) { + pr_err("BUG: btree_nodes[%d] is NULL", i); +@@ -497,6 +566,7 @@ static void btree_flush_write(struct cache_set *c) + mutex_unlock(&b->write_lock); + } + ++out: + spin_lock(&c->journal.flush_write_lock); + c->journal.btree_flushing = false; + spin_unlock(&c->journal.flush_write_lock); +diff --git a/drivers/media/i2c/adv748x/adv748x.h b/drivers/media/i2c/adv748x/adv748x.h +index 5042f9e94aee..fccb388ce179 100644 +--- a/drivers/media/i2c/adv748x/adv748x.h ++++ b/drivers/media/i2c/adv748x/adv748x.h +@@ -394,10 +394,10 @@ int adv748x_write_block(struct adv748x_state *state, int client_page, + + #define io_read(s, r) adv748x_read(s, ADV748X_PAGE_IO, r) + #define io_write(s, r, v) adv748x_write(s, ADV748X_PAGE_IO, r, v) +-#define io_clrset(s, r, m, v) io_write(s, r, (io_read(s, r) & ~m) | v) ++#define io_clrset(s, r, m, v) io_write(s, r, (io_read(s, r) & ~(m)) | (v)) + + #define hdmi_read(s, r) adv748x_read(s, ADV748X_PAGE_HDMI, r) +-#define hdmi_read16(s, r, m) (((hdmi_read(s, r) << 8) | hdmi_read(s, r+1)) & m) ++#define hdmi_read16(s, r, m) (((hdmi_read(s, r) << 8) | hdmi_read(s, (r)+1)) & (m)) + #define hdmi_write(s, r, v) adv748x_write(s, ADV748X_PAGE_HDMI, r, v) + + #define repeater_read(s, r) adv748x_read(s, ADV748X_PAGE_REPEATER, r) +@@ -405,11 +405,11 @@ int adv748x_write_block(struct adv748x_state *state, int client_page, + + #define sdp_read(s, r) adv748x_read(s, ADV748X_PAGE_SDP, r) + #define sdp_write(s, r, v) adv748x_write(s, ADV748X_PAGE_SDP, r, v) +-#define sdp_clrset(s, r, m, v) sdp_write(s, r, (sdp_read(s, r) & ~m) | v) ++#define sdp_clrset(s, r, m, v) sdp_write(s, r, (sdp_read(s, r) & ~(m)) | (v)) + + #define cp_read(s, r) adv748x_read(s, ADV748X_PAGE_CP, r) + #define cp_write(s, r, v) adv748x_write(s, ADV748X_PAGE_CP, r, v) +-#define cp_clrset(s, r, m, v) cp_write(s, r, (cp_read(s, r) & ~m) | v) ++#define cp_clrset(s, r, m, v) cp_write(s, r, (cp_read(s, r) & ~(m)) | (v)) + + #define tx_read(t, r) adv748x_read(t->state, t->page, r) + #define tx_write(t, r, v) adv748x_write(t->state, t->page, r, v) +diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig +index ae24d3ea68ea..43169f25da1f 100644 +--- a/drivers/mfd/Kconfig ++++ b/drivers/mfd/Kconfig +@@ -758,6 +758,7 @@ config MFD_MAX77650 + depends on OF || COMPILE_TEST + select MFD_CORE + select REGMAP_I2C ++ select REGMAP_IRQ + help + Say Y here to add support for Maxim Semiconductor MAX77650 and + MAX77651 Power Management ICs. This is the core multifunction +diff --git a/drivers/mtd/nand/onenand/onenand_base.c b/drivers/mtd/nand/onenand/onenand_base.c +index 77bd32a683e1..9e81cd982dd3 100644 +--- a/drivers/mtd/nand/onenand/onenand_base.c ++++ b/drivers/mtd/nand/onenand/onenand_base.c +@@ -1248,44 +1248,44 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, + + stats = mtd->ecc_stats; + +- /* Read-while-load method */ ++ /* Read-while-load method */ + +- /* Do first load to bufferRAM */ +- if (read < len) { +- if (!onenand_check_bufferram(mtd, from)) { ++ /* Do first load to bufferRAM */ ++ if (read < len) { ++ if (!onenand_check_bufferram(mtd, from)) { + this->command(mtd, ONENAND_CMD_READ, from, writesize); +- ret = this->wait(mtd, FL_READING); +- onenand_update_bufferram(mtd, from, !ret); ++ ret = this->wait(mtd, FL_READING); ++ onenand_update_bufferram(mtd, from, !ret); + if (mtd_is_eccerr(ret)) + ret = 0; +- } +- } ++ } ++ } + + thislen = min_t(int, writesize, len - read); + column = from & (writesize - 1); + if (column + thislen > writesize) + thislen = writesize - column; + +- while (!ret) { +- /* If there is more to load then start next load */ +- from += thislen; +- if (read + thislen < len) { ++ while (!ret) { ++ /* If there is more to load then start next load */ ++ from += thislen; ++ if (read + thislen < len) { + this->command(mtd, ONENAND_CMD_READ, from, writesize); +- /* +- * Chip boundary handling in DDP +- * Now we issued chip 1 read and pointed chip 1 ++ /* ++ * Chip boundary handling in DDP ++ * Now we issued chip 1 read and pointed chip 1 + * bufferram so we have to point chip 0 bufferram. +- */ +- if (ONENAND_IS_DDP(this) && +- unlikely(from == (this->chipsize >> 1))) { +- this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2); +- boundary = 1; +- } else +- boundary = 0; +- ONENAND_SET_PREV_BUFFERRAM(this); +- } +- /* While load is going, read from last bufferRAM */ +- this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen); ++ */ ++ if (ONENAND_IS_DDP(this) && ++ unlikely(from == (this->chipsize >> 1))) { ++ this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2); ++ boundary = 1; ++ } else ++ boundary = 0; ++ ONENAND_SET_PREV_BUFFERRAM(this); ++ } ++ /* While load is going, read from last bufferRAM */ ++ this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen); + + /* Read oob area if needed */ + if (oobbuf) { +@@ -1301,24 +1301,24 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, + oobcolumn = 0; + } + +- /* See if we are done */ +- read += thislen; +- if (read == len) +- break; +- /* Set up for next read from bufferRAM */ +- if (unlikely(boundary)) +- this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2); +- ONENAND_SET_NEXT_BUFFERRAM(this); +- buf += thislen; ++ /* See if we are done */ ++ read += thislen; ++ if (read == len) ++ break; ++ /* Set up for next read from bufferRAM */ ++ if (unlikely(boundary)) ++ this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2); ++ ONENAND_SET_NEXT_BUFFERRAM(this); ++ buf += thislen; + thislen = min_t(int, writesize, len - read); +- column = 0; +- cond_resched(); +- /* Now wait for load */ +- ret = this->wait(mtd, FL_READING); +- onenand_update_bufferram(mtd, from, !ret); ++ column = 0; ++ cond_resched(); ++ /* Now wait for load */ ++ ret = this->wait(mtd, FL_READING); ++ onenand_update_bufferram(mtd, from, !ret); + if (mtd_is_eccerr(ret)) + ret = 0; +- } ++ } + + /* + * Return success, if no ECC failures, else -EBADMSG +diff --git a/drivers/mtd/parsers/sharpslpart.c b/drivers/mtd/parsers/sharpslpart.c +index e5ea6127ab5a..671a61845bd5 100644 +--- a/drivers/mtd/parsers/sharpslpart.c ++++ b/drivers/mtd/parsers/sharpslpart.c +@@ -165,10 +165,10 @@ static int sharpsl_nand_get_logical_num(u8 *oob) + + static int sharpsl_nand_init_ftl(struct mtd_info *mtd, struct sharpsl_ftl *ftl) + { +- unsigned int block_num, log_num, phymax; ++ unsigned int block_num, phymax; ++ int i, ret, log_num; + loff_t block_adr; + u8 *oob; +- int i, ret; + + oob = kzalloc(mtd->oobsize, GFP_KERNEL); + if (!oob) +diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c +index 347bb92e4130..0a727502d14c 100644 +--- a/drivers/net/wireless/ath/ath10k/pci.c ++++ b/drivers/net/wireless/ath/ath10k/pci.c +@@ -1604,11 +1604,22 @@ static int ath10k_pci_dump_memory_reg(struct ath10k *ar, + { + struct ath10k_pci *ar_pci = ath10k_pci_priv(ar); + u32 i; ++ int ret; ++ ++ mutex_lock(&ar->conf_mutex); ++ if (ar->state != ATH10K_STATE_ON) { ++ ath10k_warn(ar, "Skipping pci_dump_memory_reg invalid state\n"); ++ ret = -EIO; ++ goto done; ++ } + + for (i = 0; i < region->len; i += 4) + *(u32 *)(buf + i) = ioread32(ar_pci->mem + region->start + i); + +- return region->len; ++ ret = region->len; ++done: ++ mutex_unlock(&ar->conf_mutex); ++ return ret; + } + + /* if an error happened returns < 0, otherwise the length */ +@@ -1704,7 +1715,11 @@ static void ath10k_pci_dump_memory(struct ath10k *ar, + count = ath10k_pci_dump_memory_sram(ar, current_region, buf); + break; + case ATH10K_MEM_REGION_TYPE_IOREG: +- count = ath10k_pci_dump_memory_reg(ar, current_region, buf); ++ ret = ath10k_pci_dump_memory_reg(ar, current_region, buf); ++ if (ret < 0) ++ break; ++ ++ count = ret; + break; + default: + ret = ath10k_pci_dump_memory_generic(ar, current_region, buf); +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c b/drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c +index 9f4b117db9d7..d47f76890cf9 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c +@@ -8,6 +8,7 @@ + * Copyright(c) 2015 - 2017 Intel Deutschland GmbH + * Copyright (C) 2018 Intel Corporation + * Copyright (C) 2019 Intel Corporation ++ * Copyright (C) 2020 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as +@@ -30,6 +31,7 @@ + * Copyright(c) 2015 - 2017 Intel Deutschland GmbH + * Copyright (C) 2018 Intel Corporation + * Copyright (C) 2019 Intel Corporation ++ * Copyright (C) 2020 Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without +@@ -389,6 +391,8 @@ void iwl_mvm_ftm_abort(struct iwl_mvm *mvm, struct cfg80211_pmsr_request *req) + if (req != mvm->ftm_initiator.req) + return; + ++ iwl_mvm_ftm_reset(mvm); ++ + if (iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(TOF_RANGE_ABORT_CMD, + LOCATION_GROUP, 0), + 0, sizeof(cmd), &cmd)) +@@ -502,7 +506,6 @@ void iwl_mvm_ftm_range_resp(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb) + lockdep_assert_held(&mvm->mutex); + + if (!mvm->ftm_initiator.req) { +- IWL_ERR(mvm, "Got FTM response but have no request?\n"); + return; + } + +diff --git a/drivers/net/wireless/marvell/libertas/cfg.c b/drivers/net/wireless/marvell/libertas/cfg.c +index c9401c121a14..4e3de684928b 100644 +--- a/drivers/net/wireless/marvell/libertas/cfg.c ++++ b/drivers/net/wireless/marvell/libertas/cfg.c +@@ -1785,6 +1785,8 @@ static int lbs_ibss_join_existing(struct lbs_private *priv, + rates_max = rates_eid[1]; + if (rates_max > MAX_RATES) { + lbs_deb_join("invalid rates"); ++ rcu_read_unlock(); ++ ret = -EINVAL; + goto out; + } + rates = cmd.bss.rates; +diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c +index 593c594982cb..59f0651d148b 100644 +--- a/drivers/net/wireless/marvell/mwifiex/scan.c ++++ b/drivers/net/wireless/marvell/mwifiex/scan.c +@@ -2886,6 +2886,13 @@ mwifiex_cmd_append_vsie_tlv(struct mwifiex_private *priv, + vs_param_set->header.len = + cpu_to_le16((((u16) priv->vs_ie[id].ie[1]) + & 0x00FF) + 2); ++ if (le16_to_cpu(vs_param_set->header.len) > ++ MWIFIEX_MAX_VSIE_LEN) { ++ mwifiex_dbg(priv->adapter, ERROR, ++ "Invalid param length!\n"); ++ break; ++ } ++ + memcpy(vs_param_set->ie, priv->vs_ie[id].ie, + le16_to_cpu(vs_param_set->header.len)); + *buffer += le16_to_cpu(vs_param_set->header.len) + +diff --git a/drivers/net/wireless/marvell/mwifiex/wmm.c b/drivers/net/wireless/marvell/mwifiex/wmm.c +index 41f0231376c0..132f9e8ed68c 100644 +--- a/drivers/net/wireless/marvell/mwifiex/wmm.c ++++ b/drivers/net/wireless/marvell/mwifiex/wmm.c +@@ -970,6 +970,10 @@ int mwifiex_ret_wmm_get_status(struct mwifiex_private *priv, + "WMM Parameter Set Count: %d\n", + wmm_param_ie->qos_info_bitmap & mask); + ++ if (wmm_param_ie->vend_hdr.len + 2 > ++ sizeof(struct ieee_types_wmm_parameter)) ++ break; ++ + memcpy((u8 *) &priv->curr_bss_params.bss_descriptor. + wmm_ie, wmm_param_ie, + wmm_param_ie->vend_hdr.len + 2); +diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c +index 090b632965e2..ac93f5a0398e 100644 +--- a/drivers/pci/controller/pci-tegra.c ++++ b/drivers/pci/controller/pci-tegra.c +@@ -2499,7 +2499,6 @@ static const struct tegra_pcie_soc tegra20_pcie = { + .num_ports = 2, + .ports = tegra20_pcie_ports, + .msi_base_shift = 0, +- .afi_pex2_ctrl = 0x128, + .pads_pll_ctl = PADS_PLL_CTL_TEGRA20, + .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_DIV10, + .pads_refclk_cfg0 = 0xfa5cfa5c, +@@ -2528,6 +2527,7 @@ static const struct tegra_pcie_soc tegra30_pcie = { + .num_ports = 3, + .ports = tegra30_pcie_ports, + .msi_base_shift = 8, ++ .afi_pex2_ctrl = 0x128, + .pads_pll_ctl = PADS_PLL_CTL_TEGRA30, + .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN, + .pads_refclk_cfg0 = 0xfa5cfa5c, +diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c +index b3f972e8cfed..deec9f9e0b61 100644 +--- a/drivers/pci/iov.c ++++ b/drivers/pci/iov.c +@@ -187,10 +187,10 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id) + sprintf(buf, "virtfn%u", id); + rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf); + if (rc) +- goto failed2; ++ goto failed1; + rc = sysfs_create_link(&virtfn->dev.kobj, &dev->dev.kobj, "physfn"); + if (rc) +- goto failed3; ++ goto failed2; + + kobject_uevent(&virtfn->dev.kobj, KOBJ_CHANGE); + +@@ -198,11 +198,10 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id) + + return 0; + +-failed3: +- sysfs_remove_link(&dev->dev.kobj, buf); + failed2: +- pci_stop_and_remove_bus_device(virtfn); ++ sysfs_remove_link(&dev->dev.kobj, buf); + failed1: ++ pci_stop_and_remove_bus_device(virtfn); + pci_dev_put(dev); + failed0: + virtfn_remove_bus(dev->bus, bus); +diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c +index b45bc47d04fe..271aecfbc3bf 100644 +--- a/drivers/pci/pcie/aer.c ++++ b/drivers/pci/pcie/aer.c +@@ -1387,6 +1387,7 @@ static int aer_probe(struct pcie_device *dev) + return -ENOMEM; + + rpc->rpd = port; ++ INIT_KFIFO(rpc->aer_fifo); + set_service_data(dev, rpc); + + status = devm_request_threaded_irq(device, dev->irq, aer_irq, aer_isr, +diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c +index e7dbe21705ba..5356630e0e48 100644 +--- a/drivers/pci/setup-bus.c ++++ b/drivers/pci/setup-bus.c +@@ -1785,12 +1785,18 @@ again: + /* Restore size and flags */ + list_for_each_entry(fail_res, &fail_head, list) { + struct resource *res = fail_res->res; ++ int idx; + + res->start = fail_res->start; + res->end = fail_res->end; + res->flags = fail_res->flags; +- if (fail_res->dev->subordinate) +- res->flags = 0; ++ ++ if (pci_is_bridge(fail_res->dev)) { ++ idx = res - &fail_res->dev->resource[0]; ++ if (idx >= PCI_BRIDGE_RESOURCES && ++ idx <= PCI_BRIDGE_RESOURCE_END) ++ res->flags = 0; ++ } + } + free_list(&fail_head); + +@@ -2037,12 +2043,18 @@ again: + /* Restore size and flags */ + list_for_each_entry(fail_res, &fail_head, list) { + struct resource *res = fail_res->res; ++ int idx; + + res->start = fail_res->start; + res->end = fail_res->end; + res->flags = fail_res->flags; +- if (fail_res->dev->subordinate) +- res->flags = 0; ++ ++ if (pci_is_bridge(fail_res->dev)) { ++ idx = res - &fail_res->dev->resource[0]; ++ if (idx >= PCI_BRIDGE_RESOURCES && ++ idx <= PCI_BRIDGE_RESOURCE_END) ++ res->flags = 0; ++ } + } + free_list(&fail_head); + +diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c +index 465d6afd826e..cc43c855452f 100644 +--- a/drivers/pci/switch/switchtec.c ++++ b/drivers/pci/switch/switchtec.c +@@ -1276,7 +1276,7 @@ static int switchtec_init_isr(struct switchtec_dev *stdev) + if (nvecs < 0) + return nvecs; + +- event_irq = ioread32(&stdev->mmio_part_cfg->vep_vector_number); ++ event_irq = ioread16(&stdev->mmio_part_cfg->vep_vector_number); + if (event_irq < 0 || event_irq >= nvecs) + return -EFAULT; + +@@ -1349,7 +1349,7 @@ static int switchtec_init_pci(struct switchtec_dev *stdev, + if (rc) + return rc; + +- rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64)); ++ rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); + if (rc) + return rc; + +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7778.c b/drivers/pinctrl/sh-pfc/pfc-r8a7778.c +index 24866a5958ae..a9875038ed9b 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a7778.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a7778.c +@@ -2305,7 +2305,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_ATAG0_A, 0, FN_REMOCON_B, 0, + /* IP0_11_8 [4] */ + FN_SD1_DAT2_A, FN_MMC_D2, 0, FN_BS, +- FN_ATADIR0_A, 0, FN_SDSELF_B, 0, ++ FN_ATADIR0_A, 0, FN_SDSELF_A, 0, + FN_PWM4_B, 0, 0, 0, + 0, 0, 0, 0, + /* IP0_7_5 [3] */ +@@ -2349,7 +2349,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + FN_TS_SDAT0_A, 0, 0, 0, + 0, 0, 0, 0, + /* IP1_10_8 [3] */ +- FN_SD1_CLK_B, FN_MMC_D6, 0, FN_A24, ++ FN_SD1_CD_A, FN_MMC_D6, 0, FN_A24, + FN_DREQ1_A, 0, FN_HRX0_B, FN_TS_SPSYNC0_A, + /* IP1_7_5 [3] */ + FN_A23, FN_HTX0_B, FN_TX2_B, FN_DACK2_A, +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a77965.c b/drivers/pinctrl/sh-pfc/pfc-r8a77965.c +index 697c77a4ea95..773d3bc38c8c 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a77965.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a77965.c +@@ -5984,7 +5984,7 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = { + { PIN_DU_DOTCLKIN1, 0, 2 }, /* DU_DOTCLKIN1 */ + } }, + { PINMUX_DRIVE_REG("DRVCTRL12", 0xe6060330) { +- { PIN_DU_DOTCLKIN3, 28, 2 }, /* DU_DOTCLKIN3 */ ++ { PIN_DU_DOTCLKIN3, 24, 2 }, /* DU_DOTCLKIN3 */ + { PIN_FSCLKST, 20, 2 }, /* FSCLKST */ + { PIN_TMS, 4, 2 }, /* TMS */ + } }, +@@ -6240,8 +6240,8 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = { + [31] = PIN_DU_DOTCLKIN1, /* DU_DOTCLKIN1 */ + } }, + { PINMUX_BIAS_REG("PUEN3", 0xe606040c, "PUD3", 0xe606044c) { +- [ 0] = PIN_DU_DOTCLKIN3, /* DU_DOTCLKIN3 */ +- [ 1] = SH_PFC_PIN_NONE, ++ [ 0] = SH_PFC_PIN_NONE, ++ [ 1] = PIN_DU_DOTCLKIN3, /* DU_DOTCLKIN3 */ + [ 2] = PIN_FSCLKST, /* FSCLKST */ + [ 3] = PIN_EXTALR, /* EXTALR*/ + [ 4] = PIN_TRST_N, /* TRST# */ +diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c +index 292bace83f1e..6f436836fe50 100644 +--- a/drivers/platform/x86/intel_mid_powerbtn.c ++++ b/drivers/platform/x86/intel_mid_powerbtn.c +@@ -146,9 +146,10 @@ static int mid_pb_probe(struct platform_device *pdev) + + input_set_capability(input, EV_KEY, KEY_POWER); + +- ddata = (struct mid_pb_ddata *)id->driver_data; ++ ddata = devm_kmemdup(&pdev->dev, (void *)id->driver_data, ++ sizeof(*ddata), GFP_KERNEL); + if (!ddata) +- return -ENODATA; ++ return -ENOMEM; + + ddata->dev = &pdev->dev; + ddata->irq = irq; +diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c +index 033303708c8b..cb28bbdc9e17 100644 +--- a/drivers/rtc/rtc-cmos.c ++++ b/drivers/rtc/rtc-cmos.c +@@ -850,7 +850,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) + rtc_cmos_int_handler = cmos_interrupt; + + retval = request_irq(rtc_irq, rtc_cmos_int_handler, +- IRQF_SHARED, dev_name(&cmos_rtc.rtc->dev), ++ 0, dev_name(&cmos_rtc.rtc->dev), + cmos_rtc.rtc); + if (retval < 0) { + dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq); +diff --git a/drivers/rtc/rtc-hym8563.c b/drivers/rtc/rtc-hym8563.c +index 443f6d05ce29..fb6d7967ec00 100644 +--- a/drivers/rtc/rtc-hym8563.c ++++ b/drivers/rtc/rtc-hym8563.c +@@ -97,7 +97,7 @@ static int hym8563_rtc_read_time(struct device *dev, struct rtc_time *tm) + + if (!hym8563->valid) { + dev_warn(&client->dev, "no valid clock/calendar values available\n"); +- return -EPERM; ++ return -EINVAL; + } + + ret = i2c_smbus_read_i2c_block_data(client, HYM8563_SEC, 7, buf); +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index 0d41a7dc1d6b..b0d6978d78bf 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -6953,7 +6953,8 @@ static int ufshcd_probe_hba(struct ufs_hba *hba) + ufshcd_init_icc_levels(hba); + + /* Add required well known logical units to scsi mid layer */ +- if (ufshcd_scsi_add_wlus(hba)) ++ ret = ufshcd_scsi_add_wlus(hba); ++ if (ret) + goto out; + + /* Initialize devfreq after UFS device is detected */ +diff --git a/drivers/soc/qcom/rpmhpd.c b/drivers/soc/qcom/rpmhpd.c +index 5741ec3fa814..51850cc68b70 100644 +--- a/drivers/soc/qcom/rpmhpd.c ++++ b/drivers/soc/qcom/rpmhpd.c +@@ -93,6 +93,7 @@ static struct rpmhpd sdm845_mx = { + + static struct rpmhpd sdm845_mx_ao = { + .pd = { .name = "mx_ao", }, ++ .active_only = true, + .peer = &sdm845_mx, + .res_name = "mx.lvl", + }; +@@ -107,6 +108,7 @@ static struct rpmhpd sdm845_cx = { + + static struct rpmhpd sdm845_cx_ao = { + .pd = { .name = "cx_ao", }, ++ .active_only = true, + .peer = &sdm845_cx, + .parent = &sdm845_mx_ao.pd, + .res_name = "cx.lvl", +diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c +index a494543d3ae1..eb47fe5ed280 100644 +--- a/drivers/watchdog/qcom-wdt.c ++++ b/drivers/watchdog/qcom-wdt.c +@@ -246,7 +246,7 @@ static int qcom_wdt_probe(struct platform_device *pdev) + } + + /* check if there is pretimeout support */ +- irq = platform_get_irq(pdev, 0); ++ irq = platform_get_irq_optional(pdev, 0); + if (irq > 0) { + ret = devm_request_irq(dev, irq, qcom_wdt_isr, + IRQF_TRIGGER_RISING, +diff --git a/drivers/watchdog/stm32_iwdg.c b/drivers/watchdog/stm32_iwdg.c +index a3a329011a06..25188d6bbe15 100644 +--- a/drivers/watchdog/stm32_iwdg.c ++++ b/drivers/watchdog/stm32_iwdg.c +@@ -262,6 +262,24 @@ static int stm32_iwdg_probe(struct platform_device *pdev) + watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT); + watchdog_init_timeout(wdd, 0, dev); + ++ /* ++ * In case of CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is set ++ * (Means U-Boot/bootloaders leaves the watchdog running) ++ * When we get here we should make a decision to prevent ++ * any side effects before user space daemon will take care of it. ++ * The best option, taking into consideration that there is no ++ * way to read values back from hardware, is to enforce watchdog ++ * being run with deterministic values. ++ */ ++ if (IS_ENABLED(CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED)) { ++ ret = stm32_iwdg_start(wdd); ++ if (ret) ++ return ret; ++ ++ /* Make sure the watchdog is serviced */ ++ set_bit(WDOG_HW_RUNNING, &wdd->status); ++ } ++ + ret = devm_watchdog_register_device(dev, wdd); + if (ret) + return ret; +diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig +index 295a7a21b774..e7dd07f47825 100644 +--- a/fs/nfs/Kconfig ++++ b/fs/nfs/Kconfig +@@ -90,7 +90,7 @@ config NFS_V4 + config NFS_SWAP + bool "Provide swap over NFS support" + default n +- depends on NFS_FS ++ depends on NFS_FS && SWAP + select SUNRPC_SWAP + help + This option enables swapon to work on files located on NFS mounts. +diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c +index 040a50fd9bf3..29f00da8a0b7 100644 +--- a/fs/nfs/direct.c ++++ b/fs/nfs/direct.c +@@ -245,10 +245,10 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq, + data->ds_commit_index); + + /* verifier not set so always fail */ +- if (verfp->committed < 0) ++ if (verfp->committed < 0 || data->res.verf->committed <= NFS_UNSTABLE) + return 1; + +- return nfs_direct_cmp_verf(verfp, &data->verf); ++ return nfs_direct_cmp_verf(verfp, data->res.verf); + } + + /** +diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c +index 602767850b36..1f60ab2535ee 100644 +--- a/fs/nfs/nfs3xdr.c ++++ b/fs/nfs/nfs3xdr.c +@@ -2338,6 +2338,7 @@ static int nfs3_xdr_dec_commit3res(struct rpc_rqst *req, + void *data) + { + struct nfs_commitres *result = data; ++ struct nfs_writeverf *verf = result->verf; + enum nfs_stat status; + int error; + +@@ -2350,7 +2351,9 @@ static int nfs3_xdr_dec_commit3res(struct rpc_rqst *req, + result->op_status = status; + if (status != NFS3_OK) + goto out_status; +- error = decode_writeverf3(xdr, &result->verf->verifier); ++ error = decode_writeverf3(xdr, &verf->verifier); ++ if (!error) ++ verf->committed = NFS_FILE_SYNC; + out: + return error; + out_status: +diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h +index 16b2e5cc3e94..bb322d9de313 100644 +--- a/fs/nfs/nfs4_fs.h ++++ b/fs/nfs/nfs4_fs.h +@@ -439,9 +439,7 @@ extern void nfs4_schedule_state_renewal(struct nfs_client *); + extern void nfs4_renewd_prepare_shutdown(struct nfs_server *); + extern void nfs4_kill_renewd(struct nfs_client *); + extern void nfs4_renew_state(struct work_struct *); +-extern void nfs4_set_lease_period(struct nfs_client *clp, +- unsigned long lease, +- unsigned long lastrenewed); ++extern void nfs4_set_lease_period(struct nfs_client *clp, unsigned long lease); + + + /* nfs4state.c */ +diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c +index f26d714f9f28..423960d480f1 100644 +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -3187,6 +3187,11 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, + exception.retry = 1; + continue; + } ++ if (status == -NFS4ERR_EXPIRED) { ++ nfs4_schedule_lease_recovery(server->nfs_client); ++ exception.retry = 1; ++ continue; ++ } + if (status == -EAGAIN) { + /* We must have found a delegation */ + exception.retry = 1; +@@ -5019,16 +5024,13 @@ static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, str + struct nfs4_exception exception = { + .interruptible = true, + }; +- unsigned long now = jiffies; + int err; + + do { + err = _nfs4_do_fsinfo(server, fhandle, fsinfo); + trace_nfs4_fsinfo(server, fhandle, fsinfo->fattr, err); + if (err == 0) { +- nfs4_set_lease_period(server->nfs_client, +- fsinfo->lease_time * HZ, +- now); ++ nfs4_set_lease_period(server->nfs_client, fsinfo->lease_time * HZ); + break; + } + err = nfs4_handle_exception(server, err, &exception); +@@ -6084,6 +6086,7 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, + .callback_data = &setclientid, + .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN, + }; ++ unsigned long now = jiffies; + int status; + + /* nfs_client_id4 */ +@@ -6116,6 +6119,9 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, + clp->cl_acceptor = rpcauth_stringify_acceptor(setclientid.sc_cred); + put_rpccred(setclientid.sc_cred); + } ++ ++ if (status == 0) ++ do_renew_lease(clp, now); + out: + trace_nfs4_setclientid(clp, status); + dprintk("NFS reply setclientid: %d\n", status); +@@ -8199,6 +8205,7 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cre + struct rpc_task *task; + struct nfs41_exchange_id_args *argp; + struct nfs41_exchange_id_res *resp; ++ unsigned long now = jiffies; + int status; + + task = nfs4_run_exchange_id(clp, cred, sp4_how, NULL); +@@ -8219,6 +8226,8 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cre + if (status != 0) + goto out; + ++ do_renew_lease(clp, now); ++ + clp->cl_clientid = resp->clientid; + clp->cl_exchange_flags = resp->flags; + clp->cl_seqid = resp->seqid; +diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c +index 6ea431b067dd..ff876dda7f06 100644 +--- a/fs/nfs/nfs4renewd.c ++++ b/fs/nfs/nfs4renewd.c +@@ -138,15 +138,12 @@ nfs4_kill_renewd(struct nfs_client *clp) + * + * @clp: pointer to nfs_client + * @lease: new value for lease period +- * @lastrenewed: time at which lease was last renewed + */ + void nfs4_set_lease_period(struct nfs_client *clp, +- unsigned long lease, +- unsigned long lastrenewed) ++ unsigned long lease) + { + spin_lock(&clp->cl_lock); + clp->cl_lease_time = lease; +- clp->cl_last_renewal = lastrenewed; + spin_unlock(&clp->cl_lock); + + /* Cap maximum reconnect timeout at 1/2 lease period */ +diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c +index 0c6d53dc3672..b53bcf40e2a7 100644 +--- a/fs/nfs/nfs4state.c ++++ b/fs/nfs/nfs4state.c +@@ -91,17 +91,15 @@ static int nfs4_setup_state_renewal(struct nfs_client *clp) + { + int status; + struct nfs_fsinfo fsinfo; +- unsigned long now; + + if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) { + nfs4_schedule_state_renewal(clp); + return 0; + } + +- now = jiffies; + status = nfs4_proc_get_lease_time(clp, &fsinfo); + if (status == 0) { +- nfs4_set_lease_period(clp, fsinfo.lease_time * HZ, now); ++ nfs4_set_lease_period(clp, fsinfo.lease_time * HZ); + nfs4_schedule_state_renewal(clp); + } + +diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h +index b2f395fa7350..9398c0b6e0a3 100644 +--- a/fs/nfs/nfs4trace.h ++++ b/fs/nfs/nfs4trace.h +@@ -352,7 +352,7 @@ DECLARE_EVENT_CLASS(nfs4_clientid_event, + ), + + TP_fast_assign( +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __assign_str(dstaddr, clp->cl_hostname); + ), + +@@ -432,7 +432,8 @@ TRACE_EVENT(nfs4_sequence_done, + __entry->target_highest_slotid = + res->sr_target_highest_slotid; + __entry->status_flags = res->sr_status_flags; +- __entry->error = res->sr_status; ++ __entry->error = res->sr_status < 0 ? ++ -res->sr_status : 0; + ), + TP_printk( + "error=%ld (%s) session=0x%08x slot_nr=%u seq_nr=%u " +@@ -566,7 +567,7 @@ TRACE_EVENT(nfs4_xdr_status, + TP_PROTO( + const struct xdr_stream *xdr, + u32 op, +- int error ++ u32 error + ), + + TP_ARGS(xdr, op, error), +@@ -756,7 +757,7 @@ TRACE_EVENT(nfs4_close, + __entry->fileid = NFS_FILEID(inode); + __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); + __entry->fmode = (__force unsigned int)state->state; +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->stateid_seq = + be32_to_cpu(args->stateid.seqid); + __entry->stateid_hash = +@@ -821,7 +822,7 @@ DECLARE_EVENT_CLASS(nfs4_lock_event, + TP_fast_assign( + const struct inode *inode = state->inode; + +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->cmd = cmd; + __entry->type = request->fl_type; + __entry->start = request->fl_start; +@@ -893,7 +894,7 @@ TRACE_EVENT(nfs4_set_lock, + TP_fast_assign( + const struct inode *inode = state->inode; + +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->cmd = cmd; + __entry->type = request->fl_type; + __entry->start = request->fl_start; +@@ -989,7 +990,7 @@ TRACE_EVENT(nfs4_delegreturn_exit, + TP_fast_assign( + __entry->dev = res->server->s_dev; + __entry->fhandle = nfs_fhandle_hash(args->fhandle); +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->stateid_seq = + be32_to_cpu(args->stateid->seqid); + __entry->stateid_hash = +@@ -1029,7 +1030,7 @@ DECLARE_EVENT_CLASS(nfs4_test_stateid_event, + TP_fast_assign( + const struct inode *inode = state->inode; + +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->dev = inode->i_sb->s_dev; + __entry->fileid = NFS_FILEID(inode); + __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); +@@ -1131,7 +1132,7 @@ TRACE_EVENT(nfs4_lookupp, + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = NFS_FILEID(inode); +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + ), + + TP_printk( +@@ -1167,7 +1168,7 @@ TRACE_EVENT(nfs4_rename, + __entry->dev = olddir->i_sb->s_dev; + __entry->olddir = NFS_FILEID(olddir); + __entry->newdir = NFS_FILEID(newdir); +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __assign_str(oldname, oldname->name); + __assign_str(newname, newname->name); + ), +@@ -1258,7 +1259,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_event, + __entry->dev = inode->i_sb->s_dev; + __entry->fileid = NFS_FILEID(inode); + __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->stateid_seq = + be32_to_cpu(stateid->seqid); + __entry->stateid_hash = +@@ -1314,7 +1315,7 @@ DECLARE_EVENT_CLASS(nfs4_getattr_event, + __entry->valid = fattr->valid; + __entry->fhandle = nfs_fhandle_hash(fhandle); + __entry->fileid = (fattr->valid & NFS_ATTR_FATTR_FILEID) ? fattr->fileid : 0; +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + ), + + TP_printk( +@@ -1361,7 +1362,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_callback_event, + ), + + TP_fast_assign( +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->fhandle = nfs_fhandle_hash(fhandle); + if (!IS_ERR_OR_NULL(inode)) { + __entry->fileid = NFS_FILEID(inode); +@@ -1418,7 +1419,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_callback_event, + ), + + TP_fast_assign( +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->fhandle = nfs_fhandle_hash(fhandle); + if (!IS_ERR_OR_NULL(inode)) { + __entry->fileid = NFS_FILEID(inode); +@@ -1721,7 +1722,7 @@ TRACE_EVENT(nfs4_layoutget, + __entry->iomode = args->iomode; + __entry->offset = args->offset; + __entry->count = args->length; +- __entry->error = error; ++ __entry->error = error < 0 ? -error : 0; + __entry->stateid_seq = + be32_to_cpu(state->stateid.seqid); + __entry->stateid_hash = +diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c +index ab07db0f07cd..7c0ff1a3b591 100644 +--- a/fs/nfs/nfs4xdr.c ++++ b/fs/nfs/nfs4xdr.c +@@ -4316,11 +4316,14 @@ static int decode_write_verifier(struct xdr_stream *xdr, struct nfs_write_verifi + + static int decode_commit(struct xdr_stream *xdr, struct nfs_commitres *res) + { ++ struct nfs_writeverf *verf = res->verf; + int status; + + status = decode_op_hdr(xdr, OP_COMMIT); + if (!status) +- status = decode_write_verifier(xdr, &res->verf->verifier); ++ status = decode_write_verifier(xdr, &verf->verifier); ++ if (!status) ++ verf->committed = NFS_FILE_SYNC; + return status; + } + +diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c +index bb80034a7661..443639cbb0cf 100644 +--- a/fs/nfs/pnfs.c ++++ b/fs/nfs/pnfs.c +@@ -1425,7 +1425,7 @@ retry: + /* lo ref dropped in pnfs_roc_release() */ + layoutreturn = pnfs_prepare_layoutreturn(lo, &stateid, &iomode); + /* If the creds don't match, we can't compound the layoutreturn */ +- if (!layoutreturn || cred != lo->plh_lc_cred) ++ if (!layoutreturn || cred_fscmp(cred, lo->plh_lc_cred) != 0) + goto out_noroc; + + roc = layoutreturn; +diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c +index 82af4809b869..8b37e7f8e789 100644 +--- a/fs/nfs/pnfs_nfs.c ++++ b/fs/nfs/pnfs_nfs.c +@@ -31,12 +31,11 @@ EXPORT_SYMBOL_GPL(pnfs_generic_rw_release); + /* Fake up some data that will cause nfs_commit_release to retry the writes. */ + void pnfs_generic_prepare_to_resend_writes(struct nfs_commit_data *data) + { +- struct nfs_page *first = nfs_list_entry(data->pages.next); ++ struct nfs_writeverf *verf = data->res.verf; + + data->task.tk_status = 0; +- memcpy(&data->verf.verifier, &first->wb_verf, +- sizeof(data->verf.verifier)); +- data->verf.verifier.data[0]++; /* ensure verifier mismatch */ ++ memset(&verf->verifier, 0, sizeof(verf->verifier)); ++ verf->committed = NFS_UNSTABLE; + } + EXPORT_SYMBOL_GPL(pnfs_generic_prepare_to_resend_writes); + +diff --git a/fs/nfs/write.c b/fs/nfs/write.c +index 52cab65f91cf..913eb37c249b 100644 +--- a/fs/nfs/write.c ++++ b/fs/nfs/write.c +@@ -243,7 +243,15 @@ out: + /* A writeback failed: mark the page as bad, and invalidate the page cache */ + static void nfs_set_pageerror(struct address_space *mapping) + { ++ struct inode *inode = mapping->host; ++ + nfs_zap_mapping(mapping->host, mapping); ++ /* Force file size revalidation */ ++ spin_lock(&inode->i_lock); ++ NFS_I(inode)->cache_validity |= NFS_INO_REVAL_FORCED | ++ NFS_INO_REVAL_PAGECACHE | ++ NFS_INO_INVALID_SIZE; ++ spin_unlock(&inode->i_lock); + } + + static void nfs_mapping_set_error(struct page *page, int error) +@@ -1829,6 +1837,7 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata) + + static void nfs_commit_release_pages(struct nfs_commit_data *data) + { ++ const struct nfs_writeverf *verf = data->res.verf; + struct nfs_page *req; + int status = data->task.tk_status; + struct nfs_commit_info cinfo; +@@ -1856,7 +1865,8 @@ static void nfs_commit_release_pages(struct nfs_commit_data *data) + + /* Okay, COMMIT succeeded, apparently. Check the verifier + * returned by the server against all stored verfs. */ +- if (!nfs_write_verifier_cmp(&req->wb_verf, &data->verf.verifier)) { ++ if (verf->committed > NFS_UNSTABLE && ++ !nfs_write_verifier_cmp(&req->wb_verf, &verf->verifier)) { + /* We have a match */ + if (req->wb_page) + nfs_inode_remove_request(req); +diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h +index 44c52639db55..75c7b5ed53c5 100644 +--- a/include/rdma/ib_verbs.h ++++ b/include/rdma/ib_verbs.h +@@ -4252,6 +4252,9 @@ static inline int ib_check_mr_access(int flags) + !(flags & IB_ACCESS_LOCAL_WRITE)) + return -EINVAL; + ++ if (flags & ~IB_ACCESS_SUPPORTED) ++ return -EINVAL; ++ + return 0; + } + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 8dacda4b0362..00743684a549 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7090,6 +7090,12 @@ static int cpu_cgroup_css_online(struct cgroup_subsys_state *css) + + if (parent) + sched_online_group(tg, parent); ++ ++#ifdef CONFIG_UCLAMP_TASK_GROUP ++ /* Propagate the effective uclamp value for the new group */ ++ cpu_util_update_eff(css); ++#endif ++ + return 0; + } + +diff --git a/net/core/bpf_sk_storage.c b/net/core/bpf_sk_storage.c +index da5639a5bd3b..0147b26f585a 100644 +--- a/net/core/bpf_sk_storage.c ++++ b/net/core/bpf_sk_storage.c +@@ -643,9 +643,10 @@ static struct bpf_map *bpf_sk_storage_map_alloc(union bpf_attr *attr) + return ERR_PTR(-ENOMEM); + bpf_map_init_from_attr(&smap->map, attr); + ++ nbuckets = roundup_pow_of_two(num_possible_cpus()); + /* Use at least 2 buckets, select_bucket() is undefined behavior with 1 bucket */ +- smap->bucket_log = max_t(u32, 1, ilog2(roundup_pow_of_two(num_possible_cpus()))); +- nbuckets = 1U << smap->bucket_log; ++ nbuckets = max_t(u32, 2, nbuckets); ++ smap->bucket_log = ilog2(nbuckets); + cost = sizeof(*smap->buckets) * nbuckets + sizeof(*smap); + + ret = bpf_map_charge_init(&smap->map.memory, cost); +diff --git a/net/core/sock_map.c b/net/core/sock_map.c +index 8998e356f423..085cef5857bb 100644 +--- a/net/core/sock_map.c ++++ b/net/core/sock_map.c +@@ -234,7 +234,6 @@ static void sock_map_free(struct bpf_map *map) + int i; + + synchronize_rcu(); +- rcu_read_lock(); + raw_spin_lock_bh(&stab->lock); + for (i = 0; i < stab->map.max_entries; i++) { + struct sock **psk = &stab->sks[i]; +@@ -243,13 +242,15 @@ static void sock_map_free(struct bpf_map *map) + sk = xchg(psk, NULL); + if (sk) { + lock_sock(sk); ++ rcu_read_lock(); + sock_map_unref(sk, psk); ++ rcu_read_unlock(); + release_sock(sk); + } + } + raw_spin_unlock_bh(&stab->lock); +- rcu_read_unlock(); + ++ /* wait for psock readers accessing its map link */ + synchronize_rcu(); + + bpf_map_area_free(stab->sks); +@@ -416,14 +417,16 @@ static int sock_map_update_elem(struct bpf_map *map, void *key, + ret = -EINVAL; + goto out; + } +- if (!sock_map_sk_is_suitable(sk) || +- sk->sk_state != TCP_ESTABLISHED) { ++ if (!sock_map_sk_is_suitable(sk)) { + ret = -EOPNOTSUPP; + goto out; + } + + sock_map_sk_acquire(sk); +- ret = sock_map_update_common(map, idx, sk, flags); ++ if (sk->sk_state != TCP_ESTABLISHED) ++ ret = -EOPNOTSUPP; ++ else ++ ret = sock_map_update_common(map, idx, sk, flags); + sock_map_sk_release(sk); + out: + fput(sock->file); +@@ -739,14 +742,16 @@ static int sock_hash_update_elem(struct bpf_map *map, void *key, + ret = -EINVAL; + goto out; + } +- if (!sock_map_sk_is_suitable(sk) || +- sk->sk_state != TCP_ESTABLISHED) { ++ if (!sock_map_sk_is_suitable(sk)) { + ret = -EOPNOTSUPP; + goto out; + } + + sock_map_sk_acquire(sk); +- ret = sock_hash_update_common(map, key, sk, flags); ++ if (sk->sk_state != TCP_ESTABLISHED) ++ ret = -EOPNOTSUPP; ++ else ++ ret = sock_hash_update_common(map, key, sk, flags); + sock_map_sk_release(sk); + out: + fput(sock->file); +@@ -859,19 +864,22 @@ static void sock_hash_free(struct bpf_map *map) + int i; + + synchronize_rcu(); +- rcu_read_lock(); + for (i = 0; i < htab->buckets_num; i++) { + bucket = sock_hash_select_bucket(htab, i); + raw_spin_lock_bh(&bucket->lock); + hlist_for_each_entry_safe(elem, node, &bucket->head, node) { + hlist_del_rcu(&elem->node); + lock_sock(elem->sk); ++ rcu_read_lock(); + sock_map_unref(elem->sk, elem); ++ rcu_read_unlock(); + release_sock(elem->sk); + } + raw_spin_unlock_bh(&bucket->lock); + } +- rcu_read_unlock(); ++ ++ /* wait for psock readers accessing its map link */ ++ synchronize_rcu(); + + bpf_map_area_free(htab->buckets); + kfree(htab); +diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c +index c443db7af8d4..463cefc1e5ae 100644 +--- a/net/vmw_vsock/hyperv_transport.c ++++ b/net/vmw_vsock/hyperv_transport.c +@@ -136,28 +136,15 @@ struct hvsock { + **************************************************************************** + * The only valid Service GUIDs, from the perspectives of both the host and * + * Linux VM, that can be connected by the other end, must conform to this * +- * format: -facb-11e6-bd58-64006a7986d3, and the "port" must be in * +- * this range [0, 0x7FFFFFFF]. * ++ * format: -facb-11e6-bd58-64006a7986d3. * + **************************************************************************** + * + * When we write apps on the host to connect(), the GUID ServiceID is used. + * When we write apps in Linux VM to connect(), we only need to specify the + * port and the driver will form the GUID and use that to request the host. + * +- * From the perspective of Linux VM: +- * 1. the local ephemeral port (i.e. the local auto-bound port when we call +- * connect() without explicit bind()) is generated by __vsock_bind_stream(), +- * and the range is [1024, 0xFFFFFFFF). +- * 2. the remote ephemeral port (i.e. the auto-generated remote port for +- * a connect request initiated by the host's connect()) is generated by +- * hvs_remote_addr_init() and the range is [0x80000000, 0xFFFFFFFF). + */ + +-#define MAX_LISTEN_PORT ((u32)0x7FFFFFFF) +-#define MAX_VM_LISTEN_PORT MAX_LISTEN_PORT +-#define MAX_HOST_LISTEN_PORT MAX_LISTEN_PORT +-#define MIN_HOST_EPHEMERAL_PORT (MAX_HOST_LISTEN_PORT + 1) +- + /* 00000000-facb-11e6-bd58-64006a7986d3 */ + static const guid_t srv_id_template = + GUID_INIT(0x00000000, 0xfacb, 0x11e6, 0xbd, 0x58, +@@ -180,33 +167,6 @@ static void hvs_addr_init(struct sockaddr_vm *addr, const guid_t *svr_id) + vsock_addr_init(addr, VMADDR_CID_ANY, port); + } + +-static void hvs_remote_addr_init(struct sockaddr_vm *remote, +- struct sockaddr_vm *local) +-{ +- static u32 host_ephemeral_port = MIN_HOST_EPHEMERAL_PORT; +- struct sock *sk; +- +- vsock_addr_init(remote, VMADDR_CID_ANY, VMADDR_PORT_ANY); +- +- while (1) { +- /* Wrap around ? */ +- if (host_ephemeral_port < MIN_HOST_EPHEMERAL_PORT || +- host_ephemeral_port == VMADDR_PORT_ANY) +- host_ephemeral_port = MIN_HOST_EPHEMERAL_PORT; +- +- remote->svm_port = host_ephemeral_port++; +- +- sk = vsock_find_connected_socket(remote, local); +- if (!sk) { +- /* Found an available ephemeral port */ +- return; +- } +- +- /* Release refcnt got in vsock_find_connected_socket */ +- sock_put(sk); +- } +-} +- + static void hvs_set_channel_pending_send_size(struct vmbus_channel *chan) + { + set_channel_pending_send_size(chan, +@@ -336,12 +296,7 @@ static void hvs_open_connection(struct vmbus_channel *chan) + if_type = &chan->offermsg.offer.if_type; + if_instance = &chan->offermsg.offer.if_instance; + conn_from_host = chan->offermsg.offer.u.pipe.user_def[0]; +- +- /* The host or the VM should only listen on a port in +- * [0, MAX_LISTEN_PORT] +- */ +- if (!is_valid_srv_id(if_type) || +- get_port_by_srv_id(if_type) > MAX_LISTEN_PORT) ++ if (!is_valid_srv_id(if_type)) + return; + + hvs_addr_init(&addr, conn_from_host ? if_type : if_instance); +@@ -365,6 +320,13 @@ static void hvs_open_connection(struct vmbus_channel *chan) + + new->sk_state = TCP_SYN_SENT; + vnew = vsock_sk(new); ++ ++ hvs_addr_init(&vnew->local_addr, if_type); ++ ++ /* Remote peer is always the host */ ++ vsock_addr_init(&vnew->remote_addr, ++ VMADDR_CID_HOST, VMADDR_PORT_ANY); ++ vnew->remote_addr.svm_port = get_port_by_srv_id(if_instance); + hvs_new = vnew->trans; + hvs_new->chan = chan; + } else { +@@ -429,8 +391,6 @@ static void hvs_open_connection(struct vmbus_channel *chan) + sk->sk_ack_backlog++; + + hvs_addr_init(&vnew->local_addr, if_type); +- hvs_remote_addr_init(&vnew->remote_addr, &vnew->local_addr); +- + hvs_new->vm_srv_id = *if_type; + hvs_new->host_srv_id = *if_instance; + +@@ -753,16 +713,6 @@ static bool hvs_stream_is_active(struct vsock_sock *vsk) + + static bool hvs_stream_allow(u32 cid, u32 port) + { +- /* The host's port range [MIN_HOST_EPHEMERAL_PORT, 0xFFFFFFFF) is +- * reserved as ephemeral ports, which are used as the host's ports +- * when the host initiates connections. +- * +- * Perform this check in the guest so an immediate error is produced +- * instead of a timeout. +- */ +- if (port > MAX_HOST_LISTEN_PORT) +- return false; +- + if (cid == VMADDR_CID_HOST) + return true; + +diff --git a/security/selinux/avc.c b/security/selinux/avc.c +index ecd3829996aa..23dc888ae305 100644 +--- a/security/selinux/avc.c ++++ b/security/selinux/avc.c +@@ -424,7 +424,7 @@ static inline int avc_xperms_audit(struct selinux_state *state, + if (likely(!audited)) + return 0; + return slow_avc_audit(state, ssid, tsid, tclass, requested, +- audited, denied, result, ad, 0); ++ audited, denied, result, ad); + } + + static void avc_node_free(struct rcu_head *rhead) +@@ -758,8 +758,7 @@ static void avc_audit_post_callback(struct audit_buffer *ab, void *a) + noinline int slow_avc_audit(struct selinux_state *state, + u32 ssid, u32 tsid, u16 tclass, + u32 requested, u32 audited, u32 denied, int result, +- struct common_audit_data *a, +- unsigned int flags) ++ struct common_audit_data *a) + { + struct common_audit_data stack_data; + struct selinux_audit_data sad; +@@ -772,17 +771,6 @@ noinline int slow_avc_audit(struct selinux_state *state, + a->type = LSM_AUDIT_DATA_NONE; + } + +- /* +- * When in a RCU walk do the audit on the RCU retry. This is because +- * the collection of the dname in an inode audit message is not RCU +- * safe. Note this may drop some audits when the situation changes +- * during retry. However this is logically just as if the operation +- * happened a little later. +- */ +- if ((a->type == LSM_AUDIT_DATA_INODE) && +- (flags & MAY_NOT_BLOCK)) +- return -ECHILD; +- + sad.tclass = tclass; + sad.requested = requested; + sad.ssid = ssid; +@@ -855,15 +843,14 @@ static int avc_update_node(struct selinux_avc *avc, + /* + * If we are in a non-blocking code path, e.g. VFS RCU walk, + * then we must not add permissions to a cache entry +- * because we cannot safely audit the denial. Otherwise, ++ * because we will not audit the denial. Otherwise, + * during the subsequent blocking retry (e.g. VFS ref walk), we + * will find the permissions already granted in the cache entry + * and won't audit anything at all, leading to silent denials in + * permissive mode that only appear when in enforcing mode. + * +- * See the corresponding handling in slow_avc_audit(), and the +- * logic in selinux_inode_permission for the MAY_NOT_BLOCK flag, +- * which is transliterated into AVC_NONBLOCKING. ++ * See the corresponding handling of MAY_NOT_BLOCK in avc_audit() ++ * and selinux_inode_permission(). + */ + if (flags & AVC_NONBLOCKING) + return 0; +@@ -1205,6 +1192,25 @@ int avc_has_perm(struct selinux_state *state, u32 ssid, u32 tsid, u16 tclass, + return rc; + } + ++int avc_has_perm_flags(struct selinux_state *state, ++ u32 ssid, u32 tsid, u16 tclass, u32 requested, ++ struct common_audit_data *auditdata, ++ int flags) ++{ ++ struct av_decision avd; ++ int rc, rc2; ++ ++ rc = avc_has_perm_noaudit(state, ssid, tsid, tclass, requested, ++ (flags & MAY_NOT_BLOCK) ? AVC_NONBLOCKING : 0, ++ &avd); ++ ++ rc2 = avc_audit(state, ssid, tsid, tclass, requested, &avd, rc, ++ auditdata, flags); ++ if (rc2) ++ return rc2; ++ return rc; ++} ++ + u32 avc_policy_seqno(struct selinux_state *state) + { + return state->avc->avc_cache.latest_notif; +diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c +index 9625b99e677f..39410913a694 100644 +--- a/security/selinux/hooks.c ++++ b/security/selinux/hooks.c +@@ -2766,6 +2766,14 @@ static int selinux_mount(const char *dev_name, + return path_has_perm(cred, path, FILE__MOUNTON); + } + ++static int selinux_move_mount(const struct path *from_path, ++ const struct path *to_path) ++{ ++ const struct cred *cred = current_cred(); ++ ++ return path_has_perm(cred, to_path, FILE__MOUNTON); ++} ++ + static int selinux_umount(struct vfsmount *mnt, int flags) + { + const struct cred *cred = current_cred(); +@@ -3008,14 +3016,14 @@ static int selinux_inode_follow_link(struct dentry *dentry, struct inode *inode, + if (IS_ERR(isec)) + return PTR_ERR(isec); + +- return avc_has_perm(&selinux_state, +- sid, isec->sid, isec->sclass, FILE__READ, &ad); ++ return avc_has_perm_flags(&selinux_state, ++ sid, isec->sid, isec->sclass, FILE__READ, &ad, ++ rcu ? MAY_NOT_BLOCK : 0); + } + + static noinline int audit_inode_permission(struct inode *inode, + u32 perms, u32 audited, u32 denied, +- int result, +- unsigned flags) ++ int result) + { + struct common_audit_data ad; + struct inode_security_struct *isec = selinux_inode(inode); +@@ -3026,7 +3034,7 @@ static noinline int audit_inode_permission(struct inode *inode, + + rc = slow_avc_audit(&selinux_state, + current_sid(), isec->sid, isec->sclass, perms, +- audited, denied, result, &ad, flags); ++ audited, denied, result, &ad); + if (rc) + return rc; + return 0; +@@ -3073,7 +3081,11 @@ static int selinux_inode_permission(struct inode *inode, int mask) + if (likely(!audited)) + return rc; + +- rc2 = audit_inode_permission(inode, perms, audited, denied, rc, flags); ++ /* fall back to ref-walk if we have to generate audit */ ++ if (flags & MAY_NOT_BLOCK) ++ return -ECHILD; ++ ++ rc2 = audit_inode_permission(inode, perms, audited, denied, rc); + if (rc2) + return rc2; + return rc; +@@ -6834,6 +6846,8 @@ static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = { + LSM_HOOK_INIT(sb_clone_mnt_opts, selinux_sb_clone_mnt_opts), + LSM_HOOK_INIT(sb_add_mnt_opt, selinux_add_mnt_opt), + ++ LSM_HOOK_INIT(move_mount, selinux_move_mount), ++ + LSM_HOOK_INIT(dentry_init_security, selinux_dentry_init_security), + LSM_HOOK_INIT(dentry_create_files_as, selinux_dentry_create_files_as), + +diff --git a/security/selinux/include/avc.h b/security/selinux/include/avc.h +index 7be0e1e90e8b..cf4cc3ef959b 100644 +--- a/security/selinux/include/avc.h ++++ b/security/selinux/include/avc.h +@@ -100,8 +100,7 @@ static inline u32 avc_audit_required(u32 requested, + int slow_avc_audit(struct selinux_state *state, + u32 ssid, u32 tsid, u16 tclass, + u32 requested, u32 audited, u32 denied, int result, +- struct common_audit_data *a, +- unsigned flags); ++ struct common_audit_data *a); + + /** + * avc_audit - Audit the granting or denial of permissions. +@@ -135,9 +134,12 @@ static inline int avc_audit(struct selinux_state *state, + audited = avc_audit_required(requested, avd, result, 0, &denied); + if (likely(!audited)) + return 0; ++ /* fall back to ref-walk if we have to generate audit */ ++ if (flags & MAY_NOT_BLOCK) ++ return -ECHILD; + return slow_avc_audit(state, ssid, tsid, tclass, + requested, audited, denied, result, +- a, flags); ++ a); + } + + #define AVC_STRICT 1 /* Ignore permissive mode. */ +@@ -153,6 +155,11 @@ int avc_has_perm(struct selinux_state *state, + u32 ssid, u32 tsid, + u16 tclass, u32 requested, + struct common_audit_data *auditdata); ++int avc_has_perm_flags(struct selinux_state *state, ++ u32 ssid, u32 tsid, ++ u16 tclass, u32 requested, ++ struct common_audit_data *auditdata, ++ int flags); + + int avc_has_extended_perms(struct selinux_state *state, + u32 ssid, u32 tsid, u16 tclass, u32 requested, +diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c +index d07026a846b9..8712a91e0e3e 100644 +--- a/sound/soc/soc-pcm.c ++++ b/sound/soc/soc-pcm.c +@@ -2297,42 +2297,81 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream, + } + EXPORT_SYMBOL_GPL(dpcm_be_dai_trigger); + ++static int dpcm_dai_trigger_fe_be(struct snd_pcm_substream *substream, ++ int cmd, bool fe_first) ++{ ++ struct snd_soc_pcm_runtime *fe = substream->private_data; ++ int ret; ++ ++ /* call trigger on the frontend before the backend. */ ++ if (fe_first) { ++ dev_dbg(fe->dev, "ASoC: pre trigger FE %s cmd %d\n", ++ fe->dai_link->name, cmd); ++ ++ ret = soc_pcm_trigger(substream, cmd); ++ if (ret < 0) ++ return ret; ++ ++ ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); ++ return ret; ++ } ++ ++ /* call trigger on the frontend after the backend. */ ++ ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); ++ if (ret < 0) ++ return ret; ++ ++ dev_dbg(fe->dev, "ASoC: post trigger FE %s cmd %d\n", ++ fe->dai_link->name, cmd); ++ ++ ret = soc_pcm_trigger(substream, cmd); ++ ++ return ret; ++} ++ + static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd) + { + struct snd_soc_pcm_runtime *fe = substream->private_data; +- int stream = substream->stream, ret; ++ int stream = substream->stream; ++ int ret = 0; + enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream]; + + fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; + + switch (trigger) { + case SND_SOC_DPCM_TRIGGER_PRE: +- /* call trigger on the frontend before the backend. */ +- +- dev_dbg(fe->dev, "ASoC: pre trigger FE %s cmd %d\n", +- fe->dai_link->name, cmd); +- +- ret = soc_pcm_trigger(substream, cmd); +- if (ret < 0) { +- dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret); +- goto out; ++ switch (cmd) { ++ case SNDRV_PCM_TRIGGER_START: ++ case SNDRV_PCM_TRIGGER_RESUME: ++ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: ++ ret = dpcm_dai_trigger_fe_be(substream, cmd, true); ++ break; ++ case SNDRV_PCM_TRIGGER_STOP: ++ case SNDRV_PCM_TRIGGER_SUSPEND: ++ case SNDRV_PCM_TRIGGER_PAUSE_PUSH: ++ ret = dpcm_dai_trigger_fe_be(substream, cmd, false); ++ break; ++ default: ++ ret = -EINVAL; ++ break; + } +- +- ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); + break; + case SND_SOC_DPCM_TRIGGER_POST: +- /* call trigger on the frontend after the backend. */ +- +- ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); +- if (ret < 0) { +- dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret); +- goto out; ++ switch (cmd) { ++ case SNDRV_PCM_TRIGGER_START: ++ case SNDRV_PCM_TRIGGER_RESUME: ++ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: ++ ret = dpcm_dai_trigger_fe_be(substream, cmd, false); ++ break; ++ case SNDRV_PCM_TRIGGER_STOP: ++ case SNDRV_PCM_TRIGGER_SUSPEND: ++ case SNDRV_PCM_TRIGGER_PAUSE_PUSH: ++ ret = dpcm_dai_trigger_fe_be(substream, cmd, true); ++ break; ++ default: ++ ret = -EINVAL; ++ break; + } +- +- dev_dbg(fe->dev, "ASoC: post trigger FE %s cmd %d\n", +- fe->dai_link->name, cmd); +- +- ret = soc_pcm_trigger(substream, cmd); + break; + case SND_SOC_DPCM_TRIGGER_BESPOKE: + /* bespoke trigger() - handles both FE and BEs */ +@@ -2341,10 +2380,6 @@ static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd) + fe->dai_link->name, cmd); + + ret = soc_pcm_bespoke_trigger(substream, cmd); +- if (ret < 0) { +- dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret); +- goto out; +- } + break; + default: + dev_err(fe->dev, "ASoC: invalid trigger cmd %d for %s\n", cmd, +@@ -2353,6 +2388,12 @@ static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd) + goto out; + } + ++ if (ret < 0) { ++ dev_err(fe->dev, "ASoC: trigger FE cmd: %d failed: %d\n", ++ cmd, ret); ++ goto out; ++ } ++ + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: +diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c +index ea0bcd58bcb9..2e388421c32f 100644 +--- a/tools/bpf/bpftool/prog.c ++++ b/tools/bpf/bpftool/prog.c +@@ -500,7 +500,7 @@ static int do_dump(int argc, char **argv) + buf = (unsigned char *)(info->jited_prog_insns); + member_len = info->jited_prog_len; + } else { /* DUMP_XLATED */ +- if (info->xlated_prog_len == 0) { ++ if (info->xlated_prog_len == 0 || !info->xlated_prog_insns) { + p_err("error retrieving insn dump: kernel.kptr_restrict set?"); + goto err_free; + } +diff --git a/tools/power/acpi/Makefile.config b/tools/power/acpi/Makefile.config +index 0111d246d1ca..54a2857c2510 100644 +--- a/tools/power/acpi/Makefile.config ++++ b/tools/power/acpi/Makefile.config +@@ -15,7 +15,7 @@ include $(srctree)/../../scripts/Makefile.include + + OUTPUT=$(srctree)/ + ifeq ("$(origin O)", "command line") +- OUTPUT := $(O)/power/acpi/ ++ OUTPUT := $(O)/tools/power/acpi/ + endif + #$(info Determined 'OUTPUT' to be $(OUTPUT)) + +diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c +new file mode 100644 +index 000000000000..07f5b462c2ef +--- /dev/null ++++ b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c +@@ -0,0 +1,74 @@ ++// SPDX-License-Identifier: GPL-2.0 ++// Copyright (c) 2020 Cloudflare ++ ++#include "test_progs.h" ++ ++static int connected_socket_v4(void) ++{ ++ struct sockaddr_in addr = { ++ .sin_family = AF_INET, ++ .sin_port = htons(80), ++ .sin_addr = { inet_addr("127.0.0.1") }, ++ }; ++ socklen_t len = sizeof(addr); ++ int s, repair, err; ++ ++ s = socket(AF_INET, SOCK_STREAM, 0); ++ if (CHECK_FAIL(s == -1)) ++ goto error; ++ ++ repair = TCP_REPAIR_ON; ++ err = setsockopt(s, SOL_TCP, TCP_REPAIR, &repair, sizeof(repair)); ++ if (CHECK_FAIL(err)) ++ goto error; ++ ++ err = connect(s, (struct sockaddr *)&addr, len); ++ if (CHECK_FAIL(err)) ++ goto error; ++ ++ repair = TCP_REPAIR_OFF_NO_WP; ++ err = setsockopt(s, SOL_TCP, TCP_REPAIR, &repair, sizeof(repair)); ++ if (CHECK_FAIL(err)) ++ goto error; ++ ++ return s; ++error: ++ perror(__func__); ++ close(s); ++ return -1; ++} ++ ++/* Create a map, populate it with one socket, and free the map. */ ++static void test_sockmap_create_update_free(enum bpf_map_type map_type) ++{ ++ const int zero = 0; ++ int s, map, err; ++ ++ s = connected_socket_v4(); ++ if (CHECK_FAIL(s == -1)) ++ return; ++ ++ map = bpf_create_map(map_type, sizeof(int), sizeof(int), 1, 0); ++ if (CHECK_FAIL(map == -1)) { ++ perror("bpf_create_map"); ++ goto out; ++ } ++ ++ err = bpf_map_update_elem(map, &zero, &s, BPF_NOEXIST); ++ if (CHECK_FAIL(err)) { ++ perror("bpf_map_update"); ++ goto out; ++ } ++ ++out: ++ close(map); ++ close(s); ++} ++ ++void test_sockmap_basic(void) ++{ ++ if (test__start_subtest("sockmap create_update_free")) ++ test_sockmap_create_update_free(BPF_MAP_TYPE_SOCKMAP); ++ if (test__start_subtest("sockhash create_update_free")) ++ test_sockmap_create_update_free(BPF_MAP_TYPE_SOCKHASH); ++} +diff --git a/virt/kvm/arm/aarch32.c b/virt/kvm/arm/aarch32.c +index 631d397ac81b..0a356aa91aa1 100644 +--- a/virt/kvm/arm/aarch32.c ++++ b/virt/kvm/arm/aarch32.c +@@ -15,6 +15,10 @@ + #include + #include + ++#define DFSR_FSC_EXTABT_LPAE 0x10 ++#define DFSR_FSC_EXTABT_nLPAE 0x08 ++#define DFSR_LPAE BIT(9) ++ + /* + * Table taken from ARMv8 ARM DDI0487B-B, table G1-10. + */ +@@ -181,10 +185,12 @@ static void inject_abt32(struct kvm_vcpu *vcpu, bool is_pabt, + + /* Give the guest an IMPLEMENTATION DEFINED exception */ + is_lpae = (vcpu_cp15(vcpu, c2_TTBCR) >> 31); +- if (is_lpae) +- *fsr = 1 << 9 | 0x34; +- else +- *fsr = 0x14; ++ if (is_lpae) { ++ *fsr = DFSR_LPAE | DFSR_FSC_EXTABT_LPAE; ++ } else { ++ /* no need to shuffle FS[4] into DFSR[10] as its 0 */ ++ *fsr = DFSR_FSC_EXTABT_nLPAE; ++ } + } + + void kvm_inject_dabt32(struct kvm_vcpu *vcpu, unsigned long addr) +diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c +index e2bb5bd60227..6b222100608f 100644 +--- a/virt/kvm/arm/arch_timer.c ++++ b/virt/kvm/arm/arch_timer.c +@@ -805,6 +805,7 @@ static u64 kvm_arm_timer_read(struct kvm_vcpu *vcpu, + switch (treg) { + case TIMER_REG_TVAL: + val = timer->cnt_cval - kvm_phys_timer_read() + timer->cntvoff; ++ val &= lower_32_bits(val); + break; + + case TIMER_REG_CTL: +@@ -850,7 +851,7 @@ static void kvm_arm_timer_write(struct kvm_vcpu *vcpu, + { + switch (treg) { + case TIMER_REG_TVAL: +- timer->cnt_cval = kvm_phys_timer_read() - timer->cntvoff + val; ++ timer->cnt_cval = kvm_phys_timer_read() - timer->cntvoff + (s32)val; + break; + + case TIMER_REG_CTL: +diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c +index f23c9cd5684f..ce7fa37987e1 100644 +--- a/virt/kvm/arm/mmu.c ++++ b/virt/kvm/arm/mmu.c +@@ -2147,7 +2147,8 @@ int kvm_test_age_hva(struct kvm *kvm, unsigned long hva) + if (!kvm->arch.pgd) + return 0; + trace_kvm_test_age_hva(hva); +- return handle_hva_to_gpa(kvm, hva, hva, kvm_test_age_hva_handler, NULL); ++ return handle_hva_to_gpa(kvm, hva, hva + PAGE_SIZE, ++ kvm_test_age_hva_handler, NULL); + } + + void kvm_mmu_free_memory_caches(struct kvm_vcpu *vcpu) +diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c +index 8731dfeced8b..4c08fd009768 100644 +--- a/virt/kvm/arm/pmu.c ++++ b/virt/kvm/arm/pmu.c +@@ -480,25 +480,45 @@ static void kvm_pmu_perf_overflow(struct perf_event *perf_event, + */ + void kvm_pmu_software_increment(struct kvm_vcpu *vcpu, u64 val) + { ++ struct kvm_pmu *pmu = &vcpu->arch.pmu; + int i; +- u64 type, enable, reg; + +- if (val == 0) ++ if (!(__vcpu_sys_reg(vcpu, PMCR_EL0) & ARMV8_PMU_PMCR_E)) + return; + +- enable = __vcpu_sys_reg(vcpu, PMCNTENSET_EL0); ++ /* Weed out disabled counters */ ++ val &= __vcpu_sys_reg(vcpu, PMCNTENSET_EL0); ++ + for (i = 0; i < ARMV8_PMU_CYCLE_IDX; i++) { ++ u64 type, reg; ++ + if (!(val & BIT(i))) + continue; +- type = __vcpu_sys_reg(vcpu, PMEVTYPER0_EL0 + i) +- & ARMV8_PMU_EVTYPE_EVENT; +- if ((type == ARMV8_PMUV3_PERFCTR_SW_INCR) +- && (enable & BIT(i))) { +- reg = __vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) + 1; ++ ++ /* PMSWINC only applies to ... SW_INC! */ ++ type = __vcpu_sys_reg(vcpu, PMEVTYPER0_EL0 + i); ++ type &= ARMV8_PMU_EVTYPE_EVENT; ++ if (type != ARMV8_PMUV3_PERFCTR_SW_INCR) ++ continue; ++ ++ /* increment this even SW_INC counter */ ++ reg = __vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) + 1; ++ reg = lower_32_bits(reg); ++ __vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) = reg; ++ ++ if (reg) /* no overflow on the low part */ ++ continue; ++ ++ if (kvm_pmu_pmc_is_chained(&pmu->pmc[i])) { ++ /* increment the high counter */ ++ reg = __vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i + 1) + 1; + reg = lower_32_bits(reg); +- __vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) = reg; +- if (!reg) +- __vcpu_sys_reg(vcpu, PMOVSSET_EL0) |= BIT(i); ++ __vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i + 1) = reg; ++ if (!reg) /* mark overflow on the high counter */ ++ __vcpu_sys_reg(vcpu, PMOVSSET_EL0) |= BIT(i + 1); ++ } else { ++ /* mark overflow on low counter */ ++ __vcpu_sys_reg(vcpu, PMOVSSET_EL0) |= BIT(i); + } + } + } +diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c +index 2be6b66b3856..f8ad7096555d 100644 +--- a/virt/kvm/arm/vgic/vgic-its.c ++++ b/virt/kvm/arm/vgic/vgic-its.c +@@ -2472,7 +2472,8 @@ static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz) + target_addr = (u32)(val >> KVM_ITS_CTE_RDBASE_SHIFT); + coll_id = val & KVM_ITS_CTE_ICID_MASK; + +- if (target_addr >= atomic_read(&kvm->online_vcpus)) ++ if (target_addr != COLLECTION_NOT_MAPPED && ++ target_addr >= atomic_read(&kvm->online_vcpus)) + return -EINVAL; + + collection = find_collection(its, coll_id); From 59d008816c50f39dc58ad8513989b7de8aef9edd Mon Sep 17 00:00:00 2001 From: JMCC Date: Sat, 15 Feb 2020 14:51:00 +0100 Subject: [PATCH 47/54] Fix temporarily disabling glamor for bionic due to Mesa bug --- lib/makeboarddeb.sh | 9 ++++----- .../common/etc/X11/xorg.conf.d/01-armbian-defaults.conf | 5 ----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/makeboarddeb.sh b/lib/makeboarddeb.sh index abf0612cee..af7a1a548f 100644 --- a/lib/makeboarddeb.sh +++ b/lib/makeboarddeb.sh @@ -163,11 +163,10 @@ create_board_package() if [[ $RELEASE == bionic ]]; then cat <<-EOF >> "${destination}"/DEBIAN/postinst # temporally disable acceleration in Bionic due to broken mesa packages - if [ -n "\$(cat /etc/X11/xorg.conf.d/01-armbian-defaults.conf 2> /dev/null | grep AccelMethod)" ]; then - sed -i '/\Device/,/^\[/ s/AccelMethod".*/AccelMethod"\t "none"/' /etc/X11/xorg.conf.d/01-armbian-defaults.conf - else - sed -i '/\Device/a \\\tOption\t\t\t"AccelMethod" "none"' /etc/X11/xorg.conf.d/01-armbian-defaults.conf - fi + echo 'Section "Device" + Identifier "Default Device" + Option "AccelMethod" "none" + EndSection' >> /etc/X11/xorg.conf.d/01-armbian-defaults.conf EOF fi diff --git a/packages/bsp/common/etc/X11/xorg.conf.d/01-armbian-defaults.conf b/packages/bsp/common/etc/X11/xorg.conf.d/01-armbian-defaults.conf index 98dbcb34af..7201e45c07 100644 --- a/packages/bsp/common/etc/X11/xorg.conf.d/01-armbian-defaults.conf +++ b/packages/bsp/common/etc/X11/xorg.conf.d/01-armbian-defaults.conf @@ -8,8 +8,3 @@ Section "ServerFlags" Option "SuspendTime" "0" Option "OffTime" "0" EndSection -Section "Device" - Identifier "Default Device" - Driver "modesetting" - Option "AccelMethod" "glamor" -EndSection From cc950ac8f3234e0a71e4d4ac6771598f54b75df3 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Sat, 15 Feb 2020 22:17:53 +0100 Subject: [PATCH 48/54] Remove broken sunxi-legacy patches --- .../sunxi-legacy/add-orangepi-zeroplus2.patch | 267 ------------------ ...s-allwinner-a64-Olinuxino-enable-USB.patch | 88 ------ .../board-olinuxino-A64-add-eMMC.patch | 35 --- ...twork-audio-orangepiwin-dts.patch.disabled | 181 ------------ ...002-enable_usb_uart1-orangepiwin-dts.patch | 49 ---- .../xxx-olinuxino-battery-audio.patch | 86 ------ .../xxx-teres-add-battery-hdmi-bits.patch | 158 ----------- 7 files changed, 864 deletions(-) delete mode 100644 patch/kernel/sunxi-legacy/add-orangepi-zeroplus2.patch delete mode 100644 patch/kernel/sunxi-legacy/board-a64-v3-15-19-arm64-dts-allwinner-a64-Olinuxino-enable-USB.patch delete mode 100644 patch/kernel/sunxi-legacy/board-olinuxino-A64-add-eMMC.patch delete mode 100644 patch/kernel/sunxi-legacy/xxx-0001-network-audio-orangepiwin-dts.patch.disabled delete mode 100644 patch/kernel/sunxi-legacy/xxx-0002-enable_usb_uart1-orangepiwin-dts.patch delete mode 100644 patch/kernel/sunxi-legacy/xxx-olinuxino-battery-audio.patch delete mode 100644 patch/kernel/sunxi-legacy/xxx-teres-add-battery-hdmi-bits.patch diff --git a/patch/kernel/sunxi-legacy/add-orangepi-zeroplus2.patch b/patch/kernel/sunxi-legacy/add-orangepi-zeroplus2.patch deleted file mode 100644 index 08dc639f9a..0000000000 --- a/patch/kernel/sunxi-legacy/add-orangepi-zeroplus2.patch +++ /dev/null @@ -1,267 +0,0 @@ -diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile -index 4b17f35d..6a6639ab 100644 ---- a/arch/arm/boot/dts/Makefile -+++ b/arch/arm/boot/dts/Makefile -@@ -918,6 +918,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \ - sun8i-h3-orangepi-pc-plus.dtb \ - sun8i-h3-orangepi-plus.dtb \ - sun8i-h3-orangepi-plus2e.dtb \ -+ sun8i-h3-orangepi-zeroplus2.dtb \ - sun8i-r16-bananapi-m2m.dtb \ - sun8i-r16-parrot.dtb \ - sun8i-v3s-licheepi-zero.dtb \ -diff --git a/arch/arm/boot/dts/sun8i-h3-orangepi-zeroplus2.dts b/arch/arm/boot/dts/sun8i-h3-orangepi-zeroplus2.dts -new file mode 100644 -index 0000000..9856052 ---- /dev/null -+++ b/arch/arm/boot/dts/sun8i-h3-orangepi-zeroplus2.dts -@@ -0,0 +1,229 @@ -+/* -+ * Copyright (C) Armbian -+ * -+ * This file is dual-licensed: you can use it either under the terms -+ * of the GPL or the X11 license, at your option. Note that this dual -+ * licensing only applies to this file, and not this project as a -+ * whole. -+ * -+ * a) This file is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of the -+ * License, or (at your option) any later version. -+ * -+ * This file is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Or, alternatively, -+ * -+ * b) Permission is hereby granted, free of charge, to any person -+ * obtaining a copy of this software and associated documentation -+ * files (the "Software"), to deal in the Software without -+ * restriction, including without limitation the rights to use, -+ * copy, modify, merge, publish, distribute, sublicense, and/or -+ * sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following -+ * conditions: -+ * -+ * The above copyright notice and this permission notice shall be -+ * included in all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -+ * OTHER DEALINGS IN THE SOFTWARE. -+ */ -+ -+/dts-v1/; -+#include "sun8i-h3.dtsi" -+#include "sunxi-common-regulators.dtsi" -+#include -+#include -+ -+/ { -+ model = "Xunlong Orange Pi Zero Plus 2"; -+ compatible = "xunlong,orangepi-zeroplus", "allwinner,sun8i-h3"; -+ -+ aliases { -+ ethernet1 = &brcmf; -+ }; -+ -+ chosen { -+ stdout-path = "serial0:115200n8"; -+ }; -+ -+ leds { -+ compatible = "gpio-leds"; -+ -+ pwr_led { -+ label = "orangepi:green:pwr"; -+ gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; -+ default-state = "on"; -+ }; -+ -+ status_led { -+ label = "orangepi:red:status"; -+ gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>; -+ linux,default-trigger = "heartbeat"; -+ }; -+ }; -+ -+ connector { -+ compatible = "hdmi-connector"; -+ type = "a"; -+ -+ port { -+ hdmi_con_in: endpoint { -+ remote-endpoint = <&hdmi_out_con>; -+ }; -+ }; -+ }; -+ -+ /delete-node/ reg_vcc_wifi; -+ -+ wifi_pwrseq: wifi_pwrseq { -+ compatible = "mmc-pwrseq-simple"; -+ reset-gpios = <&pio 0 9 GPIO_ACTIVE_LOW>; -+ post-power-on-delay-ms = <50>; -+ }; -+ -+ reg_usb1_vbus: usb1-vbus { -+ /delete-property/ gpio; -+ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; -+ status = "okay"; -+ }; -+ -+}; -+ -+&de { -+ status = "okay"; -+}; -+ -+&ehci0 { -+ status = "okay"; -+}; -+ -+ -+&hdmi { -+ status = "okay"; -+}; -+ -+&hdmi_out { -+ hdmi_out_con: endpoint { -+ remote-endpoint = <&hdmi_con_in>; -+ }; -+}; -+ -+&sound_hdmi { -+ status = "okay"; -+}; -+ -+&i2s2 { -+ status = "okay"; -+}; -+ -+&mixer0 { -+ status = "okay"; -+}; -+ -+&tcon0 { -+ status = "okay"; -+}; -+ -+&mmc0 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins>; -+ vmmc-supply = <®_vcc3v3>; -+ bus-width = <4>; -+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 */ -+ cd-inverted; -+ status = "okay"; -+}; -+ -+&mmc1 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc1_pins>; -+ vmmc-supply = <®_vcc3v3>; -+ vqmmc-supply = <®_vcc3v3>; -+ mmc-pwrseq = <&wifi_pwrseq>; -+ bus-width = <4>; -+ non-removable; -+ status = "okay"; -+ -+ /delete-node/ sdio_wifi@1; -+ -+ brcmf: bcrmf@1 { -+ reg = <1>; -+ compatible = "brcm,bcm4329-fmac"; -+ interrupt-parent = <&r_pio>; -+ interrupts = <0 7 IRQ_TYPE_LEVEL_LOW>; /* PL7 / EINT7 */ -+ interrupt-names = "host-wake"; -+ }; -+}; -+ -+&mmc2 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc2_8bit_pins>; -+ vmmc-supply = <®_vcc3v3>; -+ bus-width = <8>; -+ non-removable; -+ cap-mmc-hw-reset; -+ status = "okay"; -+}; -+ -+&pio { -+ bt_pwr_pin: bt_pwr_pin@0 { -+ pins = "PA10"; -+ function = "gpio_out"; -+ }; -+}; -+ -+&ohci0 { -+ status = "okay"; -+}; -+ -+&spi0 { -+ /* Disable SPI NOR by default: it optional on Orange Pi Zero boards */ -+ status = "disabled"; -+ -+ flash@0 { -+ #address-cells = <1>; -+ #size-cells = <1>; -+ compatible = "mxicy,mx25l1606e", "winbond,w25q128"; -+ reg = <0>; -+ spi-max-frequency = <40000000>; -+ }; -+}; -+ -+&uart0 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart0_pins_a>; -+ status = "okay"; -+}; -+ -+&uart1 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; -+ status = "okay"; -+}; -+ -+&usb_otg { -+ dr_mode = "peripheral"; -+ status = "okay"; -+}; -+ -+&usbphy { -+ /* -+ * USB Type-A port VBUS is always on. However, MicroUSB VBUS can only -+ * power up the board; when it's used as OTG port, this VBUS is -+ * always off even if the board is powered via GPIO pins. -+ */ -+ status = "okay"; -+ usb0_id_det-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */ -+}; -diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile -index 977b6ffca..f0df0d26b 100644 ---- a/arch/arm/boot/dts/Makefile -+++ b/arch/arm/boot/dts/Makefile -@@ -1053,6 +1053,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \ - sun8i-h3-orangepi-plus.dtb \ - sun8i-h3-orangepi-plus2e.dtb \ - sun8i-h3-orangepi-zeroplus2.dtb \ -+ sun8i-h3-orangepi-zero-plus2.dtb \ - sun8i-r16-bananapi-m2m.dtb \ - sun8i-r16-nintendo-nes-classic.dtb \ - sun8i-r16-nintendo-super-nes-classic.dtb \ -diff --git a/arch/arm/boot/dts/sun8i-h3-orangepi-zero-plus2.dts b/arch/arm/boot/dts/sun8i-h3-orangepi-zero-plus2.dts -new file mode 120000 -index 000000000..253f1d7c0 ---- /dev/null -+++ b/arch/arm/boot/dts/sun8i-h3-orangepi-zero-plus2.dts -@@ -0,0 +1 @@ -+sun8i-h3-orangepi-zeroplus2.dts -\ No newline at end of file diff --git a/patch/kernel/sunxi-legacy/board-a64-v3-15-19-arm64-dts-allwinner-a64-Olinuxino-enable-USB.patch b/patch/kernel/sunxi-legacy/board-a64-v3-15-19-arm64-dts-allwinner-a64-Olinuxino-enable-USB.patch deleted file mode 100644 index 1df291a197..0000000000 --- a/patch/kernel/sunxi-legacy/board-a64-v3-15-19-arm64-dts-allwinner-a64-Olinuxino-enable-USB.patch +++ /dev/null @@ -1,88 +0,0 @@ -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -index 26075b9a76e3..a1c2f06ed474 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -@@ -77,6 +77,17 @@ - regulator-max-microvolt = <3300000>; - }; - -+ reg_usb1_vbus: usb1-vbus { -+ compatible = "regulator-fixed"; -+ regulator-name = "usb1-vbus"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ regulator-boot-on; -+ enable-active-high; -+ gpio = <&pio 6 9 GPIO_ACTIVE_HIGH>; /* PG9 */ -+ status = "okay"; -+ }; -+ - wifi_pwrseq: wifi_pwrseq { - compatible = "mmc-pwrseq-simple"; - reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */ -@@ -98,6 +109,14 @@ - }; - }; - -+&ehci0 { -+ status = "okay"; -+}; -+ -+&ehci1 { -+ status = "okay"; -+}; -+ - &emac { - pinctrl-names = "default"; - pinctrl-0 = <&rgmii_pins>; -@@ -109,6 +128,14 @@ - }; - }; - -+&ohci0 { -+ status = "okay"; -+}; -+ -+&ohci1 { -+ status = "okay"; -+}; -+ - &r_rsb { - status = "okay"; - -@@ -117,6 +144,7 @@ - reg = <0x3a3>; - interrupt-parent = <&r_intc>; - interrupts = <0 IRQ_TYPE_LEVEL_LOW>; -+ x-powers,drive-vbus-en; /* set N_VBUSEN as output pin */ - }; - }; - -@@ -201,6 +229,11 @@ - regulator-name = "vcc-wifi-io"; - }; - -+®_drivevbus { -+ regulator-name = "usb0-vbus"; -+ status = "okay"; -+}; -+ - ®_eldo1 { - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; -@@ -244,3 +277,15 @@ - pinctrl-0 = <&uart0_pins_a>; - status = "okay"; - }; -+ -+&usb_otg { -+ dr_mode = "otg"; -+ status = "okay"; -+}; -+ -+&usbphy { -+ status = "okay"; -+ usb0_id_det-gpios = <&pio 7 9 GPIO_ACTIVE_HIGH>; /* PH9 */ -+ usb0_vbus-supply = <®_drivevbus>; -+ usb1_vbus-supply = <®_usb1_vbus>; -+}; diff --git a/patch/kernel/sunxi-legacy/board-olinuxino-A64-add-eMMC.patch b/patch/kernel/sunxi-legacy/board-olinuxino-A64-add-eMMC.patch deleted file mode 100644 index 2f3e58a314..0000000000 --- a/patch/kernel/sunxi-legacy/board-olinuxino-A64-add-eMMC.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -index 3b3081b..24cde3d 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -@@ -81,6 +81,13 @@ - status = "okay"; - }; - -+ reg_vcc3v3: vcc3v3 { -+ compatible = "regulator-fixed"; -+ regulator-name = "vcc3v3"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ }; -+ - wifi_pwrseq: wifi_pwrseq { - compatible = "mmc-pwrseq-simple"; - reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */ -@@ -92,6 +99,16 @@ - }; - }; - -+&mmc2 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc2_pins>; -+ vmmc-supply = <®_vcc3v3>; -+ bus-width = <8>; -+ non-removable; -+ cap-mmc-hw-reset; -+ status = "okay"; -+}; -+ - &r_rsb { - status = "okay"; - diff --git a/patch/kernel/sunxi-legacy/xxx-0001-network-audio-orangepiwin-dts.patch.disabled b/patch/kernel/sunxi-legacy/xxx-0001-network-audio-orangepiwin-dts.patch.disabled deleted file mode 100644 index 4442abd06d..0000000000 --- a/patch/kernel/sunxi-legacy/xxx-0001-network-audio-orangepiwin-dts.patch.disabled +++ /dev/null @@ -1,181 +0,0 @@ -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -index eefe0a458..b5cb62beb 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -@@ -52,6 +52,7 @@ - compatible = "xunlong,orangepi-win", "allwinner,sun50i-a64"; - - aliases { -+ ethernet0 = &emac; - serial0 = &uart0; - }; - -@@ -59,6 +60,43 @@ - stdout-path = "serial0:115200n8"; - }; - -+ leds { -+ compatible = "gpio-leds"; -+ -+ status { -+ label = "orangepi:green:status"; -+ gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */ -+ }; -+ }; -+ -+ reg_gmac_3v3: gmac-3v3 { -+ compatible = "regulator-fixed"; -+ regulator-name = "gmac-3v3"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ startup-delay-us = <100000>; -+ regulator-boot-on; -+ enable-active-high; -+ gpio = <&pio 3 14 GPIO_ACTIVE_HIGH>; /* PD14 */ -+ status = "okay"; -+ }; -+ -+ reg_usb1_vbus: usb1-vbus { -+ compatible = "regulator-fixed"; -+ regulator-name = "usb1-vbus"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ regulator-boot-on; -+ enable-active-high; -+ gpio = <&pio 3 7 GPIO_ACTIVE_HIGH>; /* PD7 */ -+ status = "okay"; -+ }; -+ -+ wifi_pwrseq: wifi_pwrseq { -+ compatible = "mmc-pwrseq-simple"; -+ reset-gpios = <&r_pio 0 8 GPIO_ACTIVE_LOW>; /* PL8 */ -+ }; -+ - hdmi-connector { - compatible = "hdmi-connector"; - type = "a"; -@@ -72,10 +109,26 @@ - - }; - -+&codec { -+ status = "okay"; -+}; -+ -+&codec_analog { -+ status = "okay"; -+}; -+ -+&dai { -+ status = "okay"; -+}; -+ - &de { - status = "okay"; - }; - -+&cpu0 { -+ cpu-supply = <®_dcdc2>; -+}; -+ - &ehci1 { - status = "okay"; - }; -@@ -91,14 +144,51 @@ - }; - }; - -+&i2s2 { -+ status = "okay"; -+}; -+ -+&mixer0 { -+ status = "okay"; -+}; -+ -+&emac { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&rgmii_pins>; -+ phy-mode = "rgmii"; -+ phy-handle = <&ext_rgmii_phy>; -+ phy-supply = <®_gmac_3v3>; -+ status = "okay"; -+}; -+ -+&mdio { -+ ext_rgmii_phy: ethernet-phy@1 { -+ compatible = "ethernet-phy-ieee802.3-c22"; -+ reg = <1>; -+ }; -+}; -+ - &mmc0 { - pinctrl-names = "default"; - pinctrl-0 = <&mmc0_pins>; - vmmc-supply = <®_dcdc1>; -- cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; -+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ -+ disable-wp; -+ bus-width = <4>; - status = "okay"; - }; - -+&mmc1 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc1_pins>; -+ vmmc-supply = <®_dldo2>; -+ vqmmc-supply = <®_dldo4>; -+ mmc-pwrseq = <&wifi_pwrseq>; -+ bus-width = <4>; -+ non-removable; -+ status = "okay"; -+}; -+ - &ohci1 { - status = "okay"; - }; -@@ -116,6 +206,14 @@ - - #include "axp803.dtsi" - -+&ac_power_supply { -+ status = "okay"; -+}; -+ -+&battery_power_supply { -+ status = "okay"; -+}; -+ - ®_aldo1 { - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; -@@ -228,6 +326,30 @@ - vcc-hdmi-supply = <®_dldo1>; - }; - -+&sound { -+ status = "okay"; -+ simple-audio-card,widgets = "Microphone", "Internal Microphone Left", -+ "Microphone", "Internal Microphone Right", -+ "Headphone", "Headphone Jack"; -+ simple-audio-card,aux-devs = <&codec_analog>; -+ simple-audio-card,routing = -+ "Left DAC", "AIF1 Slot 0 Left", -+ "Right DAC", "AIF1 Slot 0 Right", -+ "Headphone Jack", "HP", -+ "AIF1 Slot 0 Left ADC", "Left ADC", -+ "AIF1 Slot 0 Right ADC", "Right ADC", -+ "Left ADC", "ADC", -+ "Right ADC", "ADC", -+ "Internal Microphone Left", "MBIAS", -+ "MIC1", "Internal Microphone Left", -+ "Internal Microphone Right", "HBIAS", -+ "MIC2", "Internal Microphone Right"; -+}; -+ -+&sound_hdmi { -+ status = "okay"; -+}; -+ - &uart0 { - status = "okay"; diff --git a/patch/kernel/sunxi-legacy/xxx-0002-enable_usb_uart1-orangepiwin-dts.patch b/patch/kernel/sunxi-legacy/xxx-0002-enable_usb_uart1-orangepiwin-dts.patch deleted file mode 100644 index 3aed0c7a47..0000000000 --- a/patch/kernel/sunxi-legacy/xxx-0002-enable_usb_uart1-orangepiwin-dts.patch +++ /dev/null @@ -1,49 +0,0 @@ -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -index f50a977cd..a3e14121e 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -@@ -128,6 +128,10 @@ - cpu-supply = <®_dcdc2>; - }; - -+&ehci0 { -+ status = "okay"; -+}; -+ - &ehci1 { - status = "okay"; - }; -@@ -188,6 +192,10 @@ - status = "okay"; - }; - -+&ohci0 { -+ status = "okay"; -+}; -+ - &ohci1 { - status = "okay"; - }; -@@ -350,7 +358,20 @@ - status = "okay"; - }; - --&usbphy { -+/* Bluetooth */ -+&uart1 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; - status = "okay"; - }; - -+&usb_otg { -+ dr_mode = "otg"; -+ status = "okay"; -+}; -+ -+&usbphy { -+ usb0_id_det-gpios = <&pio 7 9 GPIO_ACTIVE_HIGH>; /* PH9 */ -+ usb1_vbus-supply = <®_usb1_vbus>; -+ status = "okay"; -+}; -\ No newline at end of file diff --git a/patch/kernel/sunxi-legacy/xxx-olinuxino-battery-audio.patch b/patch/kernel/sunxi-legacy/xxx-olinuxino-battery-audio.patch deleted file mode 100644 index 39f9a336c2..0000000000 --- a/patch/kernel/sunxi-legacy/xxx-olinuxino-battery-audio.patch +++ /dev/null @@ -1,86 +0,0 @@ -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -index 3792566cd..42b838b1f 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts -@@ -94,6 +94,18 @@ - }; - }; - -+&codec { -+ status = "okay"; -+}; -+ -+&codec_analog { -+ status = "okay"; -+}; -+ -+&dai { -+ status = "okay"; -+}; -+ - &de { - status = "okay"; - }; -@@ -109,6 +121,14 @@ - }; - }; - -+&i2s2 { -+ status = "okay"; -+}; -+ -+&mixer0 { -+ status = "okay"; -+}; -+ - &ehci0 { - status = "okay"; - }; -@@ -194,6 +214,14 @@ - - #include "axp803.dtsi" - -+&ac_power_supply { -+ status = "okay"; -+}; -+ -+&battery_power_supply { -+ status = "okay"; -+}; -+ - ®_aldo1 { - regulator-always-on; - regulator-min-microvolt = <2800000>; -@@ -316,6 +344,32 @@ - vcc-hdmi-supply = <®_dldo1>; - }; - -+&sound { -+ status = "okay"; -+ simple-audio-card,widgets = "Microphone", "Internal Microphone Left", -+ "Microphone", "Internal Microphone Right", -+ "Headphone", "Headphone Jack"; -+ simple-audio-card,aux-devs = <&codec_analog>; -+ simple-audio-card,routing = -+ "Left DAC", "AIF1 Slot 0 Left", -+ "Right DAC", "AIF1 Slot 0 Right", -+ "INL", "LINEOUT", -+ "INR", "LINEOUT", -+ "Headphone Jack", "HP", -+ "AIF1 Slot 0 Left ADC", "Left ADC", -+ "AIF1 Slot 0 Right ADC", "Right ADC", -+ "Left ADC", "ADC", -+ "Right ADC", "ADC", -+ "Internal Microphone Left", "MBIAS", -+ "MIC1", "Internal Microphone Left", -+ "Internal Microphone Right", "HBIAS", -+ "MIC2", "Internal Microphone Right"; -+}; -+ -+&sound_hdmi { -+ status = "okay"; -+}; -+ - &uart0 { - pinctrl-names = "default"; - pinctrl-0 = <&uart0_pins_a>; diff --git a/patch/kernel/sunxi-legacy/xxx-teres-add-battery-hdmi-bits.patch b/patch/kernel/sunxi-legacy/xxx-teres-add-battery-hdmi-bits.patch deleted file mode 100644 index 2e8d6c6f1b..0000000000 --- a/patch/kernel/sunxi-legacy/xxx-teres-add-battery-hdmi-bits.patch +++ /dev/null @@ -1,158 +0,0 @@ -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -index 6c3318b3c..92ed9665f 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts -@@ -19,6 +19,15 @@ - - aliases { - serial0 = &uart0; -+ ethernet0 = &rtl8723bs; -+ }; -+ -+ backlight: backlight { -+ compatible = "pwm-backlight"; -+ pwms = <&pwm 0 50000 0>; -+ brightness-levels = <0 5 10 15 20 30 40 55 70 85 100>; -+ default-brightness-level = <2>; -+ enable-gpios = <&pio 3 22 GPIO_ACTIVE_HIGH>; /* PD22 */ - }; - - chosen { -@@ -42,6 +51,17 @@ - }; - }; - -+ hdmi-connector { -+ compatible = "hdmi-connector"; -+ type = "a"; -+ -+ port { -+ hdmi_con_in: endpoint { -+ remote-endpoint = <&hdmi_out_con>; -+ }; -+ }; -+ }; -+ - leds { - compatible = "gpio-leds"; - -@@ -66,16 +86,39 @@ - status = "okay"; - }; - -+ speaker_amp: speaker_amp { -+ compatible = "simple-audio-amplifier"; -+ enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; -+ }; -+ - wifi_pwrseq: wifi_pwrseq { - compatible = "mmc-pwrseq-simple"; - reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */ - }; - }; - -+&codec { -+ status = "okay"; -+}; -+ -+&codec_analog { -+ status = "okay"; -+}; -+ -+&dai { -+ status = "okay"; -+}; -+ - &de { - status = "okay"; - }; - -+&ehci0 { -+ phys = <&usbphy 0>; -+ phy-names = "usb"; -+ status = "okay"; -+}; -+ - &ehci1 { - status = "okay"; - }; -@@ -102,6 +145,21 @@ - }; - }; - -+&hdmi { -+ hvcc-supply = <®_dldo1>; -+ status = "okay"; -+}; -+ -+&hdmi_out { -+ hdmi_out_con: endpoint { -+ remote-endpoint = <&hdmi_con_in>; -+ }; -+}; -+ -+&i2s2 { -+ status = "okay"; -+}; -+ - &mixer0 { - status = "okay"; - }; -@@ -145,10 +203,20 @@ - status = "okay"; - }; - -+&ohci0 { -+ phys = <&usbphy 0>; -+ phy-names = "usb"; -+ status = "okay"; -+}; -+ - &ohci1 { - status = "okay"; - }; - -+&pwm { -+ status = "okay"; -+}; -+ - &r_rsb { - status = "okay"; - -@@ -163,6 +231,14 @@ - - #include "axp803.dtsi" - -+&ac_power_supply { -+ status = "okay"; -+}; -+ -+&battery_power_supply { -+ status = "okay"; -+}; -+ - ®_aldo1 { - regulator-always-on; - regulator-min-microvolt = <2800000>; -@@ -276,6 +352,10 @@ - vcc-hdmi-supply = <®_dldo1>; - }; - -+&sound_hdmi { -+ status = "okay"; -+}; -+ - &tcon0 { - pinctrl-names = "default"; - pinctrl-0 = <&lcd_rgb666_pins>; -@@ -296,6 +376,10 @@ - status = "okay"; - }; - -+&usb_otg { -+ dr_mode = "host"; -+}; -+ - &usbphy { - usb1_vbus-supply = <®_usb1_vbus>; - status = "okay"; From a5472556aa9fbd505cf468c95063eaa7759026ad Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Sun, 16 Feb 2020 21:57:04 +0100 Subject: [PATCH 49/54] Build-all bugfix --- lib/build-all-ng.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/build-all-ng.sh b/lib/build-all-ng.sh index 29f46509ce..af689bfb3e 100644 --- a/lib/build-all-ng.sh +++ b/lib/build-all-ng.sh @@ -209,7 +209,7 @@ function build_all() # unset also board related variables unset BOARDFAMILY DESKTOP_AUTOLOGIN DEFAULT_CONSOLE FULL_DESKTOP MODULES_CURRENT MODULES_LEGACY MODULES_DEV \ BOOTCONFIG MODULES_BLACKLIST_LEGACY MODULES_BLACKLIST_CURRENT MODULES_BLACKLIST_DEV DEFAULT_OVERLAYS SERIALCON \ - BUILD_MINIMAL RELEASE ATFBRANCH + BUILD_MINIMAL RELEASE ATFBRANCH BOOT_FDT_FILE read -r BOARD BRANCH RELEASE BUILD_TARGET BUILD_STABILITY BUILD_IMAGE <<< "${line}" From 3e9f46d3cd4b61edda85f92b2f9daac540e729cc Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Mon, 17 Feb 2020 01:52:08 +0100 Subject: [PATCH 50/54] Few last bug fixes --- lib/makeboarddeb.sh | 18 ++++++------- .../etc/update-motd.d/10-armbian-header | 4 ++- .../xxx-add-bananapim2-zero-eth.patch | 26 +++++++++++++++++++ .../xxx-add-bananapim2-zero-eth.patch | 26 +++++++++++++++++++ 4 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 patch/kernel/sunxi-current/xxx-add-bananapim2-zero-eth.patch create mode 100644 patch/kernel/sunxi-dev/xxx-add-bananapim2-zero-eth.patch diff --git a/lib/makeboarddeb.sh b/lib/makeboarddeb.sh index af7a1a548f..fc8e878ab4 100644 --- a/lib/makeboarddeb.sh +++ b/lib/makeboarddeb.sh @@ -160,15 +160,15 @@ create_board_package() EOF - if [[ $RELEASE == bionic ]]; then - cat <<-EOF >> "${destination}"/DEBIAN/postinst - # temporally disable acceleration in Bionic due to broken mesa packages - echo 'Section "Device" - Identifier "Default Device" - Option "AccelMethod" "none" - EndSection' >> /etc/X11/xorg.conf.d/01-armbian-defaults.conf - EOF - fi +# if [[ $RELEASE == bionic ]]; then +# cat <<-EOF >> "${destination}"/DEBIAN/postinst +# # temporally disable acceleration in Bionic due to broken mesa packages +# echo 'Section "Device" +# Identifier "Default Device" +# Option "AccelMethod" "none" +# EndSection' >> /etc/X11/xorg.conf.d/01-armbian-defaults.conf +# EOF +# fi # install bootscripts if they are not present. Fix upgrades from old images if [[ $FORCE_BOOTSCRIPT_UPDATE == yes ]]; then diff --git a/packages/bsp/common/etc/update-motd.d/10-armbian-header b/packages/bsp/common/etc/update-motd.d/10-armbian-header index f3f2b4f257..b3fd47a225 100755 --- a/packages/bsp/common/etc/update-motd.d/10-armbian-header +++ b/packages/bsp/common/etc/update-motd.d/10-armbian-header @@ -41,4 +41,6 @@ if [[ -n $DISTRIBUTION_STATUS && $DISTRIBUTION_STATUS != supported ]]; then UNSUPPORTED_TEXT+="unsupported ($DISTRIBUTION_CODENAME) userspace!" fi -[[ -n $UNSUPPORTED_TEXT ]] && echo -e "\e[0;91mNo end-user support: \x1B[0m$UNSUPPORTED_TEXT\n" +if [[ -n $UNSUPPORTED_TEXT ]]; then + echo -e "\e[0;91mNo end-user support: \x1B[0m$UNSUPPORTED_TEXT\n" +fi diff --git a/patch/kernel/sunxi-current/xxx-add-bananapim2-zero-eth.patch b/patch/kernel/sunxi-current/xxx-add-bananapim2-zero-eth.patch new file mode 100644 index 0000000000..48b53042cb --- /dev/null +++ b/patch/kernel/sunxi-current/xxx-add-bananapim2-zero-eth.patch @@ -0,0 +1,26 @@ +From 5100551511ef2c6f6739a0987ab5d871efdc09d3 Mon Sep 17 00:00:00 2001 +From: PJBrs +Date: Sun, 16 Feb 2020 16:36:13 +0100 +Subject: [PATCH] ARM: dts: sunxi: h2-plus-bananapi-m2-zero: Add ethernet + +This patch enables the ethernet driver for the BananaPi M2 Zero +--- + arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts +index d277d043031b..af001b12ea8f 100644 +--- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts ++++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts +@@ -151,3 +151,11 @@ + */ + status = "okay"; + }; ++ ++ ++&emac { ++ status = "okay"; ++ phy-handle = <&int_mii_phy>; ++ phy-mode = "mii"; ++ allwinner,leds-active-low; ++}; diff --git a/patch/kernel/sunxi-dev/xxx-add-bananapim2-zero-eth.patch b/patch/kernel/sunxi-dev/xxx-add-bananapim2-zero-eth.patch new file mode 100644 index 0000000000..48b53042cb --- /dev/null +++ b/patch/kernel/sunxi-dev/xxx-add-bananapim2-zero-eth.patch @@ -0,0 +1,26 @@ +From 5100551511ef2c6f6739a0987ab5d871efdc09d3 Mon Sep 17 00:00:00 2001 +From: PJBrs +Date: Sun, 16 Feb 2020 16:36:13 +0100 +Subject: [PATCH] ARM: dts: sunxi: h2-plus-bananapi-m2-zero: Add ethernet + +This patch enables the ethernet driver for the BananaPi M2 Zero +--- + arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts +index d277d043031b..af001b12ea8f 100644 +--- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts ++++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts +@@ -151,3 +151,11 @@ + */ + status = "okay"; + }; ++ ++ ++&emac { ++ status = "okay"; ++ phy-handle = <&int_mii_phy>; ++ phy-mode = "mii"; ++ allwinner,leds-active-low; ++}; From fd20e6051de1b764fa8e759843fd1dd1a2323007 Mon Sep 17 00:00:00 2001 From: Werner Date: Mon, 17 Feb 2020 06:28:52 +0100 Subject: [PATCH 51/54] [sunxi] Enable RTL8XXXU --- config/kernel/linux-sunxi-legacy.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/kernel/linux-sunxi-legacy.config b/config/kernel/linux-sunxi-legacy.config index 9efd26f52c..2994423802 100644 --- a/config/kernel/linux-sunxi-legacy.config +++ b/config/kernel/linux-sunxi-legacy.config @@ -2417,7 +2417,7 @@ CONFIG_RTLWIFI=m CONFIG_RTLWIFI_USB=m # CONFIG_RTLWIFI_DEBUG is not set CONFIG_RTL8192C_COMMON=m -# CONFIG_RTL8XXXU is not set +CONFIG_RTL8XXXU=m CONFIG_RTL8723CS=m CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set From ffcc76166a62eaef3c06c5ae6c776d02db88f415 Mon Sep 17 00:00:00 2001 From: Werner Date: Mon, 17 Feb 2020 06:29:25 +0100 Subject: [PATCH 52/54] [sunxi] Enable RTL8XXXU --- config/kernel/linux-sunxi-dev.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/kernel/linux-sunxi-dev.config b/config/kernel/linux-sunxi-dev.config index 5a7b4dc819..8e6eda9e69 100644 --- a/config/kernel/linux-sunxi-dev.config +++ b/config/kernel/linux-sunxi-dev.config @@ -2525,7 +2525,7 @@ CONFIG_RTLWIFI=m CONFIG_RTLWIFI_USB=m # CONFIG_RTLWIFI_DEBUG is not set CONFIG_RTL8192C_COMMON=m -# CONFIG_RTL8XXXU is not set +CONFIG_RTL8XXXU=m CONFIG_RTL8723CS=m CONFIG_RTW88=m CONFIG_WLAN_VENDOR_RSI=y From ebec2016a46dbcbe75ed7d7c724e226ee40d31ad Mon Sep 17 00:00:00 2001 From: Werner Date: Mon, 17 Feb 2020 06:29:55 +0100 Subject: [PATCH 53/54] [sunxi] Enable RTL8XXXU --- config/kernel/linux-sunxi-current.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/kernel/linux-sunxi-current.config b/config/kernel/linux-sunxi-current.config index 2b680a4778..6107d8c0b3 100644 --- a/config/kernel/linux-sunxi-current.config +++ b/config/kernel/linux-sunxi-current.config @@ -2557,7 +2557,7 @@ CONFIG_RTLWIFI=m CONFIG_RTLWIFI_USB=m # CONFIG_RTLWIFI_DEBUG is not set CONFIG_RTL8192C_COMMON=m -# CONFIG_RTL8XXXU is not set +CONFIG_RTL8XXXU=m CONFIG_RTL8723CS=m CONFIG_RTW88=m CONFIG_WLAN_VENDOR_RSI=y From caf429bcfd05bf8b7c16bef459fdb7a8f3efddb9 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Tue, 18 Feb 2020 00:20:26 +0100 Subject: [PATCH 54/54] Add Orangepi 4 build targets --- config/targets.conf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config/targets.conf b/config/targets.conf index 29949cdafa..c23898f1b6 100644 --- a/config/targets.conf +++ b/config/targets.conf @@ -367,6 +367,14 @@ orangepi3 current stretch cli stable yes orangepi3 current bionic desktop stable yes orangepi3 current bullseye cli stable yes +# Orangepi 4 + +orangepi4 legacy buster cli stable yes +orangepi4 legacy bullseye cli stable yes +orangepi4 legacy bionic desktop stable yes +orangepi4 current buster desktop stable yes +orangepi4 current bionic minimal stable yes + # orangepi-r1 orangepi-r1 current buster cli stable yes