Annotation of /trunk/kernel-magellan/patches-5.3/0103-5.3.4-all-fixes.patch
Parent Directory | Revision Log
Revision 3457 -
(hide annotations)
(download)
Thu Oct 17 06:32:34 2019 UTC (4 years, 8 months ago) by niro
File size: 459944 byte(s)
Thu Oct 17 06:32:34 2019 UTC (4 years, 8 months ago) by niro
File size: 459944 byte(s)
-linux-5.3.4
1 | niro | 3457 | diff --git a/Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-spdif.yaml b/Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-spdif.yaml |
2 | index e0284d8c3b63..38d4cede0860 100644 | ||
3 | --- a/Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-spdif.yaml | ||
4 | +++ b/Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-spdif.yaml | ||
5 | @@ -70,7 +70,9 @@ allOf: | ||
6 | properties: | ||
7 | compatible: | ||
8 | contains: | ||
9 | - const: allwinner,sun8i-h3-spdif | ||
10 | + enum: | ||
11 | + - allwinner,sun8i-h3-spdif | ||
12 | + - allwinner,sun50i-h6-spdif | ||
13 | |||
14 | then: | ||
15 | properties: | ||
16 | diff --git a/Documentation/sound/hd-audio/models.rst b/Documentation/sound/hd-audio/models.rst | ||
17 | index 7d7c191102a7..11298f0ce44d 100644 | ||
18 | --- a/Documentation/sound/hd-audio/models.rst | ||
19 | +++ b/Documentation/sound/hd-audio/models.rst | ||
20 | @@ -260,6 +260,9 @@ alc295-hp-x360 | ||
21 | HP Spectre X360 fixups | ||
22 | alc-sense-combo | ||
23 | Headset button support for Chrome platform | ||
24 | +huawei-mbx-stereo | ||
25 | + Enable initialization verbs for Huawei MBX stereo speakers; | ||
26 | + might be risky, try this at your own risk | ||
27 | |||
28 | ALC66x/67x/892 | ||
29 | ============== | ||
30 | diff --git a/Makefile b/Makefile | ||
31 | index a5f4e184b552..fa11c1d89acf 100644 | ||
32 | --- a/Makefile | ||
33 | +++ b/Makefile | ||
34 | @@ -1,7 +1,7 @@ | ||
35 | # SPDX-License-Identifier: GPL-2.0 | ||
36 | VERSION = 5 | ||
37 | PATCHLEVEL = 3 | ||
38 | -SUBLEVEL = 3 | ||
39 | +SUBLEVEL = 4 | ||
40 | EXTRAVERSION = | ||
41 | NAME = Bobtail Squid | ||
42 | |||
43 | diff --git a/arch/arm/boot/dts/am3517-evm.dts b/arch/arm/boot/dts/am3517-evm.dts | ||
44 | index ebfe28c2f544..a1fd3e63e86e 100644 | ||
45 | --- a/arch/arm/boot/dts/am3517-evm.dts | ||
46 | +++ b/arch/arm/boot/dts/am3517-evm.dts | ||
47 | @@ -124,10 +124,11 @@ | ||
48 | }; | ||
49 | |||
50 | lcd0: display@0 { | ||
51 | - compatible = "panel-dpi"; | ||
52 | + /* This isn't the exact LCD, but the timings meet spec */ | ||
53 | + /* To make it work, set CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=4 */ | ||
54 | + compatible = "newhaven,nhd-4.3-480272ef-atxl"; | ||
55 | label = "15"; | ||
56 | - status = "okay"; | ||
57 | - pinctrl-names = "default"; | ||
58 | + backlight = <&bl>; | ||
59 | enable-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>; /* gpio176, lcd INI */ | ||
60 | vcc-supply = <&vdd_io_reg>; | ||
61 | |||
62 | @@ -136,22 +137,6 @@ | ||
63 | remote-endpoint = <&dpi_out>; | ||
64 | }; | ||
65 | }; | ||
66 | - | ||
67 | - panel-timing { | ||
68 | - clock-frequency = <9000000>; | ||
69 | - hactive = <480>; | ||
70 | - vactive = <272>; | ||
71 | - hfront-porch = <3>; | ||
72 | - hback-porch = <2>; | ||
73 | - hsync-len = <42>; | ||
74 | - vback-porch = <3>; | ||
75 | - vfront-porch = <4>; | ||
76 | - vsync-len = <11>; | ||
77 | - hsync-active = <0>; | ||
78 | - vsync-active = <0>; | ||
79 | - de-active = <1>; | ||
80 | - pixelclk-active = <1>; | ||
81 | - }; | ||
82 | }; | ||
83 | |||
84 | bl: backlight { | ||
85 | diff --git a/arch/arm/boot/dts/exynos5420-peach-pit.dts b/arch/arm/boot/dts/exynos5420-peach-pit.dts | ||
86 | index f78db6809cca..9eb48cabcca4 100644 | ||
87 | --- a/arch/arm/boot/dts/exynos5420-peach-pit.dts | ||
88 | +++ b/arch/arm/boot/dts/exynos5420-peach-pit.dts | ||
89 | @@ -440,6 +440,7 @@ | ||
90 | regulator-name = "vdd_ldo10"; | ||
91 | regulator-min-microvolt = <1800000>; | ||
92 | regulator-max-microvolt = <1800000>; | ||
93 | + regulator-always-on; | ||
94 | regulator-state-mem { | ||
95 | regulator-off-in-suspend; | ||
96 | }; | ||
97 | diff --git a/arch/arm/boot/dts/exynos5800-peach-pi.dts b/arch/arm/boot/dts/exynos5800-peach-pi.dts | ||
98 | index e0f470fe54c8..4398f2d1fe88 100644 | ||
99 | --- a/arch/arm/boot/dts/exynos5800-peach-pi.dts | ||
100 | +++ b/arch/arm/boot/dts/exynos5800-peach-pi.dts | ||
101 | @@ -440,6 +440,7 @@ | ||
102 | regulator-name = "vdd_ldo10"; | ||
103 | regulator-min-microvolt = <1800000>; | ||
104 | regulator-max-microvolt = <1800000>; | ||
105 | + regulator-always-on; | ||
106 | regulator-state-mem { | ||
107 | regulator-off-in-suspend; | ||
108 | }; | ||
109 | diff --git a/arch/arm/boot/dts/imx7-colibri.dtsi b/arch/arm/boot/dts/imx7-colibri.dtsi | ||
110 | index 895fbde4d433..c1ed83131b49 100644 | ||
111 | --- a/arch/arm/boot/dts/imx7-colibri.dtsi | ||
112 | +++ b/arch/arm/boot/dts/imx7-colibri.dtsi | ||
113 | @@ -323,6 +323,7 @@ | ||
114 | vmmc-supply = <®_module_3v3>; | ||
115 | vqmmc-supply = <®_DCDC3>; | ||
116 | non-removable; | ||
117 | + sdhci-caps-mask = <0x80000000 0x0>; | ||
118 | }; | ||
119 | |||
120 | &iomuxc { | ||
121 | diff --git a/arch/arm/boot/dts/imx7d-cl-som-imx7.dts b/arch/arm/boot/dts/imx7d-cl-som-imx7.dts | ||
122 | index e61567437d73..62d5e9a4a781 100644 | ||
123 | --- a/arch/arm/boot/dts/imx7d-cl-som-imx7.dts | ||
124 | +++ b/arch/arm/boot/dts/imx7d-cl-som-imx7.dts | ||
125 | @@ -44,7 +44,7 @@ | ||
126 | <&clks IMX7D_ENET1_TIME_ROOT_CLK>; | ||
127 | assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>; | ||
128 | assigned-clock-rates = <0>, <100000000>; | ||
129 | - phy-mode = "rgmii"; | ||
130 | + phy-mode = "rgmii-id"; | ||
131 | phy-handle = <ðphy0>; | ||
132 | fsl,magic-packet; | ||
133 | status = "okay"; | ||
134 | @@ -70,7 +70,7 @@ | ||
135 | <&clks IMX7D_ENET2_TIME_ROOT_CLK>; | ||
136 | assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>; | ||
137 | assigned-clock-rates = <0>, <100000000>; | ||
138 | - phy-mode = "rgmii"; | ||
139 | + phy-mode = "rgmii-id"; | ||
140 | phy-handle = <ðphy1>; | ||
141 | fsl,magic-packet; | ||
142 | status = "okay"; | ||
143 | diff --git a/arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi b/arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi | ||
144 | index 642e809e757a..449cc7616da6 100644 | ||
145 | --- a/arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi | ||
146 | +++ b/arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi | ||
147 | @@ -108,7 +108,6 @@ | ||
148 | &dss { | ||
149 | status = "ok"; | ||
150 | vdds_dsi-supply = <&vpll2>; | ||
151 | - vdda_video-supply = <&video_reg>; | ||
152 | pinctrl-names = "default"; | ||
153 | pinctrl-0 = <&dss_dpi_pins1>; | ||
154 | port { | ||
155 | @@ -124,44 +123,20 @@ | ||
156 | display0 = &lcd0; | ||
157 | }; | ||
158 | |||
159 | - video_reg: video_reg { | ||
160 | - pinctrl-names = "default"; | ||
161 | - pinctrl-0 = <&panel_pwr_pins>; | ||
162 | - compatible = "regulator-fixed"; | ||
163 | - regulator-name = "fixed-supply"; | ||
164 | - regulator-min-microvolt = <3300000>; | ||
165 | - regulator-max-microvolt = <3300000>; | ||
166 | - gpio = <&gpio5 27 GPIO_ACTIVE_HIGH>; /* gpio155, lcd INI */ | ||
167 | - }; | ||
168 | - | ||
169 | lcd0: display { | ||
170 | - compatible = "panel-dpi"; | ||
171 | + /* This isn't the exact LCD, but the timings meet spec */ | ||
172 | + /* To make it work, set CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=4 */ | ||
173 | + compatible = "newhaven,nhd-4.3-480272ef-atxl"; | ||
174 | label = "15"; | ||
175 | - status = "okay"; | ||
176 | - /* default-on; */ | ||
177 | pinctrl-names = "default"; | ||
178 | - | ||
179 | + pinctrl-0 = <&panel_pwr_pins>; | ||
180 | + backlight = <&bl>; | ||
181 | + enable-gpios = <&gpio5 27 GPIO_ACTIVE_HIGH>; | ||
182 | port { | ||
183 | lcd_in: endpoint { | ||
184 | remote-endpoint = <&dpi_out>; | ||
185 | }; | ||
186 | }; | ||
187 | - | ||
188 | - panel-timing { | ||
189 | - clock-frequency = <9000000>; | ||
190 | - hactive = <480>; | ||
191 | - vactive = <272>; | ||
192 | - hfront-porch = <3>; | ||
193 | - hback-porch = <2>; | ||
194 | - hsync-len = <42>; | ||
195 | - vback-porch = <3>; | ||
196 | - vfront-porch = <4>; | ||
197 | - vsync-len = <11>; | ||
198 | - hsync-active = <0>; | ||
199 | - vsync-active = <0>; | ||
200 | - de-active = <1>; | ||
201 | - pixelclk-active = <1>; | ||
202 | - }; | ||
203 | }; | ||
204 | |||
205 | bl: backlight { | ||
206 | diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig | ||
207 | index c7bf9c493646..64eb896907bf 100644 | ||
208 | --- a/arch/arm/configs/omap2plus_defconfig | ||
209 | +++ b/arch/arm/configs/omap2plus_defconfig | ||
210 | @@ -363,6 +363,7 @@ CONFIG_DRM_OMAP_PANEL_TPO_TD028TTEC1=m | ||
211 | CONFIG_DRM_OMAP_PANEL_TPO_TD043MTEA1=m | ||
212 | CONFIG_DRM_OMAP_PANEL_NEC_NL8048HL11=m | ||
213 | CONFIG_DRM_TILCDC=m | ||
214 | +CONFIG_DRM_PANEL_SIMPLE=m | ||
215 | CONFIG_FB=y | ||
216 | CONFIG_FIRMWARE_EDID=y | ||
217 | CONFIG_FB_MODE_HELPERS=y | ||
218 | diff --git a/arch/arm/mach-at91/.gitignore b/arch/arm/mach-at91/.gitignore | ||
219 | new file mode 100644 | ||
220 | index 000000000000..2ecd6f51c8a9 | ||
221 | --- /dev/null | ||
222 | +++ b/arch/arm/mach-at91/.gitignore | ||
223 | @@ -0,0 +1 @@ | ||
224 | +pm_data-offsets.h | ||
225 | diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile | ||
226 | index 31b61f0e1c07..de64301dcff2 100644 | ||
227 | --- a/arch/arm/mach-at91/Makefile | ||
228 | +++ b/arch/arm/mach-at91/Makefile | ||
229 | @@ -19,9 +19,10 @@ ifeq ($(CONFIG_PM_DEBUG),y) | ||
230 | CFLAGS_pm.o += -DDEBUG | ||
231 | endif | ||
232 | |||
233 | -include/generated/at91_pm_data-offsets.h: arch/arm/mach-at91/pm_data-offsets.s FORCE | ||
234 | +$(obj)/pm_data-offsets.h: $(obj)/pm_data-offsets.s FORCE | ||
235 | $(call filechk,offsets,__PM_DATA_OFFSETS_H__) | ||
236 | |||
237 | -arch/arm/mach-at91/pm_suspend.o: include/generated/at91_pm_data-offsets.h | ||
238 | +$(obj)/pm_suspend.o: $(obj)/pm_data-offsets.h | ||
239 | |||
240 | targets += pm_data-offsets.s | ||
241 | +clean-files += pm_data-offsets.h | ||
242 | diff --git a/arch/arm/mach-at91/pm_suspend.S b/arch/arm/mach-at91/pm_suspend.S | ||
243 | index c751f047b116..ed57c879d4e1 100644 | ||
244 | --- a/arch/arm/mach-at91/pm_suspend.S | ||
245 | +++ b/arch/arm/mach-at91/pm_suspend.S | ||
246 | @@ -10,7 +10,7 @@ | ||
247 | #include <linux/linkage.h> | ||
248 | #include <linux/clk/at91_pmc.h> | ||
249 | #include "pm.h" | ||
250 | -#include "generated/at91_pm_data-offsets.h" | ||
251 | +#include "pm_data-offsets.h" | ||
252 | |||
253 | #define SRAMC_SELF_FRESH_ACTIVE 0x01 | ||
254 | #define SRAMC_SELF_FRESH_EXIT 0x00 | ||
255 | diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c | ||
256 | index 1f0da76a39de..7b7280c21ee0 100644 | ||
257 | --- a/arch/arm/mach-ep93xx/edb93xx.c | ||
258 | +++ b/arch/arm/mach-ep93xx/edb93xx.c | ||
259 | @@ -103,7 +103,7 @@ static struct spi_board_info edb93xx_spi_board_info[] __initdata = { | ||
260 | }; | ||
261 | |||
262 | static struct gpiod_lookup_table edb93xx_spi_cs_gpio_table = { | ||
263 | - .dev_id = "ep93xx-spi.0", | ||
264 | + .dev_id = "spi0", | ||
265 | .table = { | ||
266 | GPIO_LOOKUP("A", 6, "cs", GPIO_ACTIVE_LOW), | ||
267 | { }, | ||
268 | diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c | ||
269 | index e2658e22bba1..8a53b74dc4b2 100644 | ||
270 | --- a/arch/arm/mach-ep93xx/simone.c | ||
271 | +++ b/arch/arm/mach-ep93xx/simone.c | ||
272 | @@ -73,7 +73,7 @@ static struct spi_board_info simone_spi_devices[] __initdata = { | ||
273 | * v1.3 parts will still work, since the signal on SFRMOUT is automatic. | ||
274 | */ | ||
275 | static struct gpiod_lookup_table simone_spi_cs_gpio_table = { | ||
276 | - .dev_id = "ep93xx-spi.0", | ||
277 | + .dev_id = "spi0", | ||
278 | .table = { | ||
279 | GPIO_LOOKUP("A", 1, "cs", GPIO_ACTIVE_LOW), | ||
280 | { }, | ||
281 | diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c | ||
282 | index 582e06e104fd..e0e1b11032f1 100644 | ||
283 | --- a/arch/arm/mach-ep93xx/ts72xx.c | ||
284 | +++ b/arch/arm/mach-ep93xx/ts72xx.c | ||
285 | @@ -267,7 +267,7 @@ static struct spi_board_info bk3_spi_board_info[] __initdata = { | ||
286 | * goes through CPLD | ||
287 | */ | ||
288 | static struct gpiod_lookup_table bk3_spi_cs_gpio_table = { | ||
289 | - .dev_id = "ep93xx-spi.0", | ||
290 | + .dev_id = "spi0", | ||
291 | .table = { | ||
292 | GPIO_LOOKUP("F", 3, "cs", GPIO_ACTIVE_LOW), | ||
293 | { }, | ||
294 | @@ -316,7 +316,7 @@ static struct spi_board_info ts72xx_spi_devices[] __initdata = { | ||
295 | }; | ||
296 | |||
297 | static struct gpiod_lookup_table ts72xx_spi_cs_gpio_table = { | ||
298 | - .dev_id = "ep93xx-spi.0", | ||
299 | + .dev_id = "spi0", | ||
300 | .table = { | ||
301 | /* DIO_17 */ | ||
302 | GPIO_LOOKUP("F", 2, "cs", GPIO_ACTIVE_LOW), | ||
303 | diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c | ||
304 | index a88a1d807b32..cbcba3136d74 100644 | ||
305 | --- a/arch/arm/mach-ep93xx/vision_ep9307.c | ||
306 | +++ b/arch/arm/mach-ep93xx/vision_ep9307.c | ||
307 | @@ -242,7 +242,7 @@ static struct spi_board_info vision_spi_board_info[] __initdata = { | ||
308 | }; | ||
309 | |||
310 | static struct gpiod_lookup_table vision_spi_cs_gpio_table = { | ||
311 | - .dev_id = "ep93xx-spi.0", | ||
312 | + .dev_id = "spi0", | ||
313 | .table = { | ||
314 | GPIO_LOOKUP_IDX("A", 6, "cs", 0, GPIO_ACTIVE_LOW), | ||
315 | GPIO_LOOKUP_IDX("A", 7, "cs", 1, GPIO_ACTIVE_LOW), | ||
316 | diff --git a/arch/arm/mach-omap2/.gitignore b/arch/arm/mach-omap2/.gitignore | ||
317 | new file mode 100644 | ||
318 | index 000000000000..79a8d6ea7152 | ||
319 | --- /dev/null | ||
320 | +++ b/arch/arm/mach-omap2/.gitignore | ||
321 | @@ -0,0 +1 @@ | ||
322 | +pm-asm-offsets.h | ||
323 | diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile | ||
324 | index 600650551621..21c6d4bca3c0 100644 | ||
325 | --- a/arch/arm/mach-omap2/Makefile | ||
326 | +++ b/arch/arm/mach-omap2/Makefile | ||
327 | @@ -223,9 +223,10 @@ obj-y += omap_phy_internal.o | ||
328 | |||
329 | obj-$(CONFIG_MACH_OMAP2_TUSB6010) += usb-tusb6010.o | ||
330 | |||
331 | -include/generated/ti-pm-asm-offsets.h: arch/arm/mach-omap2/pm-asm-offsets.s FORCE | ||
332 | +$(obj)/pm-asm-offsets.h: $(obj)/pm-asm-offsets.s FORCE | ||
333 | $(call filechk,offsets,__TI_PM_ASM_OFFSETS_H__) | ||
334 | |||
335 | -$(obj)/sleep33xx.o $(obj)/sleep43xx.o: include/generated/ti-pm-asm-offsets.h | ||
336 | +$(obj)/sleep33xx.o $(obj)/sleep43xx.o: $(obj)/pm-asm-offsets.h | ||
337 | |||
338 | targets += pm-asm-offsets.s | ||
339 | +clean-files += pm-asm-offsets.h | ||
340 | diff --git a/arch/arm/mach-omap2/sleep33xx.S b/arch/arm/mach-omap2/sleep33xx.S | ||
341 | index 68fee339d3f1..dc221249bc22 100644 | ||
342 | --- a/arch/arm/mach-omap2/sleep33xx.S | ||
343 | +++ b/arch/arm/mach-omap2/sleep33xx.S | ||
344 | @@ -6,7 +6,6 @@ | ||
345 | * Dave Gerlach, Vaibhav Bedia | ||
346 | */ | ||
347 | |||
348 | -#include <generated/ti-pm-asm-offsets.h> | ||
349 | #include <linux/linkage.h> | ||
350 | #include <linux/platform_data/pm33xx.h> | ||
351 | #include <linux/ti-emif-sram.h> | ||
352 | @@ -15,6 +14,7 @@ | ||
353 | |||
354 | #include "iomap.h" | ||
355 | #include "cm33xx.h" | ||
356 | +#include "pm-asm-offsets.h" | ||
357 | |||
358 | #define AM33XX_CM_CLKCTRL_MODULESTATE_DISABLED 0x00030000 | ||
359 | #define AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE 0x0003 | ||
360 | diff --git a/arch/arm/mach-omap2/sleep43xx.S b/arch/arm/mach-omap2/sleep43xx.S | ||
361 | index c1f4e4852644..90d2907a2eb2 100644 | ||
362 | --- a/arch/arm/mach-omap2/sleep43xx.S | ||
363 | +++ b/arch/arm/mach-omap2/sleep43xx.S | ||
364 | @@ -6,7 +6,6 @@ | ||
365 | * Dave Gerlach, Vaibhav Bedia | ||
366 | */ | ||
367 | |||
368 | -#include <generated/ti-pm-asm-offsets.h> | ||
369 | #include <linux/linkage.h> | ||
370 | #include <linux/ti-emif-sram.h> | ||
371 | #include <linux/platform_data/pm33xx.h> | ||
372 | @@ -19,6 +18,7 @@ | ||
373 | #include "iomap.h" | ||
374 | #include "omap-secure.h" | ||
375 | #include "omap44xx.h" | ||
376 | +#include "pm-asm-offsets.h" | ||
377 | #include "prm33xx.h" | ||
378 | #include "prcm43xx.h" | ||
379 | |||
380 | diff --git a/arch/arm/mach-zynq/platsmp.c b/arch/arm/mach-zynq/platsmp.c | ||
381 | index a7cfe07156f4..e65ee8180c35 100644 | ||
382 | --- a/arch/arm/mach-zynq/platsmp.c | ||
383 | +++ b/arch/arm/mach-zynq/platsmp.c | ||
384 | @@ -57,7 +57,7 @@ int zynq_cpun_start(u32 address, int cpu) | ||
385 | * 0x4: Jump by mov instruction | ||
386 | * 0x8: Jumping address | ||
387 | */ | ||
388 | - memcpy((__force void *)zero, &zynq_secondary_trampoline, | ||
389 | + memcpy_toio(zero, &zynq_secondary_trampoline, | ||
390 | trampoline_size); | ||
391 | writel(address, zero + trampoline_size); | ||
392 | |||
393 | diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c | ||
394 | index 61d834157bc0..382e1c2855e8 100644 | ||
395 | --- a/arch/arm/mm/copypage-xscale.c | ||
396 | +++ b/arch/arm/mm/copypage-xscale.c | ||
397 | @@ -42,6 +42,7 @@ static void mc_copy_user_page(void *from, void *to) | ||
398 | * when prefetching destination as well. (NP) | ||
399 | */ | ||
400 | asm volatile ("\ | ||
401 | +.arch xscale \n\ | ||
402 | pld [%0, #0] \n\ | ||
403 | pld [%0, #32] \n\ | ||
404 | pld [%1, #0] \n\ | ||
405 | @@ -106,8 +107,9 @@ void | ||
406 | xscale_mc_clear_user_highpage(struct page *page, unsigned long vaddr) | ||
407 | { | ||
408 | void *ptr, *kaddr = kmap_atomic(page); | ||
409 | - asm volatile( | ||
410 | - "mov r1, %2 \n\ | ||
411 | + asm volatile("\ | ||
412 | +.arch xscale \n\ | ||
413 | + mov r1, %2 \n\ | ||
414 | mov r2, #0 \n\ | ||
415 | mov r3, #0 \n\ | ||
416 | 1: mov ip, %0 \n\ | ||
417 | diff --git a/arch/arm/plat-samsung/watchdog-reset.c b/arch/arm/plat-samsung/watchdog-reset.c | ||
418 | index ce42cc640a61..71d85ff323f7 100644 | ||
419 | --- a/arch/arm/plat-samsung/watchdog-reset.c | ||
420 | +++ b/arch/arm/plat-samsung/watchdog-reset.c | ||
421 | @@ -62,6 +62,7 @@ void samsung_wdt_reset(void) | ||
422 | #ifdef CONFIG_OF | ||
423 | static const struct of_device_id s3c2410_wdt_match[] = { | ||
424 | { .compatible = "samsung,s3c2410-wdt" }, | ||
425 | + { .compatible = "samsung,s3c6410-wdt" }, | ||
426 | {}, | ||
427 | }; | ||
428 | |||
429 | diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts | ||
430 | index 4e916e1f71f7..1c2a9ca491c0 100644 | ||
431 | --- a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts | ||
432 | +++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts | ||
433 | @@ -66,8 +66,8 @@ | ||
434 | gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; | ||
435 | gpios-states = <0>; | ||
436 | |||
437 | - states = <3300000 0 | ||
438 | - 1800000 1>; | ||
439 | + states = <3300000 0>, | ||
440 | + <1800000 1>; | ||
441 | }; | ||
442 | |||
443 | flash_1v8: regulator-flash_1v8 { | ||
444 | diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts | ||
445 | index b636912a2715..afcf8a9f667b 100644 | ||
446 | --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts | ||
447 | +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts | ||
448 | @@ -75,8 +75,8 @@ | ||
449 | gpios-states = <1>; | ||
450 | |||
451 | /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ | ||
452 | - states = <1800000 0 | ||
453 | - 3300000 1>; | ||
454 | + states = <1800000 0>, | ||
455 | + <3300000 1>; | ||
456 | }; | ||
457 | |||
458 | vddio_boot: regulator-vddio_boot { | ||
459 | diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts | ||
460 | index 9972b1515da6..6039adda12ee 100644 | ||
461 | --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts | ||
462 | +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts | ||
463 | @@ -77,8 +77,8 @@ | ||
464 | gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>; | ||
465 | gpios-states = <0>; | ||
466 | |||
467 | - states = <3300000 0 | ||
468 | - 1800000 1>; | ||
469 | + states = <3300000 0>, | ||
470 | + <1800000 1>; | ||
471 | }; | ||
472 | |||
473 | vcc1v8: regulator-vcc1v8 { | ||
474 | diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi | ||
475 | index e8f925871edf..89f7b41b0e9e 100644 | ||
476 | --- a/arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi | ||
477 | +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi | ||
478 | @@ -46,8 +46,8 @@ | ||
479 | gpios-states = <1>; | ||
480 | |||
481 | /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ | ||
482 | - states = <1800000 0 | ||
483 | - 3300000 1>; | ||
484 | + states = <1800000 0>, | ||
485 | + <3300000 1>; | ||
486 | |||
487 | regulator-settling-time-up-us = <10000>; | ||
488 | regulator-settling-time-down-us = <150000>; | ||
489 | diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts | ||
490 | index 796baea7a0bf..c8d74e61dec1 100644 | ||
491 | --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts | ||
492 | +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts | ||
493 | @@ -38,8 +38,8 @@ | ||
494 | gpios-states = <1>; | ||
495 | |||
496 | /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ | ||
497 | - states = <1800000 0 | ||
498 | - 3300000 1>; | ||
499 | + states = <1800000 0>, | ||
500 | + <3300000 1>; | ||
501 | }; | ||
502 | |||
503 | vddio_boot: regulator-vddio_boot { | ||
504 | diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts | ||
505 | index 26907ac82930..c433a031841f 100644 | ||
506 | --- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts | ||
507 | +++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts | ||
508 | @@ -38,8 +38,8 @@ | ||
509 | gpios-states = <1>; | ||
510 | |||
511 | /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ | ||
512 | - states = <1800000 0 | ||
513 | - 3300000 1>; | ||
514 | + states = <1800000 0>, | ||
515 | + <3300000 1>; | ||
516 | }; | ||
517 | |||
518 | vddio_boot: regulator-vddio_boot { | ||
519 | diff --git a/arch/arm64/boot/dts/freescale/imx8mq.dtsi b/arch/arm64/boot/dts/freescale/imx8mq.dtsi | ||
520 | index 52aae341d0da..d1f4eb197af2 100644 | ||
521 | --- a/arch/arm64/boot/dts/freescale/imx8mq.dtsi | ||
522 | +++ b/arch/arm64/boot/dts/freescale/imx8mq.dtsi | ||
523 | @@ -169,15 +169,14 @@ | ||
524 | opp-1300000000 { | ||
525 | opp-hz = /bits/ 64 <1300000000>; | ||
526 | opp-microvolt = <1000000>; | ||
527 | - opp-supported-hw = <0xc>, <0x7>; | ||
528 | + opp-supported-hw = <0xc>, <0x4>; | ||
529 | clock-latency-ns = <150000>; | ||
530 | }; | ||
531 | |||
532 | opp-1500000000 { | ||
533 | opp-hz = /bits/ 64 <1500000000>; | ||
534 | opp-microvolt = <1000000>; | ||
535 | - /* Consumer only but rely on speed grading */ | ||
536 | - opp-supported-hw = <0x8>, <0x7>; | ||
537 | + opp-supported-hw = <0x8>, <0x3>; | ||
538 | clock-latency-ns = <150000>; | ||
539 | }; | ||
540 | }; | ||
541 | diff --git a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi | ||
542 | index 11c0a7137823..db6df76e97a1 100644 | ||
543 | --- a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi | ||
544 | +++ b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi | ||
545 | @@ -61,7 +61,9 @@ | ||
546 | protected-clocks = <GCC_BIMC_CDSP_CLK>, | ||
547 | <GCC_CDSP_CFG_AHB_CLK>, | ||
548 | <GCC_CDSP_BIMC_CLK_SRC>, | ||
549 | - <GCC_CDSP_TBU_CLK>; | ||
550 | + <GCC_CDSP_TBU_CLK>, | ||
551 | + <141>, /* GCC_WCSS_Q6_AHB_CLK */ | ||
552 | + <142>; /* GCC_WCSS_Q6_AXIM_CLK */ | ||
553 | }; | ||
554 | |||
555 | &pms405_spmi_regulators { | ||
556 | diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi | ||
557 | index e9fefd8a7e02..f0f2c555033b 100644 | ||
558 | --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi | ||
559 | +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi | ||
560 | @@ -801,6 +801,7 @@ | ||
561 | <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>; | ||
562 | clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; | ||
563 | fifo-depth = <0x100>; | ||
564 | + max-frequency = <150000000>; | ||
565 | status = "disabled"; | ||
566 | }; | ||
567 | |||
568 | @@ -812,6 +813,7 @@ | ||
569 | <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>; | ||
570 | clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; | ||
571 | fifo-depth = <0x100>; | ||
572 | + max-frequency = <150000000>; | ||
573 | status = "disabled"; | ||
574 | }; | ||
575 | |||
576 | @@ -823,6 +825,7 @@ | ||
577 | <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>; | ||
578 | clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; | ||
579 | fifo-depth = <0x100>; | ||
580 | + max-frequency = <150000000>; | ||
581 | status = "disabled"; | ||
582 | }; | ||
583 | |||
584 | diff --git a/arch/arm64/include/asm/atomic_ll_sc.h b/arch/arm64/include/asm/atomic_ll_sc.h | ||
585 | index c8c850bc3dfb..6dd011e0b434 100644 | ||
586 | --- a/arch/arm64/include/asm/atomic_ll_sc.h | ||
587 | +++ b/arch/arm64/include/asm/atomic_ll_sc.h | ||
588 | @@ -26,7 +26,7 @@ | ||
589 | * (the optimize attribute silently ignores these options). | ||
590 | */ | ||
591 | |||
592 | -#define ATOMIC_OP(op, asm_op) \ | ||
593 | +#define ATOMIC_OP(op, asm_op, constraint) \ | ||
594 | __LL_SC_INLINE void \ | ||
595 | __LL_SC_PREFIX(arch_atomic_##op(int i, atomic_t *v)) \ | ||
596 | { \ | ||
597 | @@ -40,11 +40,11 @@ __LL_SC_PREFIX(arch_atomic_##op(int i, atomic_t *v)) \ | ||
598 | " stxr %w1, %w0, %2\n" \ | ||
599 | " cbnz %w1, 1b" \ | ||
600 | : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \ | ||
601 | - : "Ir" (i)); \ | ||
602 | + : #constraint "r" (i)); \ | ||
603 | } \ | ||
604 | __LL_SC_EXPORT(arch_atomic_##op); | ||
605 | |||
606 | -#define ATOMIC_OP_RETURN(name, mb, acq, rel, cl, op, asm_op) \ | ||
607 | +#define ATOMIC_OP_RETURN(name, mb, acq, rel, cl, op, asm_op, constraint)\ | ||
608 | __LL_SC_INLINE int \ | ||
609 | __LL_SC_PREFIX(arch_atomic_##op##_return##name(int i, atomic_t *v)) \ | ||
610 | { \ | ||
611 | @@ -59,14 +59,14 @@ __LL_SC_PREFIX(arch_atomic_##op##_return##name(int i, atomic_t *v)) \ | ||
612 | " cbnz %w1, 1b\n" \ | ||
613 | " " #mb \ | ||
614 | : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \ | ||
615 | - : "Ir" (i) \ | ||
616 | + : #constraint "r" (i) \ | ||
617 | : cl); \ | ||
618 | \ | ||
619 | return result; \ | ||
620 | } \ | ||
621 | __LL_SC_EXPORT(arch_atomic_##op##_return##name); | ||
622 | |||
623 | -#define ATOMIC_FETCH_OP(name, mb, acq, rel, cl, op, asm_op) \ | ||
624 | +#define ATOMIC_FETCH_OP(name, mb, acq, rel, cl, op, asm_op, constraint) \ | ||
625 | __LL_SC_INLINE int \ | ||
626 | __LL_SC_PREFIX(arch_atomic_fetch_##op##name(int i, atomic_t *v)) \ | ||
627 | { \ | ||
628 | @@ -81,7 +81,7 @@ __LL_SC_PREFIX(arch_atomic_fetch_##op##name(int i, atomic_t *v)) \ | ||
629 | " cbnz %w2, 1b\n" \ | ||
630 | " " #mb \ | ||
631 | : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter) \ | ||
632 | - : "Ir" (i) \ | ||
633 | + : #constraint "r" (i) \ | ||
634 | : cl); \ | ||
635 | \ | ||
636 | return result; \ | ||
637 | @@ -99,8 +99,8 @@ __LL_SC_EXPORT(arch_atomic_fetch_##op##name); | ||
638 | ATOMIC_FETCH_OP (_acquire, , a, , "memory", __VA_ARGS__)\ | ||
639 | ATOMIC_FETCH_OP (_release, , , l, "memory", __VA_ARGS__) | ||
640 | |||
641 | -ATOMIC_OPS(add, add) | ||
642 | -ATOMIC_OPS(sub, sub) | ||
643 | +ATOMIC_OPS(add, add, I) | ||
644 | +ATOMIC_OPS(sub, sub, J) | ||
645 | |||
646 | #undef ATOMIC_OPS | ||
647 | #define ATOMIC_OPS(...) \ | ||
648 | @@ -110,17 +110,17 @@ ATOMIC_OPS(sub, sub) | ||
649 | ATOMIC_FETCH_OP (_acquire, , a, , "memory", __VA_ARGS__)\ | ||
650 | ATOMIC_FETCH_OP (_release, , , l, "memory", __VA_ARGS__) | ||
651 | |||
652 | -ATOMIC_OPS(and, and) | ||
653 | -ATOMIC_OPS(andnot, bic) | ||
654 | -ATOMIC_OPS(or, orr) | ||
655 | -ATOMIC_OPS(xor, eor) | ||
656 | +ATOMIC_OPS(and, and, ) | ||
657 | +ATOMIC_OPS(andnot, bic, ) | ||
658 | +ATOMIC_OPS(or, orr, ) | ||
659 | +ATOMIC_OPS(xor, eor, ) | ||
660 | |||
661 | #undef ATOMIC_OPS | ||
662 | #undef ATOMIC_FETCH_OP | ||
663 | #undef ATOMIC_OP_RETURN | ||
664 | #undef ATOMIC_OP | ||
665 | |||
666 | -#define ATOMIC64_OP(op, asm_op) \ | ||
667 | +#define ATOMIC64_OP(op, asm_op, constraint) \ | ||
668 | __LL_SC_INLINE void \ | ||
669 | __LL_SC_PREFIX(arch_atomic64_##op(s64 i, atomic64_t *v)) \ | ||
670 | { \ | ||
671 | @@ -134,11 +134,11 @@ __LL_SC_PREFIX(arch_atomic64_##op(s64 i, atomic64_t *v)) \ | ||
672 | " stxr %w1, %0, %2\n" \ | ||
673 | " cbnz %w1, 1b" \ | ||
674 | : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \ | ||
675 | - : "Ir" (i)); \ | ||
676 | + : #constraint "r" (i)); \ | ||
677 | } \ | ||
678 | __LL_SC_EXPORT(arch_atomic64_##op); | ||
679 | |||
680 | -#define ATOMIC64_OP_RETURN(name, mb, acq, rel, cl, op, asm_op) \ | ||
681 | +#define ATOMIC64_OP_RETURN(name, mb, acq, rel, cl, op, asm_op, constraint)\ | ||
682 | __LL_SC_INLINE s64 \ | ||
683 | __LL_SC_PREFIX(arch_atomic64_##op##_return##name(s64 i, atomic64_t *v))\ | ||
684 | { \ | ||
685 | @@ -153,14 +153,14 @@ __LL_SC_PREFIX(arch_atomic64_##op##_return##name(s64 i, atomic64_t *v))\ | ||
686 | " cbnz %w1, 1b\n" \ | ||
687 | " " #mb \ | ||
688 | : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \ | ||
689 | - : "Ir" (i) \ | ||
690 | + : #constraint "r" (i) \ | ||
691 | : cl); \ | ||
692 | \ | ||
693 | return result; \ | ||
694 | } \ | ||
695 | __LL_SC_EXPORT(arch_atomic64_##op##_return##name); | ||
696 | |||
697 | -#define ATOMIC64_FETCH_OP(name, mb, acq, rel, cl, op, asm_op) \ | ||
698 | +#define ATOMIC64_FETCH_OP(name, mb, acq, rel, cl, op, asm_op, constraint)\ | ||
699 | __LL_SC_INLINE s64 \ | ||
700 | __LL_SC_PREFIX(arch_atomic64_fetch_##op##name(s64 i, atomic64_t *v)) \ | ||
701 | { \ | ||
702 | @@ -175,7 +175,7 @@ __LL_SC_PREFIX(arch_atomic64_fetch_##op##name(s64 i, atomic64_t *v)) \ | ||
703 | " cbnz %w2, 1b\n" \ | ||
704 | " " #mb \ | ||
705 | : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter) \ | ||
706 | - : "Ir" (i) \ | ||
707 | + : #constraint "r" (i) \ | ||
708 | : cl); \ | ||
709 | \ | ||
710 | return result; \ | ||
711 | @@ -193,8 +193,8 @@ __LL_SC_EXPORT(arch_atomic64_fetch_##op##name); | ||
712 | ATOMIC64_FETCH_OP (_acquire,, a, , "memory", __VA_ARGS__) \ | ||
713 | ATOMIC64_FETCH_OP (_release,, , l, "memory", __VA_ARGS__) | ||
714 | |||
715 | -ATOMIC64_OPS(add, add) | ||
716 | -ATOMIC64_OPS(sub, sub) | ||
717 | +ATOMIC64_OPS(add, add, I) | ||
718 | +ATOMIC64_OPS(sub, sub, J) | ||
719 | |||
720 | #undef ATOMIC64_OPS | ||
721 | #define ATOMIC64_OPS(...) \ | ||
722 | @@ -204,10 +204,10 @@ ATOMIC64_OPS(sub, sub) | ||
723 | ATOMIC64_FETCH_OP (_acquire,, a, , "memory", __VA_ARGS__) \ | ||
724 | ATOMIC64_FETCH_OP (_release,, , l, "memory", __VA_ARGS__) | ||
725 | |||
726 | -ATOMIC64_OPS(and, and) | ||
727 | -ATOMIC64_OPS(andnot, bic) | ||
728 | -ATOMIC64_OPS(or, orr) | ||
729 | -ATOMIC64_OPS(xor, eor) | ||
730 | +ATOMIC64_OPS(and, and, L) | ||
731 | +ATOMIC64_OPS(andnot, bic, ) | ||
732 | +ATOMIC64_OPS(or, orr, L) | ||
733 | +ATOMIC64_OPS(xor, eor, L) | ||
734 | |||
735 | #undef ATOMIC64_OPS | ||
736 | #undef ATOMIC64_FETCH_OP | ||
737 | @@ -237,7 +237,7 @@ __LL_SC_PREFIX(arch_atomic64_dec_if_positive(atomic64_t *v)) | ||
738 | } | ||
739 | __LL_SC_EXPORT(arch_atomic64_dec_if_positive); | ||
740 | |||
741 | -#define __CMPXCHG_CASE(w, sfx, name, sz, mb, acq, rel, cl) \ | ||
742 | +#define __CMPXCHG_CASE(w, sfx, name, sz, mb, acq, rel, cl, constraint) \ | ||
743 | __LL_SC_INLINE u##sz \ | ||
744 | __LL_SC_PREFIX(__cmpxchg_case_##name##sz(volatile void *ptr, \ | ||
745 | unsigned long old, \ | ||
746 | @@ -265,29 +265,34 @@ __LL_SC_PREFIX(__cmpxchg_case_##name##sz(volatile void *ptr, \ | ||
747 | "2:" \ | ||
748 | : [tmp] "=&r" (tmp), [oldval] "=&r" (oldval), \ | ||
749 | [v] "+Q" (*(u##sz *)ptr) \ | ||
750 | - : [old] "Kr" (old), [new] "r" (new) \ | ||
751 | + : [old] #constraint "r" (old), [new] "r" (new) \ | ||
752 | : cl); \ | ||
753 | \ | ||
754 | return oldval; \ | ||
755 | } \ | ||
756 | __LL_SC_EXPORT(__cmpxchg_case_##name##sz); | ||
757 | |||
758 | -__CMPXCHG_CASE(w, b, , 8, , , , ) | ||
759 | -__CMPXCHG_CASE(w, h, , 16, , , , ) | ||
760 | -__CMPXCHG_CASE(w, , , 32, , , , ) | ||
761 | -__CMPXCHG_CASE( , , , 64, , , , ) | ||
762 | -__CMPXCHG_CASE(w, b, acq_, 8, , a, , "memory") | ||
763 | -__CMPXCHG_CASE(w, h, acq_, 16, , a, , "memory") | ||
764 | -__CMPXCHG_CASE(w, , acq_, 32, , a, , "memory") | ||
765 | -__CMPXCHG_CASE( , , acq_, 64, , a, , "memory") | ||
766 | -__CMPXCHG_CASE(w, b, rel_, 8, , , l, "memory") | ||
767 | -__CMPXCHG_CASE(w, h, rel_, 16, , , l, "memory") | ||
768 | -__CMPXCHG_CASE(w, , rel_, 32, , , l, "memory") | ||
769 | -__CMPXCHG_CASE( , , rel_, 64, , , l, "memory") | ||
770 | -__CMPXCHG_CASE(w, b, mb_, 8, dmb ish, , l, "memory") | ||
771 | -__CMPXCHG_CASE(w, h, mb_, 16, dmb ish, , l, "memory") | ||
772 | -__CMPXCHG_CASE(w, , mb_, 32, dmb ish, , l, "memory") | ||
773 | -__CMPXCHG_CASE( , , mb_, 64, dmb ish, , l, "memory") | ||
774 | +/* | ||
775 | + * Earlier versions of GCC (no later than 8.1.0) appear to incorrectly | ||
776 | + * handle the 'K' constraint for the value 4294967295 - thus we use no | ||
777 | + * constraint for 32 bit operations. | ||
778 | + */ | ||
779 | +__CMPXCHG_CASE(w, b, , 8, , , , , ) | ||
780 | +__CMPXCHG_CASE(w, h, , 16, , , , , ) | ||
781 | +__CMPXCHG_CASE(w, , , 32, , , , , ) | ||
782 | +__CMPXCHG_CASE( , , , 64, , , , , L) | ||
783 | +__CMPXCHG_CASE(w, b, acq_, 8, , a, , "memory", ) | ||
784 | +__CMPXCHG_CASE(w, h, acq_, 16, , a, , "memory", ) | ||
785 | +__CMPXCHG_CASE(w, , acq_, 32, , a, , "memory", ) | ||
786 | +__CMPXCHG_CASE( , , acq_, 64, , a, , "memory", L) | ||
787 | +__CMPXCHG_CASE(w, b, rel_, 8, , , l, "memory", ) | ||
788 | +__CMPXCHG_CASE(w, h, rel_, 16, , , l, "memory", ) | ||
789 | +__CMPXCHG_CASE(w, , rel_, 32, , , l, "memory", ) | ||
790 | +__CMPXCHG_CASE( , , rel_, 64, , , l, "memory", L) | ||
791 | +__CMPXCHG_CASE(w, b, mb_, 8, dmb ish, , l, "memory", ) | ||
792 | +__CMPXCHG_CASE(w, h, mb_, 16, dmb ish, , l, "memory", ) | ||
793 | +__CMPXCHG_CASE(w, , mb_, 32, dmb ish, , l, "memory", ) | ||
794 | +__CMPXCHG_CASE( , , mb_, 64, dmb ish, , l, "memory", L) | ||
795 | |||
796 | #undef __CMPXCHG_CASE | ||
797 | |||
798 | diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h | ||
799 | index e7d46631cc42..b1454d117cd2 100644 | ||
800 | --- a/arch/arm64/include/asm/cputype.h | ||
801 | +++ b/arch/arm64/include/asm/cputype.h | ||
802 | @@ -51,14 +51,6 @@ | ||
803 | #define MIDR_CPU_MODEL_MASK (MIDR_IMPLEMENTOR_MASK | MIDR_PARTNUM_MASK | \ | ||
804 | MIDR_ARCHITECTURE_MASK) | ||
805 | |||
806 | -#define MIDR_IS_CPU_MODEL_RANGE(midr, model, rv_min, rv_max) \ | ||
807 | -({ \ | ||
808 | - u32 _model = (midr) & MIDR_CPU_MODEL_MASK; \ | ||
809 | - u32 rv = (midr) & (MIDR_REVISION_MASK | MIDR_VARIANT_MASK); \ | ||
810 | - \ | ||
811 | - _model == (model) && rv >= (rv_min) && rv <= (rv_max); \ | ||
812 | - }) | ||
813 | - | ||
814 | #define ARM_CPU_IMP_ARM 0x41 | ||
815 | #define ARM_CPU_IMP_APM 0x50 | ||
816 | #define ARM_CPU_IMP_CAVIUM 0x43 | ||
817 | @@ -159,10 +151,19 @@ struct midr_range { | ||
818 | #define MIDR_REV(m, v, r) MIDR_RANGE(m, v, r, v, r) | ||
819 | #define MIDR_ALL_VERSIONS(m) MIDR_RANGE(m, 0, 0, 0xf, 0xf) | ||
820 | |||
821 | +static inline bool midr_is_cpu_model_range(u32 midr, u32 model, u32 rv_min, | ||
822 | + u32 rv_max) | ||
823 | +{ | ||
824 | + u32 _model = midr & MIDR_CPU_MODEL_MASK; | ||
825 | + u32 rv = midr & (MIDR_REVISION_MASK | MIDR_VARIANT_MASK); | ||
826 | + | ||
827 | + return _model == model && rv >= rv_min && rv <= rv_max; | ||
828 | +} | ||
829 | + | ||
830 | static inline bool is_midr_in_range(u32 midr, struct midr_range const *range) | ||
831 | { | ||
832 | - return MIDR_IS_CPU_MODEL_RANGE(midr, range->model, | ||
833 | - range->rv_min, range->rv_max); | ||
834 | + return midr_is_cpu_model_range(midr, range->model, | ||
835 | + range->rv_min, range->rv_max); | ||
836 | } | ||
837 | |||
838 | static inline bool | ||
839 | diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h | ||
840 | index ed57b760f38c..a17393ff6677 100644 | ||
841 | --- a/arch/arm64/include/asm/exception.h | ||
842 | +++ b/arch/arm64/include/asm/exception.h | ||
843 | @@ -30,4 +30,6 @@ static inline u32 disr_to_esr(u64 disr) | ||
844 | return esr; | ||
845 | } | ||
846 | |||
847 | +asmlinkage void enter_from_user_mode(void); | ||
848 | + | ||
849 | #endif /* __ASM_EXCEPTION_H */ | ||
850 | diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h | ||
851 | index 8af7a85f76bd..bc3949064725 100644 | ||
852 | --- a/arch/arm64/include/asm/tlbflush.h | ||
853 | +++ b/arch/arm64/include/asm/tlbflush.h | ||
854 | @@ -251,6 +251,7 @@ static inline void __flush_tlb_kernel_pgtable(unsigned long kaddr) | ||
855 | dsb(ishst); | ||
856 | __tlbi(vaae1is, addr); | ||
857 | dsb(ish); | ||
858 | + isb(); | ||
859 | } | ||
860 | #endif | ||
861 | |||
862 | diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c | ||
863 | index b1fdc486aed8..9323bcc40a58 100644 | ||
864 | --- a/arch/arm64/kernel/cpufeature.c | ||
865 | +++ b/arch/arm64/kernel/cpufeature.c | ||
866 | @@ -894,7 +894,7 @@ static bool has_no_hw_prefetch(const struct arm64_cpu_capabilities *entry, int _ | ||
867 | u32 midr = read_cpuid_id(); | ||
868 | |||
869 | /* Cavium ThunderX pass 1.x and 2.x */ | ||
870 | - return MIDR_IS_CPU_MODEL_RANGE(midr, MIDR_THUNDERX, | ||
871 | + return midr_is_cpu_model_range(midr, MIDR_THUNDERX, | ||
872 | MIDR_CPU_VAR_REV(0, 0), | ||
873 | MIDR_CPU_VAR_REV(1, MIDR_REVISION_MASK)); | ||
874 | } | ||
875 | diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S | ||
876 | index 320a30dbe35e..84a822748c84 100644 | ||
877 | --- a/arch/arm64/kernel/entry.S | ||
878 | +++ b/arch/arm64/kernel/entry.S | ||
879 | @@ -30,9 +30,9 @@ | ||
880 | * Context tracking subsystem. Used to instrument transitions | ||
881 | * between user and kernel mode. | ||
882 | */ | ||
883 | - .macro ct_user_exit | ||
884 | + .macro ct_user_exit_irqoff | ||
885 | #ifdef CONFIG_CONTEXT_TRACKING | ||
886 | - bl context_tracking_user_exit | ||
887 | + bl enter_from_user_mode | ||
888 | #endif | ||
889 | .endm | ||
890 | |||
891 | @@ -792,8 +792,8 @@ el0_cp15: | ||
892 | /* | ||
893 | * Trapped CP15 (MRC, MCR, MRRC, MCRR) instructions | ||
894 | */ | ||
895 | + ct_user_exit_irqoff | ||
896 | enable_daif | ||
897 | - ct_user_exit | ||
898 | mov x0, x25 | ||
899 | mov x1, sp | ||
900 | bl do_cp15instr | ||
901 | @@ -805,8 +805,8 @@ el0_da: | ||
902 | * Data abort handling | ||
903 | */ | ||
904 | mrs x26, far_el1 | ||
905 | + ct_user_exit_irqoff | ||
906 | enable_daif | ||
907 | - ct_user_exit | ||
908 | clear_address_tag x0, x26 | ||
909 | mov x1, x25 | ||
910 | mov x2, sp | ||
911 | @@ -818,11 +818,11 @@ el0_ia: | ||
912 | */ | ||
913 | mrs x26, far_el1 | ||
914 | gic_prio_kentry_setup tmp=x0 | ||
915 | + ct_user_exit_irqoff | ||
916 | enable_da_f | ||
917 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
918 | bl trace_hardirqs_off | ||
919 | #endif | ||
920 | - ct_user_exit | ||
921 | mov x0, x26 | ||
922 | mov x1, x25 | ||
923 | mov x2, sp | ||
924 | @@ -832,8 +832,8 @@ el0_fpsimd_acc: | ||
925 | /* | ||
926 | * Floating Point or Advanced SIMD access | ||
927 | */ | ||
928 | + ct_user_exit_irqoff | ||
929 | enable_daif | ||
930 | - ct_user_exit | ||
931 | mov x0, x25 | ||
932 | mov x1, sp | ||
933 | bl do_fpsimd_acc | ||
934 | @@ -842,8 +842,8 @@ el0_sve_acc: | ||
935 | /* | ||
936 | * Scalable Vector Extension access | ||
937 | */ | ||
938 | + ct_user_exit_irqoff | ||
939 | enable_daif | ||
940 | - ct_user_exit | ||
941 | mov x0, x25 | ||
942 | mov x1, sp | ||
943 | bl do_sve_acc | ||
944 | @@ -852,8 +852,8 @@ el0_fpsimd_exc: | ||
945 | /* | ||
946 | * Floating Point, Advanced SIMD or SVE exception | ||
947 | */ | ||
948 | + ct_user_exit_irqoff | ||
949 | enable_daif | ||
950 | - ct_user_exit | ||
951 | mov x0, x25 | ||
952 | mov x1, sp | ||
953 | bl do_fpsimd_exc | ||
954 | @@ -868,11 +868,11 @@ el0_sp_pc: | ||
955 | * Stack or PC alignment exception handling | ||
956 | */ | ||
957 | gic_prio_kentry_setup tmp=x0 | ||
958 | + ct_user_exit_irqoff | ||
959 | enable_da_f | ||
960 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
961 | bl trace_hardirqs_off | ||
962 | #endif | ||
963 | - ct_user_exit | ||
964 | mov x0, x26 | ||
965 | mov x1, x25 | ||
966 | mov x2, sp | ||
967 | @@ -882,8 +882,8 @@ el0_undef: | ||
968 | /* | ||
969 | * Undefined instruction | ||
970 | */ | ||
971 | + ct_user_exit_irqoff | ||
972 | enable_daif | ||
973 | - ct_user_exit | ||
974 | mov x0, sp | ||
975 | bl do_undefinstr | ||
976 | b ret_to_user | ||
977 | @@ -891,8 +891,8 @@ el0_sys: | ||
978 | /* | ||
979 | * System instructions, for trapped cache maintenance instructions | ||
980 | */ | ||
981 | + ct_user_exit_irqoff | ||
982 | enable_daif | ||
983 | - ct_user_exit | ||
984 | mov x0, x25 | ||
985 | mov x1, sp | ||
986 | bl do_sysinstr | ||
987 | @@ -902,17 +902,18 @@ el0_dbg: | ||
988 | * Debug exception handling | ||
989 | */ | ||
990 | tbnz x24, #0, el0_inv // EL0 only | ||
991 | + mrs x24, far_el1 | ||
992 | gic_prio_kentry_setup tmp=x3 | ||
993 | - mrs x0, far_el1 | ||
994 | + ct_user_exit_irqoff | ||
995 | + mov x0, x24 | ||
996 | mov x1, x25 | ||
997 | mov x2, sp | ||
998 | bl do_debug_exception | ||
999 | enable_da_f | ||
1000 | - ct_user_exit | ||
1001 | b ret_to_user | ||
1002 | el0_inv: | ||
1003 | + ct_user_exit_irqoff | ||
1004 | enable_daif | ||
1005 | - ct_user_exit | ||
1006 | mov x0, sp | ||
1007 | mov x1, #BAD_SYNC | ||
1008 | mov x2, x25 | ||
1009 | @@ -925,13 +926,13 @@ el0_irq: | ||
1010 | kernel_entry 0 | ||
1011 | el0_irq_naked: | ||
1012 | gic_prio_irq_setup pmr=x20, tmp=x0 | ||
1013 | + ct_user_exit_irqoff | ||
1014 | enable_da_f | ||
1015 | |||
1016 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
1017 | bl trace_hardirqs_off | ||
1018 | #endif | ||
1019 | |||
1020 | - ct_user_exit | ||
1021 | #ifdef CONFIG_HARDEN_BRANCH_PREDICTOR | ||
1022 | tbz x22, #55, 1f | ||
1023 | bl do_el0_irq_bp_hardening | ||
1024 | @@ -958,13 +959,14 @@ ENDPROC(el1_error) | ||
1025 | el0_error: | ||
1026 | kernel_entry 0 | ||
1027 | el0_error_naked: | ||
1028 | - mrs x1, esr_el1 | ||
1029 | + mrs x25, esr_el1 | ||
1030 | gic_prio_kentry_setup tmp=x2 | ||
1031 | + ct_user_exit_irqoff | ||
1032 | enable_dbg | ||
1033 | mov x0, sp | ||
1034 | + mov x1, x25 | ||
1035 | bl do_serror | ||
1036 | enable_da_f | ||
1037 | - ct_user_exit | ||
1038 | b ret_to_user | ||
1039 | ENDPROC(el0_error) | ||
1040 | |||
1041 | diff --git a/arch/arm64/kernel/image-vars.h b/arch/arm64/kernel/image-vars.h | ||
1042 | new file mode 100644 | ||
1043 | index 000000000000..25a2a9b479c2 | ||
1044 | --- /dev/null | ||
1045 | +++ b/arch/arm64/kernel/image-vars.h | ||
1046 | @@ -0,0 +1,51 @@ | ||
1047 | +/* SPDX-License-Identifier: GPL-2.0-only */ | ||
1048 | +/* | ||
1049 | + * Linker script variables to be set after section resolution, as | ||
1050 | + * ld.lld does not like variables assigned before SECTIONS is processed. | ||
1051 | + */ | ||
1052 | +#ifndef __ARM64_KERNEL_IMAGE_VARS_H | ||
1053 | +#define __ARM64_KERNEL_IMAGE_VARS_H | ||
1054 | + | ||
1055 | +#ifndef LINKER_SCRIPT | ||
1056 | +#error This file should only be included in vmlinux.lds.S | ||
1057 | +#endif | ||
1058 | + | ||
1059 | +#ifdef CONFIG_EFI | ||
1060 | + | ||
1061 | +__efistub_stext_offset = stext - _text; | ||
1062 | + | ||
1063 | +/* | ||
1064 | + * The EFI stub has its own symbol namespace prefixed by __efistub_, to | ||
1065 | + * isolate it from the kernel proper. The following symbols are legally | ||
1066 | + * accessed by the stub, so provide some aliases to make them accessible. | ||
1067 | + * Only include data symbols here, or text symbols of functions that are | ||
1068 | + * guaranteed to be safe when executed at another offset than they were | ||
1069 | + * linked at. The routines below are all implemented in assembler in a | ||
1070 | + * position independent manner | ||
1071 | + */ | ||
1072 | +__efistub_memcmp = __pi_memcmp; | ||
1073 | +__efistub_memchr = __pi_memchr; | ||
1074 | +__efistub_memcpy = __pi_memcpy; | ||
1075 | +__efistub_memmove = __pi_memmove; | ||
1076 | +__efistub_memset = __pi_memset; | ||
1077 | +__efistub_strlen = __pi_strlen; | ||
1078 | +__efistub_strnlen = __pi_strnlen; | ||
1079 | +__efistub_strcmp = __pi_strcmp; | ||
1080 | +__efistub_strncmp = __pi_strncmp; | ||
1081 | +__efistub_strrchr = __pi_strrchr; | ||
1082 | +__efistub___flush_dcache_area = __pi___flush_dcache_area; | ||
1083 | + | ||
1084 | +#ifdef CONFIG_KASAN | ||
1085 | +__efistub___memcpy = __pi_memcpy; | ||
1086 | +__efistub___memmove = __pi_memmove; | ||
1087 | +__efistub___memset = __pi_memset; | ||
1088 | +#endif | ||
1089 | + | ||
1090 | +__efistub__text = _text; | ||
1091 | +__efistub__end = _end; | ||
1092 | +__efistub__edata = _edata; | ||
1093 | +__efistub_screen_info = screen_info; | ||
1094 | + | ||
1095 | +#endif | ||
1096 | + | ||
1097 | +#endif /* __ARM64_KERNEL_IMAGE_VARS_H */ | ||
1098 | diff --git a/arch/arm64/kernel/image.h b/arch/arm64/kernel/image.h | ||
1099 | index 2b85c0d6fa3d..c7d38c660372 100644 | ||
1100 | --- a/arch/arm64/kernel/image.h | ||
1101 | +++ b/arch/arm64/kernel/image.h | ||
1102 | @@ -65,46 +65,4 @@ | ||
1103 | DEFINE_IMAGE_LE64(_kernel_offset_le, TEXT_OFFSET); \ | ||
1104 | DEFINE_IMAGE_LE64(_kernel_flags_le, __HEAD_FLAGS); | ||
1105 | |||
1106 | -#ifdef CONFIG_EFI | ||
1107 | - | ||
1108 | -/* | ||
1109 | - * Use ABSOLUTE() to avoid ld.lld treating this as a relative symbol: | ||
1110 | - * https://github.com/ClangBuiltLinux/linux/issues/561 | ||
1111 | - */ | ||
1112 | -__efistub_stext_offset = ABSOLUTE(stext - _text); | ||
1113 | - | ||
1114 | -/* | ||
1115 | - * The EFI stub has its own symbol namespace prefixed by __efistub_, to | ||
1116 | - * isolate it from the kernel proper. The following symbols are legally | ||
1117 | - * accessed by the stub, so provide some aliases to make them accessible. | ||
1118 | - * Only include data symbols here, or text symbols of functions that are | ||
1119 | - * guaranteed to be safe when executed at another offset than they were | ||
1120 | - * linked at. The routines below are all implemented in assembler in a | ||
1121 | - * position independent manner | ||
1122 | - */ | ||
1123 | -__efistub_memcmp = __pi_memcmp; | ||
1124 | -__efistub_memchr = __pi_memchr; | ||
1125 | -__efistub_memcpy = __pi_memcpy; | ||
1126 | -__efistub_memmove = __pi_memmove; | ||
1127 | -__efistub_memset = __pi_memset; | ||
1128 | -__efistub_strlen = __pi_strlen; | ||
1129 | -__efistub_strnlen = __pi_strnlen; | ||
1130 | -__efistub_strcmp = __pi_strcmp; | ||
1131 | -__efistub_strncmp = __pi_strncmp; | ||
1132 | -__efistub_strrchr = __pi_strrchr; | ||
1133 | -__efistub___flush_dcache_area = __pi___flush_dcache_area; | ||
1134 | - | ||
1135 | -#ifdef CONFIG_KASAN | ||
1136 | -__efistub___memcpy = __pi_memcpy; | ||
1137 | -__efistub___memmove = __pi_memmove; | ||
1138 | -__efistub___memset = __pi_memset; | ||
1139 | -#endif | ||
1140 | - | ||
1141 | -__efistub__text = _text; | ||
1142 | -__efistub__end = _end; | ||
1143 | -__efistub__edata = _edata; | ||
1144 | -__efistub_screen_info = screen_info; | ||
1145 | - | ||
1146 | -#endif | ||
1147 | - | ||
1148 | #endif /* __ARM64_KERNEL_IMAGE_H */ | ||
1149 | diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c | ||
1150 | index 32893b3d9164..742a636861e7 100644 | ||
1151 | --- a/arch/arm64/kernel/traps.c | ||
1152 | +++ b/arch/arm64/kernel/traps.c | ||
1153 | @@ -7,9 +7,11 @@ | ||
1154 | */ | ||
1155 | |||
1156 | #include <linux/bug.h> | ||
1157 | +#include <linux/context_tracking.h> | ||
1158 | #include <linux/signal.h> | ||
1159 | #include <linux/personality.h> | ||
1160 | #include <linux/kallsyms.h> | ||
1161 | +#include <linux/kprobes.h> | ||
1162 | #include <linux/spinlock.h> | ||
1163 | #include <linux/uaccess.h> | ||
1164 | #include <linux/hardirq.h> | ||
1165 | @@ -900,6 +902,13 @@ asmlinkage void do_serror(struct pt_regs *regs, unsigned int esr) | ||
1166 | nmi_exit(); | ||
1167 | } | ||
1168 | |||
1169 | +asmlinkage void enter_from_user_mode(void) | ||
1170 | +{ | ||
1171 | + CT_WARN_ON(ct_state() != CONTEXT_USER); | ||
1172 | + user_exit_irqoff(); | ||
1173 | +} | ||
1174 | +NOKPROBE_SYMBOL(enter_from_user_mode); | ||
1175 | + | ||
1176 | void __pte_error(const char *file, int line, unsigned long val) | ||
1177 | { | ||
1178 | pr_err("%s:%d: bad pte %016lx.\n", file, line, val); | ||
1179 | diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S | ||
1180 | index 7fa008374907..803b24d2464a 100644 | ||
1181 | --- a/arch/arm64/kernel/vmlinux.lds.S | ||
1182 | +++ b/arch/arm64/kernel/vmlinux.lds.S | ||
1183 | @@ -245,6 +245,8 @@ SECTIONS | ||
1184 | HEAD_SYMBOLS | ||
1185 | } | ||
1186 | |||
1187 | +#include "image-vars.h" | ||
1188 | + | ||
1189 | /* | ||
1190 | * The HYP init code and ID map text can't be longer than a page each, | ||
1191 | * and should not cross a page boundary. | ||
1192 | diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c | ||
1193 | index f3c795278def..b1ee6cb4b17f 100644 | ||
1194 | --- a/arch/arm64/mm/init.c | ||
1195 | +++ b/arch/arm64/mm/init.c | ||
1196 | @@ -570,8 +570,12 @@ void free_initmem(void) | ||
1197 | #ifdef CONFIG_BLK_DEV_INITRD | ||
1198 | void __init free_initrd_mem(unsigned long start, unsigned long end) | ||
1199 | { | ||
1200 | + unsigned long aligned_start, aligned_end; | ||
1201 | + | ||
1202 | + aligned_start = __virt_to_phys(start) & PAGE_MASK; | ||
1203 | + aligned_end = PAGE_ALIGN(__virt_to_phys(end)); | ||
1204 | + memblock_free(aligned_start, aligned_end - aligned_start); | ||
1205 | free_reserved_area((void *)start, (void *)end, 0, "initrd"); | ||
1206 | - memblock_free(__virt_to_phys(start), end - start); | ||
1207 | } | ||
1208 | #endif | ||
1209 | |||
1210 | diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S | ||
1211 | index 7dbf2be470f6..28a8f7b87ff0 100644 | ||
1212 | --- a/arch/arm64/mm/proc.S | ||
1213 | +++ b/arch/arm64/mm/proc.S | ||
1214 | @@ -286,6 +286,15 @@ skip_pgd: | ||
1215 | msr sctlr_el1, x18 | ||
1216 | isb | ||
1217 | |||
1218 | + /* | ||
1219 | + * Invalidate the local I-cache so that any instructions fetched | ||
1220 | + * speculatively from the PoC are discarded, since they may have | ||
1221 | + * been dynamically patched at the PoU. | ||
1222 | + */ | ||
1223 | + ic iallu | ||
1224 | + dsb nsh | ||
1225 | + isb | ||
1226 | + | ||
1227 | /* Set the flag to zero to indicate that we're all done */ | ||
1228 | str wzr, [flag_ptr] | ||
1229 | ret | ||
1230 | diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c | ||
1231 | index 326448f9df16..1a42ba885188 100644 | ||
1232 | --- a/arch/ia64/kernel/module.c | ||
1233 | +++ b/arch/ia64/kernel/module.c | ||
1234 | @@ -914,10 +914,14 @@ module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mo | ||
1235 | void | ||
1236 | module_arch_cleanup (struct module *mod) | ||
1237 | { | ||
1238 | - if (mod->arch.init_unw_table) | ||
1239 | + if (mod->arch.init_unw_table) { | ||
1240 | unw_remove_unwind_table(mod->arch.init_unw_table); | ||
1241 | - if (mod->arch.core_unw_table) | ||
1242 | + mod->arch.init_unw_table = NULL; | ||
1243 | + } | ||
1244 | + if (mod->arch.core_unw_table) { | ||
1245 | unw_remove_unwind_table(mod->arch.core_unw_table); | ||
1246 | + mod->arch.core_unw_table = NULL; | ||
1247 | + } | ||
1248 | } | ||
1249 | |||
1250 | void *dereference_module_function_descriptor(struct module *mod, void *ptr) | ||
1251 | diff --git a/arch/m68k/include/asm/atarihw.h b/arch/m68k/include/asm/atarihw.h | ||
1252 | index 533008262b69..5e5601c382b8 100644 | ||
1253 | --- a/arch/m68k/include/asm/atarihw.h | ||
1254 | +++ b/arch/m68k/include/asm/atarihw.h | ||
1255 | @@ -22,7 +22,6 @@ | ||
1256 | |||
1257 | #include <linux/types.h> | ||
1258 | #include <asm/bootinfo-atari.h> | ||
1259 | -#include <asm/raw_io.h> | ||
1260 | #include <asm/kmap.h> | ||
1261 | |||
1262 | extern u_long atari_mch_cookie; | ||
1263 | @@ -132,14 +131,6 @@ extern struct atari_hw_present atari_hw_present; | ||
1264 | */ | ||
1265 | |||
1266 | |||
1267 | -#define atari_readb raw_inb | ||
1268 | -#define atari_writeb raw_outb | ||
1269 | - | ||
1270 | -#define atari_inb_p raw_inb | ||
1271 | -#define atari_outb_p raw_outb | ||
1272 | - | ||
1273 | - | ||
1274 | - | ||
1275 | #include <linux/mm.h> | ||
1276 | #include <asm/cacheflush.h> | ||
1277 | |||
1278 | diff --git a/arch/m68k/include/asm/io_mm.h b/arch/m68k/include/asm/io_mm.h | ||
1279 | index 6c03ca5bc436..819f611dccf2 100644 | ||
1280 | --- a/arch/m68k/include/asm/io_mm.h | ||
1281 | +++ b/arch/m68k/include/asm/io_mm.h | ||
1282 | @@ -29,7 +29,11 @@ | ||
1283 | #include <asm-generic/iomap.h> | ||
1284 | |||
1285 | #ifdef CONFIG_ATARI | ||
1286 | -#include <asm/atarihw.h> | ||
1287 | +#define atari_readb raw_inb | ||
1288 | +#define atari_writeb raw_outb | ||
1289 | + | ||
1290 | +#define atari_inb_p raw_inb | ||
1291 | +#define atari_outb_p raw_outb | ||
1292 | #endif | ||
1293 | |||
1294 | |||
1295 | diff --git a/arch/m68k/include/asm/macintosh.h b/arch/m68k/include/asm/macintosh.h | ||
1296 | index d9a08bed4b12..f653b60f2afc 100644 | ||
1297 | --- a/arch/m68k/include/asm/macintosh.h | ||
1298 | +++ b/arch/m68k/include/asm/macintosh.h | ||
1299 | @@ -4,6 +4,7 @@ | ||
1300 | |||
1301 | #include <linux/seq_file.h> | ||
1302 | #include <linux/interrupt.h> | ||
1303 | +#include <linux/irq.h> | ||
1304 | |||
1305 | #include <asm/bootinfo-mac.h> | ||
1306 | |||
1307 | diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile | ||
1308 | index c345b79414a9..403f7e193833 100644 | ||
1309 | --- a/arch/powerpc/Makefile | ||
1310 | +++ b/arch/powerpc/Makefile | ||
1311 | @@ -39,13 +39,11 @@ endif | ||
1312 | uname := $(shell uname -m) | ||
1313 | KBUILD_DEFCONFIG := $(if $(filter ppc%,$(uname)),$(uname),ppc64)_defconfig | ||
1314 | |||
1315 | -ifdef CONFIG_PPC64 | ||
1316 | new_nm := $(shell if $(NM) --help 2>&1 | grep -- '--synthetic' > /dev/null; then echo y; else echo n; fi) | ||
1317 | |||
1318 | ifeq ($(new_nm),y) | ||
1319 | NM := $(NM) --synthetic | ||
1320 | endif | ||
1321 | -endif | ||
1322 | |||
1323 | # BITS is used as extension for files which are available in a 32 bit | ||
1324 | # and a 64 bit version to simplify shared Makefiles. | ||
1325 | diff --git a/arch/powerpc/platforms/powernv/opal-imc.c b/arch/powerpc/platforms/powernv/opal-imc.c | ||
1326 | index 186109bdd41b..e04b20625cb9 100644 | ||
1327 | --- a/arch/powerpc/platforms/powernv/opal-imc.c | ||
1328 | +++ b/arch/powerpc/platforms/powernv/opal-imc.c | ||
1329 | @@ -53,9 +53,9 @@ static void export_imc_mode_and_cmd(struct device_node *node, | ||
1330 | struct imc_pmu *pmu_ptr) | ||
1331 | { | ||
1332 | static u64 loc, *imc_mode_addr, *imc_cmd_addr; | ||
1333 | - int chip = 0, nid; | ||
1334 | char mode[16], cmd[16]; | ||
1335 | u32 cb_offset; | ||
1336 | + struct imc_mem_info *ptr = pmu_ptr->mem_info; | ||
1337 | |||
1338 | imc_debugfs_parent = debugfs_create_dir("imc", powerpc_debugfs_root); | ||
1339 | |||
1340 | @@ -69,20 +69,20 @@ static void export_imc_mode_and_cmd(struct device_node *node, | ||
1341 | if (of_property_read_u32(node, "cb_offset", &cb_offset)) | ||
1342 | cb_offset = IMC_CNTL_BLK_OFFSET; | ||
1343 | |||
1344 | - for_each_node(nid) { | ||
1345 | - loc = (u64)(pmu_ptr->mem_info[chip].vbase) + cb_offset; | ||
1346 | + while (ptr->vbase != NULL) { | ||
1347 | + loc = (u64)(ptr->vbase) + cb_offset; | ||
1348 | imc_mode_addr = (u64 *)(loc + IMC_CNTL_BLK_MODE_OFFSET); | ||
1349 | - sprintf(mode, "imc_mode_%d", nid); | ||
1350 | + sprintf(mode, "imc_mode_%d", (u32)(ptr->id)); | ||
1351 | if (!imc_debugfs_create_x64(mode, 0600, imc_debugfs_parent, | ||
1352 | imc_mode_addr)) | ||
1353 | goto err; | ||
1354 | |||
1355 | imc_cmd_addr = (u64 *)(loc + IMC_CNTL_BLK_CMD_OFFSET); | ||
1356 | - sprintf(cmd, "imc_cmd_%d", nid); | ||
1357 | + sprintf(cmd, "imc_cmd_%d", (u32)(ptr->id)); | ||
1358 | if (!imc_debugfs_create_x64(cmd, 0600, imc_debugfs_parent, | ||
1359 | imc_cmd_addr)) | ||
1360 | goto err; | ||
1361 | - chip++; | ||
1362 | + ptr++; | ||
1363 | } | ||
1364 | return; | ||
1365 | |||
1366 | diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c | ||
1367 | index d00f84add5f4..6d2dbb5089d5 100644 | ||
1368 | --- a/arch/s390/crypto/aes_s390.c | ||
1369 | +++ b/arch/s390/crypto/aes_s390.c | ||
1370 | @@ -586,6 +586,9 @@ static int xts_aes_encrypt(struct blkcipher_desc *desc, | ||
1371 | struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm); | ||
1372 | struct blkcipher_walk walk; | ||
1373 | |||
1374 | + if (!nbytes) | ||
1375 | + return -EINVAL; | ||
1376 | + | ||
1377 | if (unlikely(!xts_ctx->fc)) | ||
1378 | return xts_fallback_encrypt(desc, dst, src, nbytes); | ||
1379 | |||
1380 | @@ -600,6 +603,9 @@ static int xts_aes_decrypt(struct blkcipher_desc *desc, | ||
1381 | struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm); | ||
1382 | struct blkcipher_walk walk; | ||
1383 | |||
1384 | + if (!nbytes) | ||
1385 | + return -EINVAL; | ||
1386 | + | ||
1387 | if (unlikely(!xts_ctx->fc)) | ||
1388 | return xts_fallback_decrypt(desc, dst, src, nbytes); | ||
1389 | |||
1390 | diff --git a/arch/s390/include/asm/string.h b/arch/s390/include/asm/string.h | ||
1391 | index 70d87db54e62..4c0690fc5167 100644 | ||
1392 | --- a/arch/s390/include/asm/string.h | ||
1393 | +++ b/arch/s390/include/asm/string.h | ||
1394 | @@ -71,11 +71,16 @@ extern void *__memmove(void *dest, const void *src, size_t n); | ||
1395 | #define memcpy(dst, src, len) __memcpy(dst, src, len) | ||
1396 | #define memmove(dst, src, len) __memmove(dst, src, len) | ||
1397 | #define memset(s, c, n) __memset(s, c, n) | ||
1398 | +#define strlen(s) __strlen(s) | ||
1399 | + | ||
1400 | +#define __no_sanitize_prefix_strfunc(x) __##x | ||
1401 | |||
1402 | #ifndef __NO_FORTIFY | ||
1403 | #define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */ | ||
1404 | #endif | ||
1405 | |||
1406 | +#else | ||
1407 | +#define __no_sanitize_prefix_strfunc(x) x | ||
1408 | #endif /* defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__) */ | ||
1409 | |||
1410 | void *__memset16(uint16_t *s, uint16_t v, size_t count); | ||
1411 | @@ -163,8 +168,8 @@ static inline char *strcpy(char *dst, const char *src) | ||
1412 | } | ||
1413 | #endif | ||
1414 | |||
1415 | -#ifdef __HAVE_ARCH_STRLEN | ||
1416 | -static inline size_t strlen(const char *s) | ||
1417 | +#if defined(__HAVE_ARCH_STRLEN) || (defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)) | ||
1418 | +static inline size_t __no_sanitize_prefix_strfunc(strlen)(const char *s) | ||
1419 | { | ||
1420 | register unsigned long r0 asm("0") = 0; | ||
1421 | const char *tmp = s; | ||
1422 | diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h | ||
1423 | index fe7c205233f1..9ae1c0f05fd2 100644 | ||
1424 | --- a/arch/x86/include/asm/intel-family.h | ||
1425 | +++ b/arch/x86/include/asm/intel-family.h | ||
1426 | @@ -73,6 +73,9 @@ | ||
1427 | #define INTEL_FAM6_ICELAKE_MOBILE 0x7E | ||
1428 | #define INTEL_FAM6_ICELAKE_NNPI 0x9D | ||
1429 | |||
1430 | +#define INTEL_FAM6_TIGERLAKE_L 0x8C | ||
1431 | +#define INTEL_FAM6_TIGERLAKE 0x8D | ||
1432 | + | ||
1433 | /* "Small Core" Processors (Atom) */ | ||
1434 | |||
1435 | #define INTEL_FAM6_ATOM_BONNELL 0x1C /* Diamondville, Pineview */ | ||
1436 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h | ||
1437 | index bdc16b0aa7c6..dd0ca154a958 100644 | ||
1438 | --- a/arch/x86/include/asm/kvm_host.h | ||
1439 | +++ b/arch/x86/include/asm/kvm_host.h | ||
1440 | @@ -1583,6 +1583,13 @@ bool kvm_intr_is_single_vcpu(struct kvm *kvm, struct kvm_lapic_irq *irq, | ||
1441 | void kvm_set_msi_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, | ||
1442 | struct kvm_lapic_irq *irq); | ||
1443 | |||
1444 | +static inline bool kvm_irq_is_postable(struct kvm_lapic_irq *irq) | ||
1445 | +{ | ||
1446 | + /* We can only post Fixed and LowPrio IRQs */ | ||
1447 | + return (irq->delivery_mode == dest_Fixed || | ||
1448 | + irq->delivery_mode == dest_LowestPrio); | ||
1449 | +} | ||
1450 | + | ||
1451 | static inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) | ||
1452 | { | ||
1453 | if (kvm_x86_ops->vcpu_blocking) | ||
1454 | diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c | ||
1455 | index d63e63b7d1d9..251c795b4eb3 100644 | ||
1456 | --- a/arch/x86/kernel/amd_nb.c | ||
1457 | +++ b/arch/x86/kernel/amd_nb.c | ||
1458 | @@ -21,6 +21,7 @@ | ||
1459 | #define PCI_DEVICE_ID_AMD_17H_DF_F4 0x1464 | ||
1460 | #define PCI_DEVICE_ID_AMD_17H_M10H_DF_F4 0x15ec | ||
1461 | #define PCI_DEVICE_ID_AMD_17H_M30H_DF_F4 0x1494 | ||
1462 | +#define PCI_DEVICE_ID_AMD_17H_M70H_DF_F4 0x1444 | ||
1463 | |||
1464 | /* Protect the PCI config register pairs used for SMN and DF indirect access. */ | ||
1465 | static DEFINE_MUTEX(smn_mutex); | ||
1466 | @@ -50,6 +51,7 @@ const struct pci_device_id amd_nb_misc_ids[] = { | ||
1467 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M10H_DF_F3) }, | ||
1468 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M30H_DF_F3) }, | ||
1469 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) }, | ||
1470 | + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M70H_DF_F3) }, | ||
1471 | {} | ||
1472 | }; | ||
1473 | EXPORT_SYMBOL_GPL(amd_nb_misc_ids); | ||
1474 | @@ -63,6 +65,7 @@ static const struct pci_device_id amd_nb_link_ids[] = { | ||
1475 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_DF_F4) }, | ||
1476 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M10H_DF_F4) }, | ||
1477 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M30H_DF_F4) }, | ||
1478 | + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M70H_DF_F4) }, | ||
1479 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CNB17H_F4) }, | ||
1480 | {} | ||
1481 | }; | ||
1482 | diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c | ||
1483 | index 08fb79f37793..ad0d5ced82b3 100644 | ||
1484 | --- a/arch/x86/kernel/apic/apic.c | ||
1485 | +++ b/arch/x86/kernel/apic/apic.c | ||
1486 | @@ -1495,54 +1495,72 @@ static void lapic_setup_esr(void) | ||
1487 | oldvalue, value); | ||
1488 | } | ||
1489 | |||
1490 | -static void apic_pending_intr_clear(void) | ||
1491 | +#define APIC_IR_REGS APIC_ISR_NR | ||
1492 | +#define APIC_IR_BITS (APIC_IR_REGS * 32) | ||
1493 | +#define APIC_IR_MAPSIZE (APIC_IR_BITS / BITS_PER_LONG) | ||
1494 | + | ||
1495 | +union apic_ir { | ||
1496 | + unsigned long map[APIC_IR_MAPSIZE]; | ||
1497 | + u32 regs[APIC_IR_REGS]; | ||
1498 | +}; | ||
1499 | + | ||
1500 | +static bool apic_check_and_ack(union apic_ir *irr, union apic_ir *isr) | ||
1501 | { | ||
1502 | - long long max_loops = cpu_khz ? cpu_khz : 1000000; | ||
1503 | - unsigned long long tsc = 0, ntsc; | ||
1504 | - unsigned int queued; | ||
1505 | - unsigned long value; | ||
1506 | - int i, j, acked = 0; | ||
1507 | + int i, bit; | ||
1508 | + | ||
1509 | + /* Read the IRRs */ | ||
1510 | + for (i = 0; i < APIC_IR_REGS; i++) | ||
1511 | + irr->regs[i] = apic_read(APIC_IRR + i * 0x10); | ||
1512 | + | ||
1513 | + /* Read the ISRs */ | ||
1514 | + for (i = 0; i < APIC_IR_REGS; i++) | ||
1515 | + isr->regs[i] = apic_read(APIC_ISR + i * 0x10); | ||
1516 | |||
1517 | - if (boot_cpu_has(X86_FEATURE_TSC)) | ||
1518 | - tsc = rdtsc(); | ||
1519 | /* | ||
1520 | - * After a crash, we no longer service the interrupts and a pending | ||
1521 | - * interrupt from previous kernel might still have ISR bit set. | ||
1522 | - * | ||
1523 | - * Most probably by now CPU has serviced that pending interrupt and | ||
1524 | - * it might not have done the ack_APIC_irq() because it thought, | ||
1525 | - * interrupt came from i8259 as ExtInt. LAPIC did not get EOI so it | ||
1526 | - * does not clear the ISR bit and cpu thinks it has already serivced | ||
1527 | - * the interrupt. Hence a vector might get locked. It was noticed | ||
1528 | - * for timer irq (vector 0x31). Issue an extra EOI to clear ISR. | ||
1529 | + * If the ISR map is not empty. ACK the APIC and run another round | ||
1530 | + * to verify whether a pending IRR has been unblocked and turned | ||
1531 | + * into a ISR. | ||
1532 | */ | ||
1533 | - do { | ||
1534 | - queued = 0; | ||
1535 | - for (i = APIC_ISR_NR - 1; i >= 0; i--) | ||
1536 | - queued |= apic_read(APIC_IRR + i*0x10); | ||
1537 | - | ||
1538 | - for (i = APIC_ISR_NR - 1; i >= 0; i--) { | ||
1539 | - value = apic_read(APIC_ISR + i*0x10); | ||
1540 | - for_each_set_bit(j, &value, 32) { | ||
1541 | - ack_APIC_irq(); | ||
1542 | - acked++; | ||
1543 | - } | ||
1544 | - } | ||
1545 | - if (acked > 256) { | ||
1546 | - pr_err("LAPIC pending interrupts after %d EOI\n", acked); | ||
1547 | - break; | ||
1548 | - } | ||
1549 | - if (queued) { | ||
1550 | - if (boot_cpu_has(X86_FEATURE_TSC) && cpu_khz) { | ||
1551 | - ntsc = rdtsc(); | ||
1552 | - max_loops = (long long)cpu_khz << 10; | ||
1553 | - max_loops -= ntsc - tsc; | ||
1554 | - } else { | ||
1555 | - max_loops--; | ||
1556 | - } | ||
1557 | - } | ||
1558 | - } while (queued && max_loops > 0); | ||
1559 | - WARN_ON(max_loops <= 0); | ||
1560 | + if (!bitmap_empty(isr->map, APIC_IR_BITS)) { | ||
1561 | + /* | ||
1562 | + * There can be multiple ISR bits set when a high priority | ||
1563 | + * interrupt preempted a lower priority one. Issue an ACK | ||
1564 | + * per set bit. | ||
1565 | + */ | ||
1566 | + for_each_set_bit(bit, isr->map, APIC_IR_BITS) | ||
1567 | + ack_APIC_irq(); | ||
1568 | + return true; | ||
1569 | + } | ||
1570 | + | ||
1571 | + return !bitmap_empty(irr->map, APIC_IR_BITS); | ||
1572 | +} | ||
1573 | + | ||
1574 | +/* | ||
1575 | + * After a crash, we no longer service the interrupts and a pending | ||
1576 | + * interrupt from previous kernel might still have ISR bit set. | ||
1577 | + * | ||
1578 | + * Most probably by now the CPU has serviced that pending interrupt and it | ||
1579 | + * might not have done the ack_APIC_irq() because it thought, interrupt | ||
1580 | + * came from i8259 as ExtInt. LAPIC did not get EOI so it does not clear | ||
1581 | + * the ISR bit and cpu thinks it has already serivced the interrupt. Hence | ||
1582 | + * a vector might get locked. It was noticed for timer irq (vector | ||
1583 | + * 0x31). Issue an extra EOI to clear ISR. | ||
1584 | + * | ||
1585 | + * If there are pending IRR bits they turn into ISR bits after a higher | ||
1586 | + * priority ISR bit has been acked. | ||
1587 | + */ | ||
1588 | +static void apic_pending_intr_clear(void) | ||
1589 | +{ | ||
1590 | + union apic_ir irr, isr; | ||
1591 | + unsigned int i; | ||
1592 | + | ||
1593 | + /* 512 loops are way oversized and give the APIC a chance to obey. */ | ||
1594 | + for (i = 0; i < 512; i++) { | ||
1595 | + if (!apic_check_and_ack(&irr, &isr)) | ||
1596 | + return; | ||
1597 | + } | ||
1598 | + /* Dump the IRR/ISR content if that failed */ | ||
1599 | + pr_warn("APIC: Stale IRR: %256pb ISR: %256pb\n", irr.map, isr.map); | ||
1600 | } | ||
1601 | |||
1602 | /** | ||
1603 | @@ -1565,6 +1583,14 @@ static void setup_local_APIC(void) | ||
1604 | return; | ||
1605 | } | ||
1606 | |||
1607 | + /* | ||
1608 | + * If this comes from kexec/kcrash the APIC might be enabled in | ||
1609 | + * SPIV. Soft disable it before doing further initialization. | ||
1610 | + */ | ||
1611 | + value = apic_read(APIC_SPIV); | ||
1612 | + value &= ~APIC_SPIV_APIC_ENABLED; | ||
1613 | + apic_write(APIC_SPIV, value); | ||
1614 | + | ||
1615 | #ifdef CONFIG_X86_32 | ||
1616 | /* Pound the ESR really hard over the head with a big hammer - mbligh */ | ||
1617 | if (lapic_is_integrated() && apic->disable_esr) { | ||
1618 | @@ -1610,6 +1636,7 @@ static void setup_local_APIC(void) | ||
1619 | value &= ~APIC_TPRI_MASK; | ||
1620 | apic_write(APIC_TASKPRI, value); | ||
1621 | |||
1622 | + /* Clear eventually stale ISR/IRR bits */ | ||
1623 | apic_pending_intr_clear(); | ||
1624 | |||
1625 | /* | ||
1626 | diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c | ||
1627 | index fdacb864c3dd..2c5676b0a6e7 100644 | ||
1628 | --- a/arch/x86/kernel/apic/vector.c | ||
1629 | +++ b/arch/x86/kernel/apic/vector.c | ||
1630 | @@ -398,6 +398,17 @@ static int activate_reserved(struct irq_data *irqd) | ||
1631 | if (!irqd_can_reserve(irqd)) | ||
1632 | apicd->can_reserve = false; | ||
1633 | } | ||
1634 | + | ||
1635 | + /* | ||
1636 | + * Check to ensure that the effective affinity mask is a subset | ||
1637 | + * the user supplied affinity mask, and warn the user if it is not | ||
1638 | + */ | ||
1639 | + if (!cpumask_subset(irq_data_get_effective_affinity_mask(irqd), | ||
1640 | + irq_data_get_affinity_mask(irqd))) { | ||
1641 | + pr_warn("irq %u: Affinity broken due to vector space exhaustion.\n", | ||
1642 | + irqd->irq); | ||
1643 | + } | ||
1644 | + | ||
1645 | return ret; | ||
1646 | } | ||
1647 | |||
1648 | diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c | ||
1649 | index 96421f97e75c..231fa230ebc7 100644 | ||
1650 | --- a/arch/x86/kernel/smp.c | ||
1651 | +++ b/arch/x86/kernel/smp.c | ||
1652 | @@ -179,6 +179,12 @@ asmlinkage __visible void smp_reboot_interrupt(void) | ||
1653 | irq_exit(); | ||
1654 | } | ||
1655 | |||
1656 | +static int register_stop_handler(void) | ||
1657 | +{ | ||
1658 | + return register_nmi_handler(NMI_LOCAL, smp_stop_nmi_callback, | ||
1659 | + NMI_FLAG_FIRST, "smp_stop"); | ||
1660 | +} | ||
1661 | + | ||
1662 | static void native_stop_other_cpus(int wait) | ||
1663 | { | ||
1664 | unsigned long flags; | ||
1665 | @@ -212,39 +218,41 @@ static void native_stop_other_cpus(int wait) | ||
1666 | apic->send_IPI_allbutself(REBOOT_VECTOR); | ||
1667 | |||
1668 | /* | ||
1669 | - * Don't wait longer than a second if the caller | ||
1670 | - * didn't ask us to wait. | ||
1671 | + * Don't wait longer than a second for IPI completion. The | ||
1672 | + * wait request is not checked here because that would | ||
1673 | + * prevent an NMI shutdown attempt in case that not all | ||
1674 | + * CPUs reach shutdown state. | ||
1675 | */ | ||
1676 | timeout = USEC_PER_SEC; | ||
1677 | - while (num_online_cpus() > 1 && (wait || timeout--)) | ||
1678 | + while (num_online_cpus() > 1 && timeout--) | ||
1679 | udelay(1); | ||
1680 | } | ||
1681 | - | ||
1682 | - /* if the REBOOT_VECTOR didn't work, try with the NMI */ | ||
1683 | - if ((num_online_cpus() > 1) && (!smp_no_nmi_ipi)) { | ||
1684 | - if (register_nmi_handler(NMI_LOCAL, smp_stop_nmi_callback, | ||
1685 | - NMI_FLAG_FIRST, "smp_stop")) | ||
1686 | - /* Note: we ignore failures here */ | ||
1687 | - /* Hope the REBOOT_IRQ is good enough */ | ||
1688 | - goto finish; | ||
1689 | - | ||
1690 | - /* sync above data before sending IRQ */ | ||
1691 | - wmb(); | ||
1692 | |||
1693 | - pr_emerg("Shutting down cpus with NMI\n"); | ||
1694 | + /* if the REBOOT_VECTOR didn't work, try with the NMI */ | ||
1695 | + if (num_online_cpus() > 1) { | ||
1696 | + /* | ||
1697 | + * If NMI IPI is enabled, try to register the stop handler | ||
1698 | + * and send the IPI. In any case try to wait for the other | ||
1699 | + * CPUs to stop. | ||
1700 | + */ | ||
1701 | + if (!smp_no_nmi_ipi && !register_stop_handler()) { | ||
1702 | + /* Sync above data before sending IRQ */ | ||
1703 | + wmb(); | ||
1704 | |||
1705 | - apic->send_IPI_allbutself(NMI_VECTOR); | ||
1706 | + pr_emerg("Shutting down cpus with NMI\n"); | ||
1707 | |||
1708 | + apic->send_IPI_allbutself(NMI_VECTOR); | ||
1709 | + } | ||
1710 | /* | ||
1711 | - * Don't wait longer than a 10 ms if the caller | ||
1712 | - * didn't ask us to wait. | ||
1713 | + * Don't wait longer than 10 ms if the caller didn't | ||
1714 | + * reqeust it. If wait is true, the machine hangs here if | ||
1715 | + * one or more CPUs do not reach shutdown state. | ||
1716 | */ | ||
1717 | timeout = USEC_PER_MSEC * 10; | ||
1718 | while (num_online_cpus() > 1 && (wait || timeout--)) | ||
1719 | udelay(1); | ||
1720 | } | ||
1721 | |||
1722 | -finish: | ||
1723 | local_irq_save(flags); | ||
1724 | disable_local_APIC(); | ||
1725 | mcheck_cpu_clear(this_cpu_ptr(&cpu_info)); | ||
1726 | diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c | ||
1727 | index 22c2720cd948..e7d25f436466 100644 | ||
1728 | --- a/arch/x86/kvm/cpuid.c | ||
1729 | +++ b/arch/x86/kvm/cpuid.c | ||
1730 | @@ -304,7 +304,13 @@ static void do_host_cpuid(struct kvm_cpuid_entry2 *entry, u32 function, | ||
1731 | case 7: | ||
1732 | case 0xb: | ||
1733 | case 0xd: | ||
1734 | + case 0xf: | ||
1735 | + case 0x10: | ||
1736 | + case 0x12: | ||
1737 | case 0x14: | ||
1738 | + case 0x17: | ||
1739 | + case 0x18: | ||
1740 | + case 0x1f: | ||
1741 | case 0x8000001d: | ||
1742 | entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; | ||
1743 | break; | ||
1744 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c | ||
1745 | index 718f7d9afedc..3b971026a653 100644 | ||
1746 | --- a/arch/x86/kvm/emulate.c | ||
1747 | +++ b/arch/x86/kvm/emulate.c | ||
1748 | @@ -5395,6 +5395,8 @@ done_prefixes: | ||
1749 | ctxt->memopp->addr.mem.ea + ctxt->_eip); | ||
1750 | |||
1751 | done: | ||
1752 | + if (rc == X86EMUL_PROPAGATE_FAULT) | ||
1753 | + ctxt->have_exception = true; | ||
1754 | return (rc != X86EMUL_CONTINUE) ? EMULATION_FAILED : EMULATION_OK; | ||
1755 | } | ||
1756 | |||
1757 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c | ||
1758 | index a63964e7cec7..94aa6102010d 100644 | ||
1759 | --- a/arch/x86/kvm/mmu.c | ||
1760 | +++ b/arch/x86/kvm/mmu.c | ||
1761 | @@ -395,8 +395,6 @@ static void mark_mmio_spte(struct kvm_vcpu *vcpu, u64 *sptep, u64 gfn, | ||
1762 | mask |= (gpa & shadow_nonpresent_or_rsvd_mask) | ||
1763 | << shadow_nonpresent_or_rsvd_mask_len; | ||
1764 | |||
1765 | - page_header(__pa(sptep))->mmio_cached = true; | ||
1766 | - | ||
1767 | trace_mark_mmio_spte(sptep, gfn, access, gen); | ||
1768 | mmu_spte_set(sptep, mask); | ||
1769 | } | ||
1770 | @@ -5611,13 +5609,13 @@ slot_handle_leaf(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
1771 | PT_PAGE_TABLE_LEVEL, lock_flush_tlb); | ||
1772 | } | ||
1773 | |||
1774 | -static void free_mmu_pages(struct kvm_vcpu *vcpu) | ||
1775 | +static void free_mmu_pages(struct kvm_mmu *mmu) | ||
1776 | { | ||
1777 | - free_page((unsigned long)vcpu->arch.mmu->pae_root); | ||
1778 | - free_page((unsigned long)vcpu->arch.mmu->lm_root); | ||
1779 | + free_page((unsigned long)mmu->pae_root); | ||
1780 | + free_page((unsigned long)mmu->lm_root); | ||
1781 | } | ||
1782 | |||
1783 | -static int alloc_mmu_pages(struct kvm_vcpu *vcpu) | ||
1784 | +static int alloc_mmu_pages(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu) | ||
1785 | { | ||
1786 | struct page *page; | ||
1787 | int i; | ||
1788 | @@ -5638,9 +5636,9 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu) | ||
1789 | if (!page) | ||
1790 | return -ENOMEM; | ||
1791 | |||
1792 | - vcpu->arch.mmu->pae_root = page_address(page); | ||
1793 | + mmu->pae_root = page_address(page); | ||
1794 | for (i = 0; i < 4; ++i) | ||
1795 | - vcpu->arch.mmu->pae_root[i] = INVALID_PAGE; | ||
1796 | + mmu->pae_root[i] = INVALID_PAGE; | ||
1797 | |||
1798 | return 0; | ||
1799 | } | ||
1800 | @@ -5648,6 +5646,7 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu) | ||
1801 | int kvm_mmu_create(struct kvm_vcpu *vcpu) | ||
1802 | { | ||
1803 | uint i; | ||
1804 | + int ret; | ||
1805 | |||
1806 | vcpu->arch.mmu = &vcpu->arch.root_mmu; | ||
1807 | vcpu->arch.walk_mmu = &vcpu->arch.root_mmu; | ||
1808 | @@ -5665,7 +5664,19 @@ int kvm_mmu_create(struct kvm_vcpu *vcpu) | ||
1809 | vcpu->arch.guest_mmu.prev_roots[i] = KVM_MMU_ROOT_INFO_INVALID; | ||
1810 | |||
1811 | vcpu->arch.nested_mmu.translate_gpa = translate_nested_gpa; | ||
1812 | - return alloc_mmu_pages(vcpu); | ||
1813 | + | ||
1814 | + ret = alloc_mmu_pages(vcpu, &vcpu->arch.guest_mmu); | ||
1815 | + if (ret) | ||
1816 | + return ret; | ||
1817 | + | ||
1818 | + ret = alloc_mmu_pages(vcpu, &vcpu->arch.root_mmu); | ||
1819 | + if (ret) | ||
1820 | + goto fail_allocate_root; | ||
1821 | + | ||
1822 | + return ret; | ||
1823 | + fail_allocate_root: | ||
1824 | + free_mmu_pages(&vcpu->arch.guest_mmu); | ||
1825 | + return ret; | ||
1826 | } | ||
1827 | |||
1828 | |||
1829 | @@ -5943,7 +5954,7 @@ void kvm_mmu_slot_set_dirty(struct kvm *kvm, | ||
1830 | } | ||
1831 | EXPORT_SYMBOL_GPL(kvm_mmu_slot_set_dirty); | ||
1832 | |||
1833 | -static void __kvm_mmu_zap_all(struct kvm *kvm, bool mmio_only) | ||
1834 | +void kvm_mmu_zap_all(struct kvm *kvm) | ||
1835 | { | ||
1836 | struct kvm_mmu_page *sp, *node; | ||
1837 | LIST_HEAD(invalid_list); | ||
1838 | @@ -5952,14 +5963,10 @@ static void __kvm_mmu_zap_all(struct kvm *kvm, bool mmio_only) | ||
1839 | spin_lock(&kvm->mmu_lock); | ||
1840 | restart: | ||
1841 | list_for_each_entry_safe(sp, node, &kvm->arch.active_mmu_pages, link) { | ||
1842 | - if (mmio_only && !sp->mmio_cached) | ||
1843 | - continue; | ||
1844 | if (sp->role.invalid && sp->root_count) | ||
1845 | continue; | ||
1846 | - if (__kvm_mmu_prepare_zap_page(kvm, sp, &invalid_list, &ign)) { | ||
1847 | - WARN_ON_ONCE(mmio_only); | ||
1848 | + if (__kvm_mmu_prepare_zap_page(kvm, sp, &invalid_list, &ign)) | ||
1849 | goto restart; | ||
1850 | - } | ||
1851 | if (cond_resched_lock(&kvm->mmu_lock)) | ||
1852 | goto restart; | ||
1853 | } | ||
1854 | @@ -5968,11 +5975,6 @@ restart: | ||
1855 | spin_unlock(&kvm->mmu_lock); | ||
1856 | } | ||
1857 | |||
1858 | -void kvm_mmu_zap_all(struct kvm *kvm) | ||
1859 | -{ | ||
1860 | - return __kvm_mmu_zap_all(kvm, false); | ||
1861 | -} | ||
1862 | - | ||
1863 | void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen) | ||
1864 | { | ||
1865 | WARN_ON(gen & KVM_MEMSLOT_GEN_UPDATE_IN_PROGRESS); | ||
1866 | @@ -5994,7 +5996,7 @@ void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen) | ||
1867 | */ | ||
1868 | if (unlikely(gen == 0)) { | ||
1869 | kvm_debug_ratelimited("kvm: zapping shadow pages for mmio generation wraparound\n"); | ||
1870 | - __kvm_mmu_zap_all(kvm, true); | ||
1871 | + kvm_mmu_zap_all_fast(kvm); | ||
1872 | } | ||
1873 | } | ||
1874 | |||
1875 | @@ -6168,7 +6170,8 @@ unsigned long kvm_mmu_calculate_default_mmu_pages(struct kvm *kvm) | ||
1876 | void kvm_mmu_destroy(struct kvm_vcpu *vcpu) | ||
1877 | { | ||
1878 | kvm_mmu_unload(vcpu); | ||
1879 | - free_mmu_pages(vcpu); | ||
1880 | + free_mmu_pages(&vcpu->arch.root_mmu); | ||
1881 | + free_mmu_pages(&vcpu->arch.guest_mmu); | ||
1882 | mmu_free_memory_caches(vcpu); | ||
1883 | } | ||
1884 | |||
1885 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c | ||
1886 | index e0368076a1ef..45e425c5e6f5 100644 | ||
1887 | --- a/arch/x86/kvm/svm.c | ||
1888 | +++ b/arch/x86/kvm/svm.c | ||
1889 | @@ -5274,7 +5274,8 @@ get_pi_vcpu_info(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, | ||
1890 | |||
1891 | kvm_set_msi_irq(kvm, e, &irq); | ||
1892 | |||
1893 | - if (!kvm_intr_is_single_vcpu(kvm, &irq, &vcpu)) { | ||
1894 | + if (!kvm_intr_is_single_vcpu(kvm, &irq, &vcpu) || | ||
1895 | + !kvm_irq_is_postable(&irq)) { | ||
1896 | pr_debug("SVM: %s: use legacy intr remap mode for irq %u\n", | ||
1897 | __func__, irq.vector); | ||
1898 | return -1; | ||
1899 | @@ -5328,6 +5329,7 @@ static int svm_update_pi_irte(struct kvm *kvm, unsigned int host_irq, | ||
1900 | * 1. When cannot target interrupt to a specific vcpu. | ||
1901 | * 2. Unsetting posted interrupt. | ||
1902 | * 3. APIC virtialization is disabled for the vcpu. | ||
1903 | + * 4. IRQ has incompatible delivery mode (SMI, INIT, etc) | ||
1904 | */ | ||
1905 | if (!get_pi_vcpu_info(kvm, e, &vcpu_info, &svm) && set && | ||
1906 | kvm_vcpu_apicv_active(&svm->vcpu)) { | ||
1907 | diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c | ||
1908 | index c030c96fc81a..1d11bf4bab8b 100644 | ||
1909 | --- a/arch/x86/kvm/vmx/vmx.c | ||
1910 | +++ b/arch/x86/kvm/vmx/vmx.c | ||
1911 | @@ -7369,10 +7369,14 @@ static int vmx_update_pi_irte(struct kvm *kvm, unsigned int host_irq, | ||
1912 | * irqbalance to make the interrupts single-CPU. | ||
1913 | * | ||
1914 | * We will support full lowest-priority interrupt later. | ||
1915 | + * | ||
1916 | + * In addition, we can only inject generic interrupts using | ||
1917 | + * the PI mechanism, refuse to route others through it. | ||
1918 | */ | ||
1919 | |||
1920 | kvm_set_msi_irq(kvm, e, &irq); | ||
1921 | - if (!kvm_intr_is_single_vcpu(kvm, &irq, &vcpu)) { | ||
1922 | + if (!kvm_intr_is_single_vcpu(kvm, &irq, &vcpu) || | ||
1923 | + !kvm_irq_is_postable(&irq)) { | ||
1924 | /* | ||
1925 | * Make sure the IRTE is in remapped mode if | ||
1926 | * we don't handle it in posted mode. | ||
1927 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
1928 | index 91602d310a3f..350adc83eb50 100644 | ||
1929 | --- a/arch/x86/kvm/x86.c | ||
1930 | +++ b/arch/x86/kvm/x86.c | ||
1931 | @@ -674,8 +674,14 @@ static int kvm_read_nested_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, | ||
1932 | data, offset, len, access); | ||
1933 | } | ||
1934 | |||
1935 | +static inline u64 pdptr_rsvd_bits(struct kvm_vcpu *vcpu) | ||
1936 | +{ | ||
1937 | + return rsvd_bits(cpuid_maxphyaddr(vcpu), 63) | rsvd_bits(5, 8) | | ||
1938 | + rsvd_bits(1, 2); | ||
1939 | +} | ||
1940 | + | ||
1941 | /* | ||
1942 | - * Load the pae pdptrs. Return true is they are all valid. | ||
1943 | + * Load the pae pdptrs. Return 1 if they are all valid, 0 otherwise. | ||
1944 | */ | ||
1945 | int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3) | ||
1946 | { | ||
1947 | @@ -694,8 +700,7 @@ int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3) | ||
1948 | } | ||
1949 | for (i = 0; i < ARRAY_SIZE(pdpte); ++i) { | ||
1950 | if ((pdpte[i] & PT_PRESENT_MASK) && | ||
1951 | - (pdpte[i] & | ||
1952 | - vcpu->arch.mmu->guest_rsvd_check.rsvd_bits_mask[0][2])) { | ||
1953 | + (pdpte[i] & pdptr_rsvd_bits(vcpu))) { | ||
1954 | ret = 0; | ||
1955 | goto out; | ||
1956 | } | ||
1957 | @@ -6528,8 +6533,16 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, | ||
1958 | if (reexecute_instruction(vcpu, cr2, write_fault_to_spt, | ||
1959 | emulation_type)) | ||
1960 | return EMULATE_DONE; | ||
1961 | - if (ctxt->have_exception && inject_emulated_exception(vcpu)) | ||
1962 | + if (ctxt->have_exception) { | ||
1963 | + /* | ||
1964 | + * #UD should result in just EMULATION_FAILED, and trap-like | ||
1965 | + * exception should not be encountered during decode. | ||
1966 | + */ | ||
1967 | + WARN_ON_ONCE(ctxt->exception.vector == UD_VECTOR || | ||
1968 | + exception_type(ctxt->exception.vector) == EXCPT_TRAP); | ||
1969 | + inject_emulated_exception(vcpu); | ||
1970 | return EMULATE_DONE; | ||
1971 | + } | ||
1972 | if (emulation_type & EMULTYPE_SKIP) | ||
1973 | return EMULATE_FAIL; | ||
1974 | return handle_emulation_failure(vcpu, emulation_type); | ||
1975 | diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c | ||
1976 | index e6dad600614c..4123100e0eaf 100644 | ||
1977 | --- a/arch/x86/mm/numa.c | ||
1978 | +++ b/arch/x86/mm/numa.c | ||
1979 | @@ -861,9 +861,9 @@ void numa_remove_cpu(int cpu) | ||
1980 | */ | ||
1981 | const struct cpumask *cpumask_of_node(int node) | ||
1982 | { | ||
1983 | - if (node >= nr_node_ids) { | ||
1984 | + if ((unsigned)node >= nr_node_ids) { | ||
1985 | printk(KERN_WARNING | ||
1986 | - "cpumask_of_node(%d): node > nr_node_ids(%u)\n", | ||
1987 | + "cpumask_of_node(%d): (unsigned)node >= nr_node_ids(%u)\n", | ||
1988 | node, nr_node_ids); | ||
1989 | dump_stack(); | ||
1990 | return cpu_none_mask; | ||
1991 | diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c | ||
1992 | index b196524759ec..7f2140414440 100644 | ||
1993 | --- a/arch/x86/mm/pti.c | ||
1994 | +++ b/arch/x86/mm/pti.c | ||
1995 | @@ -330,13 +330,15 @@ pti_clone_pgtable(unsigned long start, unsigned long end, | ||
1996 | |||
1997 | pud = pud_offset(p4d, addr); | ||
1998 | if (pud_none(*pud)) { | ||
1999 | - addr += PUD_SIZE; | ||
2000 | + WARN_ON_ONCE(addr & ~PUD_MASK); | ||
2001 | + addr = round_up(addr + 1, PUD_SIZE); | ||
2002 | continue; | ||
2003 | } | ||
2004 | |||
2005 | pmd = pmd_offset(pud, addr); | ||
2006 | if (pmd_none(*pmd)) { | ||
2007 | - addr += PMD_SIZE; | ||
2008 | + WARN_ON_ONCE(addr & ~PMD_MASK); | ||
2009 | + addr = round_up(addr + 1, PMD_SIZE); | ||
2010 | continue; | ||
2011 | } | ||
2012 | |||
2013 | @@ -666,6 +668,8 @@ void __init pti_init(void) | ||
2014 | */ | ||
2015 | void pti_finalize(void) | ||
2016 | { | ||
2017 | + if (!boot_cpu_has(X86_FEATURE_PTI)) | ||
2018 | + return; | ||
2019 | /* | ||
2020 | * We need to clone everything (again) that maps parts of the | ||
2021 | * kernel image. | ||
2022 | diff --git a/arch/x86/platform/intel/iosf_mbi.c b/arch/x86/platform/intel/iosf_mbi.c | ||
2023 | index 2e796b54cbde..9e2444500428 100644 | ||
2024 | --- a/arch/x86/platform/intel/iosf_mbi.c | ||
2025 | +++ b/arch/x86/platform/intel/iosf_mbi.c | ||
2026 | @@ -17,6 +17,7 @@ | ||
2027 | #include <linux/debugfs.h> | ||
2028 | #include <linux/capability.h> | ||
2029 | #include <linux/pm_qos.h> | ||
2030 | +#include <linux/wait.h> | ||
2031 | |||
2032 | #include <asm/iosf_mbi.h> | ||
2033 | |||
2034 | @@ -201,23 +202,45 @@ EXPORT_SYMBOL(iosf_mbi_available); | ||
2035 | #define PUNIT_SEMAPHORE_BIT BIT(0) | ||
2036 | #define PUNIT_SEMAPHORE_ACQUIRE BIT(1) | ||
2037 | |||
2038 | -static DEFINE_MUTEX(iosf_mbi_punit_mutex); | ||
2039 | -static DEFINE_MUTEX(iosf_mbi_block_punit_i2c_access_count_mutex); | ||
2040 | +static DEFINE_MUTEX(iosf_mbi_pmic_access_mutex); | ||
2041 | static BLOCKING_NOTIFIER_HEAD(iosf_mbi_pmic_bus_access_notifier); | ||
2042 | -static u32 iosf_mbi_block_punit_i2c_access_count; | ||
2043 | +static DECLARE_WAIT_QUEUE_HEAD(iosf_mbi_pmic_access_waitq); | ||
2044 | +static u32 iosf_mbi_pmic_punit_access_count; | ||
2045 | +static u32 iosf_mbi_pmic_i2c_access_count; | ||
2046 | static u32 iosf_mbi_sem_address; | ||
2047 | static unsigned long iosf_mbi_sem_acquired; | ||
2048 | static struct pm_qos_request iosf_mbi_pm_qos; | ||
2049 | |||
2050 | void iosf_mbi_punit_acquire(void) | ||
2051 | { | ||
2052 | - mutex_lock(&iosf_mbi_punit_mutex); | ||
2053 | + /* Wait for any I2C PMIC accesses from in kernel drivers to finish. */ | ||
2054 | + mutex_lock(&iosf_mbi_pmic_access_mutex); | ||
2055 | + while (iosf_mbi_pmic_i2c_access_count != 0) { | ||
2056 | + mutex_unlock(&iosf_mbi_pmic_access_mutex); | ||
2057 | + wait_event(iosf_mbi_pmic_access_waitq, | ||
2058 | + iosf_mbi_pmic_i2c_access_count == 0); | ||
2059 | + mutex_lock(&iosf_mbi_pmic_access_mutex); | ||
2060 | + } | ||
2061 | + /* | ||
2062 | + * We do not need to do anything to allow the PUNIT to safely access | ||
2063 | + * the PMIC, other then block in kernel accesses to the PMIC. | ||
2064 | + */ | ||
2065 | + iosf_mbi_pmic_punit_access_count++; | ||
2066 | + mutex_unlock(&iosf_mbi_pmic_access_mutex); | ||
2067 | } | ||
2068 | EXPORT_SYMBOL(iosf_mbi_punit_acquire); | ||
2069 | |||
2070 | void iosf_mbi_punit_release(void) | ||
2071 | { | ||
2072 | - mutex_unlock(&iosf_mbi_punit_mutex); | ||
2073 | + bool do_wakeup; | ||
2074 | + | ||
2075 | + mutex_lock(&iosf_mbi_pmic_access_mutex); | ||
2076 | + iosf_mbi_pmic_punit_access_count--; | ||
2077 | + do_wakeup = iosf_mbi_pmic_punit_access_count == 0; | ||
2078 | + mutex_unlock(&iosf_mbi_pmic_access_mutex); | ||
2079 | + | ||
2080 | + if (do_wakeup) | ||
2081 | + wake_up(&iosf_mbi_pmic_access_waitq); | ||
2082 | } | ||
2083 | EXPORT_SYMBOL(iosf_mbi_punit_release); | ||
2084 | |||
2085 | @@ -256,34 +279,32 @@ static void iosf_mbi_reset_semaphore(void) | ||
2086 | * already blocked P-Unit accesses because it wants them blocked over multiple | ||
2087 | * i2c-transfers, for e.g. read-modify-write of an I2C client register. | ||
2088 | * | ||
2089 | - * The P-Unit accesses already being blocked is tracked through the | ||
2090 | - * iosf_mbi_block_punit_i2c_access_count variable which is protected by the | ||
2091 | - * iosf_mbi_block_punit_i2c_access_count_mutex this mutex is hold for the | ||
2092 | - * entire duration of the function. | ||
2093 | - * | ||
2094 | - * If access is not blocked yet, this function takes the following steps: | ||
2095 | + * To allow safe PMIC i2c bus accesses this function takes the following steps: | ||
2096 | * | ||
2097 | * 1) Some code sends request to the P-Unit which make it access the PMIC | ||
2098 | * I2C bus. Testing has shown that the P-Unit does not check its internal | ||
2099 | * PMIC bus semaphore for these requests. Callers of these requests call | ||
2100 | * iosf_mbi_punit_acquire()/_release() around their P-Unit accesses, these | ||
2101 | - * functions lock/unlock the iosf_mbi_punit_mutex. | ||
2102 | - * As the first step we lock the iosf_mbi_punit_mutex, to wait for any in | ||
2103 | - * flight requests to finish and to block any new requests. | ||
2104 | + * functions increase/decrease iosf_mbi_pmic_punit_access_count, so first | ||
2105 | + * we wait for iosf_mbi_pmic_punit_access_count to become 0. | ||
2106 | + * | ||
2107 | + * 2) Check iosf_mbi_pmic_i2c_access_count, if access has already | ||
2108 | + * been blocked by another caller, we only need to increment | ||
2109 | + * iosf_mbi_pmic_i2c_access_count and we can skip the other steps. | ||
2110 | * | ||
2111 | - * 2) Some code makes such P-Unit requests from atomic contexts where it | ||
2112 | + * 3) Some code makes such P-Unit requests from atomic contexts where it | ||
2113 | * cannot call iosf_mbi_punit_acquire() as that may sleep. | ||
2114 | * As the second step we call a notifier chain which allows any code | ||
2115 | * needing P-Unit resources from atomic context to acquire them before | ||
2116 | * we take control over the PMIC I2C bus. | ||
2117 | * | ||
2118 | - * 3) When CPU cores enter C6 or C7 the P-Unit needs to talk to the PMIC | ||
2119 | + * 4) When CPU cores enter C6 or C7 the P-Unit needs to talk to the PMIC | ||
2120 | * if this happens while the kernel itself is accessing the PMIC I2C bus | ||
2121 | * the SoC hangs. | ||
2122 | * As the third step we call pm_qos_update_request() to disallow the CPU | ||
2123 | * to enter C6 or C7. | ||
2124 | * | ||
2125 | - * 4) The P-Unit has a PMIC bus semaphore which we can request to stop | ||
2126 | + * 5) The P-Unit has a PMIC bus semaphore which we can request to stop | ||
2127 | * autonomous P-Unit tasks from accessing the PMIC I2C bus while we hold it. | ||
2128 | * As the fourth and final step we request this semaphore and wait for our | ||
2129 | * request to be acknowledged. | ||
2130 | @@ -297,12 +318,18 @@ int iosf_mbi_block_punit_i2c_access(void) | ||
2131 | if (WARN_ON(!mbi_pdev || !iosf_mbi_sem_address)) | ||
2132 | return -ENXIO; | ||
2133 | |||
2134 | - mutex_lock(&iosf_mbi_block_punit_i2c_access_count_mutex); | ||
2135 | + mutex_lock(&iosf_mbi_pmic_access_mutex); | ||
2136 | |||
2137 | - if (iosf_mbi_block_punit_i2c_access_count > 0) | ||
2138 | + while (iosf_mbi_pmic_punit_access_count != 0) { | ||
2139 | + mutex_unlock(&iosf_mbi_pmic_access_mutex); | ||
2140 | + wait_event(iosf_mbi_pmic_access_waitq, | ||
2141 | + iosf_mbi_pmic_punit_access_count == 0); | ||
2142 | + mutex_lock(&iosf_mbi_pmic_access_mutex); | ||
2143 | + } | ||
2144 | + | ||
2145 | + if (iosf_mbi_pmic_i2c_access_count > 0) | ||
2146 | goto success; | ||
2147 | |||
2148 | - mutex_lock(&iosf_mbi_punit_mutex); | ||
2149 | blocking_notifier_call_chain(&iosf_mbi_pmic_bus_access_notifier, | ||
2150 | MBI_PMIC_BUS_ACCESS_BEGIN, NULL); | ||
2151 | |||
2152 | @@ -330,10 +357,6 @@ int iosf_mbi_block_punit_i2c_access(void) | ||
2153 | iosf_mbi_sem_acquired = jiffies; | ||
2154 | dev_dbg(&mbi_pdev->dev, "P-Unit semaphore acquired after %ums\n", | ||
2155 | jiffies_to_msecs(jiffies - start)); | ||
2156 | - /* | ||
2157 | - * Success, keep iosf_mbi_punit_mutex locked till | ||
2158 | - * iosf_mbi_unblock_punit_i2c_access() gets called. | ||
2159 | - */ | ||
2160 | goto success; | ||
2161 | } | ||
2162 | |||
2163 | @@ -344,15 +367,13 @@ int iosf_mbi_block_punit_i2c_access(void) | ||
2164 | dev_err(&mbi_pdev->dev, "Error P-Unit semaphore timed out, resetting\n"); | ||
2165 | error: | ||
2166 | iosf_mbi_reset_semaphore(); | ||
2167 | - mutex_unlock(&iosf_mbi_punit_mutex); | ||
2168 | - | ||
2169 | if (!iosf_mbi_get_sem(&sem)) | ||
2170 | dev_err(&mbi_pdev->dev, "P-Unit semaphore: %d\n", sem); | ||
2171 | success: | ||
2172 | if (!WARN_ON(ret)) | ||
2173 | - iosf_mbi_block_punit_i2c_access_count++; | ||
2174 | + iosf_mbi_pmic_i2c_access_count++; | ||
2175 | |||
2176 | - mutex_unlock(&iosf_mbi_block_punit_i2c_access_count_mutex); | ||
2177 | + mutex_unlock(&iosf_mbi_pmic_access_mutex); | ||
2178 | |||
2179 | return ret; | ||
2180 | } | ||
2181 | @@ -360,17 +381,20 @@ EXPORT_SYMBOL(iosf_mbi_block_punit_i2c_access); | ||
2182 | |||
2183 | void iosf_mbi_unblock_punit_i2c_access(void) | ||
2184 | { | ||
2185 | - mutex_lock(&iosf_mbi_block_punit_i2c_access_count_mutex); | ||
2186 | + bool do_wakeup = false; | ||
2187 | |||
2188 | - iosf_mbi_block_punit_i2c_access_count--; | ||
2189 | - if (iosf_mbi_block_punit_i2c_access_count == 0) { | ||
2190 | + mutex_lock(&iosf_mbi_pmic_access_mutex); | ||
2191 | + iosf_mbi_pmic_i2c_access_count--; | ||
2192 | + if (iosf_mbi_pmic_i2c_access_count == 0) { | ||
2193 | iosf_mbi_reset_semaphore(); | ||
2194 | - mutex_unlock(&iosf_mbi_punit_mutex); | ||
2195 | dev_dbg(&mbi_pdev->dev, "punit semaphore held for %ums\n", | ||
2196 | jiffies_to_msecs(jiffies - iosf_mbi_sem_acquired)); | ||
2197 | + do_wakeup = true; | ||
2198 | } | ||
2199 | + mutex_unlock(&iosf_mbi_pmic_access_mutex); | ||
2200 | |||
2201 | - mutex_unlock(&iosf_mbi_block_punit_i2c_access_count_mutex); | ||
2202 | + if (do_wakeup) | ||
2203 | + wake_up(&iosf_mbi_pmic_access_waitq); | ||
2204 | } | ||
2205 | EXPORT_SYMBOL(iosf_mbi_unblock_punit_i2c_access); | ||
2206 | |||
2207 | @@ -379,10 +403,10 @@ int iosf_mbi_register_pmic_bus_access_notifier(struct notifier_block *nb) | ||
2208 | int ret; | ||
2209 | |||
2210 | /* Wait for the bus to go inactive before registering */ | ||
2211 | - mutex_lock(&iosf_mbi_punit_mutex); | ||
2212 | + iosf_mbi_punit_acquire(); | ||
2213 | ret = blocking_notifier_chain_register( | ||
2214 | &iosf_mbi_pmic_bus_access_notifier, nb); | ||
2215 | - mutex_unlock(&iosf_mbi_punit_mutex); | ||
2216 | + iosf_mbi_punit_release(); | ||
2217 | |||
2218 | return ret; | ||
2219 | } | ||
2220 | @@ -403,9 +427,9 @@ int iosf_mbi_unregister_pmic_bus_access_notifier(struct notifier_block *nb) | ||
2221 | int ret; | ||
2222 | |||
2223 | /* Wait for the bus to go inactive before unregistering */ | ||
2224 | - mutex_lock(&iosf_mbi_punit_mutex); | ||
2225 | + iosf_mbi_punit_acquire(); | ||
2226 | ret = iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(nb); | ||
2227 | - mutex_unlock(&iosf_mbi_punit_mutex); | ||
2228 | + iosf_mbi_punit_release(); | ||
2229 | |||
2230 | return ret; | ||
2231 | } | ||
2232 | @@ -413,7 +437,7 @@ EXPORT_SYMBOL(iosf_mbi_unregister_pmic_bus_access_notifier); | ||
2233 | |||
2234 | void iosf_mbi_assert_punit_acquired(void) | ||
2235 | { | ||
2236 | - WARN_ON(!mutex_is_locked(&iosf_mbi_punit_mutex)); | ||
2237 | + WARN_ON(iosf_mbi_pmic_punit_access_count == 0); | ||
2238 | } | ||
2239 | EXPORT_SYMBOL(iosf_mbi_assert_punit_acquired); | ||
2240 | |||
2241 | diff --git a/block/blk-flush.c b/block/blk-flush.c | ||
2242 | index aedd9320e605..1eec9cbe5a0a 100644 | ||
2243 | --- a/block/blk-flush.c | ||
2244 | +++ b/block/blk-flush.c | ||
2245 | @@ -214,6 +214,16 @@ static void flush_end_io(struct request *flush_rq, blk_status_t error) | ||
2246 | |||
2247 | /* release the tag's ownership to the req cloned from */ | ||
2248 | spin_lock_irqsave(&fq->mq_flush_lock, flags); | ||
2249 | + | ||
2250 | + if (!refcount_dec_and_test(&flush_rq->ref)) { | ||
2251 | + fq->rq_status = error; | ||
2252 | + spin_unlock_irqrestore(&fq->mq_flush_lock, flags); | ||
2253 | + return; | ||
2254 | + } | ||
2255 | + | ||
2256 | + if (fq->rq_status != BLK_STS_OK) | ||
2257 | + error = fq->rq_status; | ||
2258 | + | ||
2259 | hctx = flush_rq->mq_hctx; | ||
2260 | if (!q->elevator) { | ||
2261 | blk_mq_tag_set_rq(hctx, flush_rq->tag, fq->orig_rq); | ||
2262 | diff --git a/block/blk-mq.c b/block/blk-mq.c | ||
2263 | index 0835f4d8d42e..a79b9ad1aba1 100644 | ||
2264 | --- a/block/blk-mq.c | ||
2265 | +++ b/block/blk-mq.c | ||
2266 | @@ -44,12 +44,12 @@ static void blk_mq_poll_stats_fn(struct blk_stat_callback *cb); | ||
2267 | |||
2268 | static int blk_mq_poll_stats_bkt(const struct request *rq) | ||
2269 | { | ||
2270 | - int ddir, bytes, bucket; | ||
2271 | + int ddir, sectors, bucket; | ||
2272 | |||
2273 | ddir = rq_data_dir(rq); | ||
2274 | - bytes = blk_rq_bytes(rq); | ||
2275 | + sectors = blk_rq_stats_sectors(rq); | ||
2276 | |||
2277 | - bucket = ddir + 2*(ilog2(bytes) - 9); | ||
2278 | + bucket = ddir + 2 * ilog2(sectors); | ||
2279 | |||
2280 | if (bucket < 0) | ||
2281 | return -1; | ||
2282 | @@ -330,6 +330,7 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data, | ||
2283 | else | ||
2284 | rq->start_time_ns = 0; | ||
2285 | rq->io_start_time_ns = 0; | ||
2286 | + rq->stats_sectors = 0; | ||
2287 | rq->nr_phys_segments = 0; | ||
2288 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | ||
2289 | rq->nr_integrity_segments = 0; | ||
2290 | @@ -673,9 +674,7 @@ void blk_mq_start_request(struct request *rq) | ||
2291 | |||
2292 | if (test_bit(QUEUE_FLAG_STATS, &q->queue_flags)) { | ||
2293 | rq->io_start_time_ns = ktime_get_ns(); | ||
2294 | -#ifdef CONFIG_BLK_DEV_THROTTLING_LOW | ||
2295 | - rq->throtl_size = blk_rq_sectors(rq); | ||
2296 | -#endif | ||
2297 | + rq->stats_sectors = blk_rq_sectors(rq); | ||
2298 | rq->rq_flags |= RQF_STATS; | ||
2299 | rq_qos_issue(q, rq); | ||
2300 | } | ||
2301 | @@ -905,7 +904,10 @@ static bool blk_mq_check_expired(struct blk_mq_hw_ctx *hctx, | ||
2302 | */ | ||
2303 | if (blk_mq_req_expired(rq, next)) | ||
2304 | blk_mq_rq_timed_out(rq, reserved); | ||
2305 | - if (refcount_dec_and_test(&rq->ref)) | ||
2306 | + | ||
2307 | + if (is_flush_rq(rq, hctx)) | ||
2308 | + rq->end_io(rq, 0); | ||
2309 | + else if (refcount_dec_and_test(&rq->ref)) | ||
2310 | __blk_mq_free_request(rq); | ||
2311 | |||
2312 | return true; | ||
2313 | @@ -2841,6 +2843,8 @@ static unsigned int nr_hw_queues(struct blk_mq_tag_set *set) | ||
2314 | struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, | ||
2315 | struct request_queue *q) | ||
2316 | { | ||
2317 | + int ret = -ENOMEM; | ||
2318 | + | ||
2319 | /* mark the queue as mq asap */ | ||
2320 | q->mq_ops = set->ops; | ||
2321 | |||
2322 | @@ -2902,17 +2906,18 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, | ||
2323 | blk_mq_map_swqueue(q); | ||
2324 | |||
2325 | if (!(set->flags & BLK_MQ_F_NO_SCHED)) { | ||
2326 | - int ret; | ||
2327 | - | ||
2328 | ret = elevator_init_mq(q); | ||
2329 | if (ret) | ||
2330 | - return ERR_PTR(ret); | ||
2331 | + goto err_tag_set; | ||
2332 | } | ||
2333 | |||
2334 | return q; | ||
2335 | |||
2336 | +err_tag_set: | ||
2337 | + blk_mq_del_queue_tag_set(q); | ||
2338 | err_hctxs: | ||
2339 | kfree(q->queue_hw_ctx); | ||
2340 | + q->nr_hw_queues = 0; | ||
2341 | err_sys_init: | ||
2342 | blk_mq_sysfs_deinit(q); | ||
2343 | err_poll: | ||
2344 | diff --git a/block/blk-throttle.c b/block/blk-throttle.c | ||
2345 | index 8ab6c8153223..ee74bffe3504 100644 | ||
2346 | --- a/block/blk-throttle.c | ||
2347 | +++ b/block/blk-throttle.c | ||
2348 | @@ -2246,7 +2246,8 @@ void blk_throtl_stat_add(struct request *rq, u64 time_ns) | ||
2349 | struct request_queue *q = rq->q; | ||
2350 | struct throtl_data *td = q->td; | ||
2351 | |||
2352 | - throtl_track_latency(td, rq->throtl_size, req_op(rq), time_ns >> 10); | ||
2353 | + throtl_track_latency(td, blk_rq_stats_sectors(rq), req_op(rq), | ||
2354 | + time_ns >> 10); | ||
2355 | } | ||
2356 | |||
2357 | void blk_throtl_bio_endio(struct bio *bio) | ||
2358 | diff --git a/block/blk.h b/block/blk.h | ||
2359 | index de6b2e146d6e..d5edfd73d45e 100644 | ||
2360 | --- a/block/blk.h | ||
2361 | +++ b/block/blk.h | ||
2362 | @@ -19,6 +19,7 @@ struct blk_flush_queue { | ||
2363 | unsigned int flush_queue_delayed:1; | ||
2364 | unsigned int flush_pending_idx:1; | ||
2365 | unsigned int flush_running_idx:1; | ||
2366 | + blk_status_t rq_status; | ||
2367 | unsigned long flush_pending_since; | ||
2368 | struct list_head flush_queue[2]; | ||
2369 | struct list_head flush_data_in_flight; | ||
2370 | @@ -47,6 +48,12 @@ static inline void __blk_get_queue(struct request_queue *q) | ||
2371 | kobject_get(&q->kobj); | ||
2372 | } | ||
2373 | |||
2374 | +static inline bool | ||
2375 | +is_flush_rq(struct request *req, struct blk_mq_hw_ctx *hctx) | ||
2376 | +{ | ||
2377 | + return hctx->fq->flush_rq == req; | ||
2378 | +} | ||
2379 | + | ||
2380 | struct blk_flush_queue *blk_alloc_flush_queue(struct request_queue *q, | ||
2381 | int node, int cmd_size, gfp_t flags); | ||
2382 | void blk_free_flush_queue(struct blk_flush_queue *q); | ||
2383 | diff --git a/block/mq-deadline.c b/block/mq-deadline.c | ||
2384 | index 2a2a2e82832e..35e84bc0ec8c 100644 | ||
2385 | --- a/block/mq-deadline.c | ||
2386 | +++ b/block/mq-deadline.c | ||
2387 | @@ -377,13 +377,6 @@ done: | ||
2388 | * hardware queue, but we may return a request that is for a | ||
2389 | * different hardware queue. This is because mq-deadline has shared | ||
2390 | * state for all hardware queues, in terms of sorting, FIFOs, etc. | ||
2391 | - * | ||
2392 | - * For a zoned block device, __dd_dispatch_request() may return NULL | ||
2393 | - * if all the queued write requests are directed at zones that are already | ||
2394 | - * locked due to on-going write requests. In this case, make sure to mark | ||
2395 | - * the queue as needing a restart to ensure that the queue is run again | ||
2396 | - * and the pending writes dispatched once the target zones for the ongoing | ||
2397 | - * write requests are unlocked in dd_finish_request(). | ||
2398 | */ | ||
2399 | static struct request *dd_dispatch_request(struct blk_mq_hw_ctx *hctx) | ||
2400 | { | ||
2401 | @@ -392,9 +385,6 @@ static struct request *dd_dispatch_request(struct blk_mq_hw_ctx *hctx) | ||
2402 | |||
2403 | spin_lock(&dd->lock); | ||
2404 | rq = __dd_dispatch_request(dd); | ||
2405 | - if (!rq && blk_queue_is_zoned(hctx->queue) && | ||
2406 | - !list_empty(&dd->fifo_list[WRITE])) | ||
2407 | - blk_mq_sched_mark_restart_hctx(hctx); | ||
2408 | spin_unlock(&dd->lock); | ||
2409 | |||
2410 | return rq; | ||
2411 | @@ -561,6 +551,13 @@ static void dd_prepare_request(struct request *rq, struct bio *bio) | ||
2412 | * spinlock so that the zone is never unlocked while deadline_fifo_request() | ||
2413 | * or deadline_next_request() are executing. This function is called for | ||
2414 | * all requests, whether or not these requests complete successfully. | ||
2415 | + * | ||
2416 | + * For a zoned block device, __dd_dispatch_request() may have stopped | ||
2417 | + * dispatching requests if all the queued requests are write requests directed | ||
2418 | + * at zones that are already locked due to on-going write requests. To ensure | ||
2419 | + * write request dispatch progress in this case, mark the queue as needing a | ||
2420 | + * restart to ensure that the queue is run again after completion of the | ||
2421 | + * request and zones being unlocked. | ||
2422 | */ | ||
2423 | static void dd_finish_request(struct request *rq) | ||
2424 | { | ||
2425 | @@ -572,6 +569,8 @@ static void dd_finish_request(struct request *rq) | ||
2426 | |||
2427 | spin_lock_irqsave(&dd->zone_lock, flags); | ||
2428 | blk_req_zone_write_unlock(rq); | ||
2429 | + if (!list_empty(&dd->fifo_list[WRITE])) | ||
2430 | + blk_mq_sched_mark_restart_hctx(rq->mq_hctx); | ||
2431 | spin_unlock_irqrestore(&dd->zone_lock, flags); | ||
2432 | } | ||
2433 | } | ||
2434 | diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c | ||
2435 | index d696f165a50e..60bbc5090abe 100644 | ||
2436 | --- a/drivers/acpi/acpi_lpss.c | ||
2437 | +++ b/drivers/acpi/acpi_lpss.c | ||
2438 | @@ -219,12 +219,13 @@ static void bsw_pwm_setup(struct lpss_private_data *pdata) | ||
2439 | } | ||
2440 | |||
2441 | static const struct lpss_device_desc lpt_dev_desc = { | ||
2442 | - .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR, | ||
2443 | + .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR | ||
2444 | + | LPSS_SAVE_CTX, | ||
2445 | .prv_offset = 0x800, | ||
2446 | }; | ||
2447 | |||
2448 | static const struct lpss_device_desc lpt_i2c_dev_desc = { | ||
2449 | - .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_LTR, | ||
2450 | + .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_LTR | LPSS_SAVE_CTX, | ||
2451 | .prv_offset = 0x800, | ||
2452 | }; | ||
2453 | |||
2454 | @@ -236,7 +237,8 @@ static struct property_entry uart_properties[] = { | ||
2455 | }; | ||
2456 | |||
2457 | static const struct lpss_device_desc lpt_uart_dev_desc = { | ||
2458 | - .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR, | ||
2459 | + .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR | ||
2460 | + | LPSS_SAVE_CTX, | ||
2461 | .clk_con_id = "baudclk", | ||
2462 | .prv_offset = 0x800, | ||
2463 | .setup = lpss_uart_setup, | ||
2464 | diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c | ||
2465 | index 24f065114d42..2c4dda0787e8 100644 | ||
2466 | --- a/drivers/acpi/acpi_processor.c | ||
2467 | +++ b/drivers/acpi/acpi_processor.c | ||
2468 | @@ -279,9 +279,13 @@ static int acpi_processor_get_info(struct acpi_device *device) | ||
2469 | } | ||
2470 | |||
2471 | if (acpi_duplicate_processor_id(pr->acpi_id)) { | ||
2472 | - dev_err(&device->dev, | ||
2473 | - "Failed to get unique processor _UID (0x%x)\n", | ||
2474 | - pr->acpi_id); | ||
2475 | + if (pr->acpi_id == 0xff) | ||
2476 | + dev_info_once(&device->dev, | ||
2477 | + "Entry not well-defined, consider updating BIOS\n"); | ||
2478 | + else | ||
2479 | + dev_err(&device->dev, | ||
2480 | + "Failed to get unique processor _UID (0x%x)\n", | ||
2481 | + pr->acpi_id); | ||
2482 | return -ENODEV; | ||
2483 | } | ||
2484 | |||
2485 | diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c | ||
2486 | index a66e00fe31fe..66205ec54555 100644 | ||
2487 | --- a/drivers/acpi/apei/ghes.c | ||
2488 | +++ b/drivers/acpi/apei/ghes.c | ||
2489 | @@ -153,6 +153,7 @@ static void ghes_unmap(void __iomem *vaddr, enum fixed_addresses fixmap_idx) | ||
2490 | int ghes_estatus_pool_init(int num_ghes) | ||
2491 | { | ||
2492 | unsigned long addr, len; | ||
2493 | + int rc; | ||
2494 | |||
2495 | ghes_estatus_pool = gen_pool_create(GHES_ESTATUS_POOL_MIN_ALLOC_ORDER, -1); | ||
2496 | if (!ghes_estatus_pool) | ||
2497 | @@ -164,7 +165,7 @@ int ghes_estatus_pool_init(int num_ghes) | ||
2498 | ghes_estatus_pool_size_request = PAGE_ALIGN(len); | ||
2499 | addr = (unsigned long)vmalloc(PAGE_ALIGN(len)); | ||
2500 | if (!addr) | ||
2501 | - return -ENOMEM; | ||
2502 | + goto err_pool_alloc; | ||
2503 | |||
2504 | /* | ||
2505 | * New allocation must be visible in all pgd before it can be found by | ||
2506 | @@ -172,7 +173,19 @@ int ghes_estatus_pool_init(int num_ghes) | ||
2507 | */ | ||
2508 | vmalloc_sync_all(); | ||
2509 | |||
2510 | - return gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1); | ||
2511 | + rc = gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1); | ||
2512 | + if (rc) | ||
2513 | + goto err_pool_add; | ||
2514 | + | ||
2515 | + return 0; | ||
2516 | + | ||
2517 | +err_pool_add: | ||
2518 | + vfree((void *)addr); | ||
2519 | + | ||
2520 | +err_pool_alloc: | ||
2521 | + gen_pool_destroy(ghes_estatus_pool); | ||
2522 | + | ||
2523 | + return -ENOMEM; | ||
2524 | } | ||
2525 | |||
2526 | static int map_gen_v2(struct ghes *ghes) | ||
2527 | diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c | ||
2528 | index 15f103d7532b..3b2525908dd8 100644 | ||
2529 | --- a/drivers/acpi/cppc_acpi.c | ||
2530 | +++ b/drivers/acpi/cppc_acpi.c | ||
2531 | @@ -365,8 +365,10 @@ static int acpi_get_psd(struct cpc_desc *cpc_ptr, acpi_handle handle) | ||
2532 | union acpi_object *psd = NULL; | ||
2533 | struct acpi_psd_package *pdomain; | ||
2534 | |||
2535 | - status = acpi_evaluate_object_typed(handle, "_PSD", NULL, &buffer, | ||
2536 | - ACPI_TYPE_PACKAGE); | ||
2537 | + status = acpi_evaluate_object_typed(handle, "_PSD", NULL, | ||
2538 | + &buffer, ACPI_TYPE_PACKAGE); | ||
2539 | + if (status == AE_NOT_FOUND) /* _PSD is optional */ | ||
2540 | + return 0; | ||
2541 | if (ACPI_FAILURE(status)) | ||
2542 | return -ENODEV; | ||
2543 | |||
2544 | diff --git a/drivers/acpi/custom_method.c b/drivers/acpi/custom_method.c | ||
2545 | index b2ef4c2ec955..fd66a736621c 100644 | ||
2546 | --- a/drivers/acpi/custom_method.c | ||
2547 | +++ b/drivers/acpi/custom_method.c | ||
2548 | @@ -49,8 +49,10 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf, | ||
2549 | if ((*ppos > max_size) || | ||
2550 | (*ppos + count > max_size) || | ||
2551 | (*ppos + count < count) || | ||
2552 | - (count > uncopied_bytes)) | ||
2553 | + (count > uncopied_bytes)) { | ||
2554 | + kfree(buf); | ||
2555 | return -EINVAL; | ||
2556 | + } | ||
2557 | |||
2558 | if (copy_from_user(buf + (*ppos), user_buf, count)) { | ||
2559 | kfree(buf); | ||
2560 | @@ -70,6 +72,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf, | ||
2561 | add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE); | ||
2562 | } | ||
2563 | |||
2564 | + kfree(buf); | ||
2565 | return count; | ||
2566 | } | ||
2567 | |||
2568 | diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c | ||
2569 | index d2549ae65e1b..dea8a60e18a4 100644 | ||
2570 | --- a/drivers/acpi/pci_irq.c | ||
2571 | +++ b/drivers/acpi/pci_irq.c | ||
2572 | @@ -449,8 +449,10 @@ int acpi_pci_irq_enable(struct pci_dev *dev) | ||
2573 | * No IRQ known to the ACPI subsystem - maybe the BIOS / | ||
2574 | * driver reported one, then use it. Exit in any case. | ||
2575 | */ | ||
2576 | - if (!acpi_pci_irq_valid(dev, pin)) | ||
2577 | + if (!acpi_pci_irq_valid(dev, pin)) { | ||
2578 | + kfree(entry); | ||
2579 | return 0; | ||
2580 | + } | ||
2581 | |||
2582 | if (acpi_isa_register_gsi(dev)) | ||
2583 | dev_warn(&dev->dev, "PCI INT %c: no GSI\n", | ||
2584 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c | ||
2585 | index f7652baa6337..3e63294304c7 100644 | ||
2586 | --- a/drivers/ata/ahci.c | ||
2587 | +++ b/drivers/ata/ahci.c | ||
2588 | @@ -65,6 +65,12 @@ enum board_ids { | ||
2589 | board_ahci_sb700, /* for SB700 and SB800 */ | ||
2590 | board_ahci_vt8251, | ||
2591 | |||
2592 | + /* | ||
2593 | + * board IDs for Intel chipsets that support more than 6 ports | ||
2594 | + * *and* end up needing the PCS quirk. | ||
2595 | + */ | ||
2596 | + board_ahci_pcs7, | ||
2597 | + | ||
2598 | /* aliases */ | ||
2599 | board_ahci_mcp_linux = board_ahci_mcp65, | ||
2600 | board_ahci_mcp67 = board_ahci_mcp65, | ||
2601 | @@ -220,6 +226,12 @@ static const struct ata_port_info ahci_port_info[] = { | ||
2602 | .udma_mask = ATA_UDMA6, | ||
2603 | .port_ops = &ahci_vt8251_ops, | ||
2604 | }, | ||
2605 | + [board_ahci_pcs7] = { | ||
2606 | + .flags = AHCI_FLAG_COMMON, | ||
2607 | + .pio_mask = ATA_PIO4, | ||
2608 | + .udma_mask = ATA_UDMA6, | ||
2609 | + .port_ops = &ahci_ops, | ||
2610 | + }, | ||
2611 | }; | ||
2612 | |||
2613 | static const struct pci_device_id ahci_pci_tbl[] = { | ||
2614 | @@ -264,26 +276,26 @@ static const struct pci_device_id ahci_pci_tbl[] = { | ||
2615 | { PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */ | ||
2616 | { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci_mobile }, /* PCH M RAID */ | ||
2617 | { PCI_VDEVICE(INTEL, 0x3b2f), board_ahci }, /* PCH AHCI */ | ||
2618 | - { PCI_VDEVICE(INTEL, 0x19b0), board_ahci }, /* DNV AHCI */ | ||
2619 | - { PCI_VDEVICE(INTEL, 0x19b1), board_ahci }, /* DNV AHCI */ | ||
2620 | - { PCI_VDEVICE(INTEL, 0x19b2), board_ahci }, /* DNV AHCI */ | ||
2621 | - { PCI_VDEVICE(INTEL, 0x19b3), board_ahci }, /* DNV AHCI */ | ||
2622 | - { PCI_VDEVICE(INTEL, 0x19b4), board_ahci }, /* DNV AHCI */ | ||
2623 | - { PCI_VDEVICE(INTEL, 0x19b5), board_ahci }, /* DNV AHCI */ | ||
2624 | - { PCI_VDEVICE(INTEL, 0x19b6), board_ahci }, /* DNV AHCI */ | ||
2625 | - { PCI_VDEVICE(INTEL, 0x19b7), board_ahci }, /* DNV AHCI */ | ||
2626 | - { PCI_VDEVICE(INTEL, 0x19bE), board_ahci }, /* DNV AHCI */ | ||
2627 | - { PCI_VDEVICE(INTEL, 0x19bF), board_ahci }, /* DNV AHCI */ | ||
2628 | - { PCI_VDEVICE(INTEL, 0x19c0), board_ahci }, /* DNV AHCI */ | ||
2629 | - { PCI_VDEVICE(INTEL, 0x19c1), board_ahci }, /* DNV AHCI */ | ||
2630 | - { PCI_VDEVICE(INTEL, 0x19c2), board_ahci }, /* DNV AHCI */ | ||
2631 | - { PCI_VDEVICE(INTEL, 0x19c3), board_ahci }, /* DNV AHCI */ | ||
2632 | - { PCI_VDEVICE(INTEL, 0x19c4), board_ahci }, /* DNV AHCI */ | ||
2633 | - { PCI_VDEVICE(INTEL, 0x19c5), board_ahci }, /* DNV AHCI */ | ||
2634 | - { PCI_VDEVICE(INTEL, 0x19c6), board_ahci }, /* DNV AHCI */ | ||
2635 | - { PCI_VDEVICE(INTEL, 0x19c7), board_ahci }, /* DNV AHCI */ | ||
2636 | - { PCI_VDEVICE(INTEL, 0x19cE), board_ahci }, /* DNV AHCI */ | ||
2637 | - { PCI_VDEVICE(INTEL, 0x19cF), board_ahci }, /* DNV AHCI */ | ||
2638 | + { PCI_VDEVICE(INTEL, 0x19b0), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2639 | + { PCI_VDEVICE(INTEL, 0x19b1), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2640 | + { PCI_VDEVICE(INTEL, 0x19b2), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2641 | + { PCI_VDEVICE(INTEL, 0x19b3), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2642 | + { PCI_VDEVICE(INTEL, 0x19b4), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2643 | + { PCI_VDEVICE(INTEL, 0x19b5), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2644 | + { PCI_VDEVICE(INTEL, 0x19b6), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2645 | + { PCI_VDEVICE(INTEL, 0x19b7), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2646 | + { PCI_VDEVICE(INTEL, 0x19bE), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2647 | + { PCI_VDEVICE(INTEL, 0x19bF), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2648 | + { PCI_VDEVICE(INTEL, 0x19c0), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2649 | + { PCI_VDEVICE(INTEL, 0x19c1), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2650 | + { PCI_VDEVICE(INTEL, 0x19c2), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2651 | + { PCI_VDEVICE(INTEL, 0x19c3), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2652 | + { PCI_VDEVICE(INTEL, 0x19c4), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2653 | + { PCI_VDEVICE(INTEL, 0x19c5), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2654 | + { PCI_VDEVICE(INTEL, 0x19c6), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2655 | + { PCI_VDEVICE(INTEL, 0x19c7), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2656 | + { PCI_VDEVICE(INTEL, 0x19cE), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2657 | + { PCI_VDEVICE(INTEL, 0x19cF), board_ahci_pcs7 }, /* DNV AHCI */ | ||
2658 | { PCI_VDEVICE(INTEL, 0x1c02), board_ahci }, /* CPT AHCI */ | ||
2659 | { PCI_VDEVICE(INTEL, 0x1c03), board_ahci_mobile }, /* CPT M AHCI */ | ||
2660 | { PCI_VDEVICE(INTEL, 0x1c04), board_ahci }, /* CPT RAID */ | ||
2661 | @@ -623,30 +635,6 @@ static void ahci_pci_save_initial_config(struct pci_dev *pdev, | ||
2662 | ahci_save_initial_config(&pdev->dev, hpriv); | ||
2663 | } | ||
2664 | |||
2665 | -static int ahci_pci_reset_controller(struct ata_host *host) | ||
2666 | -{ | ||
2667 | - struct pci_dev *pdev = to_pci_dev(host->dev); | ||
2668 | - int rc; | ||
2669 | - | ||
2670 | - rc = ahci_reset_controller(host); | ||
2671 | - if (rc) | ||
2672 | - return rc; | ||
2673 | - | ||
2674 | - if (pdev->vendor == PCI_VENDOR_ID_INTEL) { | ||
2675 | - struct ahci_host_priv *hpriv = host->private_data; | ||
2676 | - u16 tmp16; | ||
2677 | - | ||
2678 | - /* configure PCS */ | ||
2679 | - pci_read_config_word(pdev, 0x92, &tmp16); | ||
2680 | - if ((tmp16 & hpriv->port_map) != hpriv->port_map) { | ||
2681 | - tmp16 |= hpriv->port_map; | ||
2682 | - pci_write_config_word(pdev, 0x92, tmp16); | ||
2683 | - } | ||
2684 | - } | ||
2685 | - | ||
2686 | - return 0; | ||
2687 | -} | ||
2688 | - | ||
2689 | static void ahci_pci_init_controller(struct ata_host *host) | ||
2690 | { | ||
2691 | struct ahci_host_priv *hpriv = host->private_data; | ||
2692 | @@ -849,7 +837,7 @@ static int ahci_pci_device_runtime_resume(struct device *dev) | ||
2693 | struct ata_host *host = pci_get_drvdata(pdev); | ||
2694 | int rc; | ||
2695 | |||
2696 | - rc = ahci_pci_reset_controller(host); | ||
2697 | + rc = ahci_reset_controller(host); | ||
2698 | if (rc) | ||
2699 | return rc; | ||
2700 | ahci_pci_init_controller(host); | ||
2701 | @@ -884,7 +872,7 @@ static int ahci_pci_device_resume(struct device *dev) | ||
2702 | ahci_mcp89_apple_enable(pdev); | ||
2703 | |||
2704 | if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) { | ||
2705 | - rc = ahci_pci_reset_controller(host); | ||
2706 | + rc = ahci_reset_controller(host); | ||
2707 | if (rc) | ||
2708 | return rc; | ||
2709 | |||
2710 | @@ -1619,6 +1607,34 @@ update_policy: | ||
2711 | ap->target_lpm_policy = policy; | ||
2712 | } | ||
2713 | |||
2714 | +static void ahci_intel_pcs_quirk(struct pci_dev *pdev, struct ahci_host_priv *hpriv) | ||
2715 | +{ | ||
2716 | + const struct pci_device_id *id = pci_match_id(ahci_pci_tbl, pdev); | ||
2717 | + u16 tmp16; | ||
2718 | + | ||
2719 | + /* | ||
2720 | + * Only apply the 6-port PCS quirk for known legacy platforms. | ||
2721 | + */ | ||
2722 | + if (!id || id->vendor != PCI_VENDOR_ID_INTEL) | ||
2723 | + return; | ||
2724 | + if (((enum board_ids) id->driver_data) < board_ahci_pcs7) | ||
2725 | + return; | ||
2726 | + | ||
2727 | + /* | ||
2728 | + * port_map is determined from PORTS_IMPL PCI register which is | ||
2729 | + * implemented as write or write-once register. If the register | ||
2730 | + * isn't programmed, ahci automatically generates it from number | ||
2731 | + * of ports, which is good enough for PCS programming. It is | ||
2732 | + * otherwise expected that platform firmware enables the ports | ||
2733 | + * before the OS boots. | ||
2734 | + */ | ||
2735 | + pci_read_config_word(pdev, PCS_6, &tmp16); | ||
2736 | + if ((tmp16 & hpriv->port_map) != hpriv->port_map) { | ||
2737 | + tmp16 |= hpriv->port_map; | ||
2738 | + pci_write_config_word(pdev, PCS_6, tmp16); | ||
2739 | + } | ||
2740 | +} | ||
2741 | + | ||
2742 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
2743 | { | ||
2744 | unsigned int board_id = ent->driver_data; | ||
2745 | @@ -1731,6 +1747,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
2746 | /* save initial config */ | ||
2747 | ahci_pci_save_initial_config(pdev, hpriv); | ||
2748 | |||
2749 | + /* | ||
2750 | + * If platform firmware failed to enable ports, try to enable | ||
2751 | + * them here. | ||
2752 | + */ | ||
2753 | + ahci_intel_pcs_quirk(pdev, hpriv); | ||
2754 | + | ||
2755 | /* prepare host */ | ||
2756 | if (hpriv->cap & HOST_CAP_NCQ) { | ||
2757 | pi.flags |= ATA_FLAG_NCQ; | ||
2758 | @@ -1840,7 +1862,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
2759 | if (rc) | ||
2760 | return rc; | ||
2761 | |||
2762 | - rc = ahci_pci_reset_controller(host); | ||
2763 | + rc = ahci_reset_controller(host); | ||
2764 | if (rc) | ||
2765 | return rc; | ||
2766 | |||
2767 | diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h | ||
2768 | index 0570629d719d..3dbf398c92ea 100644 | ||
2769 | --- a/drivers/ata/ahci.h | ||
2770 | +++ b/drivers/ata/ahci.h | ||
2771 | @@ -247,6 +247,8 @@ enum { | ||
2772 | ATA_FLAG_ACPI_SATA | ATA_FLAG_AN, | ||
2773 | |||
2774 | ICH_MAP = 0x90, /* ICH MAP register */ | ||
2775 | + PCS_6 = 0x92, /* 6 port PCS */ | ||
2776 | + PCS_7 = 0x94, /* 7+ port PCS (Denverton) */ | ||
2777 | |||
2778 | /* em constants */ | ||
2779 | EM_MAX_SLOTS = 8, | ||
2780 | diff --git a/drivers/base/soc.c b/drivers/base/soc.c | ||
2781 | index 10b280f30217..7e91894a380b 100644 | ||
2782 | --- a/drivers/base/soc.c | ||
2783 | +++ b/drivers/base/soc.c | ||
2784 | @@ -157,6 +157,7 @@ out2: | ||
2785 | out1: | ||
2786 | return ERR_PTR(ret); | ||
2787 | } | ||
2788 | +EXPORT_SYMBOL_GPL(soc_device_register); | ||
2789 | |||
2790 | /* Ensure soc_dev->attr is freed prior to calling soc_device_unregister. */ | ||
2791 | void soc_device_unregister(struct soc_device *soc_dev) | ||
2792 | @@ -166,6 +167,7 @@ void soc_device_unregister(struct soc_device *soc_dev) | ||
2793 | device_unregister(&soc_dev->dev); | ||
2794 | early_soc_dev_attr = NULL; | ||
2795 | } | ||
2796 | +EXPORT_SYMBOL_GPL(soc_device_unregister); | ||
2797 | |||
2798 | static int __init soc_bus_register(void) | ||
2799 | { | ||
2800 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c | ||
2801 | index ab7ca5989097..1410fa893653 100644 | ||
2802 | --- a/drivers/block/loop.c | ||
2803 | +++ b/drivers/block/loop.c | ||
2804 | @@ -1755,6 +1755,7 @@ static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode, | ||
2805 | case LOOP_SET_FD: | ||
2806 | case LOOP_CHANGE_FD: | ||
2807 | case LOOP_SET_BLOCK_SIZE: | ||
2808 | + case LOOP_SET_DIRECT_IO: | ||
2809 | err = lo_ioctl(bdev, mode, cmd, arg); | ||
2810 | break; | ||
2811 | default: | ||
2812 | diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c | ||
2813 | index e21d2ded732b..a69a90ad9208 100644 | ||
2814 | --- a/drivers/block/nbd.c | ||
2815 | +++ b/drivers/block/nbd.c | ||
2816 | @@ -357,8 +357,10 @@ static enum blk_eh_timer_return nbd_xmit_timeout(struct request *req, | ||
2817 | } | ||
2818 | config = nbd->config; | ||
2819 | |||
2820 | - if (!mutex_trylock(&cmd->lock)) | ||
2821 | + if (!mutex_trylock(&cmd->lock)) { | ||
2822 | + nbd_config_put(nbd); | ||
2823 | return BLK_EH_RESET_TIMER; | ||
2824 | + } | ||
2825 | |||
2826 | if (config->num_connections > 1) { | ||
2827 | dev_err_ratelimited(nbd_to_dev(nbd), | ||
2828 | diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c | ||
2829 | index 9044d31ab1a1..8d53b8ef545c 100644 | ||
2830 | --- a/drivers/char/hw_random/core.c | ||
2831 | +++ b/drivers/char/hw_random/core.c | ||
2832 | @@ -67,7 +67,7 @@ static void add_early_randomness(struct hwrng *rng) | ||
2833 | size_t size = min_t(size_t, 16, rng_buffer_size()); | ||
2834 | |||
2835 | mutex_lock(&reading_mutex); | ||
2836 | - bytes_read = rng_get_data(rng, rng_buffer, size, 1); | ||
2837 | + bytes_read = rng_get_data(rng, rng_buffer, size, 0); | ||
2838 | mutex_unlock(&reading_mutex); | ||
2839 | if (bytes_read > 0) | ||
2840 | add_device_randomness(rng_buffer, bytes_read); | ||
2841 | diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c | ||
2842 | index 6707659cffd6..44bd3dda01c2 100644 | ||
2843 | --- a/drivers/char/ipmi/ipmi_msghandler.c | ||
2844 | +++ b/drivers/char/ipmi/ipmi_msghandler.c | ||
2845 | @@ -4215,7 +4215,53 @@ static int handle_one_recv_msg(struct ipmi_smi *intf, | ||
2846 | int chan; | ||
2847 | |||
2848 | ipmi_debug_msg("Recv:", msg->rsp, msg->rsp_size); | ||
2849 | - if (msg->rsp_size < 2) { | ||
2850 | + | ||
2851 | + if ((msg->data_size >= 2) | ||
2852 | + && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) | ||
2853 | + && (msg->data[1] == IPMI_SEND_MSG_CMD) | ||
2854 | + && (msg->user_data == NULL)) { | ||
2855 | + | ||
2856 | + if (intf->in_shutdown) | ||
2857 | + goto free_msg; | ||
2858 | + | ||
2859 | + /* | ||
2860 | + * This is the local response to a command send, start | ||
2861 | + * the timer for these. The user_data will not be | ||
2862 | + * NULL if this is a response send, and we will let | ||
2863 | + * response sends just go through. | ||
2864 | + */ | ||
2865 | + | ||
2866 | + /* | ||
2867 | + * Check for errors, if we get certain errors (ones | ||
2868 | + * that mean basically we can try again later), we | ||
2869 | + * ignore them and start the timer. Otherwise we | ||
2870 | + * report the error immediately. | ||
2871 | + */ | ||
2872 | + if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) | ||
2873 | + && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) | ||
2874 | + && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) | ||
2875 | + && (msg->rsp[2] != IPMI_BUS_ERR) | ||
2876 | + && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) { | ||
2877 | + int ch = msg->rsp[3] & 0xf; | ||
2878 | + struct ipmi_channel *chans; | ||
2879 | + | ||
2880 | + /* Got an error sending the message, handle it. */ | ||
2881 | + | ||
2882 | + chans = READ_ONCE(intf->channel_list)->c; | ||
2883 | + if ((chans[ch].medium == IPMI_CHANNEL_MEDIUM_8023LAN) | ||
2884 | + || (chans[ch].medium == IPMI_CHANNEL_MEDIUM_ASYNC)) | ||
2885 | + ipmi_inc_stat(intf, sent_lan_command_errs); | ||
2886 | + else | ||
2887 | + ipmi_inc_stat(intf, sent_ipmb_command_errs); | ||
2888 | + intf_err_seq(intf, msg->msgid, msg->rsp[2]); | ||
2889 | + } else | ||
2890 | + /* The message was sent, start the timer. */ | ||
2891 | + intf_start_seq_timer(intf, msg->msgid); | ||
2892 | +free_msg: | ||
2893 | + requeue = 0; | ||
2894 | + goto out; | ||
2895 | + | ||
2896 | + } else if (msg->rsp_size < 2) { | ||
2897 | /* Message is too small to be correct. */ | ||
2898 | dev_warn(intf->si_dev, | ||
2899 | "BMC returned too small a message for netfn %x cmd %x, got %d bytes\n", | ||
2900 | @@ -4472,62 +4518,16 @@ void ipmi_smi_msg_received(struct ipmi_smi *intf, | ||
2901 | unsigned long flags = 0; /* keep us warning-free. */ | ||
2902 | int run_to_completion = intf->run_to_completion; | ||
2903 | |||
2904 | - if ((msg->data_size >= 2) | ||
2905 | - && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) | ||
2906 | - && (msg->data[1] == IPMI_SEND_MSG_CMD) | ||
2907 | - && (msg->user_data == NULL)) { | ||
2908 | - | ||
2909 | - if (intf->in_shutdown) | ||
2910 | - goto free_msg; | ||
2911 | - | ||
2912 | - /* | ||
2913 | - * This is the local response to a command send, start | ||
2914 | - * the timer for these. The user_data will not be | ||
2915 | - * NULL if this is a response send, and we will let | ||
2916 | - * response sends just go through. | ||
2917 | - */ | ||
2918 | - | ||
2919 | - /* | ||
2920 | - * Check for errors, if we get certain errors (ones | ||
2921 | - * that mean basically we can try again later), we | ||
2922 | - * ignore them and start the timer. Otherwise we | ||
2923 | - * report the error immediately. | ||
2924 | - */ | ||
2925 | - if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) | ||
2926 | - && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) | ||
2927 | - && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) | ||
2928 | - && (msg->rsp[2] != IPMI_BUS_ERR) | ||
2929 | - && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) { | ||
2930 | - int ch = msg->rsp[3] & 0xf; | ||
2931 | - struct ipmi_channel *chans; | ||
2932 | - | ||
2933 | - /* Got an error sending the message, handle it. */ | ||
2934 | - | ||
2935 | - chans = READ_ONCE(intf->channel_list)->c; | ||
2936 | - if ((chans[ch].medium == IPMI_CHANNEL_MEDIUM_8023LAN) | ||
2937 | - || (chans[ch].medium == IPMI_CHANNEL_MEDIUM_ASYNC)) | ||
2938 | - ipmi_inc_stat(intf, sent_lan_command_errs); | ||
2939 | - else | ||
2940 | - ipmi_inc_stat(intf, sent_ipmb_command_errs); | ||
2941 | - intf_err_seq(intf, msg->msgid, msg->rsp[2]); | ||
2942 | - } else | ||
2943 | - /* The message was sent, start the timer. */ | ||
2944 | - intf_start_seq_timer(intf, msg->msgid); | ||
2945 | - | ||
2946 | -free_msg: | ||
2947 | - ipmi_free_smi_msg(msg); | ||
2948 | - } else { | ||
2949 | - /* | ||
2950 | - * To preserve message order, we keep a queue and deliver from | ||
2951 | - * a tasklet. | ||
2952 | - */ | ||
2953 | - if (!run_to_completion) | ||
2954 | - spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); | ||
2955 | - list_add_tail(&msg->link, &intf->waiting_rcv_msgs); | ||
2956 | - if (!run_to_completion) | ||
2957 | - spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, | ||
2958 | - flags); | ||
2959 | - } | ||
2960 | + /* | ||
2961 | + * To preserve message order, we keep a queue and deliver from | ||
2962 | + * a tasklet. | ||
2963 | + */ | ||
2964 | + if (!run_to_completion) | ||
2965 | + spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); | ||
2966 | + list_add_tail(&msg->link, &intf->waiting_rcv_msgs); | ||
2967 | + if (!run_to_completion) | ||
2968 | + spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, | ||
2969 | + flags); | ||
2970 | |||
2971 | if (!run_to_completion) | ||
2972 | spin_lock_irqsave(&intf->xmit_msgs_lock, flags); | ||
2973 | diff --git a/drivers/char/mem.c b/drivers/char/mem.c | ||
2974 | index b08dc50f9f26..9eb564c002f6 100644 | ||
2975 | --- a/drivers/char/mem.c | ||
2976 | +++ b/drivers/char/mem.c | ||
2977 | @@ -97,6 +97,13 @@ void __weak unxlate_dev_mem_ptr(phys_addr_t phys, void *addr) | ||
2978 | } | ||
2979 | #endif | ||
2980 | |||
2981 | +static inline bool should_stop_iteration(void) | ||
2982 | +{ | ||
2983 | + if (need_resched()) | ||
2984 | + cond_resched(); | ||
2985 | + return fatal_signal_pending(current); | ||
2986 | +} | ||
2987 | + | ||
2988 | /* | ||
2989 | * This funcion reads the *physical* memory. The f_pos points directly to the | ||
2990 | * memory location. | ||
2991 | @@ -175,6 +182,8 @@ static ssize_t read_mem(struct file *file, char __user *buf, | ||
2992 | p += sz; | ||
2993 | count -= sz; | ||
2994 | read += sz; | ||
2995 | + if (should_stop_iteration()) | ||
2996 | + break; | ||
2997 | } | ||
2998 | kfree(bounce); | ||
2999 | |||
3000 | @@ -251,6 +260,8 @@ static ssize_t write_mem(struct file *file, const char __user *buf, | ||
3001 | p += sz; | ||
3002 | count -= sz; | ||
3003 | written += sz; | ||
3004 | + if (should_stop_iteration()) | ||
3005 | + break; | ||
3006 | } | ||
3007 | |||
3008 | *ppos += written; | ||
3009 | @@ -468,6 +479,10 @@ static ssize_t read_kmem(struct file *file, char __user *buf, | ||
3010 | read += sz; | ||
3011 | low_count -= sz; | ||
3012 | count -= sz; | ||
3013 | + if (should_stop_iteration()) { | ||
3014 | + count = 0; | ||
3015 | + break; | ||
3016 | + } | ||
3017 | } | ||
3018 | } | ||
3019 | |||
3020 | @@ -492,6 +507,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf, | ||
3021 | buf += sz; | ||
3022 | read += sz; | ||
3023 | p += sz; | ||
3024 | + if (should_stop_iteration()) | ||
3025 | + break; | ||
3026 | } | ||
3027 | free_page((unsigned long)kbuf); | ||
3028 | } | ||
3029 | @@ -544,6 +561,8 @@ static ssize_t do_write_kmem(unsigned long p, const char __user *buf, | ||
3030 | p += sz; | ||
3031 | count -= sz; | ||
3032 | written += sz; | ||
3033 | + if (should_stop_iteration()) | ||
3034 | + break; | ||
3035 | } | ||
3036 | |||
3037 | *ppos += written; | ||
3038 | @@ -595,6 +614,8 @@ static ssize_t write_kmem(struct file *file, const char __user *buf, | ||
3039 | buf += sz; | ||
3040 | virtr += sz; | ||
3041 | p += sz; | ||
3042 | + if (should_stop_iteration()) | ||
3043 | + break; | ||
3044 | } | ||
3045 | free_page((unsigned long)kbuf); | ||
3046 | } | ||
3047 | diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c | ||
3048 | index 1b4f95c13e00..d7a3888ad80f 100644 | ||
3049 | --- a/drivers/char/tpm/tpm-interface.c | ||
3050 | +++ b/drivers/char/tpm/tpm-interface.c | ||
3051 | @@ -320,18 +320,22 @@ int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, | ||
3052 | if (!chip) | ||
3053 | return -ENODEV; | ||
3054 | |||
3055 | - for (i = 0; i < chip->nr_allocated_banks; i++) | ||
3056 | - if (digests[i].alg_id != chip->allocated_banks[i].alg_id) | ||
3057 | - return -EINVAL; | ||
3058 | + for (i = 0; i < chip->nr_allocated_banks; i++) { | ||
3059 | + if (digests[i].alg_id != chip->allocated_banks[i].alg_id) { | ||
3060 | + rc = EINVAL; | ||
3061 | + goto out; | ||
3062 | + } | ||
3063 | + } | ||
3064 | |||
3065 | if (chip->flags & TPM_CHIP_FLAG_TPM2) { | ||
3066 | rc = tpm2_pcr_extend(chip, pcr_idx, digests); | ||
3067 | - tpm_put_ops(chip); | ||
3068 | - return rc; | ||
3069 | + goto out; | ||
3070 | } | ||
3071 | |||
3072 | rc = tpm1_pcr_extend(chip, pcr_idx, digests[0].digest, | ||
3073 | "attempting extend a PCR value"); | ||
3074 | + | ||
3075 | +out: | ||
3076 | tpm_put_ops(chip); | ||
3077 | return rc; | ||
3078 | } | ||
3079 | @@ -354,14 +358,9 @@ int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen) | ||
3080 | if (!chip) | ||
3081 | return -ENODEV; | ||
3082 | |||
3083 | - rc = tpm_buf_init(&buf, 0, 0); | ||
3084 | - if (rc) | ||
3085 | - goto out; | ||
3086 | - | ||
3087 | - memcpy(buf.data, cmd, buflen); | ||
3088 | + buf.data = cmd; | ||
3089 | rc = tpm_transmit_cmd(chip, &buf, 0, "attempting to a send a command"); | ||
3090 | - tpm_buf_destroy(&buf); | ||
3091 | -out: | ||
3092 | + | ||
3093 | tpm_put_ops(chip); | ||
3094 | return rc; | ||
3095 | } | ||
3096 | diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c | ||
3097 | index c3181ea9f271..270f43acbb77 100644 | ||
3098 | --- a/drivers/char/tpm/tpm_tis_core.c | ||
3099 | +++ b/drivers/char/tpm/tpm_tis_core.c | ||
3100 | @@ -980,6 +980,8 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, | ||
3101 | goto out_err; | ||
3102 | } | ||
3103 | |||
3104 | + tpm_chip_start(chip); | ||
3105 | + chip->flags |= TPM_CHIP_FLAG_IRQ; | ||
3106 | if (irq) { | ||
3107 | tpm_tis_probe_irq_single(chip, intmask, IRQF_SHARED, | ||
3108 | irq); | ||
3109 | @@ -989,6 +991,7 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, | ||
3110 | } else { | ||
3111 | tpm_tis_probe_irq(chip, intmask); | ||
3112 | } | ||
3113 | + tpm_chip_stop(chip); | ||
3114 | } | ||
3115 | |||
3116 | rc = tpm_chip_register(chip); | ||
3117 | diff --git a/drivers/cpufreq/armada-8k-cpufreq.c b/drivers/cpufreq/armada-8k-cpufreq.c | ||
3118 | index 988ebc326bdb..39e34f5066d3 100644 | ||
3119 | --- a/drivers/cpufreq/armada-8k-cpufreq.c | ||
3120 | +++ b/drivers/cpufreq/armada-8k-cpufreq.c | ||
3121 | @@ -136,6 +136,8 @@ static int __init armada_8k_cpufreq_init(void) | ||
3122 | |||
3123 | nb_cpus = num_possible_cpus(); | ||
3124 | freq_tables = kcalloc(nb_cpus, sizeof(*freq_tables), GFP_KERNEL); | ||
3125 | + if (!freq_tables) | ||
3126 | + return -ENOMEM; | ||
3127 | cpumask_copy(&cpus, cpu_possible_mask); | ||
3128 | |||
3129 | /* | ||
3130 | diff --git a/drivers/cpufreq/imx-cpufreq-dt.c b/drivers/cpufreq/imx-cpufreq-dt.c | ||
3131 | index 4f85f3112784..35db14cf3102 100644 | ||
3132 | --- a/drivers/cpufreq/imx-cpufreq-dt.c | ||
3133 | +++ b/drivers/cpufreq/imx-cpufreq-dt.c | ||
3134 | @@ -16,6 +16,7 @@ | ||
3135 | |||
3136 | #define OCOTP_CFG3_SPEED_GRADE_SHIFT 8 | ||
3137 | #define OCOTP_CFG3_SPEED_GRADE_MASK (0x3 << 8) | ||
3138 | +#define IMX8MN_OCOTP_CFG3_SPEED_GRADE_MASK (0xf << 8) | ||
3139 | #define OCOTP_CFG3_MKT_SEGMENT_SHIFT 6 | ||
3140 | #define OCOTP_CFG3_MKT_SEGMENT_MASK (0x3 << 6) | ||
3141 | |||
3142 | @@ -34,7 +35,12 @@ static int imx_cpufreq_dt_probe(struct platform_device *pdev) | ||
3143 | if (ret) | ||
3144 | return ret; | ||
3145 | |||
3146 | - speed_grade = (cell_value & OCOTP_CFG3_SPEED_GRADE_MASK) >> OCOTP_CFG3_SPEED_GRADE_SHIFT; | ||
3147 | + if (of_machine_is_compatible("fsl,imx8mn")) | ||
3148 | + speed_grade = (cell_value & IMX8MN_OCOTP_CFG3_SPEED_GRADE_MASK) | ||
3149 | + >> OCOTP_CFG3_SPEED_GRADE_SHIFT; | ||
3150 | + else | ||
3151 | + speed_grade = (cell_value & OCOTP_CFG3_SPEED_GRADE_MASK) | ||
3152 | + >> OCOTP_CFG3_SPEED_GRADE_SHIFT; | ||
3153 | mkt_segment = (cell_value & OCOTP_CFG3_MKT_SEGMENT_MASK) >> OCOTP_CFG3_MKT_SEGMENT_SHIFT; | ||
3154 | |||
3155 | /* | ||
3156 | diff --git a/drivers/cpuidle/governors/teo.c b/drivers/cpuidle/governors/teo.c | ||
3157 | index 7d05efdbd3c6..12d9e6cecf1d 100644 | ||
3158 | --- a/drivers/cpuidle/governors/teo.c | ||
3159 | +++ b/drivers/cpuidle/governors/teo.c | ||
3160 | @@ -242,7 +242,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, | ||
3161 | struct teo_cpu *cpu_data = per_cpu_ptr(&teo_cpus, dev->cpu); | ||
3162 | int latency_req = cpuidle_governor_latency_req(dev->cpu); | ||
3163 | unsigned int duration_us, count; | ||
3164 | - int max_early_idx, idx, i; | ||
3165 | + int max_early_idx, constraint_idx, idx, i; | ||
3166 | ktime_t delta_tick; | ||
3167 | |||
3168 | if (cpu_data->last_state >= 0) { | ||
3169 | @@ -257,6 +257,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, | ||
3170 | |||
3171 | count = 0; | ||
3172 | max_early_idx = -1; | ||
3173 | + constraint_idx = drv->state_count; | ||
3174 | idx = -1; | ||
3175 | |||
3176 | for (i = 0; i < drv->state_count; i++) { | ||
3177 | @@ -286,16 +287,8 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, | ||
3178 | if (s->target_residency > duration_us) | ||
3179 | break; | ||
3180 | |||
3181 | - if (s->exit_latency > latency_req) { | ||
3182 | - /* | ||
3183 | - * If we break out of the loop for latency reasons, use | ||
3184 | - * the target residency of the selected state as the | ||
3185 | - * expected idle duration to avoid stopping the tick | ||
3186 | - * as long as that target residency is low enough. | ||
3187 | - */ | ||
3188 | - duration_us = drv->states[idx].target_residency; | ||
3189 | - goto refine; | ||
3190 | - } | ||
3191 | + if (s->exit_latency > latency_req && constraint_idx > i) | ||
3192 | + constraint_idx = i; | ||
3193 | |||
3194 | idx = i; | ||
3195 | |||
3196 | @@ -321,7 +314,13 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, | ||
3197 | duration_us = drv->states[idx].target_residency; | ||
3198 | } | ||
3199 | |||
3200 | -refine: | ||
3201 | + /* | ||
3202 | + * If there is a latency constraint, it may be necessary to use a | ||
3203 | + * shallower idle state than the one selected so far. | ||
3204 | + */ | ||
3205 | + if (constraint_idx < idx) | ||
3206 | + idx = constraint_idx; | ||
3207 | + | ||
3208 | if (idx < 0) { | ||
3209 | idx = 0; /* No states enabled. Must use 0. */ | ||
3210 | } else if (idx > 0) { | ||
3211 | @@ -331,13 +330,12 @@ refine: | ||
3212 | |||
3213 | /* | ||
3214 | * Count and sum the most recent idle duration values less than | ||
3215 | - * the target residency of the state selected so far, find the | ||
3216 | - * max. | ||
3217 | + * the current expected idle duration value. | ||
3218 | */ | ||
3219 | for (i = 0; i < INTERVALS; i++) { | ||
3220 | unsigned int val = cpu_data->intervals[i]; | ||
3221 | |||
3222 | - if (val >= drv->states[idx].target_residency) | ||
3223 | + if (val >= duration_us) | ||
3224 | continue; | ||
3225 | |||
3226 | count++; | ||
3227 | @@ -356,8 +354,10 @@ refine: | ||
3228 | * would be too shallow. | ||
3229 | */ | ||
3230 | if (!(tick_nohz_tick_stopped() && avg_us < TICK_USEC)) { | ||
3231 | - idx = teo_find_shallower_state(drv, dev, idx, avg_us); | ||
3232 | duration_us = avg_us; | ||
3233 | + if (drv->states[idx].target_residency > avg_us) | ||
3234 | + idx = teo_find_shallower_state(drv, dev, | ||
3235 | + idx, avg_us); | ||
3236 | } | ||
3237 | } | ||
3238 | } | ||
3239 | diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c | ||
3240 | index ab22bf8a12d6..a0e19802149f 100644 | ||
3241 | --- a/drivers/devfreq/devfreq.c | ||
3242 | +++ b/drivers/devfreq/devfreq.c | ||
3243 | @@ -254,7 +254,7 @@ static struct devfreq_governor *try_then_request_governor(const char *name) | ||
3244 | /* Restore previous state before return */ | ||
3245 | mutex_lock(&devfreq_list_lock); | ||
3246 | if (err) | ||
3247 | - return ERR_PTR(err); | ||
3248 | + return (err < 0) ? ERR_PTR(err) : ERR_PTR(-EINVAL); | ||
3249 | |||
3250 | governor = find_devfreq_governor(name); | ||
3251 | } | ||
3252 | diff --git a/drivers/devfreq/exynos-bus.c b/drivers/devfreq/exynos-bus.c | ||
3253 | index d9f377912c10..7c06df8bd74f 100644 | ||
3254 | --- a/drivers/devfreq/exynos-bus.c | ||
3255 | +++ b/drivers/devfreq/exynos-bus.c | ||
3256 | @@ -191,11 +191,10 @@ static void exynos_bus_exit(struct device *dev) | ||
3257 | if (ret < 0) | ||
3258 | dev_warn(dev, "failed to disable the devfreq-event devices\n"); | ||
3259 | |||
3260 | - if (bus->regulator) | ||
3261 | - regulator_disable(bus->regulator); | ||
3262 | - | ||
3263 | dev_pm_opp_of_remove_table(dev); | ||
3264 | clk_disable_unprepare(bus->clk); | ||
3265 | + if (bus->regulator) | ||
3266 | + regulator_disable(bus->regulator); | ||
3267 | } | ||
3268 | |||
3269 | /* | ||
3270 | @@ -383,6 +382,7 @@ static int exynos_bus_probe(struct platform_device *pdev) | ||
3271 | struct exynos_bus *bus; | ||
3272 | int ret, max_state; | ||
3273 | unsigned long min_freq, max_freq; | ||
3274 | + bool passive = false; | ||
3275 | |||
3276 | if (!np) { | ||
3277 | dev_err(dev, "failed to find devicetree node\n"); | ||
3278 | @@ -396,27 +396,27 @@ static int exynos_bus_probe(struct platform_device *pdev) | ||
3279 | bus->dev = &pdev->dev; | ||
3280 | platform_set_drvdata(pdev, bus); | ||
3281 | |||
3282 | - /* Parse the device-tree to get the resource information */ | ||
3283 | - ret = exynos_bus_parse_of(np, bus); | ||
3284 | - if (ret < 0) | ||
3285 | - return ret; | ||
3286 | - | ||
3287 | profile = devm_kzalloc(dev, sizeof(*profile), GFP_KERNEL); | ||
3288 | - if (!profile) { | ||
3289 | - ret = -ENOMEM; | ||
3290 | - goto err; | ||
3291 | - } | ||
3292 | + if (!profile) | ||
3293 | + return -ENOMEM; | ||
3294 | |||
3295 | node = of_parse_phandle(dev->of_node, "devfreq", 0); | ||
3296 | if (node) { | ||
3297 | of_node_put(node); | ||
3298 | - goto passive; | ||
3299 | + passive = true; | ||
3300 | } else { | ||
3301 | ret = exynos_bus_parent_parse_of(np, bus); | ||
3302 | + if (ret < 0) | ||
3303 | + return ret; | ||
3304 | } | ||
3305 | |||
3306 | + /* Parse the device-tree to get the resource information */ | ||
3307 | + ret = exynos_bus_parse_of(np, bus); | ||
3308 | if (ret < 0) | ||
3309 | - goto err; | ||
3310 | + goto err_reg; | ||
3311 | + | ||
3312 | + if (passive) | ||
3313 | + goto passive; | ||
3314 | |||
3315 | /* Initialize the struct profile and governor data for parent device */ | ||
3316 | profile->polling_ms = 50; | ||
3317 | @@ -507,6 +507,9 @@ out: | ||
3318 | err: | ||
3319 | dev_pm_opp_of_remove_table(dev); | ||
3320 | clk_disable_unprepare(bus->clk); | ||
3321 | +err_reg: | ||
3322 | + if (!passive) | ||
3323 | + regulator_disable(bus->regulator); | ||
3324 | |||
3325 | return ret; | ||
3326 | } | ||
3327 | diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c | ||
3328 | index 58308948b863..be6eeab9c814 100644 | ||
3329 | --- a/drivers/devfreq/governor_passive.c | ||
3330 | +++ b/drivers/devfreq/governor_passive.c | ||
3331 | @@ -149,7 +149,6 @@ static int devfreq_passive_notifier_call(struct notifier_block *nb, | ||
3332 | static int devfreq_passive_event_handler(struct devfreq *devfreq, | ||
3333 | unsigned int event, void *data) | ||
3334 | { | ||
3335 | - struct device *dev = devfreq->dev.parent; | ||
3336 | struct devfreq_passive_data *p_data | ||
3337 | = (struct devfreq_passive_data *)devfreq->data; | ||
3338 | struct devfreq *parent = (struct devfreq *)p_data->parent; | ||
3339 | @@ -165,12 +164,12 @@ static int devfreq_passive_event_handler(struct devfreq *devfreq, | ||
3340 | p_data->this = devfreq; | ||
3341 | |||
3342 | nb->notifier_call = devfreq_passive_notifier_call; | ||
3343 | - ret = devm_devfreq_register_notifier(dev, parent, nb, | ||
3344 | + ret = devfreq_register_notifier(parent, nb, | ||
3345 | DEVFREQ_TRANSITION_NOTIFIER); | ||
3346 | break; | ||
3347 | case DEVFREQ_GOV_STOP: | ||
3348 | - devm_devfreq_unregister_notifier(dev, parent, nb, | ||
3349 | - DEVFREQ_TRANSITION_NOTIFIER); | ||
3350 | + WARN_ON(devfreq_unregister_notifier(parent, nb, | ||
3351 | + DEVFREQ_TRANSITION_NOTIFIER)); | ||
3352 | break; | ||
3353 | default: | ||
3354 | break; | ||
3355 | diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c | ||
3356 | index 8101ff2f05c1..970f654611bd 100644 | ||
3357 | --- a/drivers/dma/bcm2835-dma.c | ||
3358 | +++ b/drivers/dma/bcm2835-dma.c | ||
3359 | @@ -871,8 +871,10 @@ static int bcm2835_dma_probe(struct platform_device *pdev) | ||
3360 | pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; | ||
3361 | |||
3362 | rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); | ||
3363 | - if (rc) | ||
3364 | + if (rc) { | ||
3365 | + dev_err(&pdev->dev, "Unable to set DMA mask\n"); | ||
3366 | return rc; | ||
3367 | + } | ||
3368 | |||
3369 | od = devm_kzalloc(&pdev->dev, sizeof(*od), GFP_KERNEL); | ||
3370 | if (!od) | ||
3371 | diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c | ||
3372 | index c6c0143670d9..a776857d89c8 100644 | ||
3373 | --- a/drivers/dma/iop-adma.c | ||
3374 | +++ b/drivers/dma/iop-adma.c | ||
3375 | @@ -116,9 +116,9 @@ static void __iop_adma_slot_cleanup(struct iop_adma_chan *iop_chan) | ||
3376 | list_for_each_entry_safe(iter, _iter, &iop_chan->chain, | ||
3377 | chain_node) { | ||
3378 | pr_debug("\tcookie: %d slot: %d busy: %d " | ||
3379 | - "this_desc: %#x next_desc: %#x ack: %d\n", | ||
3380 | + "this_desc: %#x next_desc: %#llx ack: %d\n", | ||
3381 | iter->async_tx.cookie, iter->idx, busy, | ||
3382 | - iter->async_tx.phys, iop_desc_get_next_desc(iter), | ||
3383 | + iter->async_tx.phys, (u64)iop_desc_get_next_desc(iter), | ||
3384 | async_tx_test_ack(&iter->async_tx)); | ||
3385 | prefetch(_iter); | ||
3386 | prefetch(&_iter->async_tx); | ||
3387 | @@ -306,9 +306,9 @@ retry: | ||
3388 | int i; | ||
3389 | dev_dbg(iop_chan->device->common.dev, | ||
3390 | "allocated slot: %d " | ||
3391 | - "(desc %p phys: %#x) slots_per_op %d\n", | ||
3392 | + "(desc %p phys: %#llx) slots_per_op %d\n", | ||
3393 | iter->idx, iter->hw_desc, | ||
3394 | - iter->async_tx.phys, slots_per_op); | ||
3395 | + (u64)iter->async_tx.phys, slots_per_op); | ||
3396 | |||
3397 | /* pre-ack all but the last descriptor */ | ||
3398 | if (num_slots != slots_per_op) | ||
3399 | @@ -516,7 +516,7 @@ iop_adma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dma_dest, | ||
3400 | return NULL; | ||
3401 | BUG_ON(len > IOP_ADMA_MAX_BYTE_COUNT); | ||
3402 | |||
3403 | - dev_dbg(iop_chan->device->common.dev, "%s len: %u\n", | ||
3404 | + dev_dbg(iop_chan->device->common.dev, "%s len: %zu\n", | ||
3405 | __func__, len); | ||
3406 | |||
3407 | spin_lock_bh(&iop_chan->lock); | ||
3408 | @@ -549,7 +549,7 @@ iop_adma_prep_dma_xor(struct dma_chan *chan, dma_addr_t dma_dest, | ||
3409 | BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT); | ||
3410 | |||
3411 | dev_dbg(iop_chan->device->common.dev, | ||
3412 | - "%s src_cnt: %d len: %u flags: %lx\n", | ||
3413 | + "%s src_cnt: %d len: %zu flags: %lx\n", | ||
3414 | __func__, src_cnt, len, flags); | ||
3415 | |||
3416 | spin_lock_bh(&iop_chan->lock); | ||
3417 | @@ -582,7 +582,7 @@ iop_adma_prep_dma_xor_val(struct dma_chan *chan, dma_addr_t *dma_src, | ||
3418 | if (unlikely(!len)) | ||
3419 | return NULL; | ||
3420 | |||
3421 | - dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n", | ||
3422 | + dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %zu\n", | ||
3423 | __func__, src_cnt, len); | ||
3424 | |||
3425 | spin_lock_bh(&iop_chan->lock); | ||
3426 | @@ -620,7 +620,7 @@ iop_adma_prep_dma_pq(struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src, | ||
3427 | BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT); | ||
3428 | |||
3429 | dev_dbg(iop_chan->device->common.dev, | ||
3430 | - "%s src_cnt: %d len: %u flags: %lx\n", | ||
3431 | + "%s src_cnt: %d len: %zu flags: %lx\n", | ||
3432 | __func__, src_cnt, len, flags); | ||
3433 | |||
3434 | if (dmaf_p_disabled_continue(flags)) | ||
3435 | @@ -683,7 +683,7 @@ iop_adma_prep_dma_pq_val(struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src, | ||
3436 | return NULL; | ||
3437 | BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT); | ||
3438 | |||
3439 | - dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n", | ||
3440 | + dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %zu\n", | ||
3441 | __func__, src_cnt, len); | ||
3442 | |||
3443 | spin_lock_bh(&iop_chan->lock); | ||
3444 | diff --git a/drivers/dma/ti/edma.c b/drivers/dma/ti/edma.c | ||
3445 | index ceabdea40ae0..982631d4e1f8 100644 | ||
3446 | --- a/drivers/dma/ti/edma.c | ||
3447 | +++ b/drivers/dma/ti/edma.c | ||
3448 | @@ -2273,9 +2273,6 @@ static int edma_probe(struct platform_device *pdev) | ||
3449 | |||
3450 | ecc->default_queue = info->default_queue; | ||
3451 | |||
3452 | - for (i = 0; i < ecc->num_slots; i++) | ||
3453 | - edma_write_slot(ecc, i, &dummy_paramset); | ||
3454 | - | ||
3455 | if (info->rsv) { | ||
3456 | /* Set the reserved slots in inuse list */ | ||
3457 | rsv_slots = info->rsv->rsv_slots; | ||
3458 | @@ -2288,6 +2285,12 @@ static int edma_probe(struct platform_device *pdev) | ||
3459 | } | ||
3460 | } | ||
3461 | |||
3462 | + for (i = 0; i < ecc->num_slots; i++) { | ||
3463 | + /* Reset only unused - not reserved - paRAM slots */ | ||
3464 | + if (!test_bit(i, ecc->slot_inuse)) | ||
3465 | + edma_write_slot(ecc, i, &dummy_paramset); | ||
3466 | + } | ||
3467 | + | ||
3468 | /* Clear the xbar mapped channels in unused list */ | ||
3469 | xbar_chans = info->xbar_chans; | ||
3470 | if (xbar_chans) { | ||
3471 | diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c | ||
3472 | index c2e693e34d43..bf024ec0116c 100644 | ||
3473 | --- a/drivers/edac/altera_edac.c | ||
3474 | +++ b/drivers/edac/altera_edac.c | ||
3475 | @@ -1866,6 +1866,7 @@ static void altr_edac_a10_irq_handler(struct irq_desc *desc) | ||
3476 | struct altr_arria10_edac *edac = irq_desc_get_handler_data(desc); | ||
3477 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
3478 | int irq = irq_desc_get_irq(desc); | ||
3479 | + unsigned long bits; | ||
3480 | |||
3481 | dberr = (irq == edac->db_irq) ? 1 : 0; | ||
3482 | sm_offset = dberr ? A10_SYSMGR_ECC_INTSTAT_DERR_OFST : | ||
3483 | @@ -1875,7 +1876,8 @@ static void altr_edac_a10_irq_handler(struct irq_desc *desc) | ||
3484 | |||
3485 | regmap_read(edac->ecc_mgr_map, sm_offset, &irq_status); | ||
3486 | |||
3487 | - for_each_set_bit(bit, (unsigned long *)&irq_status, 32) { | ||
3488 | + bits = irq_status; | ||
3489 | + for_each_set_bit(bit, &bits, 32) { | ||
3490 | irq = irq_linear_revmap(edac->domain, dberr * 32 + bit); | ||
3491 | if (irq) | ||
3492 | generic_handle_irq(irq); | ||
3493 | diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c | ||
3494 | index 873437be86d9..608fdab566b3 100644 | ||
3495 | --- a/drivers/edac/amd64_edac.c | ||
3496 | +++ b/drivers/edac/amd64_edac.c | ||
3497 | @@ -810,7 +810,7 @@ static void debug_display_dimm_sizes_df(struct amd64_pvt *pvt, u8 ctrl) | ||
3498 | |||
3499 | edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl); | ||
3500 | |||
3501 | - for (dimm = 0; dimm < 4; dimm++) { | ||
3502 | + for (dimm = 0; dimm < 2; dimm++) { | ||
3503 | size0 = 0; | ||
3504 | cs0 = dimm * 2; | ||
3505 | |||
3506 | @@ -942,89 +942,102 @@ static void prep_chip_selects(struct amd64_pvt *pvt) | ||
3507 | } else if (pvt->fam == 0x15 && pvt->model == 0x30) { | ||
3508 | pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4; | ||
3509 | pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2; | ||
3510 | + } else if (pvt->fam >= 0x17) { | ||
3511 | + int umc; | ||
3512 | + | ||
3513 | + for_each_umc(umc) { | ||
3514 | + pvt->csels[umc].b_cnt = 4; | ||
3515 | + pvt->csels[umc].m_cnt = 2; | ||
3516 | + } | ||
3517 | + | ||
3518 | } else { | ||
3519 | pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8; | ||
3520 | pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4; | ||
3521 | } | ||
3522 | } | ||
3523 | |||
3524 | +static void read_umc_base_mask(struct amd64_pvt *pvt) | ||
3525 | +{ | ||
3526 | + u32 umc_base_reg, umc_mask_reg; | ||
3527 | + u32 base_reg, mask_reg; | ||
3528 | + u32 *base, *mask; | ||
3529 | + int cs, umc; | ||
3530 | + | ||
3531 | + for_each_umc(umc) { | ||
3532 | + umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR; | ||
3533 | + | ||
3534 | + for_each_chip_select(cs, umc, pvt) { | ||
3535 | + base = &pvt->csels[umc].csbases[cs]; | ||
3536 | + | ||
3537 | + base_reg = umc_base_reg + (cs * 4); | ||
3538 | + | ||
3539 | + if (!amd_smn_read(pvt->mc_node_id, base_reg, base)) | ||
3540 | + edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n", | ||
3541 | + umc, cs, *base, base_reg); | ||
3542 | + } | ||
3543 | + | ||
3544 | + umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK; | ||
3545 | + | ||
3546 | + for_each_chip_select_mask(cs, umc, pvt) { | ||
3547 | + mask = &pvt->csels[umc].csmasks[cs]; | ||
3548 | + | ||
3549 | + mask_reg = umc_mask_reg + (cs * 4); | ||
3550 | + | ||
3551 | + if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask)) | ||
3552 | + edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n", | ||
3553 | + umc, cs, *mask, mask_reg); | ||
3554 | + } | ||
3555 | + } | ||
3556 | +} | ||
3557 | + | ||
3558 | /* | ||
3559 | * Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers | ||
3560 | */ | ||
3561 | static void read_dct_base_mask(struct amd64_pvt *pvt) | ||
3562 | { | ||
3563 | - int base_reg0, base_reg1, mask_reg0, mask_reg1, cs; | ||
3564 | + int cs; | ||
3565 | |||
3566 | prep_chip_selects(pvt); | ||
3567 | |||
3568 | - if (pvt->umc) { | ||
3569 | - base_reg0 = get_umc_base(0) + UMCCH_BASE_ADDR; | ||
3570 | - base_reg1 = get_umc_base(1) + UMCCH_BASE_ADDR; | ||
3571 | - mask_reg0 = get_umc_base(0) + UMCCH_ADDR_MASK; | ||
3572 | - mask_reg1 = get_umc_base(1) + UMCCH_ADDR_MASK; | ||
3573 | - } else { | ||
3574 | - base_reg0 = DCSB0; | ||
3575 | - base_reg1 = DCSB1; | ||
3576 | - mask_reg0 = DCSM0; | ||
3577 | - mask_reg1 = DCSM1; | ||
3578 | - } | ||
3579 | + if (pvt->umc) | ||
3580 | + return read_umc_base_mask(pvt); | ||
3581 | |||
3582 | for_each_chip_select(cs, 0, pvt) { | ||
3583 | - int reg0 = base_reg0 + (cs * 4); | ||
3584 | - int reg1 = base_reg1 + (cs * 4); | ||
3585 | + int reg0 = DCSB0 + (cs * 4); | ||
3586 | + int reg1 = DCSB1 + (cs * 4); | ||
3587 | u32 *base0 = &pvt->csels[0].csbases[cs]; | ||
3588 | u32 *base1 = &pvt->csels[1].csbases[cs]; | ||
3589 | |||
3590 | - if (pvt->umc) { | ||
3591 | - if (!amd_smn_read(pvt->mc_node_id, reg0, base0)) | ||
3592 | - edac_dbg(0, " DCSB0[%d]=0x%08x reg: 0x%x\n", | ||
3593 | - cs, *base0, reg0); | ||
3594 | - | ||
3595 | - if (!amd_smn_read(pvt->mc_node_id, reg1, base1)) | ||
3596 | - edac_dbg(0, " DCSB1[%d]=0x%08x reg: 0x%x\n", | ||
3597 | - cs, *base1, reg1); | ||
3598 | - } else { | ||
3599 | - if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0)) | ||
3600 | - edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n", | ||
3601 | - cs, *base0, reg0); | ||
3602 | + if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0)) | ||
3603 | + edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n", | ||
3604 | + cs, *base0, reg0); | ||
3605 | |||
3606 | - if (pvt->fam == 0xf) | ||
3607 | - continue; | ||
3608 | + if (pvt->fam == 0xf) | ||
3609 | + continue; | ||
3610 | |||
3611 | - if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1)) | ||
3612 | - edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n", | ||
3613 | - cs, *base1, (pvt->fam == 0x10) ? reg1 | ||
3614 | - : reg0); | ||
3615 | - } | ||
3616 | + if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1)) | ||
3617 | + edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n", | ||
3618 | + cs, *base1, (pvt->fam == 0x10) ? reg1 | ||
3619 | + : reg0); | ||
3620 | } | ||
3621 | |||
3622 | for_each_chip_select_mask(cs, 0, pvt) { | ||
3623 | - int reg0 = mask_reg0 + (cs * 4); | ||
3624 | - int reg1 = mask_reg1 + (cs * 4); | ||
3625 | + int reg0 = DCSM0 + (cs * 4); | ||
3626 | + int reg1 = DCSM1 + (cs * 4); | ||
3627 | u32 *mask0 = &pvt->csels[0].csmasks[cs]; | ||
3628 | u32 *mask1 = &pvt->csels[1].csmasks[cs]; | ||
3629 | |||
3630 | - if (pvt->umc) { | ||
3631 | - if (!amd_smn_read(pvt->mc_node_id, reg0, mask0)) | ||
3632 | - edac_dbg(0, " DCSM0[%d]=0x%08x reg: 0x%x\n", | ||
3633 | - cs, *mask0, reg0); | ||
3634 | + if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0)) | ||
3635 | + edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n", | ||
3636 | + cs, *mask0, reg0); | ||
3637 | |||
3638 | - if (!amd_smn_read(pvt->mc_node_id, reg1, mask1)) | ||
3639 | - edac_dbg(0, " DCSM1[%d]=0x%08x reg: 0x%x\n", | ||
3640 | - cs, *mask1, reg1); | ||
3641 | - } else { | ||
3642 | - if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0)) | ||
3643 | - edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n", | ||
3644 | - cs, *mask0, reg0); | ||
3645 | - | ||
3646 | - if (pvt->fam == 0xf) | ||
3647 | - continue; | ||
3648 | + if (pvt->fam == 0xf) | ||
3649 | + continue; | ||
3650 | |||
3651 | - if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1)) | ||
3652 | - edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n", | ||
3653 | - cs, *mask1, (pvt->fam == 0x10) ? reg1 | ||
3654 | - : reg0); | ||
3655 | - } | ||
3656 | + if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1)) | ||
3657 | + edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n", | ||
3658 | + cs, *mask1, (pvt->fam == 0x10) ? reg1 | ||
3659 | + : reg0); | ||
3660 | } | ||
3661 | } | ||
3662 | |||
3663 | @@ -2537,13 +2550,6 @@ static void decode_umc_error(int node_id, struct mce *m) | ||
3664 | |||
3665 | err.channel = find_umc_channel(m); | ||
3666 | |||
3667 | - if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) { | ||
3668 | - err.err_code = ERR_NORM_ADDR; | ||
3669 | - goto log_error; | ||
3670 | - } | ||
3671 | - | ||
3672 | - error_address_to_page_and_offset(sys_addr, &err); | ||
3673 | - | ||
3674 | if (!(m->status & MCI_STATUS_SYNDV)) { | ||
3675 | err.err_code = ERR_SYND; | ||
3676 | goto log_error; | ||
3677 | @@ -2560,6 +2566,13 @@ static void decode_umc_error(int node_id, struct mce *m) | ||
3678 | |||
3679 | err.csrow = m->synd & 0x7; | ||
3680 | |||
3681 | + if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) { | ||
3682 | + err.err_code = ERR_NORM_ADDR; | ||
3683 | + goto log_error; | ||
3684 | + } | ||
3685 | + | ||
3686 | + error_address_to_page_and_offset(sys_addr, &err); | ||
3687 | + | ||
3688 | log_error: | ||
3689 | __log_ecc_error(mci, &err, ecc_type); | ||
3690 | } | ||
3691 | @@ -3137,12 +3150,15 @@ static bool ecc_enabled(struct pci_dev *F3, u16 nid) | ||
3692 | static inline void | ||
3693 | f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt) | ||
3694 | { | ||
3695 | - u8 i, ecc_en = 1, cpk_en = 1; | ||
3696 | + u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1; | ||
3697 | |||
3698 | for_each_umc(i) { | ||
3699 | if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) { | ||
3700 | ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED); | ||
3701 | cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP); | ||
3702 | + | ||
3703 | + dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6)); | ||
3704 | + dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7)); | ||
3705 | } | ||
3706 | } | ||
3707 | |||
3708 | @@ -3150,8 +3166,15 @@ f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt) | ||
3709 | if (ecc_en) { | ||
3710 | mci->edac_ctl_cap |= EDAC_FLAG_SECDED; | ||
3711 | |||
3712 | - if (cpk_en) | ||
3713 | + if (!cpk_en) | ||
3714 | + return; | ||
3715 | + | ||
3716 | + if (dev_x4) | ||
3717 | mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED; | ||
3718 | + else if (dev_x16) | ||
3719 | + mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED; | ||
3720 | + else | ||
3721 | + mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED; | ||
3722 | } | ||
3723 | } | ||
3724 | |||
3725 | diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h | ||
3726 | index 8f66472f7adc..4dce6a2ac75f 100644 | ||
3727 | --- a/drivers/edac/amd64_edac.h | ||
3728 | +++ b/drivers/edac/amd64_edac.h | ||
3729 | @@ -96,6 +96,7 @@ | ||
3730 | /* Hardware limit on ChipSelect rows per MC and processors per system */ | ||
3731 | #define NUM_CHIPSELECTS 8 | ||
3732 | #define DRAM_RANGES 8 | ||
3733 | +#define NUM_CONTROLLERS 8 | ||
3734 | |||
3735 | #define ON true | ||
3736 | #define OFF false | ||
3737 | @@ -351,8 +352,8 @@ struct amd64_pvt { | ||
3738 | u32 dbam0; /* DRAM Base Address Mapping reg for DCT0 */ | ||
3739 | u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ | ||
3740 | |||
3741 | - /* one for each DCT */ | ||
3742 | - struct chip_select csels[2]; | ||
3743 | + /* one for each DCT/UMC */ | ||
3744 | + struct chip_select csels[NUM_CONTROLLERS]; | ||
3745 | |||
3746 | /* DRAM base and limit pairs F1x[78,70,68,60,58,50,48,40] */ | ||
3747 | struct dram_range ranges[DRAM_RANGES]; | ||
3748 | diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c | ||
3749 | index 64922c8fa7e3..d899d86897d0 100644 | ||
3750 | --- a/drivers/edac/edac_mc.c | ||
3751 | +++ b/drivers/edac/edac_mc.c | ||
3752 | @@ -1235,9 +1235,13 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type, | ||
3753 | if (p > e->location) | ||
3754 | *(p - 1) = '\0'; | ||
3755 | |||
3756 | - /* Report the error via the trace interface */ | ||
3757 | - grain_bits = fls_long(e->grain) + 1; | ||
3758 | + /* Sanity-check driver-supplied grain value. */ | ||
3759 | + if (WARN_ON_ONCE(!e->grain)) | ||
3760 | + e->grain = 1; | ||
3761 | + | ||
3762 | + grain_bits = fls_long(e->grain - 1); | ||
3763 | |||
3764 | + /* Report the error via the trace interface */ | ||
3765 | if (IS_ENABLED(CONFIG_RAS)) | ||
3766 | trace_mc_event(type, e->msg, e->label, e->error_count, | ||
3767 | mci->mc_idx, e->top_layer, e->mid_layer, | ||
3768 | diff --git a/drivers/edac/pnd2_edac.c b/drivers/edac/pnd2_edac.c | ||
3769 | index ca25f8fe57ef..1ad538baaa4a 100644 | ||
3770 | --- a/drivers/edac/pnd2_edac.c | ||
3771 | +++ b/drivers/edac/pnd2_edac.c | ||
3772 | @@ -260,11 +260,14 @@ static u64 get_sideband_reg_base_addr(void) | ||
3773 | } | ||
3774 | } | ||
3775 | |||
3776 | +#define DNV_MCHBAR_SIZE 0x8000 | ||
3777 | +#define DNV_SB_PORT_SIZE 0x10000 | ||
3778 | static int dnv_rd_reg(int port, int off, int op, void *data, size_t sz, char *name) | ||
3779 | { | ||
3780 | struct pci_dev *pdev; | ||
3781 | char *base; | ||
3782 | u64 addr; | ||
3783 | + unsigned long size; | ||
3784 | |||
3785 | if (op == 4) { | ||
3786 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x1980, NULL); | ||
3787 | @@ -279,15 +282,17 @@ static int dnv_rd_reg(int port, int off, int op, void *data, size_t sz, char *na | ||
3788 | addr = get_mem_ctrl_hub_base_addr(); | ||
3789 | if (!addr) | ||
3790 | return -ENODEV; | ||
3791 | + size = DNV_MCHBAR_SIZE; | ||
3792 | } else { | ||
3793 | /* MMIO via sideband register base address */ | ||
3794 | addr = get_sideband_reg_base_addr(); | ||
3795 | if (!addr) | ||
3796 | return -ENODEV; | ||
3797 | addr += (port << 16); | ||
3798 | + size = DNV_SB_PORT_SIZE; | ||
3799 | } | ||
3800 | |||
3801 | - base = ioremap((resource_size_t)addr, 0x10000); | ||
3802 | + base = ioremap((resource_size_t)addr, size); | ||
3803 | if (!base) | ||
3804 | return -ENODEV; | ||
3805 | |||
3806 | diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c | ||
3807 | index b5bc4c7a8fab..b49c9e6f4bf1 100644 | ||
3808 | --- a/drivers/firmware/arm_scmi/driver.c | ||
3809 | +++ b/drivers/firmware/arm_scmi/driver.c | ||
3810 | @@ -271,6 +271,14 @@ static void scmi_tx_prepare(struct mbox_client *cl, void *m) | ||
3811 | struct scmi_chan_info *cinfo = client_to_scmi_chan_info(cl); | ||
3812 | struct scmi_shared_mem __iomem *mem = cinfo->payload; | ||
3813 | |||
3814 | + /* | ||
3815 | + * Ideally channel must be free by now unless OS timeout last | ||
3816 | + * request and platform continued to process the same, wait | ||
3817 | + * until it releases the shared memory, otherwise we may endup | ||
3818 | + * overwriting its response with new message payload or vice-versa | ||
3819 | + */ | ||
3820 | + spin_until_cond(ioread32(&mem->channel_status) & | ||
3821 | + SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE); | ||
3822 | /* Mark channel busy + clear error */ | ||
3823 | iowrite32(0x0, &mem->channel_status); | ||
3824 | iowrite32(t->hdr.poll_completion ? 0 : SCMI_SHMEM_FLAG_INTR_ENABLED, | ||
3825 | diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c | ||
3826 | index 8fa977c7861f..addf0749dd8b 100644 | ||
3827 | --- a/drivers/firmware/efi/cper.c | ||
3828 | +++ b/drivers/firmware/efi/cper.c | ||
3829 | @@ -390,6 +390,21 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie, | ||
3830 | printk( | ||
3831 | "%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n", | ||
3832 | pfx, pcie->bridge.secondary_status, pcie->bridge.control); | ||
3833 | + | ||
3834 | + /* Fatal errors call __ghes_panic() before AER handler prints this */ | ||
3835 | + if ((pcie->validation_bits & CPER_PCIE_VALID_AER_INFO) && | ||
3836 | + (gdata->error_severity & CPER_SEV_FATAL)) { | ||
3837 | + struct aer_capability_regs *aer; | ||
3838 | + | ||
3839 | + aer = (struct aer_capability_regs *)pcie->aer_info; | ||
3840 | + printk("%saer_uncor_status: 0x%08x, aer_uncor_mask: 0x%08x\n", | ||
3841 | + pfx, aer->uncor_status, aer->uncor_mask); | ||
3842 | + printk("%saer_uncor_severity: 0x%08x\n", | ||
3843 | + pfx, aer->uncor_severity); | ||
3844 | + printk("%sTLP Header: %08x %08x %08x %08x\n", pfx, | ||
3845 | + aer->header_log.dw0, aer->header_log.dw1, | ||
3846 | + aer->header_log.dw2, aer->header_log.dw3); | ||
3847 | + } | ||
3848 | } | ||
3849 | |||
3850 | static void cper_print_tstamp(const char *pfx, | ||
3851 | diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c | ||
3852 | index 2ddc118dba1b..74b84244a0db 100644 | ||
3853 | --- a/drivers/firmware/qcom_scm.c | ||
3854 | +++ b/drivers/firmware/qcom_scm.c | ||
3855 | @@ -9,6 +9,7 @@ | ||
3856 | #include <linux/init.h> | ||
3857 | #include <linux/cpumask.h> | ||
3858 | #include <linux/export.h> | ||
3859 | +#include <linux/dma-direct.h> | ||
3860 | #include <linux/dma-mapping.h> | ||
3861 | #include <linux/module.h> | ||
3862 | #include <linux/types.h> | ||
3863 | @@ -440,6 +441,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, | ||
3864 | phys_addr_t mem_to_map_phys; | ||
3865 | phys_addr_t dest_phys; | ||
3866 | phys_addr_t ptr_phys; | ||
3867 | + dma_addr_t ptr_dma; | ||
3868 | size_t mem_to_map_sz; | ||
3869 | size_t dest_sz; | ||
3870 | size_t src_sz; | ||
3871 | @@ -457,9 +459,10 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, | ||
3872 | ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) + | ||
3873 | ALIGN(dest_sz, SZ_64); | ||
3874 | |||
3875 | - ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL); | ||
3876 | + ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_dma, GFP_KERNEL); | ||
3877 | if (!ptr) | ||
3878 | return -ENOMEM; | ||
3879 | + ptr_phys = dma_to_phys(__scm->dev, ptr_dma); | ||
3880 | |||
3881 | /* Fill source vmid detail */ | ||
3882 | src = ptr; | ||
3883 | @@ -489,7 +492,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, | ||
3884 | |||
3885 | ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz, | ||
3886 | ptr_phys, src_sz, dest_phys, dest_sz); | ||
3887 | - dma_free_coherent(__scm->dev, ALIGN(ptr_sz, SZ_64), ptr, ptr_phys); | ||
3888 | + dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_dma); | ||
3889 | if (ret) { | ||
3890 | dev_err(__scm->dev, | ||
3891 | "Assign memory protection call failed %d.\n", ret); | ||
3892 | diff --git a/drivers/gpio/gpio-madera.c b/drivers/gpio/gpio-madera.c | ||
3893 | index 4dbc837d1215..be963113f672 100644 | ||
3894 | --- a/drivers/gpio/gpio-madera.c | ||
3895 | +++ b/drivers/gpio/gpio-madera.c | ||
3896 | @@ -136,6 +136,9 @@ static int madera_gpio_probe(struct platform_device *pdev) | ||
3897 | madera_gpio->gpio_chip.parent = pdev->dev.parent; | ||
3898 | |||
3899 | switch (madera->type) { | ||
3900 | + case CS47L15: | ||
3901 | + madera_gpio->gpio_chip.ngpio = CS47L15_NUM_GPIOS; | ||
3902 | + break; | ||
3903 | case CS47L35: | ||
3904 | madera_gpio->gpio_chip.ngpio = CS47L35_NUM_GPIOS; | ||
3905 | break; | ||
3906 | @@ -147,6 +150,11 @@ static int madera_gpio_probe(struct platform_device *pdev) | ||
3907 | case CS47L91: | ||
3908 | madera_gpio->gpio_chip.ngpio = CS47L90_NUM_GPIOS; | ||
3909 | break; | ||
3910 | + case CS42L92: | ||
3911 | + case CS47L92: | ||
3912 | + case CS47L93: | ||
3913 | + madera_gpio->gpio_chip.ngpio = CS47L92_NUM_GPIOS; | ||
3914 | + break; | ||
3915 | default: | ||
3916 | dev_err(&pdev->dev, "Unknown chip variant %d\n", madera->type); | ||
3917 | return -EINVAL; | ||
3918 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
3919 | index beb2d268d1ef..421ca93a8ab8 100644 | ||
3920 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
3921 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
3922 | @@ -2107,6 +2107,7 @@ static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd) | ||
3923 | } | ||
3924 | |||
3925 | static const struct backlight_ops amdgpu_dm_backlight_ops = { | ||
3926 | + .options = BL_CORE_SUSPENDRESUME, | ||
3927 | .get_brightness = amdgpu_dm_backlight_get_brightness, | ||
3928 | .update_status = amdgpu_dm_backlight_update_status, | ||
3929 | }; | ||
3930 | diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce110/dce110_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce110/dce110_clk_mgr.c | ||
3931 | index 5cc3acccda2a..b1e657e137a9 100644 | ||
3932 | --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce110/dce110_clk_mgr.c | ||
3933 | +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce110/dce110_clk_mgr.c | ||
3934 | @@ -98,11 +98,14 @@ uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context) | ||
3935 | struct dc_stream_state *stream = context->streams[j]; | ||
3936 | uint32_t vertical_blank_in_pixels = 0; | ||
3937 | uint32_t vertical_blank_time = 0; | ||
3938 | + uint32_t vertical_total_min = stream->timing.v_total; | ||
3939 | + struct dc_crtc_timing_adjust adjust = stream->adjust; | ||
3940 | + if (adjust.v_total_max != adjust.v_total_min) | ||
3941 | + vertical_total_min = adjust.v_total_min; | ||
3942 | |||
3943 | vertical_blank_in_pixels = stream->timing.h_total * | ||
3944 | - (stream->timing.v_total | ||
3945 | + (vertical_total_min | ||
3946 | - stream->timing.v_addressable); | ||
3947 | - | ||
3948 | vertical_blank_time = vertical_blank_in_pixels | ||
3949 | * 10000 / stream->timing.pix_clk_100hz; | ||
3950 | |||
3951 | @@ -171,6 +174,10 @@ void dce11_pplib_apply_display_requirements( | ||
3952 | struct dc_state *context) | ||
3953 | { | ||
3954 | struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg; | ||
3955 | + int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ; | ||
3956 | + | ||
3957 | + if (dc->bw_vbios && dc->bw_vbios->memory_type == bw_def_hbm) | ||
3958 | + memory_type_multiplier = MEMORY_TYPE_HBM; | ||
3959 | |||
3960 | pp_display_cfg->all_displays_in_sync = | ||
3961 | context->bw_ctx.bw.dce.all_displays_in_sync; | ||
3962 | @@ -183,8 +190,20 @@ void dce11_pplib_apply_display_requirements( | ||
3963 | pp_display_cfg->cpu_pstate_separation_time = | ||
3964 | context->bw_ctx.bw.dce.blackout_recovery_time_us; | ||
3965 | |||
3966 | - pp_display_cfg->min_memory_clock_khz = context->bw_ctx.bw.dce.yclk_khz | ||
3967 | - / MEMORY_TYPE_MULTIPLIER_CZ; | ||
3968 | + /* | ||
3969 | + * TODO: determine whether the bandwidth has reached memory's limitation | ||
3970 | + * , then change minimum memory clock based on real-time bandwidth | ||
3971 | + * limitation. | ||
3972 | + */ | ||
3973 | + if (ASICREV_IS_VEGA20_P(dc->ctx->asic_id.hw_internal_rev) && (context->stream_count >= 2)) { | ||
3974 | + pp_display_cfg->min_memory_clock_khz = max(pp_display_cfg->min_memory_clock_khz, | ||
3975 | + (uint32_t) div64_s64( | ||
3976 | + div64_s64(dc->bw_vbios->high_yclk.value, | ||
3977 | + memory_type_multiplier), 10000)); | ||
3978 | + } else { | ||
3979 | + pp_display_cfg->min_memory_clock_khz = context->bw_ctx.bw.dce.yclk_khz | ||
3980 | + / memory_type_multiplier; | ||
3981 | + } | ||
3982 | |||
3983 | pp_display_cfg->min_engine_clock_khz = determine_sclk_from_bounding_box( | ||
3984 | dc, | ||
3985 | diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c | ||
3986 | index a24a2bda8656..1596ddcb26e6 100644 | ||
3987 | --- a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c | ||
3988 | +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c | ||
3989 | @@ -148,7 +148,7 @@ static void dce_mi_program_pte_vm( | ||
3990 | pte->min_pte_before_flip_horiz_scan; | ||
3991 | |||
3992 | REG_UPDATE(GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, | ||
3993 | - GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, 0xff); | ||
3994 | + GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, 0x7f); | ||
3995 | |||
3996 | REG_UPDATE_3(DVMM_PTE_CONTROL, | ||
3997 | DVMM_PAGE_WIDTH, page_width, | ||
3998 | @@ -157,7 +157,7 @@ static void dce_mi_program_pte_vm( | ||
3999 | |||
4000 | REG_UPDATE_2(DVMM_PTE_ARB_CONTROL, | ||
4001 | DVMM_PTE_REQ_PER_CHUNK, pte->pte_req_per_chunk, | ||
4002 | - DVMM_MAX_PTE_REQ_OUTSTANDING, 0xff); | ||
4003 | + DVMM_MAX_PTE_REQ_OUTSTANDING, 0x7f); | ||
4004 | } | ||
4005 | |||
4006 | static void program_urgency_watermark( | ||
4007 | diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c | ||
4008 | index c6136e0ed1a4..7a04be74c9cf 100644 | ||
4009 | --- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c | ||
4010 | +++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c | ||
4011 | @@ -987,6 +987,10 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) | ||
4012 | struct dm_pp_clock_levels_with_latency mem_clks = {0}; | ||
4013 | struct dm_pp_wm_sets_with_clock_ranges clk_ranges = {0}; | ||
4014 | struct dm_pp_clock_levels clks = {0}; | ||
4015 | + int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ; | ||
4016 | + | ||
4017 | + if (dc->bw_vbios && dc->bw_vbios->memory_type == bw_def_hbm) | ||
4018 | + memory_type_multiplier = MEMORY_TYPE_HBM; | ||
4019 | |||
4020 | /*do system clock TODO PPLIB: after PPLIB implement, | ||
4021 | * then remove old way | ||
4022 | @@ -1026,12 +1030,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) | ||
4023 | &clks); | ||
4024 | |||
4025 | dc->bw_vbios->low_yclk = bw_frc_to_fixed( | ||
4026 | - clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER_CZ, 1000); | ||
4027 | + clks.clocks_in_khz[0] * memory_type_multiplier, 1000); | ||
4028 | dc->bw_vbios->mid_yclk = bw_frc_to_fixed( | ||
4029 | - clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER_CZ, | ||
4030 | + clks.clocks_in_khz[clks.num_levels>>1] * memory_type_multiplier, | ||
4031 | 1000); | ||
4032 | dc->bw_vbios->high_yclk = bw_frc_to_fixed( | ||
4033 | - clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER_CZ, | ||
4034 | + clks.clocks_in_khz[clks.num_levels-1] * memory_type_multiplier, | ||
4035 | 1000); | ||
4036 | |||
4037 | return; | ||
4038 | @@ -1067,12 +1071,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) | ||
4039 | * YCLK = UMACLK*m_memoryTypeMultiplier | ||
4040 | */ | ||
4041 | dc->bw_vbios->low_yclk = bw_frc_to_fixed( | ||
4042 | - mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, 1000); | ||
4043 | + mem_clks.data[0].clocks_in_khz * memory_type_multiplier, 1000); | ||
4044 | dc->bw_vbios->mid_yclk = bw_frc_to_fixed( | ||
4045 | - mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, | ||
4046 | + mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * memory_type_multiplier, | ||
4047 | 1000); | ||
4048 | dc->bw_vbios->high_yclk = bw_frc_to_fixed( | ||
4049 | - mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, | ||
4050 | + mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * memory_type_multiplier, | ||
4051 | 1000); | ||
4052 | |||
4053 | /* Now notify PPLib/SMU about which Watermarks sets they should select | ||
4054 | diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c | ||
4055 | index 4a6ba3173a5a..ae38c9c7277c 100644 | ||
4056 | --- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c | ||
4057 | +++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c | ||
4058 | @@ -847,6 +847,8 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) | ||
4059 | int i; | ||
4060 | unsigned int clk; | ||
4061 | unsigned int latency; | ||
4062 | + /*original logic in dal3*/ | ||
4063 | + int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ; | ||
4064 | |||
4065 | /*do system clock*/ | ||
4066 | if (!dm_pp_get_clock_levels_by_type_with_latency( | ||
4067 | @@ -905,13 +907,16 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc) | ||
4068 | * ALSO always convert UMA clock (from PPLIB) to YCLK (HW formula): | ||
4069 | * YCLK = UMACLK*m_memoryTypeMultiplier | ||
4070 | */ | ||
4071 | + if (dc->bw_vbios->memory_type == bw_def_hbm) | ||
4072 | + memory_type_multiplier = MEMORY_TYPE_HBM; | ||
4073 | + | ||
4074 | dc->bw_vbios->low_yclk = bw_frc_to_fixed( | ||
4075 | - mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, 1000); | ||
4076 | + mem_clks.data[0].clocks_in_khz * memory_type_multiplier, 1000); | ||
4077 | dc->bw_vbios->mid_yclk = bw_frc_to_fixed( | ||
4078 | - mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, | ||
4079 | + mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * memory_type_multiplier, | ||
4080 | 1000); | ||
4081 | dc->bw_vbios->high_yclk = bw_frc_to_fixed( | ||
4082 | - mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, | ||
4083 | + mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * memory_type_multiplier, | ||
4084 | 1000); | ||
4085 | |||
4086 | /* Now notify PPLib/SMU about which Watermarks sets they should select | ||
4087 | diff --git a/drivers/gpu/drm/amd/display/dc/inc/resource.h b/drivers/gpu/drm/amd/display/dc/inc/resource.h | ||
4088 | index 47f81072d7e9..c0424b4035a5 100644 | ||
4089 | --- a/drivers/gpu/drm/amd/display/dc/inc/resource.h | ||
4090 | +++ b/drivers/gpu/drm/amd/display/dc/inc/resource.h | ||
4091 | @@ -31,6 +31,8 @@ | ||
4092 | #include "dm_pp_smu.h" | ||
4093 | |||
4094 | #define MEMORY_TYPE_MULTIPLIER_CZ 4 | ||
4095 | +#define MEMORY_TYPE_HBM 2 | ||
4096 | + | ||
4097 | |||
4098 | enum dce_version resource_parse_asic_id( | ||
4099 | struct hw_asic_id asic_id); | ||
4100 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | ||
4101 | index 487aeee1cf8a..3c1084de5d59 100644 | ||
4102 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | ||
4103 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | ||
4104 | @@ -4068,6 +4068,11 @@ static int smu7_program_display_gap(struct pp_hwmgr *hwmgr) | ||
4105 | |||
4106 | data->frame_time_x2 = frame_time_in_us * 2 / 100; | ||
4107 | |||
4108 | + if (data->frame_time_x2 < 280) { | ||
4109 | + pr_debug("%s: enforce minimal VBITimeout: %d -> 280\n", __func__, data->frame_time_x2); | ||
4110 | + data->frame_time_x2 = 280; | ||
4111 | + } | ||
4112 | + | ||
4113 | display_gap2 = pre_vbi_time_in_us * (ref_clock / 100); | ||
4114 | |||
4115 | cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixCG_DISPLAY_GAP_CNTL2, display_gap2); | ||
4116 | diff --git a/drivers/gpu/drm/drm_kms_helper_common.c b/drivers/gpu/drm/drm_kms_helper_common.c | ||
4117 | index d9a5ac81949e..221a8528c993 100644 | ||
4118 | --- a/drivers/gpu/drm/drm_kms_helper_common.c | ||
4119 | +++ b/drivers/gpu/drm/drm_kms_helper_common.c | ||
4120 | @@ -40,7 +40,7 @@ MODULE_LICENSE("GPL and additional rights"); | ||
4121 | /* Backward compatibility for drm_kms_helper.edid_firmware */ | ||
4122 | static int edid_firmware_set(const char *val, const struct kernel_param *kp) | ||
4123 | { | ||
4124 | - DRM_NOTE("drm_kms_firmware.edid_firmware is deprecated, please use drm.edid_firmware instead.\n"); | ||
4125 | + DRM_NOTE("drm_kms_helper.edid_firmware is deprecated, please use drm.edid_firmware instead.\n"); | ||
4126 | |||
4127 | return __drm_set_edid_firmware_path(val); | ||
4128 | } | ||
4129 | diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c | ||
4130 | index 6ba1a08253f0..4cf25458f0b9 100644 | ||
4131 | --- a/drivers/hwmon/acpi_power_meter.c | ||
4132 | +++ b/drivers/hwmon/acpi_power_meter.c | ||
4133 | @@ -681,8 +681,8 @@ static int setup_attrs(struct acpi_power_meter_resource *resource) | ||
4134 | |||
4135 | if (resource->caps.flags & POWER_METER_CAN_CAP) { | ||
4136 | if (!can_cap_in_hardware()) { | ||
4137 | - dev_err(&resource->acpi_dev->dev, | ||
4138 | - "Ignoring unsafe software power cap!\n"); | ||
4139 | + dev_warn(&resource->acpi_dev->dev, | ||
4140 | + "Ignoring unsafe software power cap!\n"); | ||
4141 | goto skip_unsafe_cap; | ||
4142 | } | ||
4143 | |||
4144 | diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c | ||
4145 | index c77e89239dcd..5c1dddde193c 100644 | ||
4146 | --- a/drivers/hwmon/k10temp.c | ||
4147 | +++ b/drivers/hwmon/k10temp.c | ||
4148 | @@ -349,6 +349,7 @@ static const struct pci_device_id k10temp_id_table[] = { | ||
4149 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_DF_F3) }, | ||
4150 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_M10H_DF_F3) }, | ||
4151 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_M30H_DF_F3) }, | ||
4152 | + { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_M70H_DF_F3) }, | ||
4153 | { PCI_VDEVICE(HYGON, PCI_DEVICE_ID_AMD_17H_DF_F3) }, | ||
4154 | {} | ||
4155 | }; | ||
4156 | diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c | ||
4157 | index f31413fd9521..800414886f6b 100644 | ||
4158 | --- a/drivers/i2c/busses/i2c-riic.c | ||
4159 | +++ b/drivers/i2c/busses/i2c-riic.c | ||
4160 | @@ -202,6 +202,7 @@ static irqreturn_t riic_tend_isr(int irq, void *data) | ||
4161 | if (readb(riic->base + RIIC_ICSR2) & ICSR2_NACKF) { | ||
4162 | /* We got a NACKIE */ | ||
4163 | readb(riic->base + RIIC_ICDRR); /* dummy read */ | ||
4164 | + riic_clear_set_bit(riic, ICSR2_NACKF, 0, RIIC_ICSR2); | ||
4165 | riic->err = -ENXIO; | ||
4166 | } else if (riic->bytes_left) { | ||
4167 | return IRQ_NONE; | ||
4168 | diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c | ||
4169 | index 9b76a8fcdd24..bf539c34ccd3 100644 | ||
4170 | --- a/drivers/infiniband/core/addr.c | ||
4171 | +++ b/drivers/infiniband/core/addr.c | ||
4172 | @@ -352,7 +352,7 @@ static bool has_gateway(const struct dst_entry *dst, sa_family_t family) | ||
4173 | |||
4174 | if (family == AF_INET) { | ||
4175 | rt = container_of(dst, struct rtable, dst); | ||
4176 | - return rt->rt_gw_family == AF_INET; | ||
4177 | + return rt->rt_uses_gateway; | ||
4178 | } | ||
4179 | |||
4180 | rt6 = container_of(dst, struct rt6_info, dst); | ||
4181 | diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c | ||
4182 | index 7ddd0e5bc6b3..bb8b71cc3821 100644 | ||
4183 | --- a/drivers/infiniband/core/uverbs_cmd.c | ||
4184 | +++ b/drivers/infiniband/core/uverbs_cmd.c | ||
4185 | @@ -3484,7 +3484,8 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs, | ||
4186 | |||
4187 | err_copy: | ||
4188 | ib_destroy_srq_user(srq, uverbs_get_cleared_udata(attrs)); | ||
4189 | - | ||
4190 | + /* It was released in ib_destroy_srq_user */ | ||
4191 | + srq = NULL; | ||
4192 | err_free: | ||
4193 | kfree(srq); | ||
4194 | err_put: | ||
4195 | diff --git a/drivers/infiniband/hw/hfi1/mad.c b/drivers/infiniband/hw/hfi1/mad.c | ||
4196 | index 184dba3c2828..d8ff063a5419 100644 | ||
4197 | --- a/drivers/infiniband/hw/hfi1/mad.c | ||
4198 | +++ b/drivers/infiniband/hw/hfi1/mad.c | ||
4199 | @@ -2326,7 +2326,7 @@ struct opa_port_status_req { | ||
4200 | __be32 vl_select_mask; | ||
4201 | }; | ||
4202 | |||
4203 | -#define VL_MASK_ALL 0x000080ff | ||
4204 | +#define VL_MASK_ALL 0x00000000000080ffUL | ||
4205 | |||
4206 | struct opa_port_status_rsp { | ||
4207 | __u8 port_num; | ||
4208 | @@ -2625,15 +2625,14 @@ static int pma_get_opa_classportinfo(struct opa_pma_mad *pmp, | ||
4209 | } | ||
4210 | |||
4211 | static void a0_portstatus(struct hfi1_pportdata *ppd, | ||
4212 | - struct opa_port_status_rsp *rsp, u32 vl_select_mask) | ||
4213 | + struct opa_port_status_rsp *rsp) | ||
4214 | { | ||
4215 | if (!is_bx(ppd->dd)) { | ||
4216 | unsigned long vl; | ||
4217 | u64 sum_vl_xmit_wait = 0; | ||
4218 | - u32 vl_all_mask = VL_MASK_ALL; | ||
4219 | + unsigned long vl_all_mask = VL_MASK_ALL; | ||
4220 | |||
4221 | - for_each_set_bit(vl, (unsigned long *)&(vl_all_mask), | ||
4222 | - 8 * sizeof(vl_all_mask)) { | ||
4223 | + for_each_set_bit(vl, &vl_all_mask, BITS_PER_LONG) { | ||
4224 | u64 tmp = sum_vl_xmit_wait + | ||
4225 | read_port_cntr(ppd, C_TX_WAIT_VL, | ||
4226 | idx_from_vl(vl)); | ||
4227 | @@ -2730,12 +2729,12 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp, | ||
4228 | (struct opa_port_status_req *)pmp->data; | ||
4229 | struct hfi1_devdata *dd = dd_from_ibdev(ibdev); | ||
4230 | struct opa_port_status_rsp *rsp; | ||
4231 | - u32 vl_select_mask = be32_to_cpu(req->vl_select_mask); | ||
4232 | + unsigned long vl_select_mask = be32_to_cpu(req->vl_select_mask); | ||
4233 | unsigned long vl; | ||
4234 | size_t response_data_size; | ||
4235 | u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24; | ||
4236 | u8 port_num = req->port_num; | ||
4237 | - u8 num_vls = hweight32(vl_select_mask); | ||
4238 | + u8 num_vls = hweight64(vl_select_mask); | ||
4239 | struct _vls_pctrs *vlinfo; | ||
4240 | struct hfi1_ibport *ibp = to_iport(ibdev, port); | ||
4241 | struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); | ||
4242 | @@ -2770,7 +2769,7 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp, | ||
4243 | |||
4244 | hfi1_read_link_quality(dd, &rsp->link_quality_indicator); | ||
4245 | |||
4246 | - rsp->vl_select_mask = cpu_to_be32(vl_select_mask); | ||
4247 | + rsp->vl_select_mask = cpu_to_be32((u32)vl_select_mask); | ||
4248 | rsp->port_xmit_data = cpu_to_be64(read_dev_cntr(dd, C_DC_XMIT_FLITS, | ||
4249 | CNTR_INVALID_VL)); | ||
4250 | rsp->port_rcv_data = cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FLITS, | ||
4251 | @@ -2841,8 +2840,7 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp, | ||
4252 | * So in the for_each_set_bit() loop below, we don't need | ||
4253 | * any additional checks for vl. | ||
4254 | */ | ||
4255 | - for_each_set_bit(vl, (unsigned long *)&(vl_select_mask), | ||
4256 | - 8 * sizeof(vl_select_mask)) { | ||
4257 | + for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { | ||
4258 | memset(vlinfo, 0, sizeof(*vlinfo)); | ||
4259 | |||
4260 | tmp = read_dev_cntr(dd, C_DC_RX_FLIT_VL, idx_from_vl(vl)); | ||
4261 | @@ -2883,7 +2881,7 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp, | ||
4262 | vfi++; | ||
4263 | } | ||
4264 | |||
4265 | - a0_portstatus(ppd, rsp, vl_select_mask); | ||
4266 | + a0_portstatus(ppd, rsp); | ||
4267 | |||
4268 | if (resp_len) | ||
4269 | *resp_len += response_data_size; | ||
4270 | @@ -2930,16 +2928,14 @@ static u64 get_error_counter_summary(struct ib_device *ibdev, u8 port, | ||
4271 | return error_counter_summary; | ||
4272 | } | ||
4273 | |||
4274 | -static void a0_datacounters(struct hfi1_pportdata *ppd, struct _port_dctrs *rsp, | ||
4275 | - u32 vl_select_mask) | ||
4276 | +static void a0_datacounters(struct hfi1_pportdata *ppd, struct _port_dctrs *rsp) | ||
4277 | { | ||
4278 | if (!is_bx(ppd->dd)) { | ||
4279 | unsigned long vl; | ||
4280 | u64 sum_vl_xmit_wait = 0; | ||
4281 | - u32 vl_all_mask = VL_MASK_ALL; | ||
4282 | + unsigned long vl_all_mask = VL_MASK_ALL; | ||
4283 | |||
4284 | - for_each_set_bit(vl, (unsigned long *)&(vl_all_mask), | ||
4285 | - 8 * sizeof(vl_all_mask)) { | ||
4286 | + for_each_set_bit(vl, &vl_all_mask, BITS_PER_LONG) { | ||
4287 | u64 tmp = sum_vl_xmit_wait + | ||
4288 | read_port_cntr(ppd, C_TX_WAIT_VL, | ||
4289 | idx_from_vl(vl)); | ||
4290 | @@ -2994,7 +2990,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, | ||
4291 | u64 port_mask; | ||
4292 | u8 port_num; | ||
4293 | unsigned long vl; | ||
4294 | - u32 vl_select_mask; | ||
4295 | + unsigned long vl_select_mask; | ||
4296 | int vfi; | ||
4297 | u16 link_width; | ||
4298 | u16 link_speed; | ||
4299 | @@ -3071,8 +3067,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, | ||
4300 | * So in the for_each_set_bit() loop below, we don't need | ||
4301 | * any additional checks for vl. | ||
4302 | */ | ||
4303 | - for_each_set_bit(vl, (unsigned long *)&(vl_select_mask), | ||
4304 | - 8 * sizeof(req->vl_select_mask)) { | ||
4305 | + for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { | ||
4306 | memset(vlinfo, 0, sizeof(*vlinfo)); | ||
4307 | |||
4308 | rsp->vls[vfi].port_vl_xmit_data = | ||
4309 | @@ -3120,7 +3115,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, | ||
4310 | vfi++; | ||
4311 | } | ||
4312 | |||
4313 | - a0_datacounters(ppd, rsp, vl_select_mask); | ||
4314 | + a0_datacounters(ppd, rsp); | ||
4315 | |||
4316 | if (resp_len) | ||
4317 | *resp_len += response_data_size; | ||
4318 | @@ -3215,7 +3210,7 @@ static int pma_get_opa_porterrors(struct opa_pma_mad *pmp, | ||
4319 | struct _vls_ectrs *vlinfo; | ||
4320 | unsigned long vl; | ||
4321 | u64 port_mask, tmp; | ||
4322 | - u32 vl_select_mask; | ||
4323 | + unsigned long vl_select_mask; | ||
4324 | int vfi; | ||
4325 | |||
4326 | req = (struct opa_port_error_counters64_msg *)pmp->data; | ||
4327 | @@ -3273,8 +3268,7 @@ static int pma_get_opa_porterrors(struct opa_pma_mad *pmp, | ||
4328 | vlinfo = &rsp->vls[0]; | ||
4329 | vfi = 0; | ||
4330 | vl_select_mask = be32_to_cpu(req->vl_select_mask); | ||
4331 | - for_each_set_bit(vl, (unsigned long *)&(vl_select_mask), | ||
4332 | - 8 * sizeof(req->vl_select_mask)) { | ||
4333 | + for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { | ||
4334 | memset(vlinfo, 0, sizeof(*vlinfo)); | ||
4335 | rsp->vls[vfi].port_vl_xmit_discards = | ||
4336 | cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_DSCD_VL, | ||
4337 | @@ -3485,7 +3479,7 @@ static int pma_set_opa_portstatus(struct opa_pma_mad *pmp, | ||
4338 | u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24; | ||
4339 | u64 portn = be64_to_cpu(req->port_select_mask[3]); | ||
4340 | u32 counter_select = be32_to_cpu(req->counter_select_mask); | ||
4341 | - u32 vl_select_mask = VL_MASK_ALL; /* clear all per-vl cnts */ | ||
4342 | + unsigned long vl_select_mask = VL_MASK_ALL; /* clear all per-vl cnts */ | ||
4343 | unsigned long vl; | ||
4344 | |||
4345 | if ((nports != 1) || (portn != 1 << port)) { | ||
4346 | @@ -3579,8 +3573,7 @@ static int pma_set_opa_portstatus(struct opa_pma_mad *pmp, | ||
4347 | if (counter_select & CS_UNCORRECTABLE_ERRORS) | ||
4348 | write_dev_cntr(dd, C_DC_UNC_ERR, CNTR_INVALID_VL, 0); | ||
4349 | |||
4350 | - for_each_set_bit(vl, (unsigned long *)&(vl_select_mask), | ||
4351 | - 8 * sizeof(vl_select_mask)) { | ||
4352 | + for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { | ||
4353 | if (counter_select & CS_PORT_XMIT_DATA) | ||
4354 | write_port_cntr(ppd, C_TX_FLIT_VL, idx_from_vl(vl), 0); | ||
4355 | |||
4356 | diff --git a/drivers/infiniband/hw/hfi1/verbs.c b/drivers/infiniband/hw/hfi1/verbs.c | ||
4357 | index 646f61545ed6..9f53f63b1453 100644 | ||
4358 | --- a/drivers/infiniband/hw/hfi1/verbs.c | ||
4359 | +++ b/drivers/infiniband/hw/hfi1/verbs.c | ||
4360 | @@ -874,16 +874,17 @@ int hfi1_verbs_send_dma(struct rvt_qp *qp, struct hfi1_pkt_state *ps, | ||
4361 | else | ||
4362 | pbc |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT); | ||
4363 | |||
4364 | - if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode))) | ||
4365 | - pbc = hfi1_fault_tx(qp, ps->opcode, pbc); | ||
4366 | pbc = create_pbc(ppd, | ||
4367 | pbc, | ||
4368 | qp->srate_mbps, | ||
4369 | vl, | ||
4370 | plen); | ||
4371 | |||
4372 | - /* Update HCRC based on packet opcode */ | ||
4373 | - pbc = update_hcrc(ps->opcode, pbc); | ||
4374 | + if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode))) | ||
4375 | + pbc = hfi1_fault_tx(qp, ps->opcode, pbc); | ||
4376 | + else | ||
4377 | + /* Update HCRC based on packet opcode */ | ||
4378 | + pbc = update_hcrc(ps->opcode, pbc); | ||
4379 | } | ||
4380 | tx->wqe = qp->s_wqe; | ||
4381 | ret = build_verbs_tx_desc(tx->sde, len, tx, ahg_info, pbc); | ||
4382 | @@ -1030,12 +1031,12 @@ int hfi1_verbs_send_pio(struct rvt_qp *qp, struct hfi1_pkt_state *ps, | ||
4383 | else | ||
4384 | pbc |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT); | ||
4385 | |||
4386 | + pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen); | ||
4387 | if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode))) | ||
4388 | pbc = hfi1_fault_tx(qp, ps->opcode, pbc); | ||
4389 | - pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen); | ||
4390 | - | ||
4391 | - /* Update HCRC based on packet opcode */ | ||
4392 | - pbc = update_hcrc(ps->opcode, pbc); | ||
4393 | + else | ||
4394 | + /* Update HCRC based on packet opcode */ | ||
4395 | + pbc = update_hcrc(ps->opcode, pbc); | ||
4396 | } | ||
4397 | if (cb) | ||
4398 | iowait_pio_inc(&priv->s_iowait); | ||
4399 | diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c | ||
4400 | index 0569bcab02d4..14807ea8dc3f 100644 | ||
4401 | --- a/drivers/infiniband/hw/mlx5/main.c | ||
4402 | +++ b/drivers/infiniband/hw/mlx5/main.c | ||
4403 | @@ -6959,6 +6959,7 @@ static void mlx5_ib_remove(struct mlx5_core_dev *mdev, void *context) | ||
4404 | mlx5_ib_unbind_slave_port(mpi->ibdev, mpi); | ||
4405 | list_del(&mpi->list); | ||
4406 | mutex_unlock(&mlx5_ib_multiport_mutex); | ||
4407 | + kfree(mpi); | ||
4408 | return; | ||
4409 | } | ||
4410 | |||
4411 | diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile | ||
4412 | index f13f36ae1af6..c6a277e69848 100644 | ||
4413 | --- a/drivers/iommu/Makefile | ||
4414 | +++ b/drivers/iommu/Makefile | ||
4415 | @@ -10,7 +10,7 @@ obj-$(CONFIG_IOMMU_IO_PGTABLE_LPAE) += io-pgtable-arm.o | ||
4416 | obj-$(CONFIG_IOMMU_IOVA) += iova.o | ||
4417 | obj-$(CONFIG_OF_IOMMU) += of_iommu.o | ||
4418 | obj-$(CONFIG_MSM_IOMMU) += msm_iommu.o | ||
4419 | -obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o | ||
4420 | +obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o amd_iommu_quirks.o | ||
4421 | obj-$(CONFIG_AMD_IOMMU_DEBUGFS) += amd_iommu_debugfs.o | ||
4422 | obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o | ||
4423 | obj-$(CONFIG_ARM_SMMU) += arm-smmu.o | ||
4424 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c | ||
4425 | index 61de81965c44..e1259429ded2 100644 | ||
4426 | --- a/drivers/iommu/amd_iommu.c | ||
4427 | +++ b/drivers/iommu/amd_iommu.c | ||
4428 | @@ -2577,7 +2577,9 @@ static int map_sg(struct device *dev, struct scatterlist *sglist, | ||
4429 | |||
4430 | bus_addr = address + s->dma_address + (j << PAGE_SHIFT); | ||
4431 | phys_addr = (sg_phys(s) & PAGE_MASK) + (j << PAGE_SHIFT); | ||
4432 | - ret = iommu_map_page(domain, bus_addr, phys_addr, PAGE_SIZE, prot, GFP_ATOMIC); | ||
4433 | + ret = iommu_map_page(domain, bus_addr, phys_addr, | ||
4434 | + PAGE_SIZE, prot, | ||
4435 | + GFP_ATOMIC | __GFP_NOWARN); | ||
4436 | if (ret) | ||
4437 | goto out_unmap; | ||
4438 | |||
4439 | diff --git a/drivers/iommu/amd_iommu.h b/drivers/iommu/amd_iommu.h | ||
4440 | new file mode 100644 | ||
4441 | index 000000000000..12d540d9b59b | ||
4442 | --- /dev/null | ||
4443 | +++ b/drivers/iommu/amd_iommu.h | ||
4444 | @@ -0,0 +1,14 @@ | ||
4445 | +/* SPDX-License-Identifier: GPL-2.0-only */ | ||
4446 | + | ||
4447 | +#ifndef AMD_IOMMU_H | ||
4448 | +#define AMD_IOMMU_H | ||
4449 | + | ||
4450 | +int __init add_special_device(u8 type, u8 id, u16 *devid, bool cmd_line); | ||
4451 | + | ||
4452 | +#ifdef CONFIG_DMI | ||
4453 | +void amd_iommu_apply_ivrs_quirks(void); | ||
4454 | +#else | ||
4455 | +static void amd_iommu_apply_ivrs_quirks(void) { } | ||
4456 | +#endif | ||
4457 | + | ||
4458 | +#endif | ||
4459 | diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c | ||
4460 | index 4413aa67000e..568c52317757 100644 | ||
4461 | --- a/drivers/iommu/amd_iommu_init.c | ||
4462 | +++ b/drivers/iommu/amd_iommu_init.c | ||
4463 | @@ -32,6 +32,7 @@ | ||
4464 | #include <asm/irq_remapping.h> | ||
4465 | |||
4466 | #include <linux/crash_dump.h> | ||
4467 | +#include "amd_iommu.h" | ||
4468 | #include "amd_iommu_proto.h" | ||
4469 | #include "amd_iommu_types.h" | ||
4470 | #include "irq_remapping.h" | ||
4471 | @@ -1002,7 +1003,7 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu, | ||
4472 | set_iommu_for_device(iommu, devid); | ||
4473 | } | ||
4474 | |||
4475 | -static int __init add_special_device(u8 type, u8 id, u16 *devid, bool cmd_line) | ||
4476 | +int __init add_special_device(u8 type, u8 id, u16 *devid, bool cmd_line) | ||
4477 | { | ||
4478 | struct devid_map *entry; | ||
4479 | struct list_head *list; | ||
4480 | @@ -1153,6 +1154,8 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu, | ||
4481 | if (ret) | ||
4482 | return ret; | ||
4483 | |||
4484 | + amd_iommu_apply_ivrs_quirks(); | ||
4485 | + | ||
4486 | /* | ||
4487 | * First save the recommended feature enable bits from ACPI | ||
4488 | */ | ||
4489 | diff --git a/drivers/iommu/amd_iommu_quirks.c b/drivers/iommu/amd_iommu_quirks.c | ||
4490 | new file mode 100644 | ||
4491 | index 000000000000..c235f79b7a20 | ||
4492 | --- /dev/null | ||
4493 | +++ b/drivers/iommu/amd_iommu_quirks.c | ||
4494 | @@ -0,0 +1,92 @@ | ||
4495 | +/* SPDX-License-Identifier: GPL-2.0-only */ | ||
4496 | + | ||
4497 | +/* | ||
4498 | + * Quirks for AMD IOMMU | ||
4499 | + * | ||
4500 | + * Copyright (C) 2019 Kai-Heng Feng <kai.heng.feng@canonical.com> | ||
4501 | + */ | ||
4502 | + | ||
4503 | +#ifdef CONFIG_DMI | ||
4504 | +#include <linux/dmi.h> | ||
4505 | + | ||
4506 | +#include "amd_iommu.h" | ||
4507 | + | ||
4508 | +#define IVHD_SPECIAL_IOAPIC 1 | ||
4509 | + | ||
4510 | +struct ivrs_quirk_entry { | ||
4511 | + u8 id; | ||
4512 | + u16 devid; | ||
4513 | +}; | ||
4514 | + | ||
4515 | +enum { | ||
4516 | + DELL_INSPIRON_7375 = 0, | ||
4517 | + DELL_LATITUDE_5495, | ||
4518 | + LENOVO_IDEAPAD_330S_15ARR, | ||
4519 | +}; | ||
4520 | + | ||
4521 | +static const struct ivrs_quirk_entry ivrs_ioapic_quirks[][3] __initconst = { | ||
4522 | + /* ivrs_ioapic[4]=00:14.0 ivrs_ioapic[5]=00:00.2 */ | ||
4523 | + [DELL_INSPIRON_7375] = { | ||
4524 | + { .id = 4, .devid = 0xa0 }, | ||
4525 | + { .id = 5, .devid = 0x2 }, | ||
4526 | + {} | ||
4527 | + }, | ||
4528 | + /* ivrs_ioapic[4]=00:14.0 */ | ||
4529 | + [DELL_LATITUDE_5495] = { | ||
4530 | + { .id = 4, .devid = 0xa0 }, | ||
4531 | + {} | ||
4532 | + }, | ||
4533 | + /* ivrs_ioapic[32]=00:14.0 */ | ||
4534 | + [LENOVO_IDEAPAD_330S_15ARR] = { | ||
4535 | + { .id = 32, .devid = 0xa0 }, | ||
4536 | + {} | ||
4537 | + }, | ||
4538 | + {} | ||
4539 | +}; | ||
4540 | + | ||
4541 | +static int __init ivrs_ioapic_quirk_cb(const struct dmi_system_id *d) | ||
4542 | +{ | ||
4543 | + const struct ivrs_quirk_entry *i; | ||
4544 | + | ||
4545 | + for (i = d->driver_data; i->id != 0 && i->devid != 0; i++) | ||
4546 | + add_special_device(IVHD_SPECIAL_IOAPIC, i->id, (u16 *)&i->devid, 0); | ||
4547 | + | ||
4548 | + return 0; | ||
4549 | +} | ||
4550 | + | ||
4551 | +static const struct dmi_system_id ivrs_quirks[] __initconst = { | ||
4552 | + { | ||
4553 | + .callback = ivrs_ioapic_quirk_cb, | ||
4554 | + .ident = "Dell Inspiron 7375", | ||
4555 | + .matches = { | ||
4556 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
4557 | + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7375"), | ||
4558 | + }, | ||
4559 | + .driver_data = (void *)&ivrs_ioapic_quirks[DELL_INSPIRON_7375], | ||
4560 | + }, | ||
4561 | + { | ||
4562 | + .callback = ivrs_ioapic_quirk_cb, | ||
4563 | + .ident = "Dell Latitude 5495", | ||
4564 | + .matches = { | ||
4565 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
4566 | + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude 5495"), | ||
4567 | + }, | ||
4568 | + .driver_data = (void *)&ivrs_ioapic_quirks[DELL_LATITUDE_5495], | ||
4569 | + }, | ||
4570 | + { | ||
4571 | + .callback = ivrs_ioapic_quirk_cb, | ||
4572 | + .ident = "Lenovo ideapad 330S-15ARR", | ||
4573 | + .matches = { | ||
4574 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
4575 | + DMI_MATCH(DMI_PRODUCT_NAME, "81FB"), | ||
4576 | + }, | ||
4577 | + .driver_data = (void *)&ivrs_ioapic_quirks[LENOVO_IDEAPAD_330S_15ARR], | ||
4578 | + }, | ||
4579 | + {} | ||
4580 | +}; | ||
4581 | + | ||
4582 | +void __init amd_iommu_apply_ivrs_quirks(void) | ||
4583 | +{ | ||
4584 | + dmi_check_system(ivrs_quirks); | ||
4585 | +} | ||
4586 | +#endif | ||
4587 | diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c | ||
4588 | index c5c93e48b4db..d1ebe5ce3e47 100644 | ||
4589 | --- a/drivers/iommu/arm-smmu-v3.c | ||
4590 | +++ b/drivers/iommu/arm-smmu-v3.c | ||
4591 | @@ -2843,11 +2843,13 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu) | ||
4592 | } | ||
4593 | |||
4594 | /* Boolean feature flags */ | ||
4595 | +#if 0 /* ATS invalidation is slow and broken */ | ||
4596 | if (IS_ENABLED(CONFIG_PCI_PRI) && reg & IDR0_PRI) | ||
4597 | smmu->features |= ARM_SMMU_FEAT_PRI; | ||
4598 | |||
4599 | if (IS_ENABLED(CONFIG_PCI_ATS) && reg & IDR0_ATS) | ||
4600 | smmu->features |= ARM_SMMU_FEAT_ATS; | ||
4601 | +#endif | ||
4602 | |||
4603 | if (reg & IDR0_SEV) | ||
4604 | smmu->features |= ARM_SMMU_FEAT_SEV; | ||
4605 | diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c | ||
4606 | index 4786ca061e31..81e43c1df7ec 100644 | ||
4607 | --- a/drivers/iommu/intel_irq_remapping.c | ||
4608 | +++ b/drivers/iommu/intel_irq_remapping.c | ||
4609 | @@ -376,13 +376,13 @@ static int set_msi_sid_cb(struct pci_dev *pdev, u16 alias, void *opaque) | ||
4610 | { | ||
4611 | struct set_msi_sid_data *data = opaque; | ||
4612 | |||
4613 | + if (data->count == 0 || PCI_BUS_NUM(alias) == PCI_BUS_NUM(data->alias)) | ||
4614 | + data->busmatch_count++; | ||
4615 | + | ||
4616 | data->pdev = pdev; | ||
4617 | data->alias = alias; | ||
4618 | data->count++; | ||
4619 | |||
4620 | - if (PCI_BUS_NUM(alias) == pdev->bus->number) | ||
4621 | - data->busmatch_count++; | ||
4622 | - | ||
4623 | return 0; | ||
4624 | } | ||
4625 | |||
4626 | diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c | ||
4627 | index 3e1a8a675572..41c605b0058f 100644 | ||
4628 | --- a/drivers/iommu/iova.c | ||
4629 | +++ b/drivers/iommu/iova.c | ||
4630 | @@ -577,7 +577,9 @@ void queue_iova(struct iova_domain *iovad, | ||
4631 | |||
4632 | spin_unlock_irqrestore(&fq->lock, flags); | ||
4633 | |||
4634 | - if (atomic_cmpxchg(&iovad->fq_timer_on, 0, 1) == 0) | ||
4635 | + /* Avoid false sharing as much as possible. */ | ||
4636 | + if (!atomic_read(&iovad->fq_timer_on) && | ||
4637 | + !atomic_cmpxchg(&iovad->fq_timer_on, 0, 1)) | ||
4638 | mod_timer(&iovad->fq_timer, | ||
4639 | jiffies + msecs_to_jiffies(IOVA_FQ_TIMEOUT)); | ||
4640 | } | ||
4641 | diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c | ||
4642 | index 1b5c3672aea2..c3a8d732805f 100644 | ||
4643 | --- a/drivers/irqchip/irq-gic-v3-its.c | ||
4644 | +++ b/drivers/irqchip/irq-gic-v3-its.c | ||
4645 | @@ -2641,14 +2641,13 @@ static void its_irq_domain_free(struct irq_domain *domain, unsigned int virq, | ||
4646 | struct its_node *its = its_dev->its; | ||
4647 | int i; | ||
4648 | |||
4649 | + bitmap_release_region(its_dev->event_map.lpi_map, | ||
4650 | + its_get_event_id(irq_domain_get_irq_data(domain, virq)), | ||
4651 | + get_count_order(nr_irqs)); | ||
4652 | + | ||
4653 | for (i = 0; i < nr_irqs; i++) { | ||
4654 | struct irq_data *data = irq_domain_get_irq_data(domain, | ||
4655 | virq + i); | ||
4656 | - u32 event = its_get_event_id(data); | ||
4657 | - | ||
4658 | - /* Mark interrupt index as unused */ | ||
4659 | - clear_bit(event, its_dev->event_map.lpi_map); | ||
4660 | - | ||
4661 | /* Nuke the entry in the domain */ | ||
4662 | irq_domain_reset_irq_data(data); | ||
4663 | } | ||
4664 | diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c | ||
4665 | index cf755964f2f8..c72c036aea76 100644 | ||
4666 | --- a/drivers/irqchip/irq-sifive-plic.c | ||
4667 | +++ b/drivers/irqchip/irq-sifive-plic.c | ||
4668 | @@ -244,6 +244,7 @@ static int __init plic_init(struct device_node *node, | ||
4669 | struct plic_handler *handler; | ||
4670 | irq_hw_number_t hwirq; | ||
4671 | int cpu, hartid; | ||
4672 | + u32 threshold = 0; | ||
4673 | |||
4674 | if (of_irq_parse_one(node, i, &parent)) { | ||
4675 | pr_err("failed to parse parent for context %d.\n", i); | ||
4676 | @@ -266,10 +267,16 @@ static int __init plic_init(struct device_node *node, | ||
4677 | continue; | ||
4678 | } | ||
4679 | |||
4680 | + /* | ||
4681 | + * When running in M-mode we need to ignore the S-mode handler. | ||
4682 | + * Here we assume it always comes later, but that might be a | ||
4683 | + * little fragile. | ||
4684 | + */ | ||
4685 | handler = per_cpu_ptr(&plic_handlers, cpu); | ||
4686 | if (handler->present) { | ||
4687 | pr_warn("handler already present for context %d.\n", i); | ||
4688 | - continue; | ||
4689 | + threshold = 0xffffffff; | ||
4690 | + goto done; | ||
4691 | } | ||
4692 | |||
4693 | handler->present = true; | ||
4694 | @@ -279,8 +286,9 @@ static int __init plic_init(struct device_node *node, | ||
4695 | handler->enable_base = | ||
4696 | plic_regs + ENABLE_BASE + i * ENABLE_PER_HART; | ||
4697 | |||
4698 | +done: | ||
4699 | /* priority must be > threshold to trigger an interrupt */ | ||
4700 | - writel(0, handler->hart_base + CONTEXT_THRESHOLD); | ||
4701 | + writel(threshold, handler->hart_base + CONTEXT_THRESHOLD); | ||
4702 | for (hwirq = 1; hwirq <= nr_irqs; hwirq++) | ||
4703 | plic_toggle(handler, hwirq, 0); | ||
4704 | nr_handlers++; | ||
4705 | diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c | ||
4706 | index c6ba37df4b9d..dff4132b3702 100644 | ||
4707 | --- a/drivers/isdn/mISDN/socket.c | ||
4708 | +++ b/drivers/isdn/mISDN/socket.c | ||
4709 | @@ -754,6 +754,8 @@ base_sock_create(struct net *net, struct socket *sock, int protocol, int kern) | ||
4710 | |||
4711 | if (sock->type != SOCK_RAW) | ||
4712 | return -ESOCKTNOSUPPORT; | ||
4713 | + if (!capable(CAP_NET_RAW)) | ||
4714 | + return -EPERM; | ||
4715 | |||
4716 | sk = sk_alloc(net, PF_ISDN, GFP_KERNEL, &mISDN_proto, kern); | ||
4717 | if (!sk) | ||
4718 | diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c | ||
4719 | index 8d11a5e23227..eff1bda8b520 100644 | ||
4720 | --- a/drivers/leds/led-triggers.c | ||
4721 | +++ b/drivers/leds/led-triggers.c | ||
4722 | @@ -173,6 +173,7 @@ err_activate: | ||
4723 | list_del(&led_cdev->trig_list); | ||
4724 | write_unlock_irqrestore(&led_cdev->trigger->leddev_list_lock, flags); | ||
4725 | led_set_brightness(led_cdev, LED_OFF); | ||
4726 | + kfree(event); | ||
4727 | |||
4728 | return ret; | ||
4729 | } | ||
4730 | diff --git a/drivers/leds/leds-lm3532.c b/drivers/leds/leds-lm3532.c | ||
4731 | index 180895b83b88..e55a64847fe2 100644 | ||
4732 | --- a/drivers/leds/leds-lm3532.c | ||
4733 | +++ b/drivers/leds/leds-lm3532.c | ||
4734 | @@ -40,7 +40,7 @@ | ||
4735 | #define LM3532_REG_ZN_3_LO 0x67 | ||
4736 | #define LM3532_REG_MAX 0x7e | ||
4737 | |||
4738 | -/* Contorl Enable */ | ||
4739 | +/* Control Enable */ | ||
4740 | #define LM3532_CTRL_A_ENABLE BIT(0) | ||
4741 | #define LM3532_CTRL_B_ENABLE BIT(1) | ||
4742 | #define LM3532_CTRL_C_ENABLE BIT(2) | ||
4743 | @@ -302,7 +302,7 @@ static int lm3532_led_disable(struct lm3532_led *led_data) | ||
4744 | int ret; | ||
4745 | |||
4746 | ret = regmap_update_bits(led_data->priv->regmap, LM3532_REG_ENABLE, | ||
4747 | - ctrl_en_val, ~ctrl_en_val); | ||
4748 | + ctrl_en_val, 0); | ||
4749 | if (ret) { | ||
4750 | dev_err(led_data->priv->dev, "Failed to set ctrl:%d\n", ret); | ||
4751 | return ret; | ||
4752 | @@ -321,7 +321,7 @@ static int lm3532_brightness_set(struct led_classdev *led_cdev, | ||
4753 | |||
4754 | mutex_lock(&led->priv->lock); | ||
4755 | |||
4756 | - if (led->mode == LM3532_BL_MODE_ALS) { | ||
4757 | + if (led->mode == LM3532_ALS_CTRL) { | ||
4758 | if (brt_val > LED_OFF) | ||
4759 | ret = lm3532_led_enable(led); | ||
4760 | else | ||
4761 | @@ -542,11 +542,14 @@ static int lm3532_parse_node(struct lm3532_data *priv) | ||
4762 | } | ||
4763 | |||
4764 | if (led->mode == LM3532_BL_MODE_ALS) { | ||
4765 | + led->mode = LM3532_ALS_CTRL; | ||
4766 | ret = lm3532_parse_als(priv); | ||
4767 | if (ret) | ||
4768 | dev_err(&priv->client->dev, "Failed to parse als\n"); | ||
4769 | else | ||
4770 | lm3532_als_configure(priv, led); | ||
4771 | + } else { | ||
4772 | + led->mode = LM3532_I2C_CTRL; | ||
4773 | } | ||
4774 | |||
4775 | led->num_leds = fwnode_property_read_u32_array(child, | ||
4776 | @@ -590,7 +593,13 @@ static int lm3532_parse_node(struct lm3532_data *priv) | ||
4777 | goto child_out; | ||
4778 | } | ||
4779 | |||
4780 | - lm3532_init_registers(led); | ||
4781 | + ret = lm3532_init_registers(led); | ||
4782 | + if (ret) { | ||
4783 | + dev_err(&priv->client->dev, "register init err: %d\n", | ||
4784 | + ret); | ||
4785 | + fwnode_handle_put(child); | ||
4786 | + goto child_out; | ||
4787 | + } | ||
4788 | |||
4789 | i++; | ||
4790 | } | ||
4791 | diff --git a/drivers/leds/leds-lp5562.c b/drivers/leds/leds-lp5562.c | ||
4792 | index 37632fc63741..edb57c42e8b1 100644 | ||
4793 | --- a/drivers/leds/leds-lp5562.c | ||
4794 | +++ b/drivers/leds/leds-lp5562.c | ||
4795 | @@ -260,7 +260,11 @@ static void lp5562_firmware_loaded(struct lp55xx_chip *chip) | ||
4796 | { | ||
4797 | const struct firmware *fw = chip->fw; | ||
4798 | |||
4799 | - if (fw->size > LP5562_PROGRAM_LENGTH) { | ||
4800 | + /* | ||
4801 | + * the firmware is encoded in ascii hex character, with 2 chars | ||
4802 | + * per byte | ||
4803 | + */ | ||
4804 | + if (fw->size > (LP5562_PROGRAM_LENGTH * 2)) { | ||
4805 | dev_err(&chip->cl->dev, "firmware data size overflow: %zu\n", | ||
4806 | fw->size); | ||
4807 | return; | ||
4808 | diff --git a/drivers/md/bcache/closure.c b/drivers/md/bcache/closure.c | ||
4809 | index 73f5319295bc..c12cd809ab19 100644 | ||
4810 | --- a/drivers/md/bcache/closure.c | ||
4811 | +++ b/drivers/md/bcache/closure.c | ||
4812 | @@ -105,8 +105,14 @@ struct closure_syncer { | ||
4813 | |||
4814 | static void closure_sync_fn(struct closure *cl) | ||
4815 | { | ||
4816 | - cl->s->done = 1; | ||
4817 | - wake_up_process(cl->s->task); | ||
4818 | + struct closure_syncer *s = cl->s; | ||
4819 | + struct task_struct *p; | ||
4820 | + | ||
4821 | + rcu_read_lock(); | ||
4822 | + p = READ_ONCE(s->task); | ||
4823 | + s->done = 1; | ||
4824 | + wake_up_process(p); | ||
4825 | + rcu_read_unlock(); | ||
4826 | } | ||
4827 | |||
4828 | void __sched __closure_sync(struct closure *cl) | ||
4829 | diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c | ||
4830 | index c9e44ac1f9a6..21d5c1784d0c 100644 | ||
4831 | --- a/drivers/md/dm-rq.c | ||
4832 | +++ b/drivers/md/dm-rq.c | ||
4833 | @@ -408,6 +408,7 @@ static int map_request(struct dm_rq_target_io *tio) | ||
4834 | ret = dm_dispatch_clone_request(clone, rq); | ||
4835 | if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) { | ||
4836 | blk_rq_unprep_clone(clone); | ||
4837 | + blk_mq_cleanup_rq(clone); | ||
4838 | tio->ti->type->release_clone_rq(clone, &tio->info); | ||
4839 | tio->clone = NULL; | ||
4840 | return DM_MAPIO_REQUEUE; | ||
4841 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
4842 | index 24638ccedce4..3100dd53c64c 100644 | ||
4843 | --- a/drivers/md/md.c | ||
4844 | +++ b/drivers/md/md.c | ||
4845 | @@ -1826,8 +1826,15 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) | ||
4846 | if (!(le32_to_cpu(sb->feature_map) & | ||
4847 | MD_FEATURE_RECOVERY_BITMAP)) | ||
4848 | rdev->saved_raid_disk = -1; | ||
4849 | - } else | ||
4850 | - set_bit(In_sync, &rdev->flags); | ||
4851 | + } else { | ||
4852 | + /* | ||
4853 | + * If the array is FROZEN, then the device can't | ||
4854 | + * be in_sync with rest of array. | ||
4855 | + */ | ||
4856 | + if (!test_bit(MD_RECOVERY_FROZEN, | ||
4857 | + &mddev->recovery)) | ||
4858 | + set_bit(In_sync, &rdev->flags); | ||
4859 | + } | ||
4860 | rdev->raid_disk = role; | ||
4861 | break; | ||
4862 | } | ||
4863 | @@ -4176,7 +4183,7 @@ array_state_show(struct mddev *mddev, char *page) | ||
4864 | { | ||
4865 | enum array_state st = inactive; | ||
4866 | |||
4867 | - if (mddev->pers) | ||
4868 | + if (mddev->pers && !test_bit(MD_NOT_READY, &mddev->flags)) | ||
4869 | switch(mddev->ro) { | ||
4870 | case 1: | ||
4871 | st = readonly; | ||
4872 | @@ -5744,9 +5751,6 @@ int md_run(struct mddev *mddev) | ||
4873 | md_update_sb(mddev, 0); | ||
4874 | |||
4875 | md_new_event(mddev); | ||
4876 | - sysfs_notify_dirent_safe(mddev->sysfs_state); | ||
4877 | - sysfs_notify_dirent_safe(mddev->sysfs_action); | ||
4878 | - sysfs_notify(&mddev->kobj, NULL, "degraded"); | ||
4879 | return 0; | ||
4880 | |||
4881 | bitmap_abort: | ||
4882 | @@ -5767,6 +5771,7 @@ static int do_md_run(struct mddev *mddev) | ||
4883 | { | ||
4884 | int err; | ||
4885 | |||
4886 | + set_bit(MD_NOT_READY, &mddev->flags); | ||
4887 | err = md_run(mddev); | ||
4888 | if (err) | ||
4889 | goto out; | ||
4890 | @@ -5787,9 +5792,14 @@ static int do_md_run(struct mddev *mddev) | ||
4891 | |||
4892 | set_capacity(mddev->gendisk, mddev->array_sectors); | ||
4893 | revalidate_disk(mddev->gendisk); | ||
4894 | + clear_bit(MD_NOT_READY, &mddev->flags); | ||
4895 | mddev->changed = 1; | ||
4896 | kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); | ||
4897 | + sysfs_notify_dirent_safe(mddev->sysfs_state); | ||
4898 | + sysfs_notify_dirent_safe(mddev->sysfs_action); | ||
4899 | + sysfs_notify(&mddev->kobj, NULL, "degraded"); | ||
4900 | out: | ||
4901 | + clear_bit(MD_NOT_READY, &mddev->flags); | ||
4902 | return err; | ||
4903 | } | ||
4904 | |||
4905 | @@ -8900,6 +8910,7 @@ void md_check_recovery(struct mddev *mddev) | ||
4906 | |||
4907 | if (mddev_trylock(mddev)) { | ||
4908 | int spares = 0; | ||
4909 | + bool try_set_sync = mddev->safemode != 0; | ||
4910 | |||
4911 | if (!mddev->external && mddev->safemode == 1) | ||
4912 | mddev->safemode = 0; | ||
4913 | @@ -8945,7 +8956,7 @@ void md_check_recovery(struct mddev *mddev) | ||
4914 | } | ||
4915 | } | ||
4916 | |||
4917 | - if (!mddev->external && !mddev->in_sync) { | ||
4918 | + if (try_set_sync && !mddev->external && !mddev->in_sync) { | ||
4919 | spin_lock(&mddev->lock); | ||
4920 | set_in_sync(mddev); | ||
4921 | spin_unlock(&mddev->lock); | ||
4922 | @@ -9043,7 +9054,8 @@ void md_reap_sync_thread(struct mddev *mddev) | ||
4923 | /* resync has finished, collect result */ | ||
4924 | md_unregister_thread(&mddev->sync_thread); | ||
4925 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && | ||
4926 | - !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { | ||
4927 | + !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) && | ||
4928 | + mddev->degraded != mddev->raid_disks) { | ||
4929 | /* success...*/ | ||
4930 | /* activate any spares */ | ||
4931 | if (mddev->pers->spare_active(mddev)) { | ||
4932 | diff --git a/drivers/md/md.h b/drivers/md/md.h | ||
4933 | index 10f98200e2f8..08f2aee383e8 100644 | ||
4934 | --- a/drivers/md/md.h | ||
4935 | +++ b/drivers/md/md.h | ||
4936 | @@ -248,6 +248,9 @@ enum mddev_flags { | ||
4937 | MD_UPDATING_SB, /* md_check_recovery is updating the metadata | ||
4938 | * without explicitly holding reconfig_mutex. | ||
4939 | */ | ||
4940 | + MD_NOT_READY, /* do_md_run() is active, so 'array_state' | ||
4941 | + * must not report that array is ready yet | ||
4942 | + */ | ||
4943 | }; | ||
4944 | |||
4945 | enum mddev_sb_flags { | ||
4946 | diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c | ||
4947 | index bf5cf184a260..297bbc0f41f0 100644 | ||
4948 | --- a/drivers/md/raid0.c | ||
4949 | +++ b/drivers/md/raid0.c | ||
4950 | @@ -19,6 +19,9 @@ | ||
4951 | #include "raid0.h" | ||
4952 | #include "raid5.h" | ||
4953 | |||
4954 | +static int default_layout = 0; | ||
4955 | +module_param(default_layout, int, 0644); | ||
4956 | + | ||
4957 | #define UNSUPPORTED_MDDEV_FLAGS \ | ||
4958 | ((1L << MD_HAS_JOURNAL) | \ | ||
4959 | (1L << MD_JOURNAL_CLEAN) | \ | ||
4960 | @@ -139,6 +142,19 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf) | ||
4961 | } | ||
4962 | pr_debug("md/raid0:%s: FINAL %d zones\n", | ||
4963 | mdname(mddev), conf->nr_strip_zones); | ||
4964 | + | ||
4965 | + if (conf->nr_strip_zones == 1) { | ||
4966 | + conf->layout = RAID0_ORIG_LAYOUT; | ||
4967 | + } else if (default_layout == RAID0_ORIG_LAYOUT || | ||
4968 | + default_layout == RAID0_ALT_MULTIZONE_LAYOUT) { | ||
4969 | + conf->layout = default_layout; | ||
4970 | + } else { | ||
4971 | + pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n", | ||
4972 | + mdname(mddev)); | ||
4973 | + pr_err("md/raid0: please set raid.default_layout to 1 or 2\n"); | ||
4974 | + err = -ENOTSUPP; | ||
4975 | + goto abort; | ||
4976 | + } | ||
4977 | /* | ||
4978 | * now since we have the hard sector sizes, we can make sure | ||
4979 | * chunk size is a multiple of that sector size | ||
4980 | @@ -547,10 +563,12 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) | ||
4981 | |||
4982 | static bool raid0_make_request(struct mddev *mddev, struct bio *bio) | ||
4983 | { | ||
4984 | + struct r0conf *conf = mddev->private; | ||
4985 | struct strip_zone *zone; | ||
4986 | struct md_rdev *tmp_dev; | ||
4987 | sector_t bio_sector; | ||
4988 | sector_t sector; | ||
4989 | + sector_t orig_sector; | ||
4990 | unsigned chunk_sects; | ||
4991 | unsigned sectors; | ||
4992 | |||
4993 | @@ -584,8 +602,21 @@ static bool raid0_make_request(struct mddev *mddev, struct bio *bio) | ||
4994 | bio = split; | ||
4995 | } | ||
4996 | |||
4997 | + orig_sector = sector; | ||
4998 | zone = find_zone(mddev->private, §or); | ||
4999 | - tmp_dev = map_sector(mddev, zone, sector, §or); | ||
5000 | + switch (conf->layout) { | ||
5001 | + case RAID0_ORIG_LAYOUT: | ||
5002 | + tmp_dev = map_sector(mddev, zone, orig_sector, §or); | ||
5003 | + break; | ||
5004 | + case RAID0_ALT_MULTIZONE_LAYOUT: | ||
5005 | + tmp_dev = map_sector(mddev, zone, sector, §or); | ||
5006 | + break; | ||
5007 | + default: | ||
5008 | + WARN("md/raid0:%s: Invalid layout\n", mdname(mddev)); | ||
5009 | + bio_io_error(bio); | ||
5010 | + return true; | ||
5011 | + } | ||
5012 | + | ||
5013 | bio_set_dev(bio, tmp_dev->bdev); | ||
5014 | bio->bi_iter.bi_sector = sector + zone->dev_start + | ||
5015 | tmp_dev->data_offset; | ||
5016 | diff --git a/drivers/md/raid0.h b/drivers/md/raid0.h | ||
5017 | index 540e65d92642..3816e5477db1 100644 | ||
5018 | --- a/drivers/md/raid0.h | ||
5019 | +++ b/drivers/md/raid0.h | ||
5020 | @@ -8,11 +8,25 @@ struct strip_zone { | ||
5021 | int nb_dev; /* # of devices attached to the zone */ | ||
5022 | }; | ||
5023 | |||
5024 | +/* Linux 3.14 (20d0189b101) made an unintended change to | ||
5025 | + * the RAID0 layout for multi-zone arrays (where devices aren't all | ||
5026 | + * the same size. | ||
5027 | + * RAID0_ORIG_LAYOUT restores the original layout | ||
5028 | + * RAID0_ALT_MULTIZONE_LAYOUT uses the altered layout | ||
5029 | + * The layouts are identical when there is only one zone (all | ||
5030 | + * devices the same size). | ||
5031 | + */ | ||
5032 | + | ||
5033 | +enum r0layout { | ||
5034 | + RAID0_ORIG_LAYOUT = 1, | ||
5035 | + RAID0_ALT_MULTIZONE_LAYOUT = 2, | ||
5036 | +}; | ||
5037 | struct r0conf { | ||
5038 | struct strip_zone *strip_zone; | ||
5039 | struct md_rdev **devlist; /* lists of rdevs, pointed to | ||
5040 | * by strip_zone->dev */ | ||
5041 | int nr_strip_zones; | ||
5042 | + enum r0layout layout; | ||
5043 | }; | ||
5044 | |||
5045 | #endif | ||
5046 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
5047 | index 34e26834ad28..5afbb7df06e7 100644 | ||
5048 | --- a/drivers/md/raid1.c | ||
5049 | +++ b/drivers/md/raid1.c | ||
5050 | @@ -447,19 +447,21 @@ static void raid1_end_write_request(struct bio *bio) | ||
5051 | /* We never try FailFast to WriteMostly devices */ | ||
5052 | !test_bit(WriteMostly, &rdev->flags)) { | ||
5053 | md_error(r1_bio->mddev, rdev); | ||
5054 | - if (!test_bit(Faulty, &rdev->flags)) | ||
5055 | - /* This is the only remaining device, | ||
5056 | - * We need to retry the write without | ||
5057 | - * FailFast | ||
5058 | - */ | ||
5059 | - set_bit(R1BIO_WriteError, &r1_bio->state); | ||
5060 | - else { | ||
5061 | - /* Finished with this branch */ | ||
5062 | - r1_bio->bios[mirror] = NULL; | ||
5063 | - to_put = bio; | ||
5064 | - } | ||
5065 | - } else | ||
5066 | + } | ||
5067 | + | ||
5068 | + /* | ||
5069 | + * When the device is faulty, it is not necessary to | ||
5070 | + * handle write error. | ||
5071 | + * For failfast, this is the only remaining device, | ||
5072 | + * We need to retry the write without FailFast. | ||
5073 | + */ | ||
5074 | + if (!test_bit(Faulty, &rdev->flags)) | ||
5075 | set_bit(R1BIO_WriteError, &r1_bio->state); | ||
5076 | + else { | ||
5077 | + /* Finished with this branch */ | ||
5078 | + r1_bio->bios[mirror] = NULL; | ||
5079 | + to_put = bio; | ||
5080 | + } | ||
5081 | } else { | ||
5082 | /* | ||
5083 | * Set R1BIO_Uptodate in our master bio, so that we | ||
5084 | @@ -3127,6 +3129,13 @@ static int raid1_run(struct mddev *mddev) | ||
5085 | !test_bit(In_sync, &conf->mirrors[i].rdev->flags) || | ||
5086 | test_bit(Faulty, &conf->mirrors[i].rdev->flags)) | ||
5087 | mddev->degraded++; | ||
5088 | + /* | ||
5089 | + * RAID1 needs at least one disk in active | ||
5090 | + */ | ||
5091 | + if (conf->raid_disks - mddev->degraded < 1) { | ||
5092 | + ret = -EINVAL; | ||
5093 | + goto abort; | ||
5094 | + } | ||
5095 | |||
5096 | if (conf->raid_disks - mddev->degraded == 1) | ||
5097 | mddev->recovery_cp = MaxSector; | ||
5098 | @@ -3160,8 +3169,12 @@ static int raid1_run(struct mddev *mddev) | ||
5099 | ret = md_integrity_register(mddev); | ||
5100 | if (ret) { | ||
5101 | md_unregister_thread(&mddev->thread); | ||
5102 | - raid1_free(mddev, conf); | ||
5103 | + goto abort; | ||
5104 | } | ||
5105 | + return 0; | ||
5106 | + | ||
5107 | +abort: | ||
5108 | + raid1_free(mddev, conf); | ||
5109 | return ret; | ||
5110 | } | ||
5111 | |||
5112 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | ||
5113 | index 3de4e13bde98..39f8ef6ee59c 100644 | ||
5114 | --- a/drivers/md/raid5.c | ||
5115 | +++ b/drivers/md/raid5.c | ||
5116 | @@ -2526,7 +2526,8 @@ static void raid5_end_read_request(struct bio * bi) | ||
5117 | int set_bad = 0; | ||
5118 | |||
5119 | clear_bit(R5_UPTODATE, &sh->dev[i].flags); | ||
5120 | - atomic_inc(&rdev->read_errors); | ||
5121 | + if (!(bi->bi_status == BLK_STS_PROTECTION)) | ||
5122 | + atomic_inc(&rdev->read_errors); | ||
5123 | if (test_bit(R5_ReadRepl, &sh->dev[i].flags)) | ||
5124 | pr_warn_ratelimited( | ||
5125 | "md/raid:%s: read error on replacement device (sector %llu on %s).\n", | ||
5126 | @@ -2558,7 +2559,9 @@ static void raid5_end_read_request(struct bio * bi) | ||
5127 | && !test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) | ||
5128 | retry = 1; | ||
5129 | if (retry) | ||
5130 | - if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) { | ||
5131 | + if (sh->qd_idx >= 0 && sh->pd_idx == i) | ||
5132 | + set_bit(R5_ReadError, &sh->dev[i].flags); | ||
5133 | + else if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) { | ||
5134 | set_bit(R5_ReadError, &sh->dev[i].flags); | ||
5135 | clear_bit(R5_ReadNoMerge, &sh->dev[i].flags); | ||
5136 | } else | ||
5137 | @@ -5718,7 +5721,8 @@ static bool raid5_make_request(struct mddev *mddev, struct bio * bi) | ||
5138 | do_flush = false; | ||
5139 | } | ||
5140 | |||
5141 | - set_bit(STRIPE_HANDLE, &sh->state); | ||
5142 | + if (!sh->batch_head) | ||
5143 | + set_bit(STRIPE_HANDLE, &sh->state); | ||
5144 | clear_bit(STRIPE_DELAYED, &sh->state); | ||
5145 | if ((!sh->batch_head || sh == sh->batch_head) && | ||
5146 | (bi->bi_opf & REQ_SYNC) && | ||
5147 | diff --git a/drivers/media/cec/cec-notifier.c b/drivers/media/cec/cec-notifier.c | ||
5148 | index 52a867bde15f..4d82a5522072 100644 | ||
5149 | --- a/drivers/media/cec/cec-notifier.c | ||
5150 | +++ b/drivers/media/cec/cec-notifier.c | ||
5151 | @@ -218,6 +218,8 @@ void cec_notifier_unregister(struct cec_notifier *n) | ||
5152 | |||
5153 | mutex_lock(&n->lock); | ||
5154 | n->callback = NULL; | ||
5155 | + n->cec_adap->notifier = NULL; | ||
5156 | + n->cec_adap = NULL; | ||
5157 | mutex_unlock(&n->lock); | ||
5158 | cec_notifier_put(n); | ||
5159 | } | ||
5160 | diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c | ||
5161 | index 40d76eb4c2fe..5a9ba3846f0a 100644 | ||
5162 | --- a/drivers/media/common/videobuf2/videobuf2-v4l2.c | ||
5163 | +++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c | ||
5164 | @@ -872,17 +872,19 @@ EXPORT_SYMBOL_GPL(vb2_queue_release); | ||
5165 | __poll_t vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) | ||
5166 | { | ||
5167 | struct video_device *vfd = video_devdata(file); | ||
5168 | - __poll_t res = 0; | ||
5169 | + __poll_t res; | ||
5170 | + | ||
5171 | + res = vb2_core_poll(q, file, wait); | ||
5172 | |||
5173 | if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) { | ||
5174 | struct v4l2_fh *fh = file->private_data; | ||
5175 | |||
5176 | poll_wait(file, &fh->wait, wait); | ||
5177 | if (v4l2_event_pending(fh)) | ||
5178 | - res = EPOLLPRI; | ||
5179 | + res |= EPOLLPRI; | ||
5180 | } | ||
5181 | |||
5182 | - return res | vb2_core_poll(q, file, wait); | ||
5183 | + return res; | ||
5184 | } | ||
5185 | EXPORT_SYMBOL_GPL(vb2_poll); | ||
5186 | |||
5187 | diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c | ||
5188 | index 209186c5cd9b..06ea30a689d7 100644 | ||
5189 | --- a/drivers/media/dvb-core/dvb_frontend.c | ||
5190 | +++ b/drivers/media/dvb-core/dvb_frontend.c | ||
5191 | @@ -152,6 +152,9 @@ static void dvb_frontend_free(struct kref *ref) | ||
5192 | |||
5193 | static void dvb_frontend_put(struct dvb_frontend *fe) | ||
5194 | { | ||
5195 | + /* call detach before dropping the reference count */ | ||
5196 | + if (fe->ops.detach) | ||
5197 | + fe->ops.detach(fe); | ||
5198 | /* | ||
5199 | * Check if the frontend was registered, as otherwise | ||
5200 | * kref was not initialized yet. | ||
5201 | @@ -3040,7 +3043,6 @@ void dvb_frontend_detach(struct dvb_frontend *fe) | ||
5202 | dvb_frontend_invoke_release(fe, fe->ops.release_sec); | ||
5203 | dvb_frontend_invoke_release(fe, fe->ops.tuner_ops.release); | ||
5204 | dvb_frontend_invoke_release(fe, fe->ops.analog_ops.release); | ||
5205 | - dvb_frontend_invoke_release(fe, fe->ops.detach); | ||
5206 | dvb_frontend_put(fe); | ||
5207 | } | ||
5208 | EXPORT_SYMBOL(dvb_frontend_detach); | ||
5209 | diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c | ||
5210 | index a3393cd4e584..7557fbf9d306 100644 | ||
5211 | --- a/drivers/media/dvb-core/dvbdev.c | ||
5212 | +++ b/drivers/media/dvb-core/dvbdev.c | ||
5213 | @@ -339,8 +339,10 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev, | ||
5214 | if (npads) { | ||
5215 | dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads), | ||
5216 | GFP_KERNEL); | ||
5217 | - if (!dvbdev->pads) | ||
5218 | + if (!dvbdev->pads) { | ||
5219 | + kfree(dvbdev->entity); | ||
5220 | return -ENOMEM; | ||
5221 | + } | ||
5222 | } | ||
5223 | |||
5224 | switch (type) { | ||
5225 | diff --git a/drivers/media/dvb-frontends/dvb-pll.c b/drivers/media/dvb-frontends/dvb-pll.c | ||
5226 | index ba0c49107bd2..d45b4ddc8f91 100644 | ||
5227 | --- a/drivers/media/dvb-frontends/dvb-pll.c | ||
5228 | +++ b/drivers/media/dvb-frontends/dvb-pll.c | ||
5229 | @@ -9,6 +9,7 @@ | ||
5230 | |||
5231 | #include <linux/slab.h> | ||
5232 | #include <linux/module.h> | ||
5233 | +#include <linux/idr.h> | ||
5234 | #include <linux/dvb/frontend.h> | ||
5235 | #include <asm/types.h> | ||
5236 | |||
5237 | @@ -34,8 +35,7 @@ struct dvb_pll_priv { | ||
5238 | }; | ||
5239 | |||
5240 | #define DVB_PLL_MAX 64 | ||
5241 | - | ||
5242 | -static unsigned int dvb_pll_devcount; | ||
5243 | +static DEFINE_IDA(pll_ida); | ||
5244 | |||
5245 | static int debug; | ||
5246 | module_param(debug, int, 0644); | ||
5247 | @@ -787,6 +787,7 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, | ||
5248 | struct dvb_pll_priv *priv = NULL; | ||
5249 | int ret; | ||
5250 | const struct dvb_pll_desc *desc; | ||
5251 | + int nr; | ||
5252 | |||
5253 | b1 = kmalloc(1, GFP_KERNEL); | ||
5254 | if (!b1) | ||
5255 | @@ -795,9 +796,14 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, | ||
5256 | b1[0] = 0; | ||
5257 | msg.buf = b1; | ||
5258 | |||
5259 | - if ((id[dvb_pll_devcount] > DVB_PLL_UNDEFINED) && | ||
5260 | - (id[dvb_pll_devcount] < ARRAY_SIZE(pll_list))) | ||
5261 | - pll_desc_id = id[dvb_pll_devcount]; | ||
5262 | + nr = ida_simple_get(&pll_ida, 0, DVB_PLL_MAX, GFP_KERNEL); | ||
5263 | + if (nr < 0) { | ||
5264 | + kfree(b1); | ||
5265 | + return NULL; | ||
5266 | + } | ||
5267 | + | ||
5268 | + if (id[nr] > DVB_PLL_UNDEFINED && id[nr] < ARRAY_SIZE(pll_list)) | ||
5269 | + pll_desc_id = id[nr]; | ||
5270 | |||
5271 | BUG_ON(pll_desc_id < 1 || pll_desc_id >= ARRAY_SIZE(pll_list)); | ||
5272 | |||
5273 | @@ -808,24 +814,20 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, | ||
5274 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
5275 | |||
5276 | ret = i2c_transfer (i2c, &msg, 1); | ||
5277 | - if (ret != 1) { | ||
5278 | - kfree(b1); | ||
5279 | - return NULL; | ||
5280 | - } | ||
5281 | + if (ret != 1) | ||
5282 | + goto out; | ||
5283 | if (fe->ops.i2c_gate_ctrl) | ||
5284 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
5285 | } | ||
5286 | |||
5287 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); | ||
5288 | - if (!priv) { | ||
5289 | - kfree(b1); | ||
5290 | - return NULL; | ||
5291 | - } | ||
5292 | + if (!priv) | ||
5293 | + goto out; | ||
5294 | |||
5295 | priv->pll_i2c_address = pll_addr; | ||
5296 | priv->i2c = i2c; | ||
5297 | priv->pll_desc = desc; | ||
5298 | - priv->nr = dvb_pll_devcount++; | ||
5299 | + priv->nr = nr; | ||
5300 | |||
5301 | memcpy(&fe->ops.tuner_ops, &dvb_pll_tuner_ops, | ||
5302 | sizeof(struct dvb_tuner_ops)); | ||
5303 | @@ -858,6 +860,11 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, | ||
5304 | kfree(b1); | ||
5305 | |||
5306 | return fe; | ||
5307 | +out: | ||
5308 | + kfree(b1); | ||
5309 | + ida_simple_remove(&pll_ida, nr); | ||
5310 | + | ||
5311 | + return NULL; | ||
5312 | } | ||
5313 | EXPORT_SYMBOL(dvb_pll_attach); | ||
5314 | |||
5315 | @@ -894,9 +901,10 @@ dvb_pll_probe(struct i2c_client *client, const struct i2c_device_id *id) | ||
5316 | |||
5317 | static int dvb_pll_remove(struct i2c_client *client) | ||
5318 | { | ||
5319 | - struct dvb_frontend *fe; | ||
5320 | + struct dvb_frontend *fe = i2c_get_clientdata(client); | ||
5321 | + struct dvb_pll_priv *priv = fe->tuner_priv; | ||
5322 | |||
5323 | - fe = i2c_get_clientdata(client); | ||
5324 | + ida_simple_remove(&pll_ida, priv->nr); | ||
5325 | dvb_pll_release(fe); | ||
5326 | return 0; | ||
5327 | } | ||
5328 | diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c | ||
5329 | index 759d60c6d630..afe7920557a8 100644 | ||
5330 | --- a/drivers/media/i2c/ov5640.c | ||
5331 | +++ b/drivers/media/i2c/ov5640.c | ||
5332 | @@ -3022,9 +3022,14 @@ static int ov5640_probe(struct i2c_client *client, | ||
5333 | /* request optional power down pin */ | ||
5334 | sensor->pwdn_gpio = devm_gpiod_get_optional(dev, "powerdown", | ||
5335 | GPIOD_OUT_HIGH); | ||
5336 | + if (IS_ERR(sensor->pwdn_gpio)) | ||
5337 | + return PTR_ERR(sensor->pwdn_gpio); | ||
5338 | + | ||
5339 | /* request optional reset pin */ | ||
5340 | sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", | ||
5341 | GPIOD_OUT_HIGH); | ||
5342 | + if (IS_ERR(sensor->reset_gpio)) | ||
5343 | + return PTR_ERR(sensor->reset_gpio); | ||
5344 | |||
5345 | v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops); | ||
5346 | |||
5347 | diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c | ||
5348 | index 124c8df04633..58972c884705 100644 | ||
5349 | --- a/drivers/media/i2c/ov5645.c | ||
5350 | +++ b/drivers/media/i2c/ov5645.c | ||
5351 | @@ -45,6 +45,8 @@ | ||
5352 | #define OV5645_CHIP_ID_HIGH_BYTE 0x56 | ||
5353 | #define OV5645_CHIP_ID_LOW 0x300b | ||
5354 | #define OV5645_CHIP_ID_LOW_BYTE 0x45 | ||
5355 | +#define OV5645_IO_MIPI_CTRL00 0x300e | ||
5356 | +#define OV5645_PAD_OUTPUT00 0x3019 | ||
5357 | #define OV5645_AWB_MANUAL_CONTROL 0x3406 | ||
5358 | #define OV5645_AWB_MANUAL_ENABLE BIT(0) | ||
5359 | #define OV5645_AEC_PK_MANUAL 0x3503 | ||
5360 | @@ -55,6 +57,7 @@ | ||
5361 | #define OV5645_ISP_VFLIP BIT(2) | ||
5362 | #define OV5645_TIMING_TC_REG21 0x3821 | ||
5363 | #define OV5645_SENSOR_MIRROR BIT(1) | ||
5364 | +#define OV5645_MIPI_CTRL00 0x4800 | ||
5365 | #define OV5645_PRE_ISP_TEST_SETTING_1 0x503d | ||
5366 | #define OV5645_TEST_PATTERN_MASK 0x3 | ||
5367 | #define OV5645_SET_TEST_PATTERN(x) ((x) & OV5645_TEST_PATTERN_MASK) | ||
5368 | @@ -121,7 +124,6 @@ static const struct reg_value ov5645_global_init_setting[] = { | ||
5369 | { 0x3503, 0x07 }, | ||
5370 | { 0x3002, 0x1c }, | ||
5371 | { 0x3006, 0xc3 }, | ||
5372 | - { 0x300e, 0x45 }, | ||
5373 | { 0x3017, 0x00 }, | ||
5374 | { 0x3018, 0x00 }, | ||
5375 | { 0x302e, 0x0b }, | ||
5376 | @@ -350,7 +352,10 @@ static const struct reg_value ov5645_global_init_setting[] = { | ||
5377 | { 0x3a1f, 0x14 }, | ||
5378 | { 0x0601, 0x02 }, | ||
5379 | { 0x3008, 0x42 }, | ||
5380 | - { 0x3008, 0x02 } | ||
5381 | + { 0x3008, 0x02 }, | ||
5382 | + { OV5645_IO_MIPI_CTRL00, 0x40 }, | ||
5383 | + { OV5645_MIPI_CTRL00, 0x24 }, | ||
5384 | + { OV5645_PAD_OUTPUT00, 0x70 } | ||
5385 | }; | ||
5386 | |||
5387 | static const struct reg_value ov5645_setting_sxga[] = { | ||
5388 | @@ -737,13 +742,9 @@ static int ov5645_s_power(struct v4l2_subdev *sd, int on) | ||
5389 | goto exit; | ||
5390 | } | ||
5391 | |||
5392 | - ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0, | ||
5393 | - OV5645_SYSTEM_CTRL0_STOP); | ||
5394 | - if (ret < 0) { | ||
5395 | - ov5645_set_power_off(ov5645); | ||
5396 | - goto exit; | ||
5397 | - } | ||
5398 | + usleep_range(500, 1000); | ||
5399 | } else { | ||
5400 | + ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x58); | ||
5401 | ov5645_set_power_off(ov5645); | ||
5402 | } | ||
5403 | } | ||
5404 | @@ -1049,11 +1050,20 @@ static int ov5645_s_stream(struct v4l2_subdev *subdev, int enable) | ||
5405 | dev_err(ov5645->dev, "could not sync v4l2 controls\n"); | ||
5406 | return ret; | ||
5407 | } | ||
5408 | + | ||
5409 | + ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x45); | ||
5410 | + if (ret < 0) | ||
5411 | + return ret; | ||
5412 | + | ||
5413 | ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0, | ||
5414 | OV5645_SYSTEM_CTRL0_START); | ||
5415 | if (ret < 0) | ||
5416 | return ret; | ||
5417 | } else { | ||
5418 | + ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40); | ||
5419 | + if (ret < 0) | ||
5420 | + return ret; | ||
5421 | + | ||
5422 | ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0, | ||
5423 | OV5645_SYSTEM_CTRL0_STOP); | ||
5424 | if (ret < 0) | ||
5425 | diff --git a/drivers/media/i2c/ov9650.c b/drivers/media/i2c/ov9650.c | ||
5426 | index 30ab2225fbd0..b350f5c1a989 100644 | ||
5427 | --- a/drivers/media/i2c/ov9650.c | ||
5428 | +++ b/drivers/media/i2c/ov9650.c | ||
5429 | @@ -703,6 +703,11 @@ static int ov965x_set_gain(struct ov965x *ov965x, int auto_gain) | ||
5430 | for (m = 6; m >= 0; m--) | ||
5431 | if (gain >= (1 << m) * 16) | ||
5432 | break; | ||
5433 | + | ||
5434 | + /* Sanity check: don't adjust the gain with a negative value */ | ||
5435 | + if (m < 0) | ||
5436 | + return -EINVAL; | ||
5437 | + | ||
5438 | rgain = (gain - ((1 << m) * 16)) / (1 << m); | ||
5439 | rgain |= (((1 << m) - 1) << 4); | ||
5440 | |||
5441 | diff --git a/drivers/media/i2c/tda1997x.c b/drivers/media/i2c/tda1997x.c | ||
5442 | index a62ede096636..5e68182001ec 100644 | ||
5443 | --- a/drivers/media/i2c/tda1997x.c | ||
5444 | +++ b/drivers/media/i2c/tda1997x.c | ||
5445 | @@ -2691,7 +2691,13 @@ static int tda1997x_probe(struct i2c_client *client, | ||
5446 | } | ||
5447 | |||
5448 | ret = 0x34 + ((io_read(sd, REG_SLAVE_ADDR)>>4) & 0x03); | ||
5449 | - state->client_cec = i2c_new_dummy(client->adapter, ret); | ||
5450 | + state->client_cec = devm_i2c_new_dummy_device(&client->dev, | ||
5451 | + client->adapter, ret); | ||
5452 | + if (IS_ERR(state->client_cec)) { | ||
5453 | + ret = PTR_ERR(state->client_cec); | ||
5454 | + goto err_free_mutex; | ||
5455 | + } | ||
5456 | + | ||
5457 | v4l_info(client, "CEC slave address 0x%02x\n", ret); | ||
5458 | |||
5459 | ret = tda1997x_core_init(sd); | ||
5460 | @@ -2798,7 +2804,6 @@ static int tda1997x_remove(struct i2c_client *client) | ||
5461 | media_entity_cleanup(&sd->entity); | ||
5462 | v4l2_ctrl_handler_free(&state->hdl); | ||
5463 | regulator_bulk_disable(TDA1997X_NUM_SUPPLIES, state->supplies); | ||
5464 | - i2c_unregister_device(state->client_cec); | ||
5465 | cancel_delayed_work(&state->delayed_work_enable_hpd); | ||
5466 | mutex_destroy(&state->page_lock); | ||
5467 | mutex_destroy(&state->lock); | ||
5468 | diff --git a/drivers/media/pci/saa7134/saa7134-i2c.c b/drivers/media/pci/saa7134/saa7134-i2c.c | ||
5469 | index 493b1858815f..04e85765373e 100644 | ||
5470 | --- a/drivers/media/pci/saa7134/saa7134-i2c.c | ||
5471 | +++ b/drivers/media/pci/saa7134/saa7134-i2c.c | ||
5472 | @@ -342,7 +342,11 @@ static const struct i2c_client saa7134_client_template = { | ||
5473 | |||
5474 | /* ----------------------------------------------------------- */ | ||
5475 | |||
5476 | -/* On Medion 7134 reading EEPROM needs DVB-T demod i2c gate open */ | ||
5477 | +/* | ||
5478 | + * On Medion 7134 reading the SAA7134 chip config EEPROM needs DVB-T | ||
5479 | + * demod i2c gate closed due to an address clash between this EEPROM | ||
5480 | + * and the demod one. | ||
5481 | + */ | ||
5482 | static void saa7134_i2c_eeprom_md7134_gate(struct saa7134_dev *dev) | ||
5483 | { | ||
5484 | u8 subaddr = 0x7, dmdregval; | ||
5485 | @@ -359,14 +363,14 @@ static void saa7134_i2c_eeprom_md7134_gate(struct saa7134_dev *dev) | ||
5486 | |||
5487 | ret = i2c_transfer(&dev->i2c_adap, i2cgatemsg_r, 2); | ||
5488 | if ((ret == 2) && (dmdregval & 0x2)) { | ||
5489 | - pr_debug("%s: DVB-T demod i2c gate was left closed\n", | ||
5490 | + pr_debug("%s: DVB-T demod i2c gate was left open\n", | ||
5491 | dev->name); | ||
5492 | |||
5493 | data[0] = subaddr; | ||
5494 | data[1] = (dmdregval & ~0x2); | ||
5495 | if (i2c_transfer(&dev->i2c_adap, i2cgatemsg_w, 1) != 1) | ||
5496 | - pr_err("%s: EEPROM i2c gate open failure\n", | ||
5497 | - dev->name); | ||
5498 | + pr_err("%s: EEPROM i2c gate close failure\n", | ||
5499 | + dev->name); | ||
5500 | } | ||
5501 | } | ||
5502 | |||
5503 | diff --git a/drivers/media/pci/saa7146/hexium_gemini.c b/drivers/media/pci/saa7146/hexium_gemini.c | ||
5504 | index dca20a3d98e2..f96226930670 100644 | ||
5505 | --- a/drivers/media/pci/saa7146/hexium_gemini.c | ||
5506 | +++ b/drivers/media/pci/saa7146/hexium_gemini.c | ||
5507 | @@ -292,6 +292,9 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d | ||
5508 | ret = saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_GRABBER); | ||
5509 | if (ret < 0) { | ||
5510 | pr_err("cannot register capture v4l2 device. skipping.\n"); | ||
5511 | + saa7146_vv_release(dev); | ||
5512 | + i2c_del_adapter(&hexium->i2c_adapter); | ||
5513 | + kfree(hexium); | ||
5514 | return ret; | ||
5515 | } | ||
5516 | |||
5517 | diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c | ||
5518 | index f899ac3b4a61..4ef37cfc8446 100644 | ||
5519 | --- a/drivers/media/platform/aspeed-video.c | ||
5520 | +++ b/drivers/media/platform/aspeed-video.c | ||
5521 | @@ -630,7 +630,7 @@ static void aspeed_video_check_and_set_polarity(struct aspeed_video *video) | ||
5522 | } | ||
5523 | |||
5524 | if (hsync_counter < 0 || vsync_counter < 0) { | ||
5525 | - u32 ctrl; | ||
5526 | + u32 ctrl = 0; | ||
5527 | |||
5528 | if (hsync_counter < 0) { | ||
5529 | ctrl = VE_CTRL_HSYNC_POL; | ||
5530 | @@ -650,7 +650,8 @@ static void aspeed_video_check_and_set_polarity(struct aspeed_video *video) | ||
5531 | V4L2_DV_VSYNC_POS_POL; | ||
5532 | } | ||
5533 | |||
5534 | - aspeed_video_update(video, VE_CTRL, 0, ctrl); | ||
5535 | + if (ctrl) | ||
5536 | + aspeed_video_update(video, VE_CTRL, 0, ctrl); | ||
5537 | } | ||
5538 | } | ||
5539 | |||
5540 | diff --git a/drivers/media/platform/exynos4-is/fimc-is.c b/drivers/media/platform/exynos4-is/fimc-is.c | ||
5541 | index e043d55133a3..b7cc8e651e32 100644 | ||
5542 | --- a/drivers/media/platform/exynos4-is/fimc-is.c | ||
5543 | +++ b/drivers/media/platform/exynos4-is/fimc-is.c | ||
5544 | @@ -806,6 +806,7 @@ static int fimc_is_probe(struct platform_device *pdev) | ||
5545 | return -ENODEV; | ||
5546 | |||
5547 | is->pmu_regs = of_iomap(node, 0); | ||
5548 | + of_node_put(node); | ||
5549 | if (!is->pmu_regs) | ||
5550 | return -ENOMEM; | ||
5551 | |||
5552 | diff --git a/drivers/media/platform/exynos4-is/media-dev.c b/drivers/media/platform/exynos4-is/media-dev.c | ||
5553 | index d53427a8db11..a838189d4490 100644 | ||
5554 | --- a/drivers/media/platform/exynos4-is/media-dev.c | ||
5555 | +++ b/drivers/media/platform/exynos4-is/media-dev.c | ||
5556 | @@ -501,6 +501,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd) | ||
5557 | continue; | ||
5558 | |||
5559 | ret = fimc_md_parse_port_node(fmd, port, index); | ||
5560 | + of_node_put(port); | ||
5561 | if (ret < 0) { | ||
5562 | of_node_put(node); | ||
5563 | goto cleanup; | ||
5564 | @@ -542,6 +543,7 @@ static int __of_get_csis_id(struct device_node *np) | ||
5565 | if (!np) | ||
5566 | return -EINVAL; | ||
5567 | of_property_read_u32(np, "reg", ®); | ||
5568 | + of_node_put(np); | ||
5569 | return reg - FIMC_INPUT_MIPI_CSI2_0; | ||
5570 | } | ||
5571 | |||
5572 | diff --git a/drivers/media/platform/fsl-viu.c b/drivers/media/platform/fsl-viu.c | ||
5573 | index 691be788e38b..b74e4f50d7d9 100644 | ||
5574 | --- a/drivers/media/platform/fsl-viu.c | ||
5575 | +++ b/drivers/media/platform/fsl-viu.c | ||
5576 | @@ -32,7 +32,7 @@ | ||
5577 | #define VIU_VERSION "0.5.1" | ||
5578 | |||
5579 | /* Allow building this driver with COMPILE_TEST */ | ||
5580 | -#ifndef CONFIG_PPC | ||
5581 | +#if !defined(CONFIG_PPC) && !defined(CONFIG_MICROBLAZE) | ||
5582 | #define out_be32(v, a) iowrite32be(a, (void __iomem *)v) | ||
5583 | #define in_be32(a) ioread32be((void __iomem *)a) | ||
5584 | #endif | ||
5585 | diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c | ||
5586 | index fc9faec85edb..5d44f2e92dd5 100644 | ||
5587 | --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c | ||
5588 | +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c | ||
5589 | @@ -110,7 +110,9 @@ static int mtk_mdp_probe(struct platform_device *pdev) | ||
5590 | mutex_init(&mdp->vpulock); | ||
5591 | |||
5592 | /* Old dts had the components as child nodes */ | ||
5593 | - if (of_get_next_child(dev->of_node, NULL)) { | ||
5594 | + node = of_get_next_child(dev->of_node, NULL); | ||
5595 | + if (node) { | ||
5596 | + of_node_put(node); | ||
5597 | parent = dev->of_node; | ||
5598 | dev_warn(dev, "device tree is out of date\n"); | ||
5599 | } else { | ||
5600 | diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c | ||
5601 | index 83216fc7156b..9cdb43859ae0 100644 | ||
5602 | --- a/drivers/media/platform/omap3isp/isp.c | ||
5603 | +++ b/drivers/media/platform/omap3isp/isp.c | ||
5604 | @@ -719,6 +719,10 @@ static int isp_pipeline_enable(struct isp_pipeline *pipe, | ||
5605 | s_stream, mode); | ||
5606 | pipe->do_propagation = true; | ||
5607 | } | ||
5608 | + | ||
5609 | + /* Stop at the first external sub-device. */ | ||
5610 | + if (subdev->dev != isp->dev) | ||
5611 | + break; | ||
5612 | } | ||
5613 | |||
5614 | return 0; | ||
5615 | @@ -833,6 +837,10 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe) | ||
5616 | &subdev->entity); | ||
5617 | failure = -ETIMEDOUT; | ||
5618 | } | ||
5619 | + | ||
5620 | + /* Stop at the first external sub-device. */ | ||
5621 | + if (subdev->dev != isp->dev) | ||
5622 | + break; | ||
5623 | } | ||
5624 | |||
5625 | return failure; | ||
5626 | diff --git a/drivers/media/platform/omap3isp/ispccdc.c b/drivers/media/platform/omap3isp/ispccdc.c | ||
5627 | index 1ba8a5ba343f..e2f336c715a4 100644 | ||
5628 | --- a/drivers/media/platform/omap3isp/ispccdc.c | ||
5629 | +++ b/drivers/media/platform/omap3isp/ispccdc.c | ||
5630 | @@ -2602,6 +2602,7 @@ int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc, | ||
5631 | int ret; | ||
5632 | |||
5633 | /* Register the subdev and video node. */ | ||
5634 | + ccdc->subdev.dev = vdev->mdev->dev; | ||
5635 | ret = v4l2_device_register_subdev(vdev, &ccdc->subdev); | ||
5636 | if (ret < 0) | ||
5637 | goto error; | ||
5638 | diff --git a/drivers/media/platform/omap3isp/ispccp2.c b/drivers/media/platform/omap3isp/ispccp2.c | ||
5639 | index efca45bb02c8..d0a49cdfd22d 100644 | ||
5640 | --- a/drivers/media/platform/omap3isp/ispccp2.c | ||
5641 | +++ b/drivers/media/platform/omap3isp/ispccp2.c | ||
5642 | @@ -1031,6 +1031,7 @@ int omap3isp_ccp2_register_entities(struct isp_ccp2_device *ccp2, | ||
5643 | int ret; | ||
5644 | |||
5645 | /* Register the subdev and video nodes. */ | ||
5646 | + ccp2->subdev.dev = vdev->mdev->dev; | ||
5647 | ret = v4l2_device_register_subdev(vdev, &ccp2->subdev); | ||
5648 | if (ret < 0) | ||
5649 | goto error; | ||
5650 | diff --git a/drivers/media/platform/omap3isp/ispcsi2.c b/drivers/media/platform/omap3isp/ispcsi2.c | ||
5651 | index e85917f4a50c..fd493c5e4e24 100644 | ||
5652 | --- a/drivers/media/platform/omap3isp/ispcsi2.c | ||
5653 | +++ b/drivers/media/platform/omap3isp/ispcsi2.c | ||
5654 | @@ -1198,6 +1198,7 @@ int omap3isp_csi2_register_entities(struct isp_csi2_device *csi2, | ||
5655 | int ret; | ||
5656 | |||
5657 | /* Register the subdev and video nodes. */ | ||
5658 | + csi2->subdev.dev = vdev->mdev->dev; | ||
5659 | ret = v4l2_device_register_subdev(vdev, &csi2->subdev); | ||
5660 | if (ret < 0) | ||
5661 | goto error; | ||
5662 | diff --git a/drivers/media/platform/omap3isp/isppreview.c b/drivers/media/platform/omap3isp/isppreview.c | ||
5663 | index 40e22400cf5e..97d660606d98 100644 | ||
5664 | --- a/drivers/media/platform/omap3isp/isppreview.c | ||
5665 | +++ b/drivers/media/platform/omap3isp/isppreview.c | ||
5666 | @@ -2225,6 +2225,7 @@ int omap3isp_preview_register_entities(struct isp_prev_device *prev, | ||
5667 | int ret; | ||
5668 | |||
5669 | /* Register the subdev and video nodes. */ | ||
5670 | + prev->subdev.dev = vdev->mdev->dev; | ||
5671 | ret = v4l2_device_register_subdev(vdev, &prev->subdev); | ||
5672 | if (ret < 0) | ||
5673 | goto error; | ||
5674 | diff --git a/drivers/media/platform/omap3isp/ispresizer.c b/drivers/media/platform/omap3isp/ispresizer.c | ||
5675 | index 21ca6954df72..78d9dd7ea2da 100644 | ||
5676 | --- a/drivers/media/platform/omap3isp/ispresizer.c | ||
5677 | +++ b/drivers/media/platform/omap3isp/ispresizer.c | ||
5678 | @@ -1681,6 +1681,7 @@ int omap3isp_resizer_register_entities(struct isp_res_device *res, | ||
5679 | int ret; | ||
5680 | |||
5681 | /* Register the subdev and video nodes. */ | ||
5682 | + res->subdev.dev = vdev->mdev->dev; | ||
5683 | ret = v4l2_device_register_subdev(vdev, &res->subdev); | ||
5684 | if (ret < 0) | ||
5685 | goto error; | ||
5686 | diff --git a/drivers/media/platform/omap3isp/ispstat.c b/drivers/media/platform/omap3isp/ispstat.c | ||
5687 | index 62b2eacb96fd..5b9b57f4d9bf 100644 | ||
5688 | --- a/drivers/media/platform/omap3isp/ispstat.c | ||
5689 | +++ b/drivers/media/platform/omap3isp/ispstat.c | ||
5690 | @@ -1026,6 +1026,8 @@ void omap3isp_stat_unregister_entities(struct ispstat *stat) | ||
5691 | int omap3isp_stat_register_entities(struct ispstat *stat, | ||
5692 | struct v4l2_device *vdev) | ||
5693 | { | ||
5694 | + stat->subdev.dev = vdev->mdev->dev; | ||
5695 | + | ||
5696 | return v4l2_device_register_subdev(vdev, &stat->subdev); | ||
5697 | } | ||
5698 | |||
5699 | diff --git a/drivers/media/platform/rcar_fdp1.c b/drivers/media/platform/rcar_fdp1.c | ||
5700 | index 43aae9b6bb20..c23ec127c277 100644 | ||
5701 | --- a/drivers/media/platform/rcar_fdp1.c | ||
5702 | +++ b/drivers/media/platform/rcar_fdp1.c | ||
5703 | @@ -2306,7 +2306,7 @@ static int fdp1_probe(struct platform_device *pdev) | ||
5704 | fdp1->fcp = rcar_fcp_get(fcp_node); | ||
5705 | of_node_put(fcp_node); | ||
5706 | if (IS_ERR(fdp1->fcp)) { | ||
5707 | - dev_err(&pdev->dev, "FCP not found (%ld)\n", | ||
5708 | + dev_dbg(&pdev->dev, "FCP not found (%ld)\n", | ||
5709 | PTR_ERR(fdp1->fcp)); | ||
5710 | return PTR_ERR(fdp1->fcp); | ||
5711 | } | ||
5712 | diff --git a/drivers/media/platform/vivid/vivid-ctrls.c b/drivers/media/platform/vivid/vivid-ctrls.c | ||
5713 | index 3e916c8befb7..7a52f585cab7 100644 | ||
5714 | --- a/drivers/media/platform/vivid/vivid-ctrls.c | ||
5715 | +++ b/drivers/media/platform/vivid/vivid-ctrls.c | ||
5716 | @@ -1473,7 +1473,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap, | ||
5717 | v4l2_ctrl_handler_init(hdl_vid_cap, 55); | ||
5718 | v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_class, NULL); | ||
5719 | v4l2_ctrl_handler_init(hdl_vid_out, 26); | ||
5720 | - if (!no_error_inj || dev->has_fb) | ||
5721 | + if (!no_error_inj || dev->has_fb || dev->num_hdmi_outputs) | ||
5722 | v4l2_ctrl_new_custom(hdl_vid_out, &vivid_ctrl_class, NULL); | ||
5723 | v4l2_ctrl_handler_init(hdl_vbi_cap, 21); | ||
5724 | v4l2_ctrl_new_custom(hdl_vbi_cap, &vivid_ctrl_class, NULL); | ||
5725 | diff --git a/drivers/media/platform/vivid/vivid-kthread-cap.c b/drivers/media/platform/vivid/vivid-kthread-cap.c | ||
5726 | index 6cf495a7d5cc..003319d7816d 100644 | ||
5727 | --- a/drivers/media/platform/vivid/vivid-kthread-cap.c | ||
5728 | +++ b/drivers/media/platform/vivid/vivid-kthread-cap.c | ||
5729 | @@ -232,8 +232,8 @@ static void *plane_vaddr(struct tpg_data *tpg, struct vivid_buffer *buf, | ||
5730 | return vbuf; | ||
5731 | } | ||
5732 | |||
5733 | -static int vivid_copy_buffer(struct vivid_dev *dev, unsigned p, u8 *vcapbuf, | ||
5734 | - struct vivid_buffer *vid_cap_buf) | ||
5735 | +static noinline_for_stack int vivid_copy_buffer(struct vivid_dev *dev, unsigned p, | ||
5736 | + u8 *vcapbuf, struct vivid_buffer *vid_cap_buf) | ||
5737 | { | ||
5738 | bool blank = dev->must_blank[vid_cap_buf->vb.vb2_buf.index]; | ||
5739 | struct tpg_data *tpg = &dev->tpg; | ||
5740 | @@ -658,6 +658,8 @@ static void vivid_cap_update_frame_period(struct vivid_dev *dev) | ||
5741 | u64 f_period; | ||
5742 | |||
5743 | f_period = (u64)dev->timeperframe_vid_cap.numerator * 1000000000; | ||
5744 | + if (WARN_ON(dev->timeperframe_vid_cap.denominator == 0)) | ||
5745 | + dev->timeperframe_vid_cap.denominator = 1; | ||
5746 | do_div(f_period, dev->timeperframe_vid_cap.denominator); | ||
5747 | if (dev->field_cap == V4L2_FIELD_ALTERNATE) | ||
5748 | f_period >>= 1; | ||
5749 | @@ -670,7 +672,8 @@ static void vivid_cap_update_frame_period(struct vivid_dev *dev) | ||
5750 | dev->cap_frame_period = f_period; | ||
5751 | } | ||
5752 | |||
5753 | -static void vivid_thread_vid_cap_tick(struct vivid_dev *dev, int dropped_bufs) | ||
5754 | +static noinline_for_stack void vivid_thread_vid_cap_tick(struct vivid_dev *dev, | ||
5755 | + int dropped_bufs) | ||
5756 | { | ||
5757 | struct vivid_buffer *vid_cap_buf = NULL; | ||
5758 | struct vivid_buffer *vbi_cap_buf = NULL; | ||
5759 | diff --git a/drivers/media/platform/vsp1/vsp1_dl.c b/drivers/media/platform/vsp1/vsp1_dl.c | ||
5760 | index 104b6f514536..d7b43037e500 100644 | ||
5761 | --- a/drivers/media/platform/vsp1/vsp1_dl.c | ||
5762 | +++ b/drivers/media/platform/vsp1/vsp1_dl.c | ||
5763 | @@ -557,8 +557,10 @@ static struct vsp1_dl_list *vsp1_dl_list_alloc(struct vsp1_dl_manager *dlm) | ||
5764 | |||
5765 | /* Get a default body for our list. */ | ||
5766 | dl->body0 = vsp1_dl_body_get(dlm->pool); | ||
5767 | - if (!dl->body0) | ||
5768 | + if (!dl->body0) { | ||
5769 | + kfree(dl); | ||
5770 | return NULL; | ||
5771 | + } | ||
5772 | |||
5773 | header_offset = dl->body0->max_entries * sizeof(*dl->body0->entries); | ||
5774 | |||
5775 | diff --git a/drivers/media/radio/si470x/radio-si470x-usb.c b/drivers/media/radio/si470x/radio-si470x-usb.c | ||
5776 | index 49073747b1e7..fedff68d8c49 100644 | ||
5777 | --- a/drivers/media/radio/si470x/radio-si470x-usb.c | ||
5778 | +++ b/drivers/media/radio/si470x/radio-si470x-usb.c | ||
5779 | @@ -734,7 +734,7 @@ static int si470x_usb_driver_probe(struct usb_interface *intf, | ||
5780 | /* start radio */ | ||
5781 | retval = si470x_start_usb(radio); | ||
5782 | if (retval < 0) | ||
5783 | - goto err_all; | ||
5784 | + goto err_buf; | ||
5785 | |||
5786 | /* set initial frequency */ | ||
5787 | si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */ | ||
5788 | @@ -749,6 +749,8 @@ static int si470x_usb_driver_probe(struct usb_interface *intf, | ||
5789 | |||
5790 | return 0; | ||
5791 | err_all: | ||
5792 | + usb_kill_urb(radio->int_in_urb); | ||
5793 | +err_buf: | ||
5794 | kfree(radio->buffer); | ||
5795 | err_ctrl: | ||
5796 | v4l2_ctrl_handler_free(&radio->hdl); | ||
5797 | @@ -822,6 +824,7 @@ static void si470x_usb_driver_disconnect(struct usb_interface *intf) | ||
5798 | mutex_lock(&radio->lock); | ||
5799 | v4l2_device_disconnect(&radio->v4l2_dev); | ||
5800 | video_unregister_device(&radio->videodev); | ||
5801 | + usb_kill_urb(radio->int_in_urb); | ||
5802 | usb_set_intfdata(intf, NULL); | ||
5803 | mutex_unlock(&radio->lock); | ||
5804 | v4l2_device_put(&radio->v4l2_dev); | ||
5805 | diff --git a/drivers/media/rc/iguanair.c b/drivers/media/rc/iguanair.c | ||
5806 | index ea05e125016a..872d6441e512 100644 | ||
5807 | --- a/drivers/media/rc/iguanair.c | ||
5808 | +++ b/drivers/media/rc/iguanair.c | ||
5809 | @@ -413,6 +413,10 @@ static int iguanair_probe(struct usb_interface *intf, | ||
5810 | int ret, pipein, pipeout; | ||
5811 | struct usb_host_interface *idesc; | ||
5812 | |||
5813 | + idesc = intf->altsetting; | ||
5814 | + if (idesc->desc.bNumEndpoints < 2) | ||
5815 | + return -ENODEV; | ||
5816 | + | ||
5817 | ir = kzalloc(sizeof(*ir), GFP_KERNEL); | ||
5818 | rc = rc_allocate_device(RC_DRIVER_IR_RAW); | ||
5819 | if (!ir || !rc) { | ||
5820 | @@ -427,18 +431,13 @@ static int iguanair_probe(struct usb_interface *intf, | ||
5821 | ir->urb_in = usb_alloc_urb(0, GFP_KERNEL); | ||
5822 | ir->urb_out = usb_alloc_urb(0, GFP_KERNEL); | ||
5823 | |||
5824 | - if (!ir->buf_in || !ir->packet || !ir->urb_in || !ir->urb_out) { | ||
5825 | + if (!ir->buf_in || !ir->packet || !ir->urb_in || !ir->urb_out || | ||
5826 | + !usb_endpoint_is_int_in(&idesc->endpoint[0].desc) || | ||
5827 | + !usb_endpoint_is_int_out(&idesc->endpoint[1].desc)) { | ||
5828 | ret = -ENOMEM; | ||
5829 | goto out; | ||
5830 | } | ||
5831 | |||
5832 | - idesc = intf->altsetting; | ||
5833 | - | ||
5834 | - if (idesc->desc.bNumEndpoints < 2) { | ||
5835 | - ret = -ENODEV; | ||
5836 | - goto out; | ||
5837 | - } | ||
5838 | - | ||
5839 | ir->rc = rc; | ||
5840 | ir->dev = &intf->dev; | ||
5841 | ir->udev = udev; | ||
5842 | diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c | ||
5843 | index 7bee72108b0e..37a850421fbb 100644 | ||
5844 | --- a/drivers/media/rc/imon.c | ||
5845 | +++ b/drivers/media/rc/imon.c | ||
5846 | @@ -1826,12 +1826,17 @@ static void imon_get_ffdc_type(struct imon_context *ictx) | ||
5847 | break; | ||
5848 | /* iMON VFD, MCE IR */ | ||
5849 | case 0x46: | ||
5850 | - case 0x7e: | ||
5851 | case 0x9e: | ||
5852 | dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR"); | ||
5853 | detected_display_type = IMON_DISPLAY_TYPE_VFD; | ||
5854 | allowed_protos = RC_PROTO_BIT_RC6_MCE; | ||
5855 | break; | ||
5856 | + /* iMON VFD, iMON or MCE IR */ | ||
5857 | + case 0x7e: | ||
5858 | + dev_info(ictx->dev, "0xffdc iMON VFD, iMON or MCE IR"); | ||
5859 | + detected_display_type = IMON_DISPLAY_TYPE_VFD; | ||
5860 | + allowed_protos |= RC_PROTO_BIT_RC6_MCE; | ||
5861 | + break; | ||
5862 | /* iMON LCD, MCE IR */ | ||
5863 | case 0x9f: | ||
5864 | dev_info(ictx->dev, "0xffdc iMON LCD, MCE IR"); | ||
5865 | diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c | ||
5866 | index 4d5351ebb940..9929fcdec74d 100644 | ||
5867 | --- a/drivers/media/rc/mceusb.c | ||
5868 | +++ b/drivers/media/rc/mceusb.c | ||
5869 | @@ -31,21 +31,22 @@ | ||
5870 | #include <linux/pm_wakeup.h> | ||
5871 | #include <media/rc-core.h> | ||
5872 | |||
5873 | -#define DRIVER_VERSION "1.94" | ||
5874 | +#define DRIVER_VERSION "1.95" | ||
5875 | #define DRIVER_AUTHOR "Jarod Wilson <jarod@redhat.com>" | ||
5876 | #define DRIVER_DESC "Windows Media Center Ed. eHome Infrared Transceiver " \ | ||
5877 | "device driver" | ||
5878 | #define DRIVER_NAME "mceusb" | ||
5879 | |||
5880 | +#define USB_TX_TIMEOUT 1000 /* in milliseconds */ | ||
5881 | #define USB_CTRL_MSG_SZ 2 /* Size of usb ctrl msg on gen1 hw */ | ||
5882 | #define MCE_G1_INIT_MSGS 40 /* Init messages on gen1 hw to throw out */ | ||
5883 | |||
5884 | /* MCE constants */ | ||
5885 | -#define MCE_CMDBUF_SIZE 384 /* MCE Command buffer length */ | ||
5886 | +#define MCE_IRBUF_SIZE 128 /* TX IR buffer length */ | ||
5887 | #define MCE_TIME_UNIT 50 /* Approx 50us resolution */ | ||
5888 | -#define MCE_CODE_LENGTH 5 /* Normal length of packet (with header) */ | ||
5889 | -#define MCE_PACKET_SIZE 4 /* Normal length of packet (without header) */ | ||
5890 | -#define MCE_IRDATA_HEADER 0x84 /* Actual header format is 0x80 + num_bytes */ | ||
5891 | +#define MCE_PACKET_SIZE 31 /* Max length of packet (with header) */ | ||
5892 | +#define MCE_IRDATA_HEADER (0x80 + MCE_PACKET_SIZE - 1) | ||
5893 | + /* Actual format is 0x80 + num_bytes */ | ||
5894 | #define MCE_IRDATA_TRAILER 0x80 /* End of IR data */ | ||
5895 | #define MCE_MAX_CHANNELS 2 /* Two transmitters, hardware dependent? */ | ||
5896 | #define MCE_DEFAULT_TX_MASK 0x03 /* Vals: TX1=0x01, TX2=0x02, ALL=0x03 */ | ||
5897 | @@ -607,9 +608,9 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len, | ||
5898 | if (len <= skip) | ||
5899 | return; | ||
5900 | |||
5901 | - dev_dbg(dev, "%cx data: %*ph (length=%d)", | ||
5902 | - (out ? 't' : 'r'), | ||
5903 | - min(len, buf_len - offset), buf + offset, len); | ||
5904 | + dev_dbg(dev, "%cx data[%d]: %*ph (len=%d sz=%d)", | ||
5905 | + (out ? 't' : 'r'), offset, | ||
5906 | + min(len, buf_len - offset), buf + offset, len, buf_len); | ||
5907 | |||
5908 | inout = out ? "Request" : "Got"; | ||
5909 | |||
5910 | @@ -731,6 +732,9 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len, | ||
5911 | case MCE_RSP_CMD_ILLEGAL: | ||
5912 | dev_dbg(dev, "Illegal PORT_IR command"); | ||
5913 | break; | ||
5914 | + case MCE_RSP_TX_TIMEOUT: | ||
5915 | + dev_dbg(dev, "IR TX timeout (TX buffer underrun)"); | ||
5916 | + break; | ||
5917 | default: | ||
5918 | dev_dbg(dev, "Unknown command 0x%02x 0x%02x", | ||
5919 | cmd, subcmd); | ||
5920 | @@ -745,13 +749,14 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len, | ||
5921 | dev_dbg(dev, "End of raw IR data"); | ||
5922 | else if ((cmd != MCE_CMD_PORT_IR) && | ||
5923 | ((cmd & MCE_PORT_MASK) == MCE_COMMAND_IRDATA)) | ||
5924 | - dev_dbg(dev, "Raw IR data, %d pulse/space samples", ir->rem); | ||
5925 | + dev_dbg(dev, "Raw IR data, %d pulse/space samples", | ||
5926 | + cmd & MCE_PACKET_LENGTH_MASK); | ||
5927 | #endif | ||
5928 | } | ||
5929 | |||
5930 | /* | ||
5931 | * Schedule work that can't be done in interrupt handlers | ||
5932 | - * (mceusb_dev_recv() and mce_async_callback()) nor tasklets. | ||
5933 | + * (mceusb_dev_recv() and mce_write_callback()) nor tasklets. | ||
5934 | * Invokes mceusb_deferred_kevent() for recovering from | ||
5935 | * error events specified by the kevent bit field. | ||
5936 | */ | ||
5937 | @@ -764,23 +769,80 @@ static void mceusb_defer_kevent(struct mceusb_dev *ir, int kevent) | ||
5938 | dev_dbg(ir->dev, "kevent %d scheduled", kevent); | ||
5939 | } | ||
5940 | |||
5941 | -static void mce_async_callback(struct urb *urb) | ||
5942 | +static void mce_write_callback(struct urb *urb) | ||
5943 | { | ||
5944 | - struct mceusb_dev *ir; | ||
5945 | - int len; | ||
5946 | - | ||
5947 | if (!urb) | ||
5948 | return; | ||
5949 | |||
5950 | - ir = urb->context; | ||
5951 | + complete(urb->context); | ||
5952 | +} | ||
5953 | + | ||
5954 | +/* | ||
5955 | + * Write (TX/send) data to MCE device USB endpoint out. | ||
5956 | + * Used for IR blaster TX and MCE device commands. | ||
5957 | + * | ||
5958 | + * Return: The number of bytes written (> 0) or errno (< 0). | ||
5959 | + */ | ||
5960 | +static int mce_write(struct mceusb_dev *ir, u8 *data, int size) | ||
5961 | +{ | ||
5962 | + int ret; | ||
5963 | + struct urb *urb; | ||
5964 | + struct device *dev = ir->dev; | ||
5965 | + unsigned char *buf_out; | ||
5966 | + struct completion tx_done; | ||
5967 | + unsigned long expire; | ||
5968 | + unsigned long ret_wait; | ||
5969 | + | ||
5970 | + mceusb_dev_printdata(ir, data, size, 0, size, true); | ||
5971 | + | ||
5972 | + urb = usb_alloc_urb(0, GFP_KERNEL); | ||
5973 | + if (unlikely(!urb)) { | ||
5974 | + dev_err(dev, "Error: mce write couldn't allocate urb"); | ||
5975 | + return -ENOMEM; | ||
5976 | + } | ||
5977 | + | ||
5978 | + buf_out = kmalloc(size, GFP_KERNEL); | ||
5979 | + if (!buf_out) { | ||
5980 | + usb_free_urb(urb); | ||
5981 | + return -ENOMEM; | ||
5982 | + } | ||
5983 | + | ||
5984 | + init_completion(&tx_done); | ||
5985 | + | ||
5986 | + /* outbound data */ | ||
5987 | + if (usb_endpoint_xfer_int(ir->usb_ep_out)) | ||
5988 | + usb_fill_int_urb(urb, ir->usbdev, ir->pipe_out, | ||
5989 | + buf_out, size, mce_write_callback, &tx_done, | ||
5990 | + ir->usb_ep_out->bInterval); | ||
5991 | + else | ||
5992 | + usb_fill_bulk_urb(urb, ir->usbdev, ir->pipe_out, | ||
5993 | + buf_out, size, mce_write_callback, &tx_done); | ||
5994 | + memcpy(buf_out, data, size); | ||
5995 | + | ||
5996 | + ret = usb_submit_urb(urb, GFP_KERNEL); | ||
5997 | + if (ret) { | ||
5998 | + dev_err(dev, "Error: mce write submit urb error = %d", ret); | ||
5999 | + kfree(buf_out); | ||
6000 | + usb_free_urb(urb); | ||
6001 | + return ret; | ||
6002 | + } | ||
6003 | + | ||
6004 | + expire = msecs_to_jiffies(USB_TX_TIMEOUT); | ||
6005 | + ret_wait = wait_for_completion_timeout(&tx_done, expire); | ||
6006 | + if (!ret_wait) { | ||
6007 | + dev_err(dev, "Error: mce write timed out (expire = %lu (%dms))", | ||
6008 | + expire, USB_TX_TIMEOUT); | ||
6009 | + usb_kill_urb(urb); | ||
6010 | + ret = (urb->status == -ENOENT ? -ETIMEDOUT : urb->status); | ||
6011 | + } else { | ||
6012 | + ret = urb->status; | ||
6013 | + } | ||
6014 | + if (ret >= 0) | ||
6015 | + ret = urb->actual_length; /* bytes written */ | ||
6016 | |||
6017 | switch (urb->status) { | ||
6018 | /* success */ | ||
6019 | case 0: | ||
6020 | - len = urb->actual_length; | ||
6021 | - | ||
6022 | - mceusb_dev_printdata(ir, urb->transfer_buffer, len, | ||
6023 | - 0, len, true); | ||
6024 | break; | ||
6025 | |||
6026 | case -ECONNRESET: | ||
6027 | @@ -790,140 +852,135 @@ static void mce_async_callback(struct urb *urb) | ||
6028 | break; | ||
6029 | |||
6030 | case -EPIPE: | ||
6031 | - dev_err(ir->dev, "Error: request urb status = %d (TX HALT)", | ||
6032 | + dev_err(ir->dev, "Error: mce write urb status = %d (TX HALT)", | ||
6033 | urb->status); | ||
6034 | mceusb_defer_kevent(ir, EVENT_TX_HALT); | ||
6035 | break; | ||
6036 | |||
6037 | default: | ||
6038 | - dev_err(ir->dev, "Error: request urb status = %d", urb->status); | ||
6039 | + dev_err(ir->dev, "Error: mce write urb status = %d", | ||
6040 | + urb->status); | ||
6041 | break; | ||
6042 | } | ||
6043 | |||
6044 | - /* the transfer buffer and urb were allocated in mce_request_packet */ | ||
6045 | - kfree(urb->transfer_buffer); | ||
6046 | - usb_free_urb(urb); | ||
6047 | -} | ||
6048 | - | ||
6049 | -/* request outgoing (send) usb packet - used to initialize remote */ | ||
6050 | -static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data, | ||
6051 | - int size) | ||
6052 | -{ | ||
6053 | - int res; | ||
6054 | - struct urb *async_urb; | ||
6055 | - struct device *dev = ir->dev; | ||
6056 | - unsigned char *async_buf; | ||
6057 | + dev_dbg(dev, "tx done status = %d (wait = %lu, expire = %lu (%dms), urb->actual_length = %d, urb->status = %d)", | ||
6058 | + ret, ret_wait, expire, USB_TX_TIMEOUT, | ||
6059 | + urb->actual_length, urb->status); | ||
6060 | |||
6061 | - async_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
6062 | - if (unlikely(!async_urb)) { | ||
6063 | - dev_err(dev, "Error, couldn't allocate urb!"); | ||
6064 | - return; | ||
6065 | - } | ||
6066 | - | ||
6067 | - async_buf = kmalloc(size, GFP_KERNEL); | ||
6068 | - if (!async_buf) { | ||
6069 | - usb_free_urb(async_urb); | ||
6070 | - return; | ||
6071 | - } | ||
6072 | - | ||
6073 | - /* outbound data */ | ||
6074 | - if (usb_endpoint_xfer_int(ir->usb_ep_out)) | ||
6075 | - usb_fill_int_urb(async_urb, ir->usbdev, ir->pipe_out, | ||
6076 | - async_buf, size, mce_async_callback, ir, | ||
6077 | - ir->usb_ep_out->bInterval); | ||
6078 | - else | ||
6079 | - usb_fill_bulk_urb(async_urb, ir->usbdev, ir->pipe_out, | ||
6080 | - async_buf, size, mce_async_callback, ir); | ||
6081 | - | ||
6082 | - memcpy(async_buf, data, size); | ||
6083 | - | ||
6084 | - dev_dbg(dev, "send request called (size=%#x)", size); | ||
6085 | + kfree(buf_out); | ||
6086 | + usb_free_urb(urb); | ||
6087 | |||
6088 | - res = usb_submit_urb(async_urb, GFP_ATOMIC); | ||
6089 | - if (res) { | ||
6090 | - dev_err(dev, "send request FAILED! (res=%d)", res); | ||
6091 | - kfree(async_buf); | ||
6092 | - usb_free_urb(async_urb); | ||
6093 | - return; | ||
6094 | - } | ||
6095 | - dev_dbg(dev, "send request complete (res=%d)", res); | ||
6096 | + return ret; | ||
6097 | } | ||
6098 | |||
6099 | -static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size) | ||
6100 | +static void mce_command_out(struct mceusb_dev *ir, u8 *data, int size) | ||
6101 | { | ||
6102 | int rsize = sizeof(DEVICE_RESUME); | ||
6103 | |||
6104 | if (ir->need_reset) { | ||
6105 | ir->need_reset = false; | ||
6106 | - mce_request_packet(ir, DEVICE_RESUME, rsize); | ||
6107 | + mce_write(ir, DEVICE_RESUME, rsize); | ||
6108 | msleep(10); | ||
6109 | } | ||
6110 | |||
6111 | - mce_request_packet(ir, data, size); | ||
6112 | + mce_write(ir, data, size); | ||
6113 | msleep(10); | ||
6114 | } | ||
6115 | |||
6116 | -/* Send data out the IR blaster port(s) */ | ||
6117 | +/* | ||
6118 | + * Transmit IR out the MCE device IR blaster port(s). | ||
6119 | + * | ||
6120 | + * Convert IR pulse/space sequence from LIRC to MCE format. | ||
6121 | + * Break up a long IR sequence into multiple parts (MCE IR data packets). | ||
6122 | + * | ||
6123 | + * u32 txbuf[] consists of IR pulse, space, ..., and pulse times in usec. | ||
6124 | + * Pulses and spaces are implicit by their position. | ||
6125 | + * The first IR sample, txbuf[0], is always a pulse. | ||
6126 | + * | ||
6127 | + * u8 irbuf[] consists of multiple IR data packets for the MCE device. | ||
6128 | + * A packet is 1 u8 MCE_IRDATA_HEADER and up to 30 u8 IR samples. | ||
6129 | + * An IR sample is 1-bit pulse/space flag with 7-bit time | ||
6130 | + * in MCE time units (50usec). | ||
6131 | + * | ||
6132 | + * Return: The number of IR samples sent (> 0) or errno (< 0). | ||
6133 | + */ | ||
6134 | static int mceusb_tx_ir(struct rc_dev *dev, unsigned *txbuf, unsigned count) | ||
6135 | { | ||
6136 | struct mceusb_dev *ir = dev->priv; | ||
6137 | - int i, length, ret = 0; | ||
6138 | - int cmdcount = 0; | ||
6139 | - unsigned char cmdbuf[MCE_CMDBUF_SIZE]; | ||
6140 | - | ||
6141 | - /* MCE tx init header */ | ||
6142 | - cmdbuf[cmdcount++] = MCE_CMD_PORT_IR; | ||
6143 | - cmdbuf[cmdcount++] = MCE_CMD_SETIRTXPORTS; | ||
6144 | - cmdbuf[cmdcount++] = ir->tx_mask; | ||
6145 | + u8 cmdbuf[3] = { MCE_CMD_PORT_IR, MCE_CMD_SETIRTXPORTS, 0x00 }; | ||
6146 | + u8 irbuf[MCE_IRBUF_SIZE]; | ||
6147 | + int ircount = 0; | ||
6148 | + unsigned int irsample; | ||
6149 | + int i, length, ret; | ||
6150 | |||
6151 | /* Send the set TX ports command */ | ||
6152 | - mce_async_out(ir, cmdbuf, cmdcount); | ||
6153 | - cmdcount = 0; | ||
6154 | - | ||
6155 | - /* Generate mce packet data */ | ||
6156 | - for (i = 0; (i < count) && (cmdcount < MCE_CMDBUF_SIZE); i++) { | ||
6157 | - txbuf[i] = txbuf[i] / MCE_TIME_UNIT; | ||
6158 | - | ||
6159 | - do { /* loop to support long pulses/spaces > 127*50us=6.35ms */ | ||
6160 | - | ||
6161 | - /* Insert mce packet header every 4th entry */ | ||
6162 | - if ((cmdcount < MCE_CMDBUF_SIZE) && | ||
6163 | - (cmdcount % MCE_CODE_LENGTH) == 0) | ||
6164 | - cmdbuf[cmdcount++] = MCE_IRDATA_HEADER; | ||
6165 | - | ||
6166 | - /* Insert mce packet data */ | ||
6167 | - if (cmdcount < MCE_CMDBUF_SIZE) | ||
6168 | - cmdbuf[cmdcount++] = | ||
6169 | - (txbuf[i] < MCE_PULSE_BIT ? | ||
6170 | - txbuf[i] : MCE_MAX_PULSE_LENGTH) | | ||
6171 | - (i & 1 ? 0x00 : MCE_PULSE_BIT); | ||
6172 | - else { | ||
6173 | - ret = -EINVAL; | ||
6174 | - goto out; | ||
6175 | + cmdbuf[2] = ir->tx_mask; | ||
6176 | + mce_command_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6177 | + | ||
6178 | + /* Generate mce IR data packet */ | ||
6179 | + for (i = 0; i < count; i++) { | ||
6180 | + irsample = txbuf[i] / MCE_TIME_UNIT; | ||
6181 | + | ||
6182 | + /* loop to support long pulses/spaces > 6350us (127*50us) */ | ||
6183 | + while (irsample > 0) { | ||
6184 | + /* Insert IR header every 30th entry */ | ||
6185 | + if (ircount % MCE_PACKET_SIZE == 0) { | ||
6186 | + /* Room for IR header and one IR sample? */ | ||
6187 | + if (ircount >= MCE_IRBUF_SIZE - 1) { | ||
6188 | + /* Send near full buffer */ | ||
6189 | + ret = mce_write(ir, irbuf, ircount); | ||
6190 | + if (ret < 0) | ||
6191 | + return ret; | ||
6192 | + ircount = 0; | ||
6193 | + } | ||
6194 | + irbuf[ircount++] = MCE_IRDATA_HEADER; | ||
6195 | } | ||
6196 | |||
6197 | - } while ((txbuf[i] > MCE_MAX_PULSE_LENGTH) && | ||
6198 | - (txbuf[i] -= MCE_MAX_PULSE_LENGTH)); | ||
6199 | - } | ||
6200 | - | ||
6201 | - /* Check if we have room for the empty packet at the end */ | ||
6202 | - if (cmdcount >= MCE_CMDBUF_SIZE) { | ||
6203 | - ret = -EINVAL; | ||
6204 | - goto out; | ||
6205 | - } | ||
6206 | + /* Insert IR sample */ | ||
6207 | + if (irsample <= MCE_MAX_PULSE_LENGTH) { | ||
6208 | + irbuf[ircount] = irsample; | ||
6209 | + irsample = 0; | ||
6210 | + } else { | ||
6211 | + irbuf[ircount] = MCE_MAX_PULSE_LENGTH; | ||
6212 | + irsample -= MCE_MAX_PULSE_LENGTH; | ||
6213 | + } | ||
6214 | + /* | ||
6215 | + * Even i = IR pulse | ||
6216 | + * Odd i = IR space | ||
6217 | + */ | ||
6218 | + irbuf[ircount] |= (i & 1 ? 0 : MCE_PULSE_BIT); | ||
6219 | + ircount++; | ||
6220 | + | ||
6221 | + /* IR buffer full? */ | ||
6222 | + if (ircount >= MCE_IRBUF_SIZE) { | ||
6223 | + /* Fix packet length in last header */ | ||
6224 | + length = ircount % MCE_PACKET_SIZE; | ||
6225 | + if (length > 0) | ||
6226 | + irbuf[ircount - length] -= | ||
6227 | + MCE_PACKET_SIZE - length; | ||
6228 | + /* Send full buffer */ | ||
6229 | + ret = mce_write(ir, irbuf, ircount); | ||
6230 | + if (ret < 0) | ||
6231 | + return ret; | ||
6232 | + ircount = 0; | ||
6233 | + } | ||
6234 | + } | ||
6235 | + } /* after for loop, 0 <= ircount < MCE_IRBUF_SIZE */ | ||
6236 | |||
6237 | /* Fix packet length in last header */ | ||
6238 | - length = cmdcount % MCE_CODE_LENGTH; | ||
6239 | - cmdbuf[cmdcount - length] -= MCE_CODE_LENGTH - length; | ||
6240 | + length = ircount % MCE_PACKET_SIZE; | ||
6241 | + if (length > 0) | ||
6242 | + irbuf[ircount - length] -= MCE_PACKET_SIZE - length; | ||
6243 | |||
6244 | - /* All mce commands end with an empty packet (0x80) */ | ||
6245 | - cmdbuf[cmdcount++] = MCE_IRDATA_TRAILER; | ||
6246 | + /* Append IR trailer (0x80) to final partial (or empty) IR buffer */ | ||
6247 | + irbuf[ircount++] = MCE_IRDATA_TRAILER; | ||
6248 | |||
6249 | - /* Transmit the command to the mce device */ | ||
6250 | - mce_async_out(ir, cmdbuf, cmdcount); | ||
6251 | + /* Send final buffer */ | ||
6252 | + ret = mce_write(ir, irbuf, ircount); | ||
6253 | + if (ret < 0) | ||
6254 | + return ret; | ||
6255 | |||
6256 | -out: | ||
6257 | - return ret ? ret : count; | ||
6258 | + return count; | ||
6259 | } | ||
6260 | |||
6261 | /* Sets active IR outputs -- mce devices typically have two */ | ||
6262 | @@ -963,7 +1020,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier) | ||
6263 | cmdbuf[2] = MCE_CMD_SIG_END; | ||
6264 | cmdbuf[3] = MCE_IRDATA_TRAILER; | ||
6265 | dev_dbg(ir->dev, "disabling carrier modulation"); | ||
6266 | - mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6267 | + mce_command_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6268 | return 0; | ||
6269 | } | ||
6270 | |||
6271 | @@ -977,7 +1034,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier) | ||
6272 | carrier); | ||
6273 | |||
6274 | /* Transmit new carrier to mce device */ | ||
6275 | - mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6276 | + mce_command_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6277 | return 0; | ||
6278 | } | ||
6279 | } | ||
6280 | @@ -1000,10 +1057,10 @@ static int mceusb_set_timeout(struct rc_dev *dev, unsigned int timeout) | ||
6281 | cmdbuf[2] = units >> 8; | ||
6282 | cmdbuf[3] = units; | ||
6283 | |||
6284 | - mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6285 | + mce_command_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6286 | |||
6287 | /* get receiver timeout value */ | ||
6288 | - mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); | ||
6289 | + mce_command_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); | ||
6290 | |||
6291 | return 0; | ||
6292 | } | ||
6293 | @@ -1028,7 +1085,7 @@ static int mceusb_set_rx_wideband(struct rc_dev *dev, int enable) | ||
6294 | ir->wideband_rx_enabled = false; | ||
6295 | cmdbuf[2] = 1; /* port 1 is long range receiver */ | ||
6296 | } | ||
6297 | - mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6298 | + mce_command_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6299 | /* response from device sets ir->learning_active */ | ||
6300 | |||
6301 | return 0; | ||
6302 | @@ -1051,7 +1108,7 @@ static int mceusb_set_rx_carrier_report(struct rc_dev *dev, int enable) | ||
6303 | ir->carrier_report_enabled = true; | ||
6304 | if (!ir->learning_active) { | ||
6305 | cmdbuf[2] = 2; /* port 2 is short range receiver */ | ||
6306 | - mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6307 | + mce_command_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6308 | } | ||
6309 | } else { | ||
6310 | ir->carrier_report_enabled = false; | ||
6311 | @@ -1062,7 +1119,7 @@ static int mceusb_set_rx_carrier_report(struct rc_dev *dev, int enable) | ||
6312 | */ | ||
6313 | if (ir->learning_active && !ir->wideband_rx_enabled) { | ||
6314 | cmdbuf[2] = 1; /* port 1 is long range receiver */ | ||
6315 | - mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6316 | + mce_command_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6317 | } | ||
6318 | } | ||
6319 | |||
6320 | @@ -1141,6 +1198,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index) | ||
6321 | } | ||
6322 | break; | ||
6323 | case MCE_RSP_CMD_ILLEGAL: | ||
6324 | + case MCE_RSP_TX_TIMEOUT: | ||
6325 | ir->need_reset = true; | ||
6326 | break; | ||
6327 | default: | ||
6328 | @@ -1279,7 +1337,7 @@ static void mceusb_get_emulator_version(struct mceusb_dev *ir) | ||
6329 | { | ||
6330 | /* If we get no reply or an illegal command reply, its ver 1, says MS */ | ||
6331 | ir->emver = 1; | ||
6332 | - mce_async_out(ir, GET_EMVER, sizeof(GET_EMVER)); | ||
6333 | + mce_command_out(ir, GET_EMVER, sizeof(GET_EMVER)); | ||
6334 | } | ||
6335 | |||
6336 | static void mceusb_gen1_init(struct mceusb_dev *ir) | ||
6337 | @@ -1325,10 +1383,10 @@ static void mceusb_gen1_init(struct mceusb_dev *ir) | ||
6338 | dev_dbg(dev, "set handshake - retC = %d", ret); | ||
6339 | |||
6340 | /* device resume */ | ||
6341 | - mce_async_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME)); | ||
6342 | + mce_command_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME)); | ||
6343 | |||
6344 | /* get hw/sw revision? */ | ||
6345 | - mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION)); | ||
6346 | + mce_command_out(ir, GET_REVISION, sizeof(GET_REVISION)); | ||
6347 | |||
6348 | kfree(data); | ||
6349 | } | ||
6350 | @@ -1336,13 +1394,13 @@ static void mceusb_gen1_init(struct mceusb_dev *ir) | ||
6351 | static void mceusb_gen2_init(struct mceusb_dev *ir) | ||
6352 | { | ||
6353 | /* device resume */ | ||
6354 | - mce_async_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME)); | ||
6355 | + mce_command_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME)); | ||
6356 | |||
6357 | /* get wake version (protocol, key, address) */ | ||
6358 | - mce_async_out(ir, GET_WAKEVERSION, sizeof(GET_WAKEVERSION)); | ||
6359 | + mce_command_out(ir, GET_WAKEVERSION, sizeof(GET_WAKEVERSION)); | ||
6360 | |||
6361 | /* unknown what this one actually returns... */ | ||
6362 | - mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2)); | ||
6363 | + mce_command_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2)); | ||
6364 | } | ||
6365 | |||
6366 | static void mceusb_get_parameters(struct mceusb_dev *ir) | ||
6367 | @@ -1356,24 +1414,24 @@ static void mceusb_get_parameters(struct mceusb_dev *ir) | ||
6368 | ir->num_rxports = 2; | ||
6369 | |||
6370 | /* get number of tx and rx ports */ | ||
6371 | - mce_async_out(ir, GET_NUM_PORTS, sizeof(GET_NUM_PORTS)); | ||
6372 | + mce_command_out(ir, GET_NUM_PORTS, sizeof(GET_NUM_PORTS)); | ||
6373 | |||
6374 | /* get the carrier and frequency */ | ||
6375 | - mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); | ||
6376 | + mce_command_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); | ||
6377 | |||
6378 | if (ir->num_txports && !ir->flags.no_tx) | ||
6379 | /* get the transmitter bitmask */ | ||
6380 | - mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); | ||
6381 | + mce_command_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); | ||
6382 | |||
6383 | /* get receiver timeout value */ | ||
6384 | - mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); | ||
6385 | + mce_command_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); | ||
6386 | |||
6387 | /* get receiver sensor setting */ | ||
6388 | - mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR)); | ||
6389 | + mce_command_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR)); | ||
6390 | |||
6391 | for (i = 0; i < ir->num_txports; i++) { | ||
6392 | cmdbuf[2] = i; | ||
6393 | - mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6394 | + mce_command_out(ir, cmdbuf, sizeof(cmdbuf)); | ||
6395 | } | ||
6396 | } | ||
6397 | |||
6398 | @@ -1382,7 +1440,7 @@ static void mceusb_flash_led(struct mceusb_dev *ir) | ||
6399 | if (ir->emver < 2) | ||
6400 | return; | ||
6401 | |||
6402 | - mce_async_out(ir, FLASH_LED, sizeof(FLASH_LED)); | ||
6403 | + mce_command_out(ir, FLASH_LED, sizeof(FLASH_LED)); | ||
6404 | } | ||
6405 | |||
6406 | /* | ||
6407 | diff --git a/drivers/media/rc/mtk-cir.c b/drivers/media/rc/mtk-cir.c | ||
6408 | index 50fb0aebb8d4..f2259082e3d8 100644 | ||
6409 | --- a/drivers/media/rc/mtk-cir.c | ||
6410 | +++ b/drivers/media/rc/mtk-cir.c | ||
6411 | @@ -35,6 +35,11 @@ | ||
6412 | /* Fields containing pulse width data */ | ||
6413 | #define MTK_WIDTH_MASK (GENMASK(7, 0)) | ||
6414 | |||
6415 | +/* IR threshold */ | ||
6416 | +#define MTK_IRTHD 0x14 | ||
6417 | +#define MTK_DG_CNT_MASK (GENMASK(12, 8)) | ||
6418 | +#define MTK_DG_CNT(x) ((x) << 8) | ||
6419 | + | ||
6420 | /* Bit to enable interrupt */ | ||
6421 | #define MTK_IRINT_EN BIT(0) | ||
6422 | |||
6423 | @@ -398,6 +403,9 @@ static int mtk_ir_probe(struct platform_device *pdev) | ||
6424 | mtk_w32_mask(ir, val, ir->data->fields[MTK_HW_PERIOD].mask, | ||
6425 | ir->data->fields[MTK_HW_PERIOD].reg); | ||
6426 | |||
6427 | + /* Set de-glitch counter */ | ||
6428 | + mtk_w32_mask(ir, MTK_DG_CNT(1), MTK_DG_CNT_MASK, MTK_IRTHD); | ||
6429 | + | ||
6430 | /* Enable IR and PWM */ | ||
6431 | val = mtk_r32(ir, MTK_CONFIG_HIGH_REG); | ||
6432 | val |= MTK_OK_COUNT(ir->data->ok_count) | MTK_PWM_EN | MTK_IR_EN; | ||
6433 | diff --git a/drivers/media/usb/cpia2/cpia2_usb.c b/drivers/media/usb/cpia2/cpia2_usb.c | ||
6434 | index 17468f7d78ed..3ab80a7b4498 100644 | ||
6435 | --- a/drivers/media/usb/cpia2/cpia2_usb.c | ||
6436 | +++ b/drivers/media/usb/cpia2/cpia2_usb.c | ||
6437 | @@ -676,6 +676,10 @@ static int submit_urbs(struct camera_data *cam) | ||
6438 | if (!urb) { | ||
6439 | for (j = 0; j < i; j++) | ||
6440 | usb_free_urb(cam->sbuf[j].urb); | ||
6441 | + for (j = 0; j < NUM_SBUF; j++) { | ||
6442 | + kfree(cam->sbuf[j].data); | ||
6443 | + cam->sbuf[j].data = NULL; | ||
6444 | + } | ||
6445 | return -ENOMEM; | ||
6446 | } | ||
6447 | |||
6448 | diff --git a/drivers/media/usb/dvb-usb/dib0700_devices.c b/drivers/media/usb/dvb-usb/dib0700_devices.c | ||
6449 | index 66d685065e06..ab7a100ec84f 100644 | ||
6450 | --- a/drivers/media/usb/dvb-usb/dib0700_devices.c | ||
6451 | +++ b/drivers/media/usb/dvb-usb/dib0700_devices.c | ||
6452 | @@ -2439,9 +2439,13 @@ static int dib9090_tuner_attach(struct dvb_usb_adapter *adap) | ||
6453 | 8, 0x0486, | ||
6454 | }; | ||
6455 | |||
6456 | + if (!IS_ENABLED(CONFIG_DVB_DIB9000)) | ||
6457 | + return -ENODEV; | ||
6458 | if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL) | ||
6459 | return -ENODEV; | ||
6460 | i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0); | ||
6461 | + if (!i2c) | ||
6462 | + return -ENODEV; | ||
6463 | if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0) | ||
6464 | return -ENODEV; | ||
6465 | dib0700_set_i2c_speed(adap->dev, 1500); | ||
6466 | @@ -2517,10 +2521,14 @@ static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap) | ||
6467 | 0, 0x00ef, | ||
6468 | 8, 0x0406, | ||
6469 | }; | ||
6470 | + if (!IS_ENABLED(CONFIG_DVB_DIB9000)) | ||
6471 | + return -ENODEV; | ||
6472 | i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe); | ||
6473 | if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL) | ||
6474 | return -ENODEV; | ||
6475 | i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0); | ||
6476 | + if (!i2c) | ||
6477 | + return -ENODEV; | ||
6478 | if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0) | ||
6479 | return -ENODEV; | ||
6480 | |||
6481 | diff --git a/drivers/media/usb/dvb-usb/pctv452e.c b/drivers/media/usb/dvb-usb/pctv452e.c | ||
6482 | index d6b36e4f33d2..441d878fc22c 100644 | ||
6483 | --- a/drivers/media/usb/dvb-usb/pctv452e.c | ||
6484 | +++ b/drivers/media/usb/dvb-usb/pctv452e.c | ||
6485 | @@ -909,14 +909,6 @@ static int pctv452e_frontend_attach(struct dvb_usb_adapter *a) | ||
6486 | &a->dev->i2c_adap); | ||
6487 | if (!a->fe_adap[0].fe) | ||
6488 | return -ENODEV; | ||
6489 | - | ||
6490 | - /* | ||
6491 | - * dvb_frontend will call dvb_detach for both stb0899_detach | ||
6492 | - * and stb0899_release but we only do dvb_attach(stb0899_attach). | ||
6493 | - * Increment the module refcount instead. | ||
6494 | - */ | ||
6495 | - symbol_get(stb0899_attach); | ||
6496 | - | ||
6497 | if ((dvb_attach(lnbp22_attach, a->fe_adap[0].fe, | ||
6498 | &a->dev->i2c_adap)) == NULL) | ||
6499 | err("Cannot attach lnbp22\n"); | ||
6500 | diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c | ||
6501 | index 1283c7ca9ad5..1de835a591a0 100644 | ||
6502 | --- a/drivers/media/usb/em28xx/em28xx-cards.c | ||
6503 | +++ b/drivers/media/usb/em28xx/em28xx-cards.c | ||
6504 | @@ -4020,7 +4020,6 @@ static void em28xx_usb_disconnect(struct usb_interface *intf) | ||
6505 | dev->dev_next->disconnected = 1; | ||
6506 | dev_info(&dev->intf->dev, "Disconnecting %s\n", | ||
6507 | dev->dev_next->name); | ||
6508 | - flush_request_modules(dev->dev_next); | ||
6509 | } | ||
6510 | |||
6511 | dev->disconnected = 1; | ||
6512 | diff --git a/drivers/media/usb/gspca/konica.c b/drivers/media/usb/gspca/konica.c | ||
6513 | index d8e40137a204..53db9a2895ea 100644 | ||
6514 | --- a/drivers/media/usb/gspca/konica.c | ||
6515 | +++ b/drivers/media/usb/gspca/konica.c | ||
6516 | @@ -114,6 +114,11 @@ static void reg_r(struct gspca_dev *gspca_dev, u16 value, u16 index) | ||
6517 | if (ret < 0) { | ||
6518 | pr_err("reg_r err %d\n", ret); | ||
6519 | gspca_dev->usb_err = ret; | ||
6520 | + /* | ||
6521 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6522 | + * values. | ||
6523 | + */ | ||
6524 | + memset(gspca_dev->usb_buf, 0, 2); | ||
6525 | } | ||
6526 | } | ||
6527 | |||
6528 | diff --git a/drivers/media/usb/gspca/nw80x.c b/drivers/media/usb/gspca/nw80x.c | ||
6529 | index 59649704beba..880f569bda30 100644 | ||
6530 | --- a/drivers/media/usb/gspca/nw80x.c | ||
6531 | +++ b/drivers/media/usb/gspca/nw80x.c | ||
6532 | @@ -1572,6 +1572,11 @@ static void reg_r(struct gspca_dev *gspca_dev, | ||
6533 | if (ret < 0) { | ||
6534 | pr_err("reg_r err %d\n", ret); | ||
6535 | gspca_dev->usb_err = ret; | ||
6536 | + /* | ||
6537 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6538 | + * values. | ||
6539 | + */ | ||
6540 | + memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); | ||
6541 | return; | ||
6542 | } | ||
6543 | if (len == 1) | ||
6544 | diff --git a/drivers/media/usb/gspca/ov519.c b/drivers/media/usb/gspca/ov519.c | ||
6545 | index cfb1f53bc17e..f417dfc0b872 100644 | ||
6546 | --- a/drivers/media/usb/gspca/ov519.c | ||
6547 | +++ b/drivers/media/usb/gspca/ov519.c | ||
6548 | @@ -2073,6 +2073,11 @@ static int reg_r(struct sd *sd, u16 index) | ||
6549 | } else { | ||
6550 | gspca_err(gspca_dev, "reg_r %02x failed %d\n", index, ret); | ||
6551 | sd->gspca_dev.usb_err = ret; | ||
6552 | + /* | ||
6553 | + * Make sure the result is zeroed to avoid uninitialized | ||
6554 | + * values. | ||
6555 | + */ | ||
6556 | + gspca_dev->usb_buf[0] = 0; | ||
6557 | } | ||
6558 | |||
6559 | return ret; | ||
6560 | @@ -2101,6 +2106,11 @@ static int reg_r8(struct sd *sd, | ||
6561 | } else { | ||
6562 | gspca_err(gspca_dev, "reg_r8 %02x failed %d\n", index, ret); | ||
6563 | sd->gspca_dev.usb_err = ret; | ||
6564 | + /* | ||
6565 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6566 | + * values. | ||
6567 | + */ | ||
6568 | + memset(gspca_dev->usb_buf, 0, 8); | ||
6569 | } | ||
6570 | |||
6571 | return ret; | ||
6572 | diff --git a/drivers/media/usb/gspca/ov534.c b/drivers/media/usb/gspca/ov534.c | ||
6573 | index 56521c991db4..185c1f10fb30 100644 | ||
6574 | --- a/drivers/media/usb/gspca/ov534.c | ||
6575 | +++ b/drivers/media/usb/gspca/ov534.c | ||
6576 | @@ -693,6 +693,11 @@ static u8 ov534_reg_read(struct gspca_dev *gspca_dev, u16 reg) | ||
6577 | if (ret < 0) { | ||
6578 | pr_err("read failed %d\n", ret); | ||
6579 | gspca_dev->usb_err = ret; | ||
6580 | + /* | ||
6581 | + * Make sure the result is zeroed to avoid uninitialized | ||
6582 | + * values. | ||
6583 | + */ | ||
6584 | + gspca_dev->usb_buf[0] = 0; | ||
6585 | } | ||
6586 | return gspca_dev->usb_buf[0]; | ||
6587 | } | ||
6588 | diff --git a/drivers/media/usb/gspca/ov534_9.c b/drivers/media/usb/gspca/ov534_9.c | ||
6589 | index 867f860a9650..91efc650cf76 100644 | ||
6590 | --- a/drivers/media/usb/gspca/ov534_9.c | ||
6591 | +++ b/drivers/media/usb/gspca/ov534_9.c | ||
6592 | @@ -1145,6 +1145,7 @@ static u8 reg_r(struct gspca_dev *gspca_dev, u16 reg) | ||
6593 | if (ret < 0) { | ||
6594 | pr_err("reg_r err %d\n", ret); | ||
6595 | gspca_dev->usb_err = ret; | ||
6596 | + return 0; | ||
6597 | } | ||
6598 | return gspca_dev->usb_buf[0]; | ||
6599 | } | ||
6600 | diff --git a/drivers/media/usb/gspca/se401.c b/drivers/media/usb/gspca/se401.c | ||
6601 | index 061deee138c3..e087cfb5980b 100644 | ||
6602 | --- a/drivers/media/usb/gspca/se401.c | ||
6603 | +++ b/drivers/media/usb/gspca/se401.c | ||
6604 | @@ -101,6 +101,11 @@ static void se401_read_req(struct gspca_dev *gspca_dev, u16 req, int silent) | ||
6605 | pr_err("read req failed req %#04x error %d\n", | ||
6606 | req, err); | ||
6607 | gspca_dev->usb_err = err; | ||
6608 | + /* | ||
6609 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6610 | + * values. | ||
6611 | + */ | ||
6612 | + memset(gspca_dev->usb_buf, 0, READ_REQ_SIZE); | ||
6613 | } | ||
6614 | } | ||
6615 | |||
6616 | diff --git a/drivers/media/usb/gspca/sn9c20x.c b/drivers/media/usb/gspca/sn9c20x.c | ||
6617 | index b43f89fee6c1..2a6d0a1265a7 100644 | ||
6618 | --- a/drivers/media/usb/gspca/sn9c20x.c | ||
6619 | +++ b/drivers/media/usb/gspca/sn9c20x.c | ||
6620 | @@ -123,6 +123,13 @@ static const struct dmi_system_id flip_dmi_table[] = { | ||
6621 | DMI_MATCH(DMI_PRODUCT_VERSION, "0341") | ||
6622 | } | ||
6623 | }, | ||
6624 | + { | ||
6625 | + .ident = "MSI MS-1039", | ||
6626 | + .matches = { | ||
6627 | + DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."), | ||
6628 | + DMI_MATCH(DMI_PRODUCT_NAME, "MS-1039"), | ||
6629 | + } | ||
6630 | + }, | ||
6631 | { | ||
6632 | .ident = "MSI MS-1632", | ||
6633 | .matches = { | ||
6634 | @@ -909,6 +916,11 @@ static void reg_r(struct gspca_dev *gspca_dev, u16 reg, u16 length) | ||
6635 | if (unlikely(result < 0 || result != length)) { | ||
6636 | pr_err("Read register %02x failed %d\n", reg, result); | ||
6637 | gspca_dev->usb_err = result; | ||
6638 | + /* | ||
6639 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6640 | + * values. | ||
6641 | + */ | ||
6642 | + memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); | ||
6643 | } | ||
6644 | } | ||
6645 | |||
6646 | diff --git a/drivers/media/usb/gspca/sonixb.c b/drivers/media/usb/gspca/sonixb.c | ||
6647 | index 046fc2c2a135..4d655e2da9cb 100644 | ||
6648 | --- a/drivers/media/usb/gspca/sonixb.c | ||
6649 | +++ b/drivers/media/usb/gspca/sonixb.c | ||
6650 | @@ -453,6 +453,11 @@ static void reg_r(struct gspca_dev *gspca_dev, | ||
6651 | dev_err(gspca_dev->v4l2_dev.dev, | ||
6652 | "Error reading register %02x: %d\n", value, res); | ||
6653 | gspca_dev->usb_err = res; | ||
6654 | + /* | ||
6655 | + * Make sure the result is zeroed to avoid uninitialized | ||
6656 | + * values. | ||
6657 | + */ | ||
6658 | + gspca_dev->usb_buf[0] = 0; | ||
6659 | } | ||
6660 | } | ||
6661 | |||
6662 | diff --git a/drivers/media/usb/gspca/sonixj.c b/drivers/media/usb/gspca/sonixj.c | ||
6663 | index 50a6c8425827..2e1bd2df8304 100644 | ||
6664 | --- a/drivers/media/usb/gspca/sonixj.c | ||
6665 | +++ b/drivers/media/usb/gspca/sonixj.c | ||
6666 | @@ -1162,6 +1162,11 @@ static void reg_r(struct gspca_dev *gspca_dev, | ||
6667 | if (ret < 0) { | ||
6668 | pr_err("reg_r err %d\n", ret); | ||
6669 | gspca_dev->usb_err = ret; | ||
6670 | + /* | ||
6671 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6672 | + * values. | ||
6673 | + */ | ||
6674 | + memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); | ||
6675 | } | ||
6676 | } | ||
6677 | |||
6678 | diff --git a/drivers/media/usb/gspca/spca1528.c b/drivers/media/usb/gspca/spca1528.c | ||
6679 | index 2ae03b60163f..ccc477944ef8 100644 | ||
6680 | --- a/drivers/media/usb/gspca/spca1528.c | ||
6681 | +++ b/drivers/media/usb/gspca/spca1528.c | ||
6682 | @@ -71,6 +71,11 @@ static void reg_r(struct gspca_dev *gspca_dev, | ||
6683 | if (ret < 0) { | ||
6684 | pr_err("reg_r err %d\n", ret); | ||
6685 | gspca_dev->usb_err = ret; | ||
6686 | + /* | ||
6687 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6688 | + * values. | ||
6689 | + */ | ||
6690 | + memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); | ||
6691 | } | ||
6692 | } | ||
6693 | |||
6694 | diff --git a/drivers/media/usb/gspca/sq930x.c b/drivers/media/usb/gspca/sq930x.c | ||
6695 | index d1ba0888d798..c3610247a90e 100644 | ||
6696 | --- a/drivers/media/usb/gspca/sq930x.c | ||
6697 | +++ b/drivers/media/usb/gspca/sq930x.c | ||
6698 | @@ -425,6 +425,11 @@ static void reg_r(struct gspca_dev *gspca_dev, | ||
6699 | if (ret < 0) { | ||
6700 | pr_err("reg_r %04x failed %d\n", value, ret); | ||
6701 | gspca_dev->usb_err = ret; | ||
6702 | + /* | ||
6703 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6704 | + * values. | ||
6705 | + */ | ||
6706 | + memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); | ||
6707 | } | ||
6708 | } | ||
6709 | |||
6710 | diff --git a/drivers/media/usb/gspca/sunplus.c b/drivers/media/usb/gspca/sunplus.c | ||
6711 | index d0ddfa957ca9..f4a4222f0d2e 100644 | ||
6712 | --- a/drivers/media/usb/gspca/sunplus.c | ||
6713 | +++ b/drivers/media/usb/gspca/sunplus.c | ||
6714 | @@ -255,6 +255,11 @@ static void reg_r(struct gspca_dev *gspca_dev, | ||
6715 | if (ret < 0) { | ||
6716 | pr_err("reg_r err %d\n", ret); | ||
6717 | gspca_dev->usb_err = ret; | ||
6718 | + /* | ||
6719 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6720 | + * values. | ||
6721 | + */ | ||
6722 | + memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); | ||
6723 | } | ||
6724 | } | ||
6725 | |||
6726 | diff --git a/drivers/media/usb/gspca/vc032x.c b/drivers/media/usb/gspca/vc032x.c | ||
6727 | index 588a847ea483..4cb7c92ea132 100644 | ||
6728 | --- a/drivers/media/usb/gspca/vc032x.c | ||
6729 | +++ b/drivers/media/usb/gspca/vc032x.c | ||
6730 | @@ -2906,6 +2906,11 @@ static void reg_r_i(struct gspca_dev *gspca_dev, | ||
6731 | if (ret < 0) { | ||
6732 | pr_err("reg_r err %d\n", ret); | ||
6733 | gspca_dev->usb_err = ret; | ||
6734 | + /* | ||
6735 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6736 | + * values. | ||
6737 | + */ | ||
6738 | + memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); | ||
6739 | } | ||
6740 | } | ||
6741 | static void reg_r(struct gspca_dev *gspca_dev, | ||
6742 | diff --git a/drivers/media/usb/gspca/w996Xcf.c b/drivers/media/usb/gspca/w996Xcf.c | ||
6743 | index 16b679c2de21..a8350ee9712f 100644 | ||
6744 | --- a/drivers/media/usb/gspca/w996Xcf.c | ||
6745 | +++ b/drivers/media/usb/gspca/w996Xcf.c | ||
6746 | @@ -133,6 +133,11 @@ static int w9968cf_read_sb(struct sd *sd) | ||
6747 | } else { | ||
6748 | pr_err("Read SB reg [01] failed\n"); | ||
6749 | sd->gspca_dev.usb_err = ret; | ||
6750 | + /* | ||
6751 | + * Make sure the buffer is zeroed to avoid uninitialized | ||
6752 | + * values. | ||
6753 | + */ | ||
6754 | + memset(sd->gspca_dev.usb_buf, 0, 2); | ||
6755 | } | ||
6756 | |||
6757 | udelay(W9968CF_I2C_BUS_DELAY); | ||
6758 | diff --git a/drivers/media/usb/hdpvr/hdpvr-core.c b/drivers/media/usb/hdpvr/hdpvr-core.c | ||
6759 | index 9b9d894d29bc..b75c18a012a7 100644 | ||
6760 | --- a/drivers/media/usb/hdpvr/hdpvr-core.c | ||
6761 | +++ b/drivers/media/usb/hdpvr/hdpvr-core.c | ||
6762 | @@ -137,6 +137,7 @@ static int device_authorization(struct hdpvr_device *dev) | ||
6763 | |||
6764 | dev->fw_ver = dev->usbc_buf[1]; | ||
6765 | |||
6766 | + dev->usbc_buf[46] = '\0'; | ||
6767 | v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n", | ||
6768 | dev->fw_ver, &dev->usbc_buf[2]); | ||
6769 | |||
6770 | @@ -271,6 +272,7 @@ static int hdpvr_probe(struct usb_interface *interface, | ||
6771 | #endif | ||
6772 | size_t buffer_size; | ||
6773 | int i; | ||
6774 | + int dev_num; | ||
6775 | int retval = -ENOMEM; | ||
6776 | |||
6777 | /* allocate memory for our device state and initialize it */ | ||
6778 | @@ -368,8 +370,17 @@ static int hdpvr_probe(struct usb_interface *interface, | ||
6779 | } | ||
6780 | #endif | ||
6781 | |||
6782 | + dev_num = atomic_inc_return(&dev_nr); | ||
6783 | + if (dev_num >= HDPVR_MAX) { | ||
6784 | + v4l2_err(&dev->v4l2_dev, | ||
6785 | + "max device number reached, device register failed\n"); | ||
6786 | + atomic_dec(&dev_nr); | ||
6787 | + retval = -ENODEV; | ||
6788 | + goto reg_fail; | ||
6789 | + } | ||
6790 | + | ||
6791 | retval = hdpvr_register_videodev(dev, &interface->dev, | ||
6792 | - video_nr[atomic_inc_return(&dev_nr)]); | ||
6793 | + video_nr[dev_num]); | ||
6794 | if (retval < 0) { | ||
6795 | v4l2_err(&dev->v4l2_dev, "registering videodev failed\n"); | ||
6796 | goto reg_fail; | ||
6797 | diff --git a/drivers/media/usb/ttusb-dec/ttusb_dec.c b/drivers/media/usb/ttusb-dec/ttusb_dec.c | ||
6798 | index 1d0afa340f47..3198f9624b7c 100644 | ||
6799 | --- a/drivers/media/usb/ttusb-dec/ttusb_dec.c | ||
6800 | +++ b/drivers/media/usb/ttusb-dec/ttusb_dec.c | ||
6801 | @@ -319,7 +319,7 @@ static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command, | ||
6802 | |||
6803 | dprintk("%s\n", __func__); | ||
6804 | |||
6805 | - b = kmalloc(COMMAND_PACKET_SIZE + 4, GFP_KERNEL); | ||
6806 | + b = kzalloc(COMMAND_PACKET_SIZE + 4, GFP_KERNEL); | ||
6807 | if (!b) | ||
6808 | return -ENOMEM; | ||
6809 | |||
6810 | diff --git a/drivers/media/v4l2-core/videobuf-core.c b/drivers/media/v4l2-core/videobuf-core.c | ||
6811 | index 7ef3e4d22bf6..939fc11cf080 100644 | ||
6812 | --- a/drivers/media/v4l2-core/videobuf-core.c | ||
6813 | +++ b/drivers/media/v4l2-core/videobuf-core.c | ||
6814 | @@ -1123,7 +1123,6 @@ __poll_t videobuf_poll_stream(struct file *file, | ||
6815 | struct videobuf_buffer *buf = NULL; | ||
6816 | __poll_t rc = 0; | ||
6817 | |||
6818 | - poll_wait(file, &buf->done, wait); | ||
6819 | videobuf_queue_lock(q); | ||
6820 | if (q->streaming) { | ||
6821 | if (!list_empty(&q->stream)) | ||
6822 | @@ -1143,7 +1142,9 @@ __poll_t videobuf_poll_stream(struct file *file, | ||
6823 | } | ||
6824 | buf = q->read_buf; | ||
6825 | } | ||
6826 | - if (!buf) | ||
6827 | + if (buf) | ||
6828 | + poll_wait(file, &buf->done, wait); | ||
6829 | + else | ||
6830 | rc = EPOLLERR; | ||
6831 | |||
6832 | if (0 == rc) { | ||
6833 | diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c | ||
6834 | index 0bcc5e83bd1a..40109a615922 100644 | ||
6835 | --- a/drivers/mmc/core/sdio_irq.c | ||
6836 | +++ b/drivers/mmc/core/sdio_irq.c | ||
6837 | @@ -31,6 +31,7 @@ static int process_sdio_pending_irqs(struct mmc_host *host) | ||
6838 | { | ||
6839 | struct mmc_card *card = host->card; | ||
6840 | int i, ret, count; | ||
6841 | + bool sdio_irq_pending = host->sdio_irq_pending; | ||
6842 | unsigned char pending; | ||
6843 | struct sdio_func *func; | ||
6844 | |||
6845 | @@ -38,13 +39,16 @@ static int process_sdio_pending_irqs(struct mmc_host *host) | ||
6846 | if (mmc_card_suspended(card)) | ||
6847 | return 0; | ||
6848 | |||
6849 | + /* Clear the flag to indicate that we have processed the IRQ. */ | ||
6850 | + host->sdio_irq_pending = false; | ||
6851 | + | ||
6852 | /* | ||
6853 | * Optimization, if there is only 1 function interrupt registered | ||
6854 | * and we know an IRQ was signaled then call irq handler directly. | ||
6855 | * Otherwise do the full probe. | ||
6856 | */ | ||
6857 | func = card->sdio_single_irq; | ||
6858 | - if (func && host->sdio_irq_pending) { | ||
6859 | + if (func && sdio_irq_pending) { | ||
6860 | func->irq_handler(func); | ||
6861 | return 1; | ||
6862 | } | ||
6863 | @@ -96,7 +100,6 @@ static void sdio_run_irqs(struct mmc_host *host) | ||
6864 | { | ||
6865 | mmc_claim_host(host); | ||
6866 | if (host->sdio_irqs) { | ||
6867 | - host->sdio_irq_pending = true; | ||
6868 | process_sdio_pending_irqs(host); | ||
6869 | if (host->ops->ack_sdio_irq) | ||
6870 | host->ops->ack_sdio_irq(host); | ||
6871 | @@ -114,6 +117,7 @@ void sdio_irq_work(struct work_struct *work) | ||
6872 | |||
6873 | void sdio_signal_irq(struct mmc_host *host) | ||
6874 | { | ||
6875 | + host->sdio_irq_pending = true; | ||
6876 | queue_delayed_work(system_wq, &host->sdio_irq_work, 0); | ||
6877 | } | ||
6878 | EXPORT_SYMBOL_GPL(sdio_signal_irq); | ||
6879 | @@ -159,7 +163,6 @@ static int sdio_irq_thread(void *_host) | ||
6880 | if (ret) | ||
6881 | break; | ||
6882 | ret = process_sdio_pending_irqs(host); | ||
6883 | - host->sdio_irq_pending = false; | ||
6884 | mmc_release_host(host); | ||
6885 | |||
6886 | /* | ||
6887 | diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c | ||
6888 | index eea52e2c5a0c..79c55c7b4afd 100644 | ||
6889 | --- a/drivers/mmc/host/dw_mmc.c | ||
6890 | +++ b/drivers/mmc/host/dw_mmc.c | ||
6891 | @@ -3460,6 +3460,10 @@ int dw_mci_runtime_resume(struct device *dev) | ||
6892 | /* Force setup bus to guarantee available clock output */ | ||
6893 | dw_mci_setup_bus(host->slot, true); | ||
6894 | |||
6895 | + /* Re-enable SDIO interrupts. */ | ||
6896 | + if (sdio_irq_claimed(host->slot->mmc)) | ||
6897 | + __dw_mci_enable_sdio_irq(host->slot, 1); | ||
6898 | + | ||
6899 | /* Now that slots are all setup, we can enable card detect */ | ||
6900 | dw_mci_enable_cd(host); | ||
6901 | |||
6902 | diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c | ||
6903 | index 33f4b6387ef7..978c8ccce7e3 100644 | ||
6904 | --- a/drivers/mmc/host/mtk-sd.c | ||
6905 | +++ b/drivers/mmc/host/mtk-sd.c | ||
6906 | @@ -2421,6 +2421,9 @@ static void msdc_restore_reg(struct msdc_host *host) | ||
6907 | } else { | ||
6908 | writel(host->save_para.pad_tune, host->base + tune_reg); | ||
6909 | } | ||
6910 | + | ||
6911 | + if (sdio_irq_claimed(host->mmc)) | ||
6912 | + __msdc_enable_sdio_irq(host, 1); | ||
6913 | } | ||
6914 | |||
6915 | static int msdc_runtime_suspend(struct device *dev) | ||
6916 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c | ||
6917 | index a5dc5aae973e..c66e66fbaeb4 100644 | ||
6918 | --- a/drivers/mmc/host/sdhci.c | ||
6919 | +++ b/drivers/mmc/host/sdhci.c | ||
6920 | @@ -1849,7 +1849,9 @@ void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing) | ||
6921 | ctrl_2 |= SDHCI_CTRL_UHS_SDR104; | ||
6922 | else if (timing == MMC_TIMING_UHS_SDR12) | ||
6923 | ctrl_2 |= SDHCI_CTRL_UHS_SDR12; | ||
6924 | - else if (timing == MMC_TIMING_UHS_SDR25) | ||
6925 | + else if (timing == MMC_TIMING_SD_HS || | ||
6926 | + timing == MMC_TIMING_MMC_HS || | ||
6927 | + timing == MMC_TIMING_UHS_SDR25) | ||
6928 | ctrl_2 |= SDHCI_CTRL_UHS_SDR25; | ||
6929 | else if (timing == MMC_TIMING_UHS_SDR50) | ||
6930 | ctrl_2 |= SDHCI_CTRL_UHS_SDR50; | ||
6931 | diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c b/drivers/mtd/nand/raw/stm32_fmc2_nand.c | ||
6932 | index e63acc077c18..8cc852dc7d54 100644 | ||
6933 | --- a/drivers/mtd/nand/raw/stm32_fmc2_nand.c | ||
6934 | +++ b/drivers/mtd/nand/raw/stm32_fmc2_nand.c | ||
6935 | @@ -1427,21 +1427,16 @@ static void stm32_fmc2_calc_timings(struct nand_chip *chip, | ||
6936 | struct stm32_fmc2_timings *tims = &nand->timings; | ||
6937 | unsigned long hclk = clk_get_rate(fmc2->clk); | ||
6938 | unsigned long hclkp = NSEC_PER_SEC / (hclk / 1000); | ||
6939 | - int tar, tclr, thiz, twait, tset_mem, tset_att, thold_mem, thold_att; | ||
6940 | - | ||
6941 | - tar = hclkp; | ||
6942 | - if (tar < sdrt->tAR_min) | ||
6943 | - tar = sdrt->tAR_min; | ||
6944 | - tims->tar = DIV_ROUND_UP(tar, hclkp) - 1; | ||
6945 | - if (tims->tar > FMC2_PCR_TIMING_MASK) | ||
6946 | - tims->tar = FMC2_PCR_TIMING_MASK; | ||
6947 | - | ||
6948 | - tclr = hclkp; | ||
6949 | - if (tclr < sdrt->tCLR_min) | ||
6950 | - tclr = sdrt->tCLR_min; | ||
6951 | - tims->tclr = DIV_ROUND_UP(tclr, hclkp) - 1; | ||
6952 | - if (tims->tclr > FMC2_PCR_TIMING_MASK) | ||
6953 | - tims->tclr = FMC2_PCR_TIMING_MASK; | ||
6954 | + unsigned long timing, tar, tclr, thiz, twait; | ||
6955 | + unsigned long tset_mem, tset_att, thold_mem, thold_att; | ||
6956 | + | ||
6957 | + tar = max_t(unsigned long, hclkp, sdrt->tAR_min); | ||
6958 | + timing = DIV_ROUND_UP(tar, hclkp) - 1; | ||
6959 | + tims->tar = min_t(unsigned long, timing, FMC2_PCR_TIMING_MASK); | ||
6960 | + | ||
6961 | + tclr = max_t(unsigned long, hclkp, sdrt->tCLR_min); | ||
6962 | + timing = DIV_ROUND_UP(tclr, hclkp) - 1; | ||
6963 | + tims->tclr = min_t(unsigned long, timing, FMC2_PCR_TIMING_MASK); | ||
6964 | |||
6965 | tims->thiz = FMC2_THIZ; | ||
6966 | thiz = (tims->thiz + 1) * hclkp; | ||
6967 | @@ -1451,18 +1446,11 @@ static void stm32_fmc2_calc_timings(struct nand_chip *chip, | ||
6968 | * tWAIT > tWP | ||
6969 | * tWAIT > tREA + tIO | ||
6970 | */ | ||
6971 | - twait = hclkp; | ||
6972 | - if (twait < sdrt->tRP_min) | ||
6973 | - twait = sdrt->tRP_min; | ||
6974 | - if (twait < sdrt->tWP_min) | ||
6975 | - twait = sdrt->tWP_min; | ||
6976 | - if (twait < sdrt->tREA_max + FMC2_TIO) | ||
6977 | - twait = sdrt->tREA_max + FMC2_TIO; | ||
6978 | - tims->twait = DIV_ROUND_UP(twait, hclkp); | ||
6979 | - if (tims->twait == 0) | ||
6980 | - tims->twait = 1; | ||
6981 | - else if (tims->twait > FMC2_PMEM_PATT_TIMING_MASK) | ||
6982 | - tims->twait = FMC2_PMEM_PATT_TIMING_MASK; | ||
6983 | + twait = max_t(unsigned long, hclkp, sdrt->tRP_min); | ||
6984 | + twait = max_t(unsigned long, twait, sdrt->tWP_min); | ||
6985 | + twait = max_t(unsigned long, twait, sdrt->tREA_max + FMC2_TIO); | ||
6986 | + timing = DIV_ROUND_UP(twait, hclkp); | ||
6987 | + tims->twait = clamp_val(timing, 1, FMC2_PMEM_PATT_TIMING_MASK); | ||
6988 | |||
6989 | /* | ||
6990 | * tSETUP_MEM > tCS - tWAIT | ||
6991 | @@ -1477,20 +1465,15 @@ static void stm32_fmc2_calc_timings(struct nand_chip *chip, | ||
6992 | if (twait > thiz && (sdrt->tDS_min > twait - thiz) && | ||
6993 | (tset_mem < sdrt->tDS_min - (twait - thiz))) | ||
6994 | tset_mem = sdrt->tDS_min - (twait - thiz); | ||
6995 | - tims->tset_mem = DIV_ROUND_UP(tset_mem, hclkp); | ||
6996 | - if (tims->tset_mem == 0) | ||
6997 | - tims->tset_mem = 1; | ||
6998 | - else if (tims->tset_mem > FMC2_PMEM_PATT_TIMING_MASK) | ||
6999 | - tims->tset_mem = FMC2_PMEM_PATT_TIMING_MASK; | ||
7000 | + timing = DIV_ROUND_UP(tset_mem, hclkp); | ||
7001 | + tims->tset_mem = clamp_val(timing, 1, FMC2_PMEM_PATT_TIMING_MASK); | ||
7002 | |||
7003 | /* | ||
7004 | * tHOLD_MEM > tCH | ||
7005 | * tHOLD_MEM > tREH - tSETUP_MEM | ||
7006 | * tHOLD_MEM > max(tRC, tWC) - (tSETUP_MEM + tWAIT) | ||
7007 | */ | ||
7008 | - thold_mem = hclkp; | ||
7009 | - if (thold_mem < sdrt->tCH_min) | ||
7010 | - thold_mem = sdrt->tCH_min; | ||
7011 | + thold_mem = max_t(unsigned long, hclkp, sdrt->tCH_min); | ||
7012 | if (sdrt->tREH_min > tset_mem && | ||
7013 | (thold_mem < sdrt->tREH_min - tset_mem)) | ||
7014 | thold_mem = sdrt->tREH_min - tset_mem; | ||
7015 | @@ -1500,11 +1483,8 @@ static void stm32_fmc2_calc_timings(struct nand_chip *chip, | ||
7016 | if ((sdrt->tWC_min > tset_mem + twait) && | ||
7017 | (thold_mem < sdrt->tWC_min - (tset_mem + twait))) | ||
7018 | thold_mem = sdrt->tWC_min - (tset_mem + twait); | ||
7019 | - tims->thold_mem = DIV_ROUND_UP(thold_mem, hclkp); | ||
7020 | - if (tims->thold_mem == 0) | ||
7021 | - tims->thold_mem = 1; | ||
7022 | - else if (tims->thold_mem > FMC2_PMEM_PATT_TIMING_MASK) | ||
7023 | - tims->thold_mem = FMC2_PMEM_PATT_TIMING_MASK; | ||
7024 | + timing = DIV_ROUND_UP(thold_mem, hclkp); | ||
7025 | + tims->thold_mem = clamp_val(timing, 1, FMC2_PMEM_PATT_TIMING_MASK); | ||
7026 | |||
7027 | /* | ||
7028 | * tSETUP_ATT > tCS - tWAIT | ||
7029 | @@ -1526,11 +1506,8 @@ static void stm32_fmc2_calc_timings(struct nand_chip *chip, | ||
7030 | if (twait > thiz && (sdrt->tDS_min > twait - thiz) && | ||
7031 | (tset_att < sdrt->tDS_min - (twait - thiz))) | ||
7032 | tset_att = sdrt->tDS_min - (twait - thiz); | ||
7033 | - tims->tset_att = DIV_ROUND_UP(tset_att, hclkp); | ||
7034 | - if (tims->tset_att == 0) | ||
7035 | - tims->tset_att = 1; | ||
7036 | - else if (tims->tset_att > FMC2_PMEM_PATT_TIMING_MASK) | ||
7037 | - tims->tset_att = FMC2_PMEM_PATT_TIMING_MASK; | ||
7038 | + timing = DIV_ROUND_UP(tset_att, hclkp); | ||
7039 | + tims->tset_att = clamp_val(timing, 1, FMC2_PMEM_PATT_TIMING_MASK); | ||
7040 | |||
7041 | /* | ||
7042 | * tHOLD_ATT > tALH | ||
7043 | @@ -1545,17 +1522,11 @@ static void stm32_fmc2_calc_timings(struct nand_chip *chip, | ||
7044 | * tHOLD_ATT > tRC - (tSETUP_ATT + tWAIT) | ||
7045 | * tHOLD_ATT > tWC - (tSETUP_ATT + tWAIT) | ||
7046 | */ | ||
7047 | - thold_att = hclkp; | ||
7048 | - if (thold_att < sdrt->tALH_min) | ||
7049 | - thold_att = sdrt->tALH_min; | ||
7050 | - if (thold_att < sdrt->tCH_min) | ||
7051 | - thold_att = sdrt->tCH_min; | ||
7052 | - if (thold_att < sdrt->tCLH_min) | ||
7053 | - thold_att = sdrt->tCLH_min; | ||
7054 | - if (thold_att < sdrt->tCOH_min) | ||
7055 | - thold_att = sdrt->tCOH_min; | ||
7056 | - if (thold_att < sdrt->tDH_min) | ||
7057 | - thold_att = sdrt->tDH_min; | ||
7058 | + thold_att = max_t(unsigned long, hclkp, sdrt->tALH_min); | ||
7059 | + thold_att = max_t(unsigned long, thold_att, sdrt->tCH_min); | ||
7060 | + thold_att = max_t(unsigned long, thold_att, sdrt->tCLH_min); | ||
7061 | + thold_att = max_t(unsigned long, thold_att, sdrt->tCOH_min); | ||
7062 | + thold_att = max_t(unsigned long, thold_att, sdrt->tDH_min); | ||
7063 | if ((sdrt->tWB_max + FMC2_TIO + FMC2_TSYNC > tset_mem) && | ||
7064 | (thold_att < sdrt->tWB_max + FMC2_TIO + FMC2_TSYNC - tset_mem)) | ||
7065 | thold_att = sdrt->tWB_max + FMC2_TIO + FMC2_TSYNC - tset_mem; | ||
7066 | @@ -1574,11 +1545,8 @@ static void stm32_fmc2_calc_timings(struct nand_chip *chip, | ||
7067 | if ((sdrt->tWC_min > tset_att + twait) && | ||
7068 | (thold_att < sdrt->tWC_min - (tset_att + twait))) | ||
7069 | thold_att = sdrt->tWC_min - (tset_att + twait); | ||
7070 | - tims->thold_att = DIV_ROUND_UP(thold_att, hclkp); | ||
7071 | - if (tims->thold_att == 0) | ||
7072 | - tims->thold_att = 1; | ||
7073 | - else if (tims->thold_att > FMC2_PMEM_PATT_TIMING_MASK) | ||
7074 | - tims->thold_att = FMC2_PMEM_PATT_TIMING_MASK; | ||
7075 | + timing = DIV_ROUND_UP(thold_att, hclkp); | ||
7076 | + tims->thold_att = clamp_val(timing, 1, FMC2_PMEM_PATT_TIMING_MASK); | ||
7077 | } | ||
7078 | |||
7079 | static int stm32_fmc2_setup_interface(struct nand_chip *chip, int chipnr, | ||
7080 | diff --git a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c | ||
7081 | index 8459115d9d4e..553776cc1d29 100644 | ||
7082 | --- a/drivers/net/arcnet/arcnet.c | ||
7083 | +++ b/drivers/net/arcnet/arcnet.c | ||
7084 | @@ -1063,31 +1063,34 @@ EXPORT_SYMBOL(arcnet_interrupt); | ||
7085 | static void arcnet_rx(struct net_device *dev, int bufnum) | ||
7086 | { | ||
7087 | struct arcnet_local *lp = netdev_priv(dev); | ||
7088 | - struct archdr pkt; | ||
7089 | + union { | ||
7090 | + struct archdr pkt; | ||
7091 | + char buf[512]; | ||
7092 | + } rxdata; | ||
7093 | struct arc_rfc1201 *soft; | ||
7094 | int length, ofs; | ||
7095 | |||
7096 | - soft = &pkt.soft.rfc1201; | ||
7097 | + soft = &rxdata.pkt.soft.rfc1201; | ||
7098 | |||
7099 | - lp->hw.copy_from_card(dev, bufnum, 0, &pkt, ARC_HDR_SIZE); | ||
7100 | - if (pkt.hard.offset[0]) { | ||
7101 | - ofs = pkt.hard.offset[0]; | ||
7102 | + lp->hw.copy_from_card(dev, bufnum, 0, &rxdata.pkt, ARC_HDR_SIZE); | ||
7103 | + if (rxdata.pkt.hard.offset[0]) { | ||
7104 | + ofs = rxdata.pkt.hard.offset[0]; | ||
7105 | length = 256 - ofs; | ||
7106 | } else { | ||
7107 | - ofs = pkt.hard.offset[1]; | ||
7108 | + ofs = rxdata.pkt.hard.offset[1]; | ||
7109 | length = 512 - ofs; | ||
7110 | } | ||
7111 | |||
7112 | /* get the full header, if possible */ | ||
7113 | - if (sizeof(pkt.soft) <= length) { | ||
7114 | - lp->hw.copy_from_card(dev, bufnum, ofs, soft, sizeof(pkt.soft)); | ||
7115 | + if (sizeof(rxdata.pkt.soft) <= length) { | ||
7116 | + lp->hw.copy_from_card(dev, bufnum, ofs, soft, sizeof(rxdata.pkt.soft)); | ||
7117 | } else { | ||
7118 | - memset(&pkt.soft, 0, sizeof(pkt.soft)); | ||
7119 | + memset(&rxdata.pkt.soft, 0, sizeof(rxdata.pkt.soft)); | ||
7120 | lp->hw.copy_from_card(dev, bufnum, ofs, soft, length); | ||
7121 | } | ||
7122 | |||
7123 | arc_printk(D_DURING, dev, "Buffer #%d: received packet from %02Xh to %02Xh (%d+4 bytes)\n", | ||
7124 | - bufnum, pkt.hard.source, pkt.hard.dest, length); | ||
7125 | + bufnum, rxdata.pkt.hard.source, rxdata.pkt.hard.dest, length); | ||
7126 | |||
7127 | dev->stats.rx_packets++; | ||
7128 | dev->stats.rx_bytes += length + ARC_HDR_SIZE; | ||
7129 | @@ -1096,13 +1099,13 @@ static void arcnet_rx(struct net_device *dev, int bufnum) | ||
7130 | if (arc_proto_map[soft->proto]->is_ip) { | ||
7131 | if (BUGLVL(D_PROTO)) { | ||
7132 | struct ArcProto | ||
7133 | - *oldp = arc_proto_map[lp->default_proto[pkt.hard.source]], | ||
7134 | + *oldp = arc_proto_map[lp->default_proto[rxdata.pkt.hard.source]], | ||
7135 | *newp = arc_proto_map[soft->proto]; | ||
7136 | |||
7137 | if (oldp != newp) { | ||
7138 | arc_printk(D_PROTO, dev, | ||
7139 | "got protocol %02Xh; encap for host %02Xh is now '%c' (was '%c')\n", | ||
7140 | - soft->proto, pkt.hard.source, | ||
7141 | + soft->proto, rxdata.pkt.hard.source, | ||
7142 | newp->suffix, oldp->suffix); | ||
7143 | } | ||
7144 | } | ||
7145 | @@ -1111,10 +1114,10 @@ static void arcnet_rx(struct net_device *dev, int bufnum) | ||
7146 | lp->default_proto[0] = soft->proto; | ||
7147 | |||
7148 | /* in striking contrast, the following isn't a hack. */ | ||
7149 | - lp->default_proto[pkt.hard.source] = soft->proto; | ||
7150 | + lp->default_proto[rxdata.pkt.hard.source] = soft->proto; | ||
7151 | } | ||
7152 | /* call the protocol-specific receiver. */ | ||
7153 | - arc_proto_map[soft->proto]->rx(dev, bufnum, &pkt, length); | ||
7154 | + arc_proto_map[soft->proto]->rx(dev, bufnum, &rxdata.pkt, length); | ||
7155 | } | ||
7156 | |||
7157 | static void null_rx(struct net_device *dev, int bufnum, | ||
7158 | diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c | ||
7159 | index 395b05701480..a1fab77b2096 100644 | ||
7160 | --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c | ||
7161 | +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c | ||
7162 | @@ -1429,6 +1429,16 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) | ||
7163 | else | ||
7164 | phy_reg |= 0xFA; | ||
7165 | e1e_wphy_locked(hw, I217_PLL_CLOCK_GATE_REG, phy_reg); | ||
7166 | + | ||
7167 | + if (speed == SPEED_1000) { | ||
7168 | + hw->phy.ops.read_reg_locked(hw, HV_PM_CTRL, | ||
7169 | + &phy_reg); | ||
7170 | + | ||
7171 | + phy_reg |= HV_PM_CTRL_K1_CLK_REQ; | ||
7172 | + | ||
7173 | + hw->phy.ops.write_reg_locked(hw, HV_PM_CTRL, | ||
7174 | + phy_reg); | ||
7175 | + } | ||
7176 | } | ||
7177 | hw->phy.ops.release(hw); | ||
7178 | |||
7179 | diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.h b/drivers/net/ethernet/intel/e1000e/ich8lan.h | ||
7180 | index eb09c755fa17..1502895eb45d 100644 | ||
7181 | --- a/drivers/net/ethernet/intel/e1000e/ich8lan.h | ||
7182 | +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.h | ||
7183 | @@ -210,7 +210,7 @@ | ||
7184 | |||
7185 | /* PHY Power Management Control */ | ||
7186 | #define HV_PM_CTRL PHY_REG(770, 17) | ||
7187 | -#define HV_PM_CTRL_PLL_STOP_IN_K1_GIGA 0x100 | ||
7188 | +#define HV_PM_CTRL_K1_CLK_REQ 0x200 | ||
7189 | #define HV_PM_CTRL_K1_ENABLE 0x4000 | ||
7190 | |||
7191 | #define I217_PLL_CLOCK_GATE_REG PHY_REG(772, 28) | ||
7192 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
7193 | index 9ebbe3da61bb..d22491ce73e6 100644 | ||
7194 | --- a/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
7195 | +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
7196 | @@ -2583,6 +2583,10 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf) | ||
7197 | return; | ||
7198 | if (!test_and_clear_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state)) | ||
7199 | return; | ||
7200 | + if (test_and_set_bit(__I40E_VF_DISABLE, pf->state)) { | ||
7201 | + set_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state); | ||
7202 | + return; | ||
7203 | + } | ||
7204 | |||
7205 | for (v = 0; v < pf->num_alloc_vsi; v++) { | ||
7206 | if (pf->vsi[v] && | ||
7207 | @@ -2597,6 +2601,7 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf) | ||
7208 | } | ||
7209 | } | ||
7210 | } | ||
7211 | + clear_bit(__I40E_VF_DISABLE, pf->state); | ||
7212 | } | ||
7213 | |||
7214 | /** | ||
7215 | diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c | ||
7216 | index 9ac854c2b371..697321898e84 100644 | ||
7217 | --- a/drivers/net/ethernet/marvell/skge.c | ||
7218 | +++ b/drivers/net/ethernet/marvell/skge.c | ||
7219 | @@ -3108,7 +3108,7 @@ static struct sk_buff *skge_rx_get(struct net_device *dev, | ||
7220 | skb_put(skb, len); | ||
7221 | |||
7222 | if (dev->features & NETIF_F_RXCSUM) { | ||
7223 | - skb->csum = csum; | ||
7224 | + skb->csum = le16_to_cpu(csum); | ||
7225 | skb->ip_summed = CHECKSUM_COMPLETE; | ||
7226 | } | ||
7227 | |||
7228 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c | ||
7229 | index 94304abc49e9..39e90b873319 100644 | ||
7230 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c | ||
7231 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c | ||
7232 | @@ -399,10 +399,10 @@ add_ethtool_flow_rule(struct mlx5e_priv *priv, | ||
7233 | struct mlx5_flow_table *ft, | ||
7234 | struct ethtool_rx_flow_spec *fs) | ||
7235 | { | ||
7236 | + struct mlx5_flow_act flow_act = { .flags = FLOW_ACT_NO_APPEND }; | ||
7237 | struct mlx5_flow_destination *dst = NULL; | ||
7238 | - struct mlx5_flow_act flow_act = {0}; | ||
7239 | - struct mlx5_flow_spec *spec; | ||
7240 | struct mlx5_flow_handle *rule; | ||
7241 | + struct mlx5_flow_spec *spec; | ||
7242 | int err = 0; | ||
7243 | |||
7244 | spec = kvzalloc(sizeof(*spec), GFP_KERNEL); | ||
7245 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
7246 | index 00b2d4a86159..98be5fe33674 100644 | ||
7247 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
7248 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
7249 | @@ -1369,46 +1369,63 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, | ||
7250 | return err; | ||
7251 | } | ||
7252 | |||
7253 | - if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) { | ||
7254 | - struct flow_match_ipv4_addrs match; | ||
7255 | + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL)) { | ||
7256 | + struct flow_match_control match; | ||
7257 | + u16 addr_type; | ||
7258 | |||
7259 | - flow_rule_match_enc_ipv4_addrs(rule, &match); | ||
7260 | - MLX5_SET(fte_match_set_lyr_2_4, headers_c, | ||
7261 | - src_ipv4_src_ipv6.ipv4_layout.ipv4, | ||
7262 | - ntohl(match.mask->src)); | ||
7263 | - MLX5_SET(fte_match_set_lyr_2_4, headers_v, | ||
7264 | - src_ipv4_src_ipv6.ipv4_layout.ipv4, | ||
7265 | - ntohl(match.key->src)); | ||
7266 | - | ||
7267 | - MLX5_SET(fte_match_set_lyr_2_4, headers_c, | ||
7268 | - dst_ipv4_dst_ipv6.ipv4_layout.ipv4, | ||
7269 | - ntohl(match.mask->dst)); | ||
7270 | - MLX5_SET(fte_match_set_lyr_2_4, headers_v, | ||
7271 | - dst_ipv4_dst_ipv6.ipv4_layout.ipv4, | ||
7272 | - ntohl(match.key->dst)); | ||
7273 | - | ||
7274 | - MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, ethertype); | ||
7275 | - MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype, ETH_P_IP); | ||
7276 | - } else if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS)) { | ||
7277 | - struct flow_match_ipv6_addrs match; | ||
7278 | + flow_rule_match_enc_control(rule, &match); | ||
7279 | + addr_type = match.key->addr_type; | ||
7280 | |||
7281 | - flow_rule_match_enc_ipv6_addrs(rule, &match); | ||
7282 | - memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c, | ||
7283 | - src_ipv4_src_ipv6.ipv6_layout.ipv6), | ||
7284 | - &match.mask->src, MLX5_FLD_SZ_BYTES(ipv6_layout, ipv6)); | ||
7285 | - memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v, | ||
7286 | - src_ipv4_src_ipv6.ipv6_layout.ipv6), | ||
7287 | - &match.key->src, MLX5_FLD_SZ_BYTES(ipv6_layout, ipv6)); | ||
7288 | + /* For tunnel addr_type used same key id`s as for non-tunnel */ | ||
7289 | + if (addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) { | ||
7290 | + struct flow_match_ipv4_addrs match; | ||
7291 | |||
7292 | - memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c, | ||
7293 | - dst_ipv4_dst_ipv6.ipv6_layout.ipv6), | ||
7294 | - &match.mask->dst, MLX5_FLD_SZ_BYTES(ipv6_layout, ipv6)); | ||
7295 | - memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v, | ||
7296 | - dst_ipv4_dst_ipv6.ipv6_layout.ipv6), | ||
7297 | - &match.key->dst, MLX5_FLD_SZ_BYTES(ipv6_layout, ipv6)); | ||
7298 | + flow_rule_match_enc_ipv4_addrs(rule, &match); | ||
7299 | + MLX5_SET(fte_match_set_lyr_2_4, headers_c, | ||
7300 | + src_ipv4_src_ipv6.ipv4_layout.ipv4, | ||
7301 | + ntohl(match.mask->src)); | ||
7302 | + MLX5_SET(fte_match_set_lyr_2_4, headers_v, | ||
7303 | + src_ipv4_src_ipv6.ipv4_layout.ipv4, | ||
7304 | + ntohl(match.key->src)); | ||
7305 | |||
7306 | - MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, ethertype); | ||
7307 | - MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype, ETH_P_IPV6); | ||
7308 | + MLX5_SET(fte_match_set_lyr_2_4, headers_c, | ||
7309 | + dst_ipv4_dst_ipv6.ipv4_layout.ipv4, | ||
7310 | + ntohl(match.mask->dst)); | ||
7311 | + MLX5_SET(fte_match_set_lyr_2_4, headers_v, | ||
7312 | + dst_ipv4_dst_ipv6.ipv4_layout.ipv4, | ||
7313 | + ntohl(match.key->dst)); | ||
7314 | + | ||
7315 | + MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, | ||
7316 | + ethertype); | ||
7317 | + MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype, | ||
7318 | + ETH_P_IP); | ||
7319 | + } else if (addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) { | ||
7320 | + struct flow_match_ipv6_addrs match; | ||
7321 | + | ||
7322 | + flow_rule_match_enc_ipv6_addrs(rule, &match); | ||
7323 | + memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c, | ||
7324 | + src_ipv4_src_ipv6.ipv6_layout.ipv6), | ||
7325 | + &match.mask->src, MLX5_FLD_SZ_BYTES(ipv6_layout, | ||
7326 | + ipv6)); | ||
7327 | + memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v, | ||
7328 | + src_ipv4_src_ipv6.ipv6_layout.ipv6), | ||
7329 | + &match.key->src, MLX5_FLD_SZ_BYTES(ipv6_layout, | ||
7330 | + ipv6)); | ||
7331 | + | ||
7332 | + memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c, | ||
7333 | + dst_ipv4_dst_ipv6.ipv6_layout.ipv6), | ||
7334 | + &match.mask->dst, MLX5_FLD_SZ_BYTES(ipv6_layout, | ||
7335 | + ipv6)); | ||
7336 | + memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v, | ||
7337 | + dst_ipv4_dst_ipv6.ipv6_layout.ipv6), | ||
7338 | + &match.key->dst, MLX5_FLD_SZ_BYTES(ipv6_layout, | ||
7339 | + ipv6)); | ||
7340 | + | ||
7341 | + MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, | ||
7342 | + ethertype); | ||
7343 | + MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype, | ||
7344 | + ETH_P_IPV6); | ||
7345 | + } | ||
7346 | } | ||
7347 | |||
7348 | if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IP)) { | ||
7349 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
7350 | index b15b27a497fc..fda4964c5cf4 100644 | ||
7351 | --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
7352 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
7353 | @@ -1554,6 +1554,7 @@ static const struct pci_device_id mlx5_core_pci_table[] = { | ||
7354 | { PCI_VDEVICE(MELLANOX, 0x101e), MLX5_PCI_DEV_IS_VF}, /* ConnectX Family mlx5Gen Virtual Function */ | ||
7355 | { PCI_VDEVICE(MELLANOX, 0xa2d2) }, /* BlueField integrated ConnectX-5 network controller */ | ||
7356 | { PCI_VDEVICE(MELLANOX, 0xa2d3), MLX5_PCI_DEV_IS_VF}, /* BlueField integrated ConnectX-5 network controller VF */ | ||
7357 | + { PCI_VDEVICE(MELLANOX, 0xa2d6) }, /* BlueField-2 integrated ConnectX-6 Dx network controller */ | ||
7358 | { 0, } | ||
7359 | }; | ||
7360 | |||
7361 | diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c | ||
7362 | index eb846133943b..acb02e1513f2 100644 | ||
7363 | --- a/drivers/net/ethernet/netronome/nfp/flower/main.c | ||
7364 | +++ b/drivers/net/ethernet/netronome/nfp/flower/main.c | ||
7365 | @@ -400,6 +400,7 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app, | ||
7366 | repr_priv = kzalloc(sizeof(*repr_priv), GFP_KERNEL); | ||
7367 | if (!repr_priv) { | ||
7368 | err = -ENOMEM; | ||
7369 | + nfp_repr_free(repr); | ||
7370 | goto err_reprs_clean; | ||
7371 | } | ||
7372 | |||
7373 | @@ -413,6 +414,7 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app, | ||
7374 | port = nfp_port_alloc(app, port_type, repr); | ||
7375 | if (IS_ERR(port)) { | ||
7376 | err = PTR_ERR(port); | ||
7377 | + kfree(repr_priv); | ||
7378 | nfp_repr_free(repr); | ||
7379 | goto err_reprs_clean; | ||
7380 | } | ||
7381 | @@ -433,6 +435,7 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app, | ||
7382 | err = nfp_repr_init(app, repr, | ||
7383 | port_id, port, priv->nn->dp.netdev); | ||
7384 | if (err) { | ||
7385 | + kfree(repr_priv); | ||
7386 | nfp_port_free(port); | ||
7387 | nfp_repr_free(repr); | ||
7388 | goto err_reprs_clean; | ||
7389 | @@ -515,6 +518,7 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv) | ||
7390 | repr_priv = kzalloc(sizeof(*repr_priv), GFP_KERNEL); | ||
7391 | if (!repr_priv) { | ||
7392 | err = -ENOMEM; | ||
7393 | + nfp_repr_free(repr); | ||
7394 | goto err_reprs_clean; | ||
7395 | } | ||
7396 | |||
7397 | @@ -525,11 +529,13 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv) | ||
7398 | port = nfp_port_alloc(app, NFP_PORT_PHYS_PORT, repr); | ||
7399 | if (IS_ERR(port)) { | ||
7400 | err = PTR_ERR(port); | ||
7401 | + kfree(repr_priv); | ||
7402 | nfp_repr_free(repr); | ||
7403 | goto err_reprs_clean; | ||
7404 | } | ||
7405 | err = nfp_port_init_phy_port(app->pf, app, port, i); | ||
7406 | if (err) { | ||
7407 | + kfree(repr_priv); | ||
7408 | nfp_port_free(port); | ||
7409 | nfp_repr_free(repr); | ||
7410 | goto err_reprs_clean; | ||
7411 | @@ -542,6 +548,7 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv) | ||
7412 | err = nfp_repr_init(app, repr, | ||
7413 | cmsg_port_id, port, priv->nn->dp.netdev); | ||
7414 | if (err) { | ||
7415 | + kfree(repr_priv); | ||
7416 | nfp_port_free(port); | ||
7417 | nfp_repr_free(repr); | ||
7418 | goto err_reprs_clean; | ||
7419 | diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c | ||
7420 | index f7e11f1b0426..b0c8be127bee 100644 | ||
7421 | --- a/drivers/net/ethernet/nxp/lpc_eth.c | ||
7422 | +++ b/drivers/net/ethernet/nxp/lpc_eth.c | ||
7423 | @@ -1344,13 +1344,14 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) | ||
7424 | pldat->dma_buff_base_p = dma_handle; | ||
7425 | |||
7426 | netdev_dbg(ndev, "IO address space :%pR\n", res); | ||
7427 | - netdev_dbg(ndev, "IO address size :%d\n", resource_size(res)); | ||
7428 | + netdev_dbg(ndev, "IO address size :%zd\n", | ||
7429 | + (size_t)resource_size(res)); | ||
7430 | netdev_dbg(ndev, "IO address (mapped) :0x%p\n", | ||
7431 | pldat->net_base); | ||
7432 | netdev_dbg(ndev, "IRQ number :%d\n", ndev->irq); | ||
7433 | - netdev_dbg(ndev, "DMA buffer size :%d\n", pldat->dma_buff_size); | ||
7434 | - netdev_dbg(ndev, "DMA buffer P address :0x%08x\n", | ||
7435 | - pldat->dma_buff_base_p); | ||
7436 | + netdev_dbg(ndev, "DMA buffer size :%zd\n", pldat->dma_buff_size); | ||
7437 | + netdev_dbg(ndev, "DMA buffer P address :%pad\n", | ||
7438 | + &pldat->dma_buff_base_p); | ||
7439 | netdev_dbg(ndev, "DMA buffer V address :0x%p\n", | ||
7440 | pldat->dma_buff_base_v); | ||
7441 | |||
7442 | @@ -1397,8 +1398,8 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) | ||
7443 | if (ret) | ||
7444 | goto err_out_unregister_netdev; | ||
7445 | |||
7446 | - netdev_info(ndev, "LPC mac at 0x%08x irq %d\n", | ||
7447 | - res->start, ndev->irq); | ||
7448 | + netdev_info(ndev, "LPC mac at 0x%08lx irq %d\n", | ||
7449 | + (unsigned long)res->start, ndev->irq); | ||
7450 | |||
7451 | device_init_wakeup(dev, 1); | ||
7452 | device_set_wakeup_enable(dev, 0); | ||
7453 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
7454 | index b19ab09cb18f..5c4408bdc843 100644 | ||
7455 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
7456 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
7457 | @@ -1532,13 +1532,15 @@ static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv) | ||
7458 | for (queue = 0; queue < rx_count; queue++) { | ||
7459 | struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; | ||
7460 | struct page_pool_params pp_params = { 0 }; | ||
7461 | + unsigned int num_pages; | ||
7462 | |||
7463 | rx_q->queue_index = queue; | ||
7464 | rx_q->priv_data = priv; | ||
7465 | |||
7466 | pp_params.flags = PP_FLAG_DMA_MAP; | ||
7467 | pp_params.pool_size = DMA_RX_SIZE; | ||
7468 | - pp_params.order = DIV_ROUND_UP(priv->dma_buf_sz, PAGE_SIZE); | ||
7469 | + num_pages = DIV_ROUND_UP(priv->dma_buf_sz, PAGE_SIZE); | ||
7470 | + pp_params.order = ilog2(num_pages); | ||
7471 | pp_params.nid = dev_to_node(priv->device); | ||
7472 | pp_params.dev = priv->device; | ||
7473 | pp_params.dma_dir = DMA_FROM_DEVICE; | ||
7474 | diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c | ||
7475 | index 8f46aa1ddec0..cb7637364b40 100644 | ||
7476 | --- a/drivers/net/macsec.c | ||
7477 | +++ b/drivers/net/macsec.c | ||
7478 | @@ -1235,6 +1235,7 @@ deliver: | ||
7479 | macsec_rxsa_put(rx_sa); | ||
7480 | macsec_rxsc_put(rx_sc); | ||
7481 | |||
7482 | + skb_orphan(skb); | ||
7483 | ret = gro_cells_receive(&macsec->gro_cells, skb); | ||
7484 | if (ret == NET_RX_SUCCESS) | ||
7485 | count_rx(dev, skb->len); | ||
7486 | diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c | ||
7487 | index 3c8186f269f9..2fea5541c35a 100644 | ||
7488 | --- a/drivers/net/phy/micrel.c | ||
7489 | +++ b/drivers/net/phy/micrel.c | ||
7490 | @@ -763,6 +763,8 @@ static int ksz9031_get_features(struct phy_device *phydev) | ||
7491 | * Whenever the device's Asymmetric Pause capability is set to 1, | ||
7492 | * link-up may fail after a link-up to link-down transition. | ||
7493 | * | ||
7494 | + * The Errata Sheet is for ksz9031, but ksz9021 has the same issue | ||
7495 | + * | ||
7496 | * Workaround: | ||
7497 | * Do not enable the Asymmetric Pause capability bit. | ||
7498 | */ | ||
7499 | @@ -1076,6 +1078,7 @@ static struct phy_driver ksphy_driver[] = { | ||
7500 | /* PHY_GBIT_FEATURES */ | ||
7501 | .driver_data = &ksz9021_type, | ||
7502 | .probe = kszphy_probe, | ||
7503 | + .get_features = ksz9031_get_features, | ||
7504 | .config_init = ksz9021_config_init, | ||
7505 | .ack_interrupt = kszphy_ack_interrupt, | ||
7506 | .config_intr = kszphy_config_intr, | ||
7507 | diff --git a/drivers/net/phy/national.c b/drivers/net/phy/national.c | ||
7508 | index a221dd552c3c..a5bf0874c7d8 100644 | ||
7509 | --- a/drivers/net/phy/national.c | ||
7510 | +++ b/drivers/net/phy/national.c | ||
7511 | @@ -105,14 +105,17 @@ static void ns_giga_speed_fallback(struct phy_device *phydev, int mode) | ||
7512 | |||
7513 | static void ns_10_base_t_hdx_loopack(struct phy_device *phydev, int disable) | ||
7514 | { | ||
7515 | + u16 lb_dis = BIT(1); | ||
7516 | + | ||
7517 | if (disable) | ||
7518 | - ns_exp_write(phydev, 0x1c0, ns_exp_read(phydev, 0x1c0) | 1); | ||
7519 | + ns_exp_write(phydev, 0x1c0, | ||
7520 | + ns_exp_read(phydev, 0x1c0) | lb_dis); | ||
7521 | else | ||
7522 | ns_exp_write(phydev, 0x1c0, | ||
7523 | - ns_exp_read(phydev, 0x1c0) & 0xfffe); | ||
7524 | + ns_exp_read(phydev, 0x1c0) & ~lb_dis); | ||
7525 | |||
7526 | pr_debug("10BASE-T HDX loopback %s\n", | ||
7527 | - (ns_exp_read(phydev, 0x1c0) & 0x0001) ? "off" : "on"); | ||
7528 | + (ns_exp_read(phydev, 0x1c0) & lb_dis) ? "off" : "on"); | ||
7529 | } | ||
7530 | |||
7531 | static int ns_config_init(struct phy_device *phydev) | ||
7532 | diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c | ||
7533 | index a30e41a56085..9a1b006904a7 100644 | ||
7534 | --- a/drivers/net/ppp/ppp_generic.c | ||
7535 | +++ b/drivers/net/ppp/ppp_generic.c | ||
7536 | @@ -1415,6 +1415,8 @@ static void __ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) | ||
7537 | netif_wake_queue(ppp->dev); | ||
7538 | else | ||
7539 | netif_stop_queue(ppp->dev); | ||
7540 | + } else { | ||
7541 | + kfree_skb(skb); | ||
7542 | } | ||
7543 | ppp_xmit_unlock(ppp); | ||
7544 | } | ||
7545 | diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c | ||
7546 | index 50c05d0f44cb..00cab3f43a4c 100644 | ||
7547 | --- a/drivers/net/usb/cdc_ncm.c | ||
7548 | +++ b/drivers/net/usb/cdc_ncm.c | ||
7549 | @@ -681,8 +681,12 @@ cdc_ncm_find_endpoints(struct usbnet *dev, struct usb_interface *intf) | ||
7550 | u8 ep; | ||
7551 | |||
7552 | for (ep = 0; ep < intf->cur_altsetting->desc.bNumEndpoints; ep++) { | ||
7553 | - | ||
7554 | e = intf->cur_altsetting->endpoint + ep; | ||
7555 | + | ||
7556 | + /* ignore endpoints which cannot transfer data */ | ||
7557 | + if (!usb_endpoint_maxp(&e->desc)) | ||
7558 | + continue; | ||
7559 | + | ||
7560 | switch (e->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { | ||
7561 | case USB_ENDPOINT_XFER_INT: | ||
7562 | if (usb_endpoint_dir_in(&e->desc)) { | ||
7563 | diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c | ||
7564 | index 72514c46b478..ef1d667b0108 100644 | ||
7565 | --- a/drivers/net/usb/usbnet.c | ||
7566 | +++ b/drivers/net/usb/usbnet.c | ||
7567 | @@ -100,6 +100,11 @@ int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf) | ||
7568 | int intr = 0; | ||
7569 | |||
7570 | e = alt->endpoint + ep; | ||
7571 | + | ||
7572 | + /* ignore endpoints which cannot transfer data */ | ||
7573 | + if (!usb_endpoint_maxp(&e->desc)) | ||
7574 | + continue; | ||
7575 | + | ||
7576 | switch (e->desc.bmAttributes) { | ||
7577 | case USB_ENDPOINT_XFER_INT: | ||
7578 | if (!usb_endpoint_dir_in(&e->desc)) | ||
7579 | @@ -339,6 +344,8 @@ void usbnet_update_max_qlen(struct usbnet *dev) | ||
7580 | { | ||
7581 | enum usb_device_speed speed = dev->udev->speed; | ||
7582 | |||
7583 | + if (!dev->rx_urb_size || !dev->hard_mtu) | ||
7584 | + goto insanity; | ||
7585 | switch (speed) { | ||
7586 | case USB_SPEED_HIGH: | ||
7587 | dev->rx_qlen = MAX_QUEUE_MEMORY / dev->rx_urb_size; | ||
7588 | @@ -355,6 +362,7 @@ void usbnet_update_max_qlen(struct usbnet *dev) | ||
7589 | dev->tx_qlen = 5 * MAX_QUEUE_MEMORY / dev->hard_mtu; | ||
7590 | break; | ||
7591 | default: | ||
7592 | +insanity: | ||
7593 | dev->rx_qlen = dev->tx_qlen = 4; | ||
7594 | } | ||
7595 | } | ||
7596 | diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c | ||
7597 | index 6e84328bdd40..a4b38a980c3c 100644 | ||
7598 | --- a/drivers/net/vrf.c | ||
7599 | +++ b/drivers/net/vrf.c | ||
7600 | @@ -1154,7 +1154,8 @@ static int vrf_fib_rule(const struct net_device *dev, __u8 family, bool add_it) | ||
7601 | struct sk_buff *skb; | ||
7602 | int err; | ||
7603 | |||
7604 | - if (family == AF_INET6 && !ipv6_mod_enabled()) | ||
7605 | + if ((family == AF_INET6 || family == RTNL_FAMILY_IP6MR) && | ||
7606 | + !ipv6_mod_enabled()) | ||
7607 | return 0; | ||
7608 | |||
7609 | skb = nlmsg_new(vrf_fib_rule_nl_size(), GFP_KERNEL); | ||
7610 | diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c | ||
7611 | index 2985bb17decd..4d5d10c01064 100644 | ||
7612 | --- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c | ||
7613 | +++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c | ||
7614 | @@ -841,7 +841,7 @@ static int ath10k_wmi_tlv_op_pull_ch_info_ev(struct ath10k *ar, | ||
7615 | struct wmi_ch_info_ev_arg *arg) | ||
7616 | { | ||
7617 | const void **tb; | ||
7618 | - const struct wmi_chan_info_event *ev; | ||
7619 | + const struct wmi_tlv_chan_info_event *ev; | ||
7620 | int ret; | ||
7621 | |||
7622 | tb = ath10k_wmi_tlv_parse_alloc(ar, skb->data, skb->len, GFP_ATOMIC); | ||
7623 | diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.h b/drivers/net/wireless/ath/ath10k/wmi-tlv.h | ||
7624 | index d691f06e58f2..649b229a41e9 100644 | ||
7625 | --- a/drivers/net/wireless/ath/ath10k/wmi-tlv.h | ||
7626 | +++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.h | ||
7627 | @@ -1615,6 +1615,22 @@ struct chan_info_params { | ||
7628 | |||
7629 | #define WMI_TLV_FLAG_MGMT_BUNDLE_TX_COMPL BIT(9) | ||
7630 | |||
7631 | +struct wmi_tlv_chan_info_event { | ||
7632 | + __le32 err_code; | ||
7633 | + __le32 freq; | ||
7634 | + __le32 cmd_flags; | ||
7635 | + __le32 noise_floor; | ||
7636 | + __le32 rx_clear_count; | ||
7637 | + __le32 cycle_count; | ||
7638 | + __le32 chan_tx_pwr_range; | ||
7639 | + __le32 chan_tx_pwr_tp; | ||
7640 | + __le32 rx_frame_count; | ||
7641 | + __le32 my_bss_rx_cycle_count; | ||
7642 | + __le32 rx_11b_mode_data_duration; | ||
7643 | + __le32 tx_frame_cnt; | ||
7644 | + __le32 mac_clk_mhz; | ||
7645 | +} __packed; | ||
7646 | + | ||
7647 | struct wmi_tlv_mgmt_tx_compl_ev { | ||
7648 | __le32 desc_id; | ||
7649 | __le32 status; | ||
7650 | diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h | ||
7651 | index 838768c98adc..e80dbe7e8f4c 100644 | ||
7652 | --- a/drivers/net/wireless/ath/ath10k/wmi.h | ||
7653 | +++ b/drivers/net/wireless/ath/ath10k/wmi.h | ||
7654 | @@ -6533,14 +6533,6 @@ struct wmi_chan_info_event { | ||
7655 | __le32 noise_floor; | ||
7656 | __le32 rx_clear_count; | ||
7657 | __le32 cycle_count; | ||
7658 | - __le32 chan_tx_pwr_range; | ||
7659 | - __le32 chan_tx_pwr_tp; | ||
7660 | - __le32 rx_frame_count; | ||
7661 | - __le32 my_bss_rx_cycle_count; | ||
7662 | - __le32 rx_11b_mode_data_duration; | ||
7663 | - __le32 tx_frame_cnt; | ||
7664 | - __le32 mac_clk_mhz; | ||
7665 | - | ||
7666 | } __packed; | ||
7667 | |||
7668 | struct wmi_10_4_chan_info_event { | ||
7669 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | ||
7670 | index 5de54d1559dd..8b0b464a1f21 100644 | ||
7671 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | ||
7672 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | ||
7673 | @@ -887,11 +887,13 @@ static bool iwl_mvm_sar_geo_support(struct iwl_mvm *mvm) | ||
7674 | * firmware versions. Unfortunately, we don't have a TLV API | ||
7675 | * flag to rely on, so rely on the major version which is in | ||
7676 | * the first byte of ucode_ver. This was implemented | ||
7677 | - * initially on version 38 and then backported to 36, 29 and | ||
7678 | - * 17. | ||
7679 | + * initially on version 38 and then backported to29 and 17. | ||
7680 | + * The intention was to have it in 36 as well, but not all | ||
7681 | + * 8000 family got this feature enabled. The 8000 family is | ||
7682 | + * the only one using version 36, so skip this version | ||
7683 | + * entirely. | ||
7684 | */ | ||
7685 | return IWL_UCODE_SERIAL(mvm->fw->ucode_ver) >= 38 || | ||
7686 | - IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 36 || | ||
7687 | IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 29 || | ||
7688 | IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 17; | ||
7689 | } | ||
7690 | diff --git a/drivers/net/wireless/marvell/libertas/if_usb.c b/drivers/net/wireless/marvell/libertas/if_usb.c | ||
7691 | index afac2481909b..20436a289d5c 100644 | ||
7692 | --- a/drivers/net/wireless/marvell/libertas/if_usb.c | ||
7693 | +++ b/drivers/net/wireless/marvell/libertas/if_usb.c | ||
7694 | @@ -50,7 +50,8 @@ static const struct lbs_fw_table fw_table[] = { | ||
7695 | { MODEL_8388, "libertas/usb8388_v5.bin", NULL }, | ||
7696 | { MODEL_8388, "libertas/usb8388.bin", NULL }, | ||
7697 | { MODEL_8388, "usb8388.bin", NULL }, | ||
7698 | - { MODEL_8682, "libertas/usb8682.bin", NULL } | ||
7699 | + { MODEL_8682, "libertas/usb8682.bin", NULL }, | ||
7700 | + { 0, NULL, NULL } | ||
7701 | }; | ||
7702 | |||
7703 | static const struct usb_device_id if_usb_table[] = { | ||
7704 | diff --git a/drivers/net/wireless/mediatek/mt76/mmio.c b/drivers/net/wireless/mediatek/mt76/mmio.c | ||
7705 | index 38368d19aa6f..83c96a47914f 100644 | ||
7706 | --- a/drivers/net/wireless/mediatek/mt76/mmio.c | ||
7707 | +++ b/drivers/net/wireless/mediatek/mt76/mmio.c | ||
7708 | @@ -43,7 +43,7 @@ static u32 mt76_mmio_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val) | ||
7709 | static void mt76_mmio_copy(struct mt76_dev *dev, u32 offset, const void *data, | ||
7710 | int len) | ||
7711 | { | ||
7712 | - __iowrite32_copy(dev->mmio.regs + offset, data, len >> 2); | ||
7713 | + __iowrite32_copy(dev->mmio.regs + offset, data, DIV_ROUND_UP(len, 4)); | ||
7714 | } | ||
7715 | |||
7716 | static int mt76_mmio_wr_rp(struct mt76_dev *dev, u32 base, | ||
7717 | diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | ||
7718 | index cdad2c8dc297..b941fa4a1bcd 100644 | ||
7719 | --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | ||
7720 | +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | ||
7721 | @@ -257,9 +257,8 @@ static int mt7615_driver_own(struct mt7615_dev *dev) | ||
7722 | |||
7723 | static int mt7615_load_patch(struct mt7615_dev *dev) | ||
7724 | { | ||
7725 | - const struct firmware *fw; | ||
7726 | const struct mt7615_patch_hdr *hdr; | ||
7727 | - const char *firmware = MT7615_ROM_PATCH; | ||
7728 | + const struct firmware *fw = NULL; | ||
7729 | int len, ret, sem; | ||
7730 | |||
7731 | sem = mt7615_mcu_patch_sem_ctrl(dev, 1); | ||
7732 | @@ -273,9 +272,9 @@ static int mt7615_load_patch(struct mt7615_dev *dev) | ||
7733 | return -EAGAIN; | ||
7734 | } | ||
7735 | |||
7736 | - ret = request_firmware(&fw, firmware, dev->mt76.dev); | ||
7737 | + ret = request_firmware(&fw, MT7615_ROM_PATCH, dev->mt76.dev); | ||
7738 | if (ret) | ||
7739 | - return ret; | ||
7740 | + goto out; | ||
7741 | |||
7742 | if (!fw || !fw->data || fw->size < sizeof(*hdr)) { | ||
7743 | dev_err(dev->mt76.dev, "Invalid firmware\n"); | ||
7744 | @@ -339,14 +338,12 @@ static u32 gen_dl_mode(u8 feature_set, bool is_cr4) | ||
7745 | |||
7746 | static int mt7615_load_ram(struct mt7615_dev *dev) | ||
7747 | { | ||
7748 | - const struct firmware *fw; | ||
7749 | const struct mt7615_fw_trailer *hdr; | ||
7750 | - const char *n9_firmware = MT7615_FIRMWARE_N9; | ||
7751 | - const char *cr4_firmware = MT7615_FIRMWARE_CR4; | ||
7752 | u32 n9_ilm_addr, offset; | ||
7753 | int i, ret; | ||
7754 | + const struct firmware *fw; | ||
7755 | |||
7756 | - ret = request_firmware(&fw, n9_firmware, dev->mt76.dev); | ||
7757 | + ret = request_firmware(&fw, MT7615_FIRMWARE_N9, dev->mt76.dev); | ||
7758 | if (ret) | ||
7759 | return ret; | ||
7760 | |||
7761 | @@ -394,7 +391,7 @@ static int mt7615_load_ram(struct mt7615_dev *dev) | ||
7762 | |||
7763 | release_firmware(fw); | ||
7764 | |||
7765 | - ret = request_firmware(&fw, cr4_firmware, dev->mt76.dev); | ||
7766 | + ret = request_firmware(&fw, MT7615_FIRMWARE_CR4, dev->mt76.dev); | ||
7767 | if (ret) | ||
7768 | return ret; | ||
7769 | |||
7770 | diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h | ||
7771 | index f02ffcffe637..f83615dbe1c5 100644 | ||
7772 | --- a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h | ||
7773 | +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h | ||
7774 | @@ -25,9 +25,9 @@ | ||
7775 | #define MT7615_RX_RING_SIZE 1024 | ||
7776 | #define MT7615_RX_MCU_RING_SIZE 512 | ||
7777 | |||
7778 | -#define MT7615_FIRMWARE_CR4 "mt7615_cr4.bin" | ||
7779 | -#define MT7615_FIRMWARE_N9 "mt7615_n9.bin" | ||
7780 | -#define MT7615_ROM_PATCH "mt7615_rom_patch.bin" | ||
7781 | +#define MT7615_FIRMWARE_CR4 "mediatek/mt7615_cr4.bin" | ||
7782 | +#define MT7615_FIRMWARE_N9 "mediatek/mt7615_n9.bin" | ||
7783 | +#define MT7615_ROM_PATCH "mediatek/mt7615_rom_patch.bin" | ||
7784 | |||
7785 | #define MT7615_EEPROM_SIZE 1024 | ||
7786 | #define MT7615_TOKEN_SIZE 4096 | ||
7787 | diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c | ||
7788 | index fb87ce7fbdf6..185eea83aada 100644 | ||
7789 | --- a/drivers/net/wireless/mediatek/mt76/usb.c | ||
7790 | +++ b/drivers/net/wireless/mediatek/mt76/usb.c | ||
7791 | @@ -164,7 +164,7 @@ static void mt76u_copy(struct mt76_dev *dev, u32 offset, | ||
7792 | int i, ret; | ||
7793 | |||
7794 | mutex_lock(&usb->usb_ctrl_mtx); | ||
7795 | - for (i = 0; i < (len / 4); i++) { | ||
7796 | + for (i = 0; i < DIV_ROUND_UP(len, 4); i++) { | ||
7797 | put_unaligned_le32(val[i], usb->data); | ||
7798 | ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE, | ||
7799 | USB_DIR_OUT | USB_TYPE_VENDOR, | ||
7800 | diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c | ||
7801 | index 353871c27779..23dd06afef3d 100644 | ||
7802 | --- a/drivers/net/wireless/realtek/rtw88/pci.c | ||
7803 | +++ b/drivers/net/wireless/realtek/rtw88/pci.c | ||
7804 | @@ -206,6 +206,23 @@ static int rtw_pci_reset_rx_desc(struct rtw_dev *rtwdev, struct sk_buff *skb, | ||
7805 | return 0; | ||
7806 | } | ||
7807 | |||
7808 | +static void rtw_pci_sync_rx_desc_device(struct rtw_dev *rtwdev, dma_addr_t dma, | ||
7809 | + struct rtw_pci_rx_ring *rx_ring, | ||
7810 | + u32 idx, u32 desc_sz) | ||
7811 | +{ | ||
7812 | + struct device *dev = rtwdev->dev; | ||
7813 | + struct rtw_pci_rx_buffer_desc *buf_desc; | ||
7814 | + int buf_sz = RTK_PCI_RX_BUF_SIZE; | ||
7815 | + | ||
7816 | + dma_sync_single_for_device(dev, dma, buf_sz, DMA_FROM_DEVICE); | ||
7817 | + | ||
7818 | + buf_desc = (struct rtw_pci_rx_buffer_desc *)(rx_ring->r.head + | ||
7819 | + idx * desc_sz); | ||
7820 | + memset(buf_desc, 0, sizeof(*buf_desc)); | ||
7821 | + buf_desc->buf_size = cpu_to_le16(RTK_PCI_RX_BUF_SIZE); | ||
7822 | + buf_desc->dma = cpu_to_le32(dma); | ||
7823 | +} | ||
7824 | + | ||
7825 | static int rtw_pci_init_rx_ring(struct rtw_dev *rtwdev, | ||
7826 | struct rtw_pci_rx_ring *rx_ring, | ||
7827 | u8 desc_size, u32 len) | ||
7828 | @@ -765,6 +782,7 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci, | ||
7829 | u32 pkt_offset; | ||
7830 | u32 pkt_desc_sz = chip->rx_pkt_desc_sz; | ||
7831 | u32 buf_desc_sz = chip->rx_buf_desc_sz; | ||
7832 | + u32 new_len; | ||
7833 | u8 *rx_desc; | ||
7834 | dma_addr_t dma; | ||
7835 | |||
7836 | @@ -783,8 +801,8 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci, | ||
7837 | rtw_pci_dma_check(rtwdev, ring, cur_rp); | ||
7838 | skb = ring->buf[cur_rp]; | ||
7839 | dma = *((dma_addr_t *)skb->cb); | ||
7840 | - pci_unmap_single(rtwpci->pdev, dma, RTK_PCI_RX_BUF_SIZE, | ||
7841 | - PCI_DMA_FROMDEVICE); | ||
7842 | + dma_sync_single_for_cpu(rtwdev->dev, dma, RTK_PCI_RX_BUF_SIZE, | ||
7843 | + DMA_FROM_DEVICE); | ||
7844 | rx_desc = skb->data; | ||
7845 | chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status); | ||
7846 | |||
7847 | @@ -792,40 +810,35 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci, | ||
7848 | pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz + | ||
7849 | pkt_stat.shift; | ||
7850 | |||
7851 | - if (pkt_stat.is_c2h) { | ||
7852 | - /* keep rx_desc, halmac needs it */ | ||
7853 | - skb_put(skb, pkt_stat.pkt_len + pkt_offset); | ||
7854 | + /* allocate a new skb for this frame, | ||
7855 | + * discard the frame if none available | ||
7856 | + */ | ||
7857 | + new_len = pkt_stat.pkt_len + pkt_offset; | ||
7858 | + new = dev_alloc_skb(new_len); | ||
7859 | + if (WARN_ONCE(!new, "rx routine starvation\n")) | ||
7860 | + goto next_rp; | ||
7861 | |||
7862 | - /* pass offset for further operation */ | ||
7863 | - *((u32 *)skb->cb) = pkt_offset; | ||
7864 | - skb_queue_tail(&rtwdev->c2h_queue, skb); | ||
7865 | + /* put the DMA data including rx_desc from phy to new skb */ | ||
7866 | + skb_put_data(new, skb->data, new_len); | ||
7867 | + | ||
7868 | + if (pkt_stat.is_c2h) { | ||
7869 | + /* pass rx_desc & offset for further operation */ | ||
7870 | + *((u32 *)new->cb) = pkt_offset; | ||
7871 | + skb_queue_tail(&rtwdev->c2h_queue, new); | ||
7872 | ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work); | ||
7873 | } else { | ||
7874 | - /* remove rx_desc, maybe use skb_pull? */ | ||
7875 | - skb_put(skb, pkt_stat.pkt_len); | ||
7876 | - skb_reserve(skb, pkt_offset); | ||
7877 | - | ||
7878 | - /* alloc a smaller skb to mac80211 */ | ||
7879 | - new = dev_alloc_skb(pkt_stat.pkt_len); | ||
7880 | - if (!new) { | ||
7881 | - new = skb; | ||
7882 | - } else { | ||
7883 | - skb_put_data(new, skb->data, skb->len); | ||
7884 | - dev_kfree_skb_any(skb); | ||
7885 | - } | ||
7886 | - /* TODO: merge into rx.c */ | ||
7887 | - rtw_rx_stats(rtwdev, pkt_stat.vif, skb); | ||
7888 | + /* remove rx_desc */ | ||
7889 | + skb_pull(new, pkt_offset); | ||
7890 | + | ||
7891 | + rtw_rx_stats(rtwdev, pkt_stat.vif, new); | ||
7892 | memcpy(new->cb, &rx_status, sizeof(rx_status)); | ||
7893 | ieee80211_rx_irqsafe(rtwdev->hw, new); | ||
7894 | } | ||
7895 | |||
7896 | - /* skb delivered to mac80211, alloc a new one in rx ring */ | ||
7897 | - new = dev_alloc_skb(RTK_PCI_RX_BUF_SIZE); | ||
7898 | - if (WARN(!new, "rx routine starvation\n")) | ||
7899 | - return; | ||
7900 | - | ||
7901 | - ring->buf[cur_rp] = new; | ||
7902 | - rtw_pci_reset_rx_desc(rtwdev, new, ring, cur_rp, buf_desc_sz); | ||
7903 | +next_rp: | ||
7904 | + /* new skb delivered to mac80211, re-enable original skb DMA */ | ||
7905 | + rtw_pci_sync_rx_desc_device(rtwdev, dma, ring, cur_rp, | ||
7906 | + buf_desc_sz); | ||
7907 | |||
7908 | /* host read next element in ring */ | ||
7909 | if (++cur_rp >= ring->r.len) | ||
7910 | diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_mac.c b/drivers/net/wireless/zydas/zd1211rw/zd_mac.c | ||
7911 | index da7e63fca9f5..a9999d10ae81 100644 | ||
7912 | --- a/drivers/net/wireless/zydas/zd1211rw/zd_mac.c | ||
7913 | +++ b/drivers/net/wireless/zydas/zd1211rw/zd_mac.c | ||
7914 | @@ -223,7 +223,6 @@ void zd_mac_clear(struct zd_mac *mac) | ||
7915 | { | ||
7916 | flush_workqueue(zd_workqueue); | ||
7917 | zd_chip_clear(&mac->chip); | ||
7918 | - lockdep_assert_held(&mac->lock); | ||
7919 | ZD_MEMCLEAR(mac, sizeof(struct zd_mac)); | ||
7920 | } | ||
7921 | |||
7922 | diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c | ||
7923 | index af831d3d15d0..30de7efef003 100644 | ||
7924 | --- a/drivers/nvme/host/multipath.c | ||
7925 | +++ b/drivers/nvme/host/multipath.c | ||
7926 | @@ -509,14 +509,16 @@ static int nvme_update_ana_state(struct nvme_ctrl *ctrl, | ||
7927 | |||
7928 | down_write(&ctrl->namespaces_rwsem); | ||
7929 | list_for_each_entry(ns, &ctrl->namespaces, list) { | ||
7930 | - if (ns->head->ns_id != le32_to_cpu(desc->nsids[n])) | ||
7931 | + unsigned nsid = le32_to_cpu(desc->nsids[n]); | ||
7932 | + | ||
7933 | + if (ns->head->ns_id < nsid) | ||
7934 | continue; | ||
7935 | - nvme_update_ns_ana_state(desc, ns); | ||
7936 | + if (ns->head->ns_id == nsid) | ||
7937 | + nvme_update_ns_ana_state(desc, ns); | ||
7938 | if (++n == nr_nsids) | ||
7939 | break; | ||
7940 | } | ||
7941 | up_write(&ctrl->namespaces_rwsem); | ||
7942 | - WARN_ON_ONCE(n < nr_nsids); | ||
7943 | return 0; | ||
7944 | } | ||
7945 | |||
7946 | diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c | ||
7947 | index 4dc12ea52f23..51800a9ce9a9 100644 | ||
7948 | --- a/drivers/nvme/target/admin-cmd.c | ||
7949 | +++ b/drivers/nvme/target/admin-cmd.c | ||
7950 | @@ -81,9 +81,11 @@ static u16 nvmet_get_smart_log_nsid(struct nvmet_req *req, | ||
7951 | goto out; | ||
7952 | |||
7953 | host_reads = part_stat_read(ns->bdev->bd_part, ios[READ]); | ||
7954 | - data_units_read = part_stat_read(ns->bdev->bd_part, sectors[READ]); | ||
7955 | + data_units_read = DIV_ROUND_UP(part_stat_read(ns->bdev->bd_part, | ||
7956 | + sectors[READ]), 1000); | ||
7957 | host_writes = part_stat_read(ns->bdev->bd_part, ios[WRITE]); | ||
7958 | - data_units_written = part_stat_read(ns->bdev->bd_part, sectors[WRITE]); | ||
7959 | + data_units_written = DIV_ROUND_UP(part_stat_read(ns->bdev->bd_part, | ||
7960 | + sectors[WRITE]), 1000); | ||
7961 | |||
7962 | put_unaligned_le64(host_reads, &slog->host_reads[0]); | ||
7963 | put_unaligned_le64(data_units_read, &slog->data_units_read[0]); | ||
7964 | @@ -111,11 +113,11 @@ static u16 nvmet_get_smart_log_all(struct nvmet_req *req, | ||
7965 | if (!ns->bdev) | ||
7966 | continue; | ||
7967 | host_reads += part_stat_read(ns->bdev->bd_part, ios[READ]); | ||
7968 | - data_units_read += | ||
7969 | - part_stat_read(ns->bdev->bd_part, sectors[READ]); | ||
7970 | + data_units_read += DIV_ROUND_UP( | ||
7971 | + part_stat_read(ns->bdev->bd_part, sectors[READ]), 1000); | ||
7972 | host_writes += part_stat_read(ns->bdev->bd_part, ios[WRITE]); | ||
7973 | - data_units_written += | ||
7974 | - part_stat_read(ns->bdev->bd_part, sectors[WRITE]); | ||
7975 | + data_units_written += DIV_ROUND_UP( | ||
7976 | + part_stat_read(ns->bdev->bd_part, sectors[WRITE]), 1000); | ||
7977 | |||
7978 | } | ||
7979 | rcu_read_unlock(); | ||
7980 | diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c | ||
7981 | index 3c730103e637..14be463e25b0 100644 | ||
7982 | --- a/drivers/parisc/dino.c | ||
7983 | +++ b/drivers/parisc/dino.c | ||
7984 | @@ -156,6 +156,15 @@ static inline struct dino_device *DINO_DEV(struct pci_hba_data *hba) | ||
7985 | return container_of(hba, struct dino_device, hba); | ||
7986 | } | ||
7987 | |||
7988 | +/* Check if PCI device is behind a Card-mode Dino. */ | ||
7989 | +static int pci_dev_is_behind_card_dino(struct pci_dev *dev) | ||
7990 | +{ | ||
7991 | + struct dino_device *dino_dev; | ||
7992 | + | ||
7993 | + dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge)); | ||
7994 | + return is_card_dino(&dino_dev->hba.dev->id); | ||
7995 | +} | ||
7996 | + | ||
7997 | /* | ||
7998 | * Dino Configuration Space Accessor Functions | ||
7999 | */ | ||
8000 | @@ -437,6 +446,21 @@ static void quirk_cirrus_cardbus(struct pci_dev *dev) | ||
8001 | } | ||
8002 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus ); | ||
8003 | |||
8004 | +#ifdef CONFIG_TULIP | ||
8005 | +static void pci_fixup_tulip(struct pci_dev *dev) | ||
8006 | +{ | ||
8007 | + if (!pci_dev_is_behind_card_dino(dev)) | ||
8008 | + return; | ||
8009 | + if (!(pci_resource_flags(dev, 1) & IORESOURCE_MEM)) | ||
8010 | + return; | ||
8011 | + pr_warn("%s: HP HSC-PCI Cards with card-mode Dino not yet supported.\n", | ||
8012 | + pci_name(dev)); | ||
8013 | + /* Disable this card by zeroing the PCI resources */ | ||
8014 | + memset(&dev->resource[0], 0, sizeof(dev->resource[0])); | ||
8015 | + memset(&dev->resource[1], 0, sizeof(dev->resource[1])); | ||
8016 | +} | ||
8017 | +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_DEC, PCI_ANY_ID, pci_fixup_tulip); | ||
8018 | +#endif /* CONFIG_TULIP */ | ||
8019 | |||
8020 | static void __init | ||
8021 | dino_bios_init(void) | ||
8022 | diff --git a/drivers/platform/chrome/cros_ec_rpmsg.c b/drivers/platform/chrome/cros_ec_rpmsg.c | ||
8023 | index 5d3fb2abad1d..bec19d4814ab 100644 | ||
8024 | --- a/drivers/platform/chrome/cros_ec_rpmsg.c | ||
8025 | +++ b/drivers/platform/chrome/cros_ec_rpmsg.c | ||
8026 | @@ -41,6 +41,7 @@ struct cros_ec_rpmsg { | ||
8027 | struct rpmsg_device *rpdev; | ||
8028 | struct completion xfer_ack; | ||
8029 | struct work_struct host_event_work; | ||
8030 | + struct rpmsg_endpoint *ept; | ||
8031 | }; | ||
8032 | |||
8033 | /** | ||
8034 | @@ -72,7 +73,6 @@ static int cros_ec_pkt_xfer_rpmsg(struct cros_ec_device *ec_dev, | ||
8035 | struct cros_ec_command *ec_msg) | ||
8036 | { | ||
8037 | struct cros_ec_rpmsg *ec_rpmsg = ec_dev->priv; | ||
8038 | - struct rpmsg_device *rpdev = ec_rpmsg->rpdev; | ||
8039 | struct ec_host_response *response; | ||
8040 | unsigned long timeout; | ||
8041 | int len; | ||
8042 | @@ -85,7 +85,7 @@ static int cros_ec_pkt_xfer_rpmsg(struct cros_ec_device *ec_dev, | ||
8043 | dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); | ||
8044 | |||
8045 | reinit_completion(&ec_rpmsg->xfer_ack); | ||
8046 | - ret = rpmsg_send(rpdev->ept, ec_dev->dout, len); | ||
8047 | + ret = rpmsg_send(ec_rpmsg->ept, ec_dev->dout, len); | ||
8048 | if (ret) { | ||
8049 | dev_err(ec_dev->dev, "rpmsg send failed\n"); | ||
8050 | return ret; | ||
8051 | @@ -196,11 +196,24 @@ static int cros_ec_rpmsg_callback(struct rpmsg_device *rpdev, void *data, | ||
8052 | return 0; | ||
8053 | } | ||
8054 | |||
8055 | +static struct rpmsg_endpoint * | ||
8056 | +cros_ec_rpmsg_create_ept(struct rpmsg_device *rpdev) | ||
8057 | +{ | ||
8058 | + struct rpmsg_channel_info chinfo = {}; | ||
8059 | + | ||
8060 | + strscpy(chinfo.name, rpdev->id.name, RPMSG_NAME_SIZE); | ||
8061 | + chinfo.src = rpdev->src; | ||
8062 | + chinfo.dst = RPMSG_ADDR_ANY; | ||
8063 | + | ||
8064 | + return rpmsg_create_ept(rpdev, cros_ec_rpmsg_callback, NULL, chinfo); | ||
8065 | +} | ||
8066 | + | ||
8067 | static int cros_ec_rpmsg_probe(struct rpmsg_device *rpdev) | ||
8068 | { | ||
8069 | struct device *dev = &rpdev->dev; | ||
8070 | struct cros_ec_rpmsg *ec_rpmsg; | ||
8071 | struct cros_ec_device *ec_dev; | ||
8072 | + int ret; | ||
8073 | |||
8074 | ec_dev = devm_kzalloc(dev, sizeof(*ec_dev), GFP_KERNEL); | ||
8075 | if (!ec_dev) | ||
8076 | @@ -225,7 +238,18 @@ static int cros_ec_rpmsg_probe(struct rpmsg_device *rpdev) | ||
8077 | INIT_WORK(&ec_rpmsg->host_event_work, | ||
8078 | cros_ec_rpmsg_host_event_function); | ||
8079 | |||
8080 | - return cros_ec_register(ec_dev); | ||
8081 | + ec_rpmsg->ept = cros_ec_rpmsg_create_ept(rpdev); | ||
8082 | + if (!ec_rpmsg->ept) | ||
8083 | + return -ENOMEM; | ||
8084 | + | ||
8085 | + ret = cros_ec_register(ec_dev); | ||
8086 | + if (ret < 0) { | ||
8087 | + rpmsg_destroy_ept(ec_rpmsg->ept); | ||
8088 | + cancel_work_sync(&ec_rpmsg->host_event_work); | ||
8089 | + return ret; | ||
8090 | + } | ||
8091 | + | ||
8092 | + return 0; | ||
8093 | } | ||
8094 | |||
8095 | static void cros_ec_rpmsg_remove(struct rpmsg_device *rpdev) | ||
8096 | @@ -233,6 +257,7 @@ static void cros_ec_rpmsg_remove(struct rpmsg_device *rpdev) | ||
8097 | struct cros_ec_device *ec_dev = dev_get_drvdata(&rpdev->dev); | ||
8098 | struct cros_ec_rpmsg *ec_rpmsg = ec_dev->priv; | ||
8099 | |||
8100 | + rpmsg_destroy_ept(ec_rpmsg->ept); | ||
8101 | cancel_work_sync(&ec_rpmsg->host_event_work); | ||
8102 | } | ||
8103 | |||
8104 | @@ -249,7 +274,6 @@ static struct rpmsg_driver cros_ec_driver_rpmsg = { | ||
8105 | }, | ||
8106 | .probe = cros_ec_rpmsg_probe, | ||
8107 | .remove = cros_ec_rpmsg_remove, | ||
8108 | - .callback = cros_ec_rpmsg_callback, | ||
8109 | }; | ||
8110 | |||
8111 | module_rpmsg_driver(cros_ec_driver_rpmsg); | ||
8112 | diff --git a/drivers/platform/x86/intel_int0002_vgpio.c b/drivers/platform/x86/intel_int0002_vgpio.c | ||
8113 | index d9542c661ddc..9ea1a2a19f86 100644 | ||
8114 | --- a/drivers/platform/x86/intel_int0002_vgpio.c | ||
8115 | +++ b/drivers/platform/x86/intel_int0002_vgpio.c | ||
8116 | @@ -144,6 +144,7 @@ static struct irq_chip int0002_cht_irqchip = { | ||
8117 | * No set_wake, on CHT the IRQ is typically shared with the ACPI SCI | ||
8118 | * and we don't want to mess with the ACPI SCI irq settings. | ||
8119 | */ | ||
8120 | + .flags = IRQCHIP_SKIP_SET_WAKE, | ||
8121 | }; | ||
8122 | |||
8123 | static const struct x86_cpu_id int0002_cpu_ids[] = { | ||
8124 | diff --git a/drivers/platform/x86/intel_pmc_core.c b/drivers/platform/x86/intel_pmc_core.c | ||
8125 | index c510d0d72475..3b6b8dcc4767 100644 | ||
8126 | --- a/drivers/platform/x86/intel_pmc_core.c | ||
8127 | +++ b/drivers/platform/x86/intel_pmc_core.c | ||
8128 | @@ -878,10 +878,14 @@ static int pmc_core_probe(struct platform_device *pdev) | ||
8129 | if (pmcdev->map == &spt_reg_map && !pci_dev_present(pmc_pci_ids)) | ||
8130 | pmcdev->map = &cnp_reg_map; | ||
8131 | |||
8132 | - if (lpit_read_residency_count_address(&slp_s0_addr)) | ||
8133 | + if (lpit_read_residency_count_address(&slp_s0_addr)) { | ||
8134 | pmcdev->base_addr = PMC_BASE_ADDR_DEFAULT; | ||
8135 | - else | ||
8136 | + | ||
8137 | + if (page_is_ram(PHYS_PFN(pmcdev->base_addr))) | ||
8138 | + return -ENODEV; | ||
8139 | + } else { | ||
8140 | pmcdev->base_addr = slp_s0_addr - pmcdev->map->slp_s0_offset; | ||
8141 | + } | ||
8142 | |||
8143 | pmcdev->regbase = ioremap(pmcdev->base_addr, | ||
8144 | pmcdev->map->regmap_length); | ||
8145 | diff --git a/drivers/platform/x86/intel_pmc_core_pltdrv.c b/drivers/platform/x86/intel_pmc_core_pltdrv.c | ||
8146 | index a8754a6db1b8..186540014c48 100644 | ||
8147 | --- a/drivers/platform/x86/intel_pmc_core_pltdrv.c | ||
8148 | +++ b/drivers/platform/x86/intel_pmc_core_pltdrv.c | ||
8149 | @@ -18,8 +18,16 @@ | ||
8150 | #include <asm/cpu_device_id.h> | ||
8151 | #include <asm/intel-family.h> | ||
8152 | |||
8153 | +static void intel_pmc_core_release(struct device *dev) | ||
8154 | +{ | ||
8155 | + /* Nothing to do. */ | ||
8156 | +} | ||
8157 | + | ||
8158 | static struct platform_device pmc_core_device = { | ||
8159 | .name = "intel_pmc_core", | ||
8160 | + .dev = { | ||
8161 | + .release = intel_pmc_core_release, | ||
8162 | + }, | ||
8163 | }; | ||
8164 | |||
8165 | /* | ||
8166 | diff --git a/drivers/ras/Makefile b/drivers/ras/Makefile | ||
8167 | index ef6777e14d3d..6f0404f50107 100644 | ||
8168 | --- a/drivers/ras/Makefile | ||
8169 | +++ b/drivers/ras/Makefile | ||
8170 | @@ -1,3 +1,4 @@ | ||
8171 | # SPDX-License-Identifier: GPL-2.0-only | ||
8172 | -obj-$(CONFIG_RAS) += ras.o debugfs.o | ||
8173 | +obj-$(CONFIG_RAS) += ras.o | ||
8174 | +obj-$(CONFIG_DEBUG_FS) += debugfs.o | ||
8175 | obj-$(CONFIG_RAS_CEC) += cec.o | ||
8176 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
8177 | index e0c0cf462004..1b35b8311650 100644 | ||
8178 | --- a/drivers/regulator/core.c | ||
8179 | +++ b/drivers/regulator/core.c | ||
8180 | @@ -5640,7 +5640,7 @@ static int __init regulator_init(void) | ||
8181 | /* init early to allow our consumers to complete system booting */ | ||
8182 | core_initcall(regulator_init); | ||
8183 | |||
8184 | -static int __init regulator_late_cleanup(struct device *dev, void *data) | ||
8185 | +static int regulator_late_cleanup(struct device *dev, void *data) | ||
8186 | { | ||
8187 | struct regulator_dev *rdev = dev_to_rdev(dev); | ||
8188 | const struct regulator_ops *ops = rdev->desc->ops; | ||
8189 | @@ -5689,17 +5689,8 @@ unlock: | ||
8190 | return 0; | ||
8191 | } | ||
8192 | |||
8193 | -static int __init regulator_init_complete(void) | ||
8194 | +static void regulator_init_complete_work_function(struct work_struct *work) | ||
8195 | { | ||
8196 | - /* | ||
8197 | - * Since DT doesn't provide an idiomatic mechanism for | ||
8198 | - * enabling full constraints and since it's much more natural | ||
8199 | - * with DT to provide them just assume that a DT enabled | ||
8200 | - * system has full constraints. | ||
8201 | - */ | ||
8202 | - if (of_have_populated_dt()) | ||
8203 | - has_full_constraints = true; | ||
8204 | - | ||
8205 | /* | ||
8206 | * Regulators may had failed to resolve their input supplies | ||
8207 | * when were registered, either because the input supply was | ||
8208 | @@ -5717,6 +5708,35 @@ static int __init regulator_init_complete(void) | ||
8209 | */ | ||
8210 | class_for_each_device(®ulator_class, NULL, NULL, | ||
8211 | regulator_late_cleanup); | ||
8212 | +} | ||
8213 | + | ||
8214 | +static DECLARE_DELAYED_WORK(regulator_init_complete_work, | ||
8215 | + regulator_init_complete_work_function); | ||
8216 | + | ||
8217 | +static int __init regulator_init_complete(void) | ||
8218 | +{ | ||
8219 | + /* | ||
8220 | + * Since DT doesn't provide an idiomatic mechanism for | ||
8221 | + * enabling full constraints and since it's much more natural | ||
8222 | + * with DT to provide them just assume that a DT enabled | ||
8223 | + * system has full constraints. | ||
8224 | + */ | ||
8225 | + if (of_have_populated_dt()) | ||
8226 | + has_full_constraints = true; | ||
8227 | + | ||
8228 | + /* | ||
8229 | + * We punt completion for an arbitrary amount of time since | ||
8230 | + * systems like distros will load many drivers from userspace | ||
8231 | + * so consumers might not always be ready yet, this is | ||
8232 | + * particularly an issue with laptops where this might bounce | ||
8233 | + * the display off then on. Ideally we'd get a notification | ||
8234 | + * from userspace when this happens but we don't so just wait | ||
8235 | + * a bit and hope we waited long enough. It'd be better if | ||
8236 | + * we'd only do this on systems that need it, and a kernel | ||
8237 | + * command line option might be useful. | ||
8238 | + */ | ||
8239 | + schedule_delayed_work(®ulator_init_complete_work, | ||
8240 | + msecs_to_jiffies(30000)); | ||
8241 | |||
8242 | return 0; | ||
8243 | } | ||
8244 | diff --git a/drivers/regulator/lm363x-regulator.c b/drivers/regulator/lm363x-regulator.c | ||
8245 | index 5647e2f97ff8..4b9f618b07e9 100644 | ||
8246 | --- a/drivers/regulator/lm363x-regulator.c | ||
8247 | +++ b/drivers/regulator/lm363x-regulator.c | ||
8248 | @@ -30,13 +30,13 @@ | ||
8249 | |||
8250 | /* LM3632 */ | ||
8251 | #define LM3632_BOOST_VSEL_MAX 0x26 | ||
8252 | -#define LM3632_LDO_VSEL_MAX 0x29 | ||
8253 | +#define LM3632_LDO_VSEL_MAX 0x28 | ||
8254 | #define LM3632_VBOOST_MIN 4500000 | ||
8255 | #define LM3632_VLDO_MIN 4000000 | ||
8256 | |||
8257 | /* LM36274 */ | ||
8258 | #define LM36274_BOOST_VSEL_MAX 0x3f | ||
8259 | -#define LM36274_LDO_VSEL_MAX 0x34 | ||
8260 | +#define LM36274_LDO_VSEL_MAX 0x32 | ||
8261 | #define LM36274_VOLTAGE_MIN 4000000 | ||
8262 | |||
8263 | /* Common */ | ||
8264 | @@ -226,7 +226,7 @@ static const struct regulator_desc lm363x_regulator_desc[] = { | ||
8265 | .of_match = "vboost", | ||
8266 | .id = LM36274_BOOST, | ||
8267 | .ops = &lm363x_boost_voltage_table_ops, | ||
8268 | - .n_voltages = LM36274_BOOST_VSEL_MAX, | ||
8269 | + .n_voltages = LM36274_BOOST_VSEL_MAX + 1, | ||
8270 | .min_uV = LM36274_VOLTAGE_MIN, | ||
8271 | .uV_step = LM363X_STEP_50mV, | ||
8272 | .type = REGULATOR_VOLTAGE, | ||
8273 | @@ -239,7 +239,7 @@ static const struct regulator_desc lm363x_regulator_desc[] = { | ||
8274 | .of_match = "vpos", | ||
8275 | .id = LM36274_LDO_POS, | ||
8276 | .ops = &lm363x_regulator_voltage_table_ops, | ||
8277 | - .n_voltages = LM36274_LDO_VSEL_MAX, | ||
8278 | + .n_voltages = LM36274_LDO_VSEL_MAX + 1, | ||
8279 | .min_uV = LM36274_VOLTAGE_MIN, | ||
8280 | .uV_step = LM363X_STEP_50mV, | ||
8281 | .type = REGULATOR_VOLTAGE, | ||
8282 | @@ -254,7 +254,7 @@ static const struct regulator_desc lm363x_regulator_desc[] = { | ||
8283 | .of_match = "vneg", | ||
8284 | .id = LM36274_LDO_NEG, | ||
8285 | .ops = &lm363x_regulator_voltage_table_ops, | ||
8286 | - .n_voltages = LM36274_LDO_VSEL_MAX, | ||
8287 | + .n_voltages = LM36274_LDO_VSEL_MAX + 1, | ||
8288 | .min_uV = LM36274_VOLTAGE_MIN, | ||
8289 | .uV_step = LM363X_STEP_50mV, | ||
8290 | .type = REGULATOR_VOLTAGE, | ||
8291 | diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c | ||
8292 | index 65f1fe343c64..5efc959493ec 100644 | ||
8293 | --- a/drivers/scsi/device_handler/scsi_dh_rdac.c | ||
8294 | +++ b/drivers/scsi/device_handler/scsi_dh_rdac.c | ||
8295 | @@ -546,6 +546,8 @@ static void send_mode_select(struct work_struct *work) | ||
8296 | spin_unlock(&ctlr->ms_lock); | ||
8297 | |||
8298 | retry: | ||
8299 | + memset(cdb, 0, sizeof(cdb)); | ||
8300 | + | ||
8301 | data_size = rdac_failover_get(ctlr, &list, cdb); | ||
8302 | |||
8303 | RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, " | ||
8304 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c | ||
8305 | index da83034d4759..afcd9a885884 100644 | ||
8306 | --- a/drivers/scsi/qla2xxx/qla_init.c | ||
8307 | +++ b/drivers/scsi/qla2xxx/qla_init.c | ||
8308 | @@ -289,8 +289,13 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport, | ||
8309 | struct srb_iocb *lio; | ||
8310 | int rval = QLA_FUNCTION_FAILED; | ||
8311 | |||
8312 | - if (!vha->flags.online) | ||
8313 | - goto done; | ||
8314 | + if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) || | ||
8315 | + fcport->loop_id == FC_NO_LOOP_ID) { | ||
8316 | + ql_log(ql_log_warn, vha, 0xffff, | ||
8317 | + "%s: %8phC - not sending command.\n", | ||
8318 | + __func__, fcport->port_name); | ||
8319 | + return rval; | ||
8320 | + } | ||
8321 | |||
8322 | sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); | ||
8323 | if (!sp) | ||
8324 | @@ -1262,8 +1267,13 @@ int qla24xx_async_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt) | ||
8325 | struct port_database_24xx *pd; | ||
8326 | struct qla_hw_data *ha = vha->hw; | ||
8327 | |||
8328 | - if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT)) | ||
8329 | + if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) || | ||
8330 | + fcport->loop_id == FC_NO_LOOP_ID) { | ||
8331 | + ql_log(ql_log_warn, vha, 0xffff, | ||
8332 | + "%s: %8phC - not sending command.\n", | ||
8333 | + __func__, fcport->port_name); | ||
8334 | return rval; | ||
8335 | + } | ||
8336 | |||
8337 | fcport->disc_state = DSC_GPDB; | ||
8338 | |||
8339 | @@ -1953,8 +1963,11 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) | ||
8340 | return; | ||
8341 | } | ||
8342 | |||
8343 | - if (fcport->disc_state == DSC_DELETE_PEND) | ||
8344 | + if ((fcport->disc_state == DSC_DELETE_PEND) || | ||
8345 | + (fcport->disc_state == DSC_DELETED)) { | ||
8346 | + set_bit(RELOGIN_NEEDED, &vha->dpc_flags); | ||
8347 | return; | ||
8348 | + } | ||
8349 | |||
8350 | if (ea->sp->gen2 != fcport->login_gen) { | ||
8351 | /* target side must have changed it. */ | ||
8352 | @@ -6698,8 +6711,10 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha) | ||
8353 | } | ||
8354 | |||
8355 | /* Clear all async request states across all VPs. */ | ||
8356 | - list_for_each_entry(fcport, &vha->vp_fcports, list) | ||
8357 | + list_for_each_entry(fcport, &vha->vp_fcports, list) { | ||
8358 | fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT); | ||
8359 | + fcport->scan_state = 0; | ||
8360 | + } | ||
8361 | spin_lock_irqsave(&ha->vport_slock, flags); | ||
8362 | list_for_each_entry(vp, &ha->vp_list, list) { | ||
8363 | atomic_inc(&vp->vref_count); | ||
8364 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c | ||
8365 | index 98e60a34afd9..4fda308c3ef5 100644 | ||
8366 | --- a/drivers/scsi/qla2xxx/qla_os.c | ||
8367 | +++ b/drivers/scsi/qla2xxx/qla_os.c | ||
8368 | @@ -5086,6 +5086,7 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e) | ||
8369 | if (fcport) { | ||
8370 | fcport->id_changed = 1; | ||
8371 | fcport->scan_state = QLA_FCPORT_FOUND; | ||
8372 | + fcport->chip_reset = vha->hw->base_qpair->chip_reset; | ||
8373 | memcpy(fcport->node_name, e->u.new_sess.node_name, WWN_SIZE); | ||
8374 | |||
8375 | if (pla) { | ||
8376 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c | ||
8377 | index 1c1f63be6eed..459c28aa3b94 100644 | ||
8378 | --- a/drivers/scsi/qla2xxx/qla_target.c | ||
8379 | +++ b/drivers/scsi/qla2xxx/qla_target.c | ||
8380 | @@ -1209,7 +1209,6 @@ static void qla24xx_chk_fcp_state(struct fc_port *sess) | ||
8381 | sess->logout_on_delete = 0; | ||
8382 | sess->logo_ack_needed = 0; | ||
8383 | sess->fw_login_state = DSC_LS_PORT_UNAVAIL; | ||
8384 | - sess->scan_state = 0; | ||
8385 | } | ||
8386 | } | ||
8387 | |||
8388 | diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c | ||
8389 | index 11e64b50497f..4e88d7e9cf9a 100644 | ||
8390 | --- a/drivers/scsi/scsi_lib.c | ||
8391 | +++ b/drivers/scsi/scsi_lib.c | ||
8392 | @@ -1089,6 +1089,18 @@ static void scsi_initialize_rq(struct request *rq) | ||
8393 | cmd->retries = 0; | ||
8394 | } | ||
8395 | |||
8396 | +/* | ||
8397 | + * Only called when the request isn't completed by SCSI, and not freed by | ||
8398 | + * SCSI | ||
8399 | + */ | ||
8400 | +static void scsi_cleanup_rq(struct request *rq) | ||
8401 | +{ | ||
8402 | + if (rq->rq_flags & RQF_DONTPREP) { | ||
8403 | + scsi_mq_uninit_cmd(blk_mq_rq_to_pdu(rq)); | ||
8404 | + rq->rq_flags &= ~RQF_DONTPREP; | ||
8405 | + } | ||
8406 | +} | ||
8407 | + | ||
8408 | /* Add a command to the list used by the aacraid and dpt_i2o drivers */ | ||
8409 | void scsi_add_cmd_to_list(struct scsi_cmnd *cmd) | ||
8410 | { | ||
8411 | @@ -1821,6 +1833,7 @@ static const struct blk_mq_ops scsi_mq_ops = { | ||
8412 | .init_request = scsi_mq_init_request, | ||
8413 | .exit_request = scsi_mq_exit_request, | ||
8414 | .initialize_rq_fn = scsi_initialize_rq, | ||
8415 | + .cleanup_rq = scsi_cleanup_rq, | ||
8416 | .busy = scsi_mq_lld_busy, | ||
8417 | .map_queues = scsi_map_queues, | ||
8418 | }; | ||
8419 | diff --git a/drivers/soc/amlogic/meson-clk-measure.c b/drivers/soc/amlogic/meson-clk-measure.c | ||
8420 | index 19d4cbc93a17..c470e24f1dfa 100644 | ||
8421 | --- a/drivers/soc/amlogic/meson-clk-measure.c | ||
8422 | +++ b/drivers/soc/amlogic/meson-clk-measure.c | ||
8423 | @@ -11,6 +11,8 @@ | ||
8424 | #include <linux/debugfs.h> | ||
8425 | #include <linux/regmap.h> | ||
8426 | |||
8427 | +static DEFINE_MUTEX(measure_lock); | ||
8428 | + | ||
8429 | #define MSR_CLK_DUTY 0x0 | ||
8430 | #define MSR_CLK_REG0 0x4 | ||
8431 | #define MSR_CLK_REG1 0x8 | ||
8432 | @@ -360,6 +362,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id, | ||
8433 | unsigned int val; | ||
8434 | int ret; | ||
8435 | |||
8436 | + ret = mutex_lock_interruptible(&measure_lock); | ||
8437 | + if (ret) | ||
8438 | + return ret; | ||
8439 | + | ||
8440 | regmap_write(priv->regmap, MSR_CLK_REG0, 0); | ||
8441 | |||
8442 | /* Set measurement duration */ | ||
8443 | @@ -377,8 +383,10 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id, | ||
8444 | |||
8445 | ret = regmap_read_poll_timeout(priv->regmap, MSR_CLK_REG0, | ||
8446 | val, !(val & MSR_BUSY), 10, 10000); | ||
8447 | - if (ret) | ||
8448 | + if (ret) { | ||
8449 | + mutex_unlock(&measure_lock); | ||
8450 | return ret; | ||
8451 | + } | ||
8452 | |||
8453 | /* Disable */ | ||
8454 | regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_ENABLE, 0); | ||
8455 | @@ -386,6 +394,8 @@ static int meson_measure_id(struct meson_msr_id *clk_msr_id, | ||
8456 | /* Get the value in multiple of gate time counts */ | ||
8457 | regmap_read(priv->regmap, MSR_CLK_REG2, &val); | ||
8458 | |||
8459 | + mutex_unlock(&measure_lock); | ||
8460 | + | ||
8461 | if (val >= MSR_VAL_MASK) | ||
8462 | return -EINVAL; | ||
8463 | |||
8464 | diff --git a/drivers/soc/renesas/Kconfig b/drivers/soc/renesas/Kconfig | ||
8465 | index 2bbf49e5d441..9583c542c47f 100644 | ||
8466 | --- a/drivers/soc/renesas/Kconfig | ||
8467 | +++ b/drivers/soc/renesas/Kconfig | ||
8468 | @@ -55,6 +55,7 @@ config ARCH_EMEV2 | ||
8469 | |||
8470 | config ARCH_R7S72100 | ||
8471 | bool "RZ/A1H (R7S72100)" | ||
8472 | + select ARM_ERRATA_754322 | ||
8473 | select PM | ||
8474 | select PM_GENERIC_DOMAINS | ||
8475 | select RENESAS_OSTM | ||
8476 | @@ -78,6 +79,7 @@ config ARCH_R8A73A4 | ||
8477 | config ARCH_R8A7740 | ||
8478 | bool "R-Mobile A1 (R8A77400)" | ||
8479 | select ARCH_RMOBILE | ||
8480 | + select ARM_ERRATA_754322 | ||
8481 | select RENESAS_INTC_IRQPIN | ||
8482 | |||
8483 | config ARCH_R8A7743 | ||
8484 | @@ -105,10 +107,12 @@ config ARCH_R8A77470 | ||
8485 | config ARCH_R8A7778 | ||
8486 | bool "R-Car M1A (R8A77781)" | ||
8487 | select ARCH_RCAR_GEN1 | ||
8488 | + select ARM_ERRATA_754322 | ||
8489 | |||
8490 | config ARCH_R8A7779 | ||
8491 | bool "R-Car H1 (R8A77790)" | ||
8492 | select ARCH_RCAR_GEN1 | ||
8493 | + select ARM_ERRATA_754322 | ||
8494 | select HAVE_ARM_SCU if SMP | ||
8495 | select HAVE_ARM_TWD if SMP | ||
8496 | select SYSC_R8A7779 | ||
8497 | @@ -152,6 +156,7 @@ config ARCH_R9A06G032 | ||
8498 | config ARCH_SH73A0 | ||
8499 | bool "SH-Mobile AG5 (R8A73A00)" | ||
8500 | select ARCH_RMOBILE | ||
8501 | + select ARM_ERRATA_754322 | ||
8502 | select HAVE_ARM_SCU if SMP | ||
8503 | select HAVE_ARM_TWD if SMP | ||
8504 | select RENESAS_INTC_IRQPIN | ||
8505 | diff --git a/drivers/soc/renesas/rmobile-sysc.c b/drivers/soc/renesas/rmobile-sysc.c | ||
8506 | index 421ae1c887d8..54b616ad4a62 100644 | ||
8507 | --- a/drivers/soc/renesas/rmobile-sysc.c | ||
8508 | +++ b/drivers/soc/renesas/rmobile-sysc.c | ||
8509 | @@ -48,12 +48,8 @@ struct rmobile_pm_domain *to_rmobile_pd(struct generic_pm_domain *d) | ||
8510 | static int rmobile_pd_power_down(struct generic_pm_domain *genpd) | ||
8511 | { | ||
8512 | struct rmobile_pm_domain *rmobile_pd = to_rmobile_pd(genpd); | ||
8513 | - unsigned int mask; | ||
8514 | + unsigned int mask = BIT(rmobile_pd->bit_shift); | ||
8515 | |||
8516 | - if (rmobile_pd->bit_shift == ~0) | ||
8517 | - return -EBUSY; | ||
8518 | - | ||
8519 | - mask = BIT(rmobile_pd->bit_shift); | ||
8520 | if (rmobile_pd->suspend) { | ||
8521 | int ret = rmobile_pd->suspend(); | ||
8522 | |||
8523 | @@ -80,14 +76,10 @@ static int rmobile_pd_power_down(struct generic_pm_domain *genpd) | ||
8524 | |||
8525 | static int __rmobile_pd_power_up(struct rmobile_pm_domain *rmobile_pd) | ||
8526 | { | ||
8527 | - unsigned int mask; | ||
8528 | + unsigned int mask = BIT(rmobile_pd->bit_shift); | ||
8529 | unsigned int retry_count; | ||
8530 | int ret = 0; | ||
8531 | |||
8532 | - if (rmobile_pd->bit_shift == ~0) | ||
8533 | - return 0; | ||
8534 | - | ||
8535 | - mask = BIT(rmobile_pd->bit_shift); | ||
8536 | if (__raw_readl(rmobile_pd->base + PSTR) & mask) | ||
8537 | return ret; | ||
8538 | |||
8539 | @@ -122,11 +114,15 @@ static void rmobile_init_pm_domain(struct rmobile_pm_domain *rmobile_pd) | ||
8540 | struct dev_power_governor *gov = rmobile_pd->gov; | ||
8541 | |||
8542 | genpd->flags |= GENPD_FLAG_PM_CLK | GENPD_FLAG_ACTIVE_WAKEUP; | ||
8543 | - genpd->power_off = rmobile_pd_power_down; | ||
8544 | - genpd->power_on = rmobile_pd_power_up; | ||
8545 | - genpd->attach_dev = cpg_mstp_attach_dev; | ||
8546 | - genpd->detach_dev = cpg_mstp_detach_dev; | ||
8547 | - __rmobile_pd_power_up(rmobile_pd); | ||
8548 | + genpd->attach_dev = cpg_mstp_attach_dev; | ||
8549 | + genpd->detach_dev = cpg_mstp_detach_dev; | ||
8550 | + | ||
8551 | + if (!(genpd->flags & GENPD_FLAG_ALWAYS_ON)) { | ||
8552 | + genpd->power_off = rmobile_pd_power_down; | ||
8553 | + genpd->power_on = rmobile_pd_power_up; | ||
8554 | + __rmobile_pd_power_up(rmobile_pd); | ||
8555 | + } | ||
8556 | + | ||
8557 | pm_genpd_init(genpd, gov ? : &simple_qos_governor, false); | ||
8558 | } | ||
8559 | |||
8560 | @@ -270,6 +266,11 @@ static void __init rmobile_setup_pm_domain(struct device_node *np, | ||
8561 | break; | ||
8562 | |||
8563 | case PD_NORMAL: | ||
8564 | + if (pd->bit_shift == ~0) { | ||
8565 | + /* Top-level always-on domain */ | ||
8566 | + pr_debug("PM domain %s is always-on domain\n", name); | ||
8567 | + pd->genpd.flags |= GENPD_FLAG_ALWAYS_ON; | ||
8568 | + } | ||
8569 | break; | ||
8570 | } | ||
8571 | |||
8572 | diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c | ||
8573 | index 840b1b8ff3dc..dfdcebb38830 100644 | ||
8574 | --- a/drivers/spi/spi-bcm2835.c | ||
8575 | +++ b/drivers/spi/spi-bcm2835.c | ||
8576 | @@ -319,6 +319,13 @@ static void bcm2835_spi_reset_hw(struct spi_controller *ctlr) | ||
8577 | BCM2835_SPI_CS_INTD | | ||
8578 | BCM2835_SPI_CS_DMAEN | | ||
8579 | BCM2835_SPI_CS_TA); | ||
8580 | + /* | ||
8581 | + * Transmission sometimes breaks unless the DONE bit is written at the | ||
8582 | + * end of every transfer. The spec says it's a RO bit. Either the | ||
8583 | + * spec is wrong and the bit is actually of type RW1C, or it's a | ||
8584 | + * hardware erratum. | ||
8585 | + */ | ||
8586 | + cs |= BCM2835_SPI_CS_DONE; | ||
8587 | /* and reset RX/TX FIFOS */ | ||
8588 | cs |= BCM2835_SPI_CS_CLEAR_RX | BCM2835_SPI_CS_CLEAR_TX; | ||
8589 | |||
8590 | @@ -477,7 +484,9 @@ static void bcm2835_spi_transfer_prologue(struct spi_controller *ctlr, | ||
8591 | bcm2835_wr_fifo_count(bs, bs->rx_prologue); | ||
8592 | bcm2835_wait_tx_fifo_empty(bs); | ||
8593 | bcm2835_rd_fifo_count(bs, bs->rx_prologue); | ||
8594 | - bcm2835_spi_reset_hw(ctlr); | ||
8595 | + bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_CLEAR_RX | ||
8596 | + | BCM2835_SPI_CS_CLEAR_TX | ||
8597 | + | BCM2835_SPI_CS_DONE); | ||
8598 | |||
8599 | dma_sync_single_for_device(ctlr->dma_rx->device->dev, | ||
8600 | sg_dma_address(&tfr->rx_sg.sgl[0]), | ||
8601 | @@ -498,7 +507,8 @@ static void bcm2835_spi_transfer_prologue(struct spi_controller *ctlr, | ||
8602 | | BCM2835_SPI_CS_DMAEN); | ||
8603 | bcm2835_wr_fifo_count(bs, tx_remaining); | ||
8604 | bcm2835_wait_tx_fifo_empty(bs); | ||
8605 | - bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_CLEAR_TX); | ||
8606 | + bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_CLEAR_TX | ||
8607 | + | BCM2835_SPI_CS_DONE); | ||
8608 | } | ||
8609 | |||
8610 | if (likely(!bs->tx_spillover)) { | ||
8611 | diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c | ||
8612 | index 18c06568805e..86789dbaf577 100644 | ||
8613 | --- a/drivers/spi/spi-dw-mmio.c | ||
8614 | +++ b/drivers/spi/spi-dw-mmio.c | ||
8615 | @@ -172,8 +172,10 @@ static int dw_spi_mmio_probe(struct platform_device *pdev) | ||
8616 | |||
8617 | /* Optional clock needed to access the registers */ | ||
8618 | dwsmmio->pclk = devm_clk_get_optional(&pdev->dev, "pclk"); | ||
8619 | - if (IS_ERR(dwsmmio->pclk)) | ||
8620 | - return PTR_ERR(dwsmmio->pclk); | ||
8621 | + if (IS_ERR(dwsmmio->pclk)) { | ||
8622 | + ret = PTR_ERR(dwsmmio->pclk); | ||
8623 | + goto out_clk; | ||
8624 | + } | ||
8625 | ret = clk_prepare_enable(dwsmmio->pclk); | ||
8626 | if (ret) | ||
8627 | goto out_clk; | ||
8628 | diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c | ||
8629 | index 53335ccc98f6..545fc8189fb0 100644 | ||
8630 | --- a/drivers/spi/spi-fsl-dspi.c | ||
8631 | +++ b/drivers/spi/spi-fsl-dspi.c | ||
8632 | @@ -886,9 +886,11 @@ static irqreturn_t dspi_interrupt(int irq, void *dev_id) | ||
8633 | trans_mode); | ||
8634 | } | ||
8635 | } | ||
8636 | + | ||
8637 | + return IRQ_HANDLED; | ||
8638 | } | ||
8639 | |||
8640 | - return IRQ_HANDLED; | ||
8641 | + return IRQ_NONE; | ||
8642 | } | ||
8643 | |||
8644 | static const struct of_device_id fsl_dspi_dt_ids[] = { | ||
8645 | diff --git a/drivers/staging/erofs/zmap.c b/drivers/staging/erofs/zmap.c | ||
8646 | index 9c0bd65c46bf..c2359321ca13 100644 | ||
8647 | --- a/drivers/staging/erofs/zmap.c | ||
8648 | +++ b/drivers/staging/erofs/zmap.c | ||
8649 | @@ -86,12 +86,11 @@ static int fill_inode_lazy(struct inode *inode) | ||
8650 | |||
8651 | vi->z_physical_clusterbits[1] = vi->z_logical_clusterbits + | ||
8652 | ((h->h_clusterbits >> 5) & 7); | ||
8653 | + set_bit(EROFS_V_Z_INITED_BIT, &vi->flags); | ||
8654 | unmap_done: | ||
8655 | kunmap_atomic(kaddr); | ||
8656 | unlock_page(page); | ||
8657 | put_page(page); | ||
8658 | - | ||
8659 | - set_bit(EROFS_V_Z_INITED_BIT, &vi->flags); | ||
8660 | out_unlock: | ||
8661 | clear_and_wake_up_bit(EROFS_V_BL_Z_BIT, &vi->flags); | ||
8662 | return err; | ||
8663 | diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c | ||
8664 | index c3665f0e87a2..46dcb46bb927 100644 | ||
8665 | --- a/drivers/staging/media/hantro/hantro_drv.c | ||
8666 | +++ b/drivers/staging/media/hantro/hantro_drv.c | ||
8667 | @@ -724,6 +724,7 @@ static int hantro_probe(struct platform_device *pdev) | ||
8668 | dev_err(vpu->dev, "Could not set DMA coherent mask.\n"); | ||
8669 | return ret; | ||
8670 | } | ||
8671 | + vb2_dma_contig_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32)); | ||
8672 | |||
8673 | for (i = 0; i < vpu->variant->num_irqs; i++) { | ||
8674 | const char *irq_name = vpu->variant->irqs[i].name; | ||
8675 | diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c | ||
8676 | index f29e28df36ed..bfa4b254c4e4 100644 | ||
8677 | --- a/drivers/staging/media/imx/imx6-mipi-csi2.c | ||
8678 | +++ b/drivers/staging/media/imx/imx6-mipi-csi2.c | ||
8679 | @@ -243,7 +243,7 @@ static int __maybe_unused csi2_dphy_wait_ulp(struct csi2_dev *csi2) | ||
8680 | } | ||
8681 | |||
8682 | /* Waits for low-power LP-11 state on data and clock lanes. */ | ||
8683 | -static int csi2_dphy_wait_stopstate(struct csi2_dev *csi2) | ||
8684 | +static void csi2_dphy_wait_stopstate(struct csi2_dev *csi2) | ||
8685 | { | ||
8686 | u32 mask, reg; | ||
8687 | int ret; | ||
8688 | @@ -254,11 +254,9 @@ static int csi2_dphy_wait_stopstate(struct csi2_dev *csi2) | ||
8689 | ret = readl_poll_timeout(csi2->base + CSI2_PHY_STATE, reg, | ||
8690 | (reg & mask) == mask, 0, 500000); | ||
8691 | if (ret) { | ||
8692 | - v4l2_err(&csi2->sd, "LP-11 timeout, phy_state = 0x%08x\n", reg); | ||
8693 | - return ret; | ||
8694 | + v4l2_warn(&csi2->sd, "LP-11 wait timeout, likely a sensor driver bug, expect capture failures.\n"); | ||
8695 | + v4l2_warn(&csi2->sd, "phy_state = 0x%08x\n", reg); | ||
8696 | } | ||
8697 | - | ||
8698 | - return 0; | ||
8699 | } | ||
8700 | |||
8701 | /* Wait for active clock on the clock lane. */ | ||
8702 | @@ -316,9 +314,7 @@ static int csi2_start(struct csi2_dev *csi2) | ||
8703 | csi2_enable(csi2, true); | ||
8704 | |||
8705 | /* Step 5 */ | ||
8706 | - ret = csi2_dphy_wait_stopstate(csi2); | ||
8707 | - if (ret) | ||
8708 | - goto err_assert_reset; | ||
8709 | + csi2_dphy_wait_stopstate(csi2); | ||
8710 | |||
8711 | /* Step 6 */ | ||
8712 | ret = v4l2_subdev_call(csi2->src_sd, video, s_stream, 1); | ||
8713 | diff --git a/drivers/staging/media/tegra-vde/Kconfig b/drivers/staging/media/tegra-vde/Kconfig | ||
8714 | index 2e7f644ae591..ba49ea50b8c0 100644 | ||
8715 | --- a/drivers/staging/media/tegra-vde/Kconfig | ||
8716 | +++ b/drivers/staging/media/tegra-vde/Kconfig | ||
8717 | @@ -3,7 +3,7 @@ config TEGRA_VDE | ||
8718 | tristate "NVIDIA Tegra Video Decoder Engine driver" | ||
8719 | depends on ARCH_TEGRA || COMPILE_TEST | ||
8720 | select DMA_SHARED_BUFFER | ||
8721 | - select IOMMU_IOVA if IOMMU_SUPPORT | ||
8722 | + select IOMMU_IOVA if (IOMMU_SUPPORT || COMPILE_TEST) | ||
8723 | select SRAM | ||
8724 | help | ||
8725 | Say Y here to enable support for the NVIDIA Tegra video decoder | ||
8726 | diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c | ||
8727 | index 04a22663b4fb..51d97ec4f58f 100644 | ||
8728 | --- a/drivers/video/fbdev/efifb.c | ||
8729 | +++ b/drivers/video/fbdev/efifb.c | ||
8730 | @@ -122,28 +122,13 @@ static void efifb_copy_bmp(u8 *src, u32 *dst, int width, struct screen_info *si) | ||
8731 | */ | ||
8732 | static bool efifb_bgrt_sanity_check(struct screen_info *si, u32 bmp_width) | ||
8733 | { | ||
8734 | - static const int default_resolutions[][2] = { | ||
8735 | - { 800, 600 }, | ||
8736 | - { 1024, 768 }, | ||
8737 | - { 1280, 1024 }, | ||
8738 | - }; | ||
8739 | - u32 i, right_margin; | ||
8740 | - | ||
8741 | - for (i = 0; i < ARRAY_SIZE(default_resolutions); i++) { | ||
8742 | - if (default_resolutions[i][0] == si->lfb_width && | ||
8743 | - default_resolutions[i][1] == si->lfb_height) | ||
8744 | - break; | ||
8745 | - } | ||
8746 | - /* If not a default resolution used for textmode, this should be fine */ | ||
8747 | - if (i >= ARRAY_SIZE(default_resolutions)) | ||
8748 | - return true; | ||
8749 | - | ||
8750 | - /* If the right margin is 5 times smaller then the left one, reject */ | ||
8751 | - right_margin = si->lfb_width - (bgrt_tab.image_offset_x + bmp_width); | ||
8752 | - if (right_margin < (bgrt_tab.image_offset_x / 5)) | ||
8753 | - return false; | ||
8754 | + /* | ||
8755 | + * All x86 firmwares horizontally center the image (the yoffset | ||
8756 | + * calculations differ between boards, but xoffset is predictable). | ||
8757 | + */ | ||
8758 | + u32 expected_xoffset = (si->lfb_width - bmp_width) / 2; | ||
8759 | |||
8760 | - return true; | ||
8761 | + return bgrt_tab.image_offset_x == expected_xoffset; | ||
8762 | } | ||
8763 | #else | ||
8764 | static bool efifb_bgrt_sanity_check(struct screen_info *si, u32 bmp_width) | ||
8765 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c | ||
8766 | index d4e11b2e04f6..f131651502b8 100644 | ||
8767 | --- a/fs/binfmt_elf.c | ||
8768 | +++ b/fs/binfmt_elf.c | ||
8769 | @@ -1141,7 +1141,8 @@ out_free_interp: | ||
8770 | * (since it grows up, and may collide early with the stack | ||
8771 | * growing down), and into the unused ELF_ET_DYN_BASE region. | ||
8772 | */ | ||
8773 | - if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) && !interpreter) | ||
8774 | + if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) && | ||
8775 | + loc->elf_ex.e_type == ET_DYN && !interpreter) | ||
8776 | current->mm->brk = current->mm->start_brk = | ||
8777 | ELF_ET_DYN_BASE; | ||
8778 | |||
8779 | diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c | ||
8780 | index 5df76c17775a..322ec4b839ed 100644 | ||
8781 | --- a/fs/btrfs/ctree.c | ||
8782 | +++ b/fs/btrfs/ctree.c | ||
8783 | @@ -1343,6 +1343,7 @@ get_old_root(struct btrfs_root *root, u64 time_seq) | ||
8784 | struct tree_mod_elem *tm; | ||
8785 | struct extent_buffer *eb = NULL; | ||
8786 | struct extent_buffer *eb_root; | ||
8787 | + u64 eb_root_owner = 0; | ||
8788 | struct extent_buffer *old; | ||
8789 | struct tree_mod_root *old_root = NULL; | ||
8790 | u64 old_generation = 0; | ||
8791 | @@ -1380,6 +1381,7 @@ get_old_root(struct btrfs_root *root, u64 time_seq) | ||
8792 | free_extent_buffer(old); | ||
8793 | } | ||
8794 | } else if (old_root) { | ||
8795 | + eb_root_owner = btrfs_header_owner(eb_root); | ||
8796 | btrfs_tree_read_unlock(eb_root); | ||
8797 | free_extent_buffer(eb_root); | ||
8798 | eb = alloc_dummy_extent_buffer(fs_info, logical); | ||
8799 | @@ -1396,7 +1398,7 @@ get_old_root(struct btrfs_root *root, u64 time_seq) | ||
8800 | if (old_root) { | ||
8801 | btrfs_set_header_bytenr(eb, eb->start); | ||
8802 | btrfs_set_header_backref_rev(eb, BTRFS_MIXED_BACKREF_REV); | ||
8803 | - btrfs_set_header_owner(eb, btrfs_header_owner(eb_root)); | ||
8804 | + btrfs_set_header_owner(eb, eb_root_owner); | ||
8805 | btrfs_set_header_level(eb, old_root->level); | ||
8806 | btrfs_set_header_generation(eb, old_generation); | ||
8807 | } | ||
8808 | @@ -5475,6 +5477,7 @@ int btrfs_compare_trees(struct btrfs_root *left_root, | ||
8809 | advance_left = advance_right = 0; | ||
8810 | |||
8811 | while (1) { | ||
8812 | + cond_resched(); | ||
8813 | if (advance_left && !left_end_reached) { | ||
8814 | ret = tree_advance(left_path, &left_level, | ||
8815 | left_root_level, | ||
8816 | diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h | ||
8817 | index 94660063a162..d9541d58ce3d 100644 | ||
8818 | --- a/fs/btrfs/ctree.h | ||
8819 | +++ b/fs/btrfs/ctree.h | ||
8820 | @@ -43,6 +43,7 @@ extern struct kmem_cache *btrfs_trans_handle_cachep; | ||
8821 | extern struct kmem_cache *btrfs_bit_radix_cachep; | ||
8822 | extern struct kmem_cache *btrfs_path_cachep; | ||
8823 | extern struct kmem_cache *btrfs_free_space_cachep; | ||
8824 | +extern struct kmem_cache *btrfs_free_space_bitmap_cachep; | ||
8825 | struct btrfs_ordered_sum; | ||
8826 | struct btrfs_ref; | ||
8827 | |||
8828 | diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c | ||
8829 | index 43fdb2992956..6858a05606dd 100644 | ||
8830 | --- a/fs/btrfs/delayed-inode.c | ||
8831 | +++ b/fs/btrfs/delayed-inode.c | ||
8832 | @@ -474,6 +474,9 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item) | ||
8833 | struct rb_root_cached *root; | ||
8834 | struct btrfs_delayed_root *delayed_root; | ||
8835 | |||
8836 | + /* Not associated with any delayed_node */ | ||
8837 | + if (!delayed_item->delayed_node) | ||
8838 | + return; | ||
8839 | delayed_root = delayed_item->delayed_node->root->fs_info->delayed_root; | ||
8840 | |||
8841 | BUG_ON(!delayed_root); | ||
8842 | @@ -1525,7 +1528,12 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans, | ||
8843 | * we have reserved enough space when we start a new transaction, | ||
8844 | * so reserving metadata failure is impossible. | ||
8845 | */ | ||
8846 | - BUG_ON(ret); | ||
8847 | + if (ret < 0) { | ||
8848 | + btrfs_err(trans->fs_info, | ||
8849 | +"metadata reservation failed for delayed dir item deltiona, should have been reserved"); | ||
8850 | + btrfs_release_delayed_item(item); | ||
8851 | + goto end; | ||
8852 | + } | ||
8853 | |||
8854 | mutex_lock(&node->mutex); | ||
8855 | ret = __btrfs_add_delayed_deletion_item(node, item); | ||
8856 | @@ -1534,7 +1542,8 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans, | ||
8857 | "err add delayed dir index item(index: %llu) into the deletion tree of the delayed node(root id: %llu, inode id: %llu, errno: %d)", | ||
8858 | index, node->root->root_key.objectid, | ||
8859 | node->inode_id, ret); | ||
8860 | - BUG(); | ||
8861 | + btrfs_delayed_item_release_metadata(dir->root, item); | ||
8862 | + btrfs_release_delayed_item(item); | ||
8863 | } | ||
8864 | mutex_unlock(&node->mutex); | ||
8865 | end: | ||
8866 | diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c | ||
8867 | index 97beb351a10c..65af7eb3f7bd 100644 | ||
8868 | --- a/fs/btrfs/disk-io.c | ||
8869 | +++ b/fs/btrfs/disk-io.c | ||
8870 | @@ -416,6 +416,16 @@ int btrfs_verify_level_key(struct extent_buffer *eb, int level, | ||
8871 | */ | ||
8872 | if (btrfs_header_generation(eb) > fs_info->last_trans_committed) | ||
8873 | return 0; | ||
8874 | + | ||
8875 | + /* We have @first_key, so this @eb must have at least one item */ | ||
8876 | + if (btrfs_header_nritems(eb) == 0) { | ||
8877 | + btrfs_err(fs_info, | ||
8878 | + "invalid tree nritems, bytenr=%llu nritems=0 expect >0", | ||
8879 | + eb->start); | ||
8880 | + WARN_ON(IS_ENABLED(CONFIG_BTRFS_DEBUG)); | ||
8881 | + return -EUCLEAN; | ||
8882 | + } | ||
8883 | + | ||
8884 | if (found_level) | ||
8885 | btrfs_node_key_to_cpu(eb, &found_key, 0); | ||
8886 | else | ||
8887 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c | ||
8888 | index 8b7eb22d508a..ef2f80825c82 100644 | ||
8889 | --- a/fs/btrfs/extent-tree.c | ||
8890 | +++ b/fs/btrfs/extent-tree.c | ||
8891 | @@ -5751,6 +5751,14 @@ search: | ||
8892 | */ | ||
8893 | if ((flags & extra) && !(block_group->flags & extra)) | ||
8894 | goto loop; | ||
8895 | + | ||
8896 | + /* | ||
8897 | + * This block group has different flags than we want. | ||
8898 | + * It's possible that we have MIXED_GROUP flag but no | ||
8899 | + * block group is mixed. Just skip such block group. | ||
8900 | + */ | ||
8901 | + btrfs_release_block_group(block_group, delalloc); | ||
8902 | + continue; | ||
8903 | } | ||
8904 | |||
8905 | have_block_group: | ||
8906 | diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c | ||
8907 | index eeb75281894e..3e0c8fcb658f 100644 | ||
8908 | --- a/fs/btrfs/extent_io.c | ||
8909 | +++ b/fs/btrfs/extent_io.c | ||
8910 | @@ -3745,11 +3745,20 @@ err_unlock: | ||
8911 | static void set_btree_ioerr(struct page *page) | ||
8912 | { | ||
8913 | struct extent_buffer *eb = (struct extent_buffer *)page->private; | ||
8914 | + struct btrfs_fs_info *fs_info; | ||
8915 | |||
8916 | SetPageError(page); | ||
8917 | if (test_and_set_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags)) | ||
8918 | return; | ||
8919 | |||
8920 | + /* | ||
8921 | + * If we error out, we should add back the dirty_metadata_bytes | ||
8922 | + * to make it consistent. | ||
8923 | + */ | ||
8924 | + fs_info = eb->fs_info; | ||
8925 | + percpu_counter_add_batch(&fs_info->dirty_metadata_bytes, | ||
8926 | + eb->len, fs_info->dirty_metadata_batch); | ||
8927 | + | ||
8928 | /* | ||
8929 | * If writeback for a btree extent that doesn't belong to a log tree | ||
8930 | * failed, increment the counter transaction->eb_write_errors. | ||
8931 | diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c | ||
8932 | index 062be9dde4c6..52ad985cc7f9 100644 | ||
8933 | --- a/fs/btrfs/free-space-cache.c | ||
8934 | +++ b/fs/btrfs/free-space-cache.c | ||
8935 | @@ -764,7 +764,8 @@ static int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | ||
8936 | } else { | ||
8937 | ASSERT(num_bitmaps); | ||
8938 | num_bitmaps--; | ||
8939 | - e->bitmap = kzalloc(PAGE_SIZE, GFP_NOFS); | ||
8940 | + e->bitmap = kmem_cache_zalloc( | ||
8941 | + btrfs_free_space_bitmap_cachep, GFP_NOFS); | ||
8942 | if (!e->bitmap) { | ||
8943 | kmem_cache_free( | ||
8944 | btrfs_free_space_cachep, e); | ||
8945 | @@ -1881,7 +1882,7 @@ static void free_bitmap(struct btrfs_free_space_ctl *ctl, | ||
8946 | struct btrfs_free_space *bitmap_info) | ||
8947 | { | ||
8948 | unlink_free_space(ctl, bitmap_info); | ||
8949 | - kfree(bitmap_info->bitmap); | ||
8950 | + kmem_cache_free(btrfs_free_space_bitmap_cachep, bitmap_info->bitmap); | ||
8951 | kmem_cache_free(btrfs_free_space_cachep, bitmap_info); | ||
8952 | ctl->total_bitmaps--; | ||
8953 | ctl->op->recalc_thresholds(ctl); | ||
8954 | @@ -2135,7 +2136,8 @@ new_bitmap: | ||
8955 | } | ||
8956 | |||
8957 | /* allocate the bitmap */ | ||
8958 | - info->bitmap = kzalloc(PAGE_SIZE, GFP_NOFS); | ||
8959 | + info->bitmap = kmem_cache_zalloc(btrfs_free_space_bitmap_cachep, | ||
8960 | + GFP_NOFS); | ||
8961 | spin_lock(&ctl->tree_lock); | ||
8962 | if (!info->bitmap) { | ||
8963 | ret = -ENOMEM; | ||
8964 | @@ -2146,7 +2148,9 @@ new_bitmap: | ||
8965 | |||
8966 | out: | ||
8967 | if (info) { | ||
8968 | - kfree(info->bitmap); | ||
8969 | + if (info->bitmap) | ||
8970 | + kmem_cache_free(btrfs_free_space_bitmap_cachep, | ||
8971 | + info->bitmap); | ||
8972 | kmem_cache_free(btrfs_free_space_cachep, info); | ||
8973 | } | ||
8974 | |||
8975 | @@ -2802,7 +2806,8 @@ out: | ||
8976 | if (entry->bytes == 0) { | ||
8977 | ctl->free_extents--; | ||
8978 | if (entry->bitmap) { | ||
8979 | - kfree(entry->bitmap); | ||
8980 | + kmem_cache_free(btrfs_free_space_bitmap_cachep, | ||
8981 | + entry->bitmap); | ||
8982 | ctl->total_bitmaps--; | ||
8983 | ctl->op->recalc_thresholds(ctl); | ||
8984 | } | ||
8985 | @@ -3606,7 +3611,7 @@ again: | ||
8986 | } | ||
8987 | |||
8988 | if (!map) { | ||
8989 | - map = kzalloc(PAGE_SIZE, GFP_NOFS); | ||
8990 | + map = kmem_cache_zalloc(btrfs_free_space_bitmap_cachep, GFP_NOFS); | ||
8991 | if (!map) { | ||
8992 | kmem_cache_free(btrfs_free_space_cachep, info); | ||
8993 | return -ENOMEM; | ||
8994 | @@ -3635,7 +3640,8 @@ again: | ||
8995 | |||
8996 | if (info) | ||
8997 | kmem_cache_free(btrfs_free_space_cachep, info); | ||
8998 | - kfree(map); | ||
8999 | + if (map) | ||
9000 | + kmem_cache_free(btrfs_free_space_bitmap_cachep, map); | ||
9001 | return 0; | ||
9002 | } | ||
9003 | |||
9004 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c | ||
9005 | index ee582a36653d..d51d9466feb0 100644 | ||
9006 | --- a/fs/btrfs/inode.c | ||
9007 | +++ b/fs/btrfs/inode.c | ||
9008 | @@ -74,6 +74,7 @@ static struct kmem_cache *btrfs_inode_cachep; | ||
9009 | struct kmem_cache *btrfs_trans_handle_cachep; | ||
9010 | struct kmem_cache *btrfs_path_cachep; | ||
9011 | struct kmem_cache *btrfs_free_space_cachep; | ||
9012 | +struct kmem_cache *btrfs_free_space_bitmap_cachep; | ||
9013 | |||
9014 | static int btrfs_setsize(struct inode *inode, struct iattr *attr); | ||
9015 | static int btrfs_truncate(struct inode *inode, bool skip_writeback); | ||
9016 | @@ -9380,6 +9381,7 @@ void __cold btrfs_destroy_cachep(void) | ||
9017 | kmem_cache_destroy(btrfs_trans_handle_cachep); | ||
9018 | kmem_cache_destroy(btrfs_path_cachep); | ||
9019 | kmem_cache_destroy(btrfs_free_space_cachep); | ||
9020 | + kmem_cache_destroy(btrfs_free_space_bitmap_cachep); | ||
9021 | } | ||
9022 | |||
9023 | int __init btrfs_init_cachep(void) | ||
9024 | @@ -9409,6 +9411,12 @@ int __init btrfs_init_cachep(void) | ||
9025 | if (!btrfs_free_space_cachep) | ||
9026 | goto fail; | ||
9027 | |||
9028 | + btrfs_free_space_bitmap_cachep = kmem_cache_create("btrfs_free_space_bitmap", | ||
9029 | + PAGE_SIZE, PAGE_SIZE, | ||
9030 | + SLAB_RED_ZONE, NULL); | ||
9031 | + if (!btrfs_free_space_bitmap_cachep) | ||
9032 | + goto fail; | ||
9033 | + | ||
9034 | return 0; | ||
9035 | fail: | ||
9036 | btrfs_destroy_cachep(); | ||
9037 | diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c | ||
9038 | index f8a3c1b0a15a..001efc9ba1e7 100644 | ||
9039 | --- a/fs/btrfs/qgroup.c | ||
9040 | +++ b/fs/btrfs/qgroup.c | ||
9041 | @@ -3154,9 +3154,6 @@ out: | ||
9042 | btrfs_free_path(path); | ||
9043 | |||
9044 | mutex_lock(&fs_info->qgroup_rescan_lock); | ||
9045 | - if (!btrfs_fs_closing(fs_info)) | ||
9046 | - fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; | ||
9047 | - | ||
9048 | if (err > 0 && | ||
9049 | fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT) { | ||
9050 | fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; | ||
9051 | @@ -3172,16 +3169,30 @@ out: | ||
9052 | trans = btrfs_start_transaction(fs_info->quota_root, 1); | ||
9053 | if (IS_ERR(trans)) { | ||
9054 | err = PTR_ERR(trans); | ||
9055 | + trans = NULL; | ||
9056 | btrfs_err(fs_info, | ||
9057 | "fail to start transaction for status update: %d", | ||
9058 | err); | ||
9059 | - goto done; | ||
9060 | } | ||
9061 | - ret = update_qgroup_status_item(trans); | ||
9062 | - if (ret < 0) { | ||
9063 | - err = ret; | ||
9064 | - btrfs_err(fs_info, "fail to update qgroup status: %d", err); | ||
9065 | + | ||
9066 | + mutex_lock(&fs_info->qgroup_rescan_lock); | ||
9067 | + if (!btrfs_fs_closing(fs_info)) | ||
9068 | + fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; | ||
9069 | + if (trans) { | ||
9070 | + ret = update_qgroup_status_item(trans); | ||
9071 | + if (ret < 0) { | ||
9072 | + err = ret; | ||
9073 | + btrfs_err(fs_info, "fail to update qgroup status: %d", | ||
9074 | + err); | ||
9075 | + } | ||
9076 | } | ||
9077 | + fs_info->qgroup_rescan_running = false; | ||
9078 | + complete_all(&fs_info->qgroup_rescan_completion); | ||
9079 | + mutex_unlock(&fs_info->qgroup_rescan_lock); | ||
9080 | + | ||
9081 | + if (!trans) | ||
9082 | + return; | ||
9083 | + | ||
9084 | btrfs_end_transaction(trans); | ||
9085 | |||
9086 | if (btrfs_fs_closing(fs_info)) { | ||
9087 | @@ -3192,12 +3203,6 @@ out: | ||
9088 | } else { | ||
9089 | btrfs_err(fs_info, "qgroup scan failed with %d", err); | ||
9090 | } | ||
9091 | - | ||
9092 | -done: | ||
9093 | - mutex_lock(&fs_info->qgroup_rescan_lock); | ||
9094 | - fs_info->qgroup_rescan_running = false; | ||
9095 | - mutex_unlock(&fs_info->qgroup_rescan_lock); | ||
9096 | - complete_all(&fs_info->qgroup_rescan_completion); | ||
9097 | } | ||
9098 | |||
9099 | /* | ||
9100 | @@ -3425,6 +3430,9 @@ cleanup: | ||
9101 | while ((unode = ulist_next(&reserved->range_changed, &uiter))) | ||
9102 | clear_extent_bit(&BTRFS_I(inode)->io_tree, unode->val, | ||
9103 | unode->aux, EXTENT_QGROUP_RESERVED, 0, 0, NULL); | ||
9104 | + /* Also free data bytes of already reserved one */ | ||
9105 | + btrfs_qgroup_free_refroot(root->fs_info, root->root_key.objectid, | ||
9106 | + orig_reserved, BTRFS_QGROUP_RSV_DATA); | ||
9107 | extent_changeset_release(reserved); | ||
9108 | return ret; | ||
9109 | } | ||
9110 | @@ -3469,7 +3477,7 @@ static int qgroup_free_reserved_data(struct inode *inode, | ||
9111 | * EXTENT_QGROUP_RESERVED, we won't double free. | ||
9112 | * So not need to rush. | ||
9113 | */ | ||
9114 | - ret = clear_record_extent_bits(&BTRFS_I(inode)->io_failure_tree, | ||
9115 | + ret = clear_record_extent_bits(&BTRFS_I(inode)->io_tree, | ||
9116 | free_start, free_start + free_len - 1, | ||
9117 | EXTENT_QGROUP_RESERVED, &changeset); | ||
9118 | if (ret < 0) | ||
9119 | diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c | ||
9120 | index ccd5706199d7..9634cae1e1b1 100644 | ||
9121 | --- a/fs/btrfs/tree-checker.c | ||
9122 | +++ b/fs/btrfs/tree-checker.c | ||
9123 | @@ -821,6 +821,95 @@ static int check_inode_item(struct extent_buffer *leaf, | ||
9124 | return 0; | ||
9125 | } | ||
9126 | |||
9127 | +static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key, | ||
9128 | + int slot) | ||
9129 | +{ | ||
9130 | + struct btrfs_fs_info *fs_info = leaf->fs_info; | ||
9131 | + struct btrfs_root_item ri; | ||
9132 | + const u64 valid_root_flags = BTRFS_ROOT_SUBVOL_RDONLY | | ||
9133 | + BTRFS_ROOT_SUBVOL_DEAD; | ||
9134 | + | ||
9135 | + /* No such tree id */ | ||
9136 | + if (key->objectid == 0) { | ||
9137 | + generic_err(leaf, slot, "invalid root id 0"); | ||
9138 | + return -EUCLEAN; | ||
9139 | + } | ||
9140 | + | ||
9141 | + /* | ||
9142 | + * Some older kernel may create ROOT_ITEM with non-zero offset, so here | ||
9143 | + * we only check offset for reloc tree whose key->offset must be a | ||
9144 | + * valid tree. | ||
9145 | + */ | ||
9146 | + if (key->objectid == BTRFS_TREE_RELOC_OBJECTID && key->offset == 0) { | ||
9147 | + generic_err(leaf, slot, "invalid root id 0 for reloc tree"); | ||
9148 | + return -EUCLEAN; | ||
9149 | + } | ||
9150 | + | ||
9151 | + if (btrfs_item_size_nr(leaf, slot) != sizeof(ri)) { | ||
9152 | + generic_err(leaf, slot, | ||
9153 | + "invalid root item size, have %u expect %zu", | ||
9154 | + btrfs_item_size_nr(leaf, slot), sizeof(ri)); | ||
9155 | + } | ||
9156 | + | ||
9157 | + read_extent_buffer(leaf, &ri, btrfs_item_ptr_offset(leaf, slot), | ||
9158 | + sizeof(ri)); | ||
9159 | + | ||
9160 | + /* Generation related */ | ||
9161 | + if (btrfs_root_generation(&ri) > | ||
9162 | + btrfs_super_generation(fs_info->super_copy) + 1) { | ||
9163 | + generic_err(leaf, slot, | ||
9164 | + "invalid root generation, have %llu expect (0, %llu]", | ||
9165 | + btrfs_root_generation(&ri), | ||
9166 | + btrfs_super_generation(fs_info->super_copy) + 1); | ||
9167 | + return -EUCLEAN; | ||
9168 | + } | ||
9169 | + if (btrfs_root_generation_v2(&ri) > | ||
9170 | + btrfs_super_generation(fs_info->super_copy) + 1) { | ||
9171 | + generic_err(leaf, slot, | ||
9172 | + "invalid root v2 generation, have %llu expect (0, %llu]", | ||
9173 | + btrfs_root_generation_v2(&ri), | ||
9174 | + btrfs_super_generation(fs_info->super_copy) + 1); | ||
9175 | + return -EUCLEAN; | ||
9176 | + } | ||
9177 | + if (btrfs_root_last_snapshot(&ri) > | ||
9178 | + btrfs_super_generation(fs_info->super_copy) + 1) { | ||
9179 | + generic_err(leaf, slot, | ||
9180 | + "invalid root last_snapshot, have %llu expect (0, %llu]", | ||
9181 | + btrfs_root_last_snapshot(&ri), | ||
9182 | + btrfs_super_generation(fs_info->super_copy) + 1); | ||
9183 | + return -EUCLEAN; | ||
9184 | + } | ||
9185 | + | ||
9186 | + /* Alignment and level check */ | ||
9187 | + if (!IS_ALIGNED(btrfs_root_bytenr(&ri), fs_info->sectorsize)) { | ||
9188 | + generic_err(leaf, slot, | ||
9189 | + "invalid root bytenr, have %llu expect to be aligned to %u", | ||
9190 | + btrfs_root_bytenr(&ri), fs_info->sectorsize); | ||
9191 | + return -EUCLEAN; | ||
9192 | + } | ||
9193 | + if (btrfs_root_level(&ri) >= BTRFS_MAX_LEVEL) { | ||
9194 | + generic_err(leaf, slot, | ||
9195 | + "invalid root level, have %u expect [0, %u]", | ||
9196 | + btrfs_root_level(&ri), BTRFS_MAX_LEVEL - 1); | ||
9197 | + return -EUCLEAN; | ||
9198 | + } | ||
9199 | + if (ri.drop_level >= BTRFS_MAX_LEVEL) { | ||
9200 | + generic_err(leaf, slot, | ||
9201 | + "invalid root level, have %u expect [0, %u]", | ||
9202 | + ri.drop_level, BTRFS_MAX_LEVEL - 1); | ||
9203 | + return -EUCLEAN; | ||
9204 | + } | ||
9205 | + | ||
9206 | + /* Flags check */ | ||
9207 | + if (btrfs_root_flags(&ri) & ~valid_root_flags) { | ||
9208 | + generic_err(leaf, slot, | ||
9209 | + "invalid root flags, have 0x%llx expect mask 0x%llx", | ||
9210 | + btrfs_root_flags(&ri), valid_root_flags); | ||
9211 | + return -EUCLEAN; | ||
9212 | + } | ||
9213 | + return 0; | ||
9214 | +} | ||
9215 | + | ||
9216 | /* | ||
9217 | * Common point to switch the item-specific validation. | ||
9218 | */ | ||
9219 | @@ -856,6 +945,9 @@ static int check_leaf_item(struct extent_buffer *leaf, | ||
9220 | case BTRFS_INODE_ITEM_KEY: | ||
9221 | ret = check_inode_item(leaf, key, slot); | ||
9222 | break; | ||
9223 | + case BTRFS_ROOT_ITEM_KEY: | ||
9224 | + ret = check_root_item(leaf, key, slot); | ||
9225 | + break; | ||
9226 | } | ||
9227 | return ret; | ||
9228 | } | ||
9229 | @@ -899,6 +991,12 @@ static int check_leaf(struct extent_buffer *leaf, bool check_item_data) | ||
9230 | owner); | ||
9231 | return -EUCLEAN; | ||
9232 | } | ||
9233 | + /* Unknown tree */ | ||
9234 | + if (owner == 0) { | ||
9235 | + generic_err(leaf, 0, | ||
9236 | + "invalid owner, root 0 is not defined"); | ||
9237 | + return -EUCLEAN; | ||
9238 | + } | ||
9239 | return 0; | ||
9240 | } | ||
9241 | |||
9242 | diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c | ||
9243 | index a447d3ec48d5..e821a0e97cd8 100644 | ||
9244 | --- a/fs/btrfs/volumes.c | ||
9245 | +++ b/fs/btrfs/volumes.c | ||
9246 | @@ -4072,7 +4072,13 @@ int btrfs_balance(struct btrfs_fs_info *fs_info, | ||
9247 | } | ||
9248 | |||
9249 | num_devices = btrfs_num_devices(fs_info); | ||
9250 | - allowed = 0; | ||
9251 | + | ||
9252 | + /* | ||
9253 | + * SINGLE profile on-disk has no profile bit, but in-memory we have a | ||
9254 | + * special bit for it, to make it easier to distinguish. Thus we need | ||
9255 | + * to set it manually, or balance would refuse the profile. | ||
9256 | + */ | ||
9257 | + allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE; | ||
9258 | for (i = 0; i < ARRAY_SIZE(btrfs_raid_array); i++) | ||
9259 | if (num_devices >= btrfs_raid_array[i].devs_min) | ||
9260 | allowed |= btrfs_raid_array[i].bg_flag; | ||
9261 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c | ||
9262 | index 3289b566463f..64e33e7bff1e 100644 | ||
9263 | --- a/fs/cifs/cifsfs.c | ||
9264 | +++ b/fs/cifs/cifsfs.c | ||
9265 | @@ -433,6 +433,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root) | ||
9266 | cifs_show_security(s, tcon->ses); | ||
9267 | cifs_show_cache_flavor(s, cifs_sb); | ||
9268 | |||
9269 | + if (tcon->no_lease) | ||
9270 | + seq_puts(s, ",nolease"); | ||
9271 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) | ||
9272 | seq_puts(s, ",multiuser"); | ||
9273 | else if (tcon->ses->user_name) | ||
9274 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h | ||
9275 | index fe610e7e3670..5ef5a16c01d2 100644 | ||
9276 | --- a/fs/cifs/cifsglob.h | ||
9277 | +++ b/fs/cifs/cifsglob.h | ||
9278 | @@ -576,6 +576,7 @@ struct smb_vol { | ||
9279 | bool noblocksnd:1; | ||
9280 | bool noautotune:1; | ||
9281 | bool nostrictsync:1; /* do not force expensive SMBflush on every sync */ | ||
9282 | + bool no_lease:1; /* disable requesting leases */ | ||
9283 | bool fsc:1; /* enable fscache */ | ||
9284 | bool mfsymlinks:1; /* use Minshall+French Symlinks */ | ||
9285 | bool multiuser:1; | ||
9286 | @@ -1082,6 +1083,7 @@ struct cifs_tcon { | ||
9287 | bool need_reopen_files:1; /* need to reopen tcon file handles */ | ||
9288 | bool use_resilient:1; /* use resilient instead of durable handles */ | ||
9289 | bool use_persistent:1; /* use persistent instead of durable handles */ | ||
9290 | + bool no_lease:1; /* Do not request leases on files or directories */ | ||
9291 | __le32 capabilities; | ||
9292 | __u32 share_flags; | ||
9293 | __u32 maximal_access; | ||
9294 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
9295 | index 5299effa6f7d..8ee57d1f507f 100644 | ||
9296 | --- a/fs/cifs/connect.c | ||
9297 | +++ b/fs/cifs/connect.c | ||
9298 | @@ -74,7 +74,7 @@ enum { | ||
9299 | Opt_user_xattr, Opt_nouser_xattr, | ||
9300 | Opt_forceuid, Opt_noforceuid, | ||
9301 | Opt_forcegid, Opt_noforcegid, | ||
9302 | - Opt_noblocksend, Opt_noautotune, | ||
9303 | + Opt_noblocksend, Opt_noautotune, Opt_nolease, | ||
9304 | Opt_hard, Opt_soft, Opt_perm, Opt_noperm, | ||
9305 | Opt_mapposix, Opt_nomapposix, | ||
9306 | Opt_mapchars, Opt_nomapchars, Opt_sfu, | ||
9307 | @@ -134,6 +134,7 @@ static const match_table_t cifs_mount_option_tokens = { | ||
9308 | { Opt_noforcegid, "noforcegid" }, | ||
9309 | { Opt_noblocksend, "noblocksend" }, | ||
9310 | { Opt_noautotune, "noautotune" }, | ||
9311 | + { Opt_nolease, "nolease" }, | ||
9312 | { Opt_hard, "hard" }, | ||
9313 | { Opt_soft, "soft" }, | ||
9314 | { Opt_perm, "perm" }, | ||
9315 | @@ -1713,6 +1714,9 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | ||
9316 | case Opt_noautotune: | ||
9317 | vol->noautotune = 1; | ||
9318 | break; | ||
9319 | + case Opt_nolease: | ||
9320 | + vol->no_lease = 1; | ||
9321 | + break; | ||
9322 | case Opt_hard: | ||
9323 | vol->retry = 1; | ||
9324 | break; | ||
9325 | @@ -3250,6 +3254,8 @@ static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info) | ||
9326 | return 0; | ||
9327 | if (tcon->handle_timeout != volume_info->handle_timeout) | ||
9328 | return 0; | ||
9329 | + if (tcon->no_lease != volume_info->no_lease) | ||
9330 | + return 0; | ||
9331 | return 1; | ||
9332 | } | ||
9333 | |||
9334 | @@ -3464,6 +3470,7 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info) | ||
9335 | tcon->nocase = volume_info->nocase; | ||
9336 | tcon->nohandlecache = volume_info->nohandlecache; | ||
9337 | tcon->local_lease = volume_info->local_lease; | ||
9338 | + tcon->no_lease = volume_info->no_lease; | ||
9339 | INIT_LIST_HEAD(&tcon->pending_opens); | ||
9340 | |||
9341 | spin_lock(&cifs_tcp_ses_lock); | ||
9342 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c | ||
9343 | index 64a5864127be..7e8e8826c26f 100644 | ||
9344 | --- a/fs/cifs/smb2ops.c | ||
9345 | +++ b/fs/cifs/smb2ops.c | ||
9346 | @@ -656,6 +656,15 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) | ||
9347 | return 0; | ||
9348 | } | ||
9349 | |||
9350 | + /* | ||
9351 | + * We do not hold the lock for the open because in case | ||
9352 | + * SMB2_open needs to reconnect, it will end up calling | ||
9353 | + * cifs_mark_open_files_invalid() which takes the lock again | ||
9354 | + * thus causing a deadlock | ||
9355 | + */ | ||
9356 | + | ||
9357 | + mutex_unlock(&tcon->crfid.fid_mutex); | ||
9358 | + | ||
9359 | if (smb3_encryption_required(tcon)) | ||
9360 | flags |= CIFS_TRANSFORM_REQ; | ||
9361 | |||
9362 | @@ -677,7 +686,7 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) | ||
9363 | |||
9364 | rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, &utf16_path); | ||
9365 | if (rc) | ||
9366 | - goto oshr_exit; | ||
9367 | + goto oshr_free; | ||
9368 | smb2_set_next_command(tcon, &rqst[0]); | ||
9369 | |||
9370 | memset(&qi_iov, 0, sizeof(qi_iov)); | ||
9371 | @@ -690,18 +699,10 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) | ||
9372 | sizeof(struct smb2_file_all_info) + | ||
9373 | PATH_MAX * 2, 0, NULL); | ||
9374 | if (rc) | ||
9375 | - goto oshr_exit; | ||
9376 | + goto oshr_free; | ||
9377 | |||
9378 | smb2_set_related(&rqst[1]); | ||
9379 | |||
9380 | - /* | ||
9381 | - * We do not hold the lock for the open because in case | ||
9382 | - * SMB2_open needs to reconnect, it will end up calling | ||
9383 | - * cifs_mark_open_files_invalid() which takes the lock again | ||
9384 | - * thus causing a deadlock | ||
9385 | - */ | ||
9386 | - | ||
9387 | - mutex_unlock(&tcon->crfid.fid_mutex); | ||
9388 | rc = compound_send_recv(xid, ses, flags, 2, rqst, | ||
9389 | resp_buftype, rsp_iov); | ||
9390 | mutex_lock(&tcon->crfid.fid_mutex); | ||
9391 | @@ -742,6 +743,8 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) | ||
9392 | if (rc) | ||
9393 | goto oshr_exit; | ||
9394 | |||
9395 | + atomic_inc(&tcon->num_remote_opens); | ||
9396 | + | ||
9397 | o_rsp = (struct smb2_create_rsp *)rsp_iov[0].iov_base; | ||
9398 | oparms.fid->persistent_fid = o_rsp->PersistentFileId; | ||
9399 | oparms.fid->volatile_fid = o_rsp->VolatileFileId; | ||
9400 | @@ -1167,6 +1170,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon, | ||
9401 | |||
9402 | rc = compound_send_recv(xid, ses, flags, 3, rqst, | ||
9403 | resp_buftype, rsp_iov); | ||
9404 | + /* no need to bump num_remote_opens because handle immediately closed */ | ||
9405 | |||
9406 | sea_exit: | ||
9407 | kfree(ea); | ||
9408 | @@ -1488,6 +1492,8 @@ smb2_ioctl_query_info(const unsigned int xid, | ||
9409 | resp_buftype, rsp_iov); | ||
9410 | if (rc) | ||
9411 | goto iqinf_exit; | ||
9412 | + | ||
9413 | + /* No need to bump num_remote_opens since handle immediately closed */ | ||
9414 | if (qi.flags & PASSTHRU_FSCTL) { | ||
9415 | pqi = (struct smb_query_info __user *)arg; | ||
9416 | io_rsp = (struct smb2_ioctl_rsp *)rsp_iov[1].iov_base; | ||
9417 | @@ -3295,6 +3301,11 @@ smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock, | ||
9418 | if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE) | ||
9419 | return; | ||
9420 | |||
9421 | + /* Check if the server granted an oplock rather than a lease */ | ||
9422 | + if (oplock & SMB2_OPLOCK_LEVEL_EXCLUSIVE) | ||
9423 | + return smb2_set_oplock_level(cinode, oplock, epoch, | ||
9424 | + purge_cache); | ||
9425 | + | ||
9426 | if (oplock & SMB2_LEASE_READ_CACHING_HE) { | ||
9427 | new_oplock |= CIFS_CACHE_READ_FLG; | ||
9428 | strcat(message, "R"); | ||
9429 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c | ||
9430 | index 31e4a1b0b170..0aa40129dfb5 100644 | ||
9431 | --- a/fs/cifs/smb2pdu.c | ||
9432 | +++ b/fs/cifs/smb2pdu.c | ||
9433 | @@ -2351,6 +2351,7 @@ int smb311_posix_mkdir(const unsigned int xid, struct inode *inode, | ||
9434 | rqst.rq_iov = iov; | ||
9435 | rqst.rq_nvec = n_iov; | ||
9436 | |||
9437 | + /* no need to inc num_remote_opens because we close it just below */ | ||
9438 | trace_smb3_posix_mkdir_enter(xid, tcon->tid, ses->Suid, CREATE_NOT_FILE, | ||
9439 | FILE_WRITE_ATTRIBUTES); | ||
9440 | /* resource #4: response buffer */ | ||
9441 | @@ -2458,7 +2459,7 @@ SMB2_open_init(struct cifs_tcon *tcon, struct smb_rqst *rqst, __u8 *oplock, | ||
9442 | iov[1].iov_len = uni_path_len; | ||
9443 | iov[1].iov_base = path; | ||
9444 | |||
9445 | - if (!server->oplocks) | ||
9446 | + if ((!server->oplocks) || (tcon->no_lease)) | ||
9447 | *oplock = SMB2_OPLOCK_LEVEL_NONE; | ||
9448 | |||
9449 | if (!(server->capabilities & SMB2_GLOBAL_CAP_LEASING) || | ||
9450 | diff --git a/fs/cifs/xattr.c b/fs/cifs/xattr.c | ||
9451 | index 9076150758d8..db4ba8f6077e 100644 | ||
9452 | --- a/fs/cifs/xattr.c | ||
9453 | +++ b/fs/cifs/xattr.c | ||
9454 | @@ -31,7 +31,7 @@ | ||
9455 | #include "cifs_fs_sb.h" | ||
9456 | #include "cifs_unicode.h" | ||
9457 | |||
9458 | -#define MAX_EA_VALUE_SIZE 65535 | ||
9459 | +#define MAX_EA_VALUE_SIZE CIFSMaxBufSize | ||
9460 | #define CIFS_XATTR_CIFS_ACL "system.cifs_acl" | ||
9461 | #define CIFS_XATTR_ATTRIB "cifs.dosattrib" /* full name: user.cifs.dosattrib */ | ||
9462 | #define CIFS_XATTR_CREATETIME "cifs.creationtime" /* user.cifs.creationtime */ | ||
9463 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
9464 | index 92266a2da7d6..f203bf989a4c 100644 | ||
9465 | --- a/fs/ext4/extents.c | ||
9466 | +++ b/fs/ext4/extents.c | ||
9467 | @@ -3813,8 +3813,8 @@ static int ext4_convert_unwritten_extents_endio(handle_t *handle, | ||
9468 | * illegal. | ||
9469 | */ | ||
9470 | if (ee_block != map->m_lblk || ee_len > map->m_len) { | ||
9471 | -#ifdef EXT4_DEBUG | ||
9472 | - ext4_warning("Inode (%ld) finished: extent logical block %llu," | ||
9473 | +#ifdef CONFIG_EXT4_DEBUG | ||
9474 | + ext4_warning(inode->i_sb, "Inode (%ld) finished: extent logical block %llu," | ||
9475 | " len %u; IO logical block %llu, len %u", | ||
9476 | inode->i_ino, (unsigned long long)ee_block, ee_len, | ||
9477 | (unsigned long long)map->m_lblk, map->m_len); | ||
9478 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
9479 | index 006b7a2070bf..723b0d1a3881 100644 | ||
9480 | --- a/fs/ext4/inode.c | ||
9481 | +++ b/fs/ext4/inode.c | ||
9482 | @@ -4297,6 +4297,15 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) | ||
9483 | |||
9484 | trace_ext4_punch_hole(inode, offset, length, 0); | ||
9485 | |||
9486 | + ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); | ||
9487 | + if (ext4_has_inline_data(inode)) { | ||
9488 | + down_write(&EXT4_I(inode)->i_mmap_sem); | ||
9489 | + ret = ext4_convert_inline_data(inode); | ||
9490 | + up_write(&EXT4_I(inode)->i_mmap_sem); | ||
9491 | + if (ret) | ||
9492 | + return ret; | ||
9493 | + } | ||
9494 | + | ||
9495 | /* | ||
9496 | * Write out all dirty pages to avoid race conditions | ||
9497 | * Then release them. | ||
9498 | diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c | ||
9499 | index ea8237513dfa..186468fba82e 100644 | ||
9500 | --- a/fs/fuse/dev.c | ||
9501 | +++ b/fs/fuse/dev.c | ||
9502 | @@ -377,7 +377,7 @@ static void queue_request(struct fuse_iqueue *fiq, struct fuse_req *req) | ||
9503 | req->in.h.len = sizeof(struct fuse_in_header) + | ||
9504 | len_args(req->in.numargs, (struct fuse_arg *) req->in.args); | ||
9505 | list_add_tail(&req->list, &fiq->pending); | ||
9506 | - wake_up_locked(&fiq->waitq); | ||
9507 | + wake_up(&fiq->waitq); | ||
9508 | kill_fasync(&fiq->fasync, SIGIO, POLL_IN); | ||
9509 | } | ||
9510 | |||
9511 | @@ -389,16 +389,16 @@ void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget, | ||
9512 | forget->forget_one.nodeid = nodeid; | ||
9513 | forget->forget_one.nlookup = nlookup; | ||
9514 | |||
9515 | - spin_lock(&fiq->waitq.lock); | ||
9516 | + spin_lock(&fiq->lock); | ||
9517 | if (fiq->connected) { | ||
9518 | fiq->forget_list_tail->next = forget; | ||
9519 | fiq->forget_list_tail = forget; | ||
9520 | - wake_up_locked(&fiq->waitq); | ||
9521 | + wake_up(&fiq->waitq); | ||
9522 | kill_fasync(&fiq->fasync, SIGIO, POLL_IN); | ||
9523 | } else { | ||
9524 | kfree(forget); | ||
9525 | } | ||
9526 | - spin_unlock(&fiq->waitq.lock); | ||
9527 | + spin_unlock(&fiq->lock); | ||
9528 | } | ||
9529 | |||
9530 | static void flush_bg_queue(struct fuse_conn *fc) | ||
9531 | @@ -412,10 +412,10 @@ static void flush_bg_queue(struct fuse_conn *fc) | ||
9532 | req = list_first_entry(&fc->bg_queue, struct fuse_req, list); | ||
9533 | list_del(&req->list); | ||
9534 | fc->active_background++; | ||
9535 | - spin_lock(&fiq->waitq.lock); | ||
9536 | + spin_lock(&fiq->lock); | ||
9537 | req->in.h.unique = fuse_get_unique(fiq); | ||
9538 | queue_request(fiq, req); | ||
9539 | - spin_unlock(&fiq->waitq.lock); | ||
9540 | + spin_unlock(&fiq->lock); | ||
9541 | } | ||
9542 | } | ||
9543 | |||
9544 | @@ -439,9 +439,9 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req) | ||
9545 | * smp_mb() from queue_interrupt(). | ||
9546 | */ | ||
9547 | if (!list_empty(&req->intr_entry)) { | ||
9548 | - spin_lock(&fiq->waitq.lock); | ||
9549 | + spin_lock(&fiq->lock); | ||
9550 | list_del_init(&req->intr_entry); | ||
9551 | - spin_unlock(&fiq->waitq.lock); | ||
9552 | + spin_unlock(&fiq->lock); | ||
9553 | } | ||
9554 | WARN_ON(test_bit(FR_PENDING, &req->flags)); | ||
9555 | WARN_ON(test_bit(FR_SENT, &req->flags)); | ||
9556 | @@ -483,10 +483,10 @@ put_request: | ||
9557 | |||
9558 | static int queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req) | ||
9559 | { | ||
9560 | - spin_lock(&fiq->waitq.lock); | ||
9561 | + spin_lock(&fiq->lock); | ||
9562 | /* Check for we've sent request to interrupt this req */ | ||
9563 | if (unlikely(!test_bit(FR_INTERRUPTED, &req->flags))) { | ||
9564 | - spin_unlock(&fiq->waitq.lock); | ||
9565 | + spin_unlock(&fiq->lock); | ||
9566 | return -EINVAL; | ||
9567 | } | ||
9568 | |||
9569 | @@ -499,13 +499,13 @@ static int queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req) | ||
9570 | smp_mb(); | ||
9571 | if (test_bit(FR_FINISHED, &req->flags)) { | ||
9572 | list_del_init(&req->intr_entry); | ||
9573 | - spin_unlock(&fiq->waitq.lock); | ||
9574 | + spin_unlock(&fiq->lock); | ||
9575 | return 0; | ||
9576 | } | ||
9577 | - wake_up_locked(&fiq->waitq); | ||
9578 | + wake_up(&fiq->waitq); | ||
9579 | kill_fasync(&fiq->fasync, SIGIO, POLL_IN); | ||
9580 | } | ||
9581 | - spin_unlock(&fiq->waitq.lock); | ||
9582 | + spin_unlock(&fiq->lock); | ||
9583 | return 0; | ||
9584 | } | ||
9585 | |||
9586 | @@ -535,16 +535,16 @@ static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) | ||
9587 | if (!err) | ||
9588 | return; | ||
9589 | |||
9590 | - spin_lock(&fiq->waitq.lock); | ||
9591 | + spin_lock(&fiq->lock); | ||
9592 | /* Request is not yet in userspace, bail out */ | ||
9593 | if (test_bit(FR_PENDING, &req->flags)) { | ||
9594 | list_del(&req->list); | ||
9595 | - spin_unlock(&fiq->waitq.lock); | ||
9596 | + spin_unlock(&fiq->lock); | ||
9597 | __fuse_put_request(req); | ||
9598 | req->out.h.error = -EINTR; | ||
9599 | return; | ||
9600 | } | ||
9601 | - spin_unlock(&fiq->waitq.lock); | ||
9602 | + spin_unlock(&fiq->lock); | ||
9603 | } | ||
9604 | |||
9605 | /* | ||
9606 | @@ -559,9 +559,9 @@ static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) | ||
9607 | struct fuse_iqueue *fiq = &fc->iq; | ||
9608 | |||
9609 | BUG_ON(test_bit(FR_BACKGROUND, &req->flags)); | ||
9610 | - spin_lock(&fiq->waitq.lock); | ||
9611 | + spin_lock(&fiq->lock); | ||
9612 | if (!fiq->connected) { | ||
9613 | - spin_unlock(&fiq->waitq.lock); | ||
9614 | + spin_unlock(&fiq->lock); | ||
9615 | req->out.h.error = -ENOTCONN; | ||
9616 | } else { | ||
9617 | req->in.h.unique = fuse_get_unique(fiq); | ||
9618 | @@ -569,7 +569,7 @@ static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) | ||
9619 | /* acquire extra reference, since request is still needed | ||
9620 | after request_end() */ | ||
9621 | __fuse_get_request(req); | ||
9622 | - spin_unlock(&fiq->waitq.lock); | ||
9623 | + spin_unlock(&fiq->lock); | ||
9624 | |||
9625 | request_wait_answer(fc, req); | ||
9626 | /* Pairs with smp_wmb() in request_end() */ | ||
9627 | @@ -700,12 +700,12 @@ static int fuse_request_send_notify_reply(struct fuse_conn *fc, | ||
9628 | |||
9629 | __clear_bit(FR_ISREPLY, &req->flags); | ||
9630 | req->in.h.unique = unique; | ||
9631 | - spin_lock(&fiq->waitq.lock); | ||
9632 | + spin_lock(&fiq->lock); | ||
9633 | if (fiq->connected) { | ||
9634 | queue_request(fiq, req); | ||
9635 | err = 0; | ||
9636 | } | ||
9637 | - spin_unlock(&fiq->waitq.lock); | ||
9638 | + spin_unlock(&fiq->lock); | ||
9639 | |||
9640 | return err; | ||
9641 | } | ||
9642 | @@ -1149,12 +1149,12 @@ static int request_pending(struct fuse_iqueue *fiq) | ||
9643 | * Unlike other requests this is assembled on demand, without a need | ||
9644 | * to allocate a separate fuse_req structure. | ||
9645 | * | ||
9646 | - * Called with fiq->waitq.lock held, releases it | ||
9647 | + * Called with fiq->lock held, releases it | ||
9648 | */ | ||
9649 | static int fuse_read_interrupt(struct fuse_iqueue *fiq, | ||
9650 | struct fuse_copy_state *cs, | ||
9651 | size_t nbytes, struct fuse_req *req) | ||
9652 | -__releases(fiq->waitq.lock) | ||
9653 | +__releases(fiq->lock) | ||
9654 | { | ||
9655 | struct fuse_in_header ih; | ||
9656 | struct fuse_interrupt_in arg; | ||
9657 | @@ -1169,7 +1169,7 @@ __releases(fiq->waitq.lock) | ||
9658 | ih.unique = (req->in.h.unique | FUSE_INT_REQ_BIT); | ||
9659 | arg.unique = req->in.h.unique; | ||
9660 | |||
9661 | - spin_unlock(&fiq->waitq.lock); | ||
9662 | + spin_unlock(&fiq->lock); | ||
9663 | if (nbytes < reqsize) | ||
9664 | return -EINVAL; | ||
9665 | |||
9666 | @@ -1206,7 +1206,7 @@ static struct fuse_forget_link *dequeue_forget(struct fuse_iqueue *fiq, | ||
9667 | static int fuse_read_single_forget(struct fuse_iqueue *fiq, | ||
9668 | struct fuse_copy_state *cs, | ||
9669 | size_t nbytes) | ||
9670 | -__releases(fiq->waitq.lock) | ||
9671 | +__releases(fiq->lock) | ||
9672 | { | ||
9673 | int err; | ||
9674 | struct fuse_forget_link *forget = dequeue_forget(fiq, 1, NULL); | ||
9675 | @@ -1220,7 +1220,7 @@ __releases(fiq->waitq.lock) | ||
9676 | .len = sizeof(ih) + sizeof(arg), | ||
9677 | }; | ||
9678 | |||
9679 | - spin_unlock(&fiq->waitq.lock); | ||
9680 | + spin_unlock(&fiq->lock); | ||
9681 | kfree(forget); | ||
9682 | if (nbytes < ih.len) | ||
9683 | return -EINVAL; | ||
9684 | @@ -1238,7 +1238,7 @@ __releases(fiq->waitq.lock) | ||
9685 | |||
9686 | static int fuse_read_batch_forget(struct fuse_iqueue *fiq, | ||
9687 | struct fuse_copy_state *cs, size_t nbytes) | ||
9688 | -__releases(fiq->waitq.lock) | ||
9689 | +__releases(fiq->lock) | ||
9690 | { | ||
9691 | int err; | ||
9692 | unsigned max_forgets; | ||
9693 | @@ -1252,13 +1252,13 @@ __releases(fiq->waitq.lock) | ||
9694 | }; | ||
9695 | |||
9696 | if (nbytes < ih.len) { | ||
9697 | - spin_unlock(&fiq->waitq.lock); | ||
9698 | + spin_unlock(&fiq->lock); | ||
9699 | return -EINVAL; | ||
9700 | } | ||
9701 | |||
9702 | max_forgets = (nbytes - ih.len) / sizeof(struct fuse_forget_one); | ||
9703 | head = dequeue_forget(fiq, max_forgets, &count); | ||
9704 | - spin_unlock(&fiq->waitq.lock); | ||
9705 | + spin_unlock(&fiq->lock); | ||
9706 | |||
9707 | arg.count = count; | ||
9708 | ih.len += count * sizeof(struct fuse_forget_one); | ||
9709 | @@ -1288,7 +1288,7 @@ __releases(fiq->waitq.lock) | ||
9710 | static int fuse_read_forget(struct fuse_conn *fc, struct fuse_iqueue *fiq, | ||
9711 | struct fuse_copy_state *cs, | ||
9712 | size_t nbytes) | ||
9713 | -__releases(fiq->waitq.lock) | ||
9714 | +__releases(fiq->lock) | ||
9715 | { | ||
9716 | if (fc->minor < 16 || fiq->forget_list_head.next->next == NULL) | ||
9717 | return fuse_read_single_forget(fiq, cs, nbytes); | ||
9718 | @@ -1318,16 +1318,19 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file, | ||
9719 | unsigned int hash; | ||
9720 | |||
9721 | restart: | ||
9722 | - spin_lock(&fiq->waitq.lock); | ||
9723 | - err = -EAGAIN; | ||
9724 | - if ((file->f_flags & O_NONBLOCK) && fiq->connected && | ||
9725 | - !request_pending(fiq)) | ||
9726 | - goto err_unlock; | ||
9727 | + for (;;) { | ||
9728 | + spin_lock(&fiq->lock); | ||
9729 | + if (!fiq->connected || request_pending(fiq)) | ||
9730 | + break; | ||
9731 | + spin_unlock(&fiq->lock); | ||
9732 | |||
9733 | - err = wait_event_interruptible_exclusive_locked(fiq->waitq, | ||
9734 | + if (file->f_flags & O_NONBLOCK) | ||
9735 | + return -EAGAIN; | ||
9736 | + err = wait_event_interruptible_exclusive(fiq->waitq, | ||
9737 | !fiq->connected || request_pending(fiq)); | ||
9738 | - if (err) | ||
9739 | - goto err_unlock; | ||
9740 | + if (err) | ||
9741 | + return err; | ||
9742 | + } | ||
9743 | |||
9744 | if (!fiq->connected) { | ||
9745 | err = fc->aborted ? -ECONNABORTED : -ENODEV; | ||
9746 | @@ -1351,7 +1354,7 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file, | ||
9747 | req = list_entry(fiq->pending.next, struct fuse_req, list); | ||
9748 | clear_bit(FR_PENDING, &req->flags); | ||
9749 | list_del_init(&req->list); | ||
9750 | - spin_unlock(&fiq->waitq.lock); | ||
9751 | + spin_unlock(&fiq->lock); | ||
9752 | |||
9753 | in = &req->in; | ||
9754 | reqsize = in->h.len; | ||
9755 | @@ -1409,7 +1412,7 @@ out_end: | ||
9756 | return err; | ||
9757 | |||
9758 | err_unlock: | ||
9759 | - spin_unlock(&fiq->waitq.lock); | ||
9760 | + spin_unlock(&fiq->lock); | ||
9761 | return err; | ||
9762 | } | ||
9763 | |||
9764 | @@ -2121,12 +2124,12 @@ static __poll_t fuse_dev_poll(struct file *file, poll_table *wait) | ||
9765 | fiq = &fud->fc->iq; | ||
9766 | poll_wait(file, &fiq->waitq, wait); | ||
9767 | |||
9768 | - spin_lock(&fiq->waitq.lock); | ||
9769 | + spin_lock(&fiq->lock); | ||
9770 | if (!fiq->connected) | ||
9771 | mask = EPOLLERR; | ||
9772 | else if (request_pending(fiq)) | ||
9773 | mask |= EPOLLIN | EPOLLRDNORM; | ||
9774 | - spin_unlock(&fiq->waitq.lock); | ||
9775 | + spin_unlock(&fiq->lock); | ||
9776 | |||
9777 | return mask; | ||
9778 | } | ||
9779 | @@ -2221,15 +2224,15 @@ void fuse_abort_conn(struct fuse_conn *fc) | ||
9780 | flush_bg_queue(fc); | ||
9781 | spin_unlock(&fc->bg_lock); | ||
9782 | |||
9783 | - spin_lock(&fiq->waitq.lock); | ||
9784 | + spin_lock(&fiq->lock); | ||
9785 | fiq->connected = 0; | ||
9786 | list_for_each_entry(req, &fiq->pending, list) | ||
9787 | clear_bit(FR_PENDING, &req->flags); | ||
9788 | list_splice_tail_init(&fiq->pending, &to_end); | ||
9789 | while (forget_pending(fiq)) | ||
9790 | kfree(dequeue_forget(fiq, 1, NULL)); | ||
9791 | - wake_up_all_locked(&fiq->waitq); | ||
9792 | - spin_unlock(&fiq->waitq.lock); | ||
9793 | + wake_up_all(&fiq->waitq); | ||
9794 | + spin_unlock(&fiq->lock); | ||
9795 | kill_fasync(&fiq->fasync, SIGIO, POLL_IN); | ||
9796 | end_polls(fc); | ||
9797 | wake_up_all(&fc->blocked_waitq); | ||
9798 | diff --git a/fs/fuse/file.c b/fs/fuse/file.c | ||
9799 | index 5ae2828beb00..91c99724dee0 100644 | ||
9800 | --- a/fs/fuse/file.c | ||
9801 | +++ b/fs/fuse/file.c | ||
9802 | @@ -1767,6 +1767,7 @@ static int fuse_writepage(struct page *page, struct writeback_control *wbc) | ||
9803 | WARN_ON(wbc->sync_mode == WB_SYNC_ALL); | ||
9804 | |||
9805 | redirty_page_for_writepage(wbc, page); | ||
9806 | + unlock_page(page); | ||
9807 | return 0; | ||
9808 | } | ||
9809 | |||
9810 | diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h | ||
9811 | index 24dbca777775..89bdc41e0d86 100644 | ||
9812 | --- a/fs/fuse/fuse_i.h | ||
9813 | +++ b/fs/fuse/fuse_i.h | ||
9814 | @@ -450,6 +450,9 @@ struct fuse_iqueue { | ||
9815 | /** Connection established */ | ||
9816 | unsigned connected; | ||
9817 | |||
9818 | + /** Lock protecting accesses to members of this structure */ | ||
9819 | + spinlock_t lock; | ||
9820 | + | ||
9821 | /** Readers of the connection are waiting on this */ | ||
9822 | wait_queue_head_t waitq; | ||
9823 | |||
9824 | diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c | ||
9825 | index 4bb885b0f032..987877860c01 100644 | ||
9826 | --- a/fs/fuse/inode.c | ||
9827 | +++ b/fs/fuse/inode.c | ||
9828 | @@ -582,6 +582,7 @@ static int fuse_show_options(struct seq_file *m, struct dentry *root) | ||
9829 | static void fuse_iqueue_init(struct fuse_iqueue *fiq) | ||
9830 | { | ||
9831 | memset(fiq, 0, sizeof(struct fuse_iqueue)); | ||
9832 | + spin_lock_init(&fiq->lock); | ||
9833 | init_waitqueue_head(&fiq->waitq); | ||
9834 | INIT_LIST_HEAD(&fiq->pending); | ||
9835 | INIT_LIST_HEAD(&fiq->interrupts); | ||
9836 | diff --git a/fs/fuse/readdir.c b/fs/fuse/readdir.c | ||
9837 | index 574d03f8a573..b2da3de6a78e 100644 | ||
9838 | --- a/fs/fuse/readdir.c | ||
9839 | +++ b/fs/fuse/readdir.c | ||
9840 | @@ -372,11 +372,13 @@ static enum fuse_parse_result fuse_parse_cache(struct fuse_file *ff, | ||
9841 | for (;;) { | ||
9842 | struct fuse_dirent *dirent = addr + offset; | ||
9843 | unsigned int nbytes = size - offset; | ||
9844 | - size_t reclen = FUSE_DIRENT_SIZE(dirent); | ||
9845 | + size_t reclen; | ||
9846 | |||
9847 | if (nbytes < FUSE_NAME_OFFSET || !dirent->namelen) | ||
9848 | break; | ||
9849 | |||
9850 | + reclen = FUSE_DIRENT_SIZE(dirent); /* derefs ->namelen */ | ||
9851 | + | ||
9852 | if (WARN_ON(dirent->namelen > FUSE_NAME_MAX)) | ||
9853 | return FOUND_ERR; | ||
9854 | if (WARN_ON(reclen > nbytes)) | ||
9855 | diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c | ||
9856 | index 4f8b5fd6c81f..b7ba5e194965 100644 | ||
9857 | --- a/fs/gfs2/bmap.c | ||
9858 | +++ b/fs/gfs2/bmap.c | ||
9859 | @@ -1680,6 +1680,7 @@ out_unlock: | ||
9860 | brelse(dibh); | ||
9861 | up_write(&ip->i_rw_mutex); | ||
9862 | gfs2_trans_end(sdp); | ||
9863 | + buf_in_tr = false; | ||
9864 | } | ||
9865 | gfs2_glock_dq_uninit(rd_gh); | ||
9866 | cond_resched(); | ||
9867 | diff --git a/fs/io_uring.c b/fs/io_uring.c | ||
9868 | index cfb48bd088e1..06d048341fa4 100644 | ||
9869 | --- a/fs/io_uring.c | ||
9870 | +++ b/fs/io_uring.c | ||
9871 | @@ -288,6 +288,7 @@ struct io_ring_ctx { | ||
9872 | struct sqe_submit { | ||
9873 | const struct io_uring_sqe *sqe; | ||
9874 | unsigned short index; | ||
9875 | + u32 sequence; | ||
9876 | bool has_user; | ||
9877 | bool needs_lock; | ||
9878 | bool needs_fixed_file; | ||
9879 | @@ -2040,7 +2041,7 @@ static int io_req_set_file(struct io_ring_ctx *ctx, const struct sqe_submit *s, | ||
9880 | |||
9881 | if (flags & IOSQE_IO_DRAIN) { | ||
9882 | req->flags |= REQ_F_IO_DRAIN; | ||
9883 | - req->sequence = ctx->cached_sq_head - 1; | ||
9884 | + req->sequence = s->sequence; | ||
9885 | } | ||
9886 | |||
9887 | if (!io_op_needs_file(s->sqe)) | ||
9888 | @@ -2247,6 +2248,7 @@ static bool io_get_sqring(struct io_ring_ctx *ctx, struct sqe_submit *s) | ||
9889 | if (head < ctx->sq_entries) { | ||
9890 | s->index = head; | ||
9891 | s->sqe = &ctx->sq_sqes[head]; | ||
9892 | + s->sequence = ctx->cached_sq_head; | ||
9893 | ctx->cached_sq_head++; | ||
9894 | return true; | ||
9895 | } | ||
9896 | diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c | ||
9897 | index cb8ec1f65c03..73c9775215b3 100644 | ||
9898 | --- a/fs/overlayfs/export.c | ||
9899 | +++ b/fs/overlayfs/export.c | ||
9900 | @@ -227,9 +227,8 @@ static int ovl_d_to_fh(struct dentry *dentry, char *buf, int buflen) | ||
9901 | /* Encode an upper or lower file handle */ | ||
9902 | fh = ovl_encode_real_fh(enc_lower ? ovl_dentry_lower(dentry) : | ||
9903 | ovl_dentry_upper(dentry), !enc_lower); | ||
9904 | - err = PTR_ERR(fh); | ||
9905 | if (IS_ERR(fh)) | ||
9906 | - goto fail; | ||
9907 | + return PTR_ERR(fh); | ||
9908 | |||
9909 | err = -EOVERFLOW; | ||
9910 | if (fh->len > buflen) | ||
9911 | diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c | ||
9912 | index 7663aeb85fa3..bc14781886bf 100644 | ||
9913 | --- a/fs/overlayfs/inode.c | ||
9914 | +++ b/fs/overlayfs/inode.c | ||
9915 | @@ -383,7 +383,8 @@ static bool ovl_can_list(const char *s) | ||
9916 | return true; | ||
9917 | |||
9918 | /* Never list trusted.overlay, list other trusted for superuser only */ | ||
9919 | - return !ovl_is_private_xattr(s) && capable(CAP_SYS_ADMIN); | ||
9920 | + return !ovl_is_private_xattr(s) && | ||
9921 | + ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN); | ||
9922 | } | ||
9923 | |||
9924 | ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) | ||
9925 | diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c | ||
9926 | index 28101bbc0b78..d952d5962e93 100644 | ||
9927 | --- a/fs/xfs/xfs_file.c | ||
9928 | +++ b/fs/xfs/xfs_file.c | ||
9929 | @@ -28,6 +28,7 @@ | ||
9930 | #include <linux/falloc.h> | ||
9931 | #include <linux/backing-dev.h> | ||
9932 | #include <linux/mman.h> | ||
9933 | +#include <linux/fadvise.h> | ||
9934 | |||
9935 | static const struct vm_operations_struct xfs_file_vm_ops; | ||
9936 | |||
9937 | @@ -933,6 +934,30 @@ out_unlock: | ||
9938 | return error; | ||
9939 | } | ||
9940 | |||
9941 | +STATIC int | ||
9942 | +xfs_file_fadvise( | ||
9943 | + struct file *file, | ||
9944 | + loff_t start, | ||
9945 | + loff_t end, | ||
9946 | + int advice) | ||
9947 | +{ | ||
9948 | + struct xfs_inode *ip = XFS_I(file_inode(file)); | ||
9949 | + int ret; | ||
9950 | + int lockflags = 0; | ||
9951 | + | ||
9952 | + /* | ||
9953 | + * Operations creating pages in page cache need protection from hole | ||
9954 | + * punching and similar ops | ||
9955 | + */ | ||
9956 | + if (advice == POSIX_FADV_WILLNEED) { | ||
9957 | + lockflags = XFS_IOLOCK_SHARED; | ||
9958 | + xfs_ilock(ip, lockflags); | ||
9959 | + } | ||
9960 | + ret = generic_fadvise(file, start, end, advice); | ||
9961 | + if (lockflags) | ||
9962 | + xfs_iunlock(ip, lockflags); | ||
9963 | + return ret; | ||
9964 | +} | ||
9965 | |||
9966 | STATIC loff_t | ||
9967 | xfs_file_remap_range( | ||
9968 | @@ -1232,6 +1257,7 @@ const struct file_operations xfs_file_operations = { | ||
9969 | .fsync = xfs_file_fsync, | ||
9970 | .get_unmapped_area = thp_get_unmapped_area, | ||
9971 | .fallocate = xfs_file_fallocate, | ||
9972 | + .fadvise = xfs_file_fadvise, | ||
9973 | .remap_file_range = xfs_file_remap_range, | ||
9974 | }; | ||
9975 | |||
9976 | diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h | ||
9977 | index 3fa1fa59f9b2..ab25e69a15d1 100644 | ||
9978 | --- a/include/linux/blk-mq.h | ||
9979 | +++ b/include/linux/blk-mq.h | ||
9980 | @@ -140,6 +140,7 @@ typedef int (poll_fn)(struct blk_mq_hw_ctx *); | ||
9981 | typedef int (map_queues_fn)(struct blk_mq_tag_set *set); | ||
9982 | typedef bool (busy_fn)(struct request_queue *); | ||
9983 | typedef void (complete_fn)(struct request *); | ||
9984 | +typedef void (cleanup_rq_fn)(struct request *); | ||
9985 | |||
9986 | |||
9987 | struct blk_mq_ops { | ||
9988 | @@ -200,6 +201,12 @@ struct blk_mq_ops { | ||
9989 | /* Called from inside blk_get_request() */ | ||
9990 | void (*initialize_rq_fn)(struct request *rq); | ||
9991 | |||
9992 | + /* | ||
9993 | + * Called before freeing one request which isn't completed yet, | ||
9994 | + * and usually for freeing the driver private data | ||
9995 | + */ | ||
9996 | + cleanup_rq_fn *cleanup_rq; | ||
9997 | + | ||
9998 | /* | ||
9999 | * If set, returns whether or not this queue currently is busy | ||
10000 | */ | ||
10001 | @@ -366,4 +373,10 @@ static inline blk_qc_t request_to_qc_t(struct blk_mq_hw_ctx *hctx, | ||
10002 | BLK_QC_T_INTERNAL; | ||
10003 | } | ||
10004 | |||
10005 | +static inline void blk_mq_cleanup_rq(struct request *rq) | ||
10006 | +{ | ||
10007 | + if (rq->q->mq_ops->cleanup_rq) | ||
10008 | + rq->q->mq_ops->cleanup_rq(rq); | ||
10009 | +} | ||
10010 | + | ||
10011 | #endif | ||
10012 | diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h | ||
10013 | index 1ef375dafb1c..ae51050c5094 100644 | ||
10014 | --- a/include/linux/blkdev.h | ||
10015 | +++ b/include/linux/blkdev.h | ||
10016 | @@ -202,9 +202,12 @@ struct request { | ||
10017 | #ifdef CONFIG_BLK_WBT | ||
10018 | unsigned short wbt_flags; | ||
10019 | #endif | ||
10020 | -#ifdef CONFIG_BLK_DEV_THROTTLING_LOW | ||
10021 | - unsigned short throtl_size; | ||
10022 | -#endif | ||
10023 | + /* | ||
10024 | + * rq sectors used for blk stats. It has the same value | ||
10025 | + * with blk_rq_sectors(rq), except that it never be zeroed | ||
10026 | + * by completion. | ||
10027 | + */ | ||
10028 | + unsigned short stats_sectors; | ||
10029 | |||
10030 | /* | ||
10031 | * Number of scatter-gather DMA addr+len pairs after | ||
10032 | @@ -903,6 +906,7 @@ static inline struct request_queue *bdev_get_queue(struct block_device *bdev) | ||
10033 | * blk_rq_err_bytes() : bytes left till the next error boundary | ||
10034 | * blk_rq_sectors() : sectors left in the entire request | ||
10035 | * blk_rq_cur_sectors() : sectors left in the current segment | ||
10036 | + * blk_rq_stats_sectors() : sectors of the entire request used for stats | ||
10037 | */ | ||
10038 | static inline sector_t blk_rq_pos(const struct request *rq) | ||
10039 | { | ||
10040 | @@ -931,6 +935,11 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq) | ||
10041 | return blk_rq_cur_bytes(rq) >> SECTOR_SHIFT; | ||
10042 | } | ||
10043 | |||
10044 | +static inline unsigned int blk_rq_stats_sectors(const struct request *rq) | ||
10045 | +{ | ||
10046 | + return rq->stats_sectors; | ||
10047 | +} | ||
10048 | + | ||
10049 | #ifdef CONFIG_BLK_DEV_ZONED | ||
10050 | static inline unsigned int blk_rq_zone_no(struct request *rq) | ||
10051 | { | ||
10052 | diff --git a/include/linux/bug.h b/include/linux/bug.h | ||
10053 | index fe5916550da8..f639bd0122f3 100644 | ||
10054 | --- a/include/linux/bug.h | ||
10055 | +++ b/include/linux/bug.h | ||
10056 | @@ -47,6 +47,11 @@ void generic_bug_clear_once(void); | ||
10057 | |||
10058 | #else /* !CONFIG_GENERIC_BUG */ | ||
10059 | |||
10060 | +static inline void *find_bug(unsigned long bugaddr) | ||
10061 | +{ | ||
10062 | + return NULL; | ||
10063 | +} | ||
10064 | + | ||
10065 | static inline enum bug_trap_type report_bug(unsigned long bug_addr, | ||
10066 | struct pt_regs *regs) | ||
10067 | { | ||
10068 | diff --git a/include/linux/fs.h b/include/linux/fs.h | ||
10069 | index 997a530ff4e9..bc1b40fb0db7 100644 | ||
10070 | --- a/include/linux/fs.h | ||
10071 | +++ b/include/linux/fs.h | ||
10072 | @@ -3531,6 +3531,8 @@ extern void inode_nohighmem(struct inode *inode); | ||
10073 | /* mm/fadvise.c */ | ||
10074 | extern int vfs_fadvise(struct file *file, loff_t offset, loff_t len, | ||
10075 | int advice); | ||
10076 | +extern int generic_fadvise(struct file *file, loff_t offset, loff_t len, | ||
10077 | + int advice); | ||
10078 | |||
10079 | #if defined(CONFIG_IO_URING) | ||
10080 | extern struct sock *io_uring_get_socket(struct file *file); | ||
10081 | diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h | ||
10082 | index 4a351cb7f20f..cf87c673cbb8 100644 | ||
10083 | --- a/include/linux/mmc/host.h | ||
10084 | +++ b/include/linux/mmc/host.h | ||
10085 | @@ -493,6 +493,15 @@ void mmc_command_done(struct mmc_host *host, struct mmc_request *mrq); | ||
10086 | |||
10087 | void mmc_cqe_request_done(struct mmc_host *host, struct mmc_request *mrq); | ||
10088 | |||
10089 | +/* | ||
10090 | + * May be called from host driver's system/runtime suspend/resume callbacks, | ||
10091 | + * to know if SDIO IRQs has been claimed. | ||
10092 | + */ | ||
10093 | +static inline bool sdio_irq_claimed(struct mmc_host *host) | ||
10094 | +{ | ||
10095 | + return host->sdio_irqs > 0; | ||
10096 | +} | ||
10097 | + | ||
10098 | static inline void mmc_signal_sdio_irq(struct mmc_host *host) | ||
10099 | { | ||
10100 | host->ops->enable_sdio_irq(host, 0); | ||
10101 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h | ||
10102 | index c842735a4f45..4b97f427cc92 100644 | ||
10103 | --- a/include/linux/pci_ids.h | ||
10104 | +++ b/include/linux/pci_ids.h | ||
10105 | @@ -548,6 +548,7 @@ | ||
10106 | #define PCI_DEVICE_ID_AMD_17H_DF_F3 0x1463 | ||
10107 | #define PCI_DEVICE_ID_AMD_17H_M10H_DF_F3 0x15eb | ||
10108 | #define PCI_DEVICE_ID_AMD_17H_M30H_DF_F3 0x1493 | ||
10109 | +#define PCI_DEVICE_ID_AMD_17H_M70H_DF_F3 0x1443 | ||
10110 | #define PCI_DEVICE_ID_AMD_CNB17H_F3 0x1703 | ||
10111 | #define PCI_DEVICE_ID_AMD_LANCE 0x2000 | ||
10112 | #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 | ||
10113 | diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h | ||
10114 | index dc905a4ff8d7..185d94829701 100644 | ||
10115 | --- a/include/linux/quotaops.h | ||
10116 | +++ b/include/linux/quotaops.h | ||
10117 | @@ -22,7 +22,7 @@ static inline struct quota_info *sb_dqopt(struct super_block *sb) | ||
10118 | /* i_mutex must being held */ | ||
10119 | static inline bool is_quota_modification(struct inode *inode, struct iattr *ia) | ||
10120 | { | ||
10121 | - return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) || | ||
10122 | + return (ia->ia_valid & ATTR_SIZE) || | ||
10123 | (ia->ia_valid & ATTR_UID && !uid_eq(ia->ia_uid, inode->i_uid)) || | ||
10124 | (ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid)); | ||
10125 | } | ||
10126 | diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h | ||
10127 | index 13e108bcc9eb..d783e15ba898 100644 | ||
10128 | --- a/include/linux/sunrpc/xprt.h | ||
10129 | +++ b/include/linux/sunrpc/xprt.h | ||
10130 | @@ -352,6 +352,7 @@ bool xprt_prepare_transmit(struct rpc_task *task); | ||
10131 | void xprt_request_enqueue_transmit(struct rpc_task *task); | ||
10132 | void xprt_request_enqueue_receive(struct rpc_task *task); | ||
10133 | void xprt_request_wait_receive(struct rpc_task *task); | ||
10134 | +void xprt_request_dequeue_xprt(struct rpc_task *task); | ||
10135 | bool xprt_request_need_retransmit(struct rpc_task *task); | ||
10136 | void xprt_transmit(struct rpc_task *task); | ||
10137 | void xprt_end_transmit(struct rpc_task *task); | ||
10138 | diff --git a/include/net/route.h b/include/net/route.h | ||
10139 | index dfce19c9fa96..6c516840380d 100644 | ||
10140 | --- a/include/net/route.h | ||
10141 | +++ b/include/net/route.h | ||
10142 | @@ -53,10 +53,11 @@ struct rtable { | ||
10143 | unsigned int rt_flags; | ||
10144 | __u16 rt_type; | ||
10145 | __u8 rt_is_input; | ||
10146 | - u8 rt_gw_family; | ||
10147 | + __u8 rt_uses_gateway; | ||
10148 | |||
10149 | int rt_iif; | ||
10150 | |||
10151 | + u8 rt_gw_family; | ||
10152 | /* Info on neighbour */ | ||
10153 | union { | ||
10154 | __be32 rt_gw4; | ||
10155 | diff --git a/kernel/jump_label.c b/kernel/jump_label.c | ||
10156 | index df3008419a1d..cdb3ffab128b 100644 | ||
10157 | --- a/kernel/jump_label.c | ||
10158 | +++ b/kernel/jump_label.c | ||
10159 | @@ -407,7 +407,9 @@ static bool jump_label_can_update(struct jump_entry *entry, bool init) | ||
10160 | return false; | ||
10161 | |||
10162 | if (!kernel_text_address(jump_entry_code(entry))) { | ||
10163 | - WARN_ONCE(1, "can't patch jump_label at %pS", (void *)jump_entry_code(entry)); | ||
10164 | + WARN_ONCE(!jump_entry_is_init(entry), | ||
10165 | + "can't patch jump_label at %pS", | ||
10166 | + (void *)jump_entry_code(entry)); | ||
10167 | return false; | ||
10168 | } | ||
10169 | |||
10170 | diff --git a/kernel/kprobes.c b/kernel/kprobes.c | ||
10171 | index d9770a5393c8..ebe8315a756a 100644 | ||
10172 | --- a/kernel/kprobes.c | ||
10173 | +++ b/kernel/kprobes.c | ||
10174 | @@ -1514,7 +1514,8 @@ static int check_kprobe_address_safe(struct kprobe *p, | ||
10175 | /* Ensure it is not in reserved area nor out of text */ | ||
10176 | if (!kernel_text_address((unsigned long) p->addr) || | ||
10177 | within_kprobe_blacklist((unsigned long) p->addr) || | ||
10178 | - jump_label_text_reserved(p->addr, p->addr)) { | ||
10179 | + jump_label_text_reserved(p->addr, p->addr) || | ||
10180 | + find_bug((unsigned long)p->addr)) { | ||
10181 | ret = -EINVAL; | ||
10182 | goto out; | ||
10183 | } | ||
10184 | diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c | ||
10185 | index 1888f6a3b694..424abf802f02 100644 | ||
10186 | --- a/kernel/printk/printk.c | ||
10187 | +++ b/kernel/printk/printk.c | ||
10188 | @@ -3274,7 +3274,7 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, | ||
10189 | /* move first record forward until length fits into the buffer */ | ||
10190 | seq = dumper->cur_seq; | ||
10191 | idx = dumper->cur_idx; | ||
10192 | - while (l > size && seq < dumper->next_seq) { | ||
10193 | + while (l >= size && seq < dumper->next_seq) { | ||
10194 | struct printk_log *msg = log_from_idx(idx); | ||
10195 | |||
10196 | l -= msg_print_text(msg, true, time, NULL, 0); | ||
10197 | diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c | ||
10198 | index a14e5fbbea46..5efdce756fdf 100644 | ||
10199 | --- a/kernel/rcu/tree.c | ||
10200 | +++ b/kernel/rcu/tree.c | ||
10201 | @@ -3234,13 +3234,13 @@ static int __init rcu_spawn_gp_kthread(void) | ||
10202 | t = kthread_create(rcu_gp_kthread, NULL, "%s", rcu_state.name); | ||
10203 | if (WARN_ONCE(IS_ERR(t), "%s: Could not start grace-period kthread, OOM is now expected behavior\n", __func__)) | ||
10204 | return 0; | ||
10205 | - rnp = rcu_get_root(); | ||
10206 | - raw_spin_lock_irqsave_rcu_node(rnp, flags); | ||
10207 | - rcu_state.gp_kthread = t; | ||
10208 | if (kthread_prio) { | ||
10209 | sp.sched_priority = kthread_prio; | ||
10210 | sched_setscheduler_nocheck(t, SCHED_FIFO, &sp); | ||
10211 | } | ||
10212 | + rnp = rcu_get_root(); | ||
10213 | + raw_spin_lock_irqsave_rcu_node(rnp, flags); | ||
10214 | + rcu_state.gp_kthread = t; | ||
10215 | raw_spin_unlock_irqrestore_rcu_node(rnp, flags); | ||
10216 | wake_up_process(t); | ||
10217 | rcu_spawn_nocb_kthreads(); | ||
10218 | diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h | ||
10219 | index af7e7b9c86af..513b403b683b 100644 | ||
10220 | --- a/kernel/rcu/tree_exp.h | ||
10221 | +++ b/kernel/rcu/tree_exp.h | ||
10222 | @@ -792,6 +792,7 @@ static int rcu_print_task_exp_stall(struct rcu_node *rnp) | ||
10223 | */ | ||
10224 | void synchronize_rcu_expedited(void) | ||
10225 | { | ||
10226 | + bool boottime = (rcu_scheduler_active == RCU_SCHEDULER_INIT); | ||
10227 | struct rcu_exp_work rew; | ||
10228 | struct rcu_node *rnp; | ||
10229 | unsigned long s; | ||
10230 | @@ -817,7 +818,7 @@ void synchronize_rcu_expedited(void) | ||
10231 | return; /* Someone else did our work for us. */ | ||
10232 | |||
10233 | /* Ensure that load happens before action based on it. */ | ||
10234 | - if (unlikely(rcu_scheduler_active == RCU_SCHEDULER_INIT)) { | ||
10235 | + if (unlikely(boottime)) { | ||
10236 | /* Direct call during scheduler init and early_initcalls(). */ | ||
10237 | rcu_exp_sel_wait_wake(s); | ||
10238 | } else { | ||
10239 | @@ -835,5 +836,8 @@ void synchronize_rcu_expedited(void) | ||
10240 | |||
10241 | /* Let the next expedited grace period start. */ | ||
10242 | mutex_unlock(&rcu_state.exp_mutex); | ||
10243 | + | ||
10244 | + if (likely(!boottime)) | ||
10245 | + destroy_work_on_stack(&rew.rew_work); | ||
10246 | } | ||
10247 | EXPORT_SYMBOL_GPL(synchronize_rcu_expedited); | ||
10248 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
10249 | index df9f1fe5689b..d38f007afea7 100644 | ||
10250 | --- a/kernel/sched/core.c | ||
10251 | +++ b/kernel/sched/core.c | ||
10252 | @@ -3486,8 +3486,36 @@ void scheduler_tick(void) | ||
10253 | |||
10254 | struct tick_work { | ||
10255 | int cpu; | ||
10256 | + atomic_t state; | ||
10257 | struct delayed_work work; | ||
10258 | }; | ||
10259 | +/* Values for ->state, see diagram below. */ | ||
10260 | +#define TICK_SCHED_REMOTE_OFFLINE 0 | ||
10261 | +#define TICK_SCHED_REMOTE_OFFLINING 1 | ||
10262 | +#define TICK_SCHED_REMOTE_RUNNING 2 | ||
10263 | + | ||
10264 | +/* | ||
10265 | + * State diagram for ->state: | ||
10266 | + * | ||
10267 | + * | ||
10268 | + * TICK_SCHED_REMOTE_OFFLINE | ||
10269 | + * | ^ | ||
10270 | + * | | | ||
10271 | + * | | sched_tick_remote() | ||
10272 | + * | | | ||
10273 | + * | | | ||
10274 | + * +--TICK_SCHED_REMOTE_OFFLINING | ||
10275 | + * | ^ | ||
10276 | + * | | | ||
10277 | + * sched_tick_start() | | sched_tick_stop() | ||
10278 | + * | | | ||
10279 | + * V | | ||
10280 | + * TICK_SCHED_REMOTE_RUNNING | ||
10281 | + * | ||
10282 | + * | ||
10283 | + * Other transitions get WARN_ON_ONCE(), except that sched_tick_remote() | ||
10284 | + * and sched_tick_start() are happy to leave the state in RUNNING. | ||
10285 | + */ | ||
10286 | |||
10287 | static struct tick_work __percpu *tick_work_cpu; | ||
10288 | |||
10289 | @@ -3500,6 +3528,7 @@ static void sched_tick_remote(struct work_struct *work) | ||
10290 | struct task_struct *curr; | ||
10291 | struct rq_flags rf; | ||
10292 | u64 delta; | ||
10293 | + int os; | ||
10294 | |||
10295 | /* | ||
10296 | * Handle the tick only if it appears the remote CPU is running in full | ||
10297 | @@ -3513,7 +3542,7 @@ static void sched_tick_remote(struct work_struct *work) | ||
10298 | |||
10299 | rq_lock_irq(rq, &rf); | ||
10300 | curr = rq->curr; | ||
10301 | - if (is_idle_task(curr)) | ||
10302 | + if (is_idle_task(curr) || cpu_is_offline(cpu)) | ||
10303 | goto out_unlock; | ||
10304 | |||
10305 | update_rq_clock(rq); | ||
10306 | @@ -3533,13 +3562,18 @@ out_requeue: | ||
10307 | /* | ||
10308 | * Run the remote tick once per second (1Hz). This arbitrary | ||
10309 | * frequency is large enough to avoid overload but short enough | ||
10310 | - * to keep scheduler internal stats reasonably up to date. | ||
10311 | + * to keep scheduler internal stats reasonably up to date. But | ||
10312 | + * first update state to reflect hotplug activity if required. | ||
10313 | */ | ||
10314 | - queue_delayed_work(system_unbound_wq, dwork, HZ); | ||
10315 | + os = atomic_fetch_add_unless(&twork->state, -1, TICK_SCHED_REMOTE_RUNNING); | ||
10316 | + WARN_ON_ONCE(os == TICK_SCHED_REMOTE_OFFLINE); | ||
10317 | + if (os == TICK_SCHED_REMOTE_RUNNING) | ||
10318 | + queue_delayed_work(system_unbound_wq, dwork, HZ); | ||
10319 | } | ||
10320 | |||
10321 | static void sched_tick_start(int cpu) | ||
10322 | { | ||
10323 | + int os; | ||
10324 | struct tick_work *twork; | ||
10325 | |||
10326 | if (housekeeping_cpu(cpu, HK_FLAG_TICK)) | ||
10327 | @@ -3548,15 +3582,20 @@ static void sched_tick_start(int cpu) | ||
10328 | WARN_ON_ONCE(!tick_work_cpu); | ||
10329 | |||
10330 | twork = per_cpu_ptr(tick_work_cpu, cpu); | ||
10331 | - twork->cpu = cpu; | ||
10332 | - INIT_DELAYED_WORK(&twork->work, sched_tick_remote); | ||
10333 | - queue_delayed_work(system_unbound_wq, &twork->work, HZ); | ||
10334 | + os = atomic_xchg(&twork->state, TICK_SCHED_REMOTE_RUNNING); | ||
10335 | + WARN_ON_ONCE(os == TICK_SCHED_REMOTE_RUNNING); | ||
10336 | + if (os == TICK_SCHED_REMOTE_OFFLINE) { | ||
10337 | + twork->cpu = cpu; | ||
10338 | + INIT_DELAYED_WORK(&twork->work, sched_tick_remote); | ||
10339 | + queue_delayed_work(system_unbound_wq, &twork->work, HZ); | ||
10340 | + } | ||
10341 | } | ||
10342 | |||
10343 | #ifdef CONFIG_HOTPLUG_CPU | ||
10344 | static void sched_tick_stop(int cpu) | ||
10345 | { | ||
10346 | struct tick_work *twork; | ||
10347 | + int os; | ||
10348 | |||
10349 | if (housekeeping_cpu(cpu, HK_FLAG_TICK)) | ||
10350 | return; | ||
10351 | @@ -3564,7 +3603,10 @@ static void sched_tick_stop(int cpu) | ||
10352 | WARN_ON_ONCE(!tick_work_cpu); | ||
10353 | |||
10354 | twork = per_cpu_ptr(tick_work_cpu, cpu); | ||
10355 | - cancel_delayed_work_sync(&twork->work); | ||
10356 | + /* There cannot be competing actions, but don't rely on stop-machine. */ | ||
10357 | + os = atomic_xchg(&twork->state, TICK_SCHED_REMOTE_OFFLINING); | ||
10358 | + WARN_ON_ONCE(os != TICK_SCHED_REMOTE_RUNNING); | ||
10359 | + /* Don't cancel, as this would mess up the state machine. */ | ||
10360 | } | ||
10361 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
10362 | |||
10363 | @@ -3572,7 +3614,6 @@ int __init sched_tick_offload_init(void) | ||
10364 | { | ||
10365 | tick_work_cpu = alloc_percpu(struct tick_work); | ||
10366 | BUG_ON(!tick_work_cpu); | ||
10367 | - | ||
10368 | return 0; | ||
10369 | } | ||
10370 | |||
10371 | @@ -6939,10 +6980,6 @@ static int cpu_cgroup_can_attach(struct cgroup_taskset *tset) | ||
10372 | #ifdef CONFIG_RT_GROUP_SCHED | ||
10373 | if (!sched_rt_can_attach(css_tg(css), task)) | ||
10374 | return -EINVAL; | ||
10375 | -#else | ||
10376 | - /* We don't support RT-tasks being in separate groups */ | ||
10377 | - if (task->sched_class != &fair_sched_class) | ||
10378 | - return -EINVAL; | ||
10379 | #endif | ||
10380 | /* | ||
10381 | * Serialize against wake_up_new_task() such that if its | ||
10382 | diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c | ||
10383 | index 867b4bb6d4be..b03ca2f73713 100644 | ||
10384 | --- a/kernel/sched/cpufreq_schedutil.c | ||
10385 | +++ b/kernel/sched/cpufreq_schedutil.c | ||
10386 | @@ -117,6 +117,7 @@ static void sugov_fast_switch(struct sugov_policy *sg_policy, u64 time, | ||
10387 | unsigned int next_freq) | ||
10388 | { | ||
10389 | struct cpufreq_policy *policy = sg_policy->policy; | ||
10390 | + int cpu; | ||
10391 | |||
10392 | if (!sugov_update_next_freq(sg_policy, time, next_freq)) | ||
10393 | return; | ||
10394 | @@ -126,7 +127,11 @@ static void sugov_fast_switch(struct sugov_policy *sg_policy, u64 time, | ||
10395 | return; | ||
10396 | |||
10397 | policy->cur = next_freq; | ||
10398 | - trace_cpu_frequency(next_freq, smp_processor_id()); | ||
10399 | + | ||
10400 | + if (trace_cpu_frequency_enabled()) { | ||
10401 | + for_each_cpu(cpu, policy->cpus) | ||
10402 | + trace_cpu_frequency(next_freq, cpu); | ||
10403 | + } | ||
10404 | } | ||
10405 | |||
10406 | static void sugov_deferred_update(struct sugov_policy *sg_policy, u64 time, | ||
10407 | diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c | ||
10408 | index 46122edd8552..20951112b6cd 100644 | ||
10409 | --- a/kernel/sched/deadline.c | ||
10410 | +++ b/kernel/sched/deadline.c | ||
10411 | @@ -529,6 +529,7 @@ static struct rq *find_lock_later_rq(struct task_struct *task, struct rq *rq); | ||
10412 | static struct rq *dl_task_offline_migration(struct rq *rq, struct task_struct *p) | ||
10413 | { | ||
10414 | struct rq *later_rq = NULL; | ||
10415 | + struct dl_bw *dl_b; | ||
10416 | |||
10417 | later_rq = find_lock_later_rq(p, rq); | ||
10418 | if (!later_rq) { | ||
10419 | @@ -557,6 +558,38 @@ static struct rq *dl_task_offline_migration(struct rq *rq, struct task_struct *p | ||
10420 | double_lock_balance(rq, later_rq); | ||
10421 | } | ||
10422 | |||
10423 | + if (p->dl.dl_non_contending || p->dl.dl_throttled) { | ||
10424 | + /* | ||
10425 | + * Inactive timer is armed (or callback is running, but | ||
10426 | + * waiting for us to release rq locks). In any case, when it | ||
10427 | + * will fire (or continue), it will see running_bw of this | ||
10428 | + * task migrated to later_rq (and correctly handle it). | ||
10429 | + */ | ||
10430 | + sub_running_bw(&p->dl, &rq->dl); | ||
10431 | + sub_rq_bw(&p->dl, &rq->dl); | ||
10432 | + | ||
10433 | + add_rq_bw(&p->dl, &later_rq->dl); | ||
10434 | + add_running_bw(&p->dl, &later_rq->dl); | ||
10435 | + } else { | ||
10436 | + sub_rq_bw(&p->dl, &rq->dl); | ||
10437 | + add_rq_bw(&p->dl, &later_rq->dl); | ||
10438 | + } | ||
10439 | + | ||
10440 | + /* | ||
10441 | + * And we finally need to fixup root_domain(s) bandwidth accounting, | ||
10442 | + * since p is still hanging out in the old (now moved to default) root | ||
10443 | + * domain. | ||
10444 | + */ | ||
10445 | + dl_b = &rq->rd->dl_bw; | ||
10446 | + raw_spin_lock(&dl_b->lock); | ||
10447 | + __dl_sub(dl_b, p->dl.dl_bw, cpumask_weight(rq->rd->span)); | ||
10448 | + raw_spin_unlock(&dl_b->lock); | ||
10449 | + | ||
10450 | + dl_b = &later_rq->rd->dl_bw; | ||
10451 | + raw_spin_lock(&dl_b->lock); | ||
10452 | + __dl_add(dl_b, p->dl.dl_bw, cpumask_weight(later_rq->rd->span)); | ||
10453 | + raw_spin_unlock(&dl_b->lock); | ||
10454 | + | ||
10455 | set_task_cpu(p, later_rq->cpu); | ||
10456 | double_unlock_balance(later_rq, rq); | ||
10457 | |||
10458 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c | ||
10459 | index 500f5db0de0b..86cfc5d5129c 100644 | ||
10460 | --- a/kernel/sched/fair.c | ||
10461 | +++ b/kernel/sched/fair.c | ||
10462 | @@ -9052,9 +9052,10 @@ more_balance: | ||
10463 | out_balanced: | ||
10464 | /* | ||
10465 | * We reach balance although we may have faced some affinity | ||
10466 | - * constraints. Clear the imbalance flag if it was set. | ||
10467 | + * constraints. Clear the imbalance flag only if other tasks got | ||
10468 | + * a chance to move and fix the imbalance. | ||
10469 | */ | ||
10470 | - if (sd_parent) { | ||
10471 | + if (sd_parent && !(env.flags & LBF_ALL_PINNED)) { | ||
10472 | int *group_imbalance = &sd_parent->groups->sgc->imbalance; | ||
10473 | |||
10474 | if (*group_imbalance) | ||
10475 | @@ -10300,18 +10301,18 @@ err: | ||
10476 | void online_fair_sched_group(struct task_group *tg) | ||
10477 | { | ||
10478 | struct sched_entity *se; | ||
10479 | + struct rq_flags rf; | ||
10480 | struct rq *rq; | ||
10481 | int i; | ||
10482 | |||
10483 | for_each_possible_cpu(i) { | ||
10484 | rq = cpu_rq(i); | ||
10485 | se = tg->se[i]; | ||
10486 | - | ||
10487 | - raw_spin_lock_irq(&rq->lock); | ||
10488 | + rq_lock_irq(rq, &rf); | ||
10489 | update_rq_clock(rq); | ||
10490 | attach_entity_cfs_rq(se); | ||
10491 | sync_throttle(tg, i); | ||
10492 | - raw_spin_unlock_irq(&rq->lock); | ||
10493 | + rq_unlock_irq(rq, &rf); | ||
10494 | } | ||
10495 | } | ||
10496 | |||
10497 | diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c | ||
10498 | index 80940939b733..e4bc4aa739b8 100644 | ||
10499 | --- a/kernel/sched/idle.c | ||
10500 | +++ b/kernel/sched/idle.c | ||
10501 | @@ -241,13 +241,14 @@ static void do_idle(void) | ||
10502 | check_pgt_cache(); | ||
10503 | rmb(); | ||
10504 | |||
10505 | + local_irq_disable(); | ||
10506 | + | ||
10507 | if (cpu_is_offline(cpu)) { | ||
10508 | - tick_nohz_idle_stop_tick_protected(); | ||
10509 | + tick_nohz_idle_stop_tick(); | ||
10510 | cpuhp_report_idle_dead(); | ||
10511 | arch_cpu_idle_dead(); | ||
10512 | } | ||
10513 | |||
10514 | - local_irq_disable(); | ||
10515 | arch_cpu_idle_enter(); | ||
10516 | |||
10517 | /* | ||
10518 | diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c | ||
10519 | index 6e52b67b420e..517e3719027e 100644 | ||
10520 | --- a/kernel/sched/psi.c | ||
10521 | +++ b/kernel/sched/psi.c | ||
10522 | @@ -1198,7 +1198,7 @@ static ssize_t psi_write(struct file *file, const char __user *user_buf, | ||
10523 | if (static_branch_likely(&psi_disabled)) | ||
10524 | return -EOPNOTSUPP; | ||
10525 | |||
10526 | - buf_size = min(nbytes, (sizeof(buf) - 1)); | ||
10527 | + buf_size = min(nbytes, sizeof(buf)); | ||
10528 | if (copy_from_user(buf, user_buf, buf_size)) | ||
10529 | return -EFAULT; | ||
10530 | |||
10531 | diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c | ||
10532 | index 57518efc3810..b7d75a9e8ccf 100644 | ||
10533 | --- a/kernel/time/alarmtimer.c | ||
10534 | +++ b/kernel/time/alarmtimer.c | ||
10535 | @@ -672,7 +672,7 @@ static int alarm_timer_create(struct k_itimer *new_timer) | ||
10536 | enum alarmtimer_type type; | ||
10537 | |||
10538 | if (!alarmtimer_get_rtcdev()) | ||
10539 | - return -ENOTSUPP; | ||
10540 | + return -EOPNOTSUPP; | ||
10541 | |||
10542 | if (!capable(CAP_WAKE_ALARM)) | ||
10543 | return -EPERM; | ||
10544 | @@ -790,7 +790,7 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags, | ||
10545 | int ret = 0; | ||
10546 | |||
10547 | if (!alarmtimer_get_rtcdev()) | ||
10548 | - return -ENOTSUPP; | ||
10549 | + return -EOPNOTSUPP; | ||
10550 | |||
10551 | if (flags & ~TIMER_ABSTIME) | ||
10552 | return -EINVAL; | ||
10553 | diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c | ||
10554 | index 0a426f4e3125..5bbad147a90c 100644 | ||
10555 | --- a/kernel/time/posix-cpu-timers.c | ||
10556 | +++ b/kernel/time/posix-cpu-timers.c | ||
10557 | @@ -375,7 +375,8 @@ static int posix_cpu_timer_del(struct k_itimer *timer) | ||
10558 | struct sighand_struct *sighand; | ||
10559 | struct task_struct *p = timer->it.cpu.task; | ||
10560 | |||
10561 | - WARN_ON_ONCE(p == NULL); | ||
10562 | + if (WARN_ON_ONCE(!p)) | ||
10563 | + return -EINVAL; | ||
10564 | |||
10565 | /* | ||
10566 | * Protect against sighand release/switch in exit/exec and process/ | ||
10567 | @@ -580,7 +581,8 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags, | ||
10568 | u64 old_expires, new_expires, old_incr, val; | ||
10569 | int ret; | ||
10570 | |||
10571 | - WARN_ON_ONCE(p == NULL); | ||
10572 | + if (WARN_ON_ONCE(!p)) | ||
10573 | + return -EINVAL; | ||
10574 | |||
10575 | /* | ||
10576 | * Use the to_ktime conversion because that clamps the maximum | ||
10577 | @@ -715,10 +717,11 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags, | ||
10578 | |||
10579 | static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec64 *itp) | ||
10580 | { | ||
10581 | - u64 now; | ||
10582 | struct task_struct *p = timer->it.cpu.task; | ||
10583 | + u64 now; | ||
10584 | |||
10585 | - WARN_ON_ONCE(p == NULL); | ||
10586 | + if (WARN_ON_ONCE(!p)) | ||
10587 | + return; | ||
10588 | |||
10589 | /* | ||
10590 | * Easy part: convert the reload time. | ||
10591 | @@ -1000,12 +1003,13 @@ static void check_process_timers(struct task_struct *tsk, | ||
10592 | */ | ||
10593 | static void posix_cpu_timer_rearm(struct k_itimer *timer) | ||
10594 | { | ||
10595 | + struct task_struct *p = timer->it.cpu.task; | ||
10596 | struct sighand_struct *sighand; | ||
10597 | unsigned long flags; | ||
10598 | - struct task_struct *p = timer->it.cpu.task; | ||
10599 | u64 now; | ||
10600 | |||
10601 | - WARN_ON_ONCE(p == NULL); | ||
10602 | + if (WARN_ON_ONCE(!p)) | ||
10603 | + return; | ||
10604 | |||
10605 | /* | ||
10606 | * Fetch the current sample and update the timer's expiry time. | ||
10607 | @@ -1202,7 +1206,9 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx, | ||
10608 | u64 now; | ||
10609 | int ret; | ||
10610 | |||
10611 | - WARN_ON_ONCE(clock_idx == CPUCLOCK_SCHED); | ||
10612 | + if (WARN_ON_ONCE(clock_idx >= CPUCLOCK_SCHED)) | ||
10613 | + return; | ||
10614 | + | ||
10615 | ret = cpu_timer_sample_group(clock_idx, tsk, &now); | ||
10616 | |||
10617 | if (oldval && ret != -EINVAL) { | ||
10618 | diff --git a/lib/lzo/lzo1x_compress.c b/lib/lzo/lzo1x_compress.c | ||
10619 | index ba16c08e8cb9..717c940112f9 100644 | ||
10620 | --- a/lib/lzo/lzo1x_compress.c | ||
10621 | +++ b/lib/lzo/lzo1x_compress.c | ||
10622 | @@ -83,17 +83,19 @@ next: | ||
10623 | ALIGN((uintptr_t)ir, 4)) && | ||
10624 | (ir < limit) && (*ir == 0)) | ||
10625 | ir++; | ||
10626 | - for (; (ir + 4) <= limit; ir += 4) { | ||
10627 | - dv = *((u32 *)ir); | ||
10628 | - if (dv) { | ||
10629 | + if (IS_ALIGNED((uintptr_t)ir, 4)) { | ||
10630 | + for (; (ir + 4) <= limit; ir += 4) { | ||
10631 | + dv = *((u32 *)ir); | ||
10632 | + if (dv) { | ||
10633 | # if defined(__LITTLE_ENDIAN) | ||
10634 | - ir += __builtin_ctz(dv) >> 3; | ||
10635 | + ir += __builtin_ctz(dv) >> 3; | ||
10636 | # elif defined(__BIG_ENDIAN) | ||
10637 | - ir += __builtin_clz(dv) >> 3; | ||
10638 | + ir += __builtin_clz(dv) >> 3; | ||
10639 | # else | ||
10640 | # error "missing endian definition" | ||
10641 | # endif | ||
10642 | - break; | ||
10643 | + break; | ||
10644 | + } | ||
10645 | } | ||
10646 | } | ||
10647 | #endif | ||
10648 | diff --git a/mm/compaction.c b/mm/compaction.c | ||
10649 | index 952dc2fb24e5..1e994920e6ff 100644 | ||
10650 | --- a/mm/compaction.c | ||
10651 | +++ b/mm/compaction.c | ||
10652 | @@ -2078,6 +2078,17 @@ compact_zone(struct compact_control *cc, struct capture_control *capc) | ||
10653 | const bool sync = cc->mode != MIGRATE_ASYNC; | ||
10654 | bool update_cached; | ||
10655 | |||
10656 | + /* | ||
10657 | + * These counters track activities during zone compaction. Initialize | ||
10658 | + * them before compacting a new zone. | ||
10659 | + */ | ||
10660 | + cc->total_migrate_scanned = 0; | ||
10661 | + cc->total_free_scanned = 0; | ||
10662 | + cc->nr_migratepages = 0; | ||
10663 | + cc->nr_freepages = 0; | ||
10664 | + INIT_LIST_HEAD(&cc->freepages); | ||
10665 | + INIT_LIST_HEAD(&cc->migratepages); | ||
10666 | + | ||
10667 | cc->migratetype = gfpflags_to_migratetype(cc->gfp_mask); | ||
10668 | ret = compaction_suitable(cc->zone, cc->order, cc->alloc_flags, | ||
10669 | cc->classzone_idx); | ||
10670 | @@ -2281,10 +2292,6 @@ static enum compact_result compact_zone_order(struct zone *zone, int order, | ||
10671 | { | ||
10672 | enum compact_result ret; | ||
10673 | struct compact_control cc = { | ||
10674 | - .nr_freepages = 0, | ||
10675 | - .nr_migratepages = 0, | ||
10676 | - .total_migrate_scanned = 0, | ||
10677 | - .total_free_scanned = 0, | ||
10678 | .order = order, | ||
10679 | .search_order = order, | ||
10680 | .gfp_mask = gfp_mask, | ||
10681 | @@ -2305,8 +2312,6 @@ static enum compact_result compact_zone_order(struct zone *zone, int order, | ||
10682 | |||
10683 | if (capture) | ||
10684 | current->capture_control = &capc; | ||
10685 | - INIT_LIST_HEAD(&cc.freepages); | ||
10686 | - INIT_LIST_HEAD(&cc.migratepages); | ||
10687 | |||
10688 | ret = compact_zone(&cc, &capc); | ||
10689 | |||
10690 | @@ -2408,8 +2413,6 @@ static void compact_node(int nid) | ||
10691 | struct zone *zone; | ||
10692 | struct compact_control cc = { | ||
10693 | .order = -1, | ||
10694 | - .total_migrate_scanned = 0, | ||
10695 | - .total_free_scanned = 0, | ||
10696 | .mode = MIGRATE_SYNC, | ||
10697 | .ignore_skip_hint = true, | ||
10698 | .whole_zone = true, | ||
10699 | @@ -2423,11 +2426,7 @@ static void compact_node(int nid) | ||
10700 | if (!populated_zone(zone)) | ||
10701 | continue; | ||
10702 | |||
10703 | - cc.nr_freepages = 0; | ||
10704 | - cc.nr_migratepages = 0; | ||
10705 | cc.zone = zone; | ||
10706 | - INIT_LIST_HEAD(&cc.freepages); | ||
10707 | - INIT_LIST_HEAD(&cc.migratepages); | ||
10708 | |||
10709 | compact_zone(&cc, NULL); | ||
10710 | |||
10711 | @@ -2529,8 +2528,6 @@ static void kcompactd_do_work(pg_data_t *pgdat) | ||
10712 | struct compact_control cc = { | ||
10713 | .order = pgdat->kcompactd_max_order, | ||
10714 | .search_order = pgdat->kcompactd_max_order, | ||
10715 | - .total_migrate_scanned = 0, | ||
10716 | - .total_free_scanned = 0, | ||
10717 | .classzone_idx = pgdat->kcompactd_classzone_idx, | ||
10718 | .mode = MIGRATE_SYNC_LIGHT, | ||
10719 | .ignore_skip_hint = false, | ||
10720 | @@ -2554,16 +2551,10 @@ static void kcompactd_do_work(pg_data_t *pgdat) | ||
10721 | COMPACT_CONTINUE) | ||
10722 | continue; | ||
10723 | |||
10724 | - cc.nr_freepages = 0; | ||
10725 | - cc.nr_migratepages = 0; | ||
10726 | - cc.total_migrate_scanned = 0; | ||
10727 | - cc.total_free_scanned = 0; | ||
10728 | - cc.zone = zone; | ||
10729 | - INIT_LIST_HEAD(&cc.freepages); | ||
10730 | - INIT_LIST_HEAD(&cc.migratepages); | ||
10731 | - | ||
10732 | if (kthread_should_stop()) | ||
10733 | return; | ||
10734 | + | ||
10735 | + cc.zone = zone; | ||
10736 | status = compact_zone(&cc, NULL); | ||
10737 | |||
10738 | if (status == COMPACT_SUCCESS) { | ||
10739 | diff --git a/mm/fadvise.c b/mm/fadvise.c | ||
10740 | index 467bcd032037..4f17c83db575 100644 | ||
10741 | --- a/mm/fadvise.c | ||
10742 | +++ b/mm/fadvise.c | ||
10743 | @@ -27,8 +27,7 @@ | ||
10744 | * deactivate the pages and clear PG_Referenced. | ||
10745 | */ | ||
10746 | |||
10747 | -static int generic_fadvise(struct file *file, loff_t offset, loff_t len, | ||
10748 | - int advice) | ||
10749 | +int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice) | ||
10750 | { | ||
10751 | struct inode *inode; | ||
10752 | struct address_space *mapping; | ||
10753 | @@ -178,6 +177,7 @@ static int generic_fadvise(struct file *file, loff_t offset, loff_t len, | ||
10754 | } | ||
10755 | return 0; | ||
10756 | } | ||
10757 | +EXPORT_SYMBOL(generic_fadvise); | ||
10758 | |||
10759 | int vfs_fadvise(struct file *file, loff_t offset, loff_t len, int advice) | ||
10760 | { | ||
10761 | diff --git a/mm/madvise.c b/mm/madvise.c | ||
10762 | index 968df3aa069f..bac973b9f2cc 100644 | ||
10763 | --- a/mm/madvise.c | ||
10764 | +++ b/mm/madvise.c | ||
10765 | @@ -14,6 +14,7 @@ | ||
10766 | #include <linux/userfaultfd_k.h> | ||
10767 | #include <linux/hugetlb.h> | ||
10768 | #include <linux/falloc.h> | ||
10769 | +#include <linux/fadvise.h> | ||
10770 | #include <linux/sched.h> | ||
10771 | #include <linux/ksm.h> | ||
10772 | #include <linux/fs.h> | ||
10773 | @@ -275,6 +276,7 @@ static long madvise_willneed(struct vm_area_struct *vma, | ||
10774 | unsigned long start, unsigned long end) | ||
10775 | { | ||
10776 | struct file *file = vma->vm_file; | ||
10777 | + loff_t offset; | ||
10778 | |||
10779 | *prev = vma; | ||
10780 | #ifdef CONFIG_SWAP | ||
10781 | @@ -298,12 +300,20 @@ static long madvise_willneed(struct vm_area_struct *vma, | ||
10782 | return 0; | ||
10783 | } | ||
10784 | |||
10785 | - start = ((start - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; | ||
10786 | - if (end > vma->vm_end) | ||
10787 | - end = vma->vm_end; | ||
10788 | - end = ((end - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; | ||
10789 | - | ||
10790 | - force_page_cache_readahead(file->f_mapping, file, start, end - start); | ||
10791 | + /* | ||
10792 | + * Filesystem's fadvise may need to take various locks. We need to | ||
10793 | + * explicitly grab a reference because the vma (and hence the | ||
10794 | + * vma's reference to the file) can go away as soon as we drop | ||
10795 | + * mmap_sem. | ||
10796 | + */ | ||
10797 | + *prev = NULL; /* tell sys_madvise we drop mmap_sem */ | ||
10798 | + get_file(file); | ||
10799 | + up_read(¤t->mm->mmap_sem); | ||
10800 | + offset = (loff_t)(start - vma->vm_start) | ||
10801 | + + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); | ||
10802 | + vfs_fadvise(file, offset, end - start, POSIX_FADV_WILLNEED); | ||
10803 | + fput(file); | ||
10804 | + down_read(¤t->mm->mmap_sem); | ||
10805 | return 0; | ||
10806 | } | ||
10807 | |||
10808 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
10809 | index 9ec5e12486a7..e18108b2b786 100644 | ||
10810 | --- a/mm/memcontrol.c | ||
10811 | +++ b/mm/memcontrol.c | ||
10812 | @@ -2821,6 +2821,16 @@ int __memcg_kmem_charge_memcg(struct page *page, gfp_t gfp, int order, | ||
10813 | |||
10814 | if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && | ||
10815 | !page_counter_try_charge(&memcg->kmem, nr_pages, &counter)) { | ||
10816 | + | ||
10817 | + /* | ||
10818 | + * Enforce __GFP_NOFAIL allocation because callers are not | ||
10819 | + * prepared to see failures and likely do not have any failure | ||
10820 | + * handling code. | ||
10821 | + */ | ||
10822 | + if (gfp & __GFP_NOFAIL) { | ||
10823 | + page_counter_charge(&memcg->kmem, nr_pages); | ||
10824 | + return 0; | ||
10825 | + } | ||
10826 | cancel_charge(memcg, nr_pages); | ||
10827 | return -ENOMEM; | ||
10828 | } | ||
10829 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c | ||
10830 | index eda2e2a0bdc6..26804abe99d6 100644 | ||
10831 | --- a/mm/oom_kill.c | ||
10832 | +++ b/mm/oom_kill.c | ||
10833 | @@ -1068,9 +1068,10 @@ bool out_of_memory(struct oom_control *oc) | ||
10834 | * The OOM killer does not compensate for IO-less reclaim. | ||
10835 | * pagefault_out_of_memory lost its gfp context so we have to | ||
10836 | * make sure exclude 0 mask - all other users should have at least | ||
10837 | - * ___GFP_DIRECT_RECLAIM to get here. | ||
10838 | + * ___GFP_DIRECT_RECLAIM to get here. But mem_cgroup_oom() has to | ||
10839 | + * invoke the OOM killer even if it is a GFP_NOFS allocation. | ||
10840 | */ | ||
10841 | - if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS)) | ||
10842 | + if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS) && !is_memcg_oom(oc)) | ||
10843 | return true; | ||
10844 | |||
10845 | /* | ||
10846 | diff --git a/mm/z3fold.c b/mm/z3fold.c | ||
10847 | index ed19d98c9dcd..05bdf90646e7 100644 | ||
10848 | --- a/mm/z3fold.c | ||
10849 | +++ b/mm/z3fold.c | ||
10850 | @@ -295,14 +295,11 @@ static void z3fold_unregister_migration(struct z3fold_pool *pool) | ||
10851 | } | ||
10852 | |||
10853 | /* Initializes the z3fold header of a newly allocated z3fold page */ | ||
10854 | -static struct z3fold_header *init_z3fold_page(struct page *page, | ||
10855 | +static struct z3fold_header *init_z3fold_page(struct page *page, bool headless, | ||
10856 | struct z3fold_pool *pool, gfp_t gfp) | ||
10857 | { | ||
10858 | struct z3fold_header *zhdr = page_address(page); | ||
10859 | - struct z3fold_buddy_slots *slots = alloc_slots(pool, gfp); | ||
10860 | - | ||
10861 | - if (!slots) | ||
10862 | - return NULL; | ||
10863 | + struct z3fold_buddy_slots *slots; | ||
10864 | |||
10865 | INIT_LIST_HEAD(&page->lru); | ||
10866 | clear_bit(PAGE_HEADLESS, &page->private); | ||
10867 | @@ -310,6 +307,12 @@ static struct z3fold_header *init_z3fold_page(struct page *page, | ||
10868 | clear_bit(NEEDS_COMPACTING, &page->private); | ||
10869 | clear_bit(PAGE_STALE, &page->private); | ||
10870 | clear_bit(PAGE_CLAIMED, &page->private); | ||
10871 | + if (headless) | ||
10872 | + return zhdr; | ||
10873 | + | ||
10874 | + slots = alloc_slots(pool, gfp); | ||
10875 | + if (!slots) | ||
10876 | + return NULL; | ||
10877 | |||
10878 | spin_lock_init(&zhdr->page_lock); | ||
10879 | kref_init(&zhdr->refcount); | ||
10880 | @@ -366,9 +369,10 @@ static inline int __idx(struct z3fold_header *zhdr, enum buddy bud) | ||
10881 | * Encodes the handle of a particular buddy within a z3fold page | ||
10882 | * Pool lock should be held as this function accesses first_num | ||
10883 | */ | ||
10884 | -static unsigned long encode_handle(struct z3fold_header *zhdr, enum buddy bud) | ||
10885 | +static unsigned long __encode_handle(struct z3fold_header *zhdr, | ||
10886 | + struct z3fold_buddy_slots *slots, | ||
10887 | + enum buddy bud) | ||
10888 | { | ||
10889 | - struct z3fold_buddy_slots *slots; | ||
10890 | unsigned long h = (unsigned long)zhdr; | ||
10891 | int idx = 0; | ||
10892 | |||
10893 | @@ -385,11 +389,15 @@ static unsigned long encode_handle(struct z3fold_header *zhdr, enum buddy bud) | ||
10894 | if (bud == LAST) | ||
10895 | h |= (zhdr->last_chunks << BUDDY_SHIFT); | ||
10896 | |||
10897 | - slots = zhdr->slots; | ||
10898 | slots->slot[idx] = h; | ||
10899 | return (unsigned long)&slots->slot[idx]; | ||
10900 | } | ||
10901 | |||
10902 | +static unsigned long encode_handle(struct z3fold_header *zhdr, enum buddy bud) | ||
10903 | +{ | ||
10904 | + return __encode_handle(zhdr, zhdr->slots, bud); | ||
10905 | +} | ||
10906 | + | ||
10907 | /* Returns the z3fold page where a given handle is stored */ | ||
10908 | static inline struct z3fold_header *handle_to_z3fold_header(unsigned long h) | ||
10909 | { | ||
10910 | @@ -624,6 +632,7 @@ static void do_compact_page(struct z3fold_header *zhdr, bool locked) | ||
10911 | } | ||
10912 | |||
10913 | if (unlikely(PageIsolated(page) || | ||
10914 | + test_bit(PAGE_CLAIMED, &page->private) || | ||
10915 | test_bit(PAGE_STALE, &page->private))) { | ||
10916 | z3fold_page_unlock(zhdr); | ||
10917 | return; | ||
10918 | @@ -924,7 +933,7 @@ retry: | ||
10919 | if (!page) | ||
10920 | return -ENOMEM; | ||
10921 | |||
10922 | - zhdr = init_z3fold_page(page, pool, gfp); | ||
10923 | + zhdr = init_z3fold_page(page, bud == HEADLESS, pool, gfp); | ||
10924 | if (!zhdr) { | ||
10925 | __free_page(page); | ||
10926 | return -ENOMEM; | ||
10927 | @@ -1100,6 +1109,7 @@ static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries) | ||
10928 | struct z3fold_header *zhdr = NULL; | ||
10929 | struct page *page = NULL; | ||
10930 | struct list_head *pos; | ||
10931 | + struct z3fold_buddy_slots slots; | ||
10932 | unsigned long first_handle = 0, middle_handle = 0, last_handle = 0; | ||
10933 | |||
10934 | spin_lock(&pool->lock); | ||
10935 | @@ -1118,16 +1128,22 @@ static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries) | ||
10936 | /* this bit could have been set by free, in which case | ||
10937 | * we pass over to the next page in the pool. | ||
10938 | */ | ||
10939 | - if (test_and_set_bit(PAGE_CLAIMED, &page->private)) | ||
10940 | + if (test_and_set_bit(PAGE_CLAIMED, &page->private)) { | ||
10941 | + page = NULL; | ||
10942 | continue; | ||
10943 | + } | ||
10944 | |||
10945 | - if (unlikely(PageIsolated(page))) | ||
10946 | + if (unlikely(PageIsolated(page))) { | ||
10947 | + clear_bit(PAGE_CLAIMED, &page->private); | ||
10948 | + page = NULL; | ||
10949 | continue; | ||
10950 | + } | ||
10951 | + zhdr = page_address(page); | ||
10952 | if (test_bit(PAGE_HEADLESS, &page->private)) | ||
10953 | break; | ||
10954 | |||
10955 | - zhdr = page_address(page); | ||
10956 | if (!z3fold_page_trylock(zhdr)) { | ||
10957 | + clear_bit(PAGE_CLAIMED, &page->private); | ||
10958 | zhdr = NULL; | ||
10959 | continue; /* can't evict at this point */ | ||
10960 | } | ||
10961 | @@ -1145,26 +1161,30 @@ static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries) | ||
10962 | |||
10963 | if (!test_bit(PAGE_HEADLESS, &page->private)) { | ||
10964 | /* | ||
10965 | - * We need encode the handles before unlocking, since | ||
10966 | - * we can race with free that will set | ||
10967 | - * (first|last)_chunks to 0 | ||
10968 | + * We need encode the handles before unlocking, and | ||
10969 | + * use our local slots structure because z3fold_free | ||
10970 | + * can zero out zhdr->slots and we can't do much | ||
10971 | + * about that | ||
10972 | */ | ||
10973 | first_handle = 0; | ||
10974 | last_handle = 0; | ||
10975 | middle_handle = 0; | ||
10976 | if (zhdr->first_chunks) | ||
10977 | - first_handle = encode_handle(zhdr, FIRST); | ||
10978 | + first_handle = __encode_handle(zhdr, &slots, | ||
10979 | + FIRST); | ||
10980 | if (zhdr->middle_chunks) | ||
10981 | - middle_handle = encode_handle(zhdr, MIDDLE); | ||
10982 | + middle_handle = __encode_handle(zhdr, &slots, | ||
10983 | + MIDDLE); | ||
10984 | if (zhdr->last_chunks) | ||
10985 | - last_handle = encode_handle(zhdr, LAST); | ||
10986 | + last_handle = __encode_handle(zhdr, &slots, | ||
10987 | + LAST); | ||
10988 | /* | ||
10989 | * it's safe to unlock here because we hold a | ||
10990 | * reference to this page | ||
10991 | */ | ||
10992 | z3fold_page_unlock(zhdr); | ||
10993 | } else { | ||
10994 | - first_handle = encode_handle(zhdr, HEADLESS); | ||
10995 | + first_handle = __encode_handle(zhdr, &slots, HEADLESS); | ||
10996 | last_handle = middle_handle = 0; | ||
10997 | } | ||
10998 | |||
10999 | @@ -1194,9 +1214,9 @@ next: | ||
11000 | spin_lock(&pool->lock); | ||
11001 | list_add(&page->lru, &pool->lru); | ||
11002 | spin_unlock(&pool->lock); | ||
11003 | + clear_bit(PAGE_CLAIMED, &page->private); | ||
11004 | } else { | ||
11005 | z3fold_page_lock(zhdr); | ||
11006 | - clear_bit(PAGE_CLAIMED, &page->private); | ||
11007 | if (kref_put(&zhdr->refcount, | ||
11008 | release_z3fold_page_locked)) { | ||
11009 | atomic64_dec(&pool->pages_nr); | ||
11010 | @@ -1211,6 +1231,7 @@ next: | ||
11011 | list_add(&page->lru, &pool->lru); | ||
11012 | spin_unlock(&pool->lock); | ||
11013 | z3fold_page_unlock(zhdr); | ||
11014 | + clear_bit(PAGE_CLAIMED, &page->private); | ||
11015 | } | ||
11016 | |||
11017 | /* We started off locked to we need to lock the pool back */ | ||
11018 | @@ -1315,7 +1336,8 @@ static bool z3fold_page_isolate(struct page *page, isolate_mode_t mode) | ||
11019 | VM_BUG_ON_PAGE(!PageMovable(page), page); | ||
11020 | VM_BUG_ON_PAGE(PageIsolated(page), page); | ||
11021 | |||
11022 | - if (test_bit(PAGE_HEADLESS, &page->private)) | ||
11023 | + if (test_bit(PAGE_HEADLESS, &page->private) || | ||
11024 | + test_bit(PAGE_CLAIMED, &page->private)) | ||
11025 | return false; | ||
11026 | |||
11027 | zhdr = page_address(page); | ||
11028 | diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c | ||
11029 | index a8cb6b2e20c1..5a203acdcae5 100644 | ||
11030 | --- a/net/appletalk/ddp.c | ||
11031 | +++ b/net/appletalk/ddp.c | ||
11032 | @@ -1023,6 +1023,11 @@ static int atalk_create(struct net *net, struct socket *sock, int protocol, | ||
11033 | */ | ||
11034 | if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) | ||
11035 | goto out; | ||
11036 | + | ||
11037 | + rc = -EPERM; | ||
11038 | + if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) | ||
11039 | + goto out; | ||
11040 | + | ||
11041 | rc = -ENOMEM; | ||
11042 | sk = sk_alloc(net, PF_APPLETALK, GFP_KERNEL, &ddp_proto, kern); | ||
11043 | if (!sk) | ||
11044 | diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c | ||
11045 | index ca5207767dc2..bb222b882b67 100644 | ||
11046 | --- a/net/ax25/af_ax25.c | ||
11047 | +++ b/net/ax25/af_ax25.c | ||
11048 | @@ -855,6 +855,8 @@ static int ax25_create(struct net *net, struct socket *sock, int protocol, | ||
11049 | break; | ||
11050 | |||
11051 | case SOCK_RAW: | ||
11052 | + if (!capable(CAP_NET_RAW)) | ||
11053 | + return -EPERM; | ||
11054 | break; | ||
11055 | default: | ||
11056 | return -ESOCKTNOSUPPORT; | ||
11057 | diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c | ||
11058 | index badc5cfe4dc6..d93d4531aa9b 100644 | ||
11059 | --- a/net/ieee802154/socket.c | ||
11060 | +++ b/net/ieee802154/socket.c | ||
11061 | @@ -1008,6 +1008,9 @@ static int ieee802154_create(struct net *net, struct socket *sock, | ||
11062 | |||
11063 | switch (sock->type) { | ||
11064 | case SOCK_RAW: | ||
11065 | + rc = -EPERM; | ||
11066 | + if (!capable(CAP_NET_RAW)) | ||
11067 | + goto out; | ||
11068 | proto = &ieee802154_raw_prot; | ||
11069 | ops = &ieee802154_raw_ops; | ||
11070 | break; | ||
11071 | diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c | ||
11072 | index f5c163d4771b..a9183543ca30 100644 | ||
11073 | --- a/net/ipv4/inet_connection_sock.c | ||
11074 | +++ b/net/ipv4/inet_connection_sock.c | ||
11075 | @@ -560,7 +560,7 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk, | ||
11076 | rt = ip_route_output_flow(net, fl4, sk); | ||
11077 | if (IS_ERR(rt)) | ||
11078 | goto no_route; | ||
11079 | - if (opt && opt->opt.is_strictroute && rt->rt_gw_family) | ||
11080 | + if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway) | ||
11081 | goto route_err; | ||
11082 | rcu_read_unlock(); | ||
11083 | return &rt->dst; | ||
11084 | @@ -598,7 +598,7 @@ struct dst_entry *inet_csk_route_child_sock(const struct sock *sk, | ||
11085 | rt = ip_route_output_flow(net, fl4, sk); | ||
11086 | if (IS_ERR(rt)) | ||
11087 | goto no_route; | ||
11088 | - if (opt && opt->opt.is_strictroute && rt->rt_gw_family) | ||
11089 | + if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway) | ||
11090 | goto route_err; | ||
11091 | return &rt->dst; | ||
11092 | |||
11093 | diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c | ||
11094 | index 06f6f280b9ff..00ec819f949b 100644 | ||
11095 | --- a/net/ipv4/ip_forward.c | ||
11096 | +++ b/net/ipv4/ip_forward.c | ||
11097 | @@ -123,7 +123,7 @@ int ip_forward(struct sk_buff *skb) | ||
11098 | |||
11099 | rt = skb_rtable(skb); | ||
11100 | |||
11101 | - if (opt->is_strictroute && rt->rt_gw_family) | ||
11102 | + if (opt->is_strictroute && rt->rt_uses_gateway) | ||
11103 | goto sr_failed; | ||
11104 | |||
11105 | IPCB(skb)->flags |= IPSKB_FORWARDED; | ||
11106 | diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c | ||
11107 | index cc7ef0d05bbd..da521790cd63 100644 | ||
11108 | --- a/net/ipv4/ip_output.c | ||
11109 | +++ b/net/ipv4/ip_output.c | ||
11110 | @@ -499,7 +499,7 @@ int __ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | ||
11111 | skb_dst_set_noref(skb, &rt->dst); | ||
11112 | |||
11113 | packet_routed: | ||
11114 | - if (inet_opt && inet_opt->opt.is_strictroute && rt->rt_gw_family) | ||
11115 | + if (inet_opt && inet_opt->opt.is_strictroute && rt->rt_uses_gateway) | ||
11116 | goto no_route; | ||
11117 | |||
11118 | /* OK, we know where to send it, allocate and build IP header. */ | ||
11119 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c | ||
11120 | index b6a6f18c3dd1..7dcce724c78b 100644 | ||
11121 | --- a/net/ipv4/route.c | ||
11122 | +++ b/net/ipv4/route.c | ||
11123 | @@ -635,6 +635,7 @@ static void fill_route_from_fnhe(struct rtable *rt, struct fib_nh_exception *fnh | ||
11124 | |||
11125 | if (fnhe->fnhe_gw) { | ||
11126 | rt->rt_flags |= RTCF_REDIRECTED; | ||
11127 | + rt->rt_uses_gateway = 1; | ||
11128 | rt->rt_gw_family = AF_INET; | ||
11129 | rt->rt_gw4 = fnhe->fnhe_gw; | ||
11130 | } | ||
11131 | @@ -1313,7 +1314,7 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst) | ||
11132 | mtu = READ_ONCE(dst->dev->mtu); | ||
11133 | |||
11134 | if (unlikely(ip_mtu_locked(dst))) { | ||
11135 | - if (rt->rt_gw_family && mtu > 576) | ||
11136 | + if (rt->rt_uses_gateway && mtu > 576) | ||
11137 | mtu = 576; | ||
11138 | } | ||
11139 | |||
11140 | @@ -1569,6 +1570,7 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr, | ||
11141 | struct fib_nh_common *nhc = FIB_RES_NHC(*res); | ||
11142 | |||
11143 | if (nhc->nhc_gw_family && nhc->nhc_scope == RT_SCOPE_LINK) { | ||
11144 | + rt->rt_uses_gateway = 1; | ||
11145 | rt->rt_gw_family = nhc->nhc_gw_family; | ||
11146 | /* only INET and INET6 are supported */ | ||
11147 | if (likely(nhc->nhc_gw_family == AF_INET)) | ||
11148 | @@ -1634,6 +1636,7 @@ struct rtable *rt_dst_alloc(struct net_device *dev, | ||
11149 | rt->rt_iif = 0; | ||
11150 | rt->rt_pmtu = 0; | ||
11151 | rt->rt_mtu_locked = 0; | ||
11152 | + rt->rt_uses_gateway = 0; | ||
11153 | rt->rt_gw_family = 0; | ||
11154 | rt->rt_gw4 = 0; | ||
11155 | INIT_LIST_HEAD(&rt->rt_uncached); | ||
11156 | @@ -2694,6 +2697,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or | ||
11157 | rt->rt_genid = rt_genid_ipv4(net); | ||
11158 | rt->rt_flags = ort->rt_flags; | ||
11159 | rt->rt_type = ort->rt_type; | ||
11160 | + rt->rt_uses_gateway = ort->rt_uses_gateway; | ||
11161 | rt->rt_gw_family = ort->rt_gw_family; | ||
11162 | if (rt->rt_gw_family == AF_INET) | ||
11163 | rt->rt_gw4 = ort->rt_gw4; | ||
11164 | @@ -2778,21 +2782,23 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, | ||
11165 | if (nla_put_in_addr(skb, RTA_PREFSRC, fl4->saddr)) | ||
11166 | goto nla_put_failure; | ||
11167 | } | ||
11168 | - if (rt->rt_gw_family == AF_INET && | ||
11169 | - nla_put_in_addr(skb, RTA_GATEWAY, rt->rt_gw4)) { | ||
11170 | - goto nla_put_failure; | ||
11171 | - } else if (rt->rt_gw_family == AF_INET6) { | ||
11172 | - int alen = sizeof(struct in6_addr); | ||
11173 | - struct nlattr *nla; | ||
11174 | - struct rtvia *via; | ||
11175 | - | ||
11176 | - nla = nla_reserve(skb, RTA_VIA, alen + 2); | ||
11177 | - if (!nla) | ||
11178 | + if (rt->rt_uses_gateway) { | ||
11179 | + if (rt->rt_gw_family == AF_INET && | ||
11180 | + nla_put_in_addr(skb, RTA_GATEWAY, rt->rt_gw4)) { | ||
11181 | goto nla_put_failure; | ||
11182 | - | ||
11183 | - via = nla_data(nla); | ||
11184 | - via->rtvia_family = AF_INET6; | ||
11185 | - memcpy(via->rtvia_addr, &rt->rt_gw6, alen); | ||
11186 | + } else if (rt->rt_gw_family == AF_INET6) { | ||
11187 | + int alen = sizeof(struct in6_addr); | ||
11188 | + struct nlattr *nla; | ||
11189 | + struct rtvia *via; | ||
11190 | + | ||
11191 | + nla = nla_reserve(skb, RTA_VIA, alen + 2); | ||
11192 | + if (!nla) | ||
11193 | + goto nla_put_failure; | ||
11194 | + | ||
11195 | + via = nla_data(nla); | ||
11196 | + via->rtvia_family = AF_INET6; | ||
11197 | + memcpy(via->rtvia_addr, &rt->rt_gw6, alen); | ||
11198 | + } | ||
11199 | } | ||
11200 | |||
11201 | expires = rt->dst.expires; | ||
11202 | diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c | ||
11203 | index 56be7d27f208..00ade9c185ea 100644 | ||
11204 | --- a/net/ipv4/tcp_bbr.c | ||
11205 | +++ b/net/ipv4/tcp_bbr.c | ||
11206 | @@ -386,7 +386,7 @@ static u32 bbr_bdp(struct sock *sk, u32 bw, int gain) | ||
11207 | * which allows 2 outstanding 2-packet sequences, to try to keep pipe | ||
11208 | * full even with ACK-every-other-packet delayed ACKs. | ||
11209 | */ | ||
11210 | -static u32 bbr_quantization_budget(struct sock *sk, u32 cwnd, int gain) | ||
11211 | +static u32 bbr_quantization_budget(struct sock *sk, u32 cwnd) | ||
11212 | { | ||
11213 | struct bbr *bbr = inet_csk_ca(sk); | ||
11214 | |||
11215 | @@ -397,7 +397,7 @@ static u32 bbr_quantization_budget(struct sock *sk, u32 cwnd, int gain) | ||
11216 | cwnd = (cwnd + 1) & ~1U; | ||
11217 | |||
11218 | /* Ensure gain cycling gets inflight above BDP even for small BDPs. */ | ||
11219 | - if (bbr->mode == BBR_PROBE_BW && gain > BBR_UNIT) | ||
11220 | + if (bbr->mode == BBR_PROBE_BW && bbr->cycle_idx == 0) | ||
11221 | cwnd += 2; | ||
11222 | |||
11223 | return cwnd; | ||
11224 | @@ -409,7 +409,7 @@ static u32 bbr_inflight(struct sock *sk, u32 bw, int gain) | ||
11225 | u32 inflight; | ||
11226 | |||
11227 | inflight = bbr_bdp(sk, bw, gain); | ||
11228 | - inflight = bbr_quantization_budget(sk, inflight, gain); | ||
11229 | + inflight = bbr_quantization_budget(sk, inflight); | ||
11230 | |||
11231 | return inflight; | ||
11232 | } | ||
11233 | @@ -529,7 +529,7 @@ static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs, | ||
11234 | * due to aggregation (of data and/or ACKs) visible in the ACK stream. | ||
11235 | */ | ||
11236 | target_cwnd += bbr_ack_aggregation_cwnd(sk); | ||
11237 | - target_cwnd = bbr_quantization_budget(sk, target_cwnd, gain); | ||
11238 | + target_cwnd = bbr_quantization_budget(sk, target_cwnd); | ||
11239 | |||
11240 | /* If we're below target cwnd, slow start cwnd toward target cwnd. */ | ||
11241 | if (bbr_full_bw_reached(sk)) /* only cut cwnd if we filled the pipe */ | ||
11242 | diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c | ||
11243 | index c801cd37cc2a..3e8b38c73d8c 100644 | ||
11244 | --- a/net/ipv4/tcp_timer.c | ||
11245 | +++ b/net/ipv4/tcp_timer.c | ||
11246 | @@ -210,7 +210,7 @@ static int tcp_write_timeout(struct sock *sk) | ||
11247 | struct inet_connection_sock *icsk = inet_csk(sk); | ||
11248 | struct tcp_sock *tp = tcp_sk(sk); | ||
11249 | struct net *net = sock_net(sk); | ||
11250 | - bool expired, do_reset; | ||
11251 | + bool expired = false, do_reset; | ||
11252 | int retry_until; | ||
11253 | |||
11254 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { | ||
11255 | @@ -242,9 +242,10 @@ static int tcp_write_timeout(struct sock *sk) | ||
11256 | if (tcp_out_of_resources(sk, do_reset)) | ||
11257 | return 1; | ||
11258 | } | ||
11259 | + } | ||
11260 | + if (!expired) | ||
11261 | expired = retransmits_timed_out(sk, retry_until, | ||
11262 | icsk->icsk_user_timeout); | ||
11263 | - } | ||
11264 | tcp_fastopen_active_detect_blackhole(sk, expired); | ||
11265 | |||
11266 | if (BPF_SOCK_OPS_TEST_FLAG(tp, BPF_SOCK_OPS_RTO_CB_FLAG)) | ||
11267 | diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c | ||
11268 | index cdef8f9a3b01..35b84b52b702 100644 | ||
11269 | --- a/net/ipv4/xfrm4_policy.c | ||
11270 | +++ b/net/ipv4/xfrm4_policy.c | ||
11271 | @@ -85,6 +85,7 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, | ||
11272 | xdst->u.rt.rt_flags = rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST | | ||
11273 | RTCF_LOCAL); | ||
11274 | xdst->u.rt.rt_type = rt->rt_type; | ||
11275 | + xdst->u.rt.rt_uses_gateway = rt->rt_uses_gateway; | ||
11276 | xdst->u.rt.rt_gw_family = rt->rt_gw_family; | ||
11277 | if (rt->rt_gw_family == AF_INET) | ||
11278 | xdst->u.rt.rt_gw4 = rt->rt_gw4; | ||
11279 | diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c | ||
11280 | index d22b6c140f23..f9e8fe3ff0c5 100644 | ||
11281 | --- a/net/ipv6/fib6_rules.c | ||
11282 | +++ b/net/ipv6/fib6_rules.c | ||
11283 | @@ -287,7 +287,8 @@ static bool fib6_rule_suppress(struct fib_rule *rule, struct fib_lookup_arg *arg | ||
11284 | return false; | ||
11285 | |||
11286 | suppress_route: | ||
11287 | - ip6_rt_put(rt); | ||
11288 | + if (!(arg->flags & FIB_LOOKUP_NOREF)) | ||
11289 | + ip6_rt_put(rt); | ||
11290 | return true; | ||
11291 | } | ||
11292 | |||
11293 | diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c | ||
11294 | index 87f47bc55c5e..6e2af411cd9c 100644 | ||
11295 | --- a/net/ipv6/ip6_fib.c | ||
11296 | +++ b/net/ipv6/ip6_fib.c | ||
11297 | @@ -318,7 +318,7 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, | ||
11298 | if (rt->dst.error == -EAGAIN) { | ||
11299 | ip6_rt_put_flags(rt, flags); | ||
11300 | rt = net->ipv6.ip6_null_entry; | ||
11301 | - if (!(flags | RT6_LOOKUP_F_DST_NOREF)) | ||
11302 | + if (!(flags & RT6_LOOKUP_F_DST_NOREF)) | ||
11303 | dst_hold(&rt->dst); | ||
11304 | } | ||
11305 | |||
11306 | diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c | ||
11307 | index 9b8742947aff..8dfea26536c9 100644 | ||
11308 | --- a/net/nfc/llcp_sock.c | ||
11309 | +++ b/net/nfc/llcp_sock.c | ||
11310 | @@ -1004,10 +1004,13 @@ static int llcp_sock_create(struct net *net, struct socket *sock, | ||
11311 | sock->type != SOCK_RAW) | ||
11312 | return -ESOCKTNOSUPPORT; | ||
11313 | |||
11314 | - if (sock->type == SOCK_RAW) | ||
11315 | + if (sock->type == SOCK_RAW) { | ||
11316 | + if (!capable(CAP_NET_RAW)) | ||
11317 | + return -EPERM; | ||
11318 | sock->ops = &llcp_rawsock_ops; | ||
11319 | - else | ||
11320 | + } else { | ||
11321 | sock->ops = &llcp_sock_ops; | ||
11322 | + } | ||
11323 | |||
11324 | sk = nfc_llcp_sock_alloc(sock, sock->type, GFP_ATOMIC, kern); | ||
11325 | if (sk == NULL) | ||
11326 | diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c | ||
11327 | index d01410e52097..f1e7041a5a60 100644 | ||
11328 | --- a/net/openvswitch/datapath.c | ||
11329 | +++ b/net/openvswitch/datapath.c | ||
11330 | @@ -2263,7 +2263,7 @@ static const struct nla_policy vport_policy[OVS_VPORT_ATTR_MAX + 1] = { | ||
11331 | [OVS_VPORT_ATTR_STATS] = { .len = sizeof(struct ovs_vport_stats) }, | ||
11332 | [OVS_VPORT_ATTR_PORT_NO] = { .type = NLA_U32 }, | ||
11333 | [OVS_VPORT_ATTR_TYPE] = { .type = NLA_U32 }, | ||
11334 | - [OVS_VPORT_ATTR_UPCALL_PID] = { .type = NLA_U32 }, | ||
11335 | + [OVS_VPORT_ATTR_UPCALL_PID] = { .type = NLA_UNSPEC }, | ||
11336 | [OVS_VPORT_ATTR_OPTIONS] = { .type = NLA_NESTED }, | ||
11337 | [OVS_VPORT_ATTR_IFINDEX] = { .type = NLA_U32 }, | ||
11338 | [OVS_VPORT_ATTR_NETNSID] = { .type = NLA_S32 }, | ||
11339 | diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c | ||
11340 | index 6c8b0f6d28f9..88f98f27ad88 100644 | ||
11341 | --- a/net/qrtr/qrtr.c | ||
11342 | +++ b/net/qrtr/qrtr.c | ||
11343 | @@ -150,6 +150,7 @@ static void __qrtr_node_release(struct kref *kref) | ||
11344 | list_del(&node->item); | ||
11345 | mutex_unlock(&qrtr_node_lock); | ||
11346 | |||
11347 | + cancel_work_sync(&node->work); | ||
11348 | skb_queue_purge(&node->rx_queue); | ||
11349 | kfree(node); | ||
11350 | } | ||
11351 | diff --git a/net/rds/bind.c b/net/rds/bind.c | ||
11352 | index 05464fd7c17a..93e336535d3b 100644 | ||
11353 | --- a/net/rds/bind.c | ||
11354 | +++ b/net/rds/bind.c | ||
11355 | @@ -244,7 +244,8 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | ||
11356 | */ | ||
11357 | if (rs->rs_transport) { | ||
11358 | trans = rs->rs_transport; | ||
11359 | - if (trans->laddr_check(sock_net(sock->sk), | ||
11360 | + if (!trans->laddr_check || | ||
11361 | + trans->laddr_check(sock_net(sock->sk), | ||
11362 | binding_addr, scope_id) != 0) { | ||
11363 | ret = -ENOPROTOOPT; | ||
11364 | goto out; | ||
11365 | @@ -263,6 +264,8 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | ||
11366 | |||
11367 | sock_set_flag(sk, SOCK_RCU_FREE); | ||
11368 | ret = rds_add_bound(rs, binding_addr, &port, scope_id); | ||
11369 | + if (ret) | ||
11370 | + rs->rs_transport = NULL; | ||
11371 | |||
11372 | out: | ||
11373 | release_sock(sk); | ||
11374 | diff --git a/net/sched/act_api.c b/net/sched/act_api.c | ||
11375 | index 339712296164..2558f00f6b3e 100644 | ||
11376 | --- a/net/sched/act_api.c | ||
11377 | +++ b/net/sched/act_api.c | ||
11378 | @@ -831,6 +831,15 @@ static struct tc_cookie *nla_memdup_cookie(struct nlattr **tb) | ||
11379 | return c; | ||
11380 | } | ||
11381 | |||
11382 | +static const struct nla_policy tcf_action_policy[TCA_ACT_MAX + 1] = { | ||
11383 | + [TCA_ACT_KIND] = { .type = NLA_NUL_STRING, | ||
11384 | + .len = IFNAMSIZ - 1 }, | ||
11385 | + [TCA_ACT_INDEX] = { .type = NLA_U32 }, | ||
11386 | + [TCA_ACT_COOKIE] = { .type = NLA_BINARY, | ||
11387 | + .len = TC_COOKIE_MAX_SIZE }, | ||
11388 | + [TCA_ACT_OPTIONS] = { .type = NLA_NESTED }, | ||
11389 | +}; | ||
11390 | + | ||
11391 | struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp, | ||
11392 | struct nlattr *nla, struct nlattr *est, | ||
11393 | char *name, int ovr, int bind, | ||
11394 | @@ -846,8 +855,8 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp, | ||
11395 | int err; | ||
11396 | |||
11397 | if (name == NULL) { | ||
11398 | - err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL, | ||
11399 | - extack); | ||
11400 | + err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, | ||
11401 | + tcf_action_policy, extack); | ||
11402 | if (err < 0) | ||
11403 | goto err_out; | ||
11404 | err = -EINVAL; | ||
11405 | @@ -856,18 +865,9 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp, | ||
11406 | NL_SET_ERR_MSG(extack, "TC action kind must be specified"); | ||
11407 | goto err_out; | ||
11408 | } | ||
11409 | - if (nla_strlcpy(act_name, kind, IFNAMSIZ) >= IFNAMSIZ) { | ||
11410 | - NL_SET_ERR_MSG(extack, "TC action name too long"); | ||
11411 | - goto err_out; | ||
11412 | - } | ||
11413 | - if (tb[TCA_ACT_COOKIE]) { | ||
11414 | - int cklen = nla_len(tb[TCA_ACT_COOKIE]); | ||
11415 | - | ||
11416 | - if (cklen > TC_COOKIE_MAX_SIZE) { | ||
11417 | - NL_SET_ERR_MSG(extack, "TC cookie size above the maximum"); | ||
11418 | - goto err_out; | ||
11419 | - } | ||
11420 | + nla_strlcpy(act_name, kind, IFNAMSIZ); | ||
11421 | |||
11422 | + if (tb[TCA_ACT_COOKIE]) { | ||
11423 | cookie = nla_memdup_cookie(tb); | ||
11424 | if (!cookie) { | ||
11425 | NL_SET_ERR_MSG(extack, "No memory to generate TC cookie"); | ||
11426 | @@ -1098,7 +1098,8 @@ static struct tc_action *tcf_action_get_1(struct net *net, struct nlattr *nla, | ||
11427 | int index; | ||
11428 | int err; | ||
11429 | |||
11430 | - err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL, extack); | ||
11431 | + err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, | ||
11432 | + tcf_action_policy, extack); | ||
11433 | if (err < 0) | ||
11434 | goto err_out; | ||
11435 | |||
11436 | @@ -1152,7 +1153,8 @@ static int tca_action_flush(struct net *net, struct nlattr *nla, | ||
11437 | |||
11438 | b = skb_tail_pointer(skb); | ||
11439 | |||
11440 | - err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, NULL, extack); | ||
11441 | + err = nla_parse_nested_deprecated(tb, TCA_ACT_MAX, nla, | ||
11442 | + tcf_action_policy, extack); | ||
11443 | if (err < 0) | ||
11444 | goto err_out; | ||
11445 | |||
11446 | @@ -1440,7 +1442,7 @@ static struct nlattr *find_dump_kind(struct nlattr **nla) | ||
11447 | |||
11448 | if (tb[1] == NULL) | ||
11449 | return NULL; | ||
11450 | - if (nla_parse_nested_deprecated(tb2, TCA_ACT_MAX, tb[1], NULL, NULL) < 0) | ||
11451 | + if (nla_parse_nested_deprecated(tb2, TCA_ACT_MAX, tb[1], tcf_action_policy, NULL) < 0) | ||
11452 | return NULL; | ||
11453 | kind = tb2[TCA_ACT_KIND]; | ||
11454 | |||
11455 | diff --git a/net/sched/act_sample.c b/net/sched/act_sample.c | ||
11456 | index 10229124a992..86344fd2ff1f 100644 | ||
11457 | --- a/net/sched/act_sample.c | ||
11458 | +++ b/net/sched/act_sample.c | ||
11459 | @@ -146,6 +146,7 @@ static bool tcf_sample_dev_ok_push(struct net_device *dev) | ||
11460 | case ARPHRD_TUNNEL6: | ||
11461 | case ARPHRD_SIT: | ||
11462 | case ARPHRD_IPGRE: | ||
11463 | + case ARPHRD_IP6GRE: | ||
11464 | case ARPHRD_VOID: | ||
11465 | case ARPHRD_NONE: | ||
11466 | return false; | ||
11467 | diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c | ||
11468 | index efd3cfb80a2a..9aef93300f1c 100644 | ||
11469 | --- a/net/sched/cls_api.c | ||
11470 | +++ b/net/sched/cls_api.c | ||
11471 | @@ -3027,8 +3027,10 @@ out: | ||
11472 | void tcf_exts_destroy(struct tcf_exts *exts) | ||
11473 | { | ||
11474 | #ifdef CONFIG_NET_CLS_ACT | ||
11475 | - tcf_action_destroy(exts->actions, TCA_ACT_UNBIND); | ||
11476 | - kfree(exts->actions); | ||
11477 | + if (exts->actions) { | ||
11478 | + tcf_action_destroy(exts->actions, TCA_ACT_UNBIND); | ||
11479 | + kfree(exts->actions); | ||
11480 | + } | ||
11481 | exts->nr_actions = 0; | ||
11482 | #endif | ||
11483 | } | ||
11484 | diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c | ||
11485 | index 1047825d9f48..81d58b280612 100644 | ||
11486 | --- a/net/sched/sch_api.c | ||
11487 | +++ b/net/sched/sch_api.c | ||
11488 | @@ -1390,7 +1390,8 @@ check_loop_fn(struct Qdisc *q, unsigned long cl, struct qdisc_walker *w) | ||
11489 | } | ||
11490 | |||
11491 | const struct nla_policy rtm_tca_policy[TCA_MAX + 1] = { | ||
11492 | - [TCA_KIND] = { .type = NLA_STRING }, | ||
11493 | + [TCA_KIND] = { .type = NLA_NUL_STRING, | ||
11494 | + .len = IFNAMSIZ - 1 }, | ||
11495 | [TCA_RATE] = { .type = NLA_BINARY, | ||
11496 | .len = sizeof(struct tc_estimator) }, | ||
11497 | [TCA_STAB] = { .type = NLA_NESTED }, | ||
11498 | diff --git a/net/sched/sch_cbs.c b/net/sched/sch_cbs.c | ||
11499 | index 810645b5c086..4a403d35438f 100644 | ||
11500 | --- a/net/sched/sch_cbs.c | ||
11501 | +++ b/net/sched/sch_cbs.c | ||
11502 | @@ -392,7 +392,6 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt, | ||
11503 | { | ||
11504 | struct cbs_sched_data *q = qdisc_priv(sch); | ||
11505 | struct net_device *dev = qdisc_dev(sch); | ||
11506 | - int err; | ||
11507 | |||
11508 | if (!opt) { | ||
11509 | NL_SET_ERR_MSG(extack, "Missing CBS qdisc options which are mandatory"); | ||
11510 | @@ -404,6 +403,10 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt, | ||
11511 | if (!q->qdisc) | ||
11512 | return -ENOMEM; | ||
11513 | |||
11514 | + spin_lock(&cbs_list_lock); | ||
11515 | + list_add(&q->cbs_list, &cbs_list); | ||
11516 | + spin_unlock(&cbs_list_lock); | ||
11517 | + | ||
11518 | qdisc_hash_add(q->qdisc, false); | ||
11519 | |||
11520 | q->queue = sch->dev_queue - netdev_get_tx_queue(dev, 0); | ||
11521 | @@ -413,17 +416,7 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt, | ||
11522 | |||
11523 | qdisc_watchdog_init(&q->watchdog, sch); | ||
11524 | |||
11525 | - err = cbs_change(sch, opt, extack); | ||
11526 | - if (err) | ||
11527 | - return err; | ||
11528 | - | ||
11529 | - if (!q->offload) { | ||
11530 | - spin_lock(&cbs_list_lock); | ||
11531 | - list_add(&q->cbs_list, &cbs_list); | ||
11532 | - spin_unlock(&cbs_list_lock); | ||
11533 | - } | ||
11534 | - | ||
11535 | - return 0; | ||
11536 | + return cbs_change(sch, opt, extack); | ||
11537 | } | ||
11538 | |||
11539 | static void cbs_destroy(struct Qdisc *sch) | ||
11540 | @@ -431,15 +424,18 @@ static void cbs_destroy(struct Qdisc *sch) | ||
11541 | struct cbs_sched_data *q = qdisc_priv(sch); | ||
11542 | struct net_device *dev = qdisc_dev(sch); | ||
11543 | |||
11544 | - spin_lock(&cbs_list_lock); | ||
11545 | - list_del(&q->cbs_list); | ||
11546 | - spin_unlock(&cbs_list_lock); | ||
11547 | + /* Nothing to do if we couldn't create the underlying qdisc */ | ||
11548 | + if (!q->qdisc) | ||
11549 | + return; | ||
11550 | |||
11551 | qdisc_watchdog_cancel(&q->watchdog); | ||
11552 | cbs_disable_offload(dev, q); | ||
11553 | |||
11554 | - if (q->qdisc) | ||
11555 | - qdisc_put(q->qdisc); | ||
11556 | + spin_lock(&cbs_list_lock); | ||
11557 | + list_del(&q->cbs_list); | ||
11558 | + spin_unlock(&cbs_list_lock); | ||
11559 | + | ||
11560 | + qdisc_put(q->qdisc); | ||
11561 | } | ||
11562 | |||
11563 | static int cbs_dump(struct Qdisc *sch, struct sk_buff *skb) | ||
11564 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c | ||
11565 | index b17f2ed970e2..f5cb35e550f8 100644 | ||
11566 | --- a/net/sched/sch_netem.c | ||
11567 | +++ b/net/sched/sch_netem.c | ||
11568 | @@ -777,7 +777,7 @@ static int get_dist_table(struct Qdisc *sch, struct disttable **tbl, | ||
11569 | struct disttable *d; | ||
11570 | int i; | ||
11571 | |||
11572 | - if (n > NETEM_DIST_MAX) | ||
11573 | + if (!n || n > NETEM_DIST_MAX) | ||
11574 | return -EINVAL; | ||
11575 | |||
11576 | d = kvmalloc(sizeof(struct disttable) + n * sizeof(s16), GFP_KERNEL); | ||
11577 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c | ||
11578 | index a07b516e503a..7a75f34ad393 100644 | ||
11579 | --- a/net/sunrpc/clnt.c | ||
11580 | +++ b/net/sunrpc/clnt.c | ||
11581 | @@ -1862,6 +1862,7 @@ rpc_xdr_encode(struct rpc_task *task) | ||
11582 | req->rq_rbuffer, | ||
11583 | req->rq_rcvsize); | ||
11584 | |||
11585 | + req->rq_reply_bytes_recvd = 0; | ||
11586 | req->rq_snd_buf.head[0].iov_len = 0; | ||
11587 | xdr_init_encode(&xdr, &req->rq_snd_buf, | ||
11588 | req->rq_snd_buf.head[0].iov_base, req); | ||
11589 | @@ -1881,6 +1882,8 @@ call_encode(struct rpc_task *task) | ||
11590 | if (!rpc_task_need_encode(task)) | ||
11591 | goto out; | ||
11592 | dprint_status(task); | ||
11593 | + /* Dequeue task from the receive queue while we're encoding */ | ||
11594 | + xprt_request_dequeue_xprt(task); | ||
11595 | /* Encode here so that rpcsec_gss can use correct sequence number. */ | ||
11596 | rpc_xdr_encode(task); | ||
11597 | /* Did the encode result in an error condition? */ | ||
11598 | @@ -2518,9 +2521,6 @@ call_decode(struct rpc_task *task) | ||
11599 | return; | ||
11600 | case -EAGAIN: | ||
11601 | task->tk_status = 0; | ||
11602 | - xdr_free_bvec(&req->rq_rcv_buf); | ||
11603 | - req->rq_reply_bytes_recvd = 0; | ||
11604 | - req->rq_rcv_buf.len = 0; | ||
11605 | if (task->tk_client->cl_discrtry) | ||
11606 | xprt_conditional_disconnect(req->rq_xprt, | ||
11607 | req->rq_connect_cookie); | ||
11608 | diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c | ||
11609 | index 48c93b9e525e..b256806d69cd 100644 | ||
11610 | --- a/net/sunrpc/xdr.c | ||
11611 | +++ b/net/sunrpc/xdr.c | ||
11612 | @@ -1237,16 +1237,29 @@ xdr_encode_word(struct xdr_buf *buf, unsigned int base, u32 obj) | ||
11613 | EXPORT_SYMBOL_GPL(xdr_encode_word); | ||
11614 | |||
11615 | /* If the netobj starting offset bytes from the start of xdr_buf is contained | ||
11616 | - * entirely in the head or the tail, set object to point to it; otherwise | ||
11617 | - * try to find space for it at the end of the tail, copy it there, and | ||
11618 | - * set obj to point to it. */ | ||
11619 | + * entirely in the head, pages, or tail, set object to point to it; otherwise | ||
11620 | + * shift the buffer until it is contained entirely within the pages or tail. | ||
11621 | + */ | ||
11622 | int xdr_buf_read_netobj(struct xdr_buf *buf, struct xdr_netobj *obj, unsigned int offset) | ||
11623 | { | ||
11624 | struct xdr_buf subbuf; | ||
11625 | + unsigned int boundary; | ||
11626 | |||
11627 | if (xdr_decode_word(buf, offset, &obj->len)) | ||
11628 | return -EFAULT; | ||
11629 | - if (xdr_buf_subsegment(buf, &subbuf, offset + 4, obj->len)) | ||
11630 | + offset += 4; | ||
11631 | + | ||
11632 | + /* Is the obj partially in the head? */ | ||
11633 | + boundary = buf->head[0].iov_len; | ||
11634 | + if (offset < boundary && (offset + obj->len) > boundary) | ||
11635 | + xdr_shift_buf(buf, boundary - offset); | ||
11636 | + | ||
11637 | + /* Is the obj partially in the pages? */ | ||
11638 | + boundary += buf->page_len; | ||
11639 | + if (offset < boundary && (offset + obj->len) > boundary) | ||
11640 | + xdr_shrink_pagelen(buf, boundary - offset); | ||
11641 | + | ||
11642 | + if (xdr_buf_subsegment(buf, &subbuf, offset, obj->len)) | ||
11643 | return -EFAULT; | ||
11644 | |||
11645 | /* Is the obj contained entirely in the head? */ | ||
11646 | @@ -1258,11 +1271,7 @@ int xdr_buf_read_netobj(struct xdr_buf *buf, struct xdr_netobj *obj, unsigned in | ||
11647 | if (subbuf.tail[0].iov_len == obj->len) | ||
11648 | return 0; | ||
11649 | |||
11650 | - /* use end of tail as storage for obj: | ||
11651 | - * (We don't copy to the beginning because then we'd have | ||
11652 | - * to worry about doing a potentially overlapping copy. | ||
11653 | - * This assumes the object is at most half the length of the | ||
11654 | - * tail.) */ | ||
11655 | + /* Find a contiguous area in @buf to hold all of @obj */ | ||
11656 | if (obj->len > buf->buflen - buf->len) | ||
11657 | return -ENOMEM; | ||
11658 | if (buf->tail[0].iov_len != 0) | ||
11659 | diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c | ||
11660 | index 2e71f5455c6c..20631d64312c 100644 | ||
11661 | --- a/net/sunrpc/xprt.c | ||
11662 | +++ b/net/sunrpc/xprt.c | ||
11663 | @@ -1323,6 +1323,36 @@ xprt_request_dequeue_transmit(struct rpc_task *task) | ||
11664 | spin_unlock(&xprt->queue_lock); | ||
11665 | } | ||
11666 | |||
11667 | +/** | ||
11668 | + * xprt_request_dequeue_xprt - remove a task from the transmit+receive queue | ||
11669 | + * @task: pointer to rpc_task | ||
11670 | + * | ||
11671 | + * Remove a task from the transmit and receive queues, and ensure that | ||
11672 | + * it is not pinned by the receive work item. | ||
11673 | + */ | ||
11674 | +void | ||
11675 | +xprt_request_dequeue_xprt(struct rpc_task *task) | ||
11676 | +{ | ||
11677 | + struct rpc_rqst *req = task->tk_rqstp; | ||
11678 | + struct rpc_xprt *xprt = req->rq_xprt; | ||
11679 | + | ||
11680 | + if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate) || | ||
11681 | + test_bit(RPC_TASK_NEED_RECV, &task->tk_runstate) || | ||
11682 | + xprt_is_pinned_rqst(req)) { | ||
11683 | + spin_lock(&xprt->queue_lock); | ||
11684 | + xprt_request_dequeue_transmit_locked(task); | ||
11685 | + xprt_request_dequeue_receive_locked(task); | ||
11686 | + while (xprt_is_pinned_rqst(req)) { | ||
11687 | + set_bit(RPC_TASK_MSG_PIN_WAIT, &task->tk_runstate); | ||
11688 | + spin_unlock(&xprt->queue_lock); | ||
11689 | + xprt_wait_on_pinned_rqst(req); | ||
11690 | + spin_lock(&xprt->queue_lock); | ||
11691 | + clear_bit(RPC_TASK_MSG_PIN_WAIT, &task->tk_runstate); | ||
11692 | + } | ||
11693 | + spin_unlock(&xprt->queue_lock); | ||
11694 | + } | ||
11695 | +} | ||
11696 | + | ||
11697 | /** | ||
11698 | * xprt_request_prepare - prepare an encoded request for transport | ||
11699 | * @req: pointer to rpc_rqst | ||
11700 | @@ -1747,28 +1777,6 @@ void xprt_retry_reserve(struct rpc_task *task) | ||
11701 | xprt_do_reserve(xprt, task); | ||
11702 | } | ||
11703 | |||
11704 | -static void | ||
11705 | -xprt_request_dequeue_all(struct rpc_task *task, struct rpc_rqst *req) | ||
11706 | -{ | ||
11707 | - struct rpc_xprt *xprt = req->rq_xprt; | ||
11708 | - | ||
11709 | - if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate) || | ||
11710 | - test_bit(RPC_TASK_NEED_RECV, &task->tk_runstate) || | ||
11711 | - xprt_is_pinned_rqst(req)) { | ||
11712 | - spin_lock(&xprt->queue_lock); | ||
11713 | - xprt_request_dequeue_transmit_locked(task); | ||
11714 | - xprt_request_dequeue_receive_locked(task); | ||
11715 | - while (xprt_is_pinned_rqst(req)) { | ||
11716 | - set_bit(RPC_TASK_MSG_PIN_WAIT, &task->tk_runstate); | ||
11717 | - spin_unlock(&xprt->queue_lock); | ||
11718 | - xprt_wait_on_pinned_rqst(req); | ||
11719 | - spin_lock(&xprt->queue_lock); | ||
11720 | - clear_bit(RPC_TASK_MSG_PIN_WAIT, &task->tk_runstate); | ||
11721 | - } | ||
11722 | - spin_unlock(&xprt->queue_lock); | ||
11723 | - } | ||
11724 | -} | ||
11725 | - | ||
11726 | /** | ||
11727 | * xprt_release - release an RPC request slot | ||
11728 | * @task: task which is finished with the slot | ||
11729 | @@ -1788,7 +1796,7 @@ void xprt_release(struct rpc_task *task) | ||
11730 | } | ||
11731 | |||
11732 | xprt = req->rq_xprt; | ||
11733 | - xprt_request_dequeue_all(task, req); | ||
11734 | + xprt_request_dequeue_xprt(task); | ||
11735 | spin_lock(&xprt->transport_lock); | ||
11736 | xprt->ops->release_xprt(xprt, task); | ||
11737 | if (xprt->ops->release_request) | ||
11738 | diff --git a/net/wireless/util.c b/net/wireless/util.c | ||
11739 | index e74837824cea..f68818dbac1a 100644 | ||
11740 | --- a/net/wireless/util.c | ||
11741 | +++ b/net/wireless/util.c | ||
11742 | @@ -960,6 +960,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev, | ||
11743 | } | ||
11744 | |||
11745 | cfg80211_process_rdev_events(rdev); | ||
11746 | + cfg80211_mlme_purge_registrations(dev->ieee80211_ptr); | ||
11747 | } | ||
11748 | |||
11749 | err = rdev_change_virtual_intf(rdev, dev, ntype, params); | ||
11750 | diff --git a/scripts/Makefile.kasan b/scripts/Makefile.kasan | ||
11751 | index 6410bd22fe38..03757cc60e06 100644 | ||
11752 | --- a/scripts/Makefile.kasan | ||
11753 | +++ b/scripts/Makefile.kasan | ||
11754 | @@ -1,4 +1,9 @@ | ||
11755 | # SPDX-License-Identifier: GPL-2.0 | ||
11756 | +ifdef CONFIG_KASAN | ||
11757 | +CFLAGS_KASAN_NOSANITIZE := -fno-builtin | ||
11758 | +KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET) | ||
11759 | +endif | ||
11760 | + | ||
11761 | ifdef CONFIG_KASAN_GENERIC | ||
11762 | |||
11763 | ifdef CONFIG_KASAN_INLINE | ||
11764 | @@ -7,8 +12,6 @@ else | ||
11765 | call_threshold := 0 | ||
11766 | endif | ||
11767 | |||
11768 | -KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET) | ||
11769 | - | ||
11770 | CFLAGS_KASAN_MINIMAL := -fsanitize=kernel-address | ||
11771 | |||
11772 | cc-param = $(call cc-option, -mllvm -$(1), $(call cc-option, --param $(1))) | ||
11773 | @@ -45,7 +48,3 @@ CFLAGS_KASAN := -fsanitize=kernel-hwaddress \ | ||
11774 | $(instrumentation_flags) | ||
11775 | |||
11776 | endif # CONFIG_KASAN_SW_TAGS | ||
11777 | - | ||
11778 | -ifdef CONFIG_KASAN | ||
11779 | -CFLAGS_KASAN_NOSANITIZE := -fno-builtin | ||
11780 | -endif | ||
11781 | diff --git a/scripts/gcc-plugins/randomize_layout_plugin.c b/scripts/gcc-plugins/randomize_layout_plugin.c | ||
11782 | index 6d5bbd31db7f..bd29e4e7a524 100644 | ||
11783 | --- a/scripts/gcc-plugins/randomize_layout_plugin.c | ||
11784 | +++ b/scripts/gcc-plugins/randomize_layout_plugin.c | ||
11785 | @@ -443,13 +443,13 @@ static int is_pure_ops_struct(const_tree node) | ||
11786 | if (node == fieldtype) | ||
11787 | continue; | ||
11788 | |||
11789 | - if (!is_fptr(fieldtype)) | ||
11790 | - return 0; | ||
11791 | - | ||
11792 | - if (code != RECORD_TYPE && code != UNION_TYPE) | ||
11793 | + if (code == RECORD_TYPE || code == UNION_TYPE) { | ||
11794 | + if (!is_pure_ops_struct(fieldtype)) | ||
11795 | + return 0; | ||
11796 | continue; | ||
11797 | + } | ||
11798 | |||
11799 | - if (!is_pure_ops_struct(fieldtype)) | ||
11800 | + if (!is_fptr(fieldtype)) | ||
11801 | return 0; | ||
11802 | } | ||
11803 | |||
11804 | diff --git a/security/keys/trusted.c b/security/keys/trusted.c | ||
11805 | index ade699131065..1fbd77816610 100644 | ||
11806 | --- a/security/keys/trusted.c | ||
11807 | +++ b/security/keys/trusted.c | ||
11808 | @@ -1228,11 +1228,16 @@ hashalg_fail: | ||
11809 | |||
11810 | static int __init init_digests(void) | ||
11811 | { | ||
11812 | + int i; | ||
11813 | + | ||
11814 | digests = kcalloc(chip->nr_allocated_banks, sizeof(*digests), | ||
11815 | GFP_KERNEL); | ||
11816 | if (!digests) | ||
11817 | return -ENOMEM; | ||
11818 | |||
11819 | + for (i = 0; i < chip->nr_allocated_banks; i++) | ||
11820 | + digests[i].alg_id = chip->allocated_banks[i].alg_id; | ||
11821 | + | ||
11822 | return 0; | ||
11823 | } | ||
11824 | |||
11825 | diff --git a/sound/firewire/motu/motu.c b/sound/firewire/motu/motu.c | ||
11826 | index 03cda2166ea3..72908b4de77c 100644 | ||
11827 | --- a/sound/firewire/motu/motu.c | ||
11828 | +++ b/sound/firewire/motu/motu.c | ||
11829 | @@ -247,6 +247,17 @@ static const struct snd_motu_spec motu_audio_express = { | ||
11830 | .analog_out_ports = 4, | ||
11831 | }; | ||
11832 | |||
11833 | +static const struct snd_motu_spec motu_4pre = { | ||
11834 | + .name = "4pre", | ||
11835 | + .protocol = &snd_motu_protocol_v3, | ||
11836 | + .flags = SND_MOTU_SPEC_SUPPORT_CLOCK_X2 | | ||
11837 | + SND_MOTU_SPEC_TX_MICINST_CHUNK | | ||
11838 | + SND_MOTU_SPEC_TX_RETURN_CHUNK | | ||
11839 | + SND_MOTU_SPEC_RX_SEPARETED_MAIN, | ||
11840 | + .analog_in_ports = 2, | ||
11841 | + .analog_out_ports = 2, | ||
11842 | +}; | ||
11843 | + | ||
11844 | #define SND_MOTU_DEV_ENTRY(model, data) \ | ||
11845 | { \ | ||
11846 | .match_flags = IEEE1394_MATCH_VENDOR_ID | \ | ||
11847 | @@ -265,6 +276,7 @@ static const struct ieee1394_device_id motu_id_table[] = { | ||
11848 | SND_MOTU_DEV_ENTRY(0x000015, &motu_828mk3), /* FireWire only. */ | ||
11849 | SND_MOTU_DEV_ENTRY(0x000035, &motu_828mk3), /* Hybrid. */ | ||
11850 | SND_MOTU_DEV_ENTRY(0x000033, &motu_audio_express), | ||
11851 | + SND_MOTU_DEV_ENTRY(0x000045, &motu_4pre), | ||
11852 | { } | ||
11853 | }; | ||
11854 | MODULE_DEVICE_TABLE(ieee1394, motu_id_table); | ||
11855 | diff --git a/sound/firewire/tascam/tascam-pcm.c b/sound/firewire/tascam/tascam-pcm.c | ||
11856 | index b5ced5415e40..2377732caa52 100644 | ||
11857 | --- a/sound/firewire/tascam/tascam-pcm.c | ||
11858 | +++ b/sound/firewire/tascam/tascam-pcm.c | ||
11859 | @@ -56,6 +56,9 @@ static int pcm_open(struct snd_pcm_substream *substream) | ||
11860 | goto err_locked; | ||
11861 | |||
11862 | err = snd_tscm_stream_get_clock(tscm, &clock); | ||
11863 | + if (err < 0) | ||
11864 | + goto err_locked; | ||
11865 | + | ||
11866 | if (clock != SND_TSCM_CLOCK_INTERNAL || | ||
11867 | amdtp_stream_pcm_running(&tscm->rx_stream) || | ||
11868 | amdtp_stream_pcm_running(&tscm->tx_stream)) { | ||
11869 | diff --git a/sound/firewire/tascam/tascam-stream.c b/sound/firewire/tascam/tascam-stream.c | ||
11870 | index e852e46ebe6f..ccfa92fbc145 100644 | ||
11871 | --- a/sound/firewire/tascam/tascam-stream.c | ||
11872 | +++ b/sound/firewire/tascam/tascam-stream.c | ||
11873 | @@ -8,20 +8,37 @@ | ||
11874 | #include <linux/delay.h> | ||
11875 | #include "tascam.h" | ||
11876 | |||
11877 | +#define CLOCK_STATUS_MASK 0xffff0000 | ||
11878 | +#define CLOCK_CONFIG_MASK 0x0000ffff | ||
11879 | + | ||
11880 | #define CALLBACK_TIMEOUT 500 | ||
11881 | |||
11882 | static int get_clock(struct snd_tscm *tscm, u32 *data) | ||
11883 | { | ||
11884 | + int trial = 0; | ||
11885 | __be32 reg; | ||
11886 | int err; | ||
11887 | |||
11888 | - err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, | ||
11889 | - TSCM_ADDR_BASE + TSCM_OFFSET_CLOCK_STATUS, | ||
11890 | - ®, sizeof(reg), 0); | ||
11891 | - if (err >= 0) | ||
11892 | + while (trial++ < 5) { | ||
11893 | + err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, | ||
11894 | + TSCM_ADDR_BASE + TSCM_OFFSET_CLOCK_STATUS, | ||
11895 | + ®, sizeof(reg), 0); | ||
11896 | + if (err < 0) | ||
11897 | + return err; | ||
11898 | + | ||
11899 | *data = be32_to_cpu(reg); | ||
11900 | + if (*data & CLOCK_STATUS_MASK) | ||
11901 | + break; | ||
11902 | |||
11903 | - return err; | ||
11904 | + // In intermediate state after changing clock status. | ||
11905 | + msleep(50); | ||
11906 | + } | ||
11907 | + | ||
11908 | + // Still in the intermediate state. | ||
11909 | + if (trial >= 5) | ||
11910 | + return -EAGAIN; | ||
11911 | + | ||
11912 | + return 0; | ||
11913 | } | ||
11914 | |||
11915 | static int set_clock(struct snd_tscm *tscm, unsigned int rate, | ||
11916 | @@ -34,7 +51,7 @@ static int set_clock(struct snd_tscm *tscm, unsigned int rate, | ||
11917 | err = get_clock(tscm, &data); | ||
11918 | if (err < 0) | ||
11919 | return err; | ||
11920 | - data &= 0x0000ffff; | ||
11921 | + data &= CLOCK_CONFIG_MASK; | ||
11922 | |||
11923 | if (rate > 0) { | ||
11924 | data &= 0x000000ff; | ||
11925 | @@ -79,17 +96,14 @@ static int set_clock(struct snd_tscm *tscm, unsigned int rate, | ||
11926 | |||
11927 | int snd_tscm_stream_get_rate(struct snd_tscm *tscm, unsigned int *rate) | ||
11928 | { | ||
11929 | - u32 data = 0x0; | ||
11930 | - unsigned int trials = 0; | ||
11931 | + u32 data; | ||
11932 | int err; | ||
11933 | |||
11934 | - while (data == 0x0 || trials++ < 5) { | ||
11935 | - err = get_clock(tscm, &data); | ||
11936 | - if (err < 0) | ||
11937 | - return err; | ||
11938 | + err = get_clock(tscm, &data); | ||
11939 | + if (err < 0) | ||
11940 | + return err; | ||
11941 | |||
11942 | - data = (data & 0xff000000) >> 24; | ||
11943 | - } | ||
11944 | + data = (data & 0xff000000) >> 24; | ||
11945 | |||
11946 | /* Check base rate. */ | ||
11947 | if ((data & 0x0f) == 0x01) | ||
11948 | diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c | ||
11949 | index 3b0110545070..196bbc85699e 100644 | ||
11950 | --- a/sound/hda/hdac_controller.c | ||
11951 | +++ b/sound/hda/hdac_controller.c | ||
11952 | @@ -447,6 +447,8 @@ static void azx_int_disable(struct hdac_bus *bus) | ||
11953 | list_for_each_entry(azx_dev, &bus->stream_list, list) | ||
11954 | snd_hdac_stream_updateb(azx_dev, SD_CTL, SD_INT_MASK, 0); | ||
11955 | |||
11956 | + synchronize_irq(bus->irq); | ||
11957 | + | ||
11958 | /* disable SIE for all streams */ | ||
11959 | snd_hdac_chip_writeb(bus, INTCTL, 0); | ||
11960 | |||
11961 | diff --git a/sound/i2c/other/ak4xxx-adda.c b/sound/i2c/other/ak4xxx-adda.c | ||
11962 | index 5f59316f982a..7d15093844b9 100644 | ||
11963 | --- a/sound/i2c/other/ak4xxx-adda.c | ||
11964 | +++ b/sound/i2c/other/ak4xxx-adda.c | ||
11965 | @@ -775,11 +775,12 @@ static int build_adc_controls(struct snd_akm4xxx *ak) | ||
11966 | return err; | ||
11967 | |||
11968 | memset(&knew, 0, sizeof(knew)); | ||
11969 | - knew.name = ak->adc_info[mixer_ch].selector_name; | ||
11970 | - if (!knew.name) { | ||
11971 | + if (!ak->adc_info || | ||
11972 | + !ak->adc_info[mixer_ch].selector_name) { | ||
11973 | knew.name = "Capture Channel"; | ||
11974 | knew.index = mixer_ch + ak->idx_offset * 2; | ||
11975 | - } | ||
11976 | + } else | ||
11977 | + knew.name = ak->adc_info[mixer_ch].selector_name; | ||
11978 | |||
11979 | knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER; | ||
11980 | knew.info = ak4xxx_capture_source_info; | ||
11981 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c | ||
11982 | index 51f10ed9bc43..a2fb19129219 100644 | ||
11983 | --- a/sound/pci/hda/hda_codec.c | ||
11984 | +++ b/sound/pci/hda/hda_codec.c | ||
11985 | @@ -846,7 +846,13 @@ static void snd_hda_codec_dev_release(struct device *dev) | ||
11986 | snd_hda_sysfs_clear(codec); | ||
11987 | kfree(codec->modelname); | ||
11988 | kfree(codec->wcaps); | ||
11989 | - kfree(codec); | ||
11990 | + | ||
11991 | + /* | ||
11992 | + * In the case of ASoC HD-audio, hda_codec is device managed. | ||
11993 | + * It will be freed when the ASoC device is removed. | ||
11994 | + */ | ||
11995 | + if (codec->core.type == HDA_DEV_LEGACY) | ||
11996 | + kfree(codec); | ||
11997 | } | ||
11998 | |||
11999 | #define DEV_NAME_LEN 31 | ||
12000 | diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c | ||
12001 | index 48d863736b3c..a5a2e9fe7785 100644 | ||
12002 | --- a/sound/pci/hda/hda_controller.c | ||
12003 | +++ b/sound/pci/hda/hda_controller.c | ||
12004 | @@ -869,10 +869,13 @@ static int azx_rirb_get_response(struct hdac_bus *bus, unsigned int addr, | ||
12005 | */ | ||
12006 | if (hbus->allow_bus_reset && !hbus->response_reset && !hbus->in_reset) { | ||
12007 | hbus->response_reset = 1; | ||
12008 | + dev_err(chip->card->dev, | ||
12009 | + "No response from codec, resetting bus: last cmd=0x%08x\n", | ||
12010 | + bus->last_cmd[addr]); | ||
12011 | return -EAGAIN; /* give a chance to retry */ | ||
12012 | } | ||
12013 | |||
12014 | - dev_err(chip->card->dev, | ||
12015 | + dev_WARN(chip->card->dev, | ||
12016 | "azx_get_response timeout, switching to single_cmd mode: last cmd=0x%08x\n", | ||
12017 | bus->last_cmd[addr]); | ||
12018 | chip->single_cmd = 1; | ||
12019 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
12020 | index b0de3e3b33e5..783f9a9c40ec 100644 | ||
12021 | --- a/sound/pci/hda/hda_intel.c | ||
12022 | +++ b/sound/pci/hda/hda_intel.c | ||
12023 | @@ -1349,9 +1349,9 @@ static int azx_free(struct azx *chip) | ||
12024 | } | ||
12025 | |||
12026 | if (bus->chip_init) { | ||
12027 | + azx_stop_chip(chip); | ||
12028 | azx_clear_irq_pending(chip); | ||
12029 | azx_stop_all_streams(chip); | ||
12030 | - azx_stop_chip(chip); | ||
12031 | } | ||
12032 | |||
12033 | if (bus->irq >= 0) | ||
12034 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c | ||
12035 | index bea7b0961080..36240def9bf5 100644 | ||
12036 | --- a/sound/pci/hda/patch_hdmi.c | ||
12037 | +++ b/sound/pci/hda/patch_hdmi.c | ||
12038 | @@ -1421,7 +1421,7 @@ static void hdmi_pcm_reset_pin(struct hdmi_spec *spec, | ||
12039 | /* update per_pin ELD from the given new ELD; | ||
12040 | * setup info frame and notification accordingly | ||
12041 | */ | ||
12042 | -static void update_eld(struct hda_codec *codec, | ||
12043 | +static bool update_eld(struct hda_codec *codec, | ||
12044 | struct hdmi_spec_per_pin *per_pin, | ||
12045 | struct hdmi_eld *eld) | ||
12046 | { | ||
12047 | @@ -1452,18 +1452,22 @@ static void update_eld(struct hda_codec *codec, | ||
12048 | snd_hdmi_show_eld(codec, &eld->info); | ||
12049 | |||
12050 | eld_changed = (pin_eld->eld_valid != eld->eld_valid); | ||
12051 | - if (eld->eld_valid && pin_eld->eld_valid) | ||
12052 | + eld_changed |= (pin_eld->monitor_present != eld->monitor_present); | ||
12053 | + if (!eld_changed && eld->eld_valid && pin_eld->eld_valid) | ||
12054 | if (pin_eld->eld_size != eld->eld_size || | ||
12055 | memcmp(pin_eld->eld_buffer, eld->eld_buffer, | ||
12056 | eld->eld_size) != 0) | ||
12057 | eld_changed = true; | ||
12058 | |||
12059 | - pin_eld->monitor_present = eld->monitor_present; | ||
12060 | - pin_eld->eld_valid = eld->eld_valid; | ||
12061 | - pin_eld->eld_size = eld->eld_size; | ||
12062 | - if (eld->eld_valid) | ||
12063 | - memcpy(pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size); | ||
12064 | - pin_eld->info = eld->info; | ||
12065 | + if (eld_changed) { | ||
12066 | + pin_eld->monitor_present = eld->monitor_present; | ||
12067 | + pin_eld->eld_valid = eld->eld_valid; | ||
12068 | + pin_eld->eld_size = eld->eld_size; | ||
12069 | + if (eld->eld_valid) | ||
12070 | + memcpy(pin_eld->eld_buffer, eld->eld_buffer, | ||
12071 | + eld->eld_size); | ||
12072 | + pin_eld->info = eld->info; | ||
12073 | + } | ||
12074 | |||
12075 | /* | ||
12076 | * Re-setup pin and infoframe. This is needed e.g. when | ||
12077 | @@ -1481,6 +1485,7 @@ static void update_eld(struct hda_codec *codec, | ||
12078 | SNDRV_CTL_EVENT_MASK_VALUE | | ||
12079 | SNDRV_CTL_EVENT_MASK_INFO, | ||
12080 | &get_hdmi_pcm(spec, pcm_idx)->eld_ctl->id); | ||
12081 | + return eld_changed; | ||
12082 | } | ||
12083 | |||
12084 | /* update ELD and jack state via HD-audio verbs */ | ||
12085 | @@ -1582,6 +1587,7 @@ static void sync_eld_via_acomp(struct hda_codec *codec, | ||
12086 | struct hdmi_spec *spec = codec->spec; | ||
12087 | struct hdmi_eld *eld = &spec->temp_eld; | ||
12088 | struct snd_jack *jack = NULL; | ||
12089 | + bool changed; | ||
12090 | int size; | ||
12091 | |||
12092 | mutex_lock(&per_pin->lock); | ||
12093 | @@ -1608,15 +1614,13 @@ static void sync_eld_via_acomp(struct hda_codec *codec, | ||
12094 | * disconnected event. Jack must be fetched before update_eld() | ||
12095 | */ | ||
12096 | jack = pin_idx_to_jack(codec, per_pin); | ||
12097 | - update_eld(codec, per_pin, eld); | ||
12098 | + changed = update_eld(codec, per_pin, eld); | ||
12099 | if (jack == NULL) | ||
12100 | jack = pin_idx_to_jack(codec, per_pin); | ||
12101 | - if (jack == NULL) | ||
12102 | - goto unlock; | ||
12103 | - snd_jack_report(jack, | ||
12104 | - (eld->monitor_present && eld->eld_valid) ? | ||
12105 | + if (changed && jack) | ||
12106 | + snd_jack_report(jack, | ||
12107 | + (eld->monitor_present && eld->eld_valid) ? | ||
12108 | SND_JACK_AVOUT : 0); | ||
12109 | - unlock: | ||
12110 | mutex_unlock(&per_pin->lock); | ||
12111 | } | ||
12112 | |||
12113 | @@ -2612,6 +2616,8 @@ static void i915_pin_cvt_fixup(struct hda_codec *codec, | ||
12114 | /* precondition and allocation for Intel codecs */ | ||
12115 | static int alloc_intel_hdmi(struct hda_codec *codec) | ||
12116 | { | ||
12117 | + int err; | ||
12118 | + | ||
12119 | /* requires i915 binding */ | ||
12120 | if (!codec->bus->core.audio_component) { | ||
12121 | codec_info(codec, "No i915 binding for Intel HDMI/DP codec\n"); | ||
12122 | @@ -2620,7 +2626,12 @@ static int alloc_intel_hdmi(struct hda_codec *codec) | ||
12123 | return -ENODEV; | ||
12124 | } | ||
12125 | |||
12126 | - return alloc_generic_hdmi(codec); | ||
12127 | + err = alloc_generic_hdmi(codec); | ||
12128 | + if (err < 0) | ||
12129 | + return err; | ||
12130 | + /* no need to handle unsol events */ | ||
12131 | + codec->patch_ops.unsol_event = NULL; | ||
12132 | + return 0; | ||
12133 | } | ||
12134 | |||
12135 | /* parse and post-process for Intel codecs */ | ||
12136 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
12137 | index c1ddfd2fac52..36aee8ad2054 100644 | ||
12138 | --- a/sound/pci/hda/patch_realtek.c | ||
12139 | +++ b/sound/pci/hda/patch_realtek.c | ||
12140 | @@ -1058,6 +1058,9 @@ static const struct snd_pci_quirk beep_white_list[] = { | ||
12141 | SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1), | ||
12142 | SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1), | ||
12143 | SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), | ||
12144 | + /* blacklist -- no beep available */ | ||
12145 | + SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0), | ||
12146 | + SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0), | ||
12147 | {} | ||
12148 | }; | ||
12149 | |||
12150 | @@ -3755,6 +3758,72 @@ static void alc269_x101_hp_automute_hook(struct hda_codec *codec, | ||
12151 | vref); | ||
12152 | } | ||
12153 | |||
12154 | +/* | ||
12155 | + * Magic sequence to make Huawei Matebook X right speaker working (bko#197801) | ||
12156 | + */ | ||
12157 | +struct hda_alc298_mbxinit { | ||
12158 | + unsigned char value_0x23; | ||
12159 | + unsigned char value_0x25; | ||
12160 | +}; | ||
12161 | + | ||
12162 | +static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec, | ||
12163 | + const struct hda_alc298_mbxinit *initval, | ||
12164 | + bool first) | ||
12165 | +{ | ||
12166 | + snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0); | ||
12167 | + alc_write_coef_idx(codec, 0x26, 0xb000); | ||
12168 | + | ||
12169 | + if (first) | ||
12170 | + snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0); | ||
12171 | + | ||
12172 | + snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80); | ||
12173 | + alc_write_coef_idx(codec, 0x26, 0xf000); | ||
12174 | + alc_write_coef_idx(codec, 0x23, initval->value_0x23); | ||
12175 | + | ||
12176 | + if (initval->value_0x23 != 0x1e) | ||
12177 | + alc_write_coef_idx(codec, 0x25, initval->value_0x25); | ||
12178 | + | ||
12179 | + snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26); | ||
12180 | + snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010); | ||
12181 | +} | ||
12182 | + | ||
12183 | +static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec, | ||
12184 | + const struct hda_fixup *fix, | ||
12185 | + int action) | ||
12186 | +{ | ||
12187 | + /* Initialization magic */ | ||
12188 | + static const struct hda_alc298_mbxinit dac_init[] = { | ||
12189 | + {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00}, | ||
12190 | + {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00}, | ||
12191 | + {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00}, | ||
12192 | + {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24}, | ||
12193 | + {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f}, | ||
12194 | + {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00}, | ||
12195 | + {0x2f, 0x00}, | ||
12196 | + {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, | ||
12197 | + {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c}, | ||
12198 | + {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80}, | ||
12199 | + {} | ||
12200 | + }; | ||
12201 | + const struct hda_alc298_mbxinit *seq; | ||
12202 | + | ||
12203 | + if (action != HDA_FIXUP_ACT_INIT) | ||
12204 | + return; | ||
12205 | + | ||
12206 | + /* Start */ | ||
12207 | + snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00); | ||
12208 | + snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80); | ||
12209 | + alc_write_coef_idx(codec, 0x26, 0xf000); | ||
12210 | + alc_write_coef_idx(codec, 0x22, 0x31); | ||
12211 | + alc_write_coef_idx(codec, 0x23, 0x0b); | ||
12212 | + alc_write_coef_idx(codec, 0x25, 0x00); | ||
12213 | + snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26); | ||
12214 | + snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010); | ||
12215 | + | ||
12216 | + for (seq = dac_init; seq->value_0x23; seq++) | ||
12217 | + alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init); | ||
12218 | +} | ||
12219 | + | ||
12220 | static void alc269_fixup_x101_headset_mic(struct hda_codec *codec, | ||
12221 | const struct hda_fixup *fix, int action) | ||
12222 | { | ||
12223 | @@ -5780,6 +5849,7 @@ enum { | ||
12224 | ALC255_FIXUP_DUMMY_LINEOUT_VERB, | ||
12225 | ALC255_FIXUP_DELL_HEADSET_MIC, | ||
12226 | ALC256_FIXUP_HUAWEI_MACH_WX9_PINS, | ||
12227 | + ALC298_FIXUP_HUAWEI_MBX_STEREO, | ||
12228 | ALC295_FIXUP_HP_X360, | ||
12229 | ALC221_FIXUP_HP_HEADSET_MIC, | ||
12230 | ALC285_FIXUP_LENOVO_HEADPHONE_NOISE, | ||
12231 | @@ -5800,6 +5870,7 @@ enum { | ||
12232 | ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, | ||
12233 | ALC299_FIXUP_PREDATOR_SPK, | ||
12234 | ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC, | ||
12235 | + ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, | ||
12236 | }; | ||
12237 | |||
12238 | static const struct hda_fixup alc269_fixups[] = { | ||
12239 | @@ -6089,6 +6160,12 @@ static const struct hda_fixup alc269_fixups[] = { | ||
12240 | .chained = true, | ||
12241 | .chain_id = ALC255_FIXUP_MIC_MUTE_LED | ||
12242 | }, | ||
12243 | + [ALC298_FIXUP_HUAWEI_MBX_STEREO] = { | ||
12244 | + .type = HDA_FIXUP_FUNC, | ||
12245 | + .v.func = alc298_fixup_huawei_mbx_stereo, | ||
12246 | + .chained = true, | ||
12247 | + .chain_id = ALC255_FIXUP_MIC_MUTE_LED | ||
12248 | + }, | ||
12249 | [ALC269_FIXUP_ASUS_X101_FUNC] = { | ||
12250 | .type = HDA_FIXUP_FUNC, | ||
12251 | .v.func = alc269_fixup_x101_headset_mic, | ||
12252 | @@ -6850,6 +6927,16 @@ static const struct hda_fixup alc269_fixups[] = { | ||
12253 | .chained = true, | ||
12254 | .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC | ||
12255 | }, | ||
12256 | + [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = { | ||
12257 | + .type = HDA_FIXUP_PINS, | ||
12258 | + .v.pins = (const struct hda_pintbl[]) { | ||
12259 | + { 0x19, 0x04a11040 }, | ||
12260 | + { 0x21, 0x04211020 }, | ||
12261 | + { } | ||
12262 | + }, | ||
12263 | + .chained = true, | ||
12264 | + .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE | ||
12265 | + }, | ||
12266 | }; | ||
12267 | |||
12268 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
12269 | @@ -7113,6 +7200,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
12270 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), | ||
12271 | SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS), | ||
12272 | SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */ | ||
12273 | + SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE), | ||
12274 | |||
12275 | #if 0 | ||
12276 | /* Below is a quirk table taken from the old code. | ||
12277 | @@ -7280,6 +7368,8 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | ||
12278 | {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"}, | ||
12279 | {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"}, | ||
12280 | {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"}, | ||
12281 | + {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"}, | ||
12282 | + {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"}, | ||
12283 | {} | ||
12284 | }; | ||
12285 | #define ALC225_STANDARD_PINS \ | ||
12286 | diff --git a/sound/soc/atmel/mchp-i2s-mcc.c b/sound/soc/atmel/mchp-i2s-mcc.c | ||
12287 | index 86495883ca3f..ab7d5f98e759 100644 | ||
12288 | --- a/sound/soc/atmel/mchp-i2s-mcc.c | ||
12289 | +++ b/sound/soc/atmel/mchp-i2s-mcc.c | ||
12290 | @@ -670,8 +670,13 @@ static int mchp_i2s_mcc_hw_params(struct snd_pcm_substream *substream, | ||
12291 | } | ||
12292 | |||
12293 | ret = regmap_write(dev->regmap, MCHP_I2SMCC_MRA, mra); | ||
12294 | - if (ret < 0) | ||
12295 | + if (ret < 0) { | ||
12296 | + if (dev->gclk_use) { | ||
12297 | + clk_unprepare(dev->gclk); | ||
12298 | + dev->gclk_use = 0; | ||
12299 | + } | ||
12300 | return ret; | ||
12301 | + } | ||
12302 | return regmap_write(dev->regmap, MCHP_I2SMCC_MRB, mrb); | ||
12303 | } | ||
12304 | |||
12305 | @@ -686,31 +691,37 @@ static int mchp_i2s_mcc_hw_free(struct snd_pcm_substream *substream, | ||
12306 | err = wait_event_interruptible_timeout(dev->wq_txrdy, | ||
12307 | dev->tx_rdy, | ||
12308 | msecs_to_jiffies(500)); | ||
12309 | + if (err == 0) { | ||
12310 | + dev_warn_once(dev->dev, | ||
12311 | + "Timeout waiting for Tx ready\n"); | ||
12312 | + regmap_write(dev->regmap, MCHP_I2SMCC_IDRA, | ||
12313 | + MCHP_I2SMCC_INT_TXRDY_MASK(dev->channels)); | ||
12314 | + dev->tx_rdy = 1; | ||
12315 | + } | ||
12316 | } else { | ||
12317 | err = wait_event_interruptible_timeout(dev->wq_rxrdy, | ||
12318 | dev->rx_rdy, | ||
12319 | msecs_to_jiffies(500)); | ||
12320 | - } | ||
12321 | - | ||
12322 | - if (err == 0) { | ||
12323 | - u32 idra; | ||
12324 | - | ||
12325 | - dev_warn_once(dev->dev, "Timeout waiting for %s\n", | ||
12326 | - is_playback ? "Tx ready" : "Rx ready"); | ||
12327 | - if (is_playback) | ||
12328 | - idra = MCHP_I2SMCC_INT_TXRDY_MASK(dev->channels); | ||
12329 | - else | ||
12330 | - idra = MCHP_I2SMCC_INT_RXRDY_MASK(dev->channels); | ||
12331 | - regmap_write(dev->regmap, MCHP_I2SMCC_IDRA, idra); | ||
12332 | + if (err == 0) { | ||
12333 | + dev_warn_once(dev->dev, | ||
12334 | + "Timeout waiting for Rx ready\n"); | ||
12335 | + regmap_write(dev->regmap, MCHP_I2SMCC_IDRA, | ||
12336 | + MCHP_I2SMCC_INT_RXRDY_MASK(dev->channels)); | ||
12337 | + dev->rx_rdy = 1; | ||
12338 | + } | ||
12339 | } | ||
12340 | |||
12341 | if (!mchp_i2s_mcc_is_running(dev)) { | ||
12342 | regmap_write(dev->regmap, MCHP_I2SMCC_CR, MCHP_I2SMCC_CR_CKDIS); | ||
12343 | |||
12344 | if (dev->gclk_running) { | ||
12345 | - clk_disable_unprepare(dev->gclk); | ||
12346 | + clk_disable(dev->gclk); | ||
12347 | dev->gclk_running = 0; | ||
12348 | } | ||
12349 | + if (dev->gclk_use) { | ||
12350 | + clk_unprepare(dev->gclk); | ||
12351 | + dev->gclk_use = 0; | ||
12352 | + } | ||
12353 | } | ||
12354 | |||
12355 | return 0; | ||
12356 | @@ -809,6 +820,8 @@ static int mchp_i2s_mcc_dai_probe(struct snd_soc_dai *dai) | ||
12357 | |||
12358 | init_waitqueue_head(&dev->wq_txrdy); | ||
12359 | init_waitqueue_head(&dev->wq_rxrdy); | ||
12360 | + dev->tx_rdy = 1; | ||
12361 | + dev->rx_rdy = 1; | ||
12362 | |||
12363 | snd_soc_dai_init_dma_data(dai, &dev->playback, &dev->capture); | ||
12364 | |||
12365 | diff --git a/sound/soc/codecs/es8316.c b/sound/soc/codecs/es8316.c | ||
12366 | index 6db002cc2058..96d04896193f 100644 | ||
12367 | --- a/sound/soc/codecs/es8316.c | ||
12368 | +++ b/sound/soc/codecs/es8316.c | ||
12369 | @@ -51,7 +51,10 @@ static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(adc_vol_tlv, -9600, 50, 1); | ||
12370 | static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_max_gain_tlv, -650, 150, 0); | ||
12371 | static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_min_gain_tlv, -1200, 150, 0); | ||
12372 | static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_target_tlv, -1650, 150, 0); | ||
12373 | -static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(hpmixer_gain_tlv, -1200, 150, 0); | ||
12374 | +static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpmixer_gain_tlv, | ||
12375 | + 0, 4, TLV_DB_SCALE_ITEM(-1200, 150, 0), | ||
12376 | + 8, 11, TLV_DB_SCALE_ITEM(-450, 150, 0), | ||
12377 | +); | ||
12378 | |||
12379 | static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(adc_pga_gain_tlv, | ||
12380 | 0, 0, TLV_DB_SCALE_ITEM(-350, 0, 0), | ||
12381 | @@ -89,7 +92,7 @@ static const struct snd_kcontrol_new es8316_snd_controls[] = { | ||
12382 | SOC_DOUBLE_TLV("Headphone Playback Volume", ES8316_CPHP_ICAL_VOL, | ||
12383 | 4, 0, 3, 1, hpout_vol_tlv), | ||
12384 | SOC_DOUBLE_TLV("Headphone Mixer Volume", ES8316_HPMIX_VOL, | ||
12385 | - 0, 4, 7, 0, hpmixer_gain_tlv), | ||
12386 | + 0, 4, 11, 0, hpmixer_gain_tlv), | ||
12387 | |||
12388 | SOC_ENUM("Playback Polarity", dacpol), | ||
12389 | SOC_DOUBLE_R_TLV("DAC Playback Volume", ES8316_DAC_VOLL, | ||
12390 | diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c | ||
12391 | index 7d4940256914..91242b6f8ea7 100644 | ||
12392 | --- a/sound/soc/codecs/hdac_hda.c | ||
12393 | +++ b/sound/soc/codecs/hdac_hda.c | ||
12394 | @@ -495,6 +495,10 @@ static int hdac_hda_dev_probe(struct hdac_device *hdev) | ||
12395 | |||
12396 | static int hdac_hda_dev_remove(struct hdac_device *hdev) | ||
12397 | { | ||
12398 | + struct hdac_hda_priv *hda_pvt; | ||
12399 | + | ||
12400 | + hda_pvt = dev_get_drvdata(&hdev->dev); | ||
12401 | + cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); | ||
12402 | return 0; | ||
12403 | } | ||
12404 | |||
12405 | diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c | ||
12406 | index a6a4748c97f9..7cbaedffa1ef 100644 | ||
12407 | --- a/sound/soc/codecs/sgtl5000.c | ||
12408 | +++ b/sound/soc/codecs/sgtl5000.c | ||
12409 | @@ -1173,12 +1173,17 @@ static int sgtl5000_set_power_regs(struct snd_soc_component *component) | ||
12410 | SGTL5000_INT_OSC_EN); | ||
12411 | /* Enable VDDC charge pump */ | ||
12412 | ana_pwr |= SGTL5000_VDDC_CHRGPMP_POWERUP; | ||
12413 | - } else if (vddio >= 3100 && vdda >= 3100) { | ||
12414 | + } else { | ||
12415 | ana_pwr &= ~SGTL5000_VDDC_CHRGPMP_POWERUP; | ||
12416 | - /* VDDC use VDDIO rail */ | ||
12417 | - lreg_ctrl |= SGTL5000_VDDC_ASSN_OVRD; | ||
12418 | - lreg_ctrl |= SGTL5000_VDDC_MAN_ASSN_VDDIO << | ||
12419 | - SGTL5000_VDDC_MAN_ASSN_SHIFT; | ||
12420 | + /* | ||
12421 | + * if vddio == vdda the source of charge pump should be | ||
12422 | + * assigned manually to VDDIO | ||
12423 | + */ | ||
12424 | + if (vddio == vdda) { | ||
12425 | + lreg_ctrl |= SGTL5000_VDDC_ASSN_OVRD; | ||
12426 | + lreg_ctrl |= SGTL5000_VDDC_MAN_ASSN_VDDIO << | ||
12427 | + SGTL5000_VDDC_MAN_ASSN_SHIFT; | ||
12428 | + } | ||
12429 | } | ||
12430 | |||
12431 | snd_soc_component_write(component, SGTL5000_CHIP_LINREG_CTRL, lreg_ctrl); | ||
12432 | @@ -1288,6 +1293,7 @@ static int sgtl5000_probe(struct snd_soc_component *component) | ||
12433 | int ret; | ||
12434 | u16 reg; | ||
12435 | struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component); | ||
12436 | + unsigned int zcd_mask = SGTL5000_HP_ZCD_EN | SGTL5000_ADC_ZCD_EN; | ||
12437 | |||
12438 | /* power up sgtl5000 */ | ||
12439 | ret = sgtl5000_set_power_regs(component); | ||
12440 | @@ -1315,9 +1321,8 @@ static int sgtl5000_probe(struct snd_soc_component *component) | ||
12441 | 0x1f); | ||
12442 | snd_soc_component_write(component, SGTL5000_CHIP_PAD_STRENGTH, reg); | ||
12443 | |||
12444 | - snd_soc_component_write(component, SGTL5000_CHIP_ANA_CTRL, | ||
12445 | - SGTL5000_HP_ZCD_EN | | ||
12446 | - SGTL5000_ADC_ZCD_EN); | ||
12447 | + snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_CTRL, | ||
12448 | + zcd_mask, zcd_mask); | ||
12449 | |||
12450 | snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL, | ||
12451 | SGTL5000_BIAS_R_MASK, | ||
12452 | diff --git a/sound/soc/codecs/tlv320aic31xx.c b/sound/soc/codecs/tlv320aic31xx.c | ||
12453 | index 9b37e98da0db..26a4f6cd3288 100644 | ||
12454 | --- a/sound/soc/codecs/tlv320aic31xx.c | ||
12455 | +++ b/sound/soc/codecs/tlv320aic31xx.c | ||
12456 | @@ -1553,7 +1553,8 @@ static int aic31xx_i2c_probe(struct i2c_client *i2c, | ||
12457 | aic31xx->gpio_reset = devm_gpiod_get_optional(aic31xx->dev, "reset", | ||
12458 | GPIOD_OUT_LOW); | ||
12459 | if (IS_ERR(aic31xx->gpio_reset)) { | ||
12460 | - dev_err(aic31xx->dev, "not able to acquire gpio\n"); | ||
12461 | + if (PTR_ERR(aic31xx->gpio_reset) != -EPROBE_DEFER) | ||
12462 | + dev_err(aic31xx->dev, "not able to acquire gpio\n"); | ||
12463 | return PTR_ERR(aic31xx->gpio_reset); | ||
12464 | } | ||
12465 | |||
12466 | @@ -1564,7 +1565,9 @@ static int aic31xx_i2c_probe(struct i2c_client *i2c, | ||
12467 | ARRAY_SIZE(aic31xx->supplies), | ||
12468 | aic31xx->supplies); | ||
12469 | if (ret) { | ||
12470 | - dev_err(aic31xx->dev, "Failed to request supplies: %d\n", ret); | ||
12471 | + if (ret != -EPROBE_DEFER) | ||
12472 | + dev_err(aic31xx->dev, | ||
12473 | + "Failed to request supplies: %d\n", ret); | ||
12474 | return ret; | ||
12475 | } | ||
12476 | |||
12477 | diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c | ||
12478 | index fa862af25c1a..085855f9b08d 100644 | ||
12479 | --- a/sound/soc/fsl/fsl_ssi.c | ||
12480 | +++ b/sound/soc/fsl/fsl_ssi.c | ||
12481 | @@ -799,15 +799,6 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, | ||
12482 | u32 wl = SSI_SxCCR_WL(sample_size); | ||
12483 | int ret; | ||
12484 | |||
12485 | - /* | ||
12486 | - * SSI is properly configured if it is enabled and running in | ||
12487 | - * the synchronous mode; Note that AC97 mode is an exception | ||
12488 | - * that should set separate configurations for STCCR and SRCCR | ||
12489 | - * despite running in the synchronous mode. | ||
12490 | - */ | ||
12491 | - if (ssi->streams && ssi->synchronous) | ||
12492 | - return 0; | ||
12493 | - | ||
12494 | if (fsl_ssi_is_i2s_master(ssi)) { | ||
12495 | ret = fsl_ssi_set_bclk(substream, dai, hw_params); | ||
12496 | if (ret) | ||
12497 | @@ -823,6 +814,15 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, | ||
12498 | } | ||
12499 | } | ||
12500 | |||
12501 | + /* | ||
12502 | + * SSI is properly configured if it is enabled and running in | ||
12503 | + * the synchronous mode; Note that AC97 mode is an exception | ||
12504 | + * that should set separate configurations for STCCR and SRCCR | ||
12505 | + * despite running in the synchronous mode. | ||
12506 | + */ | ||
12507 | + if (ssi->streams && ssi->synchronous) | ||
12508 | + return 0; | ||
12509 | + | ||
12510 | if (!fsl_ssi_is_ac97(ssi)) { | ||
12511 | /* | ||
12512 | * Keep the ssi->i2s_net intact while having a local variable | ||
12513 | diff --git a/sound/soc/intel/common/sst-acpi.c b/sound/soc/intel/common/sst-acpi.c | ||
12514 | index 0e8e0a7a11df..5854868650b9 100644 | ||
12515 | --- a/sound/soc/intel/common/sst-acpi.c | ||
12516 | +++ b/sound/soc/intel/common/sst-acpi.c | ||
12517 | @@ -141,11 +141,12 @@ static int sst_acpi_probe(struct platform_device *pdev) | ||
12518 | } | ||
12519 | |||
12520 | platform_set_drvdata(pdev, sst_acpi); | ||
12521 | + mach->pdata = sst_pdata; | ||
12522 | |||
12523 | /* register machine driver */ | ||
12524 | sst_acpi->pdev_mach = | ||
12525 | platform_device_register_data(dev, mach->drv_name, -1, | ||
12526 | - sst_pdata, sizeof(*sst_pdata)); | ||
12527 | + mach, sizeof(*mach)); | ||
12528 | if (IS_ERR(sst_acpi->pdev_mach)) | ||
12529 | return PTR_ERR(sst_acpi->pdev_mach); | ||
12530 | |||
12531 | diff --git a/sound/soc/intel/common/sst-ipc.c b/sound/soc/intel/common/sst-ipc.c | ||
12532 | index ef5b66af1cd2..3a66121ee9bb 100644 | ||
12533 | --- a/sound/soc/intel/common/sst-ipc.c | ||
12534 | +++ b/sound/soc/intel/common/sst-ipc.c | ||
12535 | @@ -222,6 +222,8 @@ struct ipc_message *sst_ipc_reply_find_msg(struct sst_generic_ipc *ipc, | ||
12536 | |||
12537 | if (ipc->ops.reply_msg_match != NULL) | ||
12538 | header = ipc->ops.reply_msg_match(header, &mask); | ||
12539 | + else | ||
12540 | + mask = (u64)-1; | ||
12541 | |||
12542 | if (list_empty(&ipc->rx_list)) { | ||
12543 | dev_err(ipc->dev, "error: rx list empty but received 0x%llx\n", | ||
12544 | diff --git a/sound/soc/intel/skylake/skl-debug.c b/sound/soc/intel/skylake/skl-debug.c | ||
12545 | index b9b4a72a4334..b28a9c2b0380 100644 | ||
12546 | --- a/sound/soc/intel/skylake/skl-debug.c | ||
12547 | +++ b/sound/soc/intel/skylake/skl-debug.c | ||
12548 | @@ -188,7 +188,7 @@ static ssize_t fw_softreg_read(struct file *file, char __user *user_buf, | ||
12549 | memset(d->fw_read_buff, 0, FW_REG_BUF); | ||
12550 | |||
12551 | if (w0_stat_sz > 0) | ||
12552 | - __iowrite32_copy(d->fw_read_buff, fw_reg_addr, w0_stat_sz >> 2); | ||
12553 | + __ioread32_copy(d->fw_read_buff, fw_reg_addr, w0_stat_sz >> 2); | ||
12554 | |||
12555 | for (offset = 0; offset < FW_REG_SIZE; offset += 16) { | ||
12556 | ret += snprintf(tmp + ret, FW_REG_BUF - ret, "%#.4x: ", offset); | ||
12557 | diff --git a/sound/soc/intel/skylake/skl-nhlt.c b/sound/soc/intel/skylake/skl-nhlt.c | ||
12558 | index 1132109cb992..e01815cec6fd 100644 | ||
12559 | --- a/sound/soc/intel/skylake/skl-nhlt.c | ||
12560 | +++ b/sound/soc/intel/skylake/skl-nhlt.c | ||
12561 | @@ -225,7 +225,7 @@ int skl_nhlt_update_topology_bin(struct skl *skl) | ||
12562 | struct hdac_bus *bus = skl_to_bus(skl); | ||
12563 | struct device *dev = bus->dev; | ||
12564 | |||
12565 | - dev_dbg(dev, "oem_id %.6s, oem_table_id %8s oem_revision %d\n", | ||
12566 | + dev_dbg(dev, "oem_id %.6s, oem_table_id %.8s oem_revision %d\n", | ||
12567 | nhlt->header.oem_id, nhlt->header.oem_table_id, | ||
12568 | nhlt->header.oem_revision); | ||
12569 | |||
12570 | diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c | ||
12571 | index fce4e050a9b7..b9aacf3d3b29 100644 | ||
12572 | --- a/sound/soc/sh/rcar/adg.c | ||
12573 | +++ b/sound/soc/sh/rcar/adg.c | ||
12574 | @@ -30,6 +30,7 @@ struct rsnd_adg { | ||
12575 | struct clk *clkout[CLKOUTMAX]; | ||
12576 | struct clk_onecell_data onecell; | ||
12577 | struct rsnd_mod mod; | ||
12578 | + int clk_rate[CLKMAX]; | ||
12579 | u32 flags; | ||
12580 | u32 ckr; | ||
12581 | u32 rbga; | ||
12582 | @@ -114,9 +115,9 @@ static void __rsnd_adg_get_timesel_ratio(struct rsnd_priv *priv, | ||
12583 | unsigned int val, en; | ||
12584 | unsigned int min, diff; | ||
12585 | unsigned int sel_rate[] = { | ||
12586 | - clk_get_rate(adg->clk[CLKA]), /* 0000: CLKA */ | ||
12587 | - clk_get_rate(adg->clk[CLKB]), /* 0001: CLKB */ | ||
12588 | - clk_get_rate(adg->clk[CLKC]), /* 0010: CLKC */ | ||
12589 | + adg->clk_rate[CLKA], /* 0000: CLKA */ | ||
12590 | + adg->clk_rate[CLKB], /* 0001: CLKB */ | ||
12591 | + adg->clk_rate[CLKC], /* 0010: CLKC */ | ||
12592 | adg->rbga_rate_for_441khz, /* 0011: RBGA */ | ||
12593 | adg->rbgb_rate_for_48khz, /* 0100: RBGB */ | ||
12594 | }; | ||
12595 | @@ -302,7 +303,7 @@ int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate) | ||
12596 | * AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC/AUDIO_CLKI. | ||
12597 | */ | ||
12598 | for_each_rsnd_clk(clk, adg, i) { | ||
12599 | - if (rate == clk_get_rate(clk)) | ||
12600 | + if (rate == adg->clk_rate[i]) | ||
12601 | return sel_table[i]; | ||
12602 | } | ||
12603 | |||
12604 | @@ -369,10 +370,18 @@ void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable) | ||
12605 | |||
12606 | for_each_rsnd_clk(clk, adg, i) { | ||
12607 | ret = 0; | ||
12608 | - if (enable) | ||
12609 | + if (enable) { | ||
12610 | ret = clk_prepare_enable(clk); | ||
12611 | - else | ||
12612 | + | ||
12613 | + /* | ||
12614 | + * We shouldn't use clk_get_rate() under | ||
12615 | + * atomic context. Let's keep it when | ||
12616 | + * rsnd_adg_clk_enable() was called | ||
12617 | + */ | ||
12618 | + adg->clk_rate[i] = clk_get_rate(adg->clk[i]); | ||
12619 | + } else { | ||
12620 | clk_disable_unprepare(clk); | ||
12621 | + } | ||
12622 | |||
12623 | if (ret < 0) | ||
12624 | dev_warn(dev, "can't use clk %d\n", i); | ||
12625 | diff --git a/sound/soc/soc-generic-dmaengine-pcm.c b/sound/soc/soc-generic-dmaengine-pcm.c | ||
12626 | index 748f5f641002..d93db2c2b527 100644 | ||
12627 | --- a/sound/soc/soc-generic-dmaengine-pcm.c | ||
12628 | +++ b/sound/soc/soc-generic-dmaengine-pcm.c | ||
12629 | @@ -306,6 +306,12 @@ static int dmaengine_pcm_new(struct snd_soc_pcm_runtime *rtd) | ||
12630 | |||
12631 | if (!dmaengine_pcm_can_report_residue(dev, pcm->chan[i])) | ||
12632 | pcm->flags |= SND_DMAENGINE_PCM_FLAG_NO_RESIDUE; | ||
12633 | + | ||
12634 | + if (rtd->pcm->streams[i].pcm->name[0] == '\0') { | ||
12635 | + strncpy(rtd->pcm->streams[i].pcm->name, | ||
12636 | + rtd->pcm->streams[i].pcm->id, | ||
12637 | + sizeof(rtd->pcm->streams[i].pcm->name)); | ||
12638 | + } | ||
12639 | } | ||
12640 | |||
12641 | return 0; | ||
12642 | diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c | ||
12643 | index b8b37f082309..0d8437b080bf 100644 | ||
12644 | --- a/sound/soc/sof/intel/hda-codec.c | ||
12645 | +++ b/sound/soc/sof/intel/hda-codec.c | ||
12646 | @@ -62,8 +62,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address) | ||
12647 | address, resp); | ||
12648 | |||
12649 | #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC) | ||
12650 | - /* snd_hdac_ext_bus_device_exit will use kfree to free hdev */ | ||
12651 | - hda_priv = kzalloc(sizeof(*hda_priv), GFP_KERNEL); | ||
12652 | + hda_priv = devm_kzalloc(sdev->dev, sizeof(*hda_priv), GFP_KERNEL); | ||
12653 | if (!hda_priv) | ||
12654 | return -ENOMEM; | ||
12655 | |||
12656 | @@ -82,8 +81,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address) | ||
12657 | |||
12658 | return 0; | ||
12659 | #else | ||
12660 | - /* snd_hdac_ext_bus_device_exit will use kfree to free hdev */ | ||
12661 | - hdev = kzalloc(sizeof(*hdev), GFP_KERNEL); | ||
12662 | + hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL); | ||
12663 | if (!hdev) | ||
12664 | return -ENOMEM; | ||
12665 | |||
12666 | diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c | ||
12667 | index 334e9d59b1ba..3b8955e755b2 100644 | ||
12668 | --- a/sound/soc/sof/pcm.c | ||
12669 | +++ b/sound/soc/sof/pcm.c | ||
12670 | @@ -208,12 +208,11 @@ static int sof_pcm_hw_params(struct snd_pcm_substream *substream, | ||
12671 | if (ret < 0) | ||
12672 | return ret; | ||
12673 | |||
12674 | + spcm->prepared[substream->stream] = true; | ||
12675 | + | ||
12676 | /* save pcm hw_params */ | ||
12677 | memcpy(&spcm->params[substream->stream], params, sizeof(*params)); | ||
12678 | |||
12679 | - /* clear hw_params_upon_resume flag */ | ||
12680 | - spcm->hw_params_upon_resume[substream->stream] = 0; | ||
12681 | - | ||
12682 | return ret; | ||
12683 | } | ||
12684 | |||
12685 | @@ -236,6 +235,9 @@ static int sof_pcm_hw_free(struct snd_pcm_substream *substream) | ||
12686 | if (!spcm) | ||
12687 | return -EINVAL; | ||
12688 | |||
12689 | + if (!spcm->prepared[substream->stream]) | ||
12690 | + return 0; | ||
12691 | + | ||
12692 | dev_dbg(sdev->dev, "pcm: free stream %d dir %d\n", spcm->pcm.pcm_id, | ||
12693 | substream->stream); | ||
12694 | |||
12695 | @@ -258,6 +260,8 @@ static int sof_pcm_hw_free(struct snd_pcm_substream *substream) | ||
12696 | if (ret < 0) | ||
12697 | dev_err(sdev->dev, "error: platform hw free failed\n"); | ||
12698 | |||
12699 | + spcm->prepared[substream->stream] = false; | ||
12700 | + | ||
12701 | return ret; | ||
12702 | } | ||
12703 | |||
12704 | @@ -278,11 +282,7 @@ static int sof_pcm_prepare(struct snd_pcm_substream *substream) | ||
12705 | if (!spcm) | ||
12706 | return -EINVAL; | ||
12707 | |||
12708 | - /* | ||
12709 | - * check if hw_params needs to be set-up again. | ||
12710 | - * This is only needed when resuming from system sleep. | ||
12711 | - */ | ||
12712 | - if (!spcm->hw_params_upon_resume[substream->stream]) | ||
12713 | + if (spcm->prepared[substream->stream]) | ||
12714 | return 0; | ||
12715 | |||
12716 | dev_dbg(sdev->dev, "pcm: prepare stream %d dir %d\n", spcm->pcm.pcm_id, | ||
12717 | @@ -311,6 +311,7 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | ||
12718 | struct snd_sof_pcm *spcm; | ||
12719 | struct sof_ipc_stream stream; | ||
12720 | struct sof_ipc_reply reply; | ||
12721 | + bool reset_hw_params = false; | ||
12722 | int ret; | ||
12723 | |||
12724 | /* nothing to do for BE */ | ||
12725 | @@ -351,6 +352,7 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | ||
12726 | case SNDRV_PCM_TRIGGER_SUSPEND: | ||
12727 | case SNDRV_PCM_TRIGGER_STOP: | ||
12728 | stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_STOP; | ||
12729 | + reset_hw_params = true; | ||
12730 | break; | ||
12731 | default: | ||
12732 | dev_err(sdev->dev, "error: unhandled trigger cmd %d\n", cmd); | ||
12733 | @@ -363,17 +365,17 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | ||
12734 | ret = sof_ipc_tx_message(sdev->ipc, stream.hdr.cmd, &stream, | ||
12735 | sizeof(stream), &reply, sizeof(reply)); | ||
12736 | |||
12737 | - if (ret < 0 || cmd != SNDRV_PCM_TRIGGER_SUSPEND) | ||
12738 | + if (ret < 0 || !reset_hw_params) | ||
12739 | return ret; | ||
12740 | |||
12741 | /* | ||
12742 | - * The hw_free op is usually called when the pcm stream is closed. | ||
12743 | - * Since the stream is not closed during suspend, the DSP needs to be | ||
12744 | - * notified explicitly to free pcm to prevent errors upon resume. | ||
12745 | + * In case of stream is stopped, DSP must be reprogrammed upon | ||
12746 | + * restart, so free PCM here. | ||
12747 | */ | ||
12748 | stream.hdr.size = sizeof(stream); | ||
12749 | stream.hdr.cmd = SOF_IPC_GLB_STREAM_MSG | SOF_IPC_STREAM_PCM_FREE; | ||
12750 | stream.comp_id = spcm->stream[substream->stream].comp_id; | ||
12751 | + spcm->prepared[substream->stream] = false; | ||
12752 | |||
12753 | /* send IPC to the DSP */ | ||
12754 | return sof_ipc_tx_message(sdev->ipc, stream.hdr.cmd, &stream, | ||
12755 | @@ -481,6 +483,7 @@ static int sof_pcm_open(struct snd_pcm_substream *substream) | ||
12756 | spcm->stream[substream->stream].posn.host_posn = 0; | ||
12757 | spcm->stream[substream->stream].posn.dai_posn = 0; | ||
12758 | spcm->stream[substream->stream].substream = substream; | ||
12759 | + spcm->prepared[substream->stream] = false; | ||
12760 | |||
12761 | ret = snd_sof_pcm_platform_open(sdev, substream); | ||
12762 | if (ret < 0) | ||
12763 | diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c | ||
12764 | index 278abfd10490..48c6d78d72e2 100644 | ||
12765 | --- a/sound/soc/sof/pm.c | ||
12766 | +++ b/sound/soc/sof/pm.c | ||
12767 | @@ -233,7 +233,7 @@ static int sof_set_hw_params_upon_resume(struct snd_sof_dev *sdev) | ||
12768 | |||
12769 | state = substream->runtime->status->state; | ||
12770 | if (state == SNDRV_PCM_STATE_SUSPENDED) | ||
12771 | - spcm->hw_params_upon_resume[dir] = 1; | ||
12772 | + spcm->prepared[dir] = false; | ||
12773 | } | ||
12774 | } | ||
12775 | |||
12776 | diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c | ||
12777 | index 65d1bac4c6b8..6fd3df7c57a3 100644 | ||
12778 | --- a/sound/soc/sof/sof-pci-dev.c | ||
12779 | +++ b/sound/soc/sof/sof-pci-dev.c | ||
12780 | @@ -223,6 +223,9 @@ static void sof_pci_probe_complete(struct device *dev) | ||
12781 | */ | ||
12782 | pm_runtime_allow(dev); | ||
12783 | |||
12784 | + /* mark last_busy for pm_runtime to make sure not suspend immediately */ | ||
12785 | + pm_runtime_mark_last_busy(dev); | ||
12786 | + | ||
12787 | /* follow recommendation in pci-driver.c to decrement usage counter */ | ||
12788 | pm_runtime_put_noidle(dev); | ||
12789 | } | ||
12790 | diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h | ||
12791 | index b8c0b2a22684..fa5cb7d2a660 100644 | ||
12792 | --- a/sound/soc/sof/sof-priv.h | ||
12793 | +++ b/sound/soc/sof/sof-priv.h | ||
12794 | @@ -297,7 +297,7 @@ struct snd_sof_pcm { | ||
12795 | struct snd_sof_pcm_stream stream[2]; | ||
12796 | struct list_head list; /* list in sdev pcm list */ | ||
12797 | struct snd_pcm_hw_params params[2]; | ||
12798 | - int hw_params_upon_resume[2]; /* set up hw_params upon resume */ | ||
12799 | + bool prepared[2]; /* PCM_PARAMS set successfully */ | ||
12800 | }; | ||
12801 | |||
12802 | /* ALSA SOF Kcontrol device */ | ||
12803 | diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c | ||
12804 | index 7fa5c61169db..ab8cb83c8b1a 100644 | ||
12805 | --- a/sound/soc/sunxi/sun4i-i2s.c | ||
12806 | +++ b/sound/soc/sunxi/sun4i-i2s.c | ||
12807 | @@ -222,10 +222,11 @@ static const struct sun4i_i2s_clk_div sun4i_i2s_mclk_div[] = { | ||
12808 | }; | ||
12809 | |||
12810 | static int sun4i_i2s_get_bclk_div(struct sun4i_i2s *i2s, | ||
12811 | - unsigned int oversample_rate, | ||
12812 | + unsigned long parent_rate, | ||
12813 | + unsigned int sampling_rate, | ||
12814 | unsigned int word_size) | ||
12815 | { | ||
12816 | - int div = oversample_rate / word_size / 2; | ||
12817 | + int div = parent_rate / sampling_rate / word_size / 2; | ||
12818 | int i; | ||
12819 | |||
12820 | for (i = 0; i < ARRAY_SIZE(sun4i_i2s_bclk_div); i++) { | ||
12821 | @@ -315,8 +316,8 @@ static int sun4i_i2s_set_clk_rate(struct snd_soc_dai *dai, | ||
12822 | return -EINVAL; | ||
12823 | } | ||
12824 | |||
12825 | - bclk_div = sun4i_i2s_get_bclk_div(i2s, oversample_rate, | ||
12826 | - word_size); | ||
12827 | + bclk_div = sun4i_i2s_get_bclk_div(i2s, i2s->mclk_freq, | ||
12828 | + rate, word_size); | ||
12829 | if (bclk_div < 0) { | ||
12830 | dev_err(dai->dev, "Unsupported BCLK divider: %d\n", bclk_div); | ||
12831 | return -EINVAL; | ||
12832 | diff --git a/sound/soc/uniphier/aio-cpu.c b/sound/soc/uniphier/aio-cpu.c | ||
12833 | index ee90e6c3937c..2ae582a99b63 100644 | ||
12834 | --- a/sound/soc/uniphier/aio-cpu.c | ||
12835 | +++ b/sound/soc/uniphier/aio-cpu.c | ||
12836 | @@ -424,8 +424,11 @@ int uniphier_aio_dai_suspend(struct snd_soc_dai *dai) | ||
12837 | { | ||
12838 | struct uniphier_aio *aio = uniphier_priv(dai); | ||
12839 | |||
12840 | - reset_control_assert(aio->chip->rst); | ||
12841 | - clk_disable_unprepare(aio->chip->clk); | ||
12842 | + aio->chip->num_wup_aios--; | ||
12843 | + if (!aio->chip->num_wup_aios) { | ||
12844 | + reset_control_assert(aio->chip->rst); | ||
12845 | + clk_disable_unprepare(aio->chip->clk); | ||
12846 | + } | ||
12847 | |||
12848 | return 0; | ||
12849 | } | ||
12850 | @@ -439,13 +442,15 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai) | ||
12851 | if (!aio->chip->active) | ||
12852 | return 0; | ||
12853 | |||
12854 | - ret = clk_prepare_enable(aio->chip->clk); | ||
12855 | - if (ret) | ||
12856 | - return ret; | ||
12857 | + if (!aio->chip->num_wup_aios) { | ||
12858 | + ret = clk_prepare_enable(aio->chip->clk); | ||
12859 | + if (ret) | ||
12860 | + return ret; | ||
12861 | |||
12862 | - ret = reset_control_deassert(aio->chip->rst); | ||
12863 | - if (ret) | ||
12864 | - goto err_out_clock; | ||
12865 | + ret = reset_control_deassert(aio->chip->rst); | ||
12866 | + if (ret) | ||
12867 | + goto err_out_clock; | ||
12868 | + } | ||
12869 | |||
12870 | aio_iecout_set_enable(aio->chip, true); | ||
12871 | aio_chip_init(aio->chip); | ||
12872 | @@ -458,7 +463,7 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai) | ||
12873 | |||
12874 | ret = aio_init(sub); | ||
12875 | if (ret) | ||
12876 | - goto err_out_clock; | ||
12877 | + goto err_out_reset; | ||
12878 | |||
12879 | if (!sub->setting) | ||
12880 | continue; | ||
12881 | @@ -466,11 +471,16 @@ int uniphier_aio_dai_resume(struct snd_soc_dai *dai) | ||
12882 | aio_port_reset(sub); | ||
12883 | aio_src_reset(sub); | ||
12884 | } | ||
12885 | + aio->chip->num_wup_aios++; | ||
12886 | |||
12887 | return 0; | ||
12888 | |||
12889 | +err_out_reset: | ||
12890 | + if (!aio->chip->num_wup_aios) | ||
12891 | + reset_control_assert(aio->chip->rst); | ||
12892 | err_out_clock: | ||
12893 | - clk_disable_unprepare(aio->chip->clk); | ||
12894 | + if (!aio->chip->num_wup_aios) | ||
12895 | + clk_disable_unprepare(aio->chip->clk); | ||
12896 | |||
12897 | return ret; | ||
12898 | } | ||
12899 | @@ -619,6 +629,7 @@ int uniphier_aio_probe(struct platform_device *pdev) | ||
12900 | return PTR_ERR(chip->rst); | ||
12901 | |||
12902 | chip->num_aios = chip->chip_spec->num_dais; | ||
12903 | + chip->num_wup_aios = chip->num_aios; | ||
12904 | chip->aios = devm_kcalloc(dev, | ||
12905 | chip->num_aios, sizeof(struct uniphier_aio), | ||
12906 | GFP_KERNEL); | ||
12907 | diff --git a/sound/soc/uniphier/aio.h b/sound/soc/uniphier/aio.h | ||
12908 | index ca6ccbae0ee8..a7ff7e556429 100644 | ||
12909 | --- a/sound/soc/uniphier/aio.h | ||
12910 | +++ b/sound/soc/uniphier/aio.h | ||
12911 | @@ -285,6 +285,7 @@ struct uniphier_aio_chip { | ||
12912 | |||
12913 | struct uniphier_aio *aios; | ||
12914 | int num_aios; | ||
12915 | + int num_wup_aios; | ||
12916 | struct uniphier_aio_pll *plls; | ||
12917 | int num_plls; | ||
12918 | |||
12919 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c | ||
12920 | index e4bbf79de956..33cd26763c0e 100644 | ||
12921 | --- a/sound/usb/pcm.c | ||
12922 | +++ b/sound/usb/pcm.c | ||
12923 | @@ -457,6 +457,7 @@ static int set_sync_endpoint(struct snd_usb_substream *subs, | ||
12924 | } | ||
12925 | ep = get_endpoint(alts, 1)->bEndpointAddress; | ||
12926 | if (get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE && | ||
12927 | + get_endpoint(alts, 0)->bSynchAddress != 0 && | ||
12928 | ((is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress | USB_DIR_IN)) || | ||
12929 | (!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)))) { | ||
12930 | dev_err(&dev->dev, | ||
12931 | diff --git a/tools/include/uapi/asm/bitsperlong.h b/tools/include/uapi/asm/bitsperlong.h | ||
12932 | index 57aaeaf8e192..edba4d93e9e6 100644 | ||
12933 | --- a/tools/include/uapi/asm/bitsperlong.h | ||
12934 | +++ b/tools/include/uapi/asm/bitsperlong.h | ||
12935 | @@ -1,22 +1,22 @@ | ||
12936 | /* SPDX-License-Identifier: GPL-2.0 */ | ||
12937 | #if defined(__i386__) || defined(__x86_64__) | ||
12938 | -#include "../../arch/x86/include/uapi/asm/bitsperlong.h" | ||
12939 | +#include "../../../arch/x86/include/uapi/asm/bitsperlong.h" | ||
12940 | #elif defined(__aarch64__) | ||
12941 | -#include "../../arch/arm64/include/uapi/asm/bitsperlong.h" | ||
12942 | +#include "../../../arch/arm64/include/uapi/asm/bitsperlong.h" | ||
12943 | #elif defined(__powerpc__) | ||
12944 | -#include "../../arch/powerpc/include/uapi/asm/bitsperlong.h" | ||
12945 | +#include "../../../arch/powerpc/include/uapi/asm/bitsperlong.h" | ||
12946 | #elif defined(__s390__) | ||
12947 | -#include "../../arch/s390/include/uapi/asm/bitsperlong.h" | ||
12948 | +#include "../../../arch/s390/include/uapi/asm/bitsperlong.h" | ||
12949 | #elif defined(__sparc__) | ||
12950 | -#include "../../arch/sparc/include/uapi/asm/bitsperlong.h" | ||
12951 | +#include "../../../arch/sparc/include/uapi/asm/bitsperlong.h" | ||
12952 | #elif defined(__mips__) | ||
12953 | -#include "../../arch/mips/include/uapi/asm/bitsperlong.h" | ||
12954 | +#include "../../../arch/mips/include/uapi/asm/bitsperlong.h" | ||
12955 | #elif defined(__ia64__) | ||
12956 | -#include "../../arch/ia64/include/uapi/asm/bitsperlong.h" | ||
12957 | +#include "../../../arch/ia64/include/uapi/asm/bitsperlong.h" | ||
12958 | #elif defined(__riscv) | ||
12959 | -#include "../../arch/riscv/include/uapi/asm/bitsperlong.h" | ||
12960 | +#include "../../../arch/riscv/include/uapi/asm/bitsperlong.h" | ||
12961 | #elif defined(__alpha__) | ||
12962 | -#include "../../arch/alpha/include/uapi/asm/bitsperlong.h" | ||
12963 | +#include "../../../arch/alpha/include/uapi/asm/bitsperlong.h" | ||
12964 | #else | ||
12965 | #include <asm-generic/bitsperlong.h> | ||
12966 | #endif | ||
12967 | diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile | ||
12968 | index 3292c290654f..86ce17a1f7fb 100644 | ||
12969 | --- a/tools/lib/traceevent/Makefile | ||
12970 | +++ b/tools/lib/traceevent/Makefile | ||
12971 | @@ -62,15 +62,15 @@ set_plugin_dir := 1 | ||
12972 | |||
12973 | # Set plugin_dir to preffered global plugin location | ||
12974 | # If we install under $HOME directory we go under | ||
12975 | -# $(HOME)/.traceevent/plugins | ||
12976 | +# $(HOME)/.local/lib/traceevent/plugins | ||
12977 | # | ||
12978 | # We dont set PLUGIN_DIR in case we install under $HOME | ||
12979 | # directory, because by default the code looks under: | ||
12980 | -# $(HOME)/.traceevent/plugins by default. | ||
12981 | +# $(HOME)/.local/lib/traceevent/plugins by default. | ||
12982 | # | ||
12983 | ifeq ($(plugin_dir),) | ||
12984 | ifeq ($(prefix),$(HOME)) | ||
12985 | -override plugin_dir = $(HOME)/.traceevent/plugins | ||
12986 | +override plugin_dir = $(HOME)/.local/lib/traceevent/plugins | ||
12987 | set_plugin_dir := 0 | ||
12988 | else | ||
12989 | override plugin_dir = $(libdir)/traceevent/plugins | ||
12990 | diff --git a/tools/lib/traceevent/event-plugin.c b/tools/lib/traceevent/event-plugin.c | ||
12991 | index 8ca28de9337a..e1f7ddd5a6cf 100644 | ||
12992 | --- a/tools/lib/traceevent/event-plugin.c | ||
12993 | +++ b/tools/lib/traceevent/event-plugin.c | ||
12994 | @@ -18,7 +18,7 @@ | ||
12995 | #include "event-utils.h" | ||
12996 | #include "trace-seq.h" | ||
12997 | |||
12998 | -#define LOCAL_PLUGIN_DIR ".traceevent/plugins" | ||
12999 | +#define LOCAL_PLUGIN_DIR ".local/lib/traceevent/plugins/" | ||
13000 | |||
13001 | static struct registered_plugin_options { | ||
13002 | struct registered_plugin_options *next; | ||
13003 | diff --git a/tools/perf/arch/x86/util/kvm-stat.c b/tools/perf/arch/x86/util/kvm-stat.c | ||
13004 | index 865a9762f22e..3f84403c0983 100644 | ||
13005 | --- a/tools/perf/arch/x86/util/kvm-stat.c | ||
13006 | +++ b/tools/perf/arch/x86/util/kvm-stat.c | ||
13007 | @@ -1,7 +1,7 @@ | ||
13008 | // SPDX-License-Identifier: GPL-2.0 | ||
13009 | #include <errno.h> | ||
13010 | -#include "../../util/kvm-stat.h" | ||
13011 | -#include "../../util/evsel.h" | ||
13012 | +#include "../../../util/kvm-stat.h" | ||
13013 | +#include "../../../util/evsel.h" | ||
13014 | #include <asm/svm.h> | ||
13015 | #include <asm/vmx.h> | ||
13016 | #include <asm/kvm.h> | ||
13017 | diff --git a/tools/perf/arch/x86/util/tsc.c b/tools/perf/arch/x86/util/tsc.c | ||
13018 | index 950539f9a4f7..b1eb963b4a6e 100644 | ||
13019 | --- a/tools/perf/arch/x86/util/tsc.c | ||
13020 | +++ b/tools/perf/arch/x86/util/tsc.c | ||
13021 | @@ -5,10 +5,10 @@ | ||
13022 | #include <linux/stddef.h> | ||
13023 | #include <linux/perf_event.h> | ||
13024 | |||
13025 | -#include "../../perf.h" | ||
13026 | +#include "../../../perf.h" | ||
13027 | #include <linux/types.h> | ||
13028 | -#include "../../util/debug.h" | ||
13029 | -#include "../../util/tsc.h" | ||
13030 | +#include "../../../util/debug.h" | ||
13031 | +#include "../../../util/tsc.h" | ||
13032 | |||
13033 | int perf_read_tsc_conversion(const struct perf_event_mmap_page *pc, | ||
13034 | struct perf_tsc_conversion *tc) | ||
13035 | diff --git a/tools/perf/perf.c b/tools/perf/perf.c | ||
13036 | index 97e2628ea5dd..d4e4d53e8b44 100644 | ||
13037 | --- a/tools/perf/perf.c | ||
13038 | +++ b/tools/perf/perf.c | ||
13039 | @@ -441,6 +441,9 @@ int main(int argc, const char **argv) | ||
13040 | |||
13041 | srandom(time(NULL)); | ||
13042 | |||
13043 | + /* Setting $PERF_CONFIG makes perf read _only_ the given config file. */ | ||
13044 | + config_exclusive_filename = getenv("PERF_CONFIG"); | ||
13045 | + | ||
13046 | err = perf_config(perf_default_config, NULL); | ||
13047 | if (err) | ||
13048 | return err; | ||
13049 | diff --git a/tools/perf/tests/shell/trace+probe_vfs_getname.sh b/tools/perf/tests/shell/trace+probe_vfs_getname.sh | ||
13050 | index 45d269b0157e..11cc2af13f2b 100755 | ||
13051 | --- a/tools/perf/tests/shell/trace+probe_vfs_getname.sh | ||
13052 | +++ b/tools/perf/tests/shell/trace+probe_vfs_getname.sh | ||
13053 | @@ -32,6 +32,10 @@ if [ $err -ne 0 ] ; then | ||
13054 | exit $err | ||
13055 | fi | ||
13056 | |||
13057 | +# Do not use whatever ~/.perfconfig file, it may change the output | ||
13058 | +# via trace.{show_timestamp,show_prefix,etc} | ||
13059 | +export PERF_CONFIG=/dev/null | ||
13060 | + | ||
13061 | trace_open_vfs_getname | ||
13062 | err=$? | ||
13063 | rm -f ${file} | ||
13064 | diff --git a/tools/perf/trace/beauty/ioctl.c b/tools/perf/trace/beauty/ioctl.c | ||
13065 | index 52242fa4072b..e19eb6ea361d 100644 | ||
13066 | --- a/tools/perf/trace/beauty/ioctl.c | ||
13067 | +++ b/tools/perf/trace/beauty/ioctl.c | ||
13068 | @@ -21,7 +21,7 @@ | ||
13069 | static size_t ioctl__scnprintf_tty_cmd(int nr, int dir, char *bf, size_t size) | ||
13070 | { | ||
13071 | static const char *ioctl_tty_cmd[] = { | ||
13072 | - "TCGETS", "TCSETS", "TCSETSW", "TCSETSF", "TCGETA", "TCSETA", "TCSETAW", | ||
13073 | + [_IOC_NR(TCGETS)] = "TCGETS", "TCSETS", "TCSETSW", "TCSETSF", "TCGETA", "TCSETA", "TCSETAW", | ||
13074 | "TCSETAF", "TCSBRK", "TCXONC", "TCFLSH", "TIOCEXCL", "TIOCNXCL", "TIOCSCTTY", | ||
13075 | "TIOCGPGRP", "TIOCSPGRP", "TIOCOUTQ", "TIOCSTI", "TIOCGWINSZ", "TIOCSWINSZ", | ||
13076 | "TIOCMGET", "TIOCMBIS", "TIOCMBIC", "TIOCMSET", "TIOCGSOFTCAR", "TIOCSSOFTCAR", | ||
13077 | diff --git a/tools/perf/ui/browsers/scripts.c b/tools/perf/ui/browsers/scripts.c | ||
13078 | index 4d565cc14076..0355d4aaf2ee 100644 | ||
13079 | --- a/tools/perf/ui/browsers/scripts.c | ||
13080 | +++ b/tools/perf/ui/browsers/scripts.c | ||
13081 | @@ -131,8 +131,10 @@ static int list_scripts(char *script_name, bool *custom, | ||
13082 | int key = ui_browser__input_window("perf script command", | ||
13083 | "Enter perf script command line (without perf script prefix)", | ||
13084 | script_args, "", 0); | ||
13085 | - if (key != K_ENTER) | ||
13086 | - return -1; | ||
13087 | + if (key != K_ENTER) { | ||
13088 | + ret = -1; | ||
13089 | + goto out; | ||
13090 | + } | ||
13091 | sprintf(script_name, "%s script %s", perf, script_args); | ||
13092 | } else if (choice < num + max_std) { | ||
13093 | strcpy(script_name, paths[choice]); | ||
13094 | diff --git a/tools/perf/ui/helpline.c b/tools/perf/ui/helpline.c | ||
13095 | index b3c421429ed4..54bcd08df87e 100644 | ||
13096 | --- a/tools/perf/ui/helpline.c | ||
13097 | +++ b/tools/perf/ui/helpline.c | ||
13098 | @@ -3,10 +3,10 @@ | ||
13099 | #include <stdlib.h> | ||
13100 | #include <string.h> | ||
13101 | |||
13102 | -#include "../debug.h" | ||
13103 | +#include "../util/debug.h" | ||
13104 | #include "helpline.h" | ||
13105 | #include "ui.h" | ||
13106 | -#include "../util.h" | ||
13107 | +#include "../util/util.h" | ||
13108 | |||
13109 | char ui_helpline__current[512]; | ||
13110 | |||
13111 | diff --git a/tools/perf/ui/util.c b/tools/perf/ui/util.c | ||
13112 | index 63bf06e80ab9..9ed76e88a3e4 100644 | ||
13113 | --- a/tools/perf/ui/util.c | ||
13114 | +++ b/tools/perf/ui/util.c | ||
13115 | @@ -1,6 +1,6 @@ | ||
13116 | // SPDX-License-Identifier: GPL-2.0 | ||
13117 | #include "util.h" | ||
13118 | -#include "../debug.h" | ||
13119 | +#include "../util/debug.h" | ||
13120 | |||
13121 | |||
13122 | /* | ||
13123 | diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c | ||
13124 | index b0364d923f76..070c3bd57882 100644 | ||
13125 | --- a/tools/perf/util/evlist.c | ||
13126 | +++ b/tools/perf/util/evlist.c | ||
13127 | @@ -20,6 +20,7 @@ | ||
13128 | #include "bpf-event.h" | ||
13129 | #include <signal.h> | ||
13130 | #include <unistd.h> | ||
13131 | +#include <sched.h> | ||
13132 | |||
13133 | #include "parse-events.h" | ||
13134 | #include <subcmd/parse-options.h> | ||
13135 | @@ -1870,6 +1871,14 @@ static void *perf_evlist__poll_thread(void *arg) | ||
13136 | struct perf_evlist *evlist = arg; | ||
13137 | bool draining = false; | ||
13138 | int i, done = 0; | ||
13139 | + /* | ||
13140 | + * In order to read symbols from other namespaces perf to needs to call | ||
13141 | + * setns(2). This isn't permitted if the struct_fs has multiple users. | ||
13142 | + * unshare(2) the fs so that we may continue to setns into namespaces | ||
13143 | + * that we're observing when, for instance, reading the build-ids at | ||
13144 | + * the end of a 'perf record' session. | ||
13145 | + */ | ||
13146 | + unshare(CLONE_FS); | ||
13147 | |||
13148 | while (!done) { | ||
13149 | bool got_data = false; | ||
13150 | diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c | ||
13151 | index 1903d7ec9797..bf7cf1249553 100644 | ||
13152 | --- a/tools/perf/util/header.c | ||
13153 | +++ b/tools/perf/util/header.c | ||
13154 | @@ -2251,8 +2251,10 @@ static int process_cpu_topology(struct feat_fd *ff, void *data __maybe_unused) | ||
13155 | /* On s390 the socket_id number is not related to the numbers of cpus. | ||
13156 | * The socket_id number might be higher than the numbers of cpus. | ||
13157 | * This depends on the configuration. | ||
13158 | + * AArch64 is the same. | ||
13159 | */ | ||
13160 | - if (ph->env.arch && !strncmp(ph->env.arch, "s390", 4)) | ||
13161 | + if (ph->env.arch && (!strncmp(ph->env.arch, "s390", 4) | ||
13162 | + || !strncmp(ph->env.arch, "aarch64", 7))) | ||
13163 | do_core_id_test = false; | ||
13164 | |||
13165 | for (i = 0; i < (u32)cpu_nr; i++) { | ||
13166 | diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c | ||
13167 | index f24fd1954f6c..6bd270a1e93e 100644 | ||
13168 | --- a/tools/perf/util/hist.c | ||
13169 | +++ b/tools/perf/util/hist.c | ||
13170 | @@ -193,7 +193,10 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h) | ||
13171 | hists__new_col_len(hists, HISTC_MEM_LVL, 21 + 3); | ||
13172 | hists__new_col_len(hists, HISTC_LOCAL_WEIGHT, 12); | ||
13173 | hists__new_col_len(hists, HISTC_GLOBAL_WEIGHT, 12); | ||
13174 | - hists__new_col_len(hists, HISTC_TIME, 12); | ||
13175 | + if (symbol_conf.nanosecs) | ||
13176 | + hists__new_col_len(hists, HISTC_TIME, 16); | ||
13177 | + else | ||
13178 | + hists__new_col_len(hists, HISTC_TIME, 12); | ||
13179 | |||
13180 | if (h->srcline) { | ||
13181 | len = MAX(strlen(h->srcline), strlen(sort_srcline.se_header)); | ||
13182 | diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c | ||
13183 | index 668410b1d426..7666206d06fa 100644 | ||
13184 | --- a/tools/perf/util/map.c | ||
13185 | +++ b/tools/perf/util/map.c | ||
13186 | @@ -647,6 +647,7 @@ struct map_groups *map_groups__new(struct machine *machine) | ||
13187 | void map_groups__delete(struct map_groups *mg) | ||
13188 | { | ||
13189 | map_groups__exit(mg); | ||
13190 | + unwind__finish_access(mg); | ||
13191 | free(mg); | ||
13192 | } | ||
13193 | |||
13194 | @@ -887,7 +888,7 @@ int map_groups__clone(struct thread *thread, struct map_groups *parent) | ||
13195 | if (new == NULL) | ||
13196 | goto out_unlock; | ||
13197 | |||
13198 | - err = unwind__prepare_access(thread, new, NULL); | ||
13199 | + err = unwind__prepare_access(mg, new, NULL); | ||
13200 | if (err) | ||
13201 | goto out_unlock; | ||
13202 | |||
13203 | diff --git a/tools/perf/util/map_groups.h b/tools/perf/util/map_groups.h | ||
13204 | index 5f25efa6d6bc..77252e14008f 100644 | ||
13205 | --- a/tools/perf/util/map_groups.h | ||
13206 | +++ b/tools/perf/util/map_groups.h | ||
13207 | @@ -31,6 +31,10 @@ struct map_groups { | ||
13208 | struct maps maps; | ||
13209 | struct machine *machine; | ||
13210 | refcount_t refcnt; | ||
13211 | +#ifdef HAVE_LIBUNWIND_SUPPORT | ||
13212 | + void *addr_space; | ||
13213 | + struct unwind_libunwind_ops *unwind_libunwind_ops; | ||
13214 | +#endif | ||
13215 | }; | ||
13216 | |||
13217 | #define KMAP_NAME_LEN 256 | ||
13218 | diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c | ||
13219 | index 590793cc5142..bbf7816cba31 100644 | ||
13220 | --- a/tools/perf/util/thread.c | ||
13221 | +++ b/tools/perf/util/thread.c | ||
13222 | @@ -105,7 +105,6 @@ void thread__delete(struct thread *thread) | ||
13223 | } | ||
13224 | up_write(&thread->comm_lock); | ||
13225 | |||
13226 | - unwind__finish_access(thread); | ||
13227 | nsinfo__zput(thread->nsinfo); | ||
13228 | srccode_state_free(&thread->srccode_state); | ||
13229 | |||
13230 | @@ -252,7 +251,7 @@ static int ____thread__set_comm(struct thread *thread, const char *str, | ||
13231 | list_add(&new->list, &thread->comm_list); | ||
13232 | |||
13233 | if (exec) | ||
13234 | - unwind__flush_access(thread); | ||
13235 | + unwind__flush_access(thread->mg); | ||
13236 | } | ||
13237 | |||
13238 | thread->comm_set = true; | ||
13239 | @@ -332,7 +331,7 @@ int thread__insert_map(struct thread *thread, struct map *map) | ||
13240 | { | ||
13241 | int ret; | ||
13242 | |||
13243 | - ret = unwind__prepare_access(thread, map, NULL); | ||
13244 | + ret = unwind__prepare_access(thread->mg, map, NULL); | ||
13245 | if (ret) | ||
13246 | return ret; | ||
13247 | |||
13248 | @@ -352,7 +351,7 @@ static int __thread__prepare_access(struct thread *thread) | ||
13249 | down_read(&maps->lock); | ||
13250 | |||
13251 | for (map = maps__first(maps); map; map = map__next(map)) { | ||
13252 | - err = unwind__prepare_access(thread, map, &initialized); | ||
13253 | + err = unwind__prepare_access(thread->mg, map, &initialized); | ||
13254 | if (err || initialized) | ||
13255 | break; | ||
13256 | } | ||
13257 | diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h | ||
13258 | index e97ef6977eb9..bf06113be4f3 100644 | ||
13259 | --- a/tools/perf/util/thread.h | ||
13260 | +++ b/tools/perf/util/thread.h | ||
13261 | @@ -44,10 +44,6 @@ struct thread { | ||
13262 | struct thread_stack *ts; | ||
13263 | struct nsinfo *nsinfo; | ||
13264 | struct srccode_state srccode_state; | ||
13265 | -#ifdef HAVE_LIBUNWIND_SUPPORT | ||
13266 | - void *addr_space; | ||
13267 | - struct unwind_libunwind_ops *unwind_libunwind_ops; | ||
13268 | -#endif | ||
13269 | bool filter; | ||
13270 | int filter_entry_depth; | ||
13271 | }; | ||
13272 | diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c | ||
13273 | index 71a788921b62..ebdbb056510c 100644 | ||
13274 | --- a/tools/perf/util/unwind-libunwind-local.c | ||
13275 | +++ b/tools/perf/util/unwind-libunwind-local.c | ||
13276 | @@ -616,26 +616,26 @@ static unw_accessors_t accessors = { | ||
13277 | .get_proc_name = get_proc_name, | ||
13278 | }; | ||
13279 | |||
13280 | -static int _unwind__prepare_access(struct thread *thread) | ||
13281 | +static int _unwind__prepare_access(struct map_groups *mg) | ||
13282 | { | ||
13283 | - thread->addr_space = unw_create_addr_space(&accessors, 0); | ||
13284 | - if (!thread->addr_space) { | ||
13285 | + mg->addr_space = unw_create_addr_space(&accessors, 0); | ||
13286 | + if (!mg->addr_space) { | ||
13287 | pr_err("unwind: Can't create unwind address space.\n"); | ||
13288 | return -ENOMEM; | ||
13289 | } | ||
13290 | |||
13291 | - unw_set_caching_policy(thread->addr_space, UNW_CACHE_GLOBAL); | ||
13292 | + unw_set_caching_policy(mg->addr_space, UNW_CACHE_GLOBAL); | ||
13293 | return 0; | ||
13294 | } | ||
13295 | |||
13296 | -static void _unwind__flush_access(struct thread *thread) | ||
13297 | +static void _unwind__flush_access(struct map_groups *mg) | ||
13298 | { | ||
13299 | - unw_flush_cache(thread->addr_space, 0, 0); | ||
13300 | + unw_flush_cache(mg->addr_space, 0, 0); | ||
13301 | } | ||
13302 | |||
13303 | -static void _unwind__finish_access(struct thread *thread) | ||
13304 | +static void _unwind__finish_access(struct map_groups *mg) | ||
13305 | { | ||
13306 | - unw_destroy_addr_space(thread->addr_space); | ||
13307 | + unw_destroy_addr_space(mg->addr_space); | ||
13308 | } | ||
13309 | |||
13310 | static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, | ||
13311 | @@ -660,7 +660,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, | ||
13312 | */ | ||
13313 | if (max_stack - 1 > 0) { | ||
13314 | WARN_ONCE(!ui->thread, "WARNING: ui->thread is NULL"); | ||
13315 | - addr_space = ui->thread->addr_space; | ||
13316 | + addr_space = ui->thread->mg->addr_space; | ||
13317 | |||
13318 | if (addr_space == NULL) | ||
13319 | return -1; | ||
13320 | diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c | ||
13321 | index c0811977d7d5..b843f9d0a9ea 100644 | ||
13322 | --- a/tools/perf/util/unwind-libunwind.c | ||
13323 | +++ b/tools/perf/util/unwind-libunwind.c | ||
13324 | @@ -11,13 +11,13 @@ struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops; | ||
13325 | struct unwind_libunwind_ops __weak *x86_32_unwind_libunwind_ops; | ||
13326 | struct unwind_libunwind_ops __weak *arm64_unwind_libunwind_ops; | ||
13327 | |||
13328 | -static void unwind__register_ops(struct thread *thread, | ||
13329 | +static void unwind__register_ops(struct map_groups *mg, | ||
13330 | struct unwind_libunwind_ops *ops) | ||
13331 | { | ||
13332 | - thread->unwind_libunwind_ops = ops; | ||
13333 | + mg->unwind_libunwind_ops = ops; | ||
13334 | } | ||
13335 | |||
13336 | -int unwind__prepare_access(struct thread *thread, struct map *map, | ||
13337 | +int unwind__prepare_access(struct map_groups *mg, struct map *map, | ||
13338 | bool *initialized) | ||
13339 | { | ||
13340 | const char *arch; | ||
13341 | @@ -28,7 +28,7 @@ int unwind__prepare_access(struct thread *thread, struct map *map, | ||
13342 | if (!dwarf_callchain_users) | ||
13343 | return 0; | ||
13344 | |||
13345 | - if (thread->addr_space) { | ||
13346 | + if (mg->addr_space) { | ||
13347 | pr_debug("unwind: thread map already set, dso=%s\n", | ||
13348 | map->dso->name); | ||
13349 | if (initialized) | ||
13350 | @@ -37,14 +37,14 @@ int unwind__prepare_access(struct thread *thread, struct map *map, | ||
13351 | } | ||
13352 | |||
13353 | /* env->arch is NULL for live-mode (i.e. perf top) */ | ||
13354 | - if (!thread->mg->machine->env || !thread->mg->machine->env->arch) | ||
13355 | + if (!mg->machine->env || !mg->machine->env->arch) | ||
13356 | goto out_register; | ||
13357 | |||
13358 | - dso_type = dso__type(map->dso, thread->mg->machine); | ||
13359 | + dso_type = dso__type(map->dso, mg->machine); | ||
13360 | if (dso_type == DSO__TYPE_UNKNOWN) | ||
13361 | return 0; | ||
13362 | |||
13363 | - arch = perf_env__arch(thread->mg->machine->env); | ||
13364 | + arch = perf_env__arch(mg->machine->env); | ||
13365 | |||
13366 | if (!strcmp(arch, "x86")) { | ||
13367 | if (dso_type != DSO__TYPE_64BIT) | ||
13368 | @@ -59,37 +59,37 @@ int unwind__prepare_access(struct thread *thread, struct map *map, | ||
13369 | return 0; | ||
13370 | } | ||
13371 | out_register: | ||
13372 | - unwind__register_ops(thread, ops); | ||
13373 | + unwind__register_ops(mg, ops); | ||
13374 | |||
13375 | - err = thread->unwind_libunwind_ops->prepare_access(thread); | ||
13376 | + err = mg->unwind_libunwind_ops->prepare_access(mg); | ||
13377 | if (initialized) | ||
13378 | *initialized = err ? false : true; | ||
13379 | return err; | ||
13380 | } | ||
13381 | |||
13382 | -void unwind__flush_access(struct thread *thread) | ||
13383 | +void unwind__flush_access(struct map_groups *mg) | ||
13384 | { | ||
13385 | if (!dwarf_callchain_users) | ||
13386 | return; | ||
13387 | |||
13388 | - if (thread->unwind_libunwind_ops) | ||
13389 | - thread->unwind_libunwind_ops->flush_access(thread); | ||
13390 | + if (mg->unwind_libunwind_ops) | ||
13391 | + mg->unwind_libunwind_ops->flush_access(mg); | ||
13392 | } | ||
13393 | |||
13394 | -void unwind__finish_access(struct thread *thread) | ||
13395 | +void unwind__finish_access(struct map_groups *mg) | ||
13396 | { | ||
13397 | if (!dwarf_callchain_users) | ||
13398 | return; | ||
13399 | |||
13400 | - if (thread->unwind_libunwind_ops) | ||
13401 | - thread->unwind_libunwind_ops->finish_access(thread); | ||
13402 | + if (mg->unwind_libunwind_ops) | ||
13403 | + mg->unwind_libunwind_ops->finish_access(mg); | ||
13404 | } | ||
13405 | |||
13406 | int unwind__get_entries(unwind_entry_cb_t cb, void *arg, | ||
13407 | struct thread *thread, | ||
13408 | struct perf_sample *data, int max_stack) | ||
13409 | { | ||
13410 | - if (thread->unwind_libunwind_ops) | ||
13411 | - return thread->unwind_libunwind_ops->get_entries(cb, arg, thread, data, max_stack); | ||
13412 | + if (thread->mg->unwind_libunwind_ops) | ||
13413 | + return thread->mg->unwind_libunwind_ops->get_entries(cb, arg, thread, data, max_stack); | ||
13414 | return 0; | ||
13415 | } | ||
13416 | diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h | ||
13417 | index 8a44a1569a21..3a7d00c20d86 100644 | ||
13418 | --- a/tools/perf/util/unwind.h | ||
13419 | +++ b/tools/perf/util/unwind.h | ||
13420 | @@ -6,6 +6,7 @@ | ||
13421 | #include <linux/types.h> | ||
13422 | |||
13423 | struct map; | ||
13424 | +struct map_groups; | ||
13425 | struct perf_sample; | ||
13426 | struct symbol; | ||
13427 | struct thread; | ||
13428 | @@ -19,9 +20,9 @@ struct unwind_entry { | ||
13429 | typedef int (*unwind_entry_cb_t)(struct unwind_entry *entry, void *arg); | ||
13430 | |||
13431 | struct unwind_libunwind_ops { | ||
13432 | - int (*prepare_access)(struct thread *thread); | ||
13433 | - void (*flush_access)(struct thread *thread); | ||
13434 | - void (*finish_access)(struct thread *thread); | ||
13435 | + int (*prepare_access)(struct map_groups *mg); | ||
13436 | + void (*flush_access)(struct map_groups *mg); | ||
13437 | + void (*finish_access)(struct map_groups *mg); | ||
13438 | int (*get_entries)(unwind_entry_cb_t cb, void *arg, | ||
13439 | struct thread *thread, | ||
13440 | struct perf_sample *data, int max_stack); | ||
13441 | @@ -46,20 +47,20 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, | ||
13442 | #endif | ||
13443 | |||
13444 | int LIBUNWIND__ARCH_REG_ID(int regnum); | ||
13445 | -int unwind__prepare_access(struct thread *thread, struct map *map, | ||
13446 | +int unwind__prepare_access(struct map_groups *mg, struct map *map, | ||
13447 | bool *initialized); | ||
13448 | -void unwind__flush_access(struct thread *thread); | ||
13449 | -void unwind__finish_access(struct thread *thread); | ||
13450 | +void unwind__flush_access(struct map_groups *mg); | ||
13451 | +void unwind__finish_access(struct map_groups *mg); | ||
13452 | #else | ||
13453 | -static inline int unwind__prepare_access(struct thread *thread __maybe_unused, | ||
13454 | +static inline int unwind__prepare_access(struct map_groups *mg __maybe_unused, | ||
13455 | struct map *map __maybe_unused, | ||
13456 | bool *initialized __maybe_unused) | ||
13457 | { | ||
13458 | return 0; | ||
13459 | } | ||
13460 | |||
13461 | -static inline void unwind__flush_access(struct thread *thread __maybe_unused) {} | ||
13462 | -static inline void unwind__finish_access(struct thread *thread __maybe_unused) {} | ||
13463 | +static inline void unwind__flush_access(struct map_groups *mg __maybe_unused) {} | ||
13464 | +static inline void unwind__finish_access(struct map_groups *mg __maybe_unused) {} | ||
13465 | #endif | ||
13466 | #else | ||
13467 | static inline int | ||
13468 | @@ -72,14 +73,14 @@ unwind__get_entries(unwind_entry_cb_t cb __maybe_unused, | ||
13469 | return 0; | ||
13470 | } | ||
13471 | |||
13472 | -static inline int unwind__prepare_access(struct thread *thread __maybe_unused, | ||
13473 | +static inline int unwind__prepare_access(struct map_groups *mg __maybe_unused, | ||
13474 | struct map *map __maybe_unused, | ||
13475 | bool *initialized __maybe_unused) | ||
13476 | { | ||
13477 | return 0; | ||
13478 | } | ||
13479 | |||
13480 | -static inline void unwind__flush_access(struct thread *thread __maybe_unused) {} | ||
13481 | -static inline void unwind__finish_access(struct thread *thread __maybe_unused) {} | ||
13482 | +static inline void unwind__flush_access(struct map_groups *mg __maybe_unused) {} | ||
13483 | +static inline void unwind__finish_access(struct map_groups *mg __maybe_unused) {} | ||
13484 | #endif /* HAVE_DWARF_UNWIND_SUPPORT */ | ||
13485 | #endif /* __UNWIND_H */ | ||
13486 | diff --git a/tools/perf/util/xyarray.h b/tools/perf/util/xyarray.h | ||
13487 | index 7ffe562e7ae7..2627b038b6f2 100644 | ||
13488 | --- a/tools/perf/util/xyarray.h | ||
13489 | +++ b/tools/perf/util/xyarray.h | ||
13490 | @@ -2,6 +2,7 @@ | ||
13491 | #ifndef _PERF_XYARRAY_H_ | ||
13492 | #define _PERF_XYARRAY_H_ 1 | ||
13493 | |||
13494 | +#include <linux/compiler.h> | ||
13495 | #include <sys/types.h> | ||
13496 | |||
13497 | struct xyarray { | ||
13498 | @@ -10,7 +11,7 @@ struct xyarray { | ||
13499 | size_t entries; | ||
13500 | size_t max_x; | ||
13501 | size_t max_y; | ||
13502 | - char contents[]; | ||
13503 | + char contents[] __aligned(8); | ||
13504 | }; | ||
13505 | |||
13506 | struct xyarray *xyarray__new(int xlen, int ylen, size_t entry_size); | ||
13507 | diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c | ||
13508 | index 91c5ad1685a1..6a10dea01eef 100644 | ||
13509 | --- a/tools/power/x86/intel-speed-select/isst-config.c | ||
13510 | +++ b/tools/power/x86/intel-speed-select/isst-config.c | ||
13511 | @@ -603,6 +603,10 @@ static int isst_fill_platform_info(void) | ||
13512 | |||
13513 | close(fd); | ||
13514 | |||
13515 | + if (isst_platform_info.api_version > supported_api_ver) { | ||
13516 | + printf("Incompatible API versions; Upgrade of tool is required\n"); | ||
13517 | + return -1; | ||
13518 | + } | ||
13519 | return 0; | ||
13520 | } | ||
13521 | |||
13522 | @@ -1529,6 +1533,7 @@ static void cmdline(int argc, char **argv) | ||
13523 | { | ||
13524 | int opt; | ||
13525 | int option_index = 0; | ||
13526 | + int ret; | ||
13527 | |||
13528 | static struct option long_options[] = { | ||
13529 | { "cpu", required_argument, 0, 'c' }, | ||
13530 | @@ -1590,13 +1595,14 @@ static void cmdline(int argc, char **argv) | ||
13531 | set_max_cpu_num(); | ||
13532 | set_cpu_present_cpu_mask(); | ||
13533 | set_cpu_target_cpu_mask(); | ||
13534 | - isst_fill_platform_info(); | ||
13535 | - if (isst_platform_info.api_version > supported_api_ver) { | ||
13536 | - printf("Incompatible API versions; Upgrade of tool is required\n"); | ||
13537 | - exit(0); | ||
13538 | - } | ||
13539 | + ret = isst_fill_platform_info(); | ||
13540 | + if (ret) | ||
13541 | + goto out; | ||
13542 | |||
13543 | process_command(argc, argv); | ||
13544 | +out: | ||
13545 | + free_cpu_set(present_cpumask); | ||
13546 | + free_cpu_set(target_cpumask); | ||
13547 | } | ||
13548 | |||
13549 | int main(int argc, char **argv) | ||
13550 | diff --git a/tools/testing/selftests/net/fib_nexthop_multiprefix.sh b/tools/testing/selftests/net/fib_nexthop_multiprefix.sh | ||
13551 | index e6828732843e..9dc35a16e415 100755 | ||
13552 | --- a/tools/testing/selftests/net/fib_nexthop_multiprefix.sh | ||
13553 | +++ b/tools/testing/selftests/net/fib_nexthop_multiprefix.sh | ||
13554 | @@ -15,6 +15,8 @@ | ||
13555 | PAUSE_ON_FAIL=no | ||
13556 | VERBOSE=0 | ||
13557 | |||
13558 | +which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) | ||
13559 | + | ||
13560 | ################################################################################ | ||
13561 | # helpers | ||
13562 | |||
13563 | @@ -200,7 +202,7 @@ validate_v6_exception() | ||
13564 | local rc | ||
13565 | |||
13566 | if [ ${ping_sz} != "0" ]; then | ||
13567 | - run_cmd ip netns exec h0 ping6 -s ${ping_sz} -c5 -w5 ${dst} | ||
13568 | + run_cmd ip netns exec h0 ${ping6} -s ${ping_sz} -c5 -w5 ${dst} | ||
13569 | fi | ||
13570 | |||
13571 | if [ "$VERBOSE" = "1" ]; then | ||
13572 | @@ -243,7 +245,7 @@ do | ||
13573 | run_cmd taskset -c ${c} ip netns exec h0 ping -c1 -w1 172.16.10${i}.1 | ||
13574 | [ $? -ne 0 ] && printf "\nERROR: ping to h${i} failed\n" && ret=1 | ||
13575 | |||
13576 | - run_cmd taskset -c ${c} ip netns exec h0 ping6 -c1 -w1 2001:db8:10${i}::1 | ||
13577 | + run_cmd taskset -c ${c} ip netns exec h0 ${ping6} -c1 -w1 2001:db8:10${i}::1 | ||
13578 | [ $? -ne 0 ] && printf "\nERROR: ping6 to h${i} failed\n" && ret=1 | ||
13579 | |||
13580 | [ $ret -ne 0 ] && break | ||
13581 | diff --git a/tools/testing/selftests/net/fib_tests.sh b/tools/testing/selftests/net/fib_tests.sh | ||
13582 | index 4465fc2dae14..c4ba0ff4a53f 100755 | ||
13583 | --- a/tools/testing/selftests/net/fib_tests.sh | ||
13584 | +++ b/tools/testing/selftests/net/fib_tests.sh | ||
13585 | @@ -9,7 +9,7 @@ ret=0 | ||
13586 | ksft_skip=4 | ||
13587 | |||
13588 | # all tests in this script. Can be overridden with -t option | ||
13589 | -TESTS="unregister down carrier nexthop ipv6_rt ipv4_rt ipv6_addr_metric ipv4_addr_metric ipv6_route_metrics ipv4_route_metrics ipv4_route_v6_gw rp_filter" | ||
13590 | +TESTS="unregister down carrier nexthop suppress ipv6_rt ipv4_rt ipv6_addr_metric ipv4_addr_metric ipv6_route_metrics ipv4_route_metrics ipv4_route_v6_gw rp_filter" | ||
13591 | |||
13592 | VERBOSE=0 | ||
13593 | PAUSE_ON_FAIL=no | ||
13594 | @@ -17,6 +17,8 @@ PAUSE=no | ||
13595 | IP="ip -netns ns1" | ||
13596 | NS_EXEC="ip netns exec ns1" | ||
13597 | |||
13598 | +which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) | ||
13599 | + | ||
13600 | log_test() | ||
13601 | { | ||
13602 | local rc=$1 | ||
13603 | @@ -614,6 +616,20 @@ fib_nexthop_test() | ||
13604 | cleanup | ||
13605 | } | ||
13606 | |||
13607 | +fib_suppress_test() | ||
13608 | +{ | ||
13609 | + $IP link add dummy1 type dummy | ||
13610 | + $IP link set dummy1 up | ||
13611 | + $IP -6 route add default dev dummy1 | ||
13612 | + $IP -6 rule add table main suppress_prefixlength 0 | ||
13613 | + ping -f -c 1000 -W 1 1234::1 || true | ||
13614 | + $IP -6 rule del table main suppress_prefixlength 0 | ||
13615 | + $IP link del dummy1 | ||
13616 | + | ||
13617 | + # If we got here without crashing, we're good. | ||
13618 | + return 0 | ||
13619 | +} | ||
13620 | + | ||
13621 | ################################################################################ | ||
13622 | # Tests on route add and replace | ||
13623 | |||
13624 | @@ -1086,7 +1102,7 @@ ipv6_route_metrics_test() | ||
13625 | log_test $rc 0 "Multipath route with mtu metric" | ||
13626 | |||
13627 | $IP -6 ro add 2001:db8:104::/64 via 2001:db8:101::2 mtu 1300 | ||
13628 | - run_cmd "ip netns exec ns1 ping6 -w1 -c1 -s 1500 2001:db8:104::1" | ||
13629 | + run_cmd "ip netns exec ns1 ${ping6} -w1 -c1 -s 1500 2001:db8:104::1" | ||
13630 | log_test $? 0 "Using route with mtu metric" | ||
13631 | |||
13632 | run_cmd "$IP -6 ro add 2001:db8:114::/64 via 2001:db8:101::2 congctl lock foo" | ||
13633 | @@ -1591,6 +1607,7 @@ do | ||
13634 | fib_carrier_test|carrier) fib_carrier_test;; | ||
13635 | fib_rp_filter_test|rp_filter) fib_rp_filter_test;; | ||
13636 | fib_nexthop_test|nexthop) fib_nexthop_test;; | ||
13637 | + fib_suppress_test|suppress) fib_suppress_test;; | ||
13638 | ipv6_route_test|ipv6_rt) ipv6_route_test;; | ||
13639 | ipv4_route_test|ipv4_rt) ipv4_route_test;; | ||
13640 | ipv6_addr_metric) ipv6_addr_metric_test;; |