diff options
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1084_linux-4.19.85.patch | 16272 |
2 files changed, 16276 insertions, 0 deletions
diff --git a/0000_README b/0000_README index 3d259d67..ebd08d7f 100644 --- a/0000_README +++ b/0000_README @@ -375,6 +375,10 @@ Patch: 1083_linux-4.19.84.patch From: https://www.kernel.org Desc: Linux 4.19.84 +Patch: 1084_linux-4.19.85.patch +From: https://www.kernel.org +Desc: Linux 4.19.85 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1084_linux-4.19.85.patch b/1084_linux-4.19.85.patch new file mode 100644 index 00000000..99499473 --- /dev/null +++ b/1084_linux-4.19.85.patch @@ -0,0 +1,16272 @@ +diff --git a/Documentation/devicetree/bindings/media/i2c/adv748x.txt b/Documentation/devicetree/bindings/media/i2c/adv748x.txt +index 21ffb5ed8183..54d1d3bc1869 100644 +--- a/Documentation/devicetree/bindings/media/i2c/adv748x.txt ++++ b/Documentation/devicetree/bindings/media/i2c/adv748x.txt +@@ -73,7 +73,7 @@ Example: + }; + }; + +- port@10 { ++ port@a { + reg = <10>; + + adv7482_txa: endpoint { +@@ -83,7 +83,7 @@ Example: + }; + }; + +- port@11 { ++ port@b { + reg = <11>; + + adv7482_txb: endpoint { +diff --git a/Documentation/devicetree/bindings/net/brcm,unimac-mdio.txt b/Documentation/devicetree/bindings/net/brcm,unimac-mdio.txt +index 4648948f7c3b..e15589f47787 100644 +--- a/Documentation/devicetree/bindings/net/brcm,unimac-mdio.txt ++++ b/Documentation/devicetree/bindings/net/brcm,unimac-mdio.txt +@@ -19,6 +19,9 @@ Optional properties: + - interrupt-names: must be "mdio_done_error" when there is a share interrupt fed + to this hardware block, or must be "mdio_done" for the first interrupt and + "mdio_error" for the second when there are separate interrupts ++- clocks: A reference to the clock supplying the MDIO bus controller ++- clock-frequency: the MDIO bus clock that must be output by the MDIO bus ++ hardware, if absent, the default hardware values are used + + Child nodes of this MDIO bus controller node are standard Ethernet PHY device + nodes as described in Documentation/devicetree/bindings/net/phy.txt +diff --git a/Makefile b/Makefile +index 1ca0b8f37951..d6f7c5a323c0 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 19 +-SUBLEVEL = 84 ++SUBLEVEL = 85 + EXTRAVERSION = + NAME = "People's Front" + +diff --git a/arch/arm/boot/compressed/libfdt_env.h b/arch/arm/boot/compressed/libfdt_env.h +index 07437816e098..b36c0289a308 100644 +--- a/arch/arm/boot/compressed/libfdt_env.h ++++ b/arch/arm/boot/compressed/libfdt_env.h +@@ -6,6 +6,8 @@ + #include <linux/string.h> + #include <asm/byteorder.h> + ++#define INT_MAX ((int)(~0U>>1)) ++ + typedef __be16 fdt16_t; + typedef __be32 fdt32_t; + typedef __be64 fdt64_t; +diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi b/arch/arm/boot/dts/am335x-boneblack-common.dtsi +index 325daae40278..21bc1173fa6b 100644 +--- a/arch/arm/boot/dts/am335x-boneblack-common.dtsi ++++ b/arch/arm/boot/dts/am335x-boneblack-common.dtsi +@@ -88,7 +88,7 @@ + }; + + &i2c0 { +- tda19988: tda19988 { ++ tda19988: tda19988@70 { + compatible = "nxp,tda998x"; + reg = <0x70>; + +diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts +index 20bbb899b3b7..cc59e42c9134 100644 +--- a/arch/arm/boot/dts/am335x-evm.dts ++++ b/arch/arm/boot/dts/am335x-evm.dts +@@ -731,6 +731,7 @@ + pinctrl-0 = <&cpsw_default>; + pinctrl-1 = <&cpsw_sleep>; + status = "okay"; ++ slaves = <1>; + }; + + &davinci_mdio { +@@ -738,15 +739,14 @@ + pinctrl-0 = <&davinci_mdio_default>; + pinctrl-1 = <&davinci_mdio_sleep>; + status = "okay"; +-}; + +-&cpsw_emac0 { +- phy_id = <&davinci_mdio>, <0>; +- phy-mode = "rgmii-txid"; ++ ethphy0: ethernet-phy@0 { ++ reg = <0>; ++ }; + }; + +-&cpsw_emac1 { +- phy_id = <&davinci_mdio>, <1>; ++&cpsw_emac0 { ++ phy-handle = <ðphy0>; + phy-mode = "rgmii-txid"; + }; + +diff --git a/arch/arm/boot/dts/am335x-osd3358-sm-red.dts b/arch/arm/boot/dts/am335x-osd3358-sm-red.dts +index 4d969013f99a..d9e92671055b 100644 +--- a/arch/arm/boot/dts/am335x-osd3358-sm-red.dts ++++ b/arch/arm/boot/dts/am335x-osd3358-sm-red.dts +@@ -161,7 +161,7 @@ + invensense,key = [4e cc 7e eb f6 1e 35 22 00 34 0d 65 32 e9 94 89];*/ + }; + +- bmp280: pressure@78 { ++ bmp280: pressure@76 { + compatible = "bosch,bmp280"; + reg = <0x76>; + }; +diff --git a/arch/arm/boot/dts/am335x-pdu001.dts b/arch/arm/boot/dts/am335x-pdu001.dts +index 1ad530a39a95..34fb63ef420f 100644 +--- a/arch/arm/boot/dts/am335x-pdu001.dts ++++ b/arch/arm/boot/dts/am335x-pdu001.dts +@@ -373,7 +373,7 @@ + ti,pindir-d0-out-d1-in; + status = "okay"; + +- cfaf240320a032t { ++ display-controller@0 { + compatible = "orisetech,otm3225a"; + reg = <0>; + spi-max-frequency = <1000000>; +diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi +index cf1e4f747242..09e58fb810d9 100644 +--- a/arch/arm/boot/dts/am4372.dtsi ++++ b/arch/arm/boot/dts/am4372.dtsi +@@ -1101,7 +1101,7 @@ + }; + }; + +- qspi: qspi@47900000 { ++ qspi: spi@47900000 { + compatible = "ti,am4372-qspi"; + reg = <0x47900000 0x100>, + <0x30000000 0x4000000>; +diff --git a/arch/arm/boot/dts/am57xx-cl-som-am57x.dts b/arch/arm/boot/dts/am57xx-cl-som-am57x.dts +index 203266f88480..52ae8eef60fc 100644 +--- a/arch/arm/boot/dts/am57xx-cl-som-am57x.dts ++++ b/arch/arm/boot/dts/am57xx-cl-som-am57x.dts +@@ -518,7 +518,7 @@ + }; + + /* touch controller */ +- ads7846@0 { ++ touchscreen@1 { + pinctrl-names = "default"; + pinctrl-0 = <&ads7846_pins>; + +diff --git a/arch/arm/boot/dts/arm-realview-eb.dtsi b/arch/arm/boot/dts/arm-realview-eb.dtsi +index a917cf8825ca..0e4c7c4c8c09 100644 +--- a/arch/arm/boot/dts/arm-realview-eb.dtsi ++++ b/arch/arm/boot/dts/arm-realview-eb.dtsi +@@ -371,7 +371,7 @@ + clock-names = "uartclk", "apb_pclk"; + }; + +- ssp: ssp@1000d000 { ++ ssp: spi@1000d000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x1000d000 0x1000>; + clocks = <&sspclk>, <&pclk>; +diff --git a/arch/arm/boot/dts/arm-realview-pb1176.dts b/arch/arm/boot/dts/arm-realview-pb1176.dts +index f935b72d3d96..f2a1d25eb6cf 100644 +--- a/arch/arm/boot/dts/arm-realview-pb1176.dts ++++ b/arch/arm/boot/dts/arm-realview-pb1176.dts +@@ -380,7 +380,7 @@ + clock-names = "apb_pclk"; + }; + +- pb1176_ssp: ssp@1010b000 { ++ pb1176_ssp: spi@1010b000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x1010b000 0x1000>; + interrupt-parent = <&intc_dc1176>; +diff --git a/arch/arm/boot/dts/arm-realview-pb11mp.dts b/arch/arm/boot/dts/arm-realview-pb11mp.dts +index 36203288de42..7f9cbdf33a51 100644 +--- a/arch/arm/boot/dts/arm-realview-pb11mp.dts ++++ b/arch/arm/boot/dts/arm-realview-pb11mp.dts +@@ -523,7 +523,7 @@ + clock-names = "uartclk", "apb_pclk"; + }; + +- ssp@1000d000 { ++ spi@1000d000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x1000d000 0x1000>; + interrupt-parent = <&intc_pb11mp>; +diff --git a/arch/arm/boot/dts/arm-realview-pbx.dtsi b/arch/arm/boot/dts/arm-realview-pbx.dtsi +index 10868ba3277f..a5676697ff3b 100644 +--- a/arch/arm/boot/dts/arm-realview-pbx.dtsi ++++ b/arch/arm/boot/dts/arm-realview-pbx.dtsi +@@ -362,7 +362,7 @@ + clock-names = "uartclk", "apb_pclk"; + }; + +- ssp: ssp@1000d000 { ++ ssp: spi@1000d000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x1000d000 0x1000>; + clocks = <&sspclk>, <&pclk>; +diff --git a/arch/arm/boot/dts/armada-388-clearfog.dtsi b/arch/arm/boot/dts/armada-388-clearfog.dtsi +index 7c6ad2afb094..1b0d0680c8b6 100644 +--- a/arch/arm/boot/dts/armada-388-clearfog.dtsi ++++ b/arch/arm/boot/dts/armada-388-clearfog.dtsi +@@ -48,7 +48,7 @@ + &clearfog_sdhci_cd_pins>; + pinctrl-names = "default"; + status = "okay"; +- vmmc = <®_3p3v>; ++ vmmc-supply = <®_3p3v>; + wp-inverted; + }; + +diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi +index b23a983f95a5..69f6b9d2e7e7 100644 +--- a/arch/arm/boot/dts/aspeed-g4.dtsi ++++ b/arch/arm/boot/dts/aspeed-g4.dtsi +@@ -350,7 +350,7 @@ + status = "disabled"; + }; + +- i2c: i2c@1e78a000 { ++ i2c: bus@1e78a000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; +diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi +index 87fdc146ff52..d107459fc0f8 100644 +--- a/arch/arm/boot/dts/aspeed-g5.dtsi ++++ b/arch/arm/boot/dts/aspeed-g5.dtsi +@@ -410,7 +410,7 @@ + status = "disabled"; + }; + +- i2c: i2c@1e78a000 { ++ i2c: bus@1e78a000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; +diff --git a/arch/arm/boot/dts/at91-dvk_su60_somc.dtsi b/arch/arm/boot/dts/at91-dvk_su60_somc.dtsi +index bb86f17ed5ed..21876da7c442 100644 +--- a/arch/arm/boot/dts/at91-dvk_su60_somc.dtsi ++++ b/arch/arm/boot/dts/at91-dvk_su60_somc.dtsi +@@ -70,9 +70,9 @@ + &i2c1 { + status = "okay"; + +- eeprom@87 { ++ eeprom@57 { + compatible = "giantec,gt24c32a", "atmel,24c32"; +- reg = <87>; ++ reg = <0x57>; + pagesize = <32>; + }; + }; +diff --git a/arch/arm/boot/dts/at91-dvk_su60_somc_lcm.dtsi b/arch/arm/boot/dts/at91-dvk_su60_somc_lcm.dtsi +index 4b9176dc5d02..df0f0cc575c1 100644 +--- a/arch/arm/boot/dts/at91-dvk_su60_somc_lcm.dtsi ++++ b/arch/arm/boot/dts/at91-dvk_su60_somc_lcm.dtsi +@@ -59,9 +59,9 @@ + &i2c1 { + status = "okay"; + +- ft5426@56 { ++ ft5426@38 { + compatible = "focaltech,ft5426", "edt,edt-ft5406"; +- reg = <56>; ++ reg = <0x38>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_lcd_ctp_int>; + +diff --git a/arch/arm/boot/dts/at91-vinco.dts b/arch/arm/boot/dts/at91-vinco.dts +index 1be9889a2b3a..430277291e02 100644 +--- a/arch/arm/boot/dts/at91-vinco.dts ++++ b/arch/arm/boot/dts/at91-vinco.dts +@@ -128,7 +128,7 @@ + i2c2: i2c@f8024000 { + status = "okay"; + +- rtc1: rtc@64 { ++ rtc1: rtc@32 { + compatible = "epson,rx8900"; + reg = <0x32>; + }; +diff --git a/arch/arm/boot/dts/at91sam9260ek.dts b/arch/arm/boot/dts/at91sam9260ek.dts +index d2b865f60293..07d1b571e601 100644 +--- a/arch/arm/boot/dts/at91sam9260ek.dts ++++ b/arch/arm/boot/dts/at91sam9260ek.dts +@@ -127,7 +127,7 @@ + + spi0: spi@fffc8000 { + cs-gpios = <0>, <&pioC 11 0>, <0>, <0>; +- mtd_dataflash@0 { ++ mtd_dataflash@1 { + compatible = "atmel,at45", "atmel,dataflash"; + spi-max-frequency = <50000000>; + reg = <1>; +diff --git a/arch/arm/boot/dts/at91sam9261ek.dts b/arch/arm/boot/dts/at91sam9261ek.dts +index a29fc0494076..a57f2d435dca 100644 +--- a/arch/arm/boot/dts/at91sam9261ek.dts ++++ b/arch/arm/boot/dts/at91sam9261ek.dts +@@ -160,7 +160,7 @@ + spi-max-frequency = <15000000>; + }; + +- tsc2046@0 { ++ tsc2046@2 { + reg = <2>; + compatible = "ti,ads7843"; + interrupts-extended = <&pioC 2 IRQ_TYPE_EDGE_BOTH>; +diff --git a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi +index 71df3adfc7ca..ec1f17ab6753 100644 +--- a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi ++++ b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi +@@ -109,7 +109,7 @@ + + spi0: spi@fffc8000 { + cs-gpios = <0>, <&pioC 11 0>, <0>, <0>; +- mtd_dataflash@0 { ++ mtd_dataflash@1 { + compatible = "atmel,at45", "atmel,dataflash"; + spi-max-frequency = <50000000>; + reg = <1>; +diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi +index 1ee25a475be8..d16db1fa7e15 100644 +--- a/arch/arm/boot/dts/at91sam9g45.dtsi ++++ b/arch/arm/boot/dts/at91sam9g45.dtsi +@@ -570,7 +570,7 @@ + }; + }; + +- uart1 { ++ usart1 { + pinctrl_usart1: usart1-0 { + atmel,pins = + <AT91_PIOB 4 AT91_PERIPH_A AT91_PINCTRL_NONE +diff --git a/arch/arm/boot/dts/bcm-hr2.dtsi b/arch/arm/boot/dts/bcm-hr2.dtsi +index 3084a7c95733..e4d49731287f 100644 +--- a/arch/arm/boot/dts/bcm-hr2.dtsi ++++ b/arch/arm/boot/dts/bcm-hr2.dtsi +@@ -216,7 +216,7 @@ + reg = <0x33000 0x14>; + }; + +- qspi: qspi@27200 { ++ qspi: spi@27200 { + compatible = "brcm,spi-bcm-qspi", "brcm,spi-nsp-qspi"; + reg = <0x027200 0x184>, + <0x027000 0x124>, +diff --git a/arch/arm/boot/dts/bcm-nsp.dtsi b/arch/arm/boot/dts/bcm-nsp.dtsi +index 09ba85046322..2b219addeb44 100644 +--- a/arch/arm/boot/dts/bcm-nsp.dtsi ++++ b/arch/arm/boot/dts/bcm-nsp.dtsi +@@ -273,7 +273,7 @@ + brcm,nand-has-wp; + }; + +- qspi: qspi@27200 { ++ qspi: spi@27200 { + compatible = "brcm,spi-bcm-qspi", "brcm,spi-nsp-qspi"; + reg = <0x027200 0x184>, + <0x027000 0x124>, +diff --git a/arch/arm/boot/dts/dove-cubox.dts b/arch/arm/boot/dts/dove-cubox.dts +index 580e3cbcfbf7..3e1584e787ae 100644 +--- a/arch/arm/boot/dts/dove-cubox.dts ++++ b/arch/arm/boot/dts/dove-cubox.dts +@@ -87,7 +87,7 @@ + status = "okay"; + clock-frequency = <100000>; + +- si5351: clock-generator { ++ si5351: clock-generator@60 { + compatible = "silabs,si5351a-msop"; + reg = <0x60>; + #address-cells = <1>; +diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi +index 4a0a5115b298..250ad0535e8c 100644 +--- a/arch/arm/boot/dts/dove.dtsi ++++ b/arch/arm/boot/dts/dove.dtsi +@@ -155,7 +155,7 @@ + 0xffffe000 MBUS_ID(0x03, 0x01) 0 0x0000800 /* CESA SRAM 2k */ + 0xfffff000 MBUS_ID(0x0d, 0x00) 0 0x0000800>; /* PMU SRAM 2k */ + +- spi0: spi-ctrl@10600 { ++ spi0: spi@10600 { + compatible = "marvell,orion-spi"; + #address-cells = <1>; + #size-cells = <0>; +@@ -168,7 +168,7 @@ + status = "disabled"; + }; + +- i2c: i2c-ctrl@11000 { ++ i2c: i2c@11000 { + compatible = "marvell,mv64xxx-i2c"; + reg = <0x11000 0x20>; + #address-cells = <1>; +@@ -218,7 +218,7 @@ + status = "disabled"; + }; + +- spi1: spi-ctrl@14600 { ++ spi1: spi@14600 { + compatible = "marvell,orion-spi"; + #address-cells = <1>; + #size-cells = <0>; +diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi +index 2cb45ddd2ae3..9136b3cf9a2c 100644 +--- a/arch/arm/boot/dts/dra7.dtsi ++++ b/arch/arm/boot/dts/dra7.dtsi +@@ -1369,7 +1369,7 @@ + status = "disabled"; + }; + +- qspi: qspi@4b300000 { ++ qspi: spi@4b300000 { + compatible = "ti,dra7xxx-qspi"; + reg = <0x4b300000 0x100>, + <0x5c000000 0x4000000>; +diff --git a/arch/arm/boot/dts/exynos3250-artik5.dtsi b/arch/arm/boot/dts/exynos3250-artik5.dtsi +index 620b50c19ead..7c22cbf6f3d4 100644 +--- a/arch/arm/boot/dts/exynos3250-artik5.dtsi ++++ b/arch/arm/boot/dts/exynos3250-artik5.dtsi +@@ -69,6 +69,8 @@ + compatible = "samsung,s2mps14-pmic"; + interrupt-parent = <&gpx3>; + interrupts = <5 IRQ_TYPE_NONE>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&s2mps14_irq>; + reg = <0x66>; + + s2mps14_osc: clocks { +@@ -350,6 +352,11 @@ + samsung,pin-drv = <EXYNOS4_PIN_DRV_LV3>; + samsung,pin-val = <1>; + }; ++ ++ s2mps14_irq: s2mps14-irq { ++ samsung,pins = "gpx3-5"; ++ samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>; ++ }; + }; + + &rtc { +diff --git a/arch/arm/boot/dts/exynos5250-arndale.dts b/arch/arm/boot/dts/exynos5250-arndale.dts +index 7a8a5c55701a..4ab1f1c66c27 100644 +--- a/arch/arm/boot/dts/exynos5250-arndale.dts ++++ b/arch/arm/boot/dts/exynos5250-arndale.dts +@@ -149,9 +149,11 @@ + }; + + &hdmi { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&hdmi_hpd>; + status = "okay"; +- ddc = <&i2c_2>; +- hpd-gpios = <&gpx3 7 GPIO_ACTIVE_LOW>; ++ ddc = <&i2c_ddc>; ++ hpd-gpios = <&gpx3 7 GPIO_ACTIVE_HIGH>; + vdd_osc-supply = <&ldo10_reg>; + vdd_pll-supply = <&ldo8_reg>; + vdd-supply = <&ldo8_reg>; +@@ -168,6 +170,8 @@ + reg = <0x66>; + interrupt-parent = <&gpx3>; + interrupts = <2 IRQ_TYPE_LEVEL_LOW>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&s5m8767_irq>; + + vinb1-supply = <&main_dc_reg>; + vinb2-supply = <&main_dc_reg>; +@@ -452,13 +456,6 @@ + }; + }; + +-&i2c_2 { +- status = "okay"; +- /* used by HDMI DDC */ +- samsung,i2c-sda-delay = <100>; +- samsung,i2c-max-bus-freq = <66000>; +-}; +- + &i2c_3 { + status = "okay"; + +@@ -535,6 +532,13 @@ + cap-sd-highspeed; + }; + ++&pinctrl_0 { ++ s5m8767_irq: s5m8767-irq { ++ samsung,pins = "gpx3-2"; ++ samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>; ++ }; ++}; ++ + &rtc { + status = "okay"; + }; +@@ -547,3 +551,22 @@ + status = "okay"; + samsung,exynos-sataphy-i2c-phandle = <&sata_phy_i2c>; + }; ++ ++&soc { ++ /* ++ * For unknown reasons HDMI-DDC does not work with Exynos I2C ++ * controllers. Lets use software I2C over GPIO pins as a workaround. ++ */ ++ i2c_ddc: i2c-gpio { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c2_gpio_bus>; ++ status = "okay"; ++ compatible = "i2c-gpio"; ++ gpios = <&gpa0 6 0 /* sda */ ++ &gpa0 7 0 /* scl */ ++ >; ++ i2c-gpio,delay-us = <2>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++}; +diff --git a/arch/arm/boot/dts/exynos5250-pinctrl.dtsi b/arch/arm/boot/dts/exynos5250-pinctrl.dtsi +index 6ff6dea29d44..d31a68672bfa 100644 +--- a/arch/arm/boot/dts/exynos5250-pinctrl.dtsi ++++ b/arch/arm/boot/dts/exynos5250-pinctrl.dtsi +@@ -225,6 +225,12 @@ + samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>; + }; + ++ i2c2_gpio_bus: i2c2-gpio-bus { ++ samsung,pins = "gpa0-6", "gpa0-7"; ++ samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>; ++ samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>; ++ }; ++ + uart2_data: uart2-data { + samsung,pins = "gpa1-0", "gpa1-1"; + samsung,pin-function = <EXYNOS_PIN_FUNC_2>; +@@ -593,6 +599,11 @@ + samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>; + samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>; + }; ++ ++ hdmi_hpd: hdmi-hpd { ++ samsung,pins = "gpx3-7"; ++ samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>; ++ }; + }; + + &pinctrl_1 { +diff --git a/arch/arm/boot/dts/exynos5250-snow-rev5.dts b/arch/arm/boot/dts/exynos5250-snow-rev5.dts +index 0348b1c49a69..7cbfc6f1f4b8 100644 +--- a/arch/arm/boot/dts/exynos5250-snow-rev5.dts ++++ b/arch/arm/boot/dts/exynos5250-snow-rev5.dts +@@ -20,6 +20,14 @@ + + samsung,model = "Snow-I2S-MAX98090"; + samsung,audio-codec = <&max98090>; ++ ++ cpu { ++ sound-dai = <&i2s0 0>; ++ }; ++ ++ codec { ++ sound-dai = <&max98090 0>, <&hdmi>; ++ }; + }; + }; + +@@ -31,6 +39,9 @@ + interrupt-parent = <&gpx0>; + pinctrl-names = "default"; + pinctrl-0 = <&max98090_irq>; ++ clocks = <&pmu_system_controller 0>; ++ clock-names = "mclk"; ++ #sound-dai-cells = <1>; + }; + }; + +diff --git a/arch/arm/boot/dts/exynos5420-peach-pit.dts b/arch/arm/boot/dts/exynos5420-peach-pit.dts +index 25bdc9d97a4d..9eb48cabcca4 100644 +--- a/arch/arm/boot/dts/exynos5420-peach-pit.dts ++++ b/arch/arm/boot/dts/exynos5420-peach-pit.dts +@@ -153,7 +153,7 @@ + + &clock_audss { + assigned-clocks = <&clock_audss EXYNOS_MOUT_AUDSS>; +- assigned-clock-parents = <&clock CLK_FOUT_EPLL>; ++ assigned-clock-parents = <&clock CLK_MAU_EPLL>; + }; + + &cpu0 { +@@ -312,6 +312,7 @@ + regulator-name = "vdd_1v35"; + regulator-min-microvolt = <1350000>; + regulator-max-microvolt = <1350000>; ++ regulator-always-on; + regulator-boot-on; + regulator-state-mem { + regulator-on-in-suspend; +@@ -333,6 +334,7 @@ + regulator-name = "vdd_2v"; + regulator-min-microvolt = <2000000>; + regulator-max-microvolt = <2000000>; ++ regulator-always-on; + regulator-boot-on; + regulator-state-mem { + regulator-on-in-suspend; +@@ -343,6 +345,7 @@ + regulator-name = "vdd_1v8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; ++ regulator-always-on; + regulator-boot-on; + regulator-state-mem { + regulator-on-in-suspend; +diff --git a/arch/arm/boot/dts/exynos5800-peach-pi.dts b/arch/arm/boot/dts/exynos5800-peach-pi.dts +index 7989631b39cc..4398f2d1fe88 100644 +--- a/arch/arm/boot/dts/exynos5800-peach-pi.dts ++++ b/arch/arm/boot/dts/exynos5800-peach-pi.dts +@@ -153,7 +153,7 @@ + + &clock_audss { + assigned-clocks = <&clock_audss EXYNOS_MOUT_AUDSS>; +- assigned-clock-parents = <&clock CLK_FOUT_EPLL>; ++ assigned-clock-parents = <&clock CLK_MAU_EPLL>; + }; + + &cpu0 { +@@ -312,6 +312,7 @@ + regulator-name = "vdd_1v35"; + regulator-min-microvolt = <1350000>; + regulator-max-microvolt = <1350000>; ++ regulator-always-on; + regulator-boot-on; + regulator-state-mem { + regulator-on-in-suspend; +@@ -333,6 +334,7 @@ + regulator-name = "vdd_2v"; + regulator-min-microvolt = <2000000>; + regulator-max-microvolt = <2000000>; ++ regulator-always-on; + regulator-boot-on; + regulator-state-mem { + regulator-on-in-suspend; +@@ -343,6 +345,7 @@ + regulator-name = "vdd_1v8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; ++ regulator-always-on; + regulator-boot-on; + regulator-state-mem { + regulator-on-in-suspend; +diff --git a/arch/arm/boot/dts/imx51-zii-rdu1.dts b/arch/arm/boot/dts/imx51-zii-rdu1.dts +index 6e80254c4562..3fb66ddfe93a 100644 +--- a/arch/arm/boot/dts/imx51-zii-rdu1.dts ++++ b/arch/arm/boot/dts/imx51-zii-rdu1.dts +@@ -514,7 +514,7 @@ + }; + + ds1341: rtc@68 { +- compatible = "maxim,ds1341"; ++ compatible = "dallas,ds1341"; + reg = <0x68>; + }; + +diff --git a/arch/arm/boot/dts/imx6ull.dtsi b/arch/arm/boot/dts/imx6ull.dtsi +index cd1776a7015a..796ed35d4ac9 100644 +--- a/arch/arm/boot/dts/imx6ull.dtsi ++++ b/arch/arm/boot/dts/imx6ull.dtsi +@@ -22,7 +22,7 @@ + >; + fsl,soc-operating-points = < + /* KHz uV */ +- 900000 1175000 ++ 900000 1250000 + 792000 1175000 + 528000 1175000 + 396000 1175000 +diff --git a/arch/arm/boot/dts/keystone-k2g.dtsi b/arch/arm/boot/dts/keystone-k2g.dtsi +index 738b44cf2b0b..1c833105d6c5 100644 +--- a/arch/arm/boot/dts/keystone-k2g.dtsi ++++ b/arch/arm/boot/dts/keystone-k2g.dtsi +@@ -416,7 +416,7 @@ + clock-names = "fck", "mmchsdb_fck"; + }; + +- qspi: qspi@2940000 { ++ qspi: spi@2940000 { + compatible = "ti,k2g-qspi", "cdns,qspi-nor"; + #address-cells = <1>; + #size-cells = <0>; +diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi +index 4981741377f3..ed0d6fb20122 100644 +--- a/arch/arm/boot/dts/lpc32xx.dtsi ++++ b/arch/arm/boot/dts/lpc32xx.dtsi +@@ -179,7 +179,7 @@ + * ssp0 and spi1 are shared pins; + * enable one in your board dts, as needed. + */ +- ssp0: ssp@20084000 { ++ ssp0: spi@20084000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x20084000 0x1000>; + interrupts = <20 IRQ_TYPE_LEVEL_HIGH>; +@@ -199,7 +199,7 @@ + * ssp1 and spi2 are shared pins; + * enable one in your board dts, as needed. + */ +- ssp1: ssp@2008c000 { ++ ssp1: spi@2008c000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x2008c000 0x1000>; + interrupts = <21 IRQ_TYPE_LEVEL_HIGH>; +diff --git a/arch/arm/boot/dts/meson8.dtsi b/arch/arm/boot/dts/meson8.dtsi +index d77dcf890cfc..7162e0ca05b0 100644 +--- a/arch/arm/boot/dts/meson8.dtsi ++++ b/arch/arm/boot/dts/meson8.dtsi +@@ -194,7 +194,7 @@ + #clock-cells = <1>; + #reset-cells = <1>; + compatible = "amlogic,meson8-clkc"; +- reg = <0x8000 0x4>, <0x4000 0x460>; ++ reg = <0x8000 0x4>, <0x4000 0x400>; + }; + + reset: reset-controller@4404 { +diff --git a/arch/arm/boot/dts/meson8b.dtsi b/arch/arm/boot/dts/meson8b.dtsi +index 5b3e5c50c72f..4293047a4b76 100644 +--- a/arch/arm/boot/dts/meson8b.dtsi ++++ b/arch/arm/boot/dts/meson8b.dtsi +@@ -163,7 +163,7 @@ + #clock-cells = <1>; + #reset-cells = <1>; + compatible = "amlogic,meson8b-clkc"; +- reg = <0x8000 0x4>, <0x4000 0x460>; ++ reg = <0x8000 0x4>, <0x4000 0x400>; + }; + + reset: reset-controller@4404 { +diff --git a/arch/arm/boot/dts/omap2.dtsi b/arch/arm/boot/dts/omap2.dtsi +index f1d6de8b3c19..000bf16de651 100644 +--- a/arch/arm/boot/dts/omap2.dtsi ++++ b/arch/arm/boot/dts/omap2.dtsi +@@ -114,7 +114,7 @@ + dma-names = "tx", "rx"; + }; + +- mcspi1: mcspi@48098000 { ++ mcspi1: spi@48098000 { + compatible = "ti,omap2-mcspi"; + ti,hwmods = "mcspi1"; + reg = <0x48098000 0x100>; +@@ -125,7 +125,7 @@ + "tx2", "rx2", "tx3", "rx3"; + }; + +- mcspi2: mcspi@4809a000 { ++ mcspi2: spi@4809a000 { + compatible = "ti,omap2-mcspi"; + ti,hwmods = "mcspi2"; + reg = <0x4809a000 0x100>; +diff --git a/arch/arm/boot/dts/omap2430.dtsi b/arch/arm/boot/dts/omap2430.dtsi +index 84635eeb99cd..7f57af2f10ac 100644 +--- a/arch/arm/boot/dts/omap2430.dtsi ++++ b/arch/arm/boot/dts/omap2430.dtsi +@@ -285,7 +285,7 @@ + ti,timer-alwon; + }; + +- mcspi3: mcspi@480b8000 { ++ mcspi3: spi@480b8000 { + compatible = "ti,omap2-mcspi"; + ti,hwmods = "mcspi3"; + reg = <0x480b8000 0x100>; +diff --git a/arch/arm/boot/dts/omap3-gta04.dtsi b/arch/arm/boot/dts/omap3-gta04.dtsi +index ac830b917776..0c39a2340030 100644 +--- a/arch/arm/boot/dts/omap3-gta04.dtsi ++++ b/arch/arm/boot/dts/omap3-gta04.dtsi +@@ -28,6 +28,7 @@ + + aliases { + display0 = &lcd; ++ display1 = &tv0; + }; + + /* fixed 26MHz oscillator */ +@@ -78,7 +79,7 @@ + #sound-dai-cells = <0>; + }; + +- spi_lcd { ++ spi_lcd: spi_lcd { + compatible = "spi-gpio"; + #address-cells = <0x1>; + #size-cells = <0x0>; +@@ -131,7 +132,7 @@ + }; + + tv0: connector { +- compatible = "svideo-connector"; ++ compatible = "composite-video-connector"; + label = "tv"; + + port { +@@ -143,7 +144,7 @@ + + tv_amp: opa362 { + compatible = "ti,opa362"; +- enable-gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>; ++ enable-gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>; /* GPIO_23 to enable video out amplifier */ + + ports { + #address-cells = <1>; +@@ -282,6 +283,13 @@ + OMAP3_CORE1_IOPAD(0x2134, PIN_INPUT_PULLUP | MUX_MODE4) /* gpio112 */ + >; + }; ++ ++ penirq_pins: pinmux_penirq_pins { ++ pinctrl-single,pins = < ++ /* here we could enable to wakeup the cpu from suspend by a pen touch */ ++ OMAP3_CORE1_IOPAD(0x2194, PIN_INPUT_PULLUP | MUX_MODE4) /* gpio160 */ ++ >; ++ }; + }; + + &omap3_pmx_core2 { +@@ -422,10 +430,19 @@ + tsc2007@48 { + compatible = "ti,tsc2007"; + reg = <0x48>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&penirq_pins>; + interrupt-parent = <&gpio6>; + interrupts = <0 IRQ_TYPE_EDGE_FALLING>; /* GPIO_160 */ +- gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; ++ gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; /* GPIO_160 */ + ti,x-plate-ohms = <600>; ++ touchscreen-size-x = <480>; ++ touchscreen-size-y = <640>; ++ touchscreen-max-pressure = <1000>; ++ touchscreen-fuzz-x = <3>; ++ touchscreen-fuzz-y = <8>; ++ touchscreen-fuzz-pressure = <10>; ++ touchscreen-inverted-y; + }; + + /* RFID EEPROM */ +@@ -531,6 +548,12 @@ + regulator-max-microvolt = <3150000>; + }; + ++/* Needed to power the DPI pins */ ++ ++&vpll2 { ++ regulator-always-on; ++}; ++ + &dss { + pinctrl-names = "default"; + pinctrl-0 = < &dss_dpi_pins >; +@@ -551,10 +574,14 @@ + + vdda-supply = <&vdac>; + ++ #address-cells = <1>; ++ #size-cells = <0>; ++ + port { ++ reg = <0>; + venc_out: endpoint { + remote-endpoint = <&opa_in>; +- ti,channels = <2>; ++ ti,channels = <1>; + ti,invert-polarity; + }; + }; +@@ -598,22 +625,22 @@ + + bootloaders@80000 { + label = "U-Boot"; +- reg = <0x80000 0x1e0000>; ++ reg = <0x80000 0x1c0000>; + }; + +- bootloaders_env@260000 { ++ bootloaders_env@240000 { + label = "U-Boot Env"; +- reg = <0x260000 0x20000>; ++ reg = <0x240000 0x40000>; + }; + + kernel@280000 { + label = "Kernel"; +- reg = <0x280000 0x400000>; ++ reg = <0x280000 0x600000>; + }; + +- filesystem@680000 { ++ filesystem@880000 { + label = "File System"; +- reg = <0x680000 0xf980000>; ++ reg = <0x880000 0>; /* 0 = MTDPART_SIZ_FULL */ + }; + }; + }; +diff --git a/arch/arm/boot/dts/omap3-n9.dts b/arch/arm/boot/dts/omap3-n9.dts +index ded5fcf084eb..1f91646b8951 100644 +--- a/arch/arm/boot/dts/omap3-n9.dts ++++ b/arch/arm/boot/dts/omap3-n9.dts +@@ -40,7 +40,7 @@ + }; + + &i2c3 { +- ak8975@0f { ++ ak8975@f { + compatible = "asahi-kasei,ak8975"; + reg = <0x0f>; + }; +diff --git a/arch/arm/boot/dts/orion5x-linkstation.dtsi b/arch/arm/boot/dts/orion5x-linkstation.dtsi +index ebd93df5d07a..b6c9b85951ea 100644 +--- a/arch/arm/boot/dts/orion5x-linkstation.dtsi ++++ b/arch/arm/boot/dts/orion5x-linkstation.dtsi +@@ -156,7 +156,7 @@ + &i2c { + status = "okay"; + +- rtc { ++ rtc@32 { + compatible = "ricoh,rs5c372a"; + reg = <0x32>; + }; +diff --git a/arch/arm/boot/dts/pxa25x.dtsi b/arch/arm/boot/dts/pxa25x.dtsi +index 95d59be97213..8494b5787170 100644 +--- a/arch/arm/boot/dts/pxa25x.dtsi ++++ b/arch/arm/boot/dts/pxa25x.dtsi +@@ -80,6 +80,10 @@ + #pwm-cells = <1>; + clocks = <&clks CLK_PWM1>; + }; ++ ++ rtc@40900000 { ++ clocks = <&clks CLK_OSC32k768>; ++ }; + }; + + timer@40a00000 { +diff --git a/arch/arm/boot/dts/pxa27x.dtsi b/arch/arm/boot/dts/pxa27x.dtsi +index 747f750f675d..3228ad5fb725 100644 +--- a/arch/arm/boot/dts/pxa27x.dtsi ++++ b/arch/arm/boot/dts/pxa27x.dtsi +@@ -71,7 +71,7 @@ + clocks = <&clks CLK_PWM1>; + }; + +- pwri2c: i2c@40f000180 { ++ pwri2c: i2c@40f00180 { + compatible = "mrvl,pxa-i2c"; + reg = <0x40f00180 0x24>; + interrupts = <6>; +@@ -113,6 +113,10 @@ + + status = "disabled"; + }; ++ ++ rtc@40900000 { ++ clocks = <&clks CLK_OSC32k768>; ++ }; + }; + + clocks { +diff --git a/arch/arm/boot/dts/qcom-ipq4019.dtsi b/arch/arm/boot/dts/qcom-ipq4019.dtsi +index 54d056b01bb5..8328ad589e2b 100644 +--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi ++++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi +@@ -313,7 +313,7 @@ + + saw0: regulator@b089000 { + compatible = "qcom,saw2"; +- reg = <0x02089000 0x1000>, <0x0b009000 0x1000>; ++ reg = <0x0b089000 0x1000>, <0x0b009000 0x1000>; + regulator; + }; + +diff --git a/arch/arm/boot/dts/r8a7779.dtsi b/arch/arm/boot/dts/r8a7779.dtsi +index 6b997bc016ee..03919714645a 100644 +--- a/arch/arm/boot/dts/r8a7779.dtsi ++++ b/arch/arm/boot/dts/r8a7779.dtsi +@@ -344,7 +344,7 @@ + + sata: sata@fc600000 { + compatible = "renesas,sata-r8a7779", "renesas,rcar-sata"; +- reg = <0xfc600000 0x2000>; ++ reg = <0xfc600000 0x200000>; + interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&mstp1_clks R8A7779_CLK_SATA>; + power-domains = <&sysc R8A7779_PD_ALWAYS_ON>; +diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi +index 0925bdca438f..52a757f47bf0 100644 +--- a/arch/arm/boot/dts/r8a7790.dtsi ++++ b/arch/arm/boot/dts/r8a7790.dtsi +@@ -1559,7 +1559,7 @@ + sata0: sata@ee300000 { + compatible = "renesas,sata-r8a7790", + "renesas,rcar-gen2-sata"; +- reg = <0 0xee300000 0 0x2000>; ++ reg = <0 0xee300000 0 0x200000>; + interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cpg CPG_MOD 815>; + power-domains = <&sysc R8A7790_PD_ALWAYS_ON>; +@@ -1570,7 +1570,7 @@ + sata1: sata@ee500000 { + compatible = "renesas,sata-r8a7790", + "renesas,rcar-gen2-sata"; +- reg = <0 0xee500000 0 0x2000>; ++ reg = <0 0xee500000 0 0x200000>; + interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cpg CPG_MOD 814>; + power-domains = <&sysc R8A7790_PD_ALWAYS_ON>; +diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi +index 991ac6feedd5..25b6a99dd87a 100644 +--- a/arch/arm/boot/dts/r8a7791.dtsi ++++ b/arch/arm/boot/dts/r8a7791.dtsi +@@ -1543,7 +1543,7 @@ + sata0: sata@ee300000 { + compatible = "renesas,sata-r8a7791", + "renesas,rcar-gen2-sata"; +- reg = <0 0xee300000 0 0x2000>; ++ reg = <0 0xee300000 0 0x200000>; + interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cpg CPG_MOD 815>; + power-domains = <&sysc R8A7791_PD_ALWAYS_ON>; +@@ -1554,7 +1554,7 @@ + sata1: sata@ee500000 { + compatible = "renesas,sata-r8a7791", + "renesas,rcar-gen2-sata"; +- reg = <0 0xee500000 0 0x2000>; ++ reg = <0 0xee500000 0 0x200000>; + interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cpg CPG_MOD 814>; + power-domains = <&sysc R8A7791_PD_ALWAYS_ON>; +diff --git a/arch/arm/boot/dts/rk3036.dtsi b/arch/arm/boot/dts/rk3036.dtsi +index 67f57200d9a0..d560fc4051c5 100644 +--- a/arch/arm/boot/dts/rk3036.dtsi ++++ b/arch/arm/boot/dts/rk3036.dtsi +@@ -733,7 +733,7 @@ + /* no rts / cts for uart2 */ + }; + +- spi { ++ spi-pins { + spi_txd:spi-txd { + rockchip,pins = <1 29 RK_FUNC_3 &pcfg_pull_default>; + }; +diff --git a/arch/arm/boot/dts/rk3188-radxarock.dts b/arch/arm/boot/dts/rk3188-radxarock.dts +index 45fd2b302dda..4a2890618f6f 100644 +--- a/arch/arm/boot/dts/rk3188-radxarock.dts ++++ b/arch/arm/boot/dts/rk3188-radxarock.dts +@@ -93,6 +93,8 @@ + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdmmc_pwr>; + startup-delay-us = <100000>; + vin-supply = <&vcc_io>; + }; +@@ -315,6 +317,12 @@ + }; + }; + ++ sd0 { ++ sdmmc_pwr: sdmmc-pwr { ++ rockchip,pins = <RK_GPIO3 1 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ + usb { + host_vbus_drv: host-vbus-drv { + rockchip,pins = <0 3 RK_FUNC_GPIO &pcfg_pull_none>; +diff --git a/arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dts b/arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dts +index b280e6494193..31b01a998b2e 100644 +--- a/arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dts ++++ b/arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dts +@@ -88,7 +88,7 @@ + status = "okay"; + clock-frequency = <100000>; + +- adxl345: adxl345@0 { ++ adxl345: adxl345@53 { + compatible = "adi,adxl345"; + reg = <0x53>; + +diff --git a/arch/arm/boot/dts/ste-dbx5x0.dtsi b/arch/arm/boot/dts/ste-dbx5x0.dtsi +index 2310a4e97768..986767735e24 100644 +--- a/arch/arm/boot/dts/ste-dbx5x0.dtsi ++++ b/arch/arm/boot/dts/ste-dbx5x0.dtsi +@@ -197,7 +197,7 @@ + <0xa0410100 0x100>; + }; + +- scu@a04100000 { ++ scu@a0410000 { + compatible = "arm,cortex-a9-scu"; + reg = <0xa0410000 0x100>; + }; +@@ -878,7 +878,7 @@ + power-domains = <&pm_domains DOMAIN_VAPE>; + }; + +- ssp@80002000 { ++ spi@80002000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x80002000 0x1000>; + interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>; +@@ -892,7 +892,7 @@ + power-domains = <&pm_domains DOMAIN_VAPE>; + }; + +- ssp@80003000 { ++ spi@80003000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x80003000 0x1000>; + interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>; +diff --git a/arch/arm/boot/dts/ste-href-family-pinctrl.dtsi b/arch/arm/boot/dts/ste-href-family-pinctrl.dtsi +index 5c5cea232743..1ec193b0c506 100644 +--- a/arch/arm/boot/dts/ste-href-family-pinctrl.dtsi ++++ b/arch/arm/boot/dts/ste-href-family-pinctrl.dtsi +@@ -607,16 +607,20 @@ + + mcde { + lcd_default_mode: lcd_default { +- default_mux { ++ default_mux1 { + /* Mux in VSI0 and all the data lines */ + function = "lcd"; + groups = + "lcdvsi0_a_1", /* VSI0 for LCD */ + "lcd_d0_d7_a_1", /* Data lines */ + "lcd_d8_d11_a_1", /* TV-out */ +- "lcdaclk_b_1", /* Clock line for TV-out */ + "lcdvsi1_a_1"; /* VSI1 for HDMI */ + }; ++ default_mux2 { ++ function = "lcda"; ++ groups = ++ "lcdaclk_b_1"; /* Clock line for TV-out */ ++ }; + default_cfg1 { + pins = + "GPIO68_E1", /* VSI0 */ +diff --git a/arch/arm/boot/dts/ste-hrefprev60.dtsi b/arch/arm/boot/dts/ste-hrefprev60.dtsi +index 3f14b4df69b4..94eeb7f1c947 100644 +--- a/arch/arm/boot/dts/ste-hrefprev60.dtsi ++++ b/arch/arm/boot/dts/ste-hrefprev60.dtsi +@@ -57,7 +57,7 @@ + }; + }; + +- ssp@80002000 { ++ spi@80002000 { + /* + * On the first generation boards, this SSP/SPI port was connected + * to the AB8500. +diff --git a/arch/arm/boot/dts/ste-snowball.dts b/arch/arm/boot/dts/ste-snowball.dts +index b0b94d053098..603890461ae0 100644 +--- a/arch/arm/boot/dts/ste-snowball.dts ++++ b/arch/arm/boot/dts/ste-snowball.dts +@@ -376,7 +376,7 @@ + pinctrl-1 = <&i2c3_sleep_mode>; + }; + +- ssp@80002000 { ++ spi@80002000 { + pinctrl-names = "default"; + pinctrl-0 = <&ssp0_snowball_mode>; + }; +diff --git a/arch/arm/boot/dts/ste-u300.dts b/arch/arm/boot/dts/ste-u300.dts +index 62ecb6a2fa39..1bd1aba3322f 100644 +--- a/arch/arm/boot/dts/ste-u300.dts ++++ b/arch/arm/boot/dts/ste-u300.dts +@@ -442,7 +442,7 @@ + dma-names = "rx"; + }; + +- spi: ssp@c0006000 { ++ spi: spi@c0006000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0xc0006000 0x1000>; + interrupt-parent = <&vica>; +diff --git a/arch/arm/boot/dts/stm32mp157c-ev1.dts b/arch/arm/boot/dts/stm32mp157c-ev1.dts +index 372bc2ea6b92..063ee8ac5dcb 100644 +--- a/arch/arm/boot/dts/stm32mp157c-ev1.dts ++++ b/arch/arm/boot/dts/stm32mp157c-ev1.dts +@@ -6,6 +6,7 @@ + /dts-v1/; + + #include "stm32mp157c-ed1.dts" ++#include <dt-bindings/gpio/gpio.h> + + / { + model = "STMicroelectronics STM32MP157C eval daughter on eval mother"; +@@ -19,6 +20,58 @@ + serial0 = &uart4; + ethernet0 = ðernet0; + }; ++ ++ panel_backlight: panel-backlight { ++ compatible = "gpio-backlight"; ++ gpios = <&gpiod 13 GPIO_ACTIVE_LOW>; ++ default-on; ++ status = "okay"; ++ }; ++}; ++ ++&cec { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&cec_pins_a>; ++ status = "okay"; ++}; ++ ++&dsi { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "okay"; ++ ++ ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ port@0 { ++ reg = <0>; ++ dsi_in: endpoint { ++ remote-endpoint = <<dc_ep0_out>; ++ }; ++ }; ++ ++ port@1 { ++ reg = <1>; ++ dsi_out: endpoint { ++ remote-endpoint = <&dsi_panel_in>; ++ }; ++ }; ++ }; ++ ++ panel-dsi@0 { ++ compatible = "raydium,rm68200"; ++ reg = <0>; ++ reset-gpios = <&gpiof 15 GPIO_ACTIVE_LOW>; ++ backlight = <&panel_backlight>; ++ status = "okay"; ++ ++ port { ++ dsi_panel_in: endpoint { ++ remote-endpoint = <&dsi_out>; ++ }; ++ }; ++ }; + }; + + ðernet0 { +@@ -40,12 +93,6 @@ + }; + }; + +-&cec { +- pinctrl-names = "default"; +- pinctrl-0 = <&cec_pins_a>; +- status = "okay"; +-}; +- + &i2c2 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c2_pins_a>; +@@ -62,6 +109,20 @@ + status = "okay"; + }; + ++<dc { ++ status = "okay"; ++ ++ port { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ ltdc_ep0_out: endpoint@0 { ++ reg = <0>; ++ remote-endpoint = <&dsi_in>; ++ }; ++ }; ++}; ++ + &m_can1 { + pinctrl-names = "default"; + pinctrl-0 = <&m_can1_pins_a>; +diff --git a/arch/arm/boot/dts/stm32mp157c.dtsi b/arch/arm/boot/dts/stm32mp157c.dtsi +index 185541a5b69f..c50c36baba75 100644 +--- a/arch/arm/boot/dts/stm32mp157c.dtsi ++++ b/arch/arm/boot/dts/stm32mp157c.dtsi +@@ -947,7 +947,7 @@ + dma-requests = <48>; + }; + +- qspi: qspi@58003000 { ++ qspi: spi@58003000 { + compatible = "st,stm32f469-qspi"; + reg = <0x58003000 0x1000>, <0x70000000 0x10000000>; + reg-names = "qspi", "qspi_mm"; +diff --git a/arch/arm/boot/dts/sun5i-reference-design-tablet.dtsi b/arch/arm/boot/dts/sun5i-reference-design-tablet.dtsi +index 8acbaab14fe5..d2a2eb8b3f26 100644 +--- a/arch/arm/boot/dts/sun5i-reference-design-tablet.dtsi ++++ b/arch/arm/boot/dts/sun5i-reference-design-tablet.dtsi +@@ -92,7 +92,8 @@ + */ + clock-frequency = <400000>; + +- touchscreen: touchscreen { ++ touchscreen: touchscreen@40 { ++ reg = <0x40>; + interrupt-parent = <&pio>; + interrupts = <6 11 IRQ_TYPE_EDGE_FALLING>; /* EINT11 (PG11) */ + pinctrl-names = "default"; +diff --git a/arch/arm/boot/dts/sun8i-reference-design-tablet.dtsi b/arch/arm/boot/dts/sun8i-reference-design-tablet.dtsi +index 880096c7e252..5e8a95af89b8 100644 +--- a/arch/arm/boot/dts/sun8i-reference-design-tablet.dtsi ++++ b/arch/arm/boot/dts/sun8i-reference-design-tablet.dtsi +@@ -69,7 +69,8 @@ + */ + clock-frequency = <400000>; + +- touchscreen: touchscreen@0 { ++ touchscreen: touchscreen@40 { ++ reg = <0x40>; + interrupt-parent = <&pio>; + interrupts = <1 5 IRQ_TYPE_EDGE_FALLING>; /* PB5 */ + pinctrl-names = "default"; +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 35859d8f3267..bf97f6244c23 100644 +--- a/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts ++++ b/arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts +@@ -95,7 +95,7 @@ + &i2c0 { + status = "okay"; + +- axp22x: pmic@68 { ++ axp22x: pmic@34 { + compatible = "x-powers,axp221"; + reg = <0x34>; + interrupt-parent = <&nmi_intc>; +diff --git a/arch/arm/boot/dts/sun9i-a80.dtsi b/arch/arm/boot/dts/sun9i-a80.dtsi +index 25591d6883ef..d9532fb1ef65 100644 +--- a/arch/arm/boot/dts/sun9i-a80.dtsi ++++ b/arch/arm/boot/dts/sun9i-a80.dtsi +@@ -1196,7 +1196,7 @@ + }; + }; + +- r_rsb: i2c@8003400 { ++ r_rsb: rsb@8003400 { + compatible = "allwinner,sun8i-a23-rsb"; + reg = <0x08003400 0x400>; + interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>; +diff --git a/arch/arm/boot/dts/tegra20-paz00.dts b/arch/arm/boot/dts/tegra20-paz00.dts +index ef245291924f..4f9b4a889feb 100644 +--- a/arch/arm/boot/dts/tegra20-paz00.dts ++++ b/arch/arm/boot/dts/tegra20-paz00.dts +@@ -524,10 +524,10 @@ + gpio-keys { + compatible = "gpio-keys"; + +- power { +- label = "Power"; ++ wakeup { ++ label = "Wakeup"; + gpios = <&gpio TEGRA_GPIO(J, 7) GPIO_ACTIVE_LOW>; +- linux,code = <KEY_POWER>; ++ linux,code = <KEY_WAKEUP>; + wakeup-source; + }; + }; +diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi +index 15b73bd377f0..80854f7de765 100644 +--- a/arch/arm/boot/dts/tegra20.dtsi ++++ b/arch/arm/boot/dts/tegra20.dtsi +@@ -419,19 +419,6 @@ + status = "disabled"; + }; + +- gmi@70009000 { +- compatible = "nvidia,tegra20-gmi"; +- reg = <0x70009000 0x1000>; +- #address-cells = <2>; +- #size-cells = <1>; +- ranges = <0 0 0xd0000000 0xfffffff>; +- clocks = <&tegra_car TEGRA20_CLK_NOR>; +- clock-names = "gmi"; +- resets = <&tegra_car 42>; +- reset-names = "gmi"; +- status = "disabled"; +- }; +- + nand-controller@70008000 { + compatible = "nvidia,tegra20-nand"; + reg = <0x70008000 0x100>; +@@ -447,6 +434,19 @@ + status = "disabled"; + }; + ++ gmi@70009000 { ++ compatible = "nvidia,tegra20-gmi"; ++ reg = <0x70009000 0x1000>; ++ #address-cells = <2>; ++ #size-cells = <1>; ++ ranges = <0 0 0xd0000000 0xfffffff>; ++ clocks = <&tegra_car TEGRA20_CLK_NOR>; ++ clock-names = "gmi"; ++ resets = <&tegra_car 42>; ++ reset-names = "gmi"; ++ status = "disabled"; ++ }; ++ + pwm: pwm@7000a000 { + compatible = "nvidia,tegra20-pwm"; + reg = <0x7000a000 0x100>; +diff --git a/arch/arm/boot/dts/tegra30-apalis.dtsi b/arch/arm/boot/dts/tegra30-apalis.dtsi +index 2f807d40c1b7..f810bbf8212b 100644 +--- a/arch/arm/boot/dts/tegra30-apalis.dtsi ++++ b/arch/arm/boot/dts/tegra30-apalis.dtsi +@@ -171,14 +171,14 @@ + + /* Apalis MMC1 */ + sdmmc3_clk_pa6 { +- nvidia,pins = "sdmmc3_clk_pa6", +- "sdmmc3_cmd_pa7"; ++ nvidia,pins = "sdmmc3_clk_pa6"; + nvidia,function = "sdmmc3"; + nvidia,pull = <TEGRA_PIN_PULL_NONE>; + nvidia,tristate = <TEGRA_PIN_DISABLE>; + }; + sdmmc3_dat0_pb7 { +- nvidia,pins = "sdmmc3_dat0_pb7", ++ nvidia,pins = "sdmmc3_cmd_pa7", ++ "sdmmc3_dat0_pb7", + "sdmmc3_dat1_pb6", + "sdmmc3_dat2_pb5", + "sdmmc3_dat3_pb4", +@@ -659,7 +659,7 @@ + reg = <1>; + clocks = <&clk16m>; + interrupt-parent = <&gpio>; +- interrupts = <TEGRA_GPIO(W, 3) IRQ_TYPE_EDGE_RISING>; ++ interrupts = <TEGRA_GPIO(W, 3) IRQ_TYPE_EDGE_FALLING>; + spi-max-frequency = <10000000>; + }; + }; +@@ -674,7 +674,7 @@ + reg = <0>; + clocks = <&clk16m>; + interrupt-parent = <&gpio>; +- interrupts = <TEGRA_GPIO(W, 2) IRQ_TYPE_EDGE_RISING>; ++ interrupts = <TEGRA_GPIO(W, 2) IRQ_TYPE_EDGE_FALLING>; + spi-max-frequency = <10000000>; + }; + }; +diff --git a/arch/arm/boot/dts/tegra30-colibri-eval-v3.dts b/arch/arm/boot/dts/tegra30-colibri-eval-v3.dts +index 16e1f387aa6d..a0c550e26738 100644 +--- a/arch/arm/boot/dts/tegra30-colibri-eval-v3.dts ++++ b/arch/arm/boot/dts/tegra30-colibri-eval-v3.dts +@@ -79,7 +79,8 @@ + reg = <0>; + clocks = <&clk16m>; + interrupt-parent = <&gpio>; +- interrupts = <TEGRA_GPIO(S, 0) IRQ_TYPE_EDGE_RISING>; ++ /* CAN_INT */ ++ interrupts = <TEGRA_GPIO(S, 0) IRQ_TYPE_EDGE_FALLING>; + spi-max-frequency = <10000000>; + }; + spidev0: spi@1 { +diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi +index a6781f653310..5a04ddefb71f 100644 +--- a/arch/arm/boot/dts/tegra30.dtsi ++++ b/arch/arm/boot/dts/tegra30.dtsi +@@ -896,7 +896,7 @@ + nvidia,elastic-limit = <16>; + nvidia,term-range-adj = <6>; + nvidia,xcvr-setup = <51>; +- nvidia.xcvr-setup-use-fuses; ++ nvidia,xcvr-setup-use-fuses; + nvidia,xcvr-lsfslew = <1>; + nvidia,xcvr-lsrslew = <1>; + nvidia,xcvr-hsslew = <32>; +@@ -933,7 +933,7 @@ + nvidia,elastic-limit = <16>; + nvidia,term-range-adj = <6>; + nvidia,xcvr-setup = <51>; +- nvidia.xcvr-setup-use-fuses; ++ nvidia,xcvr-setup-use-fuses; + nvidia,xcvr-lsfslew = <2>; + nvidia,xcvr-lsrslew = <2>; + nvidia,xcvr-hsslew = <32>; +@@ -969,7 +969,7 @@ + nvidia,elastic-limit = <16>; + nvidia,term-range-adj = <6>; + nvidia,xcvr-setup = <51>; +- nvidia.xcvr-setup-use-fuses; ++ nvidia,xcvr-setup-use-fuses; + nvidia,xcvr-lsfslew = <2>; + nvidia,xcvr-lsrslew = <2>; + nvidia,xcvr-hsslew = <32>; +diff --git a/arch/arm/boot/dts/versatile-ab.dts b/arch/arm/boot/dts/versatile-ab.dts +index 5f61d3609027..6f4f60ba5429 100644 +--- a/arch/arm/boot/dts/versatile-ab.dts ++++ b/arch/arm/boot/dts/versatile-ab.dts +@@ -373,7 +373,7 @@ + clock-names = "apb_pclk"; + }; + +- ssp@101f4000 { ++ spi@101f4000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x101f4000 0x1000>; + interrupts = <11>; +diff --git a/arch/arm/boot/dts/zynq-zc702.dts b/arch/arm/boot/dts/zynq-zc702.dts +index cc5a3dc2b4a0..27cd6cb52f1b 100644 +--- a/arch/arm/boot/dts/zynq-zc702.dts ++++ b/arch/arm/boot/dts/zynq-zc702.dts +@@ -174,17 +174,17 @@ + #address-cells = <1>; + #size-cells = <0>; + reg = <7>; +- hwmon@52 { ++ hwmon@34 { + compatible = "ti,ucd9248"; +- reg = <52>; ++ reg = <0x34>; + }; +- hwmon@53 { ++ hwmon@35 { + compatible = "ti,ucd9248"; +- reg = <53>; ++ reg = <0x35>; + }; +- hwmon@54 { ++ hwmon@36 { + compatible = "ti,ucd9248"; +- reg = <54>; ++ reg = <0x36>; + }; + }; + }; +diff --git a/arch/arm/boot/dts/zynq-zc770-xm010.dts b/arch/arm/boot/dts/zynq-zc770-xm010.dts +index 0e1bfdd3421f..0dd352289a45 100644 +--- a/arch/arm/boot/dts/zynq-zc770-xm010.dts ++++ b/arch/arm/boot/dts/zynq-zc770-xm010.dts +@@ -68,7 +68,7 @@ + status = "okay"; + num-cs = <4>; + is-decoded-cs = <0>; +- flash@0 { ++ flash@1 { + compatible = "sst25wf080", "jedec,spi-nor"; + reg = <1>; + spi-max-frequency = <1000000>; +diff --git a/arch/arm/boot/dts/zynq-zc770-xm013.dts b/arch/arm/boot/dts/zynq-zc770-xm013.dts +index 651913f1afa2..4ae2c85df3a0 100644 +--- a/arch/arm/boot/dts/zynq-zc770-xm013.dts ++++ b/arch/arm/boot/dts/zynq-zc770-xm013.dts +@@ -62,7 +62,7 @@ + status = "okay"; + num-cs = <4>; + is-decoded-cs = <0>; +- eeprom: eeprom@0 { ++ eeprom: eeprom@2 { + at25,byte-len = <8192>; + at25,addr-mode = <2>; + at25,page-size = <32>; +diff --git a/arch/arm/crypto/crc32-ce-glue.c b/arch/arm/crypto/crc32-ce-glue.c +index 96e62ec105d0..cd9e93b46c2d 100644 +--- a/arch/arm/crypto/crc32-ce-glue.c ++++ b/arch/arm/crypto/crc32-ce-glue.c +@@ -236,7 +236,7 @@ static void __exit crc32_pmull_mod_exit(void) + ARRAY_SIZE(crc32_pmull_algs)); + } + +-static const struct cpu_feature crc32_cpu_feature[] = { ++static const struct cpu_feature __maybe_unused crc32_cpu_feature[] = { + { cpu_feature(CRC32) }, { cpu_feature(PMULL) }, { } + }; + MODULE_DEVICE_TABLE(cpu, crc32_cpu_feature); +diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c +index 0921e2c10edf..e2e4df3d11e5 100644 +--- a/arch/arm/mach-at91/pm.c ++++ b/arch/arm/mach-at91/pm.c +@@ -143,15 +143,15 @@ static int at91_pm_config_ws(unsigned int pm_mode, bool set) + + /* Check if enabled on SHDWC. */ + if (wsi->shdwc_mr_bit && !(val & wsi->shdwc_mr_bit)) +- goto put_node; ++ goto put_device; + + mode |= wsi->pmc_fsmr_bit; + if (wsi->set_polarity) + polarity |= wsi->pmc_fsmr_bit; + } + +-put_node: +- of_node_put(np); ++put_device: ++ put_device(&pdev->dev); + } + + if (mode) { +diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c +index b08e407d8d96..529f4b5bbd3a 100644 +--- a/arch/arm/mach-imx/pm-imx6.c ++++ b/arch/arm/mach-imx/pm-imx6.c +@@ -618,6 +618,28 @@ static void __init imx6_pm_common_init(const struct imx6_pm_socdata + IMX6Q_GPR1_GINT); + } + ++static void imx6_pm_stby_poweroff(void) ++{ ++ imx6_set_lpm(STOP_POWER_OFF); ++ imx6q_suspend_finish(0); ++ ++ mdelay(1000); ++ ++ pr_emerg("Unable to poweroff system\n"); ++} ++ ++static int imx6_pm_stby_poweroff_probe(void) ++{ ++ if (pm_power_off) { ++ pr_warn("%s: pm_power_off already claimed %p %pf!\n", ++ __func__, pm_power_off, pm_power_off); ++ return -EBUSY; ++ } ++ ++ pm_power_off = imx6_pm_stby_poweroff; ++ return 0; ++} ++ + void __init imx6_pm_ccm_init(const char *ccm_compat) + { + struct device_node *np; +@@ -634,6 +656,9 @@ void __init imx6_pm_ccm_init(const char *ccm_compat) + val = readl_relaxed(ccm_base + CLPCR); + val &= ~BM_CLPCR_LPM; + writel_relaxed(val, ccm_base + CLPCR); ++ ++ if (of_property_read_bool(np, "fsl,pmic-stby-poweroff")) ++ imx6_pm_stby_poweroff_probe(); + } + + void __init imx6q_pm_init(void) +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 98dbff19f5cc..5caba225b4f7 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts +@@ -125,9 +125,9 @@ + + ®_dcdc1 { + regulator-always-on; +- regulator-min-microvolt = <3000000>; +- regulator-max-microvolt = <3000000>; +- regulator-name = "vcc-3v"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc-3v3"; + }; + + ®_dcdc2 { +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts +index 3f531393eaee..b3f186434f36 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts +@@ -142,10 +142,14 @@ + + /* DCDC3 is polyphased with DCDC2 */ + ++/* ++ * The board uses DDR3L DRAM chips. 1.36V is the closest to the nominal ++ * 1.35V that the PMIC can drive. ++ */ + ®_dcdc5 { + regulator-always-on; +- regulator-min-microvolt = <1500000>; +- regulator-max-microvolt = <1500000>; ++ regulator-min-microvolt = <1360000>; ++ regulator-max-microvolt = <1360000>; + regulator-name = "vcc-ddr3"; + }; + +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 1221764f5719..667016815cf3 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts +@@ -67,7 +67,9 @@ + 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"; + }; + +diff --git a/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts b/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts +index 7c661753bfaf..faa017d4cd56 100644 +--- a/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts ++++ b/arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts +@@ -124,6 +124,8 @@ + &i2c1 { + status = "okay"; + clock-frequency = <100000>; ++ i2c-sda-falling-time-ns = <890>; /* hcnt */ ++ i2c-sdl-falling-time-ns = <890>; /* lcnt */ + + adc@14 { + compatible = "lltc,ltc2497"; +diff --git a/arch/arm64/boot/dts/amd/amd-seattle-soc.dtsi b/arch/arm64/boot/dts/amd/amd-seattle-soc.dtsi +index 125f4deb52fe..b664e7af74eb 100644 +--- a/arch/arm64/boot/dts/amd/amd-seattle-soc.dtsi ++++ b/arch/arm64/boot/dts/amd/amd-seattle-soc.dtsi +@@ -107,7 +107,7 @@ + clock-names = "uartclk", "apb_pclk"; + }; + +- spi0: ssp@e1020000 { ++ spi0: spi@e1020000 { + status = "disabled"; + compatible = "arm,pl022", "arm,primecell"; + reg = <0 0xe1020000 0 0x1000>; +@@ -117,7 +117,7 @@ + clock-names = "apb_pclk"; + }; + +- spi1: ssp@e1030000 { ++ spi1: spi@e1030000 { + status = "disabled"; + compatible = "arm,pl022", "arm,primecell"; + reg = <0 0xe1030000 0 0x1000>; +diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi +index c518130e5ce7..3c34f14fa508 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi +@@ -458,7 +458,7 @@ + }; + + ethmac: ethernet@ff3f0000 { +- compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; ++ compatible = "amlogic,meson-axg-dwmac", "snps,dwmac"; + reg = <0x0 0xff3f0000 0x0 0x10000 + 0x0 0xff634540 0x0 0x8>; + interrupts = <GIC_SPI 8 IRQ_TYPE_EDGE_RISING>; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +index 98cbba6809ca..1ade7e486828 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +@@ -390,7 +390,7 @@ + }; + }; + +- spi_pins: spi { ++ spi_pins: spi-pins { + mux { + groups = "spi_miso", + "spi_mosi", +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 f63bceb88caa..90a56af967a7 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 +@@ -13,7 +13,7 @@ + + / { + compatible = "libretech,cc", "amlogic,s905x", "amlogic,meson-gxl"; +- model = "Libre Technology CC"; ++ model = "Libre Computer Board AML-S905X-CC"; + + aliases { + serial0 = &uart_AO; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi +index c87a80e9bcc6..8f0bb3c44bd6 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi +@@ -337,7 +337,7 @@ + }; + }; + +- spi_pins: spi { ++ spi_pins: spi-pins { + mux { + groups = "spi_miso", + "spi_mosi", +diff --git a/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi b/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi +index 1a406a76c86a..ea854f689fda 100644 +--- a/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi ++++ b/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi +@@ -639,7 +639,7 @@ + status = "disabled"; + }; + +- ssp0: ssp@66180000 { ++ ssp0: spi@66180000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x66180000 0x1000>; + interrupts = <GIC_SPI 404 IRQ_TYPE_LEVEL_HIGH>; +@@ -650,7 +650,7 @@ + status = "disabled"; + }; + +- ssp1: ssp@66190000 { ++ ssp1: spi@66190000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x66190000 0x1000>; + interrupts = <GIC_SPI 405 IRQ_TYPE_LEVEL_HIGH>; +diff --git a/arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi b/arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi +index bc299c3d9068..a9b92e52d50e 100644 +--- a/arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi ++++ b/arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi +@@ -138,7 +138,7 @@ + &i2c1 { + status = "okay"; + +- pcf8574: pcf8574@20 { ++ pcf8574: pcf8574@27 { + compatible = "nxp,pcf8574a"; + gpio-controller; + #gpio-cells = <2>; +diff --git a/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi b/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi +index 84101ea1fd2c..ff714fcbac68 100644 +--- a/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi ++++ b/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi +@@ -520,7 +520,7 @@ + status = "disabled"; + }; + +- ssp0: ssp@180000 { ++ ssp0: spi@180000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x00180000 0x1000>; + interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>; +@@ -532,7 +532,7 @@ + status = "disabled"; + }; + +- ssp1: ssp@190000 { ++ ssp1: spi@190000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x00190000 0x1000>; + interrupts = <GIC_SPI 188 IRQ_TYPE_LEVEL_HIGH>; +diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi +index 68ac78c4564d..5da732f82fa0 100644 +--- a/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi ++++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi +@@ -337,7 +337,7 @@ + status = "disabled"; + }; + +- dspi: dspi@2100000 { ++ dspi: spi@2100000 { + compatible = "fsl,ls1012a-dspi", "fsl,ls1021a-v1.0-dspi"; + #address-cells = <1>; + #size-cells = <0>; +diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi +index 7881e3d81a9a..b9c0f2de8f12 100644 +--- a/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi ++++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi +@@ -284,7 +284,7 @@ + interrupts = <0 43 0x4>; + }; + +- qspi: quadspi@1550000 { ++ qspi: spi@1550000 { + compatible = "fsl,ls1043a-qspi", "fsl,ls1021a-qspi"; + #address-cells = <1>; + #size-cells = <0>; +@@ -382,7 +382,7 @@ + ranges = <0x0 0x5 0x00000000 0x8000000>; + }; + +- dspi0: dspi@2100000 { ++ dspi0: spi@2100000 { + compatible = "fsl,ls1043a-dspi", "fsl,ls1021a-v1.0-dspi"; + #address-cells = <1>; + #size-cells = <0>; +@@ -395,7 +395,7 @@ + status = "disabled"; + }; + +- dspi1: dspi@2110000 { ++ dspi1: spi@2110000 { + compatible = "fsl,ls1043a-dspi", "fsl,ls1021a-v1.0-dspi"; + #address-cells = <1>; + #size-cells = <0>; +diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts b/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts +index 440e111651d5..a59b48203688 100644 +--- a/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts ++++ b/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts +@@ -57,12 +57,12 @@ + reg = <0x4c>; + }; + +- eeprom@56 { ++ eeprom@52 { + compatible = "atmel,24c512"; + reg = <0x52>; + }; + +- eeprom@57 { ++ eeprom@53 { + compatible = "atmel,24c512"; + reg = <0x53>; + }; +diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi +index ef83786b8b90..de6af453a6e1 100644 +--- a/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi ++++ b/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi +@@ -202,7 +202,7 @@ + interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>; + }; + +- qspi: quadspi@1550000 { ++ qspi: spi@1550000 { + compatible = "fsl,ls1021a-qspi"; + #address-cells = <1>; + #size-cells = <0>; +@@ -361,7 +361,7 @@ + #thermal-sensor-cells = <1>; + }; + +- dspi: dspi@2100000 { ++ dspi: spi@2100000 { + compatible = "fsl,ls1021a-v1.0-dspi"; + #address-cells = <1>; + #size-cells = <0>; +diff --git a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi +index 8cb78dd99672..ebe0cd4bf2b7 100644 +--- a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi ++++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi +@@ -469,7 +469,7 @@ + mmu-masters = <&fsl_mc 0x300 0>; + }; + +- dspi: dspi@2100000 { ++ dspi: spi@2100000 { + status = "disabled"; + compatible = "fsl,ls2080a-dspi", "fsl,ls2085a-dspi"; + #address-cells = <1>; +@@ -595,7 +595,7 @@ + 3 0 0x5 0x20000000 0x00010000>; + }; + +- qspi: quadspi@20c0000 { ++ qspi: spi@20c0000 { + status = "disabled"; + compatible = "fsl,ls2080a-qspi", "fsl,ls1021a-qspi"; + #address-cells = <1>; +diff --git a/arch/arm64/boot/dts/lg/lg1312.dtsi b/arch/arm64/boot/dts/lg/lg1312.dtsi +index 860c8fb10795..4bde7b6f2b11 100644 +--- a/arch/arm64/boot/dts/lg/lg1312.dtsi ++++ b/arch/arm64/boot/dts/lg/lg1312.dtsi +@@ -168,14 +168,14 @@ + clock-names = "apb_pclk"; + status="disabled"; + }; +- spi0: ssp@fe800000 { ++ spi0: spi@fe800000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x0 0xfe800000 0x1000>; + interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clk_bus>; + clock-names = "apb_pclk"; + }; +- spi1: ssp@fe900000 { ++ spi1: spi@fe900000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x0 0xfe900000 0x1000>; + interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>; +diff --git a/arch/arm64/boot/dts/lg/lg1313.dtsi b/arch/arm64/boot/dts/lg/lg1313.dtsi +index 1887af654a7d..16ced1ff1ad3 100644 +--- a/arch/arm64/boot/dts/lg/lg1313.dtsi ++++ b/arch/arm64/boot/dts/lg/lg1313.dtsi +@@ -168,14 +168,14 @@ + clock-names = "apb_pclk"; + status="disabled"; + }; +- spi0: ssp@fe800000 { ++ spi0: spi@fe800000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x0 0xfe800000 0x1000>; + interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clk_bus>; + clock-names = "apb_pclk"; + }; +- spi1: ssp@fe900000 { ++ spi1: spi@fe900000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x0 0xfe900000 0x1000>; + interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>; +diff --git a/arch/arm64/boot/dts/nvidia/tegra194.dtsi b/arch/arm64/boot/dts/nvidia/tegra194.dtsi +index a4dfcd19b9e8..9fc14bb9a0af 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi +@@ -118,7 +118,7 @@ + }; + + gen1_i2c: i2c@3160000 { +- compatible = "nvidia,tegra194-i2c", "nvidia,tegra114-i2c"; ++ compatible = "nvidia,tegra194-i2c"; + reg = <0x03160000 0x10000>; + interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; +@@ -143,7 +143,7 @@ + }; + + cam_i2c: i2c@3180000 { +- compatible = "nvidia,tegra194-i2c", "nvidia,tegra114-i2c"; ++ compatible = "nvidia,tegra194-i2c"; + reg = <0x03180000 0x10000>; + interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; +@@ -157,7 +157,7 @@ + + /* shares pads with dpaux1 */ + dp_aux_ch1_i2c: i2c@3190000 { +- compatible = "nvidia,tegra194-i2c", "nvidia,tegra114-i2c"; ++ compatible = "nvidia,tegra194-i2c"; + reg = <0x03190000 0x10000>; + interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; +@@ -171,7 +171,7 @@ + + /* shares pads with dpaux0 */ + dp_aux_ch0_i2c: i2c@31b0000 { +- compatible = "nvidia,tegra194-i2c", "nvidia,tegra114-i2c"; ++ compatible = "nvidia,tegra194-i2c"; + reg = <0x031b0000 0x10000>; + interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; +@@ -184,7 +184,7 @@ + }; + + gen7_i2c: i2c@31c0000 { +- compatible = "nvidia,tegra194-i2c", "nvidia,tegra114-i2c"; ++ compatible = "nvidia,tegra194-i2c"; + reg = <0x031c0000 0x10000>; + interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; +@@ -197,7 +197,7 @@ + }; + + gen9_i2c: i2c@31e0000 { +- compatible = "nvidia,tegra194-i2c", "nvidia,tegra114-i2c"; ++ compatible = "nvidia,tegra194-i2c"; + reg = <0x031e0000 0x10000>; + interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; +@@ -264,7 +264,7 @@ + }; + + gen2_i2c: i2c@c240000 { +- compatible = "nvidia,tegra194-i2c", "nvidia,tegra114-i2c"; ++ compatible = "nvidia,tegra194-i2c"; + reg = <0x0c240000 0x10000>; + interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; +@@ -277,7 +277,7 @@ + }; + + gen8_i2c: i2c@c250000 { +- compatible = "nvidia,tegra194-i2c", "nvidia,tegra114-i2c"; ++ compatible = "nvidia,tegra194-i2c"; + reg = <0x0c250000 0x10000>; + interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; +diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi +index 7398ae8856dc..ccaa555180dc 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi +@@ -282,6 +282,7 @@ + status = "okay"; + bus-width = <8>; + non-removable; ++ vqmmc-supply = <&vdd_1v8>; + }; + + clocks { +diff --git a/arch/arm64/boot/dts/renesas/r8a77965.dtsi b/arch/arm64/boot/dts/renesas/r8a77965.dtsi +index f60f08ba1a6f..f1dfd17413b9 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77965.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77965.dtsi +@@ -545,7 +545,7 @@ + }; + + hsusb: usb@e6590000 { +- compatible = "renesas,usbhs-r8a7796", ++ compatible = "renesas,usbhs-r8a77965", + "renesas,rcar-gen3-usbhs"; + reg = <0 0xe6590000 0 0x100>; + interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>; +@@ -634,6 +634,14 @@ + resets = <&cpg 219>; + #dma-cells = <1>; + dma-channels = <16>; ++ iommus = <&ipmmu_ds0 0>, <&ipmmu_ds0 1>, ++ <&ipmmu_ds0 2>, <&ipmmu_ds0 3>, ++ <&ipmmu_ds0 4>, <&ipmmu_ds0 5>, ++ <&ipmmu_ds0 6>, <&ipmmu_ds0 7>, ++ <&ipmmu_ds0 8>, <&ipmmu_ds0 9>, ++ <&ipmmu_ds0 10>, <&ipmmu_ds0 11>, ++ <&ipmmu_ds0 12>, <&ipmmu_ds0 13>, ++ <&ipmmu_ds0 14>, <&ipmmu_ds0 15>; + }; + + dmac1: dma-controller@e7300000 { +@@ -668,6 +676,14 @@ + resets = <&cpg 218>; + #dma-cells = <1>; + dma-channels = <16>; ++ iommus = <&ipmmu_ds1 0>, <&ipmmu_ds1 1>, ++ <&ipmmu_ds1 2>, <&ipmmu_ds1 3>, ++ <&ipmmu_ds1 4>, <&ipmmu_ds1 5>, ++ <&ipmmu_ds1 6>, <&ipmmu_ds1 7>, ++ <&ipmmu_ds1 8>, <&ipmmu_ds1 9>, ++ <&ipmmu_ds1 10>, <&ipmmu_ds1 11>, ++ <&ipmmu_ds1 12>, <&ipmmu_ds1 13>, ++ <&ipmmu_ds1 14>, <&ipmmu_ds1 15>; + }; + + dmac2: dma-controller@e7310000 { +@@ -702,6 +718,14 @@ + resets = <&cpg 217>; + #dma-cells = <1>; + dma-channels = <16>; ++ iommus = <&ipmmu_ds1 16>, <&ipmmu_ds1 17>, ++ <&ipmmu_ds1 18>, <&ipmmu_ds1 19>, ++ <&ipmmu_ds1 20>, <&ipmmu_ds1 21>, ++ <&ipmmu_ds1 22>, <&ipmmu_ds1 23>, ++ <&ipmmu_ds1 24>, <&ipmmu_ds1 25>, ++ <&ipmmu_ds1 26>, <&ipmmu_ds1 27>, ++ <&ipmmu_ds1 28>, <&ipmmu_ds1 29>, ++ <&ipmmu_ds1 30>, <&ipmmu_ds1 31>; + }; + + ipmmu_ds0: mmu@e6740000 { +@@ -1455,9 +1479,9 @@ + compatible = "renesas,usb2-phy-r8a77965", + "renesas,rcar-gen3-usb2-phy"; + reg = <0 0xee0a0200 0 0x700>; +- clocks = <&cpg CPG_MOD 703>; ++ clocks = <&cpg CPG_MOD 702>; + power-domains = <&sysc R8A77965_PD_ALWAYS_ON>; +- resets = <&cpg 703>; ++ resets = <&cpg 702>; + #phy-cells = <0>; + status = "disabled"; + }; +diff --git a/arch/arm64/boot/dts/renesas/salvator-common.dtsi b/arch/arm64/boot/dts/renesas/salvator-common.dtsi +index 7d3d866a0063..3b90f816dfef 100644 +--- a/arch/arm64/boot/dts/renesas/salvator-common.dtsi ++++ b/arch/arm64/boot/dts/renesas/salvator-common.dtsi +@@ -420,7 +420,10 @@ + + video-receiver@70 { + compatible = "adi,adv7482"; +- reg = <0x70>; ++ reg = <0x70 0x71 0x72 0x73 0x74 0x75 ++ 0x60 0x61 0x62 0x63 0x64 0x65>; ++ reg-names = "main", "dpll", "cp", "hdmi", "edid", "repeater", ++ "infoframe", "cbus", "cec", "sdp", "txa", "txb" ; + + #address-cells = <1>; + #size-cells = <0>; +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts +index 8ce4a79d9360..1e6a71066c16 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts +@@ -131,7 +131,7 @@ + status = "okay"; + clock-frequency = <400000>; + +- sgtl5000: codec@0a { ++ sgtl5000: codec@a { + compatible = "fsl,sgtl5000"; + reg = <0x0a>; + clocks = <&sgtl5000_clk>; +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi +index 36b60791c156..6062cc8250b1 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi +@@ -93,6 +93,19 @@ + vin-supply = <&vcc_1v8>; + }; + ++ vcc3v0_sd: vcc3v0-sd { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdmmc0_pwr_h>; ++ regulator-always-on; ++ regulator-max-microvolt = <3000000>; ++ regulator-min-microvolt = <3000000>; ++ regulator-name = "vcc3v0_sd"; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ + vcc3v3_sys: vcc3v3-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_sys"; +@@ -116,7 +129,7 @@ + vcc5v0_host: vcc5v0-host-regulator { + compatible = "regulator-fixed"; + enable-active-high; +- gpio = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>; ++ gpio = <&gpio4 RK_PD1 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_host_en>; + regulator-name = "vcc5v0_host"; +@@ -310,7 +323,7 @@ + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; +- regulator-max-microvolt = <3000000>; ++ regulator-max-microvolt = <3300000>; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3000000>; +@@ -469,6 +482,13 @@ + }; + }; + ++ sd { ++ sdmmc0_pwr_h: sdmmc0-pwr-h { ++ rockchip,pins = ++ <RK_GPIO0 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ + usb2 { + vcc5v0_host_en: vcc5v0-host-en { + rockchip,pins = +@@ -499,6 +519,7 @@ + }; + + &sdmmc { ++ broken-cd; + bus-width = <4>; + cap-mmc-highspeed; + cap-sd-highspeed; +@@ -507,6 +528,7 @@ + max-frequency = <150000000>; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>; ++ vmmc-supply = <&vcc3v0_sd>; + vqmmc-supply = <&vcc_sdio>; + status = "okay"; + }; +diff --git a/arch/arm64/boot/dts/ti/k3-am65-main.dtsi b/arch/arm64/boot/dts/ti/k3-am65-main.dtsi +index e23c5762355d..2e3917171b17 100644 +--- a/arch/arm64/boot/dts/ti/k3-am65-main.dtsi ++++ b/arch/arm64/boot/dts/ti/k3-am65-main.dtsi +@@ -8,13 +8,13 @@ + &cbass_main { + gic500: interrupt-controller@1800000 { + compatible = "arm,gic-v3"; +- #address-cells = <1>; +- #size-cells = <1>; ++ #address-cells = <2>; ++ #size-cells = <2>; + ranges; + #interrupt-cells = <3>; + interrupt-controller; +- reg = <0x01800000 0x10000>, /* GICD */ +- <0x01880000 0x90000>; /* GICR */ ++ reg = <0x00 0x01800000 0x00 0x10000>, /* GICD */ ++ <0x00 0x01880000 0x00 0x90000>; /* GICR */ + /* + * vcpumntirq: + * virtual CPU interface maintenance interrupt +@@ -23,7 +23,7 @@ + + gic_its: gic-its@1820000 { + compatible = "arm,gic-v3-its"; +- reg = <0x01820000 0x10000>; ++ reg = <0x00 0x01820000 0x00 0x10000>; + msi-controller; + #msi-cells = <1>; + }; +diff --git a/arch/arm64/boot/dts/ti/k3-am65.dtsi b/arch/arm64/boot/dts/ti/k3-am65.dtsi +index cede1fa0983c..ded364d20835 100644 +--- a/arch/arm64/boot/dts/ti/k3-am65.dtsi ++++ b/arch/arm64/boot/dts/ti/k3-am65.dtsi +@@ -46,38 +46,38 @@ + + cbass_main: interconnect@100000 { + compatible = "simple-bus"; +- #address-cells = <1>; +- #size-cells = <1>; +- ranges = <0x00100000 0x00 0x00100000 0x00020000>, /* ctrl mmr */ +- <0x00600000 0x00 0x00600000 0x00001100>, /* GPIO */ +- <0x00900000 0x00 0x00900000 0x00012000>, /* serdes */ +- <0x01000000 0x00 0x01000000 0x0af02400>, /* Most peripherals */ +- <0x30800000 0x00 0x30800000 0x0bc00000>, /* MAIN NAVSS */ ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ranges = <0x00 0x00100000 0x00 0x00100000 0x00 0x00020000>, /* ctrl mmr */ ++ <0x00 0x00600000 0x00 0x00600000 0x00 0x00001100>, /* GPIO */ ++ <0x00 0x00900000 0x00 0x00900000 0x00 0x00012000>, /* serdes */ ++ <0x00 0x01000000 0x00 0x01000000 0x00 0x0af02400>, /* Most peripherals */ ++ <0x00 0x30800000 0x00 0x30800000 0x00 0x0bc00000>, /* MAIN NAVSS */ + /* MCUSS Range */ +- <0x28380000 0x00 0x28380000 0x03880000>, +- <0x40200000 0x00 0x40200000 0x00900100>, +- <0x42040000 0x00 0x42040000 0x03ac2400>, +- <0x45100000 0x00 0x45100000 0x00c24000>, +- <0x46000000 0x00 0x46000000 0x00200000>, +- <0x47000000 0x00 0x47000000 0x00068400>; ++ <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>, ++ <0x00 0x40200000 0x00 0x40200000 0x00 0x00900100>, ++ <0x00 0x42040000 0x00 0x42040000 0x00 0x03ac2400>, ++ <0x00 0x45100000 0x00 0x45100000 0x00 0x00c24000>, ++ <0x00 0x46000000 0x00 0x46000000 0x00 0x00200000>, ++ <0x00 0x47000000 0x00 0x47000000 0x00 0x00068400>; + + cbass_mcu: interconnect@28380000 { + compatible = "simple-bus"; +- #address-cells = <1>; +- #size-cells = <1>; +- ranges = <0x28380000 0x28380000 0x03880000>, /* MCU NAVSS*/ +- <0x40200000 0x40200000 0x00900100>, /* First peripheral window */ +- <0x42040000 0x42040000 0x03ac2400>, /* WKUP */ +- <0x45100000 0x45100000 0x00c24000>, /* MMRs, remaining NAVSS */ +- <0x46000000 0x46000000 0x00200000>, /* CPSW */ +- <0x47000000 0x47000000 0x00068400>; /* OSPI space 1 */ ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ranges = <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>, /* MCU NAVSS*/ ++ <0x00 0x40200000 0x00 0x40200000 0x00 0x00900100>, /* First peripheral window */ ++ <0x00 0x42040000 0x00 0x42040000 0x00 0x03ac2400>, /* WKUP */ ++ <0x00 0x45100000 0x00 0x45100000 0x00 0x00c24000>, /* MMRs, remaining NAVSS */ ++ <0x00 0x46000000 0x00 0x46000000 0x00 0x00200000>, /* CPSW */ ++ <0x00 0x47000000 0x00 0x47000000 0x00 0x00068400>; /* OSPI space 1 */ + + cbass_wakeup: interconnect@42040000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + /* WKUP Basic peripherals */ +- ranges = <0x42040000 0x42040000 0x03ac2400>; ++ ranges = <0x42040000 0x00 0x42040000 0x03ac2400>; + }; + }; + }; +diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c +index a0099be4311a..c8dc3a3640e7 100644 +--- a/arch/arm64/kernel/traps.c ++++ b/arch/arm64/kernel/traps.c +@@ -611,7 +611,6 @@ asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr) + handler[reason], smp_processor_id(), esr, + esr_get_class_string(esr)); + +- die("Oops - bad mode", regs, 0); + local_daif_mask(); + panic("bad mode"); + } +diff --git a/arch/mips/bcm47xx/workarounds.c b/arch/mips/bcm47xx/workarounds.c +index 1a8a07e7a563..46eddbec8d9f 100644 +--- a/arch/mips/bcm47xx/workarounds.c ++++ b/arch/mips/bcm47xx/workarounds.c +@@ -5,9 +5,8 @@ + #include <bcm47xx_board.h> + #include <bcm47xx.h> + +-static void __init bcm47xx_workarounds_netgear_wnr3500l(void) ++static void __init bcm47xx_workarounds_enable_usb_power(int usb_power) + { +- const int usb_power = 12; + int err; + + err = gpio_request_one(usb_power, GPIOF_OUT_INIT_HIGH, "usb_power"); +@@ -23,7 +22,10 @@ void __init bcm47xx_workarounds(void) + + switch (board) { + case BCM47XX_BOARD_NETGEAR_WNR3500L: +- bcm47xx_workarounds_netgear_wnr3500l(); ++ bcm47xx_workarounds_enable_usb_power(12); ++ break; ++ case BCM47XX_BOARD_NETGEAR_WNDR3400_V3: ++ bcm47xx_workarounds_enable_usb_power(21); + break; + default: + /* No workaround(s) needed */ +diff --git a/arch/mips/bcm63xx/reset.c b/arch/mips/bcm63xx/reset.c +index a2af38cf28a7..64574e74cb23 100644 +--- a/arch/mips/bcm63xx/reset.c ++++ b/arch/mips/bcm63xx/reset.c +@@ -120,7 +120,7 @@ + #define BCM6368_RESET_DSL 0 + #define BCM6368_RESET_SAR SOFTRESET_6368_SAR_MASK + #define BCM6368_RESET_EPHY SOFTRESET_6368_EPHY_MASK +-#define BCM6368_RESET_ENETSW 0 ++#define BCM6368_RESET_ENETSW SOFTRESET_6368_ENETSW_MASK + #define BCM6368_RESET_PCM SOFTRESET_6368_PCM_MASK + #define BCM6368_RESET_MPI SOFTRESET_6368_MPI_MASK + #define BCM6368_RESET_PCIE 0 +diff --git a/arch/mips/include/asm/kexec.h b/arch/mips/include/asm/kexec.h +index 493a3cc7c39a..cfdbe66575f4 100644 +--- a/arch/mips/include/asm/kexec.h ++++ b/arch/mips/include/asm/kexec.h +@@ -12,11 +12,11 @@ + #include <asm/stacktrace.h> + + /* Maximum physical address we can use pages from */ +-#define KEXEC_SOURCE_MEMORY_LIMIT (0x20000000) ++#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL) + /* Maximum address we can reach in physical address mode */ +-#define KEXEC_DESTINATION_MEMORY_LIMIT (0x20000000) ++#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL) + /* Maximum address we can use for the control code buffer */ +-#define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000) ++#define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) + /* Reserve 3*4096 bytes for board-specific info */ + #define KEXEC_CONTROL_PAGE_SIZE (4096 + 3*4096) + +diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c +index f6d9182ef82a..70a1ab66d252 100644 +--- a/arch/mips/txx9/generic/setup.c ++++ b/arch/mips/txx9/generic/setup.c +@@ -960,12 +960,11 @@ void __init txx9_sramc_init(struct resource *r) + goto exit_put; + err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr); + if (err) { +- device_unregister(&dev->dev); + iounmap(dev->base); +- kfree(dev); ++ device_unregister(&dev->dev); + } + return; + exit_put: ++ iounmap(dev->base); + put_device(&dev->dev); +- return; + } +diff --git a/arch/powerpc/boot/libfdt_env.h b/arch/powerpc/boot/libfdt_env.h +index 2a0c8b1bf147..2abc8e83b95e 100644 +--- a/arch/powerpc/boot/libfdt_env.h ++++ b/arch/powerpc/boot/libfdt_env.h +@@ -5,6 +5,8 @@ + #include <types.h> + #include <string.h> + ++#define INT_MAX ((int)(~0U>>1)) ++ + #include "of.h" + + typedef unsigned long uintptr_t; +diff --git a/arch/powerpc/include/asm/drmem.h b/arch/powerpc/include/asm/drmem.h +index ce242b9ea8c6..7c1d8e74b25d 100644 +--- a/arch/powerpc/include/asm/drmem.h ++++ b/arch/powerpc/include/asm/drmem.h +@@ -99,4 +99,9 @@ void __init walk_drmem_lmbs_early(unsigned long node, + void (*func)(struct drmem_lmb *, const __be32 **)); + #endif + ++static inline void invalidate_lmb_associativity_index(struct drmem_lmb *lmb) ++{ ++ lmb->aa_index = 0xffffffff; ++} ++ + #endif /* _ASM_POWERPC_LMB_H */ +diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h +index 1ca9e37f7cc9..38a25ff8afb7 100644 +--- a/arch/powerpc/include/asm/uaccess.h ++++ b/arch/powerpc/include/asm/uaccess.h +@@ -260,7 +260,7 @@ do { \ + ({ \ + long __gu_err; \ + __long_type(*(ptr)) __gu_val; \ +- const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ ++ __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ + __chk_user_ptr(ptr); \ + if (!is_kernel_addr((unsigned long)__gu_addr)) \ + might_fault(); \ +@@ -274,7 +274,7 @@ do { \ + ({ \ + long __gu_err = -EFAULT; \ + __long_type(*(ptr)) __gu_val = 0; \ +- const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ ++ __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ + might_fault(); \ + if (access_ok(VERIFY_READ, __gu_addr, (size))) { \ + barrier_nospec(); \ +@@ -288,7 +288,7 @@ do { \ + ({ \ + long __gu_err; \ + __long_type(*(ptr)) __gu_val; \ +- const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ ++ __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ + __chk_user_ptr(ptr); \ + barrier_nospec(); \ + __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ +diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c +index 19b4c628f3be..f0dc680e659a 100644 +--- a/arch/powerpc/kernel/iommu.c ++++ b/arch/powerpc/kernel/iommu.c +@@ -785,9 +785,9 @@ dma_addr_t iommu_map_page(struct device *dev, struct iommu_table *tbl, + + vaddr = page_address(page) + offset; + uaddr = (unsigned long)vaddr; +- npages = iommu_num_pages(uaddr, size, IOMMU_PAGE_SIZE(tbl)); + + if (tbl) { ++ npages = iommu_num_pages(uaddr, size, IOMMU_PAGE_SIZE(tbl)); + align = 0; + if (tbl->it_page_shift < PAGE_SHIFT && size >= PAGE_SIZE && + ((unsigned long)vaddr & ~PAGE_MASK) == 0) +diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c +index 9e41a9de4323..95d1264ba795 100644 +--- a/arch/powerpc/kernel/rtas.c ++++ b/arch/powerpc/kernel/rtas.c +@@ -985,6 +985,7 @@ int rtas_ibm_suspend_me(u64 handle) + goto out; + } + ++ cpu_hotplug_disable(); + stop_topology_update(); + + /* Call function on all CPUs. One of us will make the +@@ -999,6 +1000,7 @@ int rtas_ibm_suspend_me(u64 handle) + printk(KERN_ERR "Error doing global join\n"); + + start_topology_update(); ++ cpu_hotplug_enable(); + + /* Take down CPUs not online prior to suspend */ + cpuret = rtas_offline_cpus_mask(offline_mask); +diff --git a/arch/powerpc/kernel/vdso32/datapage.S b/arch/powerpc/kernel/vdso32/datapage.S +index 3745113fcc65..2a7eb5452aba 100644 +--- a/arch/powerpc/kernel/vdso32/datapage.S ++++ b/arch/powerpc/kernel/vdso32/datapage.S +@@ -37,6 +37,7 @@ data_page_branch: + mtlr r0 + addi r3, r3, __kernel_datapage_offset-data_page_branch + lwz r0,0(r3) ++ .cfi_restore lr + add r3,r0,r3 + blr + .cfi_endproc +diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S +index 75cff3f336b3..afd516b572f8 100644 +--- a/arch/powerpc/kernel/vdso32/gettimeofday.S ++++ b/arch/powerpc/kernel/vdso32/gettimeofday.S +@@ -139,6 +139,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime) + */ + 99: + li r0,__NR_clock_gettime ++ .cfi_restore lr + sc + blr + .cfi_endproc +diff --git a/arch/powerpc/kernel/vdso64/datapage.S b/arch/powerpc/kernel/vdso64/datapage.S +index abf17feffe40..bf9668691511 100644 +--- a/arch/powerpc/kernel/vdso64/datapage.S ++++ b/arch/powerpc/kernel/vdso64/datapage.S +@@ -37,6 +37,7 @@ data_page_branch: + mtlr r0 + addi r3, r3, __kernel_datapage_offset-data_page_branch + lwz r0,0(r3) ++ .cfi_restore lr + add r3,r0,r3 + blr + .cfi_endproc +diff --git a/arch/powerpc/kernel/vdso64/gettimeofday.S b/arch/powerpc/kernel/vdso64/gettimeofday.S +index afbad2ac3147..1f324c28705b 100644 +--- a/arch/powerpc/kernel/vdso64/gettimeofday.S ++++ b/arch/powerpc/kernel/vdso64/gettimeofday.S +@@ -169,6 +169,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime) + */ + 99: + li r0,__NR_clock_gettime ++ .cfi_restore lr + sc + blr + .cfi_endproc +diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c +index 9f574e59d178..2f162c6e52d4 100644 +--- a/arch/powerpc/mm/slb.c ++++ b/arch/powerpc/mm/slb.c +@@ -355,7 +355,7 @@ void slb_initialize(void) + #endif + } + +- get_paca()->stab_rr = SLB_NUM_BOLTED; ++ get_paca()->stab_rr = SLB_NUM_BOLTED - 1; + + lflags = SLB_VSID_KERNEL | linear_llp; + vflags = SLB_VSID_KERNEL | vmalloc_llp; +diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c +index f99cd31b6fd1..2f166136bb50 100644 +--- a/arch/powerpc/platforms/pseries/hotplug-memory.c ++++ b/arch/powerpc/platforms/pseries/hotplug-memory.c +@@ -163,7 +163,7 @@ static u32 find_aa_index(struct device_node *dr_node, + return aa_index; + } + +-static u32 lookup_lmb_associativity_index(struct drmem_lmb *lmb) ++static int update_lmb_associativity_index(struct drmem_lmb *lmb) + { + struct device_node *parent, *lmb_node, *dr_node; + struct property *ala_prop; +@@ -203,43 +203,14 @@ static u32 lookup_lmb_associativity_index(struct drmem_lmb *lmb) + aa_index = find_aa_index(dr_node, ala_prop, lmb_assoc); + + dlpar_free_cc_nodes(lmb_node); +- return aa_index; +-} +- +-static int dlpar_add_device_tree_lmb(struct drmem_lmb *lmb) +-{ +- int rc, aa_index; +- +- lmb->flags |= DRCONF_MEM_ASSIGNED; + +- aa_index = lookup_lmb_associativity_index(lmb); + if (aa_index < 0) { +- pr_err("Couldn't find associativity index for drc index %x\n", +- lmb->drc_index); +- return aa_index; ++ pr_err("Could not find LMB associativity\n"); ++ return -1; + } + + lmb->aa_index = aa_index; +- +- rtas_hp_event = true; +- rc = drmem_update_dt(); +- rtas_hp_event = false; +- +- return rc; +-} +- +-static int dlpar_remove_device_tree_lmb(struct drmem_lmb *lmb) +-{ +- int rc; +- +- lmb->flags &= ~DRCONF_MEM_ASSIGNED; +- lmb->aa_index = 0xffffffff; +- +- rtas_hp_event = true; +- rc = drmem_update_dt(); +- rtas_hp_event = false; +- +- return rc; ++ return 0; + } + + static struct memory_block *lmb_to_memblock(struct drmem_lmb *lmb) +@@ -431,7 +402,9 @@ static int dlpar_remove_lmb(struct drmem_lmb *lmb) + /* Update memory regions for memory remove */ + memblock_remove(lmb->base_addr, block_sz); + +- dlpar_remove_device_tree_lmb(lmb); ++ invalidate_lmb_associativity_index(lmb); ++ lmb->flags &= ~DRCONF_MEM_ASSIGNED; ++ + return 0; + } + +@@ -691,10 +664,8 @@ static int dlpar_add_lmb(struct drmem_lmb *lmb) + if (lmb->flags & DRCONF_MEM_ASSIGNED) + return -EINVAL; + +- rc = dlpar_add_device_tree_lmb(lmb); ++ rc = update_lmb_associativity_index(lmb); + if (rc) { +- pr_err("Couldn't update device tree for drc index %x\n", +- lmb->drc_index); + dlpar_release_drc(lmb->drc_index); + return rc; + } +@@ -707,14 +678,14 @@ static int dlpar_add_lmb(struct drmem_lmb *lmb) + /* Add the memory */ + rc = add_memory(nid, lmb->base_addr, block_sz); + if (rc) { +- dlpar_remove_device_tree_lmb(lmb); ++ invalidate_lmb_associativity_index(lmb); + return rc; + } + + rc = dlpar_online_lmb(lmb); + if (rc) { + remove_memory(nid, lmb->base_addr, block_sz); +- dlpar_remove_device_tree_lmb(lmb); ++ invalidate_lmb_associativity_index(lmb); + } else { + lmb->flags |= DRCONF_MEM_ASSIGNED; + } +@@ -961,6 +932,12 @@ int dlpar_memory(struct pseries_hp_errorlog *hp_elog) + break; + } + ++ if (!rc) { ++ rtas_hp_event = true; ++ rc = drmem_update_dt(); ++ rtas_hp_event = false; ++ } ++ + unlock_device_hotplug(); + return rc; + } +diff --git a/arch/s390/include/asm/mmu.h b/arch/s390/include/asm/mmu.h +index a8418e1379eb..bcfb6371086f 100644 +--- a/arch/s390/include/asm/mmu.h ++++ b/arch/s390/include/asm/mmu.h +@@ -32,6 +32,8 @@ typedef struct { + unsigned int uses_cmm:1; + /* The gmaps associated with this context are allowed to use huge pages. */ + unsigned int allow_gmap_hpage_1m:1; ++ /* The mmu context is for compat task */ ++ unsigned int compat_mm:1; + } mm_context_t; + + #define INIT_MM_CONTEXT(name) \ +diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h +index 09b61d0e491f..8d04e6f3f796 100644 +--- a/arch/s390/include/asm/mmu_context.h ++++ b/arch/s390/include/asm/mmu_context.h +@@ -25,6 +25,7 @@ static inline int init_new_context(struct task_struct *tsk, + atomic_set(&mm->context.flush_count, 0); + mm->context.gmap_asce = 0; + mm->context.flush_mm = 0; ++ mm->context.compat_mm = test_thread_flag(TIF_31BIT); + #ifdef CONFIG_PGSTE + mm->context.alloc_pgste = page_table_allocate_pgste || + test_thread_flag(TIF_PGSTE) || +diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c +index 3031cc6dd0ab..7ab7d256d1eb 100644 +--- a/arch/s390/kernel/vdso.c ++++ b/arch/s390/kernel/vdso.c +@@ -56,7 +56,7 @@ static vm_fault_t vdso_fault(const struct vm_special_mapping *sm, + vdso_pagelist = vdso64_pagelist; + vdso_pages = vdso64_pages; + #ifdef CONFIG_COMPAT +- if (is_compat_task()) { ++ if (vma->vm_mm->context.compat_mm) { + vdso_pagelist = vdso32_pagelist; + vdso_pages = vdso32_pages; + } +@@ -77,7 +77,7 @@ static int vdso_mremap(const struct vm_special_mapping *sm, + + vdso_pages = vdso64_pages; + #ifdef CONFIG_COMPAT +- if (is_compat_task()) ++ if (vma->vm_mm->context.compat_mm) + vdso_pages = vdso32_pages; + #endif + +@@ -224,7 +224,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) + + vdso_pages = vdso64_pages; + #ifdef CONFIG_COMPAT +- if (is_compat_task()) ++ mm->context.compat_mm = is_compat_task(); ++ if (mm->context.compat_mm) + vdso_pages = vdso32_pages; + #endif + /* +diff --git a/arch/s390/kernel/vdso32/clock_gettime.S b/arch/s390/kernel/vdso32/clock_gettime.S +index a9418bf975db..ada5c11a16e5 100644 +--- a/arch/s390/kernel/vdso32/clock_gettime.S ++++ b/arch/s390/kernel/vdso32/clock_gettime.S +@@ -10,6 +10,7 @@ + #include <asm/asm-offsets.h> + #include <asm/unistd.h> + #include <asm/dwarf.h> ++#include <asm/ptrace.h> + + .text + .align 4 +@@ -18,8 +19,8 @@ + __kernel_clock_gettime: + CFI_STARTPROC + ahi %r15,-16 +- CFI_DEF_CFA_OFFSET 176 +- CFI_VAL_OFFSET 15, -160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + basr %r5,0 + 0: al %r5,21f-0b(%r5) /* get &_vdso_data */ + chi %r2,__CLOCK_REALTIME_COARSE +@@ -72,13 +73,13 @@ __kernel_clock_gettime: + st %r1,4(%r3) /* store tp->tv_nsec */ + lhi %r2,0 + ahi %r15,16 +- CFI_DEF_CFA_OFFSET 160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD + CFI_RESTORE 15 + br %r14 + + /* CLOCK_MONOTONIC_COARSE */ +- CFI_DEF_CFA_OFFSET 176 +- CFI_VAL_OFFSET 15, -160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + 9: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ + tml %r4,0x0001 /* pending update ? loop */ + jnz 9b +@@ -158,17 +159,17 @@ __kernel_clock_gettime: + st %r1,4(%r3) /* store tp->tv_nsec */ + lhi %r2,0 + ahi %r15,16 +- CFI_DEF_CFA_OFFSET 160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD + CFI_RESTORE 15 + br %r14 + + /* Fallback to system call */ +- CFI_DEF_CFA_OFFSET 176 +- CFI_VAL_OFFSET 15, -160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + 19: lhi %r1,__NR_clock_gettime + svc 0 + ahi %r15,16 +- CFI_DEF_CFA_OFFSET 160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD + CFI_RESTORE 15 + br %r14 + CFI_ENDPROC +diff --git a/arch/s390/kernel/vdso32/gettimeofday.S b/arch/s390/kernel/vdso32/gettimeofday.S +index 3c0db0fa6ad9..b23063fbc892 100644 +--- a/arch/s390/kernel/vdso32/gettimeofday.S ++++ b/arch/s390/kernel/vdso32/gettimeofday.S +@@ -10,6 +10,7 @@ + #include <asm/asm-offsets.h> + #include <asm/unistd.h> + #include <asm/dwarf.h> ++#include <asm/ptrace.h> + + .text + .align 4 +@@ -19,7 +20,7 @@ __kernel_gettimeofday: + CFI_STARTPROC + ahi %r15,-16 + CFI_ADJUST_CFA_OFFSET 16 +- CFI_VAL_OFFSET 15, -160 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + basr %r5,0 + 0: al %r5,13f-0b(%r5) /* get &_vdso_data */ + 1: ltr %r3,%r3 /* check if tz is NULL */ +diff --git a/arch/s390/kernel/vdso64/clock_gettime.S b/arch/s390/kernel/vdso64/clock_gettime.S +index fac3ab5ec83a..9d2ee79b90f2 100644 +--- a/arch/s390/kernel/vdso64/clock_gettime.S ++++ b/arch/s390/kernel/vdso64/clock_gettime.S +@@ -10,6 +10,7 @@ + #include <asm/asm-offsets.h> + #include <asm/unistd.h> + #include <asm/dwarf.h> ++#include <asm/ptrace.h> + + .text + .align 4 +@@ -18,8 +19,8 @@ + __kernel_clock_gettime: + CFI_STARTPROC + aghi %r15,-16 +- CFI_DEF_CFA_OFFSET 176 +- CFI_VAL_OFFSET 15, -160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + larl %r5,_vdso_data + cghi %r2,__CLOCK_REALTIME_COARSE + je 4f +@@ -56,13 +57,13 @@ __kernel_clock_gettime: + stg %r1,8(%r3) /* store tp->tv_nsec */ + lghi %r2,0 + aghi %r15,16 +- CFI_DEF_CFA_OFFSET 160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD + CFI_RESTORE 15 + br %r14 + + /* CLOCK_MONOTONIC_COARSE */ +- CFI_DEF_CFA_OFFSET 176 +- CFI_VAL_OFFSET 15, -160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + 3: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */ + tmll %r4,0x0001 /* pending update ? loop */ + jnz 3b +@@ -115,13 +116,13 @@ __kernel_clock_gettime: + stg %r1,8(%r3) /* store tp->tv_nsec */ + lghi %r2,0 + aghi %r15,16 +- CFI_DEF_CFA_OFFSET 160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD + CFI_RESTORE 15 + br %r14 + + /* CPUCLOCK_VIRT for this thread */ +- CFI_DEF_CFA_OFFSET 176 +- CFI_VAL_OFFSET 15, -160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + 9: lghi %r4,0 + icm %r0,15,__VDSO_ECTG_OK(%r5) + jz 12f +@@ -142,17 +143,17 @@ __kernel_clock_gettime: + stg %r4,8(%r3) + lghi %r2,0 + aghi %r15,16 +- CFI_DEF_CFA_OFFSET 160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD + CFI_RESTORE 15 + br %r14 + + /* Fallback to system call */ +- CFI_DEF_CFA_OFFSET 176 +- CFI_VAL_OFFSET 15, -160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + 12: lghi %r1,__NR_clock_gettime + svc 0 + aghi %r15,16 +- CFI_DEF_CFA_OFFSET 160 ++ CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD + CFI_RESTORE 15 + br %r14 + CFI_ENDPROC +diff --git a/arch/s390/kernel/vdso64/gettimeofday.S b/arch/s390/kernel/vdso64/gettimeofday.S +index 6e1f0b421695..aebe10dc7c99 100644 +--- a/arch/s390/kernel/vdso64/gettimeofday.S ++++ b/arch/s390/kernel/vdso64/gettimeofday.S +@@ -10,6 +10,7 @@ + #include <asm/asm-offsets.h> + #include <asm/unistd.h> + #include <asm/dwarf.h> ++#include <asm/ptrace.h> + + .text + .align 4 +@@ -19,7 +20,7 @@ __kernel_gettimeofday: + CFI_STARTPROC + aghi %r15,-16 + CFI_ADJUST_CFA_OFFSET 16 +- CFI_VAL_OFFSET 15, -160 ++ CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD + larl %r5,_vdso_data + 0: ltgr %r3,%r3 /* check if tz is NULL */ + je 1f +diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c +index 3fb855155286..8a9cff1f129d 100644 +--- a/arch/x86/hyperv/hv_init.c ++++ b/arch/x86/hyperv/hv_init.c +@@ -17,6 +17,7 @@ + * + */ + ++#include <linux/efi.h> + #include <linux/types.h> + #include <asm/apic.h> + #include <asm/desc.h> +@@ -257,6 +258,22 @@ static int hv_cpu_die(unsigned int cpu) + return 0; + } + ++static int __init hv_pci_init(void) ++{ ++ int gen2vm = efi_enabled(EFI_BOOT); ++ ++ /* ++ * For Generation-2 VM, we exit from pci_arch_init() by returning 0. ++ * The purpose is to suppress the harmless warning: ++ * "PCI: Fatal: No config space access function found" ++ */ ++ if (gen2vm) ++ return 0; ++ ++ /* For Generation-1 VM, we'll proceed in pci_arch_init(). */ ++ return 1; ++} ++ + /* + * This function is to be invoked early in the boot sequence after the + * hypervisor has been detected. +@@ -333,6 +350,8 @@ void __init hyperv_init(void) + + hv_apic_init(); + ++ x86_init.pci.arch_init = hv_pci_init; ++ + /* + * Register Hyper-V specific clocksource. + */ +diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c +index 1e07814f02bc..a6458ab499c2 100644 +--- a/arch/x86/kernel/cpu/common.c ++++ b/arch/x86/kernel/cpu/common.c +@@ -1133,6 +1133,9 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) + memset(&c->x86_capability, 0, sizeof c->x86_capability); + c->extended_cpuid_level = 0; + ++ if (!have_cpuid_p()) ++ identify_cpu_without_cpuid(c); ++ + /* cyrix could have cpuid enabled via c_identify()*/ + if (have_cpuid_p()) { + cpu_detect(c); +@@ -1150,7 +1153,6 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) + if (this_cpu->c_bsp_init) + this_cpu->c_bsp_init(c); + } else { +- identify_cpu_without_cpuid(c); + setup_clear_cpu_cap(X86_FEATURE_CPUID); + } + +diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c +index fa61c870ada9..1d9b8aaea06c 100644 +--- a/arch/x86/kernel/cpu/cyrix.c ++++ b/arch/x86/kernel/cpu/cyrix.c +@@ -437,7 +437,7 @@ static void cyrix_identify(struct cpuinfo_x86 *c) + /* enable MAPEN */ + setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); + /* enable cpuid */ +- setCx86_old(CX86_CCR4, getCx86_old(CX86_CCR4) | 0x80); ++ setCx86(CX86_CCR4, getCx86(CX86_CCR4) | 0x80); + /* disable MAPEN */ + setCx86(CX86_CCR3, ccr3); + local_irq_restore(flags); +diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c +index ff1c00b695ae..1ceccc4a5472 100644 +--- a/arch/x86/kernel/cpu/mcheck/mce-inject.c ++++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c +@@ -106,6 +106,9 @@ static void setup_inj_struct(struct mce *m) + memset(m, 0, sizeof(struct mce)); + + m->cpuvendor = boot_cpu_data.x86_vendor; ++ m->time = ktime_get_real_seconds(); ++ m->cpuid = cpuid_eax(1); ++ m->microcode = boot_cpu_data.microcode; + } + + /* Update fake mce registers on current CPU. */ +@@ -580,6 +583,9 @@ static int inj_bank_set(void *data, u64 val) + m->bank = val; + do_inject(); + ++ /* Reset injection struct */ ++ setup_inj_struct(&i_mce); ++ + return 0; + } + +diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c +index 9119859ba787..420aa7d3a2e6 100644 +--- a/arch/x86/kernel/uprobes.c ++++ b/arch/x86/kernel/uprobes.c +@@ -1089,7 +1089,7 @@ arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr, struct pt_regs + pr_err("return address clobbered: pid=%d, %%sp=%#lx, %%ip=%#lx\n", + current->pid, regs->sp, regs->ip); + +- force_sig_info(SIGSEGV, SEND_SIG_FORCED, current); ++ force_sig(SIGSEGV, current); + } + + return -1; +diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c +index 4eda2a9c234a..1ab4bb3d6a04 100644 +--- a/arch/x86/kvm/vmx.c ++++ b/arch/x86/kvm/vmx.c +@@ -5173,7 +5173,7 @@ static void ept_load_pdptrs(struct kvm_vcpu *vcpu) + (unsigned long *)&vcpu->arch.regs_dirty)) + return; + +- if (is_paging(vcpu) && is_pae(vcpu) && !is_long_mode(vcpu)) { ++ if (is_pae_paging(vcpu)) { + vmcs_write64(GUEST_PDPTR0, mmu->pdptrs[0]); + vmcs_write64(GUEST_PDPTR1, mmu->pdptrs[1]); + vmcs_write64(GUEST_PDPTR2, mmu->pdptrs[2]); +@@ -5185,7 +5185,7 @@ static void ept_save_pdptrs(struct kvm_vcpu *vcpu) + { + struct kvm_mmu *mmu = vcpu->arch.walk_mmu; + +- if (is_paging(vcpu) && is_pae(vcpu) && !is_long_mode(vcpu)) { ++ if (is_pae_paging(vcpu)) { + mmu->pdptrs[0] = vmcs_read64(GUEST_PDPTR0); + mmu->pdptrs[1] = vmcs_read64(GUEST_PDPTR1); + mmu->pdptrs[2] = vmcs_read64(GUEST_PDPTR2); +@@ -12013,8 +12013,7 @@ static int nested_vmx_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3, bool ne + * If PAE paging and EPT are both on, CR3 is not used by the CPU and + * must not be dereferenced. + */ +- if (!is_long_mode(vcpu) && is_pae(vcpu) && is_paging(vcpu) && +- !nested_ept) { ++ if (is_pae_paging(vcpu) && !nested_ept) { + if (!load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3)) { + *entry_failure_code = ENTRY_FAIL_PDPTE; + return 1; +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index e536503ac788..6cf8af022b21 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -634,7 +634,7 @@ bool pdptrs_changed(struct kvm_vcpu *vcpu) + gfn_t gfn; + int r; + +- if (is_long_mode(vcpu) || !is_pae(vcpu) || !is_paging(vcpu)) ++ if (!is_pae_paging(vcpu)) + return false; + + if (!test_bit(VCPU_EXREG_PDPTR, +@@ -885,8 +885,8 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) + if (is_long_mode(vcpu) && + (cr3 & rsvd_bits(cpuid_maxphyaddr(vcpu), 63))) + return 1; +- else if (is_pae(vcpu) && is_paging(vcpu) && +- !load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3)) ++ else if (is_pae_paging(vcpu) && ++ !load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3)) + return 1; + + kvm_mmu_new_cr3(vcpu, cr3, skip_tlb_flush); +@@ -8348,7 +8348,7 @@ static int __set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) + kvm_update_cpuid(vcpu); + + idx = srcu_read_lock(&vcpu->kvm->srcu); +- if (!is_long_mode(vcpu) && is_pae(vcpu) && is_paging(vcpu)) { ++ if (is_pae_paging(vcpu)) { + load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu)); + mmu_reset_needed = 1; + } +diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h +index 3a91ea760f07..608e5f8c5d0a 100644 +--- a/arch/x86/kvm/x86.h ++++ b/arch/x86/kvm/x86.h +@@ -139,6 +139,11 @@ static inline int is_paging(struct kvm_vcpu *vcpu) + return likely(kvm_read_cr0_bits(vcpu, X86_CR0_PG)); + } + ++static inline bool is_pae_paging(struct kvm_vcpu *vcpu) ++{ ++ return !is_long_mode(vcpu) && is_pae(vcpu) && is_paging(vcpu); ++} ++ + static inline u32 bit(int bitno) + { + return 1 << (bitno & 31); +diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c +index d8d2ac294b0c..66b1ebc21ce4 100644 +--- a/block/bfq-iosched.c ++++ b/block/bfq-iosched.c +@@ -3195,6 +3195,13 @@ static unsigned long bfq_bfqq_softrt_next_start(struct bfq_data *bfqd, + jiffies + nsecs_to_jiffies(bfqq->bfqd->bfq_slice_idle) + 4); + } + ++static bool bfq_bfqq_injectable(struct bfq_queue *bfqq) ++{ ++ return BFQQ_SEEKY(bfqq) && bfqq->wr_coeff == 1 && ++ blk_queue_nonrot(bfqq->bfqd->queue) && ++ bfqq->bfqd->hw_tag; ++} ++ + /** + * bfq_bfqq_expire - expire a queue. + * @bfqd: device owning the queue. +@@ -3304,6 +3311,8 @@ void bfq_bfqq_expire(struct bfq_data *bfqd, + if (ref == 1) /* bfqq is gone, no more actions on it */ + return; + ++ bfqq->injected_service = 0; ++ + /* mark bfqq as waiting a request only if a bic still points to it */ + if (!bfq_bfqq_busy(bfqq) && + reason != BFQQE_BUDGET_TIMEOUT && +@@ -3584,7 +3593,12 @@ static bool bfq_better_to_idle(struct bfq_queue *bfqq) + * whether bfqq is being weight-raised, because + * bfq_symmetric_scenario() does not take into account also + * weight-raised queues (see comments on +- * bfq_weights_tree_add()). ++ * bfq_weights_tree_add()). In particular, if bfqq is being ++ * weight-raised, it is important to idle only if there are ++ * other, non-weight-raised queues that may steal throughput ++ * to bfqq. Actually, we should be even more precise, and ++ * differentiate between interactive weight raising and ++ * soft real-time weight raising. + * + * As a side note, it is worth considering that the above + * device-idling countermeasures may however fail in the +@@ -3596,7 +3610,8 @@ static bool bfq_better_to_idle(struct bfq_queue *bfqq) + * to let requests be served in the desired order until all + * the requests already queued in the device have been served. + */ +- asymmetric_scenario = bfqq->wr_coeff > 1 || ++ asymmetric_scenario = (bfqq->wr_coeff > 1 && ++ bfqd->wr_busy_queues < bfqd->busy_queues) || + !bfq_symmetric_scenario(bfqd); + + /* +@@ -3642,6 +3657,30 @@ static bool bfq_bfqq_must_idle(struct bfq_queue *bfqq) + return RB_EMPTY_ROOT(&bfqq->sort_list) && bfq_better_to_idle(bfqq); + } + ++static struct bfq_queue *bfq_choose_bfqq_for_injection(struct bfq_data *bfqd) ++{ ++ struct bfq_queue *bfqq; ++ ++ /* ++ * A linear search; but, with a high probability, very few ++ * steps are needed to find a candidate queue, i.e., a queue ++ * with enough budget left for its next request. In fact: ++ * - BFQ dynamically updates the budget of every queue so as ++ * to accommodate the expected backlog of the queue; ++ * - if a queue gets all its requests dispatched as injected ++ * service, then the queue is removed from the active list ++ * (and re-added only if it gets new requests, but with ++ * enough budget for its new backlog). ++ */ ++ list_for_each_entry(bfqq, &bfqd->active_list, bfqq_list) ++ if (!RB_EMPTY_ROOT(&bfqq->sort_list) && ++ bfq_serv_to_charge(bfqq->next_rq, bfqq) <= ++ bfq_bfqq_budget_left(bfqq)) ++ return bfqq; ++ ++ return NULL; ++} ++ + /* + * Select a queue for service. If we have a current queue in service, + * check whether to continue servicing it, or retrieve and set a new one. +@@ -3723,10 +3762,19 @@ check_queue: + * No requests pending. However, if the in-service queue is idling + * for a new request, or has requests waiting for a completion and + * may idle after their completion, then keep it anyway. ++ * ++ * Yet, to boost throughput, inject service from other queues if ++ * possible. + */ + if (bfq_bfqq_wait_request(bfqq) || + (bfqq->dispatched != 0 && bfq_better_to_idle(bfqq))) { +- bfqq = NULL; ++ if (bfq_bfqq_injectable(bfqq) && ++ bfqq->injected_service * bfqq->inject_coeff < ++ bfqq->entity.service * 10) ++ bfqq = bfq_choose_bfqq_for_injection(bfqd); ++ else ++ bfqq = NULL; ++ + goto keep_queue; + } + +@@ -3816,6 +3864,14 @@ static struct request *bfq_dispatch_rq_from_bfqq(struct bfq_data *bfqd, + + bfq_dispatch_remove(bfqd->queue, rq); + ++ if (bfqq != bfqd->in_service_queue) { ++ if (likely(bfqd->in_service_queue)) ++ bfqd->in_service_queue->injected_service += ++ bfq_serv_to_charge(rq, bfqq); ++ ++ goto return_rq; ++ } ++ + /* + * If weight raising has to terminate for bfqq, then next + * function causes an immediate update of bfqq's weight, +@@ -3834,13 +3890,12 @@ static struct request *bfq_dispatch_rq_from_bfqq(struct bfq_data *bfqd, + * belongs to CLASS_IDLE and other queues are waiting for + * service. + */ +- if (bfqd->busy_queues > 1 && bfq_class_idle(bfqq)) +- goto expire; +- +- return rq; ++ if (!(bfqd->busy_queues > 1 && bfq_class_idle(bfqq))) ++ goto return_rq; + +-expire: + bfq_bfqq_expire(bfqd, bfqq, false, BFQQE_BUDGET_EXHAUSTED); ++ ++return_rq: + return rq; + } + +@@ -4246,6 +4301,13 @@ static void bfq_init_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq, + bfq_mark_bfqq_has_short_ttime(bfqq); + bfq_mark_bfqq_sync(bfqq); + bfq_mark_bfqq_just_created(bfqq); ++ /* ++ * Aggressively inject a lot of service: up to 90%. ++ * This coefficient remains constant during bfqq life, ++ * but this behavior might be changed, after enough ++ * testing and tuning. ++ */ ++ bfqq->inject_coeff = 1; + } else + bfq_clear_bfqq_sync(bfqq); + +diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h +index d5e9e60cb1a5..a41e9884f2dd 100644 +--- a/block/bfq-iosched.h ++++ b/block/bfq-iosched.h +@@ -351,6 +351,32 @@ struct bfq_queue { + unsigned long split_time; /* time of last split */ + + unsigned long first_IO_time; /* time of first I/O for this queue */ ++ ++ /* max service rate measured so far */ ++ u32 max_service_rate; ++ /* ++ * Ratio between the service received by bfqq while it is in ++ * service, and the cumulative service (of requests of other ++ * queues) that may be injected while bfqq is empty but still ++ * in service. To increase precision, the coefficient is ++ * measured in tenths of unit. Here are some example of (1) ++ * ratios, (2) resulting percentages of service injected ++ * w.r.t. to the total service dispatched while bfqq is in ++ * service, and (3) corresponding values of the coefficient: ++ * 1 (50%) -> 10 ++ * 2 (33%) -> 20 ++ * 10 (9%) -> 100 ++ * 9.9 (9%) -> 99 ++ * 1.5 (40%) -> 15 ++ * 0.5 (66%) -> 5 ++ * 0.1 (90%) -> 1 ++ * ++ * So, if the coefficient is lower than 10, then ++ * injected service is more than bfqq service. ++ */ ++ unsigned int inject_coeff; ++ /* amount of service injected in current service slot */ ++ unsigned int injected_service; + }; + + /** +diff --git a/crypto/chacha20_generic.c b/crypto/chacha20_generic.c +index e451c3cb6a56..3ae96587caf9 100644 +--- a/crypto/chacha20_generic.c ++++ b/crypto/chacha20_generic.c +@@ -18,20 +18,21 @@ + static void chacha20_docrypt(u32 *state, u8 *dst, const u8 *src, + unsigned int bytes) + { +- u32 stream[CHACHA20_BLOCK_WORDS]; ++ /* aligned to potentially speed up crypto_xor() */ ++ u8 stream[CHACHA20_BLOCK_SIZE] __aligned(sizeof(long)); + + if (dst != src) + memcpy(dst, src, bytes); + + while (bytes >= CHACHA20_BLOCK_SIZE) { + chacha20_block(state, stream); +- crypto_xor(dst, (const u8 *)stream, CHACHA20_BLOCK_SIZE); ++ crypto_xor(dst, stream, CHACHA20_BLOCK_SIZE); + bytes -= CHACHA20_BLOCK_SIZE; + dst += CHACHA20_BLOCK_SIZE; + } + if (bytes) { + chacha20_block(state, stream); +- crypto_xor(dst, (const u8 *)stream, bytes); ++ crypto_xor(dst, stream, bytes); + } + } + +diff --git a/crypto/rsa-pkcs1pad.c b/crypto/rsa-pkcs1pad.c +index 9893dbfc1af4..812476e46821 100644 +--- a/crypto/rsa-pkcs1pad.c ++++ b/crypto/rsa-pkcs1pad.c +@@ -261,15 +261,6 @@ static int pkcs1pad_encrypt(struct akcipher_request *req) + pkcs1pad_sg_set_buf(req_ctx->in_sg, req_ctx->in_buf, + ctx->key_size - 1 - req->src_len, req->src); + +- req_ctx->out_buf = kmalloc(ctx->key_size, GFP_KERNEL); +- if (!req_ctx->out_buf) { +- kfree(req_ctx->in_buf); +- return -ENOMEM; +- } +- +- pkcs1pad_sg_set_buf(req_ctx->out_sg, req_ctx->out_buf, +- ctx->key_size, NULL); +- + akcipher_request_set_tfm(&req_ctx->child_req, ctx->child); + akcipher_request_set_callback(&req_ctx->child_req, req->base.flags, + pkcs1pad_encrypt_sign_complete_cb, req); +diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c +index c651e206d796..7eda27d43b48 100644 +--- a/drivers/acpi/acpi_lpss.c ++++ b/drivers/acpi/acpi_lpss.c +@@ -99,6 +99,9 @@ struct lpss_private_data { + u32 prv_reg_ctx[LPSS_PRV_REG_COUNT]; + }; + ++/* Devices which need to be in D3 before lpss_iosf_enter_d3_state() proceeds */ ++static u32 pmc_atom_d3_mask = 0xfe000ffe; ++ + /* LPSS run time quirks */ + static unsigned int lpss_quirks; + +@@ -175,6 +178,21 @@ static void byt_pwm_setup(struct lpss_private_data *pdata) + + static void byt_i2c_setup(struct lpss_private_data *pdata) + { ++ const char *uid_str = acpi_device_uid(pdata->adev); ++ acpi_handle handle = pdata->adev->handle; ++ unsigned long long shared_host = 0; ++ acpi_status status; ++ long uid = 0; ++ ++ /* Expected to always be true, but better safe then sorry */ ++ if (uid_str) ++ uid = simple_strtol(uid_str, NULL, 10); ++ ++ /* Detect I2C bus shared with PUNIT and ignore its d3 status */ ++ status = acpi_evaluate_integer(handle, "_SEM", NULL, &shared_host); ++ if (ACPI_SUCCESS(status) && shared_host && uid) ++ pmc_atom_d3_mask &= ~(BIT_LPSS2_F1_I2C1 << (uid - 1)); ++ + lpss_deassert_reset(pdata); + + if (readl(pdata->mmio_base + pdata->dev_desc->prv_offset)) +@@ -894,7 +912,7 @@ static void lpss_iosf_enter_d3_state(void) + * Here we read the values related to LPSS power island, i.e. LPSS + * devices, excluding both LPSS DMA controllers, along with SCC domain. + */ +- u32 func_dis, d3_sts_0, pmc_status, pmc_mask = 0xfe000ffe; ++ u32 func_dis, d3_sts_0, pmc_status; + int ret; + + ret = pmc_atom_read(PMC_FUNC_DIS, &func_dis); +@@ -912,7 +930,7 @@ static void lpss_iosf_enter_d3_state(void) + * Shutdown both LPSS DMA controllers if and only if all other devices + * are already in D3hot. + */ +- pmc_status = (~(d3_sts_0 | func_dis)) & pmc_mask; ++ pmc_status = (~(d3_sts_0 | func_dis)) & pmc_atom_d3_mask; + if (pmc_status) + goto exit; + +diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c +index 7433035ded95..e465e720eab2 100644 +--- a/drivers/acpi/pci_root.c ++++ b/drivers/acpi/pci_root.c +@@ -455,8 +455,9 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm) + decode_osc_support(root, "OS supports", support); + status = acpi_pci_osc_support(root, support); + if (ACPI_FAILURE(status)) { +- dev_info(&device->dev, "_OSC failed (%s); disabling ASPM\n", +- acpi_format_exception(status)); ++ dev_info(&device->dev, "_OSC failed (%s)%s\n", ++ acpi_format_exception(status), ++ pcie_aspm_support_enabled() ? "; disabling ASPM" : ""); + *no_aspm = 1; + return; + } +diff --git a/drivers/android/binder.c b/drivers/android/binder.c +index 6e04e7a707a1..cf4367135a00 100644 +--- a/drivers/android/binder.c ++++ b/drivers/android/binder.c +@@ -822,6 +822,7 @@ static void + binder_enqueue_deferred_thread_work_ilocked(struct binder_thread *thread, + struct binder_work *work) + { ++ WARN_ON(!list_empty(&thread->waiting_thread_node)); + binder_enqueue_work_ilocked(work, &thread->todo); + } + +@@ -839,6 +840,7 @@ static void + binder_enqueue_thread_work_ilocked(struct binder_thread *thread, + struct binder_work *work) + { ++ WARN_ON(!list_empty(&thread->waiting_thread_node)); + binder_enqueue_work_ilocked(work, &thread->todo); + thread->process_todo = true; + } +@@ -1270,19 +1272,12 @@ static int binder_inc_node_nilocked(struct binder_node *node, int strong, + } else + node->local_strong_refs++; + if (!node->has_strong_ref && target_list) { ++ struct binder_thread *thread = container_of(target_list, ++ struct binder_thread, todo); + binder_dequeue_work_ilocked(&node->work); +- /* +- * Note: this function is the only place where we queue +- * directly to a thread->todo without using the +- * corresponding binder_enqueue_thread_work() helper +- * functions; in this case it's ok to not set the +- * process_todo flag, since we know this node work will +- * always be followed by other work that starts queue +- * processing: in case of synchronous transactions, a +- * BR_REPLY or BR_ERROR; in case of oneway +- * transactions, a BR_TRANSACTION_COMPLETE. +- */ +- binder_enqueue_work_ilocked(&node->work, target_list); ++ BUG_ON(&thread->todo != target_list); ++ binder_enqueue_deferred_thread_work_ilocked(thread, ++ &node->work); + } + } else { + if (!internal) +@@ -2733,6 +2728,7 @@ static void binder_transaction(struct binder_proc *proc, + { + int ret; + struct binder_transaction *t; ++ struct binder_work *w; + struct binder_work *tcomplete; + binder_size_t *offp, *off_end, *off_start; + binder_size_t off_min; +@@ -2874,6 +2870,29 @@ static void binder_transaction(struct binder_proc *proc, + goto err_invalid_target_handle; + } + binder_inner_proc_lock(proc); ++ ++ w = list_first_entry_or_null(&thread->todo, ++ struct binder_work, entry); ++ if (!(tr->flags & TF_ONE_WAY) && w && ++ w->type == BINDER_WORK_TRANSACTION) { ++ /* ++ * Do not allow new outgoing transaction from a ++ * thread that has a transaction at the head of ++ * its todo list. Only need to check the head ++ * because binder_select_thread_ilocked picks a ++ * thread from proc->waiting_threads to enqueue ++ * the transaction, and nothing is queued to the ++ * todo list while the thread is on waiting_threads. ++ */ ++ binder_user_error("%d:%d new transaction not allowed when there is a transaction on thread todo\n", ++ proc->pid, thread->pid); ++ binder_inner_proc_unlock(proc); ++ return_error = BR_FAILED_REPLY; ++ return_error_param = -EPROTO; ++ return_error_line = __LINE__; ++ goto err_bad_todo_list; ++ } ++ + if (!(tr->flags & TF_ONE_WAY) && thread->transaction_stack) { + struct binder_transaction *tmp; + +@@ -3256,6 +3275,7 @@ err_alloc_tcomplete_failed: + kfree(t); + binder_stats_deleted(BINDER_STAT_TRANSACTION); + err_alloc_t_failed: ++err_bad_todo_list: + err_bad_call_stack: + err_empty_call_stack: + err_dead_binder: +diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c +index 46f0bd75eff7..cf1e0e18a7a9 100644 +--- a/drivers/ata/ahci_platform.c ++++ b/drivers/ata/ahci_platform.c +@@ -33,6 +33,13 @@ static const struct ata_port_info ahci_port_info = { + .port_ops = &ahci_platform_ops, + }; + ++static const struct ata_port_info ahci_port_info_nolpm = { ++ .flags = AHCI_FLAG_COMMON | ATA_FLAG_NO_LPM, ++ .pio_mask = ATA_PIO4, ++ .udma_mask = ATA_UDMA6, ++ .port_ops = &ahci_platform_ops, ++}; ++ + static struct scsi_host_template ahci_platform_sht = { + AHCI_SHT(DRV_NAME), + }; +@@ -41,6 +48,7 @@ static int ahci_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; + struct ahci_host_priv *hpriv; ++ const struct ata_port_info *port; + int rc; + + hpriv = ahci_platform_get_resources(pdev, +@@ -58,7 +66,11 @@ static int ahci_probe(struct platform_device *pdev) + if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci")) + hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ; + +- rc = ahci_platform_init_host(pdev, hpriv, &ahci_port_info, ++ port = acpi_device_get_match_data(dev); ++ if (!port) ++ port = &ahci_port_info; ++ ++ rc = ahci_platform_init_host(pdev, hpriv, port, + &ahci_platform_sht); + if (rc) + goto disable_resources; +@@ -85,6 +97,7 @@ static const struct of_device_id ahci_of_match[] = { + MODULE_DEVICE_TABLE(of, ahci_of_match); + + static const struct acpi_device_id ahci_acpi_match[] = { ++ { "APMC0D33", (unsigned long)&ahci_port_info_nolpm }, + { ACPI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff) }, + {}, + }; +diff --git a/drivers/base/component.c b/drivers/base/component.c +index 8946dfee4768..e8d676fad0c9 100644 +--- a/drivers/base/component.c ++++ b/drivers/base/component.c +@@ -536,9 +536,9 @@ int component_bind_all(struct device *master_dev, void *data) + } + + if (ret != 0) { +- for (; i--; ) +- if (!master->match->compare[i].duplicate) { +- c = master->match->compare[i].component; ++ for (; i > 0; i--) ++ if (!master->match->compare[i - 1].duplicate) { ++ c = master->match->compare[i - 1].component; + component_unbind(c, master, data); + } + } +diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c +index 60d1419590ba..3951f7b23840 100644 +--- a/drivers/bluetooth/btrsi.c ++++ b/drivers/bluetooth/btrsi.c +@@ -21,8 +21,9 @@ + #include <net/rsi_91x.h> + #include <net/genetlink.h> + +-#define RSI_HEADROOM_FOR_BT_HAL 16 ++#define RSI_DMA_ALIGN 8 + #define RSI_FRAME_DESC_SIZE 16 ++#define RSI_HEADROOM_FOR_BT_HAL (RSI_FRAME_DESC_SIZE + RSI_DMA_ALIGN) + + struct rsi_hci_adapter { + void *priv; +@@ -70,6 +71,16 @@ static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb) + bt_cb(new_skb)->pkt_type = hci_skb_pkt_type(skb); + kfree_skb(skb); + skb = new_skb; ++ if (!IS_ALIGNED((unsigned long)skb->data, RSI_DMA_ALIGN)) { ++ u8 *skb_data = skb->data; ++ int skb_len = skb->len; ++ ++ skb_push(skb, RSI_DMA_ALIGN); ++ skb_pull(skb, PTR_ALIGN(skb->data, ++ RSI_DMA_ALIGN) - skb->data); ++ memmove(skb->data, skb_data, skb_len); ++ skb_trim(skb, skb_len); ++ } + } + + return h_adapter->proto_ops->coex_send_pkt(h_adapter->priv, skb, +diff --git a/drivers/bluetooth/hci_serdev.c b/drivers/bluetooth/hci_serdev.c +index aa2543b3c286..46e20444ba19 100644 +--- a/drivers/bluetooth/hci_serdev.c ++++ b/drivers/bluetooth/hci_serdev.c +@@ -368,6 +368,7 @@ void hci_uart_unregister_device(struct hci_uart *hu) + { + struct hci_dev *hdev = hu->hdev; + ++ clear_bit(HCI_UART_PROTO_READY, &hu->flags); + hci_unregister_dev(hdev); + hci_free_dev(hdev); + +diff --git a/drivers/char/ipmi/ipmi_dmi.c b/drivers/char/ipmi/ipmi_dmi.c +index e2c143861b1e..28dbd5529188 100644 +--- a/drivers/char/ipmi/ipmi_dmi.c ++++ b/drivers/char/ipmi/ipmi_dmi.c +@@ -217,6 +217,10 @@ static void __init dmi_decode_ipmi(const struct dmi_header *dm) + slave_addr = data[DMI_IPMI_SLAVEADDR]; + + memcpy(&base_addr, data + DMI_IPMI_ADDR, sizeof(unsigned long)); ++ if (!base_addr) { ++ pr_err("Base address is zero, assuming no IPMI interface\n"); ++ return; ++ } + if (len >= DMI_IPMI_VER2_LENGTH) { + if (type == IPMI_DMI_TYPE_SSIF) { + offset = 0; +diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c +index 3fb297b5fb17..84c17f936c09 100644 +--- a/drivers/char/ipmi/ipmi_msghandler.c ++++ b/drivers/char/ipmi/ipmi_msghandler.c +@@ -1365,7 +1365,7 @@ int ipmi_set_my_LUN(struct ipmi_user *user, + } + release_ipmi_user(user, index); + +- return 0; ++ return rv; + } + EXPORT_SYMBOL(ipmi_set_my_LUN); + +diff --git a/drivers/char/ipmi/ipmi_si_mem_io.c b/drivers/char/ipmi/ipmi_si_mem_io.c +index 638f4ab88f44..75583612ab10 100644 +--- a/drivers/char/ipmi/ipmi_si_mem_io.c ++++ b/drivers/char/ipmi/ipmi_si_mem_io.c +@@ -51,7 +51,7 @@ static unsigned char mem_inq(const struct si_sm_io *io, unsigned int offset) + static void mem_outq(const struct si_sm_io *io, unsigned int offset, + unsigned char b) + { +- writeq(b << io->regshift, (io->addr)+(offset * io->regspacing)); ++ writeq((u64)b << io->regshift, (io->addr)+(offset * io->regspacing)); + } + #endif + +diff --git a/drivers/char/ipmi/ipmi_si_pci.c b/drivers/char/ipmi/ipmi_si_pci.c +index f54ca6869ed2..022e03634ce2 100644 +--- a/drivers/char/ipmi/ipmi_si_pci.c ++++ b/drivers/char/ipmi/ipmi_si_pci.c +@@ -120,6 +120,8 @@ static int ipmi_pci_probe(struct pci_dev *pdev, + } + io.addr_data = pci_resource_start(pdev, 0); + ++ io.dev = &pdev->dev; ++ + io.regspacing = ipmi_pci_probe_regspacing(&io); + io.regsize = DEFAULT_REGSIZE; + io.regshift = 0; +@@ -128,8 +130,6 @@ static int ipmi_pci_probe(struct pci_dev *pdev, + if (io.irq) + io.irq_setup = ipmi_std_irq_setup; + +- io.dev = &pdev->dev; +- + dev_info(&pdev->dev, "%pR regsize %d spacing %d irq %d\n", + &pdev->resource[0], io.regsize, io.regspacing, io.irq); + +diff --git a/drivers/char/random.c b/drivers/char/random.c +index 0a84b7f468ad..86fe1df90239 100644 +--- a/drivers/char/random.c ++++ b/drivers/char/random.c +@@ -433,9 +433,9 @@ static int crng_init_cnt = 0; + static unsigned long crng_global_init_time = 0; + #define CRNG_INIT_CNT_THRESH (2*CHACHA20_KEY_SIZE) + static void _extract_crng(struct crng_state *crng, +- __u32 out[CHACHA20_BLOCK_WORDS]); ++ __u8 out[CHACHA20_BLOCK_SIZE]); + static void _crng_backtrack_protect(struct crng_state *crng, +- __u32 tmp[CHACHA20_BLOCK_WORDS], int used); ++ __u8 tmp[CHACHA20_BLOCK_SIZE], int used); + static void process_random_ready_list(void); + static void _get_random_bytes(void *buf, int nbytes); + +@@ -929,7 +929,7 @@ static void crng_reseed(struct crng_state *crng, struct entropy_store *r) + unsigned long flags; + int i, num; + union { +- __u32 block[CHACHA20_BLOCK_WORDS]; ++ __u8 block[CHACHA20_BLOCK_SIZE]; + __u32 key[8]; + } buf; + +@@ -976,7 +976,7 @@ static void crng_reseed(struct crng_state *crng, struct entropy_store *r) + } + + static void _extract_crng(struct crng_state *crng, +- __u32 out[CHACHA20_BLOCK_WORDS]) ++ __u8 out[CHACHA20_BLOCK_SIZE]) + { + unsigned long v, flags; + +@@ -993,7 +993,7 @@ static void _extract_crng(struct crng_state *crng, + spin_unlock_irqrestore(&crng->lock, flags); + } + +-static void extract_crng(__u32 out[CHACHA20_BLOCK_WORDS]) ++static void extract_crng(__u8 out[CHACHA20_BLOCK_SIZE]) + { + struct crng_state *crng = NULL; + +@@ -1011,7 +1011,7 @@ static void extract_crng(__u32 out[CHACHA20_BLOCK_WORDS]) + * enough) to mutate the CRNG key to provide backtracking protection. + */ + static void _crng_backtrack_protect(struct crng_state *crng, +- __u32 tmp[CHACHA20_BLOCK_WORDS], int used) ++ __u8 tmp[CHACHA20_BLOCK_SIZE], int used) + { + unsigned long flags; + __u32 *s, *d; +@@ -1023,14 +1023,14 @@ static void _crng_backtrack_protect(struct crng_state *crng, + used = 0; + } + spin_lock_irqsave(&crng->lock, flags); +- s = &tmp[used / sizeof(__u32)]; ++ s = (__u32 *) &tmp[used]; + d = &crng->state[4]; + for (i=0; i < 8; i++) + *d++ ^= *s++; + spin_unlock_irqrestore(&crng->lock, flags); + } + +-static void crng_backtrack_protect(__u32 tmp[CHACHA20_BLOCK_WORDS], int used) ++static void crng_backtrack_protect(__u8 tmp[CHACHA20_BLOCK_SIZE], int used) + { + struct crng_state *crng = NULL; + +@@ -1046,7 +1046,7 @@ static void crng_backtrack_protect(__u32 tmp[CHACHA20_BLOCK_WORDS], int used) + static ssize_t extract_crng_user(void __user *buf, size_t nbytes) + { + ssize_t ret = 0, i = CHACHA20_BLOCK_SIZE; +- __u32 tmp[CHACHA20_BLOCK_WORDS]; ++ __u8 tmp[CHACHA20_BLOCK_SIZE] __aligned(4); + int large_request = (nbytes > 256); + + while (nbytes) { +@@ -1625,7 +1625,7 @@ static void _warn_unseeded_randomness(const char *func_name, void *caller, + */ + static void _get_random_bytes(void *buf, int nbytes) + { +- __u32 tmp[CHACHA20_BLOCK_WORDS]; ++ __u8 tmp[CHACHA20_BLOCK_SIZE] __aligned(4); + + trace_get_random_bytes(nbytes, _RET_IP_); + +@@ -2251,7 +2251,7 @@ u64 get_random_u64(void) + batch = raw_cpu_ptr(&batched_entropy_u64); + spin_lock_irqsave(&batch->batch_lock, flags); + if (batch->position % ARRAY_SIZE(batch->entropy_u64) == 0) { +- extract_crng((__u32 *)batch->entropy_u64); ++ extract_crng((u8 *)batch->entropy_u64); + batch->position = 0; + } + ret = batch->entropy_u64[batch->position++]; +@@ -2278,7 +2278,7 @@ u32 get_random_u32(void) + batch = raw_cpu_ptr(&batched_entropy_u32); + spin_lock_irqsave(&batch->batch_lock, flags); + if (batch->position % ARRAY_SIZE(batch->entropy_u32) == 0) { +- extract_crng(batch->entropy_u32); ++ extract_crng((u8 *)batch->entropy_u32); + batch->position = 0; + } + ret = batch->entropy_u32[batch->position++]; +diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +index 0f7a0ffd3f70..d425b47cef17 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c ++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +@@ -352,7 +352,7 @@ static SUNXI_CCU_GATE(bus_dbg_clk, "bus-dbg", "psi-ahb1-ahb2", + static SUNXI_CCU_GATE(bus_psi_clk, "bus-psi", "psi-ahb1-ahb2", + 0x79c, BIT(0), 0); + +-static SUNXI_CCU_GATE(bus_pwm_clk, "bus-pwm", "apb1", 0x79c, BIT(0), 0); ++static SUNXI_CCU_GATE(bus_pwm_clk, "bus-pwm", "apb1", 0x7ac, BIT(0), 0); + + static SUNXI_CCU_GATE(bus_iommu_clk, "bus-iommu", "apb1", 0x7bc, BIT(0), 0); + +diff --git a/drivers/crypto/s5p-sss.c b/drivers/crypto/s5p-sss.c +index faa282074e5a..b7216935236f 100644 +--- a/drivers/crypto/s5p-sss.c ++++ b/drivers/crypto/s5p-sss.c +@@ -475,9 +475,9 @@ static void s5p_sg_done(struct s5p_aes_dev *dev) + } + + /* Calls the completion. Cannot be called with dev->lock hold. */ +-static void s5p_aes_complete(struct s5p_aes_dev *dev, int err) ++static void s5p_aes_complete(struct ablkcipher_request *req, int err) + { +- dev->req->base.complete(&dev->req->base, err); ++ req->base.complete(&req->base, err); + } + + static void s5p_unset_outdata(struct s5p_aes_dev *dev) +@@ -491,7 +491,7 @@ static void s5p_unset_indata(struct s5p_aes_dev *dev) + } + + static int s5p_make_sg_cpy(struct s5p_aes_dev *dev, struct scatterlist *src, +- struct scatterlist **dst) ++ struct scatterlist **dst) + { + void *pages; + int len; +@@ -655,6 +655,7 @@ static irqreturn_t s5p_aes_interrupt(int irq, void *dev_id) + { + struct platform_device *pdev = dev_id; + struct s5p_aes_dev *dev = platform_get_drvdata(pdev); ++ struct ablkcipher_request *req; + int err_dma_tx = 0; + int err_dma_rx = 0; + int err_dma_hx = 0; +@@ -727,7 +728,7 @@ static irqreturn_t s5p_aes_interrupt(int irq, void *dev_id) + + spin_unlock_irqrestore(&dev->lock, flags); + +- s5p_aes_complete(dev, 0); ++ s5p_aes_complete(dev->req, 0); + /* Device is still busy */ + tasklet_schedule(&dev->tasklet); + } else { +@@ -752,11 +753,12 @@ static irqreturn_t s5p_aes_interrupt(int irq, void *dev_id) + error: + s5p_sg_done(dev); + dev->busy = false; ++ req = dev->req; + if (err_dma_hx == 1) + s5p_set_dma_hashdata(dev, dev->hash_sg_iter); + + spin_unlock_irqrestore(&dev->lock, flags); +- s5p_aes_complete(dev, err); ++ s5p_aes_complete(req, err); + + hash_irq_end: + /* +@@ -1887,7 +1889,7 @@ static int s5p_set_indata_start(struct s5p_aes_dev *dev, + } + + static int s5p_set_outdata_start(struct s5p_aes_dev *dev, +- struct ablkcipher_request *req) ++ struct ablkcipher_request *req) + { + struct scatterlist *sg; + int err; +@@ -1983,7 +1985,7 @@ indata_error: + s5p_sg_done(dev); + dev->busy = false; + spin_unlock_irqrestore(&dev->lock, flags); +- s5p_aes_complete(dev, err); ++ s5p_aes_complete(req, err); + } + + static void s5p_tasklet_cb(unsigned long data) +diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig +index dacf3f42426d..a4f95574eb9a 100644 +--- a/drivers/dma/Kconfig ++++ b/drivers/dma/Kconfig +@@ -143,7 +143,7 @@ config DMA_JZ4740 + + config DMA_JZ4780 + tristate "JZ4780 DMA support" +- depends on MACH_JZ4780 || COMPILE_TEST ++ depends on MIPS || COMPILE_TEST + select DMA_ENGINE + select DMA_VIRTUAL_CHANNELS + help +diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c +index db5b8fe1dd4a..7db66f974041 100644 +--- a/drivers/dma/at_xdmac.c ++++ b/drivers/dma/at_xdmac.c +@@ -1608,7 +1608,7 @@ static void at_xdmac_tasklet(unsigned long data) + dev_vdbg(chan2dev(&atchan->chan), "%s: desc 0x%p\n", __func__, desc); + if (!desc->active_xfer) { + dev_err(chan2dev(&atchan->chan), "Xfer not active: exiting"); +- spin_unlock_bh(&atchan->lock); ++ spin_unlock(&atchan->lock); + return; + } + +diff --git a/drivers/dma/dma-jz4780.c b/drivers/dma/dma-jz4780.c +index 987899610b46..edff93aacad3 100644 +--- a/drivers/dma/dma-jz4780.c ++++ b/drivers/dma/dma-jz4780.c +@@ -587,7 +587,7 @@ static enum dma_status jz4780_dma_tx_status(struct dma_chan *chan, + to_jz4780_dma_desc(vdesc), 0); + } else if (cookie == jzchan->desc->vdesc.tx.cookie) { + txstate->residue = jz4780_dma_desc_residue(jzchan, jzchan->desc, +- (jzchan->curr_hwdesc + 1) % jzchan->desc->count); ++ jzchan->curr_hwdesc + 1); + } else + txstate->residue = 0; + +diff --git a/drivers/edac/i3200_edac.c b/drivers/edac/i3200_edac.c +index d92d56cee101..299b441647cd 100644 +--- a/drivers/edac/i3200_edac.c ++++ b/drivers/edac/i3200_edac.c +@@ -399,7 +399,7 @@ static int i3200_probe1(struct pci_dev *pdev, int dev_idx) + if (nr_pages == 0) + continue; + +- edac_dbg(0, "csrow %d, channel %d%s, size = %ld Mb\n", i, j, ++ edac_dbg(0, "csrow %d, channel %d%s, size = %ld MiB\n", i, j, + stacked ? " (stacked)" : "", PAGES_TO_MiB(nr_pages)); + + dimm->nr_pages = nr_pages; +diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c +index f1d19504a028..4a3300c2da33 100644 +--- a/drivers/edac/i7core_edac.c ++++ b/drivers/edac/i7core_edac.c +@@ -597,7 +597,7 @@ static int get_dimm_config(struct mem_ctl_info *mci) + /* DDR3 has 8 I/O banks */ + size = (rows * cols * banks * ranks) >> (20 - 3); + +- edac_dbg(0, "\tdimm %d %d Mb offset: %x, bank: %d, rank: %d, row: %#x, col: %#x\n", ++ edac_dbg(0, "\tdimm %d %d MiB offset: %x, bank: %d, rank: %d, row: %#x, col: %#x\n", + j, size, + RANKOFFSET(dimm_dod[j]), + banks, ranks, rows, cols); +diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c +index 72cea3cb8622..53074ad361e5 100644 +--- a/drivers/edac/sb_edac.c ++++ b/drivers/edac/sb_edac.c +@@ -1622,7 +1622,7 @@ static int __populate_dimms(struct mem_ctl_info *mci, + size = ((u64)rows * cols * banks * ranks) >> (20 - 3); + npages = MiB_TO_PAGES(size); + +- edac_dbg(0, "mc#%d: ha %d channel %d, dimm %d, %lld Mb (%d pages) bank: %d, rank: %d, row: %#x, col: %#x\n", ++ edac_dbg(0, "mc#%d: ha %d channel %d, dimm %d, %lld MiB (%d pages) bank: %d, rank: %d, row: %#x, col: %#x\n", + pvt->sbridge_dev->mc, pvt->sbridge_dev->dom, i, j, + size, npages, + banks, ranks, rows, cols); +@@ -2912,35 +2912,27 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci, + * cccc = channel + * If the mask doesn't match, report an error to the parsing logic + */ +- if (! ((errcode & 0xef80) == 0x80)) { +- optype = "Can't parse: it is not a mem"; +- } else { +- switch (optypenum) { +- case 0: +- optype = "generic undef request error"; +- break; +- case 1: +- optype = "memory read error"; +- break; +- case 2: +- optype = "memory write error"; +- break; +- case 3: +- optype = "addr/cmd error"; +- break; +- case 4: +- optype = "memory scrubbing error"; +- break; +- default: +- optype = "reserved"; +- break; +- } ++ switch (optypenum) { ++ case 0: ++ optype = "generic undef request error"; ++ break; ++ case 1: ++ optype = "memory read error"; ++ break; ++ case 2: ++ optype = "memory write error"; ++ break; ++ case 3: ++ optype = "addr/cmd error"; ++ break; ++ case 4: ++ optype = "memory scrubbing error"; ++ break; ++ default: ++ optype = "reserved"; ++ break; + } + +- /* Only decode errors with an valid address (ADDRV) */ +- if (!GET_BITFIELD(m->status, 58, 58)) +- return; +- + if (pvt->info.type == KNIGHTS_LANDING) { + if (channel == 14) { + edac_dbg(0, "%s%s err_code:%04x:%04x EDRAM bank %d\n", +@@ -3046,17 +3038,11 @@ static int sbridge_mce_check_error(struct notifier_block *nb, unsigned long val, + { + struct mce *mce = (struct mce *)data; + struct mem_ctl_info *mci; +- struct sbridge_pvt *pvt; + char *type; + + if (edac_get_report_status() == EDAC_REPORTING_DISABLED) + return NOTIFY_DONE; + +- mci = get_mci_for_node_id(mce->socketid, IMC0); +- if (!mci) +- return NOTIFY_DONE; +- pvt = mci->pvt_info; +- + /* + * Just let mcelog handle it if the error is + * outside the memory controller. A memory error +@@ -3066,6 +3052,22 @@ static int sbridge_mce_check_error(struct notifier_block *nb, unsigned long val, + if ((mce->status & 0xefff) >> 7 != 1) + return NOTIFY_DONE; + ++ /* Check ADDRV bit in STATUS */ ++ if (!GET_BITFIELD(mce->status, 58, 58)) ++ return NOTIFY_DONE; ++ ++ /* Check MISCV bit in STATUS */ ++ if (!GET_BITFIELD(mce->status, 59, 59)) ++ return NOTIFY_DONE; ++ ++ /* Check address type in MISC (physical address only) */ ++ if (GET_BITFIELD(mce->misc, 6, 8) != 2) ++ return NOTIFY_DONE; ++ ++ mci = get_mci_for_node_id(mce->socketid, IMC0); ++ if (!mci) ++ return NOTIFY_DONE; ++ + if (mce->mcgstatus & MCG_STATUS_MCIP) + type = "Exception"; + else +diff --git a/drivers/edac/skx_edac.c b/drivers/edac/skx_edac.c +index 4ba92f1dd0f7..dd209e0dd9ab 100644 +--- a/drivers/edac/skx_edac.c ++++ b/drivers/edac/skx_edac.c +@@ -364,7 +364,7 @@ static int get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm, + size = ((1ull << (rows + cols + ranks)) * banks) >> (20 - 3); + npages = MiB_TO_PAGES(size); + +- edac_dbg(0, "mc#%d: channel %d, dimm %d, %lld Mb (%d pages) bank: %d, rank: %d, row: %#x, col: %#x\n", ++ edac_dbg(0, "mc#%d: channel %d, dimm %d, %lld MiB (%d pages) bank: %d, rank: %d, row: %#x, col: %#x\n", + imc->mc, chan, dimmno, size, npages, + banks, 1 << ranks, rows, cols); + +@@ -424,7 +424,7 @@ unknown_size: + dimm->mtype = MEM_NVDIMM; + dimm->edac_mode = EDAC_SECDED; /* likely better than this */ + +- edac_dbg(0, "mc#%d: channel %d, dimm %d, %llu Mb (%u pages)\n", ++ edac_dbg(0, "mc#%d: channel %d, dimm %d, %llu MiB (%u pages)\n", + imc->mc, chan, dimmno, size >> 20, dimm->nr_pages); + + snprintf(dimm->label, sizeof(dimm->label), "CPU_SrcID#%u_MC#%u_Chan#%u_DIMM#%u", +diff --git a/drivers/extcon/extcon-intel-cht-wc.c b/drivers/extcon/extcon-intel-cht-wc.c +index 5e1dd2772278..bdb67878179e 100644 +--- a/drivers/extcon/extcon-intel-cht-wc.c ++++ b/drivers/extcon/extcon-intel-cht-wc.c +@@ -156,7 +156,7 @@ static int cht_wc_extcon_get_charger(struct cht_wc_extcon_data *ext, + dev_warn(ext->dev, + "Unhandled charger type %d, defaulting to SDP\n", + ret); +- /* Fall through, treat as SDP */ ++ return EXTCON_CHG_USB_SDP; + case CHT_WC_USBSRC_TYPE_SDP: + case CHT_WC_USBSRC_TYPE_FLOAT_DP_DN: + case CHT_WC_USBSRC_TYPE_OTHER: +diff --git a/drivers/firmware/arm_scmi/base.c b/drivers/firmware/arm_scmi/base.c +index 9dff33ea6416..204390297f4b 100644 +--- a/drivers/firmware/arm_scmi/base.c ++++ b/drivers/firmware/arm_scmi/base.c +@@ -208,7 +208,7 @@ static int scmi_base_discover_agent_get(const struct scmi_handle *handle, + + ret = scmi_do_xfer(handle, t); + if (!ret) +- memcpy(name, t->rx.buf, SCMI_MAX_STR_SIZE); ++ strlcpy(name, t->rx.buf, SCMI_MAX_STR_SIZE); + + scmi_xfer_put(handle, t); + +diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c +index e4119eb34986..30fc04e28431 100644 +--- a/drivers/firmware/arm_scmi/clock.c ++++ b/drivers/firmware/arm_scmi/clock.c +@@ -111,7 +111,7 @@ static int scmi_clock_attributes_get(const struct scmi_handle *handle, + + ret = scmi_do_xfer(handle, t); + if (!ret) +- memcpy(clk->name, attr->name, SCMI_MAX_STR_SIZE); ++ strlcpy(clk->name, attr->name, SCMI_MAX_STR_SIZE); + else + clk->name[0] = '\0'; + +diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c +index 64342944d917..87c99d296ecd 100644 +--- a/drivers/firmware/arm_scmi/perf.c ++++ b/drivers/firmware/arm_scmi/perf.c +@@ -174,7 +174,7 @@ scmi_perf_domain_attributes_get(const struct scmi_handle *handle, u32 domain, + dom_info->mult_factor = + (dom_info->sustained_freq_khz * 1000) / + dom_info->sustained_perf_level; +- memcpy(dom_info->name, attr->name, SCMI_MAX_STR_SIZE); ++ strlcpy(dom_info->name, attr->name, SCMI_MAX_STR_SIZE); + } + + scmi_xfer_put(handle, t); +diff --git a/drivers/firmware/arm_scmi/power.c b/drivers/firmware/arm_scmi/power.c +index cfa033b05aed..62f3401a1f01 100644 +--- a/drivers/firmware/arm_scmi/power.c ++++ b/drivers/firmware/arm_scmi/power.c +@@ -106,7 +106,7 @@ scmi_power_domain_attributes_get(const struct scmi_handle *handle, u32 domain, + dom_info->state_set_notify = SUPPORTS_STATE_SET_NOTIFY(flags); + dom_info->state_set_async = SUPPORTS_STATE_SET_ASYNC(flags); + dom_info->state_set_sync = SUPPORTS_STATE_SET_SYNC(flags); +- memcpy(dom_info->name, attr->name, SCMI_MAX_STR_SIZE); ++ strlcpy(dom_info->name, attr->name, SCMI_MAX_STR_SIZE); + } + + scmi_xfer_put(handle, t); +diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c +index 27f2092b9882..b53d5cc9c9f6 100644 +--- a/drivers/firmware/arm_scmi/sensors.c ++++ b/drivers/firmware/arm_scmi/sensors.c +@@ -140,7 +140,7 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle, + s = &si->sensors[desc_index + cnt]; + s->id = le32_to_cpu(buf->desc[cnt].id); + s->type = SENSOR_TYPE(attrh); +- memcpy(s->name, buf->desc[cnt].name, SCMI_MAX_STR_SIZE); ++ strlcpy(s->name, buf->desc[cnt].name, SCMI_MAX_STR_SIZE); + } + + desc_index += num_returned; +diff --git a/drivers/firmware/dell_rbu.c b/drivers/firmware/dell_rbu.c +index fb8af5cb7c9b..ccefa84f7305 100644 +--- a/drivers/firmware/dell_rbu.c ++++ b/drivers/firmware/dell_rbu.c +@@ -45,6 +45,7 @@ + #include <linux/moduleparam.h> + #include <linux/firmware.h> + #include <linux/dma-mapping.h> ++#include <asm/set_memory.h> + + MODULE_AUTHOR("Abhay Salunke <abhay_salunke@dell.com>"); + MODULE_DESCRIPTION("Driver for updating BIOS image on DELL systems"); +@@ -181,6 +182,11 @@ static int create_packet(void *data, size_t length) + packet_data_temp_buf = NULL; + } + } ++ /* ++ * set to uncachable or it may never get written back before reboot ++ */ ++ set_memory_uc((unsigned long)packet_data_temp_buf, 1 << ordernum); ++ + spin_lock(&rbu_data.lock); + + newpacket->data = packet_data_temp_buf; +@@ -349,6 +355,8 @@ static void packet_empty_list(void) + * to make sure there are no stale RBU packets left in memory + */ + memset(newpacket->data, 0, rbu_data.packetsize); ++ set_memory_wb((unsigned long)newpacket->data, ++ 1 << newpacket->ordernum); + free_pages((unsigned long) newpacket->data, + newpacket->ordernum); + kfree(newpacket); +diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c +index 565ab945698c..b81a27c7f89c 100644 +--- a/drivers/gpio/gpiolib.c ++++ b/drivers/gpio/gpiolib.c +@@ -2541,19 +2541,27 @@ EXPORT_SYMBOL_GPL(gpiochip_free_own_desc); + int gpiod_direction_input(struct gpio_desc *desc) + { + struct gpio_chip *chip; +- int status = -EINVAL; ++ int status = 0; + + VALIDATE_DESC(desc); + chip = desc->gdev->chip; + +- if (!chip->get || !chip->direction_input) { ++ if (!chip->get && chip->direction_input) { + gpiod_warn(desc, +- "%s: missing get() or direction_input() operations\n", ++ "%s: missing get() and direction_input() operations\n", + __func__); + return -EIO; + } + +- status = chip->direction_input(chip, gpio_chip_hwgpio(desc)); ++ if (chip->direction_input) { ++ status = chip->direction_input(chip, gpio_chip_hwgpio(desc)); ++ } else if (chip->get_direction && ++ (chip->get_direction(chip, gpio_chip_hwgpio(desc)) != 1)) { ++ gpiod_warn(desc, ++ "%s: missing direction_input() operation\n", ++ __func__); ++ return -EIO; ++ } + if (status == 0) + clear_bit(FLAG_IS_OUT, &desc->flags); + +@@ -2575,16 +2583,28 @@ static int gpiod_direction_output_raw_commit(struct gpio_desc *desc, int value) + { + struct gpio_chip *gc = desc->gdev->chip; + int val = !!value; +- int ret; ++ int ret = 0; + +- if (!gc->set || !gc->direction_output) { ++ if (!gc->set && !gc->direction_output) { + gpiod_warn(desc, +- "%s: missing set() or direction_output() operations\n", ++ "%s: missing set() and direction_output() operations\n", + __func__); + return -EIO; + } + +- ret = gc->direction_output(gc, gpio_chip_hwgpio(desc), val); ++ if (gc->direction_output) { ++ ret = gc->direction_output(gc, gpio_chip_hwgpio(desc), val); ++ } else { ++ if (gc->get_direction && ++ gc->get_direction(gc, gpio_chip_hwgpio(desc))) { ++ gpiod_warn(desc, ++ "%s: missing direction_output() operation\n", ++ __func__); ++ return -EIO; ++ } ++ gc->set(gc, gpio_chip_hwgpio(desc), val); ++ } ++ + if (!ret) + set_bit(FLAG_IS_OUT, &desc->flags); + trace_gpio_value(desc_to_gpio(desc), 0, val); +diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c +index 2445e75cf7ea..d00f45eed03c 100644 +--- a/drivers/gpu/drm/qxl/qxl_drv.c ++++ b/drivers/gpu/drm/qxl/qxl_drv.c +@@ -136,20 +136,11 @@ static int qxl_drm_freeze(struct drm_device *dev) + { + struct pci_dev *pdev = dev->pdev; + struct qxl_device *qdev = dev->dev_private; +- struct drm_crtc *crtc; +- +- drm_kms_helper_poll_disable(dev); +- +- console_lock(); +- qxl_fbdev_set_suspend(qdev, 1); +- console_unlock(); ++ int ret; + +- /* unpin the front buffers */ +- list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { +- const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; +- if (crtc->enabled) +- (*crtc_funcs->disable)(crtc); +- } ++ ret = drm_mode_config_helper_suspend(dev); ++ if (ret) ++ return ret; + + qxl_destroy_monitors_object(qdev); + qxl_surf_evict(qdev); +@@ -175,14 +166,7 @@ static int qxl_drm_resume(struct drm_device *dev, bool thaw) + } + + qxl_create_monitors_object(qdev); +- drm_helper_resume_force_mode(dev); +- +- console_lock(); +- qxl_fbdev_set_suspend(qdev, 0); +- console_unlock(); +- +- drm_kms_helper_poll_enable(dev); +- return 0; ++ return drm_mode_config_helper_resume(dev); + } + + static int qxl_pm_suspend(struct device *dev) +diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c +index fdb0f832fade..5e515533e9cd 100644 +--- a/drivers/hv/channel.c ++++ b/drivers/hv/channel.c +@@ -91,11 +91,14 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, + unsigned long flags; + int ret, err = 0; + struct page *page; ++ unsigned int order; + + if (send_ringbuffer_size % PAGE_SIZE || + recv_ringbuffer_size % PAGE_SIZE) + return -EINVAL; + ++ order = get_order(send_ringbuffer_size + recv_ringbuffer_size); ++ + spin_lock_irqsave(&newchannel->lock, flags); + if (newchannel->state == CHANNEL_OPEN_STATE) { + newchannel->state = CHANNEL_OPENING_STATE; +@@ -110,21 +113,17 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, + + /* Allocate the ring buffer */ + page = alloc_pages_node(cpu_to_node(newchannel->target_cpu), +- GFP_KERNEL|__GFP_ZERO, +- get_order(send_ringbuffer_size + +- recv_ringbuffer_size)); ++ GFP_KERNEL|__GFP_ZERO, order); + + if (!page) +- page = alloc_pages(GFP_KERNEL|__GFP_ZERO, +- get_order(send_ringbuffer_size + +- recv_ringbuffer_size)); ++ page = alloc_pages(GFP_KERNEL|__GFP_ZERO, order); + + if (!page) { + err = -ENOMEM; + goto error_set_chnstate; + } + +- newchannel->ringbuffer_pages = page_address(page); ++ newchannel->ringbuffer_page = page; + newchannel->ringbuffer_pagecount = (send_ringbuffer_size + + recv_ringbuffer_size) >> PAGE_SHIFT; + +@@ -239,8 +238,7 @@ error_free_gpadl: + error_free_pages: + hv_ringbuffer_cleanup(&newchannel->outbound); + hv_ringbuffer_cleanup(&newchannel->inbound); +- __free_pages(page, +- get_order(send_ringbuffer_size + recv_ringbuffer_size)); ++ __free_pages(page, order); + error_set_chnstate: + newchannel->state = CHANNEL_OPEN_STATE; + return err; +@@ -666,8 +664,8 @@ static int vmbus_close_internal(struct vmbus_channel *channel) + hv_ringbuffer_cleanup(&channel->outbound); + hv_ringbuffer_cleanup(&channel->inbound); + +- free_pages((unsigned long)channel->ringbuffer_pages, +- get_order(channel->ringbuffer_pagecount * PAGE_SIZE)); ++ __free_pages(channel->ringbuffer_page, ++ get_order(channel->ringbuffer_pagecount << PAGE_SHIFT)); + + out: + return ret; +diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c +index 8e923e70e594..12bc9fa21111 100644 +--- a/drivers/hv/hv.c ++++ b/drivers/hv/hv.c +@@ -189,6 +189,17 @@ static void hv_init_clockevent_device(struct clock_event_device *dev, int cpu) + int hv_synic_alloc(void) + { + int cpu; ++ struct hv_per_cpu_context *hv_cpu; ++ ++ /* ++ * First, zero all per-cpu memory areas so hv_synic_free() can ++ * detect what memory has been allocated and cleanup properly ++ * after any failures. ++ */ ++ for_each_present_cpu(cpu) { ++ hv_cpu = per_cpu_ptr(hv_context.cpu_context, cpu); ++ memset(hv_cpu, 0, sizeof(*hv_cpu)); ++ } + + hv_context.hv_numa_map = kcalloc(nr_node_ids, sizeof(struct cpumask), + GFP_KERNEL); +@@ -198,10 +209,8 @@ int hv_synic_alloc(void) + } + + for_each_present_cpu(cpu) { +- struct hv_per_cpu_context *hv_cpu +- = per_cpu_ptr(hv_context.cpu_context, cpu); ++ hv_cpu = per_cpu_ptr(hv_context.cpu_context, cpu); + +- memset(hv_cpu, 0, sizeof(*hv_cpu)); + tasklet_init(&hv_cpu->msg_dpc, + vmbus_on_msg_dpc, (unsigned long) hv_cpu); + +diff --git a/drivers/hwtracing/coresight/coresight-dynamic-replicator.c b/drivers/hwtracing/coresight/coresight-dynamic-replicator.c +index f6d0571ab9dd..d31f1d8758b2 100644 +--- a/drivers/hwtracing/coresight/coresight-dynamic-replicator.c ++++ b/drivers/hwtracing/coresight/coresight-dynamic-replicator.c +@@ -34,26 +34,42 @@ struct replicator_state { + struct coresight_device *csdev; + }; + ++/* ++ * replicator_reset : Reset the replicator configuration to sane values. ++ */ ++static void replicator_reset(struct replicator_state *drvdata) ++{ ++ CS_UNLOCK(drvdata->base); ++ ++ writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER0); ++ writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER1); ++ ++ CS_LOCK(drvdata->base); ++} ++ + static int replicator_enable(struct coresight_device *csdev, int inport, + int outport) + { ++ u32 reg; + struct replicator_state *drvdata = dev_get_drvdata(csdev->dev.parent); + ++ switch (outport) { ++ case 0: ++ reg = REPLICATOR_IDFILTER0; ++ break; ++ case 1: ++ reg = REPLICATOR_IDFILTER1; ++ break; ++ default: ++ WARN_ON(1); ++ return -EINVAL; ++ } ++ + CS_UNLOCK(drvdata->base); + +- /* +- * Ensure that the other port is disabled +- * 0x00 - passing through the replicator unimpeded +- * 0xff - disable (or impede) the flow of ATB data +- */ +- if (outport == 0) { +- writel_relaxed(0x00, drvdata->base + REPLICATOR_IDFILTER0); +- writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER1); +- } else { +- writel_relaxed(0x00, drvdata->base + REPLICATOR_IDFILTER1); +- writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER0); +- } + ++ /* Ensure that the outport is enabled. */ ++ writel_relaxed(0x00, drvdata->base + reg); + CS_LOCK(drvdata->base); + + dev_info(drvdata->dev, "REPLICATOR enabled\n"); +@@ -63,15 +79,25 @@ static int replicator_enable(struct coresight_device *csdev, int inport, + static void replicator_disable(struct coresight_device *csdev, int inport, + int outport) + { ++ u32 reg; + struct replicator_state *drvdata = dev_get_drvdata(csdev->dev.parent); + ++ switch (outport) { ++ case 0: ++ reg = REPLICATOR_IDFILTER0; ++ break; ++ case 1: ++ reg = REPLICATOR_IDFILTER1; ++ break; ++ default: ++ WARN_ON(1); ++ return; ++ } ++ + CS_UNLOCK(drvdata->base); + + /* disable the flow of ATB data through port */ +- if (outport == 0) +- writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER0); +- else +- writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER1); ++ writel_relaxed(0xff, drvdata->base + reg); + + CS_LOCK(drvdata->base); + +@@ -156,7 +182,11 @@ static int replicator_probe(struct amba_device *adev, const struct amba_id *id) + desc.groups = replicator_groups; + drvdata->csdev = coresight_register(&desc); + +- return PTR_ERR_OR_ZERO(drvdata->csdev); ++ if (!IS_ERR(drvdata->csdev)) { ++ replicator_reset(drvdata); ++ return 0; ++ } ++ return PTR_ERR(drvdata->csdev); + } + + #ifdef CONFIG_PM +diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c +index 0f5e03e4df22..c3c645201514 100644 +--- a/drivers/hwtracing/coresight/coresight-etm-perf.c ++++ b/drivers/hwtracing/coresight/coresight-etm-perf.c +@@ -12,6 +12,7 @@ + #include <linux/mm.h> + #include <linux/init.h> + #include <linux/perf_event.h> ++#include <linux/percpu-defs.h> + #include <linux/slab.h> + #include <linux/types.h> + #include <linux/workqueue.h> +@@ -33,7 +34,7 @@ struct etm_event_data { + struct work_struct work; + cpumask_t mask; + void *snk_config; +- struct list_head **path; ++ struct list_head * __percpu *path; + }; + + static DEFINE_PER_CPU(struct perf_output_handle, ctx_handle); +@@ -61,6 +62,18 @@ static const struct attribute_group *etm_pmu_attr_groups[] = { + NULL, + }; + ++static inline struct list_head ** ++etm_event_cpu_path_ptr(struct etm_event_data *data, int cpu) ++{ ++ return per_cpu_ptr(data->path, cpu); ++} ++ ++static inline struct list_head * ++etm_event_cpu_path(struct etm_event_data *data, int cpu) ++{ ++ return *etm_event_cpu_path_ptr(data, cpu); ++} ++ + static void etm_event_read(struct perf_event *event) {} + + static int etm_addr_filters_alloc(struct perf_event *event) +@@ -120,23 +133,26 @@ static void free_event_data(struct work_struct *work) + */ + if (event_data->snk_config) { + cpu = cpumask_first(mask); +- sink = coresight_get_sink(event_data->path[cpu]); ++ sink = coresight_get_sink(etm_event_cpu_path(event_data, cpu)); + if (sink_ops(sink)->free_buffer) + sink_ops(sink)->free_buffer(event_data->snk_config); + } + + for_each_cpu(cpu, mask) { +- if (!(IS_ERR_OR_NULL(event_data->path[cpu]))) +- coresight_release_path(event_data->path[cpu]); ++ struct list_head **ppath; ++ ++ ppath = etm_event_cpu_path_ptr(event_data, cpu); ++ if (!(IS_ERR_OR_NULL(*ppath))) ++ coresight_release_path(*ppath); ++ *ppath = NULL; + } + +- kfree(event_data->path); ++ free_percpu(event_data->path); + kfree(event_data); + } + + static void *alloc_event_data(int cpu) + { +- int size; + cpumask_t *mask; + struct etm_event_data *event_data; + +@@ -147,7 +163,6 @@ static void *alloc_event_data(int cpu) + + /* Make sure nothing disappears under us */ + get_online_cpus(); +- size = num_online_cpus(); + + mask = &event_data->mask; + if (cpu != -1) +@@ -164,8 +179,8 @@ static void *alloc_event_data(int cpu) + * unused memory when dealing with single CPU trace scenarios is small + * compared to the cost of searching through an optimized array. + */ +- event_data->path = kcalloc(size, +- sizeof(struct list_head *), GFP_KERNEL); ++ event_data->path = alloc_percpu(struct list_head *); ++ + if (!event_data->path) { + kfree(event_data); + return NULL; +@@ -213,6 +228,7 @@ static void *etm_setup_aux(struct perf_event *event, void **pages, + + /* Setup the path for each CPU in a trace session */ + for_each_cpu(cpu, mask) { ++ struct list_head *path; + struct coresight_device *csdev; + + csdev = per_cpu(csdev_src, cpu); +@@ -224,9 +240,11 @@ static void *etm_setup_aux(struct perf_event *event, void **pages, + * list of devices from source to sink that can be + * referenced later when the path is actually needed. + */ +- event_data->path[cpu] = coresight_build_path(csdev, sink); +- if (IS_ERR(event_data->path[cpu])) ++ path = coresight_build_path(csdev, sink); ++ if (IS_ERR(path)) + goto err; ++ ++ *etm_event_cpu_path_ptr(event_data, cpu) = path; + } + + if (!sink_ops(sink)->alloc_buffer) +@@ -255,6 +273,7 @@ static void etm_event_start(struct perf_event *event, int flags) + struct etm_event_data *event_data; + struct perf_output_handle *handle = this_cpu_ptr(&ctx_handle); + struct coresight_device *sink, *csdev = per_cpu(csdev_src, cpu); ++ struct list_head *path; + + if (!csdev) + goto fail; +@@ -267,8 +286,9 @@ static void etm_event_start(struct perf_event *event, int flags) + if (!event_data) + goto fail; + ++ path = etm_event_cpu_path(event_data, cpu); + /* We need a sink, no need to continue without one */ +- sink = coresight_get_sink(event_data->path[cpu]); ++ sink = coresight_get_sink(path); + if (WARN_ON_ONCE(!sink || !sink_ops(sink)->set_buffer)) + goto fail_end_stop; + +@@ -278,7 +298,7 @@ static void etm_event_start(struct perf_event *event, int flags) + goto fail_end_stop; + + /* Nothing will happen without a path */ +- if (coresight_enable_path(event_data->path[cpu], CS_MODE_PERF)) ++ if (coresight_enable_path(path, CS_MODE_PERF)) + goto fail_end_stop; + + /* Tell the perf core the event is alive */ +@@ -286,11 +306,13 @@ static void etm_event_start(struct perf_event *event, int flags) + + /* Finally enable the tracer */ + if (source_ops(csdev)->enable(csdev, event, CS_MODE_PERF)) +- goto fail_end_stop; ++ goto fail_disable_path; + + out: + return; + ++fail_disable_path: ++ coresight_disable_path(path); + fail_end_stop: + perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED); + perf_aux_output_end(handle, 0); +@@ -306,6 +328,7 @@ static void etm_event_stop(struct perf_event *event, int mode) + struct coresight_device *sink, *csdev = per_cpu(csdev_src, cpu); + struct perf_output_handle *handle = this_cpu_ptr(&ctx_handle); + struct etm_event_data *event_data = perf_get_aux(handle); ++ struct list_head *path; + + if (event->hw.state == PERF_HES_STOPPED) + return; +@@ -313,7 +336,11 @@ static void etm_event_stop(struct perf_event *event, int mode) + if (!csdev) + return; + +- sink = coresight_get_sink(event_data->path[cpu]); ++ path = etm_event_cpu_path(event_data, cpu); ++ if (!path) ++ return; ++ ++ sink = coresight_get_sink(path); + if (!sink) + return; + +@@ -344,7 +371,7 @@ static void etm_event_stop(struct perf_event *event, int mode) + } + + /* Disabling the path make its elements available to other sessions */ +- coresight_disable_path(event_data->path[cpu]); ++ coresight_disable_path(path); + } + + static int etm_event_add(struct perf_event *event, int mode) +diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c +index e45b5ec2f451..b7bc08cf90c6 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x.c +@@ -28,6 +28,7 @@ + #include <linux/pm_runtime.h> + #include <asm/sections.h> + #include <asm/local.h> ++#include <asm/virt.h> + + #include "coresight-etm4x.h" + #include "coresight-etm-perf.h" +@@ -616,7 +617,7 @@ static void etm4_set_default_config(struct etmv4_config *config) + config->vinst_ctrl |= BIT(0); + } + +-static u64 etm4_get_access_type(struct etmv4_config *config) ++static u64 etm4_get_ns_access_type(struct etmv4_config *config) + { + u64 access_type = 0; + +@@ -627,17 +628,26 @@ static u64 etm4_get_access_type(struct etmv4_config *config) + * Bit[13] Exception level 1 - OS + * Bit[14] Exception level 2 - Hypervisor + * Bit[15] Never implemented +- * +- * Always stay away from hypervisor mode. + */ +- access_type = ETM_EXLEVEL_NS_HYP; +- +- if (config->mode & ETM_MODE_EXCL_KERN) +- access_type |= ETM_EXLEVEL_NS_OS; ++ if (!is_kernel_in_hyp_mode()) { ++ /* Stay away from hypervisor mode for non-VHE */ ++ access_type = ETM_EXLEVEL_NS_HYP; ++ if (config->mode & ETM_MODE_EXCL_KERN) ++ access_type |= ETM_EXLEVEL_NS_OS; ++ } else if (config->mode & ETM_MODE_EXCL_KERN) { ++ access_type = ETM_EXLEVEL_NS_HYP; ++ } + + if (config->mode & ETM_MODE_EXCL_USER) + access_type |= ETM_EXLEVEL_NS_APP; + ++ return access_type; ++} ++ ++static u64 etm4_get_access_type(struct etmv4_config *config) ++{ ++ u64 access_type = etm4_get_ns_access_type(config); ++ + /* + * EXLEVEL_S, bits[11:8], don't trace anything happening + * in secure state. +@@ -891,20 +901,10 @@ void etm4_config_trace_mode(struct etmv4_config *config) + + addr_acc = config->addr_acc[ETM_DEFAULT_ADDR_COMP]; + /* clear default config */ +- addr_acc &= ~(ETM_EXLEVEL_NS_APP | ETM_EXLEVEL_NS_OS); ++ addr_acc &= ~(ETM_EXLEVEL_NS_APP | ETM_EXLEVEL_NS_OS | ++ ETM_EXLEVEL_NS_HYP); + +- /* +- * EXLEVEL_NS, bits[15:12] +- * The Exception levels are: +- * Bit[12] Exception level 0 - Application +- * Bit[13] Exception level 1 - OS +- * Bit[14] Exception level 2 - Hypervisor +- * Bit[15] Never implemented +- */ +- if (mode & ETM_MODE_EXCL_KERN) +- addr_acc |= ETM_EXLEVEL_NS_OS; +- else +- addr_acc |= ETM_EXLEVEL_NS_APP; ++ addr_acc |= etm4_get_ns_access_type(config); + + config->addr_acc[ETM_DEFAULT_ADDR_COMP] = addr_acc; + config->addr_acc[ETM_DEFAULT_ADDR_COMP + 1] = addr_acc; +diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c +index 0549249f4b39..e31061308e19 100644 +--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c ++++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c +@@ -438,10 +438,10 @@ static void tmc_update_etf_buffer(struct coresight_device *csdev, + case TMC_MEM_INTF_WIDTH_32BITS: + case TMC_MEM_INTF_WIDTH_64BITS: + case TMC_MEM_INTF_WIDTH_128BITS: +- mask = GENMASK(31, 5); ++ mask = GENMASK(31, 4); + break; + case TMC_MEM_INTF_WIDTH_256BITS: +- mask = GENMASK(31, 6); ++ mask = GENMASK(31, 5); + break; + } + +diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c +index 2eda5de304c2..2d6f428176ff 100644 +--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c ++++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c +@@ -536,7 +536,7 @@ tmc_init_etr_sg_table(struct device *dev, int node, + sg_table = tmc_alloc_sg_table(dev, node, nr_tpages, nr_dpages, pages); + if (IS_ERR(sg_table)) { + kfree(etr_table); +- return ERR_PTR(PTR_ERR(sg_table)); ++ return ERR_CAST(sg_table); + } + + etr_table->sg_table = sg_table; +@@ -895,10 +895,15 @@ static void tmc_sync_etr_buf(struct tmc_drvdata *drvdata) + tmc_etr_buf_insert_barrier_packet(etr_buf, etr_buf->offset); + } + +-static void tmc_etr_enable_hw(struct tmc_drvdata *drvdata) ++static void tmc_etr_enable_hw(struct tmc_drvdata *drvdata, ++ struct etr_buf *etr_buf) + { + u32 axictl, sts; +- struct etr_buf *etr_buf = drvdata->etr_buf; ++ ++ /* Callers should provide an appropriate buffer for use */ ++ if (WARN_ON(!etr_buf || drvdata->etr_buf)) ++ return; ++ drvdata->etr_buf = etr_buf; + + /* + * If this ETR is connected to a CATU, enable it before we turn +@@ -960,13 +965,16 @@ static void tmc_etr_enable_hw(struct tmc_drvdata *drvdata) + * also updating the @bufpp on where to find it. Since the trace data + * starts at anywhere in the buffer, depending on the RRP, we adjust the + * @len returned to handle buffer wrapping around. ++ * ++ * We are protected here by drvdata->reading != 0, which ensures the ++ * sysfs_buf stays alive. + */ + ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata, + loff_t pos, size_t len, char **bufpp) + { + s64 offset; + ssize_t actual = len; +- struct etr_buf *etr_buf = drvdata->etr_buf; ++ struct etr_buf *etr_buf = drvdata->sysfs_buf; + + if (pos + actual > etr_buf->len) + actual = etr_buf->len - pos; +@@ -996,7 +1004,14 @@ tmc_etr_free_sysfs_buf(struct etr_buf *buf) + + static void tmc_etr_sync_sysfs_buf(struct tmc_drvdata *drvdata) + { +- tmc_sync_etr_buf(drvdata); ++ struct etr_buf *etr_buf = drvdata->etr_buf; ++ ++ if (WARN_ON(drvdata->sysfs_buf != etr_buf)) { ++ tmc_etr_free_sysfs_buf(drvdata->sysfs_buf); ++ drvdata->sysfs_buf = NULL; ++ } else { ++ tmc_sync_etr_buf(drvdata); ++ } + } + + static void tmc_etr_disable_hw(struct tmc_drvdata *drvdata) +@@ -1017,6 +1032,8 @@ static void tmc_etr_disable_hw(struct tmc_drvdata *drvdata) + + /* Disable CATU device if this ETR is connected to one */ + tmc_etr_disable_catu(drvdata); ++ /* Reset the ETR buf used by hardware */ ++ drvdata->etr_buf = NULL; + } + + static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) +@@ -1024,7 +1041,7 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) + int ret = 0; + unsigned long flags; + struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); +- struct etr_buf *new_buf = NULL, *free_buf = NULL; ++ struct etr_buf *sysfs_buf = NULL, *new_buf = NULL, *free_buf = NULL; + + /* + * If we are enabling the ETR from disabled state, we need to make +@@ -1035,7 +1052,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) + * with the lock released. + */ + spin_lock_irqsave(&drvdata->spinlock, flags); +- if (!drvdata->etr_buf || (drvdata->etr_buf->size != drvdata->size)) { ++ sysfs_buf = READ_ONCE(drvdata->sysfs_buf); ++ if (!sysfs_buf || (sysfs_buf->size != drvdata->size)) { + spin_unlock_irqrestore(&drvdata->spinlock, flags); + + /* Allocate memory with the locks released */ +@@ -1064,14 +1082,14 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev) + * If we don't have a buffer or it doesn't match the requested size, + * use the buffer allocated above. Otherwise reuse the existing buffer. + */ +- if (!drvdata->etr_buf || +- (new_buf && drvdata->etr_buf->size != new_buf->size)) { +- free_buf = drvdata->etr_buf; +- drvdata->etr_buf = new_buf; ++ sysfs_buf = READ_ONCE(drvdata->sysfs_buf); ++ if (!sysfs_buf || (new_buf && sysfs_buf->size != new_buf->size)) { ++ free_buf = sysfs_buf; ++ drvdata->sysfs_buf = new_buf; + } + + drvdata->mode = CS_MODE_SYSFS; +- tmc_etr_enable_hw(drvdata); ++ tmc_etr_enable_hw(drvdata, drvdata->sysfs_buf); + out: + spin_unlock_irqrestore(&drvdata->spinlock, flags); + +@@ -1156,13 +1174,13 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata) + goto out; + } + +- /* If drvdata::etr_buf is NULL the trace data has been read already */ +- if (drvdata->etr_buf == NULL) { ++ /* If sysfs_buf is NULL the trace data has been read already */ ++ if (!drvdata->sysfs_buf) { + ret = -EINVAL; + goto out; + } + +- /* Disable the TMC if need be */ ++ /* Disable the TMC if we are trying to read from a running session */ + if (drvdata->mode == CS_MODE_SYSFS) + tmc_etr_disable_hw(drvdata); + +@@ -1176,7 +1194,7 @@ out: + int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata) + { + unsigned long flags; +- struct etr_buf *etr_buf = NULL; ++ struct etr_buf *sysfs_buf = NULL; + + /* config types are set a boot time and never change */ + if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETR)) +@@ -1191,22 +1209,22 @@ int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata) + * buffer. Since the tracer is still enabled drvdata::buf can't + * be NULL. + */ +- tmc_etr_enable_hw(drvdata); ++ tmc_etr_enable_hw(drvdata, drvdata->sysfs_buf); + } else { + /* + * The ETR is not tracing and the buffer was just read. + * As such prepare to free the trace buffer. + */ +- etr_buf = drvdata->etr_buf; +- drvdata->etr_buf = NULL; ++ sysfs_buf = drvdata->sysfs_buf; ++ drvdata->sysfs_buf = NULL; + } + + drvdata->reading = false; + spin_unlock_irqrestore(&drvdata->spinlock, flags); + + /* Free allocated memory out side of the spinlock */ +- if (etr_buf) +- tmc_free_etr_buf(etr_buf); ++ if (sysfs_buf) ++ tmc_etr_free_sysfs_buf(sysfs_buf); + + return 0; + } +diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h +index 7027bd60c4cc..872f63e3651b 100644 +--- a/drivers/hwtracing/coresight/coresight-tmc.h ++++ b/drivers/hwtracing/coresight/coresight-tmc.h +@@ -170,6 +170,7 @@ struct etr_buf { + * @trigger_cntr: amount of words to store after a trigger. + * @etr_caps: Bitmask of capabilities of the TMC ETR, inferred from the + * device configuration register (DEVID) ++ * @sysfs_data: SYSFS buffer for ETR. + */ + struct tmc_drvdata { + void __iomem *base; +@@ -189,6 +190,7 @@ struct tmc_drvdata { + enum tmc_mem_intf_width memwidth; + u32 trigger_cntr; + u32 etr_caps; ++ struct etr_buf *sysfs_buf; + }; + + struct etr_buf_operations { +diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c +index 3e07fd335f8c..c0dabbddc1e4 100644 +--- a/drivers/hwtracing/coresight/coresight.c ++++ b/drivers/hwtracing/coresight/coresight.c +@@ -132,12 +132,14 @@ static int coresight_enable_sink(struct coresight_device *csdev, u32 mode) + { + int ret; + +- if (!csdev->enable) { +- if (sink_ops(csdev)->enable) { +- ret = sink_ops(csdev)->enable(csdev, mode); +- if (ret) +- return ret; +- } ++ /* ++ * We need to make sure the "new" session is compatible with the ++ * existing "mode" of operation. ++ */ ++ if (sink_ops(csdev)->enable) { ++ ret = sink_ops(csdev)->enable(csdev, mode); ++ if (ret) ++ return ret; + csdev->enable = true; + } + +@@ -339,8 +341,14 @@ int coresight_enable_path(struct list_head *path, u32 mode) + switch (type) { + case CORESIGHT_DEV_TYPE_SINK: + ret = coresight_enable_sink(csdev, mode); ++ /* ++ * Sink is the first component turned on. If we ++ * failed to enable the sink, there are no components ++ * that need disabling. Disabling the path here ++ * would mean we could disrupt an existing session. ++ */ + if (ret) +- goto err; ++ goto out; + break; + case CORESIGHT_DEV_TYPE_SOURCE: + /* sources are enabled from either sysFS or Perf */ +diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c +index a19fbff16861..d9401b519106 100644 +--- a/drivers/i2c/busses/i2c-aspeed.c ++++ b/drivers/i2c/busses/i2c-aspeed.c +@@ -137,7 +137,8 @@ struct aspeed_i2c_bus { + /* Synchronizes I/O mem access to base. */ + spinlock_t lock; + struct completion cmd_complete; +- u32 (*get_clk_reg_val)(u32 divisor); ++ u32 (*get_clk_reg_val)(struct device *dev, ++ u32 divisor); + unsigned long parent_clk_frequency; + u32 bus_frequency; + /* Transaction state. */ +@@ -686,16 +687,27 @@ static const struct i2c_algorithm aspeed_i2c_algo = { + #endif /* CONFIG_I2C_SLAVE */ + }; + +-static u32 aspeed_i2c_get_clk_reg_val(u32 clk_high_low_max, u32 divisor) ++static u32 aspeed_i2c_get_clk_reg_val(struct device *dev, ++ u32 clk_high_low_mask, ++ u32 divisor) + { +- u32 base_clk, clk_high, clk_low, tmp; ++ u32 base_clk_divisor, clk_high_low_max, clk_high, clk_low, tmp; ++ ++ /* ++ * SCL_high and SCL_low represent a value 1 greater than what is stored ++ * since a zero divider is meaningless. Thus, the max value each can ++ * store is every bit set + 1. Since SCL_high and SCL_low are added ++ * together (see below), the max value of both is the max value of one ++ * them times two. ++ */ ++ clk_high_low_max = (clk_high_low_mask + 1) * 2; + + /* + * The actual clock frequency of SCL is: + * SCL_freq = APB_freq / (base_freq * (SCL_high + SCL_low)) + * = APB_freq / divisor + * where base_freq is a programmable clock divider; its value is +- * base_freq = 1 << base_clk ++ * base_freq = 1 << base_clk_divisor + * SCL_high is the number of base_freq clock cycles that SCL stays high + * and SCL_low is the number of base_freq clock cycles that SCL stays + * low for a period of SCL. +@@ -705,47 +717,59 @@ static u32 aspeed_i2c_get_clk_reg_val(u32 clk_high_low_max, u32 divisor) + * SCL_low = clk_low + 1 + * Thus, + * SCL_freq = APB_freq / +- * ((1 << base_clk) * (clk_high + 1 + clk_low + 1)) ++ * ((1 << base_clk_divisor) * (clk_high + 1 + clk_low + 1)) + * The documentation recommends clk_high >= clk_high_max / 2 and + * clk_low >= clk_low_max / 2 - 1 when possible; this last constraint + * gives us the following solution: + */ +- base_clk = divisor > clk_high_low_max ? ++ base_clk_divisor = divisor > clk_high_low_max ? + ilog2((divisor - 1) / clk_high_low_max) + 1 : 0; +- tmp = (divisor + (1 << base_clk) - 1) >> base_clk; +- clk_low = tmp / 2; +- clk_high = tmp - clk_low; + +- if (clk_high) +- clk_high--; ++ if (base_clk_divisor > ASPEED_I2CD_TIME_BASE_DIVISOR_MASK) { ++ base_clk_divisor = ASPEED_I2CD_TIME_BASE_DIVISOR_MASK; ++ clk_low = clk_high_low_mask; ++ clk_high = clk_high_low_mask; ++ dev_err(dev, ++ "clamping clock divider: divider requested, %u, is greater than largest possible divider, %u.\n", ++ divisor, (1 << base_clk_divisor) * clk_high_low_max); ++ } else { ++ tmp = (divisor + (1 << base_clk_divisor) - 1) ++ >> base_clk_divisor; ++ clk_low = tmp / 2; ++ clk_high = tmp - clk_low; ++ ++ if (clk_high) ++ clk_high--; + +- if (clk_low) +- clk_low--; ++ if (clk_low) ++ clk_low--; ++ } + + + return ((clk_high << ASPEED_I2CD_TIME_SCL_HIGH_SHIFT) + & ASPEED_I2CD_TIME_SCL_HIGH_MASK) + | ((clk_low << ASPEED_I2CD_TIME_SCL_LOW_SHIFT) + & ASPEED_I2CD_TIME_SCL_LOW_MASK) +- | (base_clk & ASPEED_I2CD_TIME_BASE_DIVISOR_MASK); ++ | (base_clk_divisor ++ & ASPEED_I2CD_TIME_BASE_DIVISOR_MASK); + } + +-static u32 aspeed_i2c_24xx_get_clk_reg_val(u32 divisor) ++static u32 aspeed_i2c_24xx_get_clk_reg_val(struct device *dev, u32 divisor) + { + /* + * clk_high and clk_low are each 3 bits wide, so each can hold a max + * value of 8 giving a clk_high_low_max of 16. + */ +- return aspeed_i2c_get_clk_reg_val(16, divisor); ++ return aspeed_i2c_get_clk_reg_val(dev, GENMASK(2, 0), divisor); + } + +-static u32 aspeed_i2c_25xx_get_clk_reg_val(u32 divisor) ++static u32 aspeed_i2c_25xx_get_clk_reg_val(struct device *dev, u32 divisor) + { + /* + * clk_high and clk_low are each 4 bits wide, so each can hold a max + * value of 16 giving a clk_high_low_max of 32. + */ +- return aspeed_i2c_get_clk_reg_val(32, divisor); ++ return aspeed_i2c_get_clk_reg_val(dev, GENMASK(3, 0), divisor); + } + + /* precondition: bus.lock has been acquired. */ +@@ -758,7 +782,7 @@ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) + clk_reg_val &= (ASPEED_I2CD_TIME_TBUF_MASK | + ASPEED_I2CD_TIME_THDSTA_MASK | + ASPEED_I2CD_TIME_TACST_MASK); +- clk_reg_val |= bus->get_clk_reg_val(divisor); ++ clk_reg_val |= bus->get_clk_reg_val(bus->dev, divisor); + writel(clk_reg_val, bus->base + ASPEED_I2C_AC_TIMING_REG1); + writel(ASPEED_NO_TIMEOUT_CTRL, bus->base + ASPEED_I2C_AC_TIMING_REG2); + +@@ -874,7 +898,8 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev) + if (!match) + bus->get_clk_reg_val = aspeed_i2c_24xx_get_clk_reg_val; + else +- bus->get_clk_reg_val = (u32 (*)(u32))match->data; ++ bus->get_clk_reg_val = (u32 (*)(struct device *, u32)) ++ match->data; + + /* Initialize the I2C adapter */ + spin_lock_init(&bus->lock); +diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c +index 1e57f58fcb00..a74ef76705e0 100644 +--- a/drivers/i2c/busses/i2c-mt65xx.c ++++ b/drivers/i2c/busses/i2c-mt65xx.c +@@ -441,6 +441,8 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, + u16 control_reg; + u16 restart_flag = 0; + u32 reg_4g_mode; ++ u8 *dma_rd_buf = NULL; ++ u8 *dma_wr_buf = NULL; + dma_addr_t rpaddr = 0; + dma_addr_t wpaddr = 0; + int ret; +@@ -500,10 +502,18 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, + if (i2c->op == I2C_MASTER_RD) { + writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); + writel(I2C_DMA_CON_RX, i2c->pdmabase + OFFSET_CON); +- rpaddr = dma_map_single(i2c->dev, msgs->buf, ++ ++ dma_rd_buf = i2c_get_dma_safe_msg_buf(msgs, 0); ++ if (!dma_rd_buf) ++ return -ENOMEM; ++ ++ rpaddr = dma_map_single(i2c->dev, dma_rd_buf, + msgs->len, DMA_FROM_DEVICE); +- if (dma_mapping_error(i2c->dev, rpaddr)) ++ if (dma_mapping_error(i2c->dev, rpaddr)) { ++ i2c_put_dma_safe_msg_buf(dma_rd_buf, msgs, false); ++ + return -ENOMEM; ++ } + + if (i2c->dev_comp->support_33bits) { + reg_4g_mode = mtk_i2c_set_4g_mode(rpaddr); +@@ -515,10 +525,18 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, + } else if (i2c->op == I2C_MASTER_WR) { + writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); + writel(I2C_DMA_CON_TX, i2c->pdmabase + OFFSET_CON); +- wpaddr = dma_map_single(i2c->dev, msgs->buf, ++ ++ dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 0); ++ if (!dma_wr_buf) ++ return -ENOMEM; ++ ++ wpaddr = dma_map_single(i2c->dev, dma_wr_buf, + msgs->len, DMA_TO_DEVICE); +- if (dma_mapping_error(i2c->dev, wpaddr)) ++ if (dma_mapping_error(i2c->dev, wpaddr)) { ++ i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); ++ + return -ENOMEM; ++ } + + if (i2c->dev_comp->support_33bits) { + reg_4g_mode = mtk_i2c_set_4g_mode(wpaddr); +@@ -530,16 +548,39 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, + } else { + writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_INT_FLAG); + writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_CON); +- wpaddr = dma_map_single(i2c->dev, msgs->buf, ++ ++ dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 0); ++ if (!dma_wr_buf) ++ return -ENOMEM; ++ ++ wpaddr = dma_map_single(i2c->dev, dma_wr_buf, + msgs->len, DMA_TO_DEVICE); +- if (dma_mapping_error(i2c->dev, wpaddr)) ++ if (dma_mapping_error(i2c->dev, wpaddr)) { ++ i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); ++ + return -ENOMEM; +- rpaddr = dma_map_single(i2c->dev, (msgs + 1)->buf, ++ } ++ ++ dma_rd_buf = i2c_get_dma_safe_msg_buf((msgs + 1), 0); ++ if (!dma_rd_buf) { ++ dma_unmap_single(i2c->dev, wpaddr, ++ msgs->len, DMA_TO_DEVICE); ++ ++ i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); ++ ++ return -ENOMEM; ++ } ++ ++ rpaddr = dma_map_single(i2c->dev, dma_rd_buf, + (msgs + 1)->len, + DMA_FROM_DEVICE); + if (dma_mapping_error(i2c->dev, rpaddr)) { + dma_unmap_single(i2c->dev, wpaddr, + msgs->len, DMA_TO_DEVICE); ++ ++ i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); ++ i2c_put_dma_safe_msg_buf(dma_rd_buf, (msgs + 1), false); ++ + return -ENOMEM; + } + +@@ -578,14 +619,21 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, + if (i2c->op == I2C_MASTER_WR) { + dma_unmap_single(i2c->dev, wpaddr, + msgs->len, DMA_TO_DEVICE); ++ ++ i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, true); + } else if (i2c->op == I2C_MASTER_RD) { + dma_unmap_single(i2c->dev, rpaddr, + msgs->len, DMA_FROM_DEVICE); ++ ++ i2c_put_dma_safe_msg_buf(dma_rd_buf, msgs, true); + } else { + dma_unmap_single(i2c->dev, wpaddr, msgs->len, + DMA_TO_DEVICE); + dma_unmap_single(i2c->dev, rpaddr, (msgs + 1)->len, + DMA_FROM_DEVICE); ++ ++ i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, true); ++ i2c_put_dma_safe_msg_buf(dma_rd_buf, (msgs + 1), true); + } + + if (ret == 0) { +diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c +index 32affd3fa8bd..559c3b1284d7 100644 +--- a/drivers/i2c/i2c-core-acpi.c ++++ b/drivers/i2c/i2c-core-acpi.c +@@ -43,6 +43,7 @@ struct i2c_acpi_lookup { + int index; + u32 speed; + u32 min_speed; ++ u32 force_speed; + }; + + static int i2c_acpi_fill_info(struct acpi_resource *ares, void *data) +@@ -240,6 +241,19 @@ i2c_acpi_match_device(const struct acpi_device_id *matches, + return acpi_match_device(matches, &client->dev); + } + ++static const struct acpi_device_id i2c_acpi_force_400khz_device_ids[] = { ++ /* ++ * These Silead touchscreen controllers only work at 400KHz, for ++ * some reason they do not work at 100KHz. On some devices the ACPI ++ * tables list another device at their bus as only being capable ++ * of 100KHz, testing has shown that these other devices work fine ++ * at 400KHz (as can be expected of any recent i2c hw) so we force ++ * the speed of the bus to 400 KHz if a Silead device is present. ++ */ ++ { "MSSL1680", 0 }, ++ {} ++}; ++ + static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level, + void *data, void **return_value) + { +@@ -258,6 +272,9 @@ static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level, + if (lookup->speed <= lookup->min_speed) + lookup->min_speed = lookup->speed; + ++ if (acpi_match_device_ids(adev, i2c_acpi_force_400khz_device_ids) == 0) ++ lookup->force_speed = 400000; ++ + return AE_OK; + } + +@@ -295,7 +312,16 @@ u32 i2c_acpi_find_bus_speed(struct device *dev) + return 0; + } + +- return lookup.min_speed != UINT_MAX ? lookup.min_speed : 0; ++ if (lookup.force_speed) { ++ if (lookup.force_speed != lookup.min_speed) ++ dev_warn(dev, FW_BUG "DSDT uses known not-working I2C bus speed %d, forcing it to %d\n", ++ lookup.min_speed, lookup.force_speed); ++ return lookup.force_speed; ++ } else if (lookup.min_speed != UINT_MAX) { ++ return lookup.min_speed; ++ } else { ++ return 0; ++ } + } + EXPORT_SYMBOL_GPL(i2c_acpi_find_bus_speed); + +diff --git a/drivers/iio/adc/max9611.c b/drivers/iio/adc/max9611.c +index 49c1956e6a67..0884435eec68 100644 +--- a/drivers/iio/adc/max9611.c ++++ b/drivers/iio/adc/max9611.c +@@ -289,7 +289,7 @@ static int max9611_read_csa_voltage(struct max9611_dev *max9611, + return ret; + + if (*adc_raw > 0) { +- *csa_gain = gain_selectors[i]; ++ *csa_gain = (enum max9611_csa_gain)gain_selectors[i]; + return 0; + } + } +diff --git a/drivers/iio/dac/mcp4922.c b/drivers/iio/dac/mcp4922.c +index bf9aa3fc0534..b5190d1dae8e 100644 +--- a/drivers/iio/dac/mcp4922.c ++++ b/drivers/iio/dac/mcp4922.c +@@ -94,17 +94,22 @@ static int mcp4922_write_raw(struct iio_dev *indio_dev, + long mask) + { + struct mcp4922_state *state = iio_priv(indio_dev); ++ int ret; + + if (val2 != 0) + return -EINVAL; + + switch (mask) { + case IIO_CHAN_INFO_RAW: +- if (val > GENMASK(chan->scan_type.realbits-1, 0)) ++ if (val < 0 || val > GENMASK(chan->scan_type.realbits - 1, 0)) + return -EINVAL; + val <<= chan->scan_type.shift; +- state->value[chan->channel] = val; +- return mcp4922_spi_write(state, chan->channel, val); ++ ++ ret = mcp4922_spi_write(state, chan->channel, val); ++ if (!ret) ++ state->value[chan->channel] = val; ++ return ret; ++ + default: + return -EINVAL; + } +diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c +index 6d8ac51a39cc..6a585c3e2192 100644 +--- a/drivers/infiniband/core/device.c ++++ b/drivers/infiniband/core/device.c +@@ -599,8 +599,8 @@ void ib_unregister_device(struct ib_device *device) + } + up_read(&lists_rwsem); + +- ib_device_unregister_rdmacg(device); + ib_device_unregister_sysfs(device); ++ ib_device_unregister_rdmacg(device); + + mutex_unlock(&device_mutex); + +diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c +index 74aa3e651bc3..218411282069 100644 +--- a/drivers/infiniband/core/mad.c ++++ b/drivers/infiniband/core/mad.c +@@ -223,30 +223,30 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, + /* Validate parameters */ + qpn = get_spl_qp_index(qp_type); + if (qpn == -1) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: invalid QP Type %d\n", +- qp_type); ++ dev_dbg_ratelimited(&device->dev, "%s: invalid QP Type %d\n", ++ __func__, qp_type); + goto error1; + } + + if (rmpp_version && rmpp_version != IB_MGMT_RMPP_VERSION) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: invalid RMPP Version %u\n", +- rmpp_version); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: invalid RMPP Version %u\n", ++ __func__, rmpp_version); + goto error1; + } + + /* Validate MAD registration request if supplied */ + if (mad_reg_req) { + if (mad_reg_req->mgmt_class_version >= MAX_MGMT_VERSION) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: invalid Class Version %u\n", +- mad_reg_req->mgmt_class_version); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: invalid Class Version %u\n", ++ __func__, ++ mad_reg_req->mgmt_class_version); + goto error1; + } + if (!recv_handler) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: no recv_handler\n"); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: no recv_handler\n", __func__); + goto error1; + } + if (mad_reg_req->mgmt_class >= MAX_MGMT_CLASS) { +@@ -256,9 +256,9 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, + */ + if (mad_reg_req->mgmt_class != + IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: Invalid Mgmt Class 0x%x\n", +- mad_reg_req->mgmt_class); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: Invalid Mgmt Class 0x%x\n", ++ __func__, mad_reg_req->mgmt_class); + goto error1; + } + } else if (mad_reg_req->mgmt_class == 0) { +@@ -266,8 +266,9 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, + * Class 0 is reserved in IBA and is used for + * aliasing of IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE + */ +- dev_notice(&device->dev, +- "ib_register_mad_agent: Invalid Mgmt Class 0\n"); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: Invalid Mgmt Class 0\n", ++ __func__); + goto error1; + } else if (is_vendor_class(mad_reg_req->mgmt_class)) { + /* +@@ -275,18 +276,19 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, + * ensure supplied OUI is not zero + */ + if (!is_vendor_oui(mad_reg_req->oui)) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: No OUI specified for class 0x%x\n", +- mad_reg_req->mgmt_class); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: No OUI specified for class 0x%x\n", ++ __func__, ++ mad_reg_req->mgmt_class); + goto error1; + } + } + /* Make sure class supplied is consistent with RMPP */ + if (!ib_is_mad_class_rmpp(mad_reg_req->mgmt_class)) { + if (rmpp_version) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: RMPP version for non-RMPP class 0x%x\n", +- mad_reg_req->mgmt_class); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: RMPP version for non-RMPP class 0x%x\n", ++ __func__, mad_reg_req->mgmt_class); + goto error1; + } + } +@@ -297,9 +299,9 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, + IB_MGMT_CLASS_SUBN_LID_ROUTED) && + (mad_reg_req->mgmt_class != + IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: Invalid SM QP type: class 0x%x\n", +- mad_reg_req->mgmt_class); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: Invalid SM QP type: class 0x%x\n", ++ __func__, mad_reg_req->mgmt_class); + goto error1; + } + } else { +@@ -307,9 +309,9 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, + IB_MGMT_CLASS_SUBN_LID_ROUTED) || + (mad_reg_req->mgmt_class == + IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: Invalid GS QP type: class 0x%x\n", +- mad_reg_req->mgmt_class); ++ dev_dbg_ratelimited(&device->dev, ++ "%s: Invalid GS QP type: class 0x%x\n", ++ __func__, mad_reg_req->mgmt_class); + goto error1; + } + } +@@ -324,18 +326,18 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, + /* Validate device and port */ + port_priv = ib_get_mad_port(device, port_num); + if (!port_priv) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: Invalid port %d\n", +- port_num); ++ dev_dbg_ratelimited(&device->dev, "%s: Invalid port %d\n", ++ __func__, port_num); + ret = ERR_PTR(-ENODEV); + goto error1; + } + +- /* Verify the QP requested is supported. For example, Ethernet devices +- * will not have QP0 */ ++ /* Verify the QP requested is supported. For example, Ethernet devices ++ * will not have QP0. ++ */ + if (!port_priv->qp_info[qpn].qp) { +- dev_notice(&device->dev, +- "ib_register_mad_agent: QP %d not supported\n", qpn); ++ dev_dbg_ratelimited(&device->dev, "%s: QP %d not supported\n", ++ __func__, qpn); + ret = ERR_PTR(-EPROTONOSUPPORT); + goto error1; + } +diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c +index 6d3042794094..1fd8798d91a7 100644 +--- a/drivers/infiniband/hw/cxgb4/cq.c ++++ b/drivers/infiniband/hw/cxgb4/cq.c +@@ -161,7 +161,7 @@ static int create_cq(struct c4iw_rdev *rdev, struct t4_cq *cq, + cq->gts = rdev->lldi.gts_reg; + cq->rdev = rdev; + +- cq->bar2_va = c4iw_bar2_addrs(rdev, cq->cqid, T4_BAR2_QTYPE_INGRESS, ++ cq->bar2_va = c4iw_bar2_addrs(rdev, cq->cqid, CXGB4_BAR2_QTYPE_INGRESS, + &cq->bar2_qid, + user ? &cq->bar2_pa : NULL); + if (user && !cq->bar2_pa) { +diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c +index 347fe18b1a41..a9e3a11bea54 100644 +--- a/drivers/infiniband/hw/cxgb4/qp.c ++++ b/drivers/infiniband/hw/cxgb4/qp.c +@@ -279,12 +279,13 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq, + + wq->db = rdev->lldi.db_reg; + +- wq->sq.bar2_va = c4iw_bar2_addrs(rdev, wq->sq.qid, T4_BAR2_QTYPE_EGRESS, ++ wq->sq.bar2_va = c4iw_bar2_addrs(rdev, wq->sq.qid, ++ CXGB4_BAR2_QTYPE_EGRESS, + &wq->sq.bar2_qid, + user ? &wq->sq.bar2_pa : NULL); + if (need_rq) + wq->rq.bar2_va = c4iw_bar2_addrs(rdev, wq->rq.qid, +- T4_BAR2_QTYPE_EGRESS, ++ CXGB4_BAR2_QTYPE_EGRESS, + &wq->rq.bar2_qid, + user ? &wq->rq.bar2_pa : NULL); + +@@ -2572,7 +2573,7 @@ static int alloc_srq_queue(struct c4iw_srq *srq, struct c4iw_dev_ucontext *uctx, + memset(wq->queue, 0, wq->memsize); + pci_unmap_addr_set(wq, mapping, wq->dma_addr); + +- wq->bar2_va = c4iw_bar2_addrs(rdev, wq->qid, T4_BAR2_QTYPE_EGRESS, ++ wq->bar2_va = c4iw_bar2_addrs(rdev, wq->qid, CXGB4_BAR2_QTYPE_EGRESS, + &wq->bar2_qid, + user ? &wq->bar2_pa : NULL); + +diff --git a/drivers/infiniband/hw/hfi1/pcie.c b/drivers/infiniband/hw/hfi1/pcie.c +index 6c967dde58e7..a8dd12e525f8 100644 +--- a/drivers/infiniband/hw/hfi1/pcie.c ++++ b/drivers/infiniband/hw/hfi1/pcie.c +@@ -331,7 +331,9 @@ int pcie_speeds(struct hfi1_devdata *dd) + /* + * bus->max_bus_speed is set from the bridge's linkcap Max Link Speed + */ +- if (parent && dd->pcidev->bus->max_bus_speed != PCIE_SPEED_8_0GT) { ++ if (parent && ++ (dd->pcidev->bus->max_bus_speed == PCIE_SPEED_2_5GT || ++ dd->pcidev->bus->max_bus_speed == PCIE_SPEED_5_0GT)) { + dd_dev_info(dd, "Parent PCIe bridge does not support Gen3\n"); + dd->link_gen3_capable = 0; + } +diff --git a/drivers/infiniband/hw/hfi1/sdma.c b/drivers/infiniband/hw/hfi1/sdma.c +index 64ab92f8a4a2..291c12f588b5 100644 +--- a/drivers/infiniband/hw/hfi1/sdma.c ++++ b/drivers/infiniband/hw/hfi1/sdma.c +@@ -65,6 +65,7 @@ + #define SDMA_DESCQ_CNT 2048 + #define SDMA_DESC_INTR 64 + #define INVALID_TAIL 0xffff ++#define SDMA_PAD max_t(size_t, MAX_16B_PADDING, sizeof(u32)) + + static uint sdma_descq_cnt = SDMA_DESCQ_CNT; + module_param(sdma_descq_cnt, uint, S_IRUGO); +@@ -1280,7 +1281,7 @@ void sdma_clean(struct hfi1_devdata *dd, size_t num_engines) + struct sdma_engine *sde; + + if (dd->sdma_pad_dma) { +- dma_free_coherent(&dd->pcidev->dev, 4, ++ dma_free_coherent(&dd->pcidev->dev, SDMA_PAD, + (void *)dd->sdma_pad_dma, + dd->sdma_pad_phys); + dd->sdma_pad_dma = NULL; +@@ -1481,7 +1482,7 @@ int sdma_init(struct hfi1_devdata *dd, u8 port) + /* Allocate memory for pad */ + dd->sdma_pad_dma = dma_zalloc_coherent( + &dd->pcidev->dev, +- sizeof(u32), ++ SDMA_PAD, + &dd->sdma_pad_phys, + GFP_KERNEL + ); +diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c +index cbff746d9e9d..684a298e1503 100644 +--- a/drivers/infiniband/hw/hfi1/user_sdma.c ++++ b/drivers/infiniband/hw/hfi1/user_sdma.c +@@ -856,8 +856,10 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts) + + changes = set_txreq_header_ahg(req, tx, + datalen); +- if (changes < 0) ++ if (changes < 0) { ++ ret = changes; + goto free_tx; ++ } + } + } else { + ret = sdma_txinit(&tx->txreq, 0, sizeof(req->hdr) + +diff --git a/drivers/infiniband/hw/hfi1/verbs.c b/drivers/infiniband/hw/hfi1/verbs.c +index 1ad38c8c1ef9..4e7b3c027901 100644 +--- a/drivers/infiniband/hw/hfi1/verbs.c ++++ b/drivers/infiniband/hw/hfi1/verbs.c +@@ -149,9 +149,6 @@ static int pio_wait(struct rvt_qp *qp, + /* Length of buffer to create verbs txreq cache name */ + #define TXREQ_NAME_LEN 24 + +-/* 16B trailing buffer */ +-static const u8 trail_buf[MAX_16B_PADDING]; +- + static uint wss_threshold; + module_param(wss_threshold, uint, S_IRUGO); + MODULE_PARM_DESC(wss_threshold, "Percentage (1-100) of LLC to use as a threshold for a cacheless copy"); +@@ -893,8 +890,8 @@ static int build_verbs_tx_desc( + + /* add icrc, lt byte, and padding to flit */ + if (extra_bytes) +- ret = sdma_txadd_kvaddr(sde->dd, &tx->txreq, +- (void *)trail_buf, extra_bytes); ++ ret = sdma_txadd_daddr(sde->dd, &tx->txreq, ++ sde->dd->sdma_pad_phys, extra_bytes); + + bail_txadd: + return ret; +@@ -1151,7 +1148,8 @@ int hfi1_verbs_send_pio(struct rvt_qp *qp, struct hfi1_pkt_state *ps, + } + /* add icrc, lt byte, and padding to flit */ + if (extra_bytes) +- seg_pio_copy_mid(pbuf, trail_buf, extra_bytes); ++ seg_pio_copy_mid(pbuf, ppd->dd->sdma_pad_dma, ++ extra_bytes); + + seg_pio_copy_end(pbuf); + } +diff --git a/drivers/infiniband/hw/hns/Kconfig b/drivers/infiniband/hw/hns/Kconfig +index fddb5fdf92de..21c2100b2ea9 100644 +--- a/drivers/infiniband/hw/hns/Kconfig ++++ b/drivers/infiniband/hw/hns/Kconfig +@@ -1,6 +1,7 @@ + config INFINIBAND_HNS + tristate "HNS RoCE Driver" + depends on NET_VENDOR_HISILICON ++ depends on INFINIBAND_USER_ACCESS || !INFINIBAND_USER_ACCESS + depends on ARM64 || (COMPILE_TEST && 64BIT) + ---help--- + This is a RoCE/RDMA driver for the Hisilicon RoCE engine. The engine +diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +index cf878e1b71fc..3f8e13190aa7 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -5117,6 +5117,7 @@ static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev) + create_singlethread_workqueue("hns_roce_irq_workqueue"); + if (!hr_dev->irq_workq) { + dev_err(dev, "Create irq workqueue failed!\n"); ++ ret = -ENOMEM; + goto err_request_irq_fail; + } + +diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c +index 423818a7d333..771eb6bd0785 100644 +--- a/drivers/infiniband/hw/i40iw/i40iw_cm.c ++++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c +@@ -1689,7 +1689,7 @@ static enum i40iw_status_code i40iw_add_mqh_6(struct i40iw_device *iwdev, + unsigned long flags; + + rtnl_lock(); +- for_each_netdev_rcu(&init_net, ip_dev) { ++ for_each_netdev(&init_net, ip_dev) { + if ((((rdma_vlan_dev_vlan_id(ip_dev) < I40IW_NO_VLAN) && + (rdma_vlan_dev_real_dev(ip_dev) == iwdev->netdev)) || + (ip_dev == iwdev->netdev)) && (ip_dev->flags & IFF_UP)) { +diff --git a/drivers/infiniband/hw/mlx4/Kconfig b/drivers/infiniband/hw/mlx4/Kconfig +index db4aa13ebae0..d1de3285fd88 100644 +--- a/drivers/infiniband/hw/mlx4/Kconfig ++++ b/drivers/infiniband/hw/mlx4/Kconfig +@@ -1,6 +1,7 @@ + config MLX4_INFINIBAND + tristate "Mellanox ConnectX HCA support" + depends on NETDEVICES && ETHERNET && PCI && INET ++ depends on INFINIBAND_USER_ACCESS || !INFINIBAND_USER_ACCESS + depends on MAY_USE_DEVLINK + select NET_VENDOR_MELLANOX + select MLX4_CORE +diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c +index c05eae93170e..f4ffdc588ea0 100644 +--- a/drivers/infiniband/hw/mlx5/main.c ++++ b/drivers/infiniband/hw/mlx5/main.c +@@ -1823,6 +1823,14 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev, + context->lib_caps = req.lib_caps; + print_lib_caps(dev, context->lib_caps); + ++ if (mlx5_lag_is_active(dev->mdev)) { ++ u8 port = mlx5_core_native_port_num(dev->mdev); ++ ++ atomic_set(&context->tx_port_affinity, ++ atomic_add_return( ++ 1, &dev->roce[port].tx_port_affinity)); ++ } ++ + return &context->ibucontext; + + out_mdev: +diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h +index 941d1df54631..6a060c84598f 100644 +--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h ++++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h +@@ -139,6 +139,8 @@ struct mlx5_ib_ucontext { + u64 lib_caps; + DECLARE_BITMAP(dm_pages, MLX5_MAX_MEMIC_PAGES); + u16 devx_uid; ++ /* For RoCE LAG TX affinity */ ++ atomic_t tx_port_affinity; + }; + + static inline struct mlx5_ib_ucontext *to_mucontext(struct ib_ucontext *ibucontext) +@@ -700,7 +702,7 @@ struct mlx5_roce { + rwlock_t netdev_lock; + struct net_device *netdev; + struct notifier_block nb; +- atomic_t next_port; ++ atomic_t tx_port_affinity; + enum ib_port_state last_port_state; + struct mlx5_ib_dev *dev; + u8 native_port_num; +diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c +index 900f85ce0fb0..ef0f710587ad 100644 +--- a/drivers/infiniband/hw/mlx5/qp.c ++++ b/drivers/infiniband/hw/mlx5/qp.c +@@ -2910,6 +2910,37 @@ static int modify_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, + return 0; + } + ++static unsigned int get_tx_affinity(struct mlx5_ib_dev *dev, ++ struct mlx5_ib_pd *pd, ++ struct mlx5_ib_qp_base *qp_base, ++ u8 port_num) ++{ ++ struct mlx5_ib_ucontext *ucontext = NULL; ++ unsigned int tx_port_affinity; ++ ++ if (pd && pd->ibpd.uobject && pd->ibpd.uobject->context) ++ ucontext = to_mucontext(pd->ibpd.uobject->context); ++ ++ if (ucontext) { ++ tx_port_affinity = (unsigned int)atomic_add_return( ++ 1, &ucontext->tx_port_affinity) % ++ MLX5_MAX_PORTS + ++ 1; ++ mlx5_ib_dbg(dev, "Set tx affinity 0x%x to qpn 0x%x ucontext %p\n", ++ tx_port_affinity, qp_base->mqp.qpn, ucontext); ++ } else { ++ tx_port_affinity = ++ (unsigned int)atomic_add_return( ++ 1, &dev->roce[port_num].tx_port_affinity) % ++ MLX5_MAX_PORTS + ++ 1; ++ mlx5_ib_dbg(dev, "Set tx affinity 0x%x to qpn 0x%x\n", ++ tx_port_affinity, qp_base->mqp.qpn); ++ } ++ ++ return tx_port_affinity; ++} ++ + static int __mlx5_ib_modify_qp(struct ib_qp *ibqp, + const struct ib_qp_attr *attr, int attr_mask, + enum ib_qp_state cur_state, enum ib_qp_state new_state, +@@ -2975,6 +3006,7 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp, + if (!context) + return -ENOMEM; + ++ pd = get_pd(qp); + context->flags = cpu_to_be32(mlx5_st << 16); + + if (!(attr_mask & IB_QP_PATH_MIG_STATE)) { +@@ -3003,9 +3035,7 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp, + (ibqp->qp_type == IB_QPT_XRC_TGT)) { + if (mlx5_lag_is_active(dev->mdev)) { + u8 p = mlx5_core_native_port_num(dev->mdev); +- tx_affinity = (unsigned int)atomic_add_return(1, +- &dev->roce[p].next_port) % +- MLX5_MAX_PORTS + 1; ++ tx_affinity = get_tx_affinity(dev, pd, base, p); + context->flags |= cpu_to_be32(tx_affinity << 24); + } + } +@@ -3063,7 +3093,6 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp, + goto out; + } + +- pd = get_pd(qp); + get_cqs(qp->ibqp.qp_type, qp->ibqp.send_cq, qp->ibqp.recv_cq, + &send_cq, &recv_cq); + +@@ -4378,6 +4407,12 @@ static int _mlx5_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, + u8 next_fence = 0; + u8 fence; + ++ if (unlikely(mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR && ++ !drain)) { ++ *bad_wr = wr; ++ return -EIO; ++ } ++ + if (unlikely(ibqp->qp_type == IB_QPT_GSI)) + return mlx5_ib_gsi_post_send(ibqp, wr, bad_wr); + +@@ -4387,13 +4422,6 @@ static int _mlx5_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, + + spin_lock_irqsave(&qp->sq.lock, flags); + +- if (mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR && !drain) { +- err = -EIO; +- *bad_wr = wr; +- nreq = 0; +- goto out; +- } +- + for (nreq = 0; wr; nreq++, wr = wr->next) { + if (unlikely(wr->opcode >= ARRAY_SIZE(mlx5_ib_opcode))) { + mlx5_ib_warn(dev, "\n"); +@@ -4708,18 +4736,17 @@ static int _mlx5_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr, + int ind; + int i; + ++ if (unlikely(mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR && ++ !drain)) { ++ *bad_wr = wr; ++ return -EIO; ++ } ++ + if (unlikely(ibqp->qp_type == IB_QPT_GSI)) + return mlx5_ib_gsi_post_recv(ibqp, wr, bad_wr); + + spin_lock_irqsave(&qp->rq.lock, flags); + +- if (mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR && !drain) { +- err = -EIO; +- *bad_wr = wr; +- nreq = 0; +- goto out; +- } +- + ind = qp->rq.head & (qp->rq.wqe_cnt - 1); + + for (nreq = 0; wr; nreq++, wr = wr->next) { +diff --git a/drivers/infiniband/sw/rxe/rxe_comp.c b/drivers/infiniband/sw/rxe/rxe_comp.c +index 83311dd07019..ea089cb091ad 100644 +--- a/drivers/infiniband/sw/rxe/rxe_comp.c ++++ b/drivers/infiniband/sw/rxe/rxe_comp.c +@@ -191,6 +191,7 @@ static inline void reset_retry_counters(struct rxe_qp *qp) + { + qp->comp.retry_cnt = qp->attr.retry_cnt; + qp->comp.rnr_retry = qp->attr.rnr_retry; ++ qp->comp.started_retry = 0; + } + + static inline enum comp_state check_psn(struct rxe_qp *qp, +@@ -253,6 +254,17 @@ static inline enum comp_state check_ack(struct rxe_qp *qp, + case IB_OPCODE_RC_RDMA_READ_RESPONSE_MIDDLE: + if (pkt->opcode != IB_OPCODE_RC_RDMA_READ_RESPONSE_MIDDLE && + pkt->opcode != IB_OPCODE_RC_RDMA_READ_RESPONSE_LAST) { ++ /* read retries of partial data may restart from ++ * read response first or response only. ++ */ ++ if ((pkt->psn == wqe->first_psn && ++ pkt->opcode == ++ IB_OPCODE_RC_RDMA_READ_RESPONSE_FIRST) || ++ (wqe->first_psn == wqe->last_psn && ++ pkt->opcode == ++ IB_OPCODE_RC_RDMA_READ_RESPONSE_ONLY)) ++ break; ++ + return COMPST_ERROR; + } + break; +@@ -499,11 +511,11 @@ static inline enum comp_state complete_wqe(struct rxe_qp *qp, + struct rxe_pkt_info *pkt, + struct rxe_send_wqe *wqe) + { +- qp->comp.opcode = -1; +- +- if (pkt) { +- if (psn_compare(pkt->psn, qp->comp.psn) >= 0) +- qp->comp.psn = (pkt->psn + 1) & BTH_PSN_MASK; ++ if (pkt && wqe->state == wqe_state_pending) { ++ if (psn_compare(wqe->last_psn, qp->comp.psn) >= 0) { ++ qp->comp.psn = (wqe->last_psn + 1) & BTH_PSN_MASK; ++ qp->comp.opcode = -1; ++ } + + if (qp->req.wait_psn) { + qp->req.wait_psn = 0; +@@ -676,6 +688,20 @@ int rxe_completer(void *arg) + goto exit; + } + ++ /* if we've started a retry, don't start another ++ * retry sequence, unless this is a timeout. ++ */ ++ if (qp->comp.started_retry && ++ !qp->comp.timeout_retry) { ++ if (pkt) { ++ rxe_drop_ref(pkt->qp); ++ kfree_skb(skb); ++ skb = NULL; ++ } ++ ++ goto done; ++ } ++ + if (qp->comp.retry_cnt > 0) { + if (qp->comp.retry_cnt != 7) + qp->comp.retry_cnt--; +@@ -692,6 +718,7 @@ int rxe_completer(void *arg) + rxe_counter_inc(rxe, + RXE_CNT_COMP_RETRY); + qp->req.need_retry = 1; ++ qp->comp.started_retry = 1; + rxe_run_task(&qp->req.task, 1); + } + +@@ -701,7 +728,7 @@ int rxe_completer(void *arg) + skb = NULL; + } + +- goto exit; ++ goto done; + + } else { + rxe_counter_inc(rxe, RXE_CNT_RETRY_EXCEEDED); +diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c +index fa98a5279647..f7dd8de79941 100644 +--- a/drivers/infiniband/sw/rxe/rxe_req.c ++++ b/drivers/infiniband/sw/rxe/rxe_req.c +@@ -73,9 +73,6 @@ static void req_retry(struct rxe_qp *qp) + int npsn; + int first = 1; + +- wqe = queue_head(qp->sq.queue); +- npsn = (qp->comp.psn - wqe->first_psn) & BTH_PSN_MASK; +- + qp->req.wqe_index = consumer_index(qp->sq.queue); + qp->req.psn = qp->comp.psn; + qp->req.opcode = -1; +@@ -107,11 +104,17 @@ static void req_retry(struct rxe_qp *qp) + if (first) { + first = 0; + +- if (mask & WR_WRITE_OR_SEND_MASK) ++ if (mask & WR_WRITE_OR_SEND_MASK) { ++ npsn = (qp->comp.psn - wqe->first_psn) & ++ BTH_PSN_MASK; + retry_first_write_send(qp, wqe, mask, npsn); ++ } + +- if (mask & WR_READ_MASK) ++ if (mask & WR_READ_MASK) { ++ npsn = (wqe->dma.length - wqe->dma.resid) / ++ qp->mtu; + wqe->iova += npsn * qp->mtu; ++ } + } + + wqe->state = wqe_state_posted; +@@ -435,7 +438,7 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp, + if (pkt->mask & RXE_RETH_MASK) { + reth_set_rkey(pkt, ibwr->wr.rdma.rkey); + reth_set_va(pkt, wqe->iova); +- reth_set_len(pkt, wqe->dma.length); ++ reth_set_len(pkt, wqe->dma.resid); + } + + if (pkt->mask & RXE_IMMDT_MASK) +diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h +index 3b731c7682e5..a0ec28d2b71a 100644 +--- a/drivers/infiniband/sw/rxe/rxe_verbs.h ++++ b/drivers/infiniband/sw/rxe/rxe_verbs.h +@@ -158,6 +158,7 @@ struct rxe_comp_info { + int opcode; + int timeout; + int timeout_retry; ++ int started_retry; + u32 retry_cnt; + u32 rnr_retry; + struct rxe_task task; +diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c +index 78dd36daac00..d8cb5bbe6eb5 100644 +--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c ++++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c +@@ -243,7 +243,8 @@ static int ipoib_change_mtu(struct net_device *dev, int new_mtu) + return 0; + } + +- if (new_mtu > IPOIB_UD_MTU(priv->max_ib_mtu)) ++ if (new_mtu < (ETH_MIN_MTU + IPOIB_ENCAP_LEN) || ++ new_mtu > IPOIB_UD_MTU(priv->max_ib_mtu)) + return -EINVAL; + + priv->admin_mtu = new_mtu; +diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c +index 2f6388596f88..96af06cfe0af 100644 +--- a/drivers/infiniband/ulp/iser/iser_initiator.c ++++ b/drivers/infiniband/ulp/iser/iser_initiator.c +@@ -589,13 +589,19 @@ void iser_login_rsp(struct ib_cq *cq, struct ib_wc *wc) + ib_conn->post_recv_buf_count--; + } + +-static inline void ++static inline int + iser_inv_desc(struct iser_fr_desc *desc, u32 rkey) + { +- if (likely(rkey == desc->rsc.mr->rkey)) ++ if (likely(rkey == desc->rsc.mr->rkey)) { + desc->rsc.mr_valid = 0; +- else if (likely(rkey == desc->pi_ctx->sig_mr->rkey)) ++ } else if (likely(desc->pi_ctx && rkey == desc->pi_ctx->sig_mr->rkey)) { + desc->pi_ctx->sig_mr_valid = 0; ++ } else { ++ iser_err("Bogus remote invalidation for rkey %#x\n", rkey); ++ return -EINVAL; ++ } ++ ++ return 0; + } + + static int +@@ -623,12 +629,14 @@ iser_check_remote_inv(struct iser_conn *iser_conn, + + if (iser_task->dir[ISER_DIR_IN]) { + desc = iser_task->rdma_reg[ISER_DIR_IN].mem_h; +- iser_inv_desc(desc, rkey); ++ if (unlikely(iser_inv_desc(desc, rkey))) ++ return -EINVAL; + } + + if (iser_task->dir[ISER_DIR_OUT]) { + desc = iser_task->rdma_reg[ISER_DIR_OUT].mem_h; +- iser_inv_desc(desc, rkey); ++ if (unlikely(iser_inv_desc(desc, rkey))) ++ return -EINVAL; + } + } else { + iser_err("failed to get task for itt=%d\n", hdr->itt); +diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c +index 2743ed4656e4..1cd23bf3236c 100644 +--- a/drivers/input/ff-memless.c ++++ b/drivers/input/ff-memless.c +@@ -501,6 +501,15 @@ static void ml_ff_destroy(struct ff_device *ff) + { + struct ml_device *ml = ff->private; + ++ /* ++ * Even though we stop all playing effects when tearing down ++ * an input device (via input_device_flush() that calls into ++ * input_ff_flush() that stops and erases all effects), we ++ * do not actually stop the timer, and therefore we should ++ * do it here. ++ */ ++ del_timer_sync(&ml->timer); ++ + kfree(ml->private); + } + +diff --git a/drivers/input/rmi4/rmi_f11.c b/drivers/input/rmi4/rmi_f11.c +index 93901ebd122a..c8e07ea2422b 100644 +--- a/drivers/input/rmi4/rmi_f11.c ++++ b/drivers/input/rmi4/rmi_f11.c +@@ -1287,8 +1287,8 @@ static irqreturn_t rmi_f11_attention(int irq, void *ctx) + valid_bytes = f11->sensor.attn_size; + memcpy(f11->sensor.data_pkt, drvdata->attn_data.data, + valid_bytes); +- drvdata->attn_data.data += f11->sensor.attn_size; +- drvdata->attn_data.size -= f11->sensor.attn_size; ++ drvdata->attn_data.data += valid_bytes; ++ drvdata->attn_data.size -= valid_bytes; + } else { + error = rmi_read_block(rmi_dev, + data_base_addr, f11->sensor.data_pkt, +diff --git a/drivers/input/rmi4/rmi_f12.c b/drivers/input/rmi4/rmi_f12.c +index 5c7f48915779..9066f2b70ff0 100644 +--- a/drivers/input/rmi4/rmi_f12.c ++++ b/drivers/input/rmi4/rmi_f12.c +@@ -58,6 +58,9 @@ struct f12_data { + + const struct rmi_register_desc_item *data15; + u16 data15_offset; ++ ++ unsigned long *abs_mask; ++ unsigned long *rel_mask; + }; + + static int rmi_f12_read_sensor_tuning(struct f12_data *f12) +@@ -214,8 +217,8 @@ static irqreturn_t rmi_f12_attention(int irq, void *ctx) + valid_bytes = sensor->attn_size; + memcpy(sensor->data_pkt, drvdata->attn_data.data, + valid_bytes); +- drvdata->attn_data.data += sensor->attn_size; +- drvdata->attn_data.size -= sensor->attn_size; ++ drvdata->attn_data.data += valid_bytes; ++ drvdata->attn_data.size -= valid_bytes; + } else { + retval = rmi_read_block(rmi_dev, f12->data_addr, + sensor->data_pkt, sensor->pkt_size); +@@ -296,9 +299,18 @@ static int rmi_f12_write_control_regs(struct rmi_function *fn) + static int rmi_f12_config(struct rmi_function *fn) + { + struct rmi_driver *drv = fn->rmi_dev->driver; ++ struct f12_data *f12 = dev_get_drvdata(&fn->dev); ++ struct rmi_2d_sensor *sensor; + int ret; + +- drv->set_irq_bits(fn->rmi_dev, fn->irq_mask); ++ sensor = &f12->sensor; ++ ++ if (!sensor->report_abs) ++ drv->clear_irq_bits(fn->rmi_dev, f12->abs_mask); ++ else ++ drv->set_irq_bits(fn->rmi_dev, f12->abs_mask); ++ ++ drv->clear_irq_bits(fn->rmi_dev, f12->rel_mask); + + ret = rmi_f12_write_control_regs(fn); + if (ret) +@@ -320,9 +332,12 @@ static int rmi_f12_probe(struct rmi_function *fn) + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); + struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); + u16 data_offset = 0; ++ int mask_size; + + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__); + ++ mask_size = BITS_TO_LONGS(drvdata->irq_count) * sizeof(unsigned long); ++ + ret = rmi_read(fn->rmi_dev, query_addr, &buf); + if (ret < 0) { + dev_err(&fn->dev, "Failed to read general info register: %d\n", +@@ -337,10 +352,19 @@ static int rmi_f12_probe(struct rmi_function *fn) + return -ENODEV; + } + +- f12 = devm_kzalloc(&fn->dev, sizeof(struct f12_data), GFP_KERNEL); ++ f12 = devm_kzalloc(&fn->dev, sizeof(struct f12_data) + mask_size * 2, ++ GFP_KERNEL); + if (!f12) + return -ENOMEM; + ++ f12->abs_mask = (unsigned long *)((char *)f12 ++ + sizeof(struct f12_data)); ++ f12->rel_mask = (unsigned long *)((char *)f12 ++ + sizeof(struct f12_data) + mask_size); ++ ++ set_bit(fn->irq_pos, f12->abs_mask); ++ set_bit(fn->irq_pos + 1, f12->rel_mask); ++ + f12->has_dribble = !!(buf & BIT(3)); + + if (fn->dev.of_node) { +diff --git a/drivers/input/rmi4/rmi_f54.c b/drivers/input/rmi4/rmi_f54.c +index a6f515bcab22..539a47425fcd 100644 +--- a/drivers/input/rmi4/rmi_f54.c ++++ b/drivers/input/rmi4/rmi_f54.c +@@ -362,7 +362,7 @@ static const struct vb2_ops rmi_f54_queue_ops = { + static const struct vb2_queue rmi_f54_queue = { + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, + .io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ, +- .buf_struct_size = sizeof(struct vb2_buffer), ++ .buf_struct_size = sizeof(struct vb2_v4l2_buffer), + .ops = &rmi_f54_queue_ops, + .mem_ops = &vb2_vmalloc_memops, + .timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC, +@@ -614,7 +614,7 @@ static int rmi_f54_config(struct rmi_function *fn) + { + struct rmi_driver *drv = fn->rmi_dev->driver; + +- drv->set_irq_bits(fn->rmi_dev, fn->irq_mask); ++ drv->clear_irq_bits(fn->rmi_dev, fn->irq_mask); + + return 0; + } +@@ -742,6 +742,7 @@ static void rmi_f54_remove(struct rmi_function *fn) + + video_unregister_device(&f54->vdev); + v4l2_device_unregister(&f54->v4l2); ++ destroy_workqueue(f54->workqueue); + } + + struct rmi_function_handler rmi_f54_handler = { +diff --git a/drivers/media/i2c/ov13858.c b/drivers/media/i2c/ov13858.c +index a66f6201f53c..0e7a85c4996c 100644 +--- a/drivers/media/i2c/ov13858.c ++++ b/drivers/media/i2c/ov13858.c +@@ -1230,7 +1230,7 @@ static int ov13858_set_ctrl(struct v4l2_ctrl *ctrl) + * Applying V4L2 control value only happens + * when power is up for streaming + */ +- if (pm_runtime_get_if_in_use(&client->dev) <= 0) ++ if (!pm_runtime_get_if_in_use(&client->dev)) + return 0; + + ret = 0; +diff --git a/drivers/media/i2c/ov2680.c b/drivers/media/i2c/ov2680.c +index f753a1c333ef..d8798fb714ba 100644 +--- a/drivers/media/i2c/ov2680.c ++++ b/drivers/media/i2c/ov2680.c +@@ -568,10 +568,6 @@ static int ov2680_power_on(struct ov2680_dev *sensor) + if (ret < 0) + return ret; + +- ret = ov2680_mode_restore(sensor); +- if (ret < 0) +- goto disable; +- + sensor->is_enabled = true; + + /* Set clock lane into LP-11 state */ +@@ -580,12 +576,6 @@ static int ov2680_power_on(struct ov2680_dev *sensor) + ov2680_stream_disable(sensor); + + return 0; +- +-disable: +- dev_err(dev, "failed to enable sensor: %d\n", ret); +- ov2680_power_off(sensor); +- +- return ret; + } + + static int ov2680_s_power(struct v4l2_subdev *sd, int on) +@@ -606,6 +596,8 @@ static int ov2680_s_power(struct v4l2_subdev *sd, int on) + ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler); + if (ret < 0) + return ret; ++ ++ ret = ov2680_mode_restore(sensor); + } + + return ret; +@@ -1088,26 +1080,20 @@ static int ov2680_probe(struct i2c_client *client) + + mutex_init(&sensor->lock); + +- ret = ov2680_v4l2_init(sensor); ++ ret = ov2680_check_id(sensor); + if (ret < 0) + goto lock_destroy; + +- ret = ov2680_check_id(sensor); ++ ret = ov2680_v4l2_init(sensor); + if (ret < 0) +- goto error_cleanup; ++ goto lock_destroy; + + dev_info(dev, "ov2680 init correctly\n"); + + return 0; + +-error_cleanup: +- dev_err(dev, "ov2680 init fail: %d\n", ret); +- +- media_entity_cleanup(&sensor->sd.entity); +- v4l2_async_unregister_subdev(&sensor->sd); +- v4l2_ctrl_handler_free(&sensor->ctrls.handler); +- + lock_destroy: ++ dev_err(dev, "ov2680 init fail: %d\n", ret); + mutex_destroy(&sensor->lock); + + return ret; +diff --git a/drivers/media/i2c/ov2685.c b/drivers/media/i2c/ov2685.c +index 385c1886a947..98a1f2e312b5 100644 +--- a/drivers/media/i2c/ov2685.c ++++ b/drivers/media/i2c/ov2685.c +@@ -549,7 +549,7 @@ static int ov2685_set_ctrl(struct v4l2_ctrl *ctrl) + break; + } + +- if (pm_runtime_get_if_in_use(&client->dev) <= 0) ++ if (!pm_runtime_get_if_in_use(&client->dev)) + return 0; + + switch (ctrl->id) { +diff --git a/drivers/media/i2c/ov5670.c b/drivers/media/i2c/ov5670.c +index 7b7c74d77370..53dd30d96e69 100644 +--- a/drivers/media/i2c/ov5670.c ++++ b/drivers/media/i2c/ov5670.c +@@ -2016,7 +2016,7 @@ static int ov5670_set_ctrl(struct v4l2_ctrl *ctrl) + } + + /* V4L2 controls values will be applied only when power is already up */ +- if (pm_runtime_get_if_in_use(&client->dev) <= 0) ++ if (!pm_runtime_get_if_in_use(&client->dev)) + return 0; + + switch (ctrl->id) { +diff --git a/drivers/media/i2c/ov5695.c b/drivers/media/i2c/ov5695.c +index 9a80decd93d3..5d107c53364d 100644 +--- a/drivers/media/i2c/ov5695.c ++++ b/drivers/media/i2c/ov5695.c +@@ -1110,7 +1110,7 @@ static int ov5695_set_ctrl(struct v4l2_ctrl *ctrl) + break; + } + +- if (pm_runtime_get_if_in_use(&client->dev) <= 0) ++ if (!pm_runtime_get_if_in_use(&client->dev)) + return 0; + + switch (ctrl->id) { +diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c +index 7158c31d8403..4eae5f2f7d31 100644 +--- a/drivers/media/i2c/ov772x.c ++++ b/drivers/media/i2c/ov772x.c +@@ -896,6 +896,7 @@ static int ov772x_power_on(struct ov772x_priv *priv) + GPIOD_OUT_LOW); + if (IS_ERR(priv->rstb_gpio)) { + dev_info(&client->dev, "Unable to get GPIO \"reset\""); ++ clk_disable_unprepare(priv->clk); + return PTR_ERR(priv->rstb_gpio); + } + +diff --git a/drivers/media/i2c/ov7740.c b/drivers/media/i2c/ov7740.c +index 8a6a7a5929aa..7804013934ab 100644 +--- a/drivers/media/i2c/ov7740.c ++++ b/drivers/media/i2c/ov7740.c +@@ -510,7 +510,7 @@ static int ov7740_set_ctrl(struct v4l2_ctrl *ctrl) + int ret; + u8 val = 0; + +- if (pm_runtime_get_if_in_use(&client->dev) <= 0) ++ if (!pm_runtime_get_if_in_use(&client->dev)) + return 0; + + switch (ctrl->id) { +diff --git a/drivers/media/pci/ivtv/ivtv-yuv.c b/drivers/media/pci/ivtv/ivtv-yuv.c +index 44936d6d7c39..1380474519f2 100644 +--- a/drivers/media/pci/ivtv/ivtv-yuv.c ++++ b/drivers/media/pci/ivtv/ivtv-yuv.c +@@ -935,7 +935,7 @@ static void ivtv_yuv_init(struct ivtv *itv) + } + + /* We need a buffer for blanking when Y plane is offset - non-fatal if we can't get one */ +- yi->blanking_ptr = kzalloc(720 * 16, GFP_KERNEL|__GFP_NOWARN); ++ yi->blanking_ptr = kzalloc(720 * 16, GFP_ATOMIC|__GFP_NOWARN); + if (yi->blanking_ptr) { + yi->blanking_dmaptr = pci_map_single(itv->pdev, yi->blanking_ptr, 720*16, PCI_DMA_TODEVICE); + } else { +diff --git a/drivers/media/pci/meye/meye.c b/drivers/media/pci/meye/meye.c +index 8001d3e9134e..db2a7ad1e523 100644 +--- a/drivers/media/pci/meye/meye.c ++++ b/drivers/media/pci/meye/meye.c +@@ -1460,7 +1460,7 @@ static int meye_mmap(struct file *file, struct vm_area_struct *vma) + unsigned long page, pos; + + mutex_lock(&meye.lock); +- if (size > gbuffers * gbufsize) { ++ if (size > gbuffers * gbufsize || offset > gbuffers * gbufsize - size) { + mutex_unlock(&meye.lock); + return -EINVAL; + } +diff --git a/drivers/media/platform/davinci/vpbe_display.c b/drivers/media/platform/davinci/vpbe_display.c +index b0eb3d899eb4..6f8269352433 100644 +--- a/drivers/media/platform/davinci/vpbe_display.c ++++ b/drivers/media/platform/davinci/vpbe_display.c +@@ -521,7 +521,7 @@ vpbe_disp_calculate_scale_factor(struct vpbe_display *disp_dev, + else if (v_scale == 4) + layer_info->v_zoom = ZOOM_X4; + if (v_exp) +- layer_info->h_exp = V_EXP_6_OVER_5; ++ layer_info->v_exp = V_EXP_6_OVER_5; + } else { + /* no scaling, only cropping. Set display area to crop area */ + cfg->ysize = expected_ysize; +diff --git a/drivers/media/platform/vicodec/vicodec-codec.c b/drivers/media/platform/vicodec/vicodec-codec.c +index 2d047646f614..d854b2344f12 100644 +--- a/drivers/media/platform/vicodec/vicodec-codec.c ++++ b/drivers/media/platform/vicodec/vicodec-codec.c +@@ -588,8 +588,14 @@ static void fill_decoder_block(u8 *dst, const s16 *input, int stride) + int i, j; + + for (i = 0; i < 8; i++) { +- for (j = 0; j < 8; j++) +- *dst++ = *input++; ++ for (j = 0; j < 8; j++, input++, dst++) { ++ if (*input < 0) ++ *dst = 0; ++ else if (*input > 255) ++ *dst = 255; ++ else ++ *dst = *input; ++ } + dst += stride - 8; + } + } +diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c +index b9c0f695d002..8d86f618ec77 100644 +--- a/drivers/media/platform/vsp1/vsp1_drm.c ++++ b/drivers/media/platform/vsp1/vsp1_drm.c +@@ -770,6 +770,7 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int pipe_index, + struct vsp1_device *vsp1 = dev_get_drvdata(dev); + struct vsp1_drm_pipeline *drm_pipe = &vsp1->drm->pipe[pipe_index]; + const struct vsp1_format_info *fmtinfo; ++ unsigned int chroma_hsub; + struct vsp1_rwpf *rpf; + + if (rpf_index >= vsp1->info->rpf_count) +@@ -810,10 +811,18 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int pipe_index, + return -EINVAL; + } + ++ /* ++ * Only formats with three planes can affect the chroma planes pitch. ++ * All formats with two planes have a horizontal subsampling value of 2, ++ * but combine U and V in a single chroma plane, which thus results in ++ * the luma plane and chroma plane having the same pitch. ++ */ ++ chroma_hsub = (fmtinfo->planes == 3) ? fmtinfo->hsub : 1; ++ + rpf->fmtinfo = fmtinfo; + rpf->format.num_planes = fmtinfo->planes; + rpf->format.plane_fmt[0].bytesperline = cfg->pitch; +- rpf->format.plane_fmt[1].bytesperline = cfg->pitch; ++ rpf->format.plane_fmt[1].bytesperline = cfg->pitch / chroma_hsub; + rpf->alpha = cfg->alpha; + + rpf->mem.addr[0] = cfg->mem[0]; +diff --git a/drivers/media/platform/vsp1/vsp1_regs.h b/drivers/media/platform/vsp1/vsp1_regs.h +index 3738ff2f7b85..f6e4157095cc 100644 +--- a/drivers/media/platform/vsp1/vsp1_regs.h ++++ b/drivers/media/platform/vsp1/vsp1_regs.h +@@ -1,4 +1,4 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ ++/* SPDX-License-Identifier: GPL-2.0+ */ + /* + * vsp1_regs.h -- R-Car VSP1 Registers Definitions + * +diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c +index e3f63299f85c..07e3322bb182 100644 +--- a/drivers/media/usb/au0828/au0828-core.c ++++ b/drivers/media/usb/au0828/au0828-core.c +@@ -632,7 +632,7 @@ static int au0828_usb_probe(struct usb_interface *interface, + /* Analog TV */ + retval = au0828_analog_register(dev, interface); + if (retval) { +- pr_err("%s() au0282_dev_register failed to register on V4L2\n", ++ pr_err("%s() au0828_analog_register failed to register on V4L2\n", + __func__); + mutex_unlock(&dev->lock); + goto done; +@@ -641,7 +641,7 @@ static int au0828_usb_probe(struct usb_interface *interface, + /* Digital TV */ + retval = au0828_dvb_register(dev); + if (retval) +- pr_err("%s() au0282_dev_register failed\n", ++ pr_err("%s() au0828_dvb_register failed\n", + __func__); + + /* Remote controller */ +diff --git a/drivers/misc/genwqe/card_utils.c b/drivers/misc/genwqe/card_utils.c +index f68435df76d4..22301bba8c49 100644 +--- a/drivers/misc/genwqe/card_utils.c ++++ b/drivers/misc/genwqe/card_utils.c +@@ -298,7 +298,7 @@ static int genwqe_sgl_size(int num_pages) + int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, + void __user *user_addr, size_t user_size, int write) + { +- int rc; ++ int ret = -ENOMEM; + struct pci_dev *pci_dev = cd->pci_dev; + + sgl->fpage_offs = offset_in_page((unsigned long)user_addr); +@@ -318,7 +318,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, + if (get_order(sgl->sgl_size) > MAX_ORDER) { + dev_err(&pci_dev->dev, + "[%s] err: too much memory requested!\n", __func__); +- return -ENOMEM; ++ return ret; + } + + sgl->sgl = __genwqe_alloc_consistent(cd, sgl->sgl_size, +@@ -326,7 +326,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, + if (sgl->sgl == NULL) { + dev_err(&pci_dev->dev, + "[%s] err: no memory available!\n", __func__); +- return -ENOMEM; ++ return ret; + } + + /* Only use buffering on incomplete pages */ +@@ -339,7 +339,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, + /* Sync with user memory */ + if (copy_from_user(sgl->fpage + sgl->fpage_offs, + user_addr, sgl->fpage_size)) { +- rc = -EFAULT; ++ ret = -EFAULT; + goto err_out; + } + } +@@ -352,7 +352,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, + /* Sync with user memory */ + if (copy_from_user(sgl->lpage, user_addr + user_size - + sgl->lpage_size, sgl->lpage_size)) { +- rc = -EFAULT; ++ ret = -EFAULT; + goto err_out2; + } + } +@@ -374,7 +374,8 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, + sgl->sgl = NULL; + sgl->sgl_dma_addr = 0; + sgl->sgl_size = 0; +- return -ENOMEM; ++ ++ return ret; + } + + int genwqe_setup_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, +diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c +index eb4d90b7d99e..8b01257783dd 100644 +--- a/drivers/misc/kgdbts.c ++++ b/drivers/misc/kgdbts.c +@@ -985,6 +985,12 @@ static void kgdbts_run_tests(void) + int nmi_sleep = 0; + int i; + ++ verbose = 0; ++ if (strstr(config, "V1")) ++ verbose = 1; ++ if (strstr(config, "V2")) ++ verbose = 2; ++ + ptr = strchr(config, 'F'); + if (ptr) + fork_test = simple_strtol(ptr + 1, NULL, 10); +@@ -1068,13 +1074,6 @@ static int kgdbts_option_setup(char *opt) + return -ENOSPC; + } + strcpy(config, opt); +- +- verbose = 0; +- if (strstr(config, "V1")) +- verbose = 1; +- if (strstr(config, "V2")) +- verbose = 2; +- + return 0; + } + +@@ -1086,9 +1085,6 @@ static int configure_kgdbts(void) + + if (!strlen(config) || isspace(config[0])) + goto noconfig; +- err = kgdbts_option_setup(config); +- if (err) +- goto noconfig; + + final_ack = 0; + run_plant_and_detach_test(1); +diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c +index e284102c16e9..1ebcf0eb781e 100644 +--- a/drivers/mmc/host/sdhci-of-at91.c ++++ b/drivers/mmc/host/sdhci-of-at91.c +@@ -366,7 +366,7 @@ static int sdhci_at91_probe(struct platform_device *pdev) + pm_runtime_use_autosuspend(&pdev->dev); + + /* HS200 is broken at this moment */ +- host->quirks2 = SDHCI_QUIRK2_BROKEN_HS200; ++ host->quirks2 |= SDHCI_QUIRK2_BROKEN_HS200; + + ret = sdhci_add_host(host); + if (ret) +diff --git a/drivers/mtd/nand/raw/fsl_ifc_nand.c b/drivers/mtd/nand/raw/fsl_ifc_nand.c +index 24f59d0066af..7e7729df7827 100644 +--- a/drivers/mtd/nand/raw/fsl_ifc_nand.c ++++ b/drivers/mtd/nand/raw/fsl_ifc_nand.c +@@ -30,6 +30,7 @@ + #include <linux/mtd/partitions.h> + #include <linux/mtd/nand_ecc.h> + #include <linux/fsl_ifc.h> ++#include <linux/iopoll.h> + + #define ERR_BYTE 0xFF /* Value returned for read + bytes when read failed */ +@@ -761,7 +762,7 @@ static const struct nand_controller_ops fsl_ifc_controller_ops = { + .attach_chip = fsl_ifc_attach_chip, + }; + +-static void fsl_ifc_sram_init(struct fsl_ifc_mtd *priv) ++static int fsl_ifc_sram_init(struct fsl_ifc_mtd *priv) + { + struct fsl_ifc_ctrl *ctrl = priv->ctrl; + struct fsl_ifc_runtime __iomem *ifc_runtime = ctrl->rregs; +@@ -769,6 +770,27 @@ static void fsl_ifc_sram_init(struct fsl_ifc_mtd *priv) + uint32_t csor = 0, csor_8k = 0, csor_ext = 0; + uint32_t cs = priv->bank; + ++ if (ctrl->version < FSL_IFC_VERSION_1_1_0) ++ return 0; ++ ++ if (ctrl->version > FSL_IFC_VERSION_1_1_0) { ++ u32 ncfgr, status; ++ int ret; ++ ++ /* Trigger auto initialization */ ++ ncfgr = ifc_in32(&ifc_runtime->ifc_nand.ncfgr); ++ ifc_out32(ncfgr | IFC_NAND_NCFGR_SRAM_INIT_EN, &ifc_runtime->ifc_nand.ncfgr); ++ ++ /* Wait until done */ ++ ret = readx_poll_timeout(ifc_in32, &ifc_runtime->ifc_nand.ncfgr, ++ status, !(status & IFC_NAND_NCFGR_SRAM_INIT_EN), ++ 10, IFC_TIMEOUT_MSECS * 1000); ++ if (ret) ++ dev_err(priv->dev, "Failed to initialize SRAM!\n"); ++ ++ return ret; ++ } ++ + /* Save CSOR and CSOR_ext */ + csor = ifc_in32(&ifc_global->csor_cs[cs].csor); + csor_ext = ifc_in32(&ifc_global->csor_cs[cs].csor_ext); +@@ -805,12 +827,16 @@ static void fsl_ifc_sram_init(struct fsl_ifc_mtd *priv) + wait_event_timeout(ctrl->nand_wait, ctrl->nand_stat, + msecs_to_jiffies(IFC_TIMEOUT_MSECS)); + +- if (ctrl->nand_stat != IFC_NAND_EVTER_STAT_OPC) ++ if (ctrl->nand_stat != IFC_NAND_EVTER_STAT_OPC) { + pr_err("fsl-ifc: Failed to Initialise SRAM\n"); ++ return -ETIMEDOUT; ++ } + + /* Restore CSOR and CSOR_ext */ + ifc_out32(csor, &ifc_global->csor_cs[cs].csor); + ifc_out32(csor_ext, &ifc_global->csor_cs[cs].csor_ext); ++ ++ return 0; + } + + static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv) +@@ -821,6 +847,7 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv) + struct nand_chip *chip = &priv->chip; + struct mtd_info *mtd = nand_to_mtd(&priv->chip); + u32 csor; ++ int ret; + + /* Fill in fsl_ifc_mtd structure */ + mtd->dev.parent = priv->dev; +@@ -914,8 +941,9 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv) + chip->ecc.algo = NAND_ECC_HAMMING; + } + +- if (ctrl->version >= FSL_IFC_VERSION_1_1_0) +- fsl_ifc_sram_init(priv); ++ ret = fsl_ifc_sram_init(priv); ++ if (ret) ++ return ret; + + /* + * As IFC version 2.0.0 has 16KB of internal SRAM as compared to older +diff --git a/drivers/mtd/nand/raw/marvell_nand.c b/drivers/mtd/nand/raw/marvell_nand.c +index 9c90695a885f..7a84a8f05b46 100644 +--- a/drivers/mtd/nand/raw/marvell_nand.c ++++ b/drivers/mtd/nand/raw/marvell_nand.c +@@ -2710,24 +2710,23 @@ static int marvell_nfc_init(struct marvell_nfc *nfc) + struct regmap *sysctrl_base = + syscon_regmap_lookup_by_phandle(np, + "marvell,system-controller"); +- u32 reg; + + if (IS_ERR(sysctrl_base)) + return PTR_ERR(sysctrl_base); + +- reg = GENCONF_SOC_DEVICE_MUX_NFC_EN | +- GENCONF_SOC_DEVICE_MUX_ECC_CLK_RST | +- GENCONF_SOC_DEVICE_MUX_ECC_CORE_RST | +- GENCONF_SOC_DEVICE_MUX_NFC_INT_EN; +- regmap_write(sysctrl_base, GENCONF_SOC_DEVICE_MUX, reg); ++ regmap_write(sysctrl_base, GENCONF_SOC_DEVICE_MUX, ++ GENCONF_SOC_DEVICE_MUX_NFC_EN | ++ GENCONF_SOC_DEVICE_MUX_ECC_CLK_RST | ++ GENCONF_SOC_DEVICE_MUX_ECC_CORE_RST | ++ GENCONF_SOC_DEVICE_MUX_NFC_INT_EN); + +- regmap_read(sysctrl_base, GENCONF_CLK_GATING_CTRL, ®); +- reg |= GENCONF_CLK_GATING_CTRL_ND_GATE; +- regmap_write(sysctrl_base, GENCONF_CLK_GATING_CTRL, reg); ++ regmap_update_bits(sysctrl_base, GENCONF_CLK_GATING_CTRL, ++ GENCONF_CLK_GATING_CTRL_ND_GATE, ++ GENCONF_CLK_GATING_CTRL_ND_GATE); + +- regmap_read(sysctrl_base, GENCONF_ND_CLK_CTRL, ®); +- reg |= GENCONF_ND_CLK_CTRL_EN; +- regmap_write(sysctrl_base, GENCONF_ND_CLK_CTRL, reg); ++ regmap_update_bits(sysctrl_base, GENCONF_ND_CLK_CTRL, ++ GENCONF_ND_CLK_CTRL_EN, ++ GENCONF_ND_CLK_CTRL_EN); + } + + /* Configure the DMA if appropriate */ +diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c +index 880e75f63a19..07d8750313fd 100644 +--- a/drivers/mtd/nand/raw/qcom_nandc.c ++++ b/drivers/mtd/nand/raw/qcom_nandc.c +@@ -23,7 +23,6 @@ + #include <linux/of_device.h> + #include <linux/delay.h> + #include <linux/dma/qcom_bam_dma.h> +-#include <linux/dma-direct.h> /* XXX: drivers shall never use this directly! */ + + /* NANDc reg offsets */ + #define NAND_FLASH_CMD 0x00 +diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c +index aa97dbc797b6..5d338b2ac39e 100644 +--- a/drivers/net/can/slcan.c ++++ b/drivers/net/can/slcan.c +@@ -613,6 +613,7 @@ err_free_chan: + sl->tty = NULL; + tty->disc_data = NULL; + clear_bit(SLF_INUSE, &sl->flags); ++ free_netdev(sl->dev); + + err_exit: + rtnl_unlock(); +diff --git a/drivers/net/ethernet/amd/am79c961a.c b/drivers/net/ethernet/amd/am79c961a.c +index 01d132c02ff9..265039c57023 100644 +--- a/drivers/net/ethernet/amd/am79c961a.c ++++ b/drivers/net/ethernet/amd/am79c961a.c +@@ -440,7 +440,7 @@ static void am79c961_timeout(struct net_device *dev) + /* + * Transmit a packet + */ +-static int ++static netdev_tx_t + am79c961_sendpacket(struct sk_buff *skb, struct net_device *dev) + { + struct dev_priv *priv = netdev_priv(dev); +diff --git a/drivers/net/ethernet/amd/atarilance.c b/drivers/net/ethernet/amd/atarilance.c +index c5b81268c284..d3d44e07afbc 100644 +--- a/drivers/net/ethernet/amd/atarilance.c ++++ b/drivers/net/ethernet/amd/atarilance.c +@@ -339,7 +339,8 @@ static unsigned long lance_probe1( struct net_device *dev, struct lance_addr + *init_rec ); + static int lance_open( struct net_device *dev ); + static void lance_init_ring( struct net_device *dev ); +-static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev ); ++static netdev_tx_t lance_start_xmit(struct sk_buff *skb, ++ struct net_device *dev); + static irqreturn_t lance_interrupt( int irq, void *dev_id ); + static int lance_rx( struct net_device *dev ); + static int lance_close( struct net_device *dev ); +@@ -769,7 +770,8 @@ static void lance_tx_timeout (struct net_device *dev) + + /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ + +-static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev ) ++static netdev_tx_t ++lance_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct lance_private *lp = netdev_priv(dev); + struct lance_ioreg *IO = lp->iobase; +diff --git a/drivers/net/ethernet/amd/declance.c b/drivers/net/ethernet/amd/declance.c +index 00332a1ea84b..9f23703dd509 100644 +--- a/drivers/net/ethernet/amd/declance.c ++++ b/drivers/net/ethernet/amd/declance.c +@@ -894,7 +894,7 @@ static void lance_tx_timeout(struct net_device *dev) + netif_wake_queue(dev); + } + +-static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t lance_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct lance_private *lp = netdev_priv(dev); + volatile struct lance_regs *ll = lp->ll; +diff --git a/drivers/net/ethernet/amd/sun3lance.c b/drivers/net/ethernet/amd/sun3lance.c +index 77b1db267730..da7e3d4f4166 100644 +--- a/drivers/net/ethernet/amd/sun3lance.c ++++ b/drivers/net/ethernet/amd/sun3lance.c +@@ -236,7 +236,8 @@ struct lance_private { + static int lance_probe( struct net_device *dev); + static int lance_open( struct net_device *dev ); + static void lance_init_ring( struct net_device *dev ); +-static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev ); ++static netdev_tx_t lance_start_xmit(struct sk_buff *skb, ++ struct net_device *dev); + static irqreturn_t lance_interrupt( int irq, void *dev_id); + static int lance_rx( struct net_device *dev ); + static int lance_close( struct net_device *dev ); +@@ -511,7 +512,8 @@ static void lance_init_ring( struct net_device *dev ) + } + + +-static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev ) ++static netdev_tx_t ++lance_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct lance_private *lp = netdev_priv(dev); + int entry, len; +diff --git a/drivers/net/ethernet/amd/sunlance.c b/drivers/net/ethernet/amd/sunlance.c +index 19f89d9b1781..9d4899826823 100644 +--- a/drivers/net/ethernet/amd/sunlance.c ++++ b/drivers/net/ethernet/amd/sunlance.c +@@ -1106,7 +1106,7 @@ static void lance_tx_timeout(struct net_device *dev) + netif_wake_queue(dev); + } + +-static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t lance_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct lance_private *lp = netdev_priv(dev); + int entry, skblen, len; +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +index 24f1053b8785..d96a84a62d78 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +@@ -2009,7 +2009,7 @@ static int xgbe_close(struct net_device *netdev) + return 0; + } + +-static int xgbe_xmit(struct sk_buff *skb, struct net_device *netdev) ++static netdev_tx_t xgbe_xmit(struct sk_buff *skb, struct net_device *netdev) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); + struct xgbe_hw_if *hw_if = &pdata->hw_if; +@@ -2018,7 +2018,7 @@ static int xgbe_xmit(struct sk_buff *skb, struct net_device *netdev) + struct xgbe_ring *ring; + struct xgbe_packet_data *packet; + struct netdev_queue *txq; +- int ret; ++ netdev_tx_t ret; + + DBGPR("-->xgbe_xmit: skb->len = %d\n", skb->len); + +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c +index 10ec5dc88e24..5502ec5f0f69 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c +@@ -1468,3 +1468,11 @@ void hw_atl_reg_glb_cpu_scratch_scp_set(struct aq_hw_s *aq_hw, + aq_hw_write_reg(aq_hw, HW_ATL_GLB_CPU_SCRATCH_SCP_ADR(scratch_scp), + glb_cpu_scratch_scp); + } ++ ++void hw_atl_mcp_up_force_intr_set(struct aq_hw_s *aq_hw, u32 up_force_intr) ++{ ++ aq_hw_write_reg_bit(aq_hw, HW_ATL_MCP_UP_FORCE_INTERRUPT_ADR, ++ HW_ATL_MCP_UP_FORCE_INTERRUPT_MSK, ++ HW_ATL_MCP_UP_FORCE_INTERRUPT_SHIFT, ++ up_force_intr); ++} +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h +index b3bf64b48b93..41f239928c15 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h +@@ -701,4 +701,7 @@ void hw_atl_msm_reg_wr_strobe_set(struct aq_hw_s *aq_hw, u32 reg_wr_strobe); + /* set pci register reset disable */ + void hw_atl_pci_pci_reg_res_dis_set(struct aq_hw_s *aq_hw, u32 pci_reg_res_dis); + ++/* set uP Force Interrupt */ ++void hw_atl_mcp_up_force_intr_set(struct aq_hw_s *aq_hw, u32 up_force_intr); ++ + #endif /* HW_ATL_LLH_H */ +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h +index e2ecdb1c5a5c..a715fa317b1c 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h +@@ -2405,4 +2405,17 @@ + #define HW_ATL_GLB_CPU_SCRATCH_SCP_ADR(scratch_scp) \ + (0x00000300u + (scratch_scp) * 0x4) + ++/* register address for bitfield uP Force Interrupt */ ++#define HW_ATL_MCP_UP_FORCE_INTERRUPT_ADR 0x00000404 ++/* bitmask for bitfield uP Force Interrupt */ ++#define HW_ATL_MCP_UP_FORCE_INTERRUPT_MSK 0x00000002 ++/* inverted bitmask for bitfield uP Force Interrupt */ ++#define HW_ATL_MCP_UP_FORCE_INTERRUPT_MSKN 0xFFFFFFFD ++/* lower bit position of bitfield uP Force Interrupt */ ++#define HW_ATL_MCP_UP_FORCE_INTERRUPT_SHIFT 1 ++/* width of bitfield uP Force Interrupt */ ++#define HW_ATL_MCP_UP_FORCE_INTERRUPT_WIDTH 1 ++/* default value of bitfield uP Force Interrupt */ ++#define HW_ATL_MCP_UP_FORCE_INTERRUPT_DEFAULT 0x0 ++ + #endif /* HW_ATL_LLH_INTERNAL_H */ +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c +index 9939ccaeb125..096ec18e8f15 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c +@@ -327,17 +327,31 @@ static int hw_atl_utils_fw_upload_dwords(struct aq_hw_s *self, u32 a, u32 *p, + err = -ETIME; + goto err_exit; + } ++ if (IS_CHIP_FEATURE(REVISION_B1)) { ++ u32 offset = 0; ++ ++ for (; offset < cnt; ++offset) { ++ aq_hw_write_reg(self, 0x328, p[offset]); ++ aq_hw_write_reg(self, 0x32C, ++ (0x80000000 | (0xFFFF & (offset * 4)))); ++ hw_atl_mcp_up_force_intr_set(self, 1); ++ /* 1000 times by 10us = 10ms */ ++ AQ_HW_WAIT_FOR((aq_hw_read_reg(self, ++ 0x32C) & 0xF0000000) != ++ 0x80000000, ++ 10, 1000); ++ } ++ } else { ++ u32 offset = 0; + +- aq_hw_write_reg(self, 0x00000208U, a); +- +- for (++cnt; --cnt;) { +- u32 i = 0U; ++ aq_hw_write_reg(self, 0x208, a); + +- aq_hw_write_reg(self, 0x0000020CU, *(p++)); +- aq_hw_write_reg(self, 0x00000200U, 0xC000U); ++ for (; offset < cnt; ++offset) { ++ aq_hw_write_reg(self, 0x20C, p[offset]); ++ aq_hw_write_reg(self, 0x200, 0xC000); + +- for (i = 1024U; +- (0x100U & aq_hw_read_reg(self, 0x00000200U)) && --i;) { ++ AQ_HW_WAIT_FOR((aq_hw_read_reg(self, 0x200U) & ++ 0x100) == 0, 10, 1000); + } + } + +@@ -401,7 +415,7 @@ struct aq_hw_atl_utils_fw_rpc_tid_s { + + #define hw_atl_utils_fw_rpc_init(_H_) hw_atl_utils_fw_rpc_wait(_H_, NULL) + +-static int hw_atl_utils_fw_rpc_call(struct aq_hw_s *self, unsigned int rpc_size) ++int hw_atl_utils_fw_rpc_call(struct aq_hw_s *self, unsigned int rpc_size) + { + int err = 0; + struct aq_hw_atl_utils_fw_rpc_tid_s sw; +@@ -425,8 +439,8 @@ err_exit: + return err; + } + +-static int hw_atl_utils_fw_rpc_wait(struct aq_hw_s *self, +- struct hw_aq_atl_utils_fw_rpc **rpc) ++int hw_atl_utils_fw_rpc_wait(struct aq_hw_s *self, ++ struct hw_aq_atl_utils_fw_rpc **rpc) + { + int err = 0; + struct aq_hw_atl_utils_fw_rpc_tid_s sw; +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h +index b875590efcbd..505c8a2abd9c 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h +@@ -319,6 +319,11 @@ struct aq_stats_s *hw_atl_utils_get_hw_stats(struct aq_hw_s *self); + int hw_atl_utils_fw_downld_dwords(struct aq_hw_s *self, u32 a, + u32 *p, u32 cnt); + ++int hw_atl_utils_fw_rpc_call(struct aq_hw_s *self, unsigned int rpc_size); ++ ++int hw_atl_utils_fw_rpc_wait(struct aq_hw_s *self, ++ struct hw_aq_atl_utils_fw_rpc **rpc); ++ + extern const struct aq_fw_ops aq_fw_1x_ops; + extern const struct aq_fw_ops aq_fw_2x_ops; + +diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c +index e37943760a58..6300d94c9ff0 100644 +--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c ++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c +@@ -21,6 +21,7 @@ + + #define HW_ATL_FW2X_MPI_EFUSE_ADDR 0x364 + #define HW_ATL_FW2X_MPI_MBOX_ADDR 0x360 ++#define HW_ATL_FW2X_MPI_RPC_ADDR 0x334 + + #define HW_ATL_FW2X_MPI_CONTROL_ADDR 0x368 + #define HW_ATL_FW2X_MPI_CONTROL2_ADDR 0x36C +@@ -40,6 +41,10 @@ static int aq_fw2x_init(struct aq_hw_s *self) + AQ_HW_WAIT_FOR(0U != (self->mbox_addr = + aq_hw_read_reg(self, HW_ATL_FW2X_MPI_MBOX_ADDR)), + 1000U, 10U); ++ AQ_HW_WAIT_FOR(0U != (self->rpc_addr = ++ aq_hw_read_reg(self, HW_ATL_FW2X_MPI_RPC_ADDR)), ++ 1000U, 100U); ++ + return err; + } + +diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.c b/drivers/net/ethernet/broadcom/bcm63xx_enet.c +index 897302adc38e..50f8a377596e 100644 +--- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c ++++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c +@@ -568,12 +568,13 @@ static irqreturn_t bcm_enet_isr_dma(int irq, void *dev_id) + /* + * tx request callback + */ +-static int bcm_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++bcm_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct bcm_enet_priv *priv; + struct bcm_enet_desc *desc; + u32 len_stat; +- int ret; ++ netdev_tx_t ret; + + priv = netdev_priv(dev); + +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +index 68c62e32e882..af57568c922e 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +@@ -3540,6 +3540,16 @@ static void bnx2x_drv_info_iscsi_stat(struct bnx2x *bp) + */ + static void bnx2x_config_mf_bw(struct bnx2x *bp) + { ++ /* Workaround for MFW bug. ++ * MFW is not supposed to generate BW attention in ++ * single function mode. ++ */ ++ if (!IS_MF(bp)) { ++ DP(BNX2X_MSG_MCP, ++ "Ignoring MF BW config in single function mode\n"); ++ return; ++ } ++ + if (bp->link_vars.link_up) { + bnx2x_cmng_fns_init(bp, true, CMNG_FNS_MINMAX); + bnx2x_link_sync_notify(bp); +diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c +index 0d527fa5de61..b0592fd4135b 100644 +--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c ++++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c +@@ -226,11 +226,10 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) + * capabilities, use that knowledge to also configure the + * Reverse MII interface correctly. + */ +- if ((dev->phydev->supported & PHY_BASIC_FEATURES) == +- PHY_BASIC_FEATURES) +- port_ctrl = PORT_MODE_EXT_RVMII_25; +- else ++ if (dev->phydev->supported & PHY_1000BT_FEATURES) + port_ctrl = PORT_MODE_EXT_RVMII_50; ++ else ++ port_ctrl = PORT_MODE_EXT_RVMII_25; + bcmgenet_sys_writel(priv, port_ctrl, SYS_PORT_CTRL); + break; + +diff --git a/drivers/net/ethernet/broadcom/sb1250-mac.c b/drivers/net/ethernet/broadcom/sb1250-mac.c +index ef4a0c326736..7e3f9642ba6c 100644 +--- a/drivers/net/ethernet/broadcom/sb1250-mac.c ++++ b/drivers/net/ethernet/broadcom/sb1250-mac.c +@@ -299,7 +299,7 @@ static enum sbmac_state sbmac_set_channel_state(struct sbmac_softc *, + static void sbmac_promiscuous_mode(struct sbmac_softc *sc, int onoff); + static uint64_t sbmac_addr2reg(unsigned char *ptr); + static irqreturn_t sbmac_intr(int irq, void *dev_instance); +-static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev); ++static netdev_tx_t sbmac_start_tx(struct sk_buff *skb, struct net_device *dev); + static void sbmac_setmulti(struct sbmac_softc *sc); + static int sbmac_init(struct platform_device *pldev, long long base); + static int sbmac_set_speed(struct sbmac_softc *s, enum sbmac_speed speed); +@@ -2028,7 +2028,7 @@ static irqreturn_t sbmac_intr(int irq,void *dev_instance) + * Return value: + * nothing + ********************************************************************* */ +-static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) + { + struct sbmac_softc *sc = netdev_priv(dev); + unsigned long flags; +diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c +index 6fb13fa73b27..304e4b943627 100644 +--- a/drivers/net/ethernet/cavium/liquidio/lio_main.c ++++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c +@@ -2324,7 +2324,7 @@ static inline int send_nic_timestamp_pkt(struct octeon_device *oct, + * @returns whether the packet was transmitted to the device okay or not + * (NETDEV_TX_OK or NETDEV_TX_BUSY) + */ +-static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) ++static netdev_tx_t liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) + { + struct lio *lio; + struct octnet_buf_free_info *finfo; +diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +index b77835724dc8..d83773bc0dd7 100644 +--- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c ++++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +@@ -1390,7 +1390,7 @@ static int send_nic_timestamp_pkt(struct octeon_device *oct, + * @returns whether the packet was transmitted to the device okay or not + * (NETDEV_TX_OK or NETDEV_TX_BUSY) + */ +-static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) ++static netdev_tx_t liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) + { + struct octnet_buf_free_info *finfo; + union octnic_cmd_setup cmdsetup; +diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c +index c99b59fe4c8f..a1bda1683ebf 100644 +--- a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c ++++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c +@@ -31,7 +31,8 @@ + + static int lio_vf_rep_open(struct net_device *ndev); + static int lio_vf_rep_stop(struct net_device *ndev); +-static int lio_vf_rep_pkt_xmit(struct sk_buff *skb, struct net_device *ndev); ++static netdev_tx_t lio_vf_rep_pkt_xmit(struct sk_buff *skb, ++ struct net_device *ndev); + static void lio_vf_rep_tx_timeout(struct net_device *netdev); + static int lio_vf_rep_phys_port_name(struct net_device *dev, + char *buf, size_t len); +@@ -382,7 +383,7 @@ lio_vf_rep_packet_sent_callback(struct octeon_device *oct, + netif_wake_queue(ndev); + } + +-static int ++static netdev_tx_t + lio_vf_rep_pkt_xmit(struct sk_buff *skb, struct net_device *ndev) + { + struct lio_vf_rep_desc *vf_rep = netdev_priv(ndev); +diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_device.c b/drivers/net/ethernet/cavium/liquidio/octeon_device.c +index f878a552fef3..d0ed6c4f9e1a 100644 +--- a/drivers/net/ethernet/cavium/liquidio/octeon_device.c ++++ b/drivers/net/ethernet/cavium/liquidio/octeon_device.c +@@ -1450,8 +1450,9 @@ void lio_enable_irq(struct octeon_droq *droq, struct octeon_instr_queue *iq) + } + if (iq) { + spin_lock_bh(&iq->lock); +- writel(iq->pkt_in_done, iq->inst_cnt_reg); +- iq->pkt_in_done = 0; ++ writel(iq->pkts_processed, iq->inst_cnt_reg); ++ iq->pkt_in_done -= iq->pkts_processed; ++ iq->pkts_processed = 0; + /* this write needs to be flushed before we release the lock */ + mmiowb(); + spin_unlock_bh(&iq->lock); +diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_iq.h b/drivers/net/ethernet/cavium/liquidio/octeon_iq.h +index 2327062e8af6..aecd0d36d634 100644 +--- a/drivers/net/ethernet/cavium/liquidio/octeon_iq.h ++++ b/drivers/net/ethernet/cavium/liquidio/octeon_iq.h +@@ -94,6 +94,8 @@ struct octeon_instr_queue { + + u32 pkt_in_done; + ++ u32 pkts_processed; ++ + /** A spinlock to protect access to the input ring.*/ + spinlock_t iq_flush_running_lock; + +diff --git a/drivers/net/ethernet/cavium/liquidio/request_manager.c b/drivers/net/ethernet/cavium/liquidio/request_manager.c +index 3deb3c07681f..1d9ab7f4a2fe 100644 +--- a/drivers/net/ethernet/cavium/liquidio/request_manager.c ++++ b/drivers/net/ethernet/cavium/liquidio/request_manager.c +@@ -123,6 +123,7 @@ int octeon_init_instr_queue(struct octeon_device *oct, + iq->do_auto_flush = 1; + iq->db_timeout = (u32)conf->db_timeout; + atomic_set(&iq->instr_pending, 0); ++ iq->pkts_processed = 0; + + /* Initialize the spinlock for this instruction queue */ + spin_lock_init(&iq->lock); +@@ -497,6 +498,7 @@ octeon_flush_iq(struct octeon_device *oct, struct octeon_instr_queue *iq, + lio_process_iq_request_list(oct, iq, 0); + + if (inst_processed) { ++ iq->pkts_processed += inst_processed; + atomic_sub(inst_processed, &iq->instr_pending); + iq->stats.instr_processed += inst_processed; + } +diff --git a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c +index 592fb9e847b9..0957e735cdc4 100644 +--- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c ++++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c +@@ -1268,12 +1268,13 @@ static int octeon_mgmt_stop(struct net_device *netdev) + return 0; + } + +-static int octeon_mgmt_xmit(struct sk_buff *skb, struct net_device *netdev) ++static netdev_tx_t ++octeon_mgmt_xmit(struct sk_buff *skb, struct net_device *netdev) + { + struct octeon_mgmt *p = netdev_priv(netdev); + union mgmt_port_ring_entry re; + unsigned long flags; +- int rv = NETDEV_TX_BUSY; ++ netdev_tx_t rv = NETDEV_TX_BUSY; + + re.d64 = 0; + re.s.tstamp = ((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) != 0); +diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +index 5fe5d16dee72..8350c0c9b89d 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +@@ -3889,7 +3889,7 @@ int t4_fwcache(struct adapter *adap, enum fw_params_param_dev_fwcache op) + c.param[0].mnem = + cpu_to_be32(FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DEV) | + FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DEV_FWCACHE)); +- c.param[0].val = (__force __be32)op; ++ c.param[0].val = cpu_to_be32(op); + + return t4_wr_mbox(adap, adap->mbox, &c, sizeof(c), NULL); + } +diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c +index dfd1ad0b1cb9..4af78de0e077 100644 +--- a/drivers/net/ethernet/cortina/gemini.c ++++ b/drivers/net/ethernet/cortina/gemini.c +@@ -2530,6 +2530,7 @@ static int gemini_ethernet_port_remove(struct platform_device *pdev) + struct gemini_ethernet_port *port = platform_get_drvdata(pdev); + + gemini_port_remove(port); ++ free_netdev(port->netdev); + return 0; + } + +diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c +index f6ed889bc36a..e4fc38cbe853 100644 +--- a/drivers/net/ethernet/faraday/ftgmac100.c ++++ b/drivers/net/ethernet/faraday/ftgmac100.c +@@ -712,8 +712,8 @@ static bool ftgmac100_prep_tx_csum(struct sk_buff *skb, u32 *csum_vlan) + return skb_checksum_help(skb) == 0; + } + +-static int ftgmac100_hard_start_xmit(struct sk_buff *skb, +- struct net_device *netdev) ++static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb, ++ struct net_device *netdev) + { + struct ftgmac100 *priv = netdev_priv(netdev); + struct ftgmac100_txdes *txdes, *first; +diff --git a/drivers/net/ethernet/faraday/ftmac100.c b/drivers/net/ethernet/faraday/ftmac100.c +index 9015bd911bee..084f24daf2b5 100644 +--- a/drivers/net/ethernet/faraday/ftmac100.c ++++ b/drivers/net/ethernet/faraday/ftmac100.c +@@ -634,8 +634,8 @@ static void ftmac100_tx_complete(struct ftmac100 *priv) + ; + } + +-static int ftmac100_xmit(struct ftmac100 *priv, struct sk_buff *skb, +- dma_addr_t map) ++static netdev_tx_t ftmac100_xmit(struct ftmac100 *priv, struct sk_buff *skb, ++ dma_addr_t map) + { + struct net_device *netdev = priv->netdev; + struct ftmac100_txdes *txdes; +@@ -1015,7 +1015,8 @@ static int ftmac100_stop(struct net_device *netdev) + return 0; + } + +-static int ftmac100_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev) ++static netdev_tx_t ++ftmac100_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev) + { + struct ftmac100 *priv = netdev_priv(netdev); + dma_addr_t map; +diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +index d7915cd68dc1..462bb8c4f80c 100644 +--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c ++++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +@@ -2046,7 +2046,8 @@ static inline int dpaa_xmit(struct dpaa_priv *priv, + return 0; + } + +-static int dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev) ++static netdev_tx_t ++dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev) + { + const int queue_mapping = skb_get_queue_mapping(skb); + bool nonlinear = skb_is_nonlinear(skb); +diff --git a/drivers/net/ethernet/freescale/fec_mpc52xx.c b/drivers/net/ethernet/freescale/fec_mpc52xx.c +index 6d7269d87a85..b90bab72efdb 100644 +--- a/drivers/net/ethernet/freescale/fec_mpc52xx.c ++++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c +@@ -305,7 +305,8 @@ static int mpc52xx_fec_close(struct net_device *dev) + * invariant will hold if you make sure that the netif_*_queue() + * calls are done at the proper times. + */ +-static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct mpc52xx_fec_priv *priv = netdev_priv(dev); + struct bcom_fec_bd *bd; +diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c +index 2c2976a2dda6..7c548ed535da 100644 +--- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c ++++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c +@@ -481,7 +481,8 @@ static struct sk_buff *tx_skb_align_workaround(struct net_device *dev, + } + #endif + +-static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct fs_enet_private *fep = netdev_priv(dev); + cbd_t __iomem *bdp; +diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c +index f27f9bae1a4a..c97c4edfa31b 100644 +--- a/drivers/net/ethernet/freescale/gianfar.c ++++ b/drivers/net/ethernet/freescale/gianfar.c +@@ -112,7 +112,7 @@ + const char gfar_driver_version[] = "2.0"; + + static int gfar_enet_open(struct net_device *dev); +-static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev); ++static netdev_tx_t gfar_start_xmit(struct sk_buff *skb, struct net_device *dev); + static void gfar_reset_task(struct work_struct *work); + static void gfar_timeout(struct net_device *dev); + static int gfar_close(struct net_device *dev); +@@ -2334,7 +2334,7 @@ static inline bool gfar_csum_errata_76(struct gfar_private *priv, + /* This is called by the kernel when a frame is ready for transmission. + * It is pointed to by the dev->hard_start_xmit function pointer + */ +-static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct gfar_private *priv = netdev_priv(dev); + struct gfar_priv_tx_q *tx_queue = NULL; +diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c +index 1e2b53a934fb..a5bf02ae4bc5 100644 +--- a/drivers/net/ethernet/freescale/ucc_geth.c ++++ b/drivers/net/ethernet/freescale/ucc_geth.c +@@ -3085,7 +3085,8 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) + + /* This is called by the kernel when a frame is ready for transmission. */ + /* It is pointed to by the dev->hard_start_xmit function pointer */ +-static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct ucc_geth_private *ugeth = netdev_priv(dev); + #ifdef CONFIG_UGETH_TX_ON_DEMAND +diff --git a/drivers/net/ethernet/hisilicon/hip04_eth.c b/drivers/net/ethernet/hisilicon/hip04_eth.c +index 644ad78d0051..e8936ae46add 100644 +--- a/drivers/net/ethernet/hisilicon/hip04_eth.c ++++ b/drivers/net/ethernet/hisilicon/hip04_eth.c +@@ -424,7 +424,8 @@ static void hip04_start_tx_timer(struct hip04_priv *priv) + ns, HRTIMER_MODE_REL); + } + +-static int hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev) ++static netdev_tx_t ++hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev) + { + struct hip04_priv *priv = netdev_priv(ndev); + struct net_device_stats *stats = &ndev->stats; +diff --git a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +index c5727003af8c..471805ea363b 100644 +--- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c ++++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +@@ -736,7 +736,7 @@ static int hix5hd2_fill_sg_desc(struct hix5hd2_priv *priv, + return 0; + } + +-static int hix5hd2_net_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t hix5hd2_net_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct hix5hd2_priv *priv = netdev_priv(dev); + struct hix5hd2_desc *desc; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +index 0594a6c3dccd..2097f92e14c5 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +@@ -29,8 +29,8 @@ static bool hnae3_client_match(enum hnae3_client_type client_type, + return false; + } + +-static void hnae3_set_client_init_flag(struct hnae3_client *client, +- struct hnae3_ae_dev *ae_dev, int inited) ++void hnae3_set_client_init_flag(struct hnae3_client *client, ++ struct hnae3_ae_dev *ae_dev, int inited) + { + switch (client->type) { + case HNAE3_CLIENT_KNIC: +@@ -46,6 +46,7 @@ static void hnae3_set_client_init_flag(struct hnae3_client *client, + break; + } + } ++EXPORT_SYMBOL(hnae3_set_client_init_flag); + + static int hnae3_get_client_init_flag(struct hnae3_client *client, + struct hnae3_ae_dev *ae_dev) +@@ -86,14 +87,11 @@ static int hnae3_match_n_instantiate(struct hnae3_client *client, + /* now, (un-)instantiate client by calling lower layer */ + if (is_reg) { + ret = ae_dev->ops->init_client_instance(client, ae_dev); +- if (ret) { ++ if (ret) + dev_err(&ae_dev->pdev->dev, + "fail to instantiate client, ret = %d\n", ret); +- return ret; +- } + +- hnae3_set_client_init_flag(client, ae_dev, 1); +- return 0; ++ return ret; + } + + if (hnae3_get_client_init_flag(client, ae_dev)) { +diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h +index 67befff0bfc5..f5c7fc9c5e5c 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h ++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h +@@ -521,4 +521,7 @@ void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo); + + void hnae3_unregister_client(struct hnae3_client *client); + int hnae3_register_client(struct hnae3_client *client); ++ ++void hnae3_set_client_init_flag(struct hnae3_client *client, ++ struct hnae3_ae_dev *ae_dev, int inited); + #endif +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +index 6a3c6b02a77c..0c34ea122358 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +@@ -100,41 +100,26 @@ static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode) + struct hnae3_handle *h = hns3_get_handle(ndev); + int ret; + +- if (!h->ae_algo->ops->start) +- return -EOPNOTSUPP; +- + ret = hns3_nic_reset_all_ring(h); + if (ret) + return ret; + +- ret = h->ae_algo->ops->start(h); +- if (ret) { +- netdev_err(ndev, +- "hns3_lb_up ae start return error: %d\n", ret); +- return ret; +- } +- + ret = hns3_lp_setup(ndev, loop_mode, true); + usleep_range(10000, 20000); + +- return ret; ++ return 0; + } + + static int hns3_lp_down(struct net_device *ndev, enum hnae3_loop loop_mode) + { +- struct hnae3_handle *h = hns3_get_handle(ndev); + int ret; + +- if (!h->ae_algo->ops->stop) +- return -EOPNOTSUPP; +- + ret = hns3_lp_setup(ndev, loop_mode, false); + if (ret) { + netdev_err(ndev, "lb_setup return error: %d\n", ret); + return ret; + } + +- h->ae_algo->ops->stop(h); + usleep_range(10000, 20000); + + return 0; +@@ -152,6 +137,7 @@ static void hns3_lp_setup_skb(struct sk_buff *skb) + packet = skb_put(skb, HNS3_NIC_LB_TEST_PACKET_SIZE); + + memcpy(ethh->h_dest, ndev->dev_addr, ETH_ALEN); ++ ethh->h_dest[5] += 0x1f; + eth_zero_addr(ethh->h_source); + ethh->h_proto = htons(ETH_P_ARP); + skb_reset_mac_header(skb); +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +index 89ca69fa2b97..b04df79f393f 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -2367,7 +2367,7 @@ static int hclge_get_mac_phy_link(struct hclge_dev *hdev) + mac_state = hclge_get_mac_link_status(hdev); + + if (hdev->hw.mac.phydev) { +- if (!genphy_read_status(hdev->hw.mac.phydev)) ++ if (hdev->hw.mac.phydev->state == PHY_RUNNING) + link_stat = mac_state & + hdev->hw.mac.phydev->link; + else +@@ -3666,6 +3666,8 @@ static int hclge_set_mac_loopback(struct hclge_dev *hdev, bool en) + /* 2 Then setup the loopback flag */ + loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en); + hnae3_set_bit(loop_en, HCLGE_MAC_APP_LP_B, en ? 1 : 0); ++ hnae3_set_bit(loop_en, HCLGE_MAC_TX_EN_B, en ? 1 : 0); ++ hnae3_set_bit(loop_en, HCLGE_MAC_RX_EN_B, en ? 1 : 0); + + req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en); + +@@ -3726,15 +3728,36 @@ static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en) + return -EIO; + } + ++ hclge_cfg_mac_mode(hdev, en); + return 0; + } + ++static int hclge_tqp_enable(struct hclge_dev *hdev, int tqp_id, ++ int stream_id, bool enable) ++{ ++ struct hclge_desc desc; ++ struct hclge_cfg_com_tqp_queue_cmd *req = ++ (struct hclge_cfg_com_tqp_queue_cmd *)desc.data; ++ int ret; ++ ++ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_COM_TQP_QUEUE, false); ++ req->tqp_id = cpu_to_le16(tqp_id & HCLGE_RING_ID_MASK); ++ req->stream_id = cpu_to_le16(stream_id); ++ req->enable |= enable << HCLGE_TQP_ENABLE_B; ++ ++ ret = hclge_cmd_send(&hdev->hw, &desc, 1); ++ if (ret) ++ dev_err(&hdev->pdev->dev, ++ "Tqp enable fail, status =%d.\n", ret); ++ return ret; ++} ++ + static int hclge_set_loopback(struct hnae3_handle *handle, + enum hnae3_loop loop_mode, bool en) + { + struct hclge_vport *vport = hclge_get_vport(handle); + struct hclge_dev *hdev = vport->back; +- int ret; ++ int i, ret; + + switch (loop_mode) { + case HNAE3_MAC_INTER_LOOP_MAC: +@@ -3750,27 +3773,13 @@ static int hclge_set_loopback(struct hnae3_handle *handle, + break; + } + +- return ret; +-} +- +-static int hclge_tqp_enable(struct hclge_dev *hdev, int tqp_id, +- int stream_id, bool enable) +-{ +- struct hclge_desc desc; +- struct hclge_cfg_com_tqp_queue_cmd *req = +- (struct hclge_cfg_com_tqp_queue_cmd *)desc.data; +- int ret; +- +- hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_COM_TQP_QUEUE, false); +- req->tqp_id = cpu_to_le16(tqp_id & HCLGE_RING_ID_MASK); +- req->stream_id = cpu_to_le16(stream_id); +- req->enable |= enable << HCLGE_TQP_ENABLE_B; ++ for (i = 0; i < vport->alloc_tqps; i++) { ++ ret = hclge_tqp_enable(hdev, i, 0, en); ++ if (ret) ++ return ret; ++ } + +- ret = hclge_cmd_send(&hdev->hw, &desc, 1); +- if (ret) +- dev_err(&hdev->pdev->dev, +- "Tqp enable fail, status =%d.\n", ret); +- return ret; ++ return 0; + } + + static void hclge_reset_tqp_stats(struct hnae3_handle *handle) +@@ -4374,7 +4383,7 @@ int hclge_add_mc_addr_common(struct hclge_vport *vport, + hnae3_set_bit(req.flags, HCLGE_MAC_VLAN_BIT0_EN_B, 1); + hnae3_set_bit(req.entry_type, HCLGE_MAC_VLAN_BIT0_EN_B, 0); + hnae3_set_bit(req.entry_type, HCLGE_MAC_VLAN_BIT1_EN_B, 1); +- hnae3_set_bit(req.mc_mac_en, HCLGE_MAC_VLAN_BIT0_EN_B, 0); ++ hnae3_set_bit(req.mc_mac_en, HCLGE_MAC_VLAN_BIT0_EN_B, 1); + hclge_prepare_mac_addr(&req, addr); + status = hclge_lookup_mac_vlan_tbl(vport, &req, desc, true); + if (!status) { +@@ -4441,7 +4450,7 @@ int hclge_rm_mc_addr_common(struct hclge_vport *vport, + hnae3_set_bit(req.flags, HCLGE_MAC_VLAN_BIT0_EN_B, 1); + hnae3_set_bit(req.entry_type, HCLGE_MAC_VLAN_BIT0_EN_B, 0); + hnae3_set_bit(req.entry_type, HCLGE_MAC_VLAN_BIT1_EN_B, 1); +- hnae3_set_bit(req.mc_mac_en, HCLGE_MAC_VLAN_BIT0_EN_B, 0); ++ hnae3_set_bit(req.mc_mac_en, HCLGE_MAC_VLAN_BIT0_EN_B, 1); + hclge_prepare_mac_addr(&req, addr); + status = hclge_lookup_mac_vlan_tbl(vport, &req, desc, true); + if (!status) { +@@ -4784,7 +4793,7 @@ static int hclge_set_vlan_filter_hw(struct hclge_dev *hdev, __be16 proto, + return -EINVAL; + } + +- for_each_set_bit(vport_idx, hdev->vlan_table[vlan_id], VLAN_N_VID) ++ for_each_set_bit(vport_idx, hdev->vlan_table[vlan_id], HCLGE_VPORT_NUM) + vport_num++; + + if ((is_kill && vport_num == 0) || (!is_kill && vport_num == 1)) +@@ -5467,26 +5476,31 @@ static int hclge_init_client_instance(struct hnae3_client *client, + vport->nic.client = client; + ret = client->ops->init_instance(&vport->nic); + if (ret) +- return ret; ++ goto clear_nic; + + ret = hclge_init_instance_hw(hdev); + if (ret) { + client->ops->uninit_instance(&vport->nic, + 0); +- return ret; ++ goto clear_nic; + } + ++ hnae3_set_client_init_flag(client, ae_dev, 1); ++ + if (hdev->roce_client && + hnae3_dev_roce_supported(hdev)) { + struct hnae3_client *rc = hdev->roce_client; + + ret = hclge_init_roce_base_info(vport); + if (ret) +- return ret; ++ goto clear_roce; + + ret = rc->ops->init_instance(&vport->roce); + if (ret) +- return ret; ++ goto clear_roce; ++ ++ hnae3_set_client_init_flag(hdev->roce_client, ++ ae_dev, 1); + } + + break; +@@ -5496,7 +5510,9 @@ static int hclge_init_client_instance(struct hnae3_client *client, + + ret = client->ops->init_instance(&vport->nic); + if (ret) +- return ret; ++ goto clear_nic; ++ ++ hnae3_set_client_init_flag(client, ae_dev, 1); + + break; + case HNAE3_CLIENT_ROCE: +@@ -5508,16 +5524,27 @@ static int hclge_init_client_instance(struct hnae3_client *client, + if (hdev->roce_client && hdev->nic_client) { + ret = hclge_init_roce_base_info(vport); + if (ret) +- return ret; ++ goto clear_roce; + + ret = client->ops->init_instance(&vport->roce); + if (ret) +- return ret; ++ goto clear_roce; ++ ++ hnae3_set_client_init_flag(client, ae_dev, 1); + } + } + } + + return 0; ++ ++clear_nic: ++ hdev->nic_client = NULL; ++ vport->nic.client = NULL; ++ return ret; ++clear_roce: ++ hdev->roce_client = NULL; ++ vport->roce.client = NULL; ++ return ret; + } + + static void hclge_uninit_client_instance(struct hnae3_client *client, +@@ -5537,7 +5564,7 @@ static void hclge_uninit_client_instance(struct hnae3_client *client, + } + if (client->type == HNAE3_CLIENT_ROCE) + return; +- if (client->ops->uninit_instance) { ++ if (hdev->nic_client && client->ops->uninit_instance) { + hclge_uninit_instance_hw(hdev); + client->ops->uninit_instance(&vport->nic, 0); + hdev->nic_client = NULL; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +index 11e9259ca040..0d45d045706c 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +@@ -298,7 +298,7 @@ static int hclge_tm_qs_to_pri_map_cfg(struct hclge_dev *hdev, + } + + static int hclge_tm_q_to_qs_map_cfg(struct hclge_dev *hdev, +- u8 q_id, u16 qs_id) ++ u16 q_id, u16 qs_id) + { + struct hclge_nq_to_qs_link_cmd *map; + struct hclge_desc desc; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c +index fb471fe2c494..d8c0cc8e04c9 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c +@@ -132,8 +132,8 @@ static int hclgevf_init_cmd_queue(struct hclgevf_dev *hdev, + reg_val |= HCLGEVF_NIC_CMQ_ENABLE; + hclgevf_write_dev(hw, HCLGEVF_NIC_CSQ_DEPTH_REG, reg_val); + +- hclgevf_write_dev(hw, HCLGEVF_NIC_CSQ_TAIL_REG, 0); + hclgevf_write_dev(hw, HCLGEVF_NIC_CSQ_HEAD_REG, 0); ++ hclgevf_write_dev(hw, HCLGEVF_NIC_CSQ_TAIL_REG, 0); + break; + case HCLGEVF_TYPE_CRQ: + reg_val = (u32)ring->desc_dma_addr; +@@ -145,8 +145,8 @@ static int hclgevf_init_cmd_queue(struct hclgevf_dev *hdev, + reg_val |= HCLGEVF_NIC_CMQ_ENABLE; + hclgevf_write_dev(hw, HCLGEVF_NIC_CRQ_DEPTH_REG, reg_val); + +- hclgevf_write_dev(hw, HCLGEVF_NIC_CRQ_TAIL_REG, 0); + hclgevf_write_dev(hw, HCLGEVF_NIC_CRQ_HEAD_REG, 0); ++ hclgevf_write_dev(hw, HCLGEVF_NIC_CRQ_TAIL_REG, 0); + break; + } + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +index 5570fb5dc2eb..beae1e2cd59b 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +@@ -1629,17 +1629,22 @@ static int hclgevf_init_client_instance(struct hnae3_client *client, + + ret = client->ops->init_instance(&hdev->nic); + if (ret) +- return ret; ++ goto clear_nic; ++ ++ hnae3_set_client_init_flag(client, ae_dev, 1); + + if (hdev->roce_client && hnae3_dev_roce_supported(hdev)) { + struct hnae3_client *rc = hdev->roce_client; + + ret = hclgevf_init_roce_base_info(hdev); + if (ret) +- return ret; ++ goto clear_roce; + ret = rc->ops->init_instance(&hdev->roce); + if (ret) +- return ret; ++ goto clear_roce; ++ ++ hnae3_set_client_init_flag(hdev->roce_client, ae_dev, ++ 1); + } + break; + case HNAE3_CLIENT_UNIC: +@@ -1648,7 +1653,9 @@ static int hclgevf_init_client_instance(struct hnae3_client *client, + + ret = client->ops->init_instance(&hdev->nic); + if (ret) +- return ret; ++ goto clear_nic; ++ ++ hnae3_set_client_init_flag(client, ae_dev, 1); + break; + case HNAE3_CLIENT_ROCE: + if (hnae3_dev_roce_supported(hdev)) { +@@ -1659,15 +1666,26 @@ static int hclgevf_init_client_instance(struct hnae3_client *client, + if (hdev->roce_client && hdev->nic_client) { + ret = hclgevf_init_roce_base_info(hdev); + if (ret) +- return ret; ++ goto clear_roce; + + ret = client->ops->init_instance(&hdev->roce); + if (ret) +- return ret; ++ goto clear_roce; + } ++ ++ hnae3_set_client_init_flag(client, ae_dev, 1); + } + + return 0; ++ ++clear_nic: ++ hdev->nic_client = NULL; ++ hdev->nic.client = NULL; ++ return ret; ++clear_roce: ++ hdev->roce_client = NULL; ++ hdev->roce.client = NULL; ++ return ret; + } + + static void hclgevf_uninit_client_instance(struct hnae3_client *client, +@@ -1676,13 +1694,19 @@ static void hclgevf_uninit_client_instance(struct hnae3_client *client, + struct hclgevf_dev *hdev = ae_dev->priv; + + /* un-init roce, if it exists */ +- if (hdev->roce_client) ++ if (hdev->roce_client) { + hdev->roce_client->ops->uninit_instance(&hdev->roce, 0); ++ hdev->roce_client = NULL; ++ hdev->roce.client = NULL; ++ } + + /* un-init nic/unic, if this was not called by roce client */ +- if ((client->ops->uninit_instance) && +- (client->type != HNAE3_CLIENT_ROCE)) ++ if (client->ops->uninit_instance && hdev->nic_client && ++ client->type != HNAE3_CLIENT_ROCE) { + client->ops->uninit_instance(&hdev->nic, 0); ++ hdev->nic_client = NULL; ++ hdev->nic.client = NULL; ++ } + } + + static int hclgevf_pci_init(struct hclgevf_dev *hdev) +diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c +index 506f78322d74..e8ee69d4e4d3 100644 +--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c ++++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c +@@ -2027,7 +2027,7 @@ static void ehea_xmit3(struct sk_buff *skb, struct net_device *dev, + dev_consume_skb_any(skb); + } + +-static int ehea_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ehea_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct ehea_port *port = netdev_priv(dev); + struct ehea_swqe *swqe; +diff --git a/drivers/net/ethernet/ibm/emac/core.c b/drivers/net/ethernet/ibm/emac/core.c +index 129f4e9f38da..a96f501813ff 100644 +--- a/drivers/net/ethernet/ibm/emac/core.c ++++ b/drivers/net/ethernet/ibm/emac/core.c +@@ -1409,7 +1409,7 @@ static inline u16 emac_tx_csum(struct emac_instance *dev, + return 0; + } + +-static inline int emac_xmit_finish(struct emac_instance *dev, int len) ++static inline netdev_tx_t emac_xmit_finish(struct emac_instance *dev, int len) + { + struct emac_regs __iomem *p = dev->emacp; + struct net_device *ndev = dev->ndev; +@@ -1436,7 +1436,7 @@ static inline int emac_xmit_finish(struct emac_instance *dev, int len) + } + + /* Tx lock BH */ +-static int emac_start_xmit(struct sk_buff *skb, struct net_device *ndev) ++static netdev_tx_t emac_start_xmit(struct sk_buff *skb, struct net_device *ndev) + { + struct emac_instance *dev = netdev_priv(ndev); + unsigned int len = skb->len; +@@ -1494,7 +1494,8 @@ static inline int emac_xmit_split(struct emac_instance *dev, int slot, + } + + /* Tx lock BH disabled (SG version for TAH equipped EMACs) */ +-static int emac_start_xmit_sg(struct sk_buff *skb, struct net_device *ndev) ++static netdev_tx_t ++emac_start_xmit_sg(struct sk_buff *skb, struct net_device *ndev) + { + struct emac_instance *dev = netdev_priv(ndev); + int nr_frags = skb_shinfo(skb)->nr_frags; +diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c +index 8fa14736449b..8a1916443235 100644 +--- a/drivers/net/ethernet/ibm/ibmvnic.c ++++ b/drivers/net/ethernet/ibm/ibmvnic.c +@@ -1420,7 +1420,7 @@ static int ibmvnic_xmit_workarounds(struct sk_buff *skb, + return 0; + } + +-static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) ++static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) + { + struct ibmvnic_adapter *adapter = netdev_priv(netdev); + int queue_num = skb_get_queue_mapping(skb); +@@ -1444,7 +1444,7 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) + u64 *handle_array; + int index = 0; + u8 proto = 0; +- int ret = 0; ++ netdev_tx_t ret = NETDEV_TX_OK; + + if (adapter->resetting) { + if (!netif_subqueue_stopped(netdev, skb)) +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index 055562c930fb..1a66373184d6 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -6587,6 +6587,24 @@ static i40e_status i40e_force_link_state(struct i40e_pf *pf, bool is_up) + struct i40e_hw *hw = &pf->hw; + i40e_status err; + u64 mask; ++ u8 speed; ++ ++ /* Card might've been put in an unstable state by other drivers ++ * and applications, which causes incorrect speed values being ++ * set on startup. In order to clear speed registers, we call ++ * get_phy_capabilities twice, once to get initial state of ++ * available speeds, and once to get current PHY config. ++ */ ++ err = i40e_aq_get_phy_capabilities(hw, false, true, &abilities, ++ NULL); ++ if (err) { ++ dev_err(&pf->pdev->dev, ++ "failed to get phy cap., ret = %s last_status = %s\n", ++ i40e_stat_str(hw, err), ++ i40e_aq_str(hw, hw->aq.asq_last_status)); ++ return err; ++ } ++ speed = abilities.link_speed; + + /* Get the current phy config */ + err = i40e_aq_get_phy_capabilities(hw, false, false, &abilities, +@@ -6600,9 +6618,9 @@ static i40e_status i40e_force_link_state(struct i40e_pf *pf, bool is_up) + } + + /* If link needs to go up, but was not forced to go down, +- * no need for a flap ++ * and its speed values are OK, no need for a flap + */ +- if (is_up && abilities.phy_type != 0) ++ if (is_up && abilities.phy_type != 0 && abilities.link_speed != 0) + return I40E_SUCCESS; + + /* To force link we need to set bits for all supported PHY types, +@@ -6614,7 +6632,10 @@ static i40e_status i40e_force_link_state(struct i40e_pf *pf, bool is_up) + config.phy_type_ext = is_up ? (u8)((mask >> 32) & 0xff) : 0; + /* Copy the old settings, except of phy_type */ + config.abilities = abilities.abilities; +- config.link_speed = abilities.link_speed; ++ if (abilities.link_speed != 0) ++ config.link_speed = abilities.link_speed; ++ else ++ config.link_speed = speed; + config.eee_capability = abilities.eee_capability; + config.eeer = abilities.eeer_val; + config.low_power_ctrl = abilities.d3_lpan; +@@ -14187,6 +14208,7 @@ static void i40e_remove(struct pci_dev *pdev) + mutex_destroy(&hw->aq.asq_mutex); + + /* Clear all dynamic memory lists of rings, q_vectors, and VSIs */ ++ rtnl_lock(); + i40e_clear_interrupt_scheme(pf); + for (i = 0; i < pf->num_alloc_vsi; i++) { + if (pf->vsi[i]) { +@@ -14195,6 +14217,7 @@ static void i40e_remove(struct pci_dev *pdev) + pf->vsi[i] = NULL; + } + } ++ rtnl_unlock(); + + for (i = 0; i < I40E_MAX_VEB; i++) { + kfree(pf->veb[i]); +@@ -14406,7 +14429,13 @@ static void i40e_shutdown(struct pci_dev *pdev) + wr32(hw, I40E_PFPM_WUFC, + (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); + ++ /* Since we're going to destroy queues during the ++ * i40e_clear_interrupt_scheme() we should hold the RTNL lock for this ++ * whole section ++ */ ++ rtnl_lock(); + i40e_clear_interrupt_scheme(pf); ++ rtnl_unlock(); + + if (system_state == SYSTEM_POWER_OFF) { + pci_wake_from_d3(pdev, pf->wol_en); +diff --git a/drivers/net/ethernet/intel/i40e/i40e_ptp.c b/drivers/net/ethernet/intel/i40e/i40e_ptp.c +index 35f2866b38c6..1199f0502d6d 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_ptp.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_ptp.c +@@ -694,7 +694,8 @@ static long i40e_ptp_create_clock(struct i40e_pf *pf) + if (!IS_ERR_OR_NULL(pf->ptp_clock)) + return 0; + +- strncpy(pf->ptp_caps.name, i40e_driver_name, sizeof(pf->ptp_caps.name)); ++ strncpy(pf->ptp_caps.name, i40e_driver_name, ++ sizeof(pf->ptp_caps.name) - 1); + pf->ptp_caps.owner = THIS_MODULE; + pf->ptp_caps.max_adj = 999999999; + pf->ptp_caps.n_ext_ts = 0; +diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +index d86f3fa7aa6a..46a71d289bca 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +@@ -2571,6 +2571,16 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg, u16 msglen) + ret = I40E_ERR_INVALID_MAC_ADDR; + goto error_param; + } ++ ++ if (vf->pf_set_mac && ++ ether_addr_equal(al->list[i].addr, ++ vf->default_lan_addr.addr)) { ++ dev_err(&pf->pdev->dev, ++ "MAC addr %pM has been set by PF, cannot delete it for VF %d, reset VF to change MAC addr\n", ++ vf->default_lan_addr.addr, vf->vf_id); ++ ret = I40E_ERR_PARAM; ++ goto error_param; ++ } + } + vsi = pf->vsi[vf->lan_vsi_idx]; + +diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c +index fef6d892ed4c..f50c19b83368 100644 +--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c ++++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c +@@ -3097,18 +3097,19 @@ static int i40evf_set_features(struct net_device *netdev, + { + struct i40evf_adapter *adapter = netdev_priv(netdev); + +- /* Don't allow changing VLAN_RX flag when VLAN is set for VF +- * and return an error in this case ++ /* Don't allow changing VLAN_RX flag when adapter is not capable ++ * of VLAN offload + */ +- if (VLAN_ALLOWED(adapter)) { ++ if (!VLAN_ALLOWED(adapter)) { ++ if ((netdev->features ^ features) & NETIF_F_HW_VLAN_CTAG_RX) ++ return -EINVAL; ++ } else if ((netdev->features ^ features) & NETIF_F_HW_VLAN_CTAG_RX) { + if (features & NETIF_F_HW_VLAN_CTAG_RX) + adapter->aq_required |= + I40EVF_FLAG_AQ_ENABLE_VLAN_STRIPPING; + else + adapter->aq_required |= + I40EVF_FLAG_AQ_DISABLE_VLAN_STRIPPING; +- } else if ((netdev->features ^ features) & NETIF_F_HW_VLAN_CTAG_RX) { +- return -EINVAL; + } + + return 0; +@@ -3332,6 +3333,8 @@ int i40evf_process_config(struct i40evf_adapter *adapter) + if (vfres->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) + netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; + ++ netdev->priv_flags |= IFF_UNICAST_FLT; ++ + /* Do not turn on offloads when they are requested to be turned off. + * TSO needs minimum 576 bytes to work correctly. + */ +@@ -3881,6 +3884,8 @@ static void i40evf_remove(struct pci_dev *pdev) + if (adapter->watchdog_timer.function) + del_timer_sync(&adapter->watchdog_timer); + ++ cancel_work_sync(&adapter->adminq_task); ++ + i40evf_free_rss(adapter); + + if (hw->aq.asq.count) +diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c b/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c +index 565677de5ba3..94dabc9d89f7 100644 +--- a/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c ++++ b/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c +@@ -153,6 +153,32 @@ int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter) + NULL, 0); + } + ++/** ++ * i40evf_validate_num_queues ++ * @adapter: adapter structure ++ * ++ * Validate that the number of queues the PF has sent in ++ * VIRTCHNL_OP_GET_VF_RESOURCES is not larger than the VF can handle. ++ **/ ++static void i40evf_validate_num_queues(struct i40evf_adapter *adapter) ++{ ++ if (adapter->vf_res->num_queue_pairs > I40EVF_MAX_REQ_QUEUES) { ++ struct virtchnl_vsi_resource *vsi_res; ++ int i; ++ ++ dev_info(&adapter->pdev->dev, "Received %d queues, but can only have a max of %d\n", ++ adapter->vf_res->num_queue_pairs, ++ I40EVF_MAX_REQ_QUEUES); ++ dev_info(&adapter->pdev->dev, "Fixing by reducing queues to %d\n", ++ I40EVF_MAX_REQ_QUEUES); ++ adapter->vf_res->num_queue_pairs = I40EVF_MAX_REQ_QUEUES; ++ for (i = 0; i < adapter->vf_res->num_vsis; i++) { ++ vsi_res = &adapter->vf_res->vsi_res[i]; ++ vsi_res->num_queue_pairs = I40EVF_MAX_REQ_QUEUES; ++ } ++ } ++} ++ + /** + * i40evf_get_vf_config + * @adapter: private adapter structure +@@ -195,6 +221,11 @@ int i40evf_get_vf_config(struct i40evf_adapter *adapter) + err = (i40e_status)le32_to_cpu(event.desc.cookie_low); + memcpy(adapter->vf_res, event.msg_buf, min(event.msg_len, len)); + ++ /* some PFs send more queues than we should have so validate that ++ * we aren't getting too many queues ++ */ ++ if (!err) ++ i40evf_validate_num_queues(adapter); + i40e_vf_parse_hw_config(hw, adapter->vf_res); + out_alloc: + kfree(event.msg_buf); +@@ -1329,6 +1360,7 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter, + I40E_MAX_VF_VSI * + sizeof(struct virtchnl_vsi_resource); + memcpy(adapter->vf_res, msg, min(msglen, len)); ++ i40evf_validate_num_queues(adapter); + i40e_vf_parse_hw_config(&adapter->hw, adapter->vf_res); + /* restore current mac address */ + ether_addr_copy(adapter->hw.mac.addr, netdev->dev_addr); +diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c +index 661beea6af79..f8d00263d901 100644 +--- a/drivers/net/ethernet/intel/ice/ice_common.c ++++ b/drivers/net/ethernet/intel/ice/ice_common.c +@@ -904,7 +904,22 @@ enum ice_status ice_aq_q_shutdown(struct ice_hw *hw, bool unloading) + * @timeout: the maximum time in ms that the driver may hold the resource + * @cd: pointer to command details structure or NULL + * +- * requests common resource using the admin queue commands (0x0008) ++ * Requests common resource using the admin queue commands (0x0008). ++ * When attempting to acquire the Global Config Lock, the driver can ++ * learn of three states: ++ * 1) ICE_SUCCESS - acquired lock, and can perform download package ++ * 2) ICE_ERR_AQ_ERROR - did not get lock, driver should fail to load ++ * 3) ICE_ERR_AQ_NO_WORK - did not get lock, but another driver has ++ * successfully downloaded the package; the driver does ++ * not have to download the package and can continue ++ * loading ++ * ++ * Note that if the caller is in an acquire lock, perform action, release lock ++ * phase of operation, it is possible that the FW may detect a timeout and issue ++ * a CORER. In this case, the driver will receive a CORER interrupt and will ++ * have to determine its cause. The calling thread that is handling this flow ++ * will likely get an error propagated back to it indicating the Download ++ * Package, Update Package or the Release Resource AQ commands timed out. + */ + static enum ice_status + ice_aq_req_res(struct ice_hw *hw, enum ice_aq_res_ids res, +@@ -922,13 +937,43 @@ ice_aq_req_res(struct ice_hw *hw, enum ice_aq_res_ids res, + cmd_resp->res_id = cpu_to_le16(res); + cmd_resp->access_type = cpu_to_le16(access); + cmd_resp->res_number = cpu_to_le32(sdp_number); ++ cmd_resp->timeout = cpu_to_le32(*timeout); ++ *timeout = 0; + + status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd); ++ + /* The completion specifies the maximum time in ms that the driver + * may hold the resource in the Timeout field. +- * If the resource is held by someone else, the command completes with +- * busy return value and the timeout field indicates the maximum time +- * the current owner of the resource has to free it. ++ */ ++ ++ /* Global config lock response utilizes an additional status field. ++ * ++ * If the Global config lock resource is held by some other driver, the ++ * command completes with ICE_AQ_RES_GLBL_IN_PROG in the status field ++ * and the timeout field indicates the maximum time the current owner ++ * of the resource has to free it. ++ */ ++ if (res == ICE_GLOBAL_CFG_LOCK_RES_ID) { ++ if (le16_to_cpu(cmd_resp->status) == ICE_AQ_RES_GLBL_SUCCESS) { ++ *timeout = le32_to_cpu(cmd_resp->timeout); ++ return 0; ++ } else if (le16_to_cpu(cmd_resp->status) == ++ ICE_AQ_RES_GLBL_IN_PROG) { ++ *timeout = le32_to_cpu(cmd_resp->timeout); ++ return ICE_ERR_AQ_ERROR; ++ } else if (le16_to_cpu(cmd_resp->status) == ++ ICE_AQ_RES_GLBL_DONE) { ++ return ICE_ERR_AQ_NO_WORK; ++ } ++ ++ /* invalid FW response, force a timeout immediately */ ++ *timeout = 0; ++ return ICE_ERR_AQ_ERROR; ++ } ++ ++ /* If the resource is held by some other driver, the command completes ++ * with a busy return value and the timeout field indicates the maximum ++ * time the current owner of the resource has to free it. + */ + if (!status || hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY) + *timeout = le32_to_cpu(cmd_resp->timeout); +@@ -967,30 +1012,28 @@ ice_aq_release_res(struct ice_hw *hw, enum ice_aq_res_ids res, u8 sdp_number, + * @hw: pointer to the HW structure + * @res: resource id + * @access: access type (read or write) ++ * @timeout: timeout in milliseconds + * + * This function will attempt to acquire the ownership of a resource. + */ + enum ice_status + ice_acquire_res(struct ice_hw *hw, enum ice_aq_res_ids res, +- enum ice_aq_res_access_type access) ++ enum ice_aq_res_access_type access, u32 timeout) + { + #define ICE_RES_POLLING_DELAY_MS 10 + u32 delay = ICE_RES_POLLING_DELAY_MS; ++ u32 time_left = timeout; + enum ice_status status; +- u32 time_left = 0; +- u32 timeout; + + status = ice_aq_req_res(hw, res, access, 0, &time_left, NULL); + +- /* An admin queue return code of ICE_AQ_RC_EEXIST means that another +- * driver has previously acquired the resource and performed any +- * necessary updates; in this case the caller does not obtain the +- * resource and has no further work to do. ++ /* A return code of ICE_ERR_AQ_NO_WORK means that another driver has ++ * previously acquired the resource and performed any necessary updates; ++ * in this case the caller does not obtain the resource and has no ++ * further work to do. + */ +- if (hw->adminq.sq_last_status == ICE_AQ_RC_EEXIST) { +- status = ICE_ERR_AQ_NO_WORK; ++ if (status == ICE_ERR_AQ_NO_WORK) + goto ice_acquire_res_exit; +- } + + if (status) + ice_debug(hw, ICE_DBG_RES, +@@ -1003,11 +1046,9 @@ ice_acquire_res(struct ice_hw *hw, enum ice_aq_res_ids res, + timeout = (timeout > delay) ? timeout - delay : 0; + status = ice_aq_req_res(hw, res, access, 0, &time_left, NULL); + +- if (hw->adminq.sq_last_status == ICE_AQ_RC_EEXIST) { ++ if (status == ICE_ERR_AQ_NO_WORK) + /* lock free, but no work to do */ +- status = ICE_ERR_AQ_NO_WORK; + break; +- } + + if (!status) + /* lock acquired */ +diff --git a/drivers/net/ethernet/intel/ice/ice_common.h b/drivers/net/ethernet/intel/ice/ice_common.h +index 9a5519130af1..6455b6952ec8 100644 +--- a/drivers/net/ethernet/intel/ice/ice_common.h ++++ b/drivers/net/ethernet/intel/ice/ice_common.h +@@ -23,7 +23,7 @@ enum ice_status + ice_get_link_status(struct ice_port_info *pi, bool *link_up); + enum ice_status + ice_acquire_res(struct ice_hw *hw, enum ice_aq_res_ids res, +- enum ice_aq_res_access_type access); ++ enum ice_aq_res_access_type access, u32 timeout); + void ice_release_res(struct ice_hw *hw, enum ice_aq_res_ids res); + enum ice_status ice_init_nvm(struct ice_hw *hw); + enum ice_status +diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.c b/drivers/net/ethernet/intel/ice/ice_controlq.c +index e783976c401d..89f18fe18fe3 100644 +--- a/drivers/net/ethernet/intel/ice/ice_controlq.c ++++ b/drivers/net/ethernet/intel/ice/ice_controlq.c +@@ -814,6 +814,9 @@ ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq, + u16 retval = 0; + u32 val = 0; + ++ /* if reset is in progress return a soft error */ ++ if (hw->reset_ongoing) ++ return ICE_ERR_RESET_ONGOING; + mutex_lock(&cq->sq_lock); + + cq->sq_last_status = ICE_AQ_RC_OK; +diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c +index 875f97aba6e0..00c833cd2b3a 100644 +--- a/drivers/net/ethernet/intel/ice/ice_main.c ++++ b/drivers/net/ethernet/intel/ice/ice_main.c +@@ -7,7 +7,7 @@ + + #include "ice.h" + +-#define DRV_VERSION "ice-0.7.0-k" ++#define DRV_VERSION "0.7.1-k" + #define DRV_SUMMARY "Intel(R) Ethernet Connection E800 Series Linux Driver" + const char ice_drv_ver[] = DRV_VERSION; + static const char ice_driver_string[] = DRV_SUMMARY; +@@ -535,10 +535,13 @@ static void ice_reset_subtask(struct ice_pf *pf) + ice_prepare_for_reset(pf); + + /* make sure we are ready to rebuild */ +- if (ice_check_reset(&pf->hw)) ++ if (ice_check_reset(&pf->hw)) { + set_bit(__ICE_RESET_FAILED, pf->state); +- else ++ } else { ++ /* done with reset. start rebuild */ ++ pf->hw.reset_ongoing = false; + ice_rebuild(pf); ++ } + clear_bit(__ICE_RESET_RECOVERY_PENDING, pf->state); + goto unlock; + } +@@ -1757,7 +1760,8 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) + * We also make note of which reset happened so that peer + * devices/drivers can be informed. + */ +- if (!test_bit(__ICE_RESET_RECOVERY_PENDING, pf->state)) { ++ if (!test_and_set_bit(__ICE_RESET_RECOVERY_PENDING, ++ pf->state)) { + if (reset == ICE_RESET_CORER) + set_bit(__ICE_CORER_RECV, pf->state); + else if (reset == ICE_RESET_GLOBR) +@@ -1765,7 +1769,20 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) + else + set_bit(__ICE_EMPR_RECV, pf->state); + +- set_bit(__ICE_RESET_RECOVERY_PENDING, pf->state); ++ /* There are couple of different bits at play here. ++ * hw->reset_ongoing indicates whether the hardware is ++ * in reset. This is set to true when a reset interrupt ++ * is received and set back to false after the driver ++ * has determined that the hardware is out of reset. ++ * ++ * __ICE_RESET_RECOVERY_PENDING in pf->state indicates ++ * that a post reset rebuild is required before the ++ * driver is operational again. This is set above. ++ * ++ * As this is the start of the reset/rebuild cycle, set ++ * both to indicate that. ++ */ ++ hw->reset_ongoing = true; + } + } + +@@ -4188,7 +4205,14 @@ static int ice_vsi_stop_tx_rings(struct ice_vsi *vsi) + } + status = ice_dis_vsi_txq(vsi->port_info, vsi->num_txq, q_ids, q_teids, + NULL); +- if (status) { ++ /* if the disable queue command was exercised during an active reset ++ * flow, ICE_ERR_RESET_ONGOING is returned. This is not an error as ++ * the reset operation disables queues at the hardware level anyway. ++ */ ++ if (status == ICE_ERR_RESET_ONGOING) { ++ dev_dbg(&pf->pdev->dev, ++ "Reset in progress. LAN Tx queues already disabled\n"); ++ } else if (status) { + dev_err(&pf->pdev->dev, + "Failed to disable LAN Tx queues, error: %d\n", + status); +diff --git a/drivers/net/ethernet/intel/ice/ice_nvm.c b/drivers/net/ethernet/intel/ice/ice_nvm.c +index 295a8cd87fc1..3274c543283c 100644 +--- a/drivers/net/ethernet/intel/ice/ice_nvm.c ++++ b/drivers/net/ethernet/intel/ice/ice_nvm.c +@@ -137,7 +137,7 @@ ice_acquire_nvm(struct ice_hw *hw, enum ice_aq_res_access_type access) + if (hw->nvm.blank_nvm_mode) + return 0; + +- return ice_acquire_res(hw, ICE_NVM_RES_ID, access); ++ return ice_acquire_res(hw, ICE_NVM_RES_ID, access, ICE_NVM_TIMEOUT); + } + + /** +diff --git a/drivers/net/ethernet/intel/ice/ice_status.h b/drivers/net/ethernet/intel/ice/ice_status.h +index 9a95c4ffd7d7..d2dae913d81e 100644 +--- a/drivers/net/ethernet/intel/ice/ice_status.h ++++ b/drivers/net/ethernet/intel/ice/ice_status.h +@@ -20,6 +20,7 @@ enum ice_status { + ICE_ERR_ALREADY_EXISTS = -14, + ICE_ERR_DOES_NOT_EXIST = -15, + ICE_ERR_MAX_LIMIT = -17, ++ ICE_ERR_RESET_ONGOING = -18, + ICE_ERR_BUF_TOO_SHORT = -52, + ICE_ERR_NVM_BLANK_MODE = -53, + ICE_ERR_AQ_ERROR = -100, +diff --git a/drivers/net/ethernet/intel/ice/ice_type.h b/drivers/net/ethernet/intel/ice/ice_type.h +index ba11b5898833..5ca9d684429d 100644 +--- a/drivers/net/ethernet/intel/ice/ice_type.h ++++ b/drivers/net/ethernet/intel/ice/ice_type.h +@@ -34,10 +34,15 @@ static inline bool ice_is_tc_ena(u8 bitmap, u8 tc) + enum ice_aq_res_ids { + ICE_NVM_RES_ID = 1, + ICE_SPD_RES_ID, +- ICE_GLOBAL_CFG_LOCK_RES_ID, +- ICE_CHANGE_LOCK_RES_ID ++ ICE_CHANGE_LOCK_RES_ID, ++ ICE_GLOBAL_CFG_LOCK_RES_ID + }; + ++/* FW update timeout definitions are in milliseconds */ ++#define ICE_NVM_TIMEOUT 180000 ++#define ICE_CHANGE_LOCK_TIMEOUT 1000 ++#define ICE_GLOBAL_CFG_LOCK_TIMEOUT 3000 ++ + enum ice_aq_res_access_type { + ICE_RES_READ = 1, + ICE_RES_WRITE +@@ -288,6 +293,7 @@ struct ice_hw { + u8 sw_entry_point_layer; + + u8 evb_veb; /* true for VEB, false for VEPA */ ++ u8 reset_ongoing; /* true if hw is in reset, false otherwise */ + struct ice_bus_info bus; + struct ice_nvm_info nvm; + struct ice_hw_dev_caps dev_caps; /* device capabilities */ +diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c +index 28762314353f..4313bbb2396f 100644 +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -2394,7 +2394,7 @@ error: + } + + /* Main tx processing */ +-static int mvneta_tx(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t mvneta_tx(struct sk_buff *skb, struct net_device *dev) + { + struct mvneta_port *pp = netdev_priv(dev); + u16 txq_id = skb_get_queue_mapping(skb); +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h +index 67b9e81b7c02..46911b67b039 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h +@@ -253,7 +253,8 @@ + #define MVPP2_ISR_ENABLE_INTERRUPT(mask) ((mask) & 0xffff) + #define MVPP2_ISR_DISABLE_INTERRUPT(mask) (((mask) << 16) & 0xffff0000) + #define MVPP2_ISR_RX_TX_CAUSE_REG(port) (0x5480 + 4 * (port)) +-#define MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK 0xffff ++#define MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK(version) \ ++ ((version) == MVPP21 ? 0xffff : 0xff) + #define MVPP2_CAUSE_TXQ_OCCUP_DESC_ALL_MASK 0xff0000 + #define MVPP2_CAUSE_TXQ_OCCUP_DESC_ALL_OFFSET 16 + #define MVPP2_CAUSE_RX_FIFO_OVERRUN_MASK BIT(24) +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +index 9b608d23ff7e..1cc0e8fda4d5 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +@@ -908,7 +908,7 @@ static void mvpp2_interrupts_unmask(void *arg) + u32 val; + + val = MVPP2_CAUSE_MISC_SUM_MASK | +- MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK; ++ MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK(port->priv->hw_version); + if (port->has_tx_irqs) + val |= MVPP2_CAUSE_TXQ_OCCUP_DESC_ALL_MASK; + +@@ -928,7 +928,7 @@ mvpp2_shared_interrupt_mask_unmask(struct mvpp2_port *port, bool mask) + if (mask) + val = 0; + else +- val = MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK; ++ val = MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK(MVPP22); + + for (i = 0; i < port->nqvecs; i++) { + struct mvpp2_queue_vector *v = port->qvecs + i; +@@ -2901,7 +2901,7 @@ release: + } + + /* Main tx processing */ +-static int mvpp2_tx(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t mvpp2_tx(struct sk_buff *skb, struct net_device *dev) + { + struct mvpp2_port *port = netdev_priv(dev); + struct mvpp2_tx_queue *txq, *aggr_txq; +@@ -3059,7 +3059,8 @@ static int mvpp2_poll(struct napi_struct *napi, int budget) + } + + /* Process RX packets */ +- cause_rx = cause_rx_tx & MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK; ++ cause_rx = cause_rx_tx & ++ MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK(port->priv->hw_version); + cause_rx <<= qv->first_rxq; + cause_rx |= qv->pending_cause_rx; + while (cause_rx && budget > 0) { +diff --git a/drivers/net/ethernet/marvell/pxa168_eth.c b/drivers/net/ethernet/marvell/pxa168_eth.c +index 3a9730612a70..ff2fea0f8b75 100644 +--- a/drivers/net/ethernet/marvell/pxa168_eth.c ++++ b/drivers/net/ethernet/marvell/pxa168_eth.c +@@ -1260,7 +1260,8 @@ static int pxa168_rx_poll(struct napi_struct *napi, int budget) + return work_done; + } + +-static int pxa168_eth_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++pxa168_eth_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct pxa168_eth_private *pep = netdev_priv(dev); + struct net_device_stats *stats = &dev->stats; +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +index ccd9aca281b3..e498ee95baca 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +@@ -336,7 +336,10 @@ static int mlxsw_sp_fw_rev_validate(struct mlxsw_sp *mlxsw_sp) + return -EINVAL; + } + if (MLXSW_SP_FWREV_MINOR_TO_BRANCH(rev->minor) == +- MLXSW_SP_FWREV_MINOR_TO_BRANCH(req_rev->minor)) ++ MLXSW_SP_FWREV_MINOR_TO_BRANCH(req_rev->minor) && ++ (rev->minor > req_rev->minor || ++ (rev->minor == req_rev->minor && ++ rev->subminor >= req_rev->subminor))) + return 0; + + dev_info(mlxsw_sp->bus_info->dev, "The firmware version %d.%d.%d is incompatible with the driver\n", +@@ -2815,6 +2818,13 @@ static int mlxsw_sp_port_ets_init(struct mlxsw_sp_port *mlxsw_sp_port) + MLXSW_REG_QEEC_MAS_DIS); + if (err) + return err; ++ ++ err = mlxsw_sp_port_ets_maxrate_set(mlxsw_sp_port, ++ MLXSW_REG_QEEC_HIERARCY_TC, ++ i + 8, i, ++ MLXSW_REG_QEEC_MAS_DIS); ++ if (err) ++ return err; + } + + /* Map all priorities to traffic class 0. */ +diff --git a/drivers/net/ethernet/micrel/ks8695net.c b/drivers/net/ethernet/micrel/ks8695net.c +index bd51e057e915..b881f5d4a7f9 100644 +--- a/drivers/net/ethernet/micrel/ks8695net.c ++++ b/drivers/net/ethernet/micrel/ks8695net.c +@@ -1164,7 +1164,7 @@ ks8695_timeout(struct net_device *ndev) + * sk_buff and adds it to the TX ring. It then kicks the TX DMA + * engine to ensure transmission begins. + */ +-static int ++static netdev_tx_t + ks8695_start_xmit(struct sk_buff *skb, struct net_device *ndev) + { + struct ks8695_priv *ksp = netdev_priv(ndev); +diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c +index 0e9719fbc624..35f8c9ef204d 100644 +--- a/drivers/net/ethernet/micrel/ks8851_mll.c ++++ b/drivers/net/ethernet/micrel/ks8851_mll.c +@@ -1021,9 +1021,9 @@ static void ks_write_qmu(struct ks_net *ks, u8 *pdata, u16 len) + * spin_lock_irqsave is required because tx and rx should be mutual exclusive. + * So while tx is in-progress, prevent IRQ interrupt from happenning. + */ +-static int ks_start_xmit(struct sk_buff *skb, struct net_device *netdev) ++static netdev_tx_t ks_start_xmit(struct sk_buff *skb, struct net_device *netdev) + { +- int retv = NETDEV_TX_OK; ++ netdev_tx_t retv = NETDEV_TX_OK; + struct ks_net *ks = netdev_priv(netdev); + + disable_irq(netdev->irq); +diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +index c6d29fdbb880..d288c7eebacd 100644 +--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c ++++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +@@ -2187,9 +2187,13 @@ nfp_net_tx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_tx_ring *tx_ring) + + tx_ring->size = array_size(tx_ring->cnt, sizeof(*tx_ring->txds)); + tx_ring->txds = dma_zalloc_coherent(dp->dev, tx_ring->size, +- &tx_ring->dma, GFP_KERNEL); +- if (!tx_ring->txds) ++ &tx_ring->dma, ++ GFP_KERNEL | __GFP_NOWARN); ++ if (!tx_ring->txds) { ++ netdev_warn(dp->netdev, "failed to allocate TX descriptor ring memory, requested descriptor count: %d, consider lowering descriptor count\n", ++ tx_ring->cnt); + goto err_alloc; ++ } + + tx_ring->txbufs = kvcalloc(tx_ring->cnt, sizeof(*tx_ring->txbufs), + GFP_KERNEL); +@@ -2341,9 +2345,13 @@ nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring) + rx_ring->cnt = dp->rxd_cnt; + rx_ring->size = array_size(rx_ring->cnt, sizeof(*rx_ring->rxds)); + rx_ring->rxds = dma_zalloc_coherent(dp->dev, rx_ring->size, +- &rx_ring->dma, GFP_KERNEL); +- if (!rx_ring->rxds) ++ &rx_ring->dma, ++ GFP_KERNEL | __GFP_NOWARN); ++ if (!rx_ring->rxds) { ++ netdev_warn(dp->netdev, "failed to allocate RX descriptor ring memory, requested descriptor count: %d, consider lowering descriptor count\n", ++ rx_ring->cnt); + goto err_alloc; ++ } + + rx_ring->rxbufs = kvcalloc(rx_ring->cnt, sizeof(*rx_ring->rxbufs), + GFP_KERNEL); +diff --git a/drivers/net/ethernet/smsc/smc911x.c b/drivers/net/ethernet/smsc/smc911x.c +index b1b53f6c452f..8355dfbb8ec3 100644 +--- a/drivers/net/ethernet/smsc/smc911x.c ++++ b/drivers/net/ethernet/smsc/smc911x.c +@@ -513,7 +513,8 @@ static void smc911x_hardware_send_pkt(struct net_device *dev) + * now, or set the card to generates an interrupt when ready + * for the packet. + */ +-static int smc911x_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++smc911x_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct smc911x_local *lp = netdev_priv(dev); + unsigned int free; +diff --git a/drivers/net/ethernet/smsc/smc91x.c b/drivers/net/ethernet/smsc/smc91x.c +index b944828f9ea3..8d6cff8bd162 100644 +--- a/drivers/net/ethernet/smsc/smc91x.c ++++ b/drivers/net/ethernet/smsc/smc91x.c +@@ -638,7 +638,8 @@ done: if (!THROTTLE_TX_PKTS) + * now, or set the card to generates an interrupt when ready + * for the packet. + */ +-static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct smc_local *lp = netdev_priv(dev); + void __iomem *ioaddr = lp->base; +diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c +index f0afb88d7bc2..ce4bfecc26c7 100644 +--- a/drivers/net/ethernet/smsc/smsc911x.c ++++ b/drivers/net/ethernet/smsc/smsc911x.c +@@ -1786,7 +1786,8 @@ static int smsc911x_stop(struct net_device *dev) + } + + /* Entry point for transmitting a packet */ +-static int smsc911x_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++smsc911x_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct smsc911x_data *pdata = netdev_priv(dev); + unsigned int freespace; +diff --git a/drivers/net/ethernet/socionext/sni_ave.c b/drivers/net/ethernet/socionext/sni_ave.c +index f27d67a4d304..09d25b87cf7c 100644 +--- a/drivers/net/ethernet/socionext/sni_ave.c ++++ b/drivers/net/ethernet/socionext/sni_ave.c +@@ -906,11 +906,11 @@ static void ave_rxfifo_reset(struct net_device *ndev) + + /* assert reset */ + writel(AVE_GRR_RXFFR, priv->base + AVE_GRR); +- usleep_range(40, 50); ++ udelay(50); + + /* negate reset */ + writel(0, priv->base + AVE_GRR); +- usleep_range(10, 20); ++ udelay(20); + + /* negate interrupt status */ + writel(AVE_GI_RXOVF, priv->base + AVE_GISR); +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +index 79c91526f3ec..fea286e14add 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +@@ -1199,7 +1199,7 @@ static int sun8i_dwmac_probe(struct platform_device *pdev) + dwmac_mux: + sun8i_dwmac_unset_syscon(gmac); + dwmac_exit: +- sun8i_dwmac_exit(pdev, plat_dat->bsp_priv); ++ stmmac_pltfr_remove(pdev); + return ret; + } + +diff --git a/drivers/net/ethernet/sun/ldmvsw.c b/drivers/net/ethernet/sun/ldmvsw.c +index d42f47f6c632..644e42c181ee 100644 +--- a/drivers/net/ethernet/sun/ldmvsw.c ++++ b/drivers/net/ethernet/sun/ldmvsw.c +@@ -113,7 +113,7 @@ static u16 vsw_select_queue(struct net_device *dev, struct sk_buff *skb, + } + + /* Wrappers to common functions */ +-static int vsw_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t vsw_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + return sunvnet_start_xmit_common(skb, dev, vsw_tx_port_find); + } +diff --git a/drivers/net/ethernet/sun/sunbmac.c b/drivers/net/ethernet/sun/sunbmac.c +index f047b2797156..720b7ac77f3b 100644 +--- a/drivers/net/ethernet/sun/sunbmac.c ++++ b/drivers/net/ethernet/sun/sunbmac.c +@@ -950,7 +950,8 @@ static void bigmac_tx_timeout(struct net_device *dev) + } + + /* Put a packet on the wire. */ +-static int bigmac_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++bigmac_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct bigmac *bp = netdev_priv(dev); + int len, entry; +diff --git a/drivers/net/ethernet/sun/sunqe.c b/drivers/net/ethernet/sun/sunqe.c +index 7fe0d5e33922..1468fa0a54e9 100644 +--- a/drivers/net/ethernet/sun/sunqe.c ++++ b/drivers/net/ethernet/sun/sunqe.c +@@ -570,7 +570,7 @@ out: + } + + /* Get a packet queued to go onto the wire. */ +-static int qe_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t qe_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct sunqe *qep = netdev_priv(dev); + struct sunqe_buffers *qbufs = qep->buffers; +diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c +index 12539b357a78..590172818b92 100644 +--- a/drivers/net/ethernet/sun/sunvnet.c ++++ b/drivers/net/ethernet/sun/sunvnet.c +@@ -247,7 +247,7 @@ static u16 vnet_select_queue(struct net_device *dev, struct sk_buff *skb, + } + + /* Wrappers to common functions */ +-static int vnet_start_xmit(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t vnet_start_xmit(struct sk_buff *skb, struct net_device *dev) + { + return sunvnet_start_xmit_common(skb, dev, vnet_tx_port_find); + } +diff --git a/drivers/net/ethernet/sun/sunvnet_common.c b/drivers/net/ethernet/sun/sunvnet_common.c +index d8f4c3f28150..baa3088b475c 100644 +--- a/drivers/net/ethernet/sun/sunvnet_common.c ++++ b/drivers/net/ethernet/sun/sunvnet_common.c +@@ -1216,9 +1216,10 @@ static inline struct sk_buff *vnet_skb_shape(struct sk_buff *skb, int ncookies) + return skb; + } + +-static int vnet_handle_offloads(struct vnet_port *port, struct sk_buff *skb, +- struct vnet_port *(*vnet_tx_port) +- (struct sk_buff *, struct net_device *)) ++static netdev_tx_t ++vnet_handle_offloads(struct vnet_port *port, struct sk_buff *skb, ++ struct vnet_port *(*vnet_tx_port) ++ (struct sk_buff *, struct net_device *)) + { + struct net_device *dev = VNET_PORT_TO_NET_DEVICE(port); + struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; +@@ -1321,9 +1322,10 @@ out_dropped: + return NETDEV_TX_OK; + } + +-int sunvnet_start_xmit_common(struct sk_buff *skb, struct net_device *dev, +- struct vnet_port *(*vnet_tx_port) +- (struct sk_buff *, struct net_device *)) ++netdev_tx_t ++sunvnet_start_xmit_common(struct sk_buff *skb, struct net_device *dev, ++ struct vnet_port *(*vnet_tx_port) ++ (struct sk_buff *, struct net_device *)) + { + struct vnet_port *port = NULL; + struct vio_dring_state *dr; +diff --git a/drivers/net/ethernet/sun/sunvnet_common.h b/drivers/net/ethernet/sun/sunvnet_common.h +index 1ea0b016580a..2b808d2482d6 100644 +--- a/drivers/net/ethernet/sun/sunvnet_common.h ++++ b/drivers/net/ethernet/sun/sunvnet_common.h +@@ -136,9 +136,10 @@ int sunvnet_close_common(struct net_device *dev); + void sunvnet_set_rx_mode_common(struct net_device *dev, struct vnet *vp); + int sunvnet_set_mac_addr_common(struct net_device *dev, void *p); + void sunvnet_tx_timeout_common(struct net_device *dev); +-int sunvnet_start_xmit_common(struct sk_buff *skb, struct net_device *dev, +- struct vnet_port *(*vnet_tx_port) +- (struct sk_buff *, struct net_device *)); ++netdev_tx_t ++sunvnet_start_xmit_common(struct sk_buff *skb, struct net_device *dev, ++ struct vnet_port *(*vnet_tx_port) ++ (struct sk_buff *, struct net_device *)); + #ifdef CONFIG_NET_POLL_CONTROLLER + void sunvnet_poll_controller_common(struct net_device *dev, struct vnet *vp); + #endif +diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_net.c b/drivers/net/ethernet/toshiba/ps3_gelic_net.c +index 88d74aef218a..75237c81c63d 100644 +--- a/drivers/net/ethernet/toshiba/ps3_gelic_net.c ++++ b/drivers/net/ethernet/toshiba/ps3_gelic_net.c +@@ -845,9 +845,9 @@ static int gelic_card_kick_txdma(struct gelic_card *card, + * @skb: packet to send out + * @netdev: interface device structure + * +- * returns 0 on success, <0 on failure ++ * returns NETDEV_TX_OK on success, NETDEV_TX_BUSY on failure + */ +-int gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev) ++netdev_tx_t gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev) + { + struct gelic_card *card = netdev_card(netdev); + struct gelic_descr *descr; +diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_net.h b/drivers/net/ethernet/toshiba/ps3_gelic_net.h +index 003d0452d9cb..fbbf9b54b173 100644 +--- a/drivers/net/ethernet/toshiba/ps3_gelic_net.h ++++ b/drivers/net/ethernet/toshiba/ps3_gelic_net.h +@@ -370,7 +370,7 @@ void gelic_card_up(struct gelic_card *card); + void gelic_card_down(struct gelic_card *card); + int gelic_net_open(struct net_device *netdev); + int gelic_net_stop(struct net_device *netdev); +-int gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev); ++netdev_tx_t gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev); + void gelic_net_set_multi(struct net_device *netdev); + void gelic_net_tx_timeout(struct net_device *netdev); + int gelic_net_setup_netdev(struct net_device *netdev, struct gelic_card *card); +diff --git a/drivers/net/ethernet/toshiba/spider_net.c b/drivers/net/ethernet/toshiba/spider_net.c +index d925b8203996..23417266b7ec 100644 +--- a/drivers/net/ethernet/toshiba/spider_net.c ++++ b/drivers/net/ethernet/toshiba/spider_net.c +@@ -880,9 +880,9 @@ out: + * @skb: packet to send out + * @netdev: interface device structure + * +- * returns 0 on success, !0 on failure ++ * returns NETDEV_TX_OK on success, NETDEV_TX_BUSY on failure + */ +-static int ++static netdev_tx_t + spider_net_xmit(struct sk_buff *skb, struct net_device *netdev) + { + int cnt; +diff --git a/drivers/net/ethernet/toshiba/tc35815.c b/drivers/net/ethernet/toshiba/tc35815.c +index 9146068979d2..03afc4d8c3ec 100644 +--- a/drivers/net/ethernet/toshiba/tc35815.c ++++ b/drivers/net/ethernet/toshiba/tc35815.c +@@ -474,7 +474,8 @@ static void free_rxbuf_skb(struct pci_dev *hwdev, struct sk_buff *skb, dma_addr_ + /* Index to functions, as function prototypes. */ + + static int tc35815_open(struct net_device *dev); +-static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev); ++static netdev_tx_t tc35815_send_packet(struct sk_buff *skb, ++ struct net_device *dev); + static irqreturn_t tc35815_interrupt(int irq, void *dev_id); + static int tc35815_rx(struct net_device *dev, int limit); + static int tc35815_poll(struct napi_struct *napi, int budget); +@@ -1248,7 +1249,8 @@ tc35815_open(struct net_device *dev) + * invariant will hold if you make sure that the netif_*_queue() + * calls are done at the proper times. + */ +-static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev) ++static netdev_tx_t ++tc35815_send_packet(struct sk_buff *skb, struct net_device *dev) + { + struct tc35815_local *lp = netdev_priv(dev); + struct TxFD *txfd; +diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c +index 60abc9250f56..2241f9897092 100644 +--- a/drivers/net/ethernet/xilinx/ll_temac_main.c ++++ b/drivers/net/ethernet/xilinx/ll_temac_main.c +@@ -674,7 +674,8 @@ static inline int temac_check_tx_bd_space(struct temac_local *lp, int num_frag) + return 0; + } + +-static int temac_start_xmit(struct sk_buff *skb, struct net_device *ndev) ++static netdev_tx_t ++temac_start_xmit(struct sk_buff *skb, struct net_device *ndev) + { + struct temac_local *lp = netdev_priv(ndev); + struct cdmac_bd *cur_p; +diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +index 66b30ebd45ee..28764268a44f 100644 +--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c ++++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +@@ -657,7 +657,8 @@ static inline int axienet_check_tx_bd_space(struct axienet_local *lp, + * start the transmission. Additionally if checksum offloading is supported, + * it populates AXI Stream Control fields with appropriate values. + */ +-static int axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev) ++static netdev_tx_t ++axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev) + { + u32 ii; + u32 num_frag; +diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c +index 42f1f518dad6..c77c81eb7ab3 100644 +--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c ++++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c +@@ -1020,9 +1020,10 @@ static int xemaclite_close(struct net_device *dev) + * deferred and the Tx queue is stopped so that the deferred socket buffer can + * be transmitted when the Emaclite device is free to transmit data. + * +- * Return: 0, always. ++ * Return: NETDEV_TX_OK, always. + */ +-static int xemaclite_send(struct sk_buff *orig_skb, struct net_device *dev) ++static netdev_tx_t ++xemaclite_send(struct sk_buff *orig_skb, struct net_device *dev) + { + struct net_local *lp = netdev_priv(dev); + struct sk_buff *new_skb; +@@ -1044,7 +1045,7 @@ static int xemaclite_send(struct sk_buff *orig_skb, struct net_device *dev) + /* Take the time stamp now, since we can't do this in an ISR. */ + skb_tx_timestamp(new_skb); + spin_unlock_irqrestore(&lp->reset_lock, flags); +- return 0; ++ return NETDEV_TX_OK; + } + spin_unlock_irqrestore(&lp->reset_lock, flags); + +@@ -1053,7 +1054,7 @@ static int xemaclite_send(struct sk_buff *orig_skb, struct net_device *dev) + dev->stats.tx_bytes += len; + dev_consume_skb_any(new_skb); + +- return 0; ++ return NETDEV_TX_OK; + } + + /** +diff --git a/drivers/net/net_failover.c b/drivers/net/net_failover.c +index 5a749dc25bec..beeb7eb76ca3 100644 +--- a/drivers/net/net_failover.c ++++ b/drivers/net/net_failover.c +@@ -765,8 +765,10 @@ struct failover *net_failover_create(struct net_device *standby_dev) + netif_carrier_off(failover_dev); + + failover = failover_register(failover_dev, &net_failover_ops); +- if (IS_ERR(failover)) ++ if (IS_ERR(failover)) { ++ err = PTR_ERR(failover); + goto err_failover_register; ++ } + + return failover; + +diff --git a/drivers/net/phy/mdio-bcm-unimac.c b/drivers/net/phy/mdio-bcm-unimac.c +index 8d370667fa1b..df75efa96a7d 100644 +--- a/drivers/net/phy/mdio-bcm-unimac.c ++++ b/drivers/net/phy/mdio-bcm-unimac.c +@@ -16,6 +16,7 @@ + #include <linux/module.h> + #include <linux/io.h> + #include <linux/delay.h> ++#include <linux/clk.h> + + #include <linux/of.h> + #include <linux/of_platform.h> +@@ -45,6 +46,8 @@ struct unimac_mdio_priv { + void __iomem *base; + int (*wait_func) (void *wait_func_data); + void *wait_func_data; ++ struct clk *clk; ++ u32 clk_freq; + }; + + static inline u32 unimac_mdio_readl(struct unimac_mdio_priv *priv, u32 offset) +@@ -189,6 +192,35 @@ static int unimac_mdio_reset(struct mii_bus *bus) + return 0; + } + ++static void unimac_mdio_clk_set(struct unimac_mdio_priv *priv) ++{ ++ unsigned long rate; ++ u32 reg, div; ++ ++ /* Keep the hardware default values */ ++ if (!priv->clk_freq) ++ return; ++ ++ if (!priv->clk) ++ rate = 250000000; ++ else ++ rate = clk_get_rate(priv->clk); ++ ++ div = (rate / (2 * priv->clk_freq)) - 1; ++ if (div & ~MDIO_CLK_DIV_MASK) { ++ pr_warn("Incorrect MDIO clock frequency, ignoring\n"); ++ return; ++ } ++ ++ /* The MDIO clock is the reference clock (typicaly 250Mhz) divided by ++ * 2 x (MDIO_CLK_DIV + 1) ++ */ ++ reg = unimac_mdio_readl(priv, MDIO_CFG); ++ reg &= ~(MDIO_CLK_DIV_MASK << MDIO_CLK_DIV_SHIFT); ++ reg |= div << MDIO_CLK_DIV_SHIFT; ++ unimac_mdio_writel(priv, reg, MDIO_CFG); ++} ++ + static int unimac_mdio_probe(struct platform_device *pdev) + { + struct unimac_mdio_pdata *pdata = pdev->dev.platform_data; +@@ -217,9 +249,26 @@ static int unimac_mdio_probe(struct platform_device *pdev) + return -ENOMEM; + } + ++ priv->clk = devm_clk_get(&pdev->dev, NULL); ++ if (PTR_ERR(priv->clk) == -EPROBE_DEFER) ++ return PTR_ERR(priv->clk); ++ else ++ priv->clk = NULL; ++ ++ ret = clk_prepare_enable(priv->clk); ++ if (ret) ++ return ret; ++ ++ if (of_property_read_u32(np, "clock-frequency", &priv->clk_freq)) ++ priv->clk_freq = 0; ++ ++ unimac_mdio_clk_set(priv); ++ + priv->mii_bus = mdiobus_alloc(); +- if (!priv->mii_bus) +- return -ENOMEM; ++ if (!priv->mii_bus) { ++ ret = -ENOMEM; ++ goto out_clk_disable; ++ } + + bus = priv->mii_bus; + bus->priv = priv; +@@ -253,6 +302,8 @@ static int unimac_mdio_probe(struct platform_device *pdev) + + out_mdio_free: + mdiobus_free(bus); ++out_clk_disable: ++ clk_disable_unprepare(priv->clk); + return ret; + } + +@@ -262,10 +313,37 @@ static int unimac_mdio_remove(struct platform_device *pdev) + + mdiobus_unregister(priv->mii_bus); + mdiobus_free(priv->mii_bus); ++ clk_disable_unprepare(priv->clk); ++ ++ return 0; ++} ++ ++static int __maybe_unused unimac_mdio_suspend(struct device *d) ++{ ++ struct unimac_mdio_priv *priv = dev_get_drvdata(d); ++ ++ clk_disable_unprepare(priv->clk); ++ ++ return 0; ++} ++ ++static int __maybe_unused unimac_mdio_resume(struct device *d) ++{ ++ struct unimac_mdio_priv *priv = dev_get_drvdata(d); ++ int ret; ++ ++ ret = clk_prepare_enable(priv->clk); ++ if (ret) ++ return ret; ++ ++ unimac_mdio_clk_set(priv); + + return 0; + } + ++static SIMPLE_DEV_PM_OPS(unimac_mdio_pm_ops, ++ unimac_mdio_suspend, unimac_mdio_resume); ++ + static const struct of_device_id unimac_mdio_ids[] = { + { .compatible = "brcm,genet-mdio-v5", }, + { .compatible = "brcm,genet-mdio-v4", }, +@@ -281,6 +359,7 @@ static struct platform_driver unimac_mdio_driver = { + .driver = { + .name = UNIMAC_MDIO_DRV_NAME, + .of_match_table = unimac_mdio_ids, ++ .pm = &unimac_mdio_pm_ops, + }, + .probe = unimac_mdio_probe, + .remove = unimac_mdio_remove, +diff --git a/drivers/net/phy/mscc.c b/drivers/net/phy/mscc.c +index 84ca9ff40ae0..36647b70b9a3 100644 +--- a/drivers/net/phy/mscc.c ++++ b/drivers/net/phy/mscc.c +@@ -111,8 +111,8 @@ struct vsc8531_private { + + #ifdef CONFIG_OF_MDIO + struct vsc8531_edge_rate_table { +- u16 vddmac; +- u8 slowdown[8]; ++ u32 vddmac; ++ u32 slowdown[8]; + }; + + static const struct vsc8531_edge_rate_table edge_table[] = { +@@ -375,8 +375,7 @@ out_unlock: + #ifdef CONFIG_OF_MDIO + static int vsc85xx_edge_rate_magic_get(struct phy_device *phydev) + { +- u8 sd; +- u16 vdd; ++ u32 vdd, sd; + int rc, i, j; + struct device *dev = &phydev->mdio.dev; + struct device_node *of_node = dev->of_node; +@@ -385,11 +384,11 @@ static int vsc85xx_edge_rate_magic_get(struct phy_device *phydev) + if (!of_node) + return -ENODEV; + +- rc = of_property_read_u16(of_node, "vsc8531,vddmac", &vdd); ++ rc = of_property_read_u32(of_node, "vsc8531,vddmac", &vdd); + if (rc != 0) + vdd = MSCC_VDDMAC_3300; + +- rc = of_property_read_u8(of_node, "vsc8531,edge-slowdown", &sd); ++ rc = of_property_read_u32(of_node, "vsc8531,edge-slowdown", &sd); + if (rc != 0) + sd = 0; + +diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c +index b008266e91ea..a5874059da9d 100644 +--- a/drivers/net/slip/slip.c ++++ b/drivers/net/slip/slip.c +@@ -855,6 +855,7 @@ err_free_chan: + sl->tty = NULL; + tty->disc_data = NULL; + clear_bit(SLF_INUSE, &sl->flags); ++ free_netdev(sl->dev); + + err_exit: + rtnl_unlock(); +diff --git a/drivers/net/usb/ax88172a.c b/drivers/net/usb/ax88172a.c +index 501576f53854..914cac55a7ae 100644 +--- a/drivers/net/usb/ax88172a.c ++++ b/drivers/net/usb/ax88172a.c +@@ -208,7 +208,7 @@ static int ax88172a_bind(struct usbnet *dev, struct usb_interface *intf) + + /* Get the MAC address */ + ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf, 0); +- if (ret < 0) { ++ if (ret < ETH_ALEN) { + netdev_err(dev->net, "Failed to read MAC address: %d\n", ret); + goto free; + } +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 3a172fcb06fe..50bf4b2080d5 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2950,6 +2950,11 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf) + int i; + + ret = lan78xx_get_endpoints(dev, intf); ++ if (ret) { ++ netdev_warn(dev->net, "lan78xx_get_endpoints failed: %d\n", ++ ret); ++ return ret; ++ } + + dev->data[0] = (unsigned long)kzalloc(sizeof(*pdata), GFP_KERNEL); + +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 9f037c50054d..b55fd76348f9 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -1306,6 +1306,8 @@ static const struct usb_device_id products[] = { + {QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */ + {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */ + {QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)}, /* Fibocom NL678 series */ ++ {QMI_FIXED_INTF(0x0489, 0xe0b4, 0)}, /* Foxconn T77W968 LTE */ ++ {QMI_FIXED_INTF(0x0489, 0xe0b5, 0)}, /* Foxconn T77W968 LTE with eSIM support*/ + + /* 4. Gobi 1000 devices */ + {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ +diff --git a/drivers/net/wireless/ath/ath10k/ahb.c b/drivers/net/wireless/ath/ath10k/ahb.c +index c9bd0e2b5db7..be90c9e9e5bc 100644 +--- a/drivers/net/wireless/ath/ath10k/ahb.c ++++ b/drivers/net/wireless/ath/ath10k/ahb.c +@@ -655,10 +655,10 @@ static void ath10k_ahb_hif_stop(struct ath10k *ar) + ath10k_ahb_irq_disable(ar); + synchronize_irq(ar_ahb->irq); + +- ath10k_pci_flush(ar); +- + napi_synchronize(&ar->napi); + napi_disable(&ar->napi); ++ ++ ath10k_pci_flush(ar); + } + + static int ath10k_ahb_hif_power_up(struct ath10k *ar) +diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c +index 2791ef2fd716..436eac342b62 100644 +--- a/drivers/net/wireless/ath/ath10k/core.c ++++ b/drivers/net/wireless/ath/ath10k/core.c +@@ -91,6 +91,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA988X_HW_2_0_VERSION, +@@ -124,6 +125,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA9887_HW_1_0_VERSION, +@@ -157,6 +159,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA6174_HW_2_1_VERSION, +@@ -189,6 +192,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA6174_HW_2_1_VERSION, +@@ -221,6 +225,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA6174_HW_3_0_VERSION, +@@ -253,6 +258,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA6174_HW_3_2_VERSION, +@@ -288,6 +294,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA99X0_HW_2_0_DEV_VERSION, +@@ -326,6 +333,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA9984_HW_1_0_DEV_VERSION, +@@ -369,6 +377,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA9888_HW_2_0_DEV_VERSION, +@@ -411,6 +420,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA9377_HW_1_0_DEV_VERSION, +@@ -443,6 +453,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA9377_HW_1_1_DEV_VERSION, +@@ -477,6 +488,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = QCA4019_HW_1_0_DEV_VERSION, +@@ -516,6 +528,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = false, + .shadow_reg_support = false, + .rri_on_ddr = false, ++ .hw_filter_reset_required = true, + }, + { + .id = WCN3990_HW_1_0_DEV_VERSION, +@@ -540,6 +553,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = { + .per_ce_irq = true, + .shadow_reg_support = true, + .rri_on_ddr = true, ++ .hw_filter_reset_required = false, + }, + }; + +@@ -2406,7 +2420,8 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode, + * possible to implicitly make it correct by creating a dummy vdev and + * then deleting it. + */ +- if (mode == ATH10K_FIRMWARE_MODE_NORMAL) { ++ if (ar->hw_params.hw_filter_reset_required && ++ mode == ATH10K_FIRMWARE_MODE_NORMAL) { + status = ath10k_core_reset_rx_filter(ar); + if (status) { + ath10k_err(ar, +diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h +index 977f79ebb4fd..fac58c3c576a 100644 +--- a/drivers/net/wireless/ath/ath10k/hw.h ++++ b/drivers/net/wireless/ath/ath10k/hw.h +@@ -589,6 +589,11 @@ struct ath10k_hw_params { + + /* Number of bytes to be the offset for each FFT sample */ + int spectral_bin_offset; ++ ++ /* targets which require hw filter reset during boot up, ++ * to avoid it sending spurious acks. ++ */ ++ bool hw_filter_reset_required; + }; + + struct htt_rx_desc; +diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c +index 1419f9d1505f..9d033da46ec2 100644 +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -18,6 +18,7 @@ + + #include "mac.h" + ++#include <net/cfg80211.h> + #include <net/mac80211.h> + #include <linux/etherdevice.h> + #include <linux/acpi.h> +@@ -8363,6 +8364,7 @@ int ath10k_mac_register(struct ath10k *ar) + ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; + } + ++ wiphy_read_of_freq_limits(ar->hw->wiphy); + ath10k_mac_setup_ht_vht_cap(ar); + + ar->hw->wiphy->interface_modes = +diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c +index af2cf55c4c1e..97fa5c74f2fe 100644 +--- a/drivers/net/wireless/ath/ath10k/pci.c ++++ b/drivers/net/wireless/ath/ath10k/pci.c +@@ -2068,9 +2068,9 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) + + ath10k_pci_irq_disable(ar); + ath10k_pci_irq_sync(ar); +- ath10k_pci_flush(ar); + napi_synchronize(&ar->napi); + napi_disable(&ar->napi); ++ ath10k_pci_flush(ar); + + spin_lock_irqsave(&ar_pci->ps_lock, flags); + WARN_ON(ar_pci->ps_wake_refcount > 0); +diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c +index 9f31b9a10850..40b36e73bb48 100644 +--- a/drivers/net/wireless/ath/ath10k/wmi.c ++++ b/drivers/net/wireless/ath/ath10k/wmi.c +@@ -2487,7 +2487,8 @@ int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb) + status->freq, status->band, status->signal, + status->rate_idx); + +- ieee80211_rx(ar->hw, skb); ++ ieee80211_rx_ni(ar->hw, skb); ++ + return 0; + } + +@@ -4785,6 +4786,13 @@ ath10k_wmi_tpc_final_get_rate(struct ath10k *ar, + } + } + ++ if (pream == -1) { ++ ath10k_warn(ar, "unknown wmi tpc final index and frequency: %u, %u\n", ++ pream_idx, __le32_to_cpu(ev->chan_freq)); ++ tpc = 0; ++ goto out; ++ } ++ + if (pream == 4) + tpc = min_t(u8, ev->rates_array[rate_idx], + ev->max_reg_allow_pow[ch]); +diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c +index 1049773378f2..74f98bbaea88 100644 +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -1252,7 +1252,6 @@ static int ath9k_add_interface(struct ieee80211_hw *hw, + struct ath_node *an = &avp->mcast_node; + + mutex_lock(&sc->mutex); +- + if (IS_ENABLED(CONFIG_ATH9K_TX99)) { + if (sc->cur_chan->nvifs >= 1) { + mutex_unlock(&sc->mutex); +diff --git a/drivers/net/wireless/ath/ath9k/tx99.c b/drivers/net/wireless/ath/ath9k/tx99.c +index ce50d8f5835e..95544ce05acf 100644 +--- a/drivers/net/wireless/ath/ath9k/tx99.c ++++ b/drivers/net/wireless/ath/ath9k/tx99.c +@@ -56,11 +56,6 @@ static struct sk_buff *ath9k_build_tx99_skb(struct ath_softc *sc) + struct sk_buff *skb; + struct ath_vif *avp; + +- if (!sc->tx99_vif) +- return NULL; +- +- avp = (struct ath_vif *)sc->tx99_vif->drv_priv; +- + skb = alloc_skb(len, GFP_KERNEL); + if (!skb) + return NULL; +@@ -77,7 +72,10 @@ static struct sk_buff *ath9k_build_tx99_skb(struct ath_softc *sc) + memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN); + memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN); + +- hdr->seq_ctrl |= cpu_to_le16(avp->seq_no); ++ if (sc->tx99_vif) { ++ avp = (struct ath_vif *) sc->tx99_vif->drv_priv; ++ hdr->seq_ctrl |= cpu_to_le16(avp->seq_no); ++ } + + tx_info = IEEE80211_SKB_CB(skb); + memset(tx_info, 0, sizeof(*tx_info)); +diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c +index 51c3330bc316..ceace95b1595 100644 +--- a/drivers/net/wireless/ath/wil6210/debugfs.c ++++ b/drivers/net/wireless/ath/wil6210/debugfs.c +@@ -1263,6 +1263,9 @@ static int wil_rx_buff_mgmt_debugfs_show(struct seq_file *s, void *data) + int num_active; + int num_free; + ++ if (!rbm->buff_arr) ++ return -EINVAL; ++ + seq_printf(s, " size = %zu\n", rbm->size); + seq_printf(s, " free_list_empty_cnt = %lu\n", + rbm->free_list_empty_cnt); +diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c +index a0fe8cbad104..920cb233f4db 100644 +--- a/drivers/net/wireless/ath/wil6210/main.c ++++ b/drivers/net/wireless/ath/wil6210/main.c +@@ -223,6 +223,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock) + struct net_device *ndev = vif_to_ndev(vif); + struct wireless_dev *wdev = vif_to_wdev(vif); + struct wil_sta_info *sta = &wil->sta[cid]; ++ int min_ring_id = wil_get_min_tx_ring_id(wil); + + might_sleep(); + wil_dbg_misc(wil, "disconnect_cid: CID %d, MID %d, status %d\n", +@@ -273,7 +274,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock) + memset(sta->tid_crypto_rx, 0, sizeof(sta->tid_crypto_rx)); + memset(&sta->group_crypto_rx, 0, sizeof(sta->group_crypto_rx)); + /* release vrings */ +- for (i = 0; i < ARRAY_SIZE(wil->ring_tx); i++) { ++ for (i = min_ring_id; i < ARRAY_SIZE(wil->ring_tx); i++) { + if (wil->ring2cid_tid[i][0] == cid) + wil_ring_fini_tx(wil, i); + } +@@ -604,8 +605,10 @@ int wil_priv_init(struct wil6210_priv *wil) + wil->sta[i].mid = U8_MAX; + } + +- for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) ++ for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { + spin_lock_init(&wil->ring_tx_data[i].lock); ++ wil->ring2cid_tid[i][0] = WIL6210_MAX_CID; ++ } + + mutex_init(&wil->mutex); + mutex_init(&wil->vif_mutex); +@@ -653,8 +656,6 @@ int wil_priv_init(struct wil6210_priv *wil) + + /* edma configuration can be updated via debugfs before allocation */ + wil->num_rx_status_rings = WIL_DEFAULT_NUM_RX_STATUS_RINGS; +- wil->use_compressed_rx_status = true; +- wil->use_rx_hw_reordering = true; + wil->tx_status_ring_order = WIL_TX_SRING_SIZE_ORDER_DEFAULT; + + /* Rx status ring size should be bigger than the number of RX buffers +diff --git a/drivers/net/wireless/ath/wil6210/pcie_bus.c b/drivers/net/wireless/ath/wil6210/pcie_bus.c +index 89119e7facd0..c8c6613371d1 100644 +--- a/drivers/net/wireless/ath/wil6210/pcie_bus.c ++++ b/drivers/net/wireless/ath/wil6210/pcie_bus.c +@@ -108,6 +108,7 @@ int wil_set_capabilities(struct wil6210_priv *wil) + set_bit(hw_capa_no_flash, wil->hw_capa); + wil->use_enhanced_dma_hw = true; + wil->use_rx_hw_reordering = true; ++ wil->use_compressed_rx_status = true; + wil_fw_name = ftm_mode ? WIL_FW_NAME_FTM_TALYN : + WIL_FW_NAME_TALYN; + if (wil_fw_verify_file_exists(wil, wil_fw_name)) +diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c +index 1b1b58e0129a..73cdf54521f9 100644 +--- a/drivers/net/wireless/ath/wil6210/txrx.c ++++ b/drivers/net/wireless/ath/wil6210/txrx.c +@@ -77,8 +77,9 @@ bool wil_is_tx_idle(struct wil6210_priv *wil) + { + int i; + unsigned long data_comp_to; ++ int min_ring_id = wil_get_min_tx_ring_id(wil); + +- for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { ++ for (i = min_ring_id; i < WIL6210_MAX_TX_RINGS; i++) { + struct wil_ring *vring = &wil->ring_tx[i]; + int vring_index = vring - wil->ring_tx; + struct wil_ring_tx_data *txdata = +@@ -766,7 +767,14 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev) + return; + } + +- if (wdev->iftype == NL80211_IFTYPE_AP && !vif->ap_isolate) { ++ if (wdev->iftype == NL80211_IFTYPE_STATION) { ++ if (mcast && ether_addr_equal(eth->h_source, ndev->dev_addr)) { ++ /* mcast packet looped back to us */ ++ rc = GRO_DROP; ++ dev_kfree_skb(skb); ++ goto stats; ++ } ++ } else if (wdev->iftype == NL80211_IFTYPE_AP && !vif->ap_isolate) { + if (mcast) { + /* send multicast frames both to higher layers in + * local net stack and back to the wireless medium +@@ -1938,6 +1946,7 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil, + bool check_stop) + { + int i; ++ int min_ring_id = wil_get_min_tx_ring_id(wil); + + if (unlikely(!vif)) + return; +@@ -1970,7 +1979,7 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil, + return; + + /* check wake */ +- for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { ++ for (i = min_ring_id; i < WIL6210_MAX_TX_RINGS; i++) { + struct wil_ring *cur_ring = &wil->ring_tx[i]; + struct wil_ring_tx_data *txdata = &wil->ring_tx_data[i]; + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +index 27893af63ebc..8510d207ee87 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +@@ -296,9 +296,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) + /* Replace all newline/linefeed characters with space + * character + */ +- ptr = clmver; +- while ((ptr = strnchr(ptr, '\n', sizeof(buf))) != NULL) +- *ptr = ' '; ++ strreplace(clmver, '\n', ' '); + + brcmf_dbg(INFO, "CLM version = %s\n", clmver); + } +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +index 8347da632a5b..4c5a3995dc35 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +@@ -178,7 +178,7 @@ static void brcmf_feat_iovar_data_set(struct brcmf_if *ifp, + ifp->fwil_fwerr = false; + } + +-#define MAX_CAPS_BUFFER_SIZE 512 ++#define MAX_CAPS_BUFFER_SIZE 768 + static void brcmf_feat_firmware_capabilities(struct brcmf_if *ifp) + { + char caps[MAX_CAPS_BUFFER_SIZE]; +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +index ecc89e718b9c..6255fb6d97a7 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +@@ -1578,10 +1578,10 @@ int brcms_ucode_init_buf(struct brcms_info *wl, void **pbuf, u32 idx) + if (le32_to_cpu(hdr->idx) == idx) { + pdata = wl->fw.fw_bin[i]->data + + le32_to_cpu(hdr->offset); +- *pbuf = kmemdup(pdata, len, GFP_KERNEL); ++ *pbuf = kvmalloc(len, GFP_KERNEL); + if (*pbuf == NULL) + goto fail; +- ++ memcpy(*pbuf, pdata, len); + return 0; + } + } +@@ -1629,7 +1629,7 @@ int brcms_ucode_init_uint(struct brcms_info *wl, size_t *n_bytes, u32 idx) + */ + void brcms_ucode_free_buf(void *p) + { +- kfree(p); ++ kvfree(p); + } + + /* +diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c +index b4347806a59e..a0de61aa0fef 100644 +--- a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c ++++ b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c +@@ -143,7 +143,7 @@ static const struct iwl_ht_params iwl_22000_ht_params = { + .ucode_api_min = IWL_22000_UCODE_API_MIN, \ + .led_mode = IWL_LED_RF_STATE, \ + .nvm_hw_section_num = NVM_HW_SECTION_NUM_FAMILY_22000, \ +- .non_shared_ant = ANT_A, \ ++ .non_shared_ant = ANT_B, \ + .dccm_offset = IWL_22000_DCCM_OFFSET, \ + .dccm_len = IWL_22000_DCCM_LEN, \ + .dccm2_offset = IWL_22000_DCCM2_OFFSET, \ +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h b/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h +index 2f599353c885..2ba1401e5c0d 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h ++++ b/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h +@@ -574,6 +574,69 @@ struct iwl_rx_mpdu_desc { + + #define IWL_RX_DESC_SIZE_V1 offsetofend(struct iwl_rx_mpdu_desc, v1) + ++#define IWL_CD_STTS_OPTIMIZED_POS 0 ++#define IWL_CD_STTS_OPTIMIZED_MSK 0x01 ++#define IWL_CD_STTS_TRANSFER_STATUS_POS 1 ++#define IWL_CD_STTS_TRANSFER_STATUS_MSK 0x0E ++#define IWL_CD_STTS_WIFI_STATUS_POS 4 ++#define IWL_CD_STTS_WIFI_STATUS_MSK 0xF0 ++ ++/** ++ * enum iwl_completion_desc_transfer_status - transfer status (bits 1-3) ++ * @IWL_CD_STTS_UNUSED: unused ++ * @IWL_CD_STTS_UNUSED_2: unused ++ * @IWL_CD_STTS_END_TRANSFER: successful transfer complete. ++ * In sniffer mode, when split is used, set in last CD completion. (RX) ++ * @IWL_CD_STTS_OVERFLOW: In sniffer mode, when using split - used for ++ * all CD completion. (RX) ++ * @IWL_CD_STTS_ABORTED: CR abort / close flow. (RX) ++ * @IWL_CD_STTS_ERROR: general error (RX) ++ */ ++enum iwl_completion_desc_transfer_status { ++ IWL_CD_STTS_UNUSED, ++ IWL_CD_STTS_UNUSED_2, ++ IWL_CD_STTS_END_TRANSFER, ++ IWL_CD_STTS_OVERFLOW, ++ IWL_CD_STTS_ABORTED, ++ IWL_CD_STTS_ERROR, ++}; ++ ++/** ++ * enum iwl_completion_desc_wifi_status - wifi status (bits 4-7) ++ * @IWL_CD_STTS_VALID: the packet is valid (RX) ++ * @IWL_CD_STTS_FCS_ERR: frame check sequence error (RX) ++ * @IWL_CD_STTS_SEC_KEY_ERR: error handling the security key of rx (RX) ++ * @IWL_CD_STTS_DECRYPTION_ERR: error decrypting the frame (RX) ++ * @IWL_CD_STTS_DUP: duplicate packet (RX) ++ * @IWL_CD_STTS_ICV_MIC_ERR: MIC error (RX) ++ * @IWL_CD_STTS_INTERNAL_SNAP_ERR: problems removing the snap (RX) ++ * @IWL_CD_STTS_SEC_PORT_FAIL: security port fail (RX) ++ * @IWL_CD_STTS_BA_OLD_SN: block ack received old SN (RX) ++ * @IWL_CD_STTS_QOS_NULL: QoS null packet (RX) ++ * @IWL_CD_STTS_MAC_HDR_ERR: MAC header conversion error (RX) ++ * @IWL_CD_STTS_MAX_RETRANS: reached max number of retransmissions (TX) ++ * @IWL_CD_STTS_EX_LIFETIME: exceeded lifetime (TX) ++ * @IWL_CD_STTS_NOT_USED: completed but not used (RX) ++ * @IWL_CD_STTS_REPLAY_ERR: pn check failed, replay error (RX) ++ */ ++enum iwl_completion_desc_wifi_status { ++ IWL_CD_STTS_VALID, ++ IWL_CD_STTS_FCS_ERR, ++ IWL_CD_STTS_SEC_KEY_ERR, ++ IWL_CD_STTS_DECRYPTION_ERR, ++ IWL_CD_STTS_DUP, ++ IWL_CD_STTS_ICV_MIC_ERR, ++ IWL_CD_STTS_INTERNAL_SNAP_ERR, ++ IWL_CD_STTS_SEC_PORT_FAIL, ++ IWL_CD_STTS_BA_OLD_SN, ++ IWL_CD_STTS_QOS_NULL, ++ IWL_CD_STTS_MAC_HDR_ERR, ++ IWL_CD_STTS_MAX_RETRANS, ++ IWL_CD_STTS_EX_LIFETIME, ++ IWL_CD_STTS_NOT_USED, ++ IWL_CD_STTS_REPLAY_ERR, ++}; ++ + struct iwl_frame_release { + u8 baid; + u8 reserved; +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/tx.h b/drivers/net/wireless/intel/iwlwifi/fw/api/tx.h +index 514b86123d3d..80853f6cbd6d 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/api/tx.h ++++ b/drivers/net/wireless/intel/iwlwifi/fw/api/tx.h +@@ -747,9 +747,9 @@ enum iwl_mvm_ba_resp_flags { + * @tfd_cnt: number of TFD-Q elements + * @ra_tid_cnt: number of RATID-Q elements + * @tfd: array of TFD queue status updates. See &iwl_mvm_compressed_ba_tfd +- * for details. ++ * for details. Length in @tfd_cnt. + * @ra_tid: array of RA-TID queue status updates. For debug purposes only. See +- * &iwl_mvm_compressed_ba_ratid for more details. ++ * &iwl_mvm_compressed_ba_ratid for more details. Length in @ra_tid_cnt. + */ + struct iwl_mvm_compressed_ba_notif { + __le32 flags; +@@ -766,7 +766,7 @@ struct iwl_mvm_compressed_ba_notif { + __le32 tx_rate; + __le16 tfd_cnt; + __le16 ra_tid_cnt; +- struct iwl_mvm_compressed_ba_tfd tfd[1]; ++ struct iwl_mvm_compressed_ba_tfd tfd[0]; + struct iwl_mvm_compressed_ba_ratid ra_tid[0]; + } __packed; /* COMPRESSED_BA_RES_API_S_VER_4 */ + +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +index a31a42e673c4..3443cbdbab4a 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +@@ -824,7 +824,7 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt) + } + + /* We only dump the FIFOs if the FW is in error state */ +- if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) { ++ if (fifo_data_len) { + iwl_fw_dump_fifos(fwrt, &dump_data); + if (radio_len) + iwl_read_radio_regs(fwrt, &dump_data); +@@ -1016,7 +1016,7 @@ int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt, + * If the loading of the FW completed successfully, the next step is to + * get the SMEM config data. Thus, if fwrt->smem_cfg.num_lmacs is non + * zero, the FW was already loaded successully. If the state is "NO_FW" +- * in such a case - WARN and exit, since FW may be dead. Otherwise, we ++ * in such a case - exit, since FW may be dead. Otherwise, we + * can try to collect the data, since FW might just not be fully + * loaded (no "ALIVE" yet), and the debug data is accessible. + * +@@ -1024,9 +1024,8 @@ int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt, + * config. In such a case, due to HW access problems, we might + * collect garbage. + */ +- if (WARN((fwrt->trans->state == IWL_TRANS_NO_FW) && +- fwrt->smem_cfg.num_lmacs, +- "Can't collect dbg data when FW isn't alive\n")) ++ if (fwrt->trans->state == IWL_TRANS_NO_FW && ++ fwrt->smem_cfg.num_lmacs) + return -EIO; + + if (test_and_set_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status)) +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +index 279dd7b7a3fb..0b8cf7f3af93 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +@@ -269,6 +269,7 @@ struct iwl_rx_cmd_buffer { + bool _page_stolen; + u32 _rx_page_order; + unsigned int truesize; ++ u8 status; + }; + + static inline void *rxb_addr(struct iwl_rx_cmd_buffer *r) +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c +index b3fd20502abb..d90d58309bf0 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c +@@ -85,6 +85,10 @@ const u8 iwl_mvm_ac_to_gen2_tx_fifo[] = { + IWL_GEN2_EDCA_TX_FIFO_VI, + IWL_GEN2_EDCA_TX_FIFO_BE, + IWL_GEN2_EDCA_TX_FIFO_BK, ++ IWL_GEN2_TRIG_TX_FIFO_VO, ++ IWL_GEN2_TRIG_TX_FIFO_VI, ++ IWL_GEN2_TRIG_TX_FIFO_BE, ++ IWL_GEN2_TRIG_TX_FIFO_BK, + }; + + struct iwl_mvm_mac_iface_iterator_data { +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +index 18db1ed92d9b..04ea516bddcc 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +@@ -3133,10 +3133,6 @@ static int __iwl_mvm_set_sta_key(struct iwl_mvm *mvm, + + switch (keyconf->cipher) { + case WLAN_CIPHER_SUITE_TKIP: +- if (vif->type == NL80211_IFTYPE_AP) { +- ret = -EINVAL; +- break; +- } + addr = iwl_mvm_get_mac_addr(mvm, vif, sta); + /* get phase 1 key from mac80211 */ + ieee80211_get_key_rx_seq(keyconf, 0, &seq); +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +index 5615ce55cef5..449e3d32811a 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +@@ -778,6 +778,36 @@ iwl_mvm_tx_tso_segment(struct sk_buff *skb, unsigned int num_subframes, + return 0; + } + ++static unsigned int iwl_mvm_max_amsdu_size(struct iwl_mvm *mvm, ++ struct ieee80211_sta *sta, ++ unsigned int tid) ++{ ++ struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); ++ enum nl80211_band band = mvmsta->vif->bss_conf.chandef.chan->band; ++ u8 ac = tid_to_mac80211_ac[tid]; ++ unsigned int txf; ++ int lmac = IWL_LMAC_24G_INDEX; ++ ++ if (iwl_mvm_is_cdb_supported(mvm) && ++ band == NL80211_BAND_5GHZ) ++ lmac = IWL_LMAC_5G_INDEX; ++ ++ /* For HE redirect to trigger based fifos */ ++ if (sta->he_cap.has_he && !WARN_ON(!iwl_mvm_has_new_tx_api(mvm))) ++ ac += 4; ++ ++ txf = iwl_mvm_mac_ac_to_tx_fifo(mvm, ac); ++ ++ /* ++ * Don't send an AMSDU that will be longer than the TXF. ++ * Add a security margin of 256 for the TX command + headers. ++ * We also want to have the start of the next packet inside the ++ * fifo to be able to send bursts. ++ */ ++ return min_t(unsigned int, mvmsta->max_amsdu_len, ++ mvm->fwrt.smem_cfg.lmac[lmac].txfifo_size[txf] - 256); ++} ++ + static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb, + struct ieee80211_tx_info *info, + struct ieee80211_sta *sta, +@@ -790,7 +820,7 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb, + u16 snap_ip_tcp, pad; + unsigned int dbg_max_amsdu_len; + netdev_features_t netdev_flags = NETIF_F_CSUM_MASK | NETIF_F_SG; +- u8 tid, txf; ++ u8 tid; + + snap_ip_tcp = 8 + skb_transport_header(skb) - skb_network_header(skb) + + tcp_hdrlen(skb); +@@ -829,20 +859,7 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb, + !(mvmsta->amsdu_enabled & BIT(tid))) + return iwl_mvm_tx_tso_segment(skb, 1, netdev_flags, mpdus_skb); + +- max_amsdu_len = mvmsta->max_amsdu_len; +- +- /* the Tx FIFO to which this A-MSDU will be routed */ +- txf = iwl_mvm_mac_ac_to_tx_fifo(mvm, tid_to_mac80211_ac[tid]); +- +- /* +- * Don't send an AMSDU that will be longer than the TXF. +- * Add a security margin of 256 for the TX command + headers. +- * We also want to have the start of the next packet inside the +- * fifo to be able to send bursts. +- */ +- max_amsdu_len = min_t(unsigned int, max_amsdu_len, +- mvm->fwrt.smem_cfg.lmac[0].txfifo_size[txf] - +- 256); ++ max_amsdu_len = iwl_mvm_max_amsdu_size(mvm, sta, tid); + + if (unlikely(dbg_max_amsdu_len)) + max_amsdu_len = min_t(unsigned int, max_amsdu_len, +@@ -1438,6 +1455,14 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, + break; + } + ++ /* ++ * If we are freeing multiple frames, mark all the frames ++ * but the first one as acked, since they were acknowledged ++ * before ++ * */ ++ if (skb_freed > 1) ++ info->flags |= IEEE80211_TX_STAT_ACK; ++ + iwl_mvm_tx_status_check_trigger(mvm, status); + + info->status.rates[0].count = tx_resp->failure_frame + 1; +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +index 00f9566bcc21..e9d67ba3e56d 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +@@ -102,66 +102,6 @@ struct isr_statistics { + u32 unhandled; + }; + +-#define IWL_CD_STTS_OPTIMIZED_POS 0 +-#define IWL_CD_STTS_OPTIMIZED_MSK 0x01 +-#define IWL_CD_STTS_TRANSFER_STATUS_POS 1 +-#define IWL_CD_STTS_TRANSFER_STATUS_MSK 0x0E +-#define IWL_CD_STTS_WIFI_STATUS_POS 4 +-#define IWL_CD_STTS_WIFI_STATUS_MSK 0xF0 +- +-/** +- * enum iwl_completion_desc_transfer_status - transfer status (bits 1-3) +- * @IWL_CD_STTS_END_TRANSFER: successful transfer complete. +- * In sniffer mode, when split is used, set in last CD completion. (RX) +- * @IWL_CD_STTS_OVERFLOW: In sniffer mode, when using split - used for +- * all CD completion. (RX) +- * @IWL_CD_STTS_ABORTED: CR abort / close flow. (RX) +- */ +-enum iwl_completion_desc_transfer_status { +- IWL_CD_STTS_UNUSED, +- IWL_CD_STTS_UNUSED_2, +- IWL_CD_STTS_END_TRANSFER, +- IWL_CD_STTS_OVERFLOW, +- IWL_CD_STTS_ABORTED, +- IWL_CD_STTS_ERROR, +-}; +- +-/** +- * enum iwl_completion_desc_wifi_status - wifi status (bits 4-7) +- * @IWL_CD_STTS_VALID: the packet is valid (RX) +- * @IWL_CD_STTS_FCS_ERR: frame check sequence error (RX) +- * @IWL_CD_STTS_SEC_KEY_ERR: error handling the security key of rx (RX) +- * @IWL_CD_STTS_DECRYPTION_ERR: error decrypting the frame (RX) +- * @IWL_CD_STTS_DUP: duplicate packet (RX) +- * @IWL_CD_STTS_ICV_MIC_ERR: MIC error (RX) +- * @IWL_CD_STTS_INTERNAL_SNAP_ERR: problems removing the snap (RX) +- * @IWL_CD_STTS_SEC_PORT_FAIL: security port fail (RX) +- * @IWL_CD_STTS_BA_OLD_SN: block ack received old SN (RX) +- * @IWL_CD_STTS_QOS_NULL: QoS null packet (RX) +- * @IWL_CD_STTS_MAC_HDR_ERR: MAC header conversion error (RX) +- * @IWL_CD_STTS_MAX_RETRANS: reached max number of retransmissions (TX) +- * @IWL_CD_STTS_EX_LIFETIME: exceeded lifetime (TX) +- * @IWL_CD_STTS_NOT_USED: completed but not used (RX) +- * @IWL_CD_STTS_REPLAY_ERR: pn check failed, replay error (RX) +- */ +-enum iwl_completion_desc_wifi_status { +- IWL_CD_STTS_VALID, +- IWL_CD_STTS_FCS_ERR, +- IWL_CD_STTS_SEC_KEY_ERR, +- IWL_CD_STTS_DECRYPTION_ERR, +- IWL_CD_STTS_DUP, +- IWL_CD_STTS_ICV_MIC_ERR, +- IWL_CD_STTS_INTERNAL_SNAP_ERR, +- IWL_CD_STTS_SEC_PORT_FAIL, +- IWL_CD_STTS_BA_OLD_SN, +- IWL_CD_STTS_QOS_NULL, +- IWL_CD_STTS_MAC_HDR_ERR, +- IWL_CD_STTS_MAX_RETRANS, +- IWL_CD_STTS_EX_LIFETIME, +- IWL_CD_STTS_NOT_USED, +- IWL_CD_STTS_REPLAY_ERR, +-}; +- + #define IWL_RX_TD_TYPE_MSK 0xff000000 + #define IWL_RX_TD_SIZE_MSK 0x00ffffff + #define IWL_RX_TD_SIZE_2K BIT(11) +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +index 1d144985ea58..80a1a50f5da5 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +@@ -1198,7 +1198,8 @@ static void iwl_pcie_rx_reuse_rbd(struct iwl_trans *trans, + static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, + struct iwl_rxq *rxq, + struct iwl_rx_mem_buffer *rxb, +- bool emergency) ++ bool emergency, ++ int i) + { + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); + struct iwl_txq *txq = trans_pcie->txq[trans_pcie->cmd_queue]; +@@ -1224,6 +1225,9 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, + .truesize = max_len, + }; + ++ if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) ++ rxcb.status = rxq->cd[i].status; ++ + pkt = rxb_addr(&rxcb); + + if (pkt->len_n_flags == cpu_to_le32(FH_RSCSR_FRAME_INVALID)) { +@@ -1430,7 +1434,7 @@ restart: + goto out; + + IWL_DEBUG_RX(trans, "Q %d: HW = %d, SW = %d\n", rxq->id, r, i); +- iwl_pcie_rx_handle_rb(trans, rxq, rxb, emergency); ++ iwl_pcie_rx_handle_rb(trans, rxq, rxb, emergency, i); + + i = (i + 1) & (rxq->queue_size - 1); + +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +index 7d319b6863fe..954f932e9c88 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +@@ -1830,18 +1830,30 @@ static u32 iwl_trans_pcie_read32(struct iwl_trans *trans, u32 ofs) + return readl(IWL_TRANS_GET_PCIE_TRANS(trans)->hw_base + ofs); + } + ++static u32 iwl_trans_pcie_prph_msk(struct iwl_trans *trans) ++{ ++ if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) ++ return 0x00FFFFFF; ++ else ++ return 0x000FFFFF; ++} ++ + static u32 iwl_trans_pcie_read_prph(struct iwl_trans *trans, u32 reg) + { ++ u32 mask = iwl_trans_pcie_prph_msk(trans); ++ + iwl_trans_pcie_write32(trans, HBUS_TARG_PRPH_RADDR, +- ((reg & 0x000FFFFF) | (3 << 24))); ++ ((reg & mask) | (3 << 24))); + return iwl_trans_pcie_read32(trans, HBUS_TARG_PRPH_RDAT); + } + + static void iwl_trans_pcie_write_prph(struct iwl_trans *trans, u32 addr, + u32 val) + { ++ u32 mask = iwl_trans_pcie_prph_msk(trans); ++ + iwl_trans_pcie_write32(trans, HBUS_TARG_PRPH_WADDR, +- ((addr & 0x000FFFFF) | (3 << 24))); ++ ((addr & mask) | (3 << 24))); + iwl_trans_pcie_write32(trans, HBUS_TARG_PRPH_WDAT, val); + } + +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +index b99f33ff9123..61ffa1d1a00d 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +@@ -526,7 +526,12 @@ struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans, + + hdr_len = ieee80211_hdrlen(hdr->frame_control); + +- if (amsdu) ++ /* ++ * Only build A-MSDUs here if doing so by GSO, otherwise it may be ++ * an A-MSDU for other reasons, e.g. NAN or an A-MSDU having been ++ * built in the higher layers already. ++ */ ++ if (amsdu && skb_shinfo(skb)->gso_size) + return iwl_pcie_gen2_build_tx_amsdu(trans, txq, dev_cmd, skb, + out_meta, hdr_len, len); + +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +index 42fdb7970cfd..2fec394a988c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +@@ -1103,7 +1103,7 @@ void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn, + + if (!iwl_queue_used(txq, last_to_free)) { + IWL_ERR(trans, +- "%s: Read index for DMA queue txq id (%d), last_to_free %d is out of range [0-%d] %d %d.\n", ++ "%s: Read index for txq id (%d), last_to_free %d is out of range [0-%d] %d %d.\n", + __func__, txq_id, last_to_free, + trans->cfg->base_params->max_tfd_queue_size, + txq->write_ptr, txq->read_ptr); +diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c +index 433c6a16870b..d445acc4786b 100644 +--- a/drivers/net/wireless/marvell/mwifiex/usb.c ++++ b/drivers/net/wireless/marvell/mwifiex/usb.c +@@ -298,6 +298,19 @@ static int mwifiex_usb_submit_rx_urb(struct urb_context *ctx, int size) + struct mwifiex_adapter *adapter = ctx->adapter; + struct usb_card_rec *card = (struct usb_card_rec *)adapter->card; + ++ if (test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { ++ if (card->rx_cmd_ep == ctx->ep) { ++ mwifiex_dbg(adapter, INFO, "%s: free rx_cmd skb\n", ++ __func__); ++ dev_kfree_skb_any(ctx->skb); ++ ctx->skb = NULL; ++ } ++ mwifiex_dbg(adapter, ERROR, ++ "%s: card removed/suspended, EP %d rx_cmd URB submit skipped\n", ++ __func__, ctx->ep); ++ return -1; ++ } ++ + if (card->rx_cmd_ep != ctx->ep) { + ctx->skb = dev_alloc_skb(size); + if (!ctx->skb) { +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/tx.c b/drivers/net/wireless/mediatek/mt76/mt76x0/tx.c +index 751b49c28ae5..c45d05d5aab1 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x0/tx.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x0/tx.c +@@ -166,7 +166,7 @@ void mt76x0_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, + if (sta) { + msta = (struct mt76_sta *) sta->drv_priv; + wcid = &msta->wcid; +- } else if (vif && (!info->control.hw_key && wcid->hw_key_idx != -1)) { ++ } else if (vif && (!info->control.hw_key && wcid->hw_key_idx != 0xff)) { + struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv; + + wcid = &mvif->group_wcid; +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2_tx_common.c b/drivers/net/wireless/mediatek/mt76/mt76x2_tx_common.c +index 36afb166fa3f..c0ca0df84ed8 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x2_tx_common.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x2_tx_common.c +@@ -32,7 +32,7 @@ void mt76x2_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, + msta = (struct mt76x2_sta *)control->sta->drv_priv; + wcid = &msta->wcid; + /* sw encrypted frames */ +- if (!info->control.hw_key && wcid->hw_key_idx != -1) ++ if (!info->control.hw_key && wcid->hw_key_idx != 0xff) + control->sta = NULL; + } + +diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8187/leds.c b/drivers/net/wireless/realtek/rtl818x/rtl8187/leds.c +index c2d5b495c179..c089540116fa 100644 +--- a/drivers/net/wireless/realtek/rtl818x/rtl8187/leds.c ++++ b/drivers/net/wireless/realtek/rtl818x/rtl8187/leds.c +@@ -146,7 +146,7 @@ static int rtl8187_register_led(struct ieee80211_hw *dev, + led->dev = dev; + led->ledpin = ledpin; + led->is_radio = is_radio; +- strncpy(led->name, name, sizeof(led->name)); ++ strlcpy(led->name, name, sizeof(led->name)); + + led->led_dev.name = led->name; + led->led_dev.default_trigger = default_trigger; +diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c +index d32eba11c000..30c040786fde 100644 +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -692,7 +692,7 @@ static struct nvmem_device *nvmem_find(const char *name) + d = bus_find_device_by_name(&nvmem_bus_type, NULL, name); + + if (!d) +- return NULL; ++ return ERR_PTR(-ENOENT); + + return to_nvmem_device(d); + } +diff --git a/drivers/of/base.c b/drivers/of/base.c +index 3f21ea6a90dc..f0dbb7ad88cf 100644 +--- a/drivers/of/base.c ++++ b/drivers/of/base.c +@@ -2066,7 +2066,7 @@ struct device_node *of_find_next_cache_node(const struct device_node *np) + /* OF on pmac has nodes instead of properties named "l2-cache" + * beneath CPU nodes. + */ +- if (!strcmp(np->type, "cpu")) ++ if (IS_ENABLED(CONFIG_PPC_PMAC) && !strcmp(np->type, "cpu")) + for_each_child_of_node(np, child) + if (!strcmp(child->type, "cache")) + return child; +diff --git a/drivers/of/unittest-data/overlay_15.dts b/drivers/of/unittest-data/overlay_15.dts +index b98f2514df4b..5728490474f6 100644 +--- a/drivers/of/unittest-data/overlay_15.dts ++++ b/drivers/of/unittest-data/overlay_15.dts +@@ -20,8 +20,8 @@ + #size-cells = <0>; + reg = <0>; + +- test-mux-dev { +- reg = <32>; ++ test-mux-dev@20 { ++ reg = <0x20>; + compatible = "unittest-i2c-dev"; + status = "okay"; + }; +diff --git a/drivers/of/unittest-data/tests-overlay.dtsi b/drivers/of/unittest-data/tests-overlay.dtsi +index 25cf397b8f6b..4ea024d908ee 100644 +--- a/drivers/of/unittest-data/tests-overlay.dtsi ++++ b/drivers/of/unittest-data/tests-overlay.dtsi +@@ -103,8 +103,8 @@ + #size-cells = <0>; + reg = <0>; + +- test-mux-dev { +- reg = <32>; ++ test-mux-dev@20 { ++ reg = <0x20>; + compatible = "unittest-i2c-dev"; + status = "okay"; + }; +diff --git a/drivers/opp/core.c b/drivers/opp/core.c +index f3433bf47b10..14d4ef594374 100644 +--- a/drivers/opp/core.c ++++ b/drivers/opp/core.c +@@ -48,9 +48,14 @@ static struct opp_device *_find_opp_dev(const struct device *dev, + static struct opp_table *_find_opp_table_unlocked(struct device *dev) + { + struct opp_table *opp_table; ++ bool found; + + list_for_each_entry(opp_table, &opp_tables, node) { +- if (_find_opp_dev(dev, opp_table)) { ++ mutex_lock(&opp_table->lock); ++ found = !!_find_opp_dev(dev, opp_table); ++ mutex_unlock(&opp_table->lock); ++ ++ if (found) { + _get_opp_table_kref(opp_table); + + return opp_table; +@@ -766,6 +771,8 @@ struct opp_device *_add_opp_dev(const struct device *dev, + + /* Initialize opp-dev */ + opp_dev->dev = dev; ++ ++ mutex_lock(&opp_table->lock); + list_add(&opp_dev->node, &opp_table->dev_list); + + /* Create debugfs entries for the opp_table */ +@@ -773,6 +780,7 @@ struct opp_device *_add_opp_dev(const struct device *dev, + if (ret) + dev_err(dev, "%s: Failed to register opp debugfs (%d)\n", + __func__, ret); ++ mutex_unlock(&opp_table->lock); + + return opp_dev; + } +@@ -791,6 +799,7 @@ static struct opp_table *_allocate_opp_table(struct device *dev) + if (!opp_table) + return NULL; + ++ mutex_init(&opp_table->lock); + INIT_LIST_HEAD(&opp_table->dev_list); + + opp_dev = _add_opp_dev(dev, opp_table); +@@ -812,7 +821,6 @@ static struct opp_table *_allocate_opp_table(struct device *dev) + + BLOCKING_INIT_NOTIFIER_HEAD(&opp_table->head); + INIT_LIST_HEAD(&opp_table->opp_list); +- mutex_init(&opp_table->lock); + kref_init(&opp_table->kref); + + /* Secure the device table modification */ +@@ -854,6 +862,10 @@ static void _opp_table_kref_release(struct kref *kref) + if (!IS_ERR(opp_table->clk)) + clk_put(opp_table->clk); + ++ /* ++ * No need to take opp_table->lock here as we are guaranteed that no ++ * references to the OPP table are taken at this point. ++ */ + opp_dev = list_first_entry(&opp_table->dev_list, struct opp_device, + node); + +@@ -1719,6 +1731,9 @@ void _dev_pm_opp_remove_table(struct opp_table *opp_table, struct device *dev, + { + struct dev_pm_opp *opp, *tmp; + ++ /* Protect dev_list */ ++ mutex_lock(&opp_table->lock); ++ + /* Find if opp_table manages a single device */ + if (list_is_singular(&opp_table->dev_list)) { + /* Free static OPPs */ +@@ -1736,6 +1751,8 @@ void _dev_pm_opp_remove_table(struct opp_table *opp_table, struct device *dev, + } else { + _remove_opp_dev(_find_opp_dev(dev, opp_table), opp_table); + } ++ ++ mutex_unlock(&opp_table->lock); + } + + void _dev_pm_opp_find_and_remove_table(struct device *dev, bool remove_all) +diff --git a/drivers/opp/cpu.c b/drivers/opp/cpu.c +index 0c0910709435..2868a022a040 100644 +--- a/drivers/opp/cpu.c ++++ b/drivers/opp/cpu.c +@@ -222,8 +222,10 @@ int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask) + cpumask_clear(cpumask); + + if (opp_table->shared_opp == OPP_TABLE_ACCESS_SHARED) { ++ mutex_lock(&opp_table->lock); + list_for_each_entry(opp_dev, &opp_table->dev_list, node) + cpumask_set_cpu(opp_dev->dev->id, cpumask); ++ mutex_unlock(&opp_table->lock); + } else { + cpumask_set_cpu(cpu_dev->id, cpumask); + } +diff --git a/drivers/opp/opp.h b/drivers/opp/opp.h +index 7c540fd063b2..e0866b1c1f1b 100644 +--- a/drivers/opp/opp.h ++++ b/drivers/opp/opp.h +@@ -126,7 +126,7 @@ enum opp_table_access { + * @dev_list: list of devices that share these OPPs + * @opp_list: table of opps + * @kref: for reference count of the table. +- * @lock: mutex protecting the opp_list. ++ * @lock: mutex protecting the opp_list and dev_list. + * @np: struct device_node pointer for opp's DT node. + * @clock_latency_ns_max: Max clock latency in nanoseconds. + * @shared_opp: OPP is shared between multiple devices. +diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c +index c5ff6ca65eab..0d100f56cb88 100644 +--- a/drivers/pci/controller/pcie-mediatek.c ++++ b/drivers/pci/controller/pcie-mediatek.c +@@ -1120,7 +1120,9 @@ static int mtk_pcie_request_resources(struct mtk_pcie *pcie) + if (err < 0) + return err; + +- devm_pci_remap_iospace(dev, &pcie->pio, pcie->io.start); ++ err = devm_pci_remap_iospace(dev, &pcie->pio, pcie->io.start); ++ if (err) ++ return err; + + return 0; + } +diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c +index ec48c9433ae5..518c46f8e63b 100644 +--- a/drivers/pci/hotplug/pciehp_core.c ++++ b/drivers/pci/hotplug/pciehp_core.c +@@ -348,7 +348,7 @@ static struct pcie_port_service_driver hpdriver_portdrv = { + #endif /* PM */ + }; + +-static int __init pcied_init(void) ++int __init pcie_hp_init(void) + { + int retval = 0; + +@@ -359,4 +359,3 @@ static int __init pcied_init(void) + + return retval; + } +-device_initcall(pcied_init); +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 2baf1f82f893..c9f51fc24563 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -35,6 +35,8 @@ + #include <linux/aer.h> + #include "pci.h" + ++DEFINE_MUTEX(pci_slot_mutex); ++ + const char *pci_power_names[] = { + "error", "D0", "D1", "D2", "D3hot", "D3cold", "unknown", + }; +@@ -5191,6 +5193,41 @@ static int pci_bus_reset(struct pci_bus *bus, int probe) + return ret; + } + ++/** ++ * pci_bus_error_reset - reset the bridge's subordinate bus ++ * @bridge: The parent device that connects to the bus to reset ++ * ++ * This function will first try to reset the slots on this bus if the method is ++ * available. If slot reset fails or is not available, this will fall back to a ++ * secondary bus reset. ++ */ ++int pci_bus_error_reset(struct pci_dev *bridge) ++{ ++ struct pci_bus *bus = bridge->subordinate; ++ struct pci_slot *slot; ++ ++ if (!bus) ++ return -ENOTTY; ++ ++ mutex_lock(&pci_slot_mutex); ++ if (list_empty(&bus->slots)) ++ goto bus_reset; ++ ++ list_for_each_entry(slot, &bus->slots, list) ++ if (pci_probe_reset_slot(slot)) ++ goto bus_reset; ++ ++ list_for_each_entry(slot, &bus->slots, list) ++ if (pci_slot_reset(slot, 0)) ++ goto bus_reset; ++ ++ mutex_unlock(&pci_slot_mutex); ++ return 0; ++bus_reset: ++ mutex_unlock(&pci_slot_mutex); ++ return pci_bus_reset(bridge->subordinate, 0); ++} ++ + /** + * pci_probe_reset_bus - probe whether a PCI bus can be reset + * @bus: PCI bus to probe +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index ab25752f00d9..e9ede82ee2c2 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -35,6 +35,7 @@ int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vmai, + + int pci_probe_reset_function(struct pci_dev *dev); + int pci_bridge_secondary_bus_reset(struct pci_dev *dev); ++int pci_bus_error_reset(struct pci_dev *dev); + + /** + * struct pci_platform_pm_ops - Firmware PM callbacks +@@ -136,6 +137,7 @@ static inline void pci_remove_legacy_files(struct pci_bus *bus) { return; } + + /* Lock for read/write access to pci device and bus lists */ + extern struct rw_semaphore pci_bus_sem; ++extern struct mutex pci_slot_mutex; + + extern raw_spinlock_t pci_lock; + +diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c +index 83180edd6ed4..1563e22600ec 100644 +--- a/drivers/pci/pcie/aer.c ++++ b/drivers/pci/pcie/aer.c +@@ -866,7 +866,7 @@ void cper_print_aer(struct pci_dev *dev, int aer_severity, + static int add_error_device(struct aer_err_info *e_info, struct pci_dev *dev) + { + if (e_info->error_dev_num < AER_MAX_MULTI_ERR_DEVICES) { +- e_info->dev[e_info->error_dev_num] = dev; ++ e_info->dev[e_info->error_dev_num] = pci_dev_get(dev); + e_info->error_dev_num++; + return 0; + } +@@ -1013,6 +1013,7 @@ static void handle_error_source(struct pci_dev *dev, struct aer_err_info *info) + pcie_do_nonfatal_recovery(dev); + else if (info->severity == AER_FATAL) + pcie_do_fatal_recovery(dev, PCIE_PORT_SERVICE_AER); ++ pci_dev_put(dev); + } + + #ifdef CONFIG_ACPI_APEI_PCIEAER +@@ -1115,8 +1116,9 @@ int aer_get_device_error_info(struct pci_dev *dev, struct aer_err_info *info) + &info->mask); + if (!(info->status & ~info->mask)) + return 0; +- } else if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || +- info->severity == AER_NONFATAL) { ++ } else if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || ++ pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM || ++ info->severity == AER_NONFATAL) { + + /* Link is still healthy for IO reads */ + pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, +@@ -1526,7 +1528,7 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev) + reg32 &= ~ROOT_PORT_INTR_ON_MESG_MASK; + pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND, reg32); + +- rc = pci_bridge_secondary_bus_reset(dev); ++ rc = pci_bus_error_reset(dev); + pci_printk(KERN_DEBUG, dev, "Root Port link has been reset\n"); + + /* Clear Root Error Status */ +@@ -1569,10 +1571,9 @@ static struct pcie_port_service_driver aerdriver = { + * + * Invoked when AER root service driver is loaded. + */ +-static int __init aer_service_init(void) ++int __init pcie_aer_init(void) + { + if (!pci_aer_available() || aer_acpi_firmware_first()) + return -ENXIO; + return pcie_port_service_register(&aerdriver); + } +-device_initcall(aer_service_init); +diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c +index 1908dd2978d3..118b5bcae42e 100644 +--- a/drivers/pci/pcie/dpc.c ++++ b/drivers/pci/pcie/dpc.c +@@ -307,8 +307,7 @@ static struct pcie_port_service_driver dpcdriver = { + .reset_link = dpc_reset_link, + }; + +-static int __init dpc_service_init(void) ++int __init pcie_dpc_init(void) + { + return pcie_port_service_register(&dpcdriver); + } +-device_initcall(dpc_service_init); +diff --git a/drivers/pci/pcie/err.c b/drivers/pci/pcie/err.c +index 708fd3a0d646..2c3b5bd59b18 100644 +--- a/drivers/pci/pcie/err.c ++++ b/drivers/pci/pcie/err.c +@@ -63,30 +63,12 @@ static int report_error_detected(struct pci_dev *dev, void *data) + if (!dev->driver || + !dev->driver->err_handler || + !dev->driver->err_handler->error_detected) { +- if (result_data->state == pci_channel_io_frozen && +- dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) { +- /* +- * In case of fatal recovery, if one of down- +- * stream device has no driver. We might be +- * unable to recover because a later insmod +- * of a driver for this device is unaware of +- * its hw state. +- */ +- pci_printk(KERN_DEBUG, dev, "device has %s\n", +- dev->driver ? +- "no AER-aware driver" : "no driver"); +- } +- + /* +- * If there's any device in the subtree that does not +- * have an error_detected callback, returning +- * PCI_ERS_RESULT_NO_AER_DRIVER prevents calling of +- * the subsequent mmio_enabled/slot_reset/resume +- * callbacks of "any" device in the subtree. All the +- * devices in the subtree are left in the error state +- * without recovery. ++ * If any device in the subtree does not have an error_detected ++ * callback, PCI_ERS_RESULT_NO_AER_DRIVER prevents subsequent ++ * error callbacks of "any" device in the subtree, and will ++ * exit in the disconnected error state. + */ +- + if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) + vote = PCI_ERS_RESULT_NO_AER_DRIVER; + else +@@ -177,41 +159,30 @@ static pci_ers_result_t default_reset_link(struct pci_dev *dev) + { + int rc; + +- rc = pci_bridge_secondary_bus_reset(dev); ++ rc = pci_bus_error_reset(dev); + pci_printk(KERN_DEBUG, dev, "downstream link has been reset\n"); + return rc ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED; + } + + static pci_ers_result_t reset_link(struct pci_dev *dev, u32 service) + { +- struct pci_dev *udev; + pci_ers_result_t status; + struct pcie_port_service_driver *driver = NULL; + +- if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { +- /* Reset this port for all subordinates */ +- udev = dev; +- } else { +- /* Reset the upstream component (likely downstream port) */ +- udev = dev->bus->self; +- } +- +- /* Use the aer driver of the component firstly */ +- driver = pcie_port_find_service(udev, service); +- ++ driver = pcie_port_find_service(dev, service); + if (driver && driver->reset_link) { +- status = driver->reset_link(udev); +- } else if (udev->has_secondary_link) { +- status = default_reset_link(udev); ++ status = driver->reset_link(dev); ++ } else if (dev->has_secondary_link) { ++ status = default_reset_link(dev); + } else { + pci_printk(KERN_DEBUG, dev, "no link-reset support at upstream device %s\n", +- pci_name(udev)); ++ pci_name(dev)); + return PCI_ERS_RESULT_DISCONNECT; + } + + if (status != PCI_ERS_RESULT_RECOVERED) { + pci_printk(KERN_DEBUG, dev, "link reset at upstream device %s failed\n", +- pci_name(udev)); ++ pci_name(dev)); + return PCI_ERS_RESULT_DISCONNECT; + } + +@@ -243,31 +214,7 @@ static pci_ers_result_t broadcast_error_message(struct pci_dev *dev, + else + result_data.result = PCI_ERS_RESULT_RECOVERED; + +- if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { +- /* +- * If the error is reported by a bridge, we think this error +- * is related to the downstream link of the bridge, so we +- * do error recovery on all subordinates of the bridge instead +- * of the bridge and clear the error status of the bridge. +- */ +- if (cb == report_error_detected) +- dev->error_state = state; +- pci_walk_bus(dev->subordinate, cb, &result_data); +- if (cb == report_resume) { +- pci_aer_clear_device_status(dev); +- pci_cleanup_aer_uncorrect_error_status(dev); +- dev->error_state = pci_channel_io_normal; +- } +- } else { +- /* +- * If the error is reported by an end point, we think this +- * error is related to the upstream link of the end point. +- * The error is non fatal so the bus is ok; just invoke +- * the callback for the function that logged the error. +- */ +- cb(dev, &result_data); +- } +- ++ pci_walk_bus(dev->subordinate, cb, &result_data); + return result_data.result; + } + +@@ -347,6 +294,14 @@ void pcie_do_nonfatal_recovery(struct pci_dev *dev) + + state = pci_channel_io_normal; + ++ /* ++ * Error recovery runs on all subordinates of the first downstream port. ++ * If the downstream port detected the error, it is cleared at the end. ++ */ ++ if (!(pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || ++ pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM)) ++ dev = dev->bus->self; ++ + status = broadcast_error_message(dev, + state, + "error_detected", +@@ -378,6 +333,8 @@ void pcie_do_nonfatal_recovery(struct pci_dev *dev) + "resume", + report_resume); + ++ pci_aer_clear_device_status(dev); ++ pci_cleanup_aer_uncorrect_error_status(dev); + pci_info(dev, "AER: Device recovery successful\n"); + return; + +diff --git a/drivers/pci/pcie/pme.c b/drivers/pci/pcie/pme.c +index 6ac17f0c4077..54d593d10396 100644 +--- a/drivers/pci/pcie/pme.c ++++ b/drivers/pci/pcie/pme.c +@@ -455,8 +455,7 @@ static struct pcie_port_service_driver pcie_pme_driver = { + /** + * pcie_pme_service_init - Register the PCIe PME service driver. + */ +-static int __init pcie_pme_service_init(void) ++int __init pcie_pme_init(void) + { + return pcie_port_service_register(&pcie_pme_driver); + } +-device_initcall(pcie_pme_service_init); +diff --git a/drivers/pci/pcie/portdrv.h b/drivers/pci/pcie/portdrv.h +index d59afa42fc14..2498b2d34009 100644 +--- a/drivers/pci/pcie/portdrv.h ++++ b/drivers/pci/pcie/portdrv.h +@@ -23,6 +23,30 @@ + + #define PCIE_PORT_DEVICE_MAXSERVICES 4 + ++#ifdef CONFIG_PCIEAER ++int pcie_aer_init(void); ++#else ++static inline int pcie_aer_init(void) { return 0; } ++#endif ++ ++#ifdef CONFIG_HOTPLUG_PCI_PCIE ++int pcie_hp_init(void); ++#else ++static inline int pcie_hp_init(void) { return 0; } ++#endif ++ ++#ifdef CONFIG_PCIE_PME ++int pcie_pme_init(void); ++#else ++static inline int pcie_pme_init(void) { return 0; } ++#endif ++ ++#ifdef CONFIG_PCIE_DPC ++int pcie_dpc_init(void); ++#else ++static inline int pcie_dpc_init(void) { return 0; } ++#endif ++ + /* Port Type */ + #define PCIE_ANY_PORT (~0) + +diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c +index eef22dc29140..23a5a0c2c3fe 100644 +--- a/drivers/pci/pcie/portdrv_pci.c ++++ b/drivers/pci/pcie/portdrv_pci.c +@@ -226,11 +226,20 @@ static const struct dmi_system_id pcie_portdrv_dmi_table[] __initconst = { + {} + }; + ++static void __init pcie_init_services(void) ++{ ++ pcie_aer_init(); ++ pcie_pme_init(); ++ pcie_dpc_init(); ++ pcie_hp_init(); ++} ++ + static int __init pcie_portdrv_init(void) + { + if (pcie_ports_disabled) + return -EACCES; + ++ pcie_init_services(); + dmi_check_system(pcie_portdrv_dmi_table); + + return pci_register_driver(&pcie_portdriver); +diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c +index e634229ece89..a32897f83ee5 100644 +--- a/drivers/pci/slot.c ++++ b/drivers/pci/slot.c +@@ -14,7 +14,6 @@ + + struct kset *pci_slots_kset; + EXPORT_SYMBOL_GPL(pci_slots_kset); +-static DEFINE_MUTEX(pci_slot_mutex); + + static ssize_t pci_slot_attr_show(struct kobject *kobj, + struct attribute *attr, char *buf) +diff --git a/drivers/phy/broadcom/Kconfig b/drivers/phy/broadcom/Kconfig +index 8786a9674471..aa917a61071d 100644 +--- a/drivers/phy/broadcom/Kconfig ++++ b/drivers/phy/broadcom/Kconfig +@@ -60,7 +60,8 @@ config PHY_NS2_USB_DRD + + config PHY_BRCM_SATA + tristate "Broadcom SATA PHY driver" +- depends on ARCH_BRCMSTB || ARCH_BCM_IPROC || BMIPS_GENERIC || COMPILE_TEST ++ depends on ARCH_BRCMSTB || ARCH_BCM_IPROC || BMIPS_GENERIC || \ ++ ARCH_BCM_63XX || COMPILE_TEST + depends on OF + select GENERIC_PHY + default ARCH_BCM_IPROC +diff --git a/drivers/phy/lantiq/phy-lantiq-rcu-usb2.c b/drivers/phy/lantiq/phy-lantiq-rcu-usb2.c +index 986224fca9e9..5a180f71d8d4 100644 +--- a/drivers/phy/lantiq/phy-lantiq-rcu-usb2.c ++++ b/drivers/phy/lantiq/phy-lantiq-rcu-usb2.c +@@ -156,7 +156,6 @@ static int ltq_rcu_usb2_of_parse(struct ltq_rcu_usb2_priv *priv, + { + struct device *dev = priv->dev; + const __be32 *offset; +- int ret; + + priv->reg_bits = of_device_get_match_data(dev); + +diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c +index 6fb2b6969590..d22b1ec2e58c 100644 +--- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c ++++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c +@@ -199,7 +199,7 @@ static void rcar_gen3_init_from_a_peri_to_a_host(struct rcar_gen3_chan *ch) + val = readl(usb2_base + USB2_OBINTEN); + writel(val & ~USB2_OBINT_BITS, usb2_base + USB2_OBINTEN); + +- rcar_gen3_enable_vbus_ctrl(ch, 0); ++ rcar_gen3_enable_vbus_ctrl(ch, 1); + rcar_gen3_init_for_host(ch); + + writel(val | USB2_OBINT_BITS, usb2_base + USB2_OBINTEN); +diff --git a/drivers/phy/ti/phy-twl4030-usb.c b/drivers/phy/ti/phy-twl4030-usb.c +index a44680d64f9b..c267afb68f07 100644 +--- a/drivers/phy/ti/phy-twl4030-usb.c ++++ b/drivers/phy/ti/phy-twl4030-usb.c +@@ -144,6 +144,7 @@ + #define PMBR1 0x0D + #define GPIO_USB_4PIN_ULPI_2430C (3 << 0) + ++static irqreturn_t twl4030_usb_irq(int irq, void *_twl); + /* + * If VBUS is valid or ID is ground, then we know a + * cable is present and we need to be runtime-enabled +@@ -395,6 +396,33 @@ static void __twl4030_phy_power(struct twl4030_usb *twl, int on) + WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0); + } + ++static int __maybe_unused twl4030_usb_suspend(struct device *dev) ++{ ++ struct twl4030_usb *twl = dev_get_drvdata(dev); ++ ++ /* ++ * we need enabled runtime on resume, ++ * so turn irq off here, so we do not get it early ++ * note: wakeup on usb plug works independently of this ++ */ ++ dev_dbg(twl->dev, "%s\n", __func__); ++ disable_irq(twl->irq); ++ ++ return 0; ++} ++ ++static int __maybe_unused twl4030_usb_resume(struct device *dev) ++{ ++ struct twl4030_usb *twl = dev_get_drvdata(dev); ++ ++ dev_dbg(twl->dev, "%s\n", __func__); ++ enable_irq(twl->irq); ++ /* check whether cable status changed */ ++ twl4030_usb_irq(0, twl); ++ ++ return 0; ++} ++ + static int __maybe_unused twl4030_usb_runtime_suspend(struct device *dev) + { + struct twl4030_usb *twl = dev_get_drvdata(dev); +@@ -655,6 +683,7 @@ static const struct phy_ops ops = { + static const struct dev_pm_ops twl4030_usb_pm_ops = { + SET_RUNTIME_PM_OPS(twl4030_usb_runtime_suspend, + twl4030_usb_runtime_resume, NULL) ++ SET_SYSTEM_SLEEP_PM_OPS(twl4030_usb_suspend, twl4030_usb_resume) + }; + + static int twl4030_usb_probe(struct platform_device *pdev) +diff --git a/drivers/pinctrl/pinctrl-at91-pio4.c b/drivers/pinctrl/pinctrl-at91-pio4.c +index ef7ab208b951..9e2f3738bf3e 100644 +--- a/drivers/pinctrl/pinctrl-at91-pio4.c ++++ b/drivers/pinctrl/pinctrl-at91-pio4.c +@@ -493,7 +493,6 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev, + unsigned num_pins, num_configs, reserve; + unsigned long *configs; + struct property *pins; +- bool has_config; + u32 pinfunc; + int ret, i; + +@@ -509,9 +508,6 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev, + return ret; + } + +- if (num_configs) +- has_config = true; +- + num_pins = pins->length / sizeof(u32); + if (!num_pins) { + dev_err(pctldev->dev, "no pins found in node %pOF\n", np); +@@ -524,7 +520,7 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev, + * map for each pin. + */ + reserve = 1; +- if (has_config && num_pins >= 1) ++ if (num_configs) + reserve++; + reserve *= num_pins; + ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps, num_maps, +@@ -547,7 +543,7 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev, + pinctrl_utils_add_map_mux(pctldev, map, reserved_maps, num_maps, + group, func); + +- if (has_config) { ++ if (num_configs) { + ret = pinctrl_utils_add_map_configs(pctldev, map, + reserved_maps, num_maps, group, + configs, num_configs, +diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c +index 50f0ec42c637..fad0e132ead8 100644 +--- a/drivers/pinctrl/pinctrl-at91.c ++++ b/drivers/pinctrl/pinctrl-at91.c +@@ -1574,16 +1574,6 @@ void at91_pinctrl_gpio_resume(void) + #define gpio_irq_set_wake NULL + #endif /* CONFIG_PM */ + +-static struct irq_chip gpio_irqchip = { +- .name = "GPIO", +- .irq_ack = gpio_irq_ack, +- .irq_disable = gpio_irq_mask, +- .irq_mask = gpio_irq_mask, +- .irq_unmask = gpio_irq_unmask, +- /* .irq_set_type is set dynamically */ +- .irq_set_wake = gpio_irq_set_wake, +-}; +- + static void gpio_irq_handler(struct irq_desc *desc) + { + struct irq_chip *chip = irq_desc_get_chip(desc); +@@ -1624,12 +1614,22 @@ static int at91_gpio_of_irq_setup(struct platform_device *pdev, + struct gpio_chip *gpiochip_prev = NULL; + struct at91_gpio_chip *prev = NULL; + struct irq_data *d = irq_get_irq_data(at91_gpio->pioc_virq); ++ struct irq_chip *gpio_irqchip; + int ret, i; + ++ gpio_irqchip = devm_kzalloc(&pdev->dev, sizeof(*gpio_irqchip), GFP_KERNEL); ++ if (!gpio_irqchip) ++ return -ENOMEM; ++ + at91_gpio->pioc_hwirq = irqd_to_hwirq(d); + +- /* Setup proper .irq_set_type function */ +- gpio_irqchip.irq_set_type = at91_gpio->ops->irq_type; ++ gpio_irqchip->name = "GPIO"; ++ gpio_irqchip->irq_ack = gpio_irq_ack; ++ gpio_irqchip->irq_disable = gpio_irq_mask; ++ gpio_irqchip->irq_mask = gpio_irq_mask; ++ gpio_irqchip->irq_unmask = gpio_irq_unmask; ++ gpio_irqchip->irq_set_wake = gpio_irq_set_wake, ++ gpio_irqchip->irq_set_type = at91_gpio->ops->irq_type; + + /* Disable irqs of this PIO controller */ + writel_relaxed(~0, at91_gpio->regbase + PIO_IDR); +@@ -1640,7 +1640,7 @@ static int at91_gpio_of_irq_setup(struct platform_device *pdev, + * interrupt. + */ + ret = gpiochip_irqchip_add(&at91_gpio->chip, +- &gpio_irqchip, ++ gpio_irqchip, + 0, + handle_edge_irq, + IRQ_TYPE_NONE); +@@ -1658,7 +1658,7 @@ static int at91_gpio_of_irq_setup(struct platform_device *pdev, + if (!gpiochip_prev) { + /* Then register the chain on the parent IRQ */ + gpiochip_set_chained_irqchip(&at91_gpio->chip, +- &gpio_irqchip, ++ gpio_irqchip, + at91_gpio->pioc_virq, + gpio_irq_handler); + return 0; +diff --git a/drivers/pinctrl/pinctrl-ingenic.c b/drivers/pinctrl/pinctrl-ingenic.c +index 628817c40e3b..a5accffbc8c9 100644 +--- a/drivers/pinctrl/pinctrl-ingenic.c ++++ b/drivers/pinctrl/pinctrl-ingenic.c +@@ -847,4 +847,4 @@ static int __init ingenic_pinctrl_drv_register(void) + { + return platform_driver_register(&ingenic_pinctrl_driver); + } +-postcore_initcall(ingenic_pinctrl_drv_register); ++subsys_initcall(ingenic_pinctrl_drv_register); +diff --git a/drivers/power/reset/at91-sama5d2_shdwc.c b/drivers/power/reset/at91-sama5d2_shdwc.c +index 0206cce328b3..d9493e893d64 100644 +--- a/drivers/power/reset/at91-sama5d2_shdwc.c ++++ b/drivers/power/reset/at91-sama5d2_shdwc.c +@@ -246,6 +246,9 @@ static int __init at91_shdwc_probe(struct platform_device *pdev) + if (!pdev->dev.of_node) + return -ENODEV; + ++ if (at91_shdwc) ++ return -EBUSY; ++ + at91_shdwc = devm_kzalloc(&pdev->dev, sizeof(*at91_shdwc), GFP_KERNEL); + if (!at91_shdwc) + return -ENOMEM; +diff --git a/drivers/power/supply/ab8500_fg.c b/drivers/power/supply/ab8500_fg.c +index 02356f9b5f22..8bb89c697c1e 100644 +--- a/drivers/power/supply/ab8500_fg.c ++++ b/drivers/power/supply/ab8500_fg.c +@@ -2433,17 +2433,14 @@ static ssize_t charge_full_store(struct ab8500_fg *di, const char *buf, + size_t count) + { + unsigned long charge_full; +- ssize_t ret; ++ int ret; + + ret = kstrtoul(buf, 10, &charge_full); ++ if (ret) ++ return ret; + +- dev_dbg(di->dev, "Ret %zd charge_full %lu", ret, charge_full); +- +- if (!ret) { +- di->bat_cap.max_mah = (int) charge_full; +- ret = count; +- } +- return ret; ++ di->bat_cap.max_mah = (int) charge_full; ++ return count; + } + + static ssize_t charge_now_show(struct ab8500_fg *di, char *buf) +@@ -2455,20 +2452,16 @@ static ssize_t charge_now_store(struct ab8500_fg *di, const char *buf, + size_t count) + { + unsigned long charge_now; +- ssize_t ret; ++ int ret; + + ret = kstrtoul(buf, 10, &charge_now); ++ if (ret) ++ return ret; + +- dev_dbg(di->dev, "Ret %zd charge_now %lu was %d", +- ret, charge_now, di->bat_cap.prev_mah); +- +- if (!ret) { +- di->bat_cap.user_mah = (int) charge_now; +- di->flags.user_cap = true; +- ret = count; +- queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); +- } +- return ret; ++ di->bat_cap.user_mah = (int) charge_now; ++ di->flags.user_cap = true; ++ queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); ++ return count; + } + + static struct ab8500_fg_sysfs_entry charge_full_attr = +diff --git a/drivers/power/supply/max8998_charger.c b/drivers/power/supply/max8998_charger.c +index cad7d1a8feec..aa65e6c36c55 100644 +--- a/drivers/power/supply/max8998_charger.c ++++ b/drivers/power/supply/max8998_charger.c +@@ -86,7 +86,7 @@ static const struct power_supply_desc max8998_battery_desc = { + static int max8998_battery_probe(struct platform_device *pdev) + { + struct max8998_dev *iodev = dev_get_drvdata(pdev->dev.parent); +- struct max8998_platform_data *pdata = dev_get_platdata(iodev->dev); ++ struct max8998_platform_data *pdata = iodev->pdata; + struct power_supply_config psy_cfg = {}; + struct max8998_battery_data *max8998; + struct i2c_client *i2c; +diff --git a/drivers/power/supply/twl4030_charger.c b/drivers/power/supply/twl4030_charger.c +index b6a7d9f74cf3..0e202d4273fb 100644 +--- a/drivers/power/supply/twl4030_charger.c ++++ b/drivers/power/supply/twl4030_charger.c +@@ -420,7 +420,8 @@ static void twl4030_current_worker(struct work_struct *data) + + if (v < USB_MIN_VOLT) { + /* Back up and stop adjusting. */ +- bci->usb_cur -= USB_CUR_STEP; ++ if (bci->usb_cur >= USB_CUR_STEP) ++ bci->usb_cur -= USB_CUR_STEP; + bci->usb_cur_target = bci->usb_cur; + } else if (bci->usb_cur >= bci->usb_cur_target || + bci->usb_cur + USB_CUR_STEP > USB_MAX_CURRENT) { +@@ -439,6 +440,7 @@ static void twl4030_current_worker(struct work_struct *data) + static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) + { + int ret; ++ u32 reg; + + if (bci->usb_mode == CHARGE_OFF) + enable = false; +@@ -452,14 +454,38 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) + bci->usb_enabled = 1; + } + +- if (bci->usb_mode == CHARGE_AUTO) ++ if (bci->usb_mode == CHARGE_AUTO) { ++ /* Enable interrupts now. */ ++ reg = ~(u32)(TWL4030_ICHGLOW | TWL4030_ICHGEOC | ++ TWL4030_TBATOR2 | TWL4030_TBATOR1 | ++ TWL4030_BATSTS); ++ ret = twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, reg, ++ TWL4030_INTERRUPTS_BCIIMR1A); ++ if (ret < 0) { ++ dev_err(bci->dev, ++ "failed to unmask interrupts: %d\n", ++ ret); ++ return ret; ++ } + /* forcing the field BCIAUTOUSB (BOOT_BCI[1]) to 1 */ + ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOUSB); ++ } + + /* forcing USBFASTMCHG(BCIMFSTS4[2]) to 1 */ + ret = twl4030_clear_set(TWL_MODULE_MAIN_CHARGE, 0, + TWL4030_USBFASTMCHG, TWL4030_BCIMFSTS4); + if (bci->usb_mode == CHARGE_LINEAR) { ++ /* Enable interrupts now. */ ++ reg = ~(u32)(TWL4030_ICHGLOW | TWL4030_TBATOR2 | ++ TWL4030_TBATOR1 | TWL4030_BATSTS); ++ ret = twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, reg, ++ TWL4030_INTERRUPTS_BCIIMR1A); ++ if (ret < 0) { ++ dev_err(bci->dev, ++ "failed to unmask interrupts: %d\n", ++ ret); ++ return ret; ++ } + twl4030_clear_set_boot_bci(TWL4030_BCIAUTOAC|TWL4030_CVENAC, 0); + /* Watch dog key: WOVF acknowledge */ + ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE, 0x33, +diff --git a/drivers/remoteproc/da8xx_remoteproc.c b/drivers/remoteproc/da8xx_remoteproc.c +index e230bef71be1..d200334577f6 100644 +--- a/drivers/remoteproc/da8xx_remoteproc.c ++++ b/drivers/remoteproc/da8xx_remoteproc.c +@@ -226,7 +226,7 @@ static int da8xx_rproc_get_internal_memories(struct platform_device *pdev, + res->start & DA8XX_RPROC_LOCAL_ADDRESS_MASK; + drproc->mem[i].size = resource_size(res); + +- dev_dbg(dev, "memory %8s: bus addr %pa size 0x%x va %p da 0x%x\n", ++ dev_dbg(dev, "memory %8s: bus addr %pa size 0x%zx va %p da 0x%x\n", + mem_names[i], &drproc->mem[i].bus_addr, + drproc->mem[i].size, drproc->mem[i].cpu_addr, + drproc->mem[i].dev_addr); +diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c +index bde53c8ccee2..b74338d6dde6 100644 +--- a/drivers/rtc/rtc-armada38x.c ++++ b/drivers/rtc/rtc-armada38x.c +@@ -514,7 +514,6 @@ MODULE_DEVICE_TABLE(of, armada38x_rtc_of_match_table); + + static __init int armada38x_rtc_probe(struct platform_device *pdev) + { +- const struct rtc_class_ops *ops; + struct resource *res; + struct armada38x_rtc *rtc; + const struct of_device_id *match; +@@ -551,6 +550,11 @@ static __init int armada38x_rtc_probe(struct platform_device *pdev) + dev_err(&pdev->dev, "no irq\n"); + return rtc->irq; + } ++ ++ rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); ++ if (IS_ERR(rtc->rtc_dev)) ++ return PTR_ERR(rtc->rtc_dev); ++ + if (devm_request_irq(&pdev->dev, rtc->irq, armada38x_rtc_alarm_irq, + 0, pdev->name, rtc) < 0) { + dev_warn(&pdev->dev, "Interrupt not available.\n"); +@@ -560,28 +564,24 @@ static __init int armada38x_rtc_probe(struct platform_device *pdev) + + if (rtc->irq != -1) { + device_init_wakeup(&pdev->dev, 1); +- ops = &armada38x_rtc_ops; ++ rtc->rtc_dev->ops = &armada38x_rtc_ops; + } else { + /* + * If there is no interrupt available then we can't + * use the alarm + */ +- ops = &armada38x_rtc_ops_noirq; ++ rtc->rtc_dev->ops = &armada38x_rtc_ops_noirq; + } + rtc->data = (struct armada38x_rtc_data *)match->data; + +- + /* Update RTC-MBUS bridge timing parameters */ + rtc->data->update_mbus_timing(rtc); + +- rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, pdev->name, +- ops, THIS_MODULE); +- if (IS_ERR(rtc->rtc_dev)) { +- ret = PTR_ERR(rtc->rtc_dev); ++ ret = rtc_register_device(rtc->rtc_dev); ++ if (ret) + dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret); +- return ret; +- } +- return 0; ++ ++ return ret; + } + + #ifdef CONFIG_PM_SLEEP +diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c +index ea18a8f4bce0..033f65aef578 100644 +--- a/drivers/rtc/rtc-isl1208.c ++++ b/drivers/rtc/rtc-isl1208.c +@@ -518,7 +518,7 @@ static ssize_t timestamp0_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) + { +- struct i2c_client *client = dev_get_drvdata(dev); ++ struct i2c_client *client = to_i2c_client(dev->parent); + int sr; + + sr = isl1208_i2c_get_sr(client); +@@ -540,7 +540,7 @@ static ssize_t timestamp0_store(struct device *dev, + static ssize_t timestamp0_show(struct device *dev, + struct device_attribute *attr, char *buf) + { +- struct i2c_client *client = dev_get_drvdata(dev); ++ struct i2c_client *client = to_i2c_client(dev->parent); + u8 regs[ISL1219_EVT_SECTION_LEN] = { 0, }; + struct rtc_time tm; + int sr; +@@ -650,7 +650,7 @@ static ssize_t + isl1208_sysfs_show_atrim(struct device *dev, + struct device_attribute *attr, char *buf) + { +- int atr = isl1208_i2c_get_atr(to_i2c_client(dev)); ++ int atr = isl1208_i2c_get_atr(to_i2c_client(dev->parent)); + if (atr < 0) + return atr; + +@@ -663,7 +663,7 @@ static ssize_t + isl1208_sysfs_show_dtrim(struct device *dev, + struct device_attribute *attr, char *buf) + { +- int dtr = isl1208_i2c_get_dtr(to_i2c_client(dev)); ++ int dtr = isl1208_i2c_get_dtr(to_i2c_client(dev->parent)); + if (dtr < 0) + return dtr; + +@@ -676,7 +676,7 @@ static ssize_t + isl1208_sysfs_show_usr(struct device *dev, + struct device_attribute *attr, char *buf) + { +- int usr = isl1208_i2c_get_usr(to_i2c_client(dev)); ++ int usr = isl1208_i2c_get_usr(to_i2c_client(dev->parent)); + if (usr < 0) + return usr; + +@@ -701,7 +701,10 @@ isl1208_sysfs_store_usr(struct device *dev, + if (usr < 0 || usr > 0xffff) + return -EINVAL; + +- return isl1208_i2c_set_usr(to_i2c_client(dev), usr) ? -EIO : count; ++ if (isl1208_i2c_set_usr(to_i2c_client(dev->parent), usr)) ++ return -EIO; ++ ++ return count; + } + + static DEVICE_ATTR(usr, S_IRUGO | S_IWUSR, isl1208_sysfs_show_usr, +@@ -765,7 +768,6 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) + rtc->ops = &isl1208_rtc_ops; + + i2c_set_clientdata(client, rtc); +- dev_set_drvdata(&rtc->dev, client); + + rc = isl1208_i2c_get_sr(client); + if (rc < 0) { +@@ -804,7 +806,7 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) + evdet_irq = of_irq_get_byname(np, "evdet"); + } + +- rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); ++ rc = rtc_add_group(rtc, &isl1208_rtc_sysfs_files); + if (rc) + return rc; + +@@ -821,14 +823,6 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) + return rtc_register_device(rtc); + } + +-static int +-isl1208_remove(struct i2c_client *client) +-{ +- sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); +- +- return 0; +-} +- + static const struct i2c_device_id isl1208_id[] = { + { "isl1208", TYPE_ISL1208 }, + { "isl1218", TYPE_ISL1218 }, +@@ -851,7 +845,6 @@ static struct i2c_driver isl1208_driver = { + .of_match_table = of_match_ptr(isl1208_of_match), + }, + .probe = isl1208_probe, +- .remove = isl1208_remove, + .id_table = isl1208_id, + }; + +diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c +index 385f8303bb41..e9a25ec4d434 100644 +--- a/drivers/rtc/rtc-mt6397.c ++++ b/drivers/rtc/rtc-mt6397.c +@@ -332,6 +332,10 @@ static int mtk_rtc_probe(struct platform_device *pdev) + + platform_set_drvdata(pdev, rtc); + ++ rtc->rtc_dev = devm_rtc_allocate_device(rtc->dev); ++ if (IS_ERR(rtc->rtc_dev)) ++ return PTR_ERR(rtc->rtc_dev); ++ + ret = request_threaded_irq(rtc->irq, NULL, + mtk_rtc_irq_handler_thread, + IRQF_ONESHOT | IRQF_TRIGGER_HIGH, +@@ -344,11 +348,11 @@ static int mtk_rtc_probe(struct platform_device *pdev) + + device_init_wakeup(&pdev->dev, 1); + +- rtc->rtc_dev = rtc_device_register("mt6397-rtc", &pdev->dev, +- &mtk_rtc_ops, THIS_MODULE); +- if (IS_ERR(rtc->rtc_dev)) { ++ rtc->rtc_dev->ops = &mtk_rtc_ops; ++ ++ ret = rtc_register_device(rtc->rtc_dev); ++ if (ret) { + dev_err(&pdev->dev, "register rtc device failed\n"); +- ret = PTR_ERR(rtc->rtc_dev); + goto out_free_irq; + } + +@@ -365,7 +369,6 @@ static int mtk_rtc_remove(struct platform_device *pdev) + { + struct mt6397_rtc *rtc = platform_get_drvdata(pdev); + +- rtc_device_unregister(rtc->rtc_dev); + free_irq(rtc->irq, rtc->rtc_dev); + irq_dispose_mapping(rtc->irq); + +diff --git a/drivers/rtc/rtc-pl030.c b/drivers/rtc/rtc-pl030.c +index f85a1a93e669..343bb6ed1783 100644 +--- a/drivers/rtc/rtc-pl030.c ++++ b/drivers/rtc/rtc-pl030.c +@@ -112,6 +112,13 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) + goto err_rtc; + } + ++ rtc->rtc = devm_rtc_allocate_device(&dev->dev); ++ if (IS_ERR(rtc->rtc)) { ++ ret = PTR_ERR(rtc->rtc); ++ goto err_rtc; ++ } ++ ++ rtc->rtc->ops = &pl030_ops; + rtc->base = ioremap(dev->res.start, resource_size(&dev->res)); + if (!rtc->base) { + ret = -ENOMEM; +@@ -128,12 +135,9 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) + if (ret) + goto err_irq; + +- rtc->rtc = rtc_device_register("pl030", &dev->dev, &pl030_ops, +- THIS_MODULE); +- if (IS_ERR(rtc->rtc)) { +- ret = PTR_ERR(rtc->rtc); ++ ret = rtc_register_device(rtc->rtc); ++ if (ret) + goto err_reg; +- } + + return 0; + +@@ -154,7 +158,6 @@ static int pl030_remove(struct amba_device *dev) + writel(0, rtc->base + RTC_CR); + + free_irq(dev->irq[0], rtc); +- rtc_device_unregister(rtc->rtc); + iounmap(rtc->base); + amba_release_regions(dev); + +diff --git a/drivers/rtc/rtc-rv8803.c b/drivers/rtc/rtc-rv8803.c +index 29fc3d210392..17ccef5d5db1 100644 +--- a/drivers/rtc/rtc-rv8803.c ++++ b/drivers/rtc/rtc-rv8803.c +@@ -623,7 +623,7 @@ MODULE_DEVICE_TABLE(i2c, rv8803_id); + static const struct of_device_id rv8803_of_match[] = { + { + .compatible = "microcrystal,rv8803", +- .data = (void *)rx_8900 ++ .data = (void *)rv_8803 + }, + { + .compatible = "epson,rx8900", +diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/rtc-sysfs.c +index f1ff30ade534..9746c32eee2e 100644 +--- a/drivers/rtc/rtc-sysfs.c ++++ b/drivers/rtc/rtc-sysfs.c +@@ -338,8 +338,8 @@ int rtc_add_groups(struct rtc_device *rtc, const struct attribute_group **grps) + + new_cnt = old_cnt + add_cnt + 1; + groups = devm_kcalloc(&rtc->dev, new_cnt, sizeof(*groups), GFP_KERNEL); +- if (IS_ERR_OR_NULL(groups)) +- return PTR_ERR(groups); ++ if (!groups) ++ return -ENOMEM; + memcpy(groups, rtc->dev.groups, old_cnt * sizeof(*groups)); + memcpy(groups + old_cnt, grps, add_cnt * sizeof(*groups)); + groups[old_cnt + add_cnt] = NULL; +diff --git a/drivers/rtc/rtc-tx4939.c b/drivers/rtc/rtc-tx4939.c +index 08dbefc79520..61c110b2045f 100644 +--- a/drivers/rtc/rtc-tx4939.c ++++ b/drivers/rtc/rtc-tx4939.c +@@ -253,9 +253,7 @@ static int __init tx4939_rtc_probe(struct platform_device *pdev) + struct resource *res; + int irq, ret; + struct nvmem_config nvmem_cfg = { +- .name = "rv8803_nvram", +- .word_size = 4, +- .stride = 4, ++ .name = "tx4939_nvram", + .size = TX4939_RTC_REG_RAMSIZE, + .reg_read = tx4939_nvram_read, + .reg_write = tx4939_nvram_write, +diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c +index 3be54651698a..027a53eec42a 100644 +--- a/drivers/s390/crypto/ap_bus.c ++++ b/drivers/s390/crypto/ap_bus.c +@@ -1223,11 +1223,10 @@ static struct bus_attribute *const ap_bus_attrs[] = { + }; + + /** +- * ap_select_domain(): Select an AP domain. +- * +- * Pick one of the 16 AP domains. ++ * ap_select_domain(): Select an AP domain if possible and we haven't ++ * already done so before. + */ +-static int ap_select_domain(void) ++static void ap_select_domain(void) + { + int count, max_count, best_domain; + struct ap_queue_status status; +@@ -1242,7 +1241,7 @@ static int ap_select_domain(void) + if (ap_domain_index >= 0) { + /* Domain has already been selected. */ + spin_unlock_bh(&ap_domain_lock); +- return 0; ++ return; + } + best_domain = -1; + max_count = 0; +@@ -1269,11 +1268,8 @@ static int ap_select_domain(void) + if (best_domain >= 0) { + ap_domain_index = best_domain; + AP_DBF(DBF_DEBUG, "new ap_domain_index=%d\n", ap_domain_index); +- spin_unlock_bh(&ap_domain_lock); +- return 0; + } + spin_unlock_bh(&ap_domain_lock); +- return -ENODEV; + } + + /* +@@ -1351,8 +1347,7 @@ static void ap_scan_bus(struct work_struct *unused) + AP_DBF(DBF_DEBUG, "%s running\n", __func__); + + ap_query_configuration(ap_configuration); +- if (ap_select_domain() != 0) +- goto out; ++ ap_select_domain(); + + for (id = 0; id < AP_DEVICES; id++) { + /* check if device is registered */ +@@ -1468,12 +1463,11 @@ static void ap_scan_bus(struct work_struct *unused) + } + } /* end device loop */ + +- if (defdomdevs < 1) ++ if (ap_domain_index >= 0 && defdomdevs < 1) + AP_DBF(DBF_INFO, + "no queue device with default domain %d available\n", + ap_domain_index); + +-out: + mod_timer(&ap_config_timer, jiffies + ap_config_time * HZ); + } + +diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c +index 461afc276db7..81e2c591acb0 100644 +--- a/drivers/s390/net/qeth_core_main.c ++++ b/drivers/s390/net/qeth_core_main.c +@@ -901,44 +901,6 @@ out: + qeth_release_buffer(channel, iob); + } + +-static int qeth_setup_channel(struct qeth_channel *channel, bool alloc_buffers) +-{ +- int cnt; +- +- QETH_DBF_TEXT(SETUP, 2, "setupch"); +- +- channel->ccw = kmalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA); +- if (!channel->ccw) +- return -ENOMEM; +- channel->state = CH_STATE_DOWN; +- atomic_set(&channel->irq_pending, 0); +- init_waitqueue_head(&channel->wait_q); +- +- if (!alloc_buffers) +- return 0; +- +- for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++) { +- channel->iob[cnt].data = +- kzalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL); +- if (channel->iob[cnt].data == NULL) +- break; +- channel->iob[cnt].state = BUF_STATE_FREE; +- channel->iob[cnt].channel = channel; +- channel->iob[cnt].callback = qeth_send_control_data_cb; +- channel->iob[cnt].rc = 0; +- } +- if (cnt < QETH_CMD_BUFFER_NO) { +- kfree(channel->ccw); +- while (cnt-- > 0) +- kfree(channel->iob[cnt].data); +- return -ENOMEM; +- } +- channel->io_buf_no = 0; +- spin_lock_init(&channel->iob_lock); +- +- return 0; +-} +- + static int qeth_set_thread_start_bit(struct qeth_card *card, + unsigned long thread) + { +@@ -1339,14 +1301,61 @@ static void qeth_free_buffer_pool(struct qeth_card *card) + + static void qeth_clean_channel(struct qeth_channel *channel) + { ++ struct ccw_device *cdev = channel->ccwdev; + int cnt; + + QETH_DBF_TEXT(SETUP, 2, "freech"); ++ ++ spin_lock_irq(get_ccwdev_lock(cdev)); ++ cdev->handler = NULL; ++ spin_unlock_irq(get_ccwdev_lock(cdev)); ++ + for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++) + kfree(channel->iob[cnt].data); + kfree(channel->ccw); + } + ++static int qeth_setup_channel(struct qeth_channel *channel, bool alloc_buffers) ++{ ++ struct ccw_device *cdev = channel->ccwdev; ++ int cnt; ++ ++ QETH_DBF_TEXT(SETUP, 2, "setupch"); ++ ++ channel->ccw = kmalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA); ++ if (!channel->ccw) ++ return -ENOMEM; ++ channel->state = CH_STATE_DOWN; ++ atomic_set(&channel->irq_pending, 0); ++ init_waitqueue_head(&channel->wait_q); ++ ++ spin_lock_irq(get_ccwdev_lock(cdev)); ++ cdev->handler = qeth_irq; ++ spin_unlock_irq(get_ccwdev_lock(cdev)); ++ ++ if (!alloc_buffers) ++ return 0; ++ ++ for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++) { ++ channel->iob[cnt].data = ++ kzalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL); ++ if (channel->iob[cnt].data == NULL) ++ break; ++ channel->iob[cnt].state = BUF_STATE_FREE; ++ channel->iob[cnt].channel = channel; ++ channel->iob[cnt].callback = qeth_send_control_data_cb; ++ channel->iob[cnt].rc = 0; ++ } ++ if (cnt < QETH_CMD_BUFFER_NO) { ++ qeth_clean_channel(channel); ++ return -ENOMEM; ++ } ++ channel->io_buf_no = 0; ++ spin_lock_init(&channel->iob_lock); ++ ++ return 0; ++} ++ + static void qeth_set_single_write_queues(struct qeth_card *card) + { + if ((atomic_read(&card->qdio.state) != QETH_QDIO_UNINITIALIZED) && +@@ -1498,7 +1507,7 @@ static void qeth_core_sl_print(struct seq_file *m, struct service_level *slr) + CARD_BUS_ID(card), card->info.mcl_level); + } + +-static struct qeth_card *qeth_alloc_card(void) ++static struct qeth_card *qeth_alloc_card(struct ccwgroup_device *gdev) + { + struct qeth_card *card; + +@@ -1507,6 +1516,11 @@ static struct qeth_card *qeth_alloc_card(void) + if (!card) + goto out; + QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); ++ ++ card->gdev = gdev; ++ CARD_RDEV(card) = gdev->cdev[0]; ++ CARD_WDEV(card) = gdev->cdev[1]; ++ CARD_DDEV(card) = gdev->cdev[2]; + if (qeth_setup_channel(&card->read, true)) + goto out_ip; + if (qeth_setup_channel(&card->write, true)) +@@ -5745,7 +5759,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) + + QETH_DBF_TEXT_(SETUP, 2, "%s", dev_name(&gdev->dev)); + +- card = qeth_alloc_card(); ++ card = qeth_alloc_card(gdev); + if (!card) { + QETH_DBF_TEXT_(SETUP, 2, "1err%d", -ENOMEM); + rc = -ENOMEM; +@@ -5761,15 +5775,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev) + goto err_card; + } + +- card->read.ccwdev = gdev->cdev[0]; +- card->write.ccwdev = gdev->cdev[1]; +- card->data.ccwdev = gdev->cdev[2]; + dev_set_drvdata(&gdev->dev, card); +- card->gdev = gdev; +- gdev->cdev[0]->handler = qeth_irq; +- gdev->cdev[1]->handler = qeth_irq; +- gdev->cdev[2]->handler = qeth_irq; +- + qeth_setup_card(card); + rc = qeth_update_from_chp_desc(card); + if (rc) +diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c +index c1c35eccd5b6..95669d47c389 100644 +--- a/drivers/s390/net/qeth_l2_main.c ++++ b/drivers/s390/net/qeth_l2_main.c +@@ -789,7 +789,10 @@ static int __qeth_l2_open(struct net_device *dev) + + if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) { + napi_enable(&card->napi); ++ local_bh_disable(); + napi_schedule(&card->napi); ++ /* kick-start the NAPI softirq: */ ++ local_bh_enable(); + } else + rc = -EIO; + return rc; +diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c +index 9c5e801b3f6c..52e0ae4dc724 100644 +--- a/drivers/s390/net/qeth_l3_main.c ++++ b/drivers/s390/net/qeth_l3_main.c +@@ -2414,7 +2414,10 @@ static int __qeth_l3_open(struct net_device *dev) + + if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) { + napi_enable(&card->napi); ++ local_bh_disable(); + napi_schedule(&card->napi); ++ /* kick-start the NAPI softirq: */ ++ local_bh_enable(); + } else + rc = -EIO; + return rc; +diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c +index 5160d6214a36..8ec68dcc0cc4 100644 +--- a/drivers/scsi/NCR5380.c ++++ b/drivers/scsi/NCR5380.c +@@ -131,6 +131,7 @@ + + static int do_abort(struct Scsi_Host *); + static void do_reset(struct Scsi_Host *); ++static void bus_reset_cleanup(struct Scsi_Host *); + + /** + * initialize_SCp - init the scsi pointer field +@@ -513,16 +514,15 @@ static void complete_cmd(struct Scsi_Host *instance, + + if (hostdata->sensing == cmd) { + /* Autosense processing ends here */ +- if ((cmd->result & 0xff) != SAM_STAT_GOOD) { ++ if (status_byte(cmd->result) != GOOD) { + scsi_eh_restore_cmnd(cmd, &hostdata->ses); +- set_host_byte(cmd, DID_ERROR); +- } else ++ } else { + scsi_eh_restore_cmnd(cmd, &hostdata->ses); ++ set_driver_byte(cmd, DRIVER_SENSE); ++ } + hostdata->sensing = NULL; + } + +- hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun); +- + cmd->scsi_done(cmd); + } + +@@ -886,7 +886,14 @@ static irqreturn_t __maybe_unused NCR5380_intr(int irq, void *dev_id) + /* Probably Bus Reset */ + NCR5380_read(RESET_PARITY_INTERRUPT_REG); + +- dsprintk(NDEBUG_INTR, instance, "unknown interrupt\n"); ++ if (sr & SR_RST) { ++ /* Certainly Bus Reset */ ++ shost_printk(KERN_WARNING, instance, ++ "bus reset interrupt\n"); ++ bus_reset_cleanup(instance); ++ } else { ++ dsprintk(NDEBUG_INTR, instance, "unknown interrupt\n"); ++ } + #ifdef SUN3_SCSI_VME + dregs->csr |= CSR_DMA_ENABLE; + #endif +@@ -904,20 +911,16 @@ static irqreturn_t __maybe_unused NCR5380_intr(int irq, void *dev_id) + return IRQ_RETVAL(handled); + } + +-/* +- * Function : int NCR5380_select(struct Scsi_Host *instance, +- * struct scsi_cmnd *cmd) +- * +- * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command, +- * including ARBITRATION, SELECTION, and initial message out for +- * IDENTIFY and queue messages. ++/** ++ * NCR5380_select - attempt arbitration and selection for a given command ++ * @instance: the Scsi_Host instance ++ * @cmd: the scsi_cmnd to execute + * +- * Inputs : instance - instantiation of the 5380 driver on which this +- * target lives, cmd - SCSI command to execute. ++ * This routine establishes an I_T_L nexus for a SCSI command. This involves ++ * ARBITRATION, SELECTION and MESSAGE OUT phases and an IDENTIFY message. + * +- * Returns cmd if selection failed but should be retried, +- * NULL if selection failed and should not be retried, or +- * NULL if selection succeeded (hostdata->connected == cmd). ++ * Returns true if the operation should be retried. ++ * Returns false if it should not be retried. + * + * Side effects : + * If bus busy, arbitration failed, etc, NCR5380_select() will exit +@@ -925,16 +928,15 @@ static irqreturn_t __maybe_unused NCR5380_intr(int irq, void *dev_id) + * SELECT_ENABLE will be set appropriately, the NCR5380 + * will cease to drive any SCSI bus signals. + * +- * If successful : I_T_L or I_T_L_Q nexus will be established, +- * instance->connected will be set to cmd. ++ * If successful : the I_T_L nexus will be established, and ++ * hostdata->connected will be set to cmd. + * SELECT interrupt will be disabled. + * + * If failed (no target) : cmd->scsi_done() will be called, and the + * cmd->result host byte set to DID_BAD_TARGET. + */ + +-static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, +- struct scsi_cmnd *cmd) ++static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd) + __releases(&hostdata->lock) __acquires(&hostdata->lock) + { + struct NCR5380_hostdata *hostdata = shost_priv(instance); +@@ -942,6 +944,9 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, + unsigned char *data; + int len; + int err; ++ bool ret = true; ++ bool can_disconnect = instance->irq != NO_IRQ && ++ cmd->cmnd[0] != REQUEST_SENSE; + + NCR5380_dprint(NDEBUG_ARBITRATION, instance); + dsprintk(NDEBUG_ARBITRATION, instance, "starting arbitration, id = %d\n", +@@ -950,7 +955,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, + /* + * Arbitration and selection phases are slow and involve dropping the + * lock, so we have to watch out for EH. An exception handler may +- * change 'selecting' to NULL. This function will then return NULL ++ * change 'selecting' to NULL. This function will then return false + * so that the caller will forget about 'cmd'. (During information + * transfer phases, EH may change 'connected' to NULL.) + */ +@@ -986,7 +991,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, + if (!hostdata->selecting) { + /* Command was aborted */ + NCR5380_write(MODE_REG, MR_BASE); +- return NULL; ++ return false; + } + if (err < 0) { + NCR5380_write(MODE_REG, MR_BASE); +@@ -1035,7 +1040,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, + if (!hostdata->selecting) { + NCR5380_write(MODE_REG, MR_BASE); + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); +- return NULL; ++ return false; + } + + dsprintk(NDEBUG_ARBITRATION, instance, "won arbitration\n"); +@@ -1118,13 +1123,13 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, + + /* Can't touch cmd if it has been reclaimed by the scsi ML */ + if (!hostdata->selecting) +- return NULL; ++ return false; + + cmd->result = DID_BAD_TARGET << 16; + complete_cmd(instance, cmd); + dsprintk(NDEBUG_SELECTION, instance, + "target did not respond within 250ms\n"); +- cmd = NULL; ++ ret = false; + goto out; + } + +@@ -1156,12 +1161,12 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, + } + if (!hostdata->selecting) { + do_abort(instance); +- return NULL; ++ return false; + } + + dsprintk(NDEBUG_SELECTION, instance, "target %d selected, going into MESSAGE OUT phase.\n", + scmd_id(cmd)); +- tmp[0] = IDENTIFY(((instance->irq == NO_IRQ) ? 0 : 1), cmd->device->lun); ++ tmp[0] = IDENTIFY(can_disconnect, cmd->device->lun); + + len = 1; + data = tmp; +@@ -1172,7 +1177,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, + cmd->result = DID_ERROR << 16; + complete_cmd(instance, cmd); + dsprintk(NDEBUG_SELECTION, instance, "IDENTIFY message transfer failed\n"); +- cmd = NULL; ++ ret = false; + goto out; + } + +@@ -1187,13 +1192,13 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, + + initialize_SCp(cmd); + +- cmd = NULL; ++ ret = false; + + out: + if (!hostdata->selecting) + return NULL; + hostdata->selecting = NULL; +- return cmd; ++ return ret; + } + + /* +@@ -1712,6 +1717,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) + cmd->result = DID_ERROR << 16; + complete_cmd(instance, cmd); + hostdata->connected = NULL; ++ hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun); + return; + #endif + case PHASE_DATAIN: +@@ -1794,6 +1800,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) + cmd, scmd_id(cmd), cmd->device->lun); + + hostdata->connected = NULL; ++ hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun); + + cmd->result &= ~0xffff; + cmd->result |= cmd->SCp.Status; +@@ -1947,6 +1954,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) + NCR5380_transfer_pio(instance, &phase, &len, &data); + if (msgout == ABORT) { + hostdata->connected = NULL; ++ hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun); + cmd->result = DID_ERROR << 16; + complete_cmd(instance, cmd); + maybe_release_dma_irq(instance); +@@ -2009,8 +2017,11 @@ static void NCR5380_reselect(struct Scsi_Host *instance) + NCR5380_write(MODE_REG, MR_BASE); + + target_mask = NCR5380_read(CURRENT_SCSI_DATA_REG) & ~(hostdata->id_mask); +- +- dsprintk(NDEBUG_RESELECTION, instance, "reselect\n"); ++ if (!target_mask || target_mask & (target_mask - 1)) { ++ shost_printk(KERN_WARNING, instance, ++ "reselect: bad target_mask 0x%02x\n", target_mask); ++ return; ++ } + + /* + * At this point, we have detected that our SCSI ID is on the bus, +@@ -2024,6 +2035,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_BSY); + if (NCR5380_poll_politely(hostdata, + STATUS_REG, SR_SEL, 0, 2 * HZ) < 0) { ++ shost_printk(KERN_ERR, instance, "reselect: !SEL timeout\n"); + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); + return; + } +@@ -2035,6 +2047,10 @@ static void NCR5380_reselect(struct Scsi_Host *instance) + + if (NCR5380_poll_politely(hostdata, + STATUS_REG, SR_REQ, SR_REQ, 2 * HZ) < 0) { ++ if ((NCR5380_read(STATUS_REG) & (SR_BSY | SR_SEL)) == 0) ++ /* BUS FREE phase */ ++ return; ++ shost_printk(KERN_ERR, instance, "reselect: REQ timeout\n"); + do_abort(instance); + return; + } +@@ -2096,13 +2112,16 @@ static void NCR5380_reselect(struct Scsi_Host *instance) + dsprintk(NDEBUG_RESELECTION | NDEBUG_QUEUES, instance, + "reselect: removed %p from disconnected queue\n", tmp); + } else { ++ int target = ffs(target_mask) - 1; ++ + shost_printk(KERN_ERR, instance, "target bitmask 0x%02x lun %d not in disconnected queue.\n", + target_mask, lun); + /* + * Since we have an established nexus that we can't do anything + * with, we must abort it. + */ +- do_abort(instance); ++ if (do_abort(instance) == 0) ++ hostdata->busy[target] &= ~(1 << lun); + return; + } + +@@ -2267,15 +2286,16 @@ static int NCR5380_abort(struct scsi_cmnd *cmd) + if (list_del_cmd(&hostdata->autosense, cmd)) { + dsprintk(NDEBUG_ABORT, instance, + "abort: removed %p from sense queue\n", cmd); +- set_host_byte(cmd, DID_ERROR); + complete_cmd(instance, cmd); + } + + out: + if (result == FAILED) + dsprintk(NDEBUG_ABORT, instance, "abort: failed to abort %p\n", cmd); +- else ++ else { ++ hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun); + dsprintk(NDEBUG_ABORT, instance, "abort: successfully aborted %p\n", cmd); ++ } + + queue_work(hostdata->work_q, &hostdata->main_task); + maybe_release_dma_irq(instance); +@@ -2285,31 +2305,12 @@ out: + } + + +-/** +- * NCR5380_host_reset - reset the SCSI host +- * @cmd: SCSI command undergoing EH +- * +- * Returns SUCCESS +- */ +- +-static int NCR5380_host_reset(struct scsi_cmnd *cmd) ++static void bus_reset_cleanup(struct Scsi_Host *instance) + { +- struct Scsi_Host *instance = cmd->device->host; + struct NCR5380_hostdata *hostdata = shost_priv(instance); + int i; +- unsigned long flags; + struct NCR5380_cmd *ncmd; + +- spin_lock_irqsave(&hostdata->lock, flags); +- +-#if (NDEBUG & NDEBUG_ANY) +- scmd_printk(KERN_INFO, cmd, __func__); +-#endif +- NCR5380_dprint(NDEBUG_ANY, instance); +- NCR5380_dprint_phase(NDEBUG_ANY, instance); +- +- do_reset(instance); +- + /* reset NCR registers */ + NCR5380_write(MODE_REG, MR_BASE); + NCR5380_write(TARGET_COMMAND_REG, 0); +@@ -2321,11 +2322,6 @@ static int NCR5380_host_reset(struct scsi_cmnd *cmd) + * commands! + */ + +- if (list_del_cmd(&hostdata->unissued, cmd)) { +- cmd->result = DID_RESET << 16; +- cmd->scsi_done(cmd); +- } +- + if (hostdata->selecting) { + hostdata->selecting->result = DID_RESET << 16; + complete_cmd(instance, hostdata->selecting); +@@ -2343,7 +2339,6 @@ static int NCR5380_host_reset(struct scsi_cmnd *cmd) + list_for_each_entry(ncmd, &hostdata->autosense, list) { + struct scsi_cmnd *cmd = NCR5380_to_scmd(ncmd); + +- set_host_byte(cmd, DID_RESET); + cmd->scsi_done(cmd); + } + INIT_LIST_HEAD(&hostdata->autosense); +@@ -2360,6 +2355,41 @@ static int NCR5380_host_reset(struct scsi_cmnd *cmd) + + queue_work(hostdata->work_q, &hostdata->main_task); + maybe_release_dma_irq(instance); ++} ++ ++/** ++ * NCR5380_host_reset - reset the SCSI host ++ * @cmd: SCSI command undergoing EH ++ * ++ * Returns SUCCESS ++ */ ++ ++static int NCR5380_host_reset(struct scsi_cmnd *cmd) ++{ ++ struct Scsi_Host *instance = cmd->device->host; ++ struct NCR5380_hostdata *hostdata = shost_priv(instance); ++ unsigned long flags; ++ struct NCR5380_cmd *ncmd; ++ ++ spin_lock_irqsave(&hostdata->lock, flags); ++ ++#if (NDEBUG & NDEBUG_ANY) ++ shost_printk(KERN_INFO, instance, __func__); ++#endif ++ NCR5380_dprint(NDEBUG_ANY, instance); ++ NCR5380_dprint_phase(NDEBUG_ANY, instance); ++ ++ list_for_each_entry(ncmd, &hostdata->unissued, list) { ++ struct scsi_cmnd *scmd = NCR5380_to_scmd(ncmd); ++ ++ scmd->result = DID_RESET << 16; ++ scmd->scsi_done(scmd); ++ } ++ INIT_LIST_HEAD(&hostdata->unissued); ++ ++ do_reset(instance); ++ bus_reset_cleanup(instance); ++ + spin_unlock_irqrestore(&hostdata->lock, flags); + + return SUCCESS; +diff --git a/drivers/scsi/NCR5380.h b/drivers/scsi/NCR5380.h +index 8a6d002e6789..5935fd6d1a05 100644 +--- a/drivers/scsi/NCR5380.h ++++ b/drivers/scsi/NCR5380.h +@@ -275,7 +275,7 @@ static irqreturn_t NCR5380_intr(int irq, void *dev_id); + static void NCR5380_main(struct work_struct *work); + static const char *NCR5380_info(struct Scsi_Host *instance); + static void NCR5380_reselect(struct Scsi_Host *instance); +-static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *, struct scsi_cmnd *); ++static bool NCR5380_select(struct Scsi_Host *, struct scsi_cmnd *); + static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data); + static int NCR5380_transfer_pio(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data); + static int NCR5380_poll_politely2(struct NCR5380_hostdata *, +diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c +index b141d1061f38..2ee9c4ec7a54 100644 +--- a/drivers/scsi/libsas/sas_expander.c ++++ b/drivers/scsi/libsas/sas_expander.c +@@ -2062,14 +2062,11 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last) + return res; + } + +- /* delete the old link */ +- if (SAS_ADDR(phy->attached_sas_addr) && +- SAS_ADDR(sas_addr) != SAS_ADDR(phy->attached_sas_addr)) { +- SAS_DPRINTK("ex %016llx phy 0x%x replace %016llx\n", +- SAS_ADDR(dev->sas_addr), phy_id, +- SAS_ADDR(phy->attached_sas_addr)); +- sas_unregister_devs_sas_addr(dev, phy_id, last); +- } ++ /* we always have to delete the old device when we went here */ ++ SAS_DPRINTK("ex %016llx phy 0x%x replace %016llx\n", ++ SAS_ADDR(dev->sas_addr), phy_id, ++ SAS_ADDR(phy->attached_sas_addr)); ++ sas_unregister_devs_sas_addr(dev, phy_id, last); + + return sas_discover_new(dev, phy_id); + } +diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c +index d909d90035bb..384f5cd7c3c8 100644 +--- a/drivers/scsi/lpfc/lpfc_ct.c ++++ b/drivers/scsi/lpfc/lpfc_ct.c +@@ -471,11 +471,6 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type) + "Parse GID_FTrsp: did:x%x flg:x%x x%x", + Did, ndlp->nlp_flag, vport->fc_flag); + +- /* Don't assume the rport is always the previous +- * FC4 type. +- */ +- ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); +- + /* By default, the driver expects to support FCP FC4 */ + if (fc4_type == FC_TYPE_FCP) + ndlp->nlp_fc4_type |= NLP_FC4_FCP; +diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c +index ccdd82b1123f..db183d1f34ab 100644 +--- a/drivers/scsi/lpfc/lpfc_hbadisc.c ++++ b/drivers/scsi/lpfc/lpfc_hbadisc.c +@@ -4198,7 +4198,7 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, + + if (new_state == NLP_STE_MAPPED_NODE || + new_state == NLP_STE_UNMAPPED_NODE) { +- if (ndlp->nlp_fc4_type & NLP_FC4_FCP || ++ if (ndlp->nlp_fc4_type || + ndlp->nlp_DID == Fabric_DID || + ndlp->nlp_DID == NameServer_DID || + ndlp->nlp_DID == FDMI_DID) { +diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c +index ae6301c79678..c15f3265eefe 100644 +--- a/drivers/scsi/lpfc/lpfc_nportdisc.c ++++ b/drivers/scsi/lpfc/lpfc_nportdisc.c +@@ -2323,6 +2323,7 @@ lpfc_device_recov_unmap_node(struct lpfc_vport *vport, + lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); + spin_lock_irq(shost->host_lock); + ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); ++ ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); + spin_unlock_irq(shost->host_lock); + lpfc_disc_set_adisc(vport, ndlp); + +@@ -2400,6 +2401,7 @@ lpfc_device_recov_mapped_node(struct lpfc_vport *vport, + lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE); + spin_lock_irq(shost->host_lock); + ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); ++ ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); + spin_unlock_irq(shost->host_lock); + lpfc_disc_set_adisc(vport, ndlp); + return ndlp->nlp_state; +@@ -2657,6 +2659,7 @@ lpfc_device_recov_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, + lpfc_cancel_retry_delay_tmo(vport, ndlp); + spin_lock_irq(shost->host_lock); + ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC); ++ ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME); + spin_unlock_irq(shost->host_lock); + return ndlp->nlp_state; + } +diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c +index 645ffb5332b4..8ee585e453dc 100644 +--- a/drivers/scsi/lpfc/lpfc_nvme.c ++++ b/drivers/scsi/lpfc/lpfc_nvme.c +@@ -282,7 +282,7 @@ lpfc_nvme_delete_queue(struct nvme_fc_local_port *pnvme_lport, + vport = lport->vport; + + lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME, +- "6001 ENTER. lpfc_pnvme %p, qidx x%xi qhandle %p\n", ++ "6001 ENTER. lpfc_pnvme %p, qidx x%x qhandle %p\n", + lport, qidx, handle); + kfree(handle); + } +diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c +index 22efefcc6cd8..768eba8c111d 100644 +--- a/drivers/scsi/lpfc/lpfc_nvmet.c ++++ b/drivers/scsi/lpfc/lpfc_nvmet.c +@@ -1340,15 +1340,14 @@ lpfc_nvmet_setup_io_context(struct lpfc_hba *phba) + idx = 0; + } + +- infop = phba->sli4_hba.nvmet_ctx_info; +- for (j = 0; j < phba->cfg_nvmet_mrq; j++) { +- for (i = 0; i < phba->sli4_hba.num_present_cpu; i++) { ++ for (i = 0; i < phba->sli4_hba.num_present_cpu; i++) { ++ for (j = 0; j < phba->cfg_nvmet_mrq; j++) { ++ infop = lpfc_get_ctx_list(phba, i, j); + lpfc_printf_log(phba, KERN_INFO, LOG_NVME | LOG_INIT, + "6408 TOTAL NVMET ctx for CPU %d " + "MRQ %d: cnt %d nextcpu %p\n", + i, j, infop->nvmet_ctx_list_cnt, + infop->nvmet_ctx_next_cpu); +- infop++; + } + } + return 0; +diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c +index a490e63c94b6..e704297618e0 100644 +--- a/drivers/scsi/lpfc/lpfc_sli.c ++++ b/drivers/scsi/lpfc/lpfc_sli.c +@@ -392,11 +392,7 @@ lpfc_sli4_if6_eq_clr_intr(struct lpfc_queue *q) + struct lpfc_register doorbell; + + doorbell.word0 = 0; +- bf_set(lpfc_eqcq_doorbell_eqci, &doorbell, 1); +- bf_set(lpfc_eqcq_doorbell_qt, &doorbell, LPFC_QUEUE_TYPE_EVENT); +- bf_set(lpfc_eqcq_doorbell_eqid_hi, &doorbell, +- (q->queue_id >> LPFC_EQID_HI_FIELD_SHIFT)); +- bf_set(lpfc_eqcq_doorbell_eqid_lo, &doorbell, q->queue_id); ++ bf_set(lpfc_if6_eq_doorbell_eqid, &doorbell, q->queue_id); + writel(doorbell.word0, q->phba->sli4_hba.EQDBregaddr); + } + +diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c +index 4dd6cad330e8..3e814c0469fb 100644 +--- a/drivers/scsi/pm8001/pm8001_hwi.c ++++ b/drivers/scsi/pm8001/pm8001_hwi.c +@@ -1479,6 +1479,12 @@ u32 pm8001_mpi_msg_consume(struct pm8001_hba_info *pm8001_ha, + } else { + u32 producer_index; + void *pi_virt = circularQ->pi_virt; ++ /* spurious interrupt during setup if ++ * kexec-ing and driver doing a doorbell access ++ * with the pre-kexec oq interrupt setup ++ */ ++ if (!pi_virt) ++ break; + /* Update the producer index from SPC */ + producer_index = pm8001_read_32(pi_virt); + circularQ->producer_index = cpu_to_le32(producer_index); +diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c +index 947d6017d004..59feda261e08 100644 +--- a/drivers/scsi/pm8001/pm8001_sas.c ++++ b/drivers/scsi/pm8001/pm8001_sas.c +@@ -374,6 +374,13 @@ static int pm8001_task_exec(struct sas_task *task, + return 0; + } + pm8001_ha = pm8001_find_ha_by_dev(task->dev); ++ if (pm8001_ha->controller_fatal_error) { ++ struct task_status_struct *ts = &t->task_status; ++ ++ ts->resp = SAS_TASK_UNDELIVERED; ++ t->task_done(t); ++ return 0; ++ } + PM8001_IO_DBG(pm8001_ha, pm8001_printk("pm8001_task_exec device \n ")); + spin_lock_irqsave(&pm8001_ha->lock, flags); + do { +@@ -466,7 +473,7 @@ err_out: + dev_printk(KERN_ERR, pm8001_ha->dev, "pm8001 exec failed[%d]!\n", rc); + if (!sas_protocol_ata(t->task_proto)) + if (n_elem) +- dma_unmap_sg(pm8001_ha->dev, t->scatter, n_elem, ++ dma_unmap_sg(pm8001_ha->dev, t->scatter, t->num_scatter, + t->data_dir); + out_done: + spin_unlock_irqrestore(&pm8001_ha->lock, flags); +diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h +index 80b4dd6df0c2..1816e351071f 100644 +--- a/drivers/scsi/pm8001/pm8001_sas.h ++++ b/drivers/scsi/pm8001/pm8001_sas.h +@@ -538,6 +538,7 @@ struct pm8001_hba_info { + u32 logging_level; + u32 fw_status; + u32 smp_exp_mode; ++ bool controller_fatal_error; + const struct firmware *fw_image; + struct isr_param irq_vector[PM8001_MAX_MSIX_VEC]; + u32 reset_in_progress; +diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c +index 42f0405601ad..5021aed87f33 100644 +--- a/drivers/scsi/pm8001/pm80xx_hwi.c ++++ b/drivers/scsi/pm8001/pm80xx_hwi.c +@@ -577,6 +577,9 @@ static void update_main_config_table(struct pm8001_hba_info *pm8001_ha) + pm8001_ha->main_cfg_tbl.pm80xx_tbl.pcs_event_log_size); + pm8001_mw32(address, MAIN_PCS_EVENT_LOG_OPTION, + pm8001_ha->main_cfg_tbl.pm80xx_tbl.pcs_event_log_severity); ++ /* Update Fatal error interrupt vector */ ++ pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_interrupt |= ++ ((pm8001_ha->number_of_intr - 1) << 8); + pm8001_mw32(address, MAIN_FATAL_ERROR_INTERRUPT, + pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_interrupt); + pm8001_mw32(address, MAIN_EVENT_CRC_CHECK, +@@ -1110,6 +1113,9 @@ static int pm80xx_chip_init(struct pm8001_hba_info *pm8001_ha) + return -EBUSY; + } + ++ /* Initialize the controller fatal error flag */ ++ pm8001_ha->controller_fatal_error = false; ++ + /* Initialize pci space address eg: mpi offset */ + init_pci_device_addresses(pm8001_ha); + init_default_table_values(pm8001_ha); +@@ -1218,13 +1224,17 @@ pm80xx_chip_soft_rst(struct pm8001_hba_info *pm8001_ha) + u32 bootloader_state; + u32 ibutton0, ibutton1; + +- /* Check if MPI is in ready state to reset */ +- if (mpi_uninit_check(pm8001_ha) != 0) { +- PM8001_FAIL_DBG(pm8001_ha, +- pm8001_printk("MPI state is not ready\n")); +- return -1; ++ /* Process MPI table uninitialization only if FW is ready */ ++ if (!pm8001_ha->controller_fatal_error) { ++ /* Check if MPI is in ready state to reset */ ++ if (mpi_uninit_check(pm8001_ha) != 0) { ++ regval = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1); ++ PM8001_FAIL_DBG(pm8001_ha, pm8001_printk( ++ "MPI state is not ready scratch1 :0x%x\n", ++ regval)); ++ return -1; ++ } + } +- + /* checked for reset register normal state; 0x0 */ + regval = pm8001_cr32(pm8001_ha, 0, SPC_REG_SOFT_RESET); + PM8001_INIT_DBG(pm8001_ha, +@@ -3752,6 +3762,46 @@ static void process_one_iomb(struct pm8001_hba_info *pm8001_ha, void *piomb) + } + } + ++static void print_scratchpad_registers(struct pm8001_hba_info *pm8001_ha) ++{ ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_SCRATCH_PAD_0: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_0))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_SCRATCH_PAD_1:0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_SCRATCH_PAD_2: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_2))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_SCRATCH_PAD_3: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_HOST_SCRATCH_PAD_0: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_0))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_HOST_SCRATCH_PAD_1: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_1))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_HOST_SCRATCH_PAD_2: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_2))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_HOST_SCRATCH_PAD_3: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_3))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_HOST_SCRATCH_PAD_4: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_4))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_HOST_SCRATCH_PAD_5: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_5))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_RSVD_SCRATCH_PAD_0: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_6))); ++ PM8001_FAIL_DBG(pm8001_ha, ++ pm8001_printk("MSGU_RSVD_SCRATCH_PAD_1: 0x%x\n", ++ pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_7))); ++} ++ + static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec) + { + struct outbound_queue_table *circularQ; +@@ -3759,10 +3809,28 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec) + u8 uninitialized_var(bc); + u32 ret = MPI_IO_STATUS_FAIL; + unsigned long flags; ++ u32 regval; + ++ if (vec == (pm8001_ha->number_of_intr - 1)) { ++ regval = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1); ++ if ((regval & SCRATCH_PAD_MIPSALL_READY) != ++ SCRATCH_PAD_MIPSALL_READY) { ++ pm8001_ha->controller_fatal_error = true; ++ PM8001_FAIL_DBG(pm8001_ha, pm8001_printk( ++ "Firmware Fatal error! Regval:0x%x\n", regval)); ++ print_scratchpad_registers(pm8001_ha); ++ return ret; ++ } ++ } + spin_lock_irqsave(&pm8001_ha->lock, flags); + circularQ = &pm8001_ha->outbnd_q_tbl[vec]; + do { ++ /* spurious interrupt during setup if kexec-ing and ++ * driver doing a doorbell access w/ the pre-kexec oq ++ * interrupt setup. ++ */ ++ if (!circularQ->pi_virt) ++ break; + ret = pm8001_mpi_msg_consume(pm8001_ha, circularQ, &pMsg1, &bc); + if (MPI_IO_STATUS_SUCCESS == ret) { + /* process the outbound message */ +diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h +index 889e69ce3689..7dd2699d0efb 100644 +--- a/drivers/scsi/pm8001/pm80xx_hwi.h ++++ b/drivers/scsi/pm8001/pm80xx_hwi.h +@@ -1384,6 +1384,9 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t; + #define SCRATCH_PAD_BOOT_LOAD_SUCCESS 0x0 + #define SCRATCH_PAD_IOP0_READY 0xC00 + #define SCRATCH_PAD_IOP1_READY 0x3000 ++#define SCRATCH_PAD_MIPSALL_READY (SCRATCH_PAD_IOP1_READY | \ ++ SCRATCH_PAD_IOP0_READY | \ ++ SCRATCH_PAD_RAAE_READY) + + /* boot loader state */ + #define SCRATCH_PAD1_BOOTSTATE_MASK 0x70 /* Bit 4-6 */ +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index 34ff4bbc8de1..b8d3403c3c85 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -3277,7 +3277,7 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res) + ql_dbg(ql_dbg_disc, vha, 0x2019, + "GPSC command unsupported, disabling query.\n"); + ha->flags.gpsc_supported = 0; +- res = QLA_SUCCESS; ++ goto done; + } + } else { + switch (be16_to_cpu(ct_rsp->rsp.gpsc.speed)) { +@@ -3310,7 +3310,6 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res) + be16_to_cpu(ct_rsp->rsp.gpsc.speeds), + be16_to_cpu(ct_rsp->rsp.gpsc.speed)); + } +-done: + memset(&ea, 0, sizeof(ea)); + ea.event = FCME_GPSC_DONE; + ea.rc = res; +@@ -3318,6 +3317,7 @@ done: + ea.sp = sp; + qla2x00_fcport_event_handler(vha, &ea); + ++done: + sp->free(sp); + } + +@@ -3902,9 +3902,10 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) + fc_port_t *fcport; + u32 i, rc; + bool found; +- struct fab_scan_rp *rp; ++ struct fab_scan_rp *rp, *trp; + unsigned long flags; + u8 recheck = 0; ++ u16 dup = 0, dup_cnt = 0; + + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s enter\n", __func__); +@@ -3935,6 +3936,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) + + for (i = 0; i < vha->hw->max_fibre_devices; i++) { + u64 wwn; ++ int k; + + rp = &vha->scan.l[i]; + found = false; +@@ -3943,6 +3945,20 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) + if (wwn == 0) + continue; + ++ /* Remove duplicate NPORT ID entries from switch data base */ ++ for (k = i + 1; k < vha->hw->max_fibre_devices; k++) { ++ trp = &vha->scan.l[k]; ++ if (rp->id.b24 == trp->id.b24) { ++ dup = 1; ++ dup_cnt++; ++ ql_dbg(ql_dbg_disc + ql_dbg_verbose, ++ vha, 0xffff, ++ "Detected duplicate NPORT ID from switch data base: ID %06x WWN %8phN WWN %8phN\n", ++ rp->id.b24, rp->port_name, trp->port_name); ++ memset(trp, 0, sizeof(*trp)); ++ } ++ } ++ + if (!memcmp(rp->port_name, vha->port_name, WWN_SIZE)) + continue; + +@@ -3982,6 +3998,12 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) + } + } + ++ if (dup) { ++ ql_log(ql_log_warn, vha, 0xffff, ++ "Detected %d duplicate NPORT ID(s) from switch data base\n", ++ dup_cnt); ++ } ++ + /* + * Logout all previous fabric dev marked lost, except FCP2 devices. + */ +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index bee9cfb29152..653d535e3052 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1772,38 +1772,34 @@ int + qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait) + { + scsi_qla_host_t *vha = cmd_sp->vha; +- fc_port_t *fcport = cmd_sp->fcport; + struct srb_iocb *abt_iocb; + srb_t *sp; + int rval = QLA_FUNCTION_FAILED; + +- sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); ++ sp = qla2xxx_get_qpair_sp(cmd_sp->qpair, cmd_sp->fcport, GFP_KERNEL); + if (!sp) + goto done; + + abt_iocb = &sp->u.iocb_cmd; + sp->type = SRB_ABT_CMD; + sp->name = "abort"; ++ sp->qpair = cmd_sp->qpair; + if (wait) + sp->flags = SRB_WAKEUP_ON_COMP; + + abt_iocb->timeout = qla24xx_abort_iocb_timeout; + init_completion(&abt_iocb->u.abt.comp); +- qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha)); ++ /* FW can send 2 x ABTS's timeout/20s */ ++ qla2x00_init_timer(sp, 42); + + abt_iocb->u.abt.cmd_hndl = cmd_sp->handle; +- +- if (vha->flags.qpairs_available && cmd_sp->qpair) +- abt_iocb->u.abt.req_que_no = +- cpu_to_le16(cmd_sp->qpair->req->id); +- else +- abt_iocb->u.abt.req_que_no = cpu_to_le16(vha->req->id); ++ abt_iocb->u.abt.req_que_no = cpu_to_le16(cmd_sp->qpair->req->id); + + sp->done = qla24xx_abort_sp_done; + + ql_dbg(ql_dbg_async, vha, 0x507c, +- "Abort command issued - hdl=%x, target_id=%x\n", +- cmd_sp->handle, fcport->tgt_id); ++ "Abort command issued - hdl=%x, type=%x\n", ++ cmd_sp->handle, cmd_sp->type); + + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) +@@ -4874,19 +4870,10 @@ qla2x00_configure_loop(scsi_qla_host_t *vha) + */ + if (qla_tgt_mode_enabled(vha) || + qla_dual_mode_enabled(vha)) { +- if (IS_QLA27XX(ha) || IS_QLA83XX(ha)) { +- spin_lock_irqsave(&ha->tgt.atio_lock, +- flags); +- qlt_24xx_process_atio_queue(vha, 0); +- spin_unlock_irqrestore( +- &ha->tgt.atio_lock, flags); +- } else { +- spin_lock_irqsave(&ha->hardware_lock, +- flags); +- qlt_24xx_process_atio_queue(vha, 1); +- spin_unlock_irqrestore( +- &ha->hardware_lock, flags); +- } ++ spin_lock_irqsave(&ha->tgt.atio_lock, flags); ++ qlt_24xx_process_atio_queue(vha, 0); ++ spin_unlock_irqrestore(&ha->tgt.atio_lock, ++ flags); + } + } + } +@@ -6515,6 +6502,7 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha) + if (!(IS_P3P_TYPE(ha))) + ha->isp_ops->reset_chip(vha); + ++ ha->link_data_rate = PORT_SPEED_UNKNOWN; + SAVE_TOPO(ha); + ha->flags.rida_fmt2 = 0; + ha->flags.n2n_ae = 0; +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 119927220299..c699bbb8485b 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -3297,19 +3297,21 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx *abt_iocb) + { + struct srb_iocb *aio = &sp->u.iocb_cmd; + scsi_qla_host_t *vha = sp->vha; +- struct req_que *req = vha->req; ++ struct req_que *req = sp->qpair->req; + + memset(abt_iocb, 0, sizeof(struct abort_entry_24xx)); + abt_iocb->entry_type = ABORT_IOCB_TYPE; + abt_iocb->entry_count = 1; + abt_iocb->handle = cpu_to_le32(MAKE_HANDLE(req->id, sp->handle)); +- abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id); ++ if (sp->fcport) { ++ abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id); ++ abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; ++ abt_iocb->port_id[1] = sp->fcport->d_id.b.area; ++ abt_iocb->port_id[2] = sp->fcport->d_id.b.domain; ++ } + abt_iocb->handle_to_abort = + cpu_to_le32(MAKE_HANDLE(aio->u.abt.req_que_no, + aio->u.abt.cmd_hndl)); +- abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; +- abt_iocb->port_id[1] = sp->fcport->d_id.b.area; +- abt_iocb->port_id[2] = sp->fcport->d_id.b.domain; + abt_iocb->vp_index = vha->vp_idx; + abt_iocb->req_que_no = cpu_to_le16(aio->u.abt.req_que_no); + /* Send the command to the firmware */ +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 88d8acf86a2a..8fa7242dbb43 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -2837,6 +2837,7 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt) + case ELS_IOCB_TYPE: + case ABORT_IOCB_TYPE: + case MBX_IOCB_TYPE: ++ default: + sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); + if (sp) { + sp->done(sp, res); +@@ -2847,7 +2848,6 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt) + case ABTS_RESP_24XX: + case CTIO_TYPE7: + case CTIO_CRC2: +- default: + return 1; + } + fatal: +@@ -3121,6 +3121,7 @@ qla24xx_intr_handler(int irq, void *dev_id) + uint16_t mb[8]; + struct rsp_que *rsp; + unsigned long flags; ++ bool process_atio = false; + + rsp = (struct rsp_que *) dev_id; + if (!rsp) { +@@ -3181,22 +3182,13 @@ qla24xx_intr_handler(int irq, void *dev_id) + qla24xx_process_response_queue(vha, rsp); + break; + case INTR_ATIO_QUE_UPDATE_27XX: +- case INTR_ATIO_QUE_UPDATE:{ +- unsigned long flags2; +- spin_lock_irqsave(&ha->tgt.atio_lock, flags2); +- qlt_24xx_process_atio_queue(vha, 1); +- spin_unlock_irqrestore(&ha->tgt.atio_lock, flags2); ++ case INTR_ATIO_QUE_UPDATE: ++ process_atio = true; + break; +- } +- case INTR_ATIO_RSP_QUE_UPDATE: { +- unsigned long flags2; +- spin_lock_irqsave(&ha->tgt.atio_lock, flags2); +- qlt_24xx_process_atio_queue(vha, 1); +- spin_unlock_irqrestore(&ha->tgt.atio_lock, flags2); +- ++ case INTR_ATIO_RSP_QUE_UPDATE: ++ process_atio = true; + qla24xx_process_response_queue(vha, rsp); + break; +- } + default: + ql_dbg(ql_dbg_async, vha, 0x504f, + "Unrecognized interrupt type (%d).\n", stat * 0xff); +@@ -3210,6 +3202,12 @@ qla24xx_intr_handler(int irq, void *dev_id) + qla2x00_handle_mbx_completion(ha, status); + spin_unlock_irqrestore(&ha->hardware_lock, flags); + ++ if (process_atio) { ++ spin_lock_irqsave(&ha->tgt.atio_lock, flags); ++ qlt_24xx_process_atio_queue(vha, 0); ++ spin_unlock_irqrestore(&ha->tgt.atio_lock, flags); ++ } ++ + return IRQ_HANDLED; + } + +@@ -3256,6 +3254,7 @@ qla24xx_msix_default(int irq, void *dev_id) + uint32_t hccr; + uint16_t mb[8]; + unsigned long flags; ++ bool process_atio = false; + + rsp = (struct rsp_que *) dev_id; + if (!rsp) { +@@ -3312,22 +3311,13 @@ qla24xx_msix_default(int irq, void *dev_id) + qla24xx_process_response_queue(vha, rsp); + break; + case INTR_ATIO_QUE_UPDATE_27XX: +- case INTR_ATIO_QUE_UPDATE:{ +- unsigned long flags2; +- spin_lock_irqsave(&ha->tgt.atio_lock, flags2); +- qlt_24xx_process_atio_queue(vha, 1); +- spin_unlock_irqrestore(&ha->tgt.atio_lock, flags2); ++ case INTR_ATIO_QUE_UPDATE: ++ process_atio = true; + break; +- } +- case INTR_ATIO_RSP_QUE_UPDATE: { +- unsigned long flags2; +- spin_lock_irqsave(&ha->tgt.atio_lock, flags2); +- qlt_24xx_process_atio_queue(vha, 1); +- spin_unlock_irqrestore(&ha->tgt.atio_lock, flags2); +- ++ case INTR_ATIO_RSP_QUE_UPDATE: ++ process_atio = true; + qla24xx_process_response_queue(vha, rsp); + break; +- } + default: + ql_dbg(ql_dbg_async, vha, 0x5051, + "Unrecognized interrupt type (%d).\n", stat & 0xff); +@@ -3338,6 +3328,12 @@ qla24xx_msix_default(int irq, void *dev_id) + qla2x00_handle_mbx_completion(ha, status); + spin_unlock_irqrestore(&ha->hardware_lock, flags); + ++ if (process_atio) { ++ spin_lock_irqsave(&ha->tgt.atio_lock, flags); ++ qlt_24xx_process_atio_queue(vha, 0); ++ spin_unlock_irqrestore(&ha->tgt.atio_lock, flags); ++ } ++ + return IRQ_HANDLED; + } + +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 18ee614fe07f..3e892e013658 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1744,6 +1744,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) + !ha->flags.eeh_busy && + (!test_bit(ABORT_ISP_ACTIVE, + &vha->dpc_flags)) && ++ !qla2x00_isp_reg_stat(ha) && + (sp->type == SRB_SCSI_CMD)) { + /* + * Don't abort commands in +@@ -6059,12 +6060,27 @@ qla2x00_do_dpc(void *data) + if (test_and_clear_bit + (ISP_ABORT_NEEDED, &base_vha->dpc_flags) && + !test_bit(UNLOADING, &base_vha->dpc_flags)) { ++ bool do_reset = true; ++ ++ switch (ql2x_ini_mode) { ++ case QLA2XXX_INI_MODE_ENABLED: ++ break; ++ case QLA2XXX_INI_MODE_DISABLED: ++ if (!qla_tgt_mode_enabled(base_vha)) ++ do_reset = false; ++ break; ++ case QLA2XXX_INI_MODE_DUAL: ++ if (!qla_dual_mode_enabled(base_vha)) ++ do_reset = false; ++ break; ++ default: ++ break; ++ } + +- ql_dbg(ql_dbg_dpc, base_vha, 0x4007, +- "ISP abort scheduled.\n"); +- if (!(test_and_set_bit(ABORT_ISP_ACTIVE, ++ if (do_reset && !(test_and_set_bit(ABORT_ISP_ACTIVE, + &base_vha->dpc_flags))) { +- ++ ql_dbg(ql_dbg_dpc, base_vha, 0x4007, ++ "ISP abort scheduled.\n"); + if (ha->isp_ops->abort_isp(base_vha)) { + /* failed. retry later */ + set_bit(ISP_ABORT_NEEDED, +@@ -6072,10 +6088,9 @@ qla2x00_do_dpc(void *data) + } + clear_bit(ABORT_ISP_ACTIVE, + &base_vha->dpc_flags); ++ ql_dbg(ql_dbg_dpc, base_vha, 0x4008, ++ "ISP abort end.\n"); + } +- +- ql_dbg(ql_dbg_dpc, base_vha, 0x4008, +- "ISP abort end.\n"); + } + + if (test_and_clear_bit(FCPORT_UPDATE_NEEDED, +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index d6dc320f81a7..078d12453324 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -4703,6 +4703,12 @@ static int qlt_handle_login(struct scsi_qla_host *vha, + sess = qlt_find_sess_invalidate_other(vha, wwn, + port_id, loop_id, &conflict_sess); + spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); ++ } else { ++ ql_dbg(ql_dbg_disc, vha, 0xffff, ++ "%s %d Term INOT due to WWN=0 lid=%d, NportID %06X ", ++ __func__, __LINE__, loop_id, port_id.b24); ++ qlt_send_term_imm_notif(vha, iocb, 1); ++ goto out; + } + + if (IS_SW_RESV_ADDR(port_id)) { +diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c +index abfcc2f924ce..c501fb5190a3 100644 +--- a/drivers/scsi/scsi_lib.c ++++ b/drivers/scsi/scsi_lib.c +@@ -2371,7 +2371,8 @@ int scsi_mq_setup_tags(struct Scsi_Host *shost) + { + unsigned int cmd_size, sgl_size; + +- sgl_size = scsi_mq_sgl_size(shost); ++ sgl_size = max_t(unsigned int, sizeof(struct scatterlist), ++ scsi_mq_sgl_size(shost)); + cmd_size = sizeof(struct scsi_cmnd) + shost->hostt->cmd_size + sgl_size; + if (scsi_host_get_prot(shost)) + cmd_size += sizeof(struct scsi_data_buffer) + sgl_size; +diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c +index bd3f6e2d6834..0a2a54517b15 100644 +--- a/drivers/scsi/sym53c8xx_2/sym_hipd.c ++++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c +@@ -4370,6 +4370,13 @@ static void sym_nego_rejected(struct sym_hcb *np, struct sym_tcb *tp, struct sym + OUTB(np, HS_PRT, HS_BUSY); + } + ++#define sym_printk(lvl, tp, cp, fmt, v...) do { \ ++ if (cp) \ ++ scmd_printk(lvl, cp->cmd, fmt, ##v); \ ++ else \ ++ starget_printk(lvl, tp->starget, fmt, ##v); \ ++} while (0) ++ + /* + * chip exception handler for programmed interrupts. + */ +@@ -4415,7 +4422,7 @@ static void sym_int_sir(struct sym_hcb *np) + * been selected with ATN. We do not want to handle that. + */ + case SIR_SEL_ATN_NO_MSG_OUT: +- scmd_printk(KERN_WARNING, cp->cmd, ++ sym_printk(KERN_WARNING, tp, cp, + "No MSG OUT phase after selection with ATN\n"); + goto out_stuck; + /* +@@ -4423,7 +4430,7 @@ static void sym_int_sir(struct sym_hcb *np) + * having reselected the initiator. + */ + case SIR_RESEL_NO_MSG_IN: +- scmd_printk(KERN_WARNING, cp->cmd, ++ sym_printk(KERN_WARNING, tp, cp, + "No MSG IN phase after reselection\n"); + goto out_stuck; + /* +@@ -4431,7 +4438,7 @@ static void sym_int_sir(struct sym_hcb *np) + * an IDENTIFY. + */ + case SIR_RESEL_NO_IDENTIFY: +- scmd_printk(KERN_WARNING, cp->cmd, ++ sym_printk(KERN_WARNING, tp, cp, + "No IDENTIFY after reselection\n"); + goto out_stuck; + /* +@@ -4460,7 +4467,7 @@ static void sym_int_sir(struct sym_hcb *np) + case SIR_RESEL_ABORTED: + np->lastmsg = np->msgout[0]; + np->msgout[0] = M_NOOP; +- scmd_printk(KERN_WARNING, cp->cmd, ++ sym_printk(KERN_WARNING, tp, cp, + "message %x sent on bad reselection\n", np->lastmsg); + goto out; + /* +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index 4aaba3e03055..8bce755e0f5b 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -1772,6 +1772,34 @@ out: + return count; + } + ++static void ufshcd_init_clk_scaling(struct ufs_hba *hba) ++{ ++ char wq_name[sizeof("ufs_clkscaling_00")]; ++ ++ if (!ufshcd_is_clkscaling_supported(hba)) ++ return; ++ ++ INIT_WORK(&hba->clk_scaling.suspend_work, ++ ufshcd_clk_scaling_suspend_work); ++ INIT_WORK(&hba->clk_scaling.resume_work, ++ ufshcd_clk_scaling_resume_work); ++ ++ snprintf(wq_name, sizeof(wq_name), "ufs_clkscaling_%d", ++ hba->host->host_no); ++ hba->clk_scaling.workq = create_singlethread_workqueue(wq_name); ++ ++ ufshcd_clkscaling_init_sysfs(hba); ++} ++ ++static void ufshcd_exit_clk_scaling(struct ufs_hba *hba) ++{ ++ if (!ufshcd_is_clkscaling_supported(hba)) ++ return; ++ ++ destroy_workqueue(hba->clk_scaling.workq); ++ ufshcd_devfreq_remove(hba); ++} ++ + static void ufshcd_init_clk_gating(struct ufs_hba *hba) + { + char wq_name[sizeof("ufs_clk_gating_00")]; +@@ -6676,6 +6704,7 @@ out: + */ + if (ret && !ufshcd_eh_in_progress(hba) && !hba->pm_op_in_progress) { + pm_runtime_put_sync(hba->dev); ++ ufshcd_exit_clk_scaling(hba); + ufshcd_hba_exit(hba); + } + +@@ -7223,12 +7252,9 @@ static void ufshcd_hba_exit(struct ufs_hba *hba) + ufshcd_variant_hba_exit(hba); + ufshcd_setup_vreg(hba, false); + ufshcd_suspend_clkscaling(hba); +- if (ufshcd_is_clkscaling_supported(hba)) { ++ if (ufshcd_is_clkscaling_supported(hba)) + if (hba->devfreq) + ufshcd_suspend_clkscaling(hba); +- destroy_workqueue(hba->clk_scaling.workq); +- ufshcd_devfreq_remove(hba); +- } + ufshcd_setup_clocks(hba, false); + ufshcd_setup_hba_vreg(hba, false); + hba->is_powered = false; +@@ -7908,6 +7934,7 @@ void ufshcd_remove(struct ufs_hba *hba) + ufshcd_disable_intr(hba, hba->intr_mask); + ufshcd_hba_stop(hba, true); + ++ ufshcd_exit_clk_scaling(hba); + ufshcd_exit_clk_gating(hba); + if (ufshcd_is_clkscaling_supported(hba)) + device_remove_file(hba->dev, &hba->clk_scaling.enable_attr); +@@ -8079,6 +8106,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) + + ufshcd_init_clk_gating(hba); + ++ ufshcd_init_clk_scaling(hba); ++ + /* + * In order to avoid any spurious interrupt immediately after + * registering UFS controller interrupt handler, clear any pending UFS +@@ -8117,21 +8146,6 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) + goto out_remove_scsi_host; + } + +- if (ufshcd_is_clkscaling_supported(hba)) { +- char wq_name[sizeof("ufs_clkscaling_00")]; +- +- INIT_WORK(&hba->clk_scaling.suspend_work, +- ufshcd_clk_scaling_suspend_work); +- INIT_WORK(&hba->clk_scaling.resume_work, +- ufshcd_clk_scaling_resume_work); +- +- snprintf(wq_name, sizeof(wq_name), "ufs_clkscaling_%d", +- host->host_no); +- hba->clk_scaling.workq = create_singlethread_workqueue(wq_name); +- +- ufshcd_clkscaling_init_sysfs(hba); +- } +- + /* + * Set the default power management level for runtime and system PM. + * Default power saving mode is to keep UFS link in Hibern8 state +@@ -8169,6 +8183,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) + out_remove_scsi_host: + scsi_remove_host(hba->host); + exit_gating: ++ ufshcd_exit_clk_scaling(hba); + ufshcd_exit_clk_gating(hba); + out_disable: + hba->is_irq_enabled = false; +diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c +index f63d1b8a0933..d72f8eed2e8b 100644 +--- a/drivers/slimbus/qcom-ngd-ctrl.c ++++ b/drivers/slimbus/qcom-ngd-ctrl.c +@@ -1234,8 +1234,17 @@ static int qcom_slim_ngd_enable(struct qcom_slim_ngd_ctrl *ctrl, bool enable) + pm_runtime_resume(ctrl->dev); + pm_runtime_mark_last_busy(ctrl->dev); + pm_runtime_put(ctrl->dev); ++ ++ ret = slim_register_controller(&ctrl->ctrl); ++ if (ret) { ++ dev_err(ctrl->dev, "error adding slim controller\n"); ++ return ret; ++ } ++ ++ dev_info(ctrl->dev, "SLIM controller Registered\n"); + } else { + qcom_slim_qmi_exit(ctrl); ++ slim_unregister_controller(&ctrl->ctrl); + } + + return 0; +@@ -1346,7 +1355,6 @@ static int of_qcom_slim_ngd_register(struct device *parent, + ngd->base = ctrl->base + ngd->id * data->offset + + (ngd->id - 1) * data->size; + ctrl->ngd = ngd; +- platform_driver_register(&qcom_slim_ngd_driver); + + return 0; + } +@@ -1361,11 +1369,6 @@ static int qcom_slim_ngd_probe(struct platform_device *pdev) + int ret; + + ctrl->ctrl.dev = dev; +- ret = slim_register_controller(&ctrl->ctrl); +- if (ret) { +- dev_err(dev, "error adding slim controller\n"); +- return ret; +- } + + pm_runtime_use_autosuspend(dev); + pm_runtime_set_autosuspend_delay(dev, QCOM_SLIM_NGD_AUTOSUSPEND); +@@ -1375,7 +1378,7 @@ static int qcom_slim_ngd_probe(struct platform_device *pdev) + ret = qcom_slim_ngd_qmi_svc_event_init(ctrl); + if (ret) { + dev_err(&pdev->dev, "QMI service registration failed:%d", ret); +- goto err; ++ return ret; + } + + INIT_WORK(&ctrl->m_work, qcom_slim_ngd_master_worker); +@@ -1387,14 +1390,12 @@ static int qcom_slim_ngd_probe(struct platform_device *pdev) + } + + return 0; +-err: +- slim_unregister_controller(&ctrl->ctrl); + wq_err: + qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi); + if (ctrl->mwq) + destroy_workqueue(ctrl->mwq); + +- return 0; ++ return ret; + } + + static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev) +@@ -1445,6 +1446,7 @@ static int qcom_slim_ngd_ctrl_probe(struct platform_device *pdev) + init_completion(&ctrl->reconf); + init_completion(&ctrl->qmi.qmi_comp); + ++ platform_driver_register(&qcom_slim_ngd_driver); + return of_qcom_slim_ngd_register(dev, ctrl); + } + +@@ -1460,7 +1462,7 @@ static int qcom_slim_ngd_remove(struct platform_device *pdev) + struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev); + + pm_runtime_disable(&pdev->dev); +- slim_unregister_controller(&ctrl->ctrl); ++ qcom_slim_ngd_enable(ctrl, false); + qcom_slim_ngd_exit_dma(ctrl); + qcom_slim_ngd_qmi_svc_event_deinit(&ctrl->qmi); + if (ctrl->mwq) +diff --git a/drivers/soc/imx/gpc.c b/drivers/soc/imx/gpc.c +index b3da635970ea..d160fc2a7b7a 100644 +--- a/drivers/soc/imx/gpc.c ++++ b/drivers/soc/imx/gpc.c +@@ -69,7 +69,7 @@ static int imx6_pm_domain_power_off(struct generic_pm_domain *genpd) + u32 val; + + /* Read ISO and ISO2SW power down delays */ +- regmap_read(pd->regmap, pd->reg_offs + GPC_PGC_PUPSCR_OFFS, &val); ++ regmap_read(pd->regmap, pd->reg_offs + GPC_PGC_PDNSCR_OFFS, &val); + iso = val & 0x3f; + iso2sw = (val >> 8) & 0x3f; + +diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c +index 57af8a537332..ee9197f5aae9 100644 +--- a/drivers/soc/qcom/apr.c ++++ b/drivers/soc/qcom/apr.c +@@ -219,9 +219,9 @@ static int apr_add_device(struct device *dev, struct device_node *np, + adev->domain_id = id->domain_id; + adev->version = id->svc_version; + if (np) +- strncpy(adev->name, np->name, APR_NAME_SIZE); ++ strscpy(adev->name, np->name, APR_NAME_SIZE); + else +- strncpy(adev->name, id->name, APR_NAME_SIZE); ++ strscpy(adev->name, id->name, APR_NAME_SIZE); + + dev_set_name(&adev->dev, "aprsvc:%s:%x:%x", adev->name, + id->domain_id, id->svc_id); +diff --git a/drivers/soc/qcom/qcom-geni-se.c b/drivers/soc/qcom/qcom-geni-se.c +index feed3db21c10..ee89ffb6dde8 100644 +--- a/drivers/soc/qcom/qcom-geni-se.c ++++ b/drivers/soc/qcom/qcom-geni-se.c +@@ -513,7 +513,7 @@ EXPORT_SYMBOL(geni_se_resources_on); + */ + int geni_se_clk_tbl_get(struct geni_se *se, unsigned long **tbl) + { +- unsigned long freq = 0; ++ long freq = 0; + int i; + + if (se->clk_perf_tbl) { +@@ -529,7 +529,7 @@ int geni_se_clk_tbl_get(struct geni_se *se, unsigned long **tbl) + + for (i = 0; i < MAX_CLK_PERF_LEVEL; i++) { + freq = clk_round_rate(se->clk, freq + 1); +- if (!freq || freq == se->clk_perf_tbl[i - 1]) ++ if (freq <= 0 || freq == se->clk_perf_tbl[i - 1]) + break; + se->clk_perf_tbl[i] = freq; + } +@@ -544,16 +544,17 @@ EXPORT_SYMBOL(geni_se_clk_tbl_get); + * @se: Pointer to the concerned serial engine. + * @req_freq: Requested clock frequency. + * @index: Index of the resultant frequency in the table. +- * @res_freq: Resultant frequency which matches or is closer to the +- * requested frequency. ++ * @res_freq: Resultant frequency of the source clock. + * @exact: Flag to indicate exact multiple requirement of the requested + * frequency. + * +- * This function is called by the protocol drivers to determine the matching +- * or exact multiple of the requested frequency, as provided by the serial +- * engine clock in order to meet the performance requirements. If there is +- * no matching or exact multiple of the requested frequency found, then it +- * selects the closest floor frequency, if exact flag is not set. ++ * This function is called by the protocol drivers to determine the best match ++ * of the requested frequency as provided by the serial engine clock in order ++ * to meet the performance requirements. ++ * ++ * If we return success: ++ * - if @exact is true then @res_freq / <an_integer> == @req_freq ++ * - if @exact is false then @res_freq / <an_integer> <= @req_freq + * + * Return: 0 on success, standard Linux error codes on failure. + */ +@@ -564,6 +565,9 @@ int geni_se_clk_freq_match(struct geni_se *se, unsigned long req_freq, + unsigned long *tbl; + int num_clk_levels; + int i; ++ unsigned long best_delta; ++ unsigned long new_delta; ++ unsigned int divider; + + num_clk_levels = geni_se_clk_tbl_get(se, &tbl); + if (num_clk_levels < 0) +@@ -572,18 +576,21 @@ int geni_se_clk_freq_match(struct geni_se *se, unsigned long req_freq, + if (num_clk_levels == 0) + return -EINVAL; + +- *res_freq = 0; ++ best_delta = ULONG_MAX; + for (i = 0; i < num_clk_levels; i++) { +- if (!(tbl[i] % req_freq)) { ++ divider = DIV_ROUND_UP(tbl[i], req_freq); ++ new_delta = req_freq - tbl[i] / divider; ++ if (new_delta < best_delta) { ++ /* We have a new best! */ + *index = i; + *res_freq = tbl[i]; +- return 0; +- } + +- if (!(*res_freq) || ((tbl[i] > *res_freq) && +- (tbl[i] < req_freq))) { +- *index = i; +- *res_freq = tbl[i]; ++ /* If the new best is exact then we're done */ ++ if (new_delta == 0) ++ return 0; ++ ++ /* Record how close we got */ ++ best_delta = new_delta; + } + } + +diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c +index ee75da66d64b..75bd9a83aef0 100644 +--- a/drivers/soc/qcom/rpmh-rsc.c ++++ b/drivers/soc/qcom/rpmh-rsc.c +@@ -121,6 +121,7 @@ static int tcs_invalidate(struct rsc_drv *drv, int type) + return -EAGAIN; + } + write_tcs_reg_sync(drv, RSC_DRV_CMD_ENABLE, m, 0); ++ write_tcs_reg_sync(drv, RSC_DRV_CMD_WAIT_FOR_CMPL, m, 0); + } + bitmap_zero(tcs->slots, MAX_TCS_SLOTS); + spin_unlock(&tcs->lock); +@@ -239,6 +240,7 @@ static irqreturn_t tcs_tx_done(int irq, void *p) + skip: + /* Reclaim the TCS */ + write_tcs_reg(drv, RSC_DRV_CMD_ENABLE, i, 0); ++ write_tcs_reg(drv, RSC_DRV_CMD_WAIT_FOR_CMPL, i, 0); + write_tcs_reg(drv, RSC_DRV_IRQ_CLEAR, 0, BIT(i)); + spin_lock(&drv->lock); + clear_bit(i, drv->tcs_in_use); +diff --git a/drivers/soc/qcom/wcnss_ctrl.c b/drivers/soc/qcom/wcnss_ctrl.c +index df3ccb30bc2d..373400dd816d 100644 +--- a/drivers/soc/qcom/wcnss_ctrl.c ++++ b/drivers/soc/qcom/wcnss_ctrl.c +@@ -281,7 +281,7 @@ struct rpmsg_endpoint *qcom_wcnss_open_channel(void *wcnss, const char *name, rp + struct rpmsg_channel_info chinfo; + struct wcnss_ctrl *_wcnss = wcnss; + +- strncpy(chinfo.name, name, sizeof(chinfo.name)); ++ strscpy(chinfo.name, name, sizeof(chinfo.name)); + chinfo.src = RPMSG_ADDR_ANY; + chinfo.dst = RPMSG_ADDR_ANY; + +diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c +index 4b452f36f054..f17a67815404 100644 +--- a/drivers/soc/tegra/pmc.c ++++ b/drivers/soc/tegra/pmc.c +@@ -65,6 +65,8 @@ + + #define PWRGATE_STATUS 0x38 + ++#define PMC_IMPL_E_33V_PWR 0x40 ++ + #define PMC_PWR_DET 0x48 + + #define PMC_SCRATCH0_MODE_RECOVERY BIT(31) +@@ -154,6 +156,7 @@ struct tegra_pmc_soc { + bool has_tsense_reset; + bool has_gpu_clamps; + bool needs_mbist_war; ++ bool has_impl_33v_pwr; + + const struct tegra_io_pad_soc *io_pads; + unsigned int num_io_pads; +@@ -1067,20 +1070,31 @@ int tegra_io_pad_set_voltage(enum tegra_io_pad id, + + mutex_lock(&pmc->powergates_lock); + +- /* write-enable PMC_PWR_DET_VALUE[pad->voltage] */ +- value = tegra_pmc_readl(PMC_PWR_DET); +- value |= BIT(pad->voltage); +- tegra_pmc_writel(value, PMC_PWR_DET); ++ if (pmc->soc->has_impl_33v_pwr) { ++ value = tegra_pmc_readl(PMC_IMPL_E_33V_PWR); + +- /* update I/O voltage */ +- value = tegra_pmc_readl(PMC_PWR_DET_VALUE); ++ if (voltage == TEGRA_IO_PAD_1800000UV) ++ value &= ~BIT(pad->voltage); ++ else ++ value |= BIT(pad->voltage); + +- if (voltage == TEGRA_IO_PAD_1800000UV) +- value &= ~BIT(pad->voltage); +- else ++ tegra_pmc_writel(value, PMC_IMPL_E_33V_PWR); ++ } else { ++ /* write-enable PMC_PWR_DET_VALUE[pad->voltage] */ ++ value = tegra_pmc_readl(PMC_PWR_DET); + value |= BIT(pad->voltage); ++ tegra_pmc_writel(value, PMC_PWR_DET); ++ ++ /* update I/O voltage */ ++ value = tegra_pmc_readl(PMC_PWR_DET_VALUE); + +- tegra_pmc_writel(value, PMC_PWR_DET_VALUE); ++ if (voltage == TEGRA_IO_PAD_1800000UV) ++ value &= ~BIT(pad->voltage); ++ else ++ value |= BIT(pad->voltage); ++ ++ tegra_pmc_writel(value, PMC_PWR_DET_VALUE); ++ } + + mutex_unlock(&pmc->powergates_lock); + +@@ -1102,7 +1116,10 @@ int tegra_io_pad_get_voltage(enum tegra_io_pad id) + if (pad->voltage == UINT_MAX) + return -ENOTSUPP; + +- value = tegra_pmc_readl(PMC_PWR_DET_VALUE); ++ if (pmc->soc->has_impl_33v_pwr) ++ value = tegra_pmc_readl(PMC_IMPL_E_33V_PWR); ++ else ++ value = tegra_pmc_readl(PMC_PWR_DET_VALUE); + + if ((value & BIT(pad->voltage)) == 0) + return TEGRA_IO_PAD_1800000UV; +@@ -1561,6 +1578,7 @@ static const struct tegra_pmc_soc tegra30_pmc_soc = { + .cpu_powergates = tegra30_cpu_powergates, + .has_tsense_reset = true, + .has_gpu_clamps = false, ++ .has_impl_33v_pwr = false, + .num_io_pads = 0, + .io_pads = NULL, + .regs = &tegra20_pmc_regs, +@@ -1603,6 +1621,7 @@ static const struct tegra_pmc_soc tegra114_pmc_soc = { + .cpu_powergates = tegra114_cpu_powergates, + .has_tsense_reset = true, + .has_gpu_clamps = false, ++ .has_impl_33v_pwr = false, + .num_io_pads = 0, + .io_pads = NULL, + .regs = &tegra20_pmc_regs, +@@ -1683,6 +1702,7 @@ static const struct tegra_pmc_soc tegra124_pmc_soc = { + .cpu_powergates = tegra124_cpu_powergates, + .has_tsense_reset = true, + .has_gpu_clamps = true, ++ .has_impl_33v_pwr = false, + .num_io_pads = ARRAY_SIZE(tegra124_io_pads), + .io_pads = tegra124_io_pads, + .regs = &tegra20_pmc_regs, +@@ -1772,6 +1792,7 @@ static const struct tegra_pmc_soc tegra210_pmc_soc = { + .cpu_powergates = tegra210_cpu_powergates, + .has_tsense_reset = true, + .has_gpu_clamps = true, ++ .has_impl_33v_pwr = false, + .needs_mbist_war = true, + .num_io_pads = ARRAY_SIZE(tegra210_io_pads), + .io_pads = tegra210_io_pads, +@@ -1800,7 +1821,7 @@ static const struct tegra_io_pad_soc tegra186_io_pads[] = { + { .id = TEGRA_IO_PAD_HDMI_DP0, .dpd = 28, .voltage = UINT_MAX }, + { .id = TEGRA_IO_PAD_HDMI_DP1, .dpd = 29, .voltage = UINT_MAX }, + { .id = TEGRA_IO_PAD_PEX_CNTRL, .dpd = 32, .voltage = UINT_MAX }, +- { .id = TEGRA_IO_PAD_SDMMC2_HV, .dpd = 34, .voltage = UINT_MAX }, ++ { .id = TEGRA_IO_PAD_SDMMC2_HV, .dpd = 34, .voltage = 5 }, + { .id = TEGRA_IO_PAD_SDMMC4, .dpd = 36, .voltage = UINT_MAX }, + { .id = TEGRA_IO_PAD_CAM, .dpd = 38, .voltage = UINT_MAX }, + { .id = TEGRA_IO_PAD_DSIB, .dpd = 40, .voltage = UINT_MAX }, +@@ -1812,12 +1833,13 @@ static const struct tegra_io_pad_soc tegra186_io_pads[] = { + { .id = TEGRA_IO_PAD_CSIF, .dpd = 46, .voltage = UINT_MAX }, + { .id = TEGRA_IO_PAD_SPI, .dpd = 47, .voltage = UINT_MAX }, + { .id = TEGRA_IO_PAD_UFS, .dpd = 49, .voltage = UINT_MAX }, +- { .id = TEGRA_IO_PAD_DMIC_HV, .dpd = 52, .voltage = UINT_MAX }, ++ { .id = TEGRA_IO_PAD_DMIC_HV, .dpd = 52, .voltage = 2 }, + { .id = TEGRA_IO_PAD_EDP, .dpd = 53, .voltage = UINT_MAX }, +- { .id = TEGRA_IO_PAD_SDMMC1_HV, .dpd = 55, .voltage = UINT_MAX }, +- { .id = TEGRA_IO_PAD_SDMMC3_HV, .dpd = 56, .voltage = UINT_MAX }, ++ { .id = TEGRA_IO_PAD_SDMMC1_HV, .dpd = 55, .voltage = 4 }, ++ { .id = TEGRA_IO_PAD_SDMMC3_HV, .dpd = 56, .voltage = 6 }, + { .id = TEGRA_IO_PAD_CONN, .dpd = 60, .voltage = UINT_MAX }, +- { .id = TEGRA_IO_PAD_AUDIO_HV, .dpd = 61, .voltage = UINT_MAX }, ++ { .id = TEGRA_IO_PAD_AUDIO_HV, .dpd = 61, .voltage = 1 }, ++ { .id = TEGRA_IO_PAD_AO_HV, .dpd = UINT_MAX, .voltage = 0 }, + }; + + static const struct tegra_pmc_regs tegra186_pmc_regs = { +@@ -1870,6 +1892,7 @@ static const struct tegra_pmc_soc tegra186_pmc_soc = { + .cpu_powergates = NULL, + .has_tsense_reset = false, + .has_gpu_clamps = false, ++ .has_impl_33v_pwr = true, + .num_io_pads = ARRAY_SIZE(tegra186_io_pads), + .io_pads = tegra186_io_pads, + .regs = &tegra186_pmc_regs, +diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c +index 83576810eee6..df172bf3925f 100644 +--- a/drivers/soundwire/bus.c ++++ b/drivers/soundwire/bus.c +@@ -175,6 +175,7 @@ static inline int do_transfer_defer(struct sdw_bus *bus, + + defer->msg = msg; + defer->length = msg->len; ++ init_completion(&defer->complete); + + for (i = 0; i <= retry; i++) { + resp = bus->ops->xfer_msg_defer(bus, msg, defer); +diff --git a/drivers/soundwire/intel_init.c b/drivers/soundwire/intel_init.c +index d1ea6b4d0ad3..5c8a20d99878 100644 +--- a/drivers/soundwire/intel_init.c ++++ b/drivers/soundwire/intel_init.c +@@ -151,7 +151,7 @@ static acpi_status sdw_intel_acpi_cb(acpi_handle handle, u32 level, + struct acpi_device *adev; + + if (acpi_bus_get_device(handle, &adev)) { +- dev_err(&adev->dev, "Couldn't find ACPI handle\n"); ++ pr_err("%s: Couldn't find ACPI handle\n", __func__); + return AE_NOT_FOUND; + } + +diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c +index c23849f7aa7b..9a06ffdb73b8 100644 +--- a/drivers/spi/spi-bcm63xx-hsspi.c ++++ b/drivers/spi/spi-bcm63xx-hsspi.c +@@ -101,6 +101,7 @@ struct bcm63xx_hsspi { + + struct platform_device *pdev; + struct clk *clk; ++ struct clk *pll_clk; + void __iomem *regs; + u8 __iomem *fifo; + +@@ -332,7 +333,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) + struct resource *res_mem; + void __iomem *regs; + struct device *dev = &pdev->dev; +- struct clk *clk; ++ struct clk *clk, *pll_clk = NULL; + int irq, ret; + u32 reg, rate, num_cs = HSSPI_SPI_MAX_CS; + +@@ -358,7 +359,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) + + rate = clk_get_rate(clk); + if (!rate) { +- struct clk *pll_clk = devm_clk_get(dev, "pll"); ++ pll_clk = devm_clk_get(dev, "pll"); + + if (IS_ERR(pll_clk)) { + ret = PTR_ERR(pll_clk); +@@ -373,19 +374,20 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) + clk_disable_unprepare(pll_clk); + if (!rate) { + ret = -EINVAL; +- goto out_disable_clk; ++ goto out_disable_pll_clk; + } + } + + master = spi_alloc_master(&pdev->dev, sizeof(*bs)); + if (!master) { + ret = -ENOMEM; +- goto out_disable_clk; ++ goto out_disable_pll_clk; + } + + bs = spi_master_get_devdata(master); + bs->pdev = pdev; + bs->clk = clk; ++ bs->pll_clk = pll_clk; + bs->regs = regs; + bs->speed_hz = rate; + bs->fifo = (u8 __iomem *)(bs->regs + HSSPI_FIFO_REG(0)); +@@ -440,6 +442,8 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) + + out_put_master: + spi_master_put(master); ++out_disable_pll_clk: ++ clk_disable_unprepare(pll_clk); + out_disable_clk: + clk_disable_unprepare(clk); + return ret; +@@ -453,6 +457,7 @@ static int bcm63xx_hsspi_remove(struct platform_device *pdev) + + /* reset the hardware and block queue progress */ + __raw_writel(0, bs->regs + HSSPI_INT_MASK_REG); ++ clk_disable_unprepare(bs->pll_clk); + clk_disable_unprepare(bs->clk); + + return 0; +@@ -465,6 +470,7 @@ static int bcm63xx_hsspi_suspend(struct device *dev) + struct bcm63xx_hsspi *bs = spi_master_get_devdata(master); + + spi_master_suspend(master); ++ clk_disable_unprepare(bs->pll_clk); + clk_disable_unprepare(bs->clk); + + return 0; +@@ -480,6 +486,12 @@ static int bcm63xx_hsspi_resume(struct device *dev) + if (ret) + return ret; + ++ if (bs->pll_clk) { ++ ret = clk_prepare_enable(bs->pll_clk); ++ if (ret) ++ return ret; ++ } ++ + spi_master_resume(master); + + return 0; +diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c +index 86bf45667a04..3dc31627c655 100644 +--- a/drivers/spi/spi-mt65xx.c ++++ b/drivers/spi/spi-mt65xx.c +@@ -98,6 +98,7 @@ struct mtk_spi { + struct clk *parent_clk, *sel_clk, *spi_clk; + struct spi_transfer *cur_transfer; + u32 xfer_len; ++ u32 num_xfered; + struct scatterlist *tx_sgl, *rx_sgl; + u32 tx_sgl_len, rx_sgl_len; + const struct mtk_spi_compatible *dev_comp; +@@ -385,6 +386,7 @@ static int mtk_spi_fifo_transfer(struct spi_master *master, + + mdata->cur_transfer = xfer; + mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, xfer->len); ++ mdata->num_xfered = 0; + mtk_spi_prepare_transfer(master, xfer); + mtk_spi_setup_packet(master); + +@@ -415,6 +417,7 @@ static int mtk_spi_dma_transfer(struct spi_master *master, + mdata->tx_sgl_len = 0; + mdata->rx_sgl_len = 0; + mdata->cur_transfer = xfer; ++ mdata->num_xfered = 0; + + mtk_spi_prepare_transfer(master, xfer); + +@@ -482,7 +485,7 @@ static int mtk_spi_setup(struct spi_device *spi) + + static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id) + { +- u32 cmd, reg_val, cnt, remainder; ++ u32 cmd, reg_val, cnt, remainder, len; + struct spi_master *master = dev_id; + struct mtk_spi *mdata = spi_master_get_devdata(master); + struct spi_transfer *trans = mdata->cur_transfer; +@@ -497,36 +500,38 @@ static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id) + if (trans->rx_buf) { + cnt = mdata->xfer_len / 4; + ioread32_rep(mdata->base + SPI_RX_DATA_REG, +- trans->rx_buf, cnt); ++ trans->rx_buf + mdata->num_xfered, cnt); + remainder = mdata->xfer_len % 4; + if (remainder > 0) { + reg_val = readl(mdata->base + SPI_RX_DATA_REG); +- memcpy(trans->rx_buf + (cnt * 4), +- ®_val, remainder); ++ memcpy(trans->rx_buf + ++ mdata->num_xfered + ++ (cnt * 4), ++ ®_val, ++ remainder); + } + } + +- trans->len -= mdata->xfer_len; +- if (!trans->len) { ++ mdata->num_xfered += mdata->xfer_len; ++ if (mdata->num_xfered == trans->len) { + spi_finalize_current_transfer(master); + return IRQ_HANDLED; + } + +- if (trans->tx_buf) +- trans->tx_buf += mdata->xfer_len; +- if (trans->rx_buf) +- trans->rx_buf += mdata->xfer_len; +- +- mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, trans->len); ++ len = trans->len - mdata->num_xfered; ++ mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, len); + mtk_spi_setup_packet(master); + +- cnt = trans->len / 4; +- iowrite32_rep(mdata->base + SPI_TX_DATA_REG, trans->tx_buf, cnt); ++ cnt = len / 4; ++ iowrite32_rep(mdata->base + SPI_TX_DATA_REG, ++ trans->tx_buf + mdata->num_xfered, cnt); + +- remainder = trans->len % 4; ++ remainder = len % 4; + if (remainder > 0) { + reg_val = 0; +- memcpy(®_val, trans->tx_buf + (cnt * 4), remainder); ++ memcpy(®_val, ++ trans->tx_buf + (cnt * 4) + mdata->num_xfered, ++ remainder); + writel(reg_val, mdata->base + SPI_TX_DATA_REG); + } + +diff --git a/drivers/spi/spi-pic32.c b/drivers/spi/spi-pic32.c +index f8a45af1fa9f..288002f6c613 100644 +--- a/drivers/spi/spi-pic32.c ++++ b/drivers/spi/spi-pic32.c +@@ -320,7 +320,7 @@ static int pic32_spi_dma_transfer(struct pic32_spi *pic32s, + desc_rx = dmaengine_prep_slave_sg(master->dma_rx, + xfer->rx_sg.sgl, + xfer->rx_sg.nents, +- DMA_FROM_DEVICE, ++ DMA_DEV_TO_MEM, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!desc_rx) { + ret = -EINVAL; +@@ -330,7 +330,7 @@ static int pic32_spi_dma_transfer(struct pic32_spi *pic32s, + desc_tx = dmaengine_prep_slave_sg(master->dma_tx, + xfer->tx_sg.sgl, + xfer->tx_sg.nents, +- DMA_TO_DEVICE, ++ DMA_MEM_TO_DEV, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!desc_tx) { + ret = -EINVAL; +diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c +index d17ce1fb4ef5..0f8fdc347091 100644 +--- a/drivers/staging/media/imx/imx-media-csi.c ++++ b/drivers/staging/media/imx/imx-media-csi.c +@@ -166,6 +166,9 @@ static int csi_get_upstream_endpoint(struct csi_priv *priv, + struct v4l2_subdev *sd; + struct media_pad *pad; + ++ if (!IS_ENABLED(CONFIG_OF)) ++ return -ENXIO; ++ + if (!priv->src_sd) + return -EPIPE; + +@@ -1072,7 +1075,7 @@ static int csi_link_validate(struct v4l2_subdev *sd, + struct v4l2_subdev_format *sink_fmt) + { + struct csi_priv *priv = v4l2_get_subdevdata(sd); +- struct v4l2_fwnode_endpoint upstream_ep = {}; ++ struct v4l2_fwnode_endpoint upstream_ep; + bool is_csi2; + int ret; + +diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c +index e1aafe842d66..34dce850067b 100644 +--- a/drivers/tee/optee/core.c ++++ b/drivers/tee/optee/core.c +@@ -696,7 +696,7 @@ static int __init optee_driver_init(void) + return -ENODEV; + + np = of_find_matching_node(fw_np, optee_match); +- if (!np) ++ if (!np || !of_device_is_available(np)) + return -ENODEV; + + optee = optee_probe(np); +diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c +index 34acdf29713d..4c188f4079b3 100644 +--- a/drivers/tty/serial/mxs-auart.c ++++ b/drivers/tty/serial/mxs-auart.c +@@ -1634,8 +1634,9 @@ static int mxs_auart_request_gpio_irq(struct mxs_auart_port *s) + + /* + * If something went wrong, rollback. ++ * Be careful: i may be unsigned. + */ +- while (err && (--i >= 0)) ++ while (err && (i-- > 0)) + if (irq[i] >= 0) + free_irq(irq[i], s); + +diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c +index 5b96df4ad5b3..69b980bb8ac2 100644 +--- a/drivers/tty/serial/qcom_geni_serial.c ++++ b/drivers/tty/serial/qcom_geni_serial.c +@@ -851,6 +851,23 @@ static int qcom_geni_serial_port_setup(struct uart_port *uport) + { + struct qcom_geni_serial_port *port = to_dev_port(uport, uport); + unsigned int rxstale = DEFAULT_BITS_PER_CHAR * STALE_TIMEOUT; ++ u32 proto; ++ ++ if (uart_console(uport)) ++ port->tx_bytes_pw = 1; ++ else ++ port->tx_bytes_pw = 4; ++ port->rx_bytes_pw = RX_BYTES_PW; ++ ++ proto = geni_se_read_proto(&port->se); ++ if (proto != GENI_SE_UART) { ++ dev_err(uport->dev, "Invalid FW loaded, proto: %d\n", proto); ++ return -ENXIO; ++ } ++ ++ qcom_geni_serial_stop_rx(uport); ++ ++ get_tx_fifo_size(port); + + set_rfr_wm(port); + writel_relaxed(rxstale, uport->membase + SE_UART_RX_STALE_CNT); +@@ -874,30 +891,19 @@ static int qcom_geni_serial_port_setup(struct uart_port *uport) + return -ENOMEM; + } + port->setup = true; ++ + return 0; + } + + static int qcom_geni_serial_startup(struct uart_port *uport) + { + int ret; +- u32 proto; + struct qcom_geni_serial_port *port = to_dev_port(uport, uport); + + scnprintf(port->name, sizeof(port->name), + "qcom_serial_%s%d", + (uart_console(uport) ? "console" : "uart"), uport->line); + +- if (!uart_console(uport)) { +- port->tx_bytes_pw = 4; +- port->rx_bytes_pw = RX_BYTES_PW; +- } +- proto = geni_se_read_proto(&port->se); +- if (proto != GENI_SE_UART) { +- dev_err(uport->dev, "Invalid FW loaded, proto: %d\n", proto); +- return -ENXIO; +- } +- +- get_tx_fifo_size(port); + if (!port->setup) { + ret = qcom_geni_serial_port_setup(uport); + if (ret) +@@ -1056,6 +1062,7 @@ static int __init qcom_geni_console_setup(struct console *co, char *options) + int bits = 8; + int parity = 'n'; + int flow = 'n'; ++ int ret; + + if (co->index >= GENI_UART_CONS_PORTS || co->index < 0) + return -ENXIO; +@@ -1071,21 +1078,10 @@ static int __init qcom_geni_console_setup(struct console *co, char *options) + if (unlikely(!uport->membase)) + return -ENXIO; + +- if (geni_se_resources_on(&port->se)) { +- dev_err(port->se.dev, "Error turning on resources\n"); +- return -ENXIO; +- } +- +- if (unlikely(geni_se_read_proto(&port->se) != GENI_SE_UART)) { +- geni_se_resources_off(&port->se); +- return -ENXIO; +- } +- + if (!port->setup) { +- port->tx_bytes_pw = 1; +- port->rx_bytes_pw = RX_BYTES_PW; +- qcom_geni_serial_stop_rx(uport); +- qcom_geni_serial_port_setup(uport); ++ ret = qcom_geni_serial_port_setup(uport); ++ if (ret) ++ return ret; + } + + if (options) +@@ -1203,11 +1199,12 @@ static void qcom_geni_serial_pm(struct uart_port *uport, + { + struct qcom_geni_serial_port *port = to_dev_port(uport, uport); + ++ /* If we've never been called, treat it as off */ ++ if (old_state == UART_PM_STATE_UNDEFINED) ++ old_state = UART_PM_STATE_OFF; ++ + if (new_state == UART_PM_STATE_ON && old_state == UART_PM_STATE_OFF) + geni_se_resources_on(&port->se); +- else if (!uart_console(uport) && (new_state == UART_PM_STATE_ON && +- old_state == UART_PM_STATE_UNDEFINED)) +- geni_se_resources_on(&port->se); + else if (new_state == UART_PM_STATE_OFF && + old_state == UART_PM_STATE_ON) + geni_se_resources_off(&port->se); +diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c +index c6058b52d5d5..2a49b6d876b8 100644 +--- a/drivers/tty/serial/samsung.c ++++ b/drivers/tty/serial/samsung.c +@@ -1944,7 +1944,11 @@ static int s3c24xx_serial_resume(struct device *dev) + + if (port) { + clk_prepare_enable(ourport->clk); ++ if (!IS_ERR(ourport->baudclk)) ++ clk_prepare_enable(ourport->baudclk); + s3c24xx_serial_resetport(port, s3c24xx_port_to_cfg(port)); ++ if (!IS_ERR(ourport->baudclk)) ++ clk_disable_unprepare(ourport->baudclk); + clk_disable_unprepare(ourport->clk); + + uart_resume_port(&s3c24xx_uart_drv, port); +@@ -1967,7 +1971,11 @@ static int s3c24xx_serial_resume_noirq(struct device *dev) + if (rx_enabled(port)) + uintm &= ~S3C64XX_UINTM_RXD_MSK; + clk_prepare_enable(ourport->clk); ++ if (!IS_ERR(ourport->baudclk)) ++ clk_prepare_enable(ourport->baudclk); + wr_regl(port, S3C64XX_UINTM, uintm); ++ if (!IS_ERR(ourport->baudclk)) ++ clk_disable_unprepare(ourport->baudclk); + clk_disable_unprepare(ourport->clk); + } + } +diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c +index 77efa0a43fe7..66d49d511885 100644 +--- a/drivers/tty/serial/xilinx_uartps.c ++++ b/drivers/tty/serial/xilinx_uartps.c +@@ -1279,24 +1279,11 @@ static struct uart_driver cdns_uart_uart_driver = { + static int cdns_uart_suspend(struct device *device) + { + struct uart_port *port = dev_get_drvdata(device); +- struct tty_struct *tty; +- struct device *tty_dev; +- int may_wake = 0; +- +- /* Get the tty which could be NULL so don't assume it's valid */ +- tty = tty_port_tty_get(&port->state->port); +- if (tty) { +- tty_dev = tty->dev; +- may_wake = device_may_wakeup(tty_dev); +- tty_kref_put(tty); +- } ++ int may_wake; + +- /* +- * Call the API provided in serial_core.c file which handles +- * the suspend. +- */ +- uart_suspend_port(&cdns_uart_uart_driver, port); +- if (!(console_suspend_enabled && !may_wake)) { ++ may_wake = device_may_wakeup(device); ++ ++ if (console_suspend_enabled && may_wake) { + unsigned long flags = 0; + + spin_lock_irqsave(&port->lock, flags); +@@ -1311,7 +1298,11 @@ static int cdns_uart_suspend(struct device *device) + spin_unlock_irqrestore(&port->lock, flags); + } + +- return 0; ++ /* ++ * Call the API provided in serial_core.c file which handles ++ * the suspend. ++ */ ++ return uart_suspend_port(&cdns_uart_uart_driver, port); + } + + /** +@@ -1325,17 +1316,9 @@ static int cdns_uart_resume(struct device *device) + struct uart_port *port = dev_get_drvdata(device); + unsigned long flags = 0; + u32 ctrl_reg; +- struct tty_struct *tty; +- struct device *tty_dev; +- int may_wake = 0; +- +- /* Get the tty which could be NULL so don't assume it's valid */ +- tty = tty_port_tty_get(&port->state->port); +- if (tty) { +- tty_dev = tty->dev; +- may_wake = device_may_wakeup(tty_dev); +- tty_kref_put(tty); +- } ++ int may_wake; ++ ++ may_wake = device_may_wakeup(device); + + if (console_suspend_enabled && !may_wake) { + struct cdns_uart *cdns_uart = port->private_data; +diff --git a/drivers/uio/uio_hv_generic.c b/drivers/uio/uio_hv_generic.c +index e401be8321ab..170fa1f8f00e 100644 +--- a/drivers/uio/uio_hv_generic.c ++++ b/drivers/uio/uio_hv_generic.c +@@ -131,11 +131,12 @@ static int hv_uio_ring_mmap(struct file *filp, struct kobject *kobj, + = container_of(kobj, struct vmbus_channel, kobj); + struct hv_device *dev = channel->primary_channel->device_obj; + u16 q_idx = channel->offermsg.offer.sub_channel_index; ++ void *ring_buffer = page_address(channel->ringbuffer_page); + + dev_dbg(&dev->device, "mmap channel %u pages %#lx at %#lx\n", + q_idx, vma_pages(vma), vma->vm_pgoff); + +- return vm_iomap_memory(vma, virt_to_phys(channel->ringbuffer_pages), ++ return vm_iomap_memory(vma, virt_to_phys(ring_buffer), + channel->ringbuffer_pagecount << PAGE_SHIFT); + } + +@@ -224,7 +225,7 @@ hv_uio_probe(struct hv_device *dev, + /* mem resources */ + pdata->info.mem[TXRX_RING_MAP].name = "txrx_rings"; + pdata->info.mem[TXRX_RING_MAP].addr +- = (uintptr_t)dev->channel->ringbuffer_pages; ++ = (uintptr_t)page_address(dev->channel->ringbuffer_page); + pdata->info.mem[TXRX_RING_MAP].size + = dev->channel->ringbuffer_pagecount << PAGE_SHIFT; + pdata->info.mem[TXRX_RING_MAP].memtype = UIO_MEM_LOGICAL; +diff --git a/drivers/usb/chipidea/otg.c b/drivers/usb/chipidea/otg.c +index db4ceffcf2a6..f25d4827fd49 100644 +--- a/drivers/usb/chipidea/otg.c ++++ b/drivers/usb/chipidea/otg.c +@@ -203,14 +203,17 @@ static void ci_otg_work(struct work_struct *work) + } + + pm_runtime_get_sync(ci->dev); ++ + if (ci->id_event) { + ci->id_event = false; + ci_handle_id_switch(ci); +- } else if (ci->b_sess_valid_event) { ++ } ++ ++ if (ci->b_sess_valid_event) { + ci->b_sess_valid_event = false; + ci_handle_vbus_change(ci); +- } else +- dev_err(ci->dev, "unexpected event occurs at %s\n", __func__); ++ } ++ + pm_runtime_put_sync(ci->dev); + + enable_irq(ci->irq); +diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c +index 34ad5bf8acd8..424ecb1f003f 100644 +--- a/drivers/usb/chipidea/usbmisc_imx.c ++++ b/drivers/usb/chipidea/usbmisc_imx.c +@@ -343,6 +343,8 @@ static int usbmisc_imx6q_init(struct imx_usbmisc_data *data) + } else if (data->oc_polarity == 1) { + /* High active */ + reg &= ~(MX6_BM_OVER_CUR_DIS | MX6_BM_OVER_CUR_POLARITY); ++ } else { ++ reg &= ~(MX6_BM_OVER_CUR_DIS); + } + writel(reg, usbmisc->base + data->index * 4); + +diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c +index 83ffa5a14c3d..e6a7c86b70f2 100644 +--- a/drivers/usb/class/usbtmc.c ++++ b/drivers/usb/class/usbtmc.c +@@ -342,7 +342,8 @@ exit: + + } + +-static int usbtmc_ioctl_abort_bulk_out(struct usbtmc_device_data *data) ++static int usbtmc_ioctl_abort_bulk_out_tag(struct usbtmc_device_data *data, ++ u8 tag) + { + struct device *dev; + u8 *buffer; +@@ -359,8 +360,8 @@ static int usbtmc_ioctl_abort_bulk_out(struct usbtmc_device_data *data) + usb_rcvctrlpipe(data->usb_dev, 0), + USBTMC_REQUEST_INITIATE_ABORT_BULK_OUT, + USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT, +- data->bTag_last_write, data->bulk_out, +- buffer, 2, USBTMC_TIMEOUT); ++ tag, data->bulk_out, ++ buffer, 2, USB_CTRL_GET_TIMEOUT); + + if (rv < 0) { + dev_err(dev, "usb_control_msg returned %d\n", rv); +@@ -379,12 +380,14 @@ static int usbtmc_ioctl_abort_bulk_out(struct usbtmc_device_data *data) + n = 0; + + usbtmc_abort_bulk_out_check_status: ++ /* do not stress device with subsequent requests */ ++ msleep(50); + rv = usb_control_msg(data->usb_dev, + usb_rcvctrlpipe(data->usb_dev, 0), + USBTMC_REQUEST_CHECK_ABORT_BULK_OUT_STATUS, + USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT, + 0, data->bulk_out, buffer, 0x08, +- USBTMC_TIMEOUT); ++ USB_CTRL_GET_TIMEOUT); + n++; + if (rv < 0) { + dev_err(dev, "usb_control_msg returned %d\n", rv); +@@ -418,6 +421,11 @@ exit: + return rv; + } + ++static int usbtmc_ioctl_abort_bulk_out(struct usbtmc_device_data *data) ++{ ++ return usbtmc_ioctl_abort_bulk_out_tag(data, data->bTag_last_write); ++} ++ + static int usbtmc488_ioctl_read_stb(struct usbtmc_file_data *file_data, + void __user *arg) + { +@@ -1008,6 +1016,7 @@ usbtmc_clear_check_status: + do { + dev_dbg(dev, "Reading from bulk in EP\n"); + ++ actual = 0; + rv = usb_bulk_msg(data->usb_dev, + usb_rcvbulkpipe(data->usb_dev, + data->bulk_in), +diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c +index b51f0d278826..2e4c0391b583 100644 +--- a/drivers/usb/gadget/function/uvc_configfs.c ++++ b/drivers/usb/gadget/function/uvc_configfs.c +@@ -9,6 +9,9 @@ + * + * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> + */ ++ ++#include <linux/sort.h> ++ + #include "u_uvc.h" + #include "uvc_configfs.h" + +@@ -31,6 +34,14 @@ static struct configfs_attribute prefix##attr_##cname = { \ + .show = prefix##cname##_show, \ + } + ++static int uvcg_config_compare_u32(const void *l, const void *r) ++{ ++ u32 li = *(const u32 *)l; ++ u32 ri = *(const u32 *)r; ++ ++ return li < ri ? -1 : li == ri ? 0 : 1; ++} ++ + static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item) + { + return container_of(to_config_group(item), struct f_uvc_opts, +@@ -544,6 +555,7 @@ static int uvcg_control_class_allow_link(struct config_item *src, + unlock: + mutex_unlock(&opts->lock); + out: ++ config_item_put(header); + mutex_unlock(su_mutex); + return ret; + } +@@ -579,6 +591,7 @@ static void uvcg_control_class_drop_link(struct config_item *src, + unlock: + mutex_unlock(&opts->lock); + out: ++ config_item_put(header); + mutex_unlock(su_mutex); + } + +@@ -764,6 +777,7 @@ static int uvcg_streaming_header_allow_link(struct config_item *src, + format_ptr->fmt = target_fmt; + list_add_tail(&format_ptr->entry, &src_hdr->formats); + ++src_hdr->num_fmt; ++ ++target_fmt->linked; + + out: + mutex_unlock(&opts->lock); +@@ -801,6 +815,8 @@ static void uvcg_streaming_header_drop_link(struct config_item *src, + break; + } + ++ --target_fmt->linked; ++ + out: + mutex_unlock(&opts->lock); + mutex_unlock(su_mutex); +@@ -1129,6 +1145,8 @@ static ssize_t uvcg_frame_dw_frame_interval_store(struct config_item *item, + kfree(ch->dw_frame_interval); + ch->dw_frame_interval = frm_intrv; + ch->frame.b_frame_interval_type = n; ++ sort(ch->dw_frame_interval, n, sizeof(*ch->dw_frame_interval), ++ uvcg_config_compare_u32, NULL); + ret = len; + + end: +@@ -2038,6 +2056,7 @@ static int uvcg_streaming_class_allow_link(struct config_item *src, + unlock: + mutex_unlock(&opts->lock); + out: ++ config_item_put(header); + mutex_unlock(su_mutex); + return ret; + } +@@ -2078,6 +2097,7 @@ static void uvcg_streaming_class_drop_link(struct config_item *src, + unlock: + mutex_unlock(&opts->lock); + out: ++ config_item_put(header); + mutex_unlock(su_mutex); + } + +diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c +index d3567b90343a..2c9821ec836e 100644 +--- a/drivers/usb/gadget/function/uvc_video.c ++++ b/drivers/usb/gadget/function/uvc_video.c +@@ -125,6 +125,21 @@ uvc_video_encode_isoc(struct usb_request *req, struct uvc_video *video, + * Request handling + */ + ++static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req) ++{ ++ int ret; ++ ++ ret = usb_ep_queue(video->ep, req, GFP_ATOMIC); ++ if (ret < 0) { ++ printk(KERN_INFO "Failed to queue request (%d).\n", ret); ++ /* Isochronous endpoints can't be halted. */ ++ if (usb_endpoint_xfer_bulk(video->ep->desc)) ++ usb_ep_set_halt(video->ep); ++ } ++ ++ return ret; ++} ++ + /* + * I somehow feel that synchronisation won't be easy to achieve here. We have + * three events that control USB requests submission: +@@ -189,14 +204,13 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req) + + video->encode(req, video, buf); + +- if ((ret = usb_ep_queue(ep, req, GFP_ATOMIC)) < 0) { +- printk(KERN_INFO "Failed to queue request (%d).\n", ret); +- usb_ep_set_halt(ep); +- spin_unlock_irqrestore(&video->queue.irqlock, flags); ++ ret = uvcg_video_ep_queue(video, req); ++ spin_unlock_irqrestore(&video->queue.irqlock, flags); ++ ++ if (ret < 0) { + uvcg_queue_cancel(queue, 0); + goto requeue; + } +- spin_unlock_irqrestore(&video->queue.irqlock, flags); + + return; + +@@ -316,15 +330,13 @@ int uvcg_video_pump(struct uvc_video *video) + video->encode(req, video, buf); + + /* Queue the USB request */ +- ret = usb_ep_queue(video->ep, req, GFP_ATOMIC); ++ ret = uvcg_video_ep_queue(video, req); ++ spin_unlock_irqrestore(&queue->irqlock, flags); ++ + if (ret < 0) { +- printk(KERN_INFO "Failed to queue request (%d)\n", ret); +- usb_ep_set_halt(video->ep); +- spin_unlock_irqrestore(&queue->irqlock, flags); + uvcg_queue_cancel(queue, 0); + break; + } +- spin_unlock_irqrestore(&queue->irqlock, flags); + } + + spin_lock_irqsave(&video->req_lock, flags); +diff --git a/drivers/usb/host/xhci-mtk-sch.c b/drivers/usb/host/xhci-mtk-sch.c +index fa33d6e5b1cb..d04fdd173ed2 100644 +--- a/drivers/usb/host/xhci-mtk-sch.c ++++ b/drivers/usb/host/xhci-mtk-sch.c +@@ -113,7 +113,9 @@ static void setup_sch_info(struct usb_device *udev, + } + + if (ep_type == ISOC_IN_EP || ep_type == ISOC_OUT_EP) { +- if (esit_pkts <= sch_ep->esit) ++ if (sch_ep->esit == 1) ++ sch_ep->pkts = esit_pkts; ++ else if (esit_pkts <= sch_ep->esit) + sch_ep->pkts = 1; + else + sch_ep->pkts = roundup_pow_of_two(esit_pkts) +diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c +index 48d10a61e271..860693520132 100644 +--- a/drivers/usb/mtu3/mtu3_core.c ++++ b/drivers/usb/mtu3/mtu3_core.c +@@ -185,8 +185,8 @@ static void mtu3_intr_enable(struct mtu3 *mtu) + + if (mtu->is_u3_ip) { + /* Enable U3 LTSSM interrupts */ +- value = HOT_RST_INTR | WARM_RST_INTR | VBUS_RISE_INTR | +- VBUS_FALL_INTR | ENTER_U3_INTR | EXIT_U3_INTR; ++ value = HOT_RST_INTR | WARM_RST_INTR | ++ ENTER_U3_INTR | EXIT_U3_INTR; + mtu3_writel(mbase, U3D_LTSSM_INTR_ENABLE, value); + } + +diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c +index 5c60a8c5a0b5..bbcd3332471d 100644 +--- a/drivers/usb/mtu3/mtu3_gadget.c ++++ b/drivers/usb/mtu3/mtu3_gadget.c +@@ -585,6 +585,17 @@ static const struct usb_gadget_ops mtu3_gadget_ops = { + .udc_stop = mtu3_gadget_stop, + }; + ++static void mtu3_state_reset(struct mtu3 *mtu) ++{ ++ mtu->address = 0; ++ mtu->ep0_state = MU3D_EP0_STATE_SETUP; ++ mtu->may_wakeup = 0; ++ mtu->u1_enable = 0; ++ mtu->u2_enable = 0; ++ mtu->delayed_status = false; ++ mtu->test_mode = false; ++} ++ + static void init_hw_ep(struct mtu3 *mtu, struct mtu3_ep *mep, + u32 epnum, u32 is_in) + { +@@ -702,6 +713,7 @@ void mtu3_gadget_disconnect(struct mtu3 *mtu) + spin_lock(&mtu->lock); + } + ++ mtu3_state_reset(mtu); + usb_gadget_set_state(&mtu->g, USB_STATE_NOTATTACHED); + } + +@@ -712,12 +724,6 @@ void mtu3_gadget_reset(struct mtu3 *mtu) + /* report disconnect, if we didn't flush EP state */ + if (mtu->g.speed != USB_SPEED_UNKNOWN) + mtu3_gadget_disconnect(mtu); +- +- mtu->address = 0; +- mtu->ep0_state = MU3D_EP0_STATE_SETUP; +- mtu->may_wakeup = 0; +- mtu->u1_enable = 0; +- mtu->u2_enable = 0; +- mtu->delayed_status = false; +- mtu->test_mode = false; ++ else ++ mtu3_state_reset(mtu); + } +diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c +index a92c2868d902..0a6eb53e79fb 100644 +--- a/drivers/vfio/pci/vfio_pci.c ++++ b/drivers/vfio/pci/vfio_pci.c +@@ -443,10 +443,14 @@ static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type) + { + if (irq_type == VFIO_PCI_INTX_IRQ_INDEX) { + u8 pin; ++ ++ if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX) || ++ vdev->nointx || vdev->pdev->is_virtfn) ++ return 0; ++ + pci_read_config_byte(vdev->pdev, PCI_INTERRUPT_PIN, &pin); +- if (IS_ENABLED(CONFIG_VFIO_PCI_INTX) && !vdev->nointx && pin) +- return 1; + ++ return pin ? 1 : 0; + } else if (irq_type == VFIO_PCI_MSI_IRQ_INDEX) { + u8 pos; + u16 flags; +diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c +index 115a36f6f403..423ea1f98441 100644 +--- a/drivers/vfio/pci/vfio_pci_config.c ++++ b/drivers/vfio/pci/vfio_pci_config.c +@@ -1180,8 +1180,10 @@ static int vfio_msi_cap_len(struct vfio_pci_device *vdev, u8 pos) + return -ENOMEM; + + ret = init_pci_cap_msi_perm(vdev->msi_perm, len, flags); +- if (ret) ++ if (ret) { ++ kfree(vdev->msi_perm); + return ret; ++ } + + return len; + } +@@ -1609,6 +1611,15 @@ static int vfio_ecap_init(struct vfio_pci_device *vdev) + return 0; + } + ++/* ++ * Nag about hardware bugs, hopefully to have vendors fix them, but at least ++ * to collect a list of dependencies for the VF INTx pin quirk below. ++ */ ++static const struct pci_device_id known_bogus_vf_intx_pin[] = { ++ { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x270c) }, ++ {} ++}; ++ + /* + * For each device we allocate a pci_config_map that indicates the + * capability occupying each dword and thus the struct perm_bits we +@@ -1674,6 +1685,24 @@ int vfio_config_init(struct vfio_pci_device *vdev) + if (pdev->is_virtfn) { + *(__le16 *)&vconfig[PCI_VENDOR_ID] = cpu_to_le16(pdev->vendor); + *(__le16 *)&vconfig[PCI_DEVICE_ID] = cpu_to_le16(pdev->device); ++ ++ /* ++ * Per SR-IOV spec rev 1.1, 3.4.1.18 the interrupt pin register ++ * does not apply to VFs and VFs must implement this register ++ * as read-only with value zero. Userspace is not readily able ++ * to identify whether a device is a VF and thus that the pin ++ * definition on the device is bogus should it violate this ++ * requirement. We already virtualize the pin register for ++ * other purposes, so we simply need to replace the bogus value ++ * and consider VFs when we determine INTx IRQ count. ++ */ ++ if (vconfig[PCI_INTERRUPT_PIN] && ++ !pci_match_id(known_bogus_vf_intx_pin, pdev)) ++ pci_warn(pdev, ++ "Hardware bug: VF reports bogus INTx pin %d\n", ++ vconfig[PCI_INTERRUPT_PIN]); ++ ++ vconfig[PCI_INTERRUPT_PIN] = 0; /* Gratuitous for good VFs */ + } + + if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX) || vdev->nointx) +diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c +index f0f7bc5d2e4a..6f4598583f57 100644 +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -9700,6 +9700,18 @@ out_fail: + commit_transaction = true; + } + if (commit_transaction) { ++ /* ++ * We may have set commit_transaction when logging the new name ++ * in the destination root, in which case we left the source ++ * root context in the list of log contextes. So make sure we ++ * remove it to avoid invalid memory accesses, since the context ++ * was allocated in our stack frame. ++ */ ++ if (sync_log_root) { ++ mutex_lock(&root->log_mutex); ++ list_del_init(&ctx_root.list); ++ mutex_unlock(&root->log_mutex); ++ } + ret = btrfs_commit_transaction(trans); + } else { + int ret2; +@@ -9713,6 +9725,9 @@ out_notrans: + if (old_ino == BTRFS_FIRST_FREE_OBJECTID) + up_read(&fs_info->subvol_sem); + ++ ASSERT(list_empty(&ctx_root.list)); ++ ASSERT(list_empty(&ctx_dest.list)); ++ + return ret; + } + +diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c +index 8f08095ee54e..3a03f74a8cc4 100644 +--- a/fs/compat_ioctl.c ++++ b/fs/compat_ioctl.c +@@ -141,6 +141,7 @@ struct compat_video_event { + unsigned int frame_rate; + } u; + }; ++#define VIDEO_GET_EVENT32 _IOR('o', 28, struct compat_video_event) + + static int do_video_get_event(struct file *file, + unsigned int cmd, struct compat_video_event __user *up) +@@ -152,7 +153,7 @@ static int do_video_get_event(struct file *file, + if (kevent == NULL) + return -EFAULT; + +- err = do_ioctl(file, cmd, (unsigned long)kevent); ++ err = do_ioctl(file, VIDEO_GET_EVENT, (unsigned long)kevent); + if (!err) { + err = convert_in_user(&kevent->type, &up->type); + err |= convert_in_user(&kevent->timestamp, &up->timestamp); +@@ -171,6 +172,7 @@ struct compat_video_still_picture { + compat_uptr_t iFrame; + int32_t size; + }; ++#define VIDEO_STILLPICTURE32 _IOW('o', 30, struct compat_video_still_picture) + + static int do_video_stillpicture(struct file *file, + unsigned int cmd, struct compat_video_still_picture __user *up) +@@ -193,7 +195,7 @@ static int do_video_stillpicture(struct file *file, + if (err) + return -EFAULT; + +- err = do_ioctl(file, cmd, (unsigned long) up_native); ++ err = do_ioctl(file, VIDEO_STILLPICTURE, (unsigned long) up_native); + + return err; + } +@@ -1302,9 +1304,9 @@ static long do_ioctl_trans(unsigned int cmd, + return rtc_ioctl(file, cmd, argp); + + /* dvb */ +- case VIDEO_GET_EVENT: ++ case VIDEO_GET_EVENT32: + return do_video_get_event(file, cmd, argp); +- case VIDEO_STILLPICTURE: ++ case VIDEO_STILLPICTURE32: + return do_video_stillpicture(file, cmd, argp); + } + +diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c +index 49121e5a8de2..6578a1cb4d39 100644 +--- a/fs/ecryptfs/inode.c ++++ b/fs/ecryptfs/inode.c +@@ -325,9 +325,9 @@ static int ecryptfs_i_size_read(struct dentry *dentry, struct inode *inode) + static struct dentry *ecryptfs_lookup_interpose(struct dentry *dentry, + struct dentry *lower_dentry) + { +- struct inode *inode, *lower_inode = d_inode(lower_dentry); ++ struct path *path = ecryptfs_dentry_to_lower_path(dentry->d_parent); ++ struct inode *inode, *lower_inode; + struct ecryptfs_dentry_info *dentry_info; +- struct vfsmount *lower_mnt; + int rc = 0; + + dentry_info = kmem_cache_alloc(ecryptfs_dentry_info_cache, GFP_KERNEL); +@@ -336,16 +336,23 @@ static struct dentry *ecryptfs_lookup_interpose(struct dentry *dentry, + return ERR_PTR(-ENOMEM); + } + +- lower_mnt = mntget(ecryptfs_dentry_to_lower_mnt(dentry->d_parent)); + fsstack_copy_attr_atime(d_inode(dentry->d_parent), +- d_inode(lower_dentry->d_parent)); ++ d_inode(path->dentry)); + BUG_ON(!d_count(lower_dentry)); + + ecryptfs_set_dentry_private(dentry, dentry_info); +- dentry_info->lower_path.mnt = lower_mnt; ++ dentry_info->lower_path.mnt = mntget(path->mnt); + dentry_info->lower_path.dentry = lower_dentry; + +- if (d_really_is_negative(lower_dentry)) { ++ /* ++ * negative dentry can go positive under us here - its parent is not ++ * locked. That's OK and that could happen just as we return from ++ * ecryptfs_lookup() anyway. Just need to be careful and fetch ++ * ->d_inode only once - it's not stable here. ++ */ ++ lower_inode = READ_ONCE(lower_dentry->d_inode); ++ ++ if (!lower_inode) { + /* We want to add because we couldn't find in lower */ + d_add(dentry, NULL); + return NULL; +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index 9511466bc785..3a2fd6676966 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -543,6 +543,8 @@ skip: + if (fio->in_list) + goto next; + out: ++ if (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN)) ++ __submit_merged_bio(io); + up_write(&io->io_rwsem); + } + +@@ -575,9 +577,6 @@ static struct bio *f2fs_grab_read_bio(struct inode *inode, block_t blkaddr, + ctx->bio = bio; + ctx->enabled_steps = post_read_steps; + bio->bi_private = ctx; +- +- /* wait the page to be moved by cleaning */ +- f2fs_wait_on_block_writeback(sbi, blkaddr); + } + + return bio; +@@ -592,6 +591,9 @@ static int f2fs_submit_page_read(struct inode *inode, struct page *page, + if (IS_ERR(bio)) + return PTR_ERR(bio); + ++ /* wait for GCed page writeback via META_MAPPING */ ++ f2fs_wait_on_block_writeback(inode, blkaddr); ++ + if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { + bio_put(bio); + return -EFAULT; +@@ -887,7 +889,6 @@ static int __allocate_data_block(struct dnode_of_data *dn, int seg_type) + struct f2fs_summary sum; + struct node_info ni; + block_t old_blkaddr; +- pgoff_t fofs; + blkcnt_t count = 1; + int err; + +@@ -916,12 +917,10 @@ alloc: + old_blkaddr, old_blkaddr); + f2fs_set_data_blkaddr(dn); + +- /* update i_size */ +- fofs = f2fs_start_bidx_of_node(ofs_of_node(dn->node_page), dn->inode) + +- dn->ofs_in_node; +- if (i_size_read(dn->inode) < ((loff_t)(fofs + 1) << PAGE_SHIFT)) +- f2fs_i_size_write(dn->inode, +- ((loff_t)(fofs + 1) << PAGE_SHIFT)); ++ /* ++ * i_size will be updated by direct_IO. Otherwise, we'll get stale ++ * data from unwritten block via dio_read. ++ */ + return 0; + } + +@@ -1087,6 +1086,8 @@ next_block: + last_ofs_in_node = dn.ofs_in_node; + } + } else { ++ WARN_ON(flag != F2FS_GET_BLOCK_PRE_DIO && ++ flag != F2FS_GET_BLOCK_DIO); + err = __allocate_data_block(&dn, + map->m_seg_type); + if (!err) +@@ -1266,7 +1267,7 @@ static int get_data_block_dio(struct inode *inode, sector_t iblock, + struct buffer_head *bh_result, int create) + { + return __get_data_block(inode, iblock, bh_result, create, +- F2FS_GET_BLOCK_DEFAULT, NULL, ++ F2FS_GET_BLOCK_DIO, NULL, + f2fs_rw_hint_to_seg_type( + inode->i_write_hint)); + } +@@ -1569,6 +1570,12 @@ submit_and_realloc: + } + } + ++ /* ++ * If the page is under writeback, we need to wait for ++ * its completion to see the correct decrypted data. ++ */ ++ f2fs_wait_on_block_writeback(inode, block_nr); ++ + if (bio_add_page(bio, page, blocksize, 0) < blocksize) + goto submit_and_realloc; + +@@ -1637,7 +1644,7 @@ static int encrypt_one_page(struct f2fs_io_info *fio) + return 0; + + /* wait for GCed page writeback via META_MAPPING */ +- f2fs_wait_on_block_writeback(fio->sbi, fio->old_blkaddr); ++ f2fs_wait_on_block_writeback(inode, fio->old_blkaddr); + + retry_encrypt: + fio->encrypted_page = fscrypt_encrypt_page(inode, fio->page, +@@ -2402,10 +2409,6 @@ repeat: + + f2fs_wait_on_page_writeback(page, DATA, false); + +- /* wait for GCed page writeback via META_MAPPING */ +- if (f2fs_post_read_required(inode)) +- f2fs_wait_on_block_writeback(sbi, blkaddr); +- + if (len == PAGE_SIZE || PageUptodate(page)) + return 0; + +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index fb216488d67a..2dc49a541907 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -600,6 +600,7 @@ enum { + F2FS_GET_BLOCK_DEFAULT, + F2FS_GET_BLOCK_FIEMAP, + F2FS_GET_BLOCK_BMAP, ++ F2FS_GET_BLOCK_DIO, + F2FS_GET_BLOCK_PRE_DIO, + F2FS_GET_BLOCK_PRE_AIO, + F2FS_GET_BLOCK_PRECACHE, +@@ -2973,7 +2974,7 @@ void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, + struct f2fs_io_info *fio, bool add_list); + void f2fs_wait_on_page_writeback(struct page *page, + enum page_type type, bool ordered); +-void f2fs_wait_on_block_writeback(struct f2fs_sb_info *sbi, block_t blkaddr); ++void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr); + void f2fs_write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk); + void f2fs_write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk); + int f2fs_lookup_journal_in_cursum(struct f2fs_journal *journal, int type, +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 8d1eb8dec605..c7ea12299769 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -112,8 +112,7 @@ mapped: + f2fs_wait_on_page_writeback(page, DATA, false); + + /* wait for GCed page writeback via META_MAPPING */ +- if (f2fs_post_read_required(inode)) +- f2fs_wait_on_block_writeback(sbi, dn.data_blkaddr); ++ f2fs_wait_on_block_writeback(inode, dn.data_blkaddr); + + out_sem: + up_read(&F2FS_I(inode)->i_mmap_sem); +@@ -2619,34 +2618,26 @@ static int f2fs_ioc_setproject(struct file *filp, __u32 projid) + if (projid_eq(kprojid, F2FS_I(inode)->i_projid)) + return 0; + +- err = mnt_want_write_file(filp); +- if (err) +- return err; +- + err = -EPERM; +- inode_lock(inode); +- + /* Is it quota file? Do not allow user to mess with it */ + if (IS_NOQUOTA(inode)) +- goto out_unlock; ++ return err; + + ipage = f2fs_get_node_page(sbi, inode->i_ino); +- if (IS_ERR(ipage)) { +- err = PTR_ERR(ipage); +- goto out_unlock; +- } ++ if (IS_ERR(ipage)) ++ return PTR_ERR(ipage); + + if (!F2FS_FITS_IN_INODE(F2FS_INODE(ipage), fi->i_extra_isize, + i_projid)) { + err = -EOVERFLOW; + f2fs_put_page(ipage, 1); +- goto out_unlock; ++ return err; + } + f2fs_put_page(ipage, 1); + + err = dquot_initialize(inode); + if (err) +- goto out_unlock; ++ return err; + + transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid)); + if (!IS_ERR(transfer_to[PRJQUOTA])) { +@@ -2660,9 +2651,6 @@ static int f2fs_ioc_setproject(struct file *filp, __u32 projid) + inode->i_ctime = current_time(inode); + out_dirty: + f2fs_mark_inode_dirty_sync(inode, true); +-out_unlock: +- inode_unlock(inode); +- mnt_drop_write_file(filp); + return err; + } + #else +@@ -2738,6 +2726,30 @@ static int f2fs_ioc_fsgetxattr(struct file *filp, unsigned long arg) + return 0; + } + ++static int f2fs_ioctl_check_project(struct inode *inode, struct fsxattr *fa) ++{ ++ /* ++ * Project Quota ID state is only allowed to change from within the init ++ * namespace. Enforce that restriction only if we are trying to change ++ * the quota ID state. Everything else is allowed in user namespaces. ++ */ ++ if (current_user_ns() == &init_user_ns) ++ return 0; ++ ++ if (__kprojid_val(F2FS_I(inode)->i_projid) != fa->fsx_projid) ++ return -EINVAL; ++ ++ if (F2FS_I(inode)->i_flags & F2FS_PROJINHERIT_FL) { ++ if (!(fa->fsx_xflags & FS_XFLAG_PROJINHERIT)) ++ return -EINVAL; ++ } else { ++ if (fa->fsx_xflags & FS_XFLAG_PROJINHERIT) ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ + static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg) + { + struct inode *inode = file_inode(filp); +@@ -2765,19 +2777,20 @@ static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg) + return err; + + inode_lock(inode); ++ err = f2fs_ioctl_check_project(inode, &fa); ++ if (err) ++ goto out; + flags = (fi->i_flags & ~F2FS_FL_XFLAG_VISIBLE) | + (flags & F2FS_FL_XFLAG_VISIBLE); + err = __f2fs_ioc_setflags(inode, flags); +- inode_unlock(inode); +- mnt_drop_write_file(filp); + if (err) +- return err; ++ goto out; + + err = f2fs_ioc_setproject(filp, fa.fsx_projid); +- if (err) +- return err; +- +- return 0; ++out: ++ inode_unlock(inode); ++ mnt_drop_write_file(filp); ++ return err; + } + + int f2fs_pin_file_control(struct inode *inode, bool inc) +diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c +index aa8f19e1bdb3..e5d474681471 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -2367,8 +2367,9 @@ retry: + spin_unlock(&nm_i->nid_list_lock); + + /* Let's scan nat pages and its caches to get free nids */ +- f2fs_build_free_nids(sbi, true, false); +- goto retry; ++ if (!f2fs_build_free_nids(sbi, true, false)) ++ goto retry; ++ return false; + } + + /* +diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c +index 2c3be4c3c626..733f005b85d6 100644 +--- a/fs/f2fs/recovery.c ++++ b/fs/f2fs/recovery.c +@@ -216,6 +216,21 @@ static void recover_inode(struct inode *inode, struct page *page) + char *name; + + inode->i_mode = le16_to_cpu(raw->i_mode); ++ i_uid_write(inode, le32_to_cpu(raw->i_uid)); ++ i_gid_write(inode, le32_to_cpu(raw->i_gid)); ++ ++ if (raw->i_inline & F2FS_EXTRA_ATTR) { ++ if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)->sb) && ++ F2FS_FITS_IN_INODE(raw, le16_to_cpu(raw->i_extra_isize), ++ i_projid)) { ++ projid_t i_projid; ++ ++ i_projid = (projid_t)le32_to_cpu(raw->i_projid); ++ F2FS_I(inode)->i_projid = ++ make_kprojid(&init_user_ns, i_projid); ++ } ++ } ++ + f2fs_i_size_write(inode, le64_to_cpu(raw->i_size)); + inode->i_atime.tv_sec = le64_to_cpu(raw->i_atime); + inode->i_ctime.tv_sec = le64_to_cpu(raw->i_ctime); +@@ -232,6 +247,8 @@ static void recover_inode(struct inode *inode, struct page *page) + + recover_inline_flags(inode, raw); + ++ f2fs_mark_inode_dirty_sync(inode, true); ++ + if (file_enc_name(inode)) + name = "<encrypted>"; + else +diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c +index 10d5dcdb34be..d78009694f3f 100644 +--- a/fs/f2fs/segment.c ++++ b/fs/f2fs/segment.c +@@ -3214,10 +3214,14 @@ void f2fs_wait_on_page_writeback(struct page *page, + } + } + +-void f2fs_wait_on_block_writeback(struct f2fs_sb_info *sbi, block_t blkaddr) ++void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr) + { ++ struct f2fs_sb_info *sbi = F2FS_I_SB(inode); + struct page *cpage; + ++ if (!f2fs_post_read_required(inode)) ++ return; ++ + if (!is_valid_data_blkaddr(sbi, blkaddr)) + return; + +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index d9106bbe7df6..b05e10c332b7 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -1336,7 +1336,8 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root) + from_kgid_munged(&init_user_ns, + F2FS_OPTION(sbi).s_resgid)); + if (F2FS_IO_SIZE_BITS(sbi)) +- seq_printf(seq, ",io_size=%uKB", F2FS_IO_SIZE_KB(sbi)); ++ seq_printf(seq, ",io_bits=%u", ++ F2FS_OPTION(sbi).write_io_size_bits); + #ifdef CONFIG_F2FS_FAULT_INJECTION + if (test_opt(sbi, FAULT_INJECTION)) { + seq_printf(seq, ",fault_injection=%u", +@@ -2516,8 +2517,12 @@ static int init_percpu_info(struct f2fs_sb_info *sbi) + if (err) + return err; + +- return percpu_counter_init(&sbi->total_valid_inode_count, 0, ++ err = percpu_counter_init(&sbi->total_valid_inode_count, 0, + GFP_KERNEL); ++ if (err) ++ percpu_counter_destroy(&sbi->alloc_valid_block_count); ++ ++ return err; + } + + #ifdef CONFIG_BLK_DEV_ZONED +@@ -2929,7 +2934,7 @@ try_onemore: + GFP_KERNEL); + if (!sbi->write_io[i]) { + err = -ENOMEM; +- goto free_options; ++ goto free_bio_info; + } + + for (j = HOT; j < n; j++) { +diff --git a/fs/fuse/control.c b/fs/fuse/control.c +index 0b694655d988..acc35819aae6 100644 +--- a/fs/fuse/control.c ++++ b/fs/fuse/control.c +@@ -107,7 +107,7 @@ static ssize_t fuse_conn_max_background_read(struct file *file, + if (!fc) + return 0; + +- val = fc->max_background; ++ val = READ_ONCE(fc->max_background); + fuse_conn_put(fc); + + return fuse_conn_limit_read(file, buf, len, ppos, val); +@@ -144,7 +144,7 @@ static ssize_t fuse_conn_congestion_threshold_read(struct file *file, + if (!fc) + return 0; + +- val = fc->congestion_threshold; ++ val = READ_ONCE(fc->congestion_threshold); + fuse_conn_put(fc); + + return fuse_conn_limit_read(file, buf, len, ppos, val); +diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c +index 449d0cb45a84..63e5387c84d2 100644 +--- a/fs/gfs2/rgrp.c ++++ b/fs/gfs2/rgrp.c +@@ -1227,7 +1227,7 @@ static int update_rgrp_lvb(struct gfs2_rgrpd *rgd) + rl_flags = be32_to_cpu(rgd->rd_rgl->rl_flags); + rl_flags &= ~GFS2_RDF_MASK; + rgd->rd_flags &= GFS2_RDF_MASK; +- rgd->rd_flags |= (rl_flags | GFS2_RDF_UPTODATE | GFS2_RDF_CHECK); ++ rgd->rd_flags |= (rl_flags | GFS2_RDF_CHECK); + if (rgd->rd_rgl->rl_unlinked == 0) + rgd->rd_flags &= ~GFS2_RDF_CHECK; + rgd->rd_free = be32_to_cpu(rgd->rd_rgl->rl_free); +diff --git a/fs/kernfs/symlink.c b/fs/kernfs/symlink.c +index 305b220af45d..162f43b80c84 100644 +--- a/fs/kernfs/symlink.c ++++ b/fs/kernfs/symlink.c +@@ -72,6 +72,9 @@ static int kernfs_get_target_path(struct kernfs_node *parent, + if (base == kn) + break; + ++ if ((s - path) + 3 >= PATH_MAX) ++ return -ENAMETOOLONG; ++ + strcpy(s, "../"); + s += 3; + base = base->parent; +@@ -88,7 +91,7 @@ static int kernfs_get_target_path(struct kernfs_node *parent, + if (len < 2) + return -EINVAL; + len--; +- if ((s - path) + len > PATH_MAX) ++ if ((s - path) + len >= PATH_MAX) + return -ENAMETOOLONG; + + /* reverse fillup of target string from target to base */ +diff --git a/fs/udf/super.c b/fs/udf/super.c +index c495db7165ae..7af011dc9ae8 100644 +--- a/fs/udf/super.c ++++ b/fs/udf/super.c +@@ -989,12 +989,62 @@ static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index) + return bitmap; + } + ++static int check_partition_desc(struct super_block *sb, ++ struct partitionDesc *p, ++ struct udf_part_map *map) ++{ ++ bool umap, utable, fmap, ftable; ++ struct partitionHeaderDesc *phd; ++ ++ switch (le32_to_cpu(p->accessType)) { ++ case PD_ACCESS_TYPE_READ_ONLY: ++ case PD_ACCESS_TYPE_WRITE_ONCE: ++ case PD_ACCESS_TYPE_REWRITABLE: ++ case PD_ACCESS_TYPE_NONE: ++ goto force_ro; ++ } ++ ++ /* No Partition Header Descriptor? */ ++ if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) && ++ strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03)) ++ goto force_ro; ++ ++ phd = (struct partitionHeaderDesc *)p->partitionContentsUse; ++ utable = phd->unallocSpaceTable.extLength; ++ umap = phd->unallocSpaceBitmap.extLength; ++ ftable = phd->freedSpaceTable.extLength; ++ fmap = phd->freedSpaceBitmap.extLength; ++ ++ /* No allocation info? */ ++ if (!utable && !umap && !ftable && !fmap) ++ goto force_ro; ++ ++ /* We don't support blocks that require erasing before overwrite */ ++ if (ftable || fmap) ++ goto force_ro; ++ /* UDF 2.60: 2.3.3 - no mixing of tables & bitmaps, no VAT. */ ++ if (utable && umap) ++ goto force_ro; ++ ++ if (map->s_partition_type == UDF_VIRTUAL_MAP15 || ++ map->s_partition_type == UDF_VIRTUAL_MAP20) ++ goto force_ro; ++ ++ return 0; ++force_ro: ++ if (!sb_rdonly(sb)) ++ return -EACCES; ++ UDF_SET_FLAG(sb, UDF_FLAG_RW_INCOMPAT); ++ return 0; ++} ++ + static int udf_fill_partdesc_info(struct super_block *sb, + struct partitionDesc *p, int p_index) + { + struct udf_part_map *map; + struct udf_sb_info *sbi = UDF_SB(sb); + struct partitionHeaderDesc *phd; ++ int err; + + map = &sbi->s_partmaps[p_index]; + +@@ -1014,8 +1064,16 @@ static int udf_fill_partdesc_info(struct super_block *sb, + p_index, map->s_partition_type, + map->s_partition_root, map->s_partition_len); + +- if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) && +- strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03)) ++ err = check_partition_desc(sb, p, map); ++ if (err) ++ return err; ++ ++ /* ++ * Skip loading allocation info it we cannot ever write to the fs. ++ * This is a correctness thing as we may have decided to force ro mount ++ * to avoid allocation info we don't support. ++ */ ++ if (UDF_QUERY_FLAG(sb, UDF_FLAG_RW_INCOMPAT)) + return 0; + + phd = (struct partitionHeaderDesc *)p->partitionContentsUse; +@@ -1051,9 +1109,6 @@ static int udf_fill_partdesc_info(struct super_block *sb, + p_index, bitmap->s_extPosition); + } + +- if (phd->partitionIntegrityTable.extLength) +- udf_debug("partitionIntegrityTable (part %d)\n", p_index); +- + if (phd->freedSpaceTable.extLength) { + struct kernel_lb_addr loc = { + .logicalBlockNum = le32_to_cpu( +diff --git a/include/crypto/chacha20.h b/include/crypto/chacha20.h +index b83d66073db0..f76302d99e2b 100644 +--- a/include/crypto/chacha20.h ++++ b/include/crypto/chacha20.h +@@ -13,13 +13,12 @@ + #define CHACHA20_IV_SIZE 16 + #define CHACHA20_KEY_SIZE 32 + #define CHACHA20_BLOCK_SIZE 64 +-#define CHACHA20_BLOCK_WORDS (CHACHA20_BLOCK_SIZE / sizeof(u32)) + + struct chacha20_ctx { + u32 key[8]; + }; + +-void chacha20_block(u32 *state, u32 *stream); ++void chacha20_block(u32 *state, u8 *stream); + void crypto_chacha20_init(u32 *state, struct chacha20_ctx *ctx, u8 *iv); + int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key, + unsigned int keysize); +diff --git a/include/linux/cpufeature.h b/include/linux/cpufeature.h +index 986c06c88d81..84d3c81b5978 100644 +--- a/include/linux/cpufeature.h ++++ b/include/linux/cpufeature.h +@@ -45,7 +45,7 @@ + * 'asm/cpufeature.h' of your favorite architecture. + */ + #define module_cpu_feature_match(x, __initfunc) \ +-static struct cpu_feature const cpu_feature_match_ ## x[] = \ ++static struct cpu_feature const __maybe_unused cpu_feature_match_ ## x[] = \ + { { .feature = cpu_feature(x) }, { } }; \ + MODULE_DEVICE_TABLE(cpu, cpu_feature_match_ ## x); \ + \ +diff --git a/include/linux/edac.h b/include/linux/edac.h +index bffb97828ed6..958d69332c1d 100644 +--- a/include/linux/edac.h ++++ b/include/linux/edac.h +@@ -17,6 +17,7 @@ + #include <linux/completion.h> + #include <linux/workqueue.h> + #include <linux/debugfs.h> ++#include <linux/numa.h> + + #define EDAC_DEVICE_NAME_LEN 31 + +@@ -670,6 +671,6 @@ struct mem_ctl_info { + /* + * Maximum number of memory controllers in the coherent fabric. + */ +-#define EDAC_MAX_MCS 16 ++#define EDAC_MAX_MCS 2 * MAX_NUMNODES + + #endif +diff --git a/include/linux/fsl_ifc.h b/include/linux/fsl_ifc.h +index 3fdfede2f0f3..5f343b796ad9 100644 +--- a/include/linux/fsl_ifc.h ++++ b/include/linux/fsl_ifc.h +@@ -274,6 +274,8 @@ + */ + /* Auto Boot Mode */ + #define IFC_NAND_NCFGR_BOOT 0x80000000 ++/* SRAM Initialization */ ++#define IFC_NAND_NCFGR_SRAM_INIT_EN 0x20000000 + /* Addressing Mode-ROW0+n/COL0 */ + #define IFC_NAND_NCFGR_ADDR_MODE_RC0 0x00000000 + /* Addressing Mode-ROW0+n/COL0+n */ +diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h +index bbde887ed393..c43e694fef7d 100644 +--- a/include/linux/hyperv.h ++++ b/include/linux/hyperv.h +@@ -739,7 +739,7 @@ struct vmbus_channel { + u32 ringbuffer_gpadlhandle; + + /* Allocated memory for ring buffer */ +- void *ringbuffer_pages; ++ struct page *ringbuffer_page; + u32 ringbuffer_pagecount; + struct hv_ring_buffer_info outbound; /* send to parent */ + struct hv_ring_buffer_info inbound; /* receive from parent */ +diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h +index 28004d74ae04..b1b4411b4c6b 100644 +--- a/include/linux/intel-iommu.h ++++ b/include/linux/intel-iommu.h +@@ -286,7 +286,8 @@ enum { + #define QI_DEV_IOTLB_SID(sid) ((u64)((sid) & 0xffff) << 32) + #define QI_DEV_IOTLB_QDEP(qdep) (((qdep) & 0x1f) << 16) + #define QI_DEV_IOTLB_ADDR(addr) ((u64)(addr) & VTD_PAGE_MASK) +-#define QI_DEV_IOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | ((u64)(pfsid & 0xfff) << 52)) ++#define QI_DEV_IOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | \ ++ ((u64)((pfsid >> 4) & 0xfff) << 52)) + #define QI_DEV_IOTLB_SIZE 1 + #define QI_DEV_IOTLB_MAX_INVS 32 + +@@ -311,7 +312,8 @@ enum { + #define QI_DEV_EIOTLB_PASID(p) (((u64)p) << 32) + #define QI_DEV_EIOTLB_SID(sid) ((u64)((sid) & 0xffff) << 16) + #define QI_DEV_EIOTLB_QDEP(qd) ((u64)((qd) & 0x1f) << 4) +-#define QI_DEV_EIOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | ((u64)(pfsid & 0xfff) << 52)) ++#define QI_DEV_EIOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | \ ++ ((u64)((pfsid >> 4) & 0xfff) << 52)) + #define QI_DEV_EIOTLB_MAX_INVS 32 + + #define QI_PGRP_IDX(idx) (((u64)(idx)) << 55) +diff --git a/include/linux/libfdt_env.h b/include/linux/libfdt_env.h +index c6ac1fe7ec68..edb0f0c30904 100644 +--- a/include/linux/libfdt_env.h ++++ b/include/linux/libfdt_env.h +@@ -2,6 +2,7 @@ + #ifndef LIBFDT_ENV_H + #define LIBFDT_ENV_H + ++#include <linux/kernel.h> /* For INT_MAX */ + #include <linux/string.h> + + #include <asm/byteorder.h> +diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h +index e8b92dee5a72..ae64fced188d 100644 +--- a/include/linux/mlx5/driver.h ++++ b/include/linux/mlx5/driver.h +@@ -163,10 +163,7 @@ enum mlx5_dcbx_oper_mode { + }; + + enum mlx5_dct_atomic_mode { +- MLX5_ATOMIC_MODE_DCT_OFF = 20, +- MLX5_ATOMIC_MODE_DCT_NONE = 0 << MLX5_ATOMIC_MODE_DCT_OFF, +- MLX5_ATOMIC_MODE_DCT_IB_COMP = 1 << MLX5_ATOMIC_MODE_DCT_OFF, +- MLX5_ATOMIC_MODE_DCT_CX = 2 << MLX5_ATOMIC_MODE_DCT_OFF, ++ MLX5_ATOMIC_MODE_DCT_CX = 2, + }; + + enum { +diff --git a/include/linux/timekeeping32.h b/include/linux/timekeeping32.h +index 8762c2f45f8b..479da36be8c8 100644 +--- a/include/linux/timekeeping32.h ++++ b/include/linux/timekeeping32.h +@@ -6,8 +6,19 @@ + * over time so we can remove the file here. + */ + +-extern void do_gettimeofday(struct timeval *tv); +-unsigned long get_seconds(void); ++static inline void do_gettimeofday(struct timeval *tv) ++{ ++ struct timespec64 now; ++ ++ ktime_get_real_ts64(&now); ++ tv->tv_sec = now.tv_sec; ++ tv->tv_usec = now.tv_nsec/1000; ++} ++ ++static inline unsigned long get_seconds(void) ++{ ++ return ktime_get_real_seconds(); ++} + + static inline struct timespec current_kernel_time(void) + { +diff --git a/include/media/vsp1.h b/include/media/vsp1.h +index 3093b9cb9067..5b383d01c84a 100644 +--- a/include/media/vsp1.h ++++ b/include/media/vsp1.h +@@ -46,7 +46,7 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index, + /** + * struct vsp1_du_atomic_config - VSP atomic configuration parameters + * @pixelformat: plane pixel format (V4L2 4CC) +- * @pitch: line pitch in bytes, for all planes ++ * @pitch: line pitch in bytes for the first plane + * @mem: DMA memory address for each plane of the frame buffer + * @src: source rectangle in the frame buffer (integer coordinates) + * @dst: destination rectangle on the display (integer coordinates) +diff --git a/include/net/llc.h b/include/net/llc.h +index 890a87318014..df282d9b4017 100644 +--- a/include/net/llc.h ++++ b/include/net/llc.h +@@ -66,6 +66,7 @@ struct llc_sap { + int sk_count; + struct hlist_nulls_head sk_laddr_hash[LLC_SK_LADDR_HASH_ENTRIES]; + struct hlist_head sk_dev_hash[LLC_SK_DEV_HASH_ENTRIES]; ++ struct rcu_head rcu; + }; + + static inline +diff --git a/include/soc/tegra/pmc.h b/include/soc/tegra/pmc.h +index c32bf91c23e6..445aa66514e9 100644 +--- a/include/soc/tegra/pmc.h ++++ b/include/soc/tegra/pmc.h +@@ -134,6 +134,7 @@ enum tegra_io_pad { + TEGRA_IO_PAD_USB2, + TEGRA_IO_PAD_USB3, + TEGRA_IO_PAD_USB_BIAS, ++ TEGRA_IO_PAD_AO_HV, + }; + + /* deprecated, use TEGRA_IO_PAD_{HDMI,LVDS} instead */ +diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h +index 5e1a7578c9ed..9a4bdfadab07 100644 +--- a/include/trace/events/sched.h ++++ b/include/trace/events/sched.h +@@ -169,9 +169,14 @@ TRACE_EVENT(sched_switch, + + (__entry->prev_state & (TASK_REPORT_MAX - 1)) ? + __print_flags(__entry->prev_state & (TASK_REPORT_MAX - 1), "|", +- { 0x01, "S" }, { 0x02, "D" }, { 0x04, "T" }, +- { 0x08, "t" }, { 0x10, "X" }, { 0x20, "Z" }, +- { 0x40, "P" }, { 0x80, "I" }) : ++ { TASK_INTERRUPTIBLE, "S" }, ++ { TASK_UNINTERRUPTIBLE, "D" }, ++ { __TASK_STOPPED, "T" }, ++ { __TASK_TRACED, "t" }, ++ { EXIT_DEAD, "X" }, ++ { EXIT_ZOMBIE, "Z" }, ++ { TASK_PARKED, "P" }, ++ { TASK_DEAD, "I" }) : + "R", + + __entry->prev_state & TASK_REPORT_MAX ? "+" : "", +diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c +index 578d4ac54484..c173e4131df8 100644 +--- a/kernel/events/uprobes.c ++++ b/kernel/events/uprobes.c +@@ -1858,7 +1858,7 @@ static void handle_trampoline(struct pt_regs *regs) + + sigill: + uprobe_warn(current, "handle uretprobe, sending SIGILL."); +- force_sig_info(SIGILL, SEND_SIG_FORCED, current); ++ force_sig(SIGILL, current); + + } + +@@ -1974,7 +1974,7 @@ static void handle_singlestep(struct uprobe_task *utask, struct pt_regs *regs) + + if (unlikely(err)) { + uprobe_warn(current, "execute the probed insn, sending SIGILL."); +- force_sig_info(SIGILL, SEND_SIG_FORCED, current); ++ force_sig(SIGILL, current); + } + } + +diff --git a/kernel/kprobes.c b/kernel/kprobes.c +index b8efca9dc2cb..aed90788db5c 100644 +--- a/kernel/kprobes.c ++++ b/kernel/kprobes.c +@@ -544,8 +544,14 @@ static void do_free_cleaned_kprobes(void) + struct optimized_kprobe *op, *tmp; + + list_for_each_entry_safe(op, tmp, &freeing_list, list) { +- BUG_ON(!kprobe_unused(&op->kp)); + list_del_init(&op->list); ++ if (WARN_ON_ONCE(!kprobe_unused(&op->kp))) { ++ /* ++ * This must not happen, but if there is a kprobe ++ * still in use, keep it on kprobes hash list. ++ */ ++ continue; ++ } + free_aggr_kprobe(&op->kp); + } + } +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index 62058fd6dcf6..94bec97bd5e2 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -1389,7 +1389,7 @@ static const_debug __maybe_unused unsigned int sysctl_sched_features = + 0; + #undef SCHED_FEAT + +-#define sched_feat(x) (sysctl_sched_features & (1UL << __SCHED_FEAT_##x)) ++#define sched_feat(x) !!(sysctl_sched_features & (1UL << __SCHED_FEAT_##x)) + + #endif /* SCHED_DEBUG && CONFIG_JUMP_LABEL */ + +diff --git a/kernel/signal.c b/kernel/signal.c +index 0e6bc3049427..7278302e3485 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -78,6 +78,10 @@ static bool sig_task_ignored(struct task_struct *t, int sig, bool force) + + handler = sig_handler(t, sig); + ++ /* SIGKILL and SIGSTOP may not be sent to the global init */ ++ if (unlikely(is_global_init(t) && sig_kernel_only(sig))) ++ return true; ++ + if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) && + handler == SIG_DFL && !(force && sig_kernel_only(sig))) + return true; +diff --git a/kernel/time/time.c b/kernel/time/time.c +index be057d6579f1..f7d4fa5ddb9e 100644 +--- a/kernel/time/time.c ++++ b/kernel/time/time.c +@@ -144,9 +144,11 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv, + struct timezone __user *, tz) + { + if (likely(tv != NULL)) { +- struct timeval ktv; +- do_gettimeofday(&ktv); +- if (copy_to_user(tv, &ktv, sizeof(ktv))) ++ struct timespec64 ts; ++ ++ ktime_get_real_ts64(&ts); ++ if (put_user(ts.tv_sec, &tv->tv_sec) || ++ put_user(ts.tv_nsec / 1000, &tv->tv_usec)) + return -EFAULT; + } + if (unlikely(tz != NULL)) { +@@ -227,10 +229,11 @@ COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv, + struct timezone __user *, tz) + { + if (tv) { +- struct timeval ktv; ++ struct timespec64 ts; + +- do_gettimeofday(&ktv); +- if (compat_put_timeval(&ktv, tv)) ++ ktime_get_real_ts64(&ts); ++ if (put_user(ts.tv_sec, &tv->tv_sec) || ++ put_user(ts.tv_nsec / 1000, &tv->tv_usec)) + return -EFAULT; + } + if (tz) { +diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c +index c2708e1f0c69..81ee5b83c920 100644 +--- a/kernel/time/timekeeping.c ++++ b/kernel/time/timekeeping.c +@@ -1214,22 +1214,6 @@ int get_device_system_crosststamp(int (*get_time_fn) + } + EXPORT_SYMBOL_GPL(get_device_system_crosststamp); + +-/** +- * do_gettimeofday - Returns the time of day in a timeval +- * @tv: pointer to the timeval to be set +- * +- * NOTE: Users should be converted to using getnstimeofday() +- */ +-void do_gettimeofday(struct timeval *tv) +-{ +- struct timespec64 now; +- +- getnstimeofday64(&now); +- tv->tv_sec = now.tv_sec; +- tv->tv_usec = now.tv_nsec/1000; +-} +-EXPORT_SYMBOL(do_gettimeofday); +- + /** + * do_settimeofday64 - Sets the time of day. + * @ts: pointer to the timespec64 variable containing the new time +@@ -2177,14 +2161,6 @@ void getboottime64(struct timespec64 *ts) + } + EXPORT_SYMBOL_GPL(getboottime64); + +-unsigned long get_seconds(void) +-{ +- struct timekeeper *tk = &tk_core.timekeeper; +- +- return tk->xtime_sec; +-} +-EXPORT_SYMBOL(get_seconds); +- + void ktime_get_coarse_real_ts64(struct timespec64 *ts) + { + struct timekeeper *tk = &tk_core.timekeeper; +diff --git a/lib/chacha20.c b/lib/chacha20.c +index c1cc50fb68c9..d907fec6a9ed 100644 +--- a/lib/chacha20.c ++++ b/lib/chacha20.c +@@ -16,9 +16,9 @@ + #include <asm/unaligned.h> + #include <crypto/chacha20.h> + +-void chacha20_block(u32 *state, u32 *stream) ++void chacha20_block(u32 *state, u8 *stream) + { +- u32 x[16], *out = stream; ++ u32 x[16]; + int i; + + for (i = 0; i < ARRAY_SIZE(x); i++) +@@ -67,7 +67,7 @@ void chacha20_block(u32 *state, u32 *stream) + } + + for (i = 0; i < ARRAY_SIZE(x); i++) +- out[i] = cpu_to_le32(x[i] + state[i]); ++ put_unaligned_le32(x[i] + state[i], &stream[i * sizeof(u32)]); + + state[12]++; + } +diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c +index 68c2f2f3c05b..7a93e1e439dd 100644 +--- a/mm/hugetlb_cgroup.c ++++ b/mm/hugetlb_cgroup.c +@@ -196,7 +196,7 @@ int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages, + again: + rcu_read_lock(); + h_cg = hugetlb_cgroup_from_task(current); +- if (!css_tryget_online(&h_cg->css)) { ++ if (!css_tryget(&h_cg->css)) { + rcu_read_unlock(); + goto again; + } +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index e0f7b94a4e9b..5af38d8a9afd 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -851,7 +851,7 @@ struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm) + if (unlikely(!memcg)) + memcg = root_mem_cgroup; + } +- } while (!css_tryget_online(&memcg->css)); ++ } while (!css_tryget(&memcg->css)); + rcu_read_unlock(); + return memcg; + } +diff --git a/mm/memfd.c b/mm/memfd.c +index 5859705dafe1..9e68a4320a0e 100644 +--- a/mm/memfd.c ++++ b/mm/memfd.c +@@ -41,7 +41,7 @@ static void memfd_tag_pins(struct address_space *mapping) + + xa_lock_irq(&mapping->i_pages); + radix_tree_for_each_slot(slot, &mapping->i_pages, &iter, start) { +- page = radix_tree_deref_slot(slot); ++ page = radix_tree_deref_slot_protected(slot, &mapping->i_pages.xa_lock); + if (!page || radix_tree_exception(page)) { + if (radix_tree_deref_retry(page)) { + slot = radix_tree_iter_retry(&iter); +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index 70298b635b59..a4a1cab16c0f 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -666,7 +666,9 @@ static int queue_pages_test_walk(unsigned long start, unsigned long end, + * 1 - there is unmovable page, but MPOL_MF_MOVE* & MPOL_MF_STRICT were + * specified. + * 0 - queue pages successfully or no misplaced page. +- * -EIO - there is misplaced page and only MPOL_MF_STRICT was specified. ++ * errno - i.e. misplaced pages with MPOL_MF_STRICT specified (-EIO) or ++ * memory range specified by nodemask and maxnode points outside ++ * your accessible address space (-EFAULT) + */ + static int + queue_pages_range(struct mm_struct *mm, unsigned long start, unsigned long end, +@@ -1273,7 +1275,7 @@ static long do_mbind(unsigned long start, unsigned long len, + flags | MPOL_MF_INVERT, &pagelist); + + if (ret < 0) { +- err = -EIO; ++ err = ret; + goto up_out; + } + +@@ -1292,10 +1294,12 @@ static long do_mbind(unsigned long start, unsigned long len, + + if ((ret > 0) || (nr_failed && (flags & MPOL_MF_STRICT))) + err = -EIO; +- } else +- putback_movable_pages(&pagelist); +- ++ } else { + up_out: ++ if (!list_empty(&pagelist)) ++ putback_movable_pages(&pagelist); ++ } ++ + up_write(&mm->mmap_sem); + mpol_out: + mpol_put(new); +diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c +index 260ef5426e0c..974c1b8a689c 100644 +--- a/net/bluetooth/l2cap_core.c ++++ b/net/bluetooth/l2cap_core.c +@@ -6819,6 +6819,16 @@ static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) + chan->sdu_len = sdu_len; + chan->sdu_last_frag = skb; + ++ /* Detect if remote is not able to use the selected MPS */ ++ if (skb->len + L2CAP_SDULEN_SIZE < chan->mps) { ++ u16 mps_len = skb->len + L2CAP_SDULEN_SIZE; ++ ++ /* Adjust the number of credits */ ++ BT_DBG("chan->mps %u -> %u", chan->mps, mps_len); ++ chan->mps = mps_len; ++ l2cap_chan_le_send_credits(chan); ++ } ++ + return 0; + } + +diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c +index 95768a9fca06..c0de73b12580 100644 +--- a/net/core/rtnetlink.c ++++ b/net/core/rtnetlink.c +@@ -3268,13 +3268,13 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) + { + int idx; + int s_idx = cb->family; ++ int type = cb->nlh->nlmsg_type - RTM_BASE; + + if (s_idx == 0) + s_idx = 1; + + for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) { + struct rtnl_link **tab; +- int type = cb->nlh->nlmsg_type-RTM_BASE; + struct rtnl_link *link; + rtnl_dumpit_func dumpit; + +diff --git a/net/ipv4/gre_demux.c b/net/ipv4/gre_demux.c +index f21ea6125fc2..511b32ea2533 100644 +--- a/net/ipv4/gre_demux.c ++++ b/net/ipv4/gre_demux.c +@@ -87,13 +87,14 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, + + options = (__be32 *)(greh + 1); + if (greh->flags & GRE_CSUM) { +- if (skb_checksum_simple_validate(skb)) { ++ if (!skb_checksum_simple_validate(skb)) { ++ skb_checksum_try_convert(skb, IPPROTO_GRE, 0, ++ null_compute_pseudo); ++ } else if (csum_err) { + *csum_err = true; + return -EINVAL; + } + +- skb_checksum_try_convert(skb, IPPROTO_GRE, 0, +- null_compute_pseudo); + options++; + } + +diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c +index 758a0f86d499..681276111310 100644 +--- a/net/ipv4/ip_gre.c ++++ b/net/ipv4/ip_gre.c +@@ -232,13 +232,10 @@ static void gre_err(struct sk_buff *skb, u32 info) + const int type = icmp_hdr(skb)->type; + const int code = icmp_hdr(skb)->code; + struct tnl_ptk_info tpi; +- bool csum_err = false; + +- if (gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP), +- iph->ihl * 4) < 0) { +- if (!csum_err) /* ignore csum errors. */ +- return; +- } ++ if (gre_parse_header(skb, &tpi, NULL, htons(ETH_P_IP), ++ iph->ihl * 4) < 0) ++ return; + + if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { + ipv4_update_pmtu(skb, dev_net(skb->dev), info, +diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c +index f6275aa19b6a..d235478d9ca3 100644 +--- a/net/ipv4/ipmr.c ++++ b/net/ipv4/ipmr.c +@@ -2278,7 +2278,8 @@ int ipmr_get_route(struct net *net, struct sk_buff *skb, + rcu_read_unlock(); + return -ENODEV; + } +- skb2 = skb_clone(skb, GFP_ATOMIC); ++ ++ skb2 = skb_realloc_headroom(skb, sizeof(struct iphdr)); + if (!skb2) { + read_unlock(&mrt_lock); + rcu_read_unlock(); +diff --git a/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c b/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c +index 4c7fcd32f8e6..41327bb99093 100644 +--- a/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c ++++ b/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c +@@ -104,12 +104,26 @@ static int masq_device_event(struct notifier_block *this, + return NOTIFY_DONE; + } + ++static int inet_cmp(struct nf_conn *ct, void *ptr) ++{ ++ struct in_ifaddr *ifa = (struct in_ifaddr *)ptr; ++ struct net_device *dev = ifa->ifa_dev->dev; ++ struct nf_conntrack_tuple *tuple; ++ ++ if (!device_cmp(ct, (void *)(long)dev->ifindex)) ++ return 0; ++ ++ tuple = &ct->tuplehash[IP_CT_DIR_REPLY].tuple; ++ ++ return ifa->ifa_address == tuple->dst.u3.ip; ++} ++ + static int masq_inet_event(struct notifier_block *this, + unsigned long event, + void *ptr) + { + struct in_device *idev = ((struct in_ifaddr *)ptr)->ifa_dev; +- struct netdev_notifier_info info; ++ struct net *net = dev_net(idev->dev); + + /* The masq_dev_notifier will catch the case of the device going + * down. So if the inetdev is dead and being destroyed we have +@@ -119,8 +133,10 @@ static int masq_inet_event(struct notifier_block *this, + if (idev->dead) + return NOTIFY_DONE; + +- netdev_notifier_info_init(&info, idev->dev); +- return masq_device_event(this, event, &info); ++ if (event == NETDEV_DOWN) ++ nf_ct_iterate_cleanup_net(net, inet_cmp, ptr, 0, 0); ++ ++ return NOTIFY_DONE; + } + + static struct notifier_block masq_dev_notifier = { +diff --git a/net/ipv6/netfilter/nf_nat_masquerade_ipv6.c b/net/ipv6/netfilter/nf_nat_masquerade_ipv6.c +index 37b1d413c825..0ad0da5a2600 100644 +--- a/net/ipv6/netfilter/nf_nat_masquerade_ipv6.c ++++ b/net/ipv6/netfilter/nf_nat_masquerade_ipv6.c +@@ -87,18 +87,30 @@ static struct notifier_block masq_dev_notifier = { + struct masq_dev_work { + struct work_struct work; + struct net *net; ++ struct in6_addr addr; + int ifindex; + }; + ++static int inet_cmp(struct nf_conn *ct, void *work) ++{ ++ struct masq_dev_work *w = (struct masq_dev_work *)work; ++ struct nf_conntrack_tuple *tuple; ++ ++ if (!device_cmp(ct, (void *)(long)w->ifindex)) ++ return 0; ++ ++ tuple = &ct->tuplehash[IP_CT_DIR_REPLY].tuple; ++ ++ return ipv6_addr_equal(&w->addr, &tuple->dst.u3.in6); ++} ++ + static void iterate_cleanup_work(struct work_struct *work) + { + struct masq_dev_work *w; +- long index; + + w = container_of(work, struct masq_dev_work, work); + +- index = w->ifindex; +- nf_ct_iterate_cleanup_net(w->net, device_cmp, (void *)index, 0, 0); ++ nf_ct_iterate_cleanup_net(w->net, inet_cmp, (void *)w, 0, 0); + + put_net(w->net); + kfree(w); +@@ -147,6 +159,7 @@ static int masq_inet6_event(struct notifier_block *this, + INIT_WORK(&w->work, iterate_cleanup_work); + w->ifindex = dev->ifindex; + w->net = net; ++ w->addr = ifa->addr; + schedule_work(&w->work); + + return NOTIFY_DONE; +diff --git a/net/llc/llc_core.c b/net/llc/llc_core.c +index 260b3dc1b4a2..64d4bef04e73 100644 +--- a/net/llc/llc_core.c ++++ b/net/llc/llc_core.c +@@ -127,9 +127,7 @@ void llc_sap_close(struct llc_sap *sap) + list_del_rcu(&sap->node); + spin_unlock_bh(&llc_sap_list_lock); + +- synchronize_rcu(); +- +- kfree(sap); ++ kfree_rcu(sap, rcu); + } + + static struct packet_type llc_packet_type __read_mostly = { +diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c +index 5c9dcafbc342..b0667467337d 100644 +--- a/net/mac80211/mlme.c ++++ b/net/mac80211/mlme.c +@@ -3255,19 +3255,16 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, + } + + if (bss_conf->he_support) { +- u32 he_oper_params = +- le32_to_cpu(elems.he_operation->he_oper_params); ++ bss_conf->bss_color = ++ le32_get_bits(elems.he_operation->he_oper_params, ++ IEEE80211_HE_OPERATION_BSS_COLOR_MASK); + +- bss_conf->bss_color = he_oper_params & +- IEEE80211_HE_OPERATION_BSS_COLOR_MASK; + bss_conf->htc_trig_based_pkt_ext = +- (he_oper_params & +- IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK) << +- IEEE80211_HE_OPERATION_DFLT_PE_DURATION_OFFSET; ++ le32_get_bits(elems.he_operation->he_oper_params, ++ IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK); + bss_conf->frame_time_rts_th = +- (he_oper_params & +- IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK) << +- IEEE80211_HE_OPERATION_RTS_THRESHOLD_OFFSET; ++ le32_get_bits(elems.he_operation->he_oper_params, ++ IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK); + + bss_conf->multi_sta_back_32bit = + sta->sta.he_cap.he_cap_elem.mac_cap_info[2] & +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 24fddf032279..289d079008ee 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -1031,7 +1031,8 @@ static int nf_tables_deltable(struct net *net, struct sock *nlsk, + + static void nf_tables_table_destroy(struct nft_ctx *ctx) + { +- BUG_ON(ctx->table->use > 0); ++ if (WARN_ON(ctx->table->use > 0)) ++ return; + + rhltable_destroy(&ctx->table->chains_ht); + kfree(ctx->table->name); +@@ -1446,7 +1447,8 @@ static void nf_tables_chain_destroy(struct nft_ctx *ctx) + { + struct nft_chain *chain = ctx->chain; + +- BUG_ON(chain->use > 0); ++ if (WARN_ON(chain->use > 0)) ++ return; + + /* no concurrent access possible anymore */ + nf_tables_chain_free_chain_rules(chain); +@@ -7253,7 +7255,8 @@ int __nft_release_basechain(struct nft_ctx *ctx) + { + struct nft_rule *rule, *nr; + +- BUG_ON(!nft_is_base_chain(ctx->chain)); ++ if (WARN_ON(!nft_is_base_chain(ctx->chain))) ++ return 0; + + nf_tables_unregister_hook(ctx->net, ctx->chain->table, ctx->chain); + list_for_each_entry_safe(rule, nr, &ctx->chain->rules, list) { +diff --git a/net/netfilter/nft_cmp.c b/net/netfilter/nft_cmp.c +index fa90a8402845..79d48c1d06f4 100644 +--- a/net/netfilter/nft_cmp.c ++++ b/net/netfilter/nft_cmp.c +@@ -79,7 +79,8 @@ static int nft_cmp_init(const struct nft_ctx *ctx, const struct nft_expr *expr, + + err = nft_data_init(NULL, &priv->data, sizeof(priv->data), &desc, + tb[NFTA_CMP_DATA]); +- BUG_ON(err < 0); ++ if (err < 0) ++ return err; + + priv->sreg = nft_parse_register(tb[NFTA_CMP_SREG]); + err = nft_validate_register_load(priv->sreg, desc.len); +@@ -129,7 +130,8 @@ static int nft_cmp_fast_init(const struct nft_ctx *ctx, + + err = nft_data_init(NULL, &data, sizeof(data), &desc, + tb[NFTA_CMP_DATA]); +- BUG_ON(err < 0); ++ if (err < 0) ++ return err; + + priv->sreg = nft_parse_register(tb[NFTA_CMP_SREG]); + err = nft_validate_register_load(priv->sreg, desc.len); +diff --git a/net/netfilter/nft_reject.c b/net/netfilter/nft_reject.c +index 29f5bd2377b0..b48e58cceeb7 100644 +--- a/net/netfilter/nft_reject.c ++++ b/net/netfilter/nft_reject.c +@@ -94,7 +94,8 @@ static u8 icmp_code_v4[NFT_REJECT_ICMPX_MAX + 1] = { + + int nft_reject_icmp_code(u8 code) + { +- BUG_ON(code > NFT_REJECT_ICMPX_MAX); ++ if (WARN_ON_ONCE(code > NFT_REJECT_ICMPX_MAX)) ++ return ICMP_NET_UNREACH; + + return icmp_code_v4[code]; + } +@@ -111,7 +112,8 @@ static u8 icmp_code_v6[NFT_REJECT_ICMPX_MAX + 1] = { + + int nft_reject_icmpv6_code(u8 code) + { +- BUG_ON(code > NFT_REJECT_ICMPX_MAX); ++ if (WARN_ON_ONCE(code > NFT_REJECT_ICMPX_MAX)) ++ return ICMPV6_NOROUTE; + + return icmp_code_v6[code]; + } +diff --git a/net/wireless/reg.c b/net/wireless/reg.c +index cccbf845079c..64841238df85 100644 +--- a/net/wireless/reg.c ++++ b/net/wireless/reg.c +@@ -847,22 +847,36 @@ static bool valid_regdb(const u8 *data, unsigned int size) + return true; + } + +-static void set_wmm_rule(struct ieee80211_reg_rule *rrule, +- struct fwdb_wmm_rule *wmm) +-{ +- struct ieee80211_wmm_rule *rule = &rrule->wmm_rule; +- unsigned int i; ++static void set_wmm_rule(const struct fwdb_header *db, ++ const struct fwdb_country *country, ++ const struct fwdb_rule *rule, ++ struct ieee80211_reg_rule *rrule) ++{ ++ struct ieee80211_wmm_rule *wmm_rule = &rrule->wmm_rule; ++ struct fwdb_wmm_rule *wmm; ++ unsigned int i, wmm_ptr; ++ ++ wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2; ++ wmm = (void *)((u8 *)db + wmm_ptr); ++ ++ if (!valid_wmm(wmm)) { ++ pr_err("Invalid regulatory WMM rule %u-%u in domain %c%c\n", ++ be32_to_cpu(rule->start), be32_to_cpu(rule->end), ++ country->alpha2[0], country->alpha2[1]); ++ return; ++ } + + for (i = 0; i < IEEE80211_NUM_ACS; i++) { +- rule->client[i].cw_min = ++ wmm_rule->client[i].cw_min = + ecw2cw((wmm->client[i].ecw & 0xf0) >> 4); +- rule->client[i].cw_max = ecw2cw(wmm->client[i].ecw & 0x0f); +- rule->client[i].aifsn = wmm->client[i].aifsn; +- rule->client[i].cot = 1000 * be16_to_cpu(wmm->client[i].cot); +- rule->ap[i].cw_min = ecw2cw((wmm->ap[i].ecw & 0xf0) >> 4); +- rule->ap[i].cw_max = ecw2cw(wmm->ap[i].ecw & 0x0f); +- rule->ap[i].aifsn = wmm->ap[i].aifsn; +- rule->ap[i].cot = 1000 * be16_to_cpu(wmm->ap[i].cot); ++ wmm_rule->client[i].cw_max = ecw2cw(wmm->client[i].ecw & 0x0f); ++ wmm_rule->client[i].aifsn = wmm->client[i].aifsn; ++ wmm_rule->client[i].cot = ++ 1000 * be16_to_cpu(wmm->client[i].cot); ++ wmm_rule->ap[i].cw_min = ecw2cw((wmm->ap[i].ecw & 0xf0) >> 4); ++ wmm_rule->ap[i].cw_max = ecw2cw(wmm->ap[i].ecw & 0x0f); ++ wmm_rule->ap[i].aifsn = wmm->ap[i].aifsn; ++ wmm_rule->ap[i].cot = 1000 * be16_to_cpu(wmm->ap[i].cot); + } + + rrule->has_wmm = true; +@@ -870,7 +884,7 @@ static void set_wmm_rule(struct ieee80211_reg_rule *rrule, + + static int __regdb_query_wmm(const struct fwdb_header *db, + const struct fwdb_country *country, int freq, +- struct ieee80211_reg_rule *rule) ++ struct ieee80211_reg_rule *rrule) + { + unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2; + struct fwdb_collection *coll = (void *)((u8 *)db + ptr); +@@ -879,18 +893,14 @@ static int __regdb_query_wmm(const struct fwdb_header *db, + for (i = 0; i < coll->n_rules; i++) { + __be16 *rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2)); + unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2; +- struct fwdb_rule *rrule = (void *)((u8 *)db + rule_ptr); +- struct fwdb_wmm_rule *wmm; +- unsigned int wmm_ptr; ++ struct fwdb_rule *rule = (void *)((u8 *)db + rule_ptr); + +- if (rrule->len < offsetofend(struct fwdb_rule, wmm_ptr)) ++ if (rule->len < offsetofend(struct fwdb_rule, wmm_ptr)) + continue; + +- if (freq >= KHZ_TO_MHZ(be32_to_cpu(rrule->start)) && +- freq <= KHZ_TO_MHZ(be32_to_cpu(rrule->end))) { +- wmm_ptr = be16_to_cpu(rrule->wmm_ptr) << 2; +- wmm = (void *)((u8 *)db + wmm_ptr); +- set_wmm_rule(rule, wmm); ++ if (freq >= KHZ_TO_MHZ(be32_to_cpu(rule->start)) && ++ freq <= KHZ_TO_MHZ(be32_to_cpu(rule->end))) { ++ set_wmm_rule(db, country, rule, rrule); + return 0; + } + } +@@ -972,12 +982,8 @@ static int regdb_query_country(const struct fwdb_header *db, + if (rule->len >= offsetofend(struct fwdb_rule, cac_timeout)) + rrule->dfs_cac_ms = + 1000 * be16_to_cpu(rule->cac_timeout); +- if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) { +- u32 wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2; +- struct fwdb_wmm_rule *wmm = (void *)((u8 *)db + wmm_ptr); +- +- set_wmm_rule(rrule, wmm); +- } ++ if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) ++ set_wmm_rule(db, country, rule, rrule); + } + + return reg_schedule_apply(regdom); +@@ -3225,8 +3231,54 @@ static void restore_regulatory_settings(bool reset_user) + schedule_work(®_work); + } + ++static bool is_wiphy_all_set_reg_flag(enum ieee80211_regulatory_flags flag) ++{ ++ struct cfg80211_registered_device *rdev; ++ struct wireless_dev *wdev; ++ ++ list_for_each_entry(rdev, &cfg80211_rdev_list, list) { ++ list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { ++ wdev_lock(wdev); ++ if (!(wdev->wiphy->regulatory_flags & flag)) { ++ wdev_unlock(wdev); ++ return false; ++ } ++ wdev_unlock(wdev); ++ } ++ } ++ ++ return true; ++} ++ + void regulatory_hint_disconnect(void) + { ++ /* Restore of regulatory settings is not required when wiphy(s) ++ * ignore IE from connected access point but clearance of beacon hints ++ * is required when wiphy(s) supports beacon hints. ++ */ ++ if (is_wiphy_all_set_reg_flag(REGULATORY_COUNTRY_IE_IGNORE)) { ++ struct reg_beacon *reg_beacon, *btmp; ++ ++ if (is_wiphy_all_set_reg_flag(REGULATORY_DISABLE_BEACON_HINTS)) ++ return; ++ ++ spin_lock_bh(®_pending_beacons_lock); ++ list_for_each_entry_safe(reg_beacon, btmp, ++ ®_pending_beacons, list) { ++ list_del(®_beacon->list); ++ kfree(reg_beacon); ++ } ++ spin_unlock_bh(®_pending_beacons_lock); ++ ++ list_for_each_entry_safe(reg_beacon, btmp, ++ ®_beacon_list, list) { ++ list_del(®_beacon->list); ++ kfree(reg_beacon); ++ } ++ ++ return; ++ } ++ + pr_debug("All devices are disconnected, going to restore regulatory settings\n"); + restore_regulatory_settings(false); + } +diff --git a/samples/bpf/sockex2_kern.c b/samples/bpf/sockex2_kern.c +index f58acfc92556..f2f9dbc021b0 100644 +--- a/samples/bpf/sockex2_kern.c ++++ b/samples/bpf/sockex2_kern.c +@@ -14,7 +14,7 @@ struct vlan_hdr { + __be16 h_vlan_encapsulated_proto; + }; + +-struct bpf_flow_keys { ++struct flow_key_record { + __be32 src; + __be32 dst; + union { +@@ -59,7 +59,7 @@ static inline __u32 ipv6_addr_hash(struct __sk_buff *ctx, __u64 off) + } + + static inline __u64 parse_ip(struct __sk_buff *skb, __u64 nhoff, __u64 *ip_proto, +- struct bpf_flow_keys *flow) ++ struct flow_key_record *flow) + { + __u64 verlen; + +@@ -83,7 +83,7 @@ static inline __u64 parse_ip(struct __sk_buff *skb, __u64 nhoff, __u64 *ip_proto + } + + static inline __u64 parse_ipv6(struct __sk_buff *skb, __u64 nhoff, __u64 *ip_proto, +- struct bpf_flow_keys *flow) ++ struct flow_key_record *flow) + { + *ip_proto = load_byte(skb, + nhoff + offsetof(struct ipv6hdr, nexthdr)); +@@ -96,7 +96,8 @@ static inline __u64 parse_ipv6(struct __sk_buff *skb, __u64 nhoff, __u64 *ip_pro + return nhoff; + } + +-static inline bool flow_dissector(struct __sk_buff *skb, struct bpf_flow_keys *flow) ++static inline bool flow_dissector(struct __sk_buff *skb, ++ struct flow_key_record *flow) + { + __u64 nhoff = ETH_HLEN; + __u64 ip_proto; +@@ -198,7 +199,7 @@ struct bpf_map_def SEC("maps") hash_map = { + SEC("socket2") + int bpf_prog2(struct __sk_buff *skb) + { +- struct bpf_flow_keys flow = {}; ++ struct flow_key_record flow = {}; + struct pair *value; + u32 key; + +diff --git a/samples/bpf/sockex3_kern.c b/samples/bpf/sockex3_kern.c +index 95907f8d2b17..c527b57d3ec8 100644 +--- a/samples/bpf/sockex3_kern.c ++++ b/samples/bpf/sockex3_kern.c +@@ -61,7 +61,7 @@ struct vlan_hdr { + __be16 h_vlan_encapsulated_proto; + }; + +-struct bpf_flow_keys { ++struct flow_key_record { + __be32 src; + __be32 dst; + union { +@@ -88,7 +88,7 @@ static inline __u32 ipv6_addr_hash(struct __sk_buff *ctx, __u64 off) + } + + struct globals { +- struct bpf_flow_keys flow; ++ struct flow_key_record flow; + }; + + struct bpf_map_def SEC("maps") percpu_map = { +@@ -114,14 +114,14 @@ struct pair { + + struct bpf_map_def SEC("maps") hash_map = { + .type = BPF_MAP_TYPE_HASH, +- .key_size = sizeof(struct bpf_flow_keys), ++ .key_size = sizeof(struct flow_key_record), + .value_size = sizeof(struct pair), + .max_entries = 1024, + }; + + static void update_stats(struct __sk_buff *skb, struct globals *g) + { +- struct bpf_flow_keys key = g->flow; ++ struct flow_key_record key = g->flow; + struct pair *value; + + value = bpf_map_lookup_elem(&hash_map, &key); +diff --git a/samples/bpf/sockex3_user.c b/samples/bpf/sockex3_user.c +index 5ba3ae9d180b..9d02e0404719 100644 +--- a/samples/bpf/sockex3_user.c ++++ b/samples/bpf/sockex3_user.c +@@ -13,7 +13,7 @@ + #define PARSE_IP_PROG_FD (prog_fd[0]) + #define PROG_ARRAY_FD (map_fd[0]) + +-struct bpf_flow_keys { ++struct flow_key_record { + __be32 src; + __be32 dst; + union { +@@ -64,7 +64,7 @@ int main(int argc, char **argv) + (void) f; + + for (i = 0; i < 5; i++) { +- struct bpf_flow_keys key = {}, next_key; ++ struct flow_key_record key = {}, next_key; + struct pair value; + + sleep(1); +diff --git a/sound/core/oss/pcm_plugin.c b/sound/core/oss/pcm_plugin.c +index 71571d992159..31cb2acf8afc 100644 +--- a/sound/core/oss/pcm_plugin.c ++++ b/sound/core/oss/pcm_plugin.c +@@ -111,7 +111,7 @@ int snd_pcm_plug_alloc(struct snd_pcm_substream *plug, snd_pcm_uframes_t frames) + while (plugin->next) { + if (plugin->dst_frames) + frames = plugin->dst_frames(plugin, frames); +- if (snd_BUG_ON(frames <= 0)) ++ if (snd_BUG_ON((snd_pcm_sframes_t)frames <= 0)) + return -ENXIO; + plugin = plugin->next; + err = snd_pcm_plugin_alloc(plugin, frames); +@@ -123,7 +123,7 @@ int snd_pcm_plug_alloc(struct snd_pcm_substream *plug, snd_pcm_uframes_t frames) + while (plugin->prev) { + if (plugin->src_frames) + frames = plugin->src_frames(plugin, frames); +- if (snd_BUG_ON(frames <= 0)) ++ if (snd_BUG_ON((snd_pcm_sframes_t)frames <= 0)) + return -ENXIO; + plugin = plugin->prev; + err = snd_pcm_plugin_alloc(plugin, frames); +diff --git a/sound/core/seq/seq_system.c b/sound/core/seq/seq_system.c +index 8ce1d0b40dce..ce1f1e4727ab 100644 +--- a/sound/core/seq/seq_system.c ++++ b/sound/core/seq/seq_system.c +@@ -123,6 +123,7 @@ int __init snd_seq_system_client_init(void) + { + struct snd_seq_port_callback pcallbacks; + struct snd_seq_port_info *port; ++ int err; + + port = kzalloc(sizeof(*port), GFP_KERNEL); + if (!port) +@@ -144,7 +145,10 @@ int __init snd_seq_system_client_init(void) + port->flags = SNDRV_SEQ_PORT_FLG_GIVEN_PORT; + port->addr.client = sysclient; + port->addr.port = SNDRV_SEQ_PORT_SYSTEM_TIMER; +- snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, port); ++ err = snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, ++ port); ++ if (err < 0) ++ goto error_port; + + /* register announcement port */ + strcpy(port->name, "Announce"); +@@ -154,16 +158,24 @@ int __init snd_seq_system_client_init(void) + port->flags = SNDRV_SEQ_PORT_FLG_GIVEN_PORT; + port->addr.client = sysclient; + port->addr.port = SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE; +- snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, port); ++ err = snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, ++ port); ++ if (err < 0) ++ goto error_port; + announce_port = port->addr.port; + + kfree(port); + return 0; ++ ++ error_port: ++ snd_seq_system_client_done(); ++ kfree(port); ++ return err; + } + + + /* unregister our internal client */ +-void __exit snd_seq_system_client_done(void) ++void snd_seq_system_client_done(void) + { + int oldsysclient = sysclient; + +diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c +index 3e978b75be9a..f2cabfdced05 100644 +--- a/sound/pci/hda/patch_ca0132.c ++++ b/sound/pci/hda/patch_ca0132.c +@@ -31,6 +31,7 @@ + #include <linux/types.h> + #include <linux/io.h> + #include <linux/pci.h> ++#include <asm/io.h> + #include <sound/core.h> + #include "hda_codec.h" + #include "hda_local.h" +diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c +index 943a726b1c1b..c84629190cba 100644 +--- a/sound/pci/intel8x0m.c ++++ b/sound/pci/intel8x0m.c +@@ -1171,16 +1171,6 @@ static int snd_intel8x0m_create(struct snd_card *card, + } + + port_inited: +- if (request_irq(pci->irq, snd_intel8x0m_interrupt, IRQF_SHARED, +- KBUILD_MODNAME, chip)) { +- dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); +- snd_intel8x0m_free(chip); +- return -EBUSY; +- } +- chip->irq = pci->irq; +- pci_set_master(pci); +- synchronize_irq(chip->irq); +- + /* initialize offsets */ + chip->bdbars_count = 2; + tbl = intel_regs; +@@ -1224,11 +1214,21 @@ static int snd_intel8x0m_create(struct snd_card *card, + chip->int_sta_reg = ICH_REG_GLOB_STA; + chip->int_sta_mask = int_sta_masks; + ++ pci_set_master(pci); ++ + if ((err = snd_intel8x0m_chip_init(chip, 1)) < 0) { + snd_intel8x0m_free(chip); + return err; + } + ++ if (request_irq(pci->irq, snd_intel8x0m_interrupt, IRQF_SHARED, ++ KBUILD_MODNAME, chip)) { ++ dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); ++ snd_intel8x0m_free(chip); ++ return -EBUSY; ++ } ++ chip->irq = pci->irq; ++ + if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { + snd_intel8x0m_free(chip); + return err; +diff --git a/sound/soc/amd/acp-da7219-max98357a.c b/sound/soc/amd/acp-da7219-max98357a.c +index 8e3275a96a82..e53b54d77692 100644 +--- a/sound/soc/amd/acp-da7219-max98357a.c ++++ b/sound/soc/amd/acp-da7219-max98357a.c +@@ -42,7 +42,7 @@ + #include "../codecs/da7219.h" + #include "../codecs/da7219-aad.h" + +-#define CZ_PLAT_CLK 25000000 ++#define CZ_PLAT_CLK 48000000 + #define DUAL_CHANNEL 2 + + static struct snd_soc_jack cz_jack; +diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c +index 098196610542..be2473166bfa 100644 +--- a/sound/soc/codecs/hdac_hdmi.c ++++ b/sound/soc/codecs/hdac_hdmi.c +@@ -1410,6 +1410,12 @@ static int hdac_hdmi_create_dais(struct hdac_device *hdev, + if (ret) + return ret; + ++ /* Filter out 44.1, 88.2 and 176.4Khz */ ++ rates &= ~(SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 | ++ SNDRV_PCM_RATE_176400); ++ if (!rates) ++ return -EINVAL; ++ + sprintf(dai_name, "intel-hdmi-hifi%d", i+1); + hdmi_dais[i].name = devm_kstrdup(&hdev->dev, + dai_name, GFP_KERNEL); +diff --git a/sound/soc/codecs/rt5682.c b/sound/soc/codecs/rt5682.c +index 21e7c430baf7..7a78bb00f874 100644 +--- a/sound/soc/codecs/rt5682.c ++++ b/sound/soc/codecs/rt5682.c +@@ -68,6 +68,7 @@ struct rt5682_priv { + + static const struct reg_sequence patch_list[] = { + {0x01c1, 0x1000}, ++ {RT5682_DAC_ADC_DIG_VOL1, 0xa020}, + }; + + static const struct reg_default rt5682_reg[] = { +@@ -1457,6 +1458,8 @@ static int rt5682_hp_event(struct snd_soc_dapm_widget *w, + RT5682_NG2_EN_MASK, RT5682_NG2_EN); + snd_soc_component_update_bits(component, + RT5682_DEPOP_1, 0x60, 0x60); ++ snd_soc_component_update_bits(component, ++ RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080); + break; + + case SND_SOC_DAPM_POST_PMD: +@@ -1464,6 +1467,8 @@ static int rt5682_hp_event(struct snd_soc_dapm_widget *w, + RT5682_DEPOP_1, 0x60, 0x0); + snd_soc_component_write(component, + RT5682_HP_CTRL_2, 0x0000); ++ snd_soc_component_update_bits(component, ++ RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0000); + break; + + default: +diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c +index 64a52d495b1f..896412d11a31 100644 +--- a/sound/soc/codecs/sgtl5000.c ++++ b/sound/soc/codecs/sgtl5000.c +@@ -1387,7 +1387,7 @@ static int sgtl5000_set_power_regs(struct snd_soc_component *component) + * Searching for a suitable index solving this formula: + * idx = 40 * log10(vag_val / lo_cagcntrl) + 15 + */ +- vol_quot = (vag * 100) / lo_vag; ++ vol_quot = lo_vag ? (vag * 100) / lo_vag : 0; + lo_vol = 0; + for (i = 0; i < ARRAY_SIZE(vol_quot_table); i++) { + if (vol_quot >= vol_quot_table[i]) +diff --git a/sound/soc/meson/axg-fifo.c b/sound/soc/meson/axg-fifo.c +index 30262550e37b..0e4f65e654c4 100644 +--- a/sound/soc/meson/axg-fifo.c ++++ b/sound/soc/meson/axg-fifo.c +@@ -203,6 +203,8 @@ static int axg_fifo_pcm_open(struct snd_pcm_substream *ss) + + ret = request_irq(fifo->irq, axg_fifo_pcm_irq_block, 0, + dev_name(dev), ss); ++ if (ret) ++ return ret; + + /* Enable pclk to access registers and clock the fifo ip */ + ret = clk_prepare_enable(fifo->pclk); +diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h +index 8f7a0abfa751..f64c7058b258 100644 +--- a/sound/soc/sh/rcar/rsnd.h ++++ b/sound/soc/sh/rcar/rsnd.h +@@ -438,6 +438,7 @@ struct rsnd_dai_stream { + char name[RSND_DAI_NAME_SIZE]; + struct snd_pcm_substream *substream; + struct rsnd_mod *mod[RSND_MOD_MAX]; ++ struct rsnd_mod *dma; + struct rsnd_dai *rdai; + struct device *dmac_dev; /* for IPMMU */ + u32 parent_ssi_status; +diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c +index 9410e0a9b14b..33dc8d6ad35b 100644 +--- a/sound/soc/sh/rcar/ssi.c ++++ b/sound/soc/sh/rcar/ssi.c +@@ -72,7 +72,6 @@ + + struct rsnd_ssi { + struct rsnd_mod mod; +- struct rsnd_mod *dma; + + u32 flags; + u32 cr_own; +@@ -873,7 +872,6 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod, + struct rsnd_dai_stream *io, + struct rsnd_priv *priv) + { +- struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); + int ret; + + /* +@@ -888,7 +886,7 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod, + return ret; + + /* SSI probe might be called many times in MUX multi path */ +- ret = rsnd_dma_attach(io, mod, &ssi->dma); ++ ret = rsnd_dma_attach(io, mod, &io->dma); + + return ret; + } +diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c +index 4ce57510b623..7f0b48b36380 100644 +--- a/sound/soc/soc-dapm.c ++++ b/sound/soc/soc-dapm.c +@@ -3514,7 +3514,7 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, + break; + case snd_soc_dapm_pinctrl: + w->pinctrl = devm_pinctrl_get(dapm->dev); +- if (IS_ERR_OR_NULL(w->pinctrl)) { ++ if (IS_ERR(w->pinctrl)) { + ret = PTR_ERR(w->pinctrl); + if (ret == -EPROBE_DEFER) + return ERR_PTR(ret); +@@ -3684,7 +3684,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, + struct snd_pcm_hw_params *params = NULL; + struct snd_pcm_runtime *runtime = NULL; + unsigned int fmt; +- int ret; ++ int ret = 0; + + if (WARN_ON(!config) || + WARN_ON(list_empty(&w->edges[SND_SOC_DAPM_DIR_OUT]) || +diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c +index 6566c8831a96..551bfc581fc1 100644 +--- a/sound/soc/soc-pcm.c ++++ b/sound/soc/soc-pcm.c +@@ -1683,7 +1683,7 @@ static void dpcm_init_runtime_hw(struct snd_pcm_runtime *runtime, + struct snd_soc_pcm_stream *stream) + { + runtime->hw.rate_min = stream->rate_min; +- runtime->hw.rate_max = stream->rate_max; ++ runtime->hw.rate_max = min_not_zero(stream->rate_max, UINT_MAX); + runtime->hw.channels_min = stream->channels_min; + runtime->hw.channels_max = stream->channels_max; + if (runtime->hw.formats) +diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c +index d86be8bfe412..aeb74cc6ceff 100644 +--- a/sound/usb/endpoint.c ++++ b/sound/usb/endpoint.c +@@ -401,6 +401,9 @@ static void snd_complete_urb(struct urb *urb) + } + + prepare_outbound_urb(ep, ctx); ++ /* can be stopped during prepare callback */ ++ if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags))) ++ goto exit_clear; + } else { + retire_inbound_urb(ep, ctx); + /* can be stopped during retire callback */ +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index bb67131e6437..726cbd63a0c7 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -1244,7 +1244,8 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, + if (cval->min + cval->res < cval->max) { + int last_valid_res = cval->res; + int saved, test, check; +- get_cur_mix_raw(cval, minchn, &saved); ++ if (get_cur_mix_raw(cval, minchn, &saved) < 0) ++ goto no_res_check; + for (;;) { + test = saved; + if (test < cval->max) +@@ -1264,6 +1265,7 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, + snd_usb_set_cur_mix_value(cval, minchn, 0, saved); + } + ++no_res_check: + cval->initialized = 1; + } + +diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c +index ea253c97b8b9..052b4ada2d05 100644 +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -259,8 +259,8 @@ static int create_yamaha_midi_quirk(struct snd_usb_audio *chip, + NULL, USB_MS_MIDI_OUT_JACK); + if (!injd && !outjd) + return -ENODEV; +- if (!(injd && snd_usb_validate_midi_desc(injd)) || +- !(outjd && snd_usb_validate_midi_desc(outjd))) ++ if ((injd && !snd_usb_validate_midi_desc(injd)) || ++ (outjd && !snd_usb_validate_midi_desc(outjd))) + return -ENODEV; + if (injd && (injd->bLength < 5 || + (injd->bJackType != USB_MS_EMBEDDED && +diff --git a/sound/usb/validate.c b/sound/usb/validate.c +index a5e584b60dcd..389e8657434a 100644 +--- a/sound/usb/validate.c ++++ b/sound/usb/validate.c +@@ -81,9 +81,9 @@ static bool validate_processing_unit(const void *p, + switch (v->protocol) { + case UAC_VERSION_1: + default: +- /* bNrChannels, wChannelConfig, iChannelNames, bControlSize */ +- len += 1 + 2 + 1 + 1; +- if (d->bLength < len) /* bControlSize */ ++ /* bNrChannels, wChannelConfig, iChannelNames */ ++ len += 1 + 2 + 1; ++ if (d->bLength < len + 1) /* bControlSize */ + return false; + m = hdr[len]; + len += 1 + m + 1; /* bControlSize, bmControls, iProcessing */ +diff --git a/tools/testing/selftests/powerpc/tm/tm-unavailable.c b/tools/testing/selftests/powerpc/tm/tm-unavailable.c +index 156c8e750259..09894f4ff62e 100644 +--- a/tools/testing/selftests/powerpc/tm/tm-unavailable.c ++++ b/tools/testing/selftests/powerpc/tm/tm-unavailable.c +@@ -236,7 +236,8 @@ void *tm_una_ping(void *input) + } + + /* Check if we were not expecting a failure and a it occurred. */ +- if (!expecting_failure() && is_failure(cr_)) { ++ if (!expecting_failure() && is_failure(cr_) && ++ !failure_is_reschedule()) { + printf("\n\tUnexpected transaction failure 0x%02lx\n\t", + failure_code()); + return (void *) -1; +@@ -244,9 +245,11 @@ void *tm_una_ping(void *input) + + /* + * Check if TM failed due to the cause we were expecting. 0xda is a +- * TM_CAUSE_FAC_UNAV cause, otherwise it's an unexpected cause. ++ * TM_CAUSE_FAC_UNAV cause, otherwise it's an unexpected cause, unless ++ * it was caused by a reschedule. + */ +- if (is_failure(cr_) && !failure_is_unavailable()) { ++ if (is_failure(cr_) && !failure_is_unavailable() && ++ !failure_is_reschedule()) { + printf("\n\tUnexpected failure cause 0x%02lx\n\t", + failure_code()); + return (void *) -1; +diff --git a/tools/testing/selftests/powerpc/tm/tm.h b/tools/testing/selftests/powerpc/tm/tm.h +index df4204247d45..5518b1d4ef8b 100644 +--- a/tools/testing/selftests/powerpc/tm/tm.h ++++ b/tools/testing/selftests/powerpc/tm/tm.h +@@ -52,6 +52,15 @@ static inline bool failure_is_unavailable(void) + return (failure_code() & TM_CAUSE_FAC_UNAV) == TM_CAUSE_FAC_UNAV; + } + ++static inline bool failure_is_reschedule(void) ++{ ++ if ((failure_code() & TM_CAUSE_RESCHED) == TM_CAUSE_RESCHED || ++ (failure_code() & TM_CAUSE_KVM_RESCHED) == TM_CAUSE_KVM_RESCHED) ++ return true; ++ ++ return false; ++} ++ + static inline bool failure_is_nesting(void) + { + return (__builtin_get_texasru() & 0x400000); |