Annotation of /trunk/kernel-alx/patches-4.9/0306-4.9.207-all-fixes.patch
Parent Directory | Revision Log
Revision 3581 -
(hide annotations)
(download)
Thu Aug 13 10:21:22 2020 UTC (3 years, 9 months ago) by niro
File size: 200238 byte(s)
Thu Aug 13 10:21:22 2020 UTC (3 years, 9 months ago) by niro
File size: 200238 byte(s)
linux-207
1 | niro | 3581 | diff --git a/Documentation/devicetree/bindings/rtc/abracon,abx80x.txt b/Documentation/devicetree/bindings/rtc/abracon,abx80x.txt |
2 | index be789685a1c2..18b892d010d8 100644 | ||
3 | --- a/Documentation/devicetree/bindings/rtc/abracon,abx80x.txt | ||
4 | +++ b/Documentation/devicetree/bindings/rtc/abracon,abx80x.txt | ||
5 | @@ -27,4 +27,4 @@ and valid to enable charging: | ||
6 | |||
7 | - "abracon,tc-diode": should be "standard" (0.6V) or "schottky" (0.3V) | ||
8 | - "abracon,tc-resistor": should be <0>, <3>, <6> or <11>. 0 disables the output | ||
9 | - resistor, the other values are in ohm. | ||
10 | + resistor, the other values are in kOhm. | ||
11 | diff --git a/Makefile b/Makefile | ||
12 | index 55a91bc3d8f9..aa8e52a3b73d 100644 | ||
13 | --- a/Makefile | ||
14 | +++ b/Makefile | ||
15 | @@ -1,6 +1,6 @@ | ||
16 | VERSION = 4 | ||
17 | PATCHLEVEL = 9 | ||
18 | -SUBLEVEL = 206 | ||
19 | +SUBLEVEL = 207 | ||
20 | EXTRAVERSION = | ||
21 | NAME = Roaring Lionus | ||
22 | |||
23 | @@ -1521,9 +1521,6 @@ else # KBUILD_EXTMOD | ||
24 | |||
25 | # We are always building modules | ||
26 | KBUILD_MODULES := 1 | ||
27 | -PHONY += crmodverdir | ||
28 | -crmodverdir: | ||
29 | - $(cmd_crmodverdir) | ||
30 | |||
31 | PHONY += $(objtree)/Module.symvers | ||
32 | $(objtree)/Module.symvers: | ||
33 | @@ -1535,7 +1532,7 @@ $(objtree)/Module.symvers: | ||
34 | |||
35 | module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD)) | ||
36 | PHONY += $(module-dirs) modules | ||
37 | -$(module-dirs): crmodverdir $(objtree)/Module.symvers | ||
38 | +$(module-dirs): prepare $(objtree)/Module.symvers | ||
39 | $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@) | ||
40 | |||
41 | modules: $(module-dirs) | ||
42 | @@ -1576,7 +1573,8 @@ help: | ||
43 | |||
44 | # Dummies... | ||
45 | PHONY += prepare scripts | ||
46 | -prepare: ; | ||
47 | +prepare: | ||
48 | + $(cmd_crmodverdir) | ||
49 | scripts: ; | ||
50 | endif # KBUILD_EXTMOD | ||
51 | |||
52 | @@ -1701,17 +1699,14 @@ endif | ||
53 | |||
54 | # Modules | ||
55 | /: prepare scripts FORCE | ||
56 | - $(cmd_crmodverdir) | ||
57 | $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ | ||
58 | $(build)=$(build-dir) | ||
59 | # Make sure the latest headers are built for Documentation | ||
60 | Documentation/ samples/: headers_install | ||
61 | %/: prepare scripts FORCE | ||
62 | - $(cmd_crmodverdir) | ||
63 | $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ | ||
64 | $(build)=$(build-dir) | ||
65 | %.ko: prepare scripts FORCE | ||
66 | - $(cmd_crmodverdir) | ||
67 | $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ | ||
68 | $(build)=$(build-dir) $(@:.ko=.o) | ||
69 | $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost | ||
70 | diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug | ||
71 | index a5625430bef6..bb8f39fe3a22 100644 | ||
72 | --- a/arch/arm/Kconfig.debug | ||
73 | +++ b/arch/arm/Kconfig.debug | ||
74 | @@ -987,14 +987,21 @@ choice | ||
75 | Say Y here if you want kernel low-level debugging support | ||
76 | on SOCFPGA(Cyclone 5 and Arria 5) based platforms. | ||
77 | |||
78 | - config DEBUG_SOCFPGA_UART1 | ||
79 | + config DEBUG_SOCFPGA_ARRIA10_UART1 | ||
80 | depends on ARCH_SOCFPGA | ||
81 | - bool "Use SOCFPGA UART1 for low-level debug" | ||
82 | + bool "Use SOCFPGA Arria10 UART1 for low-level debug" | ||
83 | select DEBUG_UART_8250 | ||
84 | help | ||
85 | Say Y here if you want kernel low-level debugging support | ||
86 | on SOCFPGA(Arria 10) based platforms. | ||
87 | |||
88 | + config DEBUG_SOCFPGA_CYCLONE5_UART1 | ||
89 | + depends on ARCH_SOCFPGA | ||
90 | + bool "Use SOCFPGA Cyclone 5 UART1 for low-level debug" | ||
91 | + select DEBUG_UART_8250 | ||
92 | + help | ||
93 | + Say Y here if you want kernel low-level debugging support | ||
94 | + on SOCFPGA(Cyclone 5 and Arria 5) based platforms. | ||
95 | |||
96 | config DEBUG_SUN9I_UART0 | ||
97 | bool "Kernel low-level debugging messages via sun9i UART0" | ||
98 | @@ -1534,7 +1541,8 @@ config DEBUG_UART_PHYS | ||
99 | default 0xfe800000 if ARCH_IOP32X | ||
100 | default 0xff690000 if DEBUG_RK32_UART2 | ||
101 | default 0xffc02000 if DEBUG_SOCFPGA_UART0 | ||
102 | - default 0xffc02100 if DEBUG_SOCFPGA_UART1 | ||
103 | + default 0xffc02100 if DEBUG_SOCFPGA_ARRIA10_UART1 | ||
104 | + default 0xffc03000 if DEBUG_SOCFPGA_CYCLONE5_UART1 | ||
105 | default 0xffd82340 if ARCH_IOP13XX | ||
106 | default 0xffe40000 if DEBUG_RCAR_GEN1_SCIF0 | ||
107 | default 0xffe42000 if DEBUG_RCAR_GEN1_SCIF2 | ||
108 | @@ -1624,7 +1632,8 @@ config DEBUG_UART_VIRT | ||
109 | default 0xfeb30c00 if DEBUG_KEYSTONE_UART0 | ||
110 | default 0xfeb31000 if DEBUG_KEYSTONE_UART1 | ||
111 | default 0xfec02000 if DEBUG_SOCFPGA_UART0 | ||
112 | - default 0xfec02100 if DEBUG_SOCFPGA_UART1 | ||
113 | + default 0xfec02100 if DEBUG_SOCFPGA_ARRIA10_UART1 | ||
114 | + default 0xfec03000 if DEBUG_SOCFPGA_CYCLONE5_UART1 | ||
115 | default 0xfec12000 if (DEBUG_MVEBU_UART0 || DEBUG_MVEBU_UART0_ALTERNATE) && ARCH_MVEBU | ||
116 | default 0xfec12100 if DEBUG_MVEBU_UART1_ALTERNATE | ||
117 | default 0xfec10000 if DEBUG_SIRFATLAS7_UART0 | ||
118 | @@ -1672,9 +1681,9 @@ config DEBUG_UART_8250_WORD | ||
119 | depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250 | ||
120 | depends on DEBUG_UART_8250_SHIFT >= 2 | ||
121 | default y if DEBUG_PICOXCELL_UART || \ | ||
122 | - DEBUG_SOCFPGA_UART0 || DEBUG_SOCFPGA_UART1 || \ | ||
123 | - DEBUG_KEYSTONE_UART0 || DEBUG_KEYSTONE_UART1 || \ | ||
124 | - DEBUG_ALPINE_UART0 || \ | ||
125 | + DEBUG_SOCFPGA_UART0 || DEBUG_SOCFPGA_ARRIA10_UART1 || \ | ||
126 | + DEBUG_SOCFPGA_CYCLONE5_UART1 || DEBUG_KEYSTONE_UART0 || \ | ||
127 | + DEBUG_KEYSTONE_UART1 || DEBUG_ALPINE_UART0 || \ | ||
128 | DEBUG_DAVINCI_DMx_UART0 || DEBUG_DAVINCI_DA8XX_UART1 || \ | ||
129 | DEBUG_DAVINCI_DA8XX_UART2 || \ | ||
130 | DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2 | ||
131 | diff --git a/arch/arm/boot/dts/arm-realview-pb1176.dts b/arch/arm/boot/dts/arm-realview-pb1176.dts | ||
132 | index c1fd5615ddfe..939c108c24a6 100644 | ||
133 | --- a/arch/arm/boot/dts/arm-realview-pb1176.dts | ||
134 | +++ b/arch/arm/boot/dts/arm-realview-pb1176.dts | ||
135 | @@ -45,7 +45,7 @@ | ||
136 | }; | ||
137 | |||
138 | /* The voltage to the MMC card is hardwired at 3.3V */ | ||
139 | - vmmc: fixedregulator@0 { | ||
140 | + vmmc: regulator-vmmc { | ||
141 | compatible = "regulator-fixed"; | ||
142 | regulator-name = "vmmc"; | ||
143 | regulator-min-microvolt = <3300000>; | ||
144 | @@ -53,7 +53,7 @@ | ||
145 | regulator-boot-on; | ||
146 | }; | ||
147 | |||
148 | - veth: fixedregulator@0 { | ||
149 | + veth: regulator-veth { | ||
150 | compatible = "regulator-fixed"; | ||
151 | regulator-name = "veth"; | ||
152 | regulator-min-microvolt = <3300000>; | ||
153 | diff --git a/arch/arm/boot/dts/arm-realview-pb11mp.dts b/arch/arm/boot/dts/arm-realview-pb11mp.dts | ||
154 | index e306f1cceb4e..95037c48182d 100644 | ||
155 | --- a/arch/arm/boot/dts/arm-realview-pb11mp.dts | ||
156 | +++ b/arch/arm/boot/dts/arm-realview-pb11mp.dts | ||
157 | @@ -145,7 +145,7 @@ | ||
158 | }; | ||
159 | |||
160 | /* The voltage to the MMC card is hardwired at 3.3V */ | ||
161 | - vmmc: fixedregulator@0 { | ||
162 | + vmmc: regulator-vmmc { | ||
163 | compatible = "regulator-fixed"; | ||
164 | regulator-name = "vmmc"; | ||
165 | regulator-min-microvolt = <3300000>; | ||
166 | @@ -153,7 +153,7 @@ | ||
167 | regulator-boot-on; | ||
168 | }; | ||
169 | |||
170 | - veth: fixedregulator@0 { | ||
171 | + veth: regulator-veth { | ||
172 | compatible = "regulator-fixed"; | ||
173 | regulator-name = "veth"; | ||
174 | regulator-min-microvolt = <3300000>; | ||
175 | diff --git a/arch/arm/boot/dts/arm-realview-pbx.dtsi b/arch/arm/boot/dts/arm-realview-pbx.dtsi | ||
176 | index 2bf3958b2e6b..068293254fbb 100644 | ||
177 | --- a/arch/arm/boot/dts/arm-realview-pbx.dtsi | ||
178 | +++ b/arch/arm/boot/dts/arm-realview-pbx.dtsi | ||
179 | @@ -43,7 +43,7 @@ | ||
180 | }; | ||
181 | |||
182 | /* The voltage to the MMC card is hardwired at 3.3V */ | ||
183 | - vmmc: fixedregulator@0 { | ||
184 | + vmmc: regulator-vmmc { | ||
185 | compatible = "regulator-fixed"; | ||
186 | regulator-name = "vmmc"; | ||
187 | regulator-min-microvolt = <3300000>; | ||
188 | @@ -51,7 +51,7 @@ | ||
189 | regulator-boot-on; | ||
190 | }; | ||
191 | |||
192 | - veth: fixedregulator@0 { | ||
193 | + veth: regulator-veth { | ||
194 | compatible = "regulator-fixed"; | ||
195 | regulator-name = "veth"; | ||
196 | regulator-min-microvolt = <3300000>; | ||
197 | @@ -539,4 +539,3 @@ | ||
198 | }; | ||
199 | }; | ||
200 | }; | ||
201 | - | ||
202 | diff --git a/arch/arm/boot/dts/exynos3250.dtsi b/arch/arm/boot/dts/exynos3250.dtsi | ||
203 | index 51dbd8cb91cb..99b3d2331971 100644 | ||
204 | --- a/arch/arm/boot/dts/exynos3250.dtsi | ||
205 | +++ b/arch/arm/boot/dts/exynos3250.dtsi | ||
206 | @@ -345,7 +345,7 @@ | ||
207 | }; | ||
208 | |||
209 | hsotg: hsotg@12480000 { | ||
210 | - compatible = "snps,dwc2"; | ||
211 | + compatible = "samsung,s3c6400-hsotg", "snps,dwc2"; | ||
212 | reg = <0x12480000 0x20000>; | ||
213 | interrupts = <0 141 0>; | ||
214 | clocks = <&cmu CLK_USBOTG>; | ||
215 | diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi | ||
216 | index 47e5b63339d1..e95deed6a797 100644 | ||
217 | --- a/arch/arm/boot/dts/mmp2.dtsi | ||
218 | +++ b/arch/arm/boot/dts/mmp2.dtsi | ||
219 | @@ -180,7 +180,7 @@ | ||
220 | clocks = <&soc_clocks MMP2_CLK_GPIO>; | ||
221 | resets = <&soc_clocks MMP2_CLK_GPIO>; | ||
222 | interrupt-controller; | ||
223 | - #interrupt-cells = <1>; | ||
224 | + #interrupt-cells = <2>; | ||
225 | ranges; | ||
226 | |||
227 | gcb0: gpio@d4019000 { | ||
228 | diff --git a/arch/arm/boot/dts/omap3-pandora-common.dtsi b/arch/arm/boot/dts/omap3-pandora-common.dtsi | ||
229 | index 53e007abdc71..964240a0f4a9 100644 | ||
230 | --- a/arch/arm/boot/dts/omap3-pandora-common.dtsi | ||
231 | +++ b/arch/arm/boot/dts/omap3-pandora-common.dtsi | ||
232 | @@ -221,6 +221,17 @@ | ||
233 | gpio = <&gpio6 4 GPIO_ACTIVE_HIGH>; /* GPIO_164 */ | ||
234 | }; | ||
235 | |||
236 | + /* wl1251 wifi+bt module */ | ||
237 | + wlan_en: fixed-regulator-wg7210_en { | ||
238 | + compatible = "regulator-fixed"; | ||
239 | + regulator-name = "vwlan"; | ||
240 | + regulator-min-microvolt = <1800000>; | ||
241 | + regulator-max-microvolt = <1800000>; | ||
242 | + startup-delay-us = <50000>; | ||
243 | + enable-active-high; | ||
244 | + gpio = <&gpio1 23 GPIO_ACTIVE_HIGH>; | ||
245 | + }; | ||
246 | + | ||
247 | /* wg7210 (wifi+bt module) 32k clock buffer */ | ||
248 | wg7210_32k: fixed-regulator-wg7210_32k { | ||
249 | compatible = "regulator-fixed"; | ||
250 | @@ -514,9 +525,30 @@ | ||
251 | /*wp-gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>;*/ /* GPIO_127 */ | ||
252 | }; | ||
253 | |||
254 | -/* mmc3 is probed using pdata-quirks to pass wl1251 card data */ | ||
255 | &mmc3 { | ||
256 | - status = "disabled"; | ||
257 | + vmmc-supply = <&wlan_en>; | ||
258 | + | ||
259 | + bus-width = <4>; | ||
260 | + non-removable; | ||
261 | + ti,non-removable; | ||
262 | + cap-power-off-card; | ||
263 | + | ||
264 | + pinctrl-names = "default"; | ||
265 | + pinctrl-0 = <&mmc3_pins>; | ||
266 | + | ||
267 | + #address-cells = <1>; | ||
268 | + #size-cells = <0>; | ||
269 | + | ||
270 | + wlan: wifi@1 { | ||
271 | + compatible = "ti,wl1251"; | ||
272 | + | ||
273 | + reg = <1>; | ||
274 | + | ||
275 | + interrupt-parent = <&gpio1>; | ||
276 | + interrupts = <21 IRQ_TYPE_LEVEL_HIGH>; /* GPIO_21 */ | ||
277 | + | ||
278 | + ti,wl1251-has-eeprom; | ||
279 | + }; | ||
280 | }; | ||
281 | |||
282 | /* bluetooth*/ | ||
283 | diff --git a/arch/arm/boot/dts/omap3-tao3530.dtsi b/arch/arm/boot/dts/omap3-tao3530.dtsi | ||
284 | index dc80886b5329..e3dfba8b3efe 100644 | ||
285 | --- a/arch/arm/boot/dts/omap3-tao3530.dtsi | ||
286 | +++ b/arch/arm/boot/dts/omap3-tao3530.dtsi | ||
287 | @@ -225,7 +225,7 @@ | ||
288 | pinctrl-0 = <&mmc1_pins>; | ||
289 | vmmc-supply = <&vmmc1>; | ||
290 | vmmc_aux-supply = <&vsim>; | ||
291 | - cd-gpios = <&twl_gpio 0 GPIO_ACTIVE_HIGH>; | ||
292 | + cd-gpios = <&twl_gpio 0 GPIO_ACTIVE_LOW>; | ||
293 | bus-width = <8>; | ||
294 | }; | ||
295 | |||
296 | diff --git a/arch/arm/boot/dts/pxa27x.dtsi b/arch/arm/boot/dts/pxa27x.dtsi | ||
297 | index 0e1320afa156..d629948000db 100644 | ||
298 | --- a/arch/arm/boot/dts/pxa27x.dtsi | ||
299 | +++ b/arch/arm/boot/dts/pxa27x.dtsi | ||
300 | @@ -34,7 +34,7 @@ | ||
301 | clocks = <&clks CLK_NONE>; | ||
302 | }; | ||
303 | |||
304 | - pxa27x_ohci: usb@4c000000 { | ||
305 | + usb0: usb@4c000000 { | ||
306 | compatible = "marvell,pxa-ohci"; | ||
307 | reg = <0x4c000000 0x10000>; | ||
308 | interrupts = <3>; | ||
309 | diff --git a/arch/arm/boot/dts/pxa2xx.dtsi b/arch/arm/boot/dts/pxa2xx.dtsi | ||
310 | index 3ff077ca4400..5a6f4ed92dac 100644 | ||
311 | --- a/arch/arm/boot/dts/pxa2xx.dtsi | ||
312 | +++ b/arch/arm/boot/dts/pxa2xx.dtsi | ||
313 | @@ -117,13 +117,6 @@ | ||
314 | status = "disabled"; | ||
315 | }; | ||
316 | |||
317 | - usb0: ohci@4c000000 { | ||
318 | - compatible = "marvell,pxa-ohci"; | ||
319 | - reg = <0x4c000000 0x10000>; | ||
320 | - interrupts = <3>; | ||
321 | - status = "disabled"; | ||
322 | - }; | ||
323 | - | ||
324 | mmc0: mmc@41100000 { | ||
325 | compatible = "marvell,pxa-mmc"; | ||
326 | reg = <0x41100000 0x1000>; | ||
327 | diff --git a/arch/arm/boot/dts/pxa3xx.dtsi b/arch/arm/boot/dts/pxa3xx.dtsi | ||
328 | index 9d6f3aacedb7..4aee15062690 100644 | ||
329 | --- a/arch/arm/boot/dts/pxa3xx.dtsi | ||
330 | +++ b/arch/arm/boot/dts/pxa3xx.dtsi | ||
331 | @@ -187,7 +187,7 @@ | ||
332 | status = "disabled"; | ||
333 | }; | ||
334 | |||
335 | - pxa3xx_ohci: usb@4c000000 { | ||
336 | + usb0: usb@4c000000 { | ||
337 | compatible = "marvell,pxa-ohci"; | ||
338 | reg = <0x4c000000 0x10000>; | ||
339 | interrupts = <3>; | ||
340 | diff --git a/arch/arm/boot/dts/rk3288-rock2-som.dtsi b/arch/arm/boot/dts/rk3288-rock2-som.dtsi | ||
341 | index bb1f01e037ba..c1c576875bc8 100644 | ||
342 | --- a/arch/arm/boot/dts/rk3288-rock2-som.dtsi | ||
343 | +++ b/arch/arm/boot/dts/rk3288-rock2-som.dtsi | ||
344 | @@ -63,7 +63,7 @@ | ||
345 | |||
346 | vcc_flash: flash-regulator { | ||
347 | compatible = "regulator-fixed"; | ||
348 | - regulator-name = "vcc_sys"; | ||
349 | + regulator-name = "vcc_flash"; | ||
350 | regulator-min-microvolt = <1800000>; | ||
351 | regulator-max-microvolt = <1800000>; | ||
352 | startup-delay-us = <150>; | ||
353 | diff --git a/arch/arm/boot/dts/s3c6410-mini6410.dts b/arch/arm/boot/dts/s3c6410-mini6410.dts | ||
354 | index f4afda3594f8..de04d8764b0f 100644 | ||
355 | --- a/arch/arm/boot/dts/s3c6410-mini6410.dts | ||
356 | +++ b/arch/arm/boot/dts/s3c6410-mini6410.dts | ||
357 | @@ -167,6 +167,10 @@ | ||
358 | }; | ||
359 | }; | ||
360 | |||
361 | +&clocks { | ||
362 | + clocks = <&fin_pll>; | ||
363 | +}; | ||
364 | + | ||
365 | &sdhci0 { | ||
366 | pinctrl-names = "default"; | ||
367 | pinctrl-0 = <&sd0_clk>, <&sd0_cmd>, <&sd0_cd>, <&sd0_bus4>; | ||
368 | diff --git a/arch/arm/boot/dts/s3c6410-smdk6410.dts b/arch/arm/boot/dts/s3c6410-smdk6410.dts | ||
369 | index ecf35ec466f7..7ade1a0686d2 100644 | ||
370 | --- a/arch/arm/boot/dts/s3c6410-smdk6410.dts | ||
371 | +++ b/arch/arm/boot/dts/s3c6410-smdk6410.dts | ||
372 | @@ -71,6 +71,10 @@ | ||
373 | }; | ||
374 | }; | ||
375 | |||
376 | +&clocks { | ||
377 | + clocks = <&fin_pll>; | ||
378 | +}; | ||
379 | + | ||
380 | &sdhci0 { | ||
381 | pinctrl-names = "default"; | ||
382 | pinctrl-0 = <&sd0_clk>, <&sd0_cmd>, <&sd0_cd>, <&sd0_bus4>; | ||
383 | diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi | ||
384 | index ce1960453a0b..3bfa79717dfa 100644 | ||
385 | --- a/arch/arm/boot/dts/sun6i-a31.dtsi | ||
386 | +++ b/arch/arm/boot/dts/sun6i-a31.dtsi | ||
387 | @@ -174,7 +174,7 @@ | ||
388 | }; | ||
389 | |||
390 | pmu { | ||
391 | - compatible = "arm,cortex-a7-pmu", "arm,cortex-a15-pmu"; | ||
392 | + compatible = "arm,cortex-a7-pmu"; | ||
393 | interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>, | ||
394 | <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>, | ||
395 | <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>, | ||
396 | diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi | ||
397 | index 94cf5a1c7172..db5d30598ad6 100644 | ||
398 | --- a/arch/arm/boot/dts/sun7i-a20.dtsi | ||
399 | +++ b/arch/arm/boot/dts/sun7i-a20.dtsi | ||
400 | @@ -172,7 +172,7 @@ | ||
401 | }; | ||
402 | |||
403 | pmu { | ||
404 | - compatible = "arm,cortex-a7-pmu", "arm,cortex-a15-pmu"; | ||
405 | + compatible = "arm,cortex-a7-pmu"; | ||
406 | interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>, | ||
407 | <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; | ||
408 | }; | ||
409 | diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h | ||
410 | index 0f6c6b873bc5..e05c31af48d1 100644 | ||
411 | --- a/arch/arm/include/asm/uaccess.h | ||
412 | +++ b/arch/arm/include/asm/uaccess.h | ||
413 | @@ -379,6 +379,13 @@ do { \ | ||
414 | #define __get_user_asm_byte(x, addr, err) \ | ||
415 | __get_user_asm(x, addr, err, ldrb) | ||
416 | |||
417 | +#if __LINUX_ARM_ARCH__ >= 6 | ||
418 | + | ||
419 | +#define __get_user_asm_half(x, addr, err) \ | ||
420 | + __get_user_asm(x, addr, err, ldrh) | ||
421 | + | ||
422 | +#else | ||
423 | + | ||
424 | #ifndef __ARMEB__ | ||
425 | #define __get_user_asm_half(x, __gu_addr, err) \ | ||
426 | ({ \ | ||
427 | @@ -397,6 +404,8 @@ do { \ | ||
428 | }) | ||
429 | #endif | ||
430 | |||
431 | +#endif /* __LINUX_ARM_ARCH__ >= 6 */ | ||
432 | + | ||
433 | #define __get_user_asm_word(x, addr, err) \ | ||
434 | __get_user_asm(x, addr, err, ldr) | ||
435 | #endif | ||
436 | @@ -472,6 +481,13 @@ do { \ | ||
437 | #define __put_user_asm_byte(x, __pu_addr, err) \ | ||
438 | __put_user_asm(x, __pu_addr, err, strb) | ||
439 | |||
440 | +#if __LINUX_ARM_ARCH__ >= 6 | ||
441 | + | ||
442 | +#define __put_user_asm_half(x, __pu_addr, err) \ | ||
443 | + __put_user_asm(x, __pu_addr, err, strh) | ||
444 | + | ||
445 | +#else | ||
446 | + | ||
447 | #ifndef __ARMEB__ | ||
448 | #define __put_user_asm_half(x, __pu_addr, err) \ | ||
449 | ({ \ | ||
450 | @@ -488,6 +504,8 @@ do { \ | ||
451 | }) | ||
452 | #endif | ||
453 | |||
454 | +#endif /* __LINUX_ARM_ARCH__ >= 6 */ | ||
455 | + | ||
456 | #define __put_user_asm_word(x, __pu_addr, err) \ | ||
457 | __put_user_asm(x, __pu_addr, err, str) | ||
458 | |||
459 | diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S | ||
460 | index 746e7801dcdf..b2e4bc3a635e 100644 | ||
461 | --- a/arch/arm/lib/getuser.S | ||
462 | +++ b/arch/arm/lib/getuser.S | ||
463 | @@ -42,6 +42,12 @@ _ASM_NOKPROBE(__get_user_1) | ||
464 | |||
465 | ENTRY(__get_user_2) | ||
466 | check_uaccess r0, 2, r1, r2, __get_user_bad | ||
467 | +#if __LINUX_ARM_ARCH__ >= 6 | ||
468 | + | ||
469 | +2: TUSER(ldrh) r2, [r0] | ||
470 | + | ||
471 | +#else | ||
472 | + | ||
473 | #ifdef CONFIG_CPU_USE_DOMAINS | ||
474 | rb .req ip | ||
475 | 2: ldrbt r2, [r0], #1 | ||
476 | @@ -56,6 +62,9 @@ rb .req r0 | ||
477 | #else | ||
478 | orr r2, rb, r2, lsl #8 | ||
479 | #endif | ||
480 | + | ||
481 | +#endif /* __LINUX_ARM_ARCH__ >= 6 */ | ||
482 | + | ||
483 | mov r0, #0 | ||
484 | ret lr | ||
485 | ENDPROC(__get_user_2) | ||
486 | @@ -145,7 +154,9 @@ _ASM_NOKPROBE(__get_user_bad8) | ||
487 | .pushsection __ex_table, "a" | ||
488 | .long 1b, __get_user_bad | ||
489 | .long 2b, __get_user_bad | ||
490 | +#if __LINUX_ARM_ARCH__ < 6 | ||
491 | .long 3b, __get_user_bad | ||
492 | +#endif | ||
493 | .long 4b, __get_user_bad | ||
494 | .long 5b, __get_user_bad8 | ||
495 | .long 6b, __get_user_bad8 | ||
496 | diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S | ||
497 | index 38d660d3705f..515eeaa9975c 100644 | ||
498 | --- a/arch/arm/lib/putuser.S | ||
499 | +++ b/arch/arm/lib/putuser.S | ||
500 | @@ -41,16 +41,13 @@ ENDPROC(__put_user_1) | ||
501 | |||
502 | ENTRY(__put_user_2) | ||
503 | check_uaccess r0, 2, r1, ip, __put_user_bad | ||
504 | - mov ip, r2, lsr #8 | ||
505 | -#ifdef CONFIG_THUMB2_KERNEL | ||
506 | -#ifndef __ARMEB__ | ||
507 | -2: TUSER(strb) r2, [r0] | ||
508 | -3: TUSER(strb) ip, [r0, #1] | ||
509 | +#if __LINUX_ARM_ARCH__ >= 6 | ||
510 | + | ||
511 | +2: TUSER(strh) r2, [r0] | ||
512 | + | ||
513 | #else | ||
514 | -2: TUSER(strb) ip, [r0] | ||
515 | -3: TUSER(strb) r2, [r0, #1] | ||
516 | -#endif | ||
517 | -#else /* !CONFIG_THUMB2_KERNEL */ | ||
518 | + | ||
519 | + mov ip, r2, lsr #8 | ||
520 | #ifndef __ARMEB__ | ||
521 | 2: TUSER(strb) r2, [r0], #1 | ||
522 | 3: TUSER(strb) ip, [r0] | ||
523 | @@ -58,7 +55,8 @@ ENTRY(__put_user_2) | ||
524 | 2: TUSER(strb) ip, [r0], #1 | ||
525 | 3: TUSER(strb) r2, [r0] | ||
526 | #endif | ||
527 | -#endif /* CONFIG_THUMB2_KERNEL */ | ||
528 | + | ||
529 | +#endif /* __LINUX_ARM_ARCH__ >= 6 */ | ||
530 | mov r0, #0 | ||
531 | ret lr | ||
532 | ENDPROC(__put_user_2) | ||
533 | @@ -91,7 +89,9 @@ ENDPROC(__put_user_bad) | ||
534 | .pushsection __ex_table, "a" | ||
535 | .long 1b, __put_user_bad | ||
536 | .long 2b, __put_user_bad | ||
537 | +#if __LINUX_ARM_ARCH__ < 6 | ||
538 | .long 3b, __put_user_bad | ||
539 | +#endif | ||
540 | .long 4b, __put_user_bad | ||
541 | .long 5b, __put_user_bad | ||
542 | .long 6b, __put_user_bad | ||
543 | diff --git a/arch/arm/mach-omap1/id.c b/arch/arm/mach-omap1/id.c | ||
544 | index 52de382fc804..7e49dfda3d2f 100644 | ||
545 | --- a/arch/arm/mach-omap1/id.c | ||
546 | +++ b/arch/arm/mach-omap1/id.c | ||
547 | @@ -200,10 +200,10 @@ void __init omap_check_revision(void) | ||
548 | printk(KERN_INFO "Unknown OMAP cpu type: 0x%02x\n", cpu_type); | ||
549 | } | ||
550 | |||
551 | - printk(KERN_INFO "OMAP%04x", omap_revision >> 16); | ||
552 | + pr_info("OMAP%04x", omap_revision >> 16); | ||
553 | if ((omap_revision >> 8) & 0xff) | ||
554 | - printk(KERN_INFO "%x", (omap_revision >> 8) & 0xff); | ||
555 | - printk(KERN_INFO " revision %i handled as %02xxx id: %08x%08x\n", | ||
556 | + pr_cont("%x", (omap_revision >> 8) & 0xff); | ||
557 | + pr_cont(" revision %i handled as %02xxx id: %08x%08x\n", | ||
558 | die_rev, omap_revision & 0xff, system_serial_low, | ||
559 | system_serial_high); | ||
560 | } | ||
561 | diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c | ||
562 | index cc6d9fa60924..9d942f022f2f 100644 | ||
563 | --- a/arch/arm/mach-omap2/id.c | ||
564 | +++ b/arch/arm/mach-omap2/id.c | ||
565 | @@ -199,8 +199,8 @@ void __init omap2xxx_check_revision(void) | ||
566 | |||
567 | pr_info("%s", soc_name); | ||
568 | if ((omap_rev() >> 8) & 0x0f) | ||
569 | - pr_info("%s", soc_rev); | ||
570 | - pr_info("\n"); | ||
571 | + pr_cont("%s", soc_rev); | ||
572 | + pr_cont("\n"); | ||
573 | } | ||
574 | |||
575 | #define OMAP3_SHOW_FEATURE(feat) \ | ||
576 | diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c | ||
577 | index 88676fe9b119..c3b3972c301a 100644 | ||
578 | --- a/arch/arm/mach-omap2/pdata-quirks.c | ||
579 | +++ b/arch/arm/mach-omap2/pdata-quirks.c | ||
580 | @@ -308,108 +308,15 @@ static void __init omap3_logicpd_torpedo_init(void) | ||
581 | } | ||
582 | |||
583 | /* omap3pandora legacy devices */ | ||
584 | -#define PANDORA_WIFI_IRQ_GPIO 21 | ||
585 | -#define PANDORA_WIFI_NRESET_GPIO 23 | ||
586 | |||
587 | static struct platform_device pandora_backlight = { | ||
588 | .name = "pandora-backlight", | ||
589 | .id = -1, | ||
590 | }; | ||
591 | |||
592 | -static struct regulator_consumer_supply pandora_vmmc3_supply[] = { | ||
593 | - REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"), | ||
594 | -}; | ||
595 | - | ||
596 | -static struct regulator_init_data pandora_vmmc3 = { | ||
597 | - .constraints = { | ||
598 | - .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
599 | - }, | ||
600 | - .num_consumer_supplies = ARRAY_SIZE(pandora_vmmc3_supply), | ||
601 | - .consumer_supplies = pandora_vmmc3_supply, | ||
602 | -}; | ||
603 | - | ||
604 | -static struct fixed_voltage_config pandora_vwlan = { | ||
605 | - .supply_name = "vwlan", | ||
606 | - .microvolts = 1800000, /* 1.8V */ | ||
607 | - .gpio = PANDORA_WIFI_NRESET_GPIO, | ||
608 | - .startup_delay = 50000, /* 50ms */ | ||
609 | - .enable_high = 1, | ||
610 | - .init_data = &pandora_vmmc3, | ||
611 | -}; | ||
612 | - | ||
613 | -static struct platform_device pandora_vwlan_device = { | ||
614 | - .name = "reg-fixed-voltage", | ||
615 | - .id = 1, | ||
616 | - .dev = { | ||
617 | - .platform_data = &pandora_vwlan, | ||
618 | - }, | ||
619 | -}; | ||
620 | - | ||
621 | -static void pandora_wl1251_init_card(struct mmc_card *card) | ||
622 | -{ | ||
623 | - /* | ||
624 | - * We have TI wl1251 attached to MMC3. Pass this information to | ||
625 | - * SDIO core because it can't be probed by normal methods. | ||
626 | - */ | ||
627 | - if (card->type == MMC_TYPE_SDIO || card->type == MMC_TYPE_SD_COMBO) { | ||
628 | - card->quirks |= MMC_QUIRK_NONSTD_SDIO; | ||
629 | - card->cccr.wide_bus = 1; | ||
630 | - card->cis.vendor = 0x104c; | ||
631 | - card->cis.device = 0x9066; | ||
632 | - card->cis.blksize = 512; | ||
633 | - card->cis.max_dtr = 24000000; | ||
634 | - card->ocr = 0x80; | ||
635 | - } | ||
636 | -} | ||
637 | - | ||
638 | -static struct omap2_hsmmc_info pandora_mmc3[] = { | ||
639 | - { | ||
640 | - .mmc = 3, | ||
641 | - .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, | ||
642 | - .gpio_cd = -EINVAL, | ||
643 | - .gpio_wp = -EINVAL, | ||
644 | - .init_card = pandora_wl1251_init_card, | ||
645 | - }, | ||
646 | - {} /* Terminator */ | ||
647 | -}; | ||
648 | - | ||
649 | -static void __init pandora_wl1251_init(void) | ||
650 | -{ | ||
651 | - struct wl1251_platform_data pandora_wl1251_pdata; | ||
652 | - int ret; | ||
653 | - | ||
654 | - memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); | ||
655 | - | ||
656 | - pandora_wl1251_pdata.power_gpio = -1; | ||
657 | - | ||
658 | - ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, "wl1251 irq"); | ||
659 | - if (ret < 0) | ||
660 | - goto fail; | ||
661 | - | ||
662 | - pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO); | ||
663 | - if (pandora_wl1251_pdata.irq < 0) | ||
664 | - goto fail_irq; | ||
665 | - | ||
666 | - pandora_wl1251_pdata.use_eeprom = true; | ||
667 | - ret = wl1251_set_platform_data(&pandora_wl1251_pdata); | ||
668 | - if (ret < 0) | ||
669 | - goto fail_irq; | ||
670 | - | ||
671 | - return; | ||
672 | - | ||
673 | -fail_irq: | ||
674 | - gpio_free(PANDORA_WIFI_IRQ_GPIO); | ||
675 | -fail: | ||
676 | - pr_err("wl1251 board initialisation failed\n"); | ||
677 | -} | ||
678 | - | ||
679 | static void __init omap3_pandora_legacy_init(void) | ||
680 | { | ||
681 | platform_device_register(&pandora_backlight); | ||
682 | - platform_device_register(&pandora_vwlan_device); | ||
683 | - omap_hsmmc_init(pandora_mmc3); | ||
684 | - omap_hsmmc_late_init(pandora_mmc3); | ||
685 | - pandora_wl1251_init(); | ||
686 | } | ||
687 | #endif /* CONFIG_ARCH_OMAP3 */ | ||
688 | |||
689 | diff --git a/arch/arm/mach-tegra/reset-handler.S b/arch/arm/mach-tegra/reset-handler.S | ||
690 | index e3070fdab80b..3fe4ae654047 100644 | ||
691 | --- a/arch/arm/mach-tegra/reset-handler.S | ||
692 | +++ b/arch/arm/mach-tegra/reset-handler.S | ||
693 | @@ -56,16 +56,16 @@ ENTRY(tegra_resume) | ||
694 | cmp r6, #TEGRA20 | ||
695 | beq 1f @ Yes | ||
696 | /* Clear the flow controller flags for this CPU. */ | ||
697 | - cpu_to_csr_reg r1, r0 | ||
698 | + cpu_to_csr_reg r3, r0 | ||
699 | mov32 r2, TEGRA_FLOW_CTRL_BASE | ||
700 | - ldr r1, [r2, r1] | ||
701 | + ldr r1, [r2, r3] | ||
702 | /* Clear event & intr flag */ | ||
703 | orr r1, r1, \ | ||
704 | #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG | ||
705 | movw r0, #0x3FFD @ enable, cluster_switch, immed, bitmaps | ||
706 | @ & ext flags for CPU power mgnt | ||
707 | bic r1, r1, r0 | ||
708 | - str r1, [r2] | ||
709 | + str r1, [r2, r3] | ||
710 | 1: | ||
711 | |||
712 | mov32 r9, 0xc09 | ||
713 | diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi b/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi | ||
714 | index e5fc67bf46c2..a88afb6a9c0c 100644 | ||
715 | --- a/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi | ||
716 | +++ b/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi | ||
717 | @@ -1583,7 +1583,7 @@ | ||
718 | regulator-name = "VDD_HDMI_5V0"; | ||
719 | regulator-min-microvolt = <5000000>; | ||
720 | regulator-max-microvolt = <5000000>; | ||
721 | - gpio = <&exp1 12 GPIO_ACTIVE_LOW>; | ||
722 | + gpio = <&exp1 12 GPIO_ACTIVE_HIGH>; | ||
723 | enable-active-high; | ||
724 | vin-supply = <&vdd_5v0_sys>; | ||
725 | }; | ||
726 | diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig | ||
727 | index 92bcde046b6b..f8a529c85279 100644 | ||
728 | --- a/arch/mips/Kconfig | ||
729 | +++ b/arch/mips/Kconfig | ||
730 | @@ -804,6 +804,7 @@ config SIBYTE_LITTLESUR | ||
731 | select SYS_SUPPORTS_BIG_ENDIAN | ||
732 | select SYS_SUPPORTS_HIGHMEM | ||
733 | select SYS_SUPPORTS_LITTLE_ENDIAN | ||
734 | + select ZONE_DMA32 if 64BIT | ||
735 | |||
736 | config SIBYTE_SENTOSA | ||
737 | bool "Sibyte BCM91250E-Sentosa" | ||
738 | diff --git a/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c b/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c | ||
739 | index 8241fc6aa17d..3839feba68f2 100644 | ||
740 | --- a/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c | ||
741 | +++ b/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c | ||
742 | @@ -266,7 +266,7 @@ int cvmx_cmd_queue_length(cvmx_cmd_queue_id_t queue_id) | ||
743 | } else { | ||
744 | union cvmx_pko_mem_debug8 debug8; | ||
745 | debug8.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG8); | ||
746 | - return debug8.cn58xx.doorbell; | ||
747 | + return debug8.cn50xx.doorbell; | ||
748 | } | ||
749 | case CVMX_CMD_QUEUE_ZIP: | ||
750 | case CVMX_CMD_QUEUE_DFA: | ||
751 | diff --git a/arch/mips/cavium-octeon/octeon-platform.c b/arch/mips/cavium-octeon/octeon-platform.c | ||
752 | index 1ba6bcf98570..2ecc8d1b0539 100644 | ||
753 | --- a/arch/mips/cavium-octeon/octeon-platform.c | ||
754 | +++ b/arch/mips/cavium-octeon/octeon-platform.c | ||
755 | @@ -502,7 +502,7 @@ static void __init octeon_fdt_set_phy(int eth, int phy_addr) | ||
756 | if (phy_addr >= 256 && alt_phy > 0) { | ||
757 | const struct fdt_property *phy_prop; | ||
758 | struct fdt_property *alt_prop; | ||
759 | - u32 phy_handle_name; | ||
760 | + fdt32_t phy_handle_name; | ||
761 | |||
762 | /* Use the alt phy node instead.*/ | ||
763 | phy_prop = fdt_get_property(initial_boot_params, eth, "phy-handle", NULL); | ||
764 | diff --git a/arch/mips/include/asm/octeon/cvmx-pko.h b/arch/mips/include/asm/octeon/cvmx-pko.h | ||
765 | index 5f47f76ed510..20eb9c46a75a 100644 | ||
766 | --- a/arch/mips/include/asm/octeon/cvmx-pko.h | ||
767 | +++ b/arch/mips/include/asm/octeon/cvmx-pko.h | ||
768 | @@ -611,7 +611,7 @@ static inline void cvmx_pko_get_port_status(uint64_t port_num, uint64_t clear, | ||
769 | pko_reg_read_idx.s.index = cvmx_pko_get_base_queue(port_num); | ||
770 | cvmx_write_csr(CVMX_PKO_REG_READ_IDX, pko_reg_read_idx.u64); | ||
771 | debug8.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG8); | ||
772 | - status->doorbell = debug8.cn58xx.doorbell; | ||
773 | + status->doorbell = debug8.cn50xx.doorbell; | ||
774 | } | ||
775 | } | ||
776 | |||
777 | diff --git a/arch/powerpc/include/asm/sfp-machine.h b/arch/powerpc/include/asm/sfp-machine.h | ||
778 | index d89beaba26ff..8b957aabb826 100644 | ||
779 | --- a/arch/powerpc/include/asm/sfp-machine.h | ||
780 | +++ b/arch/powerpc/include/asm/sfp-machine.h | ||
781 | @@ -213,30 +213,18 @@ | ||
782 | * respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow | ||
783 | * (i.e. carry out) is not stored anywhere, and is lost. | ||
784 | */ | ||
785 | -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ | ||
786 | +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ | ||
787 | do { \ | ||
788 | if (__builtin_constant_p (bh) && (bh) == 0) \ | ||
789 | - __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ | ||
790 | - : "=r" ((USItype)(sh)), \ | ||
791 | - "=&r" ((USItype)(sl)) \ | ||
792 | - : "%r" ((USItype)(ah)), \ | ||
793 | - "%r" ((USItype)(al)), \ | ||
794 | - "rI" ((USItype)(bl))); \ | ||
795 | - else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0) \ | ||
796 | - __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ | ||
797 | - : "=r" ((USItype)(sh)), \ | ||
798 | - "=&r" ((USItype)(sl)) \ | ||
799 | - : "%r" ((USItype)(ah)), \ | ||
800 | - "%r" ((USItype)(al)), \ | ||
801 | - "rI" ((USItype)(bl))); \ | ||
802 | + __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2" \ | ||
803 | + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ | ||
804 | + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ | ||
805 | + __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2" \ | ||
806 | + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ | ||
807 | else \ | ||
808 | - __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ | ||
809 | - : "=r" ((USItype)(sh)), \ | ||
810 | - "=&r" ((USItype)(sl)) \ | ||
811 | - : "%r" ((USItype)(ah)), \ | ||
812 | - "r" ((USItype)(bh)), \ | ||
813 | - "%r" ((USItype)(al)), \ | ||
814 | - "rI" ((USItype)(bl))); \ | ||
815 | + __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3" \ | ||
816 | + : "=r" (sh), "=&r" (sl) \ | ||
817 | + : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ | ||
818 | } while (0) | ||
819 | |||
820 | /* sub_ddmmss is used in op-2.h and udivmodti4.c and should be equivalent to | ||
821 | @@ -248,44 +236,24 @@ | ||
822 | * and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, | ||
823 | * and is lost. | ||
824 | */ | ||
825 | -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ | ||
826 | +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ | ||
827 | do { \ | ||
828 | if (__builtin_constant_p (ah) && (ah) == 0) \ | ||
829 | - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ | ||
830 | - : "=r" ((USItype)(sh)), \ | ||
831 | - "=&r" ((USItype)(sl)) \ | ||
832 | - : "r" ((USItype)(bh)), \ | ||
833 | - "rI" ((USItype)(al)), \ | ||
834 | - "r" ((USItype)(bl))); \ | ||
835 | - else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0) \ | ||
836 | - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ | ||
837 | - : "=r" ((USItype)(sh)), \ | ||
838 | - "=&r" ((USItype)(sl)) \ | ||
839 | - : "r" ((USItype)(bh)), \ | ||
840 | - "rI" ((USItype)(al)), \ | ||
841 | - "r" ((USItype)(bl))); \ | ||
842 | + __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2" \ | ||
843 | + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ | ||
844 | + else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \ | ||
845 | + __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2" \ | ||
846 | + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ | ||
847 | else if (__builtin_constant_p (bh) && (bh) == 0) \ | ||
848 | - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ | ||
849 | - : "=r" ((USItype)(sh)), \ | ||
850 | - "=&r" ((USItype)(sl)) \ | ||
851 | - : "r" ((USItype)(ah)), \ | ||
852 | - "rI" ((USItype)(al)), \ | ||
853 | - "r" ((USItype)(bl))); \ | ||
854 | - else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0) \ | ||
855 | - __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ | ||
856 | - : "=r" ((USItype)(sh)), \ | ||
857 | - "=&r" ((USItype)(sl)) \ | ||
858 | - : "r" ((USItype)(ah)), \ | ||
859 | - "rI" ((USItype)(al)), \ | ||
860 | - "r" ((USItype)(bl))); \ | ||
861 | + __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2" \ | ||
862 | + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ | ||
863 | + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ | ||
864 | + __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2" \ | ||
865 | + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ | ||
866 | else \ | ||
867 | - __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ | ||
868 | - : "=r" ((USItype)(sh)), \ | ||
869 | - "=&r" ((USItype)(sl)) \ | ||
870 | - : "r" ((USItype)(ah)), \ | ||
871 | - "r" ((USItype)(bh)), \ | ||
872 | - "rI" ((USItype)(al)), \ | ||
873 | - "r" ((USItype)(bl))); \ | ||
874 | + __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2" \ | ||
875 | + : "=r" (sh), "=&r" (sl) \ | ||
876 | + : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ | ||
877 | } while (0) | ||
878 | |||
879 | /* asm fragments for mul and div */ | ||
880 | @@ -294,13 +262,10 @@ | ||
881 | * UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype | ||
882 | * word product in HIGH_PROD and LOW_PROD. | ||
883 | */ | ||
884 | -#define umul_ppmm(ph, pl, m0, m1) \ | ||
885 | +#define umul_ppmm(ph, pl, m0, m1) \ | ||
886 | do { \ | ||
887 | USItype __m0 = (m0), __m1 = (m1); \ | ||
888 | - __asm__ ("mulhwu %0,%1,%2" \ | ||
889 | - : "=r" ((USItype)(ph)) \ | ||
890 | - : "%r" (__m0), \ | ||
891 | - "r" (__m1)); \ | ||
892 | + __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ | ||
893 | (pl) = __m0 * __m1; \ | ||
894 | } while (0) | ||
895 | |||
896 | @@ -312,9 +277,10 @@ | ||
897 | * significant bit of DENOMINATOR must be 1, then the pre-processor symbol | ||
898 | * UDIV_NEEDS_NORMALIZATION is defined to 1. | ||
899 | */ | ||
900 | -#define udiv_qrnnd(q, r, n1, n0, d) \ | ||
901 | +#define udiv_qrnnd(q, r, n1, n0, d) \ | ||
902 | do { \ | ||
903 | - UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m; \ | ||
904 | + UWtype __d1, __d0, __q1, __q0; \ | ||
905 | + UWtype __r1, __r0, __m; \ | ||
906 | __d1 = __ll_highpart (d); \ | ||
907 | __d0 = __ll_lowpart (d); \ | ||
908 | \ | ||
909 | @@ -325,7 +291,7 @@ | ||
910 | if (__r1 < __m) \ | ||
911 | { \ | ||
912 | __q1--, __r1 += (d); \ | ||
913 | - if (__r1 >= (d)) /* we didn't get carry when adding to __r1 */ \ | ||
914 | + if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ | ||
915 | if (__r1 < __m) \ | ||
916 | __q1--, __r1 += (d); \ | ||
917 | } \ | ||
918 | diff --git a/arch/powerpc/include/asm/vdso_datapage.h b/arch/powerpc/include/asm/vdso_datapage.h | ||
919 | index 1afe90ade595..674c03350cd1 100644 | ||
920 | --- a/arch/powerpc/include/asm/vdso_datapage.h | ||
921 | +++ b/arch/powerpc/include/asm/vdso_datapage.h | ||
922 | @@ -86,6 +86,7 @@ struct vdso_data { | ||
923 | __s32 wtom_clock_nsec; | ||
924 | struct timespec stamp_xtime; /* xtime as at tb_orig_stamp */ | ||
925 | __u32 stamp_sec_fraction; /* fractional seconds of stamp_xtime */ | ||
926 | + __u32 hrtimer_res; /* hrtimer resolution */ | ||
927 | __u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls */ | ||
928 | __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */ | ||
929 | }; | ||
930 | @@ -107,6 +108,7 @@ struct vdso_data { | ||
931 | __s32 wtom_clock_nsec; | ||
932 | struct timespec stamp_xtime; /* xtime as at tb_orig_stamp */ | ||
933 | __u32 stamp_sec_fraction; /* fractional seconds of stamp_xtime */ | ||
934 | + __u32 hrtimer_res; /* hrtimer resolution */ | ||
935 | __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */ | ||
936 | __u32 dcache_block_size; /* L1 d-cache block size */ | ||
937 | __u32 icache_block_size; /* L1 i-cache block size */ | ||
938 | diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c | ||
939 | index 14fbbd9035ca..dfcf28be12ba 100644 | ||
940 | --- a/arch/powerpc/kernel/asm-offsets.c | ||
941 | +++ b/arch/powerpc/kernel/asm-offsets.c | ||
942 | @@ -383,6 +383,7 @@ int main(void) | ||
943 | DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); | ||
944 | DEFINE(STAMP_XTIME, offsetof(struct vdso_data, stamp_xtime)); | ||
945 | DEFINE(STAMP_SEC_FRAC, offsetof(struct vdso_data, stamp_sec_fraction)); | ||
946 | + DEFINE(CLOCK_HRTIMER_RES, offsetof(struct vdso_data, hrtimer_res)); | ||
947 | DEFINE(CFG_ICACHE_BLOCKSZ, offsetof(struct vdso_data, icache_block_size)); | ||
948 | DEFINE(CFG_DCACHE_BLOCKSZ, offsetof(struct vdso_data, dcache_block_size)); | ||
949 | DEFINE(CFG_ICACHE_LOGBLOCKSZ, offsetof(struct vdso_data, icache_log_block_size)); | ||
950 | @@ -411,7 +412,6 @@ int main(void) | ||
951 | DEFINE(CLOCK_REALTIME, CLOCK_REALTIME); | ||
952 | DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC); | ||
953 | DEFINE(NSEC_PER_SEC, NSEC_PER_SEC); | ||
954 | - DEFINE(CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC); | ||
955 | |||
956 | #ifdef CONFIG_BUG | ||
957 | DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry)); | ||
958 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c | ||
959 | index ab7b661b6da3..3c6258a1656b 100644 | ||
960 | --- a/arch/powerpc/kernel/time.c | ||
961 | +++ b/arch/powerpc/kernel/time.c | ||
962 | @@ -862,6 +862,7 @@ void update_vsyscall_old(struct timespec *wall_time, struct timespec *wtm, | ||
963 | vdso_data->wtom_clock_nsec = wtm->tv_nsec; | ||
964 | vdso_data->stamp_xtime = *wall_time; | ||
965 | vdso_data->stamp_sec_fraction = frac_sec; | ||
966 | + vdso_data->hrtimer_res = hrtimer_resolution; | ||
967 | smp_wmb(); | ||
968 | ++(vdso_data->tb_update_count); | ||
969 | } | ||
970 | diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S | ||
971 | index 7b341b86216c..9b24466570c8 100644 | ||
972 | --- a/arch/powerpc/kernel/vdso32/gettimeofday.S | ||
973 | +++ b/arch/powerpc/kernel/vdso32/gettimeofday.S | ||
974 | @@ -160,12 +160,15 @@ V_FUNCTION_BEGIN(__kernel_clock_getres) | ||
975 | cror cr0*4+eq,cr0*4+eq,cr1*4+eq | ||
976 | bne cr0,99f | ||
977 | |||
978 | + mflr r12 | ||
979 | + .cfi_register lr,r12 | ||
980 | + bl __get_datapage@local /* get data page */ | ||
981 | + lwz r5, CLOCK_HRTIMER_RES(r3) | ||
982 | + mtlr r12 | ||
983 | li r3,0 | ||
984 | cmpli cr0,r4,0 | ||
985 | crclr cr0*4+so | ||
986 | beqlr | ||
987 | - lis r5,CLOCK_REALTIME_RES@h | ||
988 | - ori r5,r5,CLOCK_REALTIME_RES@l | ||
989 | stw r3,TSPC32_TV_SEC(r4) | ||
990 | stw r5,TSPC32_TV_NSEC(r4) | ||
991 | blr | ||
992 | diff --git a/arch/powerpc/kernel/vdso64/cacheflush.S b/arch/powerpc/kernel/vdso64/cacheflush.S | ||
993 | index 69c5af2b3c96..228a4a2383d6 100644 | ||
994 | --- a/arch/powerpc/kernel/vdso64/cacheflush.S | ||
995 | +++ b/arch/powerpc/kernel/vdso64/cacheflush.S | ||
996 | @@ -39,7 +39,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache) | ||
997 | subf r8,r6,r4 /* compute length */ | ||
998 | add r8,r8,r5 /* ensure we get enough */ | ||
999 | lwz r9,CFG_DCACHE_LOGBLOCKSZ(r10) | ||
1000 | - srw. r8,r8,r9 /* compute line count */ | ||
1001 | + srd. r8,r8,r9 /* compute line count */ | ||
1002 | crclr cr0*4+so | ||
1003 | beqlr /* nothing to do? */ | ||
1004 | mtctr r8 | ||
1005 | @@ -56,7 +56,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache) | ||
1006 | subf r8,r6,r4 /* compute length */ | ||
1007 | add r8,r8,r5 | ||
1008 | lwz r9,CFG_ICACHE_LOGBLOCKSZ(r10) | ||
1009 | - srw. r8,r8,r9 /* compute line count */ | ||
1010 | + srd. r8,r8,r9 /* compute line count */ | ||
1011 | crclr cr0*4+so | ||
1012 | beqlr /* nothing to do? */ | ||
1013 | mtctr r8 | ||
1014 | diff --git a/arch/powerpc/kernel/vdso64/gettimeofday.S b/arch/powerpc/kernel/vdso64/gettimeofday.S | ||
1015 | index 09b2a49f6dd5..c973378e1f2b 100644 | ||
1016 | --- a/arch/powerpc/kernel/vdso64/gettimeofday.S | ||
1017 | +++ b/arch/powerpc/kernel/vdso64/gettimeofday.S | ||
1018 | @@ -145,12 +145,15 @@ V_FUNCTION_BEGIN(__kernel_clock_getres) | ||
1019 | cror cr0*4+eq,cr0*4+eq,cr1*4+eq | ||
1020 | bne cr0,99f | ||
1021 | |||
1022 | + mflr r12 | ||
1023 | + .cfi_register lr,r12 | ||
1024 | + bl V_LOCAL_FUNC(__get_datapage) | ||
1025 | + lwz r5, CLOCK_HRTIMER_RES(r3) | ||
1026 | + mtlr r12 | ||
1027 | li r3,0 | ||
1028 | cmpldi cr0,r4,0 | ||
1029 | crclr cr0*4+so | ||
1030 | beqlr | ||
1031 | - lis r5,CLOCK_REALTIME_RES@h | ||
1032 | - ori r5,r5,CLOCK_REALTIME_RES@l | ||
1033 | std r3,TSPC64_TV_SEC(r4) | ||
1034 | std r5,TSPC64_TV_NSEC(r4) | ||
1035 | blr | ||
1036 | diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c | ||
1037 | index e348bee411e3..d3b2c5b25c9c 100644 | ||
1038 | --- a/arch/x86/kernel/cpu/mcheck/mce.c | ||
1039 | +++ b/arch/x86/kernel/cpu/mcheck/mce.c | ||
1040 | @@ -1648,36 +1648,6 @@ static int __mcheck_cpu_apply_quirks(struct cpuinfo_x86 *c) | ||
1041 | if (c->x86 == 0x15 && c->x86_model <= 0xf) | ||
1042 | mce_flags.overflow_recov = 1; | ||
1043 | |||
1044 | - /* | ||
1045 | - * Turn off MC4_MISC thresholding banks on those models since | ||
1046 | - * they're not supported there. | ||
1047 | - */ | ||
1048 | - if (c->x86 == 0x15 && | ||
1049 | - (c->x86_model >= 0x10 && c->x86_model <= 0x1f)) { | ||
1050 | - int i; | ||
1051 | - u64 hwcr; | ||
1052 | - bool need_toggle; | ||
1053 | - u32 msrs[] = { | ||
1054 | - 0x00000413, /* MC4_MISC0 */ | ||
1055 | - 0xc0000408, /* MC4_MISC1 */ | ||
1056 | - }; | ||
1057 | - | ||
1058 | - rdmsrl(MSR_K7_HWCR, hwcr); | ||
1059 | - | ||
1060 | - /* McStatusWrEn has to be set */ | ||
1061 | - need_toggle = !(hwcr & BIT(18)); | ||
1062 | - | ||
1063 | - if (need_toggle) | ||
1064 | - wrmsrl(MSR_K7_HWCR, hwcr | BIT(18)); | ||
1065 | - | ||
1066 | - /* Clear CntP bit safely */ | ||
1067 | - for (i = 0; i < ARRAY_SIZE(msrs); i++) | ||
1068 | - msr_clear_bit(msrs[i], 62); | ||
1069 | - | ||
1070 | - /* restore old settings */ | ||
1071 | - if (need_toggle) | ||
1072 | - wrmsrl(MSR_K7_HWCR, hwcr); | ||
1073 | - } | ||
1074 | } | ||
1075 | |||
1076 | if (c->x86_vendor == X86_VENDOR_INTEL) { | ||
1077 | diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c | ||
1078 | index 39526e1e3132..2a473cda3977 100644 | ||
1079 | --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c | ||
1080 | +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c | ||
1081 | @@ -499,6 +499,40 @@ out: | ||
1082 | return offset; | ||
1083 | } | ||
1084 | |||
1085 | +/* | ||
1086 | + * Turn off MC4_MISC thresholding banks on all family 0x15 models since | ||
1087 | + * they're not supported there. | ||
1088 | + */ | ||
1089 | +void disable_err_thresholding(struct cpuinfo_x86 *c) | ||
1090 | +{ | ||
1091 | + int i; | ||
1092 | + u64 hwcr; | ||
1093 | + bool need_toggle; | ||
1094 | + u32 msrs[] = { | ||
1095 | + 0x00000413, /* MC4_MISC0 */ | ||
1096 | + 0xc0000408, /* MC4_MISC1 */ | ||
1097 | + }; | ||
1098 | + | ||
1099 | + if (c->x86 != 0x15) | ||
1100 | + return; | ||
1101 | + | ||
1102 | + rdmsrl(MSR_K7_HWCR, hwcr); | ||
1103 | + | ||
1104 | + /* McStatusWrEn has to be set */ | ||
1105 | + need_toggle = !(hwcr & BIT(18)); | ||
1106 | + | ||
1107 | + if (need_toggle) | ||
1108 | + wrmsrl(MSR_K7_HWCR, hwcr | BIT(18)); | ||
1109 | + | ||
1110 | + /* Clear CntP bit safely */ | ||
1111 | + for (i = 0; i < ARRAY_SIZE(msrs); i++) | ||
1112 | + msr_clear_bit(msrs[i], 62); | ||
1113 | + | ||
1114 | + /* restore old settings */ | ||
1115 | + if (need_toggle) | ||
1116 | + wrmsrl(MSR_K7_HWCR, hwcr); | ||
1117 | +} | ||
1118 | + | ||
1119 | /* cpu init entry point, called from mce.c with preempt off */ | ||
1120 | void mce_amd_feature_init(struct cpuinfo_x86 *c) | ||
1121 | { | ||
1122 | @@ -506,6 +540,8 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c) | ||
1123 | unsigned int bank, block, cpu = smp_processor_id(); | ||
1124 | int offset = -1; | ||
1125 | |||
1126 | + disable_err_thresholding(c); | ||
1127 | + | ||
1128 | for (bank = 0; bank < mca_cfg.banks; ++bank) { | ||
1129 | if (mce_flags.smca) | ||
1130 | get_smca_bank_info(bank); | ||
1131 | diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c | ||
1132 | index 18c5b4920e92..242ad06fbe1a 100644 | ||
1133 | --- a/arch/x86/kvm/cpuid.c | ||
1134 | +++ b/arch/x86/kvm/cpuid.c | ||
1135 | @@ -389,7 +389,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | ||
1136 | |||
1137 | r = -E2BIG; | ||
1138 | |||
1139 | - if (*nent >= maxnent) | ||
1140 | + if (WARN_ON(*nent >= maxnent)) | ||
1141 | goto out; | ||
1142 | |||
1143 | do_cpuid_1_ent(entry, function, index); | ||
1144 | @@ -691,6 +691,9 @@ out: | ||
1145 | static int do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 func, | ||
1146 | u32 idx, int *nent, int maxnent, unsigned int type) | ||
1147 | { | ||
1148 | + if (*nent >= maxnent) | ||
1149 | + return -E2BIG; | ||
1150 | + | ||
1151 | if (type == KVM_GET_EMULATED_CPUID) | ||
1152 | return __do_cpuid_ent_emulated(entry, func, idx, nent, maxnent); | ||
1153 | |||
1154 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
1155 | index 06cd710e1d45..c9c533370e88 100644 | ||
1156 | --- a/arch/x86/kvm/x86.c | ||
1157 | +++ b/arch/x86/kvm/x86.c | ||
1158 | @@ -273,13 +273,14 @@ int kvm_set_shared_msr(unsigned slot, u64 value, u64 mask) | ||
1159 | struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu); | ||
1160 | int err; | ||
1161 | |||
1162 | - if (((value ^ smsr->values[slot].curr) & mask) == 0) | ||
1163 | + value = (value & mask) | (smsr->values[slot].host & ~mask); | ||
1164 | + if (value == smsr->values[slot].curr) | ||
1165 | return 0; | ||
1166 | - smsr->values[slot].curr = value; | ||
1167 | err = wrmsrl_safe(shared_msrs_global.msrs[slot], value); | ||
1168 | if (err) | ||
1169 | return 1; | ||
1170 | |||
1171 | + smsr->values[slot].curr = value; | ||
1172 | if (!smsr->registered) { | ||
1173 | smsr->urn.on_user_return = kvm_on_user_return; | ||
1174 | user_return_notifier_register(&smsr->urn); | ||
1175 | @@ -1074,10 +1075,15 @@ u64 kvm_get_arch_capabilities(void) | ||
1176 | * If TSX is disabled on the system, guests are also mitigated against | ||
1177 | * TAA and clear CPU buffer mitigation is not required for guests. | ||
1178 | */ | ||
1179 | - if (boot_cpu_has_bug(X86_BUG_TAA) && boot_cpu_has(X86_FEATURE_RTM) && | ||
1180 | - (data & ARCH_CAP_TSX_CTRL_MSR)) | ||
1181 | + if (!boot_cpu_has(X86_FEATURE_RTM)) | ||
1182 | + data &= ~ARCH_CAP_TAA_NO; | ||
1183 | + else if (!boot_cpu_has_bug(X86_BUG_TAA)) | ||
1184 | + data |= ARCH_CAP_TAA_NO; | ||
1185 | + else if (data & ARCH_CAP_TSX_CTRL_MSR) | ||
1186 | data &= ~ARCH_CAP_MDS_NO; | ||
1187 | |||
1188 | + /* KVM does not emulate MSR_IA32_TSX_CTRL. */ | ||
1189 | + data &= ~ARCH_CAP_TSX_CTRL_MSR; | ||
1190 | return data; | ||
1191 | } | ||
1192 | |||
1193 | diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c | ||
1194 | index 20fa7c84109d..62950ef7f84e 100644 | ||
1195 | --- a/arch/x86/pci/fixup.c | ||
1196 | +++ b/arch/x86/pci/fixup.c | ||
1197 | @@ -572,6 +572,17 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6f60, pci_invalid_bar); | ||
1198 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fa0, pci_invalid_bar); | ||
1199 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fc0, pci_invalid_bar); | ||
1200 | |||
1201 | +/* | ||
1202 | + * Device [1022:7914] | ||
1203 | + * When in D0, PME# doesn't get asserted when plugging USB 2.0 device. | ||
1204 | + */ | ||
1205 | +static void pci_fixup_amd_fch_xhci_pme(struct pci_dev *dev) | ||
1206 | +{ | ||
1207 | + dev_info(&dev->dev, "PME# does not work under D0, disabling it\n"); | ||
1208 | + dev->pme_support &= ~(PCI_PM_CAP_PME_D0 >> PCI_PM_CAP_PME_SHIFT); | ||
1209 | +} | ||
1210 | +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x7914, pci_fixup_amd_fch_xhci_pme); | ||
1211 | + | ||
1212 | /* | ||
1213 | * Apple MacBook Pro: Avoid [mem 0x7fa00000-0x7fbfffff] | ||
1214 | * | ||
1215 | diff --git a/arch/xtensa/mm/tlb.c b/arch/xtensa/mm/tlb.c | ||
1216 | index 35c822286bbe..3ce5ccdb054d 100644 | ||
1217 | --- a/arch/xtensa/mm/tlb.c | ||
1218 | +++ b/arch/xtensa/mm/tlb.c | ||
1219 | @@ -218,6 +218,8 @@ static int check_tlb_entry(unsigned w, unsigned e, bool dtlb) | ||
1220 | unsigned tlbidx = w | (e << PAGE_SHIFT); | ||
1221 | unsigned r0 = dtlb ? | ||
1222 | read_dtlb_virtual(tlbidx) : read_itlb_virtual(tlbidx); | ||
1223 | + unsigned r1 = dtlb ? | ||
1224 | + read_dtlb_translation(tlbidx) : read_itlb_translation(tlbidx); | ||
1225 | unsigned vpn = (r0 & PAGE_MASK) | (e << PAGE_SHIFT); | ||
1226 | unsigned pte = get_pte_for_vaddr(vpn); | ||
1227 | unsigned mm_asid = (get_rasid_register() >> 8) & ASID_MASK; | ||
1228 | @@ -233,8 +235,6 @@ static int check_tlb_entry(unsigned w, unsigned e, bool dtlb) | ||
1229 | } | ||
1230 | |||
1231 | if (tlb_asid == mm_asid) { | ||
1232 | - unsigned r1 = dtlb ? read_dtlb_translation(tlbidx) : | ||
1233 | - read_itlb_translation(tlbidx); | ||
1234 | if ((pte ^ r1) & PAGE_MASK) { | ||
1235 | pr_err("%cTLB: way: %u, entry: %u, mapping: %08x->%08x, PTE: %08x\n", | ||
1236 | dtlb ? 'D' : 'I', w, e, r0, r1, pte); | ||
1237 | diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c | ||
1238 | index 8c0894e0713b..5b64d9d7d147 100644 | ||
1239 | --- a/block/blk-mq-sysfs.c | ||
1240 | +++ b/block/blk-mq-sysfs.c | ||
1241 | @@ -243,20 +243,25 @@ static ssize_t blk_mq_hw_sysfs_active_show(struct blk_mq_hw_ctx *hctx, char *pag | ||
1242 | |||
1243 | static ssize_t blk_mq_hw_sysfs_cpus_show(struct blk_mq_hw_ctx *hctx, char *page) | ||
1244 | { | ||
1245 | + const size_t size = PAGE_SIZE - 1; | ||
1246 | unsigned int i, first = 1; | ||
1247 | - ssize_t ret = 0; | ||
1248 | + int ret = 0, pos = 0; | ||
1249 | |||
1250 | for_each_cpu(i, hctx->cpumask) { | ||
1251 | if (first) | ||
1252 | - ret += sprintf(ret + page, "%u", i); | ||
1253 | + ret = snprintf(pos + page, size - pos, "%u", i); | ||
1254 | else | ||
1255 | - ret += sprintf(ret + page, ", %u", i); | ||
1256 | + ret = snprintf(pos + page, size - pos, ", %u", i); | ||
1257 | + | ||
1258 | + if (ret >= size - pos) | ||
1259 | + break; | ||
1260 | |||
1261 | first = 0; | ||
1262 | + pos += ret; | ||
1263 | } | ||
1264 | |||
1265 | - ret += sprintf(ret + page, "\n"); | ||
1266 | - return ret; | ||
1267 | + ret = snprintf(pos + page, size + 1 - pos, "\n"); | ||
1268 | + return pos + ret; | ||
1269 | } | ||
1270 | |||
1271 | static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_dispatched = { | ||
1272 | diff --git a/crypto/crypto_user.c b/crypto/crypto_user.c | ||
1273 | index 60cf7d163731..810be7a9e3c4 100644 | ||
1274 | --- a/crypto/crypto_user.c | ||
1275 | +++ b/crypto/crypto_user.c | ||
1276 | @@ -269,8 +269,10 @@ static int crypto_report(struct sk_buff *in_skb, struct nlmsghdr *in_nlh, | ||
1277 | drop_alg: | ||
1278 | crypto_mod_put(alg); | ||
1279 | |||
1280 | - if (err) | ||
1281 | + if (err) { | ||
1282 | + kfree_skb(skb); | ||
1283 | return err; | ||
1284 | + } | ||
1285 | |||
1286 | return nlmsg_unicast(crypto_nlsk, skb, NETLINK_CB(in_skb).portid); | ||
1287 | } | ||
1288 | diff --git a/crypto/ecc.c b/crypto/ecc.c | ||
1289 | index 414c78a9c214..7cf6c3e4825c 100644 | ||
1290 | --- a/crypto/ecc.c | ||
1291 | +++ b/crypto/ecc.c | ||
1292 | @@ -897,10 +897,11 @@ static void ecc_point_mult(struct ecc_point *result, | ||
1293 | static inline void ecc_swap_digits(const u64 *in, u64 *out, | ||
1294 | unsigned int ndigits) | ||
1295 | { | ||
1296 | + const __be64 *src = (__force __be64 *)in; | ||
1297 | int i; | ||
1298 | |||
1299 | for (i = 0; i < ndigits; i++) | ||
1300 | - out[i] = __swab64(in[ndigits - 1 - i]); | ||
1301 | + out[i] = be64_to_cpu(src[ndigits - 1 - i]); | ||
1302 | } | ||
1303 | |||
1304 | int ecc_is_key_valid(unsigned int curve_id, unsigned int ndigits, | ||
1305 | diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c | ||
1306 | index 0a3ca20f99af..6b2c9d68d810 100644 | ||
1307 | --- a/drivers/acpi/bus.c | ||
1308 | +++ b/drivers/acpi/bus.c | ||
1309 | @@ -158,7 +158,7 @@ int acpi_bus_get_private_data(acpi_handle handle, void **data) | ||
1310 | { | ||
1311 | acpi_status status; | ||
1312 | |||
1313 | - if (!*data) | ||
1314 | + if (!data) | ||
1315 | return -EINVAL; | ||
1316 | |||
1317 | status = acpi_get_data(handle, acpi_bus_private_data_handler, data); | ||
1318 | diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c | ||
1319 | index 993fd31394c8..c76e4527620c 100644 | ||
1320 | --- a/drivers/acpi/device_pm.c | ||
1321 | +++ b/drivers/acpi/device_pm.c | ||
1322 | @@ -1096,9 +1096,19 @@ static void acpi_dev_pm_detach(struct device *dev, bool power_off) | ||
1323 | */ | ||
1324 | int acpi_dev_pm_attach(struct device *dev, bool power_on) | ||
1325 | { | ||
1326 | + /* | ||
1327 | + * Skip devices whose ACPI companions match the device IDs below, | ||
1328 | + * because they require special power management handling incompatible | ||
1329 | + * with the generic ACPI PM domain. | ||
1330 | + */ | ||
1331 | + static const struct acpi_device_id special_pm_ids[] = { | ||
1332 | + {"PNP0C0B", }, /* Generic ACPI fan */ | ||
1333 | + {"INT3404", }, /* Fan */ | ||
1334 | + {} | ||
1335 | + }; | ||
1336 | struct acpi_device *adev = ACPI_COMPANION(dev); | ||
1337 | |||
1338 | - if (!adev) | ||
1339 | + if (!adev || !acpi_match_device_ids(adev, special_pm_ids)) | ||
1340 | return -ENODEV; | ||
1341 | |||
1342 | if (dev->pm_domain) | ||
1343 | diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c | ||
1344 | index b9fade7a3bcf..c6c7e4287c4d 100644 | ||
1345 | --- a/drivers/acpi/osl.c | ||
1346 | +++ b/drivers/acpi/osl.c | ||
1347 | @@ -375,19 +375,21 @@ void *__ref acpi_os_map_memory(acpi_physical_address phys, acpi_size size) | ||
1348 | } | ||
1349 | EXPORT_SYMBOL_GPL(acpi_os_map_memory); | ||
1350 | |||
1351 | -static void acpi_os_drop_map_ref(struct acpi_ioremap *map) | ||
1352 | +/* Must be called with mutex_lock(&acpi_ioremap_lock) */ | ||
1353 | +static unsigned long acpi_os_drop_map_ref(struct acpi_ioremap *map) | ||
1354 | { | ||
1355 | - if (!--map->refcount) | ||
1356 | + unsigned long refcount = --map->refcount; | ||
1357 | + | ||
1358 | + if (!refcount) | ||
1359 | list_del_rcu(&map->list); | ||
1360 | + return refcount; | ||
1361 | } | ||
1362 | |||
1363 | static void acpi_os_map_cleanup(struct acpi_ioremap *map) | ||
1364 | { | ||
1365 | - if (!map->refcount) { | ||
1366 | - synchronize_rcu_expedited(); | ||
1367 | - acpi_unmap(map->phys, map->virt); | ||
1368 | - kfree(map); | ||
1369 | - } | ||
1370 | + synchronize_rcu_expedited(); | ||
1371 | + acpi_unmap(map->phys, map->virt); | ||
1372 | + kfree(map); | ||
1373 | } | ||
1374 | |||
1375 | /** | ||
1376 | @@ -407,6 +409,7 @@ static void acpi_os_map_cleanup(struct acpi_ioremap *map) | ||
1377 | void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size) | ||
1378 | { | ||
1379 | struct acpi_ioremap *map; | ||
1380 | + unsigned long refcount; | ||
1381 | |||
1382 | if (!acpi_gbl_permanent_mmap) { | ||
1383 | __acpi_unmap_table(virt, size); | ||
1384 | @@ -420,10 +423,11 @@ void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size) | ||
1385 | WARN(true, PREFIX "%s: bad address %p\n", __func__, virt); | ||
1386 | return; | ||
1387 | } | ||
1388 | - acpi_os_drop_map_ref(map); | ||
1389 | + refcount = acpi_os_drop_map_ref(map); | ||
1390 | mutex_unlock(&acpi_ioremap_lock); | ||
1391 | |||
1392 | - acpi_os_map_cleanup(map); | ||
1393 | + if (!refcount) | ||
1394 | + acpi_os_map_cleanup(map); | ||
1395 | } | ||
1396 | EXPORT_SYMBOL_GPL(acpi_os_unmap_iomem); | ||
1397 | |||
1398 | @@ -464,6 +468,7 @@ void acpi_os_unmap_generic_address(struct acpi_generic_address *gas) | ||
1399 | { | ||
1400 | u64 addr; | ||
1401 | struct acpi_ioremap *map; | ||
1402 | + unsigned long refcount; | ||
1403 | |||
1404 | if (gas->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) | ||
1405 | return; | ||
1406 | @@ -479,10 +484,11 @@ void acpi_os_unmap_generic_address(struct acpi_generic_address *gas) | ||
1407 | mutex_unlock(&acpi_ioremap_lock); | ||
1408 | return; | ||
1409 | } | ||
1410 | - acpi_os_drop_map_ref(map); | ||
1411 | + refcount = acpi_os_drop_map_ref(map); | ||
1412 | mutex_unlock(&acpi_ioremap_lock); | ||
1413 | |||
1414 | - acpi_os_map_cleanup(map); | ||
1415 | + if (!refcount) | ||
1416 | + acpi_os_map_cleanup(map); | ||
1417 | } | ||
1418 | EXPORT_SYMBOL(acpi_os_unmap_generic_address); | ||
1419 | |||
1420 | diff --git a/drivers/block/rsxx/core.c b/drivers/block/rsxx/core.c | ||
1421 | index 34997df132e2..6beafaa335c7 100644 | ||
1422 | --- a/drivers/block/rsxx/core.c | ||
1423 | +++ b/drivers/block/rsxx/core.c | ||
1424 | @@ -1025,8 +1025,10 @@ static void rsxx_pci_remove(struct pci_dev *dev) | ||
1425 | |||
1426 | cancel_work_sync(&card->event_work); | ||
1427 | |||
1428 | + destroy_workqueue(card->event_wq); | ||
1429 | rsxx_destroy_dev(card); | ||
1430 | rsxx_dma_destroy(card); | ||
1431 | + destroy_workqueue(card->creg_ctrl.creg_wq); | ||
1432 | |||
1433 | spin_lock_irqsave(&card->irq_lock, flags); | ||
1434 | rsxx_disable_ier_and_isr(card, CR_INTR_ALL); | ||
1435 | diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c | ||
1436 | index 336d02a488cc..3648727dfe83 100644 | ||
1437 | --- a/drivers/char/ppdev.c | ||
1438 | +++ b/drivers/char/ppdev.c | ||
1439 | @@ -624,20 +624,27 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
1440 | if (copy_from_user(time32, argp, sizeof(time32))) | ||
1441 | return -EFAULT; | ||
1442 | |||
1443 | + if ((time32[0] < 0) || (time32[1] < 0)) | ||
1444 | + return -EINVAL; | ||
1445 | + | ||
1446 | return pp_set_timeout(pp->pdev, time32[0], time32[1]); | ||
1447 | |||
1448 | case PPSETTIME64: | ||
1449 | if (copy_from_user(time64, argp, sizeof(time64))) | ||
1450 | return -EFAULT; | ||
1451 | |||
1452 | + if ((time64[0] < 0) || (time64[1] < 0)) | ||
1453 | + return -EINVAL; | ||
1454 | + | ||
1455 | + if (IS_ENABLED(CONFIG_SPARC64) && !in_compat_syscall()) | ||
1456 | + time64[1] >>= 32; | ||
1457 | + | ||
1458 | return pp_set_timeout(pp->pdev, time64[0], time64[1]); | ||
1459 | |||
1460 | case PPGETTIME32: | ||
1461 | jiffies_to_timespec64(pp->pdev->timeout, &ts); | ||
1462 | time32[0] = ts.tv_sec; | ||
1463 | time32[1] = ts.tv_nsec / NSEC_PER_USEC; | ||
1464 | - if ((time32[0] < 0) || (time32[1] < 0)) | ||
1465 | - return -EINVAL; | ||
1466 | |||
1467 | if (copy_to_user(argp, time32, sizeof(time32))) | ||
1468 | return -EFAULT; | ||
1469 | @@ -648,8 +655,9 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
1470 | jiffies_to_timespec64(pp->pdev->timeout, &ts); | ||
1471 | time64[0] = ts.tv_sec; | ||
1472 | time64[1] = ts.tv_nsec / NSEC_PER_USEC; | ||
1473 | - if ((time64[0] < 0) || (time64[1] < 0)) | ||
1474 | - return -EINVAL; | ||
1475 | + | ||
1476 | + if (IS_ENABLED(CONFIG_SPARC64) && !in_compat_syscall()) | ||
1477 | + time64[1] <<= 32; | ||
1478 | |||
1479 | if (copy_to_user(argp, time64, sizeof(time64))) | ||
1480 | return -EFAULT; | ||
1481 | diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c | ||
1482 | index 523378d1396e..d62031eedbe6 100644 | ||
1483 | --- a/drivers/clk/rockchip/clk-rk3188.c | ||
1484 | +++ b/drivers/clk/rockchip/clk-rk3188.c | ||
1485 | @@ -361,8 +361,8 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | ||
1486 | RK2928_CLKGATE_CON(2), 5, GFLAGS), | ||
1487 | MUX(SCLK_MAC, "sclk_macref", mux_sclk_macref_p, CLK_SET_RATE_PARENT, | ||
1488 | RK2928_CLKSEL_CON(21), 4, 1, MFLAGS), | ||
1489 | - GATE(0, "sclk_mac_lbtest", "sclk_macref", | ||
1490 | - RK2928_CLKGATE_CON(2), 12, 0, GFLAGS), | ||
1491 | + GATE(0, "sclk_mac_lbtest", "sclk_macref", 0, | ||
1492 | + RK2928_CLKGATE_CON(2), 12, GFLAGS), | ||
1493 | |||
1494 | COMPOSITE(0, "hsadc_src", mux_pll_src_gpll_cpll_p, 0, | ||
1495 | RK2928_CLKSEL_CON(22), 0, 1, MFLAGS, 8, 8, DFLAGS, | ||
1496 | @@ -390,8 +390,8 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | ||
1497 | * Clock-Architecture Diagram 4 | ||
1498 | */ | ||
1499 | |||
1500 | - GATE(SCLK_SMC, "sclk_smc", "hclk_peri", | ||
1501 | - RK2928_CLKGATE_CON(2), 4, 0, GFLAGS), | ||
1502 | + GATE(SCLK_SMC, "sclk_smc", "hclk_peri", 0, | ||
1503 | + RK2928_CLKGATE_CON(2), 4, GFLAGS), | ||
1504 | |||
1505 | COMPOSITE_NOMUX(SCLK_SPI0, "sclk_spi0", "pclk_peri", 0, | ||
1506 | RK2928_CLKSEL_CON(25), 0, 7, DFLAGS, | ||
1507 | diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c | ||
1508 | index a26c8a19fe93..9dd6daaa1336 100644 | ||
1509 | --- a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c | ||
1510 | +++ b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c | ||
1511 | @@ -458,7 +458,7 @@ static const char * const csi_sclk_parents[] = { "pll-periph0", "pll-periph1" }; | ||
1512 | static SUNXI_CCU_M_WITH_MUX_GATE(csi_sclk_clk, "csi-sclk", csi_sclk_parents, | ||
1513 | 0x134, 16, 4, 24, 3, BIT(31), 0); | ||
1514 | |||
1515 | -static const char * const csi_mclk_parents[] = { "osc24M", "pll-video", "pll-periph0" }; | ||
1516 | +static const char * const csi_mclk_parents[] = { "osc24M", "pll-video", "pll-periph1" }; | ||
1517 | static SUNXI_CCU_M_WITH_MUX_GATE(csi_mclk_clk, "csi-mclk", csi_mclk_parents, | ||
1518 | 0x134, 0, 5, 8, 3, BIT(15), 0); | ||
1519 | |||
1520 | diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c | ||
1521 | index ab264d393233..3780e1aa6807 100644 | ||
1522 | --- a/drivers/cpuidle/driver.c | ||
1523 | +++ b/drivers/cpuidle/driver.c | ||
1524 | @@ -61,24 +61,23 @@ static inline void __cpuidle_unset_driver(struct cpuidle_driver *drv) | ||
1525 | * __cpuidle_set_driver - set per CPU driver variables for the given driver. | ||
1526 | * @drv: a valid pointer to a struct cpuidle_driver | ||
1527 | * | ||
1528 | - * For each CPU in the driver's cpumask, unset the registered driver per CPU | ||
1529 | - * to @drv. | ||
1530 | - * | ||
1531 | - * Returns 0 on success, -EBUSY if the CPUs have driver(s) already. | ||
1532 | + * Returns 0 on success, -EBUSY if any CPU in the cpumask have a driver | ||
1533 | + * different from drv already. | ||
1534 | */ | ||
1535 | static inline int __cpuidle_set_driver(struct cpuidle_driver *drv) | ||
1536 | { | ||
1537 | int cpu; | ||
1538 | |||
1539 | for_each_cpu(cpu, drv->cpumask) { | ||
1540 | + struct cpuidle_driver *old_drv; | ||
1541 | |||
1542 | - if (__cpuidle_get_cpu_driver(cpu)) { | ||
1543 | - __cpuidle_unset_driver(drv); | ||
1544 | + old_drv = __cpuidle_get_cpu_driver(cpu); | ||
1545 | + if (old_drv && old_drv != drv) | ||
1546 | return -EBUSY; | ||
1547 | - } | ||
1548 | + } | ||
1549 | |||
1550 | + for_each_cpu(cpu, drv->cpumask) | ||
1551 | per_cpu(cpuidle_drivers, cpu) = drv; | ||
1552 | - } | ||
1553 | |||
1554 | return 0; | ||
1555 | } | ||
1556 | diff --git a/drivers/crypto/amcc/crypto4xx_core.c b/drivers/crypto/amcc/crypto4xx_core.c | ||
1557 | index 7d066fa9f2ad..e5e83c6de536 100644 | ||
1558 | --- a/drivers/crypto/amcc/crypto4xx_core.c | ||
1559 | +++ b/drivers/crypto/amcc/crypto4xx_core.c | ||
1560 | @@ -400,12 +400,8 @@ static u32 crypto4xx_build_sdr(struct crypto4xx_device *dev) | ||
1561 | dma_alloc_coherent(dev->core_dev->device, | ||
1562 | dev->scatter_buffer_size * PPC4XX_NUM_SD, | ||
1563 | &dev->scatter_buffer_pa, GFP_ATOMIC); | ||
1564 | - if (!dev->scatter_buffer_va) { | ||
1565 | - dma_free_coherent(dev->core_dev->device, | ||
1566 | - sizeof(struct ce_sd) * PPC4XX_NUM_SD, | ||
1567 | - dev->sdr, dev->sdr_pa); | ||
1568 | + if (!dev->scatter_buffer_va) | ||
1569 | return -ENOMEM; | ||
1570 | - } | ||
1571 | |||
1572 | sd_array = dev->sdr; | ||
1573 | |||
1574 | diff --git a/drivers/crypto/ccp/ccp-dmaengine.c b/drivers/crypto/ccp/ccp-dmaengine.c | ||
1575 | index 8d0eeb46d4a2..c4581510c3a1 100644 | ||
1576 | --- a/drivers/crypto/ccp/ccp-dmaengine.c | ||
1577 | +++ b/drivers/crypto/ccp/ccp-dmaengine.c | ||
1578 | @@ -309,6 +309,7 @@ static struct ccp_dma_desc *ccp_alloc_dma_desc(struct ccp_dma_chan *chan, | ||
1579 | desc->tx_desc.flags = flags; | ||
1580 | desc->tx_desc.tx_submit = ccp_tx_submit; | ||
1581 | desc->ccp = chan->ccp; | ||
1582 | + INIT_LIST_HEAD(&desc->entry); | ||
1583 | INIT_LIST_HEAD(&desc->pending); | ||
1584 | INIT_LIST_HEAD(&desc->active); | ||
1585 | desc->status = DMA_IN_PROGRESS; | ||
1586 | diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c | ||
1587 | index db70cee71caa..df62e38de5f5 100644 | ||
1588 | --- a/drivers/devfreq/devfreq.c | ||
1589 | +++ b/drivers/devfreq/devfreq.c | ||
1590 | @@ -135,6 +135,7 @@ int devfreq_update_status(struct devfreq *devfreq, unsigned long freq) | ||
1591 | int lev, prev_lev, ret = 0; | ||
1592 | unsigned long cur_time; | ||
1593 | |||
1594 | + lockdep_assert_held(&devfreq->lock); | ||
1595 | cur_time = jiffies; | ||
1596 | |||
1597 | /* Immediately exit if previous_freq is not initialized yet. */ | ||
1598 | @@ -1170,12 +1171,17 @@ static ssize_t trans_stat_show(struct device *dev, | ||
1599 | int i, j; | ||
1600 | unsigned int max_state = devfreq->profile->max_state; | ||
1601 | |||
1602 | - if (!devfreq->stop_polling && | ||
1603 | - devfreq_update_status(devfreq, devfreq->previous_freq)) | ||
1604 | - return 0; | ||
1605 | if (max_state == 0) | ||
1606 | return sprintf(buf, "Not Supported.\n"); | ||
1607 | |||
1608 | + mutex_lock(&devfreq->lock); | ||
1609 | + if (!devfreq->stop_polling && | ||
1610 | + devfreq_update_status(devfreq, devfreq->previous_freq)) { | ||
1611 | + mutex_unlock(&devfreq->lock); | ||
1612 | + return 0; | ||
1613 | + } | ||
1614 | + mutex_unlock(&devfreq->lock); | ||
1615 | + | ||
1616 | len = sprintf(buf, " From : To\n"); | ||
1617 | len += sprintf(buf + len, " :"); | ||
1618 | for (i = 0; i < max_state; i++) | ||
1619 | diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c | ||
1620 | index f0c374d6ab40..05d66d4fc31d 100644 | ||
1621 | --- a/drivers/dma-buf/sync_file.c | ||
1622 | +++ b/drivers/dma-buf/sync_file.c | ||
1623 | @@ -204,7 +204,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a, | ||
1624 | a_fences = get_fences(a, &a_num_fences); | ||
1625 | b_fences = get_fences(b, &b_num_fences); | ||
1626 | if (a_num_fences > INT_MAX - b_num_fences) | ||
1627 | - return NULL; | ||
1628 | + goto err; | ||
1629 | |||
1630 | num_fences = a_num_fences + b_num_fences; | ||
1631 | |||
1632 | diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c | ||
1633 | index 74794c9859f6..6d7d2d54eacf 100644 | ||
1634 | --- a/drivers/dma/coh901318.c | ||
1635 | +++ b/drivers/dma/coh901318.c | ||
1636 | @@ -1797,13 +1797,10 @@ static struct dma_chan *coh901318_xlate(struct of_phandle_args *dma_spec, | ||
1637 | static int coh901318_config(struct coh901318_chan *cohc, | ||
1638 | struct coh901318_params *param) | ||
1639 | { | ||
1640 | - unsigned long flags; | ||
1641 | const struct coh901318_params *p; | ||
1642 | int channel = cohc->id; | ||
1643 | void __iomem *virtbase = cohc->base->virtbase; | ||
1644 | |||
1645 | - spin_lock_irqsave(&cohc->lock, flags); | ||
1646 | - | ||
1647 | if (param) | ||
1648 | p = param; | ||
1649 | else | ||
1650 | @@ -1823,8 +1820,6 @@ static int coh901318_config(struct coh901318_chan *cohc, | ||
1651 | coh901318_set_conf(cohc, p->config); | ||
1652 | coh901318_set_ctrl(cohc, p->ctrl_lli_last); | ||
1653 | |||
1654 | - spin_unlock_irqrestore(&cohc->lock, flags); | ||
1655 | - | ||
1656 | return 0; | ||
1657 | } | ||
1658 | |||
1659 | diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c | ||
1660 | index 4a0612fb9c07..b9b48d45a6dc 100644 | ||
1661 | --- a/drivers/extcon/extcon-max8997.c | ||
1662 | +++ b/drivers/extcon/extcon-max8997.c | ||
1663 | @@ -321,12 +321,10 @@ static int max8997_muic_handle_usb(struct max8997_muic_info *info, | ||
1664 | { | ||
1665 | int ret = 0; | ||
1666 | |||
1667 | - if (usb_type == MAX8997_USB_HOST) { | ||
1668 | - ret = max8997_muic_set_path(info, info->path_usb, attached); | ||
1669 | - if (ret < 0) { | ||
1670 | - dev_err(info->dev, "failed to update muic register\n"); | ||
1671 | - return ret; | ||
1672 | - } | ||
1673 | + ret = max8997_muic_set_path(info, info->path_usb, attached); | ||
1674 | + if (ret < 0) { | ||
1675 | + dev_err(info->dev, "failed to update muic register\n"); | ||
1676 | + return ret; | ||
1677 | } | ||
1678 | |||
1679 | switch (usb_type) { | ||
1680 | diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c | ||
1681 | index 1e2e5198db53..7c31d27649fe 100644 | ||
1682 | --- a/drivers/firmware/qcom_scm-64.c | ||
1683 | +++ b/drivers/firmware/qcom_scm-64.c | ||
1684 | @@ -158,7 +158,7 @@ static int qcom_scm_call(struct device *dev, u32 svc_id, u32 cmd_id, | ||
1685 | kfree(args_virt); | ||
1686 | } | ||
1687 | |||
1688 | - if (res->a0 < 0) | ||
1689 | + if ((long)res->a0 < 0) | ||
1690 | return qcom_scm_remap_error(res->a0); | ||
1691 | |||
1692 | return 0; | ||
1693 | diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c | ||
1694 | index d91856779beb..70de29f4e2b4 100644 | ||
1695 | --- a/drivers/gpu/drm/i810/i810_dma.c | ||
1696 | +++ b/drivers/gpu/drm/i810/i810_dma.c | ||
1697 | @@ -723,7 +723,7 @@ static void i810_dma_dispatch_vertex(struct drm_device *dev, | ||
1698 | if (nbox > I810_NR_SAREA_CLIPRECTS) | ||
1699 | nbox = I810_NR_SAREA_CLIPRECTS; | ||
1700 | |||
1701 | - if (used > 4 * 1024) | ||
1702 | + if (used < 0 || used > 4 * 1024) | ||
1703 | used = 0; | ||
1704 | |||
1705 | if (sarea_priv->dirty) | ||
1706 | @@ -1043,7 +1043,7 @@ static void i810_dma_dispatch_mc(struct drm_device *dev, struct drm_buf *buf, in | ||
1707 | if (u != I810_BUF_CLIENT) | ||
1708 | DRM_DEBUG("MC found buffer that isn't mine!\n"); | ||
1709 | |||
1710 | - if (used > 4 * 1024) | ||
1711 | + if (used < 0 || used > 4 * 1024) | ||
1712 | used = 0; | ||
1713 | |||
1714 | sarea_priv->dirty = 0x7f; | ||
1715 | diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c | ||
1716 | index f5e84f4b58e6..c99a97608798 100644 | ||
1717 | --- a/drivers/gpu/drm/radeon/r100.c | ||
1718 | +++ b/drivers/gpu/drm/radeon/r100.c | ||
1719 | @@ -1824,8 +1824,8 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | ||
1720 | track->textures[i].use_pitch = 1; | ||
1721 | } else { | ||
1722 | track->textures[i].use_pitch = 0; | ||
1723 | - track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK); | ||
1724 | - track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK); | ||
1725 | + track->textures[i].width = 1 << ((idx_value & RADEON_TXFORMAT_WIDTH_MASK) >> RADEON_TXFORMAT_WIDTH_SHIFT); | ||
1726 | + track->textures[i].height = 1 << ((idx_value & RADEON_TXFORMAT_HEIGHT_MASK) >> RADEON_TXFORMAT_HEIGHT_SHIFT); | ||
1727 | } | ||
1728 | if (idx_value & RADEON_TXFORMAT_CUBIC_MAP_ENABLE) | ||
1729 | track->textures[i].tex_coord_type = 2; | ||
1730 | diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c | ||
1731 | index c70e6d5bcd19..8aa3772e935f 100644 | ||
1732 | --- a/drivers/gpu/drm/radeon/r200.c | ||
1733 | +++ b/drivers/gpu/drm/radeon/r200.c | ||
1734 | @@ -476,8 +476,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | ||
1735 | track->textures[i].use_pitch = 1; | ||
1736 | } else { | ||
1737 | track->textures[i].use_pitch = 0; | ||
1738 | - track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK); | ||
1739 | - track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK); | ||
1740 | + track->textures[i].width = 1 << ((idx_value & RADEON_TXFORMAT_WIDTH_MASK) >> RADEON_TXFORMAT_WIDTH_SHIFT); | ||
1741 | + track->textures[i].height = 1 << ((idx_value & RADEON_TXFORMAT_HEIGHT_MASK) >> RADEON_TXFORMAT_HEIGHT_SHIFT); | ||
1742 | } | ||
1743 | if (idx_value & R200_TXFORMAT_LOOKUP_DISABLE) | ||
1744 | track->textures[i].lookup_disable = true; | ||
1745 | diff --git a/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c b/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c | ||
1746 | index b9b1e9c8f4c4..00904c6b5b5e 100644 | ||
1747 | --- a/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c | ||
1748 | +++ b/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c | ||
1749 | @@ -667,10 +667,13 @@ static ssize_t cyc_threshold_store(struct device *dev, | ||
1750 | |||
1751 | if (kstrtoul(buf, 16, &val)) | ||
1752 | return -EINVAL; | ||
1753 | + | ||
1754 | + /* mask off max threshold before checking min value */ | ||
1755 | + val &= ETM_CYC_THRESHOLD_MASK; | ||
1756 | if (val < drvdata->ccitmin) | ||
1757 | return -EINVAL; | ||
1758 | |||
1759 | - config->ccctlr = val & ETM_CYC_THRESHOLD_MASK; | ||
1760 | + config->ccctlr = val; | ||
1761 | return size; | ||
1762 | } | ||
1763 | static DEVICE_ATTR_RW(cyc_threshold); | ||
1764 | @@ -701,14 +704,16 @@ static ssize_t bb_ctrl_store(struct device *dev, | ||
1765 | return -EINVAL; | ||
1766 | if (!drvdata->nr_addr_cmp) | ||
1767 | return -EINVAL; | ||
1768 | + | ||
1769 | /* | ||
1770 | - * Bit[7:0] selects which address range comparator is used for | ||
1771 | - * branch broadcast control. | ||
1772 | + * Bit[8] controls include(1) / exclude(0), bits[0-7] select | ||
1773 | + * individual range comparators. If include then at least 1 | ||
1774 | + * range must be selected. | ||
1775 | */ | ||
1776 | - if (BMVAL(val, 0, 7) > drvdata->nr_addr_cmp) | ||
1777 | + if ((val & BIT(8)) && (BMVAL(val, 0, 7) == 0)) | ||
1778 | return -EINVAL; | ||
1779 | |||
1780 | - config->bb_ctrl = val; | ||
1781 | + config->bb_ctrl = val & GENMASK(8, 0); | ||
1782 | return size; | ||
1783 | } | ||
1784 | static DEVICE_ATTR_RW(bb_ctrl); | ||
1785 | @@ -1341,8 +1346,8 @@ static ssize_t seq_event_store(struct device *dev, | ||
1786 | |||
1787 | spin_lock(&drvdata->spinlock); | ||
1788 | idx = config->seq_idx; | ||
1789 | - /* RST, bits[7:0] */ | ||
1790 | - config->seq_ctrl[idx] = val & 0xFF; | ||
1791 | + /* Seq control has two masks B[15:8] F[7:0] */ | ||
1792 | + config->seq_ctrl[idx] = val & 0xFFFF; | ||
1793 | spin_unlock(&drvdata->spinlock); | ||
1794 | return size; | ||
1795 | } | ||
1796 | @@ -1597,7 +1602,7 @@ static ssize_t res_ctrl_store(struct device *dev, | ||
1797 | if (idx % 2 != 0) | ||
1798 | /* PAIRINV, bit[21] */ | ||
1799 | val &= ~BIT(21); | ||
1800 | - config->res_ctrl[idx] = val; | ||
1801 | + config->res_ctrl[idx] = val & GENMASK(21, 0); | ||
1802 | spin_unlock(&drvdata->spinlock); | ||
1803 | return size; | ||
1804 | } | ||
1805 | diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c | ||
1806 | index c4188308cefa..9c1be9378dfd 100644 | ||
1807 | --- a/drivers/i2c/busses/i2c-imx.c | ||
1808 | +++ b/drivers/i2c/busses/i2c-imx.c | ||
1809 | @@ -1088,7 +1088,8 @@ static int i2c_imx_probe(struct platform_device *pdev) | ||
1810 | /* Get I2C clock */ | ||
1811 | i2c_imx->clk = devm_clk_get(&pdev->dev, NULL); | ||
1812 | if (IS_ERR(i2c_imx->clk)) { | ||
1813 | - dev_err(&pdev->dev, "can't get I2C clock\n"); | ||
1814 | + if (PTR_ERR(i2c_imx->clk) != -EPROBE_DEFER) | ||
1815 | + dev_err(&pdev->dev, "can't get I2C clock\n"); | ||
1816 | return PTR_ERR(i2c_imx->clk); | ||
1817 | } | ||
1818 | |||
1819 | diff --git a/drivers/iio/humidity/hdc100x.c b/drivers/iio/humidity/hdc100x.c | ||
1820 | index e0c9c70c2a4a..c0e2e78c5c62 100644 | ||
1821 | --- a/drivers/iio/humidity/hdc100x.c | ||
1822 | +++ b/drivers/iio/humidity/hdc100x.c | ||
1823 | @@ -202,7 +202,7 @@ static int hdc100x_read_raw(struct iio_dev *indio_dev, | ||
1824 | *val2 = 65536; | ||
1825 | return IIO_VAL_FRACTIONAL; | ||
1826 | } else { | ||
1827 | - *val = 100; | ||
1828 | + *val = 100000; | ||
1829 | *val2 = 65536; | ||
1830 | return IIO_VAL_FRACTIONAL; | ||
1831 | } | ||
1832 | diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c | ||
1833 | index 6f975538996c..c950aa10d0ae 100644 | ||
1834 | --- a/drivers/iio/imu/adis16480.c | ||
1835 | +++ b/drivers/iio/imu/adis16480.c | ||
1836 | @@ -724,6 +724,7 @@ static const struct iio_info adis16480_info = { | ||
1837 | .write_raw = &adis16480_write_raw, | ||
1838 | .update_scan_mode = adis_update_scan_mode, | ||
1839 | .driver_module = THIS_MODULE, | ||
1840 | + .debugfs_reg_access = adis_debugfs_reg_access, | ||
1841 | }; | ||
1842 | |||
1843 | static int adis16480_stop_device(struct iio_dev *indio_dev) | ||
1844 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.h b/drivers/infiniband/hw/hns/hns_roce_hem.h | ||
1845 | index 435748858252..8e8917ebb013 100644 | ||
1846 | --- a/drivers/infiniband/hw/hns/hns_roce_hem.h | ||
1847 | +++ b/drivers/infiniband/hw/hns/hns_roce_hem.h | ||
1848 | @@ -52,7 +52,7 @@ enum { | ||
1849 | |||
1850 | #define HNS_ROCE_HEM_CHUNK_LEN \ | ||
1851 | ((256 - sizeof(struct list_head) - 2 * sizeof(int)) / \ | ||
1852 | - (sizeof(struct scatterlist))) | ||
1853 | + (sizeof(struct scatterlist) + sizeof(void *))) | ||
1854 | |||
1855 | enum { | ||
1856 | HNS_ROCE_HEM_PAGE_SHIFT = 12, | ||
1857 | diff --git a/drivers/infiniband/hw/mlx4/sysfs.c b/drivers/infiniband/hw/mlx4/sysfs.c | ||
1858 | index 69fb5ba94d0f..19caacd26f61 100644 | ||
1859 | --- a/drivers/infiniband/hw/mlx4/sysfs.c | ||
1860 | +++ b/drivers/infiniband/hw/mlx4/sysfs.c | ||
1861 | @@ -352,16 +352,12 @@ err: | ||
1862 | |||
1863 | static void get_name(struct mlx4_ib_dev *dev, char *name, int i, int max) | ||
1864 | { | ||
1865 | - char base_name[9]; | ||
1866 | - | ||
1867 | - /* pci_name format is: bus:dev:func -> xxxx:yy:zz.n */ | ||
1868 | - strlcpy(name, pci_name(dev->dev->persist->pdev), max); | ||
1869 | - strncpy(base_name, name, 8); /*till xxxx:yy:*/ | ||
1870 | - base_name[8] = '\0'; | ||
1871 | - /* with no ARI only 3 last bits are used so when the fn is higher than 8 | ||
1872 | + /* pci_name format is: bus:dev:func -> xxxx:yy:zz.n | ||
1873 | + * with no ARI only 3 last bits are used so when the fn is higher than 8 | ||
1874 | * need to add it to the dev num, so count in the last number will be | ||
1875 | * modulo 8 */ | ||
1876 | - sprintf(name, "%s%.2d.%d", base_name, (i/8), (i%8)); | ||
1877 | + snprintf(name, max, "%.8s%.2d.%d", pci_name(dev->dev->persist->pdev), | ||
1878 | + i / 8, i % 8); | ||
1879 | } | ||
1880 | |||
1881 | struct mlx4_port { | ||
1882 | diff --git a/drivers/infiniband/hw/qib/qib_sysfs.c b/drivers/infiniband/hw/qib/qib_sysfs.c | ||
1883 | index fe4cf5e4acec..8ce0f6eef89e 100644 | ||
1884 | --- a/drivers/infiniband/hw/qib/qib_sysfs.c | ||
1885 | +++ b/drivers/infiniband/hw/qib/qib_sysfs.c | ||
1886 | @@ -301,6 +301,9 @@ static ssize_t qib_portattr_show(struct kobject *kobj, | ||
1887 | struct qib_pportdata *ppd = | ||
1888 | container_of(kobj, struct qib_pportdata, pport_kobj); | ||
1889 | |||
1890 | + if (!pattr->show) | ||
1891 | + return -EIO; | ||
1892 | + | ||
1893 | return pattr->show(ppd, buf); | ||
1894 | } | ||
1895 | |||
1896 | @@ -312,6 +315,9 @@ static ssize_t qib_portattr_store(struct kobject *kobj, | ||
1897 | struct qib_pportdata *ppd = | ||
1898 | container_of(kobj, struct qib_pportdata, pport_kobj); | ||
1899 | |||
1900 | + if (!pattr->store) | ||
1901 | + return -EIO; | ||
1902 | + | ||
1903 | return pattr->store(ppd, buf, len); | ||
1904 | } | ||
1905 | |||
1906 | diff --git a/drivers/input/touchscreen/cyttsp4_core.c b/drivers/input/touchscreen/cyttsp4_core.c | ||
1907 | index 44deca88c579..c1c29d7487bf 100644 | ||
1908 | --- a/drivers/input/touchscreen/cyttsp4_core.c | ||
1909 | +++ b/drivers/input/touchscreen/cyttsp4_core.c | ||
1910 | @@ -1972,11 +1972,6 @@ static int cyttsp4_mt_probe(struct cyttsp4 *cd) | ||
1911 | |||
1912 | /* get sysinfo */ | ||
1913 | md->si = &cd->sysinfo; | ||
1914 | - if (!md->si) { | ||
1915 | - dev_err(dev, "%s: Fail get sysinfo pointer from core p=%p\n", | ||
1916 | - __func__, md->si); | ||
1917 | - goto error_get_sysinfo; | ||
1918 | - } | ||
1919 | |||
1920 | rc = cyttsp4_setup_input_device(cd); | ||
1921 | if (rc) | ||
1922 | @@ -1986,8 +1981,6 @@ static int cyttsp4_mt_probe(struct cyttsp4 *cd) | ||
1923 | |||
1924 | error_init_input: | ||
1925 | input_free_device(md->input); | ||
1926 | -error_get_sysinfo: | ||
1927 | - input_set_drvdata(md->input, NULL); | ||
1928 | error_alloc_failed: | ||
1929 | dev_err(dev, "%s failed.\n", __func__); | ||
1930 | return rc; | ||
1931 | diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c | ||
1932 | index c599b5a2373b..6a02e7301297 100644 | ||
1933 | --- a/drivers/input/touchscreen/goodix.c | ||
1934 | +++ b/drivers/input/touchscreen/goodix.c | ||
1935 | @@ -89,6 +89,15 @@ static const unsigned long goodix_irq_flags[] = { | ||
1936 | */ | ||
1937 | static const struct dmi_system_id rotated_screen[] = { | ||
1938 | #if defined(CONFIG_DMI) && defined(CONFIG_X86) | ||
1939 | + { | ||
1940 | + .ident = "Teclast X89", | ||
1941 | + .matches = { | ||
1942 | + /* tPAD is too generic, also match on bios date */ | ||
1943 | + DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"), | ||
1944 | + DMI_MATCH(DMI_BOARD_NAME, "tPAD"), | ||
1945 | + DMI_MATCH(DMI_BIOS_DATE, "12/19/2014"), | ||
1946 | + }, | ||
1947 | + }, | ||
1948 | { | ||
1949 | .ident = "WinBook TW100", | ||
1950 | .matches = { | ||
1951 | diff --git a/drivers/isdn/gigaset/usb-gigaset.c b/drivers/isdn/gigaset/usb-gigaset.c | ||
1952 | index 5f306e2eece5..aee4880f972f 100644 | ||
1953 | --- a/drivers/isdn/gigaset/usb-gigaset.c | ||
1954 | +++ b/drivers/isdn/gigaset/usb-gigaset.c | ||
1955 | @@ -574,8 +574,7 @@ static int gigaset_initcshw(struct cardstate *cs) | ||
1956 | { | ||
1957 | struct usb_cardstate *ucs; | ||
1958 | |||
1959 | - cs->hw.usb = ucs = | ||
1960 | - kmalloc(sizeof(struct usb_cardstate), GFP_KERNEL); | ||
1961 | + cs->hw.usb = ucs = kzalloc(sizeof(struct usb_cardstate), GFP_KERNEL); | ||
1962 | if (!ucs) { | ||
1963 | pr_err("out of memory\n"); | ||
1964 | return -ENOMEM; | ||
1965 | @@ -587,9 +586,6 @@ static int gigaset_initcshw(struct cardstate *cs) | ||
1966 | ucs->bchars[3] = 0; | ||
1967 | ucs->bchars[4] = 0x11; | ||
1968 | ucs->bchars[5] = 0x13; | ||
1969 | - ucs->bulk_out_buffer = NULL; | ||
1970 | - ucs->bulk_out_urb = NULL; | ||
1971 | - ucs->read_urb = NULL; | ||
1972 | tasklet_init(&cs->write_tasklet, | ||
1973 | gigaset_modem_fill, (unsigned long) cs); | ||
1974 | |||
1975 | @@ -688,6 +684,11 @@ static int gigaset_probe(struct usb_interface *interface, | ||
1976 | return -ENODEV; | ||
1977 | } | ||
1978 | |||
1979 | + if (hostif->desc.bNumEndpoints < 2) { | ||
1980 | + dev_err(&interface->dev, "missing endpoints\n"); | ||
1981 | + return -ENODEV; | ||
1982 | + } | ||
1983 | + | ||
1984 | dev_info(&udev->dev, "%s: Device matched ... !\n", __func__); | ||
1985 | |||
1986 | /* allocate memory for our device state and initialize it */ | ||
1987 | @@ -707,6 +708,12 @@ static int gigaset_probe(struct usb_interface *interface, | ||
1988 | |||
1989 | endpoint = &hostif->endpoint[0].desc; | ||
1990 | |||
1991 | + if (!usb_endpoint_is_bulk_out(endpoint)) { | ||
1992 | + dev_err(&interface->dev, "missing bulk-out endpoint\n"); | ||
1993 | + retval = -ENODEV; | ||
1994 | + goto error; | ||
1995 | + } | ||
1996 | + | ||
1997 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); | ||
1998 | ucs->bulk_out_size = buffer_size; | ||
1999 | ucs->bulk_out_epnum = usb_endpoint_num(endpoint); | ||
2000 | @@ -726,6 +733,12 @@ static int gigaset_probe(struct usb_interface *interface, | ||
2001 | |||
2002 | endpoint = &hostif->endpoint[1].desc; | ||
2003 | |||
2004 | + if (!usb_endpoint_is_int_in(endpoint)) { | ||
2005 | + dev_err(&interface->dev, "missing int-in endpoint\n"); | ||
2006 | + retval = -ENODEV; | ||
2007 | + goto error; | ||
2008 | + } | ||
2009 | + | ||
2010 | ucs->busy = 0; | ||
2011 | |||
2012 | ucs->read_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
2013 | diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c | ||
2014 | index 21ea537bd55e..eff04fa23dfa 100644 | ||
2015 | --- a/drivers/md/persistent-data/dm-btree-remove.c | ||
2016 | +++ b/drivers/md/persistent-data/dm-btree-remove.c | ||
2017 | @@ -203,7 +203,13 @@ static void __rebalance2(struct dm_btree_info *info, struct btree_node *parent, | ||
2018 | struct btree_node *right = r->n; | ||
2019 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
2020 | uint32_t nr_right = le32_to_cpu(right->header.nr_entries); | ||
2021 | - unsigned threshold = 2 * merge_threshold(left) + 1; | ||
2022 | + /* | ||
2023 | + * Ensure the number of entries in each child will be greater | ||
2024 | + * than or equal to (max_entries / 3 + 1), so no matter which | ||
2025 | + * child is used for removal, the number will still be not | ||
2026 | + * less than (max_entries / 3). | ||
2027 | + */ | ||
2028 | + unsigned int threshold = 2 * (merge_threshold(left) + 1); | ||
2029 | |||
2030 | if (nr_left + nr_right < threshold) { | ||
2031 | /* | ||
2032 | diff --git a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c | ||
2033 | index 45f82b5ddd77..d88c9ba401b5 100644 | ||
2034 | --- a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c | ||
2035 | +++ b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c | ||
2036 | @@ -651,8 +651,7 @@ static int bdisp_release(struct file *file) | ||
2037 | |||
2038 | dev_dbg(bdisp->dev, "%s\n", __func__); | ||
2039 | |||
2040 | - if (mutex_lock_interruptible(&bdisp->lock)) | ||
2041 | - return -ERESTARTSYS; | ||
2042 | + mutex_lock(&bdisp->lock); | ||
2043 | |||
2044 | v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); | ||
2045 | |||
2046 | diff --git a/drivers/media/radio/radio-wl1273.c b/drivers/media/radio/radio-wl1273.c | ||
2047 | index a93f681aa9d6..6426b07510a7 100644 | ||
2048 | --- a/drivers/media/radio/radio-wl1273.c | ||
2049 | +++ b/drivers/media/radio/radio-wl1273.c | ||
2050 | @@ -1149,8 +1149,7 @@ static int wl1273_fm_fops_release(struct file *file) | ||
2051 | if (radio->rds_users > 0) { | ||
2052 | radio->rds_users--; | ||
2053 | if (radio->rds_users == 0) { | ||
2054 | - if (mutex_lock_interruptible(&core->lock)) | ||
2055 | - return -EINTR; | ||
2056 | + mutex_lock(&core->lock); | ||
2057 | |||
2058 | radio->irq_flags &= ~WL1273_RDS_EVENT; | ||
2059 | |||
2060 | diff --git a/drivers/media/usb/stkwebcam/stk-webcam.c b/drivers/media/usb/stkwebcam/stk-webcam.c | ||
2061 | index 7297fd261df9..f9844f87467b 100644 | ||
2062 | --- a/drivers/media/usb/stkwebcam/stk-webcam.c | ||
2063 | +++ b/drivers/media/usb/stkwebcam/stk-webcam.c | ||
2064 | @@ -166,7 +166,11 @@ int stk_camera_read_reg(struct stk_camera *dev, u16 index, u8 *value) | ||
2065 | *value = *buf; | ||
2066 | |||
2067 | kfree(buf); | ||
2068 | - return ret; | ||
2069 | + | ||
2070 | + if (ret < 0) | ||
2071 | + return ret; | ||
2072 | + else | ||
2073 | + return 0; | ||
2074 | } | ||
2075 | |||
2076 | static int stk_start_stream(struct stk_camera *dev) | ||
2077 | diff --git a/drivers/misc/altera-stapl/altera.c b/drivers/misc/altera-stapl/altera.c | ||
2078 | index f53e217e963f..494e263daa74 100644 | ||
2079 | --- a/drivers/misc/altera-stapl/altera.c | ||
2080 | +++ b/drivers/misc/altera-stapl/altera.c | ||
2081 | @@ -2176,8 +2176,7 @@ static int altera_get_note(u8 *p, s32 program_size, | ||
2082 | key_ptr = &p[note_strings + | ||
2083 | get_unaligned_be32( | ||
2084 | &p[note_table + (8 * i)])]; | ||
2085 | - if ((strncasecmp(key, key_ptr, strlen(key_ptr)) == 0) && | ||
2086 | - (key != NULL)) { | ||
2087 | + if (key && !strncasecmp(key, key_ptr, strlen(key_ptr))) { | ||
2088 | status = 0; | ||
2089 | |||
2090 | value_ptr = &p[note_strings + | ||
2091 | diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c | ||
2092 | index 009242bcc7be..65c0742356b9 100644 | ||
2093 | --- a/drivers/mmc/host/omap_hsmmc.c | ||
2094 | +++ b/drivers/mmc/host/omap_hsmmc.c | ||
2095 | @@ -1700,6 +1700,36 @@ static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card) | ||
2096 | |||
2097 | if (mmc_pdata(host)->init_card) | ||
2098 | mmc_pdata(host)->init_card(card); | ||
2099 | + else if (card->type == MMC_TYPE_SDIO || | ||
2100 | + card->type == MMC_TYPE_SD_COMBO) { | ||
2101 | + struct device_node *np = mmc_dev(mmc)->of_node; | ||
2102 | + | ||
2103 | + /* | ||
2104 | + * REVISIT: should be moved to sdio core and made more | ||
2105 | + * general e.g. by expanding the DT bindings of child nodes | ||
2106 | + * to provide a mechanism to provide this information: | ||
2107 | + * Documentation/devicetree/bindings/mmc/mmc-card.txt | ||
2108 | + */ | ||
2109 | + | ||
2110 | + np = of_get_compatible_child(np, "ti,wl1251"); | ||
2111 | + if (np) { | ||
2112 | + /* | ||
2113 | + * We have TI wl1251 attached to MMC3. Pass this | ||
2114 | + * information to the SDIO core because it can't be | ||
2115 | + * probed by normal methods. | ||
2116 | + */ | ||
2117 | + | ||
2118 | + dev_info(host->dev, "found wl1251\n"); | ||
2119 | + card->quirks |= MMC_QUIRK_NONSTD_SDIO; | ||
2120 | + card->cccr.wide_bus = 1; | ||
2121 | + card->cis.vendor = 0x104c; | ||
2122 | + card->cis.device = 0x9066; | ||
2123 | + card->cis.blksize = 512; | ||
2124 | + card->cis.max_dtr = 24000000; | ||
2125 | + card->ocr = 0x80; | ||
2126 | + of_node_put(np); | ||
2127 | + } | ||
2128 | + } | ||
2129 | } | ||
2130 | |||
2131 | static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable) | ||
2132 | diff --git a/drivers/mtd/devices/spear_smi.c b/drivers/mtd/devices/spear_smi.c | ||
2133 | index dd5069876537..4a7da5fde714 100644 | ||
2134 | --- a/drivers/mtd/devices/spear_smi.c | ||
2135 | +++ b/drivers/mtd/devices/spear_smi.c | ||
2136 | @@ -595,6 +595,26 @@ static int spear_mtd_read(struct mtd_info *mtd, loff_t from, size_t len, | ||
2137 | return 0; | ||
2138 | } | ||
2139 | |||
2140 | +/* | ||
2141 | + * The purpose of this function is to ensure a memcpy_toio() with byte writes | ||
2142 | + * only. Its structure is inspired from the ARM implementation of _memcpy_toio() | ||
2143 | + * which also does single byte writes but cannot be used here as this is just an | ||
2144 | + * implementation detail and not part of the API. Not mentioning the comment | ||
2145 | + * stating that _memcpy_toio() should be optimized. | ||
2146 | + */ | ||
2147 | +static void spear_smi_memcpy_toio_b(volatile void __iomem *dest, | ||
2148 | + const void *src, size_t len) | ||
2149 | +{ | ||
2150 | + const unsigned char *from = src; | ||
2151 | + | ||
2152 | + while (len) { | ||
2153 | + len--; | ||
2154 | + writeb(*from, dest); | ||
2155 | + from++; | ||
2156 | + dest++; | ||
2157 | + } | ||
2158 | +} | ||
2159 | + | ||
2160 | static inline int spear_smi_cpy_toio(struct spear_smi *dev, u32 bank, | ||
2161 | void __iomem *dest, const void *src, size_t len) | ||
2162 | { | ||
2163 | @@ -617,7 +637,23 @@ static inline int spear_smi_cpy_toio(struct spear_smi *dev, u32 bank, | ||
2164 | ctrlreg1 = readl(dev->io_base + SMI_CR1); | ||
2165 | writel((ctrlreg1 | WB_MODE) & ~SW_MODE, dev->io_base + SMI_CR1); | ||
2166 | |||
2167 | - memcpy_toio(dest, src, len); | ||
2168 | + /* | ||
2169 | + * In Write Burst mode (WB_MODE), the specs states that writes must be: | ||
2170 | + * - incremental | ||
2171 | + * - of the same size | ||
2172 | + * The ARM implementation of memcpy_toio() will optimize the number of | ||
2173 | + * I/O by using as much 4-byte writes as possible, surrounded by | ||
2174 | + * 2-byte/1-byte access if: | ||
2175 | + * - the destination is not 4-byte aligned | ||
2176 | + * - the length is not a multiple of 4-byte. | ||
2177 | + * Avoid this alternance of write access size by using our own 'byte | ||
2178 | + * access' helper if at least one of the two conditions above is true. | ||
2179 | + */ | ||
2180 | + if (IS_ALIGNED(len, sizeof(u32)) && | ||
2181 | + IS_ALIGNED((uintptr_t)dest, sizeof(u32))) | ||
2182 | + memcpy_toio(dest, src, len); | ||
2183 | + else | ||
2184 | + spear_smi_memcpy_toio_b(dest, src, len); | ||
2185 | |||
2186 | writel(ctrlreg1, dev->io_base + SMI_CR1); | ||
2187 | |||
2188 | diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c | ||
2189 | index a2c4048c07be..020437900fce 100644 | ||
2190 | --- a/drivers/net/can/slcan.c | ||
2191 | +++ b/drivers/net/can/slcan.c | ||
2192 | @@ -613,6 +613,7 @@ err_free_chan: | ||
2193 | sl->tty = NULL; | ||
2194 | tty->disc_data = NULL; | ||
2195 | clear_bit(SLF_INUSE, &sl->flags); | ||
2196 | + slc_free_netdev(sl->dev); | ||
2197 | free_netdev(sl->dev); | ||
2198 | |||
2199 | err_exit: | ||
2200 | diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | ||
2201 | index a37481c04a87..9eb3071b69a4 100644 | ||
2202 | --- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | ||
2203 | +++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | ||
2204 | @@ -718,6 +718,10 @@ static int adapter_up(struct adapter *adapter) | ||
2205 | |||
2206 | if (adapter->flags & USING_MSIX) | ||
2207 | name_msix_vecs(adapter); | ||
2208 | + | ||
2209 | + /* Initialize hash mac addr list*/ | ||
2210 | + INIT_LIST_HEAD(&adapter->mac_hlist); | ||
2211 | + | ||
2212 | adapter->flags |= FULL_INIT_DONE; | ||
2213 | } | ||
2214 | |||
2215 | @@ -743,8 +747,6 @@ static int adapter_up(struct adapter *adapter) | ||
2216 | enable_rx(adapter); | ||
2217 | t4vf_sge_start(adapter); | ||
2218 | |||
2219 | - /* Initialize hash mac addr list*/ | ||
2220 | - INIT_LIST_HEAD(&adapter->mac_hlist); | ||
2221 | return 0; | ||
2222 | } | ||
2223 | |||
2224 | diff --git a/drivers/net/ethernet/cirrus/ep93xx_eth.c b/drivers/net/ethernet/cirrus/ep93xx_eth.c | ||
2225 | index 9a161e981529..24f69034f52c 100644 | ||
2226 | --- a/drivers/net/ethernet/cirrus/ep93xx_eth.c | ||
2227 | +++ b/drivers/net/ethernet/cirrus/ep93xx_eth.c | ||
2228 | @@ -780,6 +780,7 @@ static int ep93xx_eth_remove(struct platform_device *pdev) | ||
2229 | { | ||
2230 | struct net_device *dev; | ||
2231 | struct ep93xx_priv *ep; | ||
2232 | + struct resource *mem; | ||
2233 | |||
2234 | dev = platform_get_drvdata(pdev); | ||
2235 | if (dev == NULL) | ||
2236 | @@ -795,8 +796,8 @@ static int ep93xx_eth_remove(struct platform_device *pdev) | ||
2237 | iounmap(ep->base_addr); | ||
2238 | |||
2239 | if (ep->res != NULL) { | ||
2240 | - release_resource(ep->res); | ||
2241 | - kfree(ep->res); | ||
2242 | + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
2243 | + release_mem_region(mem->start, resource_size(mem)); | ||
2244 | } | ||
2245 | |||
2246 | free_netdev(dev); | ||
2247 | diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c | ||
2248 | index 068789e694c9..93c29094ceff 100644 | ||
2249 | --- a/drivers/net/ethernet/intel/e100.c | ||
2250 | +++ b/drivers/net/ethernet/intel/e100.c | ||
2251 | @@ -1370,8 +1370,8 @@ static inline int e100_load_ucode_wait(struct nic *nic) | ||
2252 | |||
2253 | fw = e100_request_firmware(nic); | ||
2254 | /* If it's NULL, then no ucode is required */ | ||
2255 | - if (!fw || IS_ERR(fw)) | ||
2256 | - return PTR_ERR(fw); | ||
2257 | + if (IS_ERR_OR_NULL(fw)) | ||
2258 | + return PTR_ERR_OR_ZERO(fw); | ||
2259 | |||
2260 | if ((err = e100_exec_cb(nic, (void *)fw, e100_setup_ucode))) | ||
2261 | netif_err(nic, probe, nic->netdev, | ||
2262 | diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c | ||
2263 | index cb7c3ef97134..781642d47133 100644 | ||
2264 | --- a/drivers/net/ethernet/mellanox/mlx4/main.c | ||
2265 | +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | ||
2266 | @@ -198,7 +198,7 @@ int mlx4_check_port_params(struct mlx4_dev *dev, | ||
2267 | for (i = 0; i < dev->caps.num_ports - 1; i++) { | ||
2268 | if (port_type[i] != port_type[i + 1]) { | ||
2269 | mlx4_err(dev, "Only same port types supported on this HCA, aborting\n"); | ||
2270 | - return -EINVAL; | ||
2271 | + return -EOPNOTSUPP; | ||
2272 | } | ||
2273 | } | ||
2274 | } | ||
2275 | @@ -207,7 +207,7 @@ int mlx4_check_port_params(struct mlx4_dev *dev, | ||
2276 | if (!(port_type[i] & dev->caps.supported_type[i+1])) { | ||
2277 | mlx4_err(dev, "Requested port type for port %d is not supported on this HCA\n", | ||
2278 | i + 1); | ||
2279 | - return -EINVAL; | ||
2280 | + return -EOPNOTSUPP; | ||
2281 | } | ||
2282 | } | ||
2283 | return 0; | ||
2284 | @@ -1122,8 +1122,7 @@ static int __set_port_type(struct mlx4_port_info *info, | ||
2285 | mlx4_err(mdev, | ||
2286 | "Requested port type for port %d is not supported on this HCA\n", | ||
2287 | info->port); | ||
2288 | - err = -EINVAL; | ||
2289 | - goto err_sup; | ||
2290 | + return -EOPNOTSUPP; | ||
2291 | } | ||
2292 | |||
2293 | mlx4_stop_sense(mdev); | ||
2294 | @@ -1145,7 +1144,7 @@ static int __set_port_type(struct mlx4_port_info *info, | ||
2295 | for (i = 1; i <= mdev->caps.num_ports; i++) { | ||
2296 | if (mdev->caps.possible_type[i] == MLX4_PORT_TYPE_AUTO) { | ||
2297 | mdev->caps.possible_type[i] = mdev->caps.port_type[i]; | ||
2298 | - err = -EINVAL; | ||
2299 | + err = -EOPNOTSUPP; | ||
2300 | } | ||
2301 | } | ||
2302 | } | ||
2303 | @@ -1171,7 +1170,7 @@ static int __set_port_type(struct mlx4_port_info *info, | ||
2304 | out: | ||
2305 | mlx4_start_sense(mdev); | ||
2306 | mutex_unlock(&priv->port_mutex); | ||
2307 | -err_sup: | ||
2308 | + | ||
2309 | return err; | ||
2310 | } | ||
2311 | |||
2312 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
2313 | index e42ece20cd0b..e13a6cd5163f 100644 | ||
2314 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
2315 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
2316 | @@ -1368,7 +1368,7 @@ static int mlx5e_get_module_info(struct net_device *netdev, | ||
2317 | break; | ||
2318 | case MLX5_MODULE_ID_SFP: | ||
2319 | modinfo->type = ETH_MODULE_SFF_8472; | ||
2320 | - modinfo->eeprom_len = MLX5_EEPROM_PAGE_LENGTH; | ||
2321 | + modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; | ||
2322 | break; | ||
2323 | default: | ||
2324 | netdev_err(priv->netdev, "%s: cable type not recognized:0x%x\n", | ||
2325 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/qp.c b/drivers/net/ethernet/mellanox/mlx5/core/qp.c | ||
2326 | index 9346f3985edf..354338c8a510 100644 | ||
2327 | --- a/drivers/net/ethernet/mellanox/mlx5/core/qp.c | ||
2328 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/qp.c | ||
2329 | @@ -125,7 +125,7 @@ void mlx5_rsc_event(struct mlx5_core_dev *dev, u32 rsn, int event_type) | ||
2330 | if (!is_event_type_allowed((rsn >> MLX5_USER_INDEX_LEN), event_type)) { | ||
2331 | mlx5_core_warn(dev, "event 0x%.2x is not allowed on resource 0x%.8x\n", | ||
2332 | event_type, rsn); | ||
2333 | - return; | ||
2334 | + goto out; | ||
2335 | } | ||
2336 | |||
2337 | switch (common->res) { | ||
2338 | @@ -139,7 +139,7 @@ void mlx5_rsc_event(struct mlx5_core_dev *dev, u32 rsn, int event_type) | ||
2339 | default: | ||
2340 | mlx5_core_warn(dev, "invalid resource type for 0x%x\n", rsn); | ||
2341 | } | ||
2342 | - | ||
2343 | +out: | ||
2344 | mlx5_core_put_rsc(common); | ||
2345 | } | ||
2346 | |||
2347 | diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h | ||
2348 | index 6d2de4e01f6d..e11920d12774 100644 | ||
2349 | --- a/drivers/net/ethernet/stmicro/stmmac/common.h | ||
2350 | +++ b/drivers/net/ethernet/stmicro/stmmac/common.h | ||
2351 | @@ -354,7 +354,7 @@ struct dma_features { | ||
2352 | struct stmmac_desc_ops { | ||
2353 | /* DMA RX descriptor ring initialization */ | ||
2354 | void (*init_rx_desc) (struct dma_desc *p, int disable_rx_ic, int mode, | ||
2355 | - int end); | ||
2356 | + int end, int bfsize); | ||
2357 | /* DMA TX descriptor ring initialization */ | ||
2358 | void (*init_tx_desc) (struct dma_desc *p, int mode, int end); | ||
2359 | |||
2360 | diff --git a/drivers/net/ethernet/stmicro/stmmac/descs_com.h b/drivers/net/ethernet/stmicro/stmmac/descs_com.h | ||
2361 | index 1d181e205d6e..f9cbba2d2cc0 100644 | ||
2362 | --- a/drivers/net/ethernet/stmicro/stmmac/descs_com.h | ||
2363 | +++ b/drivers/net/ethernet/stmicro/stmmac/descs_com.h | ||
2364 | @@ -33,11 +33,14 @@ | ||
2365 | /* Specific functions used for Ring mode */ | ||
2366 | |||
2367 | /* Enhanced descriptors */ | ||
2368 | -static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end) | ||
2369 | +static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end, | ||
2370 | + int bfsize) | ||
2371 | { | ||
2372 | - p->des1 |= cpu_to_le32(((BUF_SIZE_8KiB - 1) | ||
2373 | - << ERDES1_BUFFER2_SIZE_SHIFT) | ||
2374 | - & ERDES1_BUFFER2_SIZE_MASK); | ||
2375 | + if (bfsize == BUF_SIZE_16KiB) | ||
2376 | + p->des1 |= cpu_to_le32((BUF_SIZE_8KiB | ||
2377 | + << ERDES1_BUFFER2_SIZE_SHIFT) | ||
2378 | + & ERDES1_BUFFER2_SIZE_MASK); | ||
2379 | + | ||
2380 | |||
2381 | if (end) | ||
2382 | p->des1 |= cpu_to_le32(ERDES1_END_RING); | ||
2383 | @@ -63,11 +66,15 @@ static inline void enh_set_tx_desc_len_on_ring(struct dma_desc *p, int len) | ||
2384 | } | ||
2385 | |||
2386 | /* Normal descriptors */ | ||
2387 | -static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end) | ||
2388 | +static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end, int bfsize) | ||
2389 | { | ||
2390 | - p->des1 |= cpu_to_le32(((BUF_SIZE_2KiB - 1) | ||
2391 | - << RDES1_BUFFER2_SIZE_SHIFT) | ||
2392 | - & RDES1_BUFFER2_SIZE_MASK); | ||
2393 | + if (bfsize >= BUF_SIZE_2KiB) { | ||
2394 | + int bfsize2; | ||
2395 | + | ||
2396 | + bfsize2 = min(bfsize - BUF_SIZE_2KiB + 1, BUF_SIZE_2KiB - 1); | ||
2397 | + p->des1 |= cpu_to_le32((bfsize2 << RDES1_BUFFER2_SIZE_SHIFT) | ||
2398 | + & RDES1_BUFFER2_SIZE_MASK); | ||
2399 | + } | ||
2400 | |||
2401 | if (end) | ||
2402 | p->des1 |= cpu_to_le32(RDES1_END_RING); | ||
2403 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c | ||
2404 | index 3f5056858535..a90b02926e4d 100644 | ||
2405 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c | ||
2406 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c | ||
2407 | @@ -289,7 +289,7 @@ exit: | ||
2408 | } | ||
2409 | |||
2410 | static void dwmac4_rd_init_rx_desc(struct dma_desc *p, int disable_rx_ic, | ||
2411 | - int mode, int end) | ||
2412 | + int mode, int end, int bfsize) | ||
2413 | { | ||
2414 | p->des3 = cpu_to_le32(RDES3_OWN | RDES3_BUFFER1_VALID_ADDR); | ||
2415 | |||
2416 | diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c | ||
2417 | index 77dc5842bd0b..47f4fe50c848 100644 | ||
2418 | --- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c | ||
2419 | +++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c | ||
2420 | @@ -269,15 +269,19 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x, | ||
2421 | } | ||
2422 | |||
2423 | static void enh_desc_init_rx_desc(struct dma_desc *p, int disable_rx_ic, | ||
2424 | - int mode, int end) | ||
2425 | + int mode, int end, int bfsize) | ||
2426 | { | ||
2427 | + int bfsize1; | ||
2428 | + | ||
2429 | p->des0 |= cpu_to_le32(RDES0_OWN); | ||
2430 | - p->des1 |= cpu_to_le32((BUF_SIZE_8KiB - 1) & ERDES1_BUFFER1_SIZE_MASK); | ||
2431 | + | ||
2432 | + bfsize1 = min(bfsize, BUF_SIZE_8KiB); | ||
2433 | + p->des1 |= cpu_to_le32(bfsize1 & ERDES1_BUFFER1_SIZE_MASK); | ||
2434 | |||
2435 | if (mode == STMMAC_CHAIN_MODE) | ||
2436 | ehn_desc_rx_set_on_chain(p); | ||
2437 | else | ||
2438 | - ehn_desc_rx_set_on_ring(p, end); | ||
2439 | + ehn_desc_rx_set_on_ring(p, end, bfsize); | ||
2440 | |||
2441 | if (disable_rx_ic) | ||
2442 | p->des1 |= cpu_to_le32(ERDES1_DISABLE_IC); | ||
2443 | diff --git a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c | ||
2444 | index 01f8f2e94c0f..5a06a5a1f6ea 100644 | ||
2445 | --- a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c | ||
2446 | +++ b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c | ||
2447 | @@ -137,15 +137,19 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x, | ||
2448 | } | ||
2449 | |||
2450 | static void ndesc_init_rx_desc(struct dma_desc *p, int disable_rx_ic, int mode, | ||
2451 | - int end) | ||
2452 | + int end, int bfsize) | ||
2453 | { | ||
2454 | + int bfsize1; | ||
2455 | + | ||
2456 | p->des0 |= cpu_to_le32(RDES0_OWN); | ||
2457 | - p->des1 |= cpu_to_le32((BUF_SIZE_2KiB - 1) & RDES1_BUFFER1_SIZE_MASK); | ||
2458 | + | ||
2459 | + bfsize1 = min(bfsize, BUF_SIZE_2KiB - 1); | ||
2460 | + p->des1 |= cpu_to_le32(bfsize1 & RDES1_BUFFER1_SIZE_MASK); | ||
2461 | |||
2462 | if (mode == STMMAC_CHAIN_MODE) | ||
2463 | ndesc_rx_set_on_chain(p, end); | ||
2464 | else | ||
2465 | - ndesc_rx_set_on_ring(p, end); | ||
2466 | + ndesc_rx_set_on_ring(p, end, bfsize); | ||
2467 | |||
2468 | if (disable_rx_ic) | ||
2469 | p->des1 |= cpu_to_le32(RDES1_DISABLE_IC); | ||
2470 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2471 | index 2c04a0739fd6..5ac48a594951 100644 | ||
2472 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2473 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2474 | @@ -956,11 +956,11 @@ static void stmmac_clear_descriptors(struct stmmac_priv *priv) | ||
2475 | if (priv->extend_desc) | ||
2476 | priv->hw->desc->init_rx_desc(&priv->dma_erx[i].basic, | ||
2477 | priv->use_riwt, priv->mode, | ||
2478 | - (i == DMA_RX_SIZE - 1)); | ||
2479 | + (i == DMA_RX_SIZE - 1), priv->dma_buf_sz); | ||
2480 | else | ||
2481 | priv->hw->desc->init_rx_desc(&priv->dma_rx[i], | ||
2482 | priv->use_riwt, priv->mode, | ||
2483 | - (i == DMA_RX_SIZE - 1)); | ||
2484 | + (i == DMA_RX_SIZE - 1), priv->dma_buf_sz); | ||
2485 | for (i = 0; i < DMA_TX_SIZE; i++) | ||
2486 | if (priv->extend_desc) | ||
2487 | priv->hw->desc->init_tx_desc(&priv->dma_etx[i].basic, | ||
2488 | @@ -2479,7 +2479,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv) | ||
2489 | wmb(); | ||
2490 | |||
2491 | if (unlikely(priv->synopsys_id >= DWMAC_CORE_4_00)) | ||
2492 | - priv->hw->desc->init_rx_desc(p, priv->use_riwt, 0, 0); | ||
2493 | + priv->hw->desc->init_rx_desc(p, priv->use_riwt, 0, 0, priv->dma_buf_sz); | ||
2494 | else | ||
2495 | priv->hw->desc->set_rx_owner(p); | ||
2496 | |||
2497 | @@ -2499,8 +2499,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv) | ||
2498 | */ | ||
2499 | static int stmmac_rx(struct stmmac_priv *priv, int limit) | ||
2500 | { | ||
2501 | - unsigned int entry = priv->cur_rx; | ||
2502 | - unsigned int next_entry; | ||
2503 | + unsigned int next_entry = priv->cur_rx; | ||
2504 | unsigned int count = 0; | ||
2505 | int coe = priv->hw->rx_csum; | ||
2506 | |||
2507 | @@ -2516,10 +2515,12 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit) | ||
2508 | priv->hw->desc->display_ring(rx_head, DMA_RX_SIZE, true); | ||
2509 | } | ||
2510 | while (count < limit) { | ||
2511 | - int status; | ||
2512 | + int entry, status; | ||
2513 | struct dma_desc *p; | ||
2514 | struct dma_desc *np; | ||
2515 | |||
2516 | + entry = next_entry; | ||
2517 | + | ||
2518 | if (priv->extend_desc) | ||
2519 | p = (struct dma_desc *)(priv->dma_erx + entry); | ||
2520 | else | ||
2521 | @@ -2584,7 +2585,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit) | ||
2522 | priv->dev->name, frame_len, | ||
2523 | priv->dma_buf_sz); | ||
2524 | priv->dev->stats.rx_length_errors++; | ||
2525 | - break; | ||
2526 | + continue; | ||
2527 | } | ||
2528 | |||
2529 | /* ACS is set; GMAC core strips PAD/FCS for IEEE 802.3 | ||
2530 | @@ -2615,7 +2616,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit) | ||
2531 | dev_warn(priv->device, | ||
2532 | "packet dropped\n"); | ||
2533 | priv->dev->stats.rx_dropped++; | ||
2534 | - break; | ||
2535 | + continue; | ||
2536 | } | ||
2537 | |||
2538 | dma_sync_single_for_cpu(priv->device, | ||
2539 | @@ -2638,7 +2639,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit) | ||
2540 | pr_err("%s: Inconsistent Rx chain\n", | ||
2541 | priv->dev->name); | ||
2542 | priv->dev->stats.rx_dropped++; | ||
2543 | - break; | ||
2544 | + continue; | ||
2545 | } | ||
2546 | prefetch(skb->data - NET_IP_ALIGN); | ||
2547 | priv->rx_skbuff[entry] = NULL; | ||
2548 | @@ -2672,7 +2673,6 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit) | ||
2549 | priv->dev->stats.rx_packets++; | ||
2550 | priv->dev->stats.rx_bytes += frame_len; | ||
2551 | } | ||
2552 | - entry = next_entry; | ||
2553 | } | ||
2554 | |||
2555 | stmmac_rx_refill(priv); | ||
2556 | diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c | ||
2557 | index 892b06852e15..687f0c20b47f 100644 | ||
2558 | --- a/drivers/net/ethernet/ti/cpsw.c | ||
2559 | +++ b/drivers/net/ethernet/ti/cpsw.c | ||
2560 | @@ -773,8 +773,8 @@ static irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id) | ||
2561 | { | ||
2562 | struct cpsw_common *cpsw = dev_id; | ||
2563 | |||
2564 | - cpdma_ctlr_eoi(cpsw->dma, CPDMA_EOI_RX); | ||
2565 | writel(0, &cpsw->wr_regs->rx_en); | ||
2566 | + cpdma_ctlr_eoi(cpsw->dma, CPDMA_EOI_RX); | ||
2567 | |||
2568 | if (cpsw->quirk_irq) { | ||
2569 | disable_irq_nosync(cpsw->irqs_table[0]); | ||
2570 | diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c | ||
2571 | index 7a60d2e652da..e492c7f0d311 100644 | ||
2572 | --- a/drivers/net/wireless/ath/ar5523/ar5523.c | ||
2573 | +++ b/drivers/net/wireless/ath/ar5523/ar5523.c | ||
2574 | @@ -255,7 +255,8 @@ static int ar5523_cmd(struct ar5523 *ar, u32 code, const void *idata, | ||
2575 | |||
2576 | if (flags & AR5523_CMD_FLAG_MAGIC) | ||
2577 | hdr->magic = cpu_to_be32(1 << 24); | ||
2578 | - memcpy(hdr + 1, idata, ilen); | ||
2579 | + if (ilen) | ||
2580 | + memcpy(hdr + 1, idata, ilen); | ||
2581 | |||
2582 | cmd->odata = odata; | ||
2583 | cmd->olen = olen; | ||
2584 | diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c | ||
2585 | index d84a362a084a..d96e062647fd 100644 | ||
2586 | --- a/drivers/net/wireless/ath/ath10k/pci.c | ||
2587 | +++ b/drivers/net/wireless/ath/ath10k/pci.c | ||
2588 | @@ -1765,6 +1765,11 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) | ||
2589 | |||
2590 | ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif stop\n"); | ||
2591 | |||
2592 | + ath10k_pci_irq_disable(ar); | ||
2593 | + ath10k_pci_irq_sync(ar); | ||
2594 | + napi_synchronize(&ar->napi); | ||
2595 | + napi_disable(&ar->napi); | ||
2596 | + | ||
2597 | /* Most likely the device has HTT Rx ring configured. The only way to | ||
2598 | * prevent the device from accessing (and possible corrupting) host | ||
2599 | * memory is to reset the chip now. | ||
2600 | @@ -1778,10 +1783,6 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) | ||
2601 | */ | ||
2602 | ath10k_pci_safe_chip_reset(ar); | ||
2603 | |||
2604 | - ath10k_pci_irq_disable(ar); | ||
2605 | - ath10k_pci_irq_sync(ar); | ||
2606 | - napi_synchronize(&ar->napi); | ||
2607 | - napi_disable(&ar->napi); | ||
2608 | ath10k_pci_flush(ar); | ||
2609 | |||
2610 | spin_lock_irqsave(&ar_pci->ps_lock, flags); | ||
2611 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
2612 | index 92557cd31a39..d91ab2b8d667 100644 | ||
2613 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
2614 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
2615 | @@ -805,6 +805,21 @@ static void iwl_mvm_mac_tx(struct ieee80211_hw *hw, | ||
2616 | !ieee80211_is_action(hdr->frame_control))) | ||
2617 | sta = NULL; | ||
2618 | |||
2619 | + /* If there is no sta, and it's not offchannel - send through AP */ | ||
2620 | + if (info->control.vif->type == NL80211_IFTYPE_STATION && | ||
2621 | + info->hw_queue != IWL_MVM_OFFCHANNEL_QUEUE && !sta) { | ||
2622 | + struct iwl_mvm_vif *mvmvif = | ||
2623 | + iwl_mvm_vif_from_mac80211(info->control.vif); | ||
2624 | + u8 ap_sta_id = READ_ONCE(mvmvif->ap_sta_id); | ||
2625 | + | ||
2626 | + if (ap_sta_id < IWL_MVM_STATION_COUNT) { | ||
2627 | + /* mac80211 holds rcu read lock */ | ||
2628 | + sta = rcu_dereference(mvm->fw_id_to_mac_id[ap_sta_id]); | ||
2629 | + if (IS_ERR_OR_NULL(sta)) | ||
2630 | + goto drop; | ||
2631 | + } | ||
2632 | + } | ||
2633 | + | ||
2634 | if (sta) { | ||
2635 | if (iwl_mvm_defer_tx(mvm, sta, skb)) | ||
2636 | return; | ||
2637 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c | ||
2638 | index d91f8bbfe7a0..2c23c9edab5c 100644 | ||
2639 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c | ||
2640 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c | ||
2641 | @@ -1209,6 +1209,7 @@ void rtl92de_enable_interrupt(struct ieee80211_hw *hw) | ||
2642 | |||
2643 | rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); | ||
2644 | rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); | ||
2645 | + rtlpci->irq_enabled = true; | ||
2646 | } | ||
2647 | |||
2648 | void rtl92de_disable_interrupt(struct ieee80211_hw *hw) | ||
2649 | @@ -1218,7 +1219,7 @@ void rtl92de_disable_interrupt(struct ieee80211_hw *hw) | ||
2650 | |||
2651 | rtl_write_dword(rtlpriv, REG_HIMR, IMR8190_DISABLED); | ||
2652 | rtl_write_dword(rtlpriv, REG_HIMRE, IMR8190_DISABLED); | ||
2653 | - synchronize_irq(rtlpci->pdev->irq); | ||
2654 | + rtlpci->irq_enabled = false; | ||
2655 | } | ||
2656 | |||
2657 | static void _rtl92de_poweroff_adapter(struct ieee80211_hw *hw) | ||
2658 | @@ -1389,7 +1390,7 @@ void rtl92de_set_beacon_related_registers(struct ieee80211_hw *hw) | ||
2659 | |||
2660 | bcn_interval = mac->beacon_interval; | ||
2661 | atim_window = 2; | ||
2662 | - /*rtl92de_disable_interrupt(hw); */ | ||
2663 | + rtl92de_disable_interrupt(hw); | ||
2664 | rtl_write_word(rtlpriv, REG_ATIMWND, atim_window); | ||
2665 | rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); | ||
2666 | rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f); | ||
2667 | @@ -1409,9 +1410,9 @@ void rtl92de_set_beacon_interval(struct ieee80211_hw *hw) | ||
2668 | |||
2669 | RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG, | ||
2670 | "beacon_interval:%d\n", bcn_interval); | ||
2671 | - /* rtl92de_disable_interrupt(hw); */ | ||
2672 | + rtl92de_disable_interrupt(hw); | ||
2673 | rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); | ||
2674 | - /* rtl92de_enable_interrupt(hw); */ | ||
2675 | + rtl92de_enable_interrupt(hw); | ||
2676 | } | ||
2677 | |||
2678 | void rtl92de_update_interrupt_mask(struct ieee80211_hw *hw, | ||
2679 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c | ||
2680 | index 1ebfee18882f..63cad2f875b8 100644 | ||
2681 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c | ||
2682 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c | ||
2683 | @@ -243,6 +243,7 @@ static struct rtl_hal_ops rtl8192de_hal_ops = { | ||
2684 | .led_control = rtl92de_led_control, | ||
2685 | .set_desc = rtl92de_set_desc, | ||
2686 | .get_desc = rtl92de_get_desc, | ||
2687 | + .is_tx_desc_closed = rtl92de_is_tx_desc_closed, | ||
2688 | .tx_polling = rtl92de_tx_polling, | ||
2689 | .enable_hw_sec = rtl92de_enable_hw_security_config, | ||
2690 | .set_key = rtl92de_set_key, | ||
2691 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c | ||
2692 | index e998e98d74cb..bddf57cb47f0 100644 | ||
2693 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c | ||
2694 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c | ||
2695 | @@ -843,13 +843,15 @@ u32 rtl92de_get_desc(u8 *p_desc, bool istx, u8 desc_name) | ||
2696 | break; | ||
2697 | } | ||
2698 | } else { | ||
2699 | - struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc; | ||
2700 | switch (desc_name) { | ||
2701 | case HW_DESC_OWN: | ||
2702 | - ret = GET_RX_DESC_OWN(pdesc); | ||
2703 | + ret = GET_RX_DESC_OWN(p_desc); | ||
2704 | break; | ||
2705 | case HW_DESC_RXPKT_LEN: | ||
2706 | - ret = GET_RX_DESC_PKT_LEN(pdesc); | ||
2707 | + ret = GET_RX_DESC_PKT_LEN(p_desc); | ||
2708 | + break; | ||
2709 | + case HW_DESC_RXBUFF_ADDR: | ||
2710 | + ret = GET_RX_DESC_BUFF_ADDR(p_desc); | ||
2711 | break; | ||
2712 | default: | ||
2713 | RT_ASSERT(false, "ERR rxdesc :%d not process\n", | ||
2714 | @@ -860,6 +862,23 @@ u32 rtl92de_get_desc(u8 *p_desc, bool istx, u8 desc_name) | ||
2715 | return ret; | ||
2716 | } | ||
2717 | |||
2718 | +bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw, | ||
2719 | + u8 hw_queue, u16 index) | ||
2720 | +{ | ||
2721 | + struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); | ||
2722 | + struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue]; | ||
2723 | + u8 *entry = (u8 *)(&ring->desc[ring->idx]); | ||
2724 | + u8 own = (u8)rtl92de_get_desc(entry, true, HW_DESC_OWN); | ||
2725 | + | ||
2726 | + /* a beacon packet will only use the first | ||
2727 | + * descriptor by defaut, and the own bit may not | ||
2728 | + * be cleared by the hardware | ||
2729 | + */ | ||
2730 | + if (own) | ||
2731 | + return false; | ||
2732 | + return true; | ||
2733 | +} | ||
2734 | + | ||
2735 | void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) | ||
2736 | { | ||
2737 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
2738 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h | ||
2739 | index 194d99f8bacf..d061f33b9f68 100644 | ||
2740 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h | ||
2741 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h | ||
2742 | @@ -740,6 +740,8 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, | ||
2743 | void rtl92de_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, | ||
2744 | u8 desc_name, u8 *val); | ||
2745 | u32 rtl92de_get_desc(u8 *pdesc, bool istx, u8 desc_name); | ||
2746 | +bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw, | ||
2747 | + u8 hw_queue, u16 index); | ||
2748 | void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); | ||
2749 | void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, | ||
2750 | bool b_firstseg, bool b_lastseg, | ||
2751 | diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c | ||
2752 | index 06a157c63416..7eab97585f22 100644 | ||
2753 | --- a/drivers/nfc/nxp-nci/i2c.c | ||
2754 | +++ b/drivers/nfc/nxp-nci/i2c.c | ||
2755 | @@ -238,8 +238,10 @@ static irqreturn_t nxp_nci_i2c_irq_thread_fn(int irq, void *phy_id) | ||
2756 | |||
2757 | if (r == -EREMOTEIO) { | ||
2758 | phy->hard_fault = r; | ||
2759 | - skb = NULL; | ||
2760 | - } else if (r < 0) { | ||
2761 | + if (info->mode == NXP_NCI_MODE_FW) | ||
2762 | + nxp_nci_fw_recv_frame(phy->ndev, NULL); | ||
2763 | + } | ||
2764 | + if (r < 0) { | ||
2765 | nfc_err(&client->dev, "Read failed with error %d\n", r); | ||
2766 | goto exit_irq_handled; | ||
2767 | } | ||
2768 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c | ||
2769 | index 8705bfe7bb73..9561a247d0dc 100644 | ||
2770 | --- a/drivers/nvme/host/core.c | ||
2771 | +++ b/drivers/nvme/host/core.c | ||
2772 | @@ -1043,7 +1043,7 @@ static int nvme_pr_reserve(struct block_device *bdev, u64 key, | ||
2773 | static int nvme_pr_preempt(struct block_device *bdev, u64 old, u64 new, | ||
2774 | enum pr_type type, bool abort) | ||
2775 | { | ||
2776 | - u32 cdw10 = nvme_pr_type(type) << 8 | abort ? 2 : 1; | ||
2777 | + u32 cdw10 = nvme_pr_type(type) << 8 | (abort ? 2 : 1); | ||
2778 | return nvme_pr_command(bdev, cdw10, old, new, nvme_cmd_resv_acquire); | ||
2779 | } | ||
2780 | |||
2781 | @@ -1055,7 +1055,7 @@ static int nvme_pr_clear(struct block_device *bdev, u64 key) | ||
2782 | |||
2783 | static int nvme_pr_release(struct block_device *bdev, u64 key, enum pr_type type) | ||
2784 | { | ||
2785 | - u32 cdw10 = nvme_pr_type(type) << 8 | key ? 1 << 3 : 0; | ||
2786 | + u32 cdw10 = nvme_pr_type(type) << 8 | (key ? 1 << 3 : 0); | ||
2787 | return nvme_pr_command(bdev, cdw10, key, 0, nvme_cmd_resv_release); | ||
2788 | } | ||
2789 | |||
2790 | diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c | ||
2791 | index 37f393f27efc..55ca14fbdd2a 100644 | ||
2792 | --- a/drivers/pci/msi.c | ||
2793 | +++ b/drivers/pci/msi.c | ||
2794 | @@ -230,7 +230,7 @@ u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag) | ||
2795 | return 0; | ||
2796 | |||
2797 | mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT; | ||
2798 | - if (flag) | ||
2799 | + if (flag & PCI_MSIX_ENTRY_CTRL_MASKBIT) | ||
2800 | mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT; | ||
2801 | writel(mask_bits, pci_msix_desc_addr(desc) + PCI_MSIX_ENTRY_VECTOR_CTRL); | ||
2802 | |||
2803 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c | ||
2804 | index f474899073e0..496296bc3581 100644 | ||
2805 | --- a/drivers/pci/quirks.c | ||
2806 | +++ b/drivers/pci/quirks.c | ||
2807 | @@ -4446,7 +4446,7 @@ int pci_dev_specific_acs_enabled(struct pci_dev *dev, u16 acs_flags) | ||
2808 | #define INTEL_BSPR_REG_BPPD (1 << 9) | ||
2809 | |||
2810 | /* Upstream Peer Decode Configuration Register */ | ||
2811 | -#define INTEL_UPDCR_REG 0x1114 | ||
2812 | +#define INTEL_UPDCR_REG 0x1014 | ||
2813 | /* 5:0 Peer Decode Enable bits */ | ||
2814 | #define INTEL_UPDCR_REG_MASK 0x3f | ||
2815 | |||
2816 | diff --git a/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c b/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | ||
2817 | index e86c4de2f6db..92855f45bc53 100644 | ||
2818 | --- a/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | ||
2819 | +++ b/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | ||
2820 | @@ -762,12 +762,23 @@ static int pm8xxx_gpio_probe(struct platform_device *pdev) | ||
2821 | return ret; | ||
2822 | } | ||
2823 | |||
2824 | - ret = gpiochip_add_pin_range(&pctrl->chip, | ||
2825 | - dev_name(pctrl->dev), | ||
2826 | - 0, 0, pctrl->chip.ngpio); | ||
2827 | - if (ret) { | ||
2828 | - dev_err(pctrl->dev, "failed to add pin range\n"); | ||
2829 | - goto unregister_gpiochip; | ||
2830 | + /* | ||
2831 | + * For DeviceTree-supported systems, the gpio core checks the | ||
2832 | + * pinctrl's device node for the "gpio-ranges" property. | ||
2833 | + * If it is present, it takes care of adding the pin ranges | ||
2834 | + * for the driver. In this case the driver can skip ahead. | ||
2835 | + * | ||
2836 | + * In order to remain compatible with older, existing DeviceTree | ||
2837 | + * files which don't set the "gpio-ranges" property or systems that | ||
2838 | + * utilize ACPI the driver has to call gpiochip_add_pin_range(). | ||
2839 | + */ | ||
2840 | + if (!of_property_read_bool(pctrl->dev->of_node, "gpio-ranges")) { | ||
2841 | + ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev), | ||
2842 | + 0, 0, pctrl->chip.ngpio); | ||
2843 | + if (ret) { | ||
2844 | + dev_err(pctrl->dev, "failed to add pin range\n"); | ||
2845 | + goto unregister_gpiochip; | ||
2846 | + } | ||
2847 | } | ||
2848 | |||
2849 | platform_set_drvdata(pdev, pctrl); | ||
2850 | diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c | ||
2851 | index 3d92f827da7a..0839b70a30ee 100644 | ||
2852 | --- a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c | ||
2853 | +++ b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c | ||
2854 | @@ -495,8 +495,10 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d) | ||
2855 | return -ENODEV; | ||
2856 | |||
2857 | eint_data = devm_kzalloc(dev, sizeof(*eint_data), GFP_KERNEL); | ||
2858 | - if (!eint_data) | ||
2859 | + if (!eint_data) { | ||
2860 | + of_node_put(eint_np); | ||
2861 | return -ENOMEM; | ||
2862 | + } | ||
2863 | |||
2864 | eint_data->drvdata = d; | ||
2865 | |||
2866 | @@ -508,12 +510,14 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d) | ||
2867 | irq = irq_of_parse_and_map(eint_np, i); | ||
2868 | if (!irq) { | ||
2869 | dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i); | ||
2870 | + of_node_put(eint_np); | ||
2871 | return -ENXIO; | ||
2872 | } | ||
2873 | |||
2874 | eint_data->parents[i] = irq; | ||
2875 | irq_set_chained_handler_and_data(irq, handlers[i], eint_data); | ||
2876 | } | ||
2877 | + of_node_put(eint_np); | ||
2878 | |||
2879 | bank = d->pin_banks; | ||
2880 | for (i = 0; i < d->nr_banks; ++i, ++bank) { | ||
2881 | diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c | ||
2882 | index 43407ab248f5..0cd9f3a7bb11 100644 | ||
2883 | --- a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c | ||
2884 | +++ b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c | ||
2885 | @@ -713,6 +713,7 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d) | ||
2886 | data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); | ||
2887 | if (!data) { | ||
2888 | dev_err(dev, "could not allocate memory for wkup eint data\n"); | ||
2889 | + of_node_put(eint0_np); | ||
2890 | return -ENOMEM; | ||
2891 | } | ||
2892 | data->drvdata = d; | ||
2893 | @@ -723,6 +724,7 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d) | ||
2894 | irq = irq_of_parse_and_map(eint0_np, i); | ||
2895 | if (!irq) { | ||
2896 | dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i); | ||
2897 | + of_node_put(eint0_np); | ||
2898 | return -ENXIO; | ||
2899 | } | ||
2900 | |||
2901 | @@ -730,6 +732,7 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d) | ||
2902 | s3c64xx_eint0_handlers[i], | ||
2903 | data); | ||
2904 | } | ||
2905 | + of_node_put(eint0_np); | ||
2906 | |||
2907 | bank = d->pin_banks; | ||
2908 | for (i = 0; i < d->nr_banks; ++i, ++bank) { | ||
2909 | diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c | ||
2910 | index 620727fabe64..6b77a1bb5b20 100644 | ||
2911 | --- a/drivers/pinctrl/samsung/pinctrl-samsung.c | ||
2912 | +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c | ||
2913 | @@ -281,6 +281,7 @@ static int samsung_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
2914 | &reserved_maps, num_maps); | ||
2915 | if (ret < 0) { | ||
2916 | samsung_dt_free_map(pctldev, *map, *num_maps); | ||
2917 | + of_node_put(np); | ||
2918 | return ret; | ||
2919 | } | ||
2920 | } | ||
2921 | @@ -770,8 +771,10 @@ static struct samsung_pmx_func *samsung_pinctrl_create_functions( | ||
2922 | if (!of_get_child_count(cfg_np)) { | ||
2923 | ret = samsung_pinctrl_create_function(dev, drvdata, | ||
2924 | cfg_np, func); | ||
2925 | - if (ret < 0) | ||
2926 | + if (ret < 0) { | ||
2927 | + of_node_put(cfg_np); | ||
2928 | return ERR_PTR(ret); | ||
2929 | + } | ||
2930 | if (ret > 0) { | ||
2931 | ++func; | ||
2932 | ++func_cnt; | ||
2933 | @@ -782,8 +785,11 @@ static struct samsung_pmx_func *samsung_pinctrl_create_functions( | ||
2934 | for_each_child_of_node(cfg_np, func_np) { | ||
2935 | ret = samsung_pinctrl_create_function(dev, drvdata, | ||
2936 | func_np, func); | ||
2937 | - if (ret < 0) | ||
2938 | + if (ret < 0) { | ||
2939 | + of_node_put(func_np); | ||
2940 | + of_node_put(cfg_np); | ||
2941 | return ERR_PTR(ret); | ||
2942 | + } | ||
2943 | if (ret > 0) { | ||
2944 | ++func; | ||
2945 | ++func_cnt; | ||
2946 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
2947 | index 47e6c8acd5e2..18d57c0efe9f 100644 | ||
2948 | --- a/drivers/regulator/core.c | ||
2949 | +++ b/drivers/regulator/core.c | ||
2950 | @@ -4452,7 +4452,7 @@ static int __init regulator_init(void) | ||
2951 | /* init early to allow our consumers to complete system booting */ | ||
2952 | core_initcall(regulator_init); | ||
2953 | |||
2954 | -static int regulator_late_cleanup(struct device *dev, void *data) | ||
2955 | +static int __init regulator_late_cleanup(struct device *dev, void *data) | ||
2956 | { | ||
2957 | struct regulator_dev *rdev = dev_to_rdev(dev); | ||
2958 | const struct regulator_ops *ops = rdev->desc->ops; | ||
2959 | @@ -4501,8 +4501,17 @@ unlock: | ||
2960 | return 0; | ||
2961 | } | ||
2962 | |||
2963 | -static void regulator_init_complete_work_function(struct work_struct *work) | ||
2964 | +static int __init regulator_init_complete(void) | ||
2965 | { | ||
2966 | + /* | ||
2967 | + * Since DT doesn't provide an idiomatic mechanism for | ||
2968 | + * enabling full constraints and since it's much more natural | ||
2969 | + * with DT to provide them just assume that a DT enabled | ||
2970 | + * system has full constraints. | ||
2971 | + */ | ||
2972 | + if (of_have_populated_dt()) | ||
2973 | + has_full_constraints = true; | ||
2974 | + | ||
2975 | /* | ||
2976 | * Regulators may had failed to resolve their input supplies | ||
2977 | * when were registered, either because the input supply was | ||
2978 | @@ -4520,35 +4529,6 @@ static void regulator_init_complete_work_function(struct work_struct *work) | ||
2979 | */ | ||
2980 | class_for_each_device(®ulator_class, NULL, NULL, | ||
2981 | regulator_late_cleanup); | ||
2982 | -} | ||
2983 | - | ||
2984 | -static DECLARE_DELAYED_WORK(regulator_init_complete_work, | ||
2985 | - regulator_init_complete_work_function); | ||
2986 | - | ||
2987 | -static int __init regulator_init_complete(void) | ||
2988 | -{ | ||
2989 | - /* | ||
2990 | - * Since DT doesn't provide an idiomatic mechanism for | ||
2991 | - * enabling full constraints and since it's much more natural | ||
2992 | - * with DT to provide them just assume that a DT enabled | ||
2993 | - * system has full constraints. | ||
2994 | - */ | ||
2995 | - if (of_have_populated_dt()) | ||
2996 | - has_full_constraints = true; | ||
2997 | - | ||
2998 | - /* | ||
2999 | - * We punt completion for an arbitrary amount of time since | ||
3000 | - * systems like distros will load many drivers from userspace | ||
3001 | - * so consumers might not always be ready yet, this is | ||
3002 | - * particularly an issue with laptops where this might bounce | ||
3003 | - * the display off then on. Ideally we'd get a notification | ||
3004 | - * from userspace when this happens but we don't so just wait | ||
3005 | - * a bit and hope we waited long enough. It'd be better if | ||
3006 | - * we'd only do this on systems that need it, and a kernel | ||
3007 | - * command line option might be useful. | ||
3008 | - */ | ||
3009 | - schedule_delayed_work(®ulator_init_complete_work, | ||
3010 | - msecs_to_jiffies(30000)); | ||
3011 | |||
3012 | return 0; | ||
3013 | } | ||
3014 | diff --git a/drivers/rtc/rtc-max8997.c b/drivers/rtc/rtc-max8997.c | ||
3015 | index db984d4bf952..4cce5bd448f6 100644 | ||
3016 | --- a/drivers/rtc/rtc-max8997.c | ||
3017 | +++ b/drivers/rtc/rtc-max8997.c | ||
3018 | @@ -221,7 +221,7 @@ static int max8997_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
3019 | |||
3020 | out: | ||
3021 | mutex_unlock(&info->lock); | ||
3022 | - return 0; | ||
3023 | + return ret; | ||
3024 | } | ||
3025 | |||
3026 | static int max8997_rtc_stop_alarm(struct max8997_rtc_info *info) | ||
3027 | diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c | ||
3028 | index b6caad0fee24..c53ea0ac5f46 100644 | ||
3029 | --- a/drivers/s390/scsi/zfcp_dbf.c | ||
3030 | +++ b/drivers/s390/scsi/zfcp_dbf.c | ||
3031 | @@ -93,11 +93,9 @@ void zfcp_dbf_hba_fsf_res(char *tag, int level, struct zfcp_fsf_req *req) | ||
3032 | memcpy(rec->u.res.fsf_status_qual, &q_head->fsf_status_qual, | ||
3033 | FSF_STATUS_QUALIFIER_SIZE); | ||
3034 | |||
3035 | - if (req->fsf_command != FSF_QTCB_FCP_CMND) { | ||
3036 | - rec->pl_len = q_head->log_length; | ||
3037 | - zfcp_dbf_pl_write(dbf, (char *)q_pref + q_head->log_start, | ||
3038 | - rec->pl_len, "fsf_res", req->req_id); | ||
3039 | - } | ||
3040 | + rec->pl_len = q_head->log_length; | ||
3041 | + zfcp_dbf_pl_write(dbf, (char *)q_pref + q_head->log_start, | ||
3042 | + rec->pl_len, "fsf_res", req->req_id); | ||
3043 | |||
3044 | debug_event(dbf->hba, level, rec, sizeof(*rec)); | ||
3045 | spin_unlock_irqrestore(&dbf->hba_lock, flags); | ||
3046 | diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c | ||
3047 | index cc62d8cc8cfd..d5214c4eb9dd 100644 | ||
3048 | --- a/drivers/s390/scsi/zfcp_erp.c | ||
3049 | +++ b/drivers/s390/scsi/zfcp_erp.c | ||
3050 | @@ -178,9 +178,6 @@ static int zfcp_erp_handle_failed(int want, struct zfcp_adapter *adapter, | ||
3051 | adapter, ZFCP_STATUS_COMMON_ERP_FAILED); | ||
3052 | } | ||
3053 | break; | ||
3054 | - default: | ||
3055 | - need = 0; | ||
3056 | - break; | ||
3057 | } | ||
3058 | |||
3059 | return need; | ||
3060 | diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c | ||
3061 | index 2ffe10453e30..c4336b01db23 100644 | ||
3062 | --- a/drivers/scsi/libiscsi.c | ||
3063 | +++ b/drivers/scsi/libiscsi.c | ||
3064 | @@ -1982,7 +1982,7 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc) | ||
3065 | |||
3066 | ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc); | ||
3067 | |||
3068 | - spin_lock(&session->frwd_lock); | ||
3069 | + spin_lock_bh(&session->frwd_lock); | ||
3070 | task = (struct iscsi_task *)sc->SCp.ptr; | ||
3071 | if (!task) { | ||
3072 | /* | ||
3073 | @@ -2109,7 +2109,7 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc) | ||
3074 | done: | ||
3075 | if (task) | ||
3076 | task->last_timeout = jiffies; | ||
3077 | - spin_unlock(&session->frwd_lock); | ||
3078 | + spin_unlock_bh(&session->frwd_lock); | ||
3079 | ISCSI_DBG_EH(session, "return %s\n", rc == BLK_EH_RESET_TIMER ? | ||
3080 | "timer reset" : "shutdown or nh"); | ||
3081 | return rc; | ||
3082 | diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h | ||
3083 | index b484859464f6..f0f6d71d28b8 100644 | ||
3084 | --- a/drivers/scsi/lpfc/lpfc.h | ||
3085 | +++ b/drivers/scsi/lpfc/lpfc.h | ||
3086 | @@ -878,7 +878,8 @@ struct lpfc_hba { | ||
3087 | struct list_head port_list; | ||
3088 | struct lpfc_vport *pport; /* physical lpfc_vport pointer */ | ||
3089 | uint16_t max_vpi; /* Maximum virtual nports */ | ||
3090 | -#define LPFC_MAX_VPI 0xFFFF /* Max number of VPI supported */ | ||
3091 | +#define LPFC_MAX_VPI 0xFF /* Max number VPI supported 0 - 0xff */ | ||
3092 | +#define LPFC_MAX_VPORTS 0x100 /* Max vports per port, with pport */ | ||
3093 | uint16_t max_vports; /* | ||
3094 | * For IOV HBAs max_vpi can change | ||
3095 | * after a reset. max_vports is max | ||
3096 | diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c | ||
3097 | index cf15b9754402..aa0435b1ea1e 100644 | ||
3098 | --- a/drivers/scsi/lpfc/lpfc_attr.c | ||
3099 | +++ b/drivers/scsi/lpfc/lpfc_attr.c | ||
3100 | @@ -1214,6 +1214,9 @@ lpfc_get_hba_info(struct lpfc_hba *phba, | ||
3101 | max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ? | ||
3102 | (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0; | ||
3103 | |||
3104 | + /* Limit the max we support */ | ||
3105 | + if (max_vpi > LPFC_MAX_VPI) | ||
3106 | + max_vpi = LPFC_MAX_VPI; | ||
3107 | if (mvpi) | ||
3108 | *mvpi = max_vpi; | ||
3109 | if (avpi) | ||
3110 | @@ -1229,8 +1232,13 @@ lpfc_get_hba_info(struct lpfc_hba *phba, | ||
3111 | *axri = pmb->un.varRdConfig.avail_xri; | ||
3112 | if (mvpi) | ||
3113 | *mvpi = pmb->un.varRdConfig.max_vpi; | ||
3114 | - if (avpi) | ||
3115 | - *avpi = pmb->un.varRdConfig.avail_vpi; | ||
3116 | + if (avpi) { | ||
3117 | + /* avail_vpi is only valid if link is up and ready */ | ||
3118 | + if (phba->link_state == LPFC_HBA_READY) | ||
3119 | + *avpi = pmb->un.varRdConfig.avail_vpi; | ||
3120 | + else | ||
3121 | + *avpi = pmb->un.varRdConfig.max_vpi; | ||
3122 | + } | ||
3123 | } | ||
3124 | |||
3125 | mempool_free(pmboxq, phba->mbox_mem_pool); | ||
3126 | diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c | ||
3127 | index 2f80b2c0409e..8c640bcf107b 100644 | ||
3128 | --- a/drivers/scsi/lpfc/lpfc_init.c | ||
3129 | +++ b/drivers/scsi/lpfc/lpfc_init.c | ||
3130 | @@ -6973,6 +6973,9 @@ lpfc_sli4_read_config(struct lpfc_hba *phba) | ||
3131 | bf_get(lpfc_mbx_rd_conf_xri_base, rd_config); | ||
3132 | phba->sli4_hba.max_cfg_param.max_vpi = | ||
3133 | bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config); | ||
3134 | + /* Limit the max we support */ | ||
3135 | + if (phba->sli4_hba.max_cfg_param.max_vpi > LPFC_MAX_VPORTS) | ||
3136 | + phba->sli4_hba.max_cfg_param.max_vpi = LPFC_MAX_VPORTS; | ||
3137 | phba->sli4_hba.max_cfg_param.vpi_base = | ||
3138 | bf_get(lpfc_mbx_rd_conf_vpi_base, rd_config); | ||
3139 | phba->sli4_hba.max_cfg_param.max_rpi = | ||
3140 | diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c | ||
3141 | index 5c3dfd92ea02..33f4181ba9f7 100644 | ||
3142 | --- a/drivers/scsi/qla2xxx/qla_attr.c | ||
3143 | +++ b/drivers/scsi/qla2xxx/qla_attr.c | ||
3144 | @@ -682,7 +682,8 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj, | ||
3145 | break; | ||
3146 | } else { | ||
3147 | /* Make sure FC side is not in reset */ | ||
3148 | - qla2x00_wait_for_hba_online(vha); | ||
3149 | + WARN_ON_ONCE(qla2x00_wait_for_hba_online(vha) != | ||
3150 | + QLA_SUCCESS); | ||
3151 | |||
3152 | /* Issue MPI reset */ | ||
3153 | scsi_block_requests(vha->host); | ||
3154 | diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c | ||
3155 | index 33e4dceb895f..09f7a8cfed4d 100644 | ||
3156 | --- a/drivers/scsi/qla2xxx/qla_bsg.c | ||
3157 | +++ b/drivers/scsi/qla2xxx/qla_bsg.c | ||
3158 | @@ -336,6 +336,8 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job) | ||
3159 | dma_map_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, | ||
3160 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | ||
3161 | if (!req_sg_cnt) { | ||
3162 | + dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, | ||
3163 | + bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | ||
3164 | rval = -ENOMEM; | ||
3165 | goto done_free_fcport; | ||
3166 | } | ||
3167 | @@ -343,6 +345,8 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job) | ||
3168 | rsp_sg_cnt = dma_map_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list, | ||
3169 | bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); | ||
3170 | if (!rsp_sg_cnt) { | ||
3171 | + dma_unmap_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list, | ||
3172 | + bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); | ||
3173 | rval = -ENOMEM; | ||
3174 | goto done_free_fcport; | ||
3175 | } | ||
3176 | @@ -1740,8 +1744,8 @@ qla24xx_process_bidir_cmd(struct fc_bsg_job *bsg_job) | ||
3177 | uint16_t nextlid = 0; | ||
3178 | uint32_t tot_dsds; | ||
3179 | srb_t *sp = NULL; | ||
3180 | - uint32_t req_data_len = 0; | ||
3181 | - uint32_t rsp_data_len = 0; | ||
3182 | + uint32_t req_data_len; | ||
3183 | + uint32_t rsp_data_len; | ||
3184 | |||
3185 | /* Check the type of the adapter */ | ||
3186 | if (!IS_BIDI_CAPABLE(ha)) { | ||
3187 | @@ -1846,6 +1850,9 @@ qla24xx_process_bidir_cmd(struct fc_bsg_job *bsg_job) | ||
3188 | goto done_unmap_sg; | ||
3189 | } | ||
3190 | |||
3191 | + req_data_len = bsg_job->request_payload.payload_len; | ||
3192 | + rsp_data_len = bsg_job->reply_payload.payload_len; | ||
3193 | + | ||
3194 | if (req_data_len != rsp_data_len) { | ||
3195 | rval = EXT_STATUS_BUSY; | ||
3196 | ql_log(ql_log_warn, vha, 0x70aa, | ||
3197 | @@ -1853,10 +1860,6 @@ qla24xx_process_bidir_cmd(struct fc_bsg_job *bsg_job) | ||
3198 | goto done_unmap_sg; | ||
3199 | } | ||
3200 | |||
3201 | - req_data_len = bsg_job->request_payload.payload_len; | ||
3202 | - rsp_data_len = bsg_job->reply_payload.payload_len; | ||
3203 | - | ||
3204 | - | ||
3205 | /* Alloc SRB structure */ | ||
3206 | sp = qla2x00_get_sp(vha, &(vha->bidir_fcport), GFP_KERNEL); | ||
3207 | if (!sp) { | ||
3208 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c | ||
3209 | index d13e91e16425..b889caa556a0 100644 | ||
3210 | --- a/drivers/scsi/qla2xxx/qla_target.c | ||
3211 | +++ b/drivers/scsi/qla2xxx/qla_target.c | ||
3212 | @@ -5893,7 +5893,6 @@ static void qlt_abort_work(struct qla_tgt *tgt, | ||
3213 | struct qla_hw_data *ha = vha->hw; | ||
3214 | struct qla_tgt_sess *sess = NULL; | ||
3215 | unsigned long flags = 0, flags2 = 0; | ||
3216 | - uint32_t be_s_id; | ||
3217 | uint8_t s_id[3]; | ||
3218 | int rc; | ||
3219 | |||
3220 | @@ -5906,8 +5905,7 @@ static void qlt_abort_work(struct qla_tgt *tgt, | ||
3221 | s_id[1] = prm->abts.fcp_hdr_le.s_id[1]; | ||
3222 | s_id[2] = prm->abts.fcp_hdr_le.s_id[0]; | ||
3223 | |||
3224 | - sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, | ||
3225 | - (unsigned char *)&be_s_id); | ||
3226 | + sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, s_id); | ||
3227 | if (!sess) { | ||
3228 | spin_unlock_irqrestore(&ha->tgt.sess_lock, flags2); | ||
3229 | |||
3230 | @@ -6343,7 +6341,8 @@ qlt_enable_vha(struct scsi_qla_host *vha) | ||
3231 | |||
3232 | set_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags); | ||
3233 | qla2xxx_wake_dpc(base_vha); | ||
3234 | - qla2x00_wait_for_hba_online(base_vha); | ||
3235 | + WARN_ON_ONCE(qla2x00_wait_for_hba_online(base_vha) != | ||
3236 | + QLA_SUCCESS); | ||
3237 | } | ||
3238 | } | ||
3239 | EXPORT_SYMBOL(qlt_enable_vha); | ||
3240 | @@ -6373,7 +6372,9 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) | ||
3241 | |||
3242 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | ||
3243 | qla2xxx_wake_dpc(vha); | ||
3244 | - qla2x00_wait_for_hba_online(vha); | ||
3245 | + if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) | ||
3246 | + ql_dbg(ql_dbg_tgt, vha, 0xe081, | ||
3247 | + "qla2x00_wait_for_hba_online() failed\n"); | ||
3248 | } | ||
3249 | |||
3250 | /* | ||
3251 | diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c | ||
3252 | index 44be6b593b30..691c04b3e5b6 100644 | ||
3253 | --- a/drivers/spi/spi-atmel.c | ||
3254 | +++ b/drivers/spi/spi-atmel.c | ||
3255 | @@ -1209,10 +1209,8 @@ static int atmel_spi_setup(struct spi_device *spi) | ||
3256 | as = spi_master_get_devdata(spi->master); | ||
3257 | |||
3258 | /* see notes above re chipselect */ | ||
3259 | - if (!atmel_spi_is_v2(as) | ||
3260 | - && spi->chip_select == 0 | ||
3261 | - && (spi->mode & SPI_CS_HIGH)) { | ||
3262 | - dev_dbg(&spi->dev, "setup: can't be active-high\n"); | ||
3263 | + if (!as->use_cs_gpios && (spi->mode & SPI_CS_HIGH)) { | ||
3264 | + dev_warn(&spi->dev, "setup: non GPIO CS can't be active-high\n"); | ||
3265 | return -EINVAL; | ||
3266 | } | ||
3267 | |||
3268 | diff --git a/drivers/staging/iio/addac/adt7316-i2c.c b/drivers/staging/iio/addac/adt7316-i2c.c | ||
3269 | index 0ccf192b9a03..5950225e45d1 100644 | ||
3270 | --- a/drivers/staging/iio/addac/adt7316-i2c.c | ||
3271 | +++ b/drivers/staging/iio/addac/adt7316-i2c.c | ||
3272 | @@ -35,6 +35,8 @@ static int adt7316_i2c_read(void *client, u8 reg, u8 *data) | ||
3273 | return ret; | ||
3274 | } | ||
3275 | |||
3276 | + *data = ret; | ||
3277 | + | ||
3278 | return 0; | ||
3279 | } | ||
3280 | |||
3281 | diff --git a/drivers/staging/media/pulse8-cec/pulse8-cec.c b/drivers/staging/media/pulse8-cec/pulse8-cec.c | ||
3282 | index 1732c3857b8e..2785cc03c529 100644 | ||
3283 | --- a/drivers/staging/media/pulse8-cec/pulse8-cec.c | ||
3284 | +++ b/drivers/staging/media/pulse8-cec/pulse8-cec.c | ||
3285 | @@ -580,7 +580,7 @@ unlock: | ||
3286 | else | ||
3287 | pulse8->config_pending = true; | ||
3288 | mutex_unlock(&pulse8->config_lock); | ||
3289 | - return err; | ||
3290 | + return log_addr == CEC_LOG_ADDR_INVALID ? 0 : err; | ||
3291 | } | ||
3292 | |||
3293 | static int pulse8_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, | ||
3294 | diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c b/drivers/staging/rtl8188eu/os_dep/usb_intf.c | ||
3295 | index d4a7d740fc62..bfcf9e55f3c6 100644 | ||
3296 | --- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c | ||
3297 | +++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c | ||
3298 | @@ -78,7 +78,7 @@ static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf) | ||
3299 | phost_conf = pusbd->actconfig; | ||
3300 | pconf_desc = &phost_conf->desc; | ||
3301 | |||
3302 | - phost_iface = &usb_intf->altsetting[0]; | ||
3303 | + phost_iface = usb_intf->cur_altsetting; | ||
3304 | piface_desc = &phost_iface->desc; | ||
3305 | |||
3306 | pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces; | ||
3307 | diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c | ||
3308 | index 897d4621a5ce..d0ba42dfafeb 100644 | ||
3309 | --- a/drivers/staging/rtl8712/usb_intf.c | ||
3310 | +++ b/drivers/staging/rtl8712/usb_intf.c | ||
3311 | @@ -275,7 +275,7 @@ static uint r8712_usb_dvobj_init(struct _adapter *padapter) | ||
3312 | |||
3313 | pdvobjpriv->padapter = padapter; | ||
3314 | padapter->EepromAddressSize = 6; | ||
3315 | - phost_iface = &pintf->altsetting[0]; | ||
3316 | + phost_iface = pintf->cur_altsetting; | ||
3317 | piface_desc = &phost_iface->desc; | ||
3318 | pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints; | ||
3319 | if (pusbd->speed == USB_SPEED_HIGH) { | ||
3320 | diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c | ||
3321 | index 57603be42c50..90c033b4ec98 100644 | ||
3322 | --- a/drivers/thermal/thermal_core.c | ||
3323 | +++ b/drivers/thermal/thermal_core.c | ||
3324 | @@ -402,7 +402,7 @@ static void thermal_zone_device_set_polling(struct thermal_zone_device *tz, | ||
3325 | mod_delayed_work(system_freezable_wq, &tz->poll_queue, | ||
3326 | msecs_to_jiffies(delay)); | ||
3327 | else | ||
3328 | - cancel_delayed_work_sync(&tz->poll_queue); | ||
3329 | + cancel_delayed_work(&tz->poll_queue); | ||
3330 | } | ||
3331 | |||
3332 | static void monitor_thermal_zone(struct thermal_zone_device *tz) | ||
3333 | @@ -2073,7 +2073,7 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) | ||
3334 | |||
3335 | mutex_unlock(&thermal_list_lock); | ||
3336 | |||
3337 | - thermal_zone_device_set_polling(tz, 0); | ||
3338 | + cancel_delayed_work_sync(&tz->poll_queue); | ||
3339 | |||
3340 | if (tz->type[0]) | ||
3341 | device_remove_file(&tz->device, &dev_attr_type); | ||
3342 | diff --git a/drivers/tty/n_hdlc.c b/drivers/tty/n_hdlc.c | ||
3343 | index 8d6253903f24..0c12dec110bc 100644 | ||
3344 | --- a/drivers/tty/n_hdlc.c | ||
3345 | +++ b/drivers/tty/n_hdlc.c | ||
3346 | @@ -614,7 +614,7 @@ static ssize_t n_hdlc_tty_read(struct tty_struct *tty, struct file *file, | ||
3347 | } | ||
3348 | |||
3349 | /* no data */ | ||
3350 | - if (file->f_flags & O_NONBLOCK) { | ||
3351 | + if (tty_io_nonblock(tty, file)) { | ||
3352 | ret = -EAGAIN; | ||
3353 | break; | ||
3354 | } | ||
3355 | @@ -681,7 +681,7 @@ static ssize_t n_hdlc_tty_write(struct tty_struct *tty, struct file *file, | ||
3356 | if (tbuf) | ||
3357 | break; | ||
3358 | |||
3359 | - if (file->f_flags & O_NONBLOCK) { | ||
3360 | + if (tty_io_nonblock(tty, file)) { | ||
3361 | error = -EAGAIN; | ||
3362 | break; | ||
3363 | } | ||
3364 | diff --git a/drivers/tty/n_r3964.c b/drivers/tty/n_r3964.c | ||
3365 | index 345111467b85..ee0e07b4a13d 100644 | ||
3366 | --- a/drivers/tty/n_r3964.c | ||
3367 | +++ b/drivers/tty/n_r3964.c | ||
3368 | @@ -1080,7 +1080,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file, | ||
3369 | pMsg = remove_msg(pInfo, pClient); | ||
3370 | if (pMsg == NULL) { | ||
3371 | /* no messages available. */ | ||
3372 | - if (file->f_flags & O_NONBLOCK) { | ||
3373 | + if (tty_io_nonblock(tty, file)) { | ||
3374 | ret = -EAGAIN; | ||
3375 | goto unlock; | ||
3376 | } | ||
3377 | diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c | ||
3378 | index 904fc9c37fde..8214b0326b3a 100644 | ||
3379 | --- a/drivers/tty/n_tty.c | ||
3380 | +++ b/drivers/tty/n_tty.c | ||
3381 | @@ -1704,7 +1704,7 @@ n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp, | ||
3382 | |||
3383 | down_read(&tty->termios_rwsem); | ||
3384 | |||
3385 | - while (1) { | ||
3386 | + do { | ||
3387 | /* | ||
3388 | * When PARMRK is set, each input char may take up to 3 chars | ||
3389 | * in the read buf; reduce the buffer space avail by 3x | ||
3390 | @@ -1746,7 +1746,7 @@ n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp, | ||
3391 | fp += n; | ||
3392 | count -= n; | ||
3393 | rcvd += n; | ||
3394 | - } | ||
3395 | + } while (!test_bit(TTY_LDISC_CHANGING, &tty->flags)); | ||
3396 | |||
3397 | tty->receive_room = room; | ||
3398 | |||
3399 | @@ -2213,7 +2213,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, | ||
3400 | break; | ||
3401 | if (!timeout) | ||
3402 | break; | ||
3403 | - if (file->f_flags & O_NONBLOCK) { | ||
3404 | + if (tty_io_nonblock(tty, file)) { | ||
3405 | retval = -EAGAIN; | ||
3406 | break; | ||
3407 | } | ||
3408 | @@ -2367,7 +2367,7 @@ static ssize_t n_tty_write(struct tty_struct *tty, struct file *file, | ||
3409 | } | ||
3410 | if (!nr) | ||
3411 | break; | ||
3412 | - if (file->f_flags & O_NONBLOCK) { | ||
3413 | + if (tty_io_nonblock(tty, file)) { | ||
3414 | retval = -EAGAIN; | ||
3415 | break; | ||
3416 | } | ||
3417 | diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c | ||
3418 | index 2d8089fc2139..f6586a8681b9 100644 | ||
3419 | --- a/drivers/tty/serial/amba-pl011.c | ||
3420 | +++ b/drivers/tty/serial/amba-pl011.c | ||
3421 | @@ -811,10 +811,8 @@ __acquires(&uap->port.lock) | ||
3422 | if (!uap->using_tx_dma) | ||
3423 | return; | ||
3424 | |||
3425 | - /* Avoid deadlock with the DMA engine callback */ | ||
3426 | - spin_unlock(&uap->port.lock); | ||
3427 | - dmaengine_terminate_all(uap->dmatx.chan); | ||
3428 | - spin_lock(&uap->port.lock); | ||
3429 | + dmaengine_terminate_async(uap->dmatx.chan); | ||
3430 | + | ||
3431 | if (uap->dmatx.queued) { | ||
3432 | dma_unmap_sg(uap->dmatx.chan->device->dev, &uap->dmatx.sg, 1, | ||
3433 | DMA_TO_DEVICE); | ||
3434 | diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c | ||
3435 | index 800996522fdc..5b6093dc3ff2 100644 | ||
3436 | --- a/drivers/tty/serial/fsl_lpuart.c | ||
3437 | +++ b/drivers/tty/serial/fsl_lpuart.c | ||
3438 | @@ -346,8 +346,8 @@ static void lpuart_dma_tx(struct lpuart_port *sport) | ||
3439 | } | ||
3440 | |||
3441 | sport->dma_tx_desc = dmaengine_prep_slave_sg(sport->dma_tx_chan, sgl, | ||
3442 | - sport->dma_tx_nents, | ||
3443 | - DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT); | ||
3444 | + ret, DMA_MEM_TO_DEV, | ||
3445 | + DMA_PREP_INTERRUPT); | ||
3446 | if (!sport->dma_tx_desc) { | ||
3447 | dma_unmap_sg(dev, sgl, sport->dma_tx_nents, DMA_TO_DEVICE); | ||
3448 | dev_err(dev, "Cannot prepare TX slave DMA!\n"); | ||
3449 | diff --git a/drivers/tty/serial/ifx6x60.c b/drivers/tty/serial/ifx6x60.c | ||
3450 | index 91d2ddd6ef88..180b77334fdd 100644 | ||
3451 | --- a/drivers/tty/serial/ifx6x60.c | ||
3452 | +++ b/drivers/tty/serial/ifx6x60.c | ||
3453 | @@ -1244,6 +1244,9 @@ static int ifx_spi_spi_remove(struct spi_device *spi) | ||
3454 | struct ifx_spi_device *ifx_dev = spi_get_drvdata(spi); | ||
3455 | /* stop activity */ | ||
3456 | tasklet_kill(&ifx_dev->io_work_tasklet); | ||
3457 | + | ||
3458 | + pm_runtime_disable(&spi->dev); | ||
3459 | + | ||
3460 | /* free irq */ | ||
3461 | free_irq(gpio_to_irq(ifx_dev->gpio.reset_out), ifx_dev); | ||
3462 | free_irq(gpio_to_irq(ifx_dev->gpio.srdy), ifx_dev); | ||
3463 | diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c | ||
3464 | index 0d82be145c68..6d596c635159 100644 | ||
3465 | --- a/drivers/tty/serial/imx.c | ||
3466 | +++ b/drivers/tty/serial/imx.c | ||
3467 | @@ -1943,7 +1943,7 @@ imx_console_setup(struct console *co, char *options) | ||
3468 | |||
3469 | retval = clk_prepare(sport->clk_per); | ||
3470 | if (retval) | ||
3471 | - clk_disable_unprepare(sport->clk_ipg); | ||
3472 | + clk_unprepare(sport->clk_ipg); | ||
3473 | |||
3474 | error_console: | ||
3475 | return retval; | ||
3476 | diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c | ||
3477 | index 9027455c6be1..2ed219c837c9 100644 | ||
3478 | --- a/drivers/tty/serial/msm_serial.c | ||
3479 | +++ b/drivers/tty/serial/msm_serial.c | ||
3480 | @@ -988,6 +988,7 @@ static unsigned int msm_get_mctrl(struct uart_port *port) | ||
3481 | static void msm_reset(struct uart_port *port) | ||
3482 | { | ||
3483 | struct msm_port *msm_port = UART_TO_MSM(port); | ||
3484 | + unsigned int mr; | ||
3485 | |||
3486 | /* reset everything */ | ||
3487 | msm_write(port, UART_CR_CMD_RESET_RX, UART_CR); | ||
3488 | @@ -995,7 +996,10 @@ static void msm_reset(struct uart_port *port) | ||
3489 | msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR); | ||
3490 | msm_write(port, UART_CR_CMD_RESET_BREAK_INT, UART_CR); | ||
3491 | msm_write(port, UART_CR_CMD_RESET_CTS, UART_CR); | ||
3492 | - msm_write(port, UART_CR_CMD_SET_RFR, UART_CR); | ||
3493 | + msm_write(port, UART_CR_CMD_RESET_RFR, UART_CR); | ||
3494 | + mr = msm_read(port, UART_MR1); | ||
3495 | + mr &= ~UART_MR1_RX_RDY_CTL; | ||
3496 | + msm_write(port, mr, UART_MR1); | ||
3497 | |||
3498 | /* Disable DM modes */ | ||
3499 | if (msm_port->is_uartdm) | ||
3500 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c | ||
3501 | index 04c023f7f633..ae118e68b406 100644 | ||
3502 | --- a/drivers/tty/serial/serial_core.c | ||
3503 | +++ b/drivers/tty/serial/serial_core.c | ||
3504 | @@ -1106,7 +1106,7 @@ static int uart_break_ctl(struct tty_struct *tty, int break_state) | ||
3505 | if (!uport) | ||
3506 | goto out; | ||
3507 | |||
3508 | - if (uport->type != PORT_UNKNOWN) | ||
3509 | + if (uport->type != PORT_UNKNOWN && uport->ops->break_ctl) | ||
3510 | uport->ops->break_ctl(uport, break_state); | ||
3511 | ret = 0; | ||
3512 | out: | ||
3513 | diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c | ||
3514 | index 3eb3f2a03bbb..706faca834f2 100644 | ||
3515 | --- a/drivers/tty/tty_ldisc.c | ||
3516 | +++ b/drivers/tty/tty_ldisc.c | ||
3517 | @@ -348,6 +348,11 @@ int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout) | ||
3518 | { | ||
3519 | int ret; | ||
3520 | |||
3521 | + /* Kindly asking blocked readers to release the read side */ | ||
3522 | + set_bit(TTY_LDISC_CHANGING, &tty->flags); | ||
3523 | + wake_up_interruptible_all(&tty->read_wait); | ||
3524 | + wake_up_interruptible_all(&tty->write_wait); | ||
3525 | + | ||
3526 | ret = __tty_ldisc_lock(tty, timeout); | ||
3527 | if (!ret) | ||
3528 | return -EBUSY; | ||
3529 | @@ -358,6 +363,8 @@ int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout) | ||
3530 | void tty_ldisc_unlock(struct tty_struct *tty) | ||
3531 | { | ||
3532 | clear_bit(TTY_LDISC_HALTED, &tty->flags); | ||
3533 | + /* Can be cleared here - ldisc_unlock will wake up writers firstly */ | ||
3534 | + clear_bit(TTY_LDISC_CHANGING, &tty->flags); | ||
3535 | __tty_ldisc_unlock(tty); | ||
3536 | } | ||
3537 | |||
3538 | diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c | ||
3539 | index e8a917a23ed9..b4e7a7317713 100644 | ||
3540 | --- a/drivers/tty/vt/keyboard.c | ||
3541 | +++ b/drivers/tty/vt/keyboard.c | ||
3542 | @@ -1460,7 +1460,7 @@ static void kbd_event(struct input_handle *handle, unsigned int event_type, | ||
3543 | |||
3544 | if (event_type == EV_MSC && event_code == MSC_RAW && HW_RAW(handle->dev)) | ||
3545 | kbd_rawcode(value); | ||
3546 | - if (event_type == EV_KEY) | ||
3547 | + if (event_type == EV_KEY && event_code <= KEY_MAX) | ||
3548 | kbd_keycode(event_code, value, HW_RAW(handle->dev)); | ||
3549 | |||
3550 | spin_unlock(&kbd_event_lock); | ||
3551 | diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c | ||
3552 | index df67815f74e6..127fcaf13856 100644 | ||
3553 | --- a/drivers/usb/atm/ueagle-atm.c | ||
3554 | +++ b/drivers/usb/atm/ueagle-atm.c | ||
3555 | @@ -2167,10 +2167,11 @@ resubmit: | ||
3556 | /* | ||
3557 | * Start the modem : init the data and start kernel thread | ||
3558 | */ | ||
3559 | -static int uea_boot(struct uea_softc *sc) | ||
3560 | +static int uea_boot(struct uea_softc *sc, struct usb_interface *intf) | ||
3561 | { | ||
3562 | - int ret, size; | ||
3563 | struct intr_pkt *intr; | ||
3564 | + int ret = -ENOMEM; | ||
3565 | + int size; | ||
3566 | |||
3567 | uea_enters(INS_TO_USBDEV(sc)); | ||
3568 | |||
3569 | @@ -2195,6 +2196,11 @@ static int uea_boot(struct uea_softc *sc) | ||
3570 | if (UEA_CHIP_VERSION(sc) == ADI930) | ||
3571 | load_XILINX_firmware(sc); | ||
3572 | |||
3573 | + if (intf->cur_altsetting->desc.bNumEndpoints < 1) { | ||
3574 | + ret = -ENODEV; | ||
3575 | + goto err0; | ||
3576 | + } | ||
3577 | + | ||
3578 | intr = kmalloc(size, GFP_KERNEL); | ||
3579 | if (!intr) | ||
3580 | goto err0; | ||
3581 | @@ -2206,8 +2212,7 @@ static int uea_boot(struct uea_softc *sc) | ||
3582 | usb_fill_int_urb(sc->urb_int, sc->usb_dev, | ||
3583 | usb_rcvintpipe(sc->usb_dev, UEA_INTR_PIPE), | ||
3584 | intr, size, uea_intr, sc, | ||
3585 | - sc->usb_dev->actconfig->interface[0]->altsetting[0]. | ||
3586 | - endpoint[0].desc.bInterval); | ||
3587 | + intf->cur_altsetting->endpoint[0].desc.bInterval); | ||
3588 | |||
3589 | ret = usb_submit_urb(sc->urb_int, GFP_KERNEL); | ||
3590 | if (ret < 0) { | ||
3591 | @@ -2222,6 +2227,7 @@ static int uea_boot(struct uea_softc *sc) | ||
3592 | sc->kthread = kthread_create(uea_kthread, sc, "ueagle-atm"); | ||
3593 | if (IS_ERR(sc->kthread)) { | ||
3594 | uea_err(INS_TO_USBDEV(sc), "failed to create thread\n"); | ||
3595 | + ret = PTR_ERR(sc->kthread); | ||
3596 | goto err2; | ||
3597 | } | ||
3598 | |||
3599 | @@ -2236,7 +2242,7 @@ err1: | ||
3600 | kfree(intr); | ||
3601 | err0: | ||
3602 | uea_leaves(INS_TO_USBDEV(sc)); | ||
3603 | - return -ENOMEM; | ||
3604 | + return ret; | ||
3605 | } | ||
3606 | |||
3607 | /* | ||
3608 | @@ -2597,7 +2603,7 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf, | ||
3609 | if (ret < 0) | ||
3610 | goto error; | ||
3611 | |||
3612 | - ret = uea_boot(sc); | ||
3613 | + ret = uea_boot(sc, intf); | ||
3614 | if (ret < 0) | ||
3615 | goto error_rm_grp; | ||
3616 | |||
3617 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
3618 | index 4a87cc478340..acf4752302a6 100644 | ||
3619 | --- a/drivers/usb/core/hub.c | ||
3620 | +++ b/drivers/usb/core/hub.c | ||
3621 | @@ -5620,7 +5620,7 @@ re_enumerate_no_bos: | ||
3622 | |||
3623 | /** | ||
3624 | * usb_reset_device - warn interface drivers and perform a USB port reset | ||
3625 | - * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) | ||
3626 | + * @udev: device to reset (not in NOTATTACHED state) | ||
3627 | * | ||
3628 | * Warns all drivers bound to registered interfaces (using their pre_reset | ||
3629 | * method), performs the port reset, and then lets the drivers know that | ||
3630 | @@ -5648,8 +5648,7 @@ int usb_reset_device(struct usb_device *udev) | ||
3631 | struct usb_host_config *config = udev->actconfig; | ||
3632 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); | ||
3633 | |||
3634 | - if (udev->state == USB_STATE_NOTATTACHED || | ||
3635 | - udev->state == USB_STATE_SUSPENDED) { | ||
3636 | + if (udev->state == USB_STATE_NOTATTACHED) { | ||
3637 | dev_dbg(&udev->dev, "device reset not allowed in state %d\n", | ||
3638 | udev->state); | ||
3639 | return -EINVAL; | ||
3640 | diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c | ||
3641 | index 5133ab965229..7b81bcfa19cb 100644 | ||
3642 | --- a/drivers/usb/core/urb.c | ||
3643 | +++ b/drivers/usb/core/urb.c | ||
3644 | @@ -40,6 +40,7 @@ void usb_init_urb(struct urb *urb) | ||
3645 | if (urb) { | ||
3646 | memset(urb, 0, sizeof(*urb)); | ||
3647 | kref_init(&urb->kref); | ||
3648 | + INIT_LIST_HEAD(&urb->urb_list); | ||
3649 | INIT_LIST_HEAD(&urb->anchor_list); | ||
3650 | } | ||
3651 | } | ||
3652 | diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c | ||
3653 | index 7154a93f0114..30bc5996a2f2 100644 | ||
3654 | --- a/drivers/usb/dwc3/core.c | ||
3655 | +++ b/drivers/usb/dwc3/core.c | ||
3656 | @@ -1102,7 +1102,8 @@ static int dwc3_probe(struct platform_device *pdev) | ||
3657 | |||
3658 | ret = dwc3_core_init(dwc); | ||
3659 | if (ret) { | ||
3660 | - dev_err(dev, "failed to initialize core\n"); | ||
3661 | + if (ret != -EPROBE_DEFER) | ||
3662 | + dev_err(dev, "failed to initialize core: %d\n", ret); | ||
3663 | goto err4; | ||
3664 | } | ||
3665 | |||
3666 | diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c | ||
3667 | index b5315a47f0b9..3f1662b64bab 100644 | ||
3668 | --- a/drivers/usb/gadget/configfs.c | ||
3669 | +++ b/drivers/usb/gadget/configfs.c | ||
3670 | @@ -1541,6 +1541,7 @@ static struct config_group *gadgets_make( | ||
3671 | gi->composite.resume = NULL; | ||
3672 | gi->composite.max_speed = USB_SPEED_SUPER; | ||
3673 | |||
3674 | + spin_lock_init(&gi->spinlock); | ||
3675 | mutex_init(&gi->lock); | ||
3676 | INIT_LIST_HEAD(&gi->string_list); | ||
3677 | INIT_LIST_HEAD(&gi->available_func); | ||
3678 | diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c | ||
3679 | index 2f151e0aa6da..510a54f88963 100644 | ||
3680 | --- a/drivers/usb/gadget/function/u_serial.c | ||
3681 | +++ b/drivers/usb/gadget/function/u_serial.c | ||
3682 | @@ -1391,8 +1391,10 @@ int gserial_alloc_line(unsigned char *line_num) | ||
3683 | __func__, port_num, PTR_ERR(tty_dev)); | ||
3684 | |||
3685 | ret = PTR_ERR(tty_dev); | ||
3686 | + mutex_lock(&ports[port_num].lock); | ||
3687 | port = ports[port_num].port; | ||
3688 | ports[port_num].port = NULL; | ||
3689 | + mutex_unlock(&ports[port_num].lock); | ||
3690 | gserial_free_port(port); | ||
3691 | goto err; | ||
3692 | } | ||
3693 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c | ||
3694 | index 39e2d3271035..5cf5f3d9c1e5 100644 | ||
3695 | --- a/drivers/usb/host/xhci-hub.c | ||
3696 | +++ b/drivers/usb/host/xhci-hub.c | ||
3697 | @@ -728,7 +728,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, | ||
3698 | struct xhci_bus_state *bus_state, | ||
3699 | __le32 __iomem **port_array, | ||
3700 | u16 wIndex, u32 raw_port_status, | ||
3701 | - unsigned long flags) | ||
3702 | + unsigned long *flags) | ||
3703 | __releases(&xhci->lock) | ||
3704 | __acquires(&xhci->lock) | ||
3705 | { | ||
3706 | @@ -760,6 +760,14 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, | ||
3707 | status |= USB_PORT_STAT_C_BH_RESET << 16; | ||
3708 | if ((raw_port_status & PORT_CEC)) | ||
3709 | status |= USB_PORT_STAT_C_CONFIG_ERROR << 16; | ||
3710 | + | ||
3711 | + /* USB3 remote wake resume signaling completed */ | ||
3712 | + if (bus_state->port_remote_wakeup & (1 << wIndex) && | ||
3713 | + (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME && | ||
3714 | + (raw_port_status & PORT_PLS_MASK) != XDEV_RECOVERY) { | ||
3715 | + bus_state->port_remote_wakeup &= ~(1 << wIndex); | ||
3716 | + usb_hcd_end_port_resume(&hcd->self, wIndex); | ||
3717 | + } | ||
3718 | } | ||
3719 | |||
3720 | if (hcd->speed < HCD_USB3) { | ||
3721 | @@ -810,12 +818,12 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, | ||
3722 | xhci_set_link_state(xhci, port_array, wIndex, | ||
3723 | XDEV_U0); | ||
3724 | |||
3725 | - spin_unlock_irqrestore(&xhci->lock, flags); | ||
3726 | + spin_unlock_irqrestore(&xhci->lock, *flags); | ||
3727 | time_left = wait_for_completion_timeout( | ||
3728 | &bus_state->rexit_done[wIndex], | ||
3729 | msecs_to_jiffies( | ||
3730 | XHCI_MAX_REXIT_TIMEOUT_MS)); | ||
3731 | - spin_lock_irqsave(&xhci->lock, flags); | ||
3732 | + spin_lock_irqsave(&xhci->lock, *flags); | ||
3733 | |||
3734 | if (time_left) { | ||
3735 | slot_id = xhci_find_slot_id_by_port(hcd, | ||
3736 | @@ -961,7 +969,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | ||
3737 | break; | ||
3738 | } | ||
3739 | status = xhci_get_port_status(hcd, bus_state, port_array, | ||
3740 | - wIndex, temp, flags); | ||
3741 | + wIndex, temp, &flags); | ||
3742 | if (status == 0xffffffff) | ||
3743 | goto error; | ||
3744 | |||
3745 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c | ||
3746 | index 7199e400fbac..aad64a26a767 100644 | ||
3747 | --- a/drivers/usb/host/xhci-mem.c | ||
3748 | +++ b/drivers/usb/host/xhci-mem.c | ||
3749 | @@ -1940,10 +1940,14 @@ no_bw: | ||
3750 | kfree(xhci->port_array); | ||
3751 | kfree(xhci->rh_bw); | ||
3752 | kfree(xhci->ext_caps); | ||
3753 | + kfree(xhci->usb2_rhub.psi); | ||
3754 | + kfree(xhci->usb3_rhub.psi); | ||
3755 | |||
3756 | xhci->usb2_ports = NULL; | ||
3757 | xhci->usb3_ports = NULL; | ||
3758 | xhci->port_array = NULL; | ||
3759 | + xhci->usb2_rhub.psi = NULL; | ||
3760 | + xhci->usb3_rhub.psi = NULL; | ||
3761 | xhci->rh_bw = NULL; | ||
3762 | xhci->ext_caps = NULL; | ||
3763 | |||
3764 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
3765 | index b5140555a8d5..99bef8518fd2 100644 | ||
3766 | --- a/drivers/usb/host/xhci-pci.c | ||
3767 | +++ b/drivers/usb/host/xhci-pci.c | ||
3768 | @@ -470,6 +470,18 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) | ||
3769 | } | ||
3770 | #endif /* CONFIG_PM */ | ||
3771 | |||
3772 | +static void xhci_pci_shutdown(struct usb_hcd *hcd) | ||
3773 | +{ | ||
3774 | + struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
3775 | + struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | ||
3776 | + | ||
3777 | + xhci_shutdown(hcd); | ||
3778 | + | ||
3779 | + /* Yet another workaround for spurious wakeups at shutdown with HSW */ | ||
3780 | + if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) | ||
3781 | + pci_set_power_state(pdev, PCI_D3hot); | ||
3782 | +} | ||
3783 | + | ||
3784 | /*-------------------------------------------------------------------------*/ | ||
3785 | |||
3786 | /* PCI driver selection metadata; PCI hotplugging uses this */ | ||
3787 | @@ -505,6 +517,7 @@ static int __init xhci_pci_init(void) | ||
3788 | #ifdef CONFIG_PM | ||
3789 | xhci_pci_hc_driver.pci_suspend = xhci_pci_suspend; | ||
3790 | xhci_pci_hc_driver.pci_resume = xhci_pci_resume; | ||
3791 | + xhci_pci_hc_driver.shutdown = xhci_pci_shutdown; | ||
3792 | #endif | ||
3793 | return pci_register_driver(&xhci_pci_driver); | ||
3794 | } | ||
3795 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
3796 | index 69ad9817076a..b426c83ecb9b 100644 | ||
3797 | --- a/drivers/usb/host/xhci-ring.c | ||
3798 | +++ b/drivers/usb/host/xhci-ring.c | ||
3799 | @@ -1609,9 +1609,6 @@ static void handle_port_status(struct xhci_hcd *xhci, | ||
3800 | usb_hcd_resume_root_hub(hcd); | ||
3801 | } | ||
3802 | |||
3803 | - if (hcd->speed >= HCD_USB3 && (temp & PORT_PLS_MASK) == XDEV_INACTIVE) | ||
3804 | - bus_state->port_remote_wakeup &= ~(1 << faked_port_index); | ||
3805 | - | ||
3806 | if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_RESUME) { | ||
3807 | xhci_dbg(xhci, "port resume event for port %d\n", port_id); | ||
3808 | |||
3809 | @@ -1630,6 +1627,7 @@ static void handle_port_status(struct xhci_hcd *xhci, | ||
3810 | bus_state->port_remote_wakeup |= 1 << faked_port_index; | ||
3811 | xhci_test_and_clear_bit(xhci, port_array, | ||
3812 | faked_port_index, PORT_PLC); | ||
3813 | + usb_hcd_start_port_resume(&hcd->self, faked_port_index); | ||
3814 | xhci_set_link_state(xhci, port_array, faked_port_index, | ||
3815 | XDEV_U0); | ||
3816 | /* Need to wait until the next link state change | ||
3817 | @@ -1667,8 +1665,6 @@ static void handle_port_status(struct xhci_hcd *xhci, | ||
3818 | if (slot_id && xhci->devs[slot_id]) | ||
3819 | xhci_ring_device(xhci, slot_id); | ||
3820 | if (bus_state->port_remote_wakeup & (1 << faked_port_index)) { | ||
3821 | - bus_state->port_remote_wakeup &= | ||
3822 | - ~(1 << faked_port_index); | ||
3823 | xhci_test_and_clear_bit(xhci, port_array, | ||
3824 | faked_port_index, PORT_PLC); | ||
3825 | usb_wakeup_notification(hcd->self.root_hub, | ||
3826 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
3827 | index 755016729f12..baacc442ec6a 100644 | ||
3828 | --- a/drivers/usb/host/xhci.c | ||
3829 | +++ b/drivers/usb/host/xhci.c | ||
3830 | @@ -758,11 +758,8 @@ void xhci_shutdown(struct usb_hcd *hcd) | ||
3831 | xhci_dbg_trace(xhci, trace_xhci_dbg_init, | ||
3832 | "xhci_shutdown completed - status = %x", | ||
3833 | readl(&xhci->op_regs->status)); | ||
3834 | - | ||
3835 | - /* Yet another workaround for spurious wakeups at shutdown with HSW */ | ||
3836 | - if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) | ||
3837 | - pci_set_power_state(to_pci_dev(hcd->self.controller), PCI_D3hot); | ||
3838 | } | ||
3839 | +EXPORT_SYMBOL_GPL(xhci_shutdown); | ||
3840 | |||
3841 | #ifdef CONFIG_PM | ||
3842 | static void xhci_save_registers(struct xhci_hcd *xhci) | ||
3843 | @@ -933,7 +930,7 @@ static bool xhci_pending_portevent(struct xhci_hcd *xhci) | ||
3844 | int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup) | ||
3845 | { | ||
3846 | int rc = 0; | ||
3847 | - unsigned int delay = XHCI_MAX_HALT_USEC; | ||
3848 | + unsigned int delay = XHCI_MAX_HALT_USEC * 2; | ||
3849 | struct usb_hcd *hcd = xhci_to_hcd(xhci); | ||
3850 | u32 command; | ||
3851 | |||
3852 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
3853 | index de4771ce0df6..2b603ef5c10c 100644 | ||
3854 | --- a/drivers/usb/host/xhci.h | ||
3855 | +++ b/drivers/usb/host/xhci.h | ||
3856 | @@ -316,6 +316,7 @@ struct xhci_op_regs { | ||
3857 | #define XDEV_U3 (0x3 << 5) | ||
3858 | #define XDEV_INACTIVE (0x6 << 5) | ||
3859 | #define XDEV_POLLING (0x7 << 5) | ||
3860 | +#define XDEV_RECOVERY (0x8 << 5) | ||
3861 | #define XDEV_COMP_MODE (0xa << 5) | ||
3862 | #define XDEV_RESUME (0xf << 5) | ||
3863 | /* true: port has power (see HCC_PPC) */ | ||
3864 | @@ -1865,6 +1866,7 @@ int xhci_run(struct usb_hcd *hcd); | ||
3865 | void xhci_stop(struct usb_hcd *hcd); | ||
3866 | void xhci_shutdown(struct usb_hcd *hcd); | ||
3867 | int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks); | ||
3868 | +void xhci_shutdown(struct usb_hcd *hcd); | ||
3869 | void xhci_init_driver(struct hc_driver *drv, | ||
3870 | const struct xhci_driver_overrides *over); | ||
3871 | |||
3872 | diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c | ||
3873 | index f0c071da68d1..7fb0590187d4 100644 | ||
3874 | --- a/drivers/usb/misc/adutux.c | ||
3875 | +++ b/drivers/usb/misc/adutux.c | ||
3876 | @@ -685,7 +685,7 @@ static int adu_probe(struct usb_interface *interface, | ||
3877 | init_waitqueue_head(&dev->read_wait); | ||
3878 | init_waitqueue_head(&dev->write_wait); | ||
3879 | |||
3880 | - iface_desc = &interface->altsetting[0]; | ||
3881 | + iface_desc = &interface->cur_altsetting[0]; | ||
3882 | |||
3883 | /* set up the endpoint information */ | ||
3884 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | ||
3885 | diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c | ||
3886 | index 9a67ae39185b..9cf8a9b16336 100644 | ||
3887 | --- a/drivers/usb/misc/idmouse.c | ||
3888 | +++ b/drivers/usb/misc/idmouse.c | ||
3889 | @@ -342,7 +342,7 @@ static int idmouse_probe(struct usb_interface *interface, | ||
3890 | int result; | ||
3891 | |||
3892 | /* check if we have gotten the data or the hid interface */ | ||
3893 | - iface_desc = &interface->altsetting[0]; | ||
3894 | + iface_desc = interface->cur_altsetting; | ||
3895 | if (iface_desc->desc.bInterfaceClass != 0x0A) | ||
3896 | return -ENODEV; | ||
3897 | |||
3898 | diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c | ||
3899 | index 80b37d214beb..bd1a8dc285f5 100644 | ||
3900 | --- a/drivers/usb/mon/mon_bin.c | ||
3901 | +++ b/drivers/usb/mon/mon_bin.c | ||
3902 | @@ -1036,12 +1036,18 @@ static long mon_bin_ioctl(struct file *file, unsigned int cmd, unsigned long arg | ||
3903 | |||
3904 | mutex_lock(&rp->fetch_lock); | ||
3905 | spin_lock_irqsave(&rp->b_lock, flags); | ||
3906 | - mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); | ||
3907 | - kfree(rp->b_vec); | ||
3908 | - rp->b_vec = vec; | ||
3909 | - rp->b_size = size; | ||
3910 | - rp->b_read = rp->b_in = rp->b_out = rp->b_cnt = 0; | ||
3911 | - rp->cnt_lost = 0; | ||
3912 | + if (rp->mmap_active) { | ||
3913 | + mon_free_buff(vec, size/CHUNK_SIZE); | ||
3914 | + kfree(vec); | ||
3915 | + ret = -EBUSY; | ||
3916 | + } else { | ||
3917 | + mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); | ||
3918 | + kfree(rp->b_vec); | ||
3919 | + rp->b_vec = vec; | ||
3920 | + rp->b_size = size; | ||
3921 | + rp->b_read = rp->b_in = rp->b_out = rp->b_cnt = 0; | ||
3922 | + rp->cnt_lost = 0; | ||
3923 | + } | ||
3924 | spin_unlock_irqrestore(&rp->b_lock, flags); | ||
3925 | mutex_unlock(&rp->fetch_lock); | ||
3926 | } | ||
3927 | @@ -1213,13 +1219,21 @@ mon_bin_poll(struct file *file, struct poll_table_struct *wait) | ||
3928 | static void mon_bin_vma_open(struct vm_area_struct *vma) | ||
3929 | { | ||
3930 | struct mon_reader_bin *rp = vma->vm_private_data; | ||
3931 | + unsigned long flags; | ||
3932 | + | ||
3933 | + spin_lock_irqsave(&rp->b_lock, flags); | ||
3934 | rp->mmap_active++; | ||
3935 | + spin_unlock_irqrestore(&rp->b_lock, flags); | ||
3936 | } | ||
3937 | |||
3938 | static void mon_bin_vma_close(struct vm_area_struct *vma) | ||
3939 | { | ||
3940 | + unsigned long flags; | ||
3941 | + | ||
3942 | struct mon_reader_bin *rp = vma->vm_private_data; | ||
3943 | + spin_lock_irqsave(&rp->b_lock, flags); | ||
3944 | rp->mmap_active--; | ||
3945 | + spin_unlock_irqrestore(&rp->b_lock, flags); | ||
3946 | } | ||
3947 | |||
3948 | /* | ||
3949 | @@ -1231,16 +1245,12 @@ static int mon_bin_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | ||
3950 | unsigned long offset, chunk_idx; | ||
3951 | struct page *pageptr; | ||
3952 | |||
3953 | - mutex_lock(&rp->fetch_lock); | ||
3954 | offset = vmf->pgoff << PAGE_SHIFT; | ||
3955 | - if (offset >= rp->b_size) { | ||
3956 | - mutex_unlock(&rp->fetch_lock); | ||
3957 | + if (offset >= rp->b_size) | ||
3958 | return VM_FAULT_SIGBUS; | ||
3959 | - } | ||
3960 | chunk_idx = offset / CHUNK_SIZE; | ||
3961 | pageptr = rp->b_vec[chunk_idx].pg; | ||
3962 | get_page(pageptr); | ||
3963 | - mutex_unlock(&rp->fetch_lock); | ||
3964 | vmf->page = pageptr; | ||
3965 | return 0; | ||
3966 | } | ||
3967 | diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c | ||
3968 | index de61271f2ba3..e5649adcc84c 100644 | ||
3969 | --- a/drivers/usb/serial/io_edgeport.c | ||
3970 | +++ b/drivers/usb/serial/io_edgeport.c | ||
3971 | @@ -2852,16 +2852,18 @@ static int edge_startup(struct usb_serial *serial) | ||
3972 | response = 0; | ||
3973 | |||
3974 | if (edge_serial->is_epic) { | ||
3975 | + struct usb_host_interface *alt; | ||
3976 | + | ||
3977 | + alt = serial->interface->cur_altsetting; | ||
3978 | + | ||
3979 | /* EPIC thing, set up our interrupt polling now and our read | ||
3980 | * urb, so that the device knows it really is connected. */ | ||
3981 | interrupt_in_found = bulk_in_found = bulk_out_found = false; | ||
3982 | - for (i = 0; i < serial->interface->altsetting[0] | ||
3983 | - .desc.bNumEndpoints; ++i) { | ||
3984 | + for (i = 0; i < alt->desc.bNumEndpoints; ++i) { | ||
3985 | struct usb_endpoint_descriptor *endpoint; | ||
3986 | int buffer_size; | ||
3987 | |||
3988 | - endpoint = &serial->interface->altsetting[0]. | ||
3989 | - endpoint[i].desc; | ||
3990 | + endpoint = &alt->endpoint[i].desc; | ||
3991 | buffer_size = usb_endpoint_maxp(endpoint); | ||
3992 | if (!interrupt_in_found && | ||
3993 | (usb_endpoint_is_int_in(endpoint))) { | ||
3994 | diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c | ||
3995 | index 597bc550034f..a6999042e7ad 100644 | ||
3996 | --- a/drivers/usb/storage/uas.c | ||
3997 | +++ b/drivers/usb/storage/uas.c | ||
3998 | @@ -832,6 +832,10 @@ static int uas_slave_configure(struct scsi_device *sdev) | ||
3999 | sdev->wce_default_on = 1; | ||
4000 | } | ||
4001 | |||
4002 | + /* Some disks cannot handle READ_CAPACITY_16 */ | ||
4003 | + if (devinfo->flags & US_FL_NO_READ_CAPACITY_16) | ||
4004 | + sdev->no_read_capacity_16 = 1; | ||
4005 | + | ||
4006 | /* | ||
4007 | * Some disks return the total number of blocks in response | ||
4008 | * to READ CAPACITY rather than the highest block number. | ||
4009 | @@ -840,6 +844,12 @@ static int uas_slave_configure(struct scsi_device *sdev) | ||
4010 | if (devinfo->flags & US_FL_FIX_CAPACITY) | ||
4011 | sdev->fix_capacity = 1; | ||
4012 | |||
4013 | + /* | ||
4014 | + * in some cases we have to guess | ||
4015 | + */ | ||
4016 | + if (devinfo->flags & US_FL_CAPACITY_HEURISTICS) | ||
4017 | + sdev->guess_capacity = 1; | ||
4018 | + | ||
4019 | /* | ||
4020 | * Some devices don't like MODE SENSE with page=0x3f, | ||
4021 | * which is the command used for checking if a device | ||
4022 | diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c | ||
4023 | index 1c46045b0e7f..94594dc63c41 100644 | ||
4024 | --- a/drivers/vfio/pci/vfio_pci_intrs.c | ||
4025 | +++ b/drivers/vfio/pci/vfio_pci_intrs.c | ||
4026 | @@ -297,8 +297,8 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, | ||
4027 | irq = pci_irq_vector(pdev, vector); | ||
4028 | |||
4029 | if (vdev->ctx[vector].trigger) { | ||
4030 | - free_irq(irq, vdev->ctx[vector].trigger); | ||
4031 | irq_bypass_unregister_producer(&vdev->ctx[vector].producer); | ||
4032 | + free_irq(irq, vdev->ctx[vector].trigger); | ||
4033 | kfree(vdev->ctx[vector].name); | ||
4034 | eventfd_ctx_put(vdev->ctx[vector].trigger); | ||
4035 | vdev->ctx[vector].trigger = NULL; | ||
4036 | diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c | ||
4037 | index b73520aaf697..2e325fea4446 100644 | ||
4038 | --- a/drivers/video/hdmi.c | ||
4039 | +++ b/drivers/video/hdmi.c | ||
4040 | @@ -1032,12 +1032,12 @@ static int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *frame, | ||
4041 | if (ptr[0] & 0x10) | ||
4042 | frame->active_aspect = ptr[1] & 0xf; | ||
4043 | if (ptr[0] & 0x8) { | ||
4044 | - frame->top_bar = (ptr[5] << 8) + ptr[6]; | ||
4045 | - frame->bottom_bar = (ptr[7] << 8) + ptr[8]; | ||
4046 | + frame->top_bar = (ptr[6] << 8) | ptr[5]; | ||
4047 | + frame->bottom_bar = (ptr[8] << 8) | ptr[7]; | ||
4048 | } | ||
4049 | if (ptr[0] & 0x4) { | ||
4050 | - frame->left_bar = (ptr[9] << 8) + ptr[10]; | ||
4051 | - frame->right_bar = (ptr[11] << 8) + ptr[12]; | ||
4052 | + frame->left_bar = (ptr[10] << 8) | ptr[9]; | ||
4053 | + frame->right_bar = (ptr[12] << 8) | ptr[11]; | ||
4054 | } | ||
4055 | frame->scan_mode = ptr[0] & 0x3; | ||
4056 | |||
4057 | diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c | ||
4058 | index 30076956a096..4e64a3befa35 100644 | ||
4059 | --- a/drivers/virtio/virtio_balloon.c | ||
4060 | +++ b/drivers/virtio/virtio_balloon.c | ||
4061 | @@ -482,6 +482,17 @@ static int virtballoon_migratepage(struct balloon_dev_info *vb_dev_info, | ||
4062 | |||
4063 | get_page(newpage); /* balloon reference */ | ||
4064 | |||
4065 | + /* | ||
4066 | + * When we migrate a page to a different zone and adjusted the | ||
4067 | + * managed page count when inflating, we have to fixup the count of | ||
4068 | + * both involved zones. | ||
4069 | + */ | ||
4070 | + if (!virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM) && | ||
4071 | + page_zone(page) != page_zone(newpage)) { | ||
4072 | + adjust_managed_page_count(page, 1); | ||
4073 | + adjust_managed_page_count(newpage, -1); | ||
4074 | + } | ||
4075 | + | ||
4076 | /* balloon's page migration 1st step -- inflate "newpage" */ | ||
4077 | spin_lock_irqsave(&vb_dev_info->pages_lock, flags); | ||
4078 | balloon_page_insert(vb_dev_info, newpage); | ||
4079 | diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c | ||
4080 | index 2e1f50e467f1..02f0d373adbf 100644 | ||
4081 | --- a/fs/autofs4/expire.c | ||
4082 | +++ b/fs/autofs4/expire.c | ||
4083 | @@ -469,9 +469,10 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb, | ||
4084 | */ | ||
4085 | flags &= ~AUTOFS_EXP_LEAVES; | ||
4086 | found = should_expire(expired, mnt, timeout, how); | ||
4087 | - if (!found || found != expired) | ||
4088 | - /* Something has changed, continue */ | ||
4089 | + if (found != expired) { // something has changed, continue | ||
4090 | + dput(found); | ||
4091 | goto next; | ||
4092 | + } | ||
4093 | |||
4094 | if (expired != dentry) | ||
4095 | dput(dentry); | ||
4096 | diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c | ||
4097 | index 6cdf27325576..03661b744eaf 100644 | ||
4098 | --- a/fs/btrfs/file.c | ||
4099 | +++ b/fs/btrfs/file.c | ||
4100 | @@ -1555,6 +1555,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | ||
4101 | break; | ||
4102 | } | ||
4103 | |||
4104 | + only_release_metadata = false; | ||
4105 | sector_offset = pos & (root->sectorsize - 1); | ||
4106 | reserve_bytes = round_up(write_bytes + sector_offset, | ||
4107 | root->sectorsize); | ||
4108 | @@ -1704,7 +1705,6 @@ again: | ||
4109 | set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
4110 | lockend, EXTENT_NORESERVE, NULL, | ||
4111 | NULL, GFP_NOFS); | ||
4112 | - only_release_metadata = false; | ||
4113 | } | ||
4114 | |||
4115 | btrfs_drop_pages(pages, num_pages); | ||
4116 | diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c | ||
4117 | index 69a3c11af9d4..a84a1ceb260a 100644 | ||
4118 | --- a/fs/btrfs/free-space-cache.c | ||
4119 | +++ b/fs/btrfs/free-space-cache.c | ||
4120 | @@ -391,6 +391,12 @@ static int io_ctl_prepare_pages(struct btrfs_io_ctl *io_ctl, struct inode *inode | ||
4121 | if (uptodate && !PageUptodate(page)) { | ||
4122 | btrfs_readpage(NULL, page); | ||
4123 | lock_page(page); | ||
4124 | + if (page->mapping != inode->i_mapping) { | ||
4125 | + btrfs_err(BTRFS_I(inode)->root->fs_info, | ||
4126 | + "free space cache page truncated"); | ||
4127 | + io_ctl_drop_pages(io_ctl); | ||
4128 | + return -EIO; | ||
4129 | + } | ||
4130 | if (!PageUptodate(page)) { | ||
4131 | btrfs_err(BTRFS_I(inode)->root->fs_info, | ||
4132 | "error reading free space cache"); | ||
4133 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c | ||
4134 | index 1b1a9e35e082..80937c5ca477 100644 | ||
4135 | --- a/fs/btrfs/inode.c | ||
4136 | +++ b/fs/btrfs/inode.c | ||
4137 | @@ -9616,6 +9616,9 @@ static int btrfs_rename_exchange(struct inode *old_dir, | ||
4138 | goto out_notrans; | ||
4139 | } | ||
4140 | |||
4141 | + if (dest != root) | ||
4142 | + btrfs_record_root_in_trans(trans, dest); | ||
4143 | + | ||
4144 | /* | ||
4145 | * We need to find a free sequence number both in the source and | ||
4146 | * in the destination directory for the exchange. | ||
4147 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c | ||
4148 | index d9e49705a289..edfc7ba38b33 100644 | ||
4149 | --- a/fs/btrfs/send.c | ||
4150 | +++ b/fs/btrfs/send.c | ||
4151 | @@ -36,6 +36,14 @@ | ||
4152 | #include "transaction.h" | ||
4153 | #include "compression.h" | ||
4154 | |||
4155 | +/* | ||
4156 | + * Maximum number of references an extent can have in order for us to attempt to | ||
4157 | + * issue clone operations instead of write operations. This currently exists to | ||
4158 | + * avoid hitting limitations of the backreference walking code (taking a lot of | ||
4159 | + * time and using too much memory for extents with large number of references). | ||
4160 | + */ | ||
4161 | +#define SEND_MAX_EXTENT_REFS 64 | ||
4162 | + | ||
4163 | /* | ||
4164 | * A fs_path is a helper to dynamically build path names with unknown size. | ||
4165 | * It reallocates the internal buffer on demand. | ||
4166 | @@ -1327,6 +1335,7 @@ static int find_extent_clone(struct send_ctx *sctx, | ||
4167 | struct clone_root *cur_clone_root; | ||
4168 | struct btrfs_key found_key; | ||
4169 | struct btrfs_path *tmp_path; | ||
4170 | + struct btrfs_extent_item *ei; | ||
4171 | int compressed; | ||
4172 | u32 i; | ||
4173 | |||
4174 | @@ -1376,7 +1385,6 @@ static int find_extent_clone(struct send_ctx *sctx, | ||
4175 | ret = extent_from_logical(fs_info, disk_byte, tmp_path, | ||
4176 | &found_key, &flags); | ||
4177 | up_read(&fs_info->commit_root_sem); | ||
4178 | - btrfs_release_path(tmp_path); | ||
4179 | |||
4180 | if (ret < 0) | ||
4181 | goto out; | ||
4182 | @@ -1385,6 +1393,21 @@ static int find_extent_clone(struct send_ctx *sctx, | ||
4183 | goto out; | ||
4184 | } | ||
4185 | |||
4186 | + ei = btrfs_item_ptr(tmp_path->nodes[0], tmp_path->slots[0], | ||
4187 | + struct btrfs_extent_item); | ||
4188 | + /* | ||
4189 | + * Backreference walking (iterate_extent_inodes() below) is currently | ||
4190 | + * too expensive when an extent has a large number of references, both | ||
4191 | + * in time spent and used memory. So for now just fallback to write | ||
4192 | + * operations instead of clone operations when an extent has more than | ||
4193 | + * a certain amount of references. | ||
4194 | + */ | ||
4195 | + if (btrfs_extent_refs(tmp_path->nodes[0], ei) > SEND_MAX_EXTENT_REFS) { | ||
4196 | + ret = -ENOENT; | ||
4197 | + goto out; | ||
4198 | + } | ||
4199 | + btrfs_release_path(tmp_path); | ||
4200 | + | ||
4201 | /* | ||
4202 | * Setup the clone roots. | ||
4203 | */ | ||
4204 | diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h | ||
4205 | index 663d66828cca..96c1b847def6 100644 | ||
4206 | --- a/fs/btrfs/volumes.h | ||
4207 | +++ b/fs/btrfs/volumes.h | ||
4208 | @@ -312,7 +312,6 @@ struct btrfs_bio { | ||
4209 | u64 map_type; /* get from map_lookup->type */ | ||
4210 | bio_end_io_t *end_io; | ||
4211 | struct bio *orig_bio; | ||
4212 | - unsigned long flags; | ||
4213 | void *private; | ||
4214 | atomic_t error; | ||
4215 | int max_errors; | ||
4216 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c | ||
4217 | index 1c3f262d9c4d..09d83275c20b 100644 | ||
4218 | --- a/fs/cifs/file.c | ||
4219 | +++ b/fs/cifs/file.c | ||
4220 | @@ -312,9 +312,6 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, | ||
4221 | INIT_LIST_HEAD(&fdlocks->locks); | ||
4222 | fdlocks->cfile = cfile; | ||
4223 | cfile->llist = fdlocks; | ||
4224 | - cifs_down_write(&cinode->lock_sem); | ||
4225 | - list_add(&fdlocks->llist, &cinode->llist); | ||
4226 | - up_write(&cinode->lock_sem); | ||
4227 | |||
4228 | cfile->count = 1; | ||
4229 | cfile->pid = current->tgid; | ||
4230 | @@ -338,6 +335,10 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, | ||
4231 | oplock = 0; | ||
4232 | } | ||
4233 | |||
4234 | + cifs_down_write(&cinode->lock_sem); | ||
4235 | + list_add(&fdlocks->llist, &cinode->llist); | ||
4236 | + up_write(&cinode->lock_sem); | ||
4237 | + | ||
4238 | spin_lock(&tcon->open_file_lock); | ||
4239 | if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE && oplock) | ||
4240 | oplock = fid->pending_open->oplock; | ||
4241 | @@ -721,6 +722,13 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) | ||
4242 | if (backup_cred(cifs_sb)) | ||
4243 | create_options |= CREATE_OPEN_BACKUP_INTENT; | ||
4244 | |||
4245 | + /* O_SYNC also has bit for O_DSYNC so following check picks up either */ | ||
4246 | + if (cfile->f_flags & O_SYNC) | ||
4247 | + create_options |= CREATE_WRITE_THROUGH; | ||
4248 | + | ||
4249 | + if (cfile->f_flags & O_DIRECT) | ||
4250 | + create_options |= CREATE_NO_BUFFER; | ||
4251 | + | ||
4252 | if (server->ops->get_lease_key) | ||
4253 | server->ops->get_lease_key(inode, &cfile->fid); | ||
4254 | |||
4255 | diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c | ||
4256 | index 9994d15a32fc..7b7b47e26dbd 100644 | ||
4257 | --- a/fs/cifs/smb2misc.c | ||
4258 | +++ b/fs/cifs/smb2misc.c | ||
4259 | @@ -617,10 +617,10 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server) | ||
4260 | spin_lock(&cifs_tcp_ses_lock); | ||
4261 | list_for_each(tmp, &server->smb_ses_list) { | ||
4262 | ses = list_entry(tmp, struct cifs_ses, smb_ses_list); | ||
4263 | + | ||
4264 | list_for_each(tmp1, &ses->tcon_list) { | ||
4265 | tcon = list_entry(tmp1, struct cifs_tcon, tcon_list); | ||
4266 | |||
4267 | - cifs_stats_inc(&tcon->stats.cifs_stats.num_oplock_brks); | ||
4268 | spin_lock(&tcon->open_file_lock); | ||
4269 | list_for_each(tmp2, &tcon->openFileList) { | ||
4270 | cfile = list_entry(tmp2, struct cifsFileInfo, | ||
4271 | @@ -632,6 +632,8 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server) | ||
4272 | continue; | ||
4273 | |||
4274 | cifs_dbg(FYI, "file id match, oplock break\n"); | ||
4275 | + cifs_stats_inc( | ||
4276 | + &tcon->stats.cifs_stats.num_oplock_brks); | ||
4277 | cinode = CIFS_I(d_inode(cfile->dentry)); | ||
4278 | spin_lock(&cfile->file_info_lock); | ||
4279 | if (!CIFS_CACHE_WRITE(cinode) && | ||
4280 | @@ -664,9 +666,6 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server) | ||
4281 | return true; | ||
4282 | } | ||
4283 | spin_unlock(&tcon->open_file_lock); | ||
4284 | - spin_unlock(&cifs_tcp_ses_lock); | ||
4285 | - cifs_dbg(FYI, "No matching file for oplock break\n"); | ||
4286 | - return true; | ||
4287 | } | ||
4288 | } | ||
4289 | spin_unlock(&cifs_tcp_ses_lock); | ||
4290 | diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c | ||
4291 | index 30e4e01db35a..b14bb2c46042 100644 | ||
4292 | --- a/fs/dlm/lockspace.c | ||
4293 | +++ b/fs/dlm/lockspace.c | ||
4294 | @@ -800,6 +800,7 @@ static int release_lockspace(struct dlm_ls *ls, int force) | ||
4295 | |||
4296 | dlm_delete_debug_file(ls); | ||
4297 | |||
4298 | + idr_destroy(&ls->ls_recover_idr); | ||
4299 | kfree(ls->ls_recover_buf); | ||
4300 | |||
4301 | /* | ||
4302 | diff --git a/fs/dlm/memory.c b/fs/dlm/memory.c | ||
4303 | index 7cd24bccd4fe..37be29f21d04 100644 | ||
4304 | --- a/fs/dlm/memory.c | ||
4305 | +++ b/fs/dlm/memory.c | ||
4306 | @@ -38,10 +38,8 @@ int __init dlm_memory_init(void) | ||
4307 | |||
4308 | void dlm_memory_exit(void) | ||
4309 | { | ||
4310 | - if (lkb_cache) | ||
4311 | - kmem_cache_destroy(lkb_cache); | ||
4312 | - if (rsb_cache) | ||
4313 | - kmem_cache_destroy(rsb_cache); | ||
4314 | + kmem_cache_destroy(lkb_cache); | ||
4315 | + kmem_cache_destroy(rsb_cache); | ||
4316 | } | ||
4317 | |||
4318 | char *dlm_allocate_lvb(struct dlm_ls *ls) | ||
4319 | @@ -86,8 +84,7 @@ void dlm_free_lkb(struct dlm_lkb *lkb) | ||
4320 | struct dlm_user_args *ua; | ||
4321 | ua = lkb->lkb_ua; | ||
4322 | if (ua) { | ||
4323 | - if (ua->lksb.sb_lvbptr) | ||
4324 | - kfree(ua->lksb.sb_lvbptr); | ||
4325 | + kfree(ua->lksb.sb_lvbptr); | ||
4326 | kfree(ua); | ||
4327 | } | ||
4328 | } | ||
4329 | diff --git a/fs/dlm/user.c b/fs/dlm/user.c | ||
4330 | index 57f2aacec97f..bb0d307deadd 100644 | ||
4331 | --- a/fs/dlm/user.c | ||
4332 | +++ b/fs/dlm/user.c | ||
4333 | @@ -25,6 +25,7 @@ | ||
4334 | #include "lvb_table.h" | ||
4335 | #include "user.h" | ||
4336 | #include "ast.h" | ||
4337 | +#include "config.h" | ||
4338 | |||
4339 | static const char name_prefix[] = "dlm"; | ||
4340 | static const struct file_operations device_fops; | ||
4341 | @@ -402,7 +403,7 @@ static int device_create_lockspace(struct dlm_lspace_params *params) | ||
4342 | if (!capable(CAP_SYS_ADMIN)) | ||
4343 | return -EPERM; | ||
4344 | |||
4345 | - error = dlm_new_lockspace(params->name, NULL, params->flags, | ||
4346 | + error = dlm_new_lockspace(params->name, dlm_config.ci_cluster_name, params->flags, | ||
4347 | DLM_USER_LVB_LEN, NULL, NULL, NULL, | ||
4348 | &lockspace); | ||
4349 | if (error) | ||
4350 | diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c | ||
4351 | index 7a7bba7c2328..3706939e5dd5 100644 | ||
4352 | --- a/fs/exportfs/expfs.c | ||
4353 | +++ b/fs/exportfs/expfs.c | ||
4354 | @@ -506,26 +506,33 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid, | ||
4355 | * inode is actually connected to the parent. | ||
4356 | */ | ||
4357 | err = exportfs_get_name(mnt, target_dir, nbuf, result); | ||
4358 | - if (!err) { | ||
4359 | - inode_lock(target_dir->d_inode); | ||
4360 | - nresult = lookup_one_len(nbuf, target_dir, | ||
4361 | - strlen(nbuf)); | ||
4362 | - inode_unlock(target_dir->d_inode); | ||
4363 | - if (!IS_ERR(nresult)) { | ||
4364 | - if (nresult->d_inode) { | ||
4365 | - dput(result); | ||
4366 | - result = nresult; | ||
4367 | - } else | ||
4368 | - dput(nresult); | ||
4369 | - } | ||
4370 | + if (err) { | ||
4371 | + dput(target_dir); | ||
4372 | + goto err_result; | ||
4373 | } | ||
4374 | |||
4375 | + inode_lock(target_dir->d_inode); | ||
4376 | + nresult = lookup_one_len(nbuf, target_dir, strlen(nbuf)); | ||
4377 | + if (!IS_ERR(nresult)) { | ||
4378 | + if (unlikely(nresult->d_inode != result->d_inode)) { | ||
4379 | + dput(nresult); | ||
4380 | + nresult = ERR_PTR(-ESTALE); | ||
4381 | + } | ||
4382 | + } | ||
4383 | + inode_unlock(target_dir->d_inode); | ||
4384 | /* | ||
4385 | * At this point we are done with the parent, but it's pinned | ||
4386 | * by the child dentry anyway. | ||
4387 | */ | ||
4388 | dput(target_dir); | ||
4389 | |||
4390 | + if (IS_ERR(nresult)) { | ||
4391 | + err = PTR_ERR(nresult); | ||
4392 | + goto err_result; | ||
4393 | + } | ||
4394 | + dput(result); | ||
4395 | + result = nresult; | ||
4396 | + | ||
4397 | /* | ||
4398 | * And finally make sure the dentry is actually acceptable | ||
4399 | * to NFSD. | ||
4400 | diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c | ||
4401 | index 85449a6ddc56..fe664949d442 100644 | ||
4402 | --- a/fs/ext2/inode.c | ||
4403 | +++ b/fs/ext2/inode.c | ||
4404 | @@ -697,10 +697,13 @@ static int ext2_get_blocks(struct inode *inode, | ||
4405 | if (!partial) { | ||
4406 | count++; | ||
4407 | mutex_unlock(&ei->truncate_mutex); | ||
4408 | - if (err) | ||
4409 | - goto cleanup; | ||
4410 | goto got_it; | ||
4411 | } | ||
4412 | + | ||
4413 | + if (err) { | ||
4414 | + mutex_unlock(&ei->truncate_mutex); | ||
4415 | + goto cleanup; | ||
4416 | + } | ||
4417 | } | ||
4418 | |||
4419 | /* | ||
4420 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
4421 | index a73056e06bde..00c320e2ba1e 100644 | ||
4422 | --- a/fs/ext4/inode.c | ||
4423 | +++ b/fs/ext4/inode.c | ||
4424 | @@ -5080,11 +5080,15 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode) | ||
4425 | |||
4426 | offset = inode->i_size & (PAGE_SIZE - 1); | ||
4427 | /* | ||
4428 | - * All buffers in the last page remain valid? Then there's nothing to | ||
4429 | - * do. We do the check mainly to optimize the common PAGE_SIZE == | ||
4430 | - * blocksize case | ||
4431 | + * If the page is fully truncated, we don't need to wait for any commit | ||
4432 | + * (and we even should not as __ext4_journalled_invalidatepage() may | ||
4433 | + * strip all buffers from the page but keep the page dirty which can then | ||
4434 | + * confuse e.g. concurrent ext4_writepage() seeing dirty page without | ||
4435 | + * buffers). Also we don't need to wait for any commit if all buffers in | ||
4436 | + * the page remain valid. This is most beneficial for the common case of | ||
4437 | + * blocksize == PAGESIZE. | ||
4438 | */ | ||
4439 | - if (offset > PAGE_SIZE - i_blocksize(inode)) | ||
4440 | + if (!offset || offset > (PAGE_SIZE - i_blocksize(inode))) | ||
4441 | return; | ||
4442 | while (1) { | ||
4443 | page = find_lock_page(inode->i_mapping, | ||
4444 | diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c | ||
4445 | index 1d9fec9c714b..9af23f436558 100644 | ||
4446 | --- a/fs/fuse/dir.c | ||
4447 | +++ b/fs/fuse/dir.c | ||
4448 | @@ -234,7 +234,8 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) | ||
4449 | kfree(forget); | ||
4450 | if (ret == -ENOMEM) | ||
4451 | goto out; | ||
4452 | - if (ret || (outarg.attr.mode ^ inode->i_mode) & S_IFMT) | ||
4453 | + if (ret || fuse_invalid_attr(&outarg.attr) || | ||
4454 | + (outarg.attr.mode ^ inode->i_mode) & S_IFMT) | ||
4455 | goto invalid; | ||
4456 | |||
4457 | forget_all_cached_acls(inode); | ||
4458 | @@ -297,6 +298,12 @@ int fuse_valid_type(int m) | ||
4459 | S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m); | ||
4460 | } | ||
4461 | |||
4462 | +bool fuse_invalid_attr(struct fuse_attr *attr) | ||
4463 | +{ | ||
4464 | + return !fuse_valid_type(attr->mode) || | ||
4465 | + attr->size > LLONG_MAX; | ||
4466 | +} | ||
4467 | + | ||
4468 | int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name, | ||
4469 | struct fuse_entry_out *outarg, struct inode **inode) | ||
4470 | { | ||
4471 | @@ -328,7 +335,7 @@ int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name | ||
4472 | err = -EIO; | ||
4473 | if (!outarg->nodeid) | ||
4474 | goto out_put_forget; | ||
4475 | - if (!fuse_valid_type(outarg->attr.mode)) | ||
4476 | + if (fuse_invalid_attr(&outarg->attr)) | ||
4477 | goto out_put_forget; | ||
4478 | |||
4479 | *inode = fuse_iget(sb, outarg->nodeid, outarg->generation, | ||
4480 | @@ -451,7 +458,8 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, | ||
4481 | goto out_free_ff; | ||
4482 | |||
4483 | err = -EIO; | ||
4484 | - if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid)) | ||
4485 | + if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid) || | ||
4486 | + fuse_invalid_attr(&outentry.attr)) | ||
4487 | goto out_free_ff; | ||
4488 | |||
4489 | ff->fh = outopen.fh; | ||
4490 | @@ -557,7 +565,7 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_args *args, | ||
4491 | goto out_put_forget_req; | ||
4492 | |||
4493 | err = -EIO; | ||
4494 | - if (invalid_nodeid(outarg.nodeid)) | ||
4495 | + if (invalid_nodeid(outarg.nodeid) || fuse_invalid_attr(&outarg.attr)) | ||
4496 | goto out_put_forget_req; | ||
4497 | |||
4498 | if ((outarg.attr.mode ^ mode) & S_IFMT) | ||
4499 | @@ -830,7 +838,8 @@ static int fuse_link(struct dentry *entry, struct inode *newdir, | ||
4500 | |||
4501 | spin_lock(&fc->lock); | ||
4502 | fi->attr_version = ++fc->attr_version; | ||
4503 | - inc_nlink(inode); | ||
4504 | + if (likely(inode->i_nlink < UINT_MAX)) | ||
4505 | + inc_nlink(inode); | ||
4506 | spin_unlock(&fc->lock); | ||
4507 | fuse_invalidate_attr(inode); | ||
4508 | fuse_update_ctime(inode); | ||
4509 | @@ -910,7 +919,8 @@ static int fuse_do_getattr(struct inode *inode, struct kstat *stat, | ||
4510 | args.out.args[0].value = &outarg; | ||
4511 | err = fuse_simple_request(fc, &args); | ||
4512 | if (!err) { | ||
4513 | - if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) { | ||
4514 | + if (fuse_invalid_attr(&outarg.attr) || | ||
4515 | + (inode->i_mode ^ outarg.attr.mode) & S_IFMT) { | ||
4516 | make_bad_inode(inode); | ||
4517 | err = -EIO; | ||
4518 | } else { | ||
4519 | @@ -1218,7 +1228,7 @@ static int fuse_direntplus_link(struct file *file, | ||
4520 | |||
4521 | if (invalid_nodeid(o->nodeid)) | ||
4522 | return -EIO; | ||
4523 | - if (!fuse_valid_type(o->attr.mode)) | ||
4524 | + if (fuse_invalid_attr(&o->attr)) | ||
4525 | return -EIO; | ||
4526 | |||
4527 | fc = get_fuse_conn(dir); | ||
4528 | @@ -1695,7 +1705,8 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, | ||
4529 | goto error; | ||
4530 | } | ||
4531 | |||
4532 | - if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) { | ||
4533 | + if (fuse_invalid_attr(&outarg.attr) || | ||
4534 | + (inode->i_mode ^ outarg.attr.mode) & S_IFMT) { | ||
4535 | make_bad_inode(inode); | ||
4536 | err = -EIO; | ||
4537 | goto error; | ||
4538 | diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h | ||
4539 | index 1c905c7666de..f84dd6d87d90 100644 | ||
4540 | --- a/fs/fuse/fuse_i.h | ||
4541 | +++ b/fs/fuse/fuse_i.h | ||
4542 | @@ -898,6 +898,8 @@ void fuse_ctl_remove_conn(struct fuse_conn *fc); | ||
4543 | */ | ||
4544 | int fuse_valid_type(int m); | ||
4545 | |||
4546 | +bool fuse_invalid_attr(struct fuse_attr *attr); | ||
4547 | + | ||
4548 | /** | ||
4549 | * Is current process allowed to perform filesystem operation? | ||
4550 | */ | ||
4551 | diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c | ||
4552 | index 66eaeb1e8c2c..dc9586feab31 100644 | ||
4553 | --- a/fs/nfsd/nfs4recover.c | ||
4554 | +++ b/fs/nfsd/nfs4recover.c | ||
4555 | @@ -661,7 +661,7 @@ struct cld_net { | ||
4556 | struct cld_upcall { | ||
4557 | struct list_head cu_list; | ||
4558 | struct cld_net *cu_net; | ||
4559 | - struct task_struct *cu_task; | ||
4560 | + struct completion cu_done; | ||
4561 | struct cld_msg cu_msg; | ||
4562 | }; | ||
4563 | |||
4564 | @@ -670,23 +670,18 @@ __cld_pipe_upcall(struct rpc_pipe *pipe, struct cld_msg *cmsg) | ||
4565 | { | ||
4566 | int ret; | ||
4567 | struct rpc_pipe_msg msg; | ||
4568 | + struct cld_upcall *cup = container_of(cmsg, struct cld_upcall, cu_msg); | ||
4569 | |||
4570 | memset(&msg, 0, sizeof(msg)); | ||
4571 | msg.data = cmsg; | ||
4572 | msg.len = sizeof(*cmsg); | ||
4573 | |||
4574 | - /* | ||
4575 | - * Set task state before we queue the upcall. That prevents | ||
4576 | - * wake_up_process in the downcall from racing with schedule. | ||
4577 | - */ | ||
4578 | - set_current_state(TASK_UNINTERRUPTIBLE); | ||
4579 | ret = rpc_queue_upcall(pipe, &msg); | ||
4580 | if (ret < 0) { | ||
4581 | - set_current_state(TASK_RUNNING); | ||
4582 | goto out; | ||
4583 | } | ||
4584 | |||
4585 | - schedule(); | ||
4586 | + wait_for_completion(&cup->cu_done); | ||
4587 | |||
4588 | if (msg.errno < 0) | ||
4589 | ret = msg.errno; | ||
4590 | @@ -753,7 +748,7 @@ cld_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) | ||
4591 | if (copy_from_user(&cup->cu_msg, src, mlen) != 0) | ||
4592 | return -EFAULT; | ||
4593 | |||
4594 | - wake_up_process(cup->cu_task); | ||
4595 | + complete(&cup->cu_done); | ||
4596 | return mlen; | ||
4597 | } | ||
4598 | |||
4599 | @@ -768,7 +763,7 @@ cld_pipe_destroy_msg(struct rpc_pipe_msg *msg) | ||
4600 | if (msg->errno >= 0) | ||
4601 | return; | ||
4602 | |||
4603 | - wake_up_process(cup->cu_task); | ||
4604 | + complete(&cup->cu_done); | ||
4605 | } | ||
4606 | |||
4607 | static const struct rpc_pipe_ops cld_upcall_ops = { | ||
4608 | @@ -899,7 +894,7 @@ restart_search: | ||
4609 | goto restart_search; | ||
4610 | } | ||
4611 | } | ||
4612 | - new->cu_task = current; | ||
4613 | + init_completion(&new->cu_done); | ||
4614 | new->cu_msg.cm_vers = CLD_UPCALL_VERSION; | ||
4615 | put_unaligned(cn->cn_xid++, &new->cu_msg.cm_xid); | ||
4616 | new->cu_net = cn; | ||
4617 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c | ||
4618 | index 8f0b19a3ca81..b8cd100cfcd6 100644 | ||
4619 | --- a/fs/nfsd/vfs.c | ||
4620 | +++ b/fs/nfsd/vfs.c | ||
4621 | @@ -395,10 +395,23 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | ||
4622 | bool get_write_count; | ||
4623 | bool size_change = (iap->ia_valid & ATTR_SIZE); | ||
4624 | |||
4625 | - if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) | ||
4626 | + if (iap->ia_valid & ATTR_SIZE) { | ||
4627 | accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; | ||
4628 | - if (iap->ia_valid & ATTR_SIZE) | ||
4629 | ftype = S_IFREG; | ||
4630 | + } | ||
4631 | + | ||
4632 | + /* | ||
4633 | + * If utimes(2) and friends are called with times not NULL, we should | ||
4634 | + * not set NFSD_MAY_WRITE bit. Otherwise fh_verify->nfsd_permission | ||
4635 | + * will return EACCESS, when the caller's effective UID does not match | ||
4636 | + * the owner of the file, and the caller is not privileged. In this | ||
4637 | + * situation, we should return EPERM(notify_change will return this). | ||
4638 | + */ | ||
4639 | + if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME)) { | ||
4640 | + accmode |= NFSD_MAY_OWNER_OVERRIDE; | ||
4641 | + if (!(iap->ia_valid & (ATTR_ATIME_SET | ATTR_MTIME_SET))) | ||
4642 | + accmode |= NFSD_MAY_WRITE; | ||
4643 | + } | ||
4644 | |||
4645 | /* Callers that do fh_verify should do the fh_want_write: */ | ||
4646 | get_write_count = !fhp->fh_dentry; | ||
4647 | diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c | ||
4648 | index 87e577a49b0d..542fa21aeaa9 100644 | ||
4649 | --- a/fs/ocfs2/quota_global.c | ||
4650 | +++ b/fs/ocfs2/quota_global.c | ||
4651 | @@ -714,7 +714,7 @@ static int ocfs2_release_dquot(struct dquot *dquot) | ||
4652 | |||
4653 | mutex_lock(&dquot->dq_lock); | ||
4654 | /* Check whether we are not racing with some other dqget() */ | ||
4655 | - if (atomic_read(&dquot->dq_count) > 1) | ||
4656 | + if (dquot_is_busy(dquot)) | ||
4657 | goto out; | ||
4658 | /* Running from downconvert thread? Postpone quota processing to wq */ | ||
4659 | if (current == osb->dc_task) { | ||
4660 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c | ||
4661 | index f9246ac4eef8..a7c6611e0056 100644 | ||
4662 | --- a/fs/quota/dquot.c | ||
4663 | +++ b/fs/quota/dquot.c | ||
4664 | @@ -479,7 +479,7 @@ int dquot_release(struct dquot *dquot) | ||
4665 | |||
4666 | mutex_lock(&dquot->dq_lock); | ||
4667 | /* Check whether we are not racing with some other dqget() */ | ||
4668 | - if (atomic_read(&dquot->dq_count) > 1) | ||
4669 | + if (dquot_is_busy(dquot)) | ||
4670 | goto out_dqlock; | ||
4671 | mutex_lock(&dqopt->dqio_mutex); | ||
4672 | if (dqopt->ops[dquot->dq_id.type]->release_dqblk) { | ||
4673 | @@ -611,7 +611,7 @@ EXPORT_SYMBOL(dquot_scan_active); | ||
4674 | /* Write all dquot structures to quota files */ | ||
4675 | int dquot_writeback_dquots(struct super_block *sb, int type) | ||
4676 | { | ||
4677 | - struct list_head *dirty; | ||
4678 | + struct list_head dirty; | ||
4679 | struct dquot *dquot; | ||
4680 | struct quota_info *dqopt = sb_dqopt(sb); | ||
4681 | int cnt; | ||
4682 | @@ -624,9 +624,10 @@ int dquot_writeback_dquots(struct super_block *sb, int type) | ||
4683 | if (!sb_has_quota_active(sb, cnt)) | ||
4684 | continue; | ||
4685 | spin_lock(&dq_list_lock); | ||
4686 | - dirty = &dqopt->info[cnt].dqi_dirty_list; | ||
4687 | - while (!list_empty(dirty)) { | ||
4688 | - dquot = list_first_entry(dirty, struct dquot, | ||
4689 | + /* Move list away to avoid livelock. */ | ||
4690 | + list_replace_init(&dqopt->info[cnt].dqi_dirty_list, &dirty); | ||
4691 | + while (!list_empty(&dirty)) { | ||
4692 | + dquot = list_first_entry(&dirty, struct dquot, | ||
4693 | dq_dirty); | ||
4694 | /* Dirty and inactive can be only bad dquot... */ | ||
4695 | if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) { | ||
4696 | diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c | ||
4697 | index bd4c727f4610..9531b6c18ac7 100644 | ||
4698 | --- a/fs/reiserfs/inode.c | ||
4699 | +++ b/fs/reiserfs/inode.c | ||
4700 | @@ -2102,6 +2102,15 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | ||
4701 | goto out_inserted_sd; | ||
4702 | } | ||
4703 | |||
4704 | + /* | ||
4705 | + * Mark it private if we're creating the privroot | ||
4706 | + * or something under it. | ||
4707 | + */ | ||
4708 | + if (IS_PRIVATE(dir) || dentry == REISERFS_SB(sb)->priv_root) { | ||
4709 | + inode->i_flags |= S_PRIVATE; | ||
4710 | + inode->i_opflags &= ~IOP_XATTR; | ||
4711 | + } | ||
4712 | + | ||
4713 | if (reiserfs_posixacl(inode->i_sb)) { | ||
4714 | reiserfs_write_unlock(inode->i_sb); | ||
4715 | retval = reiserfs_inherit_default_acl(th, dir, dentry, inode); | ||
4716 | @@ -2116,8 +2125,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | ||
4717 | reiserfs_warning(inode->i_sb, "jdm-13090", | ||
4718 | "ACLs aren't enabled in the fs, " | ||
4719 | "but vfs thinks they are!"); | ||
4720 | - } else if (IS_PRIVATE(dir)) | ||
4721 | - inode->i_flags |= S_PRIVATE; | ||
4722 | + } | ||
4723 | |||
4724 | if (security->name) { | ||
4725 | reiserfs_write_unlock(inode->i_sb); | ||
4726 | diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c | ||
4727 | index 1ec728cf82d1..1c900f322089 100644 | ||
4728 | --- a/fs/reiserfs/namei.c | ||
4729 | +++ b/fs/reiserfs/namei.c | ||
4730 | @@ -377,10 +377,13 @@ static struct dentry *reiserfs_lookup(struct inode *dir, struct dentry *dentry, | ||
4731 | |||
4732 | /* | ||
4733 | * Propagate the private flag so we know we're | ||
4734 | - * in the priv tree | ||
4735 | + * in the priv tree. Also clear IOP_XATTR | ||
4736 | + * since we don't have xattrs on xattr files. | ||
4737 | */ | ||
4738 | - if (IS_PRIVATE(dir)) | ||
4739 | + if (IS_PRIVATE(dir)) { | ||
4740 | inode->i_flags |= S_PRIVATE; | ||
4741 | + inode->i_opflags &= ~IOP_XATTR; | ||
4742 | + } | ||
4743 | } | ||
4744 | reiserfs_write_unlock(dir->i_sb); | ||
4745 | if (retval == IO_ERROR) { | ||
4746 | diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h | ||
4747 | index d920a646b578..3e78a394fdb8 100644 | ||
4748 | --- a/fs/reiserfs/reiserfs.h | ||
4749 | +++ b/fs/reiserfs/reiserfs.h | ||
4750 | @@ -1167,6 +1167,8 @@ static inline int bmap_would_wrap(unsigned bmap_nr) | ||
4751 | return bmap_nr > ((1LL << 16) - 1); | ||
4752 | } | ||
4753 | |||
4754 | +extern const struct xattr_handler *reiserfs_xattr_handlers[]; | ||
4755 | + | ||
4756 | /* | ||
4757 | * this says about version of key of all items (but stat data) the | ||
4758 | * object consists of | ||
4759 | diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c | ||
4760 | index dec6c93044fa..cd2d555b3a6d 100644 | ||
4761 | --- a/fs/reiserfs/super.c | ||
4762 | +++ b/fs/reiserfs/super.c | ||
4763 | @@ -2026,6 +2026,8 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) | ||
4764 | if (replay_only(s)) | ||
4765 | goto error_unlocked; | ||
4766 | |||
4767 | + s->s_xattr = reiserfs_xattr_handlers; | ||
4768 | + | ||
4769 | if (bdev_read_only(s->s_bdev) && !(s->s_flags & MS_RDONLY)) { | ||
4770 | SWARN(silent, s, "clm-7000", | ||
4771 | "Detected readonly device, marking FS readonly"); | ||
4772 | diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c | ||
4773 | index 9e313fc7fdc7..dbc2ada9884f 100644 | ||
4774 | --- a/fs/reiserfs/xattr.c | ||
4775 | +++ b/fs/reiserfs/xattr.c | ||
4776 | @@ -121,13 +121,13 @@ static struct dentry *open_xa_root(struct super_block *sb, int flags) | ||
4777 | struct dentry *xaroot; | ||
4778 | |||
4779 | if (d_really_is_negative(privroot)) | ||
4780 | - return ERR_PTR(-ENODATA); | ||
4781 | + return ERR_PTR(-EOPNOTSUPP); | ||
4782 | |||
4783 | inode_lock_nested(d_inode(privroot), I_MUTEX_XATTR); | ||
4784 | |||
4785 | xaroot = dget(REISERFS_SB(sb)->xattr_root); | ||
4786 | if (!xaroot) | ||
4787 | - xaroot = ERR_PTR(-ENODATA); | ||
4788 | + xaroot = ERR_PTR(-EOPNOTSUPP); | ||
4789 | else if (d_really_is_negative(xaroot)) { | ||
4790 | int err = -ENODATA; | ||
4791 | |||
4792 | @@ -609,6 +609,10 @@ int reiserfs_xattr_set(struct inode *inode, const char *name, | ||
4793 | int error, error2; | ||
4794 | size_t jbegin_count = reiserfs_xattr_nblocks(inode, buffer_size); | ||
4795 | |||
4796 | + /* Check before we start a transaction and then do nothing. */ | ||
4797 | + if (!d_really_is_positive(REISERFS_SB(inode->i_sb)->priv_root)) | ||
4798 | + return -EOPNOTSUPP; | ||
4799 | + | ||
4800 | if (!(flags & XATTR_REPLACE)) | ||
4801 | jbegin_count += reiserfs_xattr_jcreate_nblocks(inode); | ||
4802 | |||
4803 | @@ -831,8 +835,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) | ||
4804 | if (d_really_is_negative(dentry)) | ||
4805 | return -EINVAL; | ||
4806 | |||
4807 | - if (!dentry->d_sb->s_xattr || | ||
4808 | - get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) | ||
4809 | + if (get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) | ||
4810 | return -EOPNOTSUPP; | ||
4811 | |||
4812 | dir = open_xa_dir(d_inode(dentry), XATTR_REPLACE); | ||
4813 | @@ -872,6 +875,7 @@ static int create_privroot(struct dentry *dentry) | ||
4814 | } | ||
4815 | |||
4816 | d_inode(dentry)->i_flags |= S_PRIVATE; | ||
4817 | + d_inode(dentry)->i_opflags &= ~IOP_XATTR; | ||
4818 | reiserfs_info(dentry->d_sb, "Created %s - reserved for xattr " | ||
4819 | "storage.\n", PRIVROOT_NAME); | ||
4820 | |||
4821 | @@ -885,7 +889,7 @@ static int create_privroot(struct dentry *dentry) { return 0; } | ||
4822 | #endif | ||
4823 | |||
4824 | /* Actual operations that are exported to VFS-land */ | ||
4825 | -static const struct xattr_handler *reiserfs_xattr_handlers[] = { | ||
4826 | +const struct xattr_handler *reiserfs_xattr_handlers[] = { | ||
4827 | #ifdef CONFIG_REISERFS_FS_XATTR | ||
4828 | &reiserfs_xattr_user_handler, | ||
4829 | &reiserfs_xattr_trusted_handler, | ||
4830 | @@ -956,8 +960,10 @@ int reiserfs_lookup_privroot(struct super_block *s) | ||
4831 | if (!IS_ERR(dentry)) { | ||
4832 | REISERFS_SB(s)->priv_root = dentry; | ||
4833 | d_set_d_op(dentry, &xattr_lookup_poison_ops); | ||
4834 | - if (d_really_is_positive(dentry)) | ||
4835 | + if (d_really_is_positive(dentry)) { | ||
4836 | d_inode(dentry)->i_flags |= S_PRIVATE; | ||
4837 | + d_inode(dentry)->i_opflags &= ~IOP_XATTR; | ||
4838 | + } | ||
4839 | } else | ||
4840 | err = PTR_ERR(dentry); | ||
4841 | inode_unlock(d_inode(s->s_root)); | ||
4842 | @@ -986,7 +992,6 @@ int reiserfs_xattr_init(struct super_block *s, int mount_flags) | ||
4843 | } | ||
4844 | |||
4845 | if (d_really_is_positive(privroot)) { | ||
4846 | - s->s_xattr = reiserfs_xattr_handlers; | ||
4847 | inode_lock(d_inode(privroot)); | ||
4848 | if (!REISERFS_SB(s)->xattr_root) { | ||
4849 | struct dentry *dentry; | ||
4850 | diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c | ||
4851 | index d92a1dc6ee70..1f1fdfd3bc5c 100644 | ||
4852 | --- a/fs/reiserfs/xattr_acl.c | ||
4853 | +++ b/fs/reiserfs/xattr_acl.c | ||
4854 | @@ -316,10 +316,8 @@ reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, | ||
4855 | * would be useless since permissions are ignored, and a pain because | ||
4856 | * it introduces locking cycles | ||
4857 | */ | ||
4858 | - if (IS_PRIVATE(dir)) { | ||
4859 | - inode->i_flags |= S_PRIVATE; | ||
4860 | + if (IS_PRIVATE(inode)) | ||
4861 | goto apply_umask; | ||
4862 | - } | ||
4863 | |||
4864 | err = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl); | ||
4865 | if (err) | ||
4866 | diff --git a/include/linux/acpi.h b/include/linux/acpi.h | ||
4867 | index 719eb97217a3..5670bb9788bb 100644 | ||
4868 | --- a/include/linux/acpi.h | ||
4869 | +++ b/include/linux/acpi.h | ||
4870 | @@ -77,7 +77,7 @@ static inline bool has_acpi_companion(struct device *dev) | ||
4871 | static inline void acpi_preset_companion(struct device *dev, | ||
4872 | struct acpi_device *parent, u64 addr) | ||
4873 | { | ||
4874 | - ACPI_COMPANION_SET(dev, acpi_find_child_device(parent, addr, NULL)); | ||
4875 | + ACPI_COMPANION_SET(dev, acpi_find_child_device(parent, addr, false)); | ||
4876 | } | ||
4877 | |||
4878 | static inline const char *acpi_dev_name(struct acpi_device *adev) | ||
4879 | diff --git a/include/linux/atalk.h b/include/linux/atalk.h | ||
4880 | index af43ed404ff4..4be0e14b38fc 100644 | ||
4881 | --- a/include/linux/atalk.h | ||
4882 | +++ b/include/linux/atalk.h | ||
4883 | @@ -107,7 +107,7 @@ static __inline__ struct elapaarp *aarp_hdr(struct sk_buff *skb) | ||
4884 | #define AARP_RESOLVE_TIME (10 * HZ) | ||
4885 | |||
4886 | extern struct datalink_proto *ddp_dl, *aarp_dl; | ||
4887 | -extern void aarp_proto_init(void); | ||
4888 | +extern int aarp_proto_init(void); | ||
4889 | |||
4890 | /* Inter module exports */ | ||
4891 | |||
4892 | diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h | ||
4893 | index 704caae69c42..97f817f4eb78 100644 | ||
4894 | --- a/include/linux/dma-mapping.h | ||
4895 | +++ b/include/linux/dma-mapping.h | ||
4896 | @@ -618,8 +618,7 @@ static inline unsigned int dma_get_max_seg_size(struct device *dev) | ||
4897 | return SZ_64K; | ||
4898 | } | ||
4899 | |||
4900 | -static inline unsigned int dma_set_max_seg_size(struct device *dev, | ||
4901 | - unsigned int size) | ||
4902 | +static inline int dma_set_max_seg_size(struct device *dev, unsigned int size) | ||
4903 | { | ||
4904 | if (dev->dma_parms) { | ||
4905 | dev->dma_parms->max_segment_size = size; | ||
4906 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h | ||
4907 | index d073470cb342..344eb873f6f5 100644 | ||
4908 | --- a/include/linux/jbd2.h | ||
4909 | +++ b/include/linux/jbd2.h | ||
4910 | @@ -1560,7 +1560,7 @@ static inline int jbd2_space_needed(journal_t *journal) | ||
4911 | static inline unsigned long jbd2_log_space_left(journal_t *journal) | ||
4912 | { | ||
4913 | /* Allow for rounding errors */ | ||
4914 | - unsigned long free = journal->j_free - 32; | ||
4915 | + long free = journal->j_free - 32; | ||
4916 | |||
4917 | if (journal->j_committing_transaction) { | ||
4918 | unsigned long committing = atomic_read(&journal-> | ||
4919 | @@ -1569,7 +1569,7 @@ static inline unsigned long jbd2_log_space_left(journal_t *journal) | ||
4920 | /* Transaction + control blocks */ | ||
4921 | free -= committing + (committing >> JBD2_CONTROL_BLOCKS_SHIFT); | ||
4922 | } | ||
4923 | - return free; | ||
4924 | + return max_t(long, free, 0); | ||
4925 | } | ||
4926 | |||
4927 | /* | ||
4928 | diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h | ||
4929 | index 13f8052b9ff9..13ddba5e531d 100644 | ||
4930 | --- a/include/linux/mtd/mtd.h | ||
4931 | +++ b/include/linux/mtd/mtd.h | ||
4932 | @@ -392,7 +392,7 @@ static inline struct device_node *mtd_get_of_node(struct mtd_info *mtd) | ||
4933 | return mtd->dev.of_node; | ||
4934 | } | ||
4935 | |||
4936 | -static inline int mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops) | ||
4937 | +static inline u32 mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops) | ||
4938 | { | ||
4939 | return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize; | ||
4940 | } | ||
4941 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h | ||
4942 | index 29ed5977ac04..81c85ba6e2b8 100644 | ||
4943 | --- a/include/linux/netdevice.h | ||
4944 | +++ b/include/linux/netdevice.h | ||
4945 | @@ -1730,6 +1730,11 @@ struct net_device { | ||
4946 | unsigned char if_port; | ||
4947 | unsigned char dma; | ||
4948 | |||
4949 | + /* Note : dev->mtu is often read without holding a lock. | ||
4950 | + * Writers usually hold RTNL. | ||
4951 | + * It is recommended to use READ_ONCE() to annotate the reads, | ||
4952 | + * and to use WRITE_ONCE() to annotate the writes. | ||
4953 | + */ | ||
4954 | unsigned int mtu; | ||
4955 | unsigned short type; | ||
4956 | unsigned short hard_header_len; | ||
4957 | diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h | ||
4958 | index 87733344768c..0a60fe354bc5 100644 | ||
4959 | --- a/include/linux/quotaops.h | ||
4960 | +++ b/include/linux/quotaops.h | ||
4961 | @@ -54,6 +54,16 @@ static inline struct dquot *dqgrab(struct dquot *dquot) | ||
4962 | atomic_inc(&dquot->dq_count); | ||
4963 | return dquot; | ||
4964 | } | ||
4965 | + | ||
4966 | +static inline bool dquot_is_busy(struct dquot *dquot) | ||
4967 | +{ | ||
4968 | + if (test_bit(DQ_MOD_B, &dquot->dq_flags)) | ||
4969 | + return true; | ||
4970 | + if (atomic_read(&dquot->dq_count) > 1) | ||
4971 | + return true; | ||
4972 | + return false; | ||
4973 | +} | ||
4974 | + | ||
4975 | void dqput(struct dquot *dquot); | ||
4976 | int dquot_scan_active(struct super_block *sb, | ||
4977 | int (*fn)(struct dquot *dquot, unsigned long priv), | ||
4978 | diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h | ||
4979 | index 692108222271..bab9236e4367 100644 | ||
4980 | --- a/include/linux/regulator/consumer.h | ||
4981 | +++ b/include/linux/regulator/consumer.h | ||
4982 | @@ -479,7 +479,7 @@ static inline unsigned int regulator_get_mode(struct regulator *regulator) | ||
4983 | |||
4984 | static inline int regulator_set_load(struct regulator *regulator, int load_uA) | ||
4985 | { | ||
4986 | - return REGULATOR_MODE_NORMAL; | ||
4987 | + return 0; | ||
4988 | } | ||
4989 | |||
4990 | static inline int regulator_allow_bypass(struct regulator *regulator, | ||
4991 | diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h | ||
4992 | index eb4f6456521e..cd95b5e395a3 100644 | ||
4993 | --- a/include/linux/serial_core.h | ||
4994 | +++ b/include/linux/serial_core.h | ||
4995 | @@ -161,6 +161,7 @@ struct uart_port { | ||
4996 | struct console *cons; /* struct console, if any */ | ||
4997 | #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ) | ||
4998 | unsigned long sysrq; /* sysrq timeout */ | ||
4999 | + unsigned int sysrq_ch; /* char for sysrq */ | ||
5000 | #endif | ||
5001 | |||
5002 | /* flags must be updated while holding port mutex */ | ||
5003 | @@ -470,8 +471,42 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) | ||
5004 | } | ||
5005 | return 0; | ||
5006 | } | ||
5007 | +static inline int | ||
5008 | +uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch) | ||
5009 | +{ | ||
5010 | + if (port->sysrq) { | ||
5011 | + if (ch && time_before(jiffies, port->sysrq)) { | ||
5012 | + port->sysrq_ch = ch; | ||
5013 | + port->sysrq = 0; | ||
5014 | + return 1; | ||
5015 | + } | ||
5016 | + port->sysrq = 0; | ||
5017 | + } | ||
5018 | + return 0; | ||
5019 | +} | ||
5020 | +static inline void | ||
5021 | +uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags) | ||
5022 | +{ | ||
5023 | + int sysrq_ch; | ||
5024 | + | ||
5025 | + sysrq_ch = port->sysrq_ch; | ||
5026 | + port->sysrq_ch = 0; | ||
5027 | + | ||
5028 | + spin_unlock_irqrestore(&port->lock, irqflags); | ||
5029 | + | ||
5030 | + if (sysrq_ch) | ||
5031 | + handle_sysrq(sysrq_ch); | ||
5032 | +} | ||
5033 | #else | ||
5034 | -#define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; }) | ||
5035 | +static inline int | ||
5036 | +uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) { return 0; } | ||
5037 | +static inline int | ||
5038 | +uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch) { return 0; } | ||
5039 | +static inline void | ||
5040 | +uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags) | ||
5041 | +{ | ||
5042 | + spin_unlock_irqrestore(&port->lock, irqflags); | ||
5043 | +} | ||
5044 | #endif | ||
5045 | |||
5046 | /* | ||
5047 | diff --git a/include/linux/time.h b/include/linux/time.h | ||
5048 | index 4cea09d94208..60fd50559241 100644 | ||
5049 | --- a/include/linux/time.h | ||
5050 | +++ b/include/linux/time.h | ||
5051 | @@ -275,4 +275,16 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) | ||
5052 | a->tv_nsec = ns; | ||
5053 | } | ||
5054 | |||
5055 | +/** | ||
5056 | + * time_between32 - check if a 32-bit timestamp is within a given time range | ||
5057 | + * @t: the time which may be within [l,h] | ||
5058 | + * @l: the lower bound of the range | ||
5059 | + * @h: the higher bound of the range | ||
5060 | + * | ||
5061 | + * time_before32(t, l, h) returns true if @l <= @t <= @h. All operands are | ||
5062 | + * treated as 32-bit integers. | ||
5063 | + * | ||
5064 | + * Equivalent to !(time_before32(@t, @l) || time_after32(@t, @h)). | ||
5065 | + */ | ||
5066 | +#define time_between32(t, l, h) ((u32)(h) - (u32)(l) >= (u32)(t) - (u32)(l)) | ||
5067 | #endif | ||
5068 | diff --git a/include/linux/tty.h b/include/linux/tty.h | ||
5069 | index fe1b8623a3a1..fe483976b119 100644 | ||
5070 | --- a/include/linux/tty.h | ||
5071 | +++ b/include/linux/tty.h | ||
5072 | @@ -356,6 +356,7 @@ struct tty_file_private { | ||
5073 | #define TTY_NO_WRITE_SPLIT 17 /* Preserve write boundaries to driver */ | ||
5074 | #define TTY_HUPPED 18 /* Post driver->hangup() */ | ||
5075 | #define TTY_HUPPING 19 /* Hangup in progress */ | ||
5076 | +#define TTY_LDISC_CHANGING 20 /* Change pending - non-block IO */ | ||
5077 | #define TTY_LDISC_HALTED 22 /* Line discipline is halted */ | ||
5078 | |||
5079 | /* Values for tty->flow_change */ | ||
5080 | @@ -373,6 +374,12 @@ static inline void tty_set_flow_change(struct tty_struct *tty, int val) | ||
5081 | smp_mb(); | ||
5082 | } | ||
5083 | |||
5084 | +static inline bool tty_io_nonblock(struct tty_struct *tty, struct file *file) | ||
5085 | +{ | ||
5086 | + return file->f_flags & O_NONBLOCK || | ||
5087 | + test_bit(TTY_LDISC_CHANGING, &tty->flags); | ||
5088 | +} | ||
5089 | + | ||
5090 | static inline bool tty_io_error(struct tty_struct *tty) | ||
5091 | { | ||
5092 | return test_bit(TTY_IO_ERROR, &tty->flags); | ||
5093 | diff --git a/include/math-emu/soft-fp.h b/include/math-emu/soft-fp.h | ||
5094 | index 3f284bc03180..5650c1628383 100644 | ||
5095 | --- a/include/math-emu/soft-fp.h | ||
5096 | +++ b/include/math-emu/soft-fp.h | ||
5097 | @@ -138,7 +138,7 @@ do { \ | ||
5098 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \ | ||
5099 | } while (0) | ||
5100 | |||
5101 | -#define _FP_ROUND_ZERO(wc, X) 0 | ||
5102 | +#define _FP_ROUND_ZERO(wc, X) (void)0 | ||
5103 | |||
5104 | #define _FP_ROUND_PINF(wc, X) \ | ||
5105 | do { \ | ||
5106 | diff --git a/include/net/ip.h b/include/net/ip.h | ||
5107 | index a3c1b9dfc9a1..d577fb5647c5 100644 | ||
5108 | --- a/include/net/ip.h | ||
5109 | +++ b/include/net/ip.h | ||
5110 | @@ -620,4 +620,9 @@ extern int sysctl_icmp_msgs_burst; | ||
5111 | int ip_misc_proc_init(void); | ||
5112 | #endif | ||
5113 | |||
5114 | +static inline bool inetdev_valid_mtu(unsigned int mtu) | ||
5115 | +{ | ||
5116 | + return likely(mtu >= IPV4_MIN_MTU); | ||
5117 | +} | ||
5118 | + | ||
5119 | #endif /* _IP_H */ | ||
5120 | diff --git a/include/net/tcp.h b/include/net/tcp.h | ||
5121 | index 23814d997e86..0e3a88f808c6 100644 | ||
5122 | --- a/include/net/tcp.h | ||
5123 | +++ b/include/net/tcp.h | ||
5124 | @@ -494,19 +494,27 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb); | ||
5125 | */ | ||
5126 | static inline void tcp_synq_overflow(const struct sock *sk) | ||
5127 | { | ||
5128 | - unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp; | ||
5129 | + unsigned long last_overflow = READ_ONCE(tcp_sk(sk)->rx_opt.ts_recent_stamp); | ||
5130 | unsigned long now = jiffies; | ||
5131 | |||
5132 | - if (time_after(now, last_overflow + HZ)) | ||
5133 | - tcp_sk(sk)->rx_opt.ts_recent_stamp = now; | ||
5134 | + if (!time_between32(now, last_overflow, last_overflow + HZ)) | ||
5135 | + WRITE_ONCE(tcp_sk(sk)->rx_opt.ts_recent_stamp, now); | ||
5136 | } | ||
5137 | |||
5138 | /* syncookies: no recent synqueue overflow on this listening socket? */ | ||
5139 | static inline bool tcp_synq_no_recent_overflow(const struct sock *sk) | ||
5140 | { | ||
5141 | - unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp; | ||
5142 | + unsigned long last_overflow = READ_ONCE(tcp_sk(sk)->rx_opt.ts_recent_stamp); | ||
5143 | |||
5144 | - return time_after(jiffies, last_overflow + TCP_SYNCOOKIE_VALID); | ||
5145 | + /* If last_overflow <= jiffies <= last_overflow + TCP_SYNCOOKIE_VALID, | ||
5146 | + * then we're under synflood. However, we have to use | ||
5147 | + * 'last_overflow - HZ' as lower bound. That's because a concurrent | ||
5148 | + * tcp_synq_overflow() could update .ts_recent_stamp after we read | ||
5149 | + * jiffies but before we store .ts_recent_stamp into last_overflow, | ||
5150 | + * which could lead to rejecting a valid syncookie. | ||
5151 | + */ | ||
5152 | + return !time_between32(jiffies, last_overflow - HZ, | ||
5153 | + last_overflow + TCP_SYNCOOKIE_VALID); | ||
5154 | } | ||
5155 | |||
5156 | static inline u32 tcp_cookie_time(void) | ||
5157 | diff --git a/kernel/audit_watch.c b/kernel/audit_watch.c | ||
5158 | index f036b6ada6ef..712469a3103a 100644 | ||
5159 | --- a/kernel/audit_watch.c | ||
5160 | +++ b/kernel/audit_watch.c | ||
5161 | @@ -365,12 +365,12 @@ static int audit_get_nd(struct audit_watch *watch, struct path *parent) | ||
5162 | struct dentry *d = kern_path_locked(watch->path, parent); | ||
5163 | if (IS_ERR(d)) | ||
5164 | return PTR_ERR(d); | ||
5165 | - inode_unlock(d_backing_inode(parent->dentry)); | ||
5166 | if (d_is_positive(d)) { | ||
5167 | /* update watch filter fields */ | ||
5168 | watch->dev = d->d_sb->s_dev; | ||
5169 | watch->ino = d_backing_inode(d)->i_ino; | ||
5170 | } | ||
5171 | + inode_unlock(d_backing_inode(parent->dentry)); | ||
5172 | dput(d); | ||
5173 | return 0; | ||
5174 | } | ||
5175 | diff --git a/kernel/cgroup_pids.c b/kernel/cgroup_pids.c | ||
5176 | index a57242e0d5a6..b8b898e21c19 100644 | ||
5177 | --- a/kernel/cgroup_pids.c | ||
5178 | +++ b/kernel/cgroup_pids.c | ||
5179 | @@ -48,7 +48,7 @@ struct pids_cgroup { | ||
5180 | * %PIDS_MAX = (%PID_MAX_LIMIT + 1). | ||
5181 | */ | ||
5182 | atomic64_t counter; | ||
5183 | - int64_t limit; | ||
5184 | + atomic64_t limit; | ||
5185 | |||
5186 | /* Handle for "pids.events" */ | ||
5187 | struct cgroup_file events_file; | ||
5188 | @@ -76,8 +76,8 @@ pids_css_alloc(struct cgroup_subsys_state *parent) | ||
5189 | if (!pids) | ||
5190 | return ERR_PTR(-ENOMEM); | ||
5191 | |||
5192 | - pids->limit = PIDS_MAX; | ||
5193 | atomic64_set(&pids->counter, 0); | ||
5194 | + atomic64_set(&pids->limit, PIDS_MAX); | ||
5195 | atomic64_set(&pids->events_limit, 0); | ||
5196 | return &pids->css; | ||
5197 | } | ||
5198 | @@ -149,13 +149,14 @@ static int pids_try_charge(struct pids_cgroup *pids, int num) | ||
5199 | |||
5200 | for (p = pids; parent_pids(p); p = parent_pids(p)) { | ||
5201 | int64_t new = atomic64_add_return(num, &p->counter); | ||
5202 | + int64_t limit = atomic64_read(&p->limit); | ||
5203 | |||
5204 | /* | ||
5205 | * Since new is capped to the maximum number of pid_t, if | ||
5206 | * p->limit is %PIDS_MAX then we know that this test will never | ||
5207 | * fail. | ||
5208 | */ | ||
5209 | - if (new > p->limit) | ||
5210 | + if (new > limit) | ||
5211 | goto revert; | ||
5212 | } | ||
5213 | |||
5214 | @@ -280,7 +281,7 @@ set_limit: | ||
5215 | * Limit updates don't need to be mutex'd, since it isn't | ||
5216 | * critical that any racing fork()s follow the new limit. | ||
5217 | */ | ||
5218 | - pids->limit = limit; | ||
5219 | + atomic64_set(&pids->limit, limit); | ||
5220 | return nbytes; | ||
5221 | } | ||
5222 | |||
5223 | @@ -288,7 +289,7 @@ static int pids_max_show(struct seq_file *sf, void *v) | ||
5224 | { | ||
5225 | struct cgroup_subsys_state *css = seq_css(sf); | ||
5226 | struct pids_cgroup *pids = css_pids(css); | ||
5227 | - int64_t limit = pids->limit; | ||
5228 | + int64_t limit = atomic64_read(&pids->limit); | ||
5229 | |||
5230 | if (limit >= PIDS_MAX) | ||
5231 | seq_printf(sf, "%s\n", PIDS_MAX_STR); | ||
5232 | diff --git a/kernel/module.c b/kernel/module.c | ||
5233 | index fb9e07aec49e..9cb1437151ae 100644 | ||
5234 | --- a/kernel/module.c | ||
5235 | +++ b/kernel/module.c | ||
5236 | @@ -995,6 +995,8 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user, | ||
5237 | strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); | ||
5238 | |||
5239 | free_module(mod); | ||
5240 | + /* someone could wait for the module in add_unformed_module() */ | ||
5241 | + wake_up_all(&module_wq); | ||
5242 | return 0; | ||
5243 | out: | ||
5244 | mutex_unlock(&module_mutex); | ||
5245 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c | ||
5246 | index b765a58cf20f..5e65c7eea872 100644 | ||
5247 | --- a/kernel/sched/fair.c | ||
5248 | +++ b/kernel/sched/fair.c | ||
5249 | @@ -4391,20 +4391,28 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) | ||
5250 | if (++count > 3) { | ||
5251 | u64 new, old = ktime_to_ns(cfs_b->period); | ||
5252 | |||
5253 | - new = (old * 147) / 128; /* ~115% */ | ||
5254 | - new = min(new, max_cfs_quota_period); | ||
5255 | - | ||
5256 | - cfs_b->period = ns_to_ktime(new); | ||
5257 | - | ||
5258 | - /* since max is 1s, this is limited to 1e9^2, which fits in u64 */ | ||
5259 | - cfs_b->quota *= new; | ||
5260 | - cfs_b->quota = div64_u64(cfs_b->quota, old); | ||
5261 | - | ||
5262 | - pr_warn_ratelimited( | ||
5263 | - "cfs_period_timer[cpu%d]: period too short, scaling up (new cfs_period_us %lld, cfs_quota_us = %lld)\n", | ||
5264 | - smp_processor_id(), | ||
5265 | - div_u64(new, NSEC_PER_USEC), | ||
5266 | - div_u64(cfs_b->quota, NSEC_PER_USEC)); | ||
5267 | + /* | ||
5268 | + * Grow period by a factor of 2 to avoid losing precision. | ||
5269 | + * Precision loss in the quota/period ratio can cause __cfs_schedulable | ||
5270 | + * to fail. | ||
5271 | + */ | ||
5272 | + new = old * 2; | ||
5273 | + if (new < max_cfs_quota_period) { | ||
5274 | + cfs_b->period = ns_to_ktime(new); | ||
5275 | + cfs_b->quota *= 2; | ||
5276 | + | ||
5277 | + pr_warn_ratelimited( | ||
5278 | + "cfs_period_timer[cpu%d]: period too short, scaling up (new cfs_period_us = %lld, cfs_quota_us = %lld)\n", | ||
5279 | + smp_processor_id(), | ||
5280 | + div_u64(new, NSEC_PER_USEC), | ||
5281 | + div_u64(cfs_b->quota, NSEC_PER_USEC)); | ||
5282 | + } else { | ||
5283 | + pr_warn_ratelimited( | ||
5284 | + "cfs_period_timer[cpu%d]: period too short, but cannot scale up without losing precision (cfs_period_us = %lld, cfs_quota_us = %lld)\n", | ||
5285 | + smp_processor_id(), | ||
5286 | + div_u64(old, NSEC_PER_USEC), | ||
5287 | + div_u64(cfs_b->quota, NSEC_PER_USEC)); | ||
5288 | + } | ||
5289 | |||
5290 | /* reset count so we don't come right back in here */ | ||
5291 | count = 0; | ||
5292 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c | ||
5293 | index 1961dd408bc5..7d970b565c4d 100644 | ||
5294 | --- a/kernel/workqueue.c | ||
5295 | +++ b/kernel/workqueue.c | ||
5296 | @@ -2344,8 +2344,14 @@ repeat: | ||
5297 | */ | ||
5298 | if (need_to_create_worker(pool)) { | ||
5299 | spin_lock(&wq_mayday_lock); | ||
5300 | - get_pwq(pwq); | ||
5301 | - list_move_tail(&pwq->mayday_node, &wq->maydays); | ||
5302 | + /* | ||
5303 | + * Queue iff we aren't racing destruction | ||
5304 | + * and somebody else hasn't queued it already. | ||
5305 | + */ | ||
5306 | + if (wq->rescuer && list_empty(&pwq->mayday_node)) { | ||
5307 | + get_pwq(pwq); | ||
5308 | + list_add_tail(&pwq->mayday_node, &wq->maydays); | ||
5309 | + } | ||
5310 | spin_unlock(&wq_mayday_lock); | ||
5311 | } | ||
5312 | } | ||
5313 | @@ -4031,9 +4037,29 @@ void destroy_workqueue(struct workqueue_struct *wq) | ||
5314 | struct pool_workqueue *pwq; | ||
5315 | int node; | ||
5316 | |||
5317 | + /* | ||
5318 | + * Remove it from sysfs first so that sanity check failure doesn't | ||
5319 | + * lead to sysfs name conflicts. | ||
5320 | + */ | ||
5321 | + workqueue_sysfs_unregister(wq); | ||
5322 | + | ||
5323 | /* drain it before proceeding with destruction */ | ||
5324 | drain_workqueue(wq); | ||
5325 | |||
5326 | + /* kill rescuer, if sanity checks fail, leave it w/o rescuer */ | ||
5327 | + if (wq->rescuer) { | ||
5328 | + struct worker *rescuer = wq->rescuer; | ||
5329 | + | ||
5330 | + /* this prevents new queueing */ | ||
5331 | + spin_lock_irq(&wq_mayday_lock); | ||
5332 | + wq->rescuer = NULL; | ||
5333 | + spin_unlock_irq(&wq_mayday_lock); | ||
5334 | + | ||
5335 | + /* rescuer will empty maydays list before exiting */ | ||
5336 | + kthread_stop(rescuer->task); | ||
5337 | + kfree(rescuer); | ||
5338 | + } | ||
5339 | + | ||
5340 | /* sanity checks */ | ||
5341 | mutex_lock(&wq->mutex); | ||
5342 | for_each_pwq(pwq, wq) { | ||
5343 | @@ -4063,11 +4089,6 @@ void destroy_workqueue(struct workqueue_struct *wq) | ||
5344 | list_del_rcu(&wq->list); | ||
5345 | mutex_unlock(&wq_pool_mutex); | ||
5346 | |||
5347 | - workqueue_sysfs_unregister(wq); | ||
5348 | - | ||
5349 | - if (wq->rescuer) | ||
5350 | - kthread_stop(wq->rescuer->task); | ||
5351 | - | ||
5352 | if (!(wq->flags & WQ_UNBOUND)) { | ||
5353 | /* | ||
5354 | * The base ref is never dropped on per-cpu pwqs. Directly | ||
5355 | @@ -4344,7 +4365,8 @@ static void show_pwq(struct pool_workqueue *pwq) | ||
5356 | pr_info(" pwq %d:", pool->id); | ||
5357 | pr_cont_pool_info(pool); | ||
5358 | |||
5359 | - pr_cont(" active=%d/%d%s\n", pwq->nr_active, pwq->max_active, | ||
5360 | + pr_cont(" active=%d/%d refcnt=%d%s\n", | ||
5361 | + pwq->nr_active, pwq->max_active, pwq->refcnt, | ||
5362 | !list_empty(&pwq->mayday_node) ? " MAYDAY" : ""); | ||
5363 | |||
5364 | hash_for_each(pool->busy_hash, bkt, worker, hentry) { | ||
5365 | diff --git a/lib/raid6/unroll.awk b/lib/raid6/unroll.awk | ||
5366 | index c6aa03631df8..0809805a7e23 100644 | ||
5367 | --- a/lib/raid6/unroll.awk | ||
5368 | +++ b/lib/raid6/unroll.awk | ||
5369 | @@ -13,7 +13,7 @@ BEGIN { | ||
5370 | for (i = 0; i < rep; ++i) { | ||
5371 | tmp = $0 | ||
5372 | gsub(/\$\$/, i, tmp) | ||
5373 | - gsub(/\$\#/, n, tmp) | ||
5374 | + gsub(/\$#/, n, tmp) | ||
5375 | gsub(/\$\*/, "$", tmp) | ||
5376 | print tmp | ||
5377 | } | ||
5378 | diff --git a/mm/shmem.c b/mm/shmem.c | ||
5379 | index 6266a7d1ba00..90ccbb35458b 100644 | ||
5380 | --- a/mm/shmem.c | ||
5381 | +++ b/mm/shmem.c | ||
5382 | @@ -2695,7 +2695,7 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset, | ||
5383 | } | ||
5384 | |||
5385 | shmem_falloc.waitq = &shmem_falloc_waitq; | ||
5386 | - shmem_falloc.start = unmap_start >> PAGE_SHIFT; | ||
5387 | + shmem_falloc.start = (u64)unmap_start >> PAGE_SHIFT; | ||
5388 | shmem_falloc.next = (unmap_end + 1) >> PAGE_SHIFT; | ||
5389 | spin_lock(&inode->i_lock); | ||
5390 | inode->i_private = &shmem_falloc; | ||
5391 | diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c | ||
5392 | index 8ad3ec2610b6..b9e85a4751a6 100644 | ||
5393 | --- a/net/appletalk/aarp.c | ||
5394 | +++ b/net/appletalk/aarp.c | ||
5395 | @@ -879,15 +879,24 @@ static struct notifier_block aarp_notifier = { | ||
5396 | |||
5397 | static unsigned char aarp_snap_id[] = { 0x00, 0x00, 0x00, 0x80, 0xF3 }; | ||
5398 | |||
5399 | -void __init aarp_proto_init(void) | ||
5400 | +int __init aarp_proto_init(void) | ||
5401 | { | ||
5402 | + int rc; | ||
5403 | + | ||
5404 | aarp_dl = register_snap_client(aarp_snap_id, aarp_rcv); | ||
5405 | - if (!aarp_dl) | ||
5406 | + if (!aarp_dl) { | ||
5407 | printk(KERN_CRIT "Unable to register AARP with SNAP.\n"); | ||
5408 | + return -ENOMEM; | ||
5409 | + } | ||
5410 | setup_timer(&aarp_timer, aarp_expire_timeout, 0); | ||
5411 | aarp_timer.expires = jiffies + sysctl_aarp_expiry_time; | ||
5412 | add_timer(&aarp_timer); | ||
5413 | - register_netdevice_notifier(&aarp_notifier); | ||
5414 | + rc = register_netdevice_notifier(&aarp_notifier); | ||
5415 | + if (rc) { | ||
5416 | + del_timer_sync(&aarp_timer); | ||
5417 | + unregister_snap_client(aarp_dl); | ||
5418 | + } | ||
5419 | + return rc; | ||
5420 | } | ||
5421 | |||
5422 | /* Remove the AARP entries associated with a device. */ | ||
5423 | diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c | ||
5424 | index d74092cc639a..93209c009df5 100644 | ||
5425 | --- a/net/appletalk/ddp.c | ||
5426 | +++ b/net/appletalk/ddp.c | ||
5427 | @@ -1911,9 +1911,6 @@ static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B }; | ||
5428 | EXPORT_SYMBOL(atrtr_get_dev); | ||
5429 | EXPORT_SYMBOL(atalk_find_dev_addr); | ||
5430 | |||
5431 | -static const char atalk_err_snap[] __initconst = | ||
5432 | - KERN_CRIT "Unable to register DDP with SNAP.\n"; | ||
5433 | - | ||
5434 | /* Called by proto.c on kernel start up */ | ||
5435 | static int __init atalk_init(void) | ||
5436 | { | ||
5437 | @@ -1928,17 +1925,23 @@ static int __init atalk_init(void) | ||
5438 | goto out_proto; | ||
5439 | |||
5440 | ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv); | ||
5441 | - if (!ddp_dl) | ||
5442 | - printk(atalk_err_snap); | ||
5443 | + if (!ddp_dl) { | ||
5444 | + pr_crit("Unable to register DDP with SNAP.\n"); | ||
5445 | + rc = -ENOMEM; | ||
5446 | + goto out_sock; | ||
5447 | + } | ||
5448 | |||
5449 | dev_add_pack(<alk_packet_type); | ||
5450 | dev_add_pack(&ppptalk_packet_type); | ||
5451 | |||
5452 | rc = register_netdevice_notifier(&ddp_notifier); | ||
5453 | if (rc) | ||
5454 | - goto out_sock; | ||
5455 | + goto out_snap; | ||
5456 | + | ||
5457 | + rc = aarp_proto_init(); | ||
5458 | + if (rc) | ||
5459 | + goto out_dev; | ||
5460 | |||
5461 | - aarp_proto_init(); | ||
5462 | rc = atalk_proc_init(); | ||
5463 | if (rc) | ||
5464 | goto out_aarp; | ||
5465 | @@ -1952,11 +1955,13 @@ out_proc: | ||
5466 | atalk_proc_exit(); | ||
5467 | out_aarp: | ||
5468 | aarp_cleanup_module(); | ||
5469 | +out_dev: | ||
5470 | unregister_netdevice_notifier(&ddp_notifier); | ||
5471 | -out_sock: | ||
5472 | +out_snap: | ||
5473 | dev_remove_pack(&ppptalk_packet_type); | ||
5474 | dev_remove_pack(<alk_packet_type); | ||
5475 | unregister_snap_client(ddp_dl); | ||
5476 | +out_sock: | ||
5477 | sock_unregister(PF_APPLETALK); | ||
5478 | out_proto: | ||
5479 | proto_unregister(&ddp_proto); | ||
5480 | diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c | ||
5481 | index 5f5e28f210e0..928bd5515f02 100644 | ||
5482 | --- a/net/bridge/br_device.c | ||
5483 | +++ b/net/bridge/br_device.c | ||
5484 | @@ -210,6 +210,12 @@ static int br_set_mac_address(struct net_device *dev, void *p) | ||
5485 | if (!is_valid_ether_addr(addr->sa_data)) | ||
5486 | return -EADDRNOTAVAIL; | ||
5487 | |||
5488 | + /* dev_set_mac_addr() can be called by a master device on bridge's | ||
5489 | + * NETDEV_UNREGISTER, but since it's being destroyed do nothing | ||
5490 | + */ | ||
5491 | + if (dev->reg_state != NETREG_REGISTERED) | ||
5492 | + return -EBUSY; | ||
5493 | + | ||
5494 | spin_lock_bh(&br->lock); | ||
5495 | if (!ether_addr_equal(dev->dev_addr, addr->sa_data)) { | ||
5496 | /* Mac address will be changed in br_stp_change_bridge_id(). */ | ||
5497 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
5498 | index c6fb7e61cb40..842654302110 100644 | ||
5499 | --- a/net/core/dev.c | ||
5500 | +++ b/net/core/dev.c | ||
5501 | @@ -6584,7 +6584,8 @@ static int __dev_set_mtu(struct net_device *dev, int new_mtu) | ||
5502 | if (ops->ndo_change_mtu) | ||
5503 | return ops->ndo_change_mtu(dev, new_mtu); | ||
5504 | |||
5505 | - dev->mtu = new_mtu; | ||
5506 | + /* Pairs with all the lockless reads of dev->mtu in the stack */ | ||
5507 | + WRITE_ONCE(dev->mtu, new_mtu); | ||
5508 | return 0; | ||
5509 | } | ||
5510 | |||
5511 | diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c | ||
5512 | index 93438113d136..6c873cb829ca 100644 | ||
5513 | --- a/net/ipv4/devinet.c | ||
5514 | +++ b/net/ipv4/devinet.c | ||
5515 | @@ -1386,11 +1386,6 @@ skip: | ||
5516 | } | ||
5517 | } | ||
5518 | |||
5519 | -static bool inetdev_valid_mtu(unsigned int mtu) | ||
5520 | -{ | ||
5521 | - return mtu >= IPV4_MIN_MTU; | ||
5522 | -} | ||
5523 | - | ||
5524 | static void inetdev_send_gratuitous_arp(struct net_device *dev, | ||
5525 | struct in_device *in_dev) | ||
5526 | |||
5527 | diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c | ||
5528 | index 7f1a85c6a614..4f3decbe6a3a 100644 | ||
5529 | --- a/net/ipv4/ip_output.c | ||
5530 | +++ b/net/ipv4/ip_output.c | ||
5531 | @@ -1159,13 +1159,17 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork, | ||
5532 | rt = *rtp; | ||
5533 | if (unlikely(!rt)) | ||
5534 | return -EFAULT; | ||
5535 | - /* | ||
5536 | - * We steal reference to this route, caller should not release it | ||
5537 | - */ | ||
5538 | - *rtp = NULL; | ||
5539 | + | ||
5540 | cork->fragsize = ip_sk_use_pmtu(sk) ? | ||
5541 | - dst_mtu(&rt->dst) : rt->dst.dev->mtu; | ||
5542 | + dst_mtu(&rt->dst) : READ_ONCE(rt->dst.dev->mtu); | ||
5543 | + | ||
5544 | + if (!inetdev_valid_mtu(cork->fragsize)) | ||
5545 | + return -ENETUNREACH; | ||
5546 | + | ||
5547 | cork->dst = &rt->dst; | ||
5548 | + /* We stole this route, caller should not release it. */ | ||
5549 | + *rtp = NULL; | ||
5550 | + | ||
5551 | cork->length = 0; | ||
5552 | cork->ttl = ipc->ttl; | ||
5553 | cork->tos = ipc->tos; | ||
5554 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
5555 | index 2e77e78ab226..73766c9c485d 100644 | ||
5556 | --- a/net/ipv4/tcp_output.c | ||
5557 | +++ b/net/ipv4/tcp_output.c | ||
5558 | @@ -707,8 +707,9 @@ static unsigned int tcp_established_options(struct sock *sk, struct sk_buff *skb | ||
5559 | min_t(unsigned int, eff_sacks, | ||
5560 | (remaining - TCPOLEN_SACK_BASE_ALIGNED) / | ||
5561 | TCPOLEN_SACK_PERBLOCK); | ||
5562 | - size += TCPOLEN_SACK_BASE_ALIGNED + | ||
5563 | - opts->num_sack_blocks * TCPOLEN_SACK_PERBLOCK; | ||
5564 | + if (likely(opts->num_sack_blocks)) | ||
5565 | + size += TCPOLEN_SACK_BASE_ALIGNED + | ||
5566 | + opts->num_sack_blocks * TCPOLEN_SACK_PERBLOCK; | ||
5567 | } | ||
5568 | |||
5569 | return size; | ||
5570 | diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c | ||
5571 | index d9e364c4863a..761a198ed5f3 100644 | ||
5572 | --- a/net/ipv4/tcp_timer.c | ||
5573 | +++ b/net/ipv4/tcp_timer.c | ||
5574 | @@ -372,7 +372,7 @@ static void tcp_probe_timer(struct sock *sk) | ||
5575 | return; | ||
5576 | } | ||
5577 | |||
5578 | - if (icsk->icsk_probes_out > max_probes) { | ||
5579 | + if (icsk->icsk_probes_out >= max_probes) { | ||
5580 | abort: tcp_write_err(sk); | ||
5581 | } else { | ||
5582 | /* Only send another probe if we didn't close things up. */ | ||
5583 | @@ -478,11 +478,12 @@ void tcp_retransmit_timer(struct sock *sk) | ||
5584 | goto out_reset_timer; | ||
5585 | } | ||
5586 | |||
5587 | + __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPTIMEOUTS); | ||
5588 | if (tcp_write_timeout(sk)) | ||
5589 | goto out; | ||
5590 | |||
5591 | if (icsk->icsk_retransmits == 0) { | ||
5592 | - int mib_idx; | ||
5593 | + int mib_idx = 0; | ||
5594 | |||
5595 | if (icsk->icsk_ca_state == TCP_CA_Recovery) { | ||
5596 | if (tcp_is_sack(tp)) | ||
5597 | @@ -497,10 +498,9 @@ void tcp_retransmit_timer(struct sock *sk) | ||
5598 | mib_idx = LINUX_MIB_TCPSACKFAILURES; | ||
5599 | else | ||
5600 | mib_idx = LINUX_MIB_TCPRENOFAILURES; | ||
5601 | - } else { | ||
5602 | - mib_idx = LINUX_MIB_TCPTIMEOUTS; | ||
5603 | } | ||
5604 | - __NET_INC_STATS(sock_net(sk), mib_idx); | ||
5605 | + if (mib_idx) | ||
5606 | + __NET_INC_STATS(sock_net(sk), mib_idx); | ||
5607 | } | ||
5608 | |||
5609 | tcp_enter_loss(sk); | ||
5610 | diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c | ||
5611 | index 02d6f38f7869..beb2897d8ddf 100644 | ||
5612 | --- a/net/openvswitch/conntrack.c | ||
5613 | +++ b/net/openvswitch/conntrack.c | ||
5614 | @@ -709,6 +709,17 @@ static int ovs_ct_nat(struct net *net, struct sw_flow_key *key, | ||
5615 | } | ||
5616 | err = ovs_ct_nat_execute(skb, ct, ctinfo, &info->range, maniptype); | ||
5617 | |||
5618 | + if (err == NF_ACCEPT && | ||
5619 | + ct->status & IPS_SRC_NAT && ct->status & IPS_DST_NAT) { | ||
5620 | + if (maniptype == NF_NAT_MANIP_SRC) | ||
5621 | + maniptype = NF_NAT_MANIP_DST; | ||
5622 | + else | ||
5623 | + maniptype = NF_NAT_MANIP_SRC; | ||
5624 | + | ||
5625 | + err = ovs_ct_nat_execute(skb, ct, ctinfo, &info->range, | ||
5626 | + maniptype); | ||
5627 | + } | ||
5628 | + | ||
5629 | /* Mark NAT done if successful and update the flow key. */ | ||
5630 | if (err == NF_ACCEPT) | ||
5631 | ovs_nat_update_key(key, skb, maniptype); | ||
5632 | diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c | ||
5633 | index cdcc0fea9f5a..24e42919a480 100644 | ||
5634 | --- a/net/sunrpc/cache.c | ||
5635 | +++ b/net/sunrpc/cache.c | ||
5636 | @@ -54,9 +54,6 @@ static void cache_init(struct cache_head *h, struct cache_detail *detail) | ||
5637 | h->last_refresh = now; | ||
5638 | } | ||
5639 | |||
5640 | -static inline int cache_is_valid(struct cache_head *h); | ||
5641 | -static void cache_fresh_locked(struct cache_head *head, time_t expiry, | ||
5642 | - struct cache_detail *detail); | ||
5643 | static void cache_fresh_unlocked(struct cache_head *head, | ||
5644 | struct cache_detail *detail); | ||
5645 | |||
5646 | @@ -101,9 +98,6 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail, | ||
5647 | if (cache_is_expired(detail, tmp)) { | ||
5648 | hlist_del_init(&tmp->cache_list); | ||
5649 | detail->entries --; | ||
5650 | - if (cache_is_valid(tmp) == -EAGAIN) | ||
5651 | - set_bit(CACHE_NEGATIVE, &tmp->flags); | ||
5652 | - cache_fresh_locked(tmp, 0, detail); | ||
5653 | freeme = tmp; | ||
5654 | break; | ||
5655 | } | ||
5656 | diff --git a/net/tipc/core.c b/net/tipc/core.c | ||
5657 | index 59980dea2ad7..799900c0f2c9 100644 | ||
5658 | --- a/net/tipc/core.c | ||
5659 | +++ b/net/tipc/core.c | ||
5660 | @@ -116,14 +116,6 @@ static int __init tipc_init(void) | ||
5661 | sysctl_tipc_rmem[1] = RCVBUF_DEF; | ||
5662 | sysctl_tipc_rmem[2] = RCVBUF_MAX; | ||
5663 | |||
5664 | - err = tipc_netlink_start(); | ||
5665 | - if (err) | ||
5666 | - goto out_netlink; | ||
5667 | - | ||
5668 | - err = tipc_netlink_compat_start(); | ||
5669 | - if (err) | ||
5670 | - goto out_netlink_compat; | ||
5671 | - | ||
5672 | err = tipc_register_sysctl(); | ||
5673 | if (err) | ||
5674 | goto out_sysctl; | ||
5675 | @@ -144,8 +136,21 @@ static int __init tipc_init(void) | ||
5676 | if (err) | ||
5677 | goto out_bearer; | ||
5678 | |||
5679 | + err = tipc_netlink_start(); | ||
5680 | + if (err) | ||
5681 | + goto out_netlink; | ||
5682 | + | ||
5683 | + err = tipc_netlink_compat_start(); | ||
5684 | + if (err) | ||
5685 | + goto out_netlink_compat; | ||
5686 | + | ||
5687 | pr_info("Started in single node mode\n"); | ||
5688 | return 0; | ||
5689 | + | ||
5690 | +out_netlink_compat: | ||
5691 | + tipc_netlink_stop(); | ||
5692 | +out_netlink: | ||
5693 | + tipc_bearer_cleanup(); | ||
5694 | out_bearer: | ||
5695 | unregister_pernet_device(&tipc_topsrv_net_ops); | ||
5696 | out_pernet_topsrv: | ||
5697 | @@ -155,22 +160,18 @@ out_socket: | ||
5698 | out_pernet: | ||
5699 | tipc_unregister_sysctl(); | ||
5700 | out_sysctl: | ||
5701 | - tipc_netlink_compat_stop(); | ||
5702 | -out_netlink_compat: | ||
5703 | - tipc_netlink_stop(); | ||
5704 | -out_netlink: | ||
5705 | pr_err("Unable to start in single node mode\n"); | ||
5706 | return err; | ||
5707 | } | ||
5708 | |||
5709 | static void __exit tipc_exit(void) | ||
5710 | { | ||
5711 | + tipc_netlink_compat_stop(); | ||
5712 | + tipc_netlink_stop(); | ||
5713 | tipc_bearer_cleanup(); | ||
5714 | unregister_pernet_device(&tipc_topsrv_net_ops); | ||
5715 | tipc_socket_stop(); | ||
5716 | unregister_pernet_device(&tipc_net_ops); | ||
5717 | - tipc_netlink_stop(); | ||
5718 | - tipc_netlink_compat_stop(); | ||
5719 | tipc_unregister_sysctl(); | ||
5720 | |||
5721 | pr_info("Deactivated\n"); | ||
5722 | diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c | ||
5723 | index 770ababb8f92..6c2560f3f95b 100644 | ||
5724 | --- a/net/x25/af_x25.c | ||
5725 | +++ b/net/x25/af_x25.c | ||
5726 | @@ -100,7 +100,7 @@ int x25_parse_address_block(struct sk_buff *skb, | ||
5727 | } | ||
5728 | |||
5729 | len = *skb->data; | ||
5730 | - needed = 1 + (len >> 4) + (len & 0x0f); | ||
5731 | + needed = 1 + ((len >> 4) + (len & 0x0f) + 1) / 2; | ||
5732 | |||
5733 | if (!pskb_may_pull(skb, needed)) { | ||
5734 | /* packet is too short to hold the addresses it claims | ||
5735 | @@ -288,7 +288,7 @@ static struct sock *x25_find_listener(struct x25_address *addr, | ||
5736 | sk_for_each(s, &x25_list) | ||
5737 | if ((!strcmp(addr->x25_addr, | ||
5738 | x25_sk(s)->source_addr.x25_addr) || | ||
5739 | - !strcmp(addr->x25_addr, | ||
5740 | + !strcmp(x25_sk(s)->source_addr.x25_addr, | ||
5741 | null_x25_address.x25_addr)) && | ||
5742 | s->sk_state == TCP_LISTEN) { | ||
5743 | /* | ||
5744 | @@ -684,11 +684,15 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | ||
5745 | goto out; | ||
5746 | } | ||
5747 | |||
5748 | - len = strlen(addr->sx25_addr.x25_addr); | ||
5749 | - for (i = 0; i < len; i++) { | ||
5750 | - if (!isdigit(addr->sx25_addr.x25_addr[i])) { | ||
5751 | - rc = -EINVAL; | ||
5752 | - goto out; | ||
5753 | + /* check for the null_x25_address */ | ||
5754 | + if (strcmp(addr->sx25_addr.x25_addr, null_x25_address.x25_addr)) { | ||
5755 | + | ||
5756 | + len = strlen(addr->sx25_addr.x25_addr); | ||
5757 | + for (i = 0; i < len; i++) { | ||
5758 | + if (!isdigit(addr->sx25_addr.x25_addr[i])) { | ||
5759 | + rc = -EINVAL; | ||
5760 | + goto out; | ||
5761 | + } | ||
5762 | } | ||
5763 | } | ||
5764 | |||
5765 | diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c | ||
5766 | index fdf5bbfd00cd..9abcdf2e8dfe 100644 | ||
5767 | --- a/scripts/mod/modpost.c | ||
5768 | +++ b/scripts/mod/modpost.c | ||
5769 | @@ -1157,6 +1157,14 @@ static const struct sectioncheck *section_mismatch( | ||
5770 | * fromsec = text section | ||
5771 | * refsymname = *.constprop.* | ||
5772 | * | ||
5773 | + * Pattern 6: | ||
5774 | + * Hide section mismatch warnings for ELF local symbols. The goal | ||
5775 | + * is to eliminate false positive modpost warnings caused by | ||
5776 | + * compiler-generated ELF local symbol names such as ".LANCHOR1". | ||
5777 | + * Autogenerated symbol names bypass modpost's "Pattern 2" | ||
5778 | + * whitelisting, which relies on pattern-matching against symbol | ||
5779 | + * names to work. (One situation where gcc can autogenerate ELF | ||
5780 | + * local symbols is when "-fsection-anchors" is used.) | ||
5781 | **/ | ||
5782 | static int secref_whitelist(const struct sectioncheck *mismatch, | ||
5783 | const char *fromsec, const char *fromsym, | ||
5784 | @@ -1195,6 +1203,10 @@ static int secref_whitelist(const struct sectioncheck *mismatch, | ||
5785 | match(fromsym, optim_symbols)) | ||
5786 | return 0; | ||
5787 | |||
5788 | + /* Check for pattern 6 */ | ||
5789 | + if (strstarts(fromsym, ".L")) | ||
5790 | + return 0; | ||
5791 | + | ||
5792 | return 1; | ||
5793 | } | ||
5794 | |||
5795 | diff --git a/sound/core/oss/linear.c b/sound/core/oss/linear.c | ||
5796 | index 2045697f449d..797d838a2f9e 100644 | ||
5797 | --- a/sound/core/oss/linear.c | ||
5798 | +++ b/sound/core/oss/linear.c | ||
5799 | @@ -107,6 +107,8 @@ static snd_pcm_sframes_t linear_transfer(struct snd_pcm_plugin *plugin, | ||
5800 | } | ||
5801 | } | ||
5802 | #endif | ||
5803 | + if (frames > dst_channels[0].frames) | ||
5804 | + frames = dst_channels[0].frames; | ||
5805 | convert(plugin, src_channels, dst_channels, frames); | ||
5806 | return frames; | ||
5807 | } | ||
5808 | diff --git a/sound/core/oss/mulaw.c b/sound/core/oss/mulaw.c | ||
5809 | index 7915564bd394..3788906421a7 100644 | ||
5810 | --- a/sound/core/oss/mulaw.c | ||
5811 | +++ b/sound/core/oss/mulaw.c | ||
5812 | @@ -269,6 +269,8 @@ static snd_pcm_sframes_t mulaw_transfer(struct snd_pcm_plugin *plugin, | ||
5813 | } | ||
5814 | } | ||
5815 | #endif | ||
5816 | + if (frames > dst_channels[0].frames) | ||
5817 | + frames = dst_channels[0].frames; | ||
5818 | data = (struct mulaw_priv *)plugin->extra_data; | ||
5819 | data->func(plugin, src_channels, dst_channels, frames); | ||
5820 | return frames; | ||
5821 | diff --git a/sound/core/oss/route.c b/sound/core/oss/route.c | ||
5822 | index c8171f5783c8..72dea04197ef 100644 | ||
5823 | --- a/sound/core/oss/route.c | ||
5824 | +++ b/sound/core/oss/route.c | ||
5825 | @@ -57,6 +57,8 @@ static snd_pcm_sframes_t route_transfer(struct snd_pcm_plugin *plugin, | ||
5826 | return -ENXIO; | ||
5827 | if (frames == 0) | ||
5828 | return 0; | ||
5829 | + if (frames > dst_channels[0].frames) | ||
5830 | + frames = dst_channels[0].frames; | ||
5831 | |||
5832 | nsrcs = plugin->src_format.channels; | ||
5833 | ndsts = plugin->dst_format.channels; | ||
5834 | diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c | ||
5835 | index 3acb373674c3..f09ae7efc695 100644 | ||
5836 | --- a/sound/core/pcm_lib.c | ||
5837 | +++ b/sound/core/pcm_lib.c | ||
5838 | @@ -1877,11 +1877,14 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) | ||
5839 | struct snd_pcm_runtime *runtime; | ||
5840 | unsigned long flags; | ||
5841 | |||
5842 | - if (PCM_RUNTIME_CHECK(substream)) | ||
5843 | + if (snd_BUG_ON(!substream)) | ||
5844 | return; | ||
5845 | - runtime = substream->runtime; | ||
5846 | |||
5847 | snd_pcm_stream_lock_irqsave(substream, flags); | ||
5848 | + if (PCM_RUNTIME_CHECK(substream)) | ||
5849 | + goto _unlock; | ||
5850 | + runtime = substream->runtime; | ||
5851 | + | ||
5852 | if (!snd_pcm_running(substream) || | ||
5853 | snd_pcm_update_hw_ptr0(substream, 1) < 0) | ||
5854 | goto _end; | ||
5855 | @@ -1892,6 +1895,7 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) | ||
5856 | #endif | ||
5857 | _end: | ||
5858 | kill_fasync(&runtime->fasync, SIGIO, POLL_IN); | ||
5859 | + _unlock: | ||
5860 | snd_pcm_stream_unlock_irqrestore(substream, flags); | ||
5861 | } | ||
5862 | |||
5863 | diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c | ||
5864 | index 7ea201c05e5d..d0d6dfbfcfdf 100644 | ||
5865 | --- a/sound/pci/hda/hda_bind.c | ||
5866 | +++ b/sound/pci/hda/hda_bind.c | ||
5867 | @@ -42,6 +42,10 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev) | ||
5868 | { | ||
5869 | struct hda_codec *codec = container_of(dev, struct hda_codec, core); | ||
5870 | |||
5871 | + /* ignore unsol events during shutdown */ | ||
5872 | + if (codec->bus->shutdown) | ||
5873 | + return; | ||
5874 | + | ||
5875 | if (codec->patch_ops.unsol_event) | ||
5876 | codec->patch_ops.unsol_event(codec, ev); | ||
5877 | } | ||
5878 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
5879 | index f2f1d9fd848c..3234e9ca02ce 100644 | ||
5880 | --- a/sound/pci/hda/hda_intel.c | ||
5881 | +++ b/sound/pci/hda/hda_intel.c | ||
5882 | @@ -1275,8 +1275,11 @@ static int azx_free(struct azx *chip) | ||
5883 | static int azx_dev_disconnect(struct snd_device *device) | ||
5884 | { | ||
5885 | struct azx *chip = device->device_data; | ||
5886 | + struct hdac_bus *bus = azx_bus(chip); | ||
5887 | |||
5888 | chip->bus.shutdown = 1; | ||
5889 | + cancel_work_sync(&bus->unsol_work); | ||
5890 | + | ||
5891 | return 0; | ||
5892 | } | ||
5893 | |||
5894 | diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c | ||
5895 | index fbaa1bb41102..00d7902ad427 100644 | ||
5896 | --- a/sound/soc/soc-jack.c | ||
5897 | +++ b/sound/soc/soc-jack.c | ||
5898 | @@ -80,10 +80,9 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask) | ||
5899 | unsigned int sync = 0; | ||
5900 | int enable; | ||
5901 | |||
5902 | - trace_snd_soc_jack_report(jack, mask, status); | ||
5903 | - | ||
5904 | if (!jack) | ||
5905 | return; | ||
5906 | + trace_snd_soc_jack_report(jack, mask, status); | ||
5907 | |||
5908 | dapm = &jack->card->dapm; | ||
5909 |